From 52e21a81b109e3ba316844eb6afc0d60fb64d1e3 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 20 Jan 2012 21:50:54 +0000 Subject: [PATCH 001/289] [NETSHELL] - Rewrite in C++ to improve readability svn path=/trunk/; revision=55022 --- reactos/dll/win32/netshell/CMakeLists.txt | 15 +- reactos/dll/win32/netshell/classfactory.c | 124 -- reactos/dll/win32/netshell/classfactory.cpp | 108 ++ .../{connectmanager.c => connectmanager.cpp} | 444 ++--- reactos/dll/win32/netshell/enumlist.c | 343 ---- reactos/dll/win32/netshell/enumlist.cpp | 261 +++ reactos/dll/win32/netshell/lanconnectui.c | 759 -------- reactos/dll/win32/netshell/lanconnectui.cpp | 622 +++++++ .../{lanstatusui.c => lanstatusui.cpp} | 251 ++- .../netshell/{netshell.c => netshell.cpp} | 56 +- reactos/dll/win32/netshell/precomp.h | 28 +- .../dll/win32/netshell/shfldr_netconnect.c | 1529 ----------------- .../dll/win32/netshell/shfldr_netconnect.cpp | 1201 +++++++++++++ reactos/include/psdk/netcon.h | 8 + 14 files changed, 2515 insertions(+), 3234 deletions(-) delete mode 100644 reactos/dll/win32/netshell/classfactory.c create mode 100644 reactos/dll/win32/netshell/classfactory.cpp rename reactos/dll/win32/netshell/{connectmanager.c => connectmanager.cpp} (55%) delete mode 100644 reactos/dll/win32/netshell/enumlist.c create mode 100644 reactos/dll/win32/netshell/enumlist.cpp delete mode 100644 reactos/dll/win32/netshell/lanconnectui.c create mode 100644 reactos/dll/win32/netshell/lanconnectui.cpp rename reactos/dll/win32/netshell/{lanstatusui.c => lanstatusui.cpp} (87%) rename reactos/dll/win32/netshell/{netshell.c => netshell.cpp} (83%) delete mode 100644 reactos/dll/win32/netshell/shfldr_netconnect.c create mode 100644 reactos/dll/win32/netshell/shfldr_netconnect.cpp diff --git a/reactos/dll/win32/netshell/CMakeLists.txt b/reactos/dll/win32/netshell/CMakeLists.txt index 9dc74cc503f..f7d1a6f1d73 100644 --- a/reactos/dll/win32/netshell/CMakeLists.txt +++ b/reactos/dll/win32/netshell/CMakeLists.txt @@ -2,18 +2,19 @@ add_definitions(-D_NETSHELL_) remove_definitions(-D_WIN32_WINNT=0x502) add_definitions(-D_WIN32_WINNT=0x600) +set_cpp() set_rc_compiler() spec2def(netshell.dll netshell.spec) list(APPEND SOURCE - netshell.c - shfldr_netconnect.c - enumlist.c + netshell.cpp + shfldr_netconnect.cpp + enumlist.cpp netshell.rc - classfactory.c - connectmanager.c - lanconnectui.c - lanstatusui.c + classfactory.cpp + connectmanager.cpp + lanconnectui.cpp + lanstatusui.cpp ${CMAKE_CURRENT_BINARY_DIR}/netshell_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/netshell.def) diff --git a/reactos/dll/win32/netshell/classfactory.c b/reactos/dll/win32/netshell/classfactory.c deleted file mode 100644 index d03c5f340cc..00000000000 --- a/reactos/dll/win32/netshell/classfactory.c +++ /dev/null @@ -1,124 +0,0 @@ -#include - -typedef struct -{ - const IClassFactoryVtbl *lpVtbl; - LONG ref; - CLSID *rclsid; - LPFNCREATEINSTANCE lpfnCI; - const IID * riidInst; -} IClassFactoryImpl; - - -static -HRESULT -WINAPI -IClassFactory_fnQueryInterface( - LPCLASSFACTORY iface, - REFIID riid, - LPVOID *ppvObj) -{ - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - - *ppvObj = NULL; - if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory)) - { - *ppvObj = This; - InterlockedIncrement(&This->ref); - return S_OK; - } - return E_NOINTERFACE; -} - -static -ULONG -WINAPI -IClassFactory_fnAddRef( - LPCLASSFACTORY iface) -{ - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); - - return refCount; -} - -static -ULONG -WINAPI -IClassFactory_fnRelease( - LPCLASSFACTORY iface) -{ - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); - - if (!refCount) - { - CoTaskMemFree(This); - return 0; - } - return refCount; -} - -static -HRESULT -WINAPI -IClassFactory_fnCreateInstance( - LPCLASSFACTORY iface, - LPUNKNOWN pUnkOuter, - REFIID riid, - LPVOID *ppvObject) -{ - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - - *ppvObject = NULL; - - if ( This->riidInst==NULL || IsEqualCLSID(riid, This->riidInst) || IsEqualCLSID(riid, &IID_IUnknown) ) - { - return This->lpfnCI(pUnkOuter, riid, ppvObject); - } - - return E_NOINTERFACE; -} - -static -HRESULT -WINAPI IClassFactory_fnLockServer( - LPCLASSFACTORY iface, - BOOL fLock) -{ - //IClassFactoryImpl *This = (IClassFactoryImpl *)iface; - return E_NOTIMPL; -} - - -static const IClassFactoryVtbl dclfvt = -{ - IClassFactory_fnQueryInterface, - IClassFactory_fnAddRef, - IClassFactory_fnRelease, - IClassFactory_fnCreateInstance, - IClassFactory_fnLockServer -}; - - -IClassFactory * -IClassFactory_fnConstructor( - LPFNCREATEINSTANCE lpfnCI, - PLONG pcRefDll, - REFIID riidInst) -{ - IClassFactoryImpl* lpclf; - - lpclf = CoTaskMemAlloc(sizeof(IClassFactoryImpl)); - lpclf->ref = 1; - lpclf->lpVtbl = &dclfvt; - lpclf->lpfnCI = lpfnCI; - - if (pcRefDll) - InterlockedIncrement(pcRefDll); - lpclf->riidInst = riidInst; - - return (LPCLASSFACTORY)lpclf; -} - - diff --git a/reactos/dll/win32/netshell/classfactory.cpp b/reactos/dll/win32/netshell/classfactory.cpp new file mode 100644 index 00000000000..af17b7f2a9d --- /dev/null +++ b/reactos/dll/win32/netshell/classfactory.cpp @@ -0,0 +1,108 @@ +#include + +WINE_DEFAULT_DEBUG_CHANNEL (shell); + +class CNetshellClassFactory: public IClassFactory +{ + public: + CNetshellClassFactory(REFCLSID rclsid); + + /* IUnknown */ + virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); + virtual ULONG WINAPI AddRef(); + virtual ULONG WINAPI Release(); + + /* IClassFactory */ + virtual HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject); + virtual HRESULT WINAPI LockServer(BOOL fLock); + + private: + LONG ref; + CLSID clsid; +}; + +CNetshellClassFactory::CNetshellClassFactory(REFCLSID rclsid) +{ + ref = 0; + clsid = rclsid; +} + +HRESULT +WINAPI +CNetshellClassFactory::QueryInterface( + REFIID riid, + LPVOID *ppvObj) +{ + *ppvObj = NULL; + if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) + { + *ppvObj = (IClassFactory*)this; + InterlockedIncrement(&ref); + return S_OK; + } + return E_NOINTERFACE; +} + +ULONG +WINAPI +CNetshellClassFactory::AddRef() +{ + ULONG refCount = InterlockedIncrement(&ref); + + return refCount; +} + +ULONG +WINAPI +CNetshellClassFactory::Release() +{ + ULONG refCount = InterlockedDecrement(&ref); + + if (!refCount) + { + CoTaskMemFree(this); + return 0; + } + return refCount; +} + +HRESULT +WINAPI +CNetshellClassFactory::CreateInstance( + LPUNKNOWN pUnkOuter, + REFIID riid, + LPVOID *ppvObject) +{ + *ppvObject = NULL; + + if (IsEqualCLSID(clsid, CLSID_NetworkConnections)) + return ISF_NetConnect_Constructor(pUnkOuter, riid, ppvObject); + else if (IsEqualCLSID(clsid, CLSID_ConnectionManager)) + return INetConnectionManager_Constructor(pUnkOuter, riid, ppvObject); + else if (IsEqualCLSID(clsid, CLSID_LANConnectUI)) + return LanConnectUI_Constructor(pUnkOuter, riid, ppvObject); + else if (IsEqualCLSID(clsid, CLSID_LanConnectStatusUI)) + return LanConnectStatusUI_Constructor(pUnkOuter, riid, ppvObject); + + return E_NOINTERFACE; +} + +HRESULT +WINAPI +CNetshellClassFactory::LockServer(BOOL fLock) +{ + return E_NOTIMPL; +} + +HRESULT IClassFactory_fnConstructor(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut) +{ + CNetshellClassFactory *pClsFactory = new CNetshellClassFactory(rclsid); + if (!pClsFactory) + return E_OUTOFMEMORY; + + pClsFactory->AddRef(); + HRESULT hr = pClsFactory->QueryInterface(riid, ppvOut); + pClsFactory->Release(); + + return hr; +} diff --git a/reactos/dll/win32/netshell/connectmanager.c b/reactos/dll/win32/netshell/connectmanager.cpp similarity index 55% rename from reactos/dll/win32/netshell/connectmanager.c rename to reactos/dll/win32/netshell/connectmanager.cpp index bb0f0ad7f2a..ee61ef5ff5c 100644 --- a/reactos/dll/win32/netshell/connectmanager.c +++ b/reactos/dll/win32/netshell/connectmanager.cpp @@ -1,97 +1,124 @@ #include +WINE_DEFAULT_DEBUG_CHANNEL (shell); + typedef struct tagINetConnectionItem { struct tagINetConnectionItem * Next; DWORD dwAdapterIndex; NETCON_PROPERTIES Props; -}INetConnectionItem, *PINetConnectionItem; +} INetConnectionItem, *PINetConnectionItem; -typedef struct +class CNetConnectionManager: + public INetConnectionManager, + public IEnumNetConnection { - const INetConnectionManagerVtbl * lpVtbl; - const IEnumNetConnectionVtbl * lpVtblNetConnection; - LONG ref; - PINetConnectionItem pHead; - PINetConnectionItem pCurrent; + public: + CNetConnectionManager(); + BOOL EnumerateINetConnections(); + + // IUnknown + virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); + virtual ULONG WINAPI AddRef(); + virtual ULONG WINAPI Release(); + + // INetConnectionManager + virtual HRESULT WINAPI EnumConnections(NETCONMGR_ENUM_FLAGS Flags, IEnumNetConnection **ppEnum); + + // IEnumNetConnection + virtual HRESULT WINAPI Next(ULONG celt, INetConnection **rgelt, ULONG *pceltFetched); + virtual HRESULT WINAPI Skip(ULONG celt); + virtual HRESULT WINAPI Reset(); + virtual HRESULT WINAPI Clone(IEnumNetConnection **ppenum); + + private: + LONG ref; + PINetConnectionItem pHead; + PINetConnectionItem pCurrent; +}; -} INetConnectionManagerImpl, *LPINetConnectionManagerImpl; - -typedef struct +class CNetConnection: + public INetConnection { - const INetConnectionVtbl * lpVtbl; - LONG ref; - NETCON_PROPERTIES Props; - DWORD dwAdapterIndex; -} INetConnectionImpl, *LPINetConnectionImpl; - - -static __inline LPINetConnectionManagerImpl impl_from_EnumNetConnection(IEnumNetConnection *iface) -{ - return (LPINetConnectionManagerImpl)((char *)iface - FIELD_OFFSET(INetConnectionManagerImpl, lpVtblNetConnection)); -} + public: + CNetConnection(PINetConnectionItem pItem); + + // IUnknown + virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); + virtual ULONG WINAPI AddRef(); + virtual ULONG WINAPI Release(); + + // INetConnection + HRESULT WINAPI Connect(); + HRESULT WINAPI Disconnect(); + HRESULT WINAPI Delete(); + HRESULT WINAPI Duplicate(LPCWSTR pszwDuplicateName, INetConnection **ppCon); + HRESULT WINAPI GetProperties(NETCON_PROPERTIES **ppProps); + HRESULT WINAPI GetUiObjectClassId(CLSID *pclsid); + HRESULT WINAPI Rename(LPCWSTR pszwDuplicateName); + + private: + LONG ref; + NETCON_PROPERTIES Props; + DWORD dwAdapterIndex; +}; VOID NormalizeOperStatus(MIB_IFROW *IfEntry, NETCON_PROPERTIES * Props); -static +CNetConnectionManager::CNetConnectionManager() +{ + ref = 0; + pHead = NULL; + pCurrent = NULL; +} + HRESULT WINAPI -INetConnectionManager_fnQueryInterface( - INetConnectionManager * iface, +CNetConnectionManager::QueryInterface( REFIID iid, - LPVOID * ppvObj) + LPVOID *ppvObj) { - INetConnectionManagerImpl * This = (INetConnectionManagerImpl*)iface; *ppvObj = NULL; - if (IsEqualIID (iid, &IID_IUnknown) || - IsEqualIID (iid, &IID_INetConnectionManager)) + if (IsEqualIID(iid, IID_IUnknown) || + IsEqualIID(iid, IID_INetConnectionManager)) { - *ppvObj = This; - INetConnectionManager_AddRef(iface); + *ppvObj = (INetConnectionManager*)this; + AddRef(); return S_OK; } return E_NOINTERFACE; } -static ULONG WINAPI -INetConnectionManager_fnAddRef( - INetConnectionManager * iface) +CNetConnectionManager::AddRef() { - INetConnectionManagerImpl * This = (INetConnectionManagerImpl*)iface; - ULONG refCount = InterlockedIncrement(&This->ref); + ULONG refCount = InterlockedIncrement(&ref); return refCount; } -static ULONG WINAPI -INetConnectionManager_fnRelease( - INetConnectionManager * iface) +CNetConnectionManager::Release() { - INetConnectionManagerImpl * This = (INetConnectionManagerImpl*)iface; - ULONG refCount = InterlockedDecrement(&This->ref); + ULONG refCount = InterlockedDecrement(&ref); if (!refCount) - { - CoTaskMemFree (This); - } + delete this; + return refCount; } -static HRESULT WINAPI -INetConnectionManager_fnEnumConnections( - INetConnectionManager * iface, +CNetConnectionManager::EnumConnections( NETCONMGR_ENUM_FLAGS Flags, IEnumNetConnection **ppEnum) { - INetConnectionManagerImpl * This = (INetConnectionManagerImpl*)iface; + TRACE("EnumConnections\n"); if (!ppEnum) return E_POINTER; @@ -99,120 +126,113 @@ INetConnectionManager_fnEnumConnections( if (Flags != NCME_DEFAULT) return E_FAIL; - *ppEnum = (IEnumNetConnection *)&This->lpVtblNetConnection; - INetConnectionManager_AddRef(iface); + *ppEnum = (IEnumNetConnection*)this; + AddRef(); return S_OK; } -static const INetConnectionManagerVtbl vt_NetConnectionManager = -{ - INetConnectionManager_fnQueryInterface, - INetConnectionManager_fnAddRef, - INetConnectionManager_fnRelease, - INetConnectionManager_fnEnumConnections, -}; - /*************************************************************** * INetConnection Interface */ -static +CNetConnection::CNetConnection(PINetConnectionItem pItem) +{ + ref = 0; + dwAdapterIndex = pItem->dwAdapterIndex; + CopyMemory(&Props, &pItem->Props, sizeof(NETCON_PROPERTIES)); + + if (pItem->Props.pszwName) + { + Props.pszwName = (LPWSTR)CoTaskMemAlloc((wcslen(pItem->Props.pszwName)+1)*sizeof(WCHAR)); + if (Props.pszwName) + wcscpy(Props.pszwName, pItem->Props.pszwName); + } + + if (pItem->Props.pszwDeviceName) + { + Props.pszwDeviceName = (LPWSTR)CoTaskMemAlloc((wcslen(pItem->Props.pszwDeviceName)+1)*sizeof(WCHAR)); + if (Props.pszwDeviceName) + wcscpy(Props.pszwDeviceName, pItem->Props.pszwDeviceName); + } +} + HRESULT WINAPI -INetConnection_fnQueryInterface( - INetConnection * iface, +CNetConnection::QueryInterface( REFIID iid, LPVOID * ppvObj) { - INetConnectionImpl * This = (INetConnectionImpl*)iface; *ppvObj = NULL; - if (IsEqualIID (iid, &IID_IUnknown) || - IsEqualIID (iid, &IID_INetConnection)) + if (IsEqualIID(iid, IID_IUnknown) || + IsEqualIID(iid, IID_INetConnection)) { - *ppvObj = This; - INetConnection_AddRef(iface); + *ppvObj = this; + AddRef(); return S_OK; } return E_NOINTERFACE; } -static ULONG WINAPI -INetConnection_fnAddRef( - INetConnection * iface) +CNetConnection::AddRef() { - INetConnectionImpl * This = (INetConnectionImpl*)iface; - ULONG refCount = InterlockedIncrement(&This->ref); + ULONG refCount = InterlockedIncrement(&ref); return refCount; } -static ULONG WINAPI -INetConnection_fnRelease( - INetConnection * iface) +CNetConnection::Release() { - INetConnectionImpl * This = (INetConnectionImpl*)iface; - ULONG refCount = InterlockedDecrement(&This->ref); + ULONG refCount = InterlockedDecrement(&ref); if (!refCount) { - CoTaskMemFree(This->Props.pszwName); - CoTaskMemFree(This->Props.pszwDeviceName); - CoTaskMemFree(This); + CoTaskMemFree(Props.pszwName); + CoTaskMemFree(Props.pszwDeviceName); + delete this; } + return refCount; } -static HRESULT WINAPI -INetConnection_fnConnect( - INetConnection * iface) +CNetConnection::Connect() { return E_NOTIMPL; } -static HRESULT WINAPI -INetConnection_fnDisconnect( - INetConnection * iface) +CNetConnection::Disconnect() { return E_NOTIMPL; } - -static HRESULT WINAPI -INetConnection_fnDelete( - INetConnection * iface) +CNetConnection::Delete() { return E_NOTIMPL; } -static HRESULT WINAPI -INetConnection_fnDuplicate( - INetConnection * iface, +CNetConnection::Duplicate( LPCWSTR pszwDuplicateName, INetConnection **ppCon) { return E_NOTIMPL; } -static HRESULT WINAPI -INetConnection_fnGetProperties( - INetConnection * iface, - NETCON_PROPERTIES **ppProps) +CNetConnection::GetProperties(NETCON_PROPERTIES **ppProps) { MIB_IFROW IfEntry; HKEY hKey; @@ -222,38 +242,35 @@ INetConnection_fnGetProperties( NETCON_PROPERTIES * pProperties; HRESULT hr; - INetConnectionImpl * This = (INetConnectionImpl*)iface; - if (!ppProps) return E_POINTER; - pProperties = CoTaskMemAlloc(sizeof(NETCON_PROPERTIES)); + pProperties = (NETCON_PROPERTIES*)CoTaskMemAlloc(sizeof(NETCON_PROPERTIES)); if (!pProperties) return E_OUTOFMEMORY; - - CopyMemory(pProperties, &This->Props, sizeof(NETCON_PROPERTIES)); + CopyMemory(pProperties, &Props, sizeof(NETCON_PROPERTIES)); pProperties->pszwName = NULL; - if (This->Props.pszwDeviceName) + if (Props.pszwDeviceName) { - pProperties->pszwDeviceName = CoTaskMemAlloc((wcslen(This->Props.pszwDeviceName)+1)*sizeof(WCHAR)); + pProperties->pszwDeviceName = (LPWSTR)CoTaskMemAlloc((wcslen(Props.pszwDeviceName)+1)*sizeof(WCHAR)); if (pProperties->pszwDeviceName) - wcscpy(pProperties->pszwDeviceName, This->Props.pszwDeviceName); + wcscpy(pProperties->pszwDeviceName, Props.pszwDeviceName); } *ppProps = pProperties; /* get updated adapter characteristics */ ZeroMemory(&IfEntry, sizeof(IfEntry)); - IfEntry.dwIndex = This->dwAdapterIndex; + IfEntry.dwIndex = dwAdapterIndex; if(GetIfEntry(&IfEntry) != NO_ERROR) return NOERROR; NormalizeOperStatus(&IfEntry, pProperties); - hr = StringFromCLSID(&This->Props.guidId, &pStr); + hr = StringFromCLSID((CLSID)Props.guidId, &pStr); if (SUCCEEDED(hr)) { wcscpy(szName, L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\"); @@ -275,18 +292,18 @@ INetConnection_fnGetProperties( { /* use updated name */ dwSize = wcslen(szName) + 1; - pProperties->pszwName = CoTaskMemAlloc(dwSize * sizeof(WCHAR)); + pProperties->pszwName = (LPWSTR)CoTaskMemAlloc(dwSize * sizeof(WCHAR)); if (pProperties->pszwName) CopyMemory(pProperties->pszwName, szName, dwSize * sizeof(WCHAR)); } else { /* use cached name */ - if (This->Props.pszwName) + if (Props.pszwName) { - pProperties->pszwName = CoTaskMemAlloc((wcslen(This->Props.pszwName)+1)*sizeof(WCHAR)); + pProperties->pszwName = (LPWSTR)CoTaskMemAlloc((wcslen(Props.pszwName)+1)*sizeof(WCHAR)); if (pProperties->pszwName) - wcscpy(pProperties->pszwName, This->Props.pszwName); + wcscpy(pProperties->pszwName, Props.pszwName); } } RegCloseKey(hKey); @@ -294,21 +311,14 @@ INetConnection_fnGetProperties( CoTaskMemFree(pStr); } - - return NOERROR; + return S_OK; } -static HRESULT WINAPI -INetConnection_fnGetUiObjectClassId( - INetConnection * iface, - CLSID *pclsid) +CNetConnection::GetUiObjectClassId(CLSID *pclsid) { - - INetConnectionImpl * This = (INetConnectionImpl*)iface; - - if (This->Props.MediaType == NCM_LAN) + if (Props.MediaType == NCM_LAN) { CopyMemory(pclsid, &CLSID_LANConnectUI, sizeof(CLSID)); return S_OK; @@ -317,63 +327,24 @@ INetConnection_fnGetUiObjectClassId( return E_NOTIMPL; } -static HRESULT WINAPI -INetConnection_fnRename( - INetConnection * iface, - LPCWSTR pszwDuplicateName) +CNetConnection::Rename(LPCWSTR pszwDuplicateName) { return E_NOTIMPL; } - -static const INetConnectionVtbl vt_NetConnection = +HRESULT WINAPI IConnection_Constructor(INetConnection **ppv, PINetConnectionItem pItem) { - INetConnection_fnQueryInterface, - INetConnection_fnAddRef, - INetConnection_fnRelease, - INetConnection_fnConnect, - INetConnection_fnDisconnect, - INetConnection_fnDelete, - INetConnection_fnDuplicate, - INetConnection_fnGetProperties, - INetConnection_fnGetUiObjectClassId, - INetConnection_fnRename -}; - -HRESULT WINAPI IConnection_Constructor (INetConnection **ppv, PINetConnectionItem pItem) -{ - INetConnectionImpl *This; - if (!ppv) return E_POINTER; - This = (INetConnectionImpl *) CoTaskMemAlloc(sizeof (INetConnectionImpl)); - if (!This) + CNetConnection *pConnection = new CNetConnection(pItem); + if (!pConnection) return E_OUTOFMEMORY; - This->ref = 1; - This->lpVtbl = &vt_NetConnection; - This->dwAdapterIndex = pItem->dwAdapterIndex; - CopyMemory(&This->Props, &pItem->Props, sizeof(NETCON_PROPERTIES)); - - if (pItem->Props.pszwName) - { - This->Props.pszwName = CoTaskMemAlloc((wcslen(pItem->Props.pszwName)+1)*sizeof(WCHAR)); - if (This->Props.pszwName) - wcscpy(This->Props.pszwName, pItem->Props.pszwName); - } - - if (pItem->Props.pszwDeviceName) - { - This->Props.pszwDeviceName = CoTaskMemAlloc((wcslen(pItem->Props.pszwDeviceName)+1)*sizeof(WCHAR)); - if (This->Props.pszwDeviceName) - wcscpy(This->Props.pszwDeviceName, pItem->Props.pszwDeviceName); - } - - *ppv = (INetConnection *)This; - + pConnection->AddRef(); + *ppv = (INetConnection *)pConnection; return S_OK; } @@ -383,66 +354,13 @@ HRESULT WINAPI IConnection_Constructor (INetConnection **ppv, PINetConnectionIte * IEnumNetConnection Interface */ -static HRESULT WINAPI -IEnumNetConnection_fnQueryInterface( - IEnumNetConnection * iface, - REFIID iid, - LPVOID * ppvObj) -{ - INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface); - *ppvObj = NULL; - - if (IsEqualIID (iid, &IID_IUnknown) || - IsEqualIID (iid, &IID_INetConnectionManager)) - { - *ppvObj = This; - INetConnectionManager_AddRef(iface); - return S_OK; - } - - return E_NOINTERFACE; -} - -static -ULONG -WINAPI -IEnumNetConnection_fnAddRef( - IEnumNetConnection * iface) -{ - INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface); - ULONG refCount = InterlockedIncrement(&This->ref); - - return refCount; -} - -static -ULONG -WINAPI -IEnumNetConnection_fnRelease( - IEnumNetConnection * iface) -{ - INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface); - ULONG refCount = InterlockedDecrement(&This->ref); - - if (!refCount) - { - CoTaskMemFree (This); - } - return refCount; -} - -static -HRESULT -WINAPI -IEnumNetConnection_fnNext( - IEnumNetConnection * iface, +CNetConnectionManager::Next( ULONG celt, INetConnection **rgelt, ULONG *pceltFetched) { - INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface); HRESULT hr; if (!pceltFetched || !rgelt) @@ -451,68 +369,44 @@ IEnumNetConnection_fnNext( if (celt != 1) return E_FAIL; - if (!This->pCurrent) + if (!pCurrent) return S_FALSE; - hr = IConnection_Constructor(rgelt, This->pCurrent); - This->pCurrent = This->pCurrent->Next; + hr = IConnection_Constructor(rgelt, pCurrent); + pCurrent = pCurrent->Next; return hr; } -static HRESULT WINAPI -IEnumNetConnection_fnSkip( - IEnumNetConnection * iface, - ULONG celt) +CNetConnectionManager::Skip(ULONG celt) { - INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface); - - while(This->pCurrent && celt-- > 0) - This->pCurrent = This->pCurrent->Next; + while(pCurrent && celt-- > 0) + pCurrent = pCurrent->Next; if (celt) return S_FALSE; else - return NOERROR; + return S_OK; } -static HRESULT WINAPI -IEnumNetConnection_fnReset( - IEnumNetConnection * iface) +CNetConnectionManager::Reset() { - INetConnectionManagerImpl * This = impl_from_EnumNetConnection(iface); - - This->pCurrent = This->pHead; - return NOERROR; + pCurrent = pHead; + return S_OK; } -static HRESULT WINAPI -IEnumNetConnection_fnClone( - IEnumNetConnection * iface, - IEnumNetConnection **ppenum) +CNetConnectionManager::Clone(IEnumNetConnection **ppenum) { return E_NOTIMPL; } -static const IEnumNetConnectionVtbl vt_EnumNetConnection = -{ - IEnumNetConnection_fnQueryInterface, - IEnumNetConnection_fnAddRef, - IEnumNetConnection_fnRelease, - IEnumNetConnection_fnNext, - IEnumNetConnection_fnSkip, - IEnumNetConnection_fnReset, - IEnumNetConnection_fnClone -}; - - BOOL GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetCfg, PDWORD pIndex) { @@ -567,10 +461,8 @@ NormalizeOperStatus( } } - -static BOOL -EnumerateINetConnections(INetConnectionManagerImpl *This) +CNetConnectionManager::EnumerateINetConnections() { DWORD dwSize, dwResult, dwIndex, dwAdapterIndex, dwShowIcon; MIB_IFTABLE *pIfTable; @@ -583,7 +475,6 @@ EnumerateINetConnections(INetConnectionManagerImpl *This) WCHAR szAdapterNetCfg[50]; WCHAR szDetail[200] = L"SYSTEM\\CurrentControlSet\\Control\\Class\\"; WCHAR szName[130] = L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\"; - PINetConnectionItem pNew; PINetConnectionItem pCurrent = NULL; /* get the IfTable */ @@ -624,7 +515,6 @@ EnumerateINetConnections(INetConnectionManagerImpl *This) return FALSE; } - hInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_NET, NULL, NULL, DIGCF_PRESENT ); if (!hInfo) { @@ -636,7 +526,6 @@ EnumerateINetConnections(INetConnectionManagerImpl *This) dwIndex = 0; do { - ZeroMemory(&DevInfo, sizeof(SP_DEVINFO_DATA)); DevInfo.cbSize = sizeof(DevInfo); @@ -672,7 +561,7 @@ EnumerateINetConnections(INetConnectionManagerImpl *This) break; /* allocate new INetConnectionItem */ - pNew = CoTaskMemAlloc(sizeof(INetConnectionItem)); + PINetConnectionItem pNew = (PINetConnectionItem)CoTaskMemAlloc(sizeof(INetConnectionItem)); if (!pNew) break; @@ -703,7 +592,7 @@ EnumerateINetConnections(INetConnectionManagerImpl *This) dwSize = sizeof(szAdapterNetCfg); if (RegQueryValueExW(hSubKey, L"Name", NULL, NULL, (LPBYTE)szAdapterNetCfg, &dwSize) == ERROR_SUCCESS) { - pNew->Props.pszwName = CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR)); + pNew->Props.pszwName = (LPWSTR)CoTaskMemAlloc((wcslen(szAdapterNetCfg)+1) * sizeof(WCHAR)); if (pNew->Props.pszwName) wcscpy(pNew->Props.pszwName, szAdapterNetCfg); } @@ -718,7 +607,7 @@ EnumerateINetConnections(INetConnectionManagerImpl *This) if (SetupDiGetDeviceRegistryPropertyW(hInfo, &DevInfo, SPDRP_DEVICEDESC, NULL, (PBYTE)szNetCfg, sizeof(szNetCfg)/sizeof(WCHAR), &dwSize)) { szNetCfg[(sizeof(szNetCfg)/sizeof(WCHAR))-1] = L'\0'; - pNew->Props.pszwDeviceName = CoTaskMemAlloc((wcslen(szNetCfg)+1) * sizeof(WCHAR)); + pNew->Props.pszwDeviceName = (LPWSTR)CoTaskMemAlloc((wcslen(szNetCfg)+1) * sizeof(WCHAR)); if (pNew->Props.pszwDeviceName) wcscpy(pNew->Props.pszwDeviceName, szNetCfg); } @@ -726,7 +615,7 @@ EnumerateINetConnections(INetConnectionManagerImpl *This) if (pCurrent) pCurrent->Next = pNew; else - This->pHead = pNew; + pHead = pNew; pCurrent = pNew; }while(TRUE); @@ -735,39 +624,32 @@ EnumerateINetConnections(INetConnectionManagerImpl *This) CoTaskMemFree(pAdapterInfo); SetupDiDestroyDeviceInfoList(hInfo); - This->pCurrent = This->pHead; + this->pCurrent = pHead; return TRUE; } -HRESULT WINAPI INetConnectionManager_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) +HRESULT WINAPI INetConnectionManager_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID * ppv) { - INetConnectionManagerImpl *sf; + TRACE("INetConnectionManager_Constructor\n"); if (!ppv) return E_POINTER; if (pUnkOuter) return CLASS_E_NOAGGREGATION; - sf = (INetConnectionManagerImpl *) CoTaskMemAlloc(sizeof (INetConnectionManagerImpl)); - if (!sf) + CNetConnectionManager *pConnectionMgr = new CNetConnectionManager; + if (!pConnectionMgr) return E_OUTOFMEMORY; - sf->ref = 1; - sf->lpVtbl = &vt_NetConnectionManager; - sf->lpVtblNetConnection = &vt_EnumNetConnection; - sf->pHead = NULL; - sf->pCurrent = NULL; + pConnectionMgr->AddRef(); + HRESULT hr = pConnectionMgr->QueryInterface(riid, ppv); + if (SUCCEEDED(hr)) + pConnectionMgr->EnumerateINetConnections(); - if (!SUCCEEDED (INetConnectionManager_QueryInterface ((INetConnectionManager*)sf, riid, ppv))) - { - INetConnectionManager_Release((INetConnectionManager*)sf); - return E_NOINTERFACE; - } + pConnectionMgr->Release(); - INetConnectionManager_Release((INetConnectionManager*)sf); - EnumerateINetConnections(sf); - return S_OK; + return hr; } diff --git a/reactos/dll/win32/netshell/enumlist.c b/reactos/dll/win32/netshell/enumlist.c deleted file mode 100644 index a4a3e494adb..00000000000 --- a/reactos/dll/win32/netshell/enumlist.c +++ /dev/null @@ -1,343 +0,0 @@ -#include - -WINE_DEFAULT_DEBUG_CHANNEL(shell); - -typedef struct tagGUIDStruct -{ - BYTE dummy; /* offset 01 is unknown */ - GUID guid; /* offset 02 */ -} GUIDStruct; - -#define PT_GUID 0x1F - -typedef struct tagPIDLDATA -{ - BYTE type; /*00*/ - union - { - struct tagGUIDStruct guid; - struct tagVALUEStruct value; - }u; -} PIDLDATA, *LPPIDLDATA; - -typedef struct tagENUMLIST -{ - struct tagENUMLIST *pNext; - LPITEMIDLIST pidl; - -}ENUMLIST, *LPENUMLIST; - -typedef struct -{ - const IEnumIDListVtbl *lpVtbl; - LONG ref; - LPENUMLIST mpFirst; - LPENUMLIST mpLast; - LPENUMLIST mpCurrent; - -} IEnumIDListImpl; - -/************************************************************************** - * AddToEnumList() - */ -BOOL -AddToEnumList( - IEnumIDList * iface, - LPITEMIDLIST pidl) -{ - LPENUMLIST pNew; - IEnumIDListImpl *This = (IEnumIDListImpl *)iface; - - - if (!iface || !pidl) - return FALSE; - - pNew = (LPENUMLIST)SHAlloc(sizeof(ENUMLIST)); - if(pNew) - { - pNew->pNext = NULL; - pNew->pidl = pidl; - - if(!This->mpFirst) - { - This->mpFirst = pNew; - This->mpCurrent = pNew; - } - - if(This->mpLast) - { - /*add the new item to the end of the list */ - This->mpLast->pNext = pNew; - } - - /*update the last item pointer */ - This->mpLast = pNew; - return TRUE; - } - return FALSE; -} - -static -HRESULT -WINAPI -IEnumIDList_fnQueryInterface( - IEnumIDList * iface, - REFIID riid, - LPVOID *ppvObj) -{ - IEnumIDListImpl *This = (IEnumIDListImpl *)iface; - - *ppvObj = NULL; - - if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IEnumIDList)) - { - *ppvObj = This; - IEnumIDList_AddRef((IEnumIDList*)*ppvObj); - return S_OK; - } - - return E_NOINTERFACE; -} - -static -ULONG -WINAPI -IEnumIDList_fnAddRef( - IEnumIDList * iface) -{ - IEnumIDListImpl *This = (IEnumIDListImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); - - return refCount; -} - -static -ULONG -WINAPI IEnumIDList_fnRelease( - IEnumIDList * iface) -{ - LPENUMLIST pDelete; - IEnumIDListImpl *This = (IEnumIDListImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); - - if (!refCount) - { - while(This->mpFirst) - { - pDelete = This->mpFirst; - This->mpFirst = pDelete->pNext; - SHFree(pDelete->pidl); - SHFree(pDelete); - } - CoTaskMemFree(This); - } - return refCount; -} - -static -HRESULT -WINAPI -IEnumIDList_fnNext( - IEnumIDList * iface, - ULONG celt, - LPITEMIDLIST * rgelt, - ULONG *pceltFetched) -{ - IEnumIDListImpl *This = (IEnumIDListImpl *)iface; - - ULONG i; - HRESULT hr = S_OK; - LPITEMIDLIST temp; - - if(pceltFetched) - *pceltFetched = 0; - - *rgelt=0; - - if(celt > 1 && !pceltFetched) - { - return E_INVALIDARG; - } - - if(celt > 0 && !This->mpCurrent) - { - return S_FALSE; - } - - for(i = 0; i < celt; i++) - { - if(!(This->mpCurrent)) - break; - - temp = ILClone(This->mpCurrent->pidl); - rgelt[i] = temp; - This->mpCurrent = This->mpCurrent->pNext; - } - - if(pceltFetched) - { - *pceltFetched = i; - } - - return hr; -} - -static -HRESULT -WINAPI -IEnumIDList_fnSkip( - IEnumIDList * iface,ULONG celt) -{ - IEnumIDListImpl *This = (IEnumIDListImpl *)iface; - - DWORD dwIndex; - HRESULT hr = S_OK; - - for(dwIndex = 0; dwIndex < celt; dwIndex++) - { - if(!This->mpCurrent) - { - hr = S_FALSE; - break; - } - This->mpCurrent = This->mpCurrent->pNext; - } - return hr; -} - -static -HRESULT -WINAPI -IEnumIDList_fnReset( - IEnumIDList * iface) -{ - IEnumIDListImpl *This = (IEnumIDListImpl *)iface; - - This->mpCurrent = This->mpFirst; - return S_OK; -} - -static -HRESULT -WINAPI -IEnumIDList_fnClone( - IEnumIDList * iface, - LPENUMIDLIST * ppenum) -{ - //IEnumIDListImpl *This = (IEnumIDListImpl *)iface; - - return E_NOTIMPL; -} - -static const IEnumIDListVtbl eidlvt = -{ - IEnumIDList_fnQueryInterface, - IEnumIDList_fnAddRef, - IEnumIDList_fnRelease, - IEnumIDList_fnNext, - IEnumIDList_fnSkip, - IEnumIDList_fnReset, - IEnumIDList_fnClone, -}; - -IEnumIDList * IEnumIDList_Constructor(void) -{ - IEnumIDListImpl *lpeidl = CoTaskMemAlloc(sizeof(IEnumIDListImpl)); - - if (lpeidl) - { - lpeidl->ref = 1; - lpeidl->lpVtbl = &eidlvt; - lpeidl->mpCurrent = NULL; - lpeidl->mpLast = NULL; - lpeidl->mpFirst = NULL; - } - - return (IEnumIDList*)lpeidl; -} - -LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl) -{ - if(pidl && pidl->mkid.cb != 0x00) - return (LPPIDLDATA) &(pidl->mkid.abID); - return NULL; -} - -LPITEMIDLIST _ILAlloc(BYTE type, unsigned int size) -{ - LPITEMIDLIST pidlOut = NULL; - - pidlOut = SHAlloc(size + 5); - if(pidlOut) - { - LPPIDLDATA pData; - - ZeroMemory(pidlOut, size + 5); - pidlOut->mkid.cb = size + 3; - pData = _ILGetDataPointer(pidlOut); - if (pData) - pData->type = type; - - } - - return pidlOut; -} - -LPITEMIDLIST _ILCreateNetConnect() -{ - LPITEMIDLIST pidlOut; - - pidlOut = _ILAlloc(PT_GUID, sizeof(PIDLDATA)); - if (pidlOut) - { - LPPIDLDATA pData = _ILGetDataPointer(pidlOut); - - memcpy(&(pData->u.guid.guid), &CLSID_NetworkConnections, sizeof(GUID)); - } - return pidlOut; -} - -IID* _ILGetGUIDPointer(LPCITEMIDLIST pidl) -{ - LPPIDLDATA pdata =_ILGetDataPointer(pidl); - - if (!pdata) - return NULL; - - if (pdata->type != PT_GUID) - return NULL; - else - return &(pdata->u.guid.guid); - -} - -BOOL _ILIsNetConnect(LPCITEMIDLIST pidl) -{ - REFIID iid = _ILGetGUIDPointer(pidl); - - if (iid) - return IsEqualIID(iid, &CLSID_NetworkConnections); - return FALSE; -} - -LPITEMIDLIST ILCreateNetConnectItem(INetConnection * pItem) -{ - LPITEMIDLIST pidl; - LPPIDLDATA pdata; - - pidl = _ILAlloc(0x99, sizeof(PIDLDATA)); - pdata = _ILGetDataPointer(pidl); - pdata->u.value.pItem = (PVOID)pItem; - - return pidl; -} - -VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl) -{ - LPPIDLDATA pdata = _ILGetDataPointer(pidl); - - if (pdata && pdata->type==0x99) - return (VALUEStruct*)&(pdata->u.value); - - return NULL; -} diff --git a/reactos/dll/win32/netshell/enumlist.cpp b/reactos/dll/win32/netshell/enumlist.cpp new file mode 100644 index 00000000000..525352ec2ba --- /dev/null +++ b/reactos/dll/win32/netshell/enumlist.cpp @@ -0,0 +1,261 @@ +#include + +WINE_DEFAULT_DEBUG_CHANNEL(shell); + +/************************************************************************** + * AddToEnumList() + */ +BOOL +CEnumIDList::AddToEnumList(LPITEMIDLIST pidl) +{ + LPENUMLIST pNew; + + if (!pidl) + return FALSE; + + pNew = (LPENUMLIST)SHAlloc(sizeof(ENUMLIST)); + if(pNew) + { + pNew->pNext = NULL; + pNew->pidl = pidl; + + if(!mpFirst) + { + mpFirst = pNew; + mpCurrent = pNew; + } + + if(mpLast) + { + /*add the new item to the end of the list */ + mpLast->pNext = pNew; + } + + /*update the last item pointer */ + mpLast = pNew; + return TRUE; + } + return FALSE; +} + +CEnumIDList::CEnumIDList() +{ + ref = 0; + mpCurrent = NULL; + mpLast = NULL; + mpFirst = NULL; +} + +HRESULT +WINAPI +CEnumIDList::QueryInterface( + REFIID riid, + LPVOID *ppvObj) +{ + *ppvObj = NULL; + + if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IEnumIDList)) + { + *ppvObj = (IEnumIDList*)this; + AddRef(); + return S_OK; + } + + return E_NOINTERFACE; +} + +ULONG +WINAPI +CEnumIDList::AddRef() +{ + ULONG refCount = InterlockedIncrement(&ref); + + return refCount; +} + +ULONG +WINAPI CEnumIDList::Release() +{ + LPENUMLIST pDelete; + ULONG refCount = InterlockedDecrement(&ref); + + if (!refCount) + { + while (mpFirst) + { + pDelete = mpFirst; + mpFirst = pDelete->pNext; + SHFree(pDelete->pidl); + SHFree(pDelete); + } + delete this; + } + return refCount; +} + +HRESULT +WINAPI +CEnumIDList::Next( + ULONG celt, + LPITEMIDLIST * rgelt, + ULONG *pceltFetched) +{ + ULONG i; + HRESULT hr = S_OK; + LPITEMIDLIST temp; + + if(pceltFetched) + *pceltFetched = 0; + + *rgelt=0; + + if (celt > 1 && !pceltFetched) + { + return E_INVALIDARG; + } + + if (celt > 0 && !mpCurrent) + { + return S_FALSE; + } + + for (i = 0; i < celt; i++) + { + if (!mpCurrent) + break; + + temp = ILClone(mpCurrent->pidl); + rgelt[i] = temp; + mpCurrent = mpCurrent->pNext; + } + + if (pceltFetched) + *pceltFetched = i; + + return hr; +} + +HRESULT +WINAPI +CEnumIDList::Skip(ULONG celt) +{ + DWORD dwIndex; + HRESULT hr = S_OK; + + for (dwIndex = 0; dwIndex < celt; dwIndex++) + { + if (!mpCurrent) + { + hr = S_FALSE; + break; + } + mpCurrent = mpCurrent->pNext; + } + + return hr; +} + +HRESULT +WINAPI +CEnumIDList::Reset() +{ + mpCurrent = mpFirst; + return S_OK; +} + +HRESULT +WINAPI +CEnumIDList::Clone( + LPENUMIDLIST * ppenum) +{ + //IEnumIDListImpl *This = (IEnumIDListImpl *)iface; + + return E_NOTIMPL; +} + +LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl) +{ + if(pidl && pidl->mkid.cb != 0x00) + return (LPPIDLDATA) &(pidl->mkid.abID); + return NULL; +} + +LPITEMIDLIST _ILAlloc(BYTE type, unsigned int size) +{ + LPITEMIDLIST pidlOut = NULL; + + pidlOut = (LPITEMIDLIST)SHAlloc(size + 5); + if(pidlOut) + { + LPPIDLDATA pData; + + ZeroMemory(pidlOut, size + 5); + pidlOut->mkid.cb = size + 3; + pData = _ILGetDataPointer(pidlOut); + if (pData) + pData->type = type; + + } + + return pidlOut; +} + +LPITEMIDLIST _ILCreateNetConnect() +{ + LPITEMIDLIST pidlOut; + + pidlOut = _ILAlloc(PT_GUID, sizeof(PIDLDATA)); + if (pidlOut) + { + LPPIDLDATA pData = _ILGetDataPointer(pidlOut); + + memcpy(&(pData->u.guid.guid), &CLSID_NetworkConnections, sizeof(GUID)); + } + return pidlOut; +} + +IID* _ILGetGUIDPointer(LPCITEMIDLIST pidl) +{ + LPPIDLDATA pdata =_ILGetDataPointer(pidl); + + if (!pdata) + return NULL; + + if (pdata->type != PT_GUID) + return NULL; + else + return &(pdata->u.guid.guid); + +} + +BOOL _ILIsNetConnect(LPCITEMIDLIST pidl) +{ + IID *piid = _ILGetGUIDPointer(pidl); + + if (piid) + return IsEqualIID(*piid, CLSID_NetworkConnections); + + return FALSE; +} + +LPITEMIDLIST ILCreateNetConnectItem(INetConnection * pItem) +{ + LPITEMIDLIST pidl; + LPPIDLDATA pdata; + + pidl = _ILAlloc(0x99, sizeof(PIDLDATA)); + pdata = _ILGetDataPointer(pidl); + pdata->u.value.pItem = (INetConnection*)pItem; + + return pidl; +} + +VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl) +{ + LPPIDLDATA pdata = _ILGetDataPointer(pidl); + + if (pdata && pdata->type==0x99) + return (VALUEStruct*)&(pdata->u.value); + + return NULL; +} diff --git a/reactos/dll/win32/netshell/lanconnectui.c b/reactos/dll/win32/netshell/lanconnectui.c deleted file mode 100644 index 4db5aa2630c..00000000000 --- a/reactos/dll/win32/netshell/lanconnectui.c +++ /dev/null @@ -1,759 +0,0 @@ -#include - -/// CLASSID -/// {7007ACC5-3202-11D1-AAD2-00805FC1270E} -/// open network properties and wlan properties - -typedef enum -{ - NET_TYPE_CLIENT = 1, - NET_TYPE_SERVICE = 2, - NET_TYPE_PROTOCOL = 3 -}NET_TYPE; - -typedef struct -{ - NET_TYPE Type; - DWORD dwCharacteristics; - LPWSTR szHelp; - INetCfgComponent *pNCfgComp; - UINT NumPropDialogOpen; -}NET_ITEM, *PNET_ITEM; - -typedef struct -{ - INetConnectionPropertyUi2 *lpVtbl; - INetLanConnectionUiInfo * lpLanConUiInfoVtbl; - INetConnectionConnectUi * lpNetConnectionConnectUi; - INetConnection * pCon; - INetCfgLock *NCfgLock; - INetCfg * pNCfg; - NETCON_PROPERTIES * pProperties; - LONG ref; -}INetConnectionPropertyUiImpl, *LPINetConnectionPropertyUiImpl; - -static __inline LPINetConnectionPropertyUiImpl impl_from_NetLanConnectionUiInfo(INetLanConnectionUiInfo *iface) -{ - return (LPINetConnectionPropertyUiImpl)((char *)iface - FIELD_OFFSET(INetConnectionPropertyUiImpl, lpLanConUiInfoVtbl)); -} - -static __inline LPINetConnectionPropertyUiImpl impl_from_NetConnectionConnectUi(INetConnectionConnectUi *iface) -{ - return (LPINetConnectionPropertyUiImpl)((char *)iface - FIELD_OFFSET(INetConnectionPropertyUiImpl, lpNetConnectionConnectUi)); -} - - -HPROPSHEETPAGE -InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle) -{ - PROPSHEETPAGEW ppage; - - memset(&ppage, 0x0, sizeof(PROPSHEETPAGEW)); - ppage.dwSize = sizeof(PROPSHEETPAGEW); - ppage.dwFlags = PSP_DEFAULT; - ppage.u.pszTemplate = resname; - ppage.pfnDlgProc = dlgproc; - ppage.lParam = lParam; - ppage.hInstance = netshell_hInstance; - if (szTitle) - { - ppage.dwFlags |= PSP_USETITLE; - ppage.pszTitle = szTitle; - } - return CreatePropertySheetPageW(&ppage); -} - -VOID -AddItemToListView(HWND hDlgCtrl, PNET_ITEM pItem, LPWSTR szName, BOOL bChecked) -{ - LVITEMW lvItem; - - ZeroMemory(&lvItem, sizeof(lvItem)); - lvItem.mask = LVIF_TEXT | LVIF_PARAM; - lvItem.pszText = szName; - lvItem.lParam = (LPARAM)pItem; - lvItem.iItem = ListView_GetItemCount(hDlgCtrl); - lvItem.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&lvItem); - ListView_SetCheckState(hDlgCtrl, lvItem.iItem, bChecked); -} - -BOOL -GetINetCfgComponent(INetCfg * pNCfg, INetConnectionPropertyUiImpl * This, INetCfgComponent ** pOut) -{ - LPWSTR pName; - HRESULT hr; - INetCfgComponent * pNCg; - ULONG Fetched; - IEnumNetCfgComponent * pEnumCfg; - - hr = INetCfg_EnumComponents(pNCfg, &GUID_DEVCLASS_NET, &pEnumCfg); - if (FAILED(hr)) - { - return FALSE; - } - - while(IEnumNetCfgComponent_Next(pEnumCfg, 1, &pNCg, &Fetched) == S_OK) - { - hr = INetCfgComponent_GetDisplayName(pNCg, &pName); - if (SUCCEEDED(hr)) - { - if (!_wcsicmp(pName, This->pProperties->pszwDeviceName)) - { - *pOut = pNCg; - IEnumNetCfgComponent_Release(pEnumCfg); - return TRUE; - } - CoTaskMemFree(pName); - } - INetCfgComponent_Release(pNCg); - } - IEnumNetCfgComponent_Release(pEnumCfg); - return FALSE; -} - -VOID -EnumComponents(HWND hDlgCtrl, INetConnectionPropertyUiImpl * This, INetCfg * pNCfg, const GUID * CompGuid, UINT Type) -{ - HRESULT hr; - IEnumNetCfgComponent * pENetCfg; - INetCfgComponent *pNCfgComp, *pAdapterCfgComp; - INetCfgComponentBindings * pCompBind; - ULONG Num; - DWORD dwCharacteristics; - LPOLESTR pDisplayName, pHelpText; - PNET_ITEM pItem; - BOOL bChecked; - - hr = INetCfg_EnumComponents(pNCfg, CompGuid, &pENetCfg); - if (FAILED(hr)) - { - INetCfg_Release(pNCfg); - return; - } - while(IEnumNetCfgComponent_Next(pENetCfg, 1, &pNCfgComp, &Num) == S_OK) - { - hr = INetCfgComponent_GetCharacteristics(pNCfgComp, &dwCharacteristics); - if (SUCCEEDED(hr) && (dwCharacteristics & NCF_HIDDEN)) - { - INetCfgComponent_Release(pNCfgComp); - continue; - } - pDisplayName = NULL; - pHelpText = NULL; - hr = INetCfgComponent_GetDisplayName(pNCfgComp, &pDisplayName); - hr = INetCfgComponent_GetHelpText(pNCfgComp, &pHelpText); - bChecked = TRUE; //ReactOS hack - hr = INetCfgComponent_QueryInterface(pNCfgComp, &IID_INetCfgComponentBindings, (LPVOID*)&pCompBind); - if (SUCCEEDED(hr)) - { - if (GetINetCfgComponent(pNCfg, This, &pAdapterCfgComp)) - { - hr = INetCfgComponentBindings_IsBoundTo(pCompBind, pAdapterCfgComp); - if (hr == S_OK) - bChecked = TRUE; - else - bChecked = FALSE; - INetCfgComponent_Release(pAdapterCfgComp); - INetCfgComponentBindings_Release(pCompBind); - } - } - pItem = CoTaskMemAlloc(sizeof(NET_ITEM)); - if (!pItem) - continue; - pItem->dwCharacteristics = dwCharacteristics; - pItem->szHelp = pHelpText; - pItem->Type = Type; - pItem->pNCfgComp = pNCfgComp; - pItem->NumPropDialogOpen = 0; - - - AddItemToListView(hDlgCtrl, pItem, pDisplayName, bChecked); - CoTaskMemFree(pDisplayName); - } - IEnumNetCfgComponent_Release(pENetCfg); -} - - -VOID -InitializeLANPropertiesUIDlg(HWND hwndDlg, INetConnectionPropertyUiImpl * This) -{ - HRESULT hr; - INetCfg * pNCfg; - INetCfgLock * pNCfgLock; - HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST); - LVCOLUMNW lc; - RECT rc; - DWORD dwStyle; - LPWSTR pDisplayName; - LVITEMW li; - - SendDlgItemMessageW(hwndDlg, IDC_NETCARDNAME, WM_SETTEXT, 0, (LPARAM)This->pProperties->pszwDeviceName); - if (This->pProperties->dwCharacter & NCCF_SHOW_ICON) - { - /* check show item on taskbar*/ - SendDlgItemMessageW(hwndDlg, IDC_SHOWTASKBAR, BM_SETCHECK, BST_CHECKED, 0); - } - if (This->pProperties->dwCharacter & NCCF_NOTIFY_DISCONNECTED) - { - /* check notify item */ - SendDlgItemMessageW(hwndDlg, IDC_NOTIFYNOCONNECTION, BM_SETCHECK, BST_CHECKED, 0); - } - - memset(&lc, 0, sizeof(LV_COLUMN)); - lc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT; - lc.fmt = LVCFMT_FIXED_WIDTH; - if (GetClientRect(hDlgCtrl, &rc)) - { - lc.mask |= LVCF_WIDTH; - lc.cx = rc.right - rc.left; - } - lc.pszText = L""; - (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM)&lc); - dwStyle = (DWORD) SendMessage(hDlgCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); - dwStyle = dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES; - SendMessage(hDlgCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle); - - - - hr = CoCreateInstance(&CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, &IID_INetCfg, (LPVOID*)&pNCfg); - if (FAILED(hr)) - return; - - hr = INetCfgLock_QueryInterface(pNCfg, &IID_INetCfgLock, (LPVOID*)&pNCfgLock); - hr = INetCfgLock_AcquireWriteLock(pNCfgLock, 100, L"", &pDisplayName); - if (hr == S_FALSE) - { - CoTaskMemFree(pDisplayName); - return; - } - - This->NCfgLock = pNCfgLock; - hr = INetCfg_Initialize(pNCfg, NULL); - if (FAILED(hr)) - { - INetCfg_Release(pNCfg); - return; - } - - EnumComponents(hDlgCtrl, This, pNCfg, &GUID_DEVCLASS_NETCLIENT, NET_TYPE_CLIENT); - EnumComponents(hDlgCtrl, This, pNCfg, &GUID_DEVCLASS_NETSERVICE, NET_TYPE_SERVICE); - EnumComponents(hDlgCtrl, This, pNCfg, &GUID_DEVCLASS_NETTRANS, NET_TYPE_PROTOCOL); - This->pNCfg = pNCfg; - - ZeroMemory(&li, sizeof(li)); - li.mask = LVIF_STATE; - li.stateMask = (UINT)-1; - li.state = LVIS_FOCUSED|LVIS_SELECTED; - (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); -} - -VOID -ShowNetworkComponentProperties( - HWND hwndDlg, - INetConnectionPropertyUiImpl * This) -{ - LVITEMW lvItem; - HWND hDlgCtrl; - UINT Index, Count; - HRESULT hr; - INetCfgComponent * pNCfgComp; - PNET_ITEM pItem; - - hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST); - Count = ListView_GetItemCount(hDlgCtrl); - if (!Count) - return; - - ZeroMemory(&lvItem, sizeof(LVITEMW)); - lvItem.mask = LVIF_PARAM | LVIF_STATE; - lvItem.stateMask = (UINT)-1; - for (Index = 0; Index < Count; Index++) - { - lvItem.iItem = Index; - if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&lvItem)) - { - if (lvItem.state & LVIS_SELECTED) - break; - } - } - - if (!(lvItem.state & LVIS_SELECTED)) - { - return; - } - - pItem = (PNET_ITEM)lvItem.lParam; - pNCfgComp = (INetCfgComponent*) pItem->pNCfgComp; - hr = INetCfgComponent_RaisePropertyUi(pNCfgComp, GetParent(hwndDlg), NCRP_QUERY_PROPERTY_UI, (IUnknown*)This); - if (SUCCEEDED(hr)) - { - hr = INetCfgComponent_RaisePropertyUi(pNCfgComp, GetParent(hwndDlg), NCRP_SHOW_PROPERTY_UI, (IUnknown*)This); - } -} - - -INT_PTR -CALLBACK -LANPropertiesUIDlg( - HWND hwndDlg, - UINT uMsg, - WPARAM wParam, - LPARAM lParam -) -{ - PROPSHEETPAGE *page; - LPNMLISTVIEW lppl; - LVITEMW li; - PNET_ITEM pItem; - INetConnectionPropertyUiImpl * This; - LPPSHNOTIFY lppsn; - DWORD dwShowIcon; - HRESULT hr; - WCHAR szKey[200]; - LPOLESTR pStr; - HKEY hKey; - - switch(uMsg) - { - case WM_INITDIALOG: - page = (PROPSHEETPAGE*)lParam; - This = (INetConnectionPropertyUiImpl*)page->lParam; - InitializeLANPropertiesUIDlg(hwndDlg, This); - SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)This); - return TRUE; - case WM_NOTIFY: - lppl = (LPNMLISTVIEW) lParam; - lppsn = (LPPSHNOTIFY) lParam; - if (lppsn->hdr.code == PSN_APPLY) - { - This = (INetConnectionPropertyUiImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER); - if (This->pNCfg) - { - hr = INetCfg_Apply(This->pNCfg); - if (FAILED(hr)) - return PSNRET_INVALID; - } - - if (SendDlgItemMessageW(hwndDlg, IDC_SHOWTASKBAR, BM_GETCHECK, 0, 0) == BST_CHECKED) - dwShowIcon = 1; - else - dwShowIcon = 0; - - - if (StringFromCLSID(&This->pProperties->guidId, &pStr) == ERROR_SUCCESS) - { - swprintf(szKey, L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr); - CoTaskMemFree(pStr); - if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szKey, 0, KEY_WRITE, &hKey) == ERROR_SUCCESS) - { - RegSetValueExW(hKey, L"ShowIcon", 0, REG_DWORD, (LPBYTE)&dwShowIcon, sizeof(DWORD)); - RegCloseKey(hKey); - } - } - - return PSNRET_NOERROR; - } -#if 0 - else if (lppsn->hdr.code == PSN_CANCEL) - { - This = (INetConnectionPropertyUiImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER); - if (This->pNCfg) - { - hr = INetCfg_Cancel(This->pNCfg); - if (SUCCEEDED(hr)) - return PSNRET_NOERROR; - else - return PSNRET_INVALID; - } - return PSNRET_NOERROR; - } -#endif - if (lppl->hdr.code == LVN_ITEMCHANGING) - { - ZeroMemory(&li, sizeof(li)); - li.mask = LVIF_PARAM; - li.iItem = lppl->iItem; - if (!SendMessageW(lppl->hdr.hwndFrom, LVM_GETITEMW, 0, (LPARAM)&li)) - return TRUE; - - pItem = (PNET_ITEM)li.lParam; - if (!pItem) - return TRUE; - - if (!(lppl->uOldState & LVIS_FOCUSED) && (lppl->uNewState & LVIS_FOCUSED)) - { - /* new focused item */ - if (pItem->dwCharacteristics & NCF_NOT_USER_REMOVABLE) - EnableWindow(GetDlgItem(hwndDlg, IDC_UNINSTALL), FALSE); - else - EnableWindow(GetDlgItem(hwndDlg, IDC_UNINSTALL), TRUE); - - if (pItem->dwCharacteristics & NCF_HAS_UI) - EnableWindow(GetDlgItem(hwndDlg, IDC_PROPERTIES), TRUE); - else - EnableWindow(GetDlgItem(hwndDlg, IDC_PROPERTIES), FALSE); - - SendDlgItemMessageW(hwndDlg, IDC_DESCRIPTION, WM_SETTEXT, 0, (LPARAM)pItem->szHelp); - } - } - break; - case WM_COMMAND: - if (LOWORD(wParam) == IDC_PROPERTIES) - { - This = (INetConnectionPropertyUiImpl*) GetWindowLongPtr(hwndDlg, DWLP_USER); - ShowNetworkComponentProperties(hwndDlg, This); - return FALSE; - } - break; - } - return FALSE; -} - -static -HRESULT -WINAPI -INetConnectionPropertyUi2_fnQueryInterface( - INetConnectionPropertyUi2 * iface, - REFIID iid, - LPVOID * ppvObj) -{ - LPOLESTR pStr; - INetConnectionPropertyUiImpl * This = (INetConnectionPropertyUiImpl*)iface; - *ppvObj = NULL; - - if (IsEqualIID (iid, &IID_IUnknown) || - IsEqualIID (iid, &IID_INetConnectionPropertyUi) || - IsEqualIID (iid, &IID_INetConnectionPropertyUi2)) - { - *ppvObj = This; - IUnknown_AddRef(iface); - return S_OK; - } - else if (IsEqualIID(iid, &IID_INetLanConnectionUiInfo)) - { - *ppvObj = &This->lpLanConUiInfoVtbl; - IUnknown_AddRef(iface); - return S_OK; - } - else if (IsEqualIID(iid, &IID_INetConnectionConnectUi)) - { - *ppvObj = &This->lpNetConnectionConnectUi; - IUnknown_AddRef(iface); - return S_OK; - } - - StringFromCLSID(iid, &pStr); - MessageBoxW(NULL, pStr, L"INetConnectionPropertyUi_fnQueryInterface", MB_OK); - CoTaskMemFree(pStr); - return E_NOINTERFACE; -} - -static -ULONG -WINAPI -INetConnectionPropertyUi2_fnAddRef( - INetConnectionPropertyUi2 * iface) -{ - INetConnectionPropertyUiImpl * This = (INetConnectionPropertyUiImpl*)iface; - ULONG refCount = InterlockedIncrement(&This->ref); - - return refCount; -} - -static -ULONG -WINAPI -INetConnectionPropertyUi2_fnRelease( - INetConnectionPropertyUi2 * iface) -{ - INetConnectionPropertyUiImpl * This = (INetConnectionPropertyUiImpl*)iface; - ULONG refCount = InterlockedDecrement(&This->ref); - - if (!refCount) - { - if (This->pNCfg) - { - INetCfg_Uninitialize(This->pNCfg); - INetCfg_Release(This->pNCfg); - } - if (This->NCfgLock) - { - INetCfgLock_Release(This->NCfgLock); - } - if (This->pProperties) - { - NcFreeNetconProperties(This->pProperties); - } - CoTaskMemFree (This); - } - return refCount; -} - -static -HRESULT -WINAPI -INetConnectionPropertyUi2_fnSetConnection( - INetConnectionPropertyUi2 * iface, - INetConnection *pCon) -{ - INetConnectionPropertyUiImpl * This = (INetConnectionPropertyUiImpl*)iface; - - if (!pCon) - return E_POINTER; - - if (This->pCon) - INetConnection_Release(This->pCon); - - This->pCon = pCon; - INetConnection_AddRef(This->pCon); - return S_OK; -} - -static -HRESULT -WINAPI -INetConnectionPropertyUi2_fnAddPages( - INetConnectionPropertyUi2 * iface, - HWND hwndParent, - LPFNADDPROPSHEETPAGE pfnAddPage, - LPARAM lParam) -{ - HPROPSHEETPAGE hProp; - BOOL ret; - HRESULT hr = E_FAIL; - INITCOMMONCONTROLSEX initEx; - INetConnectionPropertyUiImpl * This = (INetConnectionPropertyUiImpl*)iface; - - - initEx.dwSize = sizeof(initEx); - initEx.dwICC = ICC_LISTVIEW_CLASSES; - if(!InitCommonControlsEx(&initEx)) - return E_FAIL; - - hr = INetConnection_GetProperties(This->pCon, &This->pProperties); - if (FAILED(hr)) - return hr; - - hProp = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_NETPROPERTIES), LANPropertiesUIDlg, (LPARAM)This, This->pProperties->pszwName); - if (hProp) - { - ret = (*pfnAddPage)(hProp, lParam); - if (ret) - { - hr = NOERROR; - } - else - { - DestroyPropertySheetPage(hProp); - } - } - return hr; -} - -static -HRESULT -WINAPI -INetConnectionPropertyUi2_fnGetIcon( - INetConnectionPropertyUi2 * iface, - DWORD dwSize, - HICON *phIcon) -{ - return E_NOTIMPL; -} - -static const INetConnectionPropertyUi2Vtbl vt_NetConnectionPropertyUi = -{ - INetConnectionPropertyUi2_fnQueryInterface, - INetConnectionPropertyUi2_fnAddRef, - INetConnectionPropertyUi2_fnRelease, - INetConnectionPropertyUi2_fnSetConnection, - INetConnectionPropertyUi2_fnAddPages, - INetConnectionPropertyUi2_fnGetIcon, -}; - -static -HRESULT -WINAPI -INetLanConnectionUiInfo_fnQueryInterface( - INetLanConnectionUiInfo * iface, - REFIID iid, - LPVOID * ppvObj) -{ - INetConnectionPropertyUiImpl * This = impl_from_NetLanConnectionUiInfo(iface); - return INetConnectionPropertyUi_QueryInterface((INetConnectionPropertyUi*)This, iid, ppvObj); -} - -static -ULONG -WINAPI -INetLanConnectionUiInfo_fnAddRef( - INetLanConnectionUiInfo * iface) -{ - INetConnectionPropertyUiImpl * This = impl_from_NetLanConnectionUiInfo(iface); - return INetConnectionPropertyUi_AddRef((INetConnectionPropertyUi*)This); -} - -static -ULONG -WINAPI -INetLanConnectionUiInfo_fnRelease( - INetLanConnectionUiInfo * iface) -{ - INetConnectionPropertyUiImpl * This = impl_from_NetLanConnectionUiInfo(iface); - return INetConnectionPropertyUi_Release((INetConnectionPropertyUi*)This); -} - -static -HRESULT -WINAPI -INetLanConnectionUiInfo_fnGetDeviceGuid( - INetLanConnectionUiInfo * iface, - GUID * pGuid) -{ - INetConnectionPropertyUiImpl * This = impl_from_NetLanConnectionUiInfo(iface); - CopyMemory(pGuid, &This->pProperties->guidId, sizeof(GUID)); - return S_OK; -} - -static const INetLanConnectionUiInfoVtbl vt_NetLanConnectionUiInfo = -{ - INetLanConnectionUiInfo_fnQueryInterface, - INetLanConnectionUiInfo_fnAddRef, - INetLanConnectionUiInfo_fnRelease, - INetLanConnectionUiInfo_fnGetDeviceGuid, -}; - -static -HRESULT -WINAPI -INetConnectionConnectUi_fnQueryInterface( - INetConnectionConnectUi * iface, - REFIID iid, - LPVOID * ppvObj) -{ - INetConnectionPropertyUiImpl * This = impl_from_NetConnectionConnectUi(iface); - return INetConnectionPropertyUi_QueryInterface((INetConnectionPropertyUi*)This, iid, ppvObj); -} - -static -ULONG -WINAPI -INetConnectionConnectUi_fnAddRef( - INetConnectionConnectUi * iface) -{ - INetConnectionPropertyUiImpl * This = impl_from_NetConnectionConnectUi(iface); - return INetConnectionPropertyUi_AddRef((INetConnectionPropertyUi*)This); -} - -static -ULONG -WINAPI -INetConnectionConnectUi_fnRelease( - INetConnectionConnectUi * iface) -{ - INetConnectionPropertyUiImpl * This = impl_from_NetConnectionConnectUi(iface); - return INetConnectionPropertyUi_Release((INetConnectionPropertyUi*)This); -} - -static -HRESULT -WINAPI -INetConnectionConnectUi_fnSetConnection( - INetConnectionConnectUi * iface, - INetConnection* pCon) -{ - INetConnectionPropertyUiImpl * This = impl_from_NetConnectionConnectUi(iface); - if (This->pCon) - INetConnection_Release(This->pCon); - - if (!pCon) - return E_POINTER; - - This->pCon = pCon; - INetConnection_AddRef(pCon); - return S_OK; -} - -static -HRESULT -WINAPI -INetConnectionConnectUi_fnConnect( - INetConnectionConnectUi * iface, - HWND hwndParent, - DWORD dwFlags) -{ - INetConnectionPropertyUiImpl * This = impl_from_NetConnectionConnectUi(iface); - - if (!This->pCon) - return E_POINTER; //FIXME - - - if (dwFlags & NCUC_NO_UI) - { - return INetConnection_Connect(This->pCon); - } - - return E_FAIL; -} - -static -HRESULT -WINAPI -INetConnectionConnectUi_fnDisconnect( - INetConnectionConnectUi * iface, - HWND hwndParent, - DWORD dwFlags) -{ - WCHAR szBuffer[100]; - swprintf(szBuffer, L"INetConnectionConnectUi_fnDisconnect flags %x\n", dwFlags); - MessageBoxW(NULL, szBuffer, NULL, MB_OK); - - return S_OK; -} - - -static const INetConnectionConnectUiVtbl vt_NetConnectionConnectUi = -{ - INetConnectionConnectUi_fnQueryInterface, - INetConnectionConnectUi_fnAddRef, - INetConnectionConnectUi_fnRelease, - INetConnectionConnectUi_fnSetConnection, - INetConnectionConnectUi_fnConnect, - INetConnectionConnectUi_fnDisconnect, - -}; - - - -HRESULT WINAPI LanConnectUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) -{ - INetConnectionPropertyUiImpl * This; - - if (!ppv) - return E_POINTER; - - if (pUnkOuter) - return CLASS_E_NOAGGREGATION; - - This = (INetConnectionPropertyUiImpl *) CoTaskMemAlloc(sizeof (INetConnectionPropertyUiImpl)); - if (!This) - return E_OUTOFMEMORY; - - This->ref = 1; - This->pCon = NULL; - This->pNCfg = NULL; - This->NCfgLock = NULL; - This->pProperties = NULL; - This->lpVtbl = (INetConnectionPropertyUi2*)&vt_NetConnectionPropertyUi; - This->lpLanConUiInfoVtbl = (INetLanConnectionUiInfo*)&vt_NetLanConnectionUiInfo; - This->lpNetConnectionConnectUi = (INetConnectionConnectUi*)&vt_NetConnectionConnectUi; - - if (!SUCCEEDED (INetConnectionPropertyUi2_fnQueryInterface ((INetConnectionPropertyUi2*)This, riid, ppv))) - { - IUnknown_Release((IUnknown*)This); - return E_NOINTERFACE; - } - - IUnknown_Release((IUnknown*)This); - return S_OK; -} diff --git a/reactos/dll/win32/netshell/lanconnectui.cpp b/reactos/dll/win32/netshell/lanconnectui.cpp new file mode 100644 index 00000000000..08acced3db8 --- /dev/null +++ b/reactos/dll/win32/netshell/lanconnectui.cpp @@ -0,0 +1,622 @@ +#include + +WINE_DEFAULT_DEBUG_CHANNEL (shell); + +/// CLASSID +/// {7007ACC5-3202-11D1-AAD2-00805FC1270E} +/// open network properties and wlan properties + +typedef enum +{ + NET_TYPE_CLIENT = 1, + NET_TYPE_SERVICE = 2, + NET_TYPE_PROTOCOL = 3 +} NET_TYPE; + +typedef struct +{ + NET_TYPE Type; + DWORD dwCharacteristics; + LPWSTR szHelp; + INetCfgComponent *pNCfgComp; + UINT NumPropDialogOpen; +} NET_ITEM, *PNET_ITEM; + +class CNetConnectionPropertyUi: + public INetConnectionPropertyUi2, + public INetLanConnectionUiInfo, + public INetConnectionConnectUi +{ + public: + CNetConnectionPropertyUi(); + + // IUnknown + virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); + virtual ULONG WINAPI AddRef(); + virtual ULONG WINAPI Release(); + + // INetConnectionPropertyUi2 + virtual HRESULT WINAPI AddPages(HWND hwndParent, LPFNADDPROPSHEETPAGE pfnAddPage, LPARAM lParam); + virtual HRESULT WINAPI GetIcon(DWORD dwSize, HICON *phIcon); + + // INetLanConnectionUiInfo + virtual HRESULT WINAPI GetDeviceGuid(GUID *pGuid); + + // INetConnectionConnectUi + virtual HRESULT WINAPI SetConnection(INetConnection* pCon); + virtual HRESULT WINAPI Connect(HWND hwndParent, DWORD dwFlags); + virtual HRESULT WINAPI Disconnect(HWND hwndParent, DWORD dwFlags); + + private: + BOOL GetINetCfgComponent(INetCfg *pNCfg, INetCfgComponent ** pOut); + VOID EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GUID *CompGuid, UINT Type); + VOID InitializeLANPropertiesUIDlg(HWND hwndDlg); + VOID ShowNetworkComponentProperties(HWND hwndDlg); + static INT_PTR CALLBACK LANPropertiesUIDlg(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); + + INetConnection * pCon; + INetCfgLock *NCfgLock; + INetCfg * pNCfg; + NETCON_PROPERTIES * pProperties; + LONG ref; +}; + +CNetConnectionPropertyUi::CNetConnectionPropertyUi() +{ + ref = 0; + pCon = NULL; + pNCfg = NULL; + NCfgLock = NULL; + pProperties = NULL; +} + +HPROPSHEETPAGE +InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle) +{ + PROPSHEETPAGEW ppage; + + memset(&ppage, 0x0, sizeof(PROPSHEETPAGEW)); + ppage.dwSize = sizeof(PROPSHEETPAGEW); + ppage.dwFlags = PSP_DEFAULT; + ppage.u.pszTemplate = resname; + ppage.pfnDlgProc = dlgproc; + ppage.lParam = lParam; + ppage.hInstance = netshell_hInstance; + if (szTitle) + { + ppage.dwFlags |= PSP_USETITLE; + ppage.pszTitle = szTitle; + } + return CreatePropertySheetPageW(&ppage); +} + +VOID +AddItemToListView(HWND hDlgCtrl, PNET_ITEM pItem, LPWSTR szName, BOOL bChecked) +{ + LVITEMW lvItem; + + ZeroMemory(&lvItem, sizeof(lvItem)); + lvItem.mask = LVIF_TEXT | LVIF_PARAM; + lvItem.pszText = szName; + lvItem.lParam = (LPARAM)pItem; + lvItem.iItem = ListView_GetItemCount(hDlgCtrl); + lvItem.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&lvItem); + ListView_SetCheckState(hDlgCtrl, lvItem.iItem, bChecked); +} + +BOOL +CNetConnectionPropertyUi::GetINetCfgComponent(INetCfg *pNCfg, INetCfgComponent ** pOut) +{ + LPWSTR pName; + HRESULT hr; + INetCfgComponent * pNCg; + ULONG Fetched; + IEnumNetCfgComponent * pEnumCfg; + + hr = pNCfg->EnumComponents(&GUID_DEVCLASS_NET, &pEnumCfg); + if (FAILED(hr)) + { + return FALSE; + } + + while (pEnumCfg->Next(1, &pNCg, &Fetched) == S_OK) + { + hr = pNCg->GetDisplayName(&pName); + if (SUCCEEDED(hr)) + { + if (!_wcsicmp(pName, pProperties->pszwDeviceName)) + { + *pOut = pNCg; + pEnumCfg->Release(); + return TRUE; + } + CoTaskMemFree(pName); + } + pNCg->Release(); + } + pEnumCfg->Release(); + return FALSE; +} + +VOID +CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GUID *CompGuid, UINT Type) +{ + HRESULT hr; + IEnumNetCfgComponent * pENetCfg; + INetCfgComponent *pNCfgComp, *pAdapterCfgComp; + INetCfgComponentBindings * pCompBind; + ULONG Num; + DWORD dwCharacteristics; + LPOLESTR pDisplayName, pHelpText; + PNET_ITEM pItem; + BOOL bChecked; + + hr = pNCfg->EnumComponents(CompGuid, &pENetCfg); + if (FAILED(hr)) + { + pNCfg->Release(); + return; + } + while(pENetCfg->Next(1, &pNCfgComp, &Num) == S_OK) + { + hr = pNCfgComp->GetCharacteristics(&dwCharacteristics); + if (SUCCEEDED(hr) && (dwCharacteristics & NCF_HIDDEN)) + { + pNCfgComp->Release(); + continue; + } + pDisplayName = NULL; + pHelpText = NULL; + hr = pNCfgComp->GetDisplayName(&pDisplayName); + hr = pNCfgComp->GetHelpText(&pHelpText); + bChecked = TRUE; //ReactOS hack + hr = pNCfgComp->QueryInterface(IID_INetCfgComponentBindings, (LPVOID*)&pCompBind); + if (SUCCEEDED(hr)) + { + if (GetINetCfgComponent(pNCfg, &pAdapterCfgComp)) + { + hr = pCompBind->IsBoundTo(pAdapterCfgComp); + if (hr == S_OK) + bChecked = TRUE; + else + bChecked = FALSE; + pAdapterCfgComp->Release(); + pCompBind->Release(); + } + } + + pItem = (NET_ITEM*)CoTaskMemAlloc(sizeof(NET_ITEM)); + if (!pItem) + continue; + + pItem->dwCharacteristics = dwCharacteristics; + pItem->szHelp = pHelpText; + pItem->Type = (NET_TYPE)Type; + pItem->pNCfgComp = pNCfgComp; + pItem->NumPropDialogOpen = 0; + + AddItemToListView(hDlgCtrl, pItem, pDisplayName, bChecked); + CoTaskMemFree(pDisplayName); + } + pENetCfg->Release(); +} + +VOID +CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg) +{ + HRESULT hr; + INetCfg *pNCfg; + INetCfgLock *pNCfgLock; + HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST); + LVCOLUMNW lc; + RECT rc; + DWORD dwStyle; + LPWSTR pDisplayName; + LVITEMW li; + + SendDlgItemMessageW(hwndDlg, IDC_NETCARDNAME, WM_SETTEXT, 0, (LPARAM)pProperties->pszwDeviceName); + if (pProperties->dwCharacter & NCCF_SHOW_ICON) + { + /* check show item on taskbar*/ + SendDlgItemMessageW(hwndDlg, IDC_SHOWTASKBAR, BM_SETCHECK, BST_CHECKED, 0); + } + if (pProperties->dwCharacter & NCCF_NOTIFY_DISCONNECTED) + { + /* check notify item */ + SendDlgItemMessageW(hwndDlg, IDC_NOTIFYNOCONNECTION, BM_SETCHECK, BST_CHECKED, 0); + } + + memset(&lc, 0, sizeof(LV_COLUMN)); + lc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT; + lc.fmt = LVCFMT_FIXED_WIDTH; + if (GetClientRect(hDlgCtrl, &rc)) + { + lc.mask |= LVCF_WIDTH; + lc.cx = rc.right - rc.left; + } + lc.pszText = (LPWSTR)L""; + (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM)&lc); + dwStyle = (DWORD) SendMessage(hDlgCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); + dwStyle = dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES; + SendMessage(hDlgCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle); + + hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (LPVOID*)&pNCfg); + if (FAILED(hr)) + return; + + hr = pNCfg->QueryInterface(IID_INetCfgLock, (LPVOID*)&pNCfgLock); + hr = pNCfgLock->AcquireWriteLock(100, L"", &pDisplayName); + if (hr == S_FALSE) + { + CoTaskMemFree(pDisplayName); + return; + } + + NCfgLock = pNCfgLock; + hr = pNCfg->Initialize(NULL); + if (FAILED(hr)) + { + pNCfg->Release(); + return; + } + + EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETCLIENT, NET_TYPE_CLIENT); + EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETSERVICE, NET_TYPE_SERVICE); + EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETTRANS, NET_TYPE_PROTOCOL); + this->pNCfg = pNCfg; + + ZeroMemory(&li, sizeof(li)); + li.mask = LVIF_STATE; + li.stateMask = (UINT)-1; + li.state = LVIS_FOCUSED|LVIS_SELECTED; + (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); +} + +VOID +CNetConnectionPropertyUi::ShowNetworkComponentProperties(HWND hwndDlg) +{ + LVITEMW lvItem; + HWND hDlgCtrl; + UINT Index, Count; + HRESULT hr; + INetCfgComponent *pNCfgComp; + PNET_ITEM pItem; + + hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST); + Count = ListView_GetItemCount(hDlgCtrl); + if (!Count) + return; + + ZeroMemory(&lvItem, sizeof(LVITEMW)); + lvItem.mask = LVIF_PARAM | LVIF_STATE; + lvItem.stateMask = (UINT)-1; + for (Index = 0; Index < Count; Index++) + { + lvItem.iItem = Index; + if (SendMessageW(hDlgCtrl, LVM_GETITEMW, 0, (LPARAM)&lvItem)) + { + if (lvItem.state & LVIS_SELECTED) + break; + } + } + + if (!(lvItem.state & LVIS_SELECTED)) + { + return; + } + + pItem = (PNET_ITEM)lvItem.lParam; + pNCfgComp = (INetCfgComponent*)pItem->pNCfgComp; + hr = pNCfgComp->RaisePropertyUi(GetParent(hwndDlg), NCRP_QUERY_PROPERTY_UI, (INetConnectionConnectUi*)this); + if (SUCCEEDED(hr)) + { + hr = pNCfgComp->RaisePropertyUi(GetParent(hwndDlg), NCRP_SHOW_PROPERTY_UI, (INetConnectionConnectUi*)this); + } +} + +INT_PTR +CALLBACK +CNetConnectionPropertyUi::LANPropertiesUIDlg( + HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PROPSHEETPAGE *page; + LPNMLISTVIEW lppl; + LVITEMW li; + PNET_ITEM pItem; + CNetConnectionPropertyUi * This; + LPPSHNOTIFY lppsn; + DWORD dwShowIcon; + HRESULT hr; + WCHAR szKey[200]; + LPOLESTR pStr; + HKEY hKey; + + switch(uMsg) + { + case WM_INITDIALOG: + page = (PROPSHEETPAGE*)lParam; + This = (CNetConnectionPropertyUi*)page->lParam; + This->InitializeLANPropertiesUIDlg(hwndDlg); + SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)This); + return TRUE; + case WM_NOTIFY: + lppl = (LPNMLISTVIEW) lParam; + lppsn = (LPPSHNOTIFY) lParam; + if (lppsn->hdr.code == PSN_APPLY) + { + This = (CNetConnectionPropertyUi*)GetWindowLongPtr(hwndDlg, DWLP_USER); + if (This->pNCfg) + { + hr = This->pNCfg->Apply(); + if (FAILED(hr)) + return PSNRET_INVALID; + } + + if (SendDlgItemMessageW(hwndDlg, IDC_SHOWTASKBAR, BM_GETCHECK, 0, 0) == BST_CHECKED) + dwShowIcon = 1; + else + dwShowIcon = 0; + + + if (StringFromCLSID((CLSID)This->pProperties->guidId, &pStr) == ERROR_SUCCESS) + { + swprintf(szKey, L"SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", pStr); + CoTaskMemFree(pStr); + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szKey, 0, KEY_WRITE, &hKey) == ERROR_SUCCESS) + { + RegSetValueExW(hKey, L"ShowIcon", 0, REG_DWORD, (LPBYTE)&dwShowIcon, sizeof(DWORD)); + RegCloseKey(hKey); + } + } + + return PSNRET_NOERROR; + } +#if 0 + else if (lppsn->hdr.code == PSN_CANCEL) + { + This = (CNetConnectionPropertyUi*)GetWindowLongPtr(hwndDlg, DWLP_USER); + if (This->pNCfg) + { + hr = This->pNCfg->Cancel(); + if (SUCCEEDED(hr)) + return PSNRET_NOERROR; + else + return PSNRET_INVALID; + } + return PSNRET_NOERROR; + } +#endif + if (lppl->hdr.code == LVN_ITEMCHANGING) + { + ZeroMemory(&li, sizeof(li)); + li.mask = LVIF_PARAM; + li.iItem = lppl->iItem; + if (!SendMessageW(lppl->hdr.hwndFrom, LVM_GETITEMW, 0, (LPARAM)&li)) + return TRUE; + + pItem = (PNET_ITEM)li.lParam; + if (!pItem) + return TRUE; + + if (!(lppl->uOldState & LVIS_FOCUSED) && (lppl->uNewState & LVIS_FOCUSED)) + { + /* new focused item */ + if (pItem->dwCharacteristics & NCF_NOT_USER_REMOVABLE) + EnableWindow(GetDlgItem(hwndDlg, IDC_UNINSTALL), FALSE); + else + EnableWindow(GetDlgItem(hwndDlg, IDC_UNINSTALL), TRUE); + + if (pItem->dwCharacteristics & NCF_HAS_UI) + EnableWindow(GetDlgItem(hwndDlg, IDC_PROPERTIES), TRUE); + else + EnableWindow(GetDlgItem(hwndDlg, IDC_PROPERTIES), FALSE); + + SendDlgItemMessageW(hwndDlg, IDC_DESCRIPTION, WM_SETTEXT, 0, (LPARAM)pItem->szHelp); + } + } + break; + case WM_COMMAND: + if (LOWORD(wParam) == IDC_PROPERTIES) + { + This = (CNetConnectionPropertyUi*) GetWindowLongPtr(hwndDlg, DWLP_USER); + This->ShowNetworkComponentProperties(hwndDlg); + return FALSE; + } + break; + } + return FALSE; +} + +HRESULT +WINAPI +CNetConnectionPropertyUi::QueryInterface( + REFIID iid, + LPVOID *ppvObj) +{ + LPOLESTR pStr; + *ppvObj = NULL; + + if (IsEqualIID (iid, IID_IUnknown) || + IsEqualIID (iid, IID_INetConnectionPropertyUi) || + IsEqualIID (iid, IID_INetConnectionPropertyUi2)) + { + *ppvObj = (INetConnectionPropertyUi2*)this; + AddRef(); + return S_OK; + } + else if (IsEqualIID(iid, IID_INetLanConnectionUiInfo)) + { + *ppvObj = (INetLanConnectionUiInfo*)this; + AddRef(); + return S_OK; + } + else if (IsEqualIID(iid, IID_INetConnectionConnectUi)) + { + *ppvObj = (INetConnectionConnectUi*)this; + AddRef(); + return S_OK; + } + + StringFromCLSID((CLSID)iid, &pStr); + MessageBoxW(NULL, pStr, L"INetConnectionPropertyUi_fnQueryInterface", MB_OK); + CoTaskMemFree(pStr); + return E_NOINTERFACE; +} + +ULONG +WINAPI +CNetConnectionPropertyUi::AddRef() +{ + ULONG refCount = InterlockedIncrement(&ref); + + return refCount; +} + +ULONG +WINAPI +CNetConnectionPropertyUi::Release() +{ + ULONG refCount = InterlockedDecrement(&ref); + + if (!refCount) + { + if (pNCfg) + { + pNCfg->Uninitialize(); + pNCfg->Release(); + } + if (NCfgLock) + { + NCfgLock->Release(); + } + if (pProperties) + { + NcFreeNetconProperties(pProperties); + } + delete this; + } + + return refCount; +} + +HRESULT +WINAPI +CNetConnectionPropertyUi::AddPages( + HWND hwndParent, + LPFNADDPROPSHEETPAGE pfnAddPage, + LPARAM lParam) +{ + HPROPSHEETPAGE hProp; + BOOL ret; + HRESULT hr = E_FAIL; + INITCOMMONCONTROLSEX initEx; + + initEx.dwSize = sizeof(initEx); + initEx.dwICC = ICC_LISTVIEW_CLASSES; + if(!InitCommonControlsEx(&initEx)) + return E_FAIL; + + hr = pCon->GetProperties(&pProperties); + if (FAILED(hr)) + return hr; + + hProp = InitializePropertySheetPage(MAKEINTRESOURCEW(IDD_NETPROPERTIES), LANPropertiesUIDlg, (LPARAM)this, pProperties->pszwName); + if (hProp) + { + ret = (*pfnAddPage)(hProp, lParam); + if (ret) + { + hr = NOERROR; + } + else + { + DestroyPropertySheetPage(hProp); + } + } + return hr; +} + +HRESULT +WINAPI +CNetConnectionPropertyUi::GetIcon( + DWORD dwSize, + HICON *phIcon) +{ + return E_NOTIMPL; +} + +HRESULT +WINAPI +CNetConnectionPropertyUi::GetDeviceGuid(GUID *pGuid) +{ + CopyMemory(pGuid, &pProperties->guidId, sizeof(GUID)); + return S_OK; +} + +HRESULT +WINAPI +CNetConnectionPropertyUi::SetConnection(INetConnection* pCon) +{ + if (this->pCon) + this->pCon->Release(); + + if (!pCon) + return E_POINTER; + + this->pCon = pCon; + pCon->AddRef(); + return S_OK; +} + +HRESULT +WINAPI +CNetConnectionPropertyUi::Connect( + HWND hwndParent, + DWORD dwFlags) +{ + if (!pCon) + return E_POINTER; //FIXME + + + if (dwFlags & NCUC_NO_UI) + return pCon->Connect(); + + return E_FAIL; +} + +HRESULT +WINAPI +CNetConnectionPropertyUi::Disconnect( + HWND hwndParent, + DWORD dwFlags) +{ + WCHAR szBuffer[100]; + swprintf(szBuffer, L"INetConnectionConnectUi_fnDisconnect flags %x\n", dwFlags); + MessageBoxW(NULL, szBuffer, NULL, MB_OK); + + return S_OK; +} + +HRESULT WINAPI LanConnectUI_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) +{ + TRACE("LanConnectUI_Constructor\n"); + + if (!ppv) + return E_POINTER; + + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + CNetConnectionPropertyUi *pConPropUi = new CNetConnectionPropertyUi; + if (!pConPropUi) + return E_OUTOFMEMORY; + + pConPropUi->AddRef(); + HRESULT hr = pConPropUi->QueryInterface(riid, ppv); + pConPropUi->Release(); + + return hr; +} diff --git a/reactos/dll/win32/netshell/lanstatusui.c b/reactos/dll/win32/netshell/lanstatusui.cpp similarity index 87% rename from reactos/dll/win32/netshell/lanstatusui.c rename to reactos/dll/win32/netshell/lanstatusui.cpp index 47862f945e3..7d57d94692f 100644 --- a/reactos/dll/win32/netshell/lanstatusui.c +++ b/reactos/dll/win32/netshell/lanstatusui.cpp @@ -1,5 +1,7 @@ #include +WINE_DEFAULT_DEBUG_CHANNEL (shell); + /// CLSID /// HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{7007ACCF-3202-11D1-AAD2-00805FC1270E} // IID B722BCCB-4E68-101B-A2BC-00AA00404770 @@ -13,15 +15,7 @@ typedef struct tagNotificationItem UINT uID; HWND hwndDlg; INetConnection *pNet; -}NOTIFICATION_ITEM; - -typedef struct -{ - IOleCommandTarget * lpVtbl; - INetConnectionManager * lpNetMan; - LONG ref; - NOTIFICATION_ITEM * pHead; -}ILanStatusImpl, *LPILanStatusImpl; +} NOTIFICATION_ITEM; typedef struct { @@ -38,13 +32,44 @@ typedef struct DWORD Gateway; UINT uID; UINT Status; -}LANSTATUSUI_CONTEXT; +} LANSTATUSUI_CONTEXT; + +class CLanStatus: + public IOleCommandTarget +{ + public: + CLanStatus(); + + // IUnknown + virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); + virtual ULONG WINAPI AddRef(); + virtual ULONG WINAPI Release(); + + // IOleCommandTarget + virtual HRESULT WINAPI QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, OLECMDTEXT *pCmdText); + virtual HRESULT WINAPI Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + private: + HRESULT InitializeNetTaskbarNotifications(); + HRESULT ShowStatusDialogByCLSID(const GUID *pguidCmdGroup); + + INetConnectionManager *lpNetMan; + LONG ref; + NOTIFICATION_ITEM *pHead; +}; + +CLanStatus::CLanStatus() +{ + ref = 0; + lpNetMan = NULL; + pHead = NULL; +} VOID UpdateLanStatusUiDlg( HWND hwndDlg, - MIB_IFROW * IfEntry, - LANSTATUSUI_CONTEXT * pContext) + MIB_IFROW *IfEntry, + LANSTATUSUI_CONTEXT *pContext) { WCHAR szFormat[MAX_PATH] = {0}; WCHAR szBuffer[MAX_PATH] = {0}; @@ -160,22 +185,22 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) { if (pContext->dwInOctets == IfEntry.dwInOctets && pContext->dwOutOctets == IfEntry.dwOutOctets && pContext->Status != 0) { - hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); pContext->Status = 0; } 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); + hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANSREC), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); pContext->Status = 1; } else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->Status != 2) { - hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_REC), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_REC), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); pContext->Status = 2; } else if (pContext->dwOutOctets != IfEntry.dwOutOctets && pContext->Status != 3) { - hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANS), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANS), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); pContext->Status = 3; } } @@ -183,7 +208,7 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) { if (pContext->Status != 4) { - hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); pContext->Status = 4; } } @@ -191,7 +216,7 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) { if (pContext->Status != 5) { - hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + hIcon = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); pContext->Status = 5; } } @@ -209,12 +234,12 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) nid.hWnd = pContext->hwndStatusDlg; nid.u.uVersion = 3; - if (INetConnection_GetProperties(pContext->pNet, &pProperties) == NOERROR) + if (pContext->pNet->GetProperties(&pProperties) == S_OK) { if (pProperties->dwCharacter & NCCF_SHOW_ICON) { if (hwndDlg) - nid.hIcon = CopyImage(hIcon, IMAGE_ICON, 16, 16, 0); + nid.hIcon = (HICON)CopyImage(hIcon, IMAGE_ICON, 16, 16, 0); else nid.hIcon = hIcon; @@ -269,7 +294,7 @@ InitializeLANStatusUiDlg(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) WCHAR szBuffer[MAX_PATH] = {0}; NETCON_PROPERTIES * pProperties; - if (INetConnection_GetProperties(pContext->pNet, &pProperties) != NOERROR) + if (pContext->pNet->GetProperties(&pProperties) != S_OK) return; if (pProperties->Status == NCS_DISCONNECTED) @@ -292,6 +317,7 @@ InitializeLANStatusUiDlg(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) NcFreeNetconProperties(pProperties); } +static VOID InsertColumnToListView( HWND hDlgCtrl, @@ -316,6 +342,7 @@ InsertColumnToListView( (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, SubItem, (LPARAM)&lc); } +static VOID AddIPAddressToListView( HWND hDlgCtrl, @@ -341,7 +368,7 @@ AddIPAddressToListView( li.mask = LVIF_TEXT; li.iItem = Index; li.iSubItem = 0; - li.pszText = L""; + li.pszText = (LPWSTR)L""; li.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&li); } @@ -357,6 +384,7 @@ AddIPAddressToListView( }while(pCur && pCur->IpAddress.String[0]); } +static INT InsertItemToListView( HWND hDlgCtrl, @@ -604,8 +632,6 @@ FindNetworkAdapter(HDEVINFO hInfo, SP_DEVINFO_DATA *pDevInfo, LPWSTR pGuid) return FALSE; } - - VOID DisableNetworkAdapter(INetConnection * pNet, LANSTATUSUI_CONTEXT * pContext, HWND hwndDlg) { @@ -621,7 +647,7 @@ DisableNetworkAdapter(INetConnection * pNet, LANSTATUSUI_CONTEXT * pContext, HWN BOOL bClose = FALSE; NOTIFYICONDATAW nid; - if (FAILED(INetConnection_GetProperties(pNet, &pProperties))) + if (FAILED(pNet->GetProperties(&pProperties))) return; @@ -632,7 +658,7 @@ DisableNetworkAdapter(INetConnection * pNet, LANSTATUSUI_CONTEXT * pContext, HWN return; } - if (FAILED(StringFromCLSID(&pProperties->guidId, &pDisplayName))) + if (FAILED(StringFromCLSID((CLSID)pProperties->guidId, &pDisplayName))) { NcFreeNetconProperties(pProperties); SetupDiDestroyDeviceInfoList(hInfo); @@ -716,8 +742,7 @@ LANStatusUiDlg( HWND hwndDlg, UINT uMsg, WPARAM wParam, - LPARAM lParam -) + LPARAM lParam) { PROPSHEETPAGE *page; LANSTATUSUI_CONTEXT * pContext; @@ -769,9 +794,9 @@ InitializePropertyDialog( { DWORD dwSize, dwAdapterIndex, dwResult; LPOLESTR pStr; - IP_ADAPTER_INFO * pAdapterInfo, *pCurAdapter; + IP_ADAPTER_INFO *pAdapterInfo, *pCurAdapter; - if (FAILED(StringFromCLSID(&pProperties->guidId, &pStr))) + if (FAILED(StringFromCLSID((CLSID)pProperties->guidId, &pStr))) { return; } @@ -823,7 +848,7 @@ InitializePropertyDialog( VOID ShowStatusPropertyDialog( - LANSTATUSUI_CONTEXT * pContext, + LANSTATUSUI_CONTEXT *pContext, HWND hwndDlg) { HPROPSHEETPAGE hppages[2]; @@ -837,7 +862,7 @@ ShowStatusPropertyDialog( pinfo.u3.phpage = hppages; pinfo.hwndParent = hwndDlg; - if (INetConnection_GetProperties(pContext->pNet, &pProperties) == NOERROR) + if (pContext->pNet->GetProperties(&pProperties) == S_OK) { if (pProperties->pszwName) { @@ -876,8 +901,7 @@ LANStatusDlg( HWND hwndDlg, UINT uMsg, WPARAM wParam, - LPARAM lParam -) + LPARAM lParam) { LANSTATUSUI_CONTEXT * pContext; @@ -917,16 +941,15 @@ LANStatusDlg( } return FALSE; } -static + HRESULT -InitializeNetTaskbarNotifications( - ILanStatusImpl * This) +CLanStatus::InitializeNetTaskbarNotifications() { NOTIFYICONDATAW nid; HWND hwndDlg; - INetConnectionManager * INetConMan; - IEnumNetConnection * IEnumCon; - INetConnection * INetCon; + INetConnectionManager *pNetConMan; + IEnumNetConnection *pEnumCon; + INetConnection *pNetCon; NETCON_PROPERTIES* pProps; HRESULT hr; ULONG Count; @@ -934,12 +957,14 @@ InitializeNetTaskbarNotifications( NOTIFICATION_ITEM * pItem, *pLast = NULL; LANSTATUSUI_CONTEXT * pContext; - if (This->pHead) + TRACE("InitializeNetTaskbarNotifications\n"); + + if (pHead) { - pItem = This->pHead; + pItem = pHead; while(pItem) { - hr = INetConnection_GetProperties(pItem->pNet, &pProps); + hr = pItem->pNet->GetProperties(&pProps); if (SUCCEEDED(hr)) { ZeroMemory(&nid, sizeof(nid)); @@ -962,25 +987,30 @@ InitializeNetTaskbarNotifications( } /* get an instance to of IConnectionManager */ - //hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&INetConMan); + //hr = CoCreateInstance(&CLSID_ConnectionManager, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionManager, (LPVOID*)&pNetConMan); - hr = INetConnectionManager_Constructor(NULL, &IID_INetConnectionManager, (LPVOID*)&INetConMan); - if (FAILED(hr)) - return hr; - - hr = INetConnectionManager_EnumConnections(INetConMan, NCME_DEFAULT, &IEnumCon); + hr = INetConnectionManager_Constructor(NULL, IID_INetConnectionManager, (LPVOID*)&pNetConMan); if (FAILED(hr)) { - INetConnectionManager_Release(INetConMan); + ERR("INetConnectionManager_Constructor failed\n"); + return hr; + } + + hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon); + if (FAILED(hr)) + { + ERR("EnumConnections failed\n"); + pNetConMan->Release(); return hr; } Index = 1; do { - hr = IEnumNetConnection_Next(IEnumCon, 1, &INetCon, &Count); + hr = pEnumCon->Next(1, &pNetCon, &Count); if (hr == S_OK) { + TRACE("new connection\n"); pItem = (NOTIFICATION_ITEM*)CoTaskMemAlloc(sizeof(NOTIFICATION_ITEM)); if (!pItem) break; @@ -992,13 +1022,12 @@ InitializeNetTaskbarNotifications( break; } - ZeroMemory(pContext, sizeof(LANSTATUSUI_CONTEXT)); pContext->uID = Index; - pContext->pNet = INetCon; + pContext->pNet = pNetCon; pItem->uID = Index; pItem->pNext = NULL; - pItem->pNet = INetCon; + pItem->pNet = pNetCon; hwndDlg = CreateDialogParamW(netshell_hInstance, MAKEINTRESOURCEW(IDD_STATUS), NULL, LANStatusDlg, (LPARAM)pContext); if (hwndDlg) { @@ -1010,7 +1039,7 @@ InitializeNetTaskbarNotifications( nid.uCallbackMessage = WM_SHOWSTATUSDLG; nid.hWnd = hwndDlg; - hr = INetConnection_GetProperties(INetCon, &pProps); + hr = pNetCon->GetProperties(&pProps); if (SUCCEEDED(hr)) { CopyMemory(&pItem->guidItem, &pProps->guidId, sizeof(GUID)); @@ -1039,105 +1068,96 @@ InitializeNetTaskbarNotifications( if (pLast) pLast->pNext = pItem; else - This->pHead = pItem; + pHead = pItem; pLast = pItem; Index++; } else { + ERR("Shell_NotifyIconW failed\n"); CoTaskMemFree(pItem); } if (nid.uFlags & NIF_ICON) DestroyIcon(nid.hIcon); - } + } else + ERR("CreateDialogParamW failed\n"); } - }while(hr == S_OK); + } while(hr == S_OK); - This->lpNetMan = INetConMan; - IEnumNetConnection_Release(IEnumCon); + lpNetMan = pNetConMan; + pEnumCon->Release(); return S_OK; } HRESULT -ShowStatusDialogByCLSID( - ILanStatusImpl * This, - const GUID *pguidCmdGroup) +CLanStatus::ShowStatusDialogByCLSID(const GUID *pguidCmdGroup) { - NOTIFICATION_ITEM * pItem; + NOTIFICATION_ITEM *pItem; - pItem = This->pHead; + pItem = pHead; while(pItem) { - if (IsEqualGUID(&pItem->guidItem, pguidCmdGroup)) + if (IsEqualGUID(pItem->guidItem, *pguidCmdGroup)) { SendMessageW(pItem->hwndDlg, WM_SHOWSTATUSDLG, 0, WM_LBUTTONDOWN); return S_OK; } pItem = pItem->pNext; } + + ERR("not found\n"); return E_FAIL; } -static + HRESULT WINAPI -IOleCommandTarget_fnQueryInterface( - IOleCommandTarget * iface, +CLanStatus::QueryInterface( REFIID iid, - LPVOID * ppvObj) + LPVOID *ppvObj) { - ILanStatusImpl * This = (ILanStatusImpl*)iface; *ppvObj = NULL; - if (IsEqualIID (iid, &IID_IUnknown) || - IsEqualIID (iid, &IID_IOleCommandTarget)) + if (IsEqualIID(iid, IID_IUnknown) || + IsEqualIID(iid, IID_IOleCommandTarget)) { - *ppvObj = This; - IUnknown_AddRef(iface); + *ppvObj = this; + AddRef(); return S_OK; } MessageBoxW(NULL, L"IOleCommandTarget_fnQueryInterface", NULL, MB_OK); return E_NOINTERFACE; } -static ULONG WINAPI -IOleCommandTarget_fnAddRef( - IOleCommandTarget * iface) +CLanStatus::AddRef() { - ILanStatusImpl * This = (ILanStatusImpl*)iface; - ULONG refCount = InterlockedIncrement(&This->ref); + ULONG refCount = InterlockedIncrement(&ref); return refCount; } -static ULONG WINAPI -IOleCommandTarget_fnRelease( - IOleCommandTarget * iface) +CLanStatus::Release() { -#if 0 - ILanStatusImpl * This = (ILanStatusImpl*)iface; - ULONG refCount = InterlockedDecrement(&This->ref); +#if 0 // WTF?! + ULONG refCount = InterlockedDecrement(&ref); if (!refCount) - { - CoTaskMemFree (This); - } + delete this; + return refCount; #else return 1; #endif } -static HRESULT WINAPI -IOleCommandTarget_fnQueryStatus( - IOleCommandTarget * iface, +CLanStatus::QueryStatus( const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds, @@ -1147,49 +1167,33 @@ IOleCommandTarget_fnQueryStatus( return E_NOTIMPL; } -static HRESULT WINAPI -IOleCommandTarget_fnExec( - IOleCommandTarget * iface, +CLanStatus::Exec( const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) { - ILanStatusImpl * This = (ILanStatusImpl*)iface; - if (pguidCmdGroup) { - if (IsEqualIID(pguidCmdGroup, &CGID_ShellServiceObject)) + if (IsEqualGUID(*pguidCmdGroup, CGID_ShellServiceObject)) { - return InitializeNetTaskbarNotifications(This); + return InitializeNetTaskbarNotifications(); } else { /* invoke status dialog */ - return ShowStatusDialogByCLSID(This, pguidCmdGroup); + return ShowStatusDialogByCLSID(pguidCmdGroup); } } return S_OK; } - -static const IOleCommandTargetVtbl vt_OleCommandTarget = +HRESULT WINAPI LanConnectStatusUI_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv) { - IOleCommandTarget_fnQueryInterface, - IOleCommandTarget_fnAddRef, - IOleCommandTarget_fnRelease, - IOleCommandTarget_fnQueryStatus, - IOleCommandTarget_fnExec, -}; - - -HRESULT WINAPI LanConnectStatusUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) -{ - ILanStatusImpl * This; - static volatile ILanStatusImpl *cached_This = NULL; + TRACE("LanConnectStatusUI_Constructor\n"); if (!ppv) return E_POINTER; @@ -1197,20 +1201,15 @@ HRESULT WINAPI LanConnectStatusUI_Constructor (IUnknown * pUnkOuter, REFIID riid if (pUnkOuter) return CLASS_E_NOAGGREGATION; - This = (ILanStatusImpl *) CoTaskMemAlloc(sizeof (ILanStatusImpl)); - if (!This) + CLanStatus *pLanStatus = new CLanStatus; + if (!pLanStatus) return E_OUTOFMEMORY; - This->ref = 1; - This->lpVtbl = (IOleCommandTarget*)&vt_OleCommandTarget; - This->lpNetMan = NULL; - This->pHead = NULL; + pLanStatus->AddRef(); + static volatile CLanStatus *pCachedLanStatus = NULL; + if (InterlockedCompareExchangePointer((void **)&pCachedLanStatus, pLanStatus, NULL) != NULL) + pLanStatus->Release(); - if (InterlockedCompareExchangePointer((void **)&cached_This, This, NULL) != NULL) - { - CoTaskMemFree(This); - } - - return IOleCommandTarget_fnQueryInterface ((IOleCommandTarget*)cached_This, riid, ppv); + return ((CLanStatus*)pCachedLanStatus)->QueryInterface(riid, ppv); } diff --git a/reactos/dll/win32/netshell/netshell.c b/reactos/dll/win32/netshell/netshell.cpp similarity index 83% rename from reactos/dll/win32/netshell/netshell.c rename to reactos/dll/win32/netshell/netshell.cpp index 92d68eda6f0..b6268b5d90b 100644 --- a/reactos/dll/win32/netshell/netshell.c +++ b/reactos/dll/win32/netshell/netshell.cpp @@ -1,5 +1,7 @@ #include "precomp.h" +WINE_DEFAULT_DEBUG_CHANNEL (shell); + HINSTANCE netshell_hInstance; const GUID CLSID_LANConnectUI = {0x7007ACC5, 0x3202, 0x11D1, {0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E}}; const GUID CLSID_NetworkConnections = {0x7007ACC7, 0x3202, 0x11D1, {0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E}}; @@ -10,30 +12,8 @@ static const WCHAR szLanConnectUI[] = L"CLSID\\{7007ACC5-3202-11D1-AAD2-00 static const WCHAR szLanConnectStatusUI[] = L"CLSID\\{7007ACCF-3202-11D1-AAD2-00805FC1270E}"; static const WCHAR szNamespaceKey[] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace\\{7007ACC7-3202-11D1-AAD2-00805FC1270E}"; -static INTERFACE_TABLE InterfaceTable[] = +extern "C" { - { - &CLSID_NetworkConnections, - ISF_NetConnect_Constructor - }, - { - &CLSID_ConnectionManager, - INetConnectionManager_Constructor - }, - { - &CLSID_LANConnectUI, - LanConnectUI_Constructor - }, - { - &CLSID_LanConnectStatusUI, - LanConnectStatusUI_Constructor - }, - { - NULL, - NULL - } -}; - BOOL WINAPI @@ -156,43 +136,23 @@ STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, - LPVOID* ppv -) + LPVOID *ppv) { - UINT i; - HRESULT hres = E_OUTOFMEMORY; - IClassFactory * pcf = NULL; - if (!ppv) return E_INVALIDARG; *ppv = NULL; - for (i = 0; InterfaceTable[i].riid; i++) - { - if (IsEqualIID(InterfaceTable[i].riid, rclsid)) - { - pcf = IClassFactory_fnConstructor(InterfaceTable[i].lpfnCI, NULL, NULL); - break; - } - } - - if (!pcf) - { - return CLASS_E_CLASSNOTAVAILABLE; - } - - hres = IClassFactory_QueryInterface(pcf, riid, ppv); - IClassFactory_Release(pcf); - - return hres; + return IClassFactory_fnConstructor(rclsid, riid, ppv); } VOID WINAPI -NcFreeNetconProperties (NETCON_PROPERTIES* pProps) +NcFreeNetconProperties(NETCON_PROPERTIES *pProps) { CoTaskMemFree(pProps->pszwName); CoTaskMemFree(pProps->pszwDeviceName); CoTaskMemFree(pProps); } + +} // extern "C" diff --git a/reactos/dll/win32/netshell/precomp.h b/reactos/dll/win32/netshell/precomp.h index d92c4479fbe..3ace7f62826 100644 --- a/reactos/dll/win32/netshell/precomp.h +++ b/reactos/dll/win32/netshell/precomp.h @@ -59,17 +59,11 @@ typedef struct { int cxChar; } shvheader; -typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject); -typedef struct { - REFIID riid; - LPFNCREATEINSTANCE lpfnCI; -} INTERFACE_TABLE; - typedef struct tagVALUEStruct { BYTE dummy; INetConnection * pItem; -}VALUEStruct; +} VALUEStruct; /* globals */ extern HINSTANCE netshell_hInstance; @@ -78,33 +72,33 @@ extern const GUID CLSID_LANConnectUI; extern const GUID CLSID_LanConnectStatusUI; extern const GUID GUID_DEVCLASS_NET; - /* shfldr_netconnect.c */ HRESULT ShowNetConnectionProperties(INetConnection * pNetConnect, HWND hwnd); -HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI ISF_NetConnect_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); /* enumlist.c */ -IEnumIDList * IEnumIDList_Constructor(void); LPITEMIDLIST _ILCreateNetConnect(void); -LPITEMIDLIST ILCreateNetConnectItem(INetConnection * pItem); -BOOL _ILIsNetConnect (LPCITEMIDLIST pidl); -BOOL AddToEnumList(IEnumIDList * iface, LPITEMIDLIST pidl); +LPITEMIDLIST ILCreateNetConnectItem(INetConnection *pItem); +BOOL _ILIsNetConnect(LPCITEMIDLIST pidl); +//BOOL AddToEnumList(IEnumIDList *iface, LPITEMIDLIST pidl); VALUEStruct * _ILGetValueStruct(LPCITEMIDLIST pidl); /* classfactory.c */ -IClassFactory * IClassFactory_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst); +HRESULT IClassFactory_fnConstructor(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut); /* connectmanager.c */ -HRESULT WINAPI INetConnectionManager_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI INetConnectionManager_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv); BOOL GetAdapterIndexFromNetCfgInstanceId(PIP_ADAPTER_INFO pAdapterInfo, LPWSTR szNetCfg, PDWORD pIndex); /* lanconnectui.c */ HPROPSHEETPAGE InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWSTR szTitle); -HRESULT WINAPI LanConnectUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI LanConnectUI_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv); /* lanstatusui.c */ -HRESULT WINAPI LanConnectStatusUI_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI LanConnectStatusUI_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv); #define NCCF_NOTIFY_DISCONNECTED 0x100000 +#include "enumlist.h" + #endif diff --git a/reactos/dll/win32/netshell/shfldr_netconnect.c b/reactos/dll/win32/netshell/shfldr_netconnect.c deleted file mode 100644 index f76a2cd53be..00000000000 --- a/reactos/dll/win32/netshell/shfldr_netconnect.c +++ /dev/null @@ -1,1529 +0,0 @@ -/* - * Network Connections Shell Folder - * - * Copyright 2008 Johannes Anderwald - * - * 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 - -WINE_DEFAULT_DEBUG_CHANNEL (shell); - -#define MAX_PROPERTY_SHEET_PAGE (10) - -/*********************************************************************** -* IShellFolder implementation -*/ - -typedef struct { - const IShellFolder2Vtbl *lpVtbl; - LONG ref; - - const IPersistFolder2Vtbl *lpVtblPersistFolder2; - const IShellExecuteHookWVtbl *lpVtblShellExecuteHookW; - //const IPersistIDListVtbl *lpVtblPersistIDList; - - /* both paths are parsible from the desktop */ - LPITEMIDLIST pidlRoot; /* absolute pidl */ - LPITEMIDLIST pidl; /* enumerated pidl */ - IOleCommandTarget * lpOleCmd; -} IGenericSFImpl, *LPIGenericSFImpl; - -typedef struct -{ - const IContextMenu3Vtbl *lpVtblContextMenu; - const IObjectWithSiteVtbl *lpVtblObjectWithSite; - const IQueryInfoVtbl *lpVtblQueryInfo; - const IExtractIconWVtbl *lpVtblExtractIconW; - LONG ref; - LPCITEMIDLIST apidl; - IUnknown *pUnknown; - IOleCommandTarget * lpOleCmd; -}IContextMenuImpl, *LPIContextMenuImpl; - -static const shvheader NetConnectSFHeader[] = { - {IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 20}, - {IDS_SHV_COLUMN_TYPE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 8}, - {IDS_SHV_COLUMN_STATE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, - {IDS_SHV_COLUMN_DEVNAME, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12}, - {IDS_SHV_COLUMN_PHONE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, - {IDS_SHV_COLUMN_OWNER, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5} -}; - -#define NETCONNECTSHELLVIEWCOLUMNS 6 - -#define COLUMN_NAME 0 -#define COLUMN_TYPE 1 -#define COLUMN_STATUS 2 -#define COLUMN_DEVNAME 3 -#define COLUMN_PHONE 4 -#define COLUMN_OWNER 5 - -HRESULT ShowNetConnectionStatus(IOleCommandTarget * lpOleCmd, INetConnection * pNetConnect, HWND hwnd); - -static const IContextMenu3Vtbl vt_ContextMenu3; -static const IObjectWithSiteVtbl vt_ObjectWithSite; -static const IQueryInfoVtbl vt_QueryInfo; -static const IExtractIconWVtbl vt_ExtractIconW; - -static __inline LPIContextMenuImpl impl_from_IExtractIcon(IExtractIconW *iface) -{ - return (LPIContextMenuImpl)((char *)iface - FIELD_OFFSET(IContextMenuImpl, lpVtblExtractIconW)); -} - -static __inline LPIContextMenuImpl impl_from_IObjectWithSite(IObjectWithSite *iface) -{ - return (LPIContextMenuImpl)((char *)iface - FIELD_OFFSET(IContextMenuImpl, lpVtblObjectWithSite)); -} - -static __inline LPIGenericSFImpl impl_from_IPersistFolder2(IPersistFolder2 *iface) -{ - return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblPersistFolder2)); -} - -static __inline LPIGenericSFImpl impl_from_IShellExecuteHookW(IShellExecuteHookW *iface) -{ - return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblShellExecuteHookW)); -} - -static __inline LPIContextMenuImpl impl_from_IQueryInfo(IQueryInfo *iface) -{ - return (LPIContextMenuImpl)((char *)iface - FIELD_OFFSET(IContextMenuImpl, lpVtblQueryInfo)); -} - - -/************************************************************************** - * ISF_NetConnect_fnQueryInterface - * - * NOTE - * supports not IPersist/IPersistFolder - */ -static HRESULT WINAPI ISF_NetConnect_fnQueryInterface (IShellFolder2 *iface, REFIID riid, LPVOID *ppvObj) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - *ppvObj = NULL; - - if (IsEqualIID (riid, &IID_IUnknown) || - IsEqualIID (riid, &IID_IShellFolder) || - IsEqualIID (riid, &IID_IShellFolder2)) - { - *ppvObj = This; - } - else if (IsEqualIID (riid, &IID_IPersistFolder) || - IsEqualIID (riid, &IID_IPersistFolder2)) - { - *ppvObj = (LPVOID *)&This->lpVtblPersistFolder2; - } - else if (IsEqualIID(riid, &IID_IShellExecuteHookW)) - { - *ppvObj = (LPVOID *)&This->lpVtblShellExecuteHookW; - } -#if 0 - else if (IsEqualIID(riid, &IID_IPersistIDList)) - { - //*ppvObj = (LPVOID *)&This->lpVtblPersistIDList; - } -#endif - if (*ppvObj) - { - IUnknown_AddRef ((IUnknown *) (*ppvObj)); - return S_OK; - } - - /* TODO: - * IID_IPersistFreeThreadedObject - * IID_IBrowserFrameOptions - * IID_IShellIconOverlay - * IID_IPersistIDList - * IID_IPersist - */ - - return E_NOINTERFACE; -} - -static ULONG WINAPI ISF_NetConnect_fnAddRef (IShellFolder2 * iface) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); - - return refCount; -} - -static ULONG WINAPI ISF_NetConnect_fnRelease (IShellFolder2 * iface) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); - - - if (!refCount) - { - SHFree (This->pidlRoot); - CoTaskMemFree(This); - } - return refCount; -} - -/************************************************************************** -* ISF_NetConnect_fnParseDisplayName -*/ -static HRESULT WINAPI ISF_NetConnect_fnParseDisplayName (IShellFolder2 * iface, - HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName, - DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - HRESULT hr = E_UNEXPECTED; - - *ppidl = 0; - if (pchEaten) - *pchEaten = 0; /* strange but like the original */ - - return hr; -} - -/************************************************************************** - * CreateNetConnectEnumListss() - */ -static BOOL CreateNetConnectEnumList(IEnumIDList *list, DWORD dwFlags) -{ - HRESULT hr; - INetConnectionManager * INetConMan; - IEnumNetConnection * IEnumCon; - INetConnection * INetCon; - ULONG Count; - LPITEMIDLIST pidl; - - /* get an instance to of IConnectionManager */ - hr = INetConnectionManager_Constructor(NULL, &IID_INetConnectionManager, (LPVOID*)&INetConMan); - if (FAILED(hr)) - return FALSE; - - hr = INetConnectionManager_EnumConnections(INetConMan, NCME_DEFAULT, &IEnumCon); - if (FAILED(hr)) - { - INetConnectionManager_Release(INetConMan); - return FALSE; - } - - do - { - hr = IEnumNetConnection_Next(IEnumCon, 1, &INetCon, &Count); - if (hr == S_OK) - { - pidl = ILCreateNetConnectItem(INetCon); - if (pidl) - { - AddToEnumList(list, pidl); - } - } - else - { - break; - } - }while(TRUE); - - IEnumNetConnection_Release(IEnumCon); - INetConnectionManager_Release(INetConMan); - - return TRUE; -} - -/************************************************************************** -* ISF_NetConnect_fnEnumObjects -*/ -static HRESULT WINAPI ISF_NetConnect_fnEnumObjects (IShellFolder2 * iface, - HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - *ppEnumIDList = IEnumIDList_Constructor(); - if(*ppEnumIDList) - CreateNetConnectEnumList(*ppEnumIDList, dwFlags); - - - return (*ppEnumIDList) ? S_OK : E_OUTOFMEMORY; -} - -/************************************************************************** -* ISF_NetConnect_fnBindToObject -*/ -static HRESULT WINAPI ISF_NetConnect_fnBindToObject (IShellFolder2 * iface, - LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - return E_NOTIMPL; -} - -/************************************************************************** -* ISF_NetConnect_fnBindToStorage -*/ -static HRESULT WINAPI ISF_NetConnect_fnBindToStorage (IShellFolder2 * iface, - LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - - *ppvOut = NULL; - return E_NOTIMPL; -} - -/************************************************************************** -* ISF_NetConnect_fnCompareIDs -*/ - -static HRESULT WINAPI ISF_NetConnect_fnCompareIDs (IShellFolder2 * iface, - LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - - - return E_NOTIMPL; -} - -/************************************************************************** -* ISF_NetConnect_fnCreateViewObject -*/ -static HRESULT WINAPI ISF_NetConnect_fnCreateViewObject (IShellFolder2 * iface, - HWND hwndOwner, REFIID riid, LPVOID * ppvOut) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - IShellView* pShellView; - CSFV cvf; - HRESULT hr = E_NOINTERFACE; - - if (!ppvOut) - return hr; - - *ppvOut = NULL; - - if (IsEqualIID (riid, &IID_IShellView)) - { - ZeroMemory(&cvf, sizeof(cvf)); - cvf.cbSize = sizeof(cvf); - cvf.pshf = (IShellFolder*)iface; - - hr = SHCreateShellFolderViewEx(&cvf, &pShellView); - if (SUCCEEDED(hr)) - { - hr = IShellView_QueryInterface (pShellView, riid, ppvOut); - IShellView_Release (pShellView); - } - } - - return hr; -} - -/************************************************************************** -* ISF_NetConnect_fnGetAttributesOf -*/ -static HRESULT WINAPI ISF_NetConnect_fnGetAttributesOf (IShellFolder2 * iface, - UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - HRESULT hr = S_OK; - static const DWORD dwNetConnectAttributes = SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | - SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE; - - static const DWORD dwNetConnectItemAttributes = SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | - SFGAO_FILESYSANCESTOR | SFGAO_CANRENAME; - - if (!rgfInOut) - return E_INVALIDARG; - - if (cidl && !apidl) - return E_INVALIDARG; - - if (*rgfInOut == 0) - *rgfInOut = ~0; - - if(cidl == 0) - *rgfInOut = dwNetConnectAttributes; - else - *rgfInOut = dwNetConnectItemAttributes; - - /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ - *rgfInOut &= ~SFGAO_VALIDATE; - - return hr; -} - -/************************************************************************** -* ISF_NetConnect_fnGetUIObjectOf -* -* PARAMETERS -* hwndOwner [in] Parent window for any output -* cidl [in] array size -* apidl [in] simple pidl array -* riid [in] Requested Interface -* prgfInOut [ ] reserved -* ppvObject [out] Resulting Interface -* -*/ -static HRESULT IContextMenuImpl_Constructor(REFIID riid, LPCITEMIDLIST apidl, LPVOID * ppvOut, IOleCommandTarget * lpOleCmd) -{ - IUnknown *pObj = NULL; - IContextMenuImpl * pMenu = CoTaskMemAlloc(sizeof(IContextMenuImpl)); - if (!pMenu) - return E_OUTOFMEMORY; - - ZeroMemory(pMenu, sizeof(IContextMenuImpl)); - - pMenu->apidl = apidl; - pMenu->lpVtblContextMenu = &vt_ContextMenu3; - pMenu->lpVtblObjectWithSite = &vt_ObjectWithSite; - pMenu->lpVtblExtractIconW = &vt_ExtractIconW; - pMenu->lpVtblQueryInfo = &vt_QueryInfo; - pMenu->pUnknown = NULL; - pMenu->lpOleCmd = lpOleCmd; - pMenu->ref = 1; - - if (IsEqualIID(riid, &IID_IContextMenu) || IsEqualIID(riid, &IID_IContextMenu2)|| IsEqualIID(riid, &IID_IContextMenu3)) - pObj = (IUnknown*)(&pMenu->lpVtblContextMenu); - else if(IsEqualIID(riid, &IID_IQueryInfo)) - pObj = (IUnknown*)(&pMenu->lpVtblQueryInfo); - else if(IsEqualIID(riid, &IID_IExtractIconW)) - pObj = (IUnknown*)(&pMenu->lpVtblExtractIconW); - else - return E_NOINTERFACE; - - IUnknown_AddRef(pObj); - - - *ppvOut = pObj; - return S_OK; -} - -static HRESULT WINAPI ISF_NetConnect_fnGetUIObjectOf (IShellFolder2 * iface, - HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, - UINT * prgfInOut, LPVOID * ppvOut) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - IUnknown *pObj = NULL; - HRESULT hr = E_INVALIDARG; - - if (!ppvOut) - return hr; - - *ppvOut = NULL; - - if ((IsEqualIID (riid, &IID_IContextMenu) || IsEqualIID (riid, &IID_IContextMenu2) || IsEqualIID(riid, &IID_IContextMenu3) || - IsEqualIID(riid, &IID_IQueryInfo) || IsEqualIID(riid, &IID_IExtractIconW)) && (cidl >= 1)) - { - return IContextMenuImpl_Constructor(riid, apidl[0], ppvOut, This->lpOleCmd); - } - else - hr = E_NOINTERFACE; - - *ppvOut = pObj; - return hr; -} - -/************************************************************************** -* ISF_NetConnect_fnGetDisplayNameOf -* -*/ -static HRESULT WINAPI ISF_NetConnect_fnGetDisplayNameOf (IShellFolder2 * iface, - LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) -{ - LPWSTR pszName; - HRESULT hr = E_FAIL; - NETCON_PROPERTIES * pProperties; - VALUEStruct * val; - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - if (!strRet) - return E_INVALIDARG; - - pszName = CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR)); - if (!pszName) - return E_OUTOFMEMORY; - - if (_ILIsNetConnect (pidl)) - { - if (LoadStringW(netshell_hInstance, IDS_NETWORKCONNECTION, pszName, MAX_PATH)) - { - pszName[MAX_PATH-1] = L'\0'; - hr = S_OK; - } - } - else - { - val = _ILGetValueStruct(pidl); - if (val) - { - if (INetConnection_GetProperties(val->pItem, &pProperties) == NOERROR) - { - if (pProperties->pszwName) - { - wcscpy(pszName, pProperties->pszwName); - hr = S_OK; - } - NcFreeNetconProperties(pProperties); - } - } - - } - - if (SUCCEEDED(hr)) - { - strRet->uType = STRRET_WSTR; - strRet->u.pOleStr = pszName; - } - else - { - CoTaskMemFree(pszName); - } - - return hr; -} - -/************************************************************************** -* ISF_NetConnect_fnSetNameOf -* Changes the name of a file object or subfolder, possibly changing its item -* identifier in the process. -* -* PARAMETERS -* hwndOwner [in] Owner window for output -* pidl [in] simple pidl of item to change -* lpszName [in] the items new display name -* dwFlags [in] SHGNO formatting flags -* ppidlOut [out] simple pidl returned -*/ -static HRESULT WINAPI ISF_NetConnect_fnSetNameOf (IShellFolder2 * iface, - HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ - LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - return E_NOTIMPL; -} - -static HRESULT WINAPI ISF_NetConnect_fnGetDefaultSearchGUID ( - IShellFolder2 * iface, GUID * pguid) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - return E_NOTIMPL; -} - -static HRESULT WINAPI ISF_NetConnect_fnEnumSearches (IShellFolder2 * iface, - IEnumExtraSearch ** ppenum) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - return E_NOTIMPL; -} - -static HRESULT WINAPI ISF_NetConnect_fnGetDefaultColumn (IShellFolder2 * iface, - DWORD dwRes, ULONG * pSort, ULONG * pDisplay) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - if (pSort) - *pSort = 0; - if (pDisplay) - *pDisplay = 0; - - return S_OK; -} - -static HRESULT WINAPI ISF_NetConnect_fnGetDefaultColumnState ( - IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - if (!pcsFlags || iColumn >= NETCONNECTSHELLVIEWCOLUMNS) - return E_INVALIDARG; - *pcsFlags = NetConnectSFHeader[iColumn].pcsFlags; - return S_OK; -} - -static HRESULT WINAPI ISF_NetConnect_fnGetDetailsEx (IShellFolder2 * iface, - LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - return E_NOTIMPL; -} - -static HRESULT WINAPI ISF_NetConnect_fnGetDetailsOf (IShellFolder2 * iface, - LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - WCHAR buffer[MAX_PATH] = {0}; - HRESULT hr = E_FAIL; - VALUEStruct * val; - NETCON_PROPERTIES * pProperties; - - if (iColumn >= NETCONNECTSHELLVIEWCOLUMNS) - return E_FAIL; - - psd->fmt = NetConnectSFHeader[iColumn].fmt; - psd->cxChar = NetConnectSFHeader[iColumn].cxChar; - if (pidl == NULL) - { - psd->str.uType = STRRET_WSTR; - if (LoadStringW(netshell_hInstance, NetConnectSFHeader[iColumn].colnameid, buffer, MAX_PATH)) - hr = SHStrDupW(buffer, &psd->str.u.pOleStr); - - return hr; - } - - if (iColumn == COLUMN_NAME) - { - psd->str.uType = STRRET_WSTR; - return IShellFolder2_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL, &psd->str); - } - - val = _ILGetValueStruct(pidl); - if (!val) - return E_FAIL; - - if (!val->pItem) - return E_FAIL; - - if (INetConnection_GetProperties((INetConnection*)val->pItem, &pProperties) != NOERROR) - return E_FAIL; - - - switch(iColumn) - { - case COLUMN_TYPE: - if (pProperties->MediaType == NCM_LAN || pProperties->MediaType == NCM_SHAREDACCESSHOST_RAS) - { - if (LoadStringW(netshell_hInstance, IDS_TYPE_ETHERNET, buffer, MAX_PATH)) - { - psd->str.uType = STRRET_WSTR; - hr = SHStrDupW(buffer, &psd->str.u.pOleStr); - } - } - break; - case COLUMN_STATUS: - buffer[0] = L'\0'; - if (pProperties->Status == NCS_HARDWARE_DISABLED) - LoadStringW(netshell_hInstance, IDS_STATUS_NON_OPERATIONAL, buffer, MAX_PATH); - else if (pProperties->Status == NCS_DISCONNECTED) - LoadStringW(netshell_hInstance, IDS_STATUS_UNREACHABLE, buffer, MAX_PATH); - else if (pProperties->Status == NCS_MEDIA_DISCONNECTED) - LoadStringW(netshell_hInstance, IDS_STATUS_DISCONNECTED, buffer, MAX_PATH); - else if (pProperties->Status == NCS_CONNECTING) - LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTING, buffer, MAX_PATH); - else if (pProperties->Status == NCS_CONNECTED) - LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTED, buffer, MAX_PATH); - - if (buffer[0]) - { - buffer[MAX_PATH-1] = L'\0'; - psd->str.uType = STRRET_WSTR; - hr = SHStrDupW(buffer, &psd->str.u.pOleStr); - } - break; - case COLUMN_DEVNAME: - if (pProperties->pszwDeviceName) - { - wcscpy(buffer, pProperties->pszwDeviceName); - buffer[MAX_PATH-1] = L'\0'; - psd->str.uType = STRRET_WSTR; - hr = SHStrDupW(buffer, &psd->str.u.pOleStr); - } - else - { - psd->str.u.cStr[0] = '\0'; - psd->str.uType = STRRET_CSTR; - } - break; - case COLUMN_PHONE: - case COLUMN_OWNER: - psd->str.u.cStr[0] = '\0'; - psd->str.uType = STRRET_CSTR; - break; - } - - NcFreeNetconProperties(pProperties); - return hr; -} - -static HRESULT WINAPI ISF_NetConnect_fnMapColumnToSCID (IShellFolder2 * iface, - UINT column, SHCOLUMNID * pscid) -{ - //IGenericSFImpl *This = (IGenericSFImpl *)iface; - - return E_NOTIMPL; -} - -static const IShellFolder2Vtbl vt_ShellFolder2 = { - ISF_NetConnect_fnQueryInterface, - ISF_NetConnect_fnAddRef, - ISF_NetConnect_fnRelease, - ISF_NetConnect_fnParseDisplayName, - ISF_NetConnect_fnEnumObjects, - ISF_NetConnect_fnBindToObject, - ISF_NetConnect_fnBindToStorage, - ISF_NetConnect_fnCompareIDs, - ISF_NetConnect_fnCreateViewObject, - ISF_NetConnect_fnGetAttributesOf, - ISF_NetConnect_fnGetUIObjectOf, - ISF_NetConnect_fnGetDisplayNameOf, - ISF_NetConnect_fnSetNameOf, - /* ShellFolder2 */ - ISF_NetConnect_fnGetDefaultSearchGUID, - ISF_NetConnect_fnEnumSearches, - ISF_NetConnect_fnGetDefaultColumn, - ISF_NetConnect_fnGetDefaultColumnState, - ISF_NetConnect_fnGetDetailsEx, - ISF_NetConnect_fnGetDetailsOf, - ISF_NetConnect_fnMapColumnToSCID -}; -//IObjectWithSite -//IInternetSecurityManager - -/************************************************************************** -* IContextMenu2 Implementation -*/ - -/************************************************************************ - * ISF_NetConnect_IContextMenu_QueryInterface - */ -static HRESULT WINAPI ISF_NetConnect_IContextMenu3_QueryInterface(IContextMenu3 * iface, REFIID iid, LPVOID * ppvObject) -{ - //LPOLESTR pStr; - IContextMenuImpl * This = (IContextMenuImpl*)iface; - - if (IsEqualIID(iid, &IID_IContextMenu) || IsEqualIID(iid, &IID_IContextMenu2) || IsEqualIID(iid, &IID_IContextMenu3)) - { - *ppvObject = (IUnknown*) &This->lpVtblContextMenu; - InterlockedIncrement(&This->ref); - return S_OK; - } - else if (IsEqualIID(iid, &IID_IObjectWithSite)) - { - *ppvObject = (IUnknown*) &This->lpVtblObjectWithSite; - InterlockedIncrement(&This->ref); - return S_OK; - } - else if (IsEqualIID(iid, &IID_IQueryInfo)) - { - *ppvObject = (IUnknown*) &This->lpVtblQueryInfo; - InterlockedIncrement(&This->ref); - return S_OK; - } - - //StringFromCLSID(iid, &pStr); - //MessageBoxW(NULL, L"ISF_NetConnect_IContextMenu2_QueryInterface unhandled", pStr, MB_OK); - return E_NOINTERFACE; -} - -/************************************************************************ - * ISF_NetConnect_IContextMenu_AddRef - */ -static ULONG WINAPI ISF_NetConnect_IContextMenu3_AddRef(IContextMenu3 * iface) -{ - ULONG refCount; - IContextMenuImpl * This = (IContextMenuImpl*)iface; - - refCount = InterlockedIncrement(&This->ref); - - return refCount; -} - -/************************************************************************ - * ISF_NetConnect_IContextMenu_Release - */ -static ULONG WINAPI ISF_NetConnect_IContextMenu3_Release(IContextMenu3 * iface) -{ - ULONG refCount; - IContextMenuImpl * This = (IContextMenuImpl*)iface; - - refCount = InterlockedDecrement(&This->ref); - if (!refCount) - { - CoTaskMemFree(This); - } - return refCount; -} - -void WINAPI _InsertMenuItemW ( - HMENU hmenu, - UINT indexMenu, - BOOL fByPosition, - UINT wID, - UINT fType, - LPCWSTR dwTypeData, - UINT fState) -{ - MENUITEMINFOW mii; - WCHAR szText[100]; - - ZeroMemory(&mii, sizeof(mii)); - mii.cbSize = sizeof(mii); - if (fType == MFT_SEPARATOR) - { - mii.fMask = MIIM_ID | MIIM_TYPE; - } - else if (fType == MFT_STRING) - { - mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; - if ((ULONG_PTR)HIWORD((ULONG_PTR)dwTypeData) == 0) - { - if (LoadStringW(netshell_hInstance, LOWORD((ULONG_PTR)dwTypeData), szText, sizeof(szText)/sizeof(WCHAR))) - { - szText[(sizeof(szText)/sizeof(WCHAR))-1] = 0; - mii.dwTypeData = szText; - } - else - { - return; - } - } - else - { - mii.dwTypeData = (LPWSTR) dwTypeData; - } - mii.fState = fState; - } - - mii.wID = wID; - mii.fType = fType; - InsertMenuItemW( hmenu, indexMenu, fByPosition, &mii); -} - -/************************************************************************** -* ISF_NetConnect_IContextMenu_QueryContextMenu() -*/ -static HRESULT WINAPI ISF_NetConnect_IContextMenu3_QueryContextMenu( - IContextMenu3 *iface, - HMENU hMenu, - UINT indexMenu, - UINT idCmdFirst, - UINT idCmdLast, - UINT uFlags) -{ - IContextMenuImpl * This = (IContextMenuImpl*)iface; - VALUEStruct * val; - NETCON_PROPERTIES * pProperties; - - val = _ILGetValueStruct(This->apidl); - if (!val) - return E_FAIL; - - if (INetConnection_GetProperties((INetConnection*)val->pItem, &pProperties) != NOERROR) - return E_FAIL; - - - if (pProperties->Status == NCS_HARDWARE_DISABLED) - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_ACTIVATE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_ACTIVATE), MFS_DEFAULT); - else - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_DEACTIVATE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_DEACTIVATE), MFS_ENABLED); - - if (pProperties->Status == NCS_HARDWARE_DISABLED || pProperties->Status == NCS_MEDIA_DISCONNECTED || pProperties->Status == NCS_DISCONNECTED) - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_STATUS, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_STATUS), MFS_GRAYED); - else if (pProperties->Status == NCS_CONNECTED) - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_STATUS, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_STATUS), MFS_DEFAULT); - else - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_STATUS, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_STATUS), MFS_ENABLED); - - if (pProperties->Status == NCS_HARDWARE_DISABLED || pProperties->Status == NCS_MEDIA_DISCONNECTED) - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_REPAIR, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_REPAIR), MFS_GRAYED); - else - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_REPAIR, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_REPAIR), MFS_ENABLED); - - _InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, MFS_ENABLED); - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_CREATELINK, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_CREATELINK), MFS_ENABLED); - - if (pProperties->dwCharacter & NCCF_ALLOW_REMOVAL) - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_DELETE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_DELETE), MFS_ENABLED); - else - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_DELETE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_DELETE), MFS_GRAYED); - - if (pProperties->dwCharacter & NCCF_ALLOW_RENAME) - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_RENAME, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_RENAME), MFS_ENABLED); - else - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_RENAME, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_RENAME), MFS_GRAYED); - - _InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, MFS_ENABLED); - _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_PROPERTIES, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_PROPERTIES), MFS_ENABLED); - NcFreeNetconProperties(pProperties); - return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 9); -} - -BOOL -CALLBACK -PropSheetExCallback(HPROPSHEETPAGE hPage, LPARAM lParam) -{ - PROPSHEETHEADERW *pinfo = (PROPSHEETHEADERW *)lParam; - - if (pinfo->nPages < MAX_PROPERTY_SHEET_PAGE) - { - pinfo->u3.phpage[pinfo->nPages++] = hPage; - return TRUE; - } - return FALSE; -} - -HRESULT -ShowNetConnectionStatus( - IOleCommandTarget * lpOleCmd, - INetConnection * pNetConnect, - HWND hwnd) -{ - NETCON_PROPERTIES * pProperties; - HRESULT hr; - - if (!lpOleCmd) - return E_FAIL; - - if (INetConnection_GetProperties(pNetConnect, &pProperties) != NOERROR) - return E_FAIL; - - hr = IOleCommandTarget_Exec(lpOleCmd, &pProperties->guidId, 2, OLECMDEXECOPT_DODEFAULT, NULL, NULL); - - NcFreeNetconProperties(pProperties); - return hr; -} - -HRESULT -ShowNetConnectionProperties( - INetConnection * pNetConnect, - HWND hwnd) -{ - HRESULT hr; - CLSID ClassID; - PROPSHEETHEADERW pinfo; - HPROPSHEETPAGE hppages[MAX_PROPERTY_SHEET_PAGE]; - INetConnectionPropertyUi * pNCP; - NETCON_PROPERTIES * pProperties; - - if (INetConnection_GetProperties(pNetConnect, &pProperties) != NOERROR) - return E_FAIL; - - hr = INetConnection_GetUiObjectClassId(pNetConnect, &ClassID); - if (FAILED(hr)) - { - NcFreeNetconProperties(pProperties); - return hr; - } - - hr = CoCreateInstance(&ClassID, NULL, CLSCTX_INPROC_SERVER, &IID_INetConnectionPropertyUi, (LPVOID)&pNCP); - if (FAILED(hr)) - { - NcFreeNetconProperties(pProperties); - return hr; - } - - hr = INetConnectionPropertyUi_SetConnection(pNCP, pNetConnect); - if (SUCCEEDED(hr)) - { - ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW)); - ZeroMemory(hppages, sizeof(hppages)); - pinfo.dwSize = sizeof(PROPSHEETHEADERW); - pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; - pinfo.u3.phpage = hppages; - pinfo.hwndParent = hwnd; - - pinfo.pszCaption = pProperties->pszwName; - hr = INetConnectionPropertyUi_AddPages(pNCP, hwnd, PropSheetExCallback, (LPARAM)&pinfo); - if (SUCCEEDED(hr)) - { - if(PropertySheetW(&pinfo) < 0) - hr = E_FAIL; - } - } - INetConnectionPropertyUi_Release(pNCP); - NcFreeNetconProperties(pProperties); - return hr; -} - - -/************************************************************************** -* ISF_NetConnect_IContextMenu_InvokeCommand() -*/ -static HRESULT WINAPI ISF_NetConnect_IContextMenu3_InvokeCommand( - IContextMenu3 *iface, - LPCMINVOKECOMMANDINFO lpcmi) -{ - IContextMenuImpl * This = (IContextMenuImpl*)iface; - VALUEStruct * val; - - val = _ILGetValueStruct(This->apidl); - if (!val) - return E_FAIL; - - if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_STATUS) || - lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_STATUS-1)) //HACK for Windows XP - { - return ShowNetConnectionStatus(This->lpOleCmd, val->pItem, lpcmi->hwnd); - } - else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_PROPERTIES) || - lpcmi->lpVerb == MAKEINTRESOURCEA(10099)) //HACK for Windows XP - { - /* FIXME perform version checks */ - return ShowNetConnectionProperties(val->pItem, lpcmi->hwnd); - } - - return S_OK; -} - -/************************************************************************** - * ISF_NetConnect_IContextMenu_GetCommandString() - * - */ -static HRESULT WINAPI ISF_NetConnect_IContextMenu3_GetCommandString( - IContextMenu3 *iface, - UINT_PTR idCommand, - UINT uFlags, - UINT* lpReserved, - LPSTR lpszName, - UINT uMaxNameLen) -{ - return E_FAIL; -} - - - -/************************************************************************** -* ISF_NetConnect_IContextMenu_HandleMenuMsg() -*/ -static HRESULT WINAPI ISF_NetConnect_IContextMenu3_HandleMenuMsg( - IContextMenu3 *iface, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - return E_NOTIMPL; -} - -static HRESULT WINAPI ISF_NetConnect_IContextMenu3_HandleMenuMsg2( - IContextMenu3 *iface, - UINT uMsg, - WPARAM wParam, - LPARAM lParam, - LRESULT *plResult) -{ - return E_NOTIMPL; -} - - -static const IContextMenu3Vtbl vt_ContextMenu3 = -{ - ISF_NetConnect_IContextMenu3_QueryInterface, - ISF_NetConnect_IContextMenu3_AddRef, - ISF_NetConnect_IContextMenu3_Release, - ISF_NetConnect_IContextMenu3_QueryContextMenu, - ISF_NetConnect_IContextMenu3_InvokeCommand, - ISF_NetConnect_IContextMenu3_GetCommandString, - ISF_NetConnect_IContextMenu3_HandleMenuMsg, - ISF_NetConnect_IContextMenu3_HandleMenuMsg2 -}; - -static HRESULT WINAPI ISF_NetConnect_IObjectWithSite_QueryInterface (IObjectWithSite * iface, - REFIID iid, LPVOID * ppvObj) -{ - IContextMenuImpl * This = impl_from_IObjectWithSite(iface); - - if (IsEqualIID(iid, &IID_IObjectWithSite)) - { - *ppvObj = (IUnknown*)&This->lpVtblObjectWithSite; - return S_OK; - } - return E_NOINTERFACE; -} - -/************************************************************************ - * ISF_NetConnect_IQueryInfo_AddRef - */ -static ULONG WINAPI ISF_NetConnect_IObjectWithSite_AddRef (IObjectWithSite * iface) -{ - IContextMenuImpl * This = impl_from_IObjectWithSite(iface); - - return IContextMenu2_AddRef((IContextMenu2*)This); -} - -/************************************************************************ - * ISF_NetConnect_IQueryInfo_Release - */ -static ULONG WINAPI ISF_NetConnect_IObjectWithSite_Release (IObjectWithSite * iface) -{ - IContextMenuImpl * This = impl_from_IObjectWithSite(iface); - - return IContextMenu_Release((IContextMenu*)This); -} - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_Release - */ -static HRESULT WINAPI ISF_NetConnect_IObjectWithSite_GetSite (IObjectWithSite * iface, REFIID riid, PVOID *ppvSite) -{ - HRESULT hr; - IUnknown *pUnknown; - IContextMenuImpl * This = impl_from_IObjectWithSite(iface); - - if (!This->pUnknown) - { - *ppvSite = NULL; - return E_FAIL; - } - - hr = IUnknown_QueryInterface(This->pUnknown, riid, (LPVOID*)&pUnknown); - if (SUCCEEDED(hr)) - { - IUnknown_AddRef(pUnknown); - *ppvSite = pUnknown; - return S_OK; - } - - *ppvSite = NULL; - return hr; -} - -static HRESULT WINAPI ISF_NetConnect_IObjectWithSite_SetSite (IObjectWithSite * iface, IUnknown *pUnkSite) -{ - IContextMenuImpl * This = impl_from_IObjectWithSite(iface); - - if(!pUnkSite) - { - if (This->pUnknown) - { - IUnknown_Release(This->pUnknown); - This->pUnknown = NULL; - } - } - else - { - IUnknown_AddRef(pUnkSite); - if (This->pUnknown) - IUnknown_Release(This->pUnknown); - This->pUnknown = pUnkSite; - } - - return S_OK; -} - - -static const IObjectWithSiteVtbl vt_ObjectWithSite = -{ - ISF_NetConnect_IObjectWithSite_QueryInterface, - ISF_NetConnect_IObjectWithSite_AddRef, - ISF_NetConnect_IObjectWithSite_Release, - ISF_NetConnect_IObjectWithSite_SetSite, - ISF_NetConnect_IObjectWithSite_GetSite -}; - -static HRESULT WINAPI ISF_NetConnect_IExtractIconW_QueryInterface (IExtractIconW * iface, - REFIID iid, LPVOID * ppvObj) -{ - IContextMenuImpl * This = impl_from_IExtractIcon(iface); - - if (IsEqualIID(iid, &IID_IExtractIconW)) - { - *ppvObj = (IUnknown*)&This->lpVtblExtractIconW; - return S_OK; - } - return E_NOINTERFACE; -} - -/************************************************************************ - * ISF_NetConnect_IExtractIcon_AddRef - */ -static ULONG WINAPI ISF_NetConnect_IExtractIconW_AddRef (IExtractIconW * iface) -{ - IContextMenuImpl * This = impl_from_IExtractIcon(iface); - - return IContextMenu2_AddRef((IContextMenu2*)This); -} - -/************************************************************************ - * ISF_NetConnect_IExtractIcon_Release - */ -static ULONG WINAPI ISF_NetConnect_IExtractIconW_Release (IExtractIconW * iface) -{ - IContextMenuImpl * This = impl_from_IExtractIcon(iface); - - return IContextMenu_Release((IContextMenu*)This); -} - -/************************************************************************ - * ISF_NetConnect_IExtractIcon_GetIconLocation - */ -static HRESULT WINAPI ISF_NetConnect_IExtractIconW_GetIconLocation( - IExtractIconW * iface, - UINT uFlags, - LPWSTR szIconFile, - UINT cchMax, - int *piIndex, - UINT *pwFlags) -{ - VALUEStruct * val; - NETCON_PROPERTIES * pProperties; - IContextMenuImpl * This = impl_from_IExtractIcon(iface); - - *pwFlags = 0; - if (!GetModuleFileNameW(netshell_hInstance, szIconFile, cchMax)) - { - ERR("GetModuleFileNameW failed\n"); - return E_FAIL; - } - - val = _ILGetValueStruct(This->apidl); - if (!val) - { - ERR("_ILGetValueStruct failed\n"); - return E_FAIL; - } - - if (INetConnection_GetProperties(val->pItem, &pProperties) != NOERROR) - { - ERR("INetConnection_GetProperties failed\n"); - return E_FAIL; - } - - if (pProperties->Status == NCS_CONNECTED || pProperties->Status == NCS_CONNECTING) - *piIndex = -IDI_NET_IDLE; - else - *piIndex = -IDI_NET_OFF; - - NcFreeNetconProperties(pProperties); - - return NOERROR; -} - -/************************************************************************ - * ISF_NetConnect_IExtractIcon_Extract - */ -static HRESULT WINAPI ISF_NetConnect_IExtractIconW_Extract( - IExtractIconW * iface, - LPCWSTR pszFile, - UINT nIconIndex, - HICON *phiconLarge, - HICON *phiconSmall, - UINT nIconSize) -{ - //IContextMenuImpl * This = impl_from_IExtractIcon(iface); - if (nIconIndex == IDI_NET_IDLE) - { - *phiconLarge = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); - *phiconSmall = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); - return NOERROR; - } - else if (nIconIndex == IDI_NET_OFF) - { - *phiconLarge = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); - *phiconSmall = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); - return NOERROR; - } - - return S_FALSE; -} - -static const IExtractIconWVtbl vt_ExtractIconW = -{ - ISF_NetConnect_IExtractIconW_QueryInterface, - ISF_NetConnect_IExtractIconW_AddRef, - ISF_NetConnect_IExtractIconW_Release, - ISF_NetConnect_IExtractIconW_GetIconLocation, - ISF_NetConnect_IExtractIconW_Extract -}; - - - - - - - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_QueryInterface - */ -static HRESULT WINAPI ISF_NetConnect_PersistFolder2_QueryInterface (IPersistFolder2 * iface, - REFIID iid, LPVOID * ppvObj) -{ - IGenericSFImpl * This = impl_from_IPersistFolder2(iface); - - return IShellFolder2_QueryInterface ((IShellFolder2*)This, iid, ppvObj); -} - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_AddRef - */ -static ULONG WINAPI ISF_NetConnect_PersistFolder2_AddRef (IPersistFolder2 * iface) -{ - IGenericSFImpl * This = impl_from_IPersistFolder2(iface); - - return IShellFolder2_AddRef((IShellFolder2*)This); -} - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_Release - */ -static ULONG WINAPI ISF_NetConnect_PersistFolder2_Release (IPersistFolder2 * iface) -{ - IGenericSFImpl * This = impl_from_IPersistFolder2(iface); - - return IShellFolder2_Release((IShellFolder2*)This); -} - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_GetClassID - */ -static HRESULT WINAPI ISF_NetConnect_PersistFolder2_GetClassID ( - IPersistFolder2 * iface, CLSID * lpClassId) -{ - //IGenericSFImpl * This = impl_from_IPersistFolder2(iface); - - if (!lpClassId) - return E_POINTER; - - *lpClassId = CLSID_NetworkConnections; - - return S_OK; -} - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_Initialize - * - * NOTES: it makes no sense to change the pidl - */ -static HRESULT WINAPI ISF_NetConnect_PersistFolder2_Initialize ( - IPersistFolder2 * iface, LPCITEMIDLIST pidl) -{ - IGenericSFImpl * This = impl_from_IPersistFolder2(iface); - - SHFree(This->pidlRoot); - This->pidlRoot = ILClone(pidl); - - return S_OK; -} - -/************************************************************************** - * ISF_NetConnect_PersistFolder2_GetCurFolder - */ -static HRESULT WINAPI ISF_NetConnect_PersistFolder2_GetCurFolder ( - IPersistFolder2 * iface, LPITEMIDLIST * pidl) -{ - IGenericSFImpl * This = impl_from_IPersistFolder2(iface); - - - if (!pidl) - return E_POINTER; - - *pidl = ILClone (This->pidlRoot); - - return S_OK; -} - -static const IPersistFolder2Vtbl vt_PersistFolder2 = -{ - ISF_NetConnect_PersistFolder2_QueryInterface, - ISF_NetConnect_PersistFolder2_AddRef, - ISF_NetConnect_PersistFolder2_Release, - ISF_NetConnect_PersistFolder2_GetClassID, - ISF_NetConnect_PersistFolder2_Initialize, - ISF_NetConnect_PersistFolder2_GetCurFolder -}; - -/************************************************************************ - * ISF_NetConnect_ShellExecuteHookW_QueryInterface - */ -static HRESULT WINAPI ISF_NetConnect_ShellExecuteHookW_QueryInterface (IShellExecuteHookW * iface, - REFIID iid, LPVOID * ppvObj) -{ - IGenericSFImpl * This = impl_from_IShellExecuteHookW(iface); - - return IShellFolder2_QueryInterface ((IShellFolder2*)This, iid, ppvObj); -} - -/************************************************************************ - * ISF_NetConnect_ShellExecuteHookW_AddRef - */ -static ULONG WINAPI ISF_NetConnect_ShellExecuteHookW_AddRef (IShellExecuteHookW * iface) -{ - IGenericSFImpl * This = impl_from_IShellExecuteHookW(iface); - - return IShellFolder2_AddRef((IShellFolder2*)This); -} - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_Release - */ -static ULONG WINAPI ISF_NetConnect_ShellExecuteHookW_Release (IShellExecuteHookW * iface) -{ - IGenericSFImpl * This = impl_from_IShellExecuteHookW(iface); - - return IShellFolder2_Release((IShellFolder2*)This); -} - - -/************************************************************************ - * ISF_NetConnect_ShellExecuteHookW_Execute - */ -static HRESULT WINAPI ISF_NetConnect_ShellExecuteHookW_Execute (IShellExecuteHookW * iface, - LPSHELLEXECUTEINFOW pei) -{ - VALUEStruct * val; - NETCON_PROPERTIES * pProperties; - IGenericSFImpl * This = impl_from_IShellExecuteHookW(iface); - - val = _ILGetValueStruct(ILFindLastID(pei->lpIDList)); - if (!val) - return E_FAIL; - - if (INetConnection_GetProperties((INetConnection*)val->pItem, &pProperties) != NOERROR) - return E_FAIL; - - if (pProperties->Status == NCS_CONNECTED) - { - NcFreeNetconProperties(pProperties); - return ShowNetConnectionStatus(This->lpOleCmd, val->pItem, pei->hwnd); - } - - NcFreeNetconProperties(pProperties); - - return S_OK; -} - - -static const IShellExecuteHookWVtbl vt_ShellExecuteHookW = -{ - ISF_NetConnect_ShellExecuteHookW_QueryInterface, - ISF_NetConnect_ShellExecuteHookW_AddRef, - ISF_NetConnect_ShellExecuteHookW_Release, - ISF_NetConnect_ShellExecuteHookW_Execute -}; - -#if 0 -static const IPersistIDListVtbl vt_PersistIDList = -{ - ISF_NetConnect_PersistIDList_QueryInterface, - ISF_NetConnect_PersistIDList_AddRef, - ISF_NetConnect_PersistIDList_Release, - ISF_NetConnect_PersistIDList_GetClassID, - ISF_NetConnect_PersistIDList_SetIDList, - ISF_NetConnect_PersistIDList_GetIDList, -}; -#endif - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_QueryInterface - */ -static HRESULT WINAPI ISF_NetConnect_IQueryInfo_QueryInterface (IQueryInfo * iface, - REFIID iid, LPVOID * ppvObj) -{ - IContextMenuImpl * This = impl_from_IQueryInfo(iface); - - if (IsEqualIID(iid, &IID_IQueryInfo)) - { - *ppvObj = (IUnknown*)&This->lpVtblQueryInfo; - return S_OK; - } - - return E_NOINTERFACE; -} - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_AddRef - */ -static ULONG WINAPI ISF_NetConnect_IQueryInfo_AddRef (IQueryInfo * iface) -{ - IContextMenuImpl * This = impl_from_IQueryInfo(iface); - - return IContextMenu2_AddRef((IContextMenu2*)This); -} - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_Release - */ -static ULONG WINAPI ISF_NetConnect_IQueryInfo_Release (IQueryInfo * iface) -{ - IContextMenuImpl * This = impl_from_IQueryInfo(iface); - - return IContextMenu_Release((IContextMenu*)This); -} - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_GetClassID - */ -static HRESULT WINAPI ISF_NetConnect_IQueryInfo_GetInfoFlags ( - IQueryInfo * iface, DWORD *pdwFlags) -{ - *pdwFlags = 0; - - return S_OK; -} - -/************************************************************************ - * ISF_NetConnect_PersistFolder2_Initialize - * - * NOTES: it makes no sense to change the pidl - */ -static HRESULT WINAPI ISF_NetConnect_IQueryInfo_GetInfoTip ( - IQueryInfo * iface, DWORD dwFlags, WCHAR **ppwszTip) -{ -// IGenericSFImpl * This = impl_from_IQueryInfo(iface); - - *ppwszTip = NULL; - return S_OK; -} - -static const IQueryInfoVtbl vt_QueryInfo = -{ - ISF_NetConnect_IQueryInfo_QueryInterface, - ISF_NetConnect_IQueryInfo_AddRef, - ISF_NetConnect_IQueryInfo_Release, - ISF_NetConnect_IQueryInfo_GetInfoTip, - ISF_NetConnect_IQueryInfo_GetInfoFlags -}; - -/************************************************************************** -* ISF_NetConnect_Constructor -*/ -HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) -{ - IGenericSFImpl *sf; - HRESULT hr; - - if (!ppv) - return E_POINTER; - if (pUnkOuter) - return CLASS_E_NOAGGREGATION; - - sf = (IGenericSFImpl *) CoTaskMemAlloc(sizeof (IGenericSFImpl)); - if (!sf) - return E_OUTOFMEMORY; - - sf->ref = 1; - sf->lpVtbl = &vt_ShellFolder2; - sf->lpVtblPersistFolder2 = &vt_PersistFolder2; - sf->lpVtblShellExecuteHookW = &vt_ShellExecuteHookW; - - hr = CoCreateInstance(&CLSID_LanConnectStatusUI, NULL, CLSCTX_INPROC_SERVER, &IID_IOleCommandTarget, (LPVOID*)&sf->lpOleCmd); - if (FAILED(hr)) - sf->lpOleCmd = NULL; - else - { - IOleCommandTarget_Exec(sf->lpOleCmd, &CGID_ShellServiceObject, 2, OLECMDEXECOPT_DODEFAULT, NULL, NULL); - } - - sf->pidlRoot = _ILCreateNetConnect(); /* my qualified pidl */ - - if (!SUCCEEDED (IShellFolder2_QueryInterface ((IShellFolder2*)sf, riid, ppv))) - { - IShellFolder2_Release((IShellFolder2*)sf); - return E_NOINTERFACE; - } - return S_OK; -} diff --git a/reactos/dll/win32/netshell/shfldr_netconnect.cpp b/reactos/dll/win32/netshell/shfldr_netconnect.cpp new file mode 100644 index 00000000000..be01530fc94 --- /dev/null +++ b/reactos/dll/win32/netshell/shfldr_netconnect.cpp @@ -0,0 +1,1201 @@ +/* + * Network Connections Shell Folder + * + * Copyright 2008 Johannes Anderwald + * + * 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 + +WINE_DEFAULT_DEBUG_CHANNEL (shell); + +#define MAX_PROPERTY_SHEET_PAGE (10) + +/*********************************************************************** +* IShellFolder implementation +*/ + +class CNetworkConnections: + public IShellFolder2, + public IPersistFolder2, + public IShellExecuteHookW +{ + public: + CNetworkConnections(); + + /* IUnknown */ + virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); + virtual ULONG WINAPI AddRef(); + virtual ULONG WINAPI Release(); + + // IShellFolder + virtual HRESULT WINAPI ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); + virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI GetAttributesOf (UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + + /* ShellFolder2 */ + virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); + virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); + virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); + virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); + virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); + + // IPersistFolder2 + virtual HRESULT WINAPI GetClassID(CLSID *lpClassId); + virtual HRESULT WINAPI Initialize(LPCITEMIDLIST pidl); + virtual HRESULT WINAPI GetCurFolder(LPITEMIDLIST *pidl); + + // IShellExecuteHookW + virtual HRESULT WINAPI Execute(LPSHELLEXECUTEINFOW pei); + + private: + LONG ref; + /* both paths are parsible from the desktop */ + LPITEMIDLIST pidlRoot; /* absolute pidl */ + LPITEMIDLIST pidl; /* enumerated pidl */ + IOleCommandTarget * lpOleCmd; +}; + +class CNetConUiObject: + public IContextMenu3, + public IObjectWithSite, + public IQueryInfo, + public IExtractIconW +{ + public: + CNetConUiObject(LPCITEMIDLIST apidl, IOleCommandTarget *lpOleCmd); + + // IUnknown + virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); + virtual ULONG WINAPI AddRef(); + virtual ULONG WINAPI Release(); + + // IContextMenu3 + virtual HRESULT WINAPI QueryContextMenu(HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags); + virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpici); + virtual HRESULT WINAPI GetCommandString(UINT_PTR idCmd, UINT uType, UINT *pwReserved, LPSTR pszName, UINT cchMax); + virtual HRESULT WINAPI HandleMenuMsg( UINT uMsg, WPARAM wParam, LPARAM lParam); + virtual HRESULT WINAPI HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult); + + // IObjectWithSite + virtual HRESULT WINAPI SetSite(IUnknown *punk); + virtual HRESULT WINAPI GetSite(REFIID iid, void **ppvSite); + + // IQueryInfo + virtual HRESULT WINAPI GetInfoFlags(DWORD *pdwFlags); + virtual HRESULT WINAPI GetInfoTip(DWORD dwFlags, WCHAR **ppwszTip); + + // IExtractIconW + virtual HRESULT STDMETHODCALLTYPE GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags); + virtual HRESULT STDMETHODCALLTYPE Extract(LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); + + private: + LONG ref; + LPCITEMIDLIST apidl; + IUnknown *pUnknown; + IOleCommandTarget * lpOleCmd; +}; + +static const shvheader NetConnectSFHeader[] = { + {IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 20}, + {IDS_SHV_COLUMN_TYPE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 8}, + {IDS_SHV_COLUMN_STATE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN_DEVNAME, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12}, + {IDS_SHV_COLUMN_PHONE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN_OWNER, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5} +}; + +#define NETCONNECTSHELLVIEWCOLUMNS 6 + +#define COLUMN_NAME 0 +#define COLUMN_TYPE 1 +#define COLUMN_STATUS 2 +#define COLUMN_DEVNAME 3 +#define COLUMN_PHONE 4 +#define COLUMN_OWNER 5 + +HRESULT ShowNetConnectionStatus(IOleCommandTarget * lpOleCmd, INetConnection * pNetConnect, HWND hwnd); + +CNetworkConnections::CNetworkConnections() +{ + ref = 0; + HRESULT hr = CoCreateInstance(CLSID_LanConnectStatusUI, NULL, CLSCTX_INPROC_SERVER, IID_IOleCommandTarget, (LPVOID*)&lpOleCmd); + if (FAILED(hr)) + { + ERR("CoCreateInstance failed\n"); + lpOleCmd = NULL; + } + else + { + hr = lpOleCmd->Exec(&CGID_ShellServiceObject, 2, OLECMDEXECOPT_DODEFAULT, NULL, NULL); + if (FAILED(hr)) + ERR("Exec CGID_ShellServiceObject failed\n"); + } + + pidlRoot = _ILCreateNetConnect(); /* my qualified pidl */ +} + +/************************************************************************** + * ISF_NetConnect_fnQueryInterface + * + * NOTE + * supports not IPersist/IPersistFolder + */ +HRESULT WINAPI CNetworkConnections::QueryInterface(REFIID riid, LPVOID *ppvObj) +{ + *ppvObj = NULL; + + if (IsEqualIID(riid, IID_IUnknown) || + IsEqualIID(riid, IID_IShellFolder) || + IsEqualIID(riid, IID_IShellFolder2)) + { + *ppvObj = (IShellFolder2*)this; + } + else if (IsEqualIID (riid, IID_IPersistFolder) || + IsEqualIID (riid, IID_IPersistFolder2)) + { + *ppvObj = (IPersistFolder2*)this; + } + else if (IsEqualIID(riid, IID_IShellExecuteHookW)) + { + *ppvObj = (IShellExecuteHookW*)this; + } +#if 0 + else if (IsEqualIID(riid, IID_IPersistIDList)) + { + //*ppvObj = (IPersistIDList*)this; + } +#endif + if (*ppvObj) + { + AddRef(); + return S_OK; + } + + /* TODO: + * IID_IPersistFreeThreadedObject + * IID_IBrowserFrameOptions + * IID_IShellIconOverlay + * IID_IPersistIDList + * IID_IPersist + */ + + return E_NOINTERFACE; +} + +ULONG WINAPI CNetworkConnections::AddRef() +{ + ULONG refCount = InterlockedIncrement(&ref); + + return refCount; +} + +ULONG WINAPI CNetworkConnections::Release() +{ + ULONG refCount = InterlockedDecrement(&ref); + + if (!refCount) + { + SHFree(pidlRoot); + delete this; + } + return refCount; +} + +/************************************************************************** +* ISF_NetConnect_fnParseDisplayName +*/ +HRESULT WINAPI CNetworkConnections::ParseDisplayName ( + HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName, + DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) +{ + HRESULT hr = E_UNEXPECTED; + + *ppidl = 0; + if (pchEaten) + *pchEaten = 0; /* strange but like the original */ + + return hr; +} + +/************************************************************************** + * CreateNetConnectEnumListss() + */ +static BOOL CreateNetConnectEnumList(CEnumIDList *list, DWORD dwFlags) +{ + HRESULT hr; + INetConnectionManager *pNetConMan; + IEnumNetConnection *pEnumCon; + INetConnection *INetCon; + ULONG Count; + LPITEMIDLIST pidl; + + /* get an instance to of IConnectionManager */ + hr = INetConnectionManager_Constructor(NULL, IID_INetConnectionManager, (LPVOID*)&pNetConMan); + if (FAILED(hr)) + return FALSE; + + hr = pNetConMan->EnumConnections(NCME_DEFAULT, &pEnumCon); + if (FAILED(hr)) + { + pNetConMan->Release(); + return FALSE; + } + + do + { + hr = pEnumCon->Next(1, &INetCon, &Count); + if (hr == S_OK) + { + pidl = ILCreateNetConnectItem(INetCon); + if (pidl) + { + list->AddToEnumList(pidl); + } + } + else + { + break; + } + }while(TRUE); + + pEnumCon->Release(); + pNetConMan->Release(); + + return TRUE; +} + +/************************************************************************** +* ISF_NetConnect_fnEnumObjects +*/ +HRESULT WINAPI CNetworkConnections::EnumObjects( + HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) +{ + CEnumIDList *pList = new CEnumIDList; + *ppEnumIDList = (LPENUMIDLIST)pList; + if (!pList) + return E_OUTOFMEMORY; + + pList->AddRef(); + CreateNetConnectEnumList(pList, dwFlags); + return S_OK; +} + +/************************************************************************** +* ISF_NetConnect_fnBindToObject +*/ +HRESULT WINAPI CNetworkConnections::BindToObject ( + LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + return E_NOTIMPL; +} + +/************************************************************************** +* ISF_NetConnect_fnBindToStorage +*/ +HRESULT WINAPI CNetworkConnections::BindToStorage( + LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + *ppvOut = NULL; + return E_NOTIMPL; +} + +/************************************************************************** +* ISF_NetConnect_fnCompareIDs +*/ + +HRESULT WINAPI CNetworkConnections::CompareIDs( + LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + //IGenericSFImpl *This = (IGenericSFImpl *)iface; + + + + return E_NOTIMPL; +} + +/************************************************************************** +* ISF_NetConnect_fnCreateViewObject +*/ +HRESULT WINAPI CNetworkConnections::CreateViewObject( + HWND hwndOwner, REFIID riid, LPVOID * ppvOut) +{ + CSFV cvf; + HRESULT hr = E_NOINTERFACE; + + if (!ppvOut) + return hr; + + *ppvOut = NULL; + + if (IsEqualIID(riid, IID_IShellView)) + { + ZeroMemory(&cvf, sizeof(cvf)); + cvf.cbSize = sizeof(cvf); + cvf.pshf = (IShellFolder*)this; + + IShellView* pShellView; + hr = SHCreateShellFolderViewEx(&cvf, &pShellView); + if (SUCCEEDED(hr)) + { + hr = pShellView->QueryInterface(riid, ppvOut); + pShellView->Release(); + } + } + + return hr; +} + +/************************************************************************** +* ISF_NetConnect_fnGetAttributesOf +*/ +HRESULT WINAPI CNetworkConnections::GetAttributesOf( + UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) +{ + //IGenericSFImpl *This = (IGenericSFImpl *)iface; + HRESULT hr = S_OK; + static const DWORD dwNetConnectAttributes = SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | + SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE; + + static const DWORD dwNetConnectItemAttributes = SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | + SFGAO_FILESYSANCESTOR | SFGAO_CANRENAME; + + if (!rgfInOut) + return E_INVALIDARG; + + if (cidl && !apidl) + return E_INVALIDARG; + + if (*rgfInOut == 0) + *rgfInOut = ~0; + + if(cidl == 0) + *rgfInOut = dwNetConnectAttributes; + else + *rgfInOut = dwNetConnectItemAttributes; + + /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ + *rgfInOut &= ~SFGAO_VALIDATE; + + return hr; +} + +/************************************************************************** +* ISF_NetConnect_fnGetUIObjectOf +* +* PARAMETERS +* hwndOwner [in] Parent window for any output +* cidl [in] array size +* apidl [in] simple pidl array +* riid [in] Requested Interface +* prgfInOut [ ] reserved +* ppvObject [out] Resulting Interface +* +*/ + +HRESULT IContextMenuImpl_Constructor(REFIID riid, LPCITEMIDLIST apidl, LPVOID * ppvOut, IOleCommandTarget * lpOleCmd) +{ + CNetConUiObject *pMenu = new CNetConUiObject(apidl, lpOleCmd); + if (!pMenu) + return E_OUTOFMEMORY; + + pMenu->AddRef(); + HRESULT hr = pMenu->QueryInterface(riid, ppvOut); + pMenu->Release(); + return hr; +} + +HRESULT WINAPI CNetworkConnections::GetUIObjectOf( + HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, + UINT * prgfInOut, LPVOID * ppvOut) +{ + IUnknown *pObj = NULL; + HRESULT hr = E_INVALIDARG; + + if (!ppvOut) + return hr; + + *ppvOut = NULL; + + if ((IsEqualIID (riid, IID_IContextMenu) || IsEqualIID (riid, IID_IContextMenu2) || IsEqualIID(riid, IID_IContextMenu3) || + IsEqualIID(riid, IID_IQueryInfo) || IsEqualIID(riid, IID_IExtractIconW)) && cidl >= 1) + { + return IContextMenuImpl_Constructor(riid, apidl[0], ppvOut, lpOleCmd); + } + else + hr = E_NOINTERFACE; + + *ppvOut = pObj; + return hr; +} + +/************************************************************************** +* ISF_NetConnect_fnGetDisplayNameOf +* +*/ +HRESULT WINAPI CNetworkConnections::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +{ + LPWSTR pszName; + HRESULT hr = E_FAIL; + NETCON_PROPERTIES * pProperties; + VALUEStruct * val; + + if (!strRet) + return E_INVALIDARG; + + pszName = (WCHAR*)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR)); + if (!pszName) + return E_OUTOFMEMORY; + + if (_ILIsNetConnect(pidl)) + { + if (LoadStringW(netshell_hInstance, IDS_NETWORKCONNECTION, pszName, MAX_PATH)) + { + pszName[MAX_PATH-1] = L'\0'; + hr = S_OK; + } + } + else + { + val = _ILGetValueStruct(pidl); + if (val) + { + if (val->pItem->GetProperties(&pProperties) == S_OK) + { + if (pProperties->pszwName) + { + wcscpy(pszName, pProperties->pszwName); + hr = S_OK; + } + NcFreeNetconProperties(pProperties); + } + } + + } + + if (SUCCEEDED(hr)) + { + strRet->uType = STRRET_WSTR; + strRet->u.pOleStr = pszName; + } + else + { + CoTaskMemFree(pszName); + } + + return hr; +} + +/************************************************************************** +* ISF_NetConnect_fnSetNameOf +* Changes the name of a file object or subfolder, possibly changing its item +* identifier in the process. +* +* PARAMETERS +* hwndOwner [in] Owner window for output +* pidl [in] simple pidl of item to change +* lpszName [in] the items new display name +* dwFlags [in] SHGNO formatting flags +* ppidlOut [out] simple pidl returned +*/ +HRESULT WINAPI CNetworkConnections::SetNameOf ( + HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +{ + return E_NOTIMPL; +} + +HRESULT WINAPI CNetworkConnections::GetDefaultSearchGUID(GUID * pguid) +{ + return E_NOTIMPL; +} + +HRESULT WINAPI CNetworkConnections::EnumSearches(IEnumExtraSearch ** ppenum) +{ + return E_NOTIMPL; +} + +HRESULT WINAPI CNetworkConnections::GetDefaultColumn(DWORD dwRes, ULONG * pSort, ULONG * pDisplay) +{ + if (pSort) + *pSort = 0; + if (pDisplay) + *pDisplay = 0; + + return S_OK; +} + +HRESULT WINAPI CNetworkConnections::GetDefaultColumnState(UINT iColumn, DWORD * pcsFlags) +{ + if (!pcsFlags || iColumn >= NETCONNECTSHELLVIEWCOLUMNS) + return E_INVALIDARG; + *pcsFlags = NetConnectSFHeader[iColumn].pcsFlags; + return S_OK; +} + +HRESULT WINAPI CNetworkConnections::GetDetailsEx( + LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) +{ + return E_NOTIMPL; +} + +HRESULT WINAPI CNetworkConnections::GetDetailsOf( + LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd) +{ + WCHAR buffer[MAX_PATH] = {0}; + HRESULT hr = E_FAIL; + VALUEStruct * val; + NETCON_PROPERTIES * pProperties; + + if (iColumn >= NETCONNECTSHELLVIEWCOLUMNS) + return E_FAIL; + + psd->fmt = NetConnectSFHeader[iColumn].fmt; + psd->cxChar = NetConnectSFHeader[iColumn].cxChar; + if (pidl == NULL) + { + psd->str.uType = STRRET_WSTR; + if (LoadStringW(netshell_hInstance, NetConnectSFHeader[iColumn].colnameid, buffer, MAX_PATH)) + hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + + return hr; + } + + if (iColumn == COLUMN_NAME) + { + psd->str.uType = STRRET_WSTR; + return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); + } + + val = _ILGetValueStruct(pidl); + if (!val) + return E_FAIL; + + if (!val->pItem) + return E_FAIL; + + if (val->pItem->GetProperties(&pProperties) != S_OK) + return E_FAIL; + + + switch(iColumn) + { + case COLUMN_TYPE: + if (pProperties->MediaType == NCM_LAN || pProperties->MediaType == NCM_SHAREDACCESSHOST_RAS) + { + if (LoadStringW(netshell_hInstance, IDS_TYPE_ETHERNET, buffer, MAX_PATH)) + { + psd->str.uType = STRRET_WSTR; + hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + } + } + break; + case COLUMN_STATUS: + buffer[0] = L'\0'; + if (pProperties->Status == NCS_HARDWARE_DISABLED) + LoadStringW(netshell_hInstance, IDS_STATUS_NON_OPERATIONAL, buffer, MAX_PATH); + else if (pProperties->Status == NCS_DISCONNECTED) + LoadStringW(netshell_hInstance, IDS_STATUS_UNREACHABLE, buffer, MAX_PATH); + else if (pProperties->Status == NCS_MEDIA_DISCONNECTED) + LoadStringW(netshell_hInstance, IDS_STATUS_DISCONNECTED, buffer, MAX_PATH); + else if (pProperties->Status == NCS_CONNECTING) + LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTING, buffer, MAX_PATH); + else if (pProperties->Status == NCS_CONNECTED) + LoadStringW(netshell_hInstance, IDS_STATUS_CONNECTED, buffer, MAX_PATH); + + if (buffer[0]) + { + buffer[MAX_PATH-1] = L'\0'; + psd->str.uType = STRRET_WSTR; + hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + } + break; + case COLUMN_DEVNAME: + if (pProperties->pszwDeviceName) + { + wcscpy(buffer, pProperties->pszwDeviceName); + buffer[MAX_PATH-1] = L'\0'; + psd->str.uType = STRRET_WSTR; + hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + } + else + { + psd->str.u.cStr[0] = '\0'; + psd->str.uType = STRRET_CSTR; + } + break; + case COLUMN_PHONE: + case COLUMN_OWNER: + psd->str.u.cStr[0] = '\0'; + psd->str.uType = STRRET_CSTR; + break; + } + + NcFreeNetconProperties(pProperties); + return hr; +} + +HRESULT WINAPI CNetworkConnections::MapColumnToSCID(UINT column, SHCOLUMNID *pscid) +{ + return E_NOTIMPL; +} + +//IObjectWithSite +//IInternetSecurityManager + +/************************************************************************** +* IContextMenu2 Implementation +*/ + +CNetConUiObject::CNetConUiObject(LPCITEMIDLIST apidl, IOleCommandTarget *lpOleCmd) +{ + this->apidl = apidl; + pUnknown = NULL; + this->lpOleCmd = lpOleCmd; + ref = 0; +} + +/************************************************************************ + * ISF_NetConnect_IContextMenu_QueryInterface + */ +HRESULT WINAPI CNetConUiObject::QueryInterface(REFIID iid, LPVOID *ppvObject) +{ + *ppvObject = NULL; + + if (IsEqualIID(iid, IID_IContextMenu) || IsEqualIID(iid, IID_IContextMenu2) || IsEqualIID(iid, IID_IContextMenu3)) + *ppvObject = (IContextMenu3*)this; + else if (IsEqualIID(iid, IID_IObjectWithSite)) + *ppvObject = (IObjectWithSite*)this; + else if (IsEqualIID(iid, IID_IQueryInfo)) + *ppvObject = (IQueryInfo*)this; + else if(IsEqualIID(iid, IID_IExtractIconW)) + *ppvObject = (IExtractIconW*)this; + + if (*ppvObject) + { + InterlockedIncrement(&ref); + return S_OK; + } + + //LPOLESTR pStr; + //StringFromCLSID(iid, &pStr); + //MessageBoxW(NULL, L"ISF_NetConnect_IContextMenu2_QueryInterface unhandled", pStr, MB_OK); + return E_NOINTERFACE; +} + +/************************************************************************ + * ISF_NetConnect_IContextMenu_AddRef + */ +ULONG WINAPI CNetConUiObject::AddRef() +{ + ULONG refCount; + + refCount = InterlockedIncrement(&ref); + + return refCount; +} + +/************************************************************************ + * ISF_NetConnect_IContextMenu_Release + */ +ULONG WINAPI CNetConUiObject::Release() +{ + ULONG refCount; + + refCount = InterlockedDecrement(&ref); + if (!refCount) + delete this; + + return refCount; +} + +void WINAPI _InsertMenuItemW ( + HMENU hmenu, + UINT indexMenu, + BOOL fByPosition, + UINT wID, + UINT fType, + LPCWSTR dwTypeData, + UINT fState) +{ + MENUITEMINFOW mii; + WCHAR szText[100]; + + ZeroMemory(&mii, sizeof(mii)); + mii.cbSize = sizeof(mii); + if (fType == MFT_SEPARATOR) + { + mii.fMask = MIIM_ID | MIIM_TYPE; + } + else if (fType == MFT_STRING) + { + mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; + if ((ULONG_PTR)HIWORD((ULONG_PTR)dwTypeData) == 0) + { + if (LoadStringW(netshell_hInstance, LOWORD((ULONG_PTR)dwTypeData), szText, sizeof(szText)/sizeof(WCHAR))) + { + szText[(sizeof(szText)/sizeof(WCHAR))-1] = 0; + mii.dwTypeData = szText; + } + else + { + return; + } + } + else + { + mii.dwTypeData = (LPWSTR) dwTypeData; + } + mii.fState = fState; + } + + mii.wID = wID; + mii.fType = fType; + InsertMenuItemW( hmenu, indexMenu, fByPosition, &mii); +} + +/************************************************************************** +* ISF_NetConnect_IContextMenu_QueryContextMenu() +*/ +HRESULT WINAPI CNetConUiObject::QueryContextMenu( + HMENU hMenu, + UINT indexMenu, + UINT idCmdFirst, + UINT idCmdLast, + UINT uFlags) +{ + VALUEStruct * val; + NETCON_PROPERTIES * pProperties; + + val = _ILGetValueStruct(apidl); + if (!val) + return E_FAIL; + + if (val->pItem->GetProperties(&pProperties) != S_OK) + return E_FAIL; + + if (pProperties->Status == NCS_HARDWARE_DISABLED) + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_ACTIVATE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_ACTIVATE), MFS_DEFAULT); + else + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_DEACTIVATE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_DEACTIVATE), MFS_ENABLED); + + if (pProperties->Status == NCS_HARDWARE_DISABLED || pProperties->Status == NCS_MEDIA_DISCONNECTED || pProperties->Status == NCS_DISCONNECTED) + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_STATUS, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_STATUS), MFS_GRAYED); + else if (pProperties->Status == NCS_CONNECTED) + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_STATUS, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_STATUS), MFS_DEFAULT); + else + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_STATUS, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_STATUS), MFS_ENABLED); + + if (pProperties->Status == NCS_HARDWARE_DISABLED || pProperties->Status == NCS_MEDIA_DISCONNECTED) + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_REPAIR, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_REPAIR), MFS_GRAYED); + else + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_REPAIR, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_REPAIR), MFS_ENABLED); + + _InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, MFS_ENABLED); + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_CREATELINK, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_CREATELINK), MFS_ENABLED); + + if (pProperties->dwCharacter & NCCF_ALLOW_REMOVAL) + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_DELETE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_DELETE), MFS_ENABLED); + else + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_DELETE, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_DELETE), MFS_GRAYED); + + if (pProperties->dwCharacter & NCCF_ALLOW_RENAME) + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_RENAME, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_RENAME), MFS_ENABLED); + else + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_RENAME, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_RENAME), MFS_GRAYED); + + _InsertMenuItemW(hMenu, indexMenu++, TRUE, -1, MFT_SEPARATOR, NULL, MFS_ENABLED); + _InsertMenuItemW(hMenu, indexMenu++, TRUE, IDS_NET_PROPERTIES, MFT_STRING, MAKEINTRESOURCEW(IDS_NET_PROPERTIES), MFS_ENABLED); + NcFreeNetconProperties(pProperties); + return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 9); +} + +BOOL +CALLBACK +PropSheetExCallback(HPROPSHEETPAGE hPage, LPARAM lParam) +{ + PROPSHEETHEADERW *pinfo = (PROPSHEETHEADERW *)lParam; + + if (pinfo->nPages < MAX_PROPERTY_SHEET_PAGE) + { + pinfo->u3.phpage[pinfo->nPages++] = hPage; + return TRUE; + } + return FALSE; +} + +HRESULT +ShowNetConnectionStatus( + IOleCommandTarget *lpOleCmd, + INetConnection *pNetConnect, + HWND hwnd) +{ + NETCON_PROPERTIES *pProperties; + HRESULT hr; + + if (!lpOleCmd) + return E_FAIL; + + if (pNetConnect->GetProperties(&pProperties) != S_OK) + return E_FAIL; + + hr = lpOleCmd->Exec(&pProperties->guidId, 2, OLECMDEXECOPT_DODEFAULT, NULL, NULL); + + NcFreeNetconProperties(pProperties); + return hr; +} + +HRESULT +ShowNetConnectionProperties( + INetConnection *pNetConnect, + HWND hwnd) +{ + HRESULT hr; + CLSID ClassID; + PROPSHEETHEADERW pinfo; + HPROPSHEETPAGE hppages[MAX_PROPERTY_SHEET_PAGE]; + INetConnectionPropertyUi * pNCP; + NETCON_PROPERTIES * pProperties; + + if (pNetConnect->GetProperties(&pProperties) != S_OK) + return E_FAIL; + + hr = pNetConnect->GetUiObjectClassId(&ClassID); + if (FAILED(hr)) + { + NcFreeNetconProperties(pProperties); + return hr; + } + + hr = CoCreateInstance(ClassID, NULL, CLSCTX_INPROC_SERVER, IID_INetConnectionPropertyUi, (LPVOID*)&pNCP); + if (FAILED(hr)) + { + NcFreeNetconProperties(pProperties); + return hr; + } + + hr = pNCP->SetConnection(pNetConnect); + if (SUCCEEDED(hr)) + { + ZeroMemory(&pinfo, sizeof(PROPSHEETHEADERW)); + ZeroMemory(hppages, sizeof(hppages)); + pinfo.dwSize = sizeof(PROPSHEETHEADERW); + pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; + pinfo.u3.phpage = hppages; + pinfo.hwndParent = hwnd; + + pinfo.pszCaption = pProperties->pszwName; + hr = pNCP->AddPages(hwnd, PropSheetExCallback, (LPARAM)&pinfo); + if (SUCCEEDED(hr)) + { + if(PropertySheetW(&pinfo) < 0) + hr = E_FAIL; + } + } + pNCP->Release(); + NcFreeNetconProperties(pProperties); + return hr; +} + + +/************************************************************************** +* ISF_NetConnect_IContextMenu_InvokeCommand() +*/ +HRESULT WINAPI CNetConUiObject::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) +{ + VALUEStruct * val; + + val = _ILGetValueStruct(apidl); + if (!val) + return E_FAIL; + + if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_STATUS) || + lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_STATUS-1)) //HACK for Windows XP + { + return ShowNetConnectionStatus(lpOleCmd, val->pItem, lpcmi->hwnd); + } + else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_NET_PROPERTIES) || + lpcmi->lpVerb == MAKEINTRESOURCEA(10099)) //HACK for Windows XP + { + /* FIXME perform version checks */ + return ShowNetConnectionProperties(val->pItem, lpcmi->hwnd); + } + + return S_OK; +} + +/************************************************************************** + * ISF_NetConnect_IContextMenu_GetCommandString() + * + */ +HRESULT WINAPI CNetConUiObject::GetCommandString( + UINT_PTR idCommand, + UINT uFlags, + UINT* lpReserved, + LPSTR lpszName, + UINT uMaxNameLen) +{ + return E_FAIL; +} + +/************************************************************************** +* ISF_NetConnect_IContextMenu_HandleMenuMsg() +*/ +HRESULT WINAPI CNetConUiObject::HandleMenuMsg( + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + return E_NOTIMPL; +} + +HRESULT WINAPI CNetConUiObject::HandleMenuMsg2( + UINT uMsg, + WPARAM wParam, + LPARAM lParam, + LRESULT *plResult) +{ + return E_NOTIMPL; +} + +HRESULT WINAPI CNetConUiObject::GetSite(REFIID riid, PVOID *ppvSite) +{ + HRESULT hr; + IUnknown *pUnknown; + + if (!this->pUnknown) + { + *ppvSite = NULL; + return E_FAIL; + } + + hr = this->pUnknown->QueryInterface(riid, (LPVOID*)&pUnknown); + if (SUCCEEDED(hr)) + { + pUnknown->AddRef(); + *ppvSite = pUnknown; + return S_OK; + } + + *ppvSite = NULL; + return hr; +} + +HRESULT WINAPI CNetConUiObject::SetSite(IUnknown *pUnkSite) +{ + if(!pUnkSite) + { + if (this->pUnknown) + { + this->pUnknown->Release(); + this->pUnknown = NULL; + } + } + else + { + pUnkSite->AddRef(); + if (this->pUnknown) + this->pUnknown->Release(); + this->pUnknown = pUnkSite; + } + + return S_OK; +} + +/************************************************************************ + * ISF_NetConnect_IExtractIcon_GetIconLocation + */ +HRESULT WINAPI CNetConUiObject::GetIconLocation( + UINT uFlags, + LPWSTR szIconFile, + UINT cchMax, + int *piIndex, + UINT *pwFlags) +{ + VALUEStruct *val; + NETCON_PROPERTIES *pProperties; + + *pwFlags = 0; + if (!GetModuleFileNameW(netshell_hInstance, szIconFile, cchMax)) + { + ERR("GetModuleFileNameW failed\n"); + return E_FAIL; + } + + val = _ILGetValueStruct(apidl); + if (!val) + { + ERR("_ILGetValueStruct failed\n"); + return E_FAIL; + } + + if (val->pItem->GetProperties(&pProperties) != NOERROR) + { + ERR("INetConnection_GetProperties failed\n"); + return E_FAIL; + } + + if (pProperties->Status == NCS_CONNECTED || pProperties->Status == NCS_CONNECTING) + *piIndex = -IDI_NET_IDLE; + else + *piIndex = -IDI_NET_OFF; + + NcFreeNetconProperties(pProperties); + + return NOERROR; +} + +/************************************************************************ + * ISF_NetConnect_IExtractIcon_Extract + */ +HRESULT WINAPI CNetConUiObject::Extract( + LPCWSTR pszFile, + UINT nIconIndex, + HICON *phiconLarge, + HICON *phiconSmall, + UINT nIconSize) +{ + //IContextMenuImpl * This = impl_from_IExtractIcon(iface); + if (nIconIndex == IDI_NET_IDLE) + { + *phiconLarge = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + *phiconSmall = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_IDLE), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); + return NOERROR; + } + else if (nIconIndex == IDI_NET_OFF) + { + *phiconLarge = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + *phiconSmall = (HICON)LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_OFF), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); + return NOERROR; + } + + return S_FALSE; +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_GetClassID + */ +HRESULT WINAPI CNetworkConnections::GetClassID(CLSID *lpClassId) +{ + if (!lpClassId) + return E_POINTER; + + *lpClassId = CLSID_NetworkConnections; + + return S_OK; +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_Initialize + * + * NOTES: it makes no sense to change the pidl + */ +HRESULT WINAPI CNetworkConnections::Initialize(LPCITEMIDLIST pidl) +{ + SHFree(pidlRoot); + pidlRoot = ILClone(pidl); + + return S_OK; +} + +/************************************************************************** + * ISF_NetConnect_PersistFolder2_GetCurFolder + */ +HRESULT WINAPI CNetworkConnections::GetCurFolder(LPITEMIDLIST *pidl) +{ + if (!pidl) + return E_POINTER; + + *pidl = ILClone(pidlRoot); + + return S_OK; +} + +/************************************************************************ + * ISF_NetConnect_ShellExecuteHookW_Execute + */ +HRESULT WINAPI CNetworkConnections::Execute(LPSHELLEXECUTEINFOW pei) +{ + VALUEStruct *val; + NETCON_PROPERTIES * pProperties; + + val = _ILGetValueStruct(ILFindLastID((ITEMIDLIST*)pei->lpIDList)); + if (!val) + return E_FAIL; + + if (val->pItem->GetProperties(&pProperties) != NOERROR) + return E_FAIL; + + if (pProperties->Status == NCS_CONNECTED) + { + NcFreeNetconProperties(pProperties); + return ShowNetConnectionStatus(lpOleCmd, val->pItem, pei->hwnd); + } + + NcFreeNetconProperties(pProperties); + + return S_OK; +} + +HRESULT WINAPI CNetConUiObject::GetInfoFlags(DWORD *pdwFlags) +{ + *pdwFlags = 0; + + return S_OK; +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_Initialize + * + * NOTES: it makes no sense to change the pidl + */ +HRESULT WINAPI CNetConUiObject::GetInfoTip(DWORD dwFlags, WCHAR **ppwszTip) +{ + *ppwszTip = NULL; + return S_OK; +} + +/************************************************************************** +* ISF_NetConnect_Constructor +*/ +HRESULT WINAPI ISF_NetConnect_Constructor(IUnknown *pUnkOuter, REFIID riid, LPVOID *ppv) +{ + TRACE("ISF_NetConnect_Constructor\n"); + + if (!ppv) + return E_POINTER; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + CNetworkConnections *pnc = new CNetworkConnections; + if (!pnc) + return E_OUTOFMEMORY; + + pnc->AddRef(); + HRESULT hr = pnc->QueryInterface(riid, ppv); + pnc->Release(); + + return hr; +} diff --git a/reactos/include/psdk/netcon.h b/reactos/include/psdk/netcon.h index aefaef17ebd..e9b81371e57 100644 --- a/reactos/include/psdk/netcon.h +++ b/reactos/include/psdk/netcon.h @@ -1,6 +1,10 @@ #ifndef __NETCON_H__ #define __NETCON_H__ +#ifdef __cplusplus +extern "C" { +#endif + typedef enum { NCME_DEFAULT = 0 @@ -250,4 +254,8 @@ EXTERN_C const IID IID_INetConnectionPropertyUi2; VOID WINAPI NcFreeNetconProperties (NETCON_PROPERTIES* pProps); +#ifdef __cplusplus +} +#endif + #endif From 3f4ee4fefa604c6d51c1ec918fa84384af4ea244 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 20 Jan 2012 21:59:33 +0000 Subject: [PATCH 002/289] - Fix build svn path=/trunk/; revision=55023 --- reactos/dll/win32/netshell/enumlist.h | 48 +++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 reactos/dll/win32/netshell/enumlist.h diff --git a/reactos/dll/win32/netshell/enumlist.h b/reactos/dll/win32/netshell/enumlist.h new file mode 100644 index 00000000000..c5c0d76665d --- /dev/null +++ b/reactos/dll/win32/netshell/enumlist.h @@ -0,0 +1,48 @@ +typedef struct tagGUIDStruct +{ + BYTE dummy; /* offset 01 is unknown */ + GUID guid; /* offset 02 */ +} GUIDStruct; + +#define PT_GUID 0x1F + +typedef struct tagPIDLDATA +{ + BYTE type; /*00*/ + union + { + struct tagGUIDStruct guid; + struct tagVALUEStruct value; + } u; +} PIDLDATA, *LPPIDLDATA; + +typedef struct tagENUMLIST +{ + struct tagENUMLIST *pNext; + LPITEMIDLIST pidl; +} ENUMLIST, *LPENUMLIST; + +class CEnumIDList: + public IEnumIDList +{ + public: + CEnumIDList(); + BOOL AddToEnumList(LPITEMIDLIST pidl); + + // IUnknown + virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID *ppvOut); + virtual ULONG WINAPI AddRef(); + virtual ULONG WINAPI Release(); + + // IEnumIDList + virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched); + virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt); + virtual HRESULT STDMETHODCALLTYPE Reset(); + virtual HRESULT STDMETHODCALLTYPE Clone(IEnumIDList **ppenum); + + private: + LONG ref; + LPENUMLIST mpFirst; + LPENUMLIST mpLast; + LPENUMLIST mpCurrent; +}; From 7e9887db23de9b25e934da753e92ab161948870d Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 20 Jan 2012 22:35:10 +0000 Subject: [PATCH 003/289] - Fix rbuild build svn path=/trunk/; revision=55026 --- reactos/dll/win32/netshell/netshell.rbuild | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/dll/win32/netshell/netshell.rbuild b/reactos/dll/win32/netshell/netshell.rbuild index a5cfbce03a7..2093d28ff0f 100644 --- a/reactos/dll/win32/netshell/netshell.rbuild +++ b/reactos/dll/win32/netshell/netshell.rbuild @@ -17,12 +17,12 @@ ws2_32 comctl32 precomp.h - netshell.c - shfldr_netconnect.c - enumlist.c + netshell.cpp + shfldr_netconnect.cpp + enumlist.cpp netshell.rc - classfactory.c - connectmanager.c - lanconnectui.c - lanstatusui.c + classfactory.cpp + connectmanager.cpp + lanconnectui.cpp + lanstatusui.cpp From 74a51ae8885b112c953dac8b474af65033dc198d Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 20 Jan 2012 23:12:44 +0000 Subject: [PATCH 004/289] [KMTESTS] - Fix IRP handling, and some 64 bit warnings svn path=/trunk/; revision=55031 --- rostests/kmtests/kmtest_drv/kmtest_drv.c | 52 ++++++++++++++++--- .../kmtests/kmtest_drv/kmtest_standalone.c | 4 +- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/rostests/kmtests/kmtest_drv/kmtest_drv.c b/rostests/kmtests/kmtest_drv/kmtest_drv.c index d15fd2a1761..52db06e3b88 100644 --- a/rostests/kmtests/kmtest_drv/kmtest_drv.c +++ b/rostests/kmtests/kmtest_drv/kmtest_drv.c @@ -22,8 +22,13 @@ /* Prototypes */ DRIVER_INITIALIZE DriverEntry; static DRIVER_UNLOAD DriverUnload; +__drv_dispatchType(IRP_MJ_CREATE) static DRIVER_DISPATCH DriverCreate; +__drv_dispatchType(IRP_MJ_CLEANUP) +static DRIVER_DISPATCH DriverCleanup; +__drv_dispatchType(IRP_MJ_CLOSE) static DRIVER_DISPATCH DriverClose; +__drv_dispatchType(IRP_MJ_DEVICE_CONTROL) static DRIVER_DISPATCH DriverIoControl; /* Globals */ @@ -83,6 +88,7 @@ DriverEntry( DriverObject->DriverUnload = DriverUnload; DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverCreate; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DriverCleanup; DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverClose; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverIoControl; @@ -130,7 +136,7 @@ DriverUnload( /** * @name DriverCreate * - * Driver Dispatch function for CreateFile + * Driver Dispatch function for IRP_MJ_CREATE * * @param DeviceObject * Device Object @@ -166,9 +172,9 @@ DriverCreate( } /** - * @name DriverClose + * @name DriverCleanup * - * Driver Dispatch function for CloseHandle. + * Driver Dispatch function for IRP_MJ_CLEANUP * * @param DeviceObject * Device Object @@ -180,7 +186,7 @@ DriverCreate( static NTSTATUS NTAPI -DriverClose( +DriverCleanup( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { @@ -192,7 +198,7 @@ DriverClose( IoStackLocation = IoGetCurrentIrpStackLocation(Irp); - DPRINT("DriverClose. DeviceObject=%p, RequestorMode=%d, FileObject=%p, FsContext=%p, FsContext2=%p\n", + DPRINT("DriverCleanup. DeviceObject=%p, RequestorMode=%d, FileObject=%p, FsContext=%p, FsContext2=%p\n", DeviceObject, Irp->RequestorMode, IoStackLocation->FileObject, IoStackLocation->FileObject->FsContext, IoStackLocation->FileObject->FsContext2); @@ -218,10 +224,44 @@ DriverClose( return Status; } +/** + * @name DriverClose + * + * Driver Dispatch function for IRP_MJ_CLOSE + * + * @param DeviceObject + * Device Object + * @param Irp + * I/O request packet + * + * @return Status + */ +static +NTSTATUS +NTAPI +DriverClose( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + NTSTATUS Status = STATUS_SUCCESS; + + PAGED_CODE(); + + DPRINT("DriverClose. DeviceObject=%p, RequestorMode=%d\n", + DeviceObject, Irp->RequestorMode); + + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return Status; +} + /** * @name DriverIoControl * - * Driver Dispatch function for DeviceIoControl. + * Driver Dispatch function for IRP_MJ_DEVICE_CONTROL * * @param DeviceObject * Device Object diff --git a/rostests/kmtests/kmtest_drv/kmtest_standalone.c b/rostests/kmtests/kmtest_drv/kmtest_standalone.c index a8bb707b3ae..d76c4a65d32 100644 --- a/rostests/kmtests/kmtest_drv/kmtest_standalone.c +++ b/rostests/kmtests/kmtest_drv/kmtest_standalone.c @@ -320,7 +320,7 @@ DriverDispatch( IrpHandlers[i].IrpHandler != NULL) return IrpHandlers[i].IrpHandler(DeviceObject, Irp, IoStackLocation); } - + /* default handler for DeviceControl */ if (IoStackLocation->MajorFunction == IRP_MJ_DEVICE_CONTROL || IoStackLocation->MajorFunction == IRP_MJ_INTERNAL_DEVICE_CONTROL) @@ -462,7 +462,7 @@ DeviceControlHandler( { NTSTATUS Status = STATUS_SUCCESS; ULONG ControlCode = (IoStackLocation->Parameters.DeviceIoControl.IoControlCode & 0x00000FFC) >> 2; - ULONG OutLength = IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength; + SIZE_T OutLength = IoStackLocation->Parameters.DeviceIoControl.OutputBufferLength; int i; for (i = 0; i < sizeof MessageHandlers / sizeof MessageHandlers[0]; ++i) From c52fdad546b8e447b49617b42bdcb7d97b603913 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sat, 21 Jan 2012 13:55:09 +0000 Subject: [PATCH 005/289] [USER32] - Fix loading of MENUEX resources svn path=/trunk/; revision=55043 --- reactos/dll/win32/user32/windows/menu.c | 37 +++++++++++++++---------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index e30f216b895..70fb4f60ea5 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -2068,14 +2068,15 @@ static LPCSTR MENU_ParseResource( LPCSTR res, HMENU hMenu, BOOL unicode ) * Parse an extended menu resource and add items to the menu. * Return a pointer to the end of the resource. */ -static LPCSTR MENUEX_ParseResource( LPCSTR res, HMENU hMenu) +static LPCSTR MENUEX_ParseResource(LPCSTR res, HMENU hMenu) { WORD resinfo; - do { - MENUITEMINFOW mii; + MENUITEMINFOW mii; + do + { mii.cbSize = sizeof(mii); - mii.fMask = MIIM_STATE | MIIM_ID | MIIM_FTYPE; + mii.fMask = MIIM_STATE | MIIM_ID | MIIM_TYPE; mii.fType = GET_DWORD(res); res += sizeof(DWORD); mii.fState = GET_DWORD(res); @@ -2086,7 +2087,8 @@ static LPCSTR MENUEX_ParseResource( LPCSTR res, HMENU hMenu) res += sizeof(WORD); /* Align the text on a word boundary. */ res += (~((UINT_PTR)res - 1)) & 1; - mii.dwTypeData = (LPWSTR) res; + mii.dwTypeData = (LPWSTR)res; + mii.cch = strlenW(mii.dwTypeData); res += (1 + strlenW(mii.dwTypeData)) * sizeof(WCHAR); /* Align the following fields on a dword boundary. */ res += (~((UINT_PTR)res - 1)) & 3; @@ -2094,25 +2096,32 @@ static LPCSTR MENUEX_ParseResource( LPCSTR res, HMENU hMenu) TRACE("Menu item: [%08x,%08x,%04x,%04x,%S]\n", mii.fType, mii.fState, mii.wID, resinfo, mii.dwTypeData); - if (resinfo & 1) { /* Pop-up? */ - /* DWORD helpid = GET_DWORD(res); FIXME: use this. */ + if (resinfo & 1) /* Pop-up? */ + { + /* DWORD helpid = GET_DWORD(res); FIXME: use this. */ res += sizeof(DWORD); mii.hSubMenu = CreatePopupMenu(); if (!mii.hSubMenu) + { + ERR("CreatePopupMenu failed\n"); return NULL; - if (!(res = MENUEX_ParseResource(res, mii.hSubMenu))) { + } + + if (!(res = MENUEX_ParseResource(res, mii.hSubMenu))) + { + ERR("MENUEX_ParseResource failed\n"); DestroyMenu(mii.hSubMenu); return NULL; } mii.fMask |= MIIM_SUBMENU; mii.fType |= MF_POPUP; - mii.wID = (UINT) mii.hSubMenu; + mii.wID = (UINT)mii.hSubMenu; } - else if(!*mii.dwTypeData && !(mii.fType & MF_SEPARATOR)) - { + else if (!mii.dwTypeData[0]) mii.fType |= MF_SEPARATOR; - } - InsertMenuItemW(hMenu, -1, MF_BYPOSITION, &mii); + + if (!InsertMenuItemW(hMenu, -1, MF_BYPOSITION, &mii)) + ERR("InsertMenuItemW failed\n"); } while (!(resinfo & MF_END)); return res; } @@ -4807,7 +4816,7 @@ LoadMenuIndirectW(CONST MENUTEMPLATE *lpMenuTemplate) } return hMenu; default: - DbgPrint("LoadMenuIndirectW(): version %d not supported.\n", version); + ERR("Menu template version %d not supported.\n", version); return 0; } } From 0e8f6c0bf83e3113127a521b9e2fa3f4afda8c90 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 21 Jan 2012 17:19:12 +0000 Subject: [PATCH 006/289] [MSI] Sync msi.dll with Wine head svn path=/trunk/; revision=55046 --- reactos/dll/win32/msi/CMakeLists.txt | 6 +- reactos/dll/win32/msi/action.c | 3090 +++++++++++++------------- reactos/dll/win32/msi/alter.c | 11 +- reactos/dll/win32/msi/appsearch.c | 58 +- reactos/dll/win32/msi/assembly.c | 125 +- reactos/dll/win32/msi/automation.c | 858 +++---- reactos/dll/win32/msi/classes.c | 313 +-- reactos/dll/win32/msi/cond.tab.c | 10 +- reactos/dll/win32/msi/create.c | 8 +- reactos/dll/win32/msi/custom.c | 858 ++++--- reactos/dll/win32/msi/database.c | 144 +- reactos/dll/win32/msi/delete.c | 5 +- reactos/dll/win32/msi/dialog.c | 1035 ++++----- reactos/dll/win32/msi/distinct.c | 16 +- reactos/dll/win32/msi/events.c | 146 +- reactos/dll/win32/msi/files.c | 488 ++-- reactos/dll/win32/msi/font.c | 131 +- reactos/dll/win32/msi/format.c | 31 +- reactos/dll/win32/msi/handle.c | 2 + reactos/dll/win32/msi/helpers.c | 824 ------- reactos/dll/win32/msi/insert.c | 28 +- reactos/dll/win32/msi/install.c | 498 ++++- reactos/dll/win32/msi/media.c | 286 ++- reactos/dll/win32/msi/msi.c | 825 +++++-- reactos/dll/win32/msi/msi.rbuild | 7 +- reactos/dll/win32/msi/msi.spec | 14 +- reactos/dll/win32/msi/msi_main.c | 52 +- reactos/dll/win32/msi/msipriv.h | 612 ++--- reactos/dll/win32/msi/msiquery.c | 80 +- reactos/dll/win32/msi/msiserver.h | 2411 ++++++++++++++++++++ reactos/dll/win32/msi/msiserver.idl | 16 +- reactos/dll/win32/msi/package.c | 664 +++--- reactos/dll/win32/msi/patch.c | 783 +++++++ reactos/dll/win32/msi/preview.c | 184 -- reactos/dll/win32/msi/query.h | 58 +- reactos/dll/win32/msi/record.c | 79 +- reactos/dll/win32/msi/registry.c | 1079 ++++----- reactos/dll/win32/msi/regsvr.c | 663 ------ reactos/dll/win32/msi/select.c | 58 +- reactos/dll/win32/msi/sql.tab.c | 704 +++--- reactos/dll/win32/msi/sql.y | 140 +- reactos/dll/win32/msi/storages.c | 41 +- reactos/dll/win32/msi/streams.c | 51 +- reactos/dll/win32/msi/string.c | 19 +- reactos/dll/win32/msi/suminfo.c | 25 +- reactos/dll/win32/msi/table.c | 743 +++---- reactos/dll/win32/msi/tokenize.c | 34 +- reactos/dll/win32/msi/update.c | 28 +- reactos/dll/win32/msi/upgrade.c | 57 +- reactos/dll/win32/msi/where.c | 1140 +++++++--- reactos/include/psdk/msi.h | 22 +- reactos/include/psdk/msidefs.h | 6 +- reactos/include/psdk/msiquery.h | 4 + 53 files changed, 11223 insertions(+), 8347 deletions(-) delete mode 100644 reactos/dll/win32/msi/helpers.c create mode 100644 reactos/dll/win32/msi/msiserver.h create mode 100644 reactos/dll/win32/msi/patch.c delete mode 100644 reactos/dll/win32/msi/preview.c delete mode 100644 reactos/dll/win32/msi/regsvr.c diff --git a/reactos/dll/win32/msi/CMakeLists.txt b/reactos/dll/win32/msi/CMakeLists.txt index 52670a15082..0e77a085bbb 100644 --- a/reactos/dll/win32/msi/CMakeLists.txt +++ b/reactos/dll/win32/msi/CMakeLists.txt @@ -32,7 +32,6 @@ list(APPEND SOURCE font.c format.c handle.c - helpers.c insert.c install.c join.c @@ -41,10 +40,9 @@ list(APPEND SOURCE msi_main.c msiquery.c package.c - preview.c + patch.c record.c registry.c - regsvr.c script.c select.c source.c @@ -77,7 +75,7 @@ set_source_files_properties(msi.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BIN set_module_type(msi win32dll) target_link_libraries(msi uuid ${PSEH_LIB} wine) add_dependencies(msi msi_idlheader) -add_delay_importlibs(msi odbccp32) +add_delay_importlibs(msi odbccp32 crypt32 imagehlp) add_importlibs(msi advapi32 diff --git a/reactos/dll/win32/msi/action.c b/reactos/dll/win32/msi/action.c index f806f18cb34..16ac4f0e268 100644 --- a/reactos/dll/win32/msi/action.c +++ b/reactos/dll/win32/msi/action.c @@ -36,6 +36,7 @@ #include "objbase.h" #include "mscoree.h" #include "shlwapi.h" +#include "imagehlp.h" #include "wine/unicode.h" #include "winver.h" @@ -44,19 +45,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); -/* - * consts and values used - */ -static const WCHAR c_colon[] = {'C',':','\\',0}; - static const WCHAR szCreateFolders[] = {'C','r','e','a','t','e','F','o','l','d','e','r','s',0}; static const WCHAR szCostFinalize[] = {'C','o','s','t','F','i','n','a','l','i','z','e',0}; static const WCHAR szWriteRegistryValues[] = {'W','r','i','t','e','R','e','g','i','s','t','r','y','V','a','l','u','e','s',0}; -static const WCHAR szCostInitialize[] = - {'C','o','s','t','I','n','i','t','i','a','l','i','z','e',0}; static const WCHAR szFileCost[] = {'F','i','l','e','C','o','s','t',0}; static const WCHAR szInstallInitialize[] = @@ -115,8 +109,6 @@ static const WCHAR szInstallODBC[] = {'I','n','s','t','a','l','l','O','D','B','C',0}; static const WCHAR szInstallServices[] = {'I','n','s','t','a','l','l','S','e','r','v','i','c','e','s',0}; -static const WCHAR szPatchFiles[] = - {'P','a','t','c','h','F','i','l','e','s',0}; static const WCHAR szPublishComponents[] = {'P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t','s',0}; static const WCHAR szRegisterComPlus[] = @@ -233,10 +225,11 @@ static int parse_prop( const WCHAR *str, WCHAR *value, int *quotes ) if (!count) goto done; in_quotes = 1; ignore = 1; + len++; break; case '"': state = state_quote; - if (in_quotes) count--; + if (in_quotes && p[1] != '\"') count--; else count++; break; default: @@ -260,6 +253,7 @@ static int parse_prop( const WCHAR *str, WCHAR *value, int *quotes ) state = state_whitespace; if (!count) goto done; in_quotes = 1; + len++; break; default: if (!count) in_quotes = 0; @@ -273,13 +267,14 @@ static int parse_prop( const WCHAR *str, WCHAR *value, int *quotes ) switch (*p) { case '"': - if (in_quotes) count--; + if (in_quotes && p[1] != '\"') count--; else count++; break; case ' ': state = state_whitespace; - if (!count || !len) goto done; + if (!count || (count > 1 && !len)) goto done; in_quotes = 1; + len++; break; default: state = state_token; @@ -319,7 +314,7 @@ UINT msi_parse_command_line( MSIPACKAGE *package, LPCWSTR szCommandLine, BOOL preserve_case ) { LPCWSTR ptr, ptr2; - int quotes; + int num_quotes; DWORD len; WCHAR *prop, *val; UINT r; @@ -347,10 +342,10 @@ UINT msi_parse_command_line( MSIPACKAGE *package, LPCWSTR szCommandLine, ptr2++; while (*ptr2 == ' ') ptr2++; - quotes = 0; + num_quotes = 0; val = msi_alloc( (strlenW( ptr2 ) + 1) * sizeof(WCHAR) ); - len = parse_prop( ptr2, val, "es ); - if (quotes % 2) + len = parse_prop( ptr2, val, &num_quotes ); + if (num_quotes % 2) { WARN("unbalanced quotes\n"); msi_free( val ); @@ -361,7 +356,7 @@ UINT msi_parse_command_line( MSIPACKAGE *package, LPCWSTR szCommandLine, TRACE("Found commandline property %s = %s\n", debugstr_w(prop), debugstr_w(val)); r = msi_set_property( package->db, prop, val ); - if (r == ERROR_SUCCESS && !strcmpW( prop, cszSourceDir )) + if (r == ERROR_SUCCESS && !strcmpW( prop, szSourceDir )) msi_reset_folders( package, TRUE ); msi_free( val ); @@ -409,406 +404,22 @@ WCHAR **msi_split_string( const WCHAR *str, WCHAR sep ) return ret; } -static UINT msi_check_transform_applicable( MSIPACKAGE *package, IStorage *patch ) -{ - static const WCHAR szSystemLanguageID[] = - { 'S','y','s','t','e','m','L','a','n','g','u','a','g','e','I','D',0 }; - - LPWSTR prod_code, patch_product, langid = NULL, template = NULL; - UINT ret = ERROR_FUNCTION_FAILED; - - prod_code = msi_dup_property( package->db, szProductCode ); - patch_product = msi_get_suminfo_product( patch ); - - TRACE("db = %s patch = %s\n", debugstr_w(prod_code), debugstr_w(patch_product)); - - if ( strstrW( patch_product, prod_code ) ) - { - MSISUMMARYINFO *si; - const WCHAR *p; - - si = MSI_GetSummaryInformationW( patch, 0 ); - if (!si) - { - ERR("no summary information!\n"); - goto end; - } - - template = msi_suminfo_dup_string( si, PID_TEMPLATE ); - if (!template) - { - ERR("no template property!\n"); - msiobj_release( &si->hdr ); - goto end; - } - - if (!template[0]) - { - ret = ERROR_SUCCESS; - msiobj_release( &si->hdr ); - goto end; - } - - langid = msi_dup_property( package->db, szSystemLanguageID ); - if (!langid) - { - msiobj_release( &si->hdr ); - goto end; - } - - p = strchrW( template, ';' ); - if (p && (!strcmpW( p + 1, langid ) || !strcmpW( p + 1, szZero ))) - { - TRACE("applicable transform\n"); - ret = ERROR_SUCCESS; - } - - /* FIXME: check platform */ - - msiobj_release( &si->hdr ); - } - -end: - msi_free( patch_product ); - msi_free( prod_code ); - msi_free( template ); - msi_free( langid ); - - return ret; -} - -static UINT msi_apply_substorage_transform( MSIPACKAGE *package, - MSIDATABASE *patch_db, LPCWSTR name ) -{ - UINT ret = ERROR_FUNCTION_FAILED; - IStorage *stg = NULL; - HRESULT r; - - TRACE("%p %s\n", package, debugstr_w(name) ); - - if (*name++ != ':') - { - ERR("expected a colon in %s\n", debugstr_w(name)); - return ERROR_FUNCTION_FAILED; - } - - r = IStorage_OpenStorage( patch_db->storage, name, NULL, STGM_SHARE_EXCLUSIVE, NULL, 0, &stg ); - if (SUCCEEDED(r)) - { - ret = msi_check_transform_applicable( package, stg ); - if (ret == ERROR_SUCCESS) - msi_table_apply_transform( package->db, stg ); - else - TRACE("substorage transform %s wasn't applicable\n", debugstr_w(name)); - IStorage_Release( stg ); - } - else - ERR("failed to open substorage %s\n", debugstr_w(name)); - - return ERROR_SUCCESS; -} - -UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si ) -{ - LPWSTR guid_list, *guids, product_code; - UINT i, ret = ERROR_FUNCTION_FAILED; - - product_code = msi_dup_property( package->db, szProductCode ); - if (!product_code) - { - /* FIXME: the property ProductCode should be written into the DB somewhere */ - ERR("no product code to check\n"); - return ERROR_SUCCESS; - } - - guid_list = msi_suminfo_dup_string( si, PID_TEMPLATE ); - guids = msi_split_string( guid_list, ';' ); - for ( i = 0; guids[i] && ret != ERROR_SUCCESS; i++ ) - { - if (!strcmpW( guids[i], product_code )) - ret = ERROR_SUCCESS; - } - msi_free( guids ); - msi_free( guid_list ); - msi_free( product_code ); - - return ret; -} - -static UINT msi_set_media_source_prop(MSIPACKAGE *package) -{ - MSIQUERY *view; - MSIRECORD *rec = NULL; - LPWSTR patch; - LPCWSTR prop; - UINT r; - - static const WCHAR query[] = {'S','E','L','E','C','T',' ', - '`','S','o','u','r','c','e','`',' ','F','R','O','M',' ', - '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ', - '`','S','o','u','r','c','e','`',' ','I','S',' ', - 'N','O','T',' ','N','U','L','L',0}; - - r = MSI_DatabaseOpenViewW(package->db, query, &view); - if (r != ERROR_SUCCESS) - return r; - - r = MSI_ViewExecute(view, 0); - if (r != ERROR_SUCCESS) - goto done; - - if (MSI_ViewFetch(view, &rec) == ERROR_SUCCESS) - { - prop = MSI_RecordGetString(rec, 1); - patch = msi_dup_property(package->db, szPatch); - msi_set_property(package->db, prop, patch); - msi_free(patch); - } - -done: - if (rec) msiobj_release(&rec->hdr); - msiobj_release(&view->hdr); - - return r; -} - -UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch ) -{ - MSIPATCHINFO *pi; - UINT r = ERROR_SUCCESS; - WCHAR *p; - - pi = msi_alloc_zero( sizeof(MSIPATCHINFO) ); - if (!pi) - return ERROR_OUTOFMEMORY; - - pi->patchcode = msi_suminfo_dup_string( si, PID_REVNUMBER ); - if (!pi->patchcode) - { - msi_free( pi ); - return ERROR_OUTOFMEMORY; - } - - p = pi->patchcode; - if (*p != '{') - { - msi_free( pi->patchcode ); - msi_free( pi ); - return ERROR_PATCH_PACKAGE_INVALID; - } - - p = strchrW( p + 1, '}' ); - if (!p) - { - msi_free( pi->patchcode ); - msi_free( pi ); - return ERROR_PATCH_PACKAGE_INVALID; - } - - if (p[1]) - { - FIXME("patch obsoletes %s\n", debugstr_w(p + 1)); - p[1] = 0; - } - - TRACE("patch code %s\n", debugstr_w(pi->patchcode)); - - pi->transforms = msi_suminfo_dup_string( si, PID_LASTAUTHOR ); - if (!pi->transforms) - { - msi_free( pi->patchcode ); - msi_free( pi ); - return ERROR_OUTOFMEMORY; - } - - *patch = pi; - return r; -} - -UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIPATCHINFO *patch ) -{ - UINT i, r = ERROR_SUCCESS; - WCHAR **substorage; - - /* apply substorage transforms */ - substorage = msi_split_string( patch->transforms, ';' ); - for (i = 0; substorage && substorage[i] && r == ERROR_SUCCESS; i++) - r = msi_apply_substorage_transform( package, patch_db, substorage[i] ); - - msi_free( substorage ); - if (r != ERROR_SUCCESS) - return r; - - msi_set_media_source_prop( package ); - - /* - * There might be a CAB file in the patch package, - * so append it to the list of storages to search for streams. - */ - append_storage_to_db( package->db, patch_db->storage ); - - patch->state = MSIPATCHSTATE_APPLIED; - list_add_tail( &package->patches, &patch->entry ); - return ERROR_SUCCESS; -} - -static UINT msi_apply_patch_package( MSIPACKAGE *package, LPCWSTR file ) -{ - static const WCHAR dotmsp[] = {'.','m','s','p',0}; - MSIDATABASE *patch_db = NULL; - WCHAR localfile[MAX_PATH]; - MSISUMMARYINFO *si; - MSIPATCHINFO *patch = NULL; - UINT r = ERROR_SUCCESS; - - TRACE("%p %s\n", package, debugstr_w( file ) ); - - r = MSI_OpenDatabaseW( file, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &patch_db ); - if ( r != ERROR_SUCCESS ) - { - ERR("failed to open patch collection %s\n", debugstr_w( file ) ); - return r; - } - - si = MSI_GetSummaryInformationW( patch_db->storage, 0 ); - if (!si) - { - msiobj_release( &patch_db->hdr ); - return ERROR_FUNCTION_FAILED; - } - - r = msi_check_patch_applicable( package, si ); - if (r != ERROR_SUCCESS) - { - TRACE("patch not applicable\n"); - r = ERROR_SUCCESS; - goto done; - } - - r = msi_parse_patch_summary( si, &patch ); - if ( r != ERROR_SUCCESS ) - goto done; - - r = msi_get_local_package_name( localfile, dotmsp ); - if ( r != ERROR_SUCCESS ) - goto done; - - TRACE("copying to local package %s\n", debugstr_w(localfile)); - - if (!CopyFileW( file, localfile, FALSE )) - { - ERR("Unable to copy package (%s -> %s) (error %u)\n", - debugstr_w(file), debugstr_w(localfile), GetLastError()); - r = GetLastError(); - goto done; - } - patch->localfile = strdupW( localfile ); - - r = msi_apply_patch_db( package, patch_db, patch ); - if ( r != ERROR_SUCCESS ) - WARN("patch failed to apply %u\n", r); - -done: - msiobj_release( &si->hdr ); - msiobj_release( &patch_db->hdr ); - if (patch && r != ERROR_SUCCESS) - { - if (patch->localfile) - DeleteFileW( patch->localfile ); - - msi_free( patch->patchcode ); - msi_free( patch->transforms ); - msi_free( patch->localfile ); - msi_free( patch ); - } - return r; -} - -/* get the PATCH property, and apply all the patches it specifies */ -static UINT msi_apply_patches( MSIPACKAGE *package ) -{ - LPWSTR patch_list, *patches; - UINT i, r = ERROR_SUCCESS; - - patch_list = msi_dup_property( package->db, szPatch ); - - TRACE("patches to be applied: %s\n", debugstr_w( patch_list ) ); - - patches = msi_split_string( patch_list, ';' ); - for( i=0; patches && patches[i] && r == ERROR_SUCCESS; i++ ) - r = msi_apply_patch_package( package, patches[i] ); - - msi_free( patches ); - msi_free( patch_list ); - - return r; -} - -static UINT msi_apply_transforms( MSIPACKAGE *package ) -{ - static const WCHAR szTransforms[] = { - 'T','R','A','N','S','F','O','R','M','S',0 }; - LPWSTR xform_list, *xforms; - UINT i, r = ERROR_SUCCESS; - - xform_list = msi_dup_property( package->db, szTransforms ); - xforms = msi_split_string( xform_list, ';' ); - - for( i=0; xforms && xforms[i] && r == ERROR_SUCCESS; i++ ) - { - if (xforms[i][0] == ':') - r = msi_apply_substorage_transform( package, package->db, xforms[i] ); - else - { - WCHAR *transform; - - if (!PathIsRelativeW( xforms[i] )) transform = xforms[i]; - else - { - WCHAR *p = strrchrW( package->PackagePath, '\\' ); - DWORD len = p - package->PackagePath + 1; - - if (!(transform = msi_alloc( (len + strlenW( xforms[i] ) + 1) * sizeof(WCHAR)) )) - { - msi_free( xforms ); - msi_free( xform_list ); - return ERROR_OUTOFMEMORY; - } - memcpy( transform, package->PackagePath, len * sizeof(WCHAR) ); - memcpy( transform + len, xforms[i], (strlenW( xforms[i] ) + 1) * sizeof(WCHAR) ); - } - r = MSI_DatabaseApplyTransformW( package->db, transform, 0 ); - if (transform != xforms[i]) msi_free( transform ); - } - } - - msi_free( xforms ); - msi_free( xform_list ); - - return r; -} - static BOOL ui_sequence_exists( MSIPACKAGE *package ) { + static const WCHAR query [] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','I','n','s','t','a','l','l','U','I','S','e','q','u','e','n','c','e','`',' ', + 'W','H','E','R','E',' ','`','S','e','q','u','e','n','c','e','`',' ','>',' ','0',' ', + 'O','R','D','E','R',' ','B','Y',' ','`','S','e','q','u','e','n','c','e','`',0}; MSIQUERY *view; UINT rc; - static const WCHAR ExecSeqQuery [] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','I','n','s','t','a','l','l', - 'U','I','S','e','q','u','e','n','c','e','`', - ' ','W','H','E','R','E',' ', - '`','S','e','q','u','e','n','c','e','`',' ', - '>',' ','0',' ','O','R','D','E','R',' ','B','Y',' ', - '`','S','e','q','u','e','n','c','e','`',0}; - - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc == ERROR_SUCCESS) { msiobj_release(&view->hdr); return TRUE; } - return FALSE; } @@ -850,18 +461,18 @@ UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace) msi_free( db ); } - check = msi_dup_property( package->db, cszSourceDir ); + check = msi_dup_property( package->db, szSourceDir ); if (!check || replace) { - UINT r = msi_set_property( package->db, cszSourceDir, source ); + UINT r = msi_set_property( package->db, szSourceDir, source ); if (r == ERROR_SUCCESS) msi_reset_folders( package, TRUE ); } msi_free( check ); - check = msi_dup_property( package->db, cszSOURCEDIR ); + check = msi_dup_property( package->db, szSOURCEDIR ); if (!check || replace) - msi_set_property( package->db, cszSOURCEDIR, source ); + msi_set_property( package->db, szSOURCEDIR, source ); msi_free( check ); msi_free( source ); @@ -877,14 +488,15 @@ static BOOL needs_ui_sequence(MSIPACKAGE *package) UINT msi_set_context(MSIPACKAGE *package) { - int num; - - package->Context = MSIINSTALLCONTEXT_USERUNMANAGED; - - num = msi_get_property_int(package->db, szAllUsers, 0); - if (num == 1 || num == 2) - package->Context = MSIINSTALLCONTEXT_MACHINE; - + UINT r = msi_locate_product( package->ProductCode, &package->Context ); + if (r != ERROR_SUCCESS) + { + int num = msi_get_property_int( package->db, szAllUsers, 0 ); + if (num == 1 || num == 2) + package->Context = MSIINSTALLCONTEXT_MACHINE; + else + package->Context = MSIINSTALLCONTEXT_USERUNMANAGED; + } return ERROR_SUCCESS; } @@ -912,9 +524,9 @@ static UINT ITERATE_Actions(MSIRECORD *row, LPVOID param) } if (needs_ui_sequence(package)) - rc = ACTION_PerformUIAction(package, action, -1); + rc = ACTION_PerformUIAction(package, action, SCRIPT_NONE); else - rc = ACTION_PerformAction(package, action, -1); + rc = ACTION_PerformAction(package, action, SCRIPT_NONE); msi_dialog_check_messages( NULL ); @@ -930,49 +542,44 @@ static UINT ITERATE_Actions(MSIRECORD *row, LPVOID param) return rc; } -UINT MSI_Sequence( MSIPACKAGE *package, LPCWSTR szTable, INT iSequenceMode ) +UINT MSI_Sequence( MSIPACKAGE *package, LPCWSTR table ) { - MSIQUERY * view; - UINT r; - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','%','s','`', - ' ','W','H','E','R','E',' ', - '`','S','e','q','u','e','n','c','e','`',' ', + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','%','s','`', + ' ','W','H','E','R','E',' ','`','S','e','q','u','e','n','c','e','`',' ', '>',' ','0',' ','O','R','D','E','R',' ','B','Y',' ', '`','S','e','q','u','e','n','c','e','`',0}; + MSIQUERY *view; + UINT r; - TRACE("%p %s %i\n", package, debugstr_w(szTable), iSequenceMode ); + TRACE("%p %s\n", package, debugstr_w(table)); - r = MSI_OpenQuery( package->db, &view, query, szTable ); + r = MSI_OpenQuery( package->db, &view, query, table ); if (r == ERROR_SUCCESS) { r = MSI_IterateRecords( view, NULL, ITERATE_Actions, package ); msiobj_release(&view->hdr); } - return r; } static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package, BOOL UIran) { - MSIQUERY * view; - UINT rc; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ', - '`','I','n','s','t','a','l','l','E','x','e','c','u','t','e', - 'S','e','q','u','e','n','c','e','`',' ', 'W','H','E','R','E',' ', - '`','S','e','q','u','e','n','c','e','`',' ', '>',' ','%','i',' ', - 'O','R','D','E','R',' ', 'B','Y',' ', - '`','S','e','q','u','e','n','c','e','`',0 }; - static const WCHAR IVQuery[] = - {'S','E','L','E','C','T',' ','`','S','e','q','u','e','n','c','e','`', - ' ', 'F','R','O','M',' ','`','I','n','s','t','a','l','l', - 'E','x','e','c','u','t','e','S','e','q','u','e','n','c','e','`',' ', - 'W','H','E','R','E',' ','`','A','c','t','i','o','n','`',' ','=', - ' ','\'', 'I','n','s','t','a','l','l', - 'V','a','l','i','d','a','t','e','\'', 0}; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ', + '`','I','n','s','t','a','l','l','E','x','e','c','u','t','e', + 'S','e','q','u','e','n','c','e','`',' ', 'W','H','E','R','E',' ', + '`','S','e','q','u','e','n','c','e','`',' ', '>',' ','%','i',' ', + 'O','R','D','E','R',' ', 'B','Y',' ','`','S','e','q','u','e','n','c','e','`',0}; + static const WCHAR query_validate[] = { + 'S','E','L','E','C','T',' ','`','S','e','q','u','e','n','c','e','`', + ' ', 'F','R','O','M',' ','`','I','n','s','t','a','l','l', + 'E','x','e','c','u','t','e','S','e','q','u','e','n','c','e','`',' ', + 'W','H','E','R','E',' ','`','A','c','t','i','o','n','`',' ','=', + ' ','\'', 'I','n','s','t','a','l','l','V','a','l','i','d','a','t','e','\'',0}; + MSIQUERY *view; INT seq = 0; + UINT rc; if (package->script->ExecuteSequenceRun) { @@ -985,49 +592,40 @@ static UINT ACTION_ProcessExecSequence(MSIPACKAGE *package, BOOL UIran) /* get the sequence number */ if (UIran) { - MSIRECORD *row = MSI_QueryGetRecord(package->db, IVQuery); - if( !row ) - return ERROR_FUNCTION_FAILED; + MSIRECORD *row = MSI_QueryGetRecord(package->db, query_validate); + if (!row) return ERROR_FUNCTION_FAILED; seq = MSI_RecordGetInteger(row,1); msiobj_release(&row->hdr); } - - rc = MSI_OpenQuery(package->db, &view, ExecSeqQuery, seq); + rc = MSI_OpenQuery(package->db, &view, query, seq); if (rc == ERROR_SUCCESS) { TRACE("Running the actions\n"); - msi_set_property(package->db, cszSourceDir, NULL); - + msi_set_property(package->db, szSourceDir, NULL); rc = MSI_IterateRecords(view, NULL, ITERATE_Actions, package); msiobj_release(&view->hdr); } - return rc; } static UINT ACTION_ProcessUISequence(MSIPACKAGE *package) { - MSIQUERY * view; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','I','n','s','t','a','l','l','U','I','S','e','q','u','e','n','c','e','`',' ', + 'W','H','E','R','E',' ','`','S','e','q','u','e','n','c','e','`',' ','>',' ','0',' ', + 'O','R','D','E','R',' ','B','Y',' ','`','S','e','q','u','e','n','c','e','`',0}; + MSIQUERY *view; UINT rc; - static const WCHAR ExecSeqQuery [] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','I','n','s','t','a','l','l', - 'U','I','S','e','q','u','e','n','c','e','`', - ' ','W','H','E','R','E',' ', - '`','S','e','q','u','e','n','c','e','`',' ', - '>',' ','0',' ','O','R','D','E','R',' ','B','Y',' ', - '`','S','e','q','u','e','n','c','e','`',0}; - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc == ERROR_SUCCESS) { TRACE("Running the actions\n"); - rc = MSI_IterateRecords(view, NULL, ITERATE_Actions, package); msiobj_release(&view->hdr); } - return rc; } @@ -1050,15 +648,177 @@ static BOOL ACTION_HandleCustomAction( MSIPACKAGE* package, LPCWSTR action, return ret; } +MSICOMPONENT *msi_get_loaded_component( MSIPACKAGE *package, const WCHAR *Component ) +{ + MSICOMPONENT *comp; + + LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry ) + { + if (!strcmpW( Component, comp->Component )) return comp; + } + return NULL; +} + +MSIFEATURE *msi_get_loaded_feature(MSIPACKAGE* package, const WCHAR *Feature ) +{ + MSIFEATURE *feature; + + LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) + { + if (!strcmpW( Feature, feature->Feature )) return feature; + } + return NULL; +} + +MSIFILE *msi_get_loaded_file( MSIPACKAGE *package, const WCHAR *key ) +{ + MSIFILE *file; + + LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry ) + { + if (!strcmpW( key, file->File )) return file; + } + return NULL; +} + +MSIFILEPATCH *msi_get_loaded_filepatch( MSIPACKAGE *package, const WCHAR *key ) +{ + MSIFILEPATCH *patch; + + /* FIXME: There might be more than one patch */ + LIST_FOR_EACH_ENTRY( patch, &package->filepatches, MSIFILEPATCH, entry ) + { + if (!strcmpW( key, patch->File->File )) return patch; + } + return NULL; +} + +MSIFOLDER *msi_get_loaded_folder( MSIPACKAGE *package, const WCHAR *dir ) +{ + MSIFOLDER *folder; + + LIST_FOR_EACH_ENTRY( folder, &package->folders, MSIFOLDER, entry ) + { + if (!strcmpW( dir, folder->Directory )) return folder; + } + return NULL; +} + /* - * Actual Action Handlers + * Recursively create all directories in the path. + * shamelessly stolen from setupapi/queue.c */ +BOOL msi_create_full_path( const WCHAR *path ) +{ + BOOL ret = TRUE; + WCHAR *new_path; + int len; + + new_path = msi_alloc( (strlenW( path ) + 1) * sizeof(WCHAR) ); + strcpyW( new_path, path ); + + while ((len = strlenW( new_path )) && new_path[len - 1] == '\\') + new_path[len - 1] = 0; + + while (!CreateDirectoryW( new_path, NULL )) + { + WCHAR *slash; + DWORD last_error = GetLastError(); + if (last_error == ERROR_ALREADY_EXISTS) break; + if (last_error != ERROR_PATH_NOT_FOUND) + { + ret = FALSE; + break; + } + if (!(slash = strrchrW( new_path, '\\' ))) + { + ret = FALSE; + break; + } + len = slash - new_path; + new_path[len] = 0; + if (!msi_create_full_path( new_path )) + { + ret = FALSE; + break; + } + new_path[len] = '\\'; + } + msi_free( new_path ); + return ret; +} + +void msi_ui_progress( MSIPACKAGE *package, int a, int b, int c, int d ) +{ + MSIRECORD *row; + + row = MSI_CreateRecord( 4 ); + MSI_RecordSetInteger( row, 1, a ); + MSI_RecordSetInteger( row, 2, b ); + MSI_RecordSetInteger( row, 3, c ); + MSI_RecordSetInteger( row, 4, d ); + MSI_ProcessMessage( package, INSTALLMESSAGE_PROGRESS, row ); + msiobj_release( &row->hdr ); + + msi_dialog_check_messages( NULL ); +} + +void msi_ui_actiondata( MSIPACKAGE *package, const WCHAR *action, MSIRECORD *record ) +{ + static const WCHAR query[] = + {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','A','c','t','i','o', 'n','T','e','x','t','`',' ', + 'W','H','E','R','E',' ', '`','A','c','t','i','o','n','`',' ','=',' ','\'','%','s','\'',0}; + WCHAR message[1024]; + MSIRECORD *row = 0; + DWORD size; + + if (!package->LastAction || strcmpW( package->LastAction, action )) + { + if (!(row = MSI_QueryGetRecord( package->db, query, action ))) return; + + if (MSI_RecordIsNull( row, 3 )) + { + msiobj_release( &row->hdr ); + return; + } + /* update the cached action format */ + msi_free( package->ActionFormat ); + package->ActionFormat = msi_dup_record_field( row, 3 ); + msi_free( package->LastAction ); + package->LastAction = strdupW( action ); + msiobj_release( &row->hdr ); + } + size = 1024; + MSI_RecordSetStringW( record, 0, package->ActionFormat ); + MSI_FormatRecordW( package, record, message, &size ); + row = MSI_CreateRecord( 1 ); + MSI_RecordSetStringW( row, 1, message ); + MSI_ProcessMessage( package, INSTALLMESSAGE_ACTIONDATA, row ); + msiobj_release( &row->hdr ); +} + +INSTALLSTATE msi_get_component_action( MSIPACKAGE *package, MSICOMPONENT *comp ) +{ + if (!comp->Enabled) + { + TRACE("component is disabled: %s\n", debugstr_w(comp->Component)); + return INSTALLSTATE_UNKNOWN; + } + if (package->need_rollback) return comp->Installed; + return comp->ActionRequest; +} + +INSTALLSTATE msi_get_feature_action( MSIPACKAGE *package, MSIFEATURE *feature ) +{ + if (package->need_rollback) return feature->Installed; + return feature->ActionRequest; +} static UINT ITERATE_CreateFolders(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; - LPCWSTR dir, component; - LPWSTR full_path; + LPCWSTR dir, component, full_path; MSIRECORD *uirow; MSIFOLDER *folder; MSICOMPONENT *comp; @@ -1067,24 +827,17 @@ static UINT ITERATE_CreateFolders(MSIRECORD *row, LPVOID param) if (!component) return ERROR_SUCCESS; - comp = get_loaded_component(package, component); + comp = msi_get_loaded_component(package, component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation: %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_LOCAL; - dir = MSI_RecordGetString(row,1); if (!dir) { @@ -1094,51 +847,44 @@ static UINT ITERATE_CreateFolders(MSIRECORD *row, LPVOID param) uirow = MSI_CreateRecord(1); MSI_RecordSetStringW(uirow, 1, dir); - ui_actiondata(package, szCreateFolders, uirow); + msi_ui_actiondata(package, szCreateFolders, uirow); msiobj_release(&uirow->hdr); - full_path = resolve_target_folder( package, dir, FALSE, TRUE, &folder ); + full_path = msi_get_target_folder( package, dir ); if (!full_path) { - ERR("Unable to resolve folder id %s\n",debugstr_w(dir)); + ERR("Unable to retrieve folder %s\n", debugstr_w(dir)); return ERROR_SUCCESS; } + TRACE("folder is %s\n", debugstr_w(full_path)); - TRACE("Folder is %s\n",debugstr_w(full_path)); - - if (folder->State == 0) - create_full_pathW(full_path); - - folder->State = 3; - - msi_free(full_path); + folder = msi_get_loaded_folder( package, dir ); + if (folder->State == FOLDER_STATE_UNINITIALIZED) msi_create_full_path( full_path ); + folder->State = FOLDER_STATE_CREATED; return ERROR_SUCCESS; } static UINT ACTION_CreateFolders(MSIPACKAGE *package) { - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','C','r','e','a','t','e','F','o','l','d','e','r','`',0}; - UINT rc; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','C','r','e','a','t','e','F','o','l','d','e','r','`',0}; MSIQUERY *view; + UINT rc; - /* create all the empty folders specified in the CreateFolder table */ - rc = MSI_DatabaseOpenViewW(package->db, query, &view ); + rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, ITERATE_CreateFolders, package); msiobj_release(&view->hdr); - return rc; } static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param ) { MSIPACKAGE *package = param; - LPCWSTR dir, component; - LPWSTR full_path; + LPCWSTR dir, component, full_path; MSIRECORD *uirow; MSIFOLDER *folder; MSICOMPONENT *comp; @@ -1147,24 +893,17 @@ static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param ) if (!component) return ERROR_SUCCESS; - comp = get_loaded_component(package, component); + comp = msi_get_loaded_component(package, component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_ABSENT) - { - TRACE("Component not scheduled for removal: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_ABSENT; - dir = MSI_RecordGetString( row, 1 ); if (!dir) { @@ -1172,33 +911,30 @@ static UINT ITERATE_RemoveFolders( MSIRECORD *row, LPVOID param ) return ERROR_SUCCESS; } - full_path = resolve_target_folder( package, dir, FALSE, TRUE, &folder ); + full_path = msi_get_target_folder( package, dir ); if (!full_path) { - ERR("Unable to resolve folder id %s\n", debugstr_w(dir)); + ERR("Unable to resolve folder %s\n", debugstr_w(dir)); return ERROR_SUCCESS; } - TRACE("folder is %s\n", debugstr_w(full_path)); uirow = MSI_CreateRecord( 1 ); MSI_RecordSetStringW( uirow, 1, dir ); - ui_actiondata( package, szRemoveFolders, uirow ); + msi_ui_actiondata( package, szRemoveFolders, uirow ); msiobj_release( &uirow->hdr ); RemoveDirectoryW( full_path ); - folder->State = 0; - - msi_free( full_path ); + folder = msi_get_loaded_folder( package, dir ); + folder->State = FOLDER_STATE_REMOVED; return ERROR_SUCCESS; } static UINT ACTION_RemoveFolders( MSIPACKAGE *package ) { - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','C','r','e','a','t','e','F','o','l','d','e','r','`',0}; - + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','C','r','e','a','t','e','F','o','l','d','e','r','`',0}; MSIQUERY *view; UINT rc; @@ -1208,7 +944,6 @@ static UINT ACTION_RemoveFolders( MSIPACKAGE *package ) rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveFolders, package ); msiobj_release( &view->hdr ); - return rc; } @@ -1238,15 +973,15 @@ static UINT load_component( MSIRECORD *row, LPVOID param ) comp->Action = INSTALLSTATE_UNKNOWN; comp->ActionRequest = INSTALLSTATE_UNKNOWN; - comp->assembly = load_assembly( package, comp ); + comp->assembly = msi_load_assembly( package, comp ); return ERROR_SUCCESS; } -static UINT load_all_components( MSIPACKAGE *package ) +UINT msi_load_all_components( MSIPACKAGE *package ) { static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ','F','R', 'O','M',' ', - '`','C','o','m','p','o','n','e','n','t','`',0 }; + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','C','o','m','p','o','n','e','n','t','`',0}; MSIQUERY *view; UINT r; @@ -1257,8 +992,16 @@ static UINT load_all_components( MSIPACKAGE *package ) if (r != ERROR_SUCCESS) return r; + if (!msi_init_assembly_caches( package )) + { + ERR("can't initialize assembly caches\n"); + msiobj_release( &view->hdr ); + return ERROR_FUNCTION_FAILED; + } + r = MSI_IterateRecords(view, NULL, load_component, package); msiobj_release(&view->hdr); + msi_destroy_assembly_caches( package ); return r; } @@ -1302,49 +1045,30 @@ static UINT iterate_load_featurecomponents(MSIRECORD *row, LPVOID param) component = MSI_RecordGetString(row,1); /* check to see if the component is already loaded */ - comp = get_loaded_component( ilfs->package, component ); + comp = msi_get_loaded_component( ilfs->package, component ); if (!comp) { - ERR("unknown component %s\n", debugstr_w(component)); - return ERROR_FUNCTION_FAILED; + WARN("ignoring unknown component %s\n", debugstr_w(component)); + return ERROR_SUCCESS; } - add_feature_component( ilfs->feature, comp ); comp->Enabled = TRUE; return ERROR_SUCCESS; } -static MSIFEATURE *find_feature_by_name( MSIPACKAGE *package, LPCWSTR name ) -{ - MSIFEATURE *feature; - - if ( !name ) - return NULL; - - LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) - { - if ( !strcmpW( feature->Feature, name ) ) - return feature; - } - - return NULL; -} - static UINT load_feature(MSIRECORD * row, LPVOID param) { - MSIPACKAGE* package = param; - MSIFEATURE* feature; - static const WCHAR Query1[] = - {'S','E','L','E','C','T',' ', - '`','C','o','m','p','o','n','e','n','t','_','`', + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','`','C','o','m','p','o','n','e','n','t','_','`', ' ','F','R','O','M',' ','`','F','e','a','t','u','r','e', - 'C','o','m','p','o','n','e','n','t','s','`',' ', - 'W','H','E','R','E',' ', + 'C','o','m','p','o','n','e','n','t','s','`',' ','W','H','E','R','E',' ', '`','F','e', 'a','t','u','r','e','_','`',' ','=','\'','%','s','\'',0}; - MSIQUERY * view; - UINT rc; + MSIPACKAGE *package = param; + MSIFEATURE *feature; + MSIQUERY *view; _ilfs ilfs; + UINT rc; /* fill in the data */ @@ -1378,32 +1102,31 @@ static UINT load_feature(MSIRECORD * row, LPVOID param) /* load feature components */ - rc = MSI_OpenQuery( package->db, &view, Query1, feature->Feature ); + rc = MSI_OpenQuery( package->db, &view, query, feature->Feature ); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; ilfs.package = package; ilfs.feature = feature; - MSI_IterateRecords(view, NULL, iterate_load_featurecomponents , &ilfs); + rc = MSI_IterateRecords(view, NULL, iterate_load_featurecomponents , &ilfs); msiobj_release(&view->hdr); - - return ERROR_SUCCESS; + return rc; } static UINT find_feature_children(MSIRECORD * row, LPVOID param) { - MSIPACKAGE* package = param; + MSIPACKAGE *package = param; MSIFEATURE *parent, *child; - child = find_feature_by_name( package, MSI_RecordGetString( row, 1 ) ); + child = msi_get_loaded_feature( package, MSI_RecordGetString( row, 1 ) ); if (!child) return ERROR_FUNCTION_FAILED; if (!child->Feature_Parent) return ERROR_SUCCESS; - parent = find_feature_by_name( package, child->Feature_Parent ); + parent = msi_get_loaded_feature( package, child->Feature_Parent ); if (!parent) return ERROR_FUNCTION_FAILED; @@ -1411,12 +1134,12 @@ static UINT find_feature_children(MSIRECORD * row, LPVOID param) return ERROR_SUCCESS; } -static UINT load_all_features( MSIPACKAGE *package ) +UINT msi_load_all_features( MSIPACKAGE *package ) { static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ', - '`','F','e','a','t','u','r','e','`',' ','O','R','D','E','R', - ' ','B','Y',' ','`','D','i','s','p','l','a','y','`',0}; + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','F','e','a','t','u','r','e','`',' ','O','R','D','E','R',' ','B','Y',' ', + '`','D','i','s','p','l','a','y','`',0}; MSIQUERY *view; UINT r; @@ -1429,11 +1152,12 @@ static UINT load_all_features( MSIPACKAGE *package ) r = MSI_IterateRecords( view, NULL, load_feature, package ); if (r != ERROR_SUCCESS) + { + msiobj_release( &view->hdr ); return r; - + } r = MSI_IterateRecords( view, NULL, find_feature_children, package ); msiobj_release( &view->hdr ); - return r; } @@ -1519,7 +1243,7 @@ static UINT load_file(MSIRECORD *row, LPVOID param) file->File = msi_dup_record_field( row, 1 ); component = MSI_RecordGetString( row, 2 ); - file->Component = get_loaded_component( package, component ); + file->Component = msi_get_loaded_component( package, component ); if (!file->Component) { @@ -1530,7 +1254,7 @@ static UINT load_file(MSIRECORD *row, LPVOID param) } file->FileName = msi_dup_record_field( row, 3 ); - reduce_to_longfilename( file->FileName ); + msi_reduce_to_long_filename( file->FileName ); file->ShortName = msi_dup_record_field( row, 3 ); file->LongName = strdupW( folder_split_path(file->ShortName, '|')); @@ -1576,23 +1300,141 @@ static UINT load_file(MSIRECORD *row, LPVOID param) static UINT load_all_files(MSIPACKAGE *package) { - MSIQUERY * view; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ', + '`','F','i','l','e','`',' ', 'O','R','D','E','R',' ','B','Y',' ', + '`','S','e','q','u','e','n','c','e','`', 0}; + MSIQUERY *view; UINT rc; - static const WCHAR Query[] = - {'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ', - '`','F','i','l','e','`',' ', 'O','R','D','E','R',' ','B','Y',' ', - '`','S','e','q','u','e','n','c','e','`', 0}; if (!list_empty(&package->files)) return ERROR_SUCCESS; - rc = MSI_DatabaseOpenViewW(package->db, Query, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, load_file, package); msiobj_release(&view->hdr); + return rc; +} +static UINT load_media( MSIRECORD *row, LPVOID param ) +{ + MSIPACKAGE *package = param; + UINT disk_id = MSI_RecordGetInteger( row, 1 ); + const WCHAR *cabinet = MSI_RecordGetString( row, 4 ); + + /* FIXME: load external cabinets and directory sources too */ + if (!cabinet || cabinet[0] != '#') return ERROR_SUCCESS; + msi_add_cabinet_stream( package, disk_id, package->db->storage, cabinet ); + return ERROR_SUCCESS; +} + +static UINT load_all_media( MSIPACKAGE *package ) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`', + 'M','e','d','i','a','`',' ','O','R','D','E','R',' ','B','Y',' ', + '`','D','i','s','k','I','d','`',0}; + MSIQUERY *view; + UINT r; + + r = MSI_DatabaseOpenViewW( package->db, query, &view ); + if (r != ERROR_SUCCESS) + return ERROR_SUCCESS; + + r = MSI_IterateRecords( view, NULL, load_media, package ); + msiobj_release( &view->hdr ); + return r; +} + +static UINT load_patch(MSIRECORD *row, LPVOID param) +{ + MSIPACKAGE *package = param; + MSIFILEPATCH *patch; + LPWSTR file_key; + + patch = msi_alloc_zero( sizeof (MSIFILEPATCH) ); + if (!patch) + return ERROR_NOT_ENOUGH_MEMORY; + + file_key = msi_dup_record_field( row, 1 ); + patch->File = msi_get_loaded_file( package, file_key ); + msi_free(file_key); + + if( !patch->File ) + { + ERR("Failed to find target for patch in File table\n"); + msi_free(patch); + return ERROR_FUNCTION_FAILED; + } + + patch->Sequence = MSI_RecordGetInteger( row, 2 ); + + /* FIXME: The database should be properly transformed */ + patch->Sequence += MSI_INITIAL_MEDIA_TRANSFORM_OFFSET; + + patch->PatchSize = MSI_RecordGetInteger( row, 3 ); + patch->Attributes = MSI_RecordGetInteger( row, 4 ); + patch->IsApplied = FALSE; + + /* FIXME: + * Header field - for patch validation. + * _StreamRef - External key into MsiPatchHeaders (instead of the header field) + */ + + TRACE("Patch Loaded (%s)\n", debugstr_w(patch->File->File)); + + list_add_tail( &package->filepatches, &patch->entry ); + + return ERROR_SUCCESS; +} + +static UINT load_all_patches(MSIPACKAGE *package) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','P','a','t','c','h','`',' ','O','R','D','E','R',' ','B','Y',' ', + '`','S','e','q','u','e','n','c','e','`',0}; + MSIQUERY *view; + UINT rc; + + if (!list_empty(&package->filepatches)) + return ERROR_SUCCESS; + + rc = MSI_DatabaseOpenViewW(package->db, query, &view); + if (rc != ERROR_SUCCESS) + return ERROR_SUCCESS; + + rc = MSI_IterateRecords(view, NULL, load_patch, package); + msiobj_release(&view->hdr); + return rc; +} + +static UINT load_folder_persistence( MSIPACKAGE *package, MSIFOLDER *folder ) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','C','r','e','a','t','e','F','o','l','d','e','r','`',' ','W','H','E','R','E',' ', + '`','D','i','r','e','c','t','o','r','y','_','`',' ','=','\'','%','s','\'',0}; + MSIQUERY *view; + + folder->persistent = FALSE; + if (!MSI_OpenQuery( package->db, &view, query, folder->Directory )) + { + if (!MSI_ViewExecute( view, NULL )) + { + MSIRECORD *rec; + if (!MSI_ViewFetch( view, &rec )) + { + TRACE("directory %s is persistent\n", debugstr_w(folder->Directory)); + folder->persistent = TRUE; + msiobj_release( &rec->hdr ); + } + } + msiobj_release( &view->hdr ); + } return ERROR_SUCCESS; } @@ -1603,16 +1445,14 @@ static UINT load_folder( MSIRECORD *row, LPVOID param ) LPWSTR p, tgt_short, tgt_long, src_short, src_long; MSIFOLDER *folder; - folder = msi_alloc_zero( sizeof (MSIFOLDER) ); - if (!folder) - return ERROR_NOT_ENOUGH_MEMORY; - + if (!(folder = msi_alloc_zero( sizeof(*folder) ))) return ERROR_NOT_ENOUGH_MEMORY; + list_init( &folder->children ); folder->Directory = msi_dup_record_field( row, 1 ); + folder->Parent = msi_dup_record_field( row, 2 ); + p = msi_dup_record_field(row, 3); TRACE("%s\n", debugstr_w(folder->Directory)); - p = msi_dup_record_field(row, 3); - /* split src and target dir */ tgt_short = p; src_short = folder_split_path( p, ':' ); @@ -1648,22 +1488,43 @@ static UINT load_folder( MSIRECORD *row, LPVOID param ) TRACE("SourceLong = %s\n", debugstr_w( folder->SourceLongPath )); TRACE("SourceShort = %s\n", debugstr_w( folder->SourceShortPath )); - folder->Parent = msi_dup_record_field( row, 2 ); - - folder->Property = msi_dup_property( package->db, folder->Directory ); + load_folder_persistence( package, folder ); list_add_tail( &package->folders, &folder->entry ); - - TRACE("returning %p\n", folder); - return ERROR_SUCCESS; } +static UINT add_folder_child( MSIFOLDER *parent, MSIFOLDER *child ) +{ + FolderList *fl; + + if (!(fl = msi_alloc( sizeof(*fl) ))) return ERROR_NOT_ENOUGH_MEMORY; + fl->folder = child; + list_add_tail( &parent->children, &fl->entry ); + return ERROR_SUCCESS; +} + +static UINT find_folder_children( MSIRECORD *row, LPVOID param ) +{ + MSIPACKAGE *package = param; + MSIFOLDER *parent, *child; + + if (!(child = msi_get_loaded_folder( package, MSI_RecordGetString( row, 1 ) ))) + return ERROR_FUNCTION_FAILED; + + if (!child->Parent) return ERROR_SUCCESS; + + if (!(parent = msi_get_loaded_folder( package, child->Parent ))) + return ERROR_FUNCTION_FAILED; + + return add_folder_child( parent, child ); +} + static UINT load_all_folders( MSIPACKAGE *package ) { static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ','F','R', 'O','M',' ', - '`','D','i','r','e','c','t','o','r','y','`',0 }; + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','D','i','r','e','c','t','o','r','y','`',0}; MSIQUERY *view; UINT r; @@ -1674,62 +1535,66 @@ static UINT load_all_folders( MSIPACKAGE *package ) if (r != ERROR_SUCCESS) return r; - r = MSI_IterateRecords(view, NULL, load_folder, package); - msiobj_release(&view->hdr); + r = MSI_IterateRecords( view, NULL, load_folder, package ); + if (r != ERROR_SUCCESS) + { + msiobj_release( &view->hdr ); + return r; + } + r = MSI_IterateRecords( view, NULL, find_folder_children, package ); + msiobj_release( &view->hdr ); return r; } -/* - * I am not doing any of the costing functionality yet. - * Mostly looking at doing the Component and Feature loading - * - * The native MSI does A LOT of modification to tables here. Mostly adding - * a lot of temporary columns to the Feature and Component tables. - * - * note: Native msi also tracks the short filename. But I am only going to - * track the long ones. Also looking at this directory table - * it appears that the directory table does not get the parents - * resolved base on property only based on their entries in the - * directory table. - */ static UINT ACTION_CostInitialize(MSIPACKAGE *package) { - static const WCHAR szCosting[] = - {'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0 }; - - msi_set_property( package->db, szCosting, szZero ); - msi_set_property( package->db, cszRootDrive, c_colon ); + msi_set_property( package->db, szCostingComplete, szZero ); + msi_set_property( package->db, szRootDrive, szCRoot ); load_all_folders( package ); - load_all_components( package ); - load_all_features( package ); + msi_load_all_components( package ); + msi_load_all_features( package ); load_all_files( package ); + load_all_patches( package ); + load_all_media( package ); return ERROR_SUCCESS; } -static UINT execute_script(MSIPACKAGE *package, UINT script ) +static UINT execute_script_action( MSIPACKAGE *package, UINT script, UINT index ) { - UINT i; - UINT rc = ERROR_SUCCESS; + const WCHAR *action = package->script->Actions[script][index]; + ui_actionstart( package, action ); + TRACE("executing %s\n", debugstr_w(action)); + return ACTION_PerformAction( package, action, script ); +} - TRACE("Executing Script %i\n",script); +static UINT execute_script( MSIPACKAGE *package, UINT script ) +{ + UINT i, rc = ERROR_SUCCESS; + + TRACE("executing script %u\n", script); if (!package->script) { ERR("no script!\n"); return ERROR_FUNCTION_FAILED; } - - for (i = 0; i < package->script->ActionCount[script]; i++) + if (script == SCRIPT_ROLLBACK) { - LPWSTR action; - action = package->script->Actions[script][i]; - ui_actionstart(package, action); - TRACE("Executing Action (%s)\n",debugstr_w(action)); - rc = ACTION_PerformAction(package, action, script); - if (rc != ERROR_SUCCESS) - break; + for (i = package->script->ActionCount[script]; i > 0; i--) + { + rc = execute_script_action( package, script, i - 1 ); + if (rc != ERROR_SUCCESS) break; + } + } + else + { + for (i = 0; i < package->script->ActionCount[script]; i++) + { + rc = execute_script_action( package, script, i ); + if (rc != ERROR_SUCCESS) break; + } } msi_free_action_script(package, script); return rc; @@ -1884,14 +1749,12 @@ static BOOL process_overrides( MSIPACKAGE *package, int level ) UINT MSI_SetFeatureStates(MSIPACKAGE *package) { int level; - static const WCHAR szlevel[] = - {'I','N','S','T','A','L','L','L','E','V','E','L',0}; MSICOMPONENT* component; MSIFEATURE *feature; TRACE("Checking Install Level\n"); - level = msi_get_property_int(package->db, szlevel, 1); + level = msi_get_property_int(package->db, szInstallLevel, 1); if (!msi_get_property_int( package->db, szPreselected, 0 )) { @@ -1918,18 +1781,23 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) } } } - - /* disable child features of unselected parent features */ + /* disable child features of unselected parent or follow parent */ LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) { FeatureList *fl; - if (is_feature_selected( feature, level )) continue; - LIST_FOR_EACH_ENTRY( fl, &feature->Children, FeatureList, entry ) { - fl->feature->Action = INSTALLSTATE_UNKNOWN; - fl->feature->ActionRequest = INSTALLSTATE_UNKNOWN; + if (!is_feature_selected( feature, level )) + { + fl->feature->Action = INSTALLSTATE_UNKNOWN; + fl->feature->ActionRequest = INSTALLSTATE_UNKNOWN; + } + else if (fl->feature->Attributes & msidbFeatureAttributesFollowParent) + { + fl->feature->Action = feature->Action; + fl->feature->ActionRequest = feature->ActionRequest; + } } } } @@ -1953,6 +1821,21 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) } } } + LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) + { + FeatureList *fl; + + if (!is_feature_selected( feature, level )) continue; + + LIST_FOR_EACH_ENTRY( fl, &feature->Children, FeatureList, entry ) + { + if (fl->feature->Attributes & msidbFeatureAttributesFollowParent) + { + fl->feature->Action = feature->Action; + fl->feature->ActionRequest = feature->ActionRequest; + } + } + } } /* now we want to set component state based based on feature state */ @@ -2082,30 +1965,6 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package) return ERROR_SUCCESS; } -static UINT ITERATE_CostFinalizeDirectories(MSIRECORD *row, LPVOID param) -{ - MSIPACKAGE *package = param; - LPCWSTR name; - LPWSTR path; - MSIFOLDER *f; - - name = MSI_RecordGetString(row,1); - - f = get_loaded_folder(package, name); - if (!f) return ERROR_SUCCESS; - - /* reset the ResolvedTarget */ - msi_free(f->ResolvedTarget); - f->ResolvedTarget = NULL; - - TRACE("directory %s ...\n", debugstr_w(name)); - path = resolve_target_folder( package, name, TRUE, TRUE, NULL ); - TRACE("resolves to %s\n", debugstr_w(path)); - msi_free(path); - - return ERROR_SUCCESS; -} - static UINT ITERATE_CostFinalizeConditions(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; @@ -2114,7 +1973,7 @@ static UINT ITERATE_CostFinalizeConditions(MSIRECORD *row, LPVOID param) name = MSI_RecordGetString( row, 1 ); - feature = get_loaded_feature( package, name ); + feature = msi_get_loaded_feature( package, name ); if (!feature) ERR("FAILED to find loaded feature %s\n",debugstr_w(name)); else @@ -2140,8 +1999,6 @@ VS_FIXEDFILEINFO *msi_get_disk_file_version( LPCWSTR filename ) DWORD versize, handle; UINT sz; - TRACE("%s\n", debugstr_w(filename)); - versize = GetFileVersionInfoSizeW( filename, &handle ); if (!versize) return NULL; @@ -2195,13 +2052,12 @@ DWORD msi_get_disk_file_size( LPCWSTR filename ) HANDLE file; DWORD size; - TRACE("%s\n", debugstr_w(filename)); - file = CreateFileW( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); if (file == INVALID_HANDLE_VALUE) return INVALID_FILE_SIZE; size = GetFileSize( file, NULL ); + TRACE("size is %u\n", size); CloseHandle( file ); return size; } @@ -2233,6 +2089,54 @@ static WCHAR *get_temp_dir( void ) return strdupW( dir ); } +/* + * msi_build_directory_name() + * + * This function is to save messing round with directory names + * It handles adding backslashes between path segments, + * and can add \ at the end of the directory name if told to. + * + * It takes a variable number of arguments. + * It always allocates a new string for the result, so make sure + * to free the return value when finished with it. + * + * The first arg is the number of path segments that follow. + * The arguments following count are a list of path segments. + * A path segment may be NULL. + * + * Path segments will be added with a \ separating them. + * A \ will not be added after the last segment, however if the + * last segment is NULL, then the last character will be a \ + */ +WCHAR *msi_build_directory_name( DWORD count, ... ) +{ + DWORD sz = 1, i; + WCHAR *dir; + va_list va; + + va_start( va, count ); + for (i = 0; i < count; i++) + { + const WCHAR *str = va_arg( va, const WCHAR * ); + if (str) sz += strlenW( str ) + 1; + } + va_end( va ); + + dir = msi_alloc( sz * sizeof(WCHAR) ); + dir[0] = 0; + + va_start( va, count ); + for (i = 0; i < count; i++) + { + const WCHAR *str = va_arg( va, const WCHAR * ); + if (!str) continue; + strcatW( dir, str ); + if ( i + 1 != count && dir[strlenW( dir ) - 1] != '\\') strcatW( dir, szBackSlash ); + } + va_end( va ); + return dir; +} + static void set_target_path( MSIPACKAGE *package, MSIFILE *file ) { MSIASSEMBLY *assembly = file->Component->assembly; @@ -2243,14 +2147,13 @@ static void set_target_path( MSIPACKAGE *package, MSIFILE *file ) if (assembly && !assembly->application) { if (!assembly->tempdir) assembly->tempdir = get_temp_dir(); - file->TargetPath = build_directory_name( 2, assembly->tempdir, file->FileName ); - track_tempfile( package, file->TargetPath ); + file->TargetPath = msi_build_directory_name( 2, assembly->tempdir, file->FileName ); + msi_track_tempfile( package, file->TargetPath ); } else { - WCHAR *dir = resolve_target_folder( package, file->Component->Directory, FALSE, TRUE, NULL ); - file->TargetPath = build_directory_name( 2, dir, file->FileName ); - msi_free( dir ); + const WCHAR *dir = msi_get_target_folder( package, file->Component->Directory ); + file->TargetPath = msi_build_directory_name( 2, dir, file->FileName ); } TRACE("resolves to %s\n", debugstr_w(file->TargetPath)); @@ -2293,7 +2196,7 @@ static UINT calculate_file_cost( MSIPACKAGE *package ) msi_free( file_version ); continue; } - else if ((font_version = font_version_from_file( file->TargetPath ))) + else if ((font_version = msi_font_version_from_file( file->TargetPath ))) { if (msi_compare_font_versions( font_version, file->Version ) < 0) { @@ -2311,40 +2214,111 @@ static UINT calculate_file_cost( MSIPACKAGE *package ) return ERROR_SUCCESS; } -/* - * A lot is done in this function aside from just the costing. - * The costing needs to be implemented at some point but for now I am going - * to focus on the directory building - * - */ +WCHAR *msi_normalize_path( const WCHAR *in ) +{ + const WCHAR *p = in; + WCHAR *q, *ret; + int n, len = strlenW( in ) + 2; + + if (!(q = ret = msi_alloc( len * sizeof(WCHAR) ))) return NULL; + + len = 0; + while (1) + { + /* copy until the end of the string or a space */ + while (*p != ' ' && (*q = *p)) + { + p++, len++; + /* reduce many backslashes to one */ + if (*p != '\\' || *q != '\\') + q++; + } + + /* quit at the end of the string */ + if (!*p) + break; + + /* count the number of spaces */ + n = 0; + while (p[n] == ' ') + n++; + + /* if it's leading or trailing space, skip it */ + if ( len == 0 || p[-1] == '\\' || p[n] == '\\' ) + p += n; + else /* copy n spaces */ + while (n && (*q++ = *p++)) n--; + } + while (q - ret > 0 && q[-1] == ' ') q--; + if (q - ret > 0 && q[-1] != '\\') + { + q[0] = '\\'; + q[1] = 0; + } + return ret; +} + +void msi_resolve_target_folder( MSIPACKAGE *package, const WCHAR *name, BOOL load_prop ) +{ + FolderList *fl; + MSIFOLDER *folder, *parent, *child; + WCHAR *path, *normalized_path; + + TRACE("resolving %s\n", debugstr_w(name)); + + if (!(folder = msi_get_loaded_folder( package, name ))) return; + + if (!strcmpW( folder->Directory, szTargetDir )) /* special resolving for target root dir */ + { + if (!load_prop || !(path = msi_dup_property( package->db, szTargetDir ))) + { + path = msi_dup_property( package->db, szRootDrive ); + } + } + else if (!load_prop || !(path = msi_dup_property( package->db, folder->Directory ))) + { + if (folder->Parent && strcmpW( folder->Directory, folder->Parent )) + { + parent = msi_get_loaded_folder( package, folder->Parent ); + path = msi_build_directory_name( 3, parent->ResolvedTarget, folder->TargetDefault, NULL ); + } + else + path = msi_build_directory_name( 2, folder->TargetDefault, NULL ); + } + normalized_path = msi_normalize_path( path ); + msi_free( path ); + if (folder->ResolvedTarget && !strcmpiW( normalized_path, folder->ResolvedTarget )) + { + TRACE("%s already resolved to %s\n", debugstr_w(name), debugstr_w(folder->ResolvedTarget)); + msi_free( normalized_path ); + return; + } + msi_set_property( package->db, folder->Directory, normalized_path ); + msi_free( folder->ResolvedTarget ); + folder->ResolvedTarget = normalized_path; + + LIST_FOR_EACH_ENTRY( fl, &folder->children, FolderList, entry ) + { + child = fl->folder; + msi_resolve_target_folder( package, child->Directory, load_prop ); + } + TRACE("%s resolves to %s\n", debugstr_w(name), debugstr_w(folder->ResolvedTarget)); +} + static UINT ACTION_CostFinalize(MSIPACKAGE *package) { - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','D','i','r','e','c','t','o','r','y','`',0}; - static const WCHAR ConditionQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','C','o','n','d','i','t','i','o','n','`',0}; - static const WCHAR szCosting[] = - {'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0 }; - static const WCHAR szlevel[] = - {'I','N','S','T','A','L','L','L','E','V','E','L',0}; - static const WCHAR szOutOfDiskSpace[] = - {'O','u','t','O','f','D','i','s','k','S','p','a','c','e',0}; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','C','o','n','d','i','t','i','o','n','`',0}; + static const WCHAR szOutOfDiskSpace[] = { + 'O','u','t','O','f','D','i','s','k','S','p','a','c','e',0}; MSICOMPONENT *comp; - UINT rc = ERROR_SUCCESS; - MSIQUERY * view; + MSIQUERY *view; LPWSTR level; + UINT rc; - TRACE("Building Directory properties\n"); - - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); - if (rc == ERROR_SUCCESS) - { - rc = MSI_IterateRecords(view, NULL, ITERATE_CostFinalizeDirectories, - package); - msiobj_release(&view->hdr); - } + TRACE("Building directory properties\n"); + msi_resolve_target_folder( package, szTargetDir, TRUE ); TRACE("Evaluating component conditions\n"); LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry ) @@ -2362,26 +2336,28 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package) ACTION_GetComponentInstallStates(package); ACTION_GetFeatureInstallStates(package); - if (!process_overrides( package, msi_get_property_int( package->db, szlevel, 1 ) )) + if (!process_overrides( package, msi_get_property_int( package->db, szInstallLevel, 1 ) )) { TRACE("Evaluating feature conditions\n"); - rc = MSI_DatabaseOpenViewW( package->db, ConditionQuery, &view ); + rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc == ERROR_SUCCESS) { rc = MSI_IterateRecords( view, NULL, ITERATE_CostFinalizeConditions, package ); msiobj_release( &view->hdr ); + if (rc != ERROR_SUCCESS) + return rc; } } TRACE("Calculating file cost\n"); calculate_file_cost( package ); - msi_set_property( package->db, szCosting, szOne ); + msi_set_property( package->db, szCostingComplete, szOne ); /* set default run level if not set */ - level = msi_dup_property( package->db, szlevel ); + level = msi_dup_property( package->db, szInstallLevel ); if (!level) - msi_set_property( package->db, szlevel, szOne ); + msi_set_property( package->db, szInstallLevel, szOne ); msi_free(level); /* FIXME: check volume disk space */ @@ -2565,14 +2541,11 @@ static WCHAR *get_keypath( MSIPACKAGE *package, HKEY root, const WCHAR *path ) UINT size; WCHAR *path_32node; - size = (strlenW( path ) + strlenW( szWow6432Node ) + 1) * sizeof(WCHAR); - path_32node = msi_alloc( size ); - if (!path_32node) - return NULL; + size = (strlenW( path ) + strlenW( szWow6432Node ) + 2) * sizeof(WCHAR); + if (!(path_32node = msi_alloc( size ))) return NULL; memcpy( path_32node, path, len * sizeof(WCHAR) ); - path_32node[len] = 0; - strcatW( path_32node, szWow6432Node ); + strcpyW( path_32node + len, szWow6432Node ); strcatW( path_32node, szBackSlash ); strcatW( path_32node, path + len ); return path_32node; @@ -2595,27 +2568,20 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param) BOOL check_first = FALSE; UINT rc; - ui_progress(package,2,0,0,0); + msi_ui_progress( package, 2, REG_PROGRESS_VALUE, 0, 0 ); component = MSI_RecordGetString(row, 6); - comp = get_loaded_component(package,component); + comp = msi_get_loaded_component(package,component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_LOCAL; - name = MSI_RecordGetString(row, 4); if( MSI_RecordIsNull(row,5) && name ) { @@ -2693,7 +2659,7 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param) MSI_RecordSetStringW(uirow,1,uikey); if (type == REG_SZ || type == REG_EXPAND_SZ) MSI_RecordSetStringW(uirow,3,(LPWSTR)value_data); - ui_actiondata(package,szWriteRegistryValues,uirow); + msi_ui_actiondata( package, szWriteRegistryValues, uirow ); msiobj_release( &uirow->hdr ); msi_free(value_data); @@ -2706,59 +2672,51 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param) static UINT ACTION_WriteRegistryValues(MSIPACKAGE *package) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','R','e','g','i','s','t','r','y','`',0}; + MSIQUERY *view; UINT rc; - MSIQUERY * view; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','R','e','g','i','s','t','r','y','`',0 }; - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; - /* increment progress bar each time action data is sent */ - ui_progress(package,1,REG_PROGRESS_VALUE,1,0); - rc = MSI_IterateRecords(view, NULL, ITERATE_WriteRegistryValues, package); - msiobj_release(&view->hdr); return rc; } -static void delete_reg_key_or_value( HKEY hkey_root, LPCWSTR key, LPCWSTR value, BOOL delete_key ) +static void delete_reg_value( HKEY root, const WCHAR *keypath, const WCHAR *value ) { LONG res; HKEY hkey; DWORD num_subkeys, num_values; - if (delete_key) - { - if ((res = RegDeleteTreeW( hkey_root, key ))) - { - TRACE("Failed to delete key %s (%d)\n", debugstr_w(key), res); - } - return; - } - - if (!(res = RegOpenKeyW( hkey_root, key, &hkey ))) + if (!(res = RegOpenKeyW( root, keypath, &hkey ))) { if ((res = RegDeleteValueW( hkey, value ))) { - TRACE("Failed to delete value %s (%d)\n", debugstr_w(value), res); + TRACE("failed to delete value %s (%d)\n", debugstr_w(value), res); } res = RegQueryInfoKeyW( hkey, NULL, NULL, NULL, &num_subkeys, NULL, NULL, &num_values, NULL, NULL, NULL, NULL ); RegCloseKey( hkey ); if (!res && !num_subkeys && !num_values) { - TRACE("Removing empty key %s\n", debugstr_w(key)); - RegDeleteKeyW( hkey_root, key ); + TRACE("removing empty key %s\n", debugstr_w(keypath)); + RegDeleteKeyW( root, keypath ); } return; } - TRACE("Failed to open key %s (%d)\n", debugstr_w(key), res); + TRACE("failed to open key %s (%d)\n", debugstr_w(keypath), res); } +static void delete_reg_key( HKEY root, const WCHAR *keypath ) +{ + LONG res = RegDeleteTreeW( root, keypath ); + if (res) TRACE("failed to delete key %s (%d)\n", debugstr_w(keypath), res); +} static UINT ITERATE_RemoveRegistryValuesOnUninstall( MSIRECORD *row, LPVOID param ) { @@ -2772,27 +2730,20 @@ static UINT ITERATE_RemoveRegistryValuesOnUninstall( MSIRECORD *row, LPVOID para UINT size; INT root; - ui_progress( package, 2, 0, 0, 0 ); + msi_ui_progress( package, 2, REG_PROGRESS_VALUE, 0, 0 ); component = MSI_RecordGetString( row, 6 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_ABSENT) - { - TRACE("Component not scheduled for removal: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_ABSENT; - name = MSI_RecordGetString( row, 4 ); if (MSI_RecordIsNull( row, 5 ) && name ) { @@ -2822,14 +2773,14 @@ static UINT ITERATE_RemoveRegistryValuesOnUninstall( MSIRECORD *row, LPVOID para keypath = get_keypath( package, hkey_root, deformated_key ); msi_free( deformated_key ); - delete_reg_key_or_value( hkey_root, keypath, deformated_name, delete_key ); + if (delete_key) delete_reg_key( hkey_root, keypath ); + else delete_reg_value( hkey_root, keypath, deformated_name ); msi_free( keypath ); uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, ui_key_str ); MSI_RecordSetStringW( uirow, 2, deformated_name ); - - ui_actiondata( package, szRemoveRegistryValues, uirow ); + msi_ui_actiondata( package, szRemoveRegistryValues, uirow ); msiobj_release( &uirow->hdr ); msi_free( ui_key_str ); @@ -2849,27 +2800,18 @@ static UINT ITERATE_RemoveRegistryValuesOnInstall( MSIRECORD *row, LPVOID param UINT size; INT root; - ui_progress( package, 2, 0, 0, 0 ); - component = MSI_RecordGetString( row, 5 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_LOCAL; - if ((name = MSI_RecordGetString( row, 4 ))) { if (name[0] == '-' && !name[1]) @@ -2896,14 +2838,14 @@ static UINT ITERATE_RemoveRegistryValuesOnInstall( MSIRECORD *row, LPVOID param keypath = get_keypath( package, hkey_root, deformated_key ); msi_free( deformated_key ); - delete_reg_key_or_value( hkey_root, keypath, deformated_name, delete_key ); + if (delete_key) delete_reg_key( hkey_root, keypath ); + else delete_reg_value( hkey_root, keypath, deformated_name ); msi_free( keypath ); uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, ui_key_str ); MSI_RecordSetStringW( uirow, 2, deformated_name ); - - ui_actiondata( package, szRemoveRegistryValues, uirow ); + msi_ui_actiondata( package, szRemoveRegistryValues, uirow ); msiobj_release( &uirow->hdr ); msi_free( ui_key_str ); @@ -2913,17 +2855,14 @@ static UINT ITERATE_RemoveRegistryValuesOnInstall( MSIRECORD *row, LPVOID param static UINT ACTION_RemoveRegistryValues( MSIPACKAGE *package ) { - UINT rc; + static const WCHAR registry_query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','R','e','g','i','s','t','r','y','`',0}; + static const WCHAR remove_registry_query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','R','e','m','o','v','e','R','e','g','i','s','t','r','y','`',0}; MSIQUERY *view; - static const WCHAR registry_query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','R','e','g','i','s','t','r','y','`',0 }; - static const WCHAR remove_registry_query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','R','e','m','o','v','e','R','e','g','i','s','t','r','y','`',0 }; - - /* increment progress bar each time action data is sent */ - ui_progress( package, 1, REG_PROGRESS_VALUE, 1, 0 ); + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, registry_query, &view ); if (rc == ERROR_SUCCESS) @@ -2933,7 +2872,6 @@ static UINT ACTION_RemoveRegistryValues( MSIPACKAGE *package ) if (rc != ERROR_SUCCESS) return rc; } - rc = MSI_DatabaseOpenViewW( package->db, remove_registry_query, &view ); if (rc == ERROR_SUCCESS) { @@ -2942,7 +2880,6 @@ static UINT ACTION_RemoveRegistryValues( MSIPACKAGE *package ) if (rc != ERROR_SUCCESS) return rc; } - return ERROR_SUCCESS; } @@ -2956,34 +2893,34 @@ static UINT ACTION_InstallInitialize(MSIPACKAGE *package) static UINT ACTION_InstallValidate(MSIPACKAGE *package) { + static const WCHAR query[]= { + 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ', + '`','R','e','g','i','s','t','r','y','`',0}; MSICOMPONENT *comp; - DWORD progress = 0; - DWORD total = 0; - static const WCHAR q1[]= - {'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ', - '`','R','e','g','i','s','t','r','y','`',0}; - UINT rc; - MSIQUERY * view; + DWORD total = 0, count = 0; + MSIQUERY *view; MSIFEATURE *feature; MSIFILE *file; + UINT rc; TRACE("InstallValidate\n"); - rc = MSI_DatabaseOpenViewW(package->db, q1, &view); + rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc == ERROR_SUCCESS) { - MSI_IterateRecords( view, &progress, NULL, package ); + rc = MSI_IterateRecords( view, &count, NULL, package ); msiobj_release( &view->hdr ); - total += progress * REG_PROGRESS_VALUE; + if (rc != ERROR_SUCCESS) + return rc; + total += count * REG_PROGRESS_VALUE; } - LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry ) total += COMPONENT_PROGRESS_VALUE; LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry ) total += file->FileSize; - ui_progress(package,0,total,0,0); + msi_ui_progress( package, 0, total, 0, 0 ); LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) { @@ -2991,7 +2928,6 @@ static UINT ACTION_InstallValidate(MSIPACKAGE *package) debugstr_w(feature->Feature), feature->Installed, feature->ActionRequest, feature->Action); } - return ERROR_SUCCESS; } @@ -3027,21 +2963,20 @@ static UINT ITERATE_LaunchConditions(MSIRECORD *row, LPVOID param) static UINT ACTION_LaunchConditions(MSIPACKAGE *package) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','L','a','u','n','c','h','C','o','n','d','i','t','i','o','n','`',0}; + MSIQUERY *view; UINT rc; - MSIQUERY * view = NULL; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','L','a','u','n','c','h','C','o','n','d','i','t','i','o','n','`',0}; TRACE("Checking launch conditions\n"); - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, ITERATE_LaunchConditions, package); msiobj_release(&view->hdr); - return rc; } @@ -3049,24 +2984,22 @@ static LPWSTR resolve_keypath( MSIPACKAGE* package, MSICOMPONENT *cmp ) { if (!cmp->KeyPath) - return resolve_target_folder( package, cmp->Directory, FALSE, TRUE, NULL ); + return strdupW( msi_get_target_folder( package, cmp->Directory ) ); if (cmp->Attributes & msidbComponentAttributesRegistryKeyPath) { - MSIRECORD * row = 0; - UINT root,len; - LPWSTR deformated,buffer,deformated_name; - LPCWSTR key,name; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','R','e','g','i','s','t','r','y','`',' ', - 'W','H','E','R','E',' ', '`','R','e','g','i','s','t','r','y','`', - ' ','=',' ' ,'\'','%','s','\'',0 }; - static const WCHAR fmt[]={'%','0','2','i',':','\\','%','s','\\',0}; - static const WCHAR fmt2[]= - {'%','0','2','i',':','\\','%','s','\\','%','s',0}; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','R','e','g','i','s','t','r','y','`',' ','W','H','E','R','E',' ', + '`','R','e','g','i','s','t','r','y','`',' ','=',' ' ,'\'','%','s','\'',0}; + static const WCHAR fmt[] = {'%','0','2','i',':','\\','%','s','\\',0}; + static const WCHAR fmt2[]= {'%','0','2','i',':','\\','%','s','\\','%','s',0}; + MSIRECORD *row; + UINT root, len; + LPWSTR deformated, buffer, deformated_name; + LPCWSTR key, name; - row = MSI_QueryGetRecord(package->db, ExecSeqQuery,cmp->KeyPath); + row = MSI_QueryGetRecord(package->db, query, cmp->KeyPath); if (!row) return NULL; @@ -3100,7 +3033,7 @@ static LPWSTR resolve_keypath( MSIPACKAGE* package, MSICOMPONENT *cmp ) } else { - MSIFILE *file = get_loaded_file( package, cmp->KeyPath ); + MSIFILE *file = msi_get_loaded_file( package, cmp->KeyPath ); if (file) return strdupW( file->TargetPath ); @@ -3177,7 +3110,7 @@ static void ACTION_RefCountComponent( MSIPACKAGE* package, MSICOMPONENT *comp ) { ComponentList *cl; - if (feature->ActionRequest != INSTALLSTATE_LOCAL) + if (msi_get_feature_action( package, feature ) != INSTALLSTATE_LOCAL) continue; LIST_FOR_EACH_ENTRY( cl, &feature->Components, ComponentList, entry ) @@ -3192,7 +3125,7 @@ static void ACTION_RefCountComponent( MSIPACKAGE* package, MSICOMPONENT *comp ) { ComponentList *cl; - if (feature->ActionRequest != INSTALLSTATE_ABSENT) + if (msi_get_feature_action( package, feature ) != INSTALLSTATE_ABSENT) continue; LIST_FOR_EACH_ENTRY( cl, &feature->Components, ComponentList, entry ) @@ -3224,10 +3157,27 @@ static void ACTION_RefCountComponent( MSIPACKAGE* package, MSICOMPONENT *comp ) ACTION_WriteSharedDLLsCount( comp->FullKeypath, comp->RefCount ); } +static WCHAR *build_full_keypath( MSIPACKAGE *package, MSICOMPONENT *comp ) +{ + if (comp->assembly) + { + const WCHAR prefixW[] = {'<','\\',0}; + DWORD len = strlenW( prefixW ) + strlenW( comp->assembly->display_name ); + WCHAR *keypath = msi_alloc( (len + 1) * sizeof(WCHAR) ); + + if (keypath) + { + strcpyW( keypath, prefixW ); + strcatW( keypath, comp->assembly->display_name ); + } + return keypath; + } + return resolve_keypath( package, comp ); +} + static UINT ACTION_ProcessComponents(MSIPACKAGE *package) { - WCHAR squished_pc[GUID_SIZE]; - WCHAR squished_cc[GUID_SIZE]; + WCHAR squished_pc[GUID_SIZE], squished_cc[GUID_SIZE]; UINT rc; MSICOMPONENT *comp; HKEY hkey; @@ -3235,46 +3185,31 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package) TRACE("\n"); squash_guid(package->ProductCode,squished_pc); - ui_progress(package,1,COMPONENT_PROGRESS_VALUE,1,0); - msi_set_sourcedir_props(package, FALSE); LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry ) { - MSIRECORD * uirow; + MSIRECORD *uirow; + INSTALLSTATE action; - ui_progress(package,2,0,0,0); + msi_ui_progress( package, 2, COMPONENT_PROGRESS_VALUE, 0, 0 ); if (!comp->ComponentId) continue; - squash_guid(comp->ComponentId,squished_cc); - - msi_free(comp->FullKeypath); - if (comp->assembly) - { - const WCHAR prefixW[] = {'<','\\',0}; - DWORD len = strlenW( prefixW ) + strlenW( comp->assembly->display_name ); - - comp->FullKeypath = msi_alloc( (len + 1) * sizeof(WCHAR) ); - if (comp->FullKeypath) - { - strcpyW( comp->FullKeypath, prefixW ); - strcatW( comp->FullKeypath, comp->assembly->display_name ); - } - } - else comp->FullKeypath = resolve_keypath( package, comp ); + squash_guid( comp->ComponentId, squished_cc ); + msi_free( comp->FullKeypath ); + comp->FullKeypath = build_full_keypath( package, comp ); ACTION_RefCountComponent( package, comp ); - TRACE("Component %s (%s), Keypath=%s, RefCount=%i Request=%u\n", - debugstr_w(comp->Component), - debugstr_w(squished_cc), - debugstr_w(comp->FullKeypath), - comp->RefCount, - comp->ActionRequest); + if (package->need_rollback) action = comp->Installed; + else action = comp->ActionRequest; - if (comp->ActionRequest == INSTALLSTATE_LOCAL || - comp->ActionRequest == INSTALLSTATE_SOURCE) + TRACE("Component %s (%s), Keypath=%s, RefCount=%u Action=%u\n", + debugstr_w(comp->Component), debugstr_w(squished_cc), + debugstr_w(comp->FullKeypath), comp->RefCount, action); + + if (action == INSTALLSTATE_LOCAL || action == INSTALLSTATE_SOURCE) { if (package->Context == MSIINSTALLCONTEXT_MACHINE) rc = MSIREG_OpenUserDataComponentKey(comp->ComponentId, szLocalSid, &hkey, TRUE); @@ -3293,8 +3228,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package) msi_reg_set_val_str(hkey, szPermKey, comp->FullKeypath); } - - if (comp->ActionRequest == INSTALLSTATE_LOCAL) + if (action == INSTALLSTATE_LOCAL) msi_reg_set_val_str(hkey, squished_pc, comp->FullKeypath); else { @@ -3313,7 +3247,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package) '>','=',' ','%','i',' ','O','R','D','E','R',' ','B','Y',' ', '`','D','i','s','k','I','d','`',0}; - if (!comp->KeyPath || !(file = get_loaded_file(package, comp->KeyPath))) + if (!comp->KeyPath || !(file = msi_get_loaded_file(package, comp->KeyPath))) continue; row = MSI_QueryGetRecord(package->db, query, file->Sequence); @@ -3325,7 +3259,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package) ptr = strrchrW(base, '\\'); *(ptr + 1) = '\0'; - sourcepath = resolve_file_source(package, file); + sourcepath = msi_resolve_file_source(package, file); ptr = sourcepath + lstrlenW(base); lstrcpyW(ptr2, ptr); msi_free(sourcepath); @@ -3334,24 +3268,22 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package) } RegCloseKey(hkey); } - else if (comp->ActionRequest == INSTALLSTATE_ABSENT) + else if (action == INSTALLSTATE_ABSENT) { if (package->Context == MSIINSTALLCONTEXT_MACHINE) MSIREG_DeleteUserDataComponentKey(comp->ComponentId, szLocalSid); else MSIREG_DeleteUserDataComponentKey(comp->ComponentId, NULL); } - comp->Action = comp->ActionRequest; /* UI stuff */ uirow = MSI_CreateRecord(3); MSI_RecordSetStringW(uirow,1,package->ProductCode); MSI_RecordSetStringW(uirow,2,comp->ComponentId); MSI_RecordSetStringW(uirow,3,comp->FullKeypath); - ui_actiondata(package,szProcessComponents,uirow); + msi_ui_actiondata( package, szProcessComponents, uirow ); msiobj_release( &uirow->hdr ); } - return ERROR_SUCCESS; } @@ -3427,37 +3359,30 @@ static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param) HRESULT hr; component = MSI_RecordGetString(row,3); - comp = get_loaded_component(package,component); + comp = msi_get_loaded_component(package,component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_LOCAL; - - if (!comp->KeyPath || !(file = get_loaded_file( package, comp->KeyPath ))) + if (!comp->KeyPath || !(file = msi_get_loaded_file( package, comp->KeyPath ))) { TRACE("component has no key path\n"); return ERROR_SUCCESS; } - ui_actiondata( package, szRegisterTypeLibraries, row ); + msi_ui_actiondata( package, szRegisterTypeLibraries, row ); module = LoadLibraryExW( file->TargetPath, NULL, LOAD_LIBRARY_AS_DATAFILE ); if (module) { LPCWSTR guid; guid = MSI_RecordGetString(row,1); - CLSIDFromString((LPCWSTR)guid, &tl_struct.clsid); + CLSIDFromString( guid, &tl_struct.clsid); tl_struct.source = strdupW( file->TargetPath ); tl_struct.path = NULL; @@ -3466,28 +3391,23 @@ static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param) if (tl_struct.path) { - LPWSTR help = NULL; - LPCWSTR helpid; + LPCWSTR helpid, help_path = NULL; HRESULT res; helpid = MSI_RecordGetString(row,6); - if (helpid) help = resolve_target_folder( package, helpid, FALSE, TRUE, NULL ); - res = RegisterTypeLib(tl_struct.ptLib,tl_struct.path,help); - msi_free(help); + if (helpid) help_path = msi_get_target_folder( package, helpid ); + res = RegisterTypeLib( tl_struct.ptLib, tl_struct.path, (OLECHAR *)help_path ); if (FAILED(res)) - ERR("Failed to register type library %s\n", - debugstr_w(tl_struct.path)); + ERR("Failed to register type library %s\n", debugstr_w(tl_struct.path)); else TRACE("Registered %s\n", debugstr_w(tl_struct.path)); ITypeLib_Release(tl_struct.ptLib); msi_free(tl_struct.path); } - else - ERR("Failed to load type library %s\n", - debugstr_w(tl_struct.source)); + else ERR("Failed to load type library %s\n", debugstr_w(tl_struct.source)); FreeLibrary(module); msi_free(tl_struct.source); @@ -3509,19 +3429,13 @@ static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param) static UINT ACTION_RegisterTypeLibraries(MSIPACKAGE *package) { - /* - * OK this is a bit confusing.. I am given a _Component key and I believe - * that the file that is being registered as a type library is the "key file - * of that component" which I interpret to mean "The file in the KeyPath of - * that component". - */ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','T','y','p','e','L','i','b','`',0}; + MSIQUERY *view; UINT rc; - MSIQUERY * view; - static const WCHAR Query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','T','y','p','e','L','i','b','`',0}; - rc = MSI_DatabaseOpenViewW(package->db, Query, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; @@ -3542,28 +3456,20 @@ static UINT ITERATE_UnregisterTypeLibraries( MSIRECORD *row, LPVOID param ) HRESULT hr; component = MSI_RecordGetString( row, 3 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - - if (comp->ActionRequest != INSTALLSTATE_ABSENT) - { - TRACE("Component not scheduled for removal %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_ABSENT; - - ui_actiondata( package, szUnregisterTypeLibraries, row ); + msi_ui_actiondata( package, szUnregisterTypeLibraries, row ); guid = MSI_RecordGetString( row, 1 ); - CLSIDFromString( (LPCWSTR)guid, &libid ); + CLSIDFromString( guid, &libid ); version = MSI_RecordGetInteger( row, 4 ); language = MSI_RecordGetInteger( row, 2 ); @@ -3584,11 +3490,11 @@ static UINT ITERATE_UnregisterTypeLibraries( MSIRECORD *row, LPVOID param ) static UINT ACTION_UnregisterTypeLibraries( MSIPACKAGE *package ) { - UINT rc; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','T','y','p','e','L','i','b','`',0}; MSIQUERY *view; - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','T','y','p','e','L','i','b','`',0}; + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc != ERROR_SUCCESS) @@ -3602,17 +3508,21 @@ static UINT ACTION_UnregisterTypeLibraries( MSIPACKAGE *package ) static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row ) { static const WCHAR szlnk[] = {'.','l','n','k',0}; - LPCWSTR directory, extension; - LPWSTR link_folder, link_file, filename; + LPCWSTR directory, extension, link_folder; + LPWSTR link_file, filename; directory = MSI_RecordGetString( row, 2 ); - link_folder = resolve_target_folder( package, directory, FALSE, TRUE, NULL ); - + link_folder = msi_get_target_folder( package, directory ); + if (!link_folder) + { + ERR("unable to resolve folder %s\n", debugstr_w(directory)); + return NULL; + } /* may be needed because of a bug somewhere else */ - create_full_pathW( link_folder ); + msi_create_full_path( link_folder ); filename = msi_dup_record_field( row, 3 ); - reduce_to_longfilename( filename ); + msi_reduce_to_long_filename( filename ); extension = strchrW( filename, '.' ); if (!extension || strcmpiW( extension, szlnk )) @@ -3621,13 +3531,34 @@ static WCHAR *get_link_file( MSIPACKAGE *package, MSIRECORD *row ) filename = msi_realloc( filename, len * sizeof(WCHAR) + sizeof(szlnk) ); memcpy( filename + len, szlnk, sizeof(szlnk) ); } - link_file = build_directory_name( 2, link_folder, filename ); - msi_free( link_folder ); + link_file = msi_build_directory_name( 2, link_folder, filename ); msi_free( filename ); return link_file; } +WCHAR *msi_build_icon_path( MSIPACKAGE *package, const WCHAR *icon_name ) +{ + static const WCHAR szMicrosoft[] = {'M','i','c','r','o','s','o','f','t','\\',0}; + static const WCHAR szInstaller[] = {'I','n','s','t','a','l','l','e','r','\\',0}; + WCHAR *folder, *dest, *path; + + if (package->Context == MSIINSTALLCONTEXT_MACHINE) + folder = msi_dup_property( package->db, szWindowsFolder ); + else + { + WCHAR *appdata = msi_dup_property( package->db, szAppDataFolder ); + folder = msi_build_directory_name( 2, appdata, szMicrosoft ); + msi_free( appdata ); + } + dest = msi_build_directory_name( 3, folder, szInstaller, package->ProductCode ); + msi_create_full_path( dest ); + path = msi_build_directory_name( 2, dest, icon_name ); + msi_free( folder ); + msi_free( dest ); + return path; +} + static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; @@ -3639,25 +3570,17 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param) HRESULT res; component = MSI_RecordGetString(row, 4); - comp = get_loaded_component(package, component); + comp = msi_get_loaded_component(package, component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_LOCAL; - - ui_actiondata(package,szCreateShortcuts,row); + msi_ui_actiondata( package, szCreateShortcuts, row ); res = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (LPVOID *) &sl ); @@ -3678,9 +3601,10 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param) target = MSI_RecordGetString(row, 5); if (strchrW(target, '[')) { - deformat_string(package, target, &deformated); - IShellLinkW_SetPath(sl,deformated); - msi_free(deformated); + deformat_string( package, target, &path ); + TRACE("target path is %s\n", debugstr_w(path)); + IShellLinkW_SetPath( sl, path ); + msi_free( path ); } else { @@ -3710,7 +3634,7 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param) INT index; LPCWSTR icon = MSI_RecordGetString(row, 9); - path = build_icon_path(package, icon); + path = msi_build_icon_path(package, icon); index = MSI_RecordGetInteger(row,10); /* no value means 0 */ @@ -3726,18 +3650,14 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param) if (!MSI_RecordIsNull(row,12)) { - LPCWSTR wkdir = MSI_RecordGetString(row, 12); - path = resolve_target_folder( package, wkdir, FALSE, TRUE, NULL ); - if (path) - IShellLinkW_SetWorkingDirectory(sl, path); - msi_free(path); + LPCWSTR full_path, wkdir = MSI_RecordGetString( row, 12 ); + full_path = msi_get_target_folder( package, wkdir ); + if (full_path) IShellLinkW_SetWorkingDirectory( sl, full_path ); } - link_file = get_link_file(package, row); TRACE("Writing shortcut to %s\n", debugstr_w(link_file)); IPersistFile_Save(pf, link_file, FALSE); - msi_free(link_file); err: @@ -3751,14 +3671,14 @@ err: static UINT ACTION_CreateShortcuts(MSIPACKAGE *package) { - UINT rc; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','S','h','o','r','t','c','u','t','`',0}; + MSIQUERY *view; HRESULT res; - MSIQUERY * view; - static const WCHAR Query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','S','h','o','r','t','c','u','t','`',0}; + UINT rc; - rc = MSI_DatabaseOpenViewW(package->db, Query, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; @@ -3767,9 +3687,7 @@ static UINT ACTION_CreateShortcuts(MSIPACKAGE *package) rc = MSI_IterateRecords(view, NULL, ITERATE_CreateShortcuts, package); msiobj_release(&view->hdr); - if (SUCCEEDED(res)) - CoUninitialize(); - + if (SUCCEEDED(res)) CoUninitialize(); return rc; } @@ -3781,25 +3699,17 @@ static UINT ITERATE_RemoveShortcuts( MSIRECORD *row, LPVOID param ) MSICOMPONENT *comp; component = MSI_RecordGetString( row, 4 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - - if (comp->ActionRequest != INSTALLSTATE_ABSENT) - { - TRACE("Component not scheduled for removal %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_ABSENT; - - ui_actiondata( package, szRemoveShortcuts, row ); + msi_ui_actiondata( package, szRemoveShortcuts, row ); link_file = get_link_file( package, row ); @@ -3815,11 +3725,11 @@ static UINT ITERATE_RemoveShortcuts( MSIRECORD *row, LPVOID param ) static UINT ACTION_RemoveShortcuts( MSIPACKAGE *package ) { - UINT rc; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','S','h','o','r','t','c','u','t','`',0}; MSIQUERY *view; - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','S','h','o','r','t','c','u','t','`',0}; + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc != ERROR_SUCCESS) @@ -3827,7 +3737,6 @@ static UINT ACTION_RemoveShortcuts( MSIPACKAGE *package ) rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveShortcuts, package ); msiobj_release( &view->hdr ); - return rc; } @@ -3848,7 +3757,7 @@ static UINT ITERATE_PublishIcon(MSIRECORD *row, LPVOID param) return ERROR_SUCCESS; } - FilePath = build_icon_path(package,FileName); + FilePath = msi_build_icon_path(package, FileName); TRACE("Creating icon file at %s\n",debugstr_w(FilePath)); @@ -3885,20 +3794,20 @@ static UINT ITERATE_PublishIcon(MSIRECORD *row, LPVOID param) static UINT msi_publish_icons(MSIPACKAGE *package) { - UINT r; - MSIQUERY *view; - static const WCHAR query[]= { - 'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ','`','I','c','o','n','`',0}; + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','I','c','o','n','`',0}; + MSIQUERY *view; + UINT r; r = MSI_DatabaseOpenViewW(package->db, query, &view); if (r == ERROR_SUCCESS) { - MSI_IterateRecords(view, NULL, ITERATE_PublishIcon, package); + r = MSI_IterateRecords(view, NULL, ITERATE_PublishIcon, package); msiobj_release(&view->hdr); + if (r != ERROR_SUCCESS) + return r; } - return ERROR_SUCCESS; } @@ -3967,12 +3876,8 @@ static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey) DWORD size; UINT r; - static const WCHAR szProductLanguage[] = - {'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0}; static const WCHAR szARPProductIcon[] = {'A','R','P','P','R','O','D','U','C','T','I','C','O','N',0}; - static const WCHAR szProductVersion[] = - {'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0}; static const WCHAR szAssignment[] = {'A','s','s','i','g','n','m','e','n','t',0}; static const WCHAR szAdvertiseFlags[] = @@ -3994,7 +3899,7 @@ static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey) buffer = msi_dup_property(package->db, szARPProductIcon); if (buffer) { - LPWSTR path = build_icon_path(package,buffer); + LPWSTR path = msi_build_icon_path(package, buffer); msi_reg_set_val_str(hkey, INSTALLPROPERTY_PRODUCTICONW, path); msi_free(path); msi_free(buffer); @@ -4050,26 +3955,21 @@ static UINT msi_publish_upgrade_code(MSIPACKAGE *package) return ERROR_SUCCESS; if (package->Context == MSIINSTALLCONTEXT_MACHINE) - { r = MSIREG_OpenClassesUpgradeCodesKey(upgrade, &hkey, TRUE); - if (r != ERROR_SUCCESS) - goto done; - } else - { r = MSIREG_OpenUserUpgradeCodesKey(upgrade, &hkey, TRUE); - if (r != ERROR_SUCCESS) - goto done; - } + if (r != ERROR_SUCCESS) + { + WARN("failed to open upgrade code key\n"); + msi_free(upgrade); + return ERROR_SUCCESS; + } squash_guid(package->ProductCode, squashed_pc); msi_reg_set_val_str(hkey, squashed_pc, NULL); - RegCloseKey(hkey); - -done: msi_free(upgrade); - return r; + return ERROR_SUCCESS; } static BOOL msi_check_publish(MSIPACKAGE *package) @@ -4078,7 +3978,8 @@ static BOOL msi_check_publish(MSIPACKAGE *package) LIST_FOR_EACH_ENTRY(feature, &package->features, MSIFEATURE, entry) { - if (feature->ActionRequest == INSTALLSTATE_LOCAL) + feature->Action = msi_get_feature_action( package, feature ); + if (feature->Action == INSTALLSTATE_LOCAL) return TRUE; } @@ -4091,7 +3992,8 @@ static BOOL msi_check_unpublish(MSIPACKAGE *package) LIST_FOR_EACH_ENTRY(feature, &package->features, MSIFEATURE, entry) { - if (feature->ActionRequest != INSTALLSTATE_ABSENT) + feature->Action = msi_get_feature_action( package, feature ); + if (feature->Action != INSTALLSTATE_ABSENT) return FALSE; } @@ -4151,13 +4053,18 @@ static UINT msi_publish_patches( MSIPACKAGE *package ) if (r != ERROR_SUCCESS) goto done; - res = RegSetValueExW( patch_key, szLocalPackage, 0, REG_SZ, - (const BYTE *)patch->localfile, - (strlenW(patch->localfile) + 1) * sizeof(WCHAR) ); + res = RegSetValueExW( patch_key, szLocalPackage, 0, REG_SZ, (const BYTE *)patch->localfile, + (strlenW( patch->localfile ) + 1) * sizeof(WCHAR) ); RegCloseKey( patch_key ); if (res != ERROR_SUCCESS) goto done; + if (patch->filename && !CopyFileW( patch->filename, patch->localfile, FALSE )) + { + res = GetLastError(); + ERR("Unable to copy patch package %d\n", res); + goto done; + } res = RegCreateKeyExW( product_patches_key, patch_squashed, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &patch_key, NULL ); if (res != ERROR_SUCCESS) goto done; @@ -4187,12 +4094,6 @@ done: return r; } -/* - * 99% of the work done here is only done for - * advertised installs. However this is where the - * Icon table is processed and written out - * so that is what I am going to do here. - */ static UINT ACTION_PublishProduct(MSIPACKAGE *package) { UINT rc; @@ -4237,12 +4138,11 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package) end: uirow = MSI_CreateRecord( 1 ); MSI_RecordSetStringW( uirow, 1, package->ProductCode ); - ui_actiondata( package, szPublishProduct, uirow ); + msi_ui_actiondata( package, szPublishProduct, uirow ); msiobj_release( &uirow->hdr ); RegCloseKey(hukey); RegCloseKey(hudkey); - return rc; } @@ -4260,9 +4160,8 @@ static WCHAR *get_ini_file_name( MSIPACKAGE *package, MSIRECORD *row ) dirprop = MSI_RecordGetString( row, 3 ); if (dirprop) { - folder = resolve_target_folder( package, dirprop, FALSE, TRUE, NULL ); - if (!folder) - folder = msi_dup_property( package->db, dirprop ); + folder = strdupW( msi_get_target_folder( package, dirprop ) ); + if (!folder) folder = msi_dup_property( package->db, dirprop ); } else folder = msi_dup_property( package->db, szWindowsFolder ); @@ -4274,7 +4173,7 @@ static WCHAR *get_ini_file_name( MSIPACKAGE *package, MSIRECORD *row ) return NULL; } - ret = build_directory_name( 2, folder, ptr ); + ret = msi_build_directory_name( 2, folder, ptr ); msi_free( filename ); msi_free( folder ); @@ -4291,24 +4190,17 @@ static UINT ITERATE_WriteIniValues(MSIRECORD *row, LPVOID param) MSICOMPONENT *comp; component = MSI_RecordGetString(row, 8); - comp = get_loaded_component(package,component); + comp = msi_get_loaded_component(package,component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_LOCAL; - identifier = MSI_RecordGetString(row,1); section = MSI_RecordGetString(row,4); key = MSI_RecordGetString(row,5); @@ -4352,7 +4244,7 @@ static UINT ITERATE_WriteIniValues(MSIRECORD *row, LPVOID param) MSI_RecordSetStringW(uirow,2,deformated_section); MSI_RecordSetStringW(uirow,3,deformated_key); MSI_RecordSetStringW(uirow,4,deformated_value); - ui_actiondata(package,szWriteIniValues,uirow); + msi_ui_actiondata( package, szWriteIniValues, uirow ); msiobj_release( &uirow->hdr ); msi_free(fullname); @@ -4364,18 +4256,15 @@ static UINT ITERATE_WriteIniValues(MSIRECORD *row, LPVOID param) static UINT ACTION_WriteIniValues(MSIPACKAGE *package) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','I','n','i','F','i','l','e','`',0}; + MSIQUERY *view; UINT rc; - MSIQUERY * view; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','I','n','i','F','i','l','e','`',0}; - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) - { - TRACE("no IniFile table\n"); return ERROR_SUCCESS; - } rc = MSI_IterateRecords(view, NULL, ITERATE_WriteIniValues, package); msiobj_release(&view->hdr); @@ -4392,24 +4281,17 @@ static UINT ITERATE_RemoveIniValuesOnUninstall( MSIRECORD *row, LPVOID param ) INT action; component = MSI_RecordGetString( row, 8 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_ABSENT) - { - TRACE("Component not scheduled for removal %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_ABSENT; - identifier = MSI_RecordGetString( row, 1 ); section = MSI_RecordGetString( row, 4 ); key = MSI_RecordGetString( row, 5 ); @@ -4442,7 +4324,7 @@ static UINT ITERATE_RemoveIniValuesOnUninstall( MSIRECORD *row, LPVOID param ) MSI_RecordSetStringW( uirow, 2, deformated_section ); MSI_RecordSetStringW( uirow, 3, deformated_key ); MSI_RecordSetStringW( uirow, 4, deformated_value ); - ui_actiondata( package, szRemoveIniValues, uirow ); + msi_ui_actiondata( package, szRemoveIniValues, uirow ); msiobj_release( &uirow->hdr ); msi_free( deformated_key ); @@ -4461,24 +4343,17 @@ static UINT ITERATE_RemoveIniValuesOnInstall( MSIRECORD *row, LPVOID param ) INT action; component = MSI_RecordGetString( row, 8 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_LOCAL; - identifier = MSI_RecordGetString( row, 1 ); section = MSI_RecordGetString( row, 4 ); key = MSI_RecordGetString( row, 5 ); @@ -4510,7 +4385,7 @@ static UINT ITERATE_RemoveIniValuesOnInstall( MSIRECORD *row, LPVOID param ) MSI_RecordSetStringW( uirow, 2, deformated_section ); MSI_RecordSetStringW( uirow, 3, deformated_key ); MSI_RecordSetStringW( uirow, 4, deformated_value ); - ui_actiondata( package, szRemoveIniValues, uirow ); + msi_ui_actiondata( package, szRemoveIniValues, uirow ); msiobj_release( &uirow->hdr ); msi_free( deformated_key ); @@ -4521,14 +4396,14 @@ static UINT ITERATE_RemoveIniValuesOnInstall( MSIRECORD *row, LPVOID param ) static UINT ACTION_RemoveIniValues( MSIPACKAGE *package ) { - UINT rc; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','I','n','i','F','i','l','e','`',0}; + static const WCHAR remove_query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','R','e','m','o','v','e','I','n','i','F','i','l','e','`',0}; MSIQUERY *view; - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','I','n','i','F','i','l','e','`',0}; - static const WCHAR remove_query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','R','e','m','o','v','e','I','n','i','F','i','l','e','`',0}; + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc == ERROR_SUCCESS) @@ -4538,7 +4413,6 @@ static UINT ACTION_RemoveIniValues( MSIPACKAGE *package ) if (rc != ERROR_SUCCESS) return rc; } - rc = MSI_DatabaseOpenViewW( package->db, remove_query, &view ); if (rc == ERROR_SUCCESS) { @@ -4547,7 +4421,6 @@ static UINT ACTION_RemoveIniValues( MSIPACKAGE *package ) if (rc != ERROR_SUCCESS) return rc; } - return ERROR_SUCCESS; } @@ -4583,23 +4456,27 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param) MSIFILE *file; MSIRECORD *uirow; - filename = MSI_RecordGetString(row,1); - file = get_loaded_file( package, filename ); - + filename = MSI_RecordGetString( row, 1 ); + file = msi_get_loaded_file( package, filename ); if (!file) { - ERR("Unable to find file id %s\n",debugstr_w(filename)); + WARN("unable to find file %s\n", debugstr_w(filename)); + return ERROR_SUCCESS; + } + file->Component->Action = msi_get_component_action( package, file->Component ); + if (file->Component->Action != INSTALLSTATE_LOCAL) + { + TRACE("component not scheduled for installation %s\n", debugstr_w(file->Component->Component)); return ERROR_SUCCESS; } TRACE("Registering %s\n", debugstr_w( file->TargetPath )); - register_dll( file->TargetPath, FALSE ); uirow = MSI_CreateRecord( 2 ); - MSI_RecordSetStringW( uirow, 1, filename ); + MSI_RecordSetStringW( uirow, 1, file->File ); MSI_RecordSetStringW( uirow, 2, file->Component->Directory ); - ui_actiondata( package, szSelfRegModules, uirow ); + msi_ui_actiondata( package, szSelfRegModules, uirow ); msiobj_release( &uirow->hdr ); return ERROR_SUCCESS; @@ -4607,23 +4484,19 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param) static UINT ACTION_SelfRegModules(MSIPACKAGE *package) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','S','e','l','f','R','e','g','`',0}; + MSIQUERY *view; UINT rc; - MSIQUERY * view; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','S','e','l','f','R','e','g','`',0}; - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) - { - TRACE("no SelfReg table\n"); return ERROR_SUCCESS; - } - MSI_IterateRecords(view, NULL, ITERATE_SelfRegModules, package); + rc = MSI_IterateRecords(view, NULL, ITERATE_SelfRegModules, package); msiobj_release(&view->hdr); - - return ERROR_SUCCESS; + return rc; } static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param ) @@ -4634,22 +4507,26 @@ static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param ) MSIRECORD *uirow; filename = MSI_RecordGetString( row, 1 ); - file = get_loaded_file( package, filename ); - + file = msi_get_loaded_file( package, filename ); if (!file) { - ERR("Unable to find file id %s\n", debugstr_w(filename)); + WARN("unable to find file %s\n", debugstr_w(filename)); + return ERROR_SUCCESS; + } + file->Component->Action = msi_get_component_action( package, file->Component ); + if (file->Component->Action != INSTALLSTATE_ABSENT) + { + TRACE("component not scheduled for removal %s\n", debugstr_w(file->Component->Component)); return ERROR_SUCCESS; } TRACE("Unregistering %s\n", debugstr_w( file->TargetPath )); - register_dll( file->TargetPath, TRUE ); uirow = MSI_CreateRecord( 2 ); - MSI_RecordSetStringW( uirow, 1, filename ); + MSI_RecordSetStringW( uirow, 1, file->File ); MSI_RecordSetStringW( uirow, 2, file->Component->Directory ); - ui_actiondata( package, szSelfUnregModules, uirow ); + msi_ui_actiondata( package, szSelfUnregModules, uirow ); msiobj_release( &uirow->hdr ); return ERROR_SUCCESS; @@ -4657,23 +4534,19 @@ static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param ) static UINT ACTION_SelfUnregModules( MSIPACKAGE *package ) { - UINT rc; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','S','e','l','f','R','e','g','`',0}; MSIQUERY *view; - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','S','e','l','f','R','e','g','`',0}; + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc != ERROR_SUCCESS) - { - TRACE("no SelfReg table\n"); return ERROR_SUCCESS; - } - MSI_IterateRecords( view, NULL, ITERATE_SelfUnregModules, package ); + rc = MSI_IterateRecords( view, NULL, ITERATE_SelfUnregModules, package ); msiobj_release( &view->hdr ); - - return ERROR_SUCCESS; + return rc; } static UINT ACTION_PublishFeatures(MSIPACKAGE *package) @@ -4705,9 +4578,9 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package) BOOL absent = FALSE; MSIRECORD *uirow; - if (feature->ActionRequest != INSTALLSTATE_LOCAL && - feature->ActionRequest != INSTALLSTATE_SOURCE && - feature->ActionRequest != INSTALLSTATE_ADVERTISED) absent = TRUE; + if (feature->Action != INSTALLSTATE_LOCAL && + feature->Action != INSTALLSTATE_SOURCE && + feature->Action != INSTALLSTATE_ADVERTISED) absent = TRUE; size = 1; LIST_FOR_EACH_ENTRY( cl, &feature->Components, ComponentList, entry ) @@ -4771,9 +4644,9 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package) /* the UI chunk */ uirow = MSI_CreateRecord( 1 ); MSI_RecordSetStringW( uirow, 1, feature->Feature ); - ui_actiondata( package, szPublishFeatures, uirow); + msi_ui_actiondata( package, szPublishFeatures, uirow ); msiobj_release( &uirow->hdr ); - /* FIXME: call ui_progress? */ + /* FIXME: call msi_ui_progress? */ } end: @@ -4808,7 +4681,7 @@ static UINT msi_unpublish_feature(MSIPACKAGE *package, MSIFEATURE *feature) uirow = MSI_CreateRecord( 1 ); MSI_RecordSetStringW( uirow, 1, feature->Feature ); - ui_actiondata( package, szUnpublishFeatures, uirow ); + msi_ui_actiondata( package, szUnpublishFeatures, uirow ); msiobj_release( &uirow->hdr ); return ERROR_SUCCESS; @@ -4837,8 +4710,6 @@ static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey) const WCHAR *prop, *key; static const WCHAR date_fmt[] = {'%','i','%','0','2','i','%','0','2','i',0}; - static const WCHAR szWindowsInstaller[] = - {'W','i','n','d','o','w','s','I','n','s','t','a','l','l','e','r',0}; static const WCHAR modpath_fmt[] = {'M','s','i','E','x','e','c','.','e','x','e',' ', '/','I','[','P','r','o','d','u','c','t','C','o','d','e',']',0}; @@ -4848,10 +4719,6 @@ static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey) {'U','n','i','n','s','t','a','l','l','S','t','r','i','n','g',0}; static const WCHAR szEstimatedSize[] = {'E','s','t','i','m','a','t','e','d','S','i','z','e',0}; - static const WCHAR szProductLanguage[] = - {'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0}; - static const WCHAR szProductVersion[] = - {'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0}; static const WCHAR szDisplayVersion[] = {'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0}; static const WCHAR szInstallSource[] = @@ -4904,6 +4771,10 @@ static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey) {'A','R','P','U','R','L','U','P','D','A','T','E','I','N','F','O',0}; static const WCHAR szURLUpdateInfo[] = {'U','R','L','U','p','d','a','t','e','I','n','f','o',0}; + static const WCHAR szARPSYSTEMCOMPONENT[] = + {'A','R','P','S','Y','S','T','E','M','C','O','M','P','O','N','E','N','T',0}; + static const WCHAR szSystemComponent[] = + {'S','y','s','t','e','m','C','o','m','p','o','n','e','n','t',0}; static const WCHAR *propval[] = { szARPAUTHORIZEDCDFPREFIX, szAuthorizedCDFPrefix, @@ -4913,7 +4784,7 @@ static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey) szARPHELPLINK, szHelpLink, szARPHELPTELEPHONE, szHelpTelephone, szARPINSTALLLOCATION, szInstallLocation, - cszSourceDir, szInstallSource, + szSourceDir, szInstallSource, szManufacturer, szPublisher, szARPREADME, szReadme, szARPSIZE, szSize, @@ -4933,7 +4804,10 @@ static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey) } msi_reg_set_val_dword(hkey, szWindowsInstaller, 1); - + if (msi_get_property_int( package->db, szARPSYSTEMCOMPONENT, 0 )) + { + msi_reg_set_val_dword( hkey, szSystemComponent, 1 ); + } size = deformat_string(package, modpath_fmt, &buffer); RegSetValueExW(hkey, szModifyPath, 0, REG_EXPAND_SZ, (LPBYTE)buffer, size); RegSetValueExW(hkey, szUninstallString, 0, REG_EXPAND_SZ, (LPBYTE)buffer, size); @@ -4969,27 +4843,21 @@ static UINT ACTION_RegisterProduct(MSIPACKAGE *package) WCHAR squashed_pc[SQUISH_GUID_SIZE]; MSIRECORD *uirow; LPWSTR upgrade_code; - HKEY hkey, props; - HKEY upgrade; + HKEY hkey, props, upgrade_key; UINT rc; /* FIXME: also need to publish if the product is in advertise mode */ if (!msi_check_publish(package)) return ERROR_SUCCESS; - rc = MSIREG_OpenUninstallKey(package, &hkey, TRUE); + rc = MSIREG_OpenUninstallKey(package->ProductCode, package->platform, &hkey, TRUE); if (rc != ERROR_SUCCESS) return rc; - rc = MSIREG_OpenInstallProps(package->ProductCode, package->Context, - NULL, &props, TRUE); + rc = MSIREG_OpenInstallProps(package->ProductCode, package->Context, NULL, &props, TRUE); if (rc != ERROR_SUCCESS) goto done; - msi_reg_set_val_str( props, INSTALLPROPERTY_LOCALPACKAGEW, package->db->localfile ); - msi_free( package->db->localfile ); - package->db->localfile = NULL; - rc = msi_publish_install_properties(package, hkey); if (rc != ERROR_SUCCESS) goto done; @@ -5001,17 +4869,22 @@ static UINT ACTION_RegisterProduct(MSIPACKAGE *package) upgrade_code = msi_dup_property(package->db, szUpgradeCode); if (upgrade_code) { - MSIREG_OpenUpgradeCodesKey(upgrade_code, &upgrade, TRUE); - squash_guid(package->ProductCode, squashed_pc); - msi_reg_set_val_str(upgrade, squashed_pc, NULL); - RegCloseKey(upgrade); - msi_free(upgrade_code); + rc = MSIREG_OpenUpgradeCodesKey( upgrade_code, &upgrade_key, TRUE ); + if (rc == ERROR_SUCCESS) + { + squash_guid( package->ProductCode, squashed_pc ); + msi_reg_set_val_str( upgrade_key, squashed_pc, NULL ); + RegCloseKey( upgrade_key ); + } + msi_free( upgrade_code ); } + msi_reg_set_val_str( props, INSTALLPROPERTY_LOCALPACKAGEW, package->localfile ); + package->delete_on_close = FALSE; done: uirow = MSI_CreateRecord( 1 ); MSI_RecordSetStringW( uirow, 1, package->ProductCode ); - ui_actiondata( package, szRegisterProduct, uirow ); + msi_ui_actiondata( package, szRegisterProduct, uirow ); msiobj_release( &uirow->hdr ); RegCloseKey(hkey); @@ -5020,35 +4893,65 @@ done: static UINT ACTION_InstallExecute(MSIPACKAGE *package) { - return execute_script(package,INSTALL_SCRIPT); + return execute_script(package, SCRIPT_INSTALL); } -static UINT msi_unpublish_product(MSIPACKAGE *package, WCHAR *remove) +static UINT ITERATE_UnpublishIcon( MSIRECORD *row, LPVOID param ) { + MSIPACKAGE *package = param; + const WCHAR *icon = MSI_RecordGetString( row, 1 ); + WCHAR *p, *icon_path; + + if (!icon) return ERROR_SUCCESS; + if ((icon_path = msi_build_icon_path( package, icon ))) + { + TRACE("removing icon file %s\n", debugstr_w(icon_path)); + DeleteFileW( icon_path ); + if ((p = strrchrW( icon_path, '\\' ))) + { + *p = 0; + RemoveDirectoryW( icon_path ); + } + msi_free( icon_path ); + } + return ERROR_SUCCESS; +} + +static UINT msi_unpublish_icons( MSIPACKAGE *package ) +{ + static const WCHAR query[]= { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','I','c','o','n','`',0}; + MSIQUERY *view; + UINT r; + + r = MSI_DatabaseOpenViewW( package->db, query, &view ); + if (r == ERROR_SUCCESS) + { + r = MSI_IterateRecords( view, NULL, ITERATE_UnpublishIcon, package ); + msiobj_release( &view->hdr ); + if (r != ERROR_SUCCESS) + return r; + } + return ERROR_SUCCESS; +} + +static UINT msi_unpublish_product( MSIPACKAGE *package, const WCHAR *remove ) +{ + static const WCHAR szUpgradeCode[] = {'U','p','g','r','a','d','e','C','o','d','e',0}; WCHAR *upgrade, **features; BOOL full_uninstall = TRUE; MSIFEATURE *feature; MSIPATCHINFO *patch; + UINT i; - static const WCHAR szUpgradeCode[] = - {'U','p','g','r','a','d','e','C','o','d','e',0}; - - features = msi_split_string(remove, ','); - if (!features) + LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) { - ERR("REMOVE feature list is empty!\n"); - return ERROR_FUNCTION_FAILED; + if (feature->Action == INSTALLSTATE_LOCAL) full_uninstall = FALSE; } - - if (!strcmpW( features[0], szAll )) - full_uninstall = TRUE; - else + features = msi_split_string( remove, ',' ); + for (i = 0; features && features[i]; i++) { - LIST_FOR_EACH_ENTRY(feature, &package->features, MSIFEATURE, entry) - { - if (feature->Action != INSTALLSTATE_ABSENT) - full_uninstall = FALSE; - } + if (!strcmpW( features[i], szAll )) full_uninstall = TRUE; } msi_free(features); @@ -5057,7 +4960,7 @@ static UINT msi_unpublish_product(MSIPACKAGE *package, WCHAR *remove) MSIREG_DeleteProductKey(package->ProductCode); MSIREG_DeleteUserDataProductKey(package->ProductCode); - MSIREG_DeleteUninstallKey(package); + MSIREG_DeleteUninstallKey(package->ProductCode, package->platform); MSIREG_DeleteLocalClassesProductKey(package->ProductCode); MSIREG_DeleteLocalClassesFeaturesKey(package->ProductCode); @@ -5075,8 +4978,17 @@ static UINT msi_unpublish_product(MSIPACKAGE *package, WCHAR *remove) LIST_FOR_EACH_ENTRY(patch, &package->patches, MSIPATCHINFO, entry) { MSIREG_DeleteUserDataPatchKey(patch->patchcode, package->Context); + if (!strcmpW( package->ProductCode, patch->products )) + { + TRACE("removing local patch package %s\n", debugstr_w(patch->localfile)); + patch->delete_on_close = TRUE; + } + /* FIXME: remove local patch package if this is the last product */ } + TRACE("removing local package %s\n", debugstr_w(package->localfile)); + package->delete_on_close = TRUE; + msi_unpublish_icons( package ); return ERROR_SUCCESS; } @@ -5093,15 +5005,13 @@ static UINT ACTION_InstallFinalize(MSIPACKAGE *package) if (rc != ERROR_SUCCESS) return rc; - /* then handle Commit Actions */ - rc = execute_script(package,COMMIT_SCRIPT); + /* then handle commit actions */ + rc = execute_script(package, SCRIPT_COMMIT); if (rc != ERROR_SUCCESS) return rc; remove = msi_dup_property(package->db, szRemove); - if (remove) - rc = msi_unpublish_product(package, remove); - + rc = msi_unpublish_product(package, remove); msi_free(remove); return rc; } @@ -5155,6 +5065,43 @@ UINT ACTION_ForceReboot(MSIPACKAGE *package) return ERROR_INSTALL_SUSPEND; } +WCHAR *msi_build_error_string( MSIPACKAGE *package, UINT error, DWORD count, ... ) +{ + static const WCHAR query[] = + {'S','E','L','E','C','T',' ','`','M','e','s','s','a','g','e','`',' ', + 'F','R','O','M',' ','`','E','r','r','o','r','`',' ','W','H','E','R','E',' ', + '`','E','r','r','o','r','`',' ','=',' ','%','i',0}; + MSIRECORD *rec, *row; + DWORD i, size = 0; + va_list va; + const WCHAR *str; + WCHAR *data; + + if (!(row = MSI_QueryGetRecord( package->db, query, error ))) return 0; + + rec = MSI_CreateRecord( count + 2 ); + str = MSI_RecordGetString( row, 1 ); + MSI_RecordSetStringW( rec, 0, str ); + msiobj_release( &row->hdr ); + MSI_RecordSetInteger( rec, 1, error ); + + va_start( va, count ); + for (i = 0; i < count; i++) + { + str = va_arg( va, const WCHAR *); + MSI_RecordSetStringW( rec, i + 2, str ); + } + va_end( va ); + + MSI_FormatRecordW( package, rec, NULL, &size ); + size++; + data = msi_alloc( size * sizeof(WCHAR) ); + if (size > 1) MSI_FormatRecordW( package, rec, data, &size ); + else data[0] = 0; + msiobj_release( &rec->hdr ); + return data; +} + static UINT ACTION_ResolveSource(MSIPACKAGE* package) { DWORD attrib; @@ -5172,8 +5119,7 @@ static UINT ACTION_ResolveSource(MSIPACKAGE* package) attrib = GetFileAttributesW(package->db->path); if (attrib == INVALID_FILE_ATTRIBUTES) { - LPWSTR prompt; - LPWSTR msg; + LPWSTR prompt, msg; DWORD size = 0; rc = MsiSourceListGetInfoW(package->ProductCode, NULL, @@ -5189,18 +5135,19 @@ static UINT ACTION_ResolveSource(MSIPACKAGE* package) else prompt = strdupW(package->db->path); - msg = generate_error_string(package,1302,1,prompt); + msg = msi_build_error_string(package, 1302, 1, prompt); + msi_free(prompt); while(attrib == INVALID_FILE_ATTRIBUTES) { - rc = MessageBoxW(NULL,msg,NULL,MB_OKCANCEL); + rc = MessageBoxW(NULL, msg, NULL, MB_OKCANCEL); if (rc == IDCANCEL) { - rc = ERROR_INSTALL_USEREXIT; - break; + msi_free(msg); + return ERROR_INSTALL_USEREXIT; } attrib = GetFileAttributesW(package->db->path); } - msi_free(prompt); + msi_free(msg); rc = ERROR_SUCCESS; } else @@ -5257,7 +5204,7 @@ static UINT ACTION_RegisterUser(MSIPACKAGE *package) end: uirow = MSI_CreateRecord( 1 ); MSI_RecordSetStringW( uirow, 1, productid ); - ui_actiondata( package, szRegisterUser, uirow ); + msi_ui_actiondata( package, szRegisterUser, uirow ); msiobj_release( &uirow->hdr ); msi_free(productid); @@ -5275,6 +5222,34 @@ static UINT ACTION_ExecuteAction(MSIPACKAGE *package) return rc; } +WCHAR *msi_create_component_advertise_string( MSIPACKAGE *package, MSICOMPONENT *component, const WCHAR *feature ) +{ + static const WCHAR fmt[] = {'%','s','%','s','%','c','%','s',0}; + WCHAR productid_85[21], component_85[21], *ret; + GUID clsid; + DWORD sz; + + /* > is used if there is a component GUID and < if not. */ + + productid_85[0] = 0; + component_85[0] = 0; + CLSIDFromString( package->ProductCode, &clsid ); + + encode_base85_guid( &clsid, productid_85 ); + if (component) + { + CLSIDFromString( component->ComponentId, &clsid ); + encode_base85_guid( &clsid, component_85 ); + } + + TRACE("product=%s feature=%s component=%s\n", debugstr_w(productid_85), debugstr_w(feature), + debugstr_w(component_85)); + + sz = 20 + strlenW( feature ) + 20 + 3; + ret = msi_alloc_zero( sz * sizeof(WCHAR) ); + if (ret) sprintfW( ret, fmt, productid_85, feature, component ? '>' : '<', component_85 ); + return ret; +} static UINT ITERATE_PublishComponent(MSIRECORD *rec, LPVOID param) { @@ -5290,21 +5265,21 @@ static UINT ITERATE_PublishComponent(MSIRECORD *rec, LPVOID param) int len; feature = MSI_RecordGetString(rec, 5); - feat = get_loaded_feature(package, feature); + feat = msi_get_loaded_feature(package, feature); if (!feat) return ERROR_SUCCESS; - if (feat->ActionRequest != INSTALLSTATE_LOCAL && - feat->ActionRequest != INSTALLSTATE_SOURCE && - feat->ActionRequest != INSTALLSTATE_ADVERTISED) + feat->Action = msi_get_feature_action( package, feat ); + if (feat->Action != INSTALLSTATE_LOCAL && + feat->Action != INSTALLSTATE_SOURCE && + feat->Action != INSTALLSTATE_ADVERTISED) { - TRACE("Feature %s not scheduled for installation\n", debugstr_w(feature)); - feat->Action = feat->Installed; + TRACE("feature not scheduled for installation %s\n", debugstr_w(feature)); return ERROR_SUCCESS; } component = MSI_RecordGetString(rec, 3); - comp = get_loaded_component(package, component); + comp = msi_get_loaded_component(package, component); if (!comp) return ERROR_SUCCESS; @@ -5315,7 +5290,7 @@ static UINT ITERATE_PublishComponent(MSIRECORD *rec, LPVOID param) if (rc != ERROR_SUCCESS) goto end; - advertise = create_component_advertise_string( package, comp, feature ); + advertise = msi_create_component_advertise_string( package, comp, feature ); text = MSI_RecordGetString( rec, 4 ); if (text) { @@ -5369,7 +5344,7 @@ end: uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, compgroupid ); MSI_RecordSetStringW( uirow, 2, qualifier); - ui_actiondata( package, szPublishComponents, uirow); + msi_ui_actiondata( package, szPublishComponents, uirow ); msiobj_release( &uirow->hdr ); /* FIXME: call ui_progress? */ @@ -5382,20 +5357,18 @@ end: */ static UINT ACTION_PublishComponents(MSIPACKAGE *package) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t','`',0}; + MSIQUERY *view; UINT rc; - MSIQUERY * view; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','P','u','b','l','i','s','h', - 'C','o','m','p','o','n','e','n','t','`',0}; - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, ITERATE_PublishComponent, package); msiobj_release(&view->hdr); - return rc; } @@ -5416,19 +5389,19 @@ static UINT ITERATE_UnpublishComponent( MSIRECORD *rec, LPVOID param ) LONG res; feature = MSI_RecordGetString( rec, 5 ); - feat = get_loaded_feature( package, feature ); + feat = msi_get_loaded_feature( package, feature ); if (!feat) return ERROR_SUCCESS; - if (feat->ActionRequest != INSTALLSTATE_ABSENT) + feat->Action = msi_get_feature_action( package, feat ); + if (feat->Action != INSTALLSTATE_ABSENT) { - TRACE("Feature %s not scheduled for removal\n", debugstr_w(feature)); - feat->Action = feat->Installed; + TRACE("feature not scheduled for removal %s\n", debugstr_w(feature)); return ERROR_SUCCESS; } component = MSI_RecordGetString( rec, 3 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; @@ -5448,7 +5421,7 @@ static UINT ITERATE_UnpublishComponent( MSIRECORD *rec, LPVOID param ) uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, compgroupid ); MSI_RecordSetStringW( uirow, 2, qualifier ); - ui_actiondata( package, szUnpublishComponents, uirow ); + msi_ui_actiondata( package, szUnpublishComponents, uirow ); msiobj_release( &uirow->hdr ); return ERROR_SUCCESS; @@ -5456,12 +5429,11 @@ static UINT ITERATE_UnpublishComponent( MSIRECORD *rec, LPVOID param ) static UINT ACTION_UnpublishComponents( MSIPACKAGE *package ) { - UINT rc; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t','`',0}; MSIQUERY *view; - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','P','u','b','l','i','s','h', - 'C','o','m','p','o','n','e','n','t','`',0}; + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc != ERROR_SUCCESS) @@ -5469,29 +5441,39 @@ static UINT ACTION_UnpublishComponents( MSIPACKAGE *package ) rc = MSI_IterateRecords( view, NULL, ITERATE_UnpublishComponent, package ); msiobj_release( &view->hdr ); - return rc; } static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param) { + static const WCHAR query[] = + {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','C','o','m','p','o','n','e','n','t','`',' ','W','H','E','R','E',' ', + '`','C','o','m','p','o','n','e','n','t','`',' ','=','\'','%','s','\'',0}; MSIPACKAGE *package = param; + MSICOMPONENT *component; MSIRECORD *row; MSIFILE *file; - SC_HANDLE hscm, service = NULL; + SC_HANDLE hscm = NULL, service = NULL; LPCWSTR comp, key; LPWSTR name = NULL, disp = NULL, load_order = NULL, serv_name = NULL; LPWSTR depends = NULL, pass = NULL, args = NULL, image_path = NULL; DWORD serv_type, start_type, err_control; SERVICE_DESCRIPTIONW sd = {NULL}; - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R', 'O','M',' ', - '`','C','o','m','p','o','n','e','n','t','`',' ', - 'W','H','E','R','E',' ', - '`','C','o','m','p','o','n','e','n','t','`',' ', - '=','\'','%','s','\'',0}; - + comp = MSI_RecordGetString( rec, 12 ); + component = msi_get_loaded_component( package, comp ); + if (!component) + { + WARN("service component not found\n"); + goto done; + } + component->Action = msi_get_component_action( package, component ); + if (component->Action != INSTALLSTATE_LOCAL) + { + TRACE("component not scheduled for installation %s\n", debugstr_w(comp)); + goto done; + } hscm = OpenSCManagerW(NULL, SERVICES_ACTIVE_DATABASEW, GENERIC_WRITE); if (!hscm) { @@ -5499,10 +5481,6 @@ static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param) goto done; } - comp = MSI_RecordGetString( rec, 12 ); - if (!get_loaded_component( package, comp )) - goto done; - start_type = MSI_RecordGetInteger(rec, 5); if (start_type == SERVICE_BOOT_START || start_type == SERVICE_SYSTEM_START) goto done; @@ -5522,12 +5500,11 @@ static UINT ITERATE_InstallService(MSIRECORD *rec, LPVOID param) row = MSI_QueryGetRecord(package->db, query, comp); if (!row) { - ERR("Control query failed!\n"); + ERR("Query failed\n"); goto done; } key = MSI_RecordGetString(row, 6); - - file = get_loaded_file(package, key); + file = msi_get_loaded_file(package, key); msiobj_release(&row->hdr); if (!file) { @@ -5579,19 +5556,18 @@ done: static UINT ACTION_InstallServices( MSIPACKAGE *package ) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + 'S','e','r','v','i','c','e','I','n','s','t','a','l','l',0}; + MSIQUERY *view; UINT rc; - MSIQUERY * view; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'S','e','r','v','i','c','e','I','n','s','t','a','l','l',0}; - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, ITERATE_InstallService, package); msiobj_release(&view->hdr); - return rc; } @@ -5647,31 +5623,27 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param) SC_HANDLE scm = NULL, service = NULL; LPCWSTR component, *vector = NULL; LPWSTR name, args, display_name = NULL; - DWORD event, numargs, len; + DWORD event, numargs, len, wait, dummy; UINT r = ERROR_FUNCTION_FAILED; + SERVICE_STATUS_PROCESS status; + ULONGLONG start_time; component = MSI_RecordGetString(rec, 6); - comp = get_loaded_component(package, component); + comp = msi_get_loaded_component(package, component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_LOCAL; - deformat_string(package, MSI_RecordGetString(rec, 2), &name); deformat_string(package, MSI_RecordGetString(rec, 4), &args); event = MSI_RecordGetInteger(rec, 3); + wait = MSI_RecordGetInteger(rec, 5); if (!(event & msidbServiceControlEventStart)) { @@ -5694,7 +5666,7 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param) GetServiceDisplayNameW( scm, name, display_name, &len ); } - service = OpenServiceW(scm, name, SERVICE_START); + service = OpenServiceW(scm, name, SERVICE_START|SERVICE_QUERY_STATUS); if (!service) { ERR("Failed to open service %s (%u)\n", debugstr_w(name), GetLastError()); @@ -5711,12 +5683,39 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param) } r = ERROR_SUCCESS; + if (wait) + { + /* wait for at most 30 seconds for the service to be up and running */ + if (!QueryServiceStatusEx(service, SC_STATUS_PROCESS_INFO, + (BYTE *)&status, sizeof(SERVICE_STATUS_PROCESS), &dummy)) + { + TRACE("failed to query service status (%u)\n", GetLastError()); + goto done; + } + start_time = GetTickCount64(); + while (status.dwCurrentState == SERVICE_START_PENDING) + { + if (GetTickCount64() - start_time > 30000) break; + Sleep(1000); + if (!QueryServiceStatusEx(service, SC_STATUS_PROCESS_INFO, + (BYTE *)&status, sizeof(SERVICE_STATUS_PROCESS), &dummy)) + { + TRACE("failed to query service status (%u)\n", GetLastError()); + goto done; + } + } + if (status.dwCurrentState != SERVICE_RUNNING) + { + WARN("service failed to start %u\n", status.dwCurrentState); + r = ERROR_FUNCTION_FAILED; + } + } done: uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, display_name ); MSI_RecordSetStringW( uirow, 2, name ); - ui_actiondata( package, szStartServices, uirow ); + msi_ui_actiondata( package, szStartServices, uirow ); msiobj_release( &uirow->hdr ); CloseServiceHandle(service); @@ -5731,12 +5730,11 @@ done: static UINT ACTION_StartServices( MSIPACKAGE *package ) { - UINT rc; - MSIQUERY *view; - static const WCHAR query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0 }; + 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0}; + MSIQUERY *view; + UINT rc; rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) @@ -5744,7 +5742,6 @@ static UINT ACTION_StartServices( MSIPACKAGE *package ) rc = MSI_IterateRecords(view, NULL, ITERATE_StartService, package); msiobj_release(&view->hdr); - return rc; } @@ -5849,24 +5846,17 @@ static UINT ITERATE_StopService( MSIRECORD *rec, LPVOID param ) return ERROR_SUCCESS; component = MSI_RecordGetString( rec, 6 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_ABSENT) - { - TRACE("Component not scheduled for removal: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_ABSENT; - scm = OpenSCManagerW( NULL, NULL, SC_MANAGER_CONNECT ); if (!scm) { @@ -5890,7 +5880,7 @@ done: uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, display_name ); MSI_RecordSetStringW( uirow, 2, name ); - ui_actiondata( package, szStopServices, uirow ); + msi_ui_actiondata( package, szStopServices, uirow ); msiobj_release( &uirow->hdr ); msi_free( name ); @@ -5900,12 +5890,11 @@ done: static UINT ACTION_StopServices( MSIPACKAGE *package ) { - UINT rc; - MSIQUERY *view; - static const WCHAR query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0 }; + 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0}; + MSIQUERY *view; + UINT rc; rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) @@ -5913,7 +5902,6 @@ static UINT ACTION_StopServices( MSIPACKAGE *package ) rc = MSI_IterateRecords(view, NULL, ITERATE_StopService, package); msiobj_release(&view->hdr); - return rc; } @@ -5932,24 +5920,17 @@ static UINT ITERATE_DeleteService( MSIRECORD *rec, LPVOID param ) return ERROR_SUCCESS; component = MSI_RecordGetString(rec, 6); - comp = get_loaded_component(package, component); + comp = msi_get_loaded_component(package, component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_ABSENT) - { - TRACE("Component not scheduled for removal: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_ABSENT; - deformat_string( package, MSI_RecordGetString(rec, 2), &name ); stop_service( name ); @@ -5982,7 +5963,7 @@ done: uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, display_name ); MSI_RecordSetStringW( uirow, 2, name ); - ui_actiondata( package, szDeleteServices, uirow ); + msi_ui_actiondata( package, szDeleteServices, uirow ); msiobj_release( &uirow->hdr ); CloseServiceHandle( service ); @@ -5995,12 +5976,11 @@ done: static UINT ACTION_DeleteServices( MSIPACKAGE *package ) { - UINT rc; - MSIQUERY *view; - static const WCHAR query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0 }; + 'S','e','r','v','i','c','e','C','o','n','t','r','o','l',0}; + MSIQUERY *view; + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc != ERROR_SUCCESS) @@ -6008,7 +5988,6 @@ static UINT ACTION_DeleteServices( MSIPACKAGE *package ) rc = MSI_IterateRecords( view, NULL, ITERATE_DeleteService, package ); msiobj_release( &view->hdr ); - return rc; } @@ -6032,23 +6011,23 @@ static UINT ITERATE_InstallODBCDriver( MSIRECORD *rec, LPVOID param ) 'F','i','l','e','U','s','a','g','e','=','1',0}; component = MSI_RecordGetString( rec, 2 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - desc = MSI_RecordGetString(rec, 3); file_key = MSI_RecordGetString( rec, 4 ); - if (file_key) driver_file = get_loaded_file( package, file_key ); + if (file_key) driver_file = msi_get_loaded_file( package, file_key ); file_key = MSI_RecordGetString( rec, 5 ); - if (file_key) setup_file = get_loaded_file( package, file_key ); + if (file_key) setup_file = msi_get_loaded_file( package, file_key ); if (!driver_file) { @@ -6097,7 +6076,7 @@ static UINT ITERATE_InstallODBCDriver( MSIRECORD *rec, LPVOID param ) MSI_RecordSetStringW( uirow, 1, desc ); MSI_RecordSetStringW( uirow, 2, MSI_RecordGetString(rec, 2) ); MSI_RecordSetStringW( uirow, 3, driver_file->Component->Directory ); - ui_actiondata( package, szInstallODBC, uirow ); + msi_ui_actiondata( package, szInstallODBC, uirow ); msiobj_release( &uirow->hdr ); msi_free(driver); @@ -6124,23 +6103,23 @@ static UINT ITERATE_InstallODBCTranslator( MSIRECORD *rec, LPVOID param ) 'S','e','t','u','p','=','%','s',0}; component = MSI_RecordGetString( rec, 2 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - desc = MSI_RecordGetString(rec, 3); file_key = MSI_RecordGetString( rec, 4 ); - if (file_key) translator_file = get_loaded_file( package, file_key ); + if (file_key) translator_file = msi_get_loaded_file( package, file_key ); file_key = MSI_RecordGetString( rec, 5 ); - if (file_key) setup_file = get_loaded_file( package, file_key ); + if (file_key) setup_file = msi_get_loaded_file( package, file_key ); if (!translator_file) { @@ -6185,7 +6164,7 @@ static UINT ITERATE_InstallODBCTranslator( MSIRECORD *rec, LPVOID param ) MSI_RecordSetStringW( uirow, 1, desc ); MSI_RecordSetStringW( uirow, 2, MSI_RecordGetString(rec, 2) ); MSI_RecordSetStringW( uirow, 3, translator_file->Component->Directory ); - ui_actiondata( package, szInstallODBC, uirow ); + msi_ui_actiondata( package, szInstallODBC, uirow ); msiobj_release( &uirow->hdr ); msi_free(translator); @@ -6210,13 +6189,14 @@ static UINT ITERATE_InstallODBCDataSource( MSIRECORD *rec, LPVOID param ) 'D','S','N','=','%','s',0 }; component = MSI_RecordGetString( rec, 2 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } @@ -6245,7 +6225,7 @@ static UINT ITERATE_InstallODBCDataSource( MSIRECORD *rec, LPVOID param ) MSI_RecordSetStringW( uirow, 1, desc ); MSI_RecordSetStringW( uirow, 2, MSI_RecordGetString(rec, 2) ); MSI_RecordSetInteger( uirow, 3, request ); - ui_actiondata( package, szInstallODBC, uirow ); + msi_ui_actiondata( package, szInstallODBC, uirow ); msiobj_release( &uirow->hdr ); msi_free(attrs); @@ -6255,43 +6235,43 @@ static UINT ITERATE_InstallODBCDataSource( MSIRECORD *rec, LPVOID param ) static UINT ACTION_InstallODBC( MSIPACKAGE *package ) { - UINT rc; - MSIQUERY *view; - static const WCHAR driver_query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'O','D','B','C','D','r','i','v','e','r',0 }; - + 'O','D','B','C','D','r','i','v','e','r',0}; static const WCHAR translator_query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0 }; - + 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0}; static const WCHAR source_query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'O','D','B','C','D','a','t','a','S','o','u','r','c','e',0 }; + 'O','D','B','C','D','a','t','a','S','o','u','r','c','e',0}; + MSIQUERY *view; + UINT rc; rc = MSI_DatabaseOpenViewW(package->db, driver_query, &view); - if (rc != ERROR_SUCCESS) - return ERROR_SUCCESS; - - rc = MSI_IterateRecords(view, NULL, ITERATE_InstallODBCDriver, package); - msiobj_release(&view->hdr); - + if (rc == ERROR_SUCCESS) + { + rc = MSI_IterateRecords(view, NULL, ITERATE_InstallODBCDriver, package); + msiobj_release(&view->hdr); + if (rc != ERROR_SUCCESS) + return rc; + } rc = MSI_DatabaseOpenViewW(package->db, translator_query, &view); - if (rc != ERROR_SUCCESS) - return ERROR_SUCCESS; - - rc = MSI_IterateRecords(view, NULL, ITERATE_InstallODBCTranslator, package); - msiobj_release(&view->hdr); - + if (rc == ERROR_SUCCESS) + { + rc = MSI_IterateRecords(view, NULL, ITERATE_InstallODBCTranslator, package); + msiobj_release(&view->hdr); + if (rc != ERROR_SUCCESS) + return rc; + } rc = MSI_DatabaseOpenViewW(package->db, source_query, &view); - if (rc != ERROR_SUCCESS) - return ERROR_SUCCESS; - - rc = MSI_IterateRecords(view, NULL, ITERATE_InstallODBCDataSource, package); - msiobj_release(&view->hdr); - - return rc; + if (rc == ERROR_SUCCESS) + { + rc = MSI_IterateRecords(view, NULL, ITERATE_InstallODBCDataSource, package); + msiobj_release(&view->hdr); + if (rc != ERROR_SUCCESS) + return rc; + } + return ERROR_SUCCESS; } static UINT ITERATE_RemoveODBCDriver( MSIRECORD *rec, LPVOID param ) @@ -6303,13 +6283,14 @@ static UINT ITERATE_RemoveODBCDriver( MSIRECORD *rec, LPVOID param ) LPCWSTR desc, component; component = MSI_RecordGetString( rec, 2 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } @@ -6326,7 +6307,7 @@ static UINT ITERATE_RemoveODBCDriver( MSIRECORD *rec, LPVOID param ) uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, desc ); MSI_RecordSetStringW( uirow, 2, MSI_RecordGetString(rec, 2) ); - ui_actiondata( package, szRemoveODBC, uirow ); + msi_ui_actiondata( package, szRemoveODBC, uirow ); msiobj_release( &uirow->hdr ); return ERROR_SUCCESS; @@ -6341,13 +6322,14 @@ static UINT ITERATE_RemoveODBCTranslator( MSIRECORD *rec, LPVOID param ) LPCWSTR desc, component; component = MSI_RecordGetString( rec, 2 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } @@ -6364,7 +6346,7 @@ static UINT ITERATE_RemoveODBCTranslator( MSIRECORD *rec, LPVOID param ) uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, desc ); MSI_RecordSetStringW( uirow, 2, MSI_RecordGetString(rec, 2) ); - ui_actiondata( package, szRemoveODBC, uirow ); + msi_ui_actiondata( package, szRemoveODBC, uirow ); msiobj_release( &uirow->hdr ); return ERROR_SUCCESS; @@ -6385,13 +6367,14 @@ static UINT ITERATE_RemoveODBCDataSource( MSIRECORD *rec, LPVOID param ) 'D','S','N','=','%','s',0 }; component = MSI_RecordGetString( rec, 2 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } @@ -6422,7 +6405,7 @@ static UINT ITERATE_RemoveODBCDataSource( MSIRECORD *rec, LPVOID param ) MSI_RecordSetStringW( uirow, 1, desc ); MSI_RecordSetStringW( uirow, 2, MSI_RecordGetString(rec, 2) ); MSI_RecordSetInteger( uirow, 3, request ); - ui_actiondata( package, szRemoveODBC, uirow ); + msi_ui_actiondata( package, szRemoveODBC, uirow ); msiobj_release( &uirow->hdr ); return ERROR_SUCCESS; @@ -6430,43 +6413,43 @@ static UINT ITERATE_RemoveODBCDataSource( MSIRECORD *rec, LPVOID param ) static UINT ACTION_RemoveODBC( MSIPACKAGE *package ) { - UINT rc; - MSIQUERY *view; - static const WCHAR driver_query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'O','D','B','C','D','r','i','v','e','r',0 }; - + 'O','D','B','C','D','r','i','v','e','r',0}; static const WCHAR translator_query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0 }; - + 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0}; static const WCHAR source_query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'O','D','B','C','D','a','t','a','S','o','u','r','c','e',0 }; + 'O','D','B','C','D','a','t','a','S','o','u','r','c','e',0}; + MSIQUERY *view; + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, driver_query, &view ); - if (rc != ERROR_SUCCESS) - return ERROR_SUCCESS; - - rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveODBCDriver, package ); - msiobj_release( &view->hdr ); - + if (rc == ERROR_SUCCESS) + { + rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveODBCDriver, package ); + msiobj_release( &view->hdr ); + if (rc != ERROR_SUCCESS) + return rc; + } rc = MSI_DatabaseOpenViewW( package->db, translator_query, &view ); - if (rc != ERROR_SUCCESS) - return ERROR_SUCCESS; - - rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveODBCTranslator, package ); - msiobj_release( &view->hdr ); - + if (rc == ERROR_SUCCESS) + { + rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveODBCTranslator, package ); + msiobj_release( &view->hdr ); + if (rc != ERROR_SUCCESS) + return rc; + } rc = MSI_DatabaseOpenViewW( package->db, source_query, &view ); - if (rc != ERROR_SUCCESS) - return ERROR_SUCCESS; - - rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveODBCDataSource, package ); - msiobj_release( &view->hdr ); - - return rc; + if (rc == ERROR_SUCCESS) + { + rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveODBCDataSource, package ); + msiobj_release( &view->hdr ); + if (rc != ERROR_SUCCESS) + return rc; + } + return ERROR_SUCCESS; } #define ENV_ACT_SETALWAYS 0x1 @@ -6610,24 +6593,16 @@ static UINT ITERATE_WriteEnvironmentString( MSIRECORD *rec, LPVOID param ) int action = 0; component = MSI_RecordGetString(rec, 4); - comp = get_loaded_component(package, component); + comp = msi_get_loaded_component(package, component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_LOCAL; - name = MSI_RecordGetString(rec, 2); value = MSI_RecordGetString(rec, 3); @@ -6758,7 +6733,7 @@ done: MSI_RecordSetStringW( uirow, 1, name ); MSI_RecordSetStringW( uirow, 2, newval ); MSI_RecordSetInteger( uirow, 3, action ); - ui_actiondata( package, szWriteEnvironmentStrings, uirow ); + msi_ui_actiondata( package, szWriteEnvironmentStrings, uirow ); msiobj_release( &uirow->hdr ); if (env) RegCloseKey(env); @@ -6770,18 +6745,18 @@ done: static UINT ACTION_WriteEnvironmentStrings( MSIPACKAGE *package ) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','E','n','v','i','r','o','n','m','e','n','t','`',0}; + MSIQUERY *view; UINT rc; - MSIQUERY * view; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','E','n','v','i','r','o','n','m','e','n','t','`',0}; - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, ITERATE_WriteEnvironmentString, package); msiobj_release(&view->hdr); - return rc; } @@ -6799,24 +6774,16 @@ static UINT ITERATE_RemoveEnvironmentString( MSIRECORD *rec, LPVOID param ) UINT r; component = MSI_RecordGetString( rec, 4 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - - if (comp->ActionRequest != INSTALLSTATE_ABSENT) - { - TRACE("Component not scheduled for removal: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_ABSENT; - name = MSI_RecordGetString( rec, 2 ); value = MSI_RecordGetString( rec, 3 ); @@ -6861,7 +6828,7 @@ done: MSI_RecordSetStringW( uirow, 1, name ); MSI_RecordSetStringW( uirow, 2, value ); MSI_RecordSetInteger( uirow, 3, action ); - ui_actiondata( package, szRemoveEnvironmentStrings, uirow ); + msi_ui_actiondata( package, szRemoveEnvironmentStrings, uirow ); msiobj_release( &uirow->hdr ); if (env) RegCloseKey( env ); @@ -6871,11 +6838,11 @@ done: static UINT ACTION_RemoveEnvironmentStrings( MSIPACKAGE *package ) { - UINT rc; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','E','n','v','i','r','o','n','m','e','n','t','`',0}; MSIQUERY *view; - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','E','n','v','i','r','o','n','m','e','n','t','`',0}; + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc != ERROR_SUCCESS) @@ -6883,11 +6850,10 @@ static UINT ACTION_RemoveEnvironmentStrings( MSIPACKAGE *package ) rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveEnvironmentString, package ); msiobj_release( &view->hdr ); - return rc; } -static UINT ACTION_ValidateProductID( MSIPACKAGE *package ) +UINT msi_validate_product_id( MSIPACKAGE *package ) { LPWSTR key, template, id; UINT r = ERROR_SUCCESS; @@ -6900,7 +6866,6 @@ static UINT ACTION_ValidateProductID( MSIPACKAGE *package ) } template = msi_dup_property( package->db, szPIDTemplate ); key = msi_dup_property( package->db, szPIDKEY ); - if (key && template) { FIXME( "partial stub: template %s key %s\n", debugstr_w(template), debugstr_w(key) ); @@ -6911,6 +6876,11 @@ static UINT ACTION_ValidateProductID( MSIPACKAGE *package ) return r; } +static UINT ACTION_ValidateProductID( MSIPACKAGE *package ) +{ + return msi_validate_product_id( package ); +} + static UINT ACTION_ScheduleReboot( MSIPACKAGE *package ) { TRACE("\n"); @@ -6929,7 +6899,7 @@ static UINT ACTION_AllocateRegistrySpace( MSIPACKAGE *package ) uirow = MSI_CreateRecord( 1 ); MSI_RecordSetInteger( uirow, 1, space ); - ui_actiondata( package, szAllocateRegistrySpace, uirow ); + msi_ui_actiondata( package, szAllocateRegistrySpace, uirow ); msiobj_release( &uirow->hdr ); return ERROR_SUCCESS; @@ -6937,7 +6907,9 @@ static UINT ACTION_AllocateRegistrySpace( MSIPACKAGE *package ) static UINT ACTION_DisableRollback( MSIPACKAGE *package ) { - FIXME("%p\n", package); + TRACE("%p\n", package); + + msi_set_property( package->db, szRollbackDisabled, szOne ); return ERROR_SUCCESS; } @@ -6949,16 +6921,14 @@ static UINT ACTION_InstallAdminPackage( MSIPACKAGE *package ) static UINT ACTION_SetODBCFolders( MSIPACKAGE *package ) { - UINT r, count; - MSIQUERY *view; - static const WCHAR driver_query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'O','D','B','C','D','r','i','v','e','r',0 }; - + 'O','D','B','C','D','r','i','v','e','r',0}; static const WCHAR translator_query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0 }; + 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0}; + MSIQUERY *view; + UINT r, count; r = MSI_DatabaseOpenViewW( package->db, driver_query, &view ); if (r == ERROR_SUCCESS) @@ -6966,18 +6936,20 @@ static UINT ACTION_SetODBCFolders( MSIPACKAGE *package ) count = 0; r = MSI_IterateRecords( view, &count, NULL, package ); msiobj_release( &view->hdr ); + if (r != ERROR_SUCCESS) + return r; if (count) FIXME("ignored %u rows in ODBCDriver table\n", count); } - r = MSI_DatabaseOpenViewW( package->db, translator_query, &view ); if (r == ERROR_SUCCESS) { count = 0; r = MSI_IterateRecords( view, &count, NULL, package ); msiobj_release( &view->hdr ); + if (r != ERROR_SUCCESS) + return r; if (count) FIXME("ignored %u rows in ODBCTranslator table\n", count); } - return ERROR_SUCCESS; } @@ -6997,18 +6969,19 @@ static UINT ITERATE_RemoveExistingProducts( MSIRECORD *rec, LPVOID param ) static UINT ACTION_RemoveExistingProducts( MSIPACKAGE *package ) { - UINT r; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','A','c','t','i','o','n','P','r','o','p','e','r','t','y',' ', + 'F','R','O','M',' ','U','p','g','r','a','d','e',0}; MSIQUERY *view; - - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','A','c','t','i','o','n','P','r','o','p','e','r','t','y', - ' ','F','R','O','M',' ','U','p','g','r','a','d','e',0}; + UINT r; r = MSI_DatabaseOpenViewW( package->db, query, &view ); if (r == ERROR_SUCCESS) { r = MSI_IterateRecords( view, NULL, ITERATE_RemoveExistingProducts, package ); msiobj_release( &view->hdr ); + if (r != ERROR_SUCCESS) + return r; } return ERROR_SUCCESS; } @@ -7050,11 +7023,11 @@ static UINT ITERATE_MigrateFeatureStates( MSIRECORD *rec, LPVOID param ) static UINT ACTION_MigrateFeatureStates( MSIPACKAGE *package ) { - UINT r; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + 'U','p','g','r','a','d','e',0}; MSIQUERY *view; - - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','U','p','g','r','a','d','e',0}; + UINT r; if (msi_get_property_int( package->db, szInstalled, 0 )) { @@ -7066,23 +7039,85 @@ static UINT ACTION_MigrateFeatureStates( MSIPACKAGE *package ) TRACE("Preselected property is set, not migrating feature states\n"); return ERROR_SUCCESS; } - r = MSI_DatabaseOpenViewW( package->db, query, &view ); if (r == ERROR_SUCCESS) { r = MSI_IterateRecords( view, NULL, ITERATE_MigrateFeatureStates, package ); msiobj_release( &view->hdr ); + if (r != ERROR_SUCCESS) + return r; } return ERROR_SUCCESS; } -static UINT msi_unimplemented_action_stub( MSIPACKAGE *package, - LPCSTR action, LPCWSTR table ) +static void bind_image( const char *filename, const char *path ) +{ + if (!BindImageEx( 0, filename, path, NULL, NULL )) + { + WARN("failed to bind image %u\n", GetLastError()); + } +} + +static UINT ITERATE_BindImage( MSIRECORD *rec, LPVOID param ) +{ + UINT i; + MSIFILE *file; + MSIPACKAGE *package = param; + const WCHAR *key = MSI_RecordGetString( rec, 1 ); + const WCHAR *paths = MSI_RecordGetString( rec, 2 ); + char *filenameA, *pathA; + WCHAR *pathW, **path_list; + + if (!(file = msi_get_loaded_file( package, key ))) + { + WARN("file %s not found\n", debugstr_w(key)); + return ERROR_SUCCESS; + } + if (!(filenameA = strdupWtoA( file->TargetPath ))) return ERROR_SUCCESS; + path_list = msi_split_string( paths, ';' ); + if (!path_list) bind_image( filenameA, NULL ); + else + { + for (i = 0; path_list[i] && path_list[i][0]; i++) + { + deformat_string( package, path_list[i], &pathW ); + if ((pathA = strdupWtoA( pathW ))) + { + bind_image( filenameA, pathA ); + msi_free( pathA ); + } + msi_free( pathW ); + } + } + msi_free( path_list ); + msi_free( filenameA ); + return ERROR_SUCCESS; +} + +static UINT ACTION_BindImage( MSIPACKAGE *package ) { static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ','`','%','s','`',0 }; - MSIQUERY *view = NULL; + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + 'B','i','n','d','I','m','a','g','e',0}; + MSIQUERY *view; + UINT r; + + r = MSI_DatabaseOpenViewW( package->db, query, &view ); + if (r == ERROR_SUCCESS) + { + r = MSI_IterateRecords( view, NULL, ITERATE_BindImage, package ); + msiobj_release( &view->hdr ); + if (r != ERROR_SUCCESS) + return r; + } + return ERROR_SUCCESS; +} + +static UINT msi_unimplemented_action_stub( MSIPACKAGE *package, LPCSTR action, LPCWSTR table ) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','%','s','`',0}; + MSIQUERY *view; DWORD count = 0; UINT r; @@ -7091,27 +7126,13 @@ static UINT msi_unimplemented_action_stub( MSIPACKAGE *package, { r = MSI_IterateRecords(view, &count, NULL, package); msiobj_release(&view->hdr); + if (r != ERROR_SUCCESS) + return r; } - - if (count) - FIXME("%s -> %u ignored %s table values\n", - action, count, debugstr_w(table)); - + if (count) FIXME("%s: ignored %u rows from %s\n", action, count, debugstr_w(table)); return ERROR_SUCCESS; } -static UINT ACTION_PatchFiles( MSIPACKAGE *package ) -{ - static const WCHAR table[] = { 'P','a','t','c','h',0 }; - return msi_unimplemented_action_stub( package, "PatchFiles", table ); -} - -static UINT ACTION_BindImage( MSIPACKAGE *package ) -{ - static const WCHAR table[] = { 'B','i','n','d','I','m','a','g','e',0 }; - return msi_unimplemented_action_stub( package, "BindImage", table ); -} - static UINT ACTION_IsolateComponents( MSIPACKAGE *package ) { static const WCHAR table[] = { @@ -7143,91 +7164,90 @@ static UINT ACTION_InstallSFPCatalogFile( MSIPACKAGE *package ) return msi_unimplemented_action_stub( package, "InstallSFPCatalogFile", table ); } -typedef UINT (*STANDARDACTIONHANDLER)(MSIPACKAGE*); - static const struct { const WCHAR *action; UINT (*handler)(MSIPACKAGE *); + const WCHAR *action_rollback; } StandardActions[] = { - { szAllocateRegistrySpace, ACTION_AllocateRegistrySpace }, - { szAppSearch, ACTION_AppSearch }, - { szBindImage, ACTION_BindImage }, - { szCCPSearch, ACTION_CCPSearch }, - { szCostFinalize, ACTION_CostFinalize }, - { szCostInitialize, ACTION_CostInitialize }, - { szCreateFolders, ACTION_CreateFolders }, - { szCreateShortcuts, ACTION_CreateShortcuts }, - { szDeleteServices, ACTION_DeleteServices }, - { szDisableRollback, ACTION_DisableRollback }, - { szDuplicateFiles, ACTION_DuplicateFiles }, - { szExecuteAction, ACTION_ExecuteAction }, - { szFileCost, ACTION_FileCost }, - { szFindRelatedProducts, ACTION_FindRelatedProducts }, - { szForceReboot, ACTION_ForceReboot }, - { szInstallAdminPackage, ACTION_InstallAdminPackage }, - { szInstallExecute, ACTION_InstallExecute }, - { szInstallExecuteAgain, ACTION_InstallExecute }, - { szInstallFiles, ACTION_InstallFiles}, - { szInstallFinalize, ACTION_InstallFinalize }, - { szInstallInitialize, ACTION_InstallInitialize }, - { szInstallSFPCatalogFile, ACTION_InstallSFPCatalogFile }, - { szInstallValidate, ACTION_InstallValidate }, - { szIsolateComponents, ACTION_IsolateComponents }, - { szLaunchConditions, ACTION_LaunchConditions }, - { szMigrateFeatureStates, ACTION_MigrateFeatureStates }, - { szMoveFiles, ACTION_MoveFiles }, - { szMsiPublishAssemblies, ACTION_MsiPublishAssemblies }, - { szMsiUnpublishAssemblies, ACTION_MsiUnpublishAssemblies }, - { szInstallODBC, ACTION_InstallODBC }, - { szInstallServices, ACTION_InstallServices }, - { szPatchFiles, ACTION_PatchFiles }, - { szProcessComponents, ACTION_ProcessComponents }, - { szPublishComponents, ACTION_PublishComponents }, - { szPublishFeatures, ACTION_PublishFeatures }, - { szPublishProduct, ACTION_PublishProduct }, - { szRegisterClassInfo, ACTION_RegisterClassInfo }, - { szRegisterComPlus, ACTION_RegisterComPlus}, - { szRegisterExtensionInfo, ACTION_RegisterExtensionInfo }, - { szRegisterFonts, ACTION_RegisterFonts }, - { szRegisterMIMEInfo, ACTION_RegisterMIMEInfo }, - { szRegisterProduct, ACTION_RegisterProduct }, - { szRegisterProgIdInfo, ACTION_RegisterProgIdInfo }, - { szRegisterTypeLibraries, ACTION_RegisterTypeLibraries }, - { szRegisterUser, ACTION_RegisterUser }, - { szRemoveDuplicateFiles, ACTION_RemoveDuplicateFiles }, - { szRemoveEnvironmentStrings, ACTION_RemoveEnvironmentStrings }, - { szRemoveExistingProducts, ACTION_RemoveExistingProducts }, - { szRemoveFiles, ACTION_RemoveFiles }, - { szRemoveFolders, ACTION_RemoveFolders }, - { szRemoveIniValues, ACTION_RemoveIniValues }, - { szRemoveODBC, ACTION_RemoveODBC }, - { szRemoveRegistryValues, ACTION_RemoveRegistryValues }, - { szRemoveShortcuts, ACTION_RemoveShortcuts }, - { szResolveSource, ACTION_ResolveSource }, - { szRMCCPSearch, ACTION_RMCCPSearch }, - { szScheduleReboot, ACTION_ScheduleReboot }, - { szSelfRegModules, ACTION_SelfRegModules }, - { szSelfUnregModules, ACTION_SelfUnregModules }, - { szSetODBCFolders, ACTION_SetODBCFolders }, - { szStartServices, ACTION_StartServices }, - { szStopServices, ACTION_StopServices }, - { szUnpublishComponents, ACTION_UnpublishComponents }, - { szUnpublishFeatures, ACTION_UnpublishFeatures }, - { szUnregisterClassInfo, ACTION_UnregisterClassInfo }, - { szUnregisterComPlus, ACTION_UnregisterComPlus }, - { szUnregisterExtensionInfo, ACTION_UnregisterExtensionInfo }, - { szUnregisterFonts, ACTION_UnregisterFonts }, - { szUnregisterMIMEInfo, ACTION_UnregisterMIMEInfo }, - { szUnregisterProgIdInfo, ACTION_UnregisterProgIdInfo }, - { szUnregisterTypeLibraries, ACTION_UnregisterTypeLibraries }, - { szValidateProductID, ACTION_ValidateProductID }, - { szWriteEnvironmentStrings, ACTION_WriteEnvironmentStrings }, - { szWriteIniValues, ACTION_WriteIniValues }, - { szWriteRegistryValues, ACTION_WriteRegistryValues }, - { NULL, NULL }, + { szAllocateRegistrySpace, ACTION_AllocateRegistrySpace, NULL }, + { szAppSearch, ACTION_AppSearch, NULL }, + { szBindImage, ACTION_BindImage, NULL }, + { szCCPSearch, ACTION_CCPSearch, NULL }, + { szCostFinalize, ACTION_CostFinalize, NULL }, + { szCostInitialize, ACTION_CostInitialize, NULL }, + { szCreateFolders, ACTION_CreateFolders, szRemoveFolders }, + { szCreateShortcuts, ACTION_CreateShortcuts, szRemoveShortcuts }, + { szDeleteServices, ACTION_DeleteServices, szInstallServices }, + { szDisableRollback, ACTION_DisableRollback, NULL }, + { szDuplicateFiles, ACTION_DuplicateFiles, szRemoveDuplicateFiles }, + { szExecuteAction, ACTION_ExecuteAction, NULL }, + { szFileCost, ACTION_FileCost, NULL }, + { szFindRelatedProducts, ACTION_FindRelatedProducts, NULL }, + { szForceReboot, ACTION_ForceReboot, NULL }, + { szInstallAdminPackage, ACTION_InstallAdminPackage, NULL }, + { szInstallExecute, ACTION_InstallExecute, NULL }, + { szInstallExecuteAgain, ACTION_InstallExecute, NULL }, + { szInstallFiles, ACTION_InstallFiles, szRemoveFiles }, + { szInstallFinalize, ACTION_InstallFinalize, NULL }, + { szInstallInitialize, ACTION_InstallInitialize, NULL }, + { szInstallODBC, ACTION_InstallODBC, szRemoveODBC }, + { szInstallServices, ACTION_InstallServices, szDeleteServices }, + { szInstallSFPCatalogFile, ACTION_InstallSFPCatalogFile, NULL }, + { szInstallValidate, ACTION_InstallValidate, NULL }, + { szIsolateComponents, ACTION_IsolateComponents, NULL }, + { szLaunchConditions, ACTION_LaunchConditions, NULL }, + { szMigrateFeatureStates, ACTION_MigrateFeatureStates, NULL }, + { szMoveFiles, ACTION_MoveFiles, NULL }, + { szMsiPublishAssemblies, ACTION_MsiPublishAssemblies, szMsiUnpublishAssemblies }, + { szMsiUnpublishAssemblies, ACTION_MsiUnpublishAssemblies, szMsiPublishAssemblies }, + { szPatchFiles, ACTION_PatchFiles, NULL }, + { szProcessComponents, ACTION_ProcessComponents, szProcessComponents }, + { szPublishComponents, ACTION_PublishComponents, szUnpublishComponents }, + { szPublishFeatures, ACTION_PublishFeatures, szUnpublishFeatures }, + { szPublishProduct, ACTION_PublishProduct, NULL }, + { szRegisterClassInfo, ACTION_RegisterClassInfo, szUnregisterClassInfo }, + { szRegisterComPlus, ACTION_RegisterComPlus, szUnregisterComPlus }, + { szRegisterExtensionInfo, ACTION_RegisterExtensionInfo, szUnregisterExtensionInfo }, + { szRegisterFonts, ACTION_RegisterFonts, szUnregisterFonts }, + { szRegisterMIMEInfo, ACTION_RegisterMIMEInfo, szUnregisterMIMEInfo }, + { szRegisterProduct, ACTION_RegisterProduct, NULL }, + { szRegisterProgIdInfo, ACTION_RegisterProgIdInfo, szUnregisterProgIdInfo }, + { szRegisterTypeLibraries, ACTION_RegisterTypeLibraries, szUnregisterTypeLibraries }, + { szRegisterUser, ACTION_RegisterUser, NULL }, + { szRemoveDuplicateFiles, ACTION_RemoveDuplicateFiles, szDuplicateFiles }, + { szRemoveEnvironmentStrings, ACTION_RemoveEnvironmentStrings, szWriteEnvironmentStrings }, + { szRemoveExistingProducts, ACTION_RemoveExistingProducts, NULL }, + { szRemoveFiles, ACTION_RemoveFiles, szInstallFiles }, + { szRemoveFolders, ACTION_RemoveFolders, szCreateFolders }, + { szRemoveIniValues, ACTION_RemoveIniValues, szWriteIniValues }, + { szRemoveODBC, ACTION_RemoveODBC, szInstallODBC }, + { szRemoveRegistryValues, ACTION_RemoveRegistryValues, szWriteRegistryValues }, + { szRemoveShortcuts, ACTION_RemoveShortcuts, szCreateShortcuts }, + { szResolveSource, ACTION_ResolveSource, NULL }, + { szRMCCPSearch, ACTION_RMCCPSearch, NULL }, + { szScheduleReboot, ACTION_ScheduleReboot, NULL }, + { szSelfRegModules, ACTION_SelfRegModules, szSelfUnregModules }, + { szSelfUnregModules, ACTION_SelfUnregModules, szSelfRegModules }, + { szSetODBCFolders, ACTION_SetODBCFolders, NULL }, + { szStartServices, ACTION_StartServices, szStopServices }, + { szStopServices, ACTION_StopServices, szStartServices }, + { szUnpublishComponents, ACTION_UnpublishComponents, szPublishComponents }, + { szUnpublishFeatures, ACTION_UnpublishFeatures, szPublishFeatures }, + { szUnregisterClassInfo, ACTION_UnregisterClassInfo, szRegisterClassInfo }, + { szUnregisterComPlus, ACTION_UnregisterComPlus, szRegisterComPlus }, + { szUnregisterExtensionInfo, ACTION_UnregisterExtensionInfo, szRegisterExtensionInfo }, + { szUnregisterFonts, ACTION_UnregisterFonts, szRegisterFonts }, + { szUnregisterMIMEInfo, ACTION_UnregisterMIMEInfo, szRegisterMIMEInfo }, + { szUnregisterProgIdInfo, ACTION_UnregisterProgIdInfo, szRegisterProgIdInfo }, + { szUnregisterTypeLibraries, ACTION_UnregisterTypeLibraries, szRegisterTypeLibraries }, + { szValidateProductID, ACTION_ValidateProductID, NULL }, + { szWriteEnvironmentStrings, ACTION_WriteEnvironmentStrings, szRemoveEnvironmentStrings }, + { szWriteIniValues, ACTION_WriteIniValues, szRemoveIniValues }, + { szWriteRegistryValues, ACTION_WriteRegistryValues, szRemoveRegistryValues }, + { NULL, NULL, NULL } }; static BOOL ACTION_HandleStandardAction( MSIPACKAGE *package, LPCWSTR action, UINT *rc ) @@ -7246,6 +7266,12 @@ static BOOL ACTION_HandleStandardAction( MSIPACKAGE *package, LPCWSTR action, UI ui_actioninfo( package, action, TRUE, 0 ); *rc = StandardActions[i].handler( package ); ui_actioninfo( package, action, FALSE, *rc ); + + if (StandardActions[i].action_rollback && !package->need_rollback) + { + TRACE("scheduling rollback action\n"); + msi_schedule_action( package, SCRIPT_ROLLBACK, StandardActions[i].action_rollback ); + } } else { @@ -7310,21 +7336,21 @@ static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq) UINT rc = ERROR_SUCCESS; MSIRECORD *row; - static const WCHAR ExecSeqQuery[] = + static const WCHAR query[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', '`','I','n','s','t','a','l','l','E','x','e','c','u','t','e', 'S','e','q','u','e','n','c','e','`',' ', 'W','H','E','R','E',' ', '`','S','e','q','u','e','n','c','e','`',' ', '=',' ','%','i',0}; - static const WCHAR UISeqQuery[] = + static const WCHAR ui_query[] = {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', '`','I','n','s','t','a','l','l','U','I','S','e','q','u','e','n','c','e', '`', ' ', 'W','H','E','R','E',' ','`','S','e','q','u','e','n','c','e','`', ' ', '=',' ','%','i',0}; if (needs_ui_sequence(package)) - row = MSI_QueryGetRecord(package->db, UISeqQuery, seq); + row = MSI_QueryGetRecord(package->db, ui_query, seq); else - row = MSI_QueryGetRecord(package->db, ExecSeqQuery, seq); + row = MSI_QueryGetRecord(package->db, query, seq); if (row) { @@ -7351,9 +7377,9 @@ static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq) } if (needs_ui_sequence(package)) - rc = ACTION_PerformUIAction(package, action, -1); + rc = ACTION_PerformUIAction(package, action, SCRIPT_NONE); else - rc = ACTION_PerformAction(package, action, -1); + rc = ACTION_PerformAction(package, action, SCRIPT_NONE); msiobj_release(&row->hdr); } @@ -7368,11 +7394,12 @@ static UINT ACTION_PerformActionSequence(MSIPACKAGE *package, UINT seq) UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, LPCWSTR szCommandLine ) { - UINT rc; - BOOL ui_exists; - + static const WCHAR szDisableRollback[] = {'D','I','S','A','B','L','E','R','O','L','L','B','A','C','K',0}; static const WCHAR szAction[] = {'A','C','T','I','O','N',0}; static const WCHAR szInstall[] = {'I','N','S','T','A','L','L',0}; + WCHAR *reinstall = NULL; + BOOL ui_exists; + UINT rc; msi_set_property( package->db, szAction, szInstall ); @@ -7434,6 +7461,12 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, msi_adjust_privilege_properties( package ); msi_set_context( package ); + if (msi_get_property_int( package->db, szDisableRollback, 0 )) + { + TRACE("disabling rollback\n"); + msi_set_property( package->db, szRollbackDisabled, szOne ); + } + if (needs_ui_sequence( package)) { package->script->InWhatSequence |= SEQUENCE_UI; @@ -7458,11 +7491,24 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath, else if (rc == ERROR_INSTALL_SUSPEND) ACTION_PerformActionSequence(package, -4); else /* failed */ + { ACTION_PerformActionSequence(package, -3); + if (!msi_get_property_int( package->db, szRollbackDisabled, 0 )) + { + package->need_rollback = TRUE; + } + } /* finish up running custom actions */ ACTION_FinishCustomActions(package); + if (package->need_rollback && !(reinstall = msi_dup_property( package->db, szReinstall ))) + { + WARN("installation failed, running rollback script\n"); + execute_script( package, SCRIPT_ROLLBACK ); + } + msi_free( reinstall ); + if (rc == ERROR_SUCCESS && package->need_reboot) return ERROR_SUCCESS_REBOOT_REQUIRED; diff --git a/reactos/dll/win32/msi/alter.c b/reactos/dll/win32/msi/alter.c index 93d322bed7f..8b11351f8be 100644 --- a/reactos/dll/win32/msi/alter.c +++ b/reactos/dll/win32/msi/alter.c @@ -135,8 +135,12 @@ static UINT alter_add_column(MSIALTERVIEW *av) { r = MSI_IterateRecords(view, NULL, ITERATE_columns, &colnum); msiobj_release(&view->hdr); + if (r != ERROR_SUCCESS) + { + columns->ops->delete(columns); + return r; + } } - r = columns->ops->add_column(columns, av->colinfo->table, colnum, av->colinfo->column, av->colinfo->type, (av->hold == 1)); @@ -185,9 +189,8 @@ static UINT ALTER_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *col return ERROR_FUNCTION_FAILED; } -static UINT ALTER_get_column_info( struct tagMSIVIEW *view, - UINT n, LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name) +static UINT ALTER_get_column_info( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, + UINT *type, BOOL *temporary, LPCWSTR *table_name ) { MSIALTERVIEW *av = (MSIALTERVIEW*)view; diff --git a/reactos/dll/win32/msi/appsearch.c b/reactos/dll/win32/msi/appsearch.c index c8aea77fd35..0010fd895d3 100644 --- a/reactos/dll/win32/msi/appsearch.c +++ b/reactos/dll/win32/msi/appsearch.c @@ -371,14 +371,11 @@ static UINT ACTION_SearchDirectory(MSIPACKAGE *package, MSISIGNATURE *sig, static UINT ACTION_AppSearchReg(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATURE *sig) { static const WCHAR query[] = { - 's','e','l','e','c','t',' ','*',' ', - 'f','r','o','m',' ', - 'R','e','g','L','o','c','a','t','o','r',' ', - 'w','h','e','r','e',' ', + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + 'R','e','g','L','o','c','a','t','o','r',' ','W','H','E','R','E',' ', 'S','i','g','n','a','t','u','r','e','_',' ','=',' ', '\'','%','s','\'',0}; - LPWSTR keyPath = NULL, valueName = NULL; - LPWSTR deformatted = NULL; - LPWSTR ptr = NULL, end; + const WCHAR *keyPath, *valueName; + WCHAR *deformatted = NULL, *ptr = NULL, *end; int root, type; HKEY rootKey, key = NULL; DWORD sz = 0, regType; @@ -397,10 +394,10 @@ static UINT ACTION_AppSearchReg(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNAT return ERROR_SUCCESS; } - root = MSI_RecordGetInteger(row,2); - keyPath = msi_dup_record_field(row,3); - valueName = msi_dup_record_field(row,4); - type = MSI_RecordGetInteger(row,5); + root = MSI_RecordGetInteger(row, 2); + keyPath = MSI_RecordGetString(row, 3); + valueName = MSI_RecordGetString(row, 4); + type = MSI_RecordGetInteger(row, 5); deformat_string(package, keyPath, &deformatted); @@ -430,7 +427,10 @@ static UINT ACTION_AppSearchReg(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNAT goto end; } - rc = RegQueryValueExW(key, valueName, NULL, NULL, NULL, &sz); + msi_free(deformatted); + deformat_string(package, valueName, &deformatted); + + rc = RegQueryValueExW(key, deformatted, NULL, NULL, NULL, &sz); if (rc) { TRACE("RegQueryValueExW returned %d\n", rc); @@ -440,7 +440,7 @@ static UINT ACTION_AppSearchReg(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNAT * on the value of a property?) */ value = msi_alloc( sz ); - rc = RegQueryValueExW(key, valueName, NULL, ®Type, value, &sz); + rc = RegQueryValueExW(key, deformatted, NULL, ®Type, value, &sz); if (rc) { TRACE("RegQueryValueExW returned %d\n", rc); @@ -460,7 +460,7 @@ static UINT ACTION_AppSearchReg(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNAT switch (type & 0x0f) { case msidbLocatorTypeDirectory: - rc = ACTION_SearchDirectory(package, sig, ptr, 0, appValue); + ACTION_SearchDirectory(package, sig, ptr, 0, appValue); break; case msidbLocatorTypeFileName: *appValue = app_search_file(ptr, sig); @@ -475,13 +475,9 @@ static UINT ACTION_AppSearchReg(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNAT end: msi_free( value ); RegCloseKey( key ); - - msi_free( keyPath ); - msi_free( valueName ); msi_free( deformatted ); msiobj_release(&row->hdr); - return ERROR_SUCCESS; } @@ -961,7 +957,7 @@ static UINT ACTION_AppSearchDr(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATU { MSISIGNATURE parentSig; - rc = ACTION_AppSearchSigName(package, parentName, &parentSig, &parent); + ACTION_AppSearchSigName(package, parentName, &parentSig, &parent); ACTION_FreeSignature(&parentSig); if (!parent) { @@ -1053,7 +1049,7 @@ static UINT iterate_appsearch(MSIRECORD *row, LPVOID param) if (value) { r = msi_set_property( package->db, propName, value ); - if (r == ERROR_SUCCESS && !strcmpW( propName, cszSourceDir )) + if (r == ERROR_SUCCESS && !strcmpW( propName, szSourceDir )) msi_reset_folders( package, TRUE ); msi_free(value); @@ -1063,7 +1059,7 @@ static UINT iterate_appsearch(MSIRECORD *row, LPVOID param) uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, propName ); MSI_RecordSetStringW( uirow, 2, sigName ); - ui_actiondata( package, szAppSearch, uirow ); + msi_ui_actiondata( package, szAppSearch, uirow ); msiobj_release( &uirow->hdr ); return r; @@ -1072,19 +1068,18 @@ static UINT iterate_appsearch(MSIRECORD *row, LPVOID param) UINT ACTION_AppSearch(MSIPACKAGE *package) { static const WCHAR query[] = { - 's','e','l','e','c','t',' ','*',' ', - 'f','r','o','m',' ', + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', 'A','p','p','S','e','a','r','c','h',0}; - MSIQUERY *view = NULL; + MSIQUERY *view; UINT r; - if (check_unique_action(package, szAppSearch)) + if (msi_action_is_unique(package, szAppSearch)) { TRACE("Skipping AppSearch action: already done in UI sequence\n"); return ERROR_SUCCESS; } else - register_unique_action(package, szAppSearch); + msi_register_unique_action(package, szAppSearch); r = MSI_OpenQuery( package->db, &view, query ); if (r != ERROR_SUCCESS) @@ -1092,7 +1087,6 @@ UINT ACTION_AppSearch(MSIPACKAGE *package) r = MSI_IterateRecords( view, NULL, iterate_appsearch, package ); msiobj_release( &view->hdr ); - return r; } @@ -1127,19 +1121,18 @@ static UINT ITERATE_CCPSearch(MSIRECORD *row, LPVOID param) UINT ACTION_CCPSearch(MSIPACKAGE *package) { static const WCHAR query[] = { - 's','e','l','e','c','t',' ','*',' ', - 'f','r','o','m',' ', + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', 'C','C','P','S','e','a','r','c','h',0}; - MSIQUERY *view = NULL; + MSIQUERY *view; UINT r; - if (check_unique_action(package, szCCPSearch)) + if (msi_action_is_unique(package, szCCPSearch)) { TRACE("Skipping AppSearch action: already done in UI sequence\n"); return ERROR_SUCCESS; } else - register_unique_action(package, szCCPSearch); + msi_register_unique_action(package, szCCPSearch); r = MSI_OpenQuery(package->db, &view, query); if (r != ERROR_SUCCESS) @@ -1147,6 +1140,5 @@ UINT ACTION_CCPSearch(MSIPACKAGE *package) r = MSI_IterateRecords(view, NULL, ITERATE_CCPSearch, package); msiobj_release(&view->hdr); - return r; } diff --git a/reactos/dll/win32/msi/assembly.c b/reactos/dll/win32/msi/assembly.c index 5199a31fc70..6ce020efda0 100644 --- a/reactos/dll/win32/msi/assembly.c +++ b/reactos/dll/win32/msi/assembly.c @@ -31,59 +31,77 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); +static HRESULT (WINAPI *pCreateAssemblyCacheNet10)( IAssemblyCache **, DWORD ); static HRESULT (WINAPI *pCreateAssemblyCacheNet11)( IAssemblyCache **, DWORD ); static HRESULT (WINAPI *pCreateAssemblyCacheNet20)( IAssemblyCache **, DWORD ); static HRESULT (WINAPI *pCreateAssemblyCacheSxs)( IAssemblyCache **, DWORD ); static HRESULT (WINAPI *pLoadLibraryShim)( LPCWSTR, LPCWSTR, LPVOID, HMODULE * ); static HRESULT (WINAPI *pGetFileVersion)( LPCWSTR, LPWSTR, DWORD, DWORD * ); +static HMODULE hfusion10, hfusion11, hfusion20, hmscoree, hsxs; + static BOOL init_function_pointers( void ) { static const WCHAR szFusion[] = {'f','u','s','i','o','n','.','d','l','l',0}; + static const WCHAR szVersion10[] = {'v','1','.','0','.','3','7','0','5',0}; static const WCHAR szVersion11[] = {'v','1','.','1','.','4','3','2','2',0}; static const WCHAR szVersion20[] = {'v','2','.','0','.','5','0','7','2','7',0}; - HMODULE hfusion11 = NULL, hfusion20 = NULL, hmscoree, hsxs; - if (pCreateAssemblyCacheNet11 || pCreateAssemblyCacheNet20) return TRUE; + if (pCreateAssemblyCacheNet10 || pCreateAssemblyCacheNet11 || pCreateAssemblyCacheNet20) return TRUE; if (!(hmscoree = LoadLibraryA( "mscoree.dll" ))) return FALSE; - if (!(pGetFileVersion = (void *)GetProcAddress( hmscoree, "GetFileVersion" ))) goto error; + pGetFileVersion = (void *)GetProcAddress( hmscoree, "GetFileVersion" ); /* missing from v1.0.3705 */ if (!(pLoadLibraryShim = (void *)GetProcAddress( hmscoree, "LoadLibraryShim" ))) goto error; + if (!pLoadLibraryShim( szFusion, szVersion10, NULL, &hfusion10 )) + pCreateAssemblyCacheNet10 = (void *)GetProcAddress( hfusion10, "CreateAssemblyCache" ); + if (!pLoadLibraryShim( szFusion, szVersion11, NULL, &hfusion11 )) pCreateAssemblyCacheNet11 = (void *)GetProcAddress( hfusion11, "CreateAssemblyCache" ); if (!pLoadLibraryShim( szFusion, szVersion20, NULL, &hfusion20 )) pCreateAssemblyCacheNet20 = (void *)GetProcAddress( hfusion20, "CreateAssemblyCache" ); - if (!pCreateAssemblyCacheNet11 && !pCreateAssemblyCacheNet20) goto error; + if (!pCreateAssemblyCacheNet10 && !pCreateAssemblyCacheNet11 && !pCreateAssemblyCacheNet20) goto error; if (!(hsxs = LoadLibraryA( "sxs.dll" ))) goto error; if (!(pCreateAssemblyCacheSxs = (void *)GetProcAddress( hsxs, "CreateAssemblyCache" ))) goto error; return TRUE; error: + pCreateAssemblyCacheNet10 = NULL; pCreateAssemblyCacheNet11 = NULL; pCreateAssemblyCacheNet20 = NULL; + FreeLibrary( hfusion10 ); FreeLibrary( hfusion11 ); FreeLibrary( hfusion20 ); FreeLibrary( hmscoree ); return FALSE; } -static BOOL init_assembly_caches( MSIPACKAGE *package ) +BOOL msi_init_assembly_caches( MSIPACKAGE *package ) { if (!init_function_pointers()) return FALSE; - if (package->cache_net[CLR_VERSION_V11] || package->cache_net[CLR_VERSION_V20]) return TRUE; + if (package->cache_net[CLR_VERSION_V10] || + package->cache_net[CLR_VERSION_V11] || + package->cache_net[CLR_VERSION_V20]) return TRUE; if (pCreateAssemblyCacheSxs( &package->cache_sxs, 0 ) != S_OK) return FALSE; + if (pCreateAssemblyCacheNet10) pCreateAssemblyCacheNet11( &package->cache_net[CLR_VERSION_V10], 0 ); if (pCreateAssemblyCacheNet11) pCreateAssemblyCacheNet11( &package->cache_net[CLR_VERSION_V11], 0 ); if (pCreateAssemblyCacheNet20) pCreateAssemblyCacheNet20( &package->cache_net[CLR_VERSION_V20], 0 ); - if (package->cache_net[CLR_VERSION_V11] || package->cache_net[CLR_VERSION_V20]) + if (package->cache_net[CLR_VERSION_V10] || + package->cache_net[CLR_VERSION_V11] || + package->cache_net[CLR_VERSION_V20]) { return TRUE; } + if (package->cache_net[CLR_VERSION_V10]) + { + IAssemblyCache_Release( package->cache_net[CLR_VERSION_V10] ); + package->cache_net[CLR_VERSION_V10] = NULL; + } if (package->cache_net[CLR_VERSION_V11]) { IAssemblyCache_Release( package->cache_net[CLR_VERSION_V11] ); @@ -99,6 +117,33 @@ static BOOL init_assembly_caches( MSIPACKAGE *package ) return FALSE; } +void msi_destroy_assembly_caches( MSIPACKAGE *package ) +{ + UINT i; + + for (i = 0; i < CLR_VERSION_MAX; i++) + { + if (package->cache_net[i]) + { + IAssemblyCache_Release( package->cache_net[i] ); + package->cache_net[i] = NULL; + } + } + if (package->cache_sxs) + { + IAssemblyCache_Release( package->cache_sxs ); + package->cache_sxs = NULL; + } + pCreateAssemblyCacheNet10 = NULL; + pCreateAssemblyCacheNet11 = NULL; + pCreateAssemblyCacheNet20 = NULL; + FreeLibrary( hfusion10 ); + FreeLibrary( hfusion11 ); + FreeLibrary( hfusion20 ); + FreeLibrary( hmscoree ); + FreeLibrary( hsxs ); +} + static MSIRECORD *get_assembly_record( MSIPACKAGE *package, const WCHAR *comp ) { static const WCHAR query[] = { @@ -202,8 +247,11 @@ static WCHAR *get_assembly_display_name( MSIDATABASE *db, const WCHAR *comp, MSI done: msiobj_release( &view->hdr ); - for (i = 0; i < name.count; i++) msi_free( name.attrs[i] ); - msi_free( name.attrs ); + if (name.attrs) + { + for (i = 0; i < name.count; i++) msi_free( name.attrs[i] ); + msi_free( name.attrs ); + } return display_name; } @@ -215,7 +263,7 @@ static BOOL is_assembly_installed( IAssemblyCache *cache, const WCHAR *display_n memset( &info, 0, sizeof(info) ); info.cbAssemblyInfo = sizeof(info); hr = IAssemblyCache_QueryAssemblyInfo( cache, QUERYASMINFO_FLAG_GETSIZE, display_name, &info ); - if (FAILED( hr )) + if (hr != HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER )) { TRACE("QueryAssemblyInfo returned 0x%08x\n", hr); return FALSE; @@ -223,12 +271,14 @@ static BOOL is_assembly_installed( IAssemblyCache *cache, const WCHAR *display_n return (info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED); } +static const WCHAR clr_version_v10[] = {'v','1','.','0','.','3','7','0','5',0}; static const WCHAR clr_version_v11[] = {'v','1','.','1','.','4','3','2','2',0}; static const WCHAR clr_version_v20[] = {'v','2','.','0','.','5','0','7','2','7',0}; static const WCHAR clr_version_unknown[] = {'u','n','k','n','o','w','n',0}; static const WCHAR *clr_version[] = { + clr_version_v10, clr_version_v11, clr_version_v20 }; @@ -239,18 +289,13 @@ static const WCHAR *get_clr_version_str( enum clr_version version ) return clr_version[version]; } -MSIASSEMBLY *load_assembly( MSIPACKAGE *package, MSICOMPONENT *comp ) +/* assembly caches must be initialized */ +MSIASSEMBLY *msi_load_assembly( MSIPACKAGE *package, MSICOMPONENT *comp ) { MSIRECORD *rec; MSIASSEMBLY *a; if (!(rec = get_assembly_record( package, comp->Component ))) return NULL; - if (!init_assembly_caches( package )) - { - ERR("can't initialize assembly caches\n"); - msiobj_release( &rec->hdr ); - return NULL; - } if (!(a = msi_alloc_zero( sizeof(MSIASSEMBLY) ))) { msiobj_release( &rec->hdr ); @@ -318,6 +363,8 @@ static enum clr_version get_clr_version( const WCHAR *filename ) enum clr_version version = CLR_VERSION_V11; WCHAR *strW; + if (!pGetFileVersion) return CLR_VERSION_V10; + hr = pGetFileVersion( filename, NULL, 0, &len ); if (hr != HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER)) return CLR_VERSION_V11; if ((strW = msi_alloc( len * sizeof(WCHAR) ))) @@ -334,7 +381,7 @@ static enum clr_version get_clr_version( const WCHAR *filename ) return version; } -UINT install_assembly( MSIPACKAGE *package, MSICOMPONENT *comp ) +UINT msi_install_assembly( MSIPACKAGE *package, MSICOMPONENT *comp ) { HRESULT hr; const WCHAR *manifest; @@ -343,7 +390,7 @@ UINT install_assembly( MSIPACKAGE *package, MSICOMPONENT *comp ) MSIFEATURE *feature = NULL; if (comp->assembly->feature) - feature = get_loaded_feature( package, comp->assembly->feature ); + feature = msi_get_loaded_feature( package, comp->assembly->feature ); if (assembly->application) { @@ -357,12 +404,12 @@ UINT install_assembly( MSIPACKAGE *package, MSICOMPONENT *comp ) WARN("no manifest\n"); return ERROR_FUNCTION_FAILED; } - manifest = get_loaded_file( package, assembly->manifest )->TargetPath; + manifest = msi_get_loaded_file( package, assembly->manifest )->TargetPath; cache = package->cache_sxs; } else { - manifest = get_loaded_file( package, comp->KeyPath )->TargetPath; + manifest = msi_get_loaded_file( package, comp->KeyPath )->TargetPath; cache = package->cache_net[get_clr_version( manifest )]; } TRACE("installing assembly %s\n", debugstr_w(manifest)); @@ -515,20 +562,12 @@ UINT ACTION_MsiPublishAssemblies( MSIPACKAGE *package ) if (!assembly || !comp->ComponentId) continue; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled: %s\n", debugstr_w(comp->Component)); + TRACE("component not scheduled for installation %s\n", debugstr_w(comp->Component)); continue; } - - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation: %s\n", debugstr_w(comp->Component)); - comp->Action = comp->Installed; - continue; - } - comp->Action = INSTALLSTATE_LOCAL; - TRACE("publishing %s\n", debugstr_w(comp->Component)); CLSIDFromString( package->ProductCode, &guid ); @@ -541,7 +580,7 @@ UINT ACTION_MsiPublishAssemblies( MSIPACKAGE *package ) win32 = assembly->attributes & msidbAssemblyAttributesWin32; if (assembly->application) { - MSIFILE *file = get_loaded_file( package, assembly->application ); + MSIFILE *file = msi_get_loaded_file( package, assembly->application ); if ((res = open_local_assembly_key( package->Context, win32, file->TargetPath, &hkey ))) { WARN("failed to open local assembly key %d\n", res); @@ -565,7 +604,7 @@ UINT ACTION_MsiPublishAssemblies( MSIPACKAGE *package ) uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 2, assembly->display_name ); - ui_actiondata( package, szMsiPublishAssemblies, uirow ); + msi_ui_actiondata( package, szMsiPublishAssemblies, uirow ); msiobj_release( &uirow->hdr ); } return ERROR_SUCCESS; @@ -584,26 +623,18 @@ UINT ACTION_MsiUnpublishAssemblies( MSIPACKAGE *package ) if (!assembly || !comp->ComponentId) continue; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled: %s\n", debugstr_w(comp->Component)); + TRACE("component not scheduled for removal %s\n", debugstr_w(comp->Component)); continue; } - - if (comp->ActionRequest != INSTALLSTATE_ABSENT) - { - TRACE("Component not scheduled for removal: %s\n", debugstr_w(comp->Component)); - comp->Action = comp->Installed; - continue; - } - comp->Action = INSTALLSTATE_ABSENT; - TRACE("unpublishing %s\n", debugstr_w(comp->Component)); win32 = assembly->attributes & msidbAssemblyAttributesWin32; if (assembly->application) { - MSIFILE *file = get_loaded_file( package, assembly->application ); + MSIFILE *file = msi_get_loaded_file( package, assembly->application ); if ((res = delete_local_assembly_key( package->Context, win32, file->TargetPath ))) WARN("failed to delete local assembly key %d\n", res); } @@ -622,7 +653,7 @@ UINT ACTION_MsiUnpublishAssemblies( MSIPACKAGE *package ) uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 2, assembly->display_name ); - ui_actiondata( package, szMsiPublishAssemblies, uirow ); + msi_ui_actiondata( package, szMsiPublishAssemblies, uirow ); msiobj_release( &uirow->hdr ); } return ERROR_SUCCESS; diff --git a/reactos/dll/win32/msi/automation.c b/reactos/dll/win32/msi/automation.c index d6ef5c98781..f1a353207e7 100644 --- a/reactos/dll/win32/msi/automation.c +++ b/reactos/dll/win32/msi/automation.c @@ -44,19 +44,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); /* * AutomationObject - "base" class for all automation objects. For each interface, we implement Invoke function - * called from AutomationObject::Invoke, and pass this function to create_automation_object. + * called from AutomationObject::Invoke. */ -typedef interface AutomationObject AutomationObject; +typedef struct AutomationObject AutomationObject; -interface AutomationObject { - /* - * VTables - We provide IDispatch, IProvideClassInfo, IProvideClassInfo2, IProvideMultipleClassInfo - */ - const IDispatchVtbl *lpVtbl; - const IProvideMultipleClassInfoVtbl *lpvtblIProvideMultipleClassInfo; +typedef HRESULT (*autoInvokeFunc)(AutomationObject* This, + DISPID dispIdMember, REFIID riid, LCID lcid, WORD flags, DISPPARAMS* pDispParams, + VARIANT* result, EXCEPINFO* ei, UINT* arg_err); - /* Object reference count */ +typedef void (*autoFreeFunc)(AutomationObject* This); + +struct AutomationObject { + IDispatch IDispatch_iface; + IProvideMultipleClassInfo IProvideMultipleClassInfo_iface; LONG ref; /* Clsid for this class and it's appropriate ITypeInfo object */ @@ -67,73 +68,62 @@ interface AutomationObject { MSIHANDLE msiHandle; /* A function that is called from AutomationObject::Invoke, specific to this type of object. */ - HRESULT (STDMETHODCALLTYPE *funcInvoke)( - AutomationObject* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS* pDispParams, - VARIANT* pVarResult, - EXCEPINFO* pExcepInfo, - UINT* puArgErr); - + autoInvokeFunc funcInvoke; /* A function that is called from AutomationObject::Release when the object is being freed to free any private * data structures (or NULL) */ - void (STDMETHODCALLTYPE *funcFree)(AutomationObject* This); + autoFreeFunc funcFree; }; -/* - * ListEnumerator - IEnumVARIANT implementation for MSI automation lists. - */ +typedef struct { + AutomationObject autoobj; + int count; + VARIANT *data; +} ListObject; -typedef interface ListEnumerator ListEnumerator; +static HRESULT create_database(MSIHANDLE, IDispatch**); +static HRESULT create_list_enumerator(ListObject*, void**); +static HRESULT create_summaryinfo(MSIHANDLE, IDispatch**); +static HRESULT create_view(MSIHANDLE, IDispatch**); -interface ListEnumerator { - /* VTables */ - const IEnumVARIANTVtbl *lpVtbl; - - /* Object reference count */ +/* ListEnumerator - IEnumVARIANT implementation for MSI automation lists */ +typedef struct { + IEnumVARIANT IEnumVARIANT_iface; LONG ref; /* Current position and pointer to AutomationObject that stores actual data */ - ULONG ulPos; - AutomationObject *pObj; -}; - -/* - * Structures for additional data required by specific automation objects - */ + ULONG pos; + ListObject *list; +} ListEnumerator; typedef struct { - ULONG ulCount; - VARIANT *pVars; -} ListData; + AutomationObject autoobj; + IDispatch *installer; +} SessionObject; -typedef struct { - /* The parent Installer object */ - IDispatch *pInstaller; -} SessionData; +static inline AutomationObject *impl_from_IProvideMultipleClassInfo( IProvideMultipleClassInfo *iface ) +{ + return CONTAINING_RECORD(iface, AutomationObject, IProvideMultipleClassInfo_iface); +} -/* VTables */ -static const struct IDispatchVtbl AutomationObject_Vtbl; -static const struct IProvideMultipleClassInfoVtbl AutomationObject_IProvideMultipleClassInfo_Vtbl; -static const struct IEnumVARIANTVtbl ListEnumerator_Vtbl; +static inline AutomationObject *impl_from_IDispatch( IDispatch *iface ) +{ + return CONTAINING_RECORD(iface, AutomationObject, IDispatch_iface); +} /* Load type info so we don't have to process GetIDsOfNames */ HRESULT load_type_info(IDispatch *iface, ITypeInfo **pptinfo, REFIID clsid, LCID lcid) { + static const WCHAR msiserverW[] = {'m','s','i','s','e','r','v','e','r','.','t','l','b',0}; + ITypeInfo *ti = NULL; + ITypeLib *lib = NULL; HRESULT hr; - LPTYPELIB pLib = NULL; - LPTYPEINFO pInfo = NULL; - static const WCHAR szMsiServer[] = {'m','s','i','s','e','r','v','e','r','.','t','l','b'}; - TRACE("(%p)->(%s,%d)\n", iface, debugstr_guid(clsid), lcid); + TRACE("(%p)->(%s, %d)\n", iface, debugstr_guid(clsid), lcid); /* Load registered type library */ - hr = LoadRegTypeLib(&LIBID_WindowsInstaller, 1, 0, lcid, &pLib); + hr = LoadRegTypeLib(&LIBID_WindowsInstaller, 1, 0, lcid, &lib); if (FAILED(hr)) { - hr = LoadTypeLib(szMsiServer, &pLib); + hr = LoadTypeLib(msiserverW, &lib); if (FAILED(hr)) { ERR("Could not load msiserver.tlb\n"); return hr; @@ -141,103 +131,20 @@ HRESULT load_type_info(IDispatch *iface, ITypeInfo **pptinfo, REFIID clsid, LCID } /* Get type information for object */ - hr = ITypeLib_GetTypeInfoOfGuid(pLib, clsid, &pInfo); - ITypeLib_Release(pLib); + hr = ITypeLib_GetTypeInfoOfGuid(lib, clsid, &ti); + ITypeLib_Release(lib); if (FAILED(hr)) { ERR("Could not load ITypeInfo for %s\n", debugstr_guid(clsid)); return hr; } - *pptinfo = pInfo; + *pptinfo = ti; return S_OK; } -/* Create the automation object, placing the result in the pointer ppObj. The automation object is created - * with the appropriate clsid and invocation function. */ -static HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter, LPVOID *ppObj, REFIID clsid, - HRESULT (STDMETHODCALLTYPE *funcInvoke)(AutomationObject*,DISPID,REFIID,LCID,WORD,DISPPARAMS*, - VARIANT*,EXCEPINFO*,UINT*), - void (STDMETHODCALLTYPE *funcFree)(AutomationObject*), - SIZE_T sizetPrivateData) -{ - AutomationObject *object; - HRESULT hr; - - TRACE("(%d,%p,%p,%s,%p,%p,%ld)\n", msiHandle, pUnkOuter, ppObj, debugstr_guid(clsid), funcInvoke, funcFree, sizetPrivateData); - - if( pUnkOuter ) - return CLASS_E_NOAGGREGATION; - - object = msi_alloc_zero( sizeof(AutomationObject) + sizetPrivateData ); - - /* Set all the VTable references */ - object->lpVtbl = &AutomationObject_Vtbl; - object->lpvtblIProvideMultipleClassInfo = &AutomationObject_IProvideMultipleClassInfo_Vtbl; - object->ref = 1; - - /* Store data that was passed */ - object->msiHandle = msiHandle; - object->clsid = (LPCLSID)clsid; - object->funcInvoke = funcInvoke; - object->funcFree = funcFree; - - /* Load our TypeInfo so we don't have to process GetIDsOfNames */ - object->iTypeInfo = NULL; - hr = load_type_info((IDispatch *)object, &object->iTypeInfo, clsid, 0x0); - if (FAILED(hr)) { - msi_free( object ); - return hr; - } - - *ppObj = object; - - return S_OK; -} - -/* Create a list enumerator, placing the result in the pointer ppObj. */ -static HRESULT create_list_enumerator(IUnknown *pUnkOuter, LPVOID *ppObj, AutomationObject *pObj, ULONG ulPos) -{ - ListEnumerator *object; - - TRACE("(%p,%p,%p,%uld)\n", pUnkOuter, ppObj, pObj, ulPos); - - if( pUnkOuter ) - return CLASS_E_NOAGGREGATION; - - object = msi_alloc_zero( sizeof(ListEnumerator) ); - - /* Set all the VTable references */ - object->lpVtbl = &ListEnumerator_Vtbl; - object->ref = 1; - - /* Store data that was passed */ - object->ulPos = ulPos; - object->pObj = pObj; - if (pObj) IDispatch_AddRef((IDispatch *)pObj); - - *ppObj = object; - return S_OK; -} - -/* Macros to get pointer to AutomationObject from the other VTables. */ -static inline AutomationObject *obj_from_IProvideMultipleClassInfo( IProvideMultipleClassInfo *iface ) -{ - return (AutomationObject *)((char*)iface - FIELD_OFFSET(AutomationObject, lpvtblIProvideMultipleClassInfo)); -} - -/* Macro to get pointer to private object data */ -static inline void *private_data( AutomationObject *This ) -{ - return This + 1; -} - -/* - * AutomationObject methods - */ - -/*** IUnknown methods ***/ +/* AutomationObject methods */ static HRESULT WINAPI AutomationObject_QueryInterface(IDispatch* iface, REFIID riid, void** ppvObject) { - AutomationObject *This = (AutomationObject *)iface; + AutomationObject *This = impl_from_IDispatch(iface); TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject); @@ -246,30 +153,28 @@ static HRESULT WINAPI AutomationObject_QueryInterface(IDispatch* iface, REFIID r *ppvObject = 0; - if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch) || IsEqualGUID(riid, This->clsid)) - *ppvObject = This; + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IDispatch) || + IsEqualGUID(riid, This->clsid)) + *ppvObject = &This->IDispatch_iface; else if (IsEqualGUID(riid, &IID_IProvideClassInfo) || IsEqualGUID(riid, &IID_IProvideClassInfo2) || IsEqualGUID(riid, &IID_IProvideMultipleClassInfo)) - *ppvObject = &This->lpvtblIProvideMultipleClassInfo; + *ppvObject = &This->IProvideMultipleClassInfo_iface; else { - TRACE("() : asking for unsupported interface %s\n",debugstr_guid(riid)); + TRACE("() : asking for unsupported interface %s\n", debugstr_guid(riid)); return E_NOINTERFACE; } - /* - * Query Interface always increases the reference count by one when it is - * successful - */ - IClassFactory_AddRef(iface); + IDispatch_AddRef(iface); return S_OK; } static ULONG WINAPI AutomationObject_AddRef(IDispatch* iface) { - AutomationObject *This = (AutomationObject *)iface; + AutomationObject *This = impl_from_IDispatch(iface); TRACE("(%p/%p)\n", iface, This); @@ -278,7 +183,7 @@ static ULONG WINAPI AutomationObject_AddRef(IDispatch* iface) static ULONG WINAPI AutomationObject_Release(IDispatch* iface) { - AutomationObject *This = (AutomationObject *)iface; + AutomationObject *This = impl_from_IDispatch(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p/%p)\n", iface, This); @@ -294,12 +199,11 @@ static ULONG WINAPI AutomationObject_Release(IDispatch* iface) return ref; } -/*** IDispatch methods ***/ static HRESULT WINAPI AutomationObject_GetTypeInfoCount( IDispatch* iface, UINT* pctinfo) { - AutomationObject *This = (AutomationObject *)iface; + AutomationObject *This = impl_from_IDispatch(iface); TRACE("(%p/%p)->(%p)\n", iface, This, pctinfo); *pctinfo = 1; @@ -312,7 +216,7 @@ static HRESULT WINAPI AutomationObject_GetTypeInfo( LCID lcid, ITypeInfo** ppTInfo) { - AutomationObject *This = (AutomationObject *)iface; + AutomationObject *This = impl_from_IDispatch(iface); TRACE("(%p/%p)->(%d,%d,%p)\n", iface, This, iTInfo, lcid, ppTInfo); ITypeInfo_AddRef(This->iTypeInfo); @@ -328,7 +232,7 @@ static HRESULT WINAPI AutomationObject_GetIDsOfNames( LCID lcid, DISPID* rgDispId) { - AutomationObject *This = (AutomationObject *)iface; + AutomationObject *This = impl_from_IDispatch(iface); HRESULT hr; TRACE("(%p/%p)->(%p,%p,%d,%d,%p)\n", iface, This, riid, rgszNames, cNames, lcid, rgDispId); @@ -361,7 +265,7 @@ static HRESULT WINAPI AutomationObject_Invoke( EXCEPINFO* pExcepInfo, UINT* puArgErr) { - AutomationObject *This = (AutomationObject *)iface; + AutomationObject *This = impl_from_IDispatch(iface); HRESULT hr; unsigned int uArgErr; VARIANT varResultDummy; @@ -448,7 +352,7 @@ static HRESULT WINAPI AutomationObject_Invoke( return hr; } -static const struct IDispatchVtbl AutomationObject_Vtbl = +static const struct IDispatchVtbl AutomationObjectVtbl = { AutomationObject_QueryInterface, AutomationObject_AddRef, @@ -463,37 +367,37 @@ static const struct IDispatchVtbl AutomationObject_Vtbl = * IProvideMultipleClassInfo methods */ -static HRESULT WINAPI AutomationObject_IProvideMultipleClassInfo_QueryInterface( +static HRESULT WINAPI ProvideMultipleClassInfo_QueryInterface( IProvideMultipleClassInfo* iface, REFIID riid, VOID** ppvoid) { - AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); - return AutomationObject_QueryInterface((IDispatch *)This, riid, ppvoid); + AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); + return IDispatch_QueryInterface(&This->IDispatch_iface, riid, ppvoid); } -static ULONG WINAPI AutomationObject_IProvideMultipleClassInfo_AddRef(IProvideMultipleClassInfo* iface) +static ULONG WINAPI ProvideMultipleClassInfo_AddRef(IProvideMultipleClassInfo* iface) { - AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); - return AutomationObject_AddRef((IDispatch *)This); + AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); + return IDispatch_AddRef(&This->IDispatch_iface); } -static ULONG WINAPI AutomationObject_IProvideMultipleClassInfo_Release(IProvideMultipleClassInfo* iface) +static ULONG WINAPI ProvideMultipleClassInfo_Release(IProvideMultipleClassInfo* iface) { - AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); - return AutomationObject_Release((IDispatch *)This); + AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); + return IDispatch_Release(&This->IDispatch_iface); } -static HRESULT WINAPI AutomationObject_IProvideMultipleClassInfo_GetClassInfo(IProvideMultipleClassInfo* iface, ITypeInfo** ppTI) +static HRESULT WINAPI ProvideMultipleClassInfo_GetClassInfo(IProvideMultipleClassInfo* iface, ITypeInfo** ppTI) { - AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); + AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); TRACE("(%p/%p)->(%p)\n", iface, This, ppTI); - return load_type_info((IDispatch *)This, ppTI, This->clsid, 0); + return load_type_info(&This->IDispatch_iface, ppTI, This->clsid, 0); } -static HRESULT WINAPI AutomationObject_IProvideMultipleClassInfo_GetGUID(IProvideMultipleClassInfo* iface, DWORD dwGuidKind, GUID* pGUID) +static HRESULT WINAPI ProvideMultipleClassInfo_GetGUID(IProvideMultipleClassInfo* iface, DWORD dwGuidKind, GUID* pGUID) { - AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); + AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); TRACE("(%p/%p)->(%d,%s)\n", iface, This, dwGuidKind, debugstr_guid(pGUID)); if (dwGuidKind != GUIDKIND_DEFAULT_SOURCE_DISP_IID) @@ -504,16 +408,16 @@ static HRESULT WINAPI AutomationObject_IProvideMultipleClassInfo_GetGUID(IProvid } } -static HRESULT WINAPI AutomationObject_GetMultiTypeInfoCount(IProvideMultipleClassInfo* iface, ULONG* pcti) +static HRESULT WINAPI ProvideMultipleClassInfo_GetMultiTypeInfoCount(IProvideMultipleClassInfo* iface, ULONG* pcti) { - AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); + AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); TRACE("(%p/%p)->(%p)\n", iface, This, pcti); *pcti = 1; return S_OK; } -static HRESULT WINAPI AutomationObject_GetInfoOfIndex(IProvideMultipleClassInfo* iface, +static HRESULT WINAPI ProvideMultipleClassInfo_GetInfoOfIndex(IProvideMultipleClassInfo* iface, ULONG iti, DWORD dwFlags, ITypeInfo** pptiCoClass, @@ -522,7 +426,7 @@ static HRESULT WINAPI AutomationObject_GetInfoOfIndex(IProvideMultipleClassInfo* IID* piidPrimary, IID* piidSource) { - AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); + AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); TRACE("(%p/%p)->(%d,%d,%p,%p,%p,%p,%p)\n", iface, This, iti, dwFlags, pptiCoClass, pdwTIFlags, pcdispidReserved, piidPrimary, piidSource); @@ -530,7 +434,7 @@ static HRESULT WINAPI AutomationObject_GetInfoOfIndex(IProvideMultipleClassInfo* return E_INVALIDARG; if (dwFlags & MULTICLASSINFO_GETTYPEINFO) - load_type_info((IDispatch *)This, pptiCoClass, This->clsid, 0); + load_type_info(&This->IDispatch_iface, pptiCoClass, This->clsid, 0); if (dwFlags & MULTICLASSINFO_GETNUMRESERVEDDISPIDS) { @@ -549,25 +453,49 @@ static HRESULT WINAPI AutomationObject_GetInfoOfIndex(IProvideMultipleClassInfo* return S_OK; } -static const IProvideMultipleClassInfoVtbl AutomationObject_IProvideMultipleClassInfo_Vtbl = +static const IProvideMultipleClassInfoVtbl ProvideMultipleClassInfoVtbl = { - AutomationObject_IProvideMultipleClassInfo_QueryInterface, - AutomationObject_IProvideMultipleClassInfo_AddRef, - AutomationObject_IProvideMultipleClassInfo_Release, - AutomationObject_IProvideMultipleClassInfo_GetClassInfo, - AutomationObject_IProvideMultipleClassInfo_GetGUID, - AutomationObject_GetMultiTypeInfoCount, - AutomationObject_GetInfoOfIndex + ProvideMultipleClassInfo_QueryInterface, + ProvideMultipleClassInfo_AddRef, + ProvideMultipleClassInfo_Release, + ProvideMultipleClassInfo_GetClassInfo, + ProvideMultipleClassInfo_GetGUID, + ProvideMultipleClassInfo_GetMultiTypeInfoCount, + ProvideMultipleClassInfo_GetInfoOfIndex }; +static HRESULT init_automation_object(AutomationObject *This, MSIHANDLE msiHandle, REFIID clsid, + autoInvokeFunc invokeFunc, autoFreeFunc freeFunc) +{ + TRACE("(%p, %d, %s, %p, %p)\n", This, msiHandle, debugstr_guid(clsid), invokeFunc, freeFunc); + + This->IDispatch_iface.lpVtbl = &AutomationObjectVtbl; + This->IProvideMultipleClassInfo_iface.lpVtbl = &ProvideMultipleClassInfoVtbl; + This->ref = 1; + + This->msiHandle = msiHandle; + This->clsid = (LPCLSID)clsid; + This->funcInvoke = invokeFunc; + This->funcFree = freeFunc; + + /* Load our TypeInfo so we don't have to process GetIDsOfNames */ + This->iTypeInfo = NULL; + return load_type_info(&This->IDispatch_iface, &This->iTypeInfo, clsid, 0); +} + /* * ListEnumerator methods */ -/*** IUnknown methods ***/ -static HRESULT WINAPI ListEnumerator_QueryInterface(IEnumVARIANT* iface, REFIID riid, void** ppvObject) +static inline ListEnumerator *impl_from_IEnumVARIANT(IEnumVARIANT* iface) { - ListEnumerator *This = (ListEnumerator *)iface; + return CONTAINING_RECORD(iface, ListEnumerator, IEnumVARIANT_iface); +} + +static HRESULT WINAPI ListEnumerator_QueryInterface(IEnumVARIANT* iface, REFIID riid, + void** ppvObject) +{ + ListEnumerator *This = impl_from_IEnumVARIANT(iface); TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject); @@ -576,21 +504,24 @@ static HRESULT WINAPI ListEnumerator_QueryInterface(IEnumVARIANT* iface, REFIID *ppvObject = 0; - if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) - *ppvObject = This; + if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IEnumVARIANT)) + { + *ppvObject = &This->IEnumVARIANT_iface; + } else { TRACE("() : asking for unsupported interface %s\n",debugstr_guid(riid)); return E_NOINTERFACE; } - IClassFactory_AddRef(iface); + IEnumVARIANT_AddRef(iface); return S_OK; } static ULONG WINAPI ListEnumerator_AddRef(IEnumVARIANT* iface) { - ListEnumerator *This = (ListEnumerator *)iface; + ListEnumerator *This = impl_from_IEnumVARIANT(iface); TRACE("(%p/%p)\n", iface, This); @@ -599,78 +530,74 @@ static ULONG WINAPI ListEnumerator_AddRef(IEnumVARIANT* iface) static ULONG WINAPI ListEnumerator_Release(IEnumVARIANT* iface) { - ListEnumerator *This = (ListEnumerator *)iface; + ListEnumerator *This = impl_from_IEnumVARIANT(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p/%p)\n", iface, This); if (!ref) { - if (This->pObj) IDispatch_Release((IDispatch *)This->pObj); + if (This->list) IDispatch_Release(&This->list->autoobj.IDispatch_iface); msi_free(This); } return ref; } -/* IEnumVARIANT methods */ - -static HRESULT WINAPI ListEnumerator_Next(IEnumVARIANT* iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) +static HRESULT WINAPI ListEnumerator_Next(IEnumVARIANT* iface, ULONG celt, VARIANT* rgVar, + ULONG* fetched) { - ListEnumerator *This = (ListEnumerator *)iface; - ListData *data = private_data(This->pObj); - ULONG idx, local; + ListEnumerator *This = impl_from_IEnumVARIANT(iface); + ULONG i, local; - TRACE("(%p,%uld,%p,%p)\n", iface, celt, rgVar, pCeltFetched); + TRACE("(%p, %uld, %p, %p)\n", iface, celt, rgVar, fetched); - if (pCeltFetched != NULL) - *pCeltFetched = 0; + if (fetched) *fetched = 0; - if (rgVar == NULL) + if (!rgVar) return S_FALSE; for (local = 0; local < celt; local++) VariantInit(&rgVar[local]); - for (idx = This->ulPos, local = 0; idx < data->ulCount && local < celt; idx++, local++) - VariantCopy(&rgVar[local], &data->pVars[idx]); + for (i = This->pos, local = 0; i < This->list->count && local < celt; i++, local++) + VariantCopy(&rgVar[local], &This->list->data[i]); - if (pCeltFetched != NULL) - *pCeltFetched = local; - This->ulPos = idx; + if (fetched) *fetched = local; + This->pos = i; return (local < celt) ? S_FALSE : S_OK; } static HRESULT WINAPI ListEnumerator_Skip(IEnumVARIANT* iface, ULONG celt) { - ListEnumerator *This = (ListEnumerator *)iface; - ListData *data = private_data(This->pObj); + ListEnumerator *This = impl_from_IEnumVARIANT(iface); TRACE("(%p,%uld)\n", iface, celt); - This->ulPos += celt; - if (This->ulPos >= data->ulCount) + This->pos += celt; + if (This->pos >= This->list->count) { - This->ulPos = data->ulCount; + This->pos = This->list->count; return S_FALSE; } + return S_OK; } static HRESULT WINAPI ListEnumerator_Reset(IEnumVARIANT* iface) { - ListEnumerator *This = (ListEnumerator *)iface; + ListEnumerator *This = impl_from_IEnumVARIANT(iface); TRACE("(%p)\n", iface); - This->ulPos = 0; + This->pos = 0; return S_OK; } static HRESULT WINAPI ListEnumerator_Clone(IEnumVARIANT* iface, IEnumVARIANT **ppEnum) { - ListEnumerator *This = (ListEnumerator *)iface; + ListEnumerator *This = impl_from_IEnumVARIANT(iface); HRESULT hr; TRACE("(%p,%p)\n", iface, ppEnum); @@ -679,7 +606,7 @@ static HRESULT WINAPI ListEnumerator_Clone(IEnumVARIANT* iface, IEnumVARIANT **p return S_FALSE; *ppEnum = NULL; - hr = create_list_enumerator(NULL, (LPVOID *)ppEnum, This->pObj, 0); + hr = create_list_enumerator(This->list, (LPVOID *)ppEnum); if (FAILED(hr)) { if (*ppEnum) @@ -701,6 +628,28 @@ static const struct IEnumVARIANTVtbl ListEnumerator_Vtbl = ListEnumerator_Clone }; +/* Create a list enumerator, placing the result in the pointer ppObj. */ +static HRESULT create_list_enumerator(ListObject *list, void **ppObj) +{ + ListEnumerator *object; + + TRACE("(%p, %p)\n", list, ppObj); + + object = msi_alloc(sizeof(ListEnumerator)); + + /* Set all the VTable references */ + object->IEnumVARIANT_iface.lpVtbl = &ListEnumerator_Vtbl; + object->ref = 1; + + /* Store data that was passed */ + object->pos = 0; + object->list = list; + if (list) IDispatch_AddRef(&list->autoobj.IDispatch_iface); + + *ppObj = object; + return S_OK; +} + /* * Individual Object Invocation Functions */ @@ -734,7 +683,7 @@ static HRESULT DispGetParam_CopyOnly( &pdispparams->rgvarg[pos]); } -static HRESULT WINAPI SummaryInfoImpl_Invoke( +static HRESULT SummaryInfoImpl_Invoke( AutomationObject* This, DISPID dispIdMember, REFIID riid, @@ -886,7 +835,7 @@ static HRESULT WINAPI SummaryInfoImpl_Invoke( return S_OK; } -static HRESULT WINAPI RecordImpl_Invoke( +static HRESULT RecordImpl_Invoke( AutomationObject* This, DISPID dispIdMember, REFIID riid, @@ -977,7 +926,27 @@ static HRESULT WINAPI RecordImpl_Invoke( return S_OK; } -static HRESULT WINAPI ListImpl_Invoke( +HRESULT create_record(MSIHANDLE msiHandle, IDispatch **disp) +{ + AutomationObject *record; + HRESULT hr; + + record = msi_alloc(sizeof(*record)); + if (!record) return E_OUTOFMEMORY; + + hr = init_automation_object(record, msiHandle, &DIID_Record, RecordImpl_Invoke, NULL); + if (hr != S_OK) + { + msi_free(record); + return hr; + } + + *disp = &record->IDispatch_iface; + + return hr; +} + +static HRESULT ListImpl_Invoke( AutomationObject* This, DISPID dispIdMember, REFIID riid, @@ -988,19 +957,16 @@ static HRESULT WINAPI ListImpl_Invoke( EXCEPINFO* pExcepInfo, UINT* puArgErr) { - ListData *data = private_data(This); - HRESULT hr; - VARIANTARG varg0; + ListObject *list = (ListObject*)This; IUnknown *pUnk = NULL; - - VariantInit(&varg0); + HRESULT hr; switch (dispIdMember) { case DISPID_LIST__NEWENUM: if (wFlags & DISPATCH_METHOD) { V_VT(pVarResult) = VT_UNKNOWN; - if (SUCCEEDED(hr = create_list_enumerator(NULL, (LPVOID *)&pUnk, This, 0))) + if (SUCCEEDED(hr = create_list_enumerator(list, (LPVOID *)&pUnk))) V_UNKNOWN(pVarResult) = pUnk; else ERR("Failed to create IEnumVARIANT object, hresult 0x%08x\n", hr); @@ -1010,11 +976,14 @@ static HRESULT WINAPI ListImpl_Invoke( case DISPID_LIST_ITEM: if (wFlags & DISPATCH_PROPERTYGET) { - hr = DispGetParam(pDispParams, 0, VT_I4, &varg0, puArgErr); + VARIANTARG index; + + VariantInit(&index); + hr = DispGetParam(pDispParams, 0, VT_I4, &index, puArgErr); if (FAILED(hr)) return hr; - if (V_I4(&varg0) < 0 || V_I4(&varg0) >= data->ulCount) + if (V_I4(&index) < 0 || V_I4(&index) >= list->count) return DISP_E_BADINDEX; - VariantCopy(pVarResult, &data->pVars[V_I4(&varg0)]); + VariantCopy(pVarResult, &list->data[V_I4(&index)]); } else return DISP_E_MEMBERNOTFOUND; break; @@ -1022,7 +991,7 @@ static HRESULT WINAPI ListImpl_Invoke( case DISPID_LIST_COUNT: if (wFlags & DISPATCH_PROPERTYGET) { V_VT(pVarResult) = VT_I4; - V_I4(pVarResult) = data->ulCount; + V_I4(pVarResult) = list->count; } else return DISP_E_MEMBERNOTFOUND; break; @@ -1031,22 +1000,100 @@ static HRESULT WINAPI ListImpl_Invoke( return DISP_E_MEMBERNOTFOUND; } - VariantClear(&varg0); + return S_OK; +} + +static void ListImpl_Free(AutomationObject *This) +{ + ListObject *list = (ListObject*)This; + int i; + + for (i = 0; i < list->count; i++) + VariantClear(&list->data[i]); + msi_free(list->data); +} + +static HRESULT get_products_count(const WCHAR *product, int *len) +{ + int i = 0; + + while (1) + { + WCHAR dataW[GUID_SIZE]; + UINT ret; + + /* all or related only */ + if (product) + ret = MsiEnumRelatedProductsW(product, 0, i, dataW); + else + ret = MsiEnumProductsW(i, dataW); + + if (ret == ERROR_NO_MORE_ITEMS) break; + + if (ret != ERROR_SUCCESS) + return DISP_E_EXCEPTION; + + i++; + } + + *len = i; return S_OK; } -static void WINAPI ListImpl_Free(AutomationObject *This) +static HRESULT create_list(const WCHAR *product, IDispatch **dispatch) { - ListData *data = private_data(This); - ULONG idx; + ListObject *list; + HRESULT hr; + int i; - for (idx=0; idxulCount; idx++) - VariantClear(&data->pVars[idx]); - msi_free(data->pVars); + list = msi_alloc_zero(sizeof(ListObject)); + if (!list) return E_OUTOFMEMORY; + + hr = init_automation_object(&list->autoobj, 0, &DIID_StringList, ListImpl_Invoke, ListImpl_Free); + if (hr != S_OK) + { + msi_free(list); + return hr; + } + + *dispatch = &list->autoobj.IDispatch_iface; + + hr = get_products_count(product, &list->count); + if (hr != S_OK) + { + IDispatch_Release(*dispatch); + return hr; + } + + list->data = msi_alloc(list->count*sizeof(VARIANT)); + if (!list->data) + { + IDispatch_Release(*dispatch); + return E_OUTOFMEMORY; + } + + for (i = 0; i < list->count; i++) + { + WCHAR dataW[GUID_SIZE]; + UINT ret; + + /* all or related only */ + if (product) + ret = MsiEnumRelatedProductsW(product, 0, i, dataW); + else + ret = MsiEnumProductsW(i, dataW); + + if (ret == ERROR_NO_MORE_ITEMS) break; + + V_VT(&list->data[i]) = VT_BSTR; + V_BSTR(&list->data[i]) = SysAllocString(dataW); + } + + return S_OK; } -static HRESULT WINAPI ViewImpl_Invoke( +static HRESULT ViewImpl_Invoke( AutomationObject* This, DISPID dispIdMember, REFIID riid, @@ -1058,7 +1105,6 @@ static HRESULT WINAPI ViewImpl_Invoke( UINT* puArgErr) { MSIHANDLE msiHandle; - IDispatch *pDispatch = NULL; UINT ret; VARIANTARG varg0, varg1; HRESULT hr; @@ -1086,8 +1132,10 @@ static HRESULT WINAPI ViewImpl_Invoke( V_VT(pVarResult) = VT_DISPATCH; if ((ret = MsiViewFetch(This->msiHandle, &msiHandle)) == ERROR_SUCCESS) { - if (SUCCEEDED(hr = create_automation_object(msiHandle, NULL, (LPVOID*)&pDispatch, &DIID_Record, RecordImpl_Invoke, NULL, 0))) - V_DISPATCH(pVarResult) = pDispatch; + IDispatch *dispatch = NULL; + + if (SUCCEEDED(hr = create_record(msiHandle, &dispatch))) + V_DISPATCH(pVarResult) = dispatch; else ERR("Failed to create Record object, hresult 0x%08x\n", hr); } @@ -1153,7 +1201,7 @@ static HRESULT DatabaseImpl_LastErrorRecord(WORD wFlags, return S_OK; } -static HRESULT WINAPI DatabaseImpl_Invoke( +static HRESULT DatabaseImpl_Invoke( AutomationObject* This, DISPID dispIdMember, REFIID riid, @@ -1164,8 +1212,8 @@ static HRESULT WINAPI DatabaseImpl_Invoke( EXCEPINFO* pExcepInfo, UINT* puArgErr) { + IDispatch *dispatch = NULL; MSIHANDLE msiHandle; - IDispatch *pDispatch = NULL; UINT ret; VARIANTARG varg0, varg1; HRESULT hr; @@ -1185,9 +1233,9 @@ static HRESULT WINAPI DatabaseImpl_Invoke( V_VT(pVarResult) = VT_DISPATCH; if ((ret = MsiGetSummaryInformationW(This->msiHandle, NULL, V_I4(&varg0), &msiHandle)) == ERROR_SUCCESS) { - hr = create_automation_object(msiHandle, NULL, (LPVOID *)&pDispatch, &DIID_SummaryInfo, SummaryInfoImpl_Invoke, NULL, 0); + hr = create_summaryinfo(msiHandle, &dispatch); if (SUCCEEDED(hr)) - V_DISPATCH(pVarResult) = pDispatch; + V_DISPATCH(pVarResult) = dispatch; else ERR("Failed to create SummaryInfo object: 0x%08x\n", hr); } @@ -1208,8 +1256,8 @@ static HRESULT WINAPI DatabaseImpl_Invoke( V_VT(pVarResult) = VT_DISPATCH; if ((ret = MsiDatabaseOpenViewW(This->msiHandle, V_BSTR(&varg0), &msiHandle)) == ERROR_SUCCESS) { - if (SUCCEEDED(hr = create_automation_object(msiHandle, NULL, (LPVOID*)&pDispatch, &DIID_View, ViewImpl_Invoke, NULL, 0))) - V_DISPATCH(pVarResult) = pDispatch; + if (SUCCEEDED(hr = create_view(msiHandle, &dispatch))) + V_DISPATCH(pVarResult) = dispatch; else ERR("Failed to create View object, hresult 0x%08x\n", hr); } @@ -1238,7 +1286,7 @@ static HRESULT WINAPI DatabaseImpl_Invoke( return S_OK; } -static HRESULT WINAPI SessionImpl_Invoke( +static HRESULT SessionImpl_Invoke( AutomationObject* This, DISPID dispIdMember, REFIID riid, @@ -1249,10 +1297,9 @@ static HRESULT WINAPI SessionImpl_Invoke( EXCEPINFO* pExcepInfo, UINT* puArgErr) { - SessionData *data = private_data(This); + SessionObject *session = (SessionObject*)This; WCHAR *szString; DWORD dwLen; - IDispatch *pDispatch = NULL; MSIHANDLE msiHandle; LANGID langId; UINT ret; @@ -1268,8 +1315,8 @@ static HRESULT WINAPI SessionImpl_Invoke( case DISPID_SESSION_INSTALLER: if (wFlags & DISPATCH_PROPERTYGET) { V_VT(pVarResult) = VT_DISPATCH; - IDispatch_AddRef(data->pInstaller); - V_DISPATCH(pVarResult) = data->pInstaller; + IDispatch_AddRef(session->installer); + V_DISPATCH(pVarResult) = session->installer; } else return DISP_E_MEMBERNOTFOUND; break; @@ -1343,8 +1390,10 @@ static HRESULT WINAPI SessionImpl_Invoke( V_VT(pVarResult) = VT_DISPATCH; if ((msiHandle = MsiGetActiveDatabase(This->msiHandle))) { - if (SUCCEEDED(hr = create_automation_object(msiHandle, NULL, (LPVOID*)&pDispatch, &DIID_Database, DatabaseImpl_Invoke, NULL, 0))) - V_DISPATCH(pVarResult) = pDispatch; + IDispatch *dispatch; + + if (SUCCEEDED(hr = create_database(msiHandle, &dispatch))) + V_DISPATCH(pVarResult) = dispatch; else ERR("Failed to create Database object, hresult 0x%08x\n", hr); } @@ -1510,6 +1559,7 @@ static void variant_from_registry_value(VARIANT *pVarResult, DWORD dwType, LPBYT while (idx >= 0 && !szString[idx]) idx--; for (; idx >= 0; idx--) if (!szString[idx]) szString[idx] = '\n'; + /* fall through */ case REG_SZ: V_VT(pVarResult) = VT_BSTR; V_BSTR(pVarResult) = SysAllocStringByteLen((LPCSTR)szString, dwSize); @@ -1579,8 +1629,7 @@ static HRESULT InstallerImpl_CreateRecord(WORD wFlags, if (!hrec) return DISP_E_EXCEPTION; - hr = create_automation_object(hrec, NULL, (LPVOID*)&dispatch, - &DIID_Record, RecordImpl_Invoke, NULL, 0); + hr = create_record(hrec, &dispatch); if (SUCCEEDED(hr)) V_DISPATCH(pVarResult) = dispatch; @@ -1636,7 +1685,7 @@ static HRESULT InstallerImpl_OpenPackage(AutomationObject* This, goto done; } - hr = create_session(hpkg, (IDispatch *)This, &dispatch); + hr = create_session(hpkg, &This->IDispatch_iface, &dispatch); if (SUCCEEDED(hr)) V_DISPATCH(pVarResult) = dispatch; @@ -1705,8 +1754,7 @@ static HRESULT InstallerImpl_OpenDatabase(WORD wFlags, goto done; } - hr = create_automation_object(hdb, NULL, (LPVOID *)&dispatch, - &DIID_Database, DatabaseImpl_Invoke, NULL, 0); + hr = create_database(hdb, &dispatch); if (SUCCEEDED(hr)) V_DISPATCH(pVarResult) = dispatch; @@ -2154,161 +2202,56 @@ done: return hr; } -static void cleanup_products(IDispatch* dispatch, ULONG count) -{ - UINT i; - ListData* ldata = private_data((AutomationObject *)dispatch); - - for (i = 0; i < count - 1; i++) - VariantClear(&ldata->pVars[i]); - - ldata->ulCount = 0; - msi_free(ldata->pVars); - - IDispatch_Release(dispatch); -} - -static HRESULT InstallerImpl_Products(WORD wFlags, +static HRESULT InstallerImpl_Products(WORD flags, DISPPARAMS* pDispParams, - VARIANT* pVarResult, + VARIANT* result, EXCEPINFO* pExcepInfo, UINT* puArgErr) { - UINT ret; - HRESULT hr; - ULONG idx = 0; - ListData *ldata; IDispatch *dispatch; - WCHAR product[GUID_SIZE]; - - if (!(wFlags & DISPATCH_PROPERTYGET)) - return DISP_E_MEMBERNOTFOUND; - - /* Find number of products. */ - while ((ret = MsiEnumProductsW(idx, product)) == ERROR_SUCCESS) - idx++; - - if (ret != ERROR_NO_MORE_ITEMS) - return DISP_E_EXCEPTION; - - V_VT(pVarResult) = VT_DISPATCH; - hr = create_automation_object(0, NULL, (LPVOID*)&dispatch, - &DIID_StringList, ListImpl_Invoke, - ListImpl_Free, sizeof(ListData)); - if (FAILED(hr)) - return hr; - - V_DISPATCH(pVarResult) = dispatch; - - /* Save product strings. */ - ldata = private_data((AutomationObject *)dispatch); - ldata->ulCount = 0; - ldata->pVars = msi_alloc_zero(sizeof(VARIANT) * idx); - if (!ldata->pVars) - { - IDispatch_Release(dispatch); - return E_OUTOFMEMORY; - } - - ldata->ulCount = idx; - for (idx = 0; idx < ldata->ulCount; idx++) - { - ret = MsiEnumProductsW(idx, product); - if (ret != ERROR_SUCCESS) - { - cleanup_products(dispatch, idx - 1); - return DISP_E_EXCEPTION; - } - - VariantInit(&ldata->pVars[idx]); - V_VT(&ldata->pVars[idx]) = VT_BSTR; - V_BSTR(&ldata->pVars[idx]) = SysAllocString(product); - } - - return S_OK; -} - -static HRESULT InstallerImpl_RelatedProducts(WORD wFlags, - DISPPARAMS* pDispParams, - VARIANT* pVarResult, - EXCEPINFO* pExcepInfo, - UINT* puArgErr) -{ - UINT ret; - ULONG idx; HRESULT hr; - ListData *ldata; - VARIANTARG varg0; - IDispatch* dispatch; - WCHAR product[GUID_SIZE]; - if (!(wFlags & DISPATCH_PROPERTYGET)) + if (!(flags & DISPATCH_PROPERTYGET)) return DISP_E_MEMBERNOTFOUND; - VariantInit(&varg0); - hr = DispGetParam(pDispParams, 0, VT_BSTR, &varg0, puArgErr); + hr = create_list(NULL, &dispatch); if (FAILED(hr)) return hr; - /* Find number of related products. */ - idx = 0; - do - { - ret = MsiEnumRelatedProductsW(V_BSTR(&varg0), 0, idx, product); - if (ret == ERROR_SUCCESS) - idx++; - } while (ret == ERROR_SUCCESS); + V_VT(result) = VT_DISPATCH; + V_DISPATCH(result) = dispatch; - if (ret != ERROR_NO_MORE_ITEMS) - { - hr = DISP_E_EXCEPTION; - goto done; - } - - V_VT(pVarResult) = VT_DISPATCH; - - hr = create_automation_object(0, NULL, (LPVOID*)&dispatch, - &DIID_StringList, ListImpl_Invoke, - ListImpl_Free, sizeof(ListData)); - if (FAILED(hr)) - goto done; - - V_DISPATCH(pVarResult) = dispatch; - - /* Save product strings. */ - ldata = private_data((AutomationObject *)dispatch); - ldata->pVars = msi_alloc(sizeof(VARIANT) * idx); - if (!ldata->pVars) - { - IDispatch_Release(dispatch); - hr = E_OUTOFMEMORY; - goto done; - } - - ldata->ulCount = idx; - for (idx = 0; idx < ldata->ulCount; idx++) - { - ret = MsiEnumRelatedProductsW(V_BSTR(&varg0), 0, idx, product); - if (ret != ERROR_SUCCESS) - { - cleanup_products(dispatch, idx - 1); - hr = DISP_E_EXCEPTION; - goto done; - } - - VariantInit(&ldata->pVars[idx]); - V_VT(&ldata->pVars[idx]) = VT_BSTR; - V_BSTR(&ldata->pVars[idx]) = SysAllocString(product); - } - - hr = S_OK; - -done: - VariantClear(&varg0); return hr; } -static HRESULT WINAPI InstallerImpl_Invoke( +static HRESULT InstallerImpl_RelatedProducts(WORD flags, + DISPPARAMS* pDispParams, + VARIANT* result, + EXCEPINFO* pExcepInfo, + UINT* puArgErr) +{ + IDispatch* dispatch; + VARIANTARG related; + HRESULT hr; + + if (!(flags & DISPATCH_PROPERTYGET)) + return DISP_E_MEMBERNOTFOUND; + + VariantInit(&related); + hr = DispGetParam(pDispParams, 0, VT_BSTR, &related, puArgErr); + if (FAILED(hr)) + return hr; + + hr = create_list(V_BSTR(&related), &dispatch); + VariantClear(&related); + + V_VT(result) = VT_DISPATCH; + V_DISPATCH(result) = dispatch; + + return hr; +} + +static HRESULT InstallerImpl_Invoke( AutomationObject* This, DISPID dispIdMember, REFIID riid, @@ -2408,17 +2351,112 @@ static HRESULT WINAPI InstallerImpl_Invoke( } } -/* Wrapper around create_automation_object to create an installer object. */ -HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj) +HRESULT create_msiserver(IUnknown *outer, void **ppObj) { - return create_automation_object(0, pOuter, ppObj, &DIID_Installer, InstallerImpl_Invoke, NULL, 0); -} + AutomationObject *installer; + HRESULT hr; + + TRACE("(%p %p)\n", outer, ppObj); + + if (outer) + return CLASS_E_NOAGGREGATION; + + installer = msi_alloc(sizeof(AutomationObject)); + if (!installer) return E_OUTOFMEMORY; + + hr = init_automation_object(installer, 0, &DIID_Installer, InstallerImpl_Invoke, NULL); + if (hr != S_OK) + { + msi_free(installer); + return hr; + } + + *ppObj = &installer->IDispatch_iface; + + return hr; +} + +HRESULT create_session(MSIHANDLE msiHandle, IDispatch *installer, IDispatch **disp) +{ + SessionObject *session; + HRESULT hr; + + session = msi_alloc(sizeof(SessionObject)); + if (!session) return E_OUTOFMEMORY; + + hr = init_automation_object(&session->autoobj, msiHandle, &DIID_Session, SessionImpl_Invoke, NULL); + if (hr != S_OK) + { + msi_free(session); + return hr; + } + + session->installer = installer; + *disp = &session->autoobj.IDispatch_iface; + + return hr; +} + +static HRESULT create_database(MSIHANDLE msiHandle, IDispatch **dispatch) +{ + AutomationObject *database; + HRESULT hr; + + TRACE("(%d %p)\n", msiHandle, dispatch); + + database = msi_alloc(sizeof(AutomationObject)); + if (!database) return E_OUTOFMEMORY; + + hr = init_automation_object(database, msiHandle, &DIID_Database, DatabaseImpl_Invoke, NULL); + if (hr != S_OK) + { + msi_free(database); + return hr; + } + + *dispatch = &database->IDispatch_iface; + + return hr; +} + +static HRESULT create_view(MSIHANDLE msiHandle, IDispatch **dispatch) +{ + AutomationObject *view; + HRESULT hr; + + TRACE("(%d %p)\n", msiHandle, dispatch); + + view = msi_alloc(sizeof(AutomationObject)); + if (!view) return E_OUTOFMEMORY; + + hr = init_automation_object(view, msiHandle, &DIID_View, ViewImpl_Invoke, NULL); + if (hr != S_OK) + { + msi_free(view); + return hr; + } + + *dispatch = &view->IDispatch_iface; + + return hr; +} + +static HRESULT create_summaryinfo(MSIHANDLE msiHandle, IDispatch **disp) +{ + AutomationObject *info; + HRESULT hr; + + info = msi_alloc(sizeof(*info)); + if (!info) return E_OUTOFMEMORY; + + hr = init_automation_object(info, msiHandle, &DIID_SummaryInfo, SummaryInfoImpl_Invoke, NULL); + if (hr != S_OK) + { + msi_free(info); + return hr; + } + + *disp = &info->IDispatch_iface; -/* Wrapper around create_automation_object to create a session object. */ -HRESULT create_session(MSIHANDLE msiHandle, IDispatch *pInstaller, IDispatch **pDispatch) -{ - HRESULT hr = create_automation_object(msiHandle, NULL, (LPVOID)pDispatch, &DIID_Session, SessionImpl_Invoke, NULL, sizeof(SessionData)); - if (SUCCEEDED(hr) && pDispatch && *pDispatch) - ((SessionData *)private_data((AutomationObject *)*pDispatch))->pInstaller = pInstaller; return hr; } diff --git a/reactos/dll/win32/msi/classes.c b/reactos/dll/win32/msi/classes.c index d11f48b4eab..afc1b1cb83b 100644 --- a/reactos/dll/win32/msi/classes.c +++ b/reactos/dll/win32/msi/classes.c @@ -74,12 +74,12 @@ static MSIAPPID *load_appid( MSIPACKAGE* package, MSIRECORD *row ) static MSIAPPID *load_given_appid( MSIPACKAGE *package, LPCWSTR name ) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','A','p','p','I','d','`',' ','W','H','E','R','E',' ', + '`','A','p','p','I','d','`',' ','=',' ','\'','%','s','\'',0}; MSIRECORD *row; MSIAPPID *appid; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','A','p','p','I','d','`',' ','W','H','E','R','E',' ', - '`','A','p','p','I','d','`',' ','=',' ','\'','%','s','\'',0}; if (!name) return NULL; @@ -94,13 +94,12 @@ static MSIAPPID *load_given_appid( MSIPACKAGE *package, LPCWSTR name ) } } - row = MSI_QueryGetRecord(package->db, ExecSeqQuery, name); + row = MSI_QueryGetRecord(package->db, query, name); if (!row) return NULL; appid = load_appid(package, row); msiobj_release(&row->hdr); - return appid; } @@ -142,7 +141,7 @@ static MSIPROGID *load_progid( MSIPACKAGE* package, MSIRECORD *row ) LPWSTR FilePath; static const WCHAR fmt[] = {'%','s',',','%','i',0}; - FilePath = build_icon_path(package,FileName); + FilePath = msi_build_icon_path(package, FileName); progid->IconPath = msi_alloc( (strlenW(FilePath)+10)* sizeof(WCHAR) ); @@ -154,7 +153,7 @@ static MSIPROGID *load_progid( MSIPACKAGE* package, MSIRECORD *row ) { buffer = MSI_RecordGetString(row,5); if (buffer) - progid->IconPath = build_icon_path(package,buffer); + progid->IconPath = msi_build_icon_path(package, buffer); } progid->CurVer = NULL; @@ -179,12 +178,12 @@ static MSIPROGID *load_progid( MSIPACKAGE* package, MSIRECORD *row ) static MSIPROGID *load_given_progid(MSIPACKAGE *package, LPCWSTR name) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','P','r','o','g','I','d','`',' ','W','H','E','R','E',' ', + '`','P','r','o','g','I','d','`',' ','=',' ','\'','%','s','\'',0}; MSIPROGID *progid; MSIRECORD *row; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','P','r','o','g','I','d','`',' ','W','H','E','R','E',' ', - '`','P','r','o','g','I','d','`',' ','=',' ','\'','%','s','\'',0}; if (!name) return NULL; @@ -199,13 +198,12 @@ static MSIPROGID *load_given_progid(MSIPACKAGE *package, LPCWSTR name) } } - row = MSI_QueryGetRecord( package->db, ExecSeqQuery, name ); + row = MSI_QueryGetRecord( package->db, query, name ); if (!row) return NULL; progid = load_progid(package, row); msiobj_release(&row->hdr); - return progid; } @@ -227,7 +225,7 @@ static MSICLASS *load_class( MSIPACKAGE* package, MSIRECORD *row ) TRACE("loading class %s\n",debugstr_w(cls->clsid)); cls->Context = msi_dup_record_field( row, 2 ); buffer = MSI_RecordGetString(row,3); - cls->Component = get_loaded_component(package, buffer); + cls->Component = msi_get_loaded_component( package, buffer ); cls->ProgIDText = msi_dup_record_field(row,4); cls->ProgID = load_given_progid(package, cls->ProgIDText); @@ -248,7 +246,7 @@ static MSICLASS *load_class( MSIPACKAGE* package, MSIRECORD *row ) LPWSTR FilePath; static const WCHAR fmt[] = {'%','s',',','%','i',0}; - FilePath = build_icon_path(package,FileName); + FilePath = msi_build_icon_path(package, FileName); cls->IconPath = msi_alloc( (strlenW(FilePath)+5)* sizeof(WCHAR) ); @@ -260,7 +258,7 @@ static MSICLASS *load_class( MSIPACKAGE* package, MSIRECORD *row ) { buffer = MSI_RecordGetString(row,8); if (buffer) - cls->IconPath = build_icon_path(package,buffer); + cls->IconPath = msi_build_icon_path(package, buffer); } if (!MSI_RecordIsNull(row,10)) @@ -287,15 +285,15 @@ static MSICLASS *load_class( MSIPACKAGE* package, MSIRECORD *row ) } else { - cls->DefInprocHandler32 = msi_dup_record_field( row, 10); - reduce_to_longfilename(cls->DefInprocHandler32); + cls->DefInprocHandler32 = msi_dup_record_field( row, 10 ); + msi_reduce_to_long_filename( cls->DefInprocHandler32 ); } } buffer = MSI_RecordGetString(row,11); deformat_string(package,buffer,&cls->Argument); buffer = MSI_RecordGetString(row,12); - cls->Feature = get_loaded_feature(package,buffer); + cls->Feature = msi_get_loaded_feature(package, buffer); cls->Attributes = MSI_RecordGetInteger(row,13); @@ -310,12 +308,12 @@ static MSICLASS *load_class( MSIPACKAGE* package, MSIRECORD *row ) */ static MSICLASS *load_given_class(MSIPACKAGE *package, LPCWSTR classid) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','C','l','a','s','s','`',' ','W','H','E','R','E',' ', + '`','C','L','S','I','D','`',' ','=',' ','\'','%','s','\'',0}; MSICLASS *cls; MSIRECORD *row; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','C','l','a','s','s','`',' ','W','H','E','R','E',' ', - '`','C','L','S','I','D','`',' ','=',' ','\'','%','s','\'',0}; if (!classid) return NULL; @@ -330,13 +328,12 @@ static MSICLASS *load_given_class(MSIPACKAGE *package, LPCWSTR classid) } } - row = MSI_QueryGetRecord(package->db, ExecSeqQuery, classid); + row = MSI_QueryGetRecord(package->db, query, classid); if (!row) return NULL; cls = load_class(package, row); msiobj_release(&row->hdr); - return cls; } @@ -370,12 +367,11 @@ static MSIMIME *load_mime( MSIPACKAGE* package, MSIRECORD *row ) static MSIMIME *load_given_mime( MSIPACKAGE *package, LPCWSTR mime ) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','M','I','M','E','`',' ','W','H','E','R','E',' ', + '`','C','o','n','t','e','n','t','T','y','p','e','`',' ','=',' ','\'','%','s','\'',0}; MSIRECORD *row; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','M','I','M','E','`',' ','W','H','E','R','E',' ', - '`','C','o','n','t','e','n','t','T','y','p','e','`',' ','=',' ', - '\'','%','s','\'',0}; MSIMIME *mt; if (!mime) @@ -391,13 +387,12 @@ static MSIMIME *load_given_mime( MSIPACKAGE *package, LPCWSTR mime ) } } - row = MSI_QueryGetRecord(package->db, ExecSeqQuery, mime); + row = MSI_QueryGetRecord(package->db, query, mime); if (!row) return NULL; mt = load_mime(package, row); msiobj_release(&row->hdr); - return mt; } @@ -420,7 +415,7 @@ static MSIEXTENSION *load_extension( MSIPACKAGE* package, MSIRECORD *row ) TRACE("loading extension %s\n", debugstr_w(ext->Extension)); buffer = MSI_RecordGetString( row, 2 ); - ext->Component = get_loaded_component( package,buffer ); + ext->Component = msi_get_loaded_component( package, buffer ); ext->ProgIDText = msi_dup_record_field( row, 3 ); ext->ProgID = load_given_progid( package, ext->ProgIDText ); @@ -429,7 +424,7 @@ static MSIEXTENSION *load_extension( MSIPACKAGE* package, MSIRECORD *row ) ext->Mime = load_given_mime( package, buffer ); buffer = MSI_RecordGetString(row,5); - ext->Feature = get_loaded_feature( package, buffer ); + ext->Feature = msi_get_loaded_feature( package, buffer ); return ext; } @@ -440,14 +435,12 @@ static MSIEXTENSION *load_extension( MSIPACKAGE* package, MSIRECORD *row ) */ static MSIEXTENSION *load_given_extension( MSIPACKAGE *package, LPCWSTR name ) { - MSIRECORD *row; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','E','x','t','e','n','s','i','o','n','`',' ','W','H','E','R','E',' ', + '`','E','x','t','e','n','s','i','o','n','`',' ','=',' ','\'','%','s','\'',0}; MSIEXTENSION *ext; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','E','x','t','e','n','s','i','o','n','`',' ', - 'W','H','E','R','E',' ', - '`','E','x','t','e','n','s','i','o','n','`',' ','=',' ', - '\'','%','s','\'',0}; + MSIRECORD *row; if (!name) return NULL; @@ -465,13 +458,12 @@ static MSIEXTENSION *load_given_extension( MSIPACKAGE *package, LPCWSTR name ) } } - row = MSI_QueryGetRecord( package->db, ExecSeqQuery, name ); + row = MSI_QueryGetRecord( package->db, query, name ); if (!row) return NULL; ext = load_extension(package, row); msiobj_release(&row->hdr); - return ext; } @@ -525,7 +517,7 @@ static UINT iterate_all_classes(MSIRECORD *rec, LPVOID param) clsid = MSI_RecordGetString(rec,1); context = MSI_RecordGetString(rec,2); buffer = MSI_RecordGetString(rec,3); - comp = get_loaded_component(package,buffer); + comp = msi_get_loaded_component(package, buffer); LIST_FOR_EACH_ENTRY( cls, &package->classes, MSICLASS, entry ) { @@ -546,21 +538,20 @@ static UINT iterate_all_classes(MSIRECORD *rec, LPVOID param) return ERROR_SUCCESS; } -static VOID load_all_classes(MSIPACKAGE *package) +static UINT load_all_classes( MSIPACKAGE *package ) { - UINT rc = ERROR_SUCCESS; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ','`','C','l','a','s','s','`',0}; MSIQUERY *view; + UINT rc; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ', - '`','C','l','a','s','s','`',0}; - - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) - return; + return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, iterate_all_classes, package); msiobj_release(&view->hdr); + return rc; } static UINT iterate_all_extensions(MSIRECORD *rec, LPVOID param) @@ -574,7 +565,7 @@ static UINT iterate_all_extensions(MSIRECORD *rec, LPVOID param) extension = MSI_RecordGetString(rec,1); buffer = MSI_RecordGetString(rec,2); - comp = get_loaded_component(package,buffer); + comp = msi_get_loaded_component(package, buffer); LIST_FOR_EACH_ENTRY( ext, &package->extensions, MSIEXTENSION, entry ) { @@ -593,21 +584,20 @@ static UINT iterate_all_extensions(MSIRECORD *rec, LPVOID param) return ERROR_SUCCESS; } -static VOID load_all_extensions(MSIPACKAGE *package) +static UINT load_all_extensions( MSIPACKAGE *package ) { - UINT rc = ERROR_SUCCESS; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','E','x','t','e','n','s','i','o','n','`',0}; MSIQUERY *view; + UINT rc; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','E','x','t','e','n','s','i','o','n','`',0}; - - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc != ERROR_SUCCESS) - return; + return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, iterate_all_extensions, package); msiobj_release(&view->hdr); + return rc; } static UINT iterate_all_progids(MSIRECORD *rec, LPVOID param) @@ -620,38 +610,37 @@ static UINT iterate_all_progids(MSIRECORD *rec, LPVOID param) return ERROR_SUCCESS; } -static VOID load_all_progids(MSIPACKAGE *package) +static UINT load_all_progids( MSIPACKAGE *package ) { - UINT rc = ERROR_SUCCESS; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','`','P','r','o','g','I','d','`',' ','F','R','O','M',' ', + '`','P','r','o','g','I','d','`',0}; MSIQUERY *view; + UINT rc; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','`','P','r','o','g','I','d','`',' ', - 'F','R','O','M',' ', '`','P','r','o','g','I','d','`',0}; - - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) - return; + return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, iterate_all_progids, package); msiobj_release(&view->hdr); + return rc; } -static VOID load_all_verbs(MSIPACKAGE *package) +static UINT load_all_verbs( MSIPACKAGE *package ) { - UINT rc = ERROR_SUCCESS; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','V','e','r','b','`',0}; MSIQUERY *view; + UINT rc; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','V','e','r','b','`',0}; - - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) - return; + return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, iterate_load_verb, package); msiobj_release(&view->hdr); + return rc; } static UINT iterate_all_mimes(MSIRECORD *rec, LPVOID param) @@ -664,42 +653,49 @@ static UINT iterate_all_mimes(MSIRECORD *rec, LPVOID param) return ERROR_SUCCESS; } -static VOID load_all_mimes(MSIPACKAGE *package) +static UINT load_all_mimes( MSIPACKAGE *package ) { - UINT rc = ERROR_SUCCESS; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','`','C','o','n','t','e','n','t','T','y','p','e','`',' ', + 'F','R','O','M',' ','`','M','I','M','E','`',0}; MSIQUERY *view; + UINT rc; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ', - '`','C','o','n','t','e','n','t','T','y','p','e','`', - ' ','F','R','O','M',' ', - '`','M','I','M','E','`',0}; - - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) - return; + return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, iterate_all_mimes, package); msiobj_release(&view->hdr); + return rc; } -static void load_classes_and_such(MSIPACKAGE *package) +static UINT load_classes_and_such( MSIPACKAGE *package ) { + UINT r; + TRACE("Loading all the class info and related tables\n"); /* check if already loaded */ if (!list_empty( &package->classes ) || !list_empty( &package->mimes ) || !list_empty( &package->extensions ) || - !list_empty( &package->progids ) ) - return; + !list_empty( &package->progids )) return ERROR_SUCCESS; + + r = load_all_classes( package ); + if (r != ERROR_SUCCESS) return r; + + r = load_all_extensions( package ); + if (r != ERROR_SUCCESS) return r; + + r = load_all_progids( package ); + if (r != ERROR_SUCCESS) return r; - load_all_classes(package); - load_all_extensions(package); - load_all_progids(package); /* these loads must come after the other loads */ - load_all_verbs(package); - load_all_mimes(package); + r = load_all_verbs( package ); + if (r != ERROR_SUCCESS) return r; + + return load_all_mimes( package ); } static void mark_progid_for_install( MSIPACKAGE* package, MSIPROGID *progid ) @@ -806,10 +802,13 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package) static const WCHAR szFileType_fmt[] = {'F','i','l','e','T','y','p','e','\\','%','s','\\','%','i',0}; const WCHAR *keypath; MSIRECORD *uirow; - HKEY hkey,hkey2,hkey3; + HKEY hkey, hkey2, hkey3; MSICLASS *cls; + UINT r; - load_classes_and_such(package); + r = load_classes_and_such( package ); + if (r != ERROR_SUCCESS) + return r; if (is_64bit && package->platform == PLATFORM_INTEL) keypath = szWow6432NodeCLSID; @@ -841,21 +840,20 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package) if (!feature) continue; - if (feature->ActionRequest != INSTALLSTATE_LOCAL && - feature->ActionRequest != INSTALLSTATE_ADVERTISED ) + feature->Action = msi_get_feature_action( package, feature ); + if (feature->Action != INSTALLSTATE_LOCAL && + feature->Action != INSTALLSTATE_ADVERTISED ) { - TRACE("Feature %s not scheduled for installation, skipping registration of class %s\n", + TRACE("feature %s not scheduled for installation, skipping registration of class %s\n", debugstr_w(feature->Feature), debugstr_w(cls->clsid)); continue; } - feature->Action = feature->ActionRequest; - if (!comp->KeyPath || !(file = get_loaded_file( package, comp->KeyPath ))) + if (!comp->KeyPath || !(file = msi_get_loaded_file( package, comp->KeyPath ))) { TRACE("COM server not provided, skipping class %s\n", debugstr_w(cls->clsid)); continue; } - TRACE("Registering class %s (%p)\n", debugstr_w(cls->clsid), cls); cls->Installed = TRUE; @@ -958,10 +956,9 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package) uirow = MSI_CreateRecord(1); MSI_RecordSetStringW( uirow, 1, cls->clsid ); - ui_actiondata(package,szRegisterClassInfo,uirow); + msi_ui_actiondata( package, szRegisterClassInfo, uirow ); msiobj_release(&uirow->hdr); } - RegCloseKey(hkey); return ERROR_SUCCESS; } @@ -973,8 +970,11 @@ UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package ) MSIRECORD *uirow; MSICLASS *cls; HKEY hkey, hkey2; + UINT r; - load_classes_and_such( package ); + r = load_classes_and_such( package ); + if (r != ERROR_SUCCESS) + return r; if (is_64bit && package->platform == PLATFORM_INTEL) keypath = szWow6432NodeCLSID; @@ -1005,14 +1005,13 @@ UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package ) if (!feature) continue; - if (feature->ActionRequest != INSTALLSTATE_ABSENT) + feature->Action = msi_get_feature_action( package, feature ); + if (feature->Action != INSTALLSTATE_ABSENT) { - TRACE("Feature %s not scheduled for removal, skipping unregistration of class %s\n", + TRACE("feature %s not scheduled for removal, skipping unregistration of class %s\n", debugstr_w(feature->Feature), debugstr_w(cls->clsid)); continue; } - feature->Action = feature->ActionRequest; - TRACE("Unregistering class %s (%p)\n", debugstr_w(cls->clsid), cls); cls->Installed = FALSE; @@ -1050,10 +1049,9 @@ UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package ) uirow = MSI_CreateRecord( 1 ); MSI_RecordSetStringW( uirow, 1, cls->clsid ); - ui_actiondata( package, szUnregisterClassInfo, uirow ); + msi_ui_actiondata( package, szUnregisterClassInfo, uirow ); msiobj_release( &uirow->hdr ); } - RegCloseKey( hkey ); return ERROR_SUCCESS; } @@ -1109,8 +1107,11 @@ UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package) { MSIPROGID *progid; MSIRECORD *uirow; + UINT r; - load_classes_and_such(package); + r = load_classes_and_such( package ); + if (r != ERROR_SUCCESS) + return r; LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry ) { @@ -1131,10 +1132,9 @@ UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package) uirow = MSI_CreateRecord( 1 ); MSI_RecordSetStringW( uirow, 1, progid->ProgID ); - ui_actiondata( package, szRegisterProgIdInfo, uirow ); + msi_ui_actiondata( package, szRegisterProgIdInfo, uirow ); msiobj_release( &uirow->hdr ); } - return ERROR_SUCCESS; } @@ -1143,8 +1143,11 @@ UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package ) MSIPROGID *progid; MSIRECORD *uirow; LONG res; + UINT r; - load_classes_and_such( package ); + r = load_classes_and_such( package ); + if (r != ERROR_SUCCESS) + return r; LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry ) { @@ -1166,10 +1169,9 @@ UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package ) uirow = MSI_CreateRecord( 1 ); MSI_RecordSetStringW( uirow, 1, progid->ProgID ); - ui_actiondata( package, szUnregisterProgIdInfo, uirow ); + msi_ui_actiondata( package, szUnregisterProgIdInfo, uirow ); msiobj_release( &uirow->hdr ); } - return ERROR_SUCCESS; } @@ -1187,7 +1189,7 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid, DWORD size; LPWSTR advertise; - keyname = build_directory_name(4, progid, szShell, verb->Verb, szCommand); + keyname = msi_build_directory_name(4, progid, szShell, verb->Verb, szCommand); TRACE("Making Key %s\n",debugstr_w(keyname)); RegCreateKeyW(HKEY_CLASSES_ROOT, keyname, &key); @@ -1205,9 +1207,8 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid, msi_reg_set_val_str( key, NULL, command ); msi_free(command); - advertise = create_component_advertise_string(package, component, - extension->Feature->Feature); - + advertise = msi_create_component_advertise_string(package, component, + extension->Feature->Feature); size = strlenW(advertise); if (verb->Argument) @@ -1232,7 +1233,7 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid, if (verb->Command) { - keyname = build_directory_name(3, progid, szShell, verb->Verb); + keyname = msi_build_directory_name( 3, progid, szShell, verb->Verb ); msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, keyname, NULL, verb->Command ); msi_free(keyname); } @@ -1242,7 +1243,7 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid, if (*Sequence == MSI_NULL_INTEGER || verb->Sequence < *Sequence) { *Sequence = verb->Sequence; - keyname = build_directory_name(2, progid, szShell); + keyname = msi_build_directory_name( 2, progid, szShell ); msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, keyname, NULL, verb->Verb ); msi_free(keyname); } @@ -1252,15 +1253,17 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid, UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package) { - static const WCHAR szContentType[] = - {'C','o','n','t','e','n','t',' ','T','y','p','e',0 }; + static const WCHAR szContentType[] = {'C','o','n','t','e','n','t',' ','T','y','p','e',0}; HKEY hkey = NULL; MSIEXTENSION *ext; MSIRECORD *uirow; BOOL install_on_demand = TRUE; LONG res; + UINT r; - load_classes_and_such(package); + r = load_classes_and_such( package ); + if (r != ERROR_SUCCESS) + return r; /* We need to set install_on_demand based on if the shell handles advertised * shortcuts and the like. Because Mike McCormack is working on this i am @@ -1289,15 +1292,14 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package) * yes. MSDN says that these are based on _Feature_ not on * Component. So verify the feature is to be installed */ - if (feature->ActionRequest != INSTALLSTATE_LOCAL && - !(install_on_demand && feature->ActionRequest == INSTALLSTATE_ADVERTISED)) + feature->Action = msi_get_feature_action( package, feature ); + if (feature->Action != INSTALLSTATE_LOCAL && + !(install_on_demand && feature->Action == INSTALLSTATE_ADVERTISED)) { - TRACE("Feature %s not scheduled for installation, skipping registration of extension %s\n", - debugstr_w(feature->Feature), debugstr_w(ext->Extension)); + TRACE("feature %s not scheduled for installation, skipping registration of extension %s\n", + debugstr_w(feature->Feature), debugstr_w(ext->Extension)); continue; } - feature->Action = feature->ActionRequest; - TRACE("Registering extension %s (%p)\n", debugstr_w(ext->Extension), ext); ext->Installed = TRUE; @@ -1362,10 +1364,9 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package) uirow = MSI_CreateRecord(1); MSI_RecordSetStringW( uirow, 1, ext->Extension ); - ui_actiondata(package,szRegisterExtensionInfo,uirow); + msi_ui_actiondata( package, szRegisterExtensionInfo, uirow ); msiobj_release(&uirow->hdr); } - return ERROR_SUCCESS; } @@ -1374,8 +1375,11 @@ UINT ACTION_UnregisterExtensionInfo( MSIPACKAGE *package ) MSIEXTENSION *ext; MSIRECORD *uirow; LONG res; + UINT r; - load_classes_and_such( package ); + r = load_classes_and_such( package ); + if (r != ERROR_SUCCESS) + return r; LIST_FOR_EACH_ENTRY( ext, &package->extensions, MSIEXTENSION, entry ) { @@ -1395,13 +1399,13 @@ UINT ACTION_UnregisterExtensionInfo( MSIPACKAGE *package ) if (!feature) continue; - if (feature->ActionRequest != INSTALLSTATE_ABSENT) + feature->Action = msi_get_feature_action( package, feature ); + if (feature->Action != INSTALLSTATE_ABSENT) { - TRACE("Feature %s not scheduled for removal, skipping unregistration of extension %s\n", - debugstr_w(feature->Feature), debugstr_w(ext->Extension)); + TRACE("feature %s not scheduled for removal, skipping unregistration of extension %s\n", + debugstr_w(feature->Feature), debugstr_w(ext->Extension)); continue; } - TRACE("Unregistering extension %s\n", debugstr_w(ext->Extension)); ext->Installed = FALSE; @@ -1448,26 +1452,26 @@ UINT ACTION_UnregisterExtensionInfo( MSIPACKAGE *package ) uirow = MSI_CreateRecord( 1 ); MSI_RecordSetStringW( uirow, 1, ext->Extension ); - ui_actiondata( package, szUnregisterExtensionInfo, uirow ); + msi_ui_actiondata( package, szUnregisterExtensionInfo, uirow ); msiobj_release( &uirow->hdr ); } - return ERROR_SUCCESS; } UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package) { - static const WCHAR szExten[] = - {'E','x','t','e','n','s','i','o','n',0 }; + static const WCHAR szExtension[] = {'E','x','t','e','n','s','i','o','n',0}; MSIRECORD *uirow; MSIMIME *mt; + UINT r; - load_classes_and_such(package); + r = load_classes_and_such( package ); + if (r != ERROR_SUCCESS) + return r; LIST_FOR_EACH_ENTRY( mt, &package->mimes, MSIMIME, entry ) { - LPWSTR extension; - LPWSTR key; + LPWSTR extension, key; /* * check if the MIME is to be installed. Either as requested by an @@ -1495,7 +1499,7 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package) strcpyW( key, szMIMEDatabase ); strcatW( key, mt->ContentType ); - msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, key, szExten, extension ); + msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, key, szExtension, extension ); if (mt->clsid) msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, key, szCLSID, mt->clsid ); @@ -1506,10 +1510,9 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package) uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, mt->ContentType ); MSI_RecordSetStringW( uirow, 2, mt->suffix ); - ui_actiondata( package, szRegisterMIMEInfo, uirow ); + msi_ui_actiondata( package, szRegisterMIMEInfo, uirow ); msiobj_release( &uirow->hdr ); } - return ERROR_SUCCESS; } @@ -1517,8 +1520,11 @@ UINT ACTION_UnregisterMIMEInfo( MSIPACKAGE *package ) { MSIRECORD *uirow; MSIMIME *mime; + UINT r; - load_classes_and_such( package ); + r = load_classes_and_such( package ); + if (r != ERROR_SUCCESS) + return r; LIST_FOR_EACH_ENTRY( mime, &package->mimes, MSIMIME, entry ) { @@ -1551,9 +1557,8 @@ UINT ACTION_UnregisterMIMEInfo( MSIPACKAGE *package ) uirow = MSI_CreateRecord( 2 ); MSI_RecordSetStringW( uirow, 1, mime->ContentType ); MSI_RecordSetStringW( uirow, 2, mime->suffix ); - ui_actiondata( package, szUnregisterMIMEInfo, uirow ); + msi_ui_actiondata( package, szUnregisterMIMEInfo, uirow ); msiobj_release( &uirow->hdr ); } - return ERROR_SUCCESS; } diff --git a/reactos/dll/win32/msi/cond.tab.c b/reactos/dll/win32/msi/cond.tab.c index eff848b5507..8e074133db6 100644 --- a/reactos/dll/win32/msi/cond.tab.c +++ b/reactos/dll/win32/msi/cond.tab.c @@ -2355,7 +2355,7 @@ static INT compare_substring( LPCWSTR a, INT operator, LPCWSTR b ) return !strncmpiW( a + (l - r), b, r ); } default: - ERR("invalid substring operator\n"); + ERR("invalid substring operator\n"); return 0; } return 0; @@ -2365,7 +2365,7 @@ static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert ) { if (operator >= COND_SS && operator <= COND_RHS) return compare_substring( a, operator, b ); - + /* null and empty string are equivalent */ if (!a) a = szEmpty; if (!b) b = szEmpty; @@ -2532,8 +2532,7 @@ static int COND_GetOne( struct cond_str *str, COND_input *cond ) if (ch == '"' ) { LPCWSTR p = strchrW( str->data + 1, '"' ); - if (!p) - return COND_ERROR; + if (!p) return COND_ERROR; len = p - str->data + 1; rc = COND_LITER; } @@ -2680,8 +2679,7 @@ MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition ) TRACE("%s\n", debugstr_w( szCondition ) ); - if ( szCondition == NULL ) - return MSICONDITION_NONE; + if (szCondition == NULL) return MSICONDITION_NONE; cond.package = package; cond.str = szCondition; diff --git a/reactos/dll/win32/msi/create.c b/reactos/dll/win32/msi/create.c index c55390c8f7a..c679d6b131f 100644 --- a/reactos/dll/win32/msi/create.c +++ b/reactos/dll/win32/msi/create.c @@ -61,7 +61,6 @@ static UINT CREATE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT static UINT CREATE_execute( struct tagMSIVIEW *view, MSIRECORD *record ) { MSICREATEVIEW *cv = (MSICREATEVIEW*)view; - MSITABLE *table; BOOL persist = (cv->bIsTemp) ? MSICONDITION_FALSE : MSICONDITION_TRUE; TRACE("%p Table %s (%s)\n", cv, debugstr_w(cv->name), @@ -70,7 +69,7 @@ static UINT CREATE_execute( struct tagMSIVIEW *view, MSIRECORD *record ) if (cv->bIsTemp && !cv->hold) return ERROR_SUCCESS; - return msi_create_table( cv->db, cv->name, cv->col_info, persist, &table); + return msi_create_table( cv->db, cv->name, cv->col_info, persist ); } static UINT CREATE_close( struct tagMSIVIEW *view ) @@ -91,9 +90,8 @@ static UINT CREATE_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *co return ERROR_FUNCTION_FAILED; } -static UINT CREATE_get_column_info( struct tagMSIVIEW *view, - UINT n, LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name) +static UINT CREATE_get_column_info( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, + UINT *type, BOOL *temporary, LPCWSTR *table_name ) { MSICREATEVIEW *cv = (MSICREATEVIEW*)view; diff --git a/reactos/dll/win32/msi/custom.c b/reactos/dll/win32/msi/custom.c index 83a750dd578..75437673761 100644 --- a/reactos/dll/win32/msi/custom.c +++ b/reactos/dll/win32/msi/custom.c @@ -41,8 +41,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); #define CUSTOM_ACTION_TYPE_MASK 0x3F -static const WCHAR c_collen[] = {'C',':','\\',0}; -static const WCHAR cszTempFolder[]= {'T','e','m','p','F','o','l','d','e','r',0}; typedef struct tagMSIRUNNINGACTION { @@ -52,31 +50,6 @@ typedef struct tagMSIRUNNINGACTION LPWSTR name; } MSIRUNNINGACTION; -static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType2(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType18(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType19(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType23(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType50(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType34(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType37_38(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType5_6(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType21_22(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); -static UINT HANDLE_CustomType53_54(MSIPACKAGE *package, LPCWSTR source, - LPCWSTR target, const INT type, LPCWSTR action); - typedef UINT (WINAPI *MsiCustomActionEntryPoint)( MSIHANDLE ); static CRITICAL_SECTION msi_custom_action_cs; @@ -91,6 +64,62 @@ static CRITICAL_SECTION msi_custom_action_cs = { &msi_custom_action_cs_debug, -1 static struct list msi_pending_custom_actions = LIST_INIT( msi_pending_custom_actions ); +UINT msi_schedule_action( MSIPACKAGE *package, UINT script, const WCHAR *action ) +{ + UINT count; + WCHAR **newbuf = NULL; + + if (script >= SCRIPT_MAX) + { + FIXME("Unknown script requested %u\n", script); + return ERROR_FUNCTION_FAILED; + } + TRACE("Scheduling action %s in script %u\n", debugstr_w(action), script); + + count = package->script->ActionCount[script]; + package->script->ActionCount[script]++; + if (count != 0) newbuf = msi_realloc( package->script->Actions[script], + package->script->ActionCount[script] * sizeof(WCHAR *) ); + else newbuf = msi_alloc( sizeof(WCHAR *) ); + + newbuf[count] = strdupW( action ); + package->script->Actions[script] = newbuf; + return ERROR_SUCCESS; +} + +UINT msi_register_unique_action( MSIPACKAGE *package, const WCHAR *action ) +{ + UINT count; + WCHAR **newbuf = NULL; + + if (!package->script) return FALSE; + + TRACE("Registering %s as unique action\n", debugstr_w(action)); + + count = package->script->UniqueActionsCount; + package->script->UniqueActionsCount++; + if (count != 0) newbuf = msi_realloc( package->script->UniqueActions, + package->script->UniqueActionsCount * sizeof(WCHAR *) ); + else newbuf = msi_alloc( sizeof(WCHAR *) ); + + newbuf[count] = strdupW( action ); + package->script->UniqueActions = newbuf; + return ERROR_SUCCESS; +} + +BOOL msi_action_is_unique( const MSIPACKAGE *package, const WCHAR *action ) +{ + UINT i; + + if (!package->script) return FALSE; + + for (i = 0; i < package->script->UniqueActionsCount; i++) + { + if (!strcmpW( package->script->UniqueActions[i], action )) return TRUE; + } + return FALSE; +} + static BOOL check_execution_scheduling_options(MSIPACKAGE *package, LPCWSTR action, UINT options) { if (!package->script) @@ -117,13 +146,13 @@ static BOOL check_execution_scheduling_options(MSIPACKAGE *package, LPCWSTR acti } else if (options & msidbCustomActionTypeOncePerProcess) { - if (check_unique_action(package,action)) + if (msi_action_is_unique(package, action)) { TRACE("Skipping action due to msidbCustomActionTypeOncePerProcess option.\n"); return FALSE; } else - register_unique_action(package,action); + msi_register_unique_action(package, action); } return TRUE; @@ -176,191 +205,6 @@ static void set_deferred_action_props(MSIPACKAGE *package, LPWSTR deferred_data) msi_set_property(package->db, szProductCode, beg); } -UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL execute) -{ - UINT rc = ERROR_SUCCESS; - MSIRECORD * row = 0; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','C','u','s','t','o' ,'m','A','c','t','i','o','n','`', - ' ','W','H','E','R','E',' ','`','A','c','t','i' ,'o','n','`',' ', - '=',' ','\'','%','s','\'',0}; - UINT type; - LPCWSTR source, target; - LPWSTR ptr, deferred_data = NULL; - LPWSTR action_copy = strdupW(action); - WCHAR *deformated=NULL; - - /* deferred action: [properties]Action */ - if ((ptr = strrchrW(action_copy, ']'))) - { - deferred_data = action_copy; - action = ptr + 1; - } - - row = MSI_QueryGetRecord( package->db, ExecSeqQuery, action ); - if (!row) - { - msi_free(action_copy); - return ERROR_CALL_NOT_IMPLEMENTED; - } - - type = MSI_RecordGetInteger(row,2); - - source = MSI_RecordGetString(row,3); - target = MSI_RecordGetString(row,4); - - TRACE("Handling custom action %s (%x %s %s)\n",debugstr_w(action),type, - debugstr_w(source), debugstr_w(target)); - - /* handle some of the deferred actions */ - if (type & msidbCustomActionTypeTSAware) - FIXME("msidbCustomActionTypeTSAware not handled\n"); - - if (type & msidbCustomActionTypeInScript) - { - if (type & msidbCustomActionTypeNoImpersonate) - WARN("msidbCustomActionTypeNoImpersonate not handled\n"); - - if (!execute) - { - LPWSTR actiondata = msi_dup_property(package->db, action); - LPWSTR usersid = msi_dup_property(package->db, szUserSID); - LPWSTR prodcode = msi_dup_property(package->db, szProductCode); - LPWSTR deferred = msi_get_deferred_action(action, actiondata, usersid, prodcode); - - if (type & msidbCustomActionTypeCommit) - { - TRACE("Deferring commit action\n"); - schedule_action(package, COMMIT_SCRIPT, deferred); - } - else if (type & msidbCustomActionTypeRollback) - { - FIXME("Deferring rollback only action\n"); - schedule_action(package, ROLLBACK_SCRIPT, deferred); - } - else - { - TRACE("Deferring action\n"); - schedule_action(package, INSTALL_SCRIPT, deferred); - } - - rc = ERROR_SUCCESS; - msi_free(actiondata); - msi_free(usersid); - msi_free(prodcode); - msi_free(deferred); - goto end; - } - else - { - LPWSTR actiondata = msi_dup_property( package->db, action ); - - if (type & msidbCustomActionTypeInScript) - package->scheduled_action_running = TRUE; - - if (type & msidbCustomActionTypeCommit) - package->commit_action_running = TRUE; - - if (type & msidbCustomActionTypeRollback) - package->rollback_action_running = TRUE; - - if (deferred_data) - set_deferred_action_props(package, deferred_data); - else if (actiondata) - msi_set_property(package->db, szCustomActionData, actiondata); - else - msi_set_property(package->db, szCustomActionData, szEmpty); - - msi_free(actiondata); - } - if (type & msidbCustomActionTypeRollback) - { - FIXME("Rollbacks not supported yet\n"); - rc = ERROR_SUCCESS; - goto end; - } - } - else if (!check_execution_scheduling_options(package,action,type)) - { - rc = ERROR_SUCCESS; - goto end; - } - - switch (type & CUSTOM_ACTION_TYPE_MASK) - { - case 1: /* DLL file stored in a Binary table stream */ - rc = HANDLE_CustomType1(package,source,target,type,action); - break; - case 2: /* EXE file stored in a Binary table stream */ - rc = HANDLE_CustomType2(package,source,target,type,action); - break; - case 18: /*EXE file installed with package */ - rc = HANDLE_CustomType18(package,source,target,type,action); - break; - case 19: /* Error that halts install */ - rc = HANDLE_CustomType19(package,source,target,type,action); - break; - case 17: - rc = HANDLE_CustomType17(package,source,target,type,action); - break; - case 23: /* installs another package in the source tree */ - deformat_string(package,target,&deformated); - rc = HANDLE_CustomType23(package,source,deformated,type,action); - msi_free(deformated); - break; - case 50: /*EXE file specified by a property value */ - rc = HANDLE_CustomType50(package,source,target,type,action); - break; - case 34: /*EXE to be run in specified directory */ - rc = HANDLE_CustomType34(package,source,target,type,action); - break; - case 35: /* Directory set with formatted text. */ - deformat_string(package,target,&deformated); - MSI_SetTargetPathW(package, source, deformated); - msi_free(deformated); - break; - case 51: /* Property set with formatted text. */ - if (!source) - break; - - deformat_string(package,target,&deformated); - rc = msi_set_property( package->db, source, deformated ); - if (rc == ERROR_SUCCESS && !strcmpW( source, cszSourceDir )) - msi_reset_folders( package, TRUE ); - msi_free(deformated); - break; - case 37: /* JScript/VBScript text stored in target column. */ - case 38: - rc = HANDLE_CustomType37_38(package,source,target,type,action); - break; - case 5: - case 6: /* JScript/VBScript file stored in a Binary table stream. */ - rc = HANDLE_CustomType5_6(package,source,target,type,action); - break; - case 21: /* JScript/VBScript file installed with the product. */ - case 22: - rc = HANDLE_CustomType21_22(package,source,target,type,action); - break; - case 53: /* JScript/VBScript text specified by a property value. */ - case 54: - rc = HANDLE_CustomType53_54(package,source,target,type,action); - break; - default: - FIXME("UNHANDLED ACTION TYPE %i (%s %s)\n", - type & CUSTOM_ACTION_TYPE_MASK, debugstr_w(source), - debugstr_w(target)); - } - -end: - package->scheduled_action_running = FALSE; - package->commit_action_running = FALSE; - package->rollback_action_running = FALSE; - msi_free(action_copy); - msiobj_release(&row->hdr); - return rc; -} - static MSIBINARY *create_temp_binary( MSIPACKAGE *package, LPCWSTR source, BOOL dll ) { static const WCHAR query[] = { @@ -375,7 +219,7 @@ static MSIBINARY *create_temp_binary( MSIPACKAGE *package, LPCWSTR source, BOOL DWORD sz = MAX_PATH, write; UINT r; - if (msi_get_property(package->db, cszTempFolder, fmt, &sz) != ERROR_SUCCESS) + if (msi_get_property(package->db, szTempFolder, fmt, &sz) != ERROR_SUCCESS) GetTempPathW(MAX_PATH, fmt); if (!GetTempFileNameW( fmt, szMsi, 0, tmpfile )) @@ -464,6 +308,7 @@ static UINT custom_get_process_return( HANDLE process ) DWORD rc = 0; GetExitCodeProcess( process, &rc ); + TRACE("exit code is %u\n", rc); if (rc != 0) return ERROR_FUNCTION_FAILED; return ERROR_SUCCESS; @@ -678,22 +523,22 @@ static UINT get_action_info( const GUID *guid, INT *type, MSIHANDLE *handle, #ifdef __i386__ extern UINT CUSTOMPROC_wrapper( MsiCustomActionEntryPoint proc, MSIHANDLE handle ); __ASM_GLOBAL_FUNC( CUSTOMPROC_wrapper, - "pushl %ebp\n\t" - __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") - __ASM_CFI(".cfi_rel_offset %ebp,0\n\t") - "movl %esp,%ebp\n\t" - __ASM_CFI(".cfi_def_cfa_register %ebp\n\t") - "pushl 12(%ebp)\n\t" - "movl 8(%ebp),%eax\n\t" - "call *%eax\n\t" - "leave\n\t" - __ASM_CFI(".cfi_def_cfa %esp,4\n\t") - __ASM_CFI(".cfi_same_value %ebp\n\t") - "ret" ) + "pushl %ebp\n\t" + __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t") + __ASM_CFI(".cfi_rel_offset %ebp,0\n\t") + "movl %esp,%ebp\n\t" + __ASM_CFI(".cfi_def_cfa_register %ebp\n\t") + "pushl 12(%ebp)\n\t" + "movl 8(%ebp),%eax\n\t" + "call *%eax\n\t" + "leave\n\t" + __ASM_CFI(".cfi_def_cfa %esp,4\n\t") + __ASM_CFI(".cfi_same_value %ebp\n\t") + "ret" ) #else static inline UINT CUSTOMPROC_wrapper( MsiCustomActionEntryPoint proc, MSIHANDLE handle ) { - return proc(handle); + return proc(handle); } #endif @@ -889,20 +734,16 @@ static UINT HANDLE_CustomType23(MSIPACKAGE *package, LPCWSTR source, msi_custom_action_info *info; WCHAR package_path[MAX_PATH]; DWORD size; - UINT r; size = MAX_PATH; - msi_get_property(package->db, cszSourceDir, package_path, &size); + msi_get_property(package->db, szSourceDir, package_path, &size); lstrcatW(package_path, szBackSlash); lstrcatW(package_path, source); TRACE("Installing package %s concurrently\n", debugstr_w(package_path)); info = do_msidbCAConcurrentInstall(package, type, package_path, target, action); - - r = wait_thread_handle(info); - release_custom_action_data( info ); - return r; + return wait_thread_handle(info); } static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source, @@ -910,7 +751,6 @@ static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source, { msi_custom_action_info *info; MSIBINARY *binary; - UINT r; if (!(binary = get_temp_binary( package, source, TRUE ))) return ERROR_FUNCTION_FAILED; @@ -918,62 +758,93 @@ static UINT HANDLE_CustomType1(MSIPACKAGE *package, LPCWSTR source, TRACE("Calling function %s from %s\n", debugstr_w(target), debugstr_w(binary->tmpfile)); info = do_msidbCustomActionTypeDll( package, type, binary->tmpfile, target, action ); + return wait_thread_handle( info ); +} - r = wait_thread_handle( info ); - release_custom_action_data( info ); - return r; +static HANDLE execute_command( const WCHAR *app, WCHAR *arg, const WCHAR *dir ) +{ + static const WCHAR dotexeW[] = {'.','e','x','e',0}; + STARTUPINFOW si; + PROCESS_INFORMATION info; + WCHAR *exe = NULL, *cmd = NULL, *p; + BOOL ret; + + if (app) + { + int len_arg = 0; + DWORD len_exe; + + if (!(exe = msi_alloc( MAX_PATH * sizeof(WCHAR) ))) return INVALID_HANDLE_VALUE; + len_exe = SearchPathW( NULL, app, dotexeW, MAX_PATH, exe, NULL ); + if (len_exe >= MAX_PATH) + { + msi_free( exe ); + if (!(exe = msi_alloc( len_exe * sizeof(WCHAR) ))) return INVALID_HANDLE_VALUE; + len_exe = SearchPathW( NULL, app, dotexeW, len_exe, exe, NULL ); + } + if (!len_exe) + { + WARN("can't find executable %u\n", GetLastError()); + msi_free( exe ); + return INVALID_HANDLE_VALUE; + } + + if (arg) len_arg = strlenW( arg ); + if (!(cmd = msi_alloc( (len_exe + len_arg + 4) * sizeof(WCHAR) ))) + { + msi_free( exe ); + return INVALID_HANDLE_VALUE; + } + p = cmd; + if (strchrW( exe, ' ' )) + { + *p++ = '\"'; + memcpy( p, exe, len_exe * sizeof(WCHAR) ); + p += len_exe; + *p++ = '\"'; + *p = 0; + } + else + { + strcpyW( p, exe ); + p += len_exe; + } + if (arg) + { + *p++ = ' '; + memcpy( p, arg, len_arg * sizeof(WCHAR) ); + p[len_arg] = 0; + } + } + memset( &si, 0, sizeof(STARTUPINFOW) ); + ret = CreateProcessW( exe, exe ? cmd : arg, NULL, NULL, FALSE, 0, NULL, dir, &si, &info ); + msi_free( cmd ); + msi_free( exe ); + if (!ret) + { + WARN("unable to execute command %u\n", GetLastError()); + return INVALID_HANDLE_VALUE; + } + CloseHandle( info.hThread ); + return info.hProcess; } static UINT HANDLE_CustomType2(MSIPACKAGE *package, LPCWSTR source, LPCWSTR target, const INT type, LPCWSTR action) { - STARTUPINFOW si; - PROCESS_INFORMATION info; - BOOL rc; - INT len; - WCHAR *deformated = NULL; - WCHAR *cmd; - static const WCHAR spc[] = {' ',0}; MSIBINARY *binary; - UINT r; + HANDLE handle; + WCHAR *arg; - memset(&si,0,sizeof(STARTUPINFOW)); + if (!(binary = get_temp_binary( package, source, FALSE ))) return ERROR_FUNCTION_FAILED; - if (!(binary = get_temp_binary( package, source, FALSE ))) - return ERROR_FUNCTION_FAILED; + deformat_string( package, target, &arg ); + TRACE("exe %s arg %s\n", debugstr_w(binary->tmpfile), debugstr_w(arg)); - deformat_string(package,target,&deformated); - - len = strlenW( binary->tmpfile ) + 2; - if (deformated) - len += strlenW(deformated); - - cmd = msi_alloc(sizeof(WCHAR)*len); - - strcpyW( cmd, binary->tmpfile ); - if (deformated) - { - strcatW(cmd,spc); - strcatW(cmd,deformated); - msi_free(deformated); - } - - TRACE("executing exe %s\n", debugstr_w(cmd)); - - rc = CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, - c_collen, &si, &info); - msi_free(cmd); - - if ( !rc ) - { - ERR("Unable to execute command %s\n", debugstr_w(cmd)); - return ERROR_SUCCESS; - } - CloseHandle( info.hThread ); - - r = wait_process_handle(package, type, info.hProcess, action); - - return r; + handle = execute_command( binary->tmpfile, arg, szCRoot ); + msi_free( arg ); + if (handle == INVALID_HANDLE_VALUE) return ERROR_SUCCESS; + return wait_process_handle( package, type, handle, action ); } static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source, @@ -981,11 +852,10 @@ static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source, { msi_custom_action_info *info; MSIFILE *file; - UINT r; TRACE("%s %s\n", debugstr_w(source), debugstr_w(target)); - file = get_loaded_file( package, source ); + file = msi_get_loaded_file( package, source ); if (!file) { ERR("invalid file key %s\n", debugstr_w( source )); @@ -993,63 +863,25 @@ static UINT HANDLE_CustomType17(MSIPACKAGE *package, LPCWSTR source, } info = do_msidbCustomActionTypeDll( package, type, file->TargetPath, target, action ); - - r = wait_thread_handle( info ); - release_custom_action_data( info ); - return r; + return wait_thread_handle( info ); } static UINT HANDLE_CustomType18(MSIPACKAGE *package, LPCWSTR source, LPCWSTR target, const INT type, LPCWSTR action) { - STARTUPINFOW si; - PROCESS_INFORMATION info; - BOOL rc; - WCHAR *deformated; - WCHAR *cmd; - INT len; - static const WCHAR spc[] = {' ',0}; MSIFILE *file; + HANDLE handle; + WCHAR *arg; - memset(&si,0,sizeof(STARTUPINFOW)); + if (!(file = msi_get_loaded_file( package, source ))) return ERROR_FUNCTION_FAILED; - file = get_loaded_file(package,source); - if( !file ) - return ERROR_FUNCTION_FAILED; + deformat_string( package, target, &arg ); + TRACE("exe %s arg %s\n", debugstr_w(file->TargetPath), debugstr_w(arg)); - len = lstrlenW( file->TargetPath ); - - deformat_string(package,target,&deformated); - if (deformated) - len += strlenW(deformated); - len += 2; - - cmd = msi_alloc(len * sizeof(WCHAR)); - - lstrcpyW( cmd, file->TargetPath); - if (deformated) - { - strcatW(cmd, spc); - strcatW(cmd, deformated); - - msi_free(deformated); - } - - TRACE("executing exe %s\n", debugstr_w(cmd)); - - rc = CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, - c_collen, &si, &info); - - if ( !rc ) - { - ERR("Unable to execute command %s\n", debugstr_w(cmd)); - msi_free(cmd); - return ERROR_SUCCESS; - } - msi_free(cmd); - CloseHandle( info.hThread ); - - return wait_process_handle(package, type, info.hProcess, action); + handle = execute_command( file->TargetPath, arg, szCRoot ); + msi_free( arg ); + if (handle == INVALID_HANDLE_VALUE) return ERROR_SUCCESS; + return wait_process_handle( package, type, handle, action ); } static UINT HANDLE_CustomType19(MSIPACKAGE *package, LPCWSTR source, @@ -1086,100 +918,39 @@ static UINT HANDLE_CustomType19(MSIPACKAGE *package, LPCWSTR source, static UINT HANDLE_CustomType50(MSIPACKAGE *package, LPCWSTR source, LPCWSTR target, const INT type, LPCWSTR action) { - STARTUPINFOW si; - PROCESS_INFORMATION info; - WCHAR *prop; - BOOL rc; - WCHAR *deformated; - WCHAR *cmd; - INT len; - static const WCHAR spc[] = {' ',0}; + WCHAR *exe, *arg; + HANDLE handle; - memset(&si,0,sizeof(STARTUPINFOW)); - memset(&info,0,sizeof(PROCESS_INFORMATION)); + if (!(exe = msi_dup_property( package->db, source ))) return ERROR_SUCCESS; - prop = msi_dup_property( package->db, source ); - if (!prop) - return ERROR_SUCCESS; + deformat_string( package, target, &arg ); + TRACE("exe %s arg %s\n", debugstr_w(exe), debugstr_w(arg)); - deformat_string(package,target,&deformated); - len = strlenW(prop) + 2; - if (deformated) - len += strlenW(deformated); - - cmd = msi_alloc(sizeof(WCHAR)*len); - - strcpyW(cmd,prop); - if (deformated) - { - strcatW(cmd,spc); - strcatW(cmd,deformated); - - msi_free(deformated); - } - msi_free(prop); - - TRACE("executing exe %s\n", debugstr_w(cmd)); - - rc = CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, - c_collen, &si, &info); - - if ( !rc ) - { - ERR("Unable to execute command %s\n", debugstr_w(cmd)); - msi_free(cmd); - return ERROR_SUCCESS; - } - msi_free(cmd); - - CloseHandle( info.hThread ); - - return wait_process_handle(package, type, info.hProcess, action); + handle = execute_command( exe, arg, szCRoot ); + msi_free( arg ); + if (handle == INVALID_HANDLE_VALUE) return ERROR_SUCCESS; + return wait_process_handle( package, type, handle, action ); } static UINT HANDLE_CustomType34(MSIPACKAGE *package, LPCWSTR source, LPCWSTR target, const INT type, LPCWSTR action) { - LPWSTR workingdir, filename; - STARTUPINFOW si; - PROCESS_INFORMATION info; - BOOL rc; + const WCHAR *workingdir; + HANDLE handle; + WCHAR *cmd; - memset(&si, 0, sizeof(STARTUPINFOW)); + workingdir = msi_get_target_folder( package, source ); + if (!workingdir) return ERROR_FUNCTION_FAILED; - workingdir = resolve_target_folder( package, source, FALSE, TRUE, NULL ); - if (!workingdir) - return ERROR_FUNCTION_FAILED; + deformat_string( package, target, &cmd ); + if (!cmd) return ERROR_FUNCTION_FAILED; - deformat_string(package, target, &filename); + TRACE("cmd %s dir %s\n", debugstr_w(cmd), debugstr_w(workingdir)); - if (!filename) - { - msi_free(workingdir); - return ERROR_FUNCTION_FAILED; - } - - TRACE("executing exe %s with working directory %s\n", - debugstr_w(filename), debugstr_w(workingdir)); - - rc = CreateProcessW(NULL, filename, NULL, NULL, FALSE, 0, NULL, - workingdir, &si, &info); - - if ( !rc ) - { - ERR("Unable to execute command %s with working directory %s\n", - debugstr_w(filename), debugstr_w(workingdir)); - msi_free(filename); - msi_free(workingdir); - return ERROR_SUCCESS; - } - - msi_free(filename); - msi_free(workingdir); - - CloseHandle( info.hThread ); - - return wait_process_handle(package, type, info.hProcess, action); + handle = execute_command( NULL, cmd, workingdir ); + msi_free( cmd ); + if (handle == INVALID_HANDLE_VALUE) return ERROR_SUCCESS; + return wait_process_handle( package, type, handle, action ); } static DWORD ACTION_CallScript( const GUID *guid ) @@ -1263,16 +1034,12 @@ static msi_custom_action_info *do_msidbCustomActionTypeScript( static UINT HANDLE_CustomType37_38(MSIPACKAGE *package, LPCWSTR source, LPCWSTR target, const INT type, LPCWSTR action) { - UINT r; msi_custom_action_info *info; TRACE("%s %s\n", debugstr_w(source), debugstr_w(target)); info = do_msidbCustomActionTypeScript( package, type, target, NULL, action ); - - r = wait_thread_handle( info ); - release_custom_action_data( info ); - return r; + return wait_thread_handle( info ); } static UINT HANDLE_CustomType5_6(MSIPACKAGE *package, LPCWSTR source, @@ -1296,12 +1063,10 @@ static UINT HANDLE_CustomType5_6(MSIPACKAGE *package, LPCWSTR source, return ERROR_FUNCTION_FAILED; r = MSI_RecordReadStream(row, 2, NULL, &sz); - if (r != ERROR_SUCCESS) - return r; + if (r != ERROR_SUCCESS) return r; - buffer = msi_alloc(sizeof(CHAR)*(sz+1)); - if (!buffer) - return ERROR_FUNCTION_FAILED; + buffer = msi_alloc( sz + 1 ); + if (!buffer) return ERROR_FUNCTION_FAILED; r = MSI_RecordReadStream(row, 2, buffer, &sz); if (r != ERROR_SUCCESS) @@ -1317,7 +1082,6 @@ static UINT HANDLE_CustomType5_6(MSIPACKAGE *package, LPCWSTR source, info = do_msidbCustomActionTypeScript( package, type, bufferw, target, action ); r = wait_thread_handle( info ); - release_custom_action_data( info ); done: msi_free(bufferw); @@ -1339,39 +1103,35 @@ static UINT HANDLE_CustomType21_22(MSIPACKAGE *package, LPCWSTR source, TRACE("%s %s\n", debugstr_w(source), debugstr_w(target)); - file = get_loaded_file(package,source); + file = msi_get_loaded_file(package, source); if (!file) { - ERR("invalid file key %s\n", debugstr_w(source)); - return ERROR_FUNCTION_FAILED; + ERR("invalid file key %s\n", debugstr_w(source)); + return ERROR_FUNCTION_FAILED; } hFile = CreateFileW(file->TargetPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); - if (hFile == INVALID_HANDLE_VALUE) - return ERROR_FUNCTION_FAILED; + if (hFile == INVALID_HANDLE_VALUE) return ERROR_FUNCTION_FAILED; sz = GetFileSize(hFile, &szHighWord); if (sz == INVALID_FILE_SIZE || szHighWord != 0) { - CloseHandle(hFile); - return ERROR_FUNCTION_FAILED; + CloseHandle(hFile); + return ERROR_FUNCTION_FAILED; } - - buffer = msi_alloc(sizeof(CHAR)*(sz+1)); + buffer = msi_alloc( sz + 1 ); if (!buffer) { - CloseHandle(hFile); - return ERROR_FUNCTION_FAILED; + CloseHandle(hFile); + return ERROR_FUNCTION_FAILED; } - bRet = ReadFile(hFile, buffer, sz, &read, NULL); CloseHandle(hFile); if (!bRet) { - r = ERROR_FUNCTION_FAILED; + r = ERROR_FUNCTION_FAILED; goto done; } - buffer[read] = 0; bufferw = strdupAtoW(buffer); if (!bufferw) @@ -1379,10 +1139,8 @@ static UINT HANDLE_CustomType21_22(MSIPACKAGE *package, LPCWSTR source, r = ERROR_FUNCTION_FAILED; goto done; } - info = do_msidbCustomActionTypeScript( package, type, bufferw, target, action ); r = wait_thread_handle( info ); - release_custom_action_data( info ); done: msi_free(bufferw); @@ -1395,19 +1153,219 @@ static UINT HANDLE_CustomType53_54(MSIPACKAGE *package, LPCWSTR source, { msi_custom_action_info *info; WCHAR *prop; - UINT r; TRACE("%s %s\n", debugstr_w(source), debugstr_w(target)); prop = msi_dup_property( package->db, source ); - if (!prop) - return ERROR_SUCCESS; + if (!prop) return ERROR_SUCCESS; info = do_msidbCustomActionTypeScript( package, type, prop, NULL, action ); msi_free(prop); - r = wait_thread_handle( info ); - release_custom_action_data( info ); - return r; + return wait_thread_handle( info ); +} + +static BOOL action_type_matches_script( MSIPACKAGE *package, UINT type, UINT script ) +{ + switch (script) + { + case SCRIPT_NONE: + case SCRIPT_INSTALL: + return !(type & msidbCustomActionTypeCommit) && !(type & msidbCustomActionTypeRollback); + case SCRIPT_COMMIT: + return (type & msidbCustomActionTypeCommit); + case SCRIPT_ROLLBACK: + return (type & msidbCustomActionTypeRollback); + default: + ERR("unhandled script %u\n", script); + } + return FALSE; +} + +static UINT defer_custom_action( MSIPACKAGE *package, const WCHAR *action, UINT type ) +{ + WCHAR *actiondata = msi_dup_property( package->db, action ); + WCHAR *usersid = msi_dup_property( package->db, szUserSID ); + WCHAR *prodcode = msi_dup_property( package->db, szProductCode ); + WCHAR *deferred = msi_get_deferred_action( action, actiondata, usersid, prodcode ); + + if (!deferred) + { + msi_free( actiondata ); + msi_free( usersid ); + msi_free( prodcode ); + return ERROR_OUTOFMEMORY; + } + if (type & msidbCustomActionTypeCommit) + { + TRACE("deferring commit action\n"); + msi_schedule_action( package, SCRIPT_COMMIT, deferred ); + } + else if (type & msidbCustomActionTypeRollback) + { + TRACE("deferring rollback action\n"); + msi_schedule_action( package, SCRIPT_ROLLBACK, deferred ); + } + else + { + TRACE("deferring install action\n"); + msi_schedule_action( package, SCRIPT_INSTALL, deferred ); + } + + msi_free( actiondata ); + msi_free( usersid ); + msi_free( prodcode ); + msi_free( deferred ); + return ERROR_SUCCESS; +} + +UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL execute) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','C','u','s','t','o','m','A','c','t','i','o','n','`',' ','W','H','E','R','E',' ', + '`','A','c','t','i' ,'o','n','`',' ','=',' ','\'','%','s','\'',0}; + UINT rc = ERROR_SUCCESS; + MSIRECORD *row; + UINT type; + LPCWSTR source, target; + LPWSTR ptr, deferred_data = NULL; + LPWSTR deformated = NULL, action_copy = strdupW(action); + + /* deferred action: [properties]Action */ + if ((ptr = strrchrW(action_copy, ']'))) + { + deferred_data = action_copy; + action = ptr + 1; + } + + row = MSI_QueryGetRecord( package->db, query, action ); + if (!row) + { + msi_free(action_copy); + return ERROR_CALL_NOT_IMPLEMENTED; + } + + type = MSI_RecordGetInteger(row,2); + source = MSI_RecordGetString(row,3); + target = MSI_RecordGetString(row,4); + + TRACE("Handling custom action %s (%x %s %s)\n",debugstr_w(action),type, + debugstr_w(source), debugstr_w(target)); + + /* handle some of the deferred actions */ + if (type & msidbCustomActionTypeTSAware) + FIXME("msidbCustomActionTypeTSAware not handled\n"); + + if (type & msidbCustomActionTypeInScript) + { + if (type & msidbCustomActionTypeNoImpersonate) + WARN("msidbCustomActionTypeNoImpersonate not handled\n"); + + if (!execute || !action_type_matches_script( package, type, script )) + { + rc = defer_custom_action( package, action, type ); + goto end; + } + else + { + LPWSTR actiondata = msi_dup_property( package->db, action ); + + if (type & msidbCustomActionTypeInScript) + package->scheduled_action_running = TRUE; + + if (type & msidbCustomActionTypeCommit) + package->commit_action_running = TRUE; + + if (type & msidbCustomActionTypeRollback) + package->rollback_action_running = TRUE; + + if (deferred_data) + set_deferred_action_props(package, deferred_data); + else if (actiondata) + msi_set_property(package->db, szCustomActionData, actiondata); + else + msi_set_property(package->db, szCustomActionData, szEmpty); + + msi_free(actiondata); + } + } + else if (!check_execution_scheduling_options(package,action,type)) + { + rc = ERROR_SUCCESS; + goto end; + } + + switch (type & CUSTOM_ACTION_TYPE_MASK) + { + case 1: /* DLL file stored in a Binary table stream */ + rc = HANDLE_CustomType1(package,source,target,type,action); + break; + case 2: /* EXE file stored in a Binary table stream */ + rc = HANDLE_CustomType2(package,source,target,type,action); + break; + case 18: /*EXE file installed with package */ + rc = HANDLE_CustomType18(package,source,target,type,action); + break; + case 19: /* Error that halts install */ + rc = HANDLE_CustomType19(package,source,target,type,action); + break; + case 17: + rc = HANDLE_CustomType17(package,source,target,type,action); + break; + case 23: /* installs another package in the source tree */ + deformat_string(package,target,&deformated); + rc = HANDLE_CustomType23(package,source,deformated,type,action); + msi_free(deformated); + break; + case 50: /*EXE file specified by a property value */ + rc = HANDLE_CustomType50(package,source,target,type,action); + break; + case 34: /*EXE to be run in specified directory */ + rc = HANDLE_CustomType34(package,source,target,type,action); + break; + case 35: /* Directory set with formatted text. */ + deformat_string(package,target,&deformated); + MSI_SetTargetPathW(package, source, deformated); + msi_free(deformated); + break; + case 51: /* Property set with formatted text. */ + if (!source) + break; + + deformat_string(package,target,&deformated); + rc = msi_set_property( package->db, source, deformated ); + if (rc == ERROR_SUCCESS && !strcmpW( source, szSourceDir )) + msi_reset_folders( package, TRUE ); + msi_free(deformated); + break; + case 37: /* JScript/VBScript text stored in target column. */ + case 38: + rc = HANDLE_CustomType37_38(package,source,target,type,action); + break; + case 5: + case 6: /* JScript/VBScript file stored in a Binary table stream. */ + rc = HANDLE_CustomType5_6(package,source,target,type,action); + break; + case 21: /* JScript/VBScript file installed with the product. */ + case 22: + rc = HANDLE_CustomType21_22(package,source,target,type,action); + break; + case 53: /* JScript/VBScript text specified by a property value. */ + case 54: + rc = HANDLE_CustomType53_54(package,source,target,type,action); + break; + default: + FIXME("unhandled action type %u (%s %s)\n", type & CUSTOM_ACTION_TYPE_MASK, + debugstr_w(source), debugstr_w(target)); + } + +end: + package->scheduled_action_running = FALSE; + package->commit_action_running = FALSE; + package->rollback_action_running = FALSE; + msi_free(action_copy); + msiobj_release(&row->hdr); + return rc; } void ACTION_FinishCustomActions(const MSIPACKAGE* package) @@ -1453,8 +1411,14 @@ void ACTION_FinishCustomActions(const MSIPACKAGE* package) msi_dialog_check_messages( wait_handles[i] ); CloseHandle( wait_handles[i] ); } - msi_free( wait_handles ); + + EnterCriticalSection( &msi_custom_action_cs ); + LIST_FOR_EACH_ENTRY_SAFE( info, cursor, &msi_pending_custom_actions, msi_custom_action_info, entry ) + { + if (info->package == package) release_custom_action_data( info ); + } + LeaveCriticalSection( &msi_custom_action_cs ); } typedef struct _msi_custom_remote_impl { diff --git a/reactos/dll/win32/msi/database.c b/reactos/dll/win32/msi/database.c index 598d7a8a022..1f3ab81bd85 100644 --- a/reactos/dll/win32/msi/database.c +++ b/reactos/dll/win32/msi/database.c @@ -61,10 +61,11 @@ typedef struct tagMSITRANSFORM { typedef struct tagMSISTREAM { struct list entry; + IStorage *stg; IStream *stm; } MSISTREAM; -static UINT find_open_stream( MSIDATABASE *db, LPCWSTR name, IStream **stm ) +static UINT find_open_stream( MSIDATABASE *db, IStorage *stg, LPCWSTR name, IStream **stm ) { MSISTREAM *stream; @@ -73,6 +74,8 @@ static UINT find_open_stream( MSIDATABASE *db, LPCWSTR name, IStream **stm ) HRESULT r; STATSTG stat; + if (stream->stg != stg) continue; + r = IStream_Stat( stream->stm, &stat, 0 ); if( FAILED( r ) ) { @@ -94,11 +97,11 @@ static UINT find_open_stream( MSIDATABASE *db, LPCWSTR name, IStream **stm ) return ERROR_FUNCTION_FAILED; } -static UINT clone_open_stream( MSIDATABASE *db, LPCWSTR name, IStream **stm ) +UINT msi_clone_open_stream( MSIDATABASE *db, IStorage *stg, LPCWSTR name, IStream **stm ) { IStream *stream; - if (find_open_stream( db, name, &stream ) == ERROR_SUCCESS) + if (find_open_stream( db, stg, name, &stream ) == ERROR_SUCCESS) { HRESULT r; LARGE_INTEGER pos; @@ -124,15 +127,16 @@ static UINT clone_open_stream( MSIDATABASE *db, LPCWSTR name, IStream **stm ) return ERROR_FUNCTION_FAILED; } -UINT db_get_raw_stream( MSIDATABASE *db, LPCWSTR stname, IStream **stm ) +UINT msi_get_raw_stream( MSIDATABASE *db, LPCWSTR stname, IStream **stm ) { HRESULT r; + IStorage *stg; WCHAR decoded[MAX_STREAM_NAME_LEN]; decode_streamname( stname, decoded ); TRACE("%s -> %s\n", debugstr_w(stname), debugstr_w(decoded)); - if (clone_open_stream( db, stname, stm ) == ERROR_SUCCESS) + if (msi_clone_open_stream( db, db->storage, stname, stm ) == ERROR_SUCCESS) return ERROR_SUCCESS; r = IStorage_OpenStream( db->storage, stname, NULL, @@ -146,18 +150,21 @@ UINT db_get_raw_stream( MSIDATABASE *db, LPCWSTR stname, IStream **stm ) r = IStorage_OpenStream( transform->stg, stname, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, stm ); if (SUCCEEDED(r)) + { + stg = transform->stg; break; + } } } + else stg = db->storage; if( SUCCEEDED(r) ) { MSISTREAM *stream; - stream = msi_alloc( sizeof(MSISTREAM) ); - if( !stream ) - return ERROR_NOT_ENOUGH_MEMORY; - + if (!(stream = msi_alloc( sizeof(MSISTREAM) ))) return ERROR_NOT_ENOUGH_MEMORY; + stream->stg = stg; + IStream_AddRef( stg ); stream->stm = *stm; IStream_AddRef( *stm ); list_add_tail( &db->streams, &stream->entry ); @@ -178,7 +185,7 @@ static void free_transforms( MSIDATABASE *db ) } } -void db_destroy_stream( MSIDATABASE *db, LPCWSTR stname ) +void msi_destroy_stream( MSIDATABASE *db, const WCHAR *stname ) { MSISTREAM *stream, *stream2; @@ -200,8 +207,9 @@ void db_destroy_stream( MSIDATABASE *db, LPCWSTR stname ) list_remove( &stream->entry ); IStream_Release( stream->stm ); + IStream_Release( stream->stg ); + IStorage_DestroyElement( stream->stg, stname ); msi_free( stream ); - IStorage_DestroyElement( db->storage, stname ); CoTaskMemFree( stat.pwcsName ); break; } @@ -213,10 +221,10 @@ static void free_streams( MSIDATABASE *db ) { while( !list_empty( &db->streams ) ) { - MSISTREAM *s = LIST_ENTRY( list_head( &db->streams ), - MSISTREAM, entry ); + MSISTREAM *s = LIST_ENTRY(list_head( &db->streams ), MSISTREAM, entry); list_remove( &s->entry ); IStream_Release( s->stm ); + IStream_Release( s->stg ); msi_free( s ); } } @@ -249,11 +257,6 @@ static VOID MSI_CloseDatabase( MSIOBJECTHDR *arg ) DeleteFileW( db->deletefile ); msi_free( db->deletefile ); } - if (db->localfile) - { - DeleteFileW( db->localfile ); - msi_free( db->localfile ); - } } static HRESULT db_initialize( IStorage *stg, const GUID *clsid ) @@ -355,7 +358,7 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb) else if( szPersist == MSIDBOPEN_TRANSACT ) { r = StgOpenStorage( szDBPath, NULL, - STGM_TRANSACTED|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, NULL, 0, &stg); + STGM_TRANSACTED|STGM_READWRITE|STGM_SHARE_DENY_WRITE, NULL, 0, &stg); } else if( szPersist == MSIDBOPEN_DIRECT ) { @@ -370,7 +373,7 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb) if( FAILED( r ) || !stg ) { - FIXME("open failed r = %08x for %s\n", r, debugstr_w(szDBPath)); + WARN("open failed r = %08x for %s\n", r, debugstr_w(szDBPath)); return ERROR_FUNCTION_FAILED; } @@ -416,6 +419,8 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb) lstrcpyW( path, save_path ); db->path = strdupW( path ); + db->media_transform_offset = MSI_INITIAL_MEDIA_TRANSFORM_OFFSET; + db->media_transform_disk_id = MSI_INITIAL_MEDIA_TRANSFORM_DISKID; if( TRACE_ON( msi ) ) enum_stream_names( stg ); @@ -499,7 +504,7 @@ end: return r; } -static LPWSTR msi_read_text_archive(LPCWSTR path) +static LPWSTR msi_read_text_archive(LPCWSTR path, DWORD *len) { HANDLE file; LPSTR data = NULL; @@ -511,15 +516,17 @@ static LPWSTR msi_read_text_archive(LPCWSTR path) return NULL; size = GetFileSize( file, NULL ); - data = msi_alloc( size + 1 ); - if (!data) - goto done; + if (!(data = msi_alloc( size ))) goto done; - if (!ReadFile( file, data, size, &read, NULL )) - goto done; + if (!ReadFile( file, data, size, &read, NULL ) || read != size) goto done; - data[size] = '\0'; - wdata = strdupAtoW( data ); + while (!data[size - 1]) size--; + *len = MultiByteToWideChar( CP_ACP, 0, data, size, NULL, 0 ); + if ((wdata = msi_alloc( (*len + 1) * sizeof(WCHAR) ))) + { + MultiByteToWideChar( CP_ACP, 0, data, size, wdata, *len ); + wdata[*len] = 0; + } done: CloseHandle( file ); @@ -527,21 +534,22 @@ done: return wdata; } -static void msi_parse_line(LPWSTR *line, LPWSTR **entries, DWORD *num_entries) +static void msi_parse_line(LPWSTR *line, LPWSTR **entries, DWORD *num_entries, DWORD *len) { LPWSTR ptr = *line, save; - DWORD i, count = 1; + DWORD i, count = 1, chars_left = *len; *entries = NULL; /* stay on this line */ - while (*ptr && *ptr != '\n') + while (chars_left && *ptr != '\n') { /* entries are separated by tabs */ if (*ptr == '\t') count++; ptr++; + chars_left--; } *entries = msi_alloc(count * sizeof(LPWSTR)); @@ -549,28 +557,48 @@ static void msi_parse_line(LPWSTR *line, LPWSTR **entries, DWORD *num_entries) return; /* store pointers into the data */ + chars_left = *len; for (i = 0, ptr = *line; i < count; i++) { - while (*ptr && *ptr == '\r') ptr++; + while (chars_left && *ptr == '\r') + { + ptr++; + chars_left--; + } save = ptr; - while (*ptr && *ptr != '\t' && *ptr != '\n' && *ptr != '\r') ptr++; + while (chars_left && *ptr != '\t' && *ptr != '\n' && *ptr != '\r') + { + if (!*ptr) *ptr = '\n'; /* convert embedded nulls to \n */ + if (ptr > *line && *ptr == '\x19' && *(ptr - 1) == '\x11') + { + *ptr = '\n'; + *(ptr - 1) = '\r'; + } + ptr++; + chars_left--; + } /* NULL-separate the data */ if (*ptr == '\n' || *ptr == '\r') { - while (*ptr == '\n' || *ptr == '\r') - *(ptr++) = '\0'; + while (chars_left && (*ptr == '\n' || *ptr == '\r')) + { + *(ptr++) = 0; + chars_left--; + } } else if (*ptr) - *ptr++ = '\0'; - + { + *(ptr++) = 0; + chars_left--; + } (*entries)[i] = save; } /* move to the next line if there's more, else EOF */ *line = ptr; - + *len = chars_left; if (num_entries) *num_entries = count; } @@ -630,6 +658,7 @@ static LPWSTR msi_build_createsql_columns(LPWSTR *columns_data, LPWSTR *types, D { case 'l': lstrcpyW(extra, type_notnull); + /* fall through */ case 'L': lstrcatW(extra, localizable); type = type_char; @@ -637,12 +666,14 @@ static LPWSTR msi_build_createsql_columns(LPWSTR *columns_data, LPWSTR *types, D break; case 's': lstrcpyW(extra, type_notnull); + /* fall through */ case 'S': type = type_char; sprintfW(size, size_fmt, ptr); break; case 'i': lstrcpyW(extra, type_notnull); + /* fall through */ case 'I': if (len <= 2) type = type_int; @@ -657,6 +688,7 @@ static LPWSTR msi_build_createsql_columns(LPWSTR *columns_data, LPWSTR *types, D break; case 'v': lstrcpyW(extra, type_notnull); + /* fall through */ case 'V': type = type_object; break; @@ -906,12 +938,12 @@ static UINT MSI_DatabaseImport(MSIDATABASE *db, LPCWSTR folder, LPCWSTR file) lstrcatW( path, szBackSlash ); lstrcatW( path, file ); - data = msi_read_text_archive( path ); + data = msi_read_text_archive( path, &len ); ptr = data; - msi_parse_line( &ptr, &columns, &num_columns ); - msi_parse_line( &ptr, &types, &num_types ); - msi_parse_line( &ptr, &labels, &num_labels ); + msi_parse_line( &ptr, &columns, &num_columns, &len ); + msi_parse_line( &ptr, &types, &num_types, &len ); + msi_parse_line( &ptr, &labels, &num_labels, &len ); if (num_columns == 1 && !columns[0][0] && num_labels == 1 && !labels[0][0] && num_types == 2 && !strcmpW( types[1], forcecodepage )) @@ -934,9 +966,9 @@ static UINT MSI_DatabaseImport(MSIDATABASE *db, LPCWSTR folder, LPCWSTR file) } /* read in the table records */ - while (*ptr) + while (len) { - msi_parse_line( &ptr, &records[num_records], NULL ); + msi_parse_line( &ptr, &records[num_records], NULL, &len ); num_records++; temp_records = msi_realloc(records, (num_records + 1) * sizeof(LPWSTR *)); @@ -1490,11 +1522,9 @@ static LPWSTR get_key_value(MSIQUERY *view, LPCWSTR key, MSIRECORD *rec) static LPWSTR create_diff_row_query(MSIDATABASE *merge, MSIQUERY *view, LPWSTR table, MSIRECORD *rec) { - LPWSTR query = NULL, clause = NULL; - LPWSTR ptr = NULL, val; - LPCWSTR setptr; - DWORD size = 1, oldsize; - LPCWSTR key; + LPWSTR query = NULL, clause = NULL, val; + LPCWSTR setptr, key; + DWORD size, oldsize; MSIRECORD *keys; UINT r, i, count; @@ -1510,11 +1540,11 @@ static LPWSTR create_diff_row_query(MSIDATABASE *merge, MSIQUERY *view, if (r != ERROR_SUCCESS) return NULL; - clause = msi_alloc_zero(size * sizeof(WCHAR)); + clause = msi_alloc_zero(sizeof(WCHAR)); if (!clause) goto done; - ptr = clause; + size = 1; count = MSI_RecordGetFieldCount(keys); for (i = 1; i <= count; i++) { @@ -1535,8 +1565,7 @@ static LPWSTR create_diff_row_query(MSIDATABASE *merge, MSIQUERY *view, goto done; } - ptr = clause + oldsize - 1; - sprintfW(ptr, setptr, key, val); + sprintfW(clause + oldsize - 1, setptr, key, val); msi_free(val); } @@ -1852,12 +1881,12 @@ done: static UINT gather_merge_data(MSIDATABASE *db, MSIDATABASE *merge, struct list *tabledata) { - UINT r; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','_','T','a','b','l','e','s','`',0}; MSIQUERY *view; MERGEDATA data; - - static const WCHAR query[] = {'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ','`','_','T','a','b','l','e','s','`',0}; + UINT r; r = MSI_DatabaseOpenViewW(merge, query, &view); if (r != ERROR_SUCCESS) @@ -1867,7 +1896,6 @@ static UINT gather_merge_data(MSIDATABASE *db, MSIDATABASE *merge, data.merge = merge; data.tabledata = tabledata; r = MSI_IterateRecords(view, NULL, merge_diff_tables, &data); - msiobj_release(&view->hdr); return r; } diff --git a/reactos/dll/win32/msi/delete.c b/reactos/dll/win32/msi/delete.c index 210fc9e8aac..4472409a0a0 100644 --- a/reactos/dll/win32/msi/delete.c +++ b/reactos/dll/win32/msi/delete.c @@ -126,9 +126,8 @@ static UINT DELETE_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *co return dv->table->ops->get_dimensions( dv->table, NULL, cols ); } -static UINT DELETE_get_column_info( struct tagMSIVIEW *view, - UINT n, LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name) +static UINT DELETE_get_column_info( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, + UINT *type, BOOL *temporary, LPCWSTR *table_name ) { MSIDELETEVIEW *dv = (MSIDELETEVIEW*)view; diff --git a/reactos/dll/win32/msi/dialog.c b/reactos/dll/win32/msi/dialog.c index 40aa7dff692..4e908ff0d4f 100644 --- a/reactos/dll/win32/msi/dialog.c +++ b/reactos/dll/win32/msi/dialog.c @@ -38,13 +38,13 @@ #include "commctrl.h" #include "winreg.h" #include "shlwapi.h" +#include "msiserver.h" #include "wine/debug.h" #include "wine/unicode.h" WINE_DEFAULT_DEBUG_CHANNEL(msi); - extern HINSTANCE msi_hInstance; struct msi_control_tag; @@ -67,6 +67,7 @@ struct msi_control_tag HMODULE hDll; float progress_current; float progress_max; + BOOL progress_backwards; DWORD attributes; WCHAR name[1]; }; @@ -113,11 +114,8 @@ typedef struct LPWSTR propval; } radio_button_group_descr; -static const WCHAR szMsiDialogClass[] = { - 'M','s','i','D','i','a','l','o','g','C','l','o','s','e','C','l','a','s','s',0 -}; -static const WCHAR szMsiHiddenWindow[] = { - 'M','s','i','H','i','d','d','e','n','W','i','n','d','o','w',0 }; +static const WCHAR szMsiDialogClass[] = { 'M','s','i','D','i','a','l','o','g','C','l','o','s','e','C','l','a','s','s',0 }; +static const WCHAR szMsiHiddenWindow[] = { 'M','s','i','H','i','d','d','e','n','W','i','n','d','o','w',0 }; static const WCHAR szStatic[] = { 'S','t','a','t','i','c',0 }; static const WCHAR szButton[] = { 'B','U','T','T','O','N', 0 }; static const WCHAR szButtonData[] = { 'M','S','I','D','A','T','A',0 }; @@ -127,21 +125,16 @@ static const WCHAR szPushButton[] = { 'P','u','s','h','B','u','t','t','o','n',0 static const WCHAR szLine[] = { 'L','i','n','e',0 }; static const WCHAR szBitmap[] = { 'B','i','t','m','a','p',0 }; static const WCHAR szCheckBox[] = { 'C','h','e','c','k','B','o','x',0 }; -static const WCHAR szScrollableText[] = { - 'S','c','r','o','l','l','a','b','l','e','T','e','x','t',0 }; +static const WCHAR szScrollableText[] = { 'S','c','r','o','l','l','a','b','l','e','T','e','x','t',0 }; static const WCHAR szComboBox[] = { 'C','o','m','b','o','B','o','x',0 }; static const WCHAR szEdit[] = { 'E','d','i','t',0 }; static const WCHAR szMaskedEdit[] = { 'M','a','s','k','e','d','E','d','i','t',0 }; static const WCHAR szPathEdit[] = { 'P','a','t','h','E','d','i','t',0 }; -static const WCHAR szProgressBar[] = { - 'P','r','o','g','r','e','s','s','B','a','r',0 }; -static const WCHAR szSetProgress[] = { - 'S','e','t','P','r','o','g','r','e','s','s',0 }; -static const WCHAR szRadioButtonGroup[] = { - 'R','a','d','i','o','B','u','t','t','o','n','G','r','o','u','p',0 }; +static const WCHAR szProgressBar[] = { 'P','r','o','g','r','e','s','s','B','a','r',0 }; +static const WCHAR szSetProgress[] = { 'S','e','t','P','r','o','g','r','e','s','s',0 }; +static const WCHAR szRadioButtonGroup[] = { 'R','a','d','i','o','B','u','t','t','o','n','G','r','o','u','p',0 }; static const WCHAR szIcon[] = { 'I','c','o','n',0 }; -static const WCHAR szSelectionTree[] = { - 'S','e','l','e','c','t','i','o','n','T','r','e','e',0 }; +static const WCHAR szSelectionTree[] = { 'S','e','l','e','c','t','i','o','n','T','r','e','e',0 }; static const WCHAR szGroupBox[] = { 'G','r','o','u','p','B','o','x',0 }; static const WCHAR szListBox[] = { 'L','i','s','t','B','o','x',0 }; static const WCHAR szDirectoryCombo[] = { 'D','i','r','e','c','t','o','r','y','C','o','m','b','o',0 }; @@ -152,15 +145,6 @@ static const WCHAR szSelectionDescription[] = {'S','e','l','e','c','t','i','o',' static const WCHAR szSelectionPath[] = {'S','e','l','e','c','t','i','o','n','P','a','t','h',0}; static const WCHAR szProperty[] = {'P','r','o','p','e','r','t','y',0}; -static UINT msi_dialog_checkbox_handler( msi_dialog *, msi_control *, WPARAM ); -static void msi_dialog_checkbox_sync_state( msi_dialog *, msi_control * ); -static UINT msi_dialog_button_handler( msi_dialog *, msi_control *, WPARAM ); -static UINT msi_dialog_edit_handler( msi_dialog *, msi_control *, WPARAM ); -static UINT msi_dialog_radiogroup_handler( msi_dialog *, msi_control *, WPARAM ); -static UINT msi_dialog_evaluate_control_conditions( msi_dialog *dialog ); -static LRESULT WINAPI MSIRadioGroup_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); -static MSIFEATURE *msi_seltree_get_selected_feature( msi_control *control ); - /* dialog sequencing */ #define WM_MSI_DIALOG_CREATE (WM_USER+0x100) @@ -171,7 +155,24 @@ static MSIFEATURE *msi_seltree_get_selected_feature( msi_control *control ); static DWORD uiThreadId; static HWND hMsiHiddenWindow; -static LPWSTR msi_get_window_text( HWND hwnd ); +static LPWSTR msi_get_window_text( HWND hwnd ) +{ + UINT sz, r; + LPWSTR buf; + + sz = 0x20; + buf = msi_alloc( sz*sizeof(WCHAR) ); + while ( buf ) + { + r = GetWindowTextW( hwnd, buf, sz ); + if ( r < (sz - 1) ) + break; + sz *= 2; + buf = msi_realloc( buf, sz*sizeof(WCHAR) ); + } + + return buf; +} static INT msi_dialog_scale_unit( msi_dialog *dialog, INT val ) { @@ -283,7 +284,7 @@ static LPWSTR msi_dialog_get_style( LPCWSTR p, LPCWSTR *rest ) return NULL; } - if (!p || !q) + if (!q) return NULL; *rest = ++q; @@ -369,11 +370,10 @@ static UINT msi_dialog_set_font( msi_dialog *dialog, HWND hwnd, LPCWSTR name ) static UINT msi_dialog_build_font_list( msi_dialog *dialog ) { static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ','`','T','e','x','t','S','t','y','l','e','`',' ',0 - }; + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','T','e','x','t','S','t','y','l','e','`',0}; + MSIQUERY *view; UINT r; - MSIQUERY *view = NULL; TRACE("dialog %p\n", dialog ); @@ -383,7 +383,6 @@ static UINT msi_dialog_build_font_list( msi_dialog *dialog ) r = MSI_IterateRecords( view, NULL, msi_dialog_add_font, dialog ); msiobj_release( &view->hdr ); - return r; } @@ -432,6 +431,7 @@ static msi_control *msi_dialog_create_window( msi_dialog *dialog, control->type = strdupW( MSI_RecordGetString( rec, 3 ) ); control->progress_current = 0; control->progress_max = 100; + control->progress_backwards = FALSE; x = MSI_RecordGetInteger( rec, 4 ); y = MSI_RecordGetInteger( rec, 5 ); @@ -517,7 +517,6 @@ static LPWSTR msi_create_tmp_path(void) return path; } - static HANDLE msi_load_image( MSIDATABASE *db, LPCWSTR name, UINT type, UINT cx, UINT cy, UINT flags ) { @@ -585,10 +584,36 @@ static void msi_dialog_update_controls( msi_dialog *dialog, LPCWSTR property ) static void msi_dialog_set_property( MSIPACKAGE *package, LPCWSTR property, LPCWSTR value ) { UINT r = msi_set_property( package->db, property, value ); - if (r == ERROR_SUCCESS && !strcmpW( property, cszSourceDir )) + if (r == ERROR_SUCCESS && !strcmpW( property, szSourceDir )) msi_reset_folders( package, TRUE ); } +static MSIFEATURE *msi_seltree_feature_from_item( HWND hwnd, HTREEITEM hItem ) +{ + TVITEMW tvi; + + /* get the feature from the item */ + memset( &tvi, 0, sizeof tvi ); + tvi.hItem = hItem; + tvi.mask = TVIF_PARAM | TVIF_HANDLE; + SendMessageW( hwnd, TVM_GETITEMW, 0, (LPARAM)&tvi ); + return (MSIFEATURE *)tvi.lParam; +} + +struct msi_selection_tree_info +{ + msi_dialog *dialog; + HWND hwnd; + WNDPROC oldproc; + HTREEITEM selected; +}; + +static MSIFEATURE *msi_seltree_get_selected_feature( msi_control *control ) +{ + struct msi_selection_tree_info *info = GetPropW( control->hwnd, szButtonData ); + return msi_seltree_feature_from_item( control->hwnd, info->selected ); +} + /* called from the Control Event subscription code */ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control, LPCWSTR attribute, MSIRECORD *rec ) @@ -611,28 +636,49 @@ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control, } else if( !strcmpW( attribute, szProgress ) ) { - DWORD func, val; + DWORD func, val1, val2, units; - func = MSI_RecordGetInteger( rec , 1 ); - val = MSI_RecordGetInteger( rec , 2 ); + func = MSI_RecordGetInteger( rec, 1 ); + val1 = MSI_RecordGetInteger( rec, 2 ); + val2 = MSI_RecordGetInteger( rec, 3 ); - TRACE("progress: func %u, val %u\n", func, val); + TRACE("progress: func %u val1 %u val2 %u\n", func, val1, val2); switch (func) { case 0: /* init */ - ctrl->progress_max = val; - ctrl->progress_current = 0; - SendMessageW(ctrl->hwnd, PBM_SETRANGE, 0, MAKELPARAM(0,100)); - SendMessageW(ctrl->hwnd, PBM_SETPOS, 0, 0); + SendMessageW( ctrl->hwnd, PBM_SETRANGE, 0, MAKELPARAM(0,100) ); + units = val1 / 512; + if (val2) + { + ctrl->progress_max = units ? units : 100; + ctrl->progress_current = units; + ctrl->progress_backwards = TRUE; + SendMessageW( ctrl->hwnd, PBM_SETPOS, 100, 0 ); + } + else + { + ctrl->progress_max = units ? units : 100; + ctrl->progress_current = 0; + ctrl->progress_backwards = FALSE; + SendMessageW( ctrl->hwnd, PBM_SETPOS, 0, 0 ); + } break; case 1: /* FIXME: not sure what this is supposed to do */ break; case 2: /* move */ - ctrl->progress_current += val; - if (ctrl->progress_current > ctrl->progress_max) - ctrl->progress_current = ctrl->progress_max; - SendMessageW(ctrl->hwnd, PBM_SETPOS, MulDiv(100, ctrl->progress_current, ctrl->progress_max), 0); + units = val1 / 512; + if (ctrl->progress_backwards) + { + if (units >= ctrl->progress_current) ctrl->progress_current -= units; + else ctrl->progress_current = 0; + } + else + { + if (ctrl->progress_current + units < ctrl->progress_max) ctrl->progress_current += units; + else ctrl->progress_current = ctrl->progress_max; + } + SendMessageW( ctrl->hwnd, PBM_SETPOS, MulDiv(100, ctrl->progress_current, ctrl->progress_max), 0 ); break; default: FIXME("Unknown progress message %u\n", func); @@ -646,12 +692,10 @@ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control, } else if ( !strcmpW( attribute, szSelectionPath ) ) { - LPWSTR prop = msi_dialog_dup_property( dialog, ctrl->property, TRUE ); - LPWSTR path; - if (!prop) return; - path = msi_dup_property( dialog->package->db, prop ); + BOOL indirect = ctrl->attributes & msidbControlAttributesIndirect; + LPWSTR path = msi_dialog_dup_property( dialog, ctrl->property, indirect ); + if (!path) return; SetWindowTextW( ctrl->hwnd, path ); - msi_free(prop); msi_free(path); } else @@ -831,6 +875,92 @@ static WCHAR *msi_get_binary_name( MSIPACKAGE *package, MSIRECORD *rec ) return p; } +static UINT msi_dialog_set_property_event( msi_dialog *dialog, LPCWSTR event, LPCWSTR arg ) +{ + static const WCHAR szNullArg[] = {'{','}',0}; + LPWSTR p, prop, arg_fmt = NULL; + UINT len; + + len = strlenW( event ); + prop = msi_alloc( len * sizeof(WCHAR) ); + strcpyW( prop, &event[1] ); + p = strchrW( prop, ']' ); + if (p && (p[1] == 0 || p[1] == ' ')) + { + *p = 0; + if (strcmpW( szNullArg, arg )) + deformat_string( dialog->package, arg, &arg_fmt ); + msi_dialog_set_property( dialog->package, prop, arg_fmt ); + msi_dialog_update_controls( dialog, prop ); + msi_free( arg_fmt ); + } + else ERR("Badly formatted property string - what happens?\n"); + msi_free( prop ); + return ERROR_SUCCESS; +} + +static UINT msi_dialog_send_event( msi_dialog *dialog, LPCWSTR event, LPCWSTR arg ) +{ + LPWSTR event_fmt = NULL, arg_fmt = NULL; + + TRACE("Sending control event %s %s\n", debugstr_w(event), debugstr_w(arg)); + + deformat_string( dialog->package, event, &event_fmt ); + deformat_string( dialog->package, arg, &arg_fmt ); + + dialog->event_handler( dialog->package, event_fmt, arg_fmt, dialog ); + + msi_free( event_fmt ); + msi_free( arg_fmt ); + + return ERROR_SUCCESS; +} + +static UINT msi_dialog_control_event( MSIRECORD *rec, LPVOID param ) +{ + msi_dialog *dialog = param; + LPCWSTR condition, event, arg; + UINT r; + + condition = MSI_RecordGetString( rec, 5 ); + r = MSI_EvaluateConditionW( dialog->package, condition ); + if (r == MSICONDITION_TRUE || r == MSICONDITION_NONE) + { + event = MSI_RecordGetString( rec, 3 ); + arg = MSI_RecordGetString( rec, 4 ); + if (event[0] == '[') + msi_dialog_set_property_event( dialog, event, arg ); + else + msi_dialog_send_event( dialog, event, arg ); + } + return ERROR_SUCCESS; +} + +static UINT msi_dialog_button_handler( msi_dialog *dialog, msi_control *control, WPARAM param ) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + 'C','o','n','t','r','o','l','E','v','e','n','t',' ','W','H','E','R','E',' ', + '`','D','i','a','l','o','g','_','`',' ','=',' ','\'','%','s','\'',' ','A','N','D',' ', + '`','C','o','n','t','r','o','l','_','`',' ','=',' ','\'','%','s','\'',' ', + 'O','R','D','E','R',' ','B','Y',' ','`','O','r','d','e','r','i','n','g','`',0}; + MSIQUERY *view; + UINT r; + + if (HIWORD(param) != BN_CLICKED) + return ERROR_SUCCESS; + + r = MSI_OpenQuery( dialog->package->db, &view, query, dialog->name, control->name ); + if (r != ERROR_SUCCESS) + { + ERR("query failed\n"); + return ERROR_SUCCESS; + } + r = MSI_IterateRecords( view, 0, msi_dialog_control_event, dialog ); + msiobj_release( &view->hdr ); + return r; +} + static UINT msi_dialog_button_control( msi_dialog *dialog, MSIRECORD *rec ) { msi_control *control; @@ -903,6 +1033,59 @@ static LPWSTR msi_get_checkbox_value( msi_dialog *dialog, LPCWSTR prop ) return ret; } +static UINT msi_dialog_get_checkbox_state( msi_dialog *dialog, msi_control *control ) +{ + WCHAR state[2] = {0}; + DWORD sz = 2; + + msi_get_property( dialog->package->db, control->property, state, &sz ); + return state[0] ? 1 : 0; +} + +static void msi_dialog_set_checkbox_state( msi_dialog *dialog, msi_control *control, UINT state ) +{ + static const WCHAR szState[] = {'1',0}; + LPCWSTR val; + + /* if uncheck then the property is set to NULL */ + if (!state) + { + msi_dialog_set_property( dialog->package, control->property, NULL ); + return; + } + + /* check for a custom state */ + if (control->value && control->value[0]) + val = control->value; + else + val = szState; + + msi_dialog_set_property( dialog->package, control->property, val ); +} + +static void msi_dialog_checkbox_sync_state( msi_dialog *dialog, msi_control *control ) +{ + UINT state = msi_dialog_get_checkbox_state( dialog, control ); + SendMessageW( control->hwnd, BM_SETCHECK, state ? BST_CHECKED : BST_UNCHECKED, 0 ); +} + +static UINT msi_dialog_checkbox_handler( msi_dialog *dialog, msi_control *control, WPARAM param ) +{ + UINT state; + + if (HIWORD(param) != BN_CLICKED) + return ERROR_SUCCESS; + + TRACE("clicked checkbox %s, set %s\n", debugstr_w(control->name), debugstr_w(control->property)); + + state = msi_dialog_get_checkbox_state( dialog, control ); + state = state ? 0 : 1; + msi_dialog_set_checkbox_state( dialog, control, state ); + msi_dialog_checkbox_sync_state( dialog, control ); + + return msi_dialog_button_handler( dialog, control, param ); +} + static UINT msi_dialog_checkbox_control( msi_dialog *dialog, MSIRECORD *rec ) { msi_control *control; @@ -910,20 +1093,17 @@ static UINT msi_dialog_checkbox_control( msi_dialog *dialog, MSIRECORD *rec ) TRACE("%p %p\n", dialog, rec); - control = msi_dialog_add_control( dialog, rec, szButton, - BS_CHECKBOX | BS_MULTILINE | WS_TABSTOP ); + control = msi_dialog_add_control( dialog, rec, szButton, BS_CHECKBOX | BS_MULTILINE | WS_TABSTOP ); control->handler = msi_dialog_checkbox_handler; control->update = msi_dialog_checkbox_sync_state; prop = MSI_RecordGetString( rec, 9 ); - if( prop ) + if (prop) { control->property = strdupW( prop ); control->value = msi_get_checkbox_value( dialog, prop ); - TRACE("control %s value %s\n", debugstr_w(control->property), - debugstr_w(control->value)); + TRACE("control %s value %s\n", debugstr_w(control->property), debugstr_w(control->value)); } msi_dialog_checkbox_sync_state( dialog, control ); - return ERROR_SUCCESS; } @@ -967,6 +1147,7 @@ static UINT msi_dialog_line_control( msi_dialog *dialog, MSIRECORD *rec ) control->type = strdupW( MSI_RecordGetString( rec, 3 ) ); control->progress_current = 0; control->progress_max = 100; + control->progress_backwards = FALSE; x = MSI_RecordGetInteger( rec, 4 ); y = MSI_RecordGetInteger( rec, 5 ); @@ -1066,9 +1247,7 @@ static void msi_scrolltext_add_text( msi_control *control, LPCWSTR text ) static UINT msi_dialog_scrolltext_control( msi_dialog *dialog, MSIRECORD *rec ) { - static const WCHAR szRichEdit20W[] = { - 'R','i','c','h','E','d','i','t','2','0','W',0 - }; + static const WCHAR szRichEdit20W[] = {'R','i','c','h','E','d','i','t','2','0','W',0}; struct msi_scrolltext_info *info; msi_control *control; HMODULE hRichedit; @@ -1293,17 +1472,14 @@ static UINT msi_combobox_add_item( MSIRECORD *rec, LPVOID param ) static UINT msi_combobox_add_items( struct msi_combobox_info *info, LPCWSTR property ) { - UINT r; - MSIQUERY *view = NULL; - DWORD count; - static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ','`','C','o','m','b','o','B','o','x','`',' ', - 'W','H','E','R','E',' ', + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','C','o','m','b','o','B','o','x','`',' ','W','H','E','R','E',' ', '`','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',' ', - 'O','R','D','E','R',' ','B','Y',' ','`','O','r','d','e','r','`',0 - }; + 'O','R','D','E','R',' ','B','Y',' ','`','O','r','d','e','r','`',0}; + MSIQUERY *view; + DWORD count; + UINT r; r = MSI_OpenQuery( info->dialog->package->db, &view, query, property ); if (r != ERROR_SUCCESS) @@ -1312,18 +1488,80 @@ static UINT msi_combobox_add_items( struct msi_combobox_info *info, LPCWSTR prop /* just get the number of records */ count = 0; r = MSI_IterateRecords( view, &count, NULL, NULL ); - + if (r != ERROR_SUCCESS) + { + msiobj_release( &view->hdr ); + return r; + } info->num_items = count; info->items = msi_alloc( sizeof(*info->items) * count ); r = MSI_IterateRecords( view, NULL, msi_combobox_add_item, info ); msiobj_release( &view->hdr ); - return r; } -static UINT msi_dialog_combobox_handler( msi_dialog *dialog, - msi_control *control, WPARAM param ) +static UINT msi_dialog_set_control_condition( MSIRECORD *rec, LPVOID param ) +{ + static const WCHAR szHide[] = {'H','i','d','e',0}; + static const WCHAR szShow[] = {'S','h','o','w',0}; + static const WCHAR szDisable[] = {'D','i','s','a','b','l','e',0}; + static const WCHAR szEnable[] = {'E','n','a','b','l','e',0}; + static const WCHAR szDefault[] = {'D','e','f','a','u','l','t',0}; + msi_dialog *dialog = param; + msi_control *control; + LPCWSTR name, action, condition; + UINT r; + + name = MSI_RecordGetString( rec, 2 ); + action = MSI_RecordGetString( rec, 3 ); + condition = MSI_RecordGetString( rec, 4 ); + r = MSI_EvaluateConditionW( dialog->package, condition ); + control = msi_dialog_find_control( dialog, name ); + if (r == MSICONDITION_TRUE && control) + { + TRACE("%s control %s\n", debugstr_w(action), debugstr_w(name)); + + /* FIXME: case sensitive? */ + if (!strcmpW( action, szHide )) + ShowWindow(control->hwnd, SW_HIDE); + else if (!strcmpW( action, szShow )) + ShowWindow(control->hwnd, SW_SHOW); + else if (!strcmpW( action, szDisable )) + EnableWindow(control->hwnd, FALSE); + else if (!strcmpW( action, szEnable )) + EnableWindow(control->hwnd, TRUE); + else if (!strcmpW( action, szDefault )) + SetFocus(control->hwnd); + else + FIXME("Unhandled action %s\n", debugstr_w(action)); + } + return ERROR_SUCCESS; +} + +static UINT msi_dialog_evaluate_control_conditions( msi_dialog *dialog ) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + 'C','o','n','t','r','o','l','C','o','n','d','i','t','i','o','n',' ', + 'W','H','E','R','E',' ','`','D','i','a','l','o','g','_','`',' ','=',' ','\'','%','s','\'',0}; + UINT r; + MSIQUERY *view; + MSIPACKAGE *package = dialog->package; + + TRACE("%p %s\n", dialog, debugstr_w(dialog->name)); + + /* query the Control table for all the elements of the control */ + r = MSI_OpenQuery( package->db, &view, query, dialog->name ); + if (r != ERROR_SUCCESS) + return ERROR_SUCCESS; + + r = MSI_IterateRecords( view, 0, msi_dialog_set_control_condition, dialog ); + msiobj_release( &view->hdr ); + return r; +} + +static UINT msi_dialog_combobox_handler( msi_dialog *dialog, msi_control *control, WPARAM param ) { struct msi_combobox_info *info; int index; @@ -1348,8 +1586,7 @@ static UINT msi_dialog_combobox_handler( msi_dialog *dialog, return ERROR_SUCCESS; } -static void msi_dialog_combobox_update( msi_dialog *dialog, - msi_control *control ) +static void msi_dialog_combobox_update( msi_dialog *dialog, msi_control *control ) { struct msi_combobox_info *info; LPWSTR value, tmp; @@ -1434,6 +1671,22 @@ static UINT msi_dialog_combo_control( msi_dialog *dialog, MSIRECORD *rec ) return ERROR_SUCCESS; } +static UINT msi_dialog_edit_handler( msi_dialog *dialog, msi_control *control, WPARAM param ) +{ + LPWSTR buf; + + if (HIWORD(param) != EN_CHANGE) + return ERROR_SUCCESS; + + TRACE("edit %s contents changed, set %s\n", debugstr_w(control->name), debugstr_w(control->property)); + + buf = msi_get_window_text( control->hwnd ); + msi_dialog_set_property( dialog->package, control->property, buf ); + msi_free( buf ); + + return ERROR_SUCCESS; +} + /* length of 2^32 + 1 */ #define MAX_NUM_DIGITS 11 @@ -1826,25 +2079,6 @@ struct msi_pathedit_info WNDPROC oldproc; }; -static LPWSTR msi_get_window_text( HWND hwnd ) -{ - UINT sz, r; - LPWSTR buf; - - sz = 0x20; - buf = msi_alloc( sz*sizeof(WCHAR) ); - while ( buf ) - { - r = GetWindowTextW( hwnd, buf, sz ); - if ( r < (sz - 1) ) - break; - sz *= 2; - buf = msi_realloc( buf, sz*sizeof(WCHAR) ); - } - - return buf; -} - static void msi_dialog_update_pathedit( msi_dialog *dialog, msi_control *control ) { LPWSTR prop, path; @@ -1964,6 +2198,18 @@ static UINT msi_dialog_pathedit_control( msi_dialog *dialog, MSIRECORD *rec ) return ERROR_SUCCESS; } +static UINT msi_dialog_radiogroup_handler( msi_dialog *dialog, msi_control *control, WPARAM param ) +{ + if (HIWORD(param) != BN_CLICKED) + return ERROR_SUCCESS; + + TRACE("clicked radio button %s, set %s\n", debugstr_w(control->name), debugstr_w(control->property)); + + msi_dialog_set_property( dialog->package, control->property, control->name ); + + return msi_dialog_button_handler( dialog, control, param ); +} + /* radio buttons are a bit different from normal controls */ static UINT msi_dialog_create_radiobutton( MSIRECORD *rec, LPVOID param ) { @@ -1997,17 +2243,41 @@ static UINT msi_dialog_create_radiobutton( MSIRECORD *rec, LPVOID param ) return ERROR_SUCCESS; } +static BOOL CALLBACK msi_radioground_child_enum( HWND hWnd, LPARAM lParam ) +{ + EnableWindow( hWnd, lParam ); + return TRUE; +} + +static LRESULT WINAPI MSIRadioGroup_WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + WNDPROC oldproc = (WNDPROC)GetPropW( hWnd, szButtonData ); + LRESULT r; + + TRACE("hWnd %p msg %04x wParam 0x%08lx lParam 0x%08lx\n", hWnd, msg, wParam, lParam); + + if (msg == WM_COMMAND) /* Forward notifications to dialog */ + SendMessageW( GetParent( hWnd ), msg, wParam, lParam ); + + r = CallWindowProcW( oldproc, hWnd, msg, wParam, lParam ); + + /* make sure the radio buttons show as disabled if the parent is disabled */ + if (msg == WM_ENABLE) + EnumChildWindows( hWnd, msi_radioground_child_enum, wParam ); + + return r; +} + static UINT msi_dialog_radiogroup_control( msi_dialog *dialog, MSIRECORD *rec ) { static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ','R','a','d','i','o','B','u','t','t','o','n',' ', - 'W','H','E','R','E',' ', - '`','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',0}; + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + 'R','a','d','i','o','B','u','t','t','o','n',' ','W','H','E','R','E',' ', + '`','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',0}; UINT r; LPCWSTR prop; msi_control *control; - MSIQUERY *view = NULL; + MSIQUERY *view; radio_button_group_descr group; MSIPACKAGE *package = dialog->package; WNDPROC oldproc; @@ -2053,25 +2323,14 @@ static UINT msi_dialog_radiogroup_control( msi_dialog *dialog, MSIRECORD *rec ) r = MSI_IterateRecords( view, 0, msi_dialog_create_radiobutton, &group ); msiobj_release( &view->hdr ); msi_free( group.propval ); - return r; } -/******************** Selection Tree ***************************************/ - -struct msi_selection_tree_info -{ - msi_dialog *dialog; - HWND hwnd; - WNDPROC oldproc; - HTREEITEM selected; -}; - static void msi_seltree_sync_item_state( HWND hwnd, MSIFEATURE *feature, HTREEITEM hItem ) { TVITEMW tvi; - DWORD index = feature->Action; + DWORD index = feature->ActionRequest; TRACE("Feature %s -> %d %d %d\n", debugstr_w(feature->Title), feature->Installed, feature->Action, feature->ActionRequest); @@ -2107,20 +2366,6 @@ msi_seltree_popup_menu( HWND hwnd, INT x, INT y ) return r; } -static MSIFEATURE * -msi_seltree_feature_from_item( HWND hwnd, HTREEITEM hItem ) -{ - TVITEMW tvi; - - /* get the feature from the item */ - memset( &tvi, 0, sizeof tvi ); - tvi.hItem = hItem; - tvi.mask = TVIF_PARAM | TVIF_HANDLE; - SendMessageW( hwnd, TVM_GETITEMW, 0, (LPARAM) &tvi ); - - return (MSIFEATURE*) tvi.lParam; -} - static void msi_seltree_update_feature_installstate( HWND hwnd, HTREEITEM hItem, MSIPACKAGE *package, MSIFEATURE *feature, INSTALLSTATE state ) @@ -2204,12 +2449,6 @@ msi_seltree_menu( HWND hwnd, HTREEITEM hItem ) return 0; } -static MSIFEATURE *msi_seltree_get_selected_feature( msi_control *control ) -{ - struct msi_selection_tree_info *info = GetPropW(control->hwnd, szButtonData); - return msi_seltree_feature_from_item( control->hwnd, info->selected ); -} - static LRESULT WINAPI MSISelectionTree_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { @@ -2228,12 +2467,11 @@ MSISelectionTree_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) tvhti.pt.y = (short)HIWORD( lParam ); tvhti.flags = 0; tvhti.hItem = 0; - r = CallWindowProcW(info->oldproc, hWnd, TVM_HITTEST, 0, (LPARAM) &tvhti ); + CallWindowProcW(info->oldproc, hWnd, TVM_HITTEST, 0, (LPARAM) &tvhti ); if (tvhti.flags & TVHT_ONITEMSTATEICON) return msi_seltree_menu( hWnd, tvhti.hItem ); break; } - r = CallWindowProcW(info->oldproc, hWnd, msg, wParam, lParam); switch( msg ) @@ -2378,7 +2616,7 @@ static UINT msi_dialog_seltree_handler( msi_dialog *dialog, dir = MSI_RecordGetString( row, 7 ); if (dir) { - folder = get_loaded_folder( dialog->package, dir ); + folder = msi_get_loaded_folder( dialog->package, dir ); if (!folder) { r = ERROR_FUNCTION_FAILED; @@ -2517,17 +2755,14 @@ static UINT msi_listbox_add_item( MSIRECORD *rec, LPVOID param ) static UINT msi_listbox_add_items( struct msi_listbox_info *info, LPCWSTR property ) { - UINT r; - MSIQUERY *view = NULL; - DWORD count; - static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ','`','L','i','s','t','B','o','x','`',' ', - 'W','H','E','R','E',' ', + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','L','i','s','t','B','o','x','`',' ','W','H','E','R','E',' ', '`','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',' ', - 'O','R','D','E','R',' ','B','Y',' ','`','O','r','d','e','r','`',0 - }; + 'O','R','D','E','R',' ','B','Y',' ','`','O','r','d','e','r','`',0}; + MSIQUERY *view; + DWORD count; + UINT r; r = MSI_OpenQuery( info->dialog->package->db, &view, query, property ); if ( r != ERROR_SUCCESS ) @@ -2536,13 +2771,16 @@ static UINT msi_listbox_add_items( struct msi_listbox_info *info, LPCWSTR proper /* just get the number of records */ count = 0; r = MSI_IterateRecords( view, &count, NULL, NULL ); - + if (r != ERROR_SUCCESS) + { + msiobj_release( &view->hdr ); + return r; + } info->num_items = count; info->items = msi_alloc( sizeof(*info->items) * count ); r = MSI_IterateRecords( view, NULL, msi_listbox_add_item, info ); msiobj_release( &view->hdr ); - return r; } @@ -3113,12 +3351,11 @@ static UINT msi_dialog_create_controls( MSIRECORD *rec, LPVOID param ) static UINT msi_dialog_fill_controls( msi_dialog *dialog ) { static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ','C','o','n','t','r','o','l',' ', - 'W','H','E','R','E',' ', - '`','D','i','a','l','o','g','_','`',' ','=',' ','\'','%','s','\'',0}; + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + 'C','o','n','t','r','o','l',' ','W','H','E','R','E',' ', + '`','D','i','a','l','o','g','_','`',' ','=',' ','\'','%','s','\'',0}; UINT r; - MSIQUERY *view = NULL; + MSIQUERY *view; MSIPACKAGE *package = dialog->package; TRACE("%p %s\n", dialog, debugstr_w(dialog->name) ); @@ -3133,72 +3370,6 @@ static UINT msi_dialog_fill_controls( msi_dialog *dialog ) r = MSI_IterateRecords( view, 0, msi_dialog_create_controls, dialog ); msiobj_release( &view->hdr ); - - return r; -} - -static UINT msi_dialog_set_control_condition( MSIRECORD *rec, LPVOID param ) -{ - static const WCHAR szHide[] = { 'H','i','d','e',0 }; - static const WCHAR szShow[] = { 'S','h','o','w',0 }; - static const WCHAR szDisable[] = { 'D','i','s','a','b','l','e',0 }; - static const WCHAR szEnable[] = { 'E','n','a','b','l','e',0 }; - static const WCHAR szDefault[] = { 'D','e','f','a','u','l','t',0 }; - msi_dialog *dialog = param; - msi_control *control; - LPCWSTR name, action, condition; - UINT r; - - name = MSI_RecordGetString( rec, 2 ); - action = MSI_RecordGetString( rec, 3 ); - condition = MSI_RecordGetString( rec, 4 ); - r = MSI_EvaluateConditionW( dialog->package, condition ); - control = msi_dialog_find_control( dialog, name ); - if( r == MSICONDITION_TRUE && control ) - { - TRACE("%s control %s\n", debugstr_w(action), debugstr_w(name)); - - /* FIXME: case sensitive? */ - if (!strcmpW( action, szHide )) - ShowWindow(control->hwnd, SW_HIDE); - else if (!strcmpW( action, szShow )) - ShowWindow(control->hwnd, SW_SHOW); - else if (!strcmpW( action, szDisable )) - EnableWindow(control->hwnd, FALSE); - else if (!strcmpW( action, szEnable )) - EnableWindow(control->hwnd, TRUE); - else if (!strcmpW( action, szDefault )) - SetFocus(control->hwnd); - else - FIXME("Unhandled action %s\n", debugstr_w(action)); - } - - return ERROR_SUCCESS; -} - -static UINT msi_dialog_evaluate_control_conditions( msi_dialog *dialog ) -{ - static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ', - 'C','o','n','t','r','o','l','C','o','n','d','i','t','i','o','n',' ', - 'W','H','E','R','E',' ', - '`','D','i','a','l','o','g','_','`',' ','=',' ','\'','%','s','\'',0 - }; - UINT r; - MSIQUERY *view = NULL; - MSIPACKAGE *package = dialog->package; - - TRACE("%p %s\n", dialog, debugstr_w(dialog->name) ); - - /* query the Control table for all the elements of the control */ - r = MSI_OpenQuery( package->db, &view, query, dialog->name ); - if( r != ERROR_SUCCESS ) - return ERROR_SUCCESS; - - r = MSI_IterateRecords( view, 0, msi_dialog_set_control_condition, dialog ); - msiobj_release( &view->hdr ); - return r; } @@ -3398,263 +3569,6 @@ static LRESULT msi_dialog_oncreate( HWND hwnd, LPCREATESTRUCTW cs ) return 0; } -static UINT msi_dialog_send_event( msi_dialog *dialog, LPCWSTR event, LPCWSTR arg ) -{ - LPWSTR event_fmt = NULL, arg_fmt = NULL; - - TRACE("Sending control event %s %s\n", debugstr_w(event), debugstr_w(arg)); - - deformat_string( dialog->package, event, &event_fmt ); - deformat_string( dialog->package, arg, &arg_fmt ); - - dialog->event_handler( dialog->package, event_fmt, arg_fmt, dialog ); - - msi_free( event_fmt ); - msi_free( arg_fmt ); - - return ERROR_SUCCESS; -} - -static UINT msi_dialog_set_property_event( msi_dialog *dialog, LPCWSTR event, LPCWSTR arg ) -{ - static const WCHAR szNullArg[] = { '{','}',0 }; - LPWSTR p, prop, arg_fmt = NULL; - UINT len; - - len = strlenW(event); - prop = msi_alloc( len*sizeof(WCHAR)); - strcpyW( prop, &event[1] ); - p = strchrW( prop, ']' ); - if( p && (p[1] == 0 || p[1] == ' ') ) - { - *p = 0; - if( strcmpW( szNullArg, arg ) ) - deformat_string( dialog->package, arg, &arg_fmt ); - msi_dialog_set_property( dialog->package, prop, arg_fmt ); - msi_dialog_update_controls( dialog, prop ); - msi_free( arg_fmt ); - } - else - ERR("Badly formatted property string - what happens?\n"); - msi_free( prop ); - return ERROR_SUCCESS; -} - -static UINT msi_dialog_control_event( MSIRECORD *rec, LPVOID param ) -{ - msi_dialog *dialog = param; - LPCWSTR condition, event, arg; - UINT r; - - condition = MSI_RecordGetString( rec, 5 ); - r = MSI_EvaluateConditionW( dialog->package, condition ); - if( r == MSICONDITION_TRUE || r == MSICONDITION_NONE ) - { - event = MSI_RecordGetString( rec, 3 ); - arg = MSI_RecordGetString( rec, 4 ); - if( event[0] == '[' ) - msi_dialog_set_property_event( dialog, event, arg ); - else - msi_dialog_send_event( dialog, event, arg ); - } - - return ERROR_SUCCESS; -} - -struct rec_list -{ - struct list entry; - MSIRECORD *rec; -}; - -static UINT add_rec_to_list( MSIRECORD *rec, LPVOID param ) -{ - struct rec_list *add_rec; - struct list *records = param; - - msiobj_addref( &rec->hdr ); - - add_rec = msi_alloc( sizeof( *add_rec ) ); - if (!add_rec) - { - msiobj_release( &rec->hdr ); - return ERROR_OUTOFMEMORY; - } - - add_rec->rec = rec; - list_add_tail( records, &add_rec->entry ); - return ERROR_SUCCESS; -} - -static inline void remove_rec_from_list( struct rec_list *rec_entry ) -{ - msiobj_release( &rec_entry->rec->hdr ); - list_remove( &rec_entry->entry ); - msi_free( rec_entry ); -} - -static UINT msi_dialog_button_handler( msi_dialog *dialog, - msi_control *control, WPARAM param ) -{ - static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ','C','o','n','t','r','o','l','E','v','e','n','t',' ', - 'W','H','E','R','E',' ', - '`','D','i','a','l','o','g','_','`',' ','=',' ','\'','%','s','\'',' ', - 'A','N','D',' ', - '`','C','o','n','t','r','o','l','_','`',' ','=',' ','\'','%','s','\'',' ', - 'O','R','D','E','R',' ','B','Y',' ','`','O','r','d','e','r','i','n','g','`',0 - }; - MSIQUERY *view = NULL; - struct rec_list *rec_entry, *next; - struct list events; - UINT r; - - if( HIWORD(param) != BN_CLICKED ) - return ERROR_SUCCESS; - - list_init( &events ); - - r = MSI_OpenQuery( dialog->package->db, &view, query, - dialog->name, control->name ); - if( r != ERROR_SUCCESS ) - { - ERR("query failed\n"); - return 0; - } - - r = MSI_IterateRecords( view, 0, add_rec_to_list, &events ); - msiobj_release( &view->hdr ); - if (r != ERROR_SUCCESS) - goto done; - - /* handle all SetProperty events first */ - LIST_FOR_EACH_ENTRY_SAFE( rec_entry, next, &events, struct rec_list, entry ) - { - LPCWSTR event = MSI_RecordGetString( rec_entry->rec, 3 ); - - if ( event[0] != '[' ) - continue; - - r = msi_dialog_control_event( rec_entry->rec, dialog ); - remove_rec_from_list( rec_entry ); - - if ( r != ERROR_SUCCESS ) - goto done; - } - - /* handle all other events */ - LIST_FOR_EACH_ENTRY_SAFE( rec_entry, next, &events, struct rec_list, entry ) - { - r = msi_dialog_control_event( rec_entry->rec, dialog ); - remove_rec_from_list( rec_entry ); - - if ( r != ERROR_SUCCESS ) - goto done; - } - -done: - LIST_FOR_EACH_ENTRY_SAFE( rec_entry, next, &events, struct rec_list, entry ) - { - remove_rec_from_list( rec_entry ); - } - - return r; -} - -static UINT msi_dialog_get_checkbox_state( msi_dialog *dialog, - msi_control *control ) -{ - WCHAR state[2] = { 0 }; - DWORD sz = 2; - - msi_get_property( dialog->package->db, control->property, state, &sz ); - return state[0] ? 1 : 0; -} - -static void msi_dialog_set_checkbox_state( msi_dialog *dialog, - msi_control *control, UINT state ) -{ - static const WCHAR szState[] = { '1', 0 }; - LPCWSTR val; - - /* if uncheck then the property is set to NULL */ - if (!state) - { - msi_dialog_set_property( dialog->package, control->property, NULL ); - return; - } - - /* check for a custom state */ - if (control->value && control->value[0]) - val = control->value; - else - val = szState; - - msi_dialog_set_property( dialog->package, control->property, val ); -} - -static void msi_dialog_checkbox_sync_state( msi_dialog *dialog, - msi_control *control ) -{ - UINT state; - - state = msi_dialog_get_checkbox_state( dialog, control ); - SendMessageW( control->hwnd, BM_SETCHECK, - state ? BST_CHECKED : BST_UNCHECKED, 0 ); -} - -static UINT msi_dialog_checkbox_handler( msi_dialog *dialog, - msi_control *control, WPARAM param ) -{ - UINT state; - - if( HIWORD(param) != BN_CLICKED ) - return ERROR_SUCCESS; - - TRACE("clicked checkbox %s, set %s\n", debugstr_w(control->name), - debugstr_w(control->property)); - - state = msi_dialog_get_checkbox_state( dialog, control ); - state = state ? 0 : 1; - msi_dialog_set_checkbox_state( dialog, control, state ); - msi_dialog_checkbox_sync_state( dialog, control ); - - return msi_dialog_button_handler( dialog, control, param ); -} - -static UINT msi_dialog_edit_handler( msi_dialog *dialog, - msi_control *control, WPARAM param ) -{ - LPWSTR buf; - - if( HIWORD(param) != EN_CHANGE ) - return ERROR_SUCCESS; - - TRACE("edit %s contents changed, set %s\n", debugstr_w(control->name), - debugstr_w(control->property)); - - buf = msi_get_window_text( control->hwnd ); - msi_dialog_set_property( dialog->package, control->property, buf ); - msi_free( buf ); - - return ERROR_SUCCESS; -} - -static UINT msi_dialog_radiogroup_handler( msi_dialog *dialog, - msi_control *control, WPARAM param ) -{ - if( HIWORD(param) != BN_CLICKED ) - return ERROR_SUCCESS; - - TRACE("clicked radio button %s, set %s\n", debugstr_w(control->name), - debugstr_w(control->property)); - - msi_dialog_set_property( dialog->package, control->property, control->name ); - - return msi_dialog_button_handler( dialog, control, param ); -} - static LRESULT msi_dialog_oncommand( msi_dialog *dialog, WPARAM param, HWND hwnd ) { msi_control *control = NULL; @@ -3752,31 +3666,6 @@ static LRESULT WINAPI MSIDialog_WndProc( HWND hwnd, UINT msg, return DefWindowProcW(hwnd, msg, wParam, lParam); } -static BOOL CALLBACK msi_radioground_child_enum( HWND hWnd, LPARAM lParam ) -{ - EnableWindow( hWnd, lParam ); - return TRUE; -} - -static LRESULT WINAPI MSIRadioGroup_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) -{ - WNDPROC oldproc = (WNDPROC) GetPropW(hWnd, szButtonData); - LRESULT r; - - TRACE("hWnd %p msg %04x wParam 0x%08lx lParam 0x%08lx\n", hWnd, msg, wParam, lParam); - - if (msg == WM_COMMAND) /* Forward notifications to dialog */ - SendMessageW(GetParent(hWnd), msg, wParam, lParam); - - r = CallWindowProcW(oldproc, hWnd, msg, wParam, lParam); - - /* make sure the radio buttons show as disabled if the parent is disabled */ - if (msg == WM_ENABLE) - EnumChildWindows( hWnd, msi_radioground_child_enum, wParam ); - - return r; -} - static LRESULT WINAPI MSIHiddenWindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { @@ -3897,8 +3786,16 @@ void msi_dialog_check_messages( HANDLE handle ) /* in threads other than the UI thread, block */ if( uiThreadId != GetCurrentThreadId() ) { - if( handle ) - WaitForSingleObject( handle, INFINITE ); + if (!handle) return; + while (MsgWaitForMultipleObjectsEx( 1, &handle, INFINITE, QS_ALLINPUT, 0 ) == WAIT_OBJECT_0 + 1) + { + MSG msg; + while (PeekMessageW( &msg, NULL, 0, 0, PM_REMOVE )) + { + TranslateMessage( &msg ); + DispatchMessageW( &msg ); + } + } return; } @@ -3959,7 +3856,7 @@ UINT msi_dialog_run_message_loop( msi_dialog *dialog ) return ERROR_SUCCESS; } -void msi_dialog_do_preview( msi_dialog *dialog ) +static void msi_dialog_do_preview( msi_dialog *dialog ) { TRACE("\n"); dialog->attributes |= msidbDialogAttributesVisible; @@ -4126,3 +4023,139 @@ done: return r; } + +static void MSI_ClosePreview( MSIOBJECTHDR *arg ) +{ + MSIPREVIEW *preview = (MSIPREVIEW *)arg; + msiobj_release( &preview->package->hdr ); +} + +static MSIPREVIEW *MSI_EnableUIPreview( MSIDATABASE *db ) +{ + MSIPREVIEW *preview = NULL; + MSIPACKAGE *package; + + package = MSI_CreatePackage( db, NULL ); + if (package) + { + preview = alloc_msiobject( MSIHANDLETYPE_PREVIEW, sizeof(MSIPREVIEW), MSI_ClosePreview ); + if (preview) + { + preview->package = package; + msiobj_addref( &package->hdr ); + } + msiobj_release( &package->hdr ); + } + return preview; +} + +UINT WINAPI MsiEnableUIPreview( MSIHANDLE hdb, MSIHANDLE *phPreview ) +{ + MSIDATABASE *db; + MSIPREVIEW *preview; + UINT r = ERROR_FUNCTION_FAILED; + + TRACE("%d %p\n", hdb, phPreview); + + db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE ); + if (!db) + { + IWineMsiRemoteDatabase *remote_database; + + remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( hdb ); + if (!remote_database) + return ERROR_INVALID_HANDLE; + + *phPreview = 0; + + IWineMsiRemoteDatabase_Release( remote_database ); + WARN("MsiEnableUIPreview not allowed during a custom action!\n"); + + return ERROR_FUNCTION_FAILED; + } + preview = MSI_EnableUIPreview( db ); + if (preview) + { + *phPreview = alloc_msihandle( &preview->hdr ); + msiobj_release( &preview->hdr ); + r = ERROR_SUCCESS; + if (!*phPreview) + r = ERROR_NOT_ENOUGH_MEMORY; + } + msiobj_release( &db->hdr ); + return r; +} + +static UINT preview_event_handler( MSIPACKAGE *package, LPCWSTR event, + LPCWSTR argument, msi_dialog *dialog ) +{ + MESSAGE("Preview dialog event '%s' (arg='%s')\n", debugstr_w(event), debugstr_w(argument)); + return ERROR_SUCCESS; +} + +static UINT MSI_PreviewDialogW( MSIPREVIEW *preview, LPCWSTR szDialogName ) +{ + msi_dialog *dialog = NULL; + UINT r = ERROR_SUCCESS; + + if (preview->dialog) + msi_dialog_destroy( preview->dialog ); + + /* an empty name means we should just destroy the current preview dialog */ + if (szDialogName) + { + dialog = msi_dialog_create( preview->package, szDialogName, NULL, preview_event_handler ); + if (dialog) + msi_dialog_do_preview( dialog ); + else + r = ERROR_FUNCTION_FAILED; + } + preview->dialog = dialog; + return r; +} + +UINT WINAPI MsiPreviewDialogW( MSIHANDLE hPreview, LPCWSTR szDialogName ) +{ + MSIPREVIEW *preview; + UINT r; + + TRACE("%d %s\n", hPreview, debugstr_w(szDialogName)); + + preview = msihandle2msiinfo( hPreview, MSIHANDLETYPE_PREVIEW ); + if (!preview) + return ERROR_INVALID_HANDLE; + + r = MSI_PreviewDialogW( preview, szDialogName ); + msiobj_release( &preview->hdr ); + return r; +} + +UINT WINAPI MsiPreviewDialogA( MSIHANDLE hPreview, LPCSTR szDialogName ) +{ + UINT r; + LPWSTR strW = NULL; + + TRACE("%d %s\n", hPreview, debugstr_a(szDialogName)); + + if (szDialogName) + { + strW = strdupAtoW( szDialogName ); + if (!strW) + return ERROR_OUTOFMEMORY; + } + r = MsiPreviewDialogW( hPreview, strW ); + msi_free( strW ); + return r; +} + +UINT WINAPI MsiPreviewBillboardW( MSIHANDLE hPreview, LPCWSTR szControlName, LPCWSTR szBillboard ) +{ + FIXME("%d %s %s\n", hPreview, debugstr_w(szControlName), debugstr_w(szBillboard)); + return ERROR_CALL_NOT_IMPLEMENTED; +} + +UINT WINAPI MsiPreviewBillboardA( MSIHANDLE hPreview, LPCSTR szControlName, LPCSTR szBillboard ) +{ + FIXME("%d %s %s\n", hPreview, debugstr_a(szControlName), debugstr_a(szBillboard)); + return ERROR_CALL_NOT_IMPLEMENTED; +} diff --git a/reactos/dll/win32/msi/distinct.c b/reactos/dll/win32/msi/distinct.c index 06beece8c77..04f09fa4913 100644 --- a/reactos/dll/win32/msi/distinct.c +++ b/reactos/dll/win32/msi/distinct.c @@ -204,9 +204,8 @@ static UINT DISTINCT_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT * return dv->table->ops->get_dimensions( dv->table, NULL, cols ); } -static UINT DISTINCT_get_column_info( struct tagMSIVIEW *view, - UINT n, LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name) +static UINT DISTINCT_get_column_info( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, + UINT *type, BOOL *temporary, LPCWSTR *table_name ) { MSIDISTINCTVIEW *dv = (MSIDISTINCTVIEW*)view; @@ -269,15 +268,6 @@ static UINT DISTINCT_find_matching_rows( struct tagMSIVIEW *view, UINT col, return r; } -static UINT DISTINCT_sort(struct tagMSIVIEW *view, column_info *columns) -{ - MSIDISTINCTVIEW *dv = (MSIDISTINCTVIEW *)view; - - TRACE("%p %p\n", view, columns); - - return dv->table->ops->sort( dv->table, columns ); -} - static const MSIVIEWOPS distinct_ops = { DISTINCT_fetch_int, @@ -297,7 +287,7 @@ static const MSIVIEWOPS distinct_ops = NULL, NULL, NULL, - DISTINCT_sort, + NULL, NULL, }; diff --git a/reactos/dll/win32/msi/events.c b/reactos/dll/win32/msi/events.c index b888c1cada9..d42ac5b4e99 100644 --- a/reactos/dll/win32/msi/events.c +++ b/reactos/dll/win32/msi/events.c @@ -35,8 +35,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); typedef UINT (*EVENTHANDLER)(MSIPACKAGE*,LPCWSTR,msi_dialog *); -struct _events { - LPCSTR event; +struct control_events +{ + const WCHAR *event; EVENTHANDLER handler; }; @@ -159,7 +160,7 @@ static UINT ControlEvent_SpawnWaitDialog(MSIPACKAGE* package, LPCWSTR argument, static UINT ControlEvent_DoAction(MSIPACKAGE* package, LPCWSTR argument, msi_dialog* dialog) { - ACTION_PerformAction(package, argument, -1); + ACTION_PerformAction(package, argument, SCRIPT_NONE); return ERROR_SUCCESS; } @@ -214,18 +215,19 @@ static UINT ControlEvent_AddSource( MSIPACKAGE *package, LPCWSTR argument, msi_d static UINT ControlEvent_SetTargetPath(MSIPACKAGE* package, LPCWSTR argument, msi_dialog* dialog) { + static const WCHAR szSelectionPath[] = {'S','e','l','e','c','t','i','o','n','P','a','t','h',0}; LPWSTR path = msi_dup_property( package->db, argument ); MSIRECORD *rec = MSI_CreateRecord( 1 ); - UINT r; - - static const WCHAR szSelectionPath[] = {'S','e','l','e','c','t','i','o','n','P','a','t','h',0}; + UINT r = ERROR_SUCCESS; MSI_RecordSetStringW( rec, 1, path ); ControlEvent_FireSubscribedEvent( package, szSelectionPath, rec ); - - /* failure to set the path halts the executing of control events */ - r = MSI_SetTargetPathW(package, argument, path); - msi_free(path); + if (path) + { + /* failure to set the path halts the executing of control events */ + r = MSI_SetTargetPathW(package, argument, path); + msi_free(path); + } msi_free(&rec->hdr); return r; } @@ -253,9 +255,19 @@ VOID ControlEvent_SubscribeToEvent( MSIPACKAGE *package, msi_dialog *dialog, { struct subscriber *sub; - sub = msi_alloc(sizeof (*sub)); - if( !sub ) - return; + TRACE("event %s control %s attribute %s\n", debugstr_w(event), debugstr_w(control), debugstr_w(attribute)); + + LIST_FOR_EACH_ENTRY( sub, &package->subscriptions, struct subscriber, entry ) + { + if (!strcmpiW( sub->event, event ) && + !strcmpiW( sub->control, control ) && + !strcmpiW( sub->attribute, attribute )) + { + TRACE("already subscribed\n"); + return; + }; + } + if (!(sub = msi_alloc( sizeof(*sub) ))) return; sub->dialog = dialog; sub->event = strdupW(event); sub->control = strdupW(control); @@ -263,17 +275,15 @@ VOID ControlEvent_SubscribeToEvent( MSIPACKAGE *package, msi_dialog *dialog, list_add_tail( &package->subscriptions, &sub->entry ); } -VOID ControlEvent_FireSubscribedEvent( MSIPACKAGE *package, LPCWSTR event, - MSIRECORD *rec ) +VOID ControlEvent_FireSubscribedEvent( MSIPACKAGE *package, LPCWSTR event, MSIRECORD *rec ) { struct subscriber *sub; - TRACE("Firing Event %s\n",debugstr_w(event)); + TRACE("Firing event %s\n", debugstr_w(event)); LIST_FOR_EACH_ENTRY( sub, &package->subscriptions, struct subscriber, entry ) { - if (strcmpiW( sub->event, event )) - continue; + if (strcmpiW( sub->event, event )) continue; msi_dialog_handle_event( sub->dialog, sub->control, sub->attribute, rec ); } } @@ -379,65 +389,61 @@ static UINT ControlEvent_Reinstall( MSIPACKAGE *package, LPCWSTR argument, static UINT ControlEvent_ValidateProductID(MSIPACKAGE *package, LPCWSTR argument, msi_dialog *dialog) { - LPWSTR key, template; - UINT ret = ERROR_SUCCESS; - - template = msi_dup_property( package->db, szPIDTemplate ); - key = msi_dup_property( package->db, szPIDKEY ); - - if (key && template) - { - FIXME( "partial stub: template %s key %s\n", debugstr_w(template), debugstr_w(key) ); - ret = msi_set_property( package->db, szProductID, key ); - } - msi_free( template ); - msi_free( key ); - return ret; + return msi_validate_product_id( package ); } -static const struct _events Events[] = { - { "EndDialog",ControlEvent_EndDialog }, - { "NewDialog",ControlEvent_NewDialog }, - { "SpawnDialog",ControlEvent_SpawnDialog }, - { "SpawnWaitDialog",ControlEvent_SpawnWaitDialog }, - { "DoAction",ControlEvent_DoAction }, - { "AddLocal",ControlEvent_AddLocal }, - { "Remove",ControlEvent_Remove }, - { "AddSource",ControlEvent_AddSource }, - { "SetTargetPath",ControlEvent_SetTargetPath }, - { "Reset",ControlEvent_Reset }, - { "SetInstallLevel",ControlEvent_SetInstallLevel }, - { "DirectoryListUp",ControlEvent_DirectoryListUp }, - { "SelectionBrowse",ControlEvent_SpawnDialog }, - { "ReinstallMode",ControlEvent_ReinstallMode }, - { "Reinstall",ControlEvent_Reinstall }, - { "ValidateProductID",ControlEvent_ValidateProductID }, - { NULL,NULL }, +static const WCHAR end_dialogW[] = {'E','n','d','D','i','a','l','o','g',0}; +static const WCHAR new_dialogW[] = {'N','e','w','D','i','a','l','o','g',0}; +static const WCHAR spawn_dialogW[] = {'S','p','a','w','n','D','i','a','l','o','g',0}; +static const WCHAR spawn_wait_dialogW[] = {'S','p','a','w','n','W','a','i','t','D','i','a','l','o','g',0}; +static const WCHAR do_actionW[] = {'D','o','A','c','t','i','o','n',0}; +static const WCHAR add_localW[] = {'A','d','d','L','o','c','a','l',0}; +static const WCHAR removeW[] = {'R','e','m','o','v','e',0}; +static const WCHAR add_sourceW[] = {'A','d','d','S','o','u','r','c','e',0}; +static const WCHAR set_target_pathW[] = {'S','e','t','T','a','r','g','e','t','P','a','t','h',0}; +static const WCHAR resetW[] = {'R','e','s','e','t',0}; +static const WCHAR set_install_levelW[] = {'S','e','t','I','n','s','t','a','l','l','L','e','v','e','l',0}; +static const WCHAR directory_list_upW[] = {'D','i','r','e','c','t','o','r','y','L','i','s','t','U','p',0}; +static const WCHAR selection_browseW[] = {'S','e','l','e','c','t','i','o','n','B','r','o','w','s','e',0}; +static const WCHAR reinstall_modeW[] = {'R','e','i','n','s','t','a','l','l','M','o','d','e',0}; +static const WCHAR reinstallW[] = {'R','e','i','n','s','t','a','l','l',0}; +static const WCHAR validate_product_idW[] = {'V','a','l','i','d','a','t','e','P','r','o','d','u','c','t','I','D',0}; + +static const struct control_events control_events[] = +{ + { end_dialogW, ControlEvent_EndDialog }, + { new_dialogW, ControlEvent_NewDialog }, + { spawn_dialogW, ControlEvent_SpawnDialog }, + { spawn_wait_dialogW, ControlEvent_SpawnWaitDialog }, + { do_actionW, ControlEvent_DoAction }, + { add_localW, ControlEvent_AddLocal }, + { removeW, ControlEvent_Remove }, + { add_sourceW, ControlEvent_AddSource }, + { set_target_pathW, ControlEvent_SetTargetPath }, + { resetW, ControlEvent_Reset }, + { set_install_levelW, ControlEvent_SetInstallLevel }, + { directory_list_upW, ControlEvent_DirectoryListUp }, + { selection_browseW, ControlEvent_SpawnDialog }, + { reinstall_modeW, ControlEvent_ReinstallMode }, + { reinstallW, ControlEvent_Reinstall }, + { validate_product_idW, ControlEvent_ValidateProductID }, + { NULL, NULL } }; -UINT ControlEvent_HandleControlEvent(MSIPACKAGE *package, LPCWSTR event, - LPCWSTR argument, msi_dialog* dialog) +UINT ControlEvent_HandleControlEvent( MSIPACKAGE *package, LPCWSTR event, + LPCWSTR argument, msi_dialog *dialog ) { - int i = 0; - UINT rc = ERROR_SUCCESS; + unsigned int i; - TRACE("Handling Control Event %s\n",debugstr_w(event)); - if (!event) - return rc; + TRACE("handling control event %s\n", debugstr_w(event)); - while( Events[i].event != NULL) + if (!event) return ERROR_SUCCESS; + + for (i = 0; control_events[i].event; i++) { - LPWSTR wevent = strdupAtoW(Events[i].event); - if (!strcmpW( wevent, event )) - { - msi_free(wevent); - rc = Events[i].handler(package,argument,dialog); - return rc; - } - msi_free(wevent); - i++; + if (!strcmpW( control_events[i].event, event )) + return control_events[i].handler( package, argument, dialog ); } - FIXME("unhandled control event %s arg(%s)\n", - debugstr_w(event), debugstr_w(argument)); - return rc; + FIXME("unhandled control event %s arg(%s)\n", debugstr_w(event), debugstr_w(argument)); + return ERROR_SUCCESS; } diff --git a/reactos/dll/win32/msi/files.c b/reactos/dll/win32/msi/files.c index 1f6187356e1..909f71f23c5 100644 --- a/reactos/dll/win32/msi/files.c +++ b/reactos/dll/win32/msi/files.c @@ -20,12 +20,12 @@ /* - * Actions dealing with files These are + * Actions dealing with files: * * InstallFiles * DuplicateFiles * MoveFiles - * PatchFiles (TODO) + * PatchFiles * RemoveDuplicateFiles * RemoveFiles */ @@ -47,6 +47,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); +static HMODULE hmspatcha; +static BOOL (WINAPI *ApplyPatchToFileW)(LPCWSTR, LPCWSTR, LPCWSTR, ULONG); + static void msi_file_update_ui( MSIPACKAGE *package, MSIFILE *f, const WCHAR *action ) { MSIRECORD *uirow; @@ -55,12 +58,12 @@ static void msi_file_update_ui( MSIPACKAGE *package, MSIFILE *f, const WCHAR *ac MSI_RecordSetStringW( uirow, 1, f->FileName ); MSI_RecordSetStringW( uirow, 9, f->Component->Directory ); MSI_RecordSetInteger( uirow, 6, f->FileSize ); - ui_actiondata( package, action, uirow ); + msi_ui_actiondata( package, action, uirow ); msiobj_release( &uirow->hdr ); - ui_progress( package, 2, f->FileSize, 0, 0 ); + msi_ui_progress( package, 2, f->FileSize, 0, 0 ); } -static msi_file_state calculate_install_state( MSIFILE *file ) +static msi_file_state calculate_install_state( MSIPACKAGE *package, MSIFILE *file ) { MSICOMPONENT *comp = file->Component; VS_FIXEDFILEINFO *file_version; @@ -68,8 +71,8 @@ static msi_file_state calculate_install_state( MSIFILE *file ) msi_file_state state; DWORD file_size; - if (comp->ActionRequest != INSTALLSTATE_LOCAL || !comp->Enabled || - (comp->assembly && comp->assembly->installed)) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL || (comp->assembly && comp->assembly->installed)) { TRACE("file %s is not scheduled for install\n", debugstr_w(file->File)); return msifs_skipped; @@ -100,7 +103,7 @@ static msi_file_state calculate_install_state( MSIFILE *file ) msi_free( file_version ); return state; } - else if ((font_version = font_version_from_file( file->TargetPath ))) + else if ((font_version = msi_font_version_from_file( file->TargetPath ))) { TRACE("new %s old %s\n", debugstr_w(file->Version), debugstr_w(font_version)); @@ -144,14 +147,12 @@ static void schedule_install_files(MSIPACKAGE *package) { MSICOMPONENT *comp = file->Component; - file->state = calculate_install_state( file ); + file->state = calculate_install_state( package, file ); if (file->state == msifs_overwrite && (comp->Attributes & msidbComponentAttributesNeverOverwrite)) { TRACE("not overwriting %s\n", debugstr_w(file->TargetPath)); file->state = msifs_skipped; } - comp->Action = INSTALLSTATE_LOCAL; - ui_progress( package, 2, file->FileSize, 0, 0 ); } } @@ -193,23 +194,25 @@ static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source) } if (gle == ERROR_SHARING_VIOLATION || gle == ERROR_USER_MAPPED_FILE) { - WCHAR tmpfileW[MAX_PATH], *pathW, *p; + WCHAR *tmpfileW, *pathW, *p; DWORD len; TRACE("file in use, scheduling rename operation\n"); - GetTempFileNameW(szBackSlash, szMsi, 0, tmpfileW); - len = strlenW(file->TargetPath) + strlenW(tmpfileW) + 1; - if (!(pathW = msi_alloc(len * sizeof(WCHAR)))) - return ERROR_OUTOFMEMORY; - - strcpyW(pathW, file->TargetPath); + if (!(pathW = strdupW( file->TargetPath ))) return ERROR_OUTOFMEMORY; if ((p = strrchrW(pathW, '\\'))) *p = 0; - strcatW(pathW, tmpfileW); + len = strlenW( pathW ) + 16; + if (!(tmpfileW = msi_alloc(len * sizeof(WCHAR)))) + { + msi_free( pathW ); + return ERROR_OUTOFMEMORY; + } + if (!GetTempFileNameW( pathW, szMsi, 0, tmpfileW )) tmpfileW[0] = 0; + msi_free( pathW ); - if (CopyFileW(source, pathW, FALSE) && + if (CopyFileW(source, tmpfileW, FALSE) && MoveFileExW(file->TargetPath, NULL, MOVEFILE_DELAY_UNTIL_REBOOT) && - MoveFileExW(pathW, file->TargetPath, MOVEFILE_DELAY_UNTIL_REBOOT)) + MoveFileExW(tmpfileW, file->TargetPath, MOVEFILE_DELAY_UNTIL_REBOOT)) { file->state = msifs_installed; package->need_reboot = 1; @@ -219,8 +222,9 @@ static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source) { gle = GetLastError(); WARN("failed to schedule rename operation: %d)\n", gle); + DeleteFileW( tmpfileW ); } - msi_free(pathW); + msi_free(tmpfileW); } return gle; @@ -229,18 +233,17 @@ static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source) static UINT msi_create_directory( MSIPACKAGE *package, const WCHAR *dir ) { MSIFOLDER *folder; - WCHAR *install_path; + const WCHAR *install_path; - install_path = resolve_target_folder( package, dir, FALSE, TRUE, &folder ); - if (!install_path) - return ERROR_FUNCTION_FAILED; + install_path = msi_get_target_folder( package, dir ); + if (!install_path) return ERROR_FUNCTION_FAILED; - if (folder->State == 0) + folder = msi_get_loaded_folder( package, dir ); + if (folder->State == FOLDER_STATE_UNINITIALIZED) { - create_full_pathW( install_path ); - folder->State = 2; + msi_create_full_path( install_path ); + folder->State = FOLDER_STATE_CREATED; } - msi_free( install_path ); return ERROR_SUCCESS; } @@ -252,17 +255,15 @@ static BOOL installfiles_cb(MSIPACKAGE *package, LPCWSTR file, DWORD action, if (action == MSICABEXTRACT_BEGINEXTRACT) { - f = get_loaded_file(package, file); + f = msi_get_loaded_file(package, file); if (!f) { TRACE("unknown file in cabinet (%s)\n", debugstr_w(file)); return FALSE; } - if (f->disk_id != disk_id || (f->state != msifs_missing && f->state != msifs_overwrite)) return FALSE; - msi_file_update_ui(package, f, szInstallFiles); if (!f->Component->assembly || f->Component->assembly->application) { msi_create_directory(package, f->Component->Directory); @@ -279,6 +280,27 @@ static BOOL installfiles_cb(MSIPACKAGE *package, LPCWSTR file, DWORD action, return TRUE; } +WCHAR *msi_resolve_file_source( MSIPACKAGE *package, MSIFILE *file ) +{ + WCHAR *p, *path; + + TRACE("Working to resolve source of file %s\n", debugstr_w(file->File)); + + if (file->IsCompressed) return NULL; + + p = msi_resolve_source_folder( package, file->Component->Directory, NULL ); + path = msi_build_directory_name( 2, p, file->ShortName ); + + if (file->LongName && GetFileAttributesW( path ) == INVALID_FILE_ATTRIBUTES) + { + msi_free( path ); + path = msi_build_directory_name( 2, p, file->LongName ); + } + msi_free( p ); + TRACE("file %s source resolves to %s\n", debugstr_w(file->File), debugstr_w(path)); + return path; +} + /* * ACTION_InstallFiles() * @@ -293,16 +315,14 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package) UINT rc = ERROR_SUCCESS; MSIFILE *file; - /* increment progress bar each time action data is sent */ - ui_progress(package,1,1,0,0); - schedule_install_files(package); - mi = msi_alloc_zero( sizeof(MSIMEDIAINFO) ); LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry ) { - rc = msi_load_media_info( package, file, mi ); + msi_file_update_ui( package, file, szInstallFiles ); + + rc = msi_load_media_info( package, file->Sequence, mi ); if (rc != ERROR_SUCCESS) { ERR("Unable to load media info for %s (%u)\n", debugstr_w(file->File), rc); @@ -310,7 +330,10 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package) } if (!file->Component->Enabled) continue; - if (file->state != msifs_hashmatch && (rc = ready_media( package, file, mi ))) + if (file->state != msifs_hashmatch && + file->state != msifs_skipped && + (file->state != msifs_present || !msi_get_property_int( package->db, szInstalled, 0 )) && + (rc = ready_media( package, file->IsCompressed, mi ))) { ERR("Failed to ready media for %s\n", debugstr_w(file->File)); goto done; @@ -340,11 +363,10 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package) if (!file->IsCompressed) { - LPWSTR source = resolve_file_source(package, file); + WCHAR *source = msi_resolve_file_source(package, file); TRACE("copying %s to %s\n", debugstr_w(source), debugstr_w(file->TargetPath)); - msi_file_update_ui(package, file, szInstallFiles); if (!file->Component->assembly || file->Component->assembly->application) { msi_create_directory(package, file->Component->Directory); @@ -360,19 +382,20 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package) } msi_free(source); } - else if (file->state != msifs_installed) + else if (file->state != msifs_installed && !(file->Attributes & msidbFileAttributesPatchAdded)) { ERR("compressed file wasn't installed (%s)\n", debugstr_w(file->TargetPath)); rc = ERROR_INSTALL_FAILURE; goto done; } } + msi_init_assembly_caches( package ); LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry ) { - if (comp->ActionRequest == INSTALLSTATE_LOCAL && comp->Enabled && - comp->assembly && !comp->assembly->installed) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action == INSTALLSTATE_LOCAL && comp->assembly && !comp->assembly->installed) { - rc = install_assembly( package, comp ); + rc = msi_install_assembly( package, comp ); if (rc != ERROR_SUCCESS) { ERR("Failed to install assembly\n"); @@ -381,12 +404,158 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package) } } } + msi_destroy_assembly_caches( package ); done: msi_free_media_info(mi); return rc; } +static BOOL load_mspatcha(void) +{ + hmspatcha = LoadLibraryA("mspatcha.dll"); + if (!hmspatcha) + { + ERR("Failed to load mspatcha.dll: %d\n", GetLastError()); + return FALSE; + } + + ApplyPatchToFileW = (void*)GetProcAddress(hmspatcha, "ApplyPatchToFileW"); + if(!ApplyPatchToFileW) + { + ERR("GetProcAddress(ApplyPatchToFileW) failed: %d.\n", GetLastError()); + return FALSE; + } + + return TRUE; +} + +static void unload_mspatch(void) +{ + FreeLibrary(hmspatcha); +} + +static BOOL patchfiles_cb(MSIPACKAGE *package, LPCWSTR file, DWORD action, + LPWSTR *path, DWORD *attrs, PVOID user) +{ + static MSIFILEPATCH *p = NULL; + static WCHAR patch_path[MAX_PATH] = {0}; + static WCHAR temp_folder[MAX_PATH] = {0}; + + if (action == MSICABEXTRACT_BEGINEXTRACT) + { + if (temp_folder[0] == '\0') + GetTempPathW(MAX_PATH, temp_folder); + + p = msi_get_loaded_filepatch(package, file); + if (!p) + { + TRACE("unknown file in cabinet (%s)\n", debugstr_w(file)); + return FALSE; + } + GetTempFileNameW(temp_folder, NULL, 0, patch_path); + + *path = strdupW(patch_path); + *attrs = p->File->Attributes; + } + else if (action == MSICABEXTRACT_FILEEXTRACTED) + { + WCHAR patched_file[MAX_PATH]; + BOOL br; + + GetTempFileNameW(temp_folder, NULL, 0, patched_file); + + br = ApplyPatchToFileW(patch_path, p->File->TargetPath, patched_file, 0); + if (br) + { + /* FIXME: baseline cache */ + + DeleteFileW( p->File->TargetPath ); + MoveFileW( patched_file, p->File->TargetPath ); + + p->IsApplied = TRUE; + } + else + ERR("Failed patch %s: %d.\n", debugstr_w(p->File->TargetPath), GetLastError()); + + DeleteFileW(patch_path); + p = NULL; + } + + return TRUE; +} + +UINT ACTION_PatchFiles( MSIPACKAGE *package ) +{ + MSIFILEPATCH *patch; + MSIMEDIAINFO *mi; + UINT rc = ERROR_SUCCESS; + BOOL mspatcha_loaded = FALSE; + + TRACE("%p\n", package); + + mi = msi_alloc_zero( sizeof(MSIMEDIAINFO) ); + + LIST_FOR_EACH_ENTRY( patch, &package->filepatches, MSIFILEPATCH, entry ) + { + MSIFILE *file = patch->File; + MSICOMPONENT *comp = file->Component; + + rc = msi_load_media_info( package, patch->Sequence, mi ); + if (rc != ERROR_SUCCESS) + { + ERR("Unable to load media info for %s (%u)\n", debugstr_w(file->File), rc); + return ERROR_FUNCTION_FAILED; + } + comp->Action = msi_get_component_action( package, comp ); + if (!comp->Enabled || comp->Action != INSTALLSTATE_LOCAL) continue; + + if (!patch->IsApplied) + { + MSICABDATA data; + + rc = ready_media( package, TRUE, mi ); + if (rc != ERROR_SUCCESS) + { + ERR("Failed to ready media for %s\n", debugstr_w(file->File)); + goto done; + } + + if (!mspatcha_loaded && !load_mspatcha()) + { + rc = ERROR_FUNCTION_FAILED; + goto done; + } + mspatcha_loaded = TRUE; + + data.mi = mi; + data.package = package; + data.cb = patchfiles_cb; + data.user = (PVOID)(UINT_PTR)mi->disk_id; + + if (!msi_cabextract(package, mi, &data)) + { + ERR("Failed to extract cabinet: %s\n", debugstr_w(mi->cabinet)); + rc = ERROR_INSTALL_FAILURE; + goto done; + } + } + + if (!patch->IsApplied && !(patch->Attributes & msidbPatchAttributesNonVital)) + { + ERR("Failed to apply patch to file: %s\n", debugstr_w(file->File)); + rc = ERROR_INSTALL_FAILURE; + goto done; + } + } + +done: + msi_free_media_info(mi); + if (mspatcha_loaded) + unload_mspatch(); + return rc; +} + #define is_dot_dir(x) ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0)))) typedef struct @@ -587,6 +756,12 @@ done: return res; } +void msi_reduce_to_long_filename( WCHAR *filename ) +{ + WCHAR *p = strchrW( filename, '|' ); + if (p) memmove( filename, p + 1, (strlenW( p + 1 ) + 1) * sizeof(WCHAR) ); +} + static UINT ITERATE_MoveFiles( MSIRECORD *rec, LPVOID param ) { MSIPACKAGE *package = param; @@ -599,24 +774,17 @@ static UINT ITERATE_MoveFiles( MSIRECORD *rec, LPVOID param ) BOOL ret, wildcards; component = MSI_RecordGetString(rec, 2); - comp = get_loaded_component(package, component); + comp = msi_get_loaded_component(package, component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_LOCAL && comp->ActionRequest != INSTALLSTATE_SOURCE) - { - TRACE("Component not scheduled for installation: %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = comp->ActionRequest; - sourcename = MSI_RecordGetString(rec, 3); options = MSI_RecordGetInteger(rec, 7); @@ -664,8 +832,7 @@ static UINT ITERATE_MoveFiles( MSIRECORD *rec, LPVOID param ) else { destname = strdupW(MSI_RecordGetString(rec, 4)); - if (destname) - reduce_to_longfilename(destname); + if (destname) msi_reduce_to_long_filename(destname); } size = 0; @@ -686,10 +853,9 @@ static UINT ITERATE_MoveFiles( MSIRECORD *rec, LPVOID param ) if (GetFileAttributesW(destdir) == INVALID_FILE_ATTRIBUTES) { - ret = CreateDirectoryW(destdir, NULL); - if (!ret) + if (!(ret = msi_create_full_path(destdir))) { - WARN("CreateDirectory failed: %d\n", GetLastError()); + WARN("failed to create directory %u\n", GetLastError()); goto done; } } @@ -704,7 +870,7 @@ done: MSI_RecordSetStringW( uirow, 1, MSI_RecordGetString(rec, 1) ); MSI_RecordSetInteger( uirow, 6, 1 ); /* FIXME */ MSI_RecordSetStringW( uirow, 9, destdir ); - ui_actiondata( package, szMoveFiles, uirow ); + msi_ui_actiondata( package, szMoveFiles, uirow ); msiobj_release( &uirow->hdr ); msi_free(sourcedir); @@ -718,20 +884,18 @@ done: UINT ACTION_MoveFiles( MSIPACKAGE *package ) { - UINT rc; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','M','o','v','e','F','i','l','e','`',0}; MSIQUERY *view; + UINT rc; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','M','o','v','e','F','i','l','e','`',0}; - - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, ITERATE_MoveFiles, package); msiobj_release(&view->hdr); - return rc; } @@ -751,7 +915,7 @@ static WCHAR *get_duplicate_filename( MSIPACKAGE *package, MSIRECORD *row, const MSI_RecordGetStringW( row, 4, NULL, &len ); if (!(dst_name = msi_alloc( ++len * sizeof(WCHAR) ))) return NULL; MSI_RecordGetStringW( row, 4, dst_name, &len ); - reduce_to_longfilename( dst_name ); + msi_reduce_to_long_filename( dst_name ); } if (MSI_RecordIsNull( row, 5 )) @@ -765,7 +929,7 @@ static WCHAR *get_duplicate_filename( MSIPACKAGE *package, MSIRECORD *row, const { const WCHAR *dst_key = MSI_RecordGetString( row, 5 ); - dst_path = resolve_target_folder( package, dst_key, FALSE, TRUE, NULL ); + dst_path = strdupW( msi_get_target_folder( package, dst_key ) ); if (!dst_path) { /* try a property */ @@ -779,8 +943,8 @@ static WCHAR *get_duplicate_filename( MSIPACKAGE *package, MSIRECORD *row, const } } - dst = build_directory_name( 2, dst_path, dst_name ); - create_full_pathW( dst_path ); + dst = msi_build_directory_name( 2, dst_path, dst_name ); + msi_create_full_path( dst_path ); msi_free( dst_name ); msi_free( dst_path ); @@ -797,24 +961,17 @@ static UINT ITERATE_DuplicateFiles(MSIRECORD *row, LPVOID param) MSIFILE *file; component = MSI_RecordGetString(row,2); - comp = get_loaded_component(package,component); + comp = msi_get_loaded_component(package, component); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_LOCAL) - { - TRACE("Component not scheduled for installation %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_LOCAL; - file_key = MSI_RecordGetString(row,3); if (!file_key) { @@ -822,7 +979,7 @@ static UINT ITERATE_DuplicateFiles(MSIRECORD *row, LPVOID param) return ERROR_FUNCTION_FAILED; } - file = get_loaded_file( package, file_key ); + file = msi_get_loaded_file( package, file_key ); if (!file) { ERR("Original file unknown %s\n", debugstr_w(file_key)); @@ -850,7 +1007,7 @@ static UINT ITERATE_DuplicateFiles(MSIRECORD *row, LPVOID param) MSI_RecordSetStringW( uirow, 1, MSI_RecordGetString( row, 1 ) ); MSI_RecordSetInteger( uirow, 6, file->FileSize ); MSI_RecordSetStringW( uirow, 9, MSI_RecordGetString( row, 5 ) ); - ui_actiondata( package, szDuplicateFiles, uirow ); + msi_ui_actiondata( package, szDuplicateFiles, uirow ); msiobj_release( &uirow->hdr ); msi_free(dest); @@ -859,19 +1016,18 @@ static UINT ITERATE_DuplicateFiles(MSIRECORD *row, LPVOID param) UINT ACTION_DuplicateFiles(MSIPACKAGE *package) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','D','u','p','l','i','c','a','t','e','F','i','l','e','`',0}; + MSIQUERY *view; UINT rc; - MSIQUERY * view; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','D','u','p','l','i','c','a','t','e','F','i','l','e','`',0}; - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, ITERATE_DuplicateFiles, package); msiobj_release(&view->hdr); - return rc; } @@ -885,24 +1041,17 @@ static UINT ITERATE_RemoveDuplicateFiles( MSIRECORD *row, LPVOID param ) MSIFILE *file; component = MSI_RecordGetString( row, 2 ); - comp = get_loaded_component( package, component ); + comp = msi_get_loaded_component( package, component ); if (!comp) return ERROR_SUCCESS; - if (!comp->Enabled) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("component is disabled\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(component)); return ERROR_SUCCESS; } - if (comp->ActionRequest != INSTALLSTATE_ABSENT) - { - TRACE("Component not scheduled for removal %s\n", debugstr_w(component)); - comp->Action = comp->Installed; - return ERROR_SUCCESS; - } - comp->Action = INSTALLSTATE_ABSENT; - file_key = MSI_RecordGetString( row, 3 ); if (!file_key) { @@ -910,7 +1059,7 @@ static UINT ITERATE_RemoveDuplicateFiles( MSIRECORD *row, LPVOID param ) return ERROR_FUNCTION_FAILED; } - file = get_loaded_file( package, file_key ); + file = msi_get_loaded_file( package, file_key ); if (!file) { ERR("Original file unknown %s\n", debugstr_w(file_key)); @@ -934,7 +1083,7 @@ static UINT ITERATE_RemoveDuplicateFiles( MSIRECORD *row, LPVOID param ) uirow = MSI_CreateRecord( 9 ); MSI_RecordSetStringW( uirow, 1, MSI_RecordGetString( row, 1 ) ); MSI_RecordSetStringW( uirow, 9, MSI_RecordGetString( row, 5 ) ); - ui_actiondata( package, szRemoveDuplicateFiles, uirow ); + msi_ui_actiondata( package, szRemoveDuplicateFiles, uirow ); msiobj_release( &uirow->hdr ); msi_free(dest); @@ -943,11 +1092,11 @@ static UINT ITERATE_RemoveDuplicateFiles( MSIRECORD *row, LPVOID param ) UINT ACTION_RemoveDuplicateFiles( MSIPACKAGE *package ) { - UINT rc; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','D','u','p','l','i','c','a','t','e','F','i','l','e','`',0}; MSIQUERY *view; - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','D','u','p','l','i','c','a','t','e','F','i','l','e','`',0}; + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, query, &view ); if (rc != ERROR_SUCCESS) @@ -955,21 +1104,18 @@ UINT ACTION_RemoveDuplicateFiles( MSIPACKAGE *package ) rc = MSI_IterateRecords( view, NULL, ITERATE_RemoveDuplicateFiles, package ); msiobj_release( &view->hdr ); - return rc; } static BOOL verify_comp_for_removal(MSICOMPONENT *comp, UINT install_mode) { - INSTALLSTATE request = comp->ActionRequest; - /* special case */ - if (request != INSTALLSTATE_SOURCE && + if (comp->Action != INSTALLSTATE_SOURCE && comp->Attributes & msidbComponentAttributesSourceOnly && (install_mode == msidbRemoveFileInstallModeOnRemove || install_mode == msidbRemoveFileInstallModeOnBoth)) return TRUE; - switch (request) + switch (comp->Action) { case INSTALLSTATE_LOCAL: case INSTALLSTATE_SOURCE: @@ -1000,20 +1146,20 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param) dirprop = MSI_RecordGetString(row, 4); install_mode = MSI_RecordGetInteger(row, 5); - comp = get_loaded_component(package, component); - if (!comp->Enabled) - { - TRACE("component is disabled\n"); + comp = msi_get_loaded_component(package, component); + if (!comp) return ERROR_SUCCESS; - } + comp->Action = msi_get_component_action( package, comp ); if (!verify_comp_for_removal(comp, install_mode)) { TRACE("Skipping removal due to install mode\n"); - comp->Action = comp->Installed; return ERROR_SUCCESS; } - + if (comp->assembly && !comp->assembly->application) + { + return ERROR_SUCCESS; + } if (comp->Attributes & msidbComponentAttributesPermanent) { TRACE("permanent component, not removing file\n"); @@ -1022,12 +1168,14 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param) dir = msi_dup_property(package->db, dirprop); if (!dir) - return ERROR_OUTOFMEMORY; - + { + WARN("directory property has no value\n"); + return ERROR_SUCCESS; + } size = 0; if ((filename = strdupW( MSI_RecordGetString(row, 3) ))) { - reduce_to_longfilename( filename ); + msi_reduce_to_long_filename( filename ); size = lstrlenW( filename ); } size += lstrlenW(dir) + 2; @@ -1057,7 +1205,7 @@ done: uirow = MSI_CreateRecord( 9 ); MSI_RecordSetStringW( uirow, 1, MSI_RecordGetString(row, 1) ); MSI_RecordSetStringW( uirow, 9, dir ); - ui_actiondata( package, szRemoveFiles, uirow ); + msi_ui_actiondata( package, szRemoveFiles, uirow ); msiobj_release( &uirow->hdr ); msi_free(filename); @@ -1066,70 +1214,55 @@ done: return ret; } -static BOOL has_persistent_dir( MSIPACKAGE *package, MSICOMPONENT *comp ) +static void remove_folder( MSIFOLDER *folder ) { - MSIQUERY *view; - UINT r = ERROR_FUNCTION_FAILED; + FolderList *fl; - static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','C','r','e','a','t','e','F','o','l','d','e','r','`',' ','W','H','E','R','E',' ', - '`','C','o','m','p','o','n','e','n','t','_','`',' ','=','\'','%','s','\'',' ','A','N','D',' ', - '`','D','i','r','e','c','t','o','r','y','_','`',' ','=','\'','%','s','\'',0}; - - if (!MSI_OpenQuery( package->db, &view, query, comp->Component, comp->Directory )) + LIST_FOR_EACH_ENTRY( fl, &folder->children, FolderList, entry ) { - if (!MSI_ViewExecute( view, NULL )) - { - MSIRECORD *rec; - if (!(r = MSI_ViewFetch( view, &rec ))) - { - TRACE("directory %s is persistent\n", debugstr_w(comp->Directory)); - msiobj_release( &rec->hdr ); - } - } - msiobj_release( &view->hdr ); + remove_folder( fl->folder ); + } + if (!folder->persistent && folder->State != FOLDER_STATE_REMOVED) + { + if (RemoveDirectoryW( folder->ResolvedTarget )) folder->State = FOLDER_STATE_REMOVED; } - return (r == ERROR_SUCCESS); } UINT ACTION_RemoveFiles( MSIPACKAGE *package ) { - MSIQUERY *view; - MSIFILE *file; - UINT r; - static const WCHAR query[] = { 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', '`','R','e','m','o','v','e','F','i','l','e','`',0}; + MSIQUERY *view; + MSICOMPONENT *comp; + MSIFILE *file; + UINT r; r = MSI_DatabaseOpenViewW(package->db, query, &view); if (r == ERROR_SUCCESS) { - MSI_IterateRecords(view, NULL, ITERATE_RemoveFiles, package); + r = MSI_IterateRecords(view, NULL, ITERATE_RemoveFiles, package); msiobj_release(&view->hdr); + if (r != ERROR_SUCCESS) + return r; } LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry ) { MSIRECORD *uirow; - LPWSTR dir, p; VS_FIXEDFILEINFO *ver; - if ( file->state == msifs_installed ) - ERR("removing installed file %s\n", debugstr_w(file->TargetPath)); + comp = file->Component; + msi_file_update_ui( package, file, szRemoveFiles ); - if ( file->Component->ActionRequest != INSTALLSTATE_ABSENT || - file->Component->Installed == INSTALLSTATE_SOURCE ) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT || comp->Installed == INSTALLSTATE_SOURCE) continue; - if (!file->Component->Enabled) - { - TRACE("component is disabled\n"); + if (comp->assembly && !comp->assembly->application) continue; - } - if (file->Component->Attributes & msidbComponentAttributesPermanent) + if (comp->Attributes & msidbComponentAttributesPermanent) { TRACE("permanent component, not removing file\n"); continue; @@ -1147,6 +1280,9 @@ UINT ACTION_RemoveFiles( MSIPACKAGE *package ) msi_free( ver ); } + if (file->state == msifs_installed) + WARN("removing installed file %s\n", debugstr_w(file->TargetPath)); + TRACE("removing %s\n", debugstr_w(file->File) ); SetFileAttributesW( file->TargetPath, FILE_ATTRIBUTE_NORMAL ); @@ -1154,24 +1290,30 @@ UINT ACTION_RemoveFiles( MSIPACKAGE *package ) { WARN("failed to delete %s (%u)\n", debugstr_w(file->TargetPath), GetLastError()); } - else if (!has_persistent_dir( package, file->Component )) - { - if ((dir = strdupW( file->TargetPath ))) - { - if ((p = strrchrW( dir, '\\' ))) *p = 0; - RemoveDirectoryW( dir ); - msi_free( dir ); - } - } file->state = msifs_missing; uirow = MSI_CreateRecord( 9 ); MSI_RecordSetStringW( uirow, 1, file->FileName ); - MSI_RecordSetStringW( uirow, 9, file->Component->Directory ); - ui_actiondata( package, szRemoveFiles, uirow ); + MSI_RecordSetStringW( uirow, 9, comp->Directory ); + msi_ui_actiondata( package, szRemoveFiles, uirow ); msiobj_release( &uirow->hdr ); - /* FIXME: call ui_progress here? */ } + LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry ) + { + MSIFOLDER *folder; + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) continue; + + if (comp->assembly && !comp->assembly->application) continue; + + if (comp->Attributes & msidbComponentAttributesPermanent) + { + TRACE("permanent component, not removing directory\n"); + continue; + } + folder = msi_get_loaded_folder( package, comp->Directory ); + remove_folder( folder ); + } return ERROR_SUCCESS; } diff --git a/reactos/dll/win32/msi/font.c b/reactos/dll/win32/msi/font.c index 7a493867c6a..0b728a35567 100644 --- a/reactos/dll/win32/msi/font.c +++ b/reactos/dll/win32/msi/font.c @@ -84,7 +84,7 @@ static const WCHAR regfont2[] = * Code based off of code located here * http://www.codeproject.com/gdi/fontnamefromfile.asp */ -WCHAR *load_ttf_name_id( const WCHAR *filename, DWORD id ) +static WCHAR *load_ttf_name_id( const WCHAR *filename, DWORD id ) { TT_TABLE_DIRECTORY tblDir; BOOL bFound = FALSE; @@ -111,7 +111,8 @@ WCHAR *load_ttf_name_id( const WCHAR *filename, DWORD id ) ttOffsetTable.uMajorVersion = SWAPWORD(ttOffsetTable.uMajorVersion); ttOffsetTable.uMinorVersion = SWAPWORD(ttOffsetTable.uMinorVersion); - if (ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0) + if ((ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0) && + (ttOffsetTable.uMajorVersion != 0x4f54 || ttOffsetTable.uMinorVersion != 0x544f)) goto end; for (i=0; i< ttOffsetTable.uNumOfTables; i++) @@ -136,33 +137,36 @@ WCHAR *load_ttf_name_id( const WCHAR *filename, DWORD id ) ttNTHeader.uNRCount = SWAPWORD(ttNTHeader.uNRCount); ttNTHeader.uStorageOffset = SWAPWORD(ttNTHeader.uStorageOffset); - bFound = FALSE; for(i=0; i 0) + if (dwRead % sizeof(WCHAR)) { - ret = strdupAtoW(buf); msi_free(buf); - break; + goto end; } + for (i = 0; i < dwRead / sizeof(WCHAR); i++) buf[i] = SWAPWORD(buf[i]); + ret = strdupW(buf); msi_free(buf); - SetFilePointer(handle,nPos, NULL, FILE_BEGIN); + break; } } @@ -179,6 +183,12 @@ static WCHAR *font_name_from_file( const WCHAR *filename ) if ((name = load_ttf_name_id( filename, NAME_ID_FULL_FONT_NAME ))) { + if (!name[0]) + { + WARN("empty font name\n"); + msi_free( name ); + return NULL; + } ret = msi_alloc( (strlenW( name ) + strlenW( truetypeW ) + 1 ) * sizeof(WCHAR) ); strcpyW( ret, name ); strcatW( ret, truetypeW ); @@ -187,15 +197,28 @@ static WCHAR *font_name_from_file( const WCHAR *filename ) return ret; } -WCHAR *font_version_from_file( const WCHAR *filename ) +WCHAR *msi_font_version_from_file( const WCHAR *filename ) { - WCHAR *version, *p, *ret = NULL; + static const WCHAR fmtW[] = {'%','u','.','%','u','.','0','.','0',0}; + WCHAR *version, *p, *q, *ret = NULL; - if ((p = version = load_ttf_name_id( filename, NAME_ID_VERSION ))) + if ((version = load_ttf_name_id( filename, NAME_ID_VERSION ))) { + int len, major = 0, minor = 0; + if ((p = strchrW( version, ';' ))) *p = 0; + p = version; while (*p && !isdigitW( *p )) p++; - ret = msi_alloc( (strlenW( p ) + 1) * sizeof(WCHAR) ); - strcpyW( ret, p ); + if ((q = strchrW( p, '.' ))) + { + major = atoiW( p ); + p = ++q; + while (*q && isdigitW( *q )) q++; + if (!*q || *q == ' ') minor = atoiW( p ); + else major = 0; + } + len = strlenW( fmtW ) + 20; + ret = msi_alloc( len * sizeof(WCHAR) ); + sprintfW( ret, fmtW, major, minor ); msi_free( version ); } return ret; @@ -207,27 +230,28 @@ static UINT ITERATE_RegisterFonts(MSIRECORD *row, LPVOID param) LPWSTR name; LPCWSTR filename; MSIFILE *file; + MSICOMPONENT *comp; HKEY hkey1, hkey2; MSIRECORD *uirow; LPWSTR uipath, p; filename = MSI_RecordGetString( row, 1 ); - file = get_loaded_file( package, filename ); + file = msi_get_loaded_file( package, filename ); if (!file) { - ERR("Unable to load file\n"); + WARN("unable to find file %s\n", debugstr_w(filename)); return ERROR_SUCCESS; } - - if (!file->Component->Enabled) + comp = msi_get_loaded_component( package, file->Component->Component ); + if (!comp) { - TRACE("component is disabled\n"); + WARN("unable to find component %s\n", debugstr_w(file->Component->Component)); return ERROR_SUCCESS; } - - if (file->Component->ActionRequest != INSTALLSTATE_LOCAL) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_LOCAL) { - TRACE("Component not scheduled for installation\n"); + TRACE("component not scheduled for installation %s\n", debugstr_w(comp->Component)); return ERROR_SUCCESS; } @@ -256,33 +280,28 @@ static UINT ITERATE_RegisterFonts(MSIRECORD *row, LPVOID param) if (p) p++; else p = uipath; MSI_RecordSetStringW( uirow, 1, p ); - ui_actiondata( package, szRegisterFonts, uirow); + msi_ui_actiondata( package, szRegisterFonts, uirow ); msiobj_release( &uirow->hdr ); msi_free( uipath ); - /* FIXME: call ui_progress? */ + /* FIXME: call msi_ui_progress? */ return ERROR_SUCCESS; } UINT ACTION_RegisterFonts(MSIPACKAGE *package) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','F','o','n','t','`',0}; + MSIQUERY *view; UINT rc; - MSIQUERY * view; - static const WCHAR ExecSeqQuery[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','F','o','n','t','`',0}; - rc = MSI_DatabaseOpenViewW(package->db, ExecSeqQuery, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) - { - TRACE("MSI_DatabaseOpenViewW failed: %d\n", rc); return ERROR_SUCCESS; - } - MSI_IterateRecords(view, NULL, ITERATE_RegisterFonts, package); + rc = MSI_IterateRecords(view, NULL, ITERATE_RegisterFonts, package); msiobj_release(&view->hdr); - - return ERROR_SUCCESS; + return rc; } static UINT ITERATE_UnregisterFonts( MSIRECORD *row, LPVOID param ) @@ -291,27 +310,28 @@ static UINT ITERATE_UnregisterFonts( MSIRECORD *row, LPVOID param ) LPWSTR name; LPCWSTR filename; MSIFILE *file; + MSICOMPONENT *comp; HKEY hkey1, hkey2; MSIRECORD *uirow; LPWSTR uipath, p; filename = MSI_RecordGetString( row, 1 ); - file = get_loaded_file( package, filename ); + file = msi_get_loaded_file( package, filename ); if (!file) { - ERR("Unable to load file\n"); + WARN("unable to find file %s\n", debugstr_w(filename)); return ERROR_SUCCESS; } - - if (!file->Component->Enabled) + comp = msi_get_loaded_component( package, file->Component->Component ); + if (!comp) { - TRACE("component is disabled\n"); + WARN("unable to find component %s\n", debugstr_w(file->Component->Component)); return ERROR_SUCCESS; } - - if (file->Component->ActionRequest != INSTALLSTATE_ABSENT) + comp->Action = msi_get_component_action( package, comp ); + if (comp->Action != INSTALLSTATE_ABSENT) { - TRACE("Component not scheduled for removal\n"); + TRACE("component not scheduled for removal %s\n", debugstr_w(comp->Component)); return ERROR_SUCCESS; } @@ -340,31 +360,26 @@ static UINT ITERATE_UnregisterFonts( MSIRECORD *row, LPVOID param ) if (p) p++; else p = uipath; MSI_RecordSetStringW( uirow, 1, p ); - ui_actiondata( package, szUnregisterFonts, uirow ); + msi_ui_actiondata( package, szUnregisterFonts, uirow ); msiobj_release( &uirow->hdr ); msi_free( uipath ); - /* FIXME: call ui_progress? */ + /* FIXME: call msi_ui_progress? */ return ERROR_SUCCESS; } UINT ACTION_UnregisterFonts( MSIPACKAGE *package ) { - UINT r; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','F','o','n','t','`',0}; MSIQUERY *view; - static const WCHAR query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','F','o','n','t','`',0}; + UINT r; r = MSI_DatabaseOpenViewW( package->db, query, &view ); if (r != ERROR_SUCCESS) - { - TRACE("MSI_DatabaseOpenViewW failed: %u\n", r); return ERROR_SUCCESS; - } - MSI_IterateRecords( view, NULL, ITERATE_UnregisterFonts, package ); + r = MSI_IterateRecords( view, NULL, ITERATE_UnregisterFonts, package ); msiobj_release( &view->hdr ); - - return ERROR_SUCCESS; + return r; } diff --git a/reactos/dll/win32/msi/format.c b/reactos/dll/win32/msi/format.c index b970dc1479f..8188f132497 100644 --- a/reactos/dll/win32/msi/format.c +++ b/reactos/dll/win32/msi/format.c @@ -189,14 +189,14 @@ static LPWSTR deformat_component(FORMAT *format, FORMSTR *str) key = msi_alloc((str->len + 1) * sizeof(WCHAR)); lstrcpynW(key, get_formstr_data(format, str), str->len + 1); - comp = get_loaded_component(format->package, key); + comp = msi_get_loaded_component(format->package, key); if (!comp) goto done; if (comp->Action == INSTALLSTATE_SOURCE) - ret = resolve_source_folder( format->package, comp->Directory, NULL ); + ret = msi_resolve_source_folder( format->package, comp->Directory, NULL ); else - ret = resolve_target_folder( format->package, comp->Directory, FALSE, TRUE, NULL ); + ret = strdupW( msi_get_target_folder( format->package, comp->Directory ) ); done: msi_free(key); @@ -212,7 +212,7 @@ static LPWSTR deformat_file(FORMAT *format, FORMSTR *str, BOOL shortname) key = msi_alloc((str->len + 1) * sizeof(WCHAR)); lstrcpynW(key, get_formstr_data(format, str), str->len + 1); - file = get_loaded_file(format->package, key); + file = msi_get_loaded_file(format->package, key); if (!file) goto done; @@ -1020,3 +1020,26 @@ done: msi_free(value); return r; } + +/* wrapper to resist a need for a full rewrite right now */ +DWORD deformat_string( MSIPACKAGE *package, const WCHAR *ptr, WCHAR **data ) +{ + if (ptr) + { + DWORD size = 0; + MSIRECORD *rec = MSI_CreateRecord( 1 ); + + MSI_RecordSetStringW( rec, 0, ptr ); + MSI_FormatRecordW( package, rec, NULL, &size ); + + size++; + *data = msi_alloc( size * sizeof(WCHAR) ); + if (size > 1) MSI_FormatRecordW( package, rec, *data, &size ); + else *data[0] = 0; + + msiobj_release( &rec->hdr ); + return size * sizeof(WCHAR); + } + *data = NULL; + return 0; +} diff --git a/reactos/dll/win32/msi/handle.c b/reactos/dll/win32/msi/handle.c index 8d43775464d..80c68739816 100644 --- a/reactos/dll/win32/msi/handle.c +++ b/reactos/dll/win32/msi/handle.c @@ -71,6 +71,8 @@ void msi_free_handle_table(void) msi_free( msihandletable ); msihandletable = NULL; msihandletable_size = 0; + DeleteCriticalSection(&MSI_handle_cs); + DeleteCriticalSection(&MSI_object_cs); } static MSIHANDLE alloc_handle_table_entry(void) diff --git a/reactos/dll/win32/msi/helpers.c b/reactos/dll/win32/msi/helpers.c deleted file mode 100644 index ffbe58b40e0..00000000000 --- a/reactos/dll/win32/msi/helpers.c +++ /dev/null @@ -1,824 +0,0 @@ -/* - * Implementation of the Microsoft Installer (msi.dll) - * - * Copyright 2005 Aric Stewart 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 - */ - -/* - * Here are helper functions formally in action.c that are used by a variety of - * actions and functions. - */ - -#include - -#include "windef.h" -#include "wine/debug.h" -#include "msipriv.h" -#include "winuser.h" -#include "wine/unicode.h" -#include "msidefs.h" - -WINE_DEFAULT_DEBUG_CHANNEL(msi); - -static const WCHAR cszTargetDir[] = {'T','A','R','G','E','T','D','I','R',0}; -static const WCHAR cszDatabase[]={'D','A','T','A','B','A','S','E',0}; - -LPWSTR build_icon_path(MSIPACKAGE *package, LPCWSTR icon_name ) -{ - LPWSTR SystemFolder, dest, FilePath; - - static const WCHAR szMicrosoft[] = - {'M','i','c','r','o','s','o','f','t','\\',0}; - static const WCHAR szInstaller[] = - {'I','n','s','t','a','l','l','e','r','\\',0}; - static const WCHAR szADFolder[] = - {'A','p','p','D','a','t','a','F','o','l','d','e','r',0}; - static const WCHAR szWFolder[] = - {'W','i','n','d','o','w','s','F','o','l','d','e','r',0}; - - if(package->Context == MSIINSTALLCONTEXT_MACHINE) - SystemFolder = msi_dup_property( package->db, szWFolder ); - else - { - LPWSTR ADTgt = msi_dup_property( package->db, szADFolder ); - SystemFolder = build_directory_name(2, ADTgt, szMicrosoft); - msi_free(ADTgt); - } - - dest = build_directory_name(3, SystemFolder, szInstaller, package->ProductCode); - - create_full_pathW(dest); - - FilePath = build_directory_name(2, dest, icon_name); - - msi_free(SystemFolder); - msi_free(dest); - return FilePath; -} - -LPWSTR msi_dup_record_field( MSIRECORD *rec, INT field ) -{ - DWORD sz = 0; - LPWSTR str; - UINT r; - - if (MSI_RecordIsNull( rec, field )) - return NULL; - - r = MSI_RecordGetStringW( rec, field, NULL, &sz ); - if (r != ERROR_SUCCESS) - return NULL; - - sz ++; - str = msi_alloc( sz * sizeof (WCHAR) ); - if (!str) - return str; - str[0] = 0; - r = MSI_RecordGetStringW( rec, field, str, &sz ); - if (r != ERROR_SUCCESS) - { - ERR("failed to get string!\n"); - msi_free( str ); - return NULL; - } - return str; -} - -MSICOMPONENT* get_loaded_component( MSIPACKAGE* package, LPCWSTR Component ) -{ - MSICOMPONENT *comp; - - LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry ) - { - if (!strcmpW( Component, comp->Component )) - return comp; - } - return NULL; -} - -MSIFEATURE* get_loaded_feature(MSIPACKAGE* package, LPCWSTR Feature ) -{ - MSIFEATURE *feature; - - LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry ) - { - if (!strcmpW( Feature, feature->Feature )) - return feature; - } - return NULL; -} - -MSIFILE* get_loaded_file( MSIPACKAGE* package, LPCWSTR key ) -{ - MSIFILE *file; - - LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry ) - { - if (!strcmpW( key, file->File )) - return file; - } - return NULL; -} - -int track_tempfile( MSIPACKAGE *package, LPCWSTR path ) -{ - MSITEMPFILE *temp; - - TRACE("%s\n", debugstr_w(path)); - - LIST_FOR_EACH_ENTRY( temp, &package->tempfiles, MSITEMPFILE, entry ) - if (!strcmpW( path, temp->Path )) - return 0; - - temp = msi_alloc_zero( sizeof (MSITEMPFILE) ); - if (!temp) - return -1; - - list_add_head( &package->tempfiles, &temp->entry ); - temp->Path = strdupW( path ); - - return 0; -} - -MSIFOLDER *get_loaded_folder( MSIPACKAGE *package, LPCWSTR dir ) -{ - MSIFOLDER *folder; - - LIST_FOR_EACH_ENTRY( folder, &package->folders, MSIFOLDER, entry ) - { - if (!strcmpW( dir, folder->Directory )) - return folder; - } - return NULL; -} - -static LPWSTR get_source_root( MSIPACKAGE *package ) -{ - LPWSTR path, p; - - path = msi_dup_property( package->db, cszSourceDir ); - if (path) - return path; - - path = msi_dup_property( package->db, cszDatabase ); - if (path) - { - p = strrchrW(path,'\\'); - if (p) - *(p+1) = 0; - } - return path; -} - -/* - * clean_spaces_from_path() - * - * removes spaces from the beginning and end of path segments - * removes multiple \\ characters - */ -static void clean_spaces_from_path( LPWSTR p ) -{ - LPWSTR q = p; - int n, len = 0; - - while (1) - { - /* copy until the end of the string or a space */ - while (*p != ' ' && (*q = *p)) - { - p++, len++; - /* reduce many backslashes to one */ - if (*p != '\\' || *q != '\\') - q++; - } - - /* quit at the end of the string */ - if (!*p) - break; - - /* count the number of spaces */ - n = 0; - while (p[n] == ' ') - n++; - - /* if it's leading or trailing space, skip it */ - if ( len == 0 || p[-1] == '\\' || p[n] == '\\' ) - p += n; - else /* copy n spaces */ - while (n && (*q++ = *p++)) n--; - } -} - -LPWSTR resolve_file_source(MSIPACKAGE *package, MSIFILE *file) -{ - LPWSTR p, path; - - TRACE("Working to resolve source of file %s\n", debugstr_w(file->File)); - - if (file->IsCompressed) - return NULL; - - p = resolve_source_folder( package, file->Component->Directory, NULL ); - path = build_directory_name(2, p, file->ShortName); - - if (file->LongName && - GetFileAttributesW(path) == INVALID_FILE_ATTRIBUTES) - { - msi_free(path); - path = build_directory_name(2, p, file->LongName); - } - - msi_free(p); - - TRACE("file %s source resolves to %s\n", debugstr_w(file->File), debugstr_w(path)); - return path; -} - -LPWSTR resolve_source_folder( MSIPACKAGE *package, LPCWSTR name, MSIFOLDER **folder ) -{ - MSIFOLDER *f; - LPWSTR p, path = NULL, parent; - - TRACE("working to resolve %s\n", debugstr_w(name)); - - if (!strcmpW( name, cszSourceDir )) - name = cszTargetDir; - - f = get_loaded_folder( package, name ); - if (!f) - return NULL; - - /* special resolving for Target and Source root dir */ - if (!strcmpW( name, cszTargetDir )) - { - if (!f->ResolvedSource) - f->ResolvedSource = get_source_root( package ); - } - - if (folder) - *folder = f; - - if (f->ResolvedSource) - { - path = strdupW( f->ResolvedSource ); - TRACE(" already resolved to %s\n", debugstr_w(path)); - return path; - } - - if (!f->Parent) - return path; - - parent = f->Parent; - TRACE(" ! parent is %s\n", debugstr_w(parent)); - - p = resolve_source_folder( package, parent, NULL ); - - if (package->WordCount & msidbSumInfoSourceTypeCompressed) - path = get_source_root( package ); - else if (package->WordCount & msidbSumInfoSourceTypeSFN) - path = build_directory_name( 3, p, f->SourceShortPath, NULL ); - else - path = build_directory_name( 3, p, f->SourceLongPath, NULL ); - - TRACE("-> %s\n", debugstr_w(path)); - f->ResolvedSource = strdupW( path ); - msi_free( p ); - - return path; -} - -LPWSTR resolve_target_folder( MSIPACKAGE *package, LPCWSTR name, BOOL set_prop, BOOL load_prop, - MSIFOLDER **folder ) -{ - MSIFOLDER *f; - LPWSTR p, path = NULL, parent; - - TRACE("working to resolve %s\n", debugstr_w(name)); - - f = get_loaded_folder( package, name ); - if (!f) - return NULL; - - /* special resolving for Target and Source root dir */ - if (!strcmpW( name, cszTargetDir )) - { - if (!f->ResolvedTarget && !f->Property) - { - LPWSTR check_path; - check_path = msi_dup_property( package->db, cszTargetDir ); - if (!check_path) - { - check_path = msi_dup_property( package->db, cszRootDrive ); - if (set_prop) - msi_set_property( package->db, cszTargetDir, check_path ); - } - - /* correct misbuilt target dir */ - path = build_directory_name(2, check_path, NULL); - clean_spaces_from_path( path ); - if (strcmpiW( path, check_path )) - msi_set_property( package->db, cszTargetDir, path ); - msi_free(check_path); - - f->ResolvedTarget = path; - } - } - - if (folder) - *folder = f; - - if (f->ResolvedTarget) - { - path = strdupW( f->ResolvedTarget ); - TRACE(" already resolved to %s\n", debugstr_w(path)); - return path; - } - - if (f->Property) - { - path = build_directory_name( 2, f->Property, NULL ); - TRACE(" internally set to %s\n", debugstr_w(path)); - if (set_prop) msi_set_property( package->db, name, path ); - return path; - } - - if (load_prop && (path = msi_dup_property( package->db, name ))) - { - f->ResolvedTarget = strdupW( path ); - TRACE(" property set to %s\n", debugstr_w(path)); - return path; - } - - if (!f->Parent) - return path; - - parent = f->Parent; - - TRACE(" ! parent is %s\n", debugstr_w(parent)); - - p = resolve_target_folder( package, parent, set_prop, load_prop, NULL ); - - TRACE(" TargetDefault = %s\n", debugstr_w(f->TargetDefault)); - path = build_directory_name( 3, p, f->TargetDefault, NULL ); - clean_spaces_from_path( path ); - f->ResolvedTarget = strdupW( path ); - - TRACE("-> %s\n", debugstr_w(path)); - if (set_prop) msi_set_property( package->db, name, path ); - msi_free( p ); - - return path; -} - -/* wrapper to resist a need for a full rewrite right now */ -DWORD deformat_string(MSIPACKAGE *package, LPCWSTR ptr, WCHAR** data ) -{ - if (ptr) - { - MSIRECORD *rec = MSI_CreateRecord(1); - DWORD size = 0; - - MSI_RecordSetStringW(rec,0,ptr); - MSI_FormatRecordW(package,rec,NULL,&size); - - size++; - *data = msi_alloc(size*sizeof(WCHAR)); - if (size > 1) - MSI_FormatRecordW(package,rec,*data,&size); - else - *data[0] = 0; - - msiobj_release( &rec->hdr ); - return sizeof(WCHAR)*size; - } - - *data = NULL; - return 0; -} - -UINT schedule_action(MSIPACKAGE *package, UINT script, LPCWSTR action) -{ - UINT count; - LPWSTR *newbuf = NULL; - if (script >= TOTAL_SCRIPTS) - { - FIXME("Unknown script requested %i\n",script); - return ERROR_FUNCTION_FAILED; - } - TRACE("Scheduling Action %s in script %i\n",debugstr_w(action), script); - - count = package->script->ActionCount[script]; - package->script->ActionCount[script]++; - if (count != 0) - newbuf = msi_realloc( package->script->Actions[script], - package->script->ActionCount[script]* sizeof(LPWSTR)); - else - newbuf = msi_alloc( sizeof(LPWSTR)); - - newbuf[count] = strdupW(action); - package->script->Actions[script] = newbuf; - - return ERROR_SUCCESS; -} - -void msi_free_action_script(MSIPACKAGE *package, UINT script) -{ - UINT i; - for (i = 0; i < package->script->ActionCount[script]; i++) - msi_free(package->script->Actions[script][i]); - - msi_free(package->script->Actions[script]); - package->script->Actions[script] = NULL; - package->script->ActionCount[script] = 0; -} - -/* - * build_directory_name() - * - * This function is to save messing round with directory names - * It handles adding backslashes between path segments, - * and can add \ at the end of the directory name if told to. - * - * It takes a variable number of arguments. - * It always allocates a new string for the result, so make sure - * to free the return value when finished with it. - * - * The first arg is the number of path segments that follow. - * The arguments following count are a list of path segments. - * A path segment may be NULL. - * - * Path segments will be added with a \ separating them. - * A \ will not be added after the last segment, however if the - * last segment is NULL, then the last character will be a \ - * - */ -LPWSTR build_directory_name(DWORD count, ...) -{ - DWORD sz = 1, i; - LPWSTR dir; - va_list va; - - va_start(va,count); - for(i=0; ihdr); - - msi_dialog_check_messages(NULL); -} - -void ui_actiondata(MSIPACKAGE *package, LPCWSTR action, MSIRECORD * record) -{ - static const WCHAR Query_t[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', - '`','A','c','t','i','o', 'n','T','e','x','t','`',' ', - 'W','H','E','R','E',' ', '`','A','c','t','i','o','n','`',' ','=', - ' ','\'','%','s','\'',0}; - WCHAR message[1024]; - MSIRECORD * row = 0; - DWORD size; - - if (!package->LastAction || strcmpW(package->LastAction, action)) - { - row = MSI_QueryGetRecord(package->db, Query_t, action); - if (!row) - return; - - if (MSI_RecordIsNull(row,3)) - { - msiobj_release(&row->hdr); - return; - } - - /* update the cached actionformat */ - msi_free(package->ActionFormat); - package->ActionFormat = msi_dup_record_field(row,3); - - msi_free(package->LastAction); - package->LastAction = strdupW(action); - - msiobj_release(&row->hdr); - } - - MSI_RecordSetStringW(record,0,package->ActionFormat); - size = 1024; - MSI_FormatRecordW(package,record,message,&size); - - row = MSI_CreateRecord(1); - MSI_RecordSetStringW(row,1,message); - - MSI_ProcessMessage(package, INSTALLMESSAGE_ACTIONDATA, row); - - msiobj_release(&row->hdr); -} - -void reduce_to_longfilename(WCHAR* filename) -{ - LPWSTR p = strchrW(filename,'|'); - if (p) - memmove(filename, p+1, (strlenW(p+1)+1)*sizeof(WCHAR)); -} - -LPWSTR create_component_advertise_string(MSIPACKAGE* package, - MSICOMPONENT* component, LPCWSTR feature) -{ - static const WCHAR fmt[] = {'%','s','%','s','%','c','%','s',0}; - WCHAR productid_85[21], component_85[21]; - LPWSTR output = NULL; - DWORD sz = 0; - GUID clsid; - - /* > is used if there is a component GUID and < if not. */ - - productid_85[0] = 0; - component_85[0] = 0; - - CLSIDFromString(package->ProductCode, &clsid); - encode_base85_guid(&clsid, productid_85); - - if (component) - { - CLSIDFromString(component->ComponentId, &clsid); - encode_base85_guid(&clsid, component_85); - } - - TRACE("prod=%s feat=%s comp=%s\n", debugstr_w(productid_85), - debugstr_w(feature), debugstr_w(component_85)); - - sz = 20 + lstrlenW(feature) + 20 + 3; - - output = msi_alloc_zero(sz*sizeof(WCHAR)); - - sprintfW(output, fmt, productid_85, feature, - component?'>':'<', component_85); - - return output; -} - -/* update component state based on a feature change */ -void ACTION_UpdateComponentStates( MSIPACKAGE *package, MSIFEATURE *feature ) -{ - INSTALLSTATE newstate; - ComponentList *cl; - - newstate = feature->ActionRequest; - - if (newstate == INSTALLSTATE_ABSENT) - newstate = INSTALLSTATE_UNKNOWN; - - LIST_FOR_EACH_ENTRY( cl, &feature->Components, ComponentList, entry ) - { - MSICOMPONENT* component = cl->component; - - if (!component->Enabled) continue; - - TRACE("MODIFYING(%i): Component %s (Installed %i, Action %i, Request %i)\n", - newstate, debugstr_w(component->Component), component->Installed, - component->Action, component->ActionRequest); - - if (newstate == INSTALLSTATE_LOCAL) - { - component->Action = INSTALLSTATE_LOCAL; - component->ActionRequest = INSTALLSTATE_LOCAL; - } - else - { - ComponentList *clist; - MSIFEATURE *f; - - component->hasLocalFeature = FALSE; - - component->Action = newstate; - component->ActionRequest = newstate; - - /* if any other feature wants it local we need to set it local */ - LIST_FOR_EACH_ENTRY( f, &package->features, MSIFEATURE, entry ) - { - if ( f->ActionRequest != INSTALLSTATE_LOCAL && - f->ActionRequest != INSTALLSTATE_SOURCE ) - { - continue; - } - - LIST_FOR_EACH_ENTRY( clist, &f->Components, ComponentList, entry ) - { - if ( clist->component == component && - (f->ActionRequest == INSTALLSTATE_LOCAL || - f->ActionRequest == INSTALLSTATE_SOURCE) ) - { - TRACE("Saved by %s\n", debugstr_w(f->Feature)); - component->hasLocalFeature = TRUE; - - if (component->Attributes & msidbComponentAttributesOptional) - { - if (f->Attributes & msidbFeatureAttributesFavorSource) - { - component->Action = INSTALLSTATE_SOURCE; - component->ActionRequest = INSTALLSTATE_SOURCE; - } - else - { - component->Action = INSTALLSTATE_LOCAL; - component->ActionRequest = INSTALLSTATE_LOCAL; - } - } - else if (component->Attributes & msidbComponentAttributesSourceOnly) - { - component->Action = INSTALLSTATE_SOURCE; - component->ActionRequest = INSTALLSTATE_SOURCE; - } - else - { - component->Action = INSTALLSTATE_LOCAL; - component->ActionRequest = INSTALLSTATE_LOCAL; - } - } - } - } - } - TRACE("Result (%i): Component %s (Installed %i, Action %i, Request %i)\n", - newstate, debugstr_w(component->Component), component->Installed, - component->Action, component->ActionRequest); - } -} - -UINT register_unique_action(MSIPACKAGE *package, LPCWSTR action) -{ - UINT count; - LPWSTR *newbuf = NULL; - - if (!package->script) - return FALSE; - - TRACE("Registering %s as unique action\n", debugstr_w(action)); - - count = package->script->UniqueActionsCount; - package->script->UniqueActionsCount++; - if (count != 0) - newbuf = msi_realloc( package->script->UniqueActions, - package->script->UniqueActionsCount* sizeof(LPWSTR)); - else - newbuf = msi_alloc( sizeof(LPWSTR)); - - newbuf[count] = strdupW(action); - package->script->UniqueActions = newbuf; - - return ERROR_SUCCESS; -} - -BOOL check_unique_action(const MSIPACKAGE *package, LPCWSTR action) -{ - UINT i; - - if (!package->script) - return FALSE; - - for (i = 0; i < package->script->UniqueActionsCount; i++) - if (!strcmpW(package->script->UniqueActions[i], action)) - return TRUE; - - return FALSE; -} - -WCHAR* generate_error_string(MSIPACKAGE *package, UINT error, DWORD count, ... ) -{ - static const WCHAR query[] = {'S','E','L','E','C','T',' ','`','M','e','s','s','a','g','e','`',' ','F','R','O','M',' ','`','E','r','r','o','r','`',' ','W','H','E','R','E',' ','`','E','r','r','o','r','`',' ','=',' ','%','i',0}; - - MSIRECORD *rec; - MSIRECORD *row; - DWORD size = 0; - DWORD i; - va_list va; - LPCWSTR str; - LPWSTR data; - - row = MSI_QueryGetRecord(package->db, query, error); - if (!row) - return 0; - - rec = MSI_CreateRecord(count+2); - - str = MSI_RecordGetString(row,1); - MSI_RecordSetStringW(rec,0,str); - msiobj_release( &row->hdr ); - MSI_RecordSetInteger(rec,1,error); - - va_start(va,count); - for (i = 0; i < count; i++) - { - str = va_arg(va,LPCWSTR); - MSI_RecordSetStringW(rec,(i+2),str); - } - va_end(va); - - MSI_FormatRecordW(package,rec,NULL,&size); - - size++; - data = msi_alloc(size*sizeof(WCHAR)); - if (size > 1) - MSI_FormatRecordW(package,rec,data,&size); - else - data[0] = 0; - msiobj_release( &rec->hdr ); - return data; -} diff --git a/reactos/dll/win32/msi/insert.c b/reactos/dll/win32/msi/insert.c index 03e1bd99795..c404929f285 100644 --- a/reactos/dll/win32/msi/insert.c +++ b/reactos/dll/win32/msi/insert.c @@ -109,23 +109,16 @@ err: */ static BOOL msi_columns_in_order(MSIINSERTVIEW *iv, UINT col_count) { - LPWSTR a, b = NULL; + LPCWSTR a, b; UINT i; - int res; for (i = 1; i <= col_count; i++) { iv->sv->ops->get_column_info(iv->sv, i, &a, NULL, NULL, NULL); iv->table->ops->get_column_info(iv->table, i, &b, NULL, NULL, NULL); - res = strcmpW( a, b ); - msi_free(a); - msi_free(b); - - if (res != 0) - return FALSE; + if (strcmpW( a, b )) return FALSE; } - return TRUE; } @@ -137,8 +130,7 @@ static UINT msi_arrange_record(MSIINSERTVIEW *iv, MSIRECORD **values) MSIRECORD *padded; UINT col_count, val_count; UINT r, i, colidx; - LPWSTR a, b = NULL; - int res; + LPCWSTR a, b; r = iv->table->ops->get_dimensions(iv->table, NULL, &col_count); if (r != ERROR_SUCCESS) @@ -169,22 +161,15 @@ static UINT msi_arrange_record(MSIINSERTVIEW *iv, MSIRECORD **values) if (r != ERROR_SUCCESS) goto err; - res = strcmpW( a, b ); - msi_free(b); - - if (res == 0) + if (!strcmpW( a, b )) { MSI_RecordCopyField(*values, colidx, padded, i); break; } } - - msi_free(a); } - msiobj_release(&(*values)->hdr); *values = padded; - return ERROR_SUCCESS; err: @@ -293,9 +278,8 @@ static UINT INSERT_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *co return sv->ops->get_dimensions( sv, rows, cols ); } -static UINT INSERT_get_column_info( struct tagMSIVIEW *view, - UINT n, LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name) +static UINT INSERT_get_column_info( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, + UINT *type, BOOL *temporary, LPCWSTR *table_name ) { MSIINSERTVIEW *iv = (MSIINSERTVIEW*)view; MSIVIEW *sv; diff --git a/reactos/dll/win32/msi/install.c b/reactos/dll/win32/msi/install.c index 30a63e6d8bb..83b8b7d1738 100644 --- a/reactos/dll/win32/msi/install.c +++ b/reactos/dll/win32/msi/install.c @@ -105,7 +105,7 @@ UINT WINAPI MsiDoActionW( MSIHANDLE hInstall, LPCWSTR szAction ) return ERROR_SUCCESS; } - ret = ACTION_PerformUIAction( package, szAction, -1 ); + ret = ACTION_PerformUIAction( package, szAction, SCRIPT_NONE ); msiobj_release( &package->hdr ); return ret; @@ -119,7 +119,7 @@ UINT WINAPI MsiSequenceA( MSIHANDLE hInstall, LPCSTR szTable, INT iSequenceMode LPWSTR szwTable; UINT ret; - TRACE("%s\n", debugstr_a(szTable)); + TRACE("%s, %d\n", debugstr_a(szTable), iSequenceMode); szwTable = strdupAtoW(szTable); if (szTable && !szwTable) @@ -138,7 +138,7 @@ UINT WINAPI MsiSequenceW( MSIHANDLE hInstall, LPCWSTR szTable, INT iSequenceMode MSIPACKAGE *package; UINT ret; - TRACE("%s\n", debugstr_w(szTable)); + TRACE("%s, %d\n", debugstr_w(szTable), iSequenceMode); package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE ); if (!package) @@ -173,10 +173,8 @@ UINT WINAPI MsiSequenceW( MSIHANDLE hInstall, LPCWSTR szTable, INT iSequenceMode return ERROR_SUCCESS; } - - ret = MSI_Sequence( package, szTable, iSequenceMode ); + ret = MSI_Sequence( package, szTable ); msiobj_release( &package->hdr ); - return ret; } @@ -212,6 +210,23 @@ UINT msi_strcpy_to_awstring( LPCWSTR str, awstring *awbuf, DWORD *sz ) return r; } +const WCHAR *msi_get_target_folder( MSIPACKAGE *package, const WCHAR *name ) +{ + MSIFOLDER *folder = msi_get_loaded_folder( package, name ); + + if (!folder) return NULL; + if (!folder->ResolvedTarget) + { + MSIFOLDER *parent = folder; + while (parent->Parent && strcmpW( parent->Parent, parent->Directory )) + { + parent = msi_get_loaded_folder( package, parent->Parent ); + } + msi_resolve_target_folder( package, parent->Directory, TRUE ); + } + return folder->ResolvedTarget; +} + /*********************************************************************** * MsiGetTargetPath (internal) */ @@ -219,7 +234,7 @@ static UINT MSI_GetTargetPath( MSIHANDLE hInstall, LPCWSTR szFolder, awstring *szPathBuf, LPDWORD pcchPathBuf ) { MSIPACKAGE *package; - LPWSTR path; + const WCHAR *path; UINT r = ERROR_FUNCTION_FAILED; if (!szFolder) @@ -246,8 +261,7 @@ static UINT MSI_GetTargetPath( MSIHANDLE hInstall, LPCWSTR szFolder, } len = 0; - hr = IWineMsiRemotePackage_GetTargetPath( remote_package, folder, - NULL, &len ); + hr = IWineMsiRemotePackage_GetTargetPath( remote_package, folder, NULL, &len ); if (FAILED(hr)) goto done; @@ -259,8 +273,7 @@ static UINT MSI_GetTargetPath( MSIHANDLE hInstall, LPCWSTR szFolder, goto done; } - hr = IWineMsiRemotePackage_GetTargetPath( remote_package, folder, - (BSTR *)value, &len); + hr = IWineMsiRemotePackage_GetTargetPath( remote_package, folder, value, &len ); if (FAILED(hr)) goto done; @@ -282,14 +295,13 @@ done: return r; } - path = resolve_target_folder( package, szFolder, FALSE, TRUE, NULL ); + path = msi_get_target_folder( package, szFolder ); msiobj_release( &package->hdr ); if (!path) return ERROR_DIRECTORY; r = msi_strcpy_to_awstring( path, szPathBuf, pcchPathBuf ); - msi_free( path ); return r; } @@ -335,6 +347,54 @@ UINT WINAPI MsiGetTargetPathW( MSIHANDLE hInstall, LPCWSTR szFolder, return MSI_GetTargetPath( hInstall, szFolder, &path, pcchPathBuf ); } +static WCHAR *get_source_root( MSIPACKAGE *package ) +{ + msi_set_sourcedir_props( package, FALSE ); + return msi_dup_property( package->db, szSourceDir ); +} + +WCHAR *msi_resolve_source_folder( MSIPACKAGE *package, const WCHAR *name, MSIFOLDER **folder ) +{ + MSIFOLDER *f; + LPWSTR p, path = NULL, parent; + + TRACE("working to resolve %s\n", debugstr_w(name)); + + if (!strcmpW( name, szSourceDir )) name = szTargetDir; + if (!(f = msi_get_loaded_folder( package, name ))) return NULL; + + /* special resolving for root dir */ + if (!strcmpW( name, szTargetDir ) && !f->ResolvedSource) + { + f->ResolvedSource = get_source_root( package ); + } + if (folder) *folder = f; + if (f->ResolvedSource) + { + path = strdupW( f->ResolvedSource ); + TRACE(" already resolved to %s\n", debugstr_w(path)); + return path; + } + if (!f->Parent) return path; + parent = f->Parent; + TRACE(" ! parent is %s\n", debugstr_w(parent)); + + p = msi_resolve_source_folder( package, parent, NULL ); + + if (package->WordCount & msidbSumInfoSourceTypeCompressed) + path = get_source_root( package ); + else if (package->WordCount & msidbSumInfoSourceTypeSFN) + path = msi_build_directory_name( 3, p, f->SourceShortPath, NULL ); + else + path = msi_build_directory_name( 3, p, f->SourceLongPath, NULL ); + + TRACE("-> %s\n", debugstr_w(path)); + f->ResolvedSource = strdupW( path ); + msi_free( p ); + + return path; +} + /*********************************************************************** * MSI_GetSourcePath (internal) */ @@ -371,8 +431,7 @@ static UINT MSI_GetSourcePath( MSIHANDLE hInstall, LPCWSTR szFolder, } len = 0; - hr = IWineMsiRemotePackage_GetSourcePath( remote_package, folder, - NULL, &len ); + hr = IWineMsiRemotePackage_GetSourcePath( remote_package, folder, NULL, &len ); if (FAILED(hr)) goto done; @@ -384,8 +443,7 @@ static UINT MSI_GetSourcePath( MSIHANDLE hInstall, LPCWSTR szFolder, goto done; } - hr = IWineMsiRemotePackage_GetSourcePath( remote_package, folder, - (BSTR *)value, &len); + hr = IWineMsiRemotePackage_GetSourcePath( remote_package, folder, value, &len ); if (FAILED(hr)) goto done; @@ -413,7 +471,7 @@ done: return ERROR_INVALID_PARAMETER; } - path = resolve_source_folder( package, szFolder, NULL ); + path = msi_resolve_source_folder( package, szFolder, NULL ); msiobj_release( &package->hdr ); TRACE("path = %s\n", debugstr_w(path)); @@ -435,7 +493,7 @@ UINT WINAPI MsiGetSourcePathA( MSIHANDLE hInstall, LPCSTR szFolder, awstring str; UINT r; - TRACE("%s %p %p\n", szFolder, debugstr_a(szPathBuf), pcchPathBuf); + TRACE("%s %p %p\n", debugstr_a(szFolder), szPathBuf, pcchPathBuf); str.unicode = FALSE; str.str.a = szPathBuf; @@ -489,80 +547,58 @@ end: return rc; } -/* - * Ok my original interpretation of this was wrong. And it looks like msdn has - * changed a bit also. The given folder path does not have to actually already - * exist, it just cannot be read only and must be a legal folder path. - */ -UINT MSI_SetTargetPathW(MSIPACKAGE *package, LPCWSTR szFolder, - LPCWSTR szFolderPath) +static void set_target_path( MSIPACKAGE *package, MSIFOLDER *folder, const WCHAR *path ) +{ + FolderList *fl; + MSIFOLDER *child; + WCHAR *target_path; + + if (!(target_path = msi_normalize_path( path ))) return; + if (strcmpW( target_path, folder->ResolvedTarget )) + { + msi_free( folder->ResolvedTarget ); + folder->ResolvedTarget = target_path; + msi_set_property( package->db, folder->Directory, folder->ResolvedTarget ); + + LIST_FOR_EACH_ENTRY( fl, &folder->children, FolderList, entry ) + { + child = fl->folder; + msi_resolve_target_folder( package, child->Directory, FALSE ); + } + } + else msi_free( target_path ); +} + +UINT MSI_SetTargetPathW( MSIPACKAGE *package, LPCWSTR szFolder, LPCWSTR szFolderPath ) { DWORD attrib; - LPWSTR path = NULL; - LPWSTR path2 = NULL; MSIFOLDER *folder; MSIFILE *file; - TRACE("%p %s %s\n",package, debugstr_w(szFolder),debugstr_w(szFolderPath)); + TRACE("%p %s %s\n", package, debugstr_w(szFolder), debugstr_w(szFolderPath)); attrib = GetFileAttributesW(szFolderPath); /* native MSI tests writeability by making temporary files at each drive */ - if ( attrib != INVALID_FILE_ATTRIBUTES && - (attrib & FILE_ATTRIBUTE_OFFLINE || - attrib & FILE_ATTRIBUTE_READONLY)) + if (attrib != INVALID_FILE_ATTRIBUTES && + (attrib & FILE_ATTRIBUTE_OFFLINE || attrib & FILE_ATTRIBUTE_READONLY)) + { return ERROR_FUNCTION_FAILED; - - path = resolve_target_folder( package, szFolder, FALSE, FALSE, &folder ); - if (!path) - return ERROR_DIRECTORY; - - msi_free(folder->Property); - folder->Property = build_directory_name(2, szFolderPath, NULL); - - if (!strcmpiW( path, folder->Property )) - { - /* - * Resolved Target has not really changed, so just - * set this folder and do not recalculate everything. - */ - msi_free(folder->ResolvedTarget); - folder->ResolvedTarget = NULL; - path2 = resolve_target_folder( package, szFolder, TRUE, FALSE, NULL ); - msi_free(path2); } - else + if (!(folder = msi_get_loaded_folder( package, szFolder ))) return ERROR_DIRECTORY; + + set_target_path( package, folder, szFolderPath ); + + LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry ) { - MSIFOLDER *f; + const WCHAR *dir; + MSICOMPONENT *comp = file->Component; - LIST_FOR_EACH_ENTRY( f, &package->folders, MSIFOLDER, entry ) - { - msi_free(f->ResolvedTarget); - f->ResolvedTarget=NULL; - } + if (!comp->Enabled || (comp->assembly && !comp->assembly->application)) continue; - LIST_FOR_EACH_ENTRY( f, &package->folders, MSIFOLDER, entry ) - { - path2 = resolve_target_folder( package, f->Directory, TRUE, FALSE, NULL ); - msi_free(path2); - } - - LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry ) - { - MSICOMPONENT *comp = file->Component; - LPWSTR dir; - - if (!comp->Enabled || (comp->assembly && !comp->assembly->application)) - continue; - - dir = resolve_target_folder( package, comp->Directory, FALSE, FALSE, NULL ); - msi_free(file->TargetPath); - - file->TargetPath = build_directory_name(2, dir, file->FileName); - msi_free(dir); - } + dir = msi_get_target_folder( package, comp->Directory ); + msi_free( file->TargetPath ); + file->TargetPath = msi_build_directory_name( 2, dir, file->FileName ); } - msi_free(path); - return ERROR_SUCCESS; } @@ -685,6 +721,14 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode) switch (iRunMode) { + case MSIRUNMODE_ADMIN: + FIXME("no support for administrative installs\n"); + break; + + case MSIRUNMODE_ADVERTISE: + FIXME("no support for advertised installs\n"); + break; + case MSIRUNMODE_WINDOWS9X: if (GetVersion() & 0x80000000) r = TRUE; @@ -712,6 +756,10 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode) r = msi_get_property_int( package->db, szInstalled, 0 ) != 0; break; + case MSIRUNMODE_ROLLBACKENABLED: + r = msi_get_property_int( package->db, szRollbackDisabled, 0 ) == 0; + break; + case MSIRUNMODE_REBOOTATEND: r = package->need_reboot; break; @@ -807,17 +855,97 @@ UINT WINAPI MsiSetFeatureStateA(MSIHANDLE hInstall, LPCSTR szFeature, return rc; } +/* update component state based on a feature change */ +void ACTION_UpdateComponentStates( MSIPACKAGE *package, MSIFEATURE *feature ) +{ + INSTALLSTATE newstate; + ComponentList *cl; + newstate = feature->ActionRequest; + if (newstate == INSTALLSTATE_ABSENT) newstate = INSTALLSTATE_UNKNOWN; -UINT WINAPI MSI_SetFeatureStateW(MSIPACKAGE* package, LPCWSTR szFeature, - INSTALLSTATE iState) + LIST_FOR_EACH_ENTRY(cl, &feature->Components, ComponentList, entry) + { + MSICOMPONENT *component = cl->component; + + if (!component->Enabled) continue; + + TRACE("Modifying (%d): Component %s (Installed %d, Action %d, Request %d)\n", + newstate, debugstr_w(component->Component), component->Installed, + component->Action, component->ActionRequest); + + if (newstate == INSTALLSTATE_LOCAL) + { + component->Action = INSTALLSTATE_LOCAL; + component->ActionRequest = INSTALLSTATE_LOCAL; + } + else + { + ComponentList *clist; + MSIFEATURE *f; + + component->hasLocalFeature = FALSE; + + component->Action = newstate; + component->ActionRequest = newstate; + /* if any other feature wants it local we need to set it local */ + LIST_FOR_EACH_ENTRY(f, &package->features, MSIFEATURE, entry) + { + if ( f->ActionRequest != INSTALLSTATE_LOCAL && + f->ActionRequest != INSTALLSTATE_SOURCE ) + { + continue; + } + LIST_FOR_EACH_ENTRY(clist, &f->Components, ComponentList, entry) + { + if (clist->component == component && + (f->ActionRequest == INSTALLSTATE_LOCAL || + f->ActionRequest == INSTALLSTATE_SOURCE)) + { + TRACE("Saved by %s\n", debugstr_w(f->Feature)); + component->hasLocalFeature = TRUE; + + if (component->Attributes & msidbComponentAttributesOptional) + { + if (f->Attributes & msidbFeatureAttributesFavorSource) + { + component->Action = INSTALLSTATE_SOURCE; + component->ActionRequest = INSTALLSTATE_SOURCE; + } + else + { + component->Action = INSTALLSTATE_LOCAL; + component->ActionRequest = INSTALLSTATE_LOCAL; + } + } + else if (component->Attributes & msidbComponentAttributesSourceOnly) + { + component->Action = INSTALLSTATE_SOURCE; + component->ActionRequest = INSTALLSTATE_SOURCE; + } + else + { + component->Action = INSTALLSTATE_LOCAL; + component->ActionRequest = INSTALLSTATE_LOCAL; + } + } + } + } + } + TRACE("Result (%d): Component %s (Installed %d, Action %d, Request %d)\n", + newstate, debugstr_w(component->Component), component->Installed, + component->Action, component->ActionRequest); + } +} + +UINT MSI_SetFeatureStateW( MSIPACKAGE *package, LPCWSTR szFeature, INSTALLSTATE iState ) { UINT rc = ERROR_SUCCESS; MSIFEATURE *feature, *child; TRACE("%s %i\n", debugstr_w(szFeature), iState); - feature = get_loaded_feature(package,szFeature); + feature = msi_get_loaded_feature( package, szFeature ); if (!feature) return ERROR_UNKNOWN_FEATURE; @@ -890,6 +1018,70 @@ UINT WINAPI MsiSetFeatureStateW(MSIHANDLE hInstall, LPCWSTR szFeature, return rc; } +/*********************************************************************** +* MsiSetFeatureAttributesA (MSI.@) +*/ +UINT WINAPI MsiSetFeatureAttributesA( MSIHANDLE handle, LPCSTR feature, DWORD attrs ) +{ + UINT r; + WCHAR *featureW = NULL; + + TRACE("%u, %s, 0x%08x\n", handle, debugstr_a(feature), attrs); + + if (feature && !(featureW = strdupAtoW( feature ))) return ERROR_OUTOFMEMORY; + + r = MsiSetFeatureAttributesW( handle, featureW, attrs ); + msi_free( featureW ); + return r; +} + +static DWORD unmap_feature_attributes( DWORD attrs ) +{ + DWORD ret = 0; + + if (attrs & INSTALLFEATUREATTRIBUTE_FAVORLOCAL) ret = msidbFeatureAttributesFavorLocal; + if (attrs & INSTALLFEATUREATTRIBUTE_FAVORSOURCE) ret |= msidbFeatureAttributesFavorSource; + if (attrs & INSTALLFEATUREATTRIBUTE_FOLLOWPARENT) ret |= msidbFeatureAttributesFollowParent; + if (attrs & INSTALLFEATUREATTRIBUTE_FAVORADVERTISE) ret |= msidbFeatureAttributesFavorAdvertise; + if (attrs & INSTALLFEATUREATTRIBUTE_DISALLOWADVERTISE) ret |= msidbFeatureAttributesDisallowAdvertise; + if (attrs & INSTALLFEATUREATTRIBUTE_NOUNSUPPORTEDADVERTISE) ret |= msidbFeatureAttributesNoUnsupportedAdvertise; + return ret; +} + +/*********************************************************************** +* MsiSetFeatureAttributesW (MSI.@) +*/ +UINT WINAPI MsiSetFeatureAttributesW( MSIHANDLE handle, LPCWSTR name, DWORD attrs ) +{ + MSIPACKAGE *package; + MSIFEATURE *feature; + WCHAR *costing; + + TRACE("%u, %s, 0x%08x\n", handle, debugstr_w(name), attrs); + + if (!name || !name[0]) return ERROR_UNKNOWN_FEATURE; + + if (!(package = msihandle2msiinfo( handle, MSIHANDLETYPE_PACKAGE ))) + return ERROR_INVALID_HANDLE; + + costing = msi_dup_property( package->db, szCostingComplete ); + if (!costing || !strcmpW( costing, szOne )) + { + msi_free( costing ); + msiobj_release( &package->hdr ); + return ERROR_FUNCTION_FAILED; + } + msi_free( costing ); + if (!(feature = msi_get_loaded_feature( package, name ))) + { + msiobj_release( &package->hdr ); + return ERROR_UNKNOWN_FEATURE; + } + feature->Attributes = unmap_feature_attributes( attrs ); + msiobj_release( &package->hdr ); + return ERROR_SUCCESS; +} + /*********************************************************************** * MsiGetFeatureStateA (MSI.@) */ @@ -899,12 +1091,10 @@ UINT WINAPI MsiGetFeatureStateA(MSIHANDLE hInstall, LPCSTR szFeature, LPWSTR szwFeature = NULL; UINT rc; - szwFeature = strdupAtoW(szFeature); - - rc = MsiGetFeatureStateW(hInstall,szwFeature,piInstalled, piAction); + if (szFeature && !(szwFeature = strdupAtoW(szFeature))) return ERROR_OUTOFMEMORY; + rc = MsiGetFeatureStateW(hInstall, szwFeature, piInstalled, piAction); msi_free( szwFeature); - return rc; } @@ -913,7 +1103,7 @@ UINT MSI_GetFeatureStateW(MSIPACKAGE *package, LPCWSTR szFeature, { MSIFEATURE *feature; - feature = get_loaded_feature(package,szFeature); + feature = msi_get_loaded_feature(package,szFeature); if (!feature) return ERROR_UNKNOWN_FEATURE; @@ -1033,7 +1223,7 @@ UINT MSI_GetFeatureCost( MSIPACKAGE *package, MSIFEATURE *feature, MSICOSTTREE t const WCHAR *feature_parent = feature->Feature_Parent; for (;;) { - MSIFEATURE *parent = get_loaded_feature( package, feature_parent ); + MSIFEATURE *parent = msi_get_loaded_feature( package, feature_parent ); if (!parent) break; @@ -1106,7 +1296,7 @@ UINT WINAPI MsiGetFeatureCostW(MSIHANDLE hInstall, LPCWSTR szFeature, return ERROR_SUCCESS; } - feature = get_loaded_feature(package, szFeature); + feature = msi_get_loaded_feature(package, szFeature); if (feature) ret = MSI_GetFeatureCost(package, feature, iCostTree, iState, piCost); @@ -1117,6 +1307,126 @@ UINT WINAPI MsiGetFeatureCostW(MSIHANDLE hInstall, LPCWSTR szFeature, return ret; } +/*********************************************************************** +* MsiGetFeatureInfoA (MSI.@) +*/ +UINT WINAPI MsiGetFeatureInfoA( MSIHANDLE handle, LPCSTR feature, LPDWORD attrs, + LPSTR title, LPDWORD title_len, LPSTR help, LPDWORD help_len ) +{ + UINT r; + WCHAR *titleW = NULL, *helpW = NULL, *featureW = NULL; + + TRACE("%u, %s, %p, %p, %p, %p, %p\n", handle, debugstr_a(feature), attrs, title, + title_len, help, help_len); + + if (feature && !(featureW = strdupAtoW( feature ))) return ERROR_OUTOFMEMORY; + + if (title && title_len && !(titleW = msi_alloc( *title_len * sizeof(WCHAR) ))) + { + msi_free( featureW ); + return ERROR_OUTOFMEMORY; + } + if (help && help_len && !(helpW = msi_alloc( *help_len * sizeof(WCHAR) ))) + { + msi_free( featureW ); + msi_free( titleW ); + return ERROR_OUTOFMEMORY; + } + r = MsiGetFeatureInfoW( handle, featureW, attrs, titleW, title_len, helpW, help_len ); + if (r == ERROR_SUCCESS) + { + if (titleW) WideCharToMultiByte( CP_ACP, 0, titleW, -1, title, *title_len + 1, NULL, NULL ); + if (helpW) WideCharToMultiByte( CP_ACP, 0, helpW, -1, help, *help_len + 1, NULL, NULL ); + } + msi_free( titleW ); + msi_free( helpW ); + msi_free( featureW ); + return r; +} + +static DWORD map_feature_attributes( DWORD attrs ) +{ + DWORD ret = 0; + + if (attrs == msidbFeatureAttributesFavorLocal) ret |= INSTALLFEATUREATTRIBUTE_FAVORLOCAL; + if (attrs & msidbFeatureAttributesFavorSource) ret |= INSTALLFEATUREATTRIBUTE_FAVORSOURCE; + if (attrs & msidbFeatureAttributesFollowParent) ret |= INSTALLFEATUREATTRIBUTE_FOLLOWPARENT; + if (attrs & msidbFeatureAttributesFavorAdvertise) ret |= INSTALLFEATUREATTRIBUTE_FAVORADVERTISE; + if (attrs & msidbFeatureAttributesDisallowAdvertise) ret |= INSTALLFEATUREATTRIBUTE_DISALLOWADVERTISE; + if (attrs & msidbFeatureAttributesNoUnsupportedAdvertise) ret |= INSTALLFEATUREATTRIBUTE_NOUNSUPPORTEDADVERTISE; + return ret; +} + +static UINT MSI_GetFeatureInfo( MSIPACKAGE *package, LPCWSTR name, LPDWORD attrs, + LPWSTR title, LPDWORD title_len, LPWSTR help, LPDWORD help_len ) +{ + UINT r = ERROR_SUCCESS; + MSIFEATURE *feature = msi_get_loaded_feature( package, name ); + int len; + + if (!feature) return ERROR_UNKNOWN_FEATURE; + if (attrs) *attrs = map_feature_attributes( feature->Attributes ); + if (title_len) + { + if (feature->Title) len = strlenW( feature->Title ); + else len = 0; + if (*title_len <= len) + { + *title_len = len; + if (title) r = ERROR_MORE_DATA; + } + else if (title) + { + if (feature->Title) strcpyW( title, feature->Title ); + else *title = 0; + *title_len = len; + } + } + if (help_len) + { + if (feature->Description) len = strlenW( feature->Description ); + else len = 0; + if (*help_len <= len) + { + *help_len = len; + if (help) r = ERROR_MORE_DATA; + } + else if (help) + { + if (feature->Description) strcpyW( help, feature->Description ); + else *help = 0; + *help_len = len; + } + } + return r; +} + +/*********************************************************************** +* MsiGetFeatureInfoW (MSI.@) +*/ +UINT WINAPI MsiGetFeatureInfoW( MSIHANDLE handle, LPCWSTR feature, LPDWORD attrs, + LPWSTR title, LPDWORD title_len, LPWSTR help, LPDWORD help_len ) +{ + UINT r; + MSIPACKAGE *package; + + TRACE("%u, %s, %p, %p, %p, %p, %p\n", handle, debugstr_w(feature), attrs, title, + title_len, help, help_len); + + if (!feature) return ERROR_INVALID_PARAMETER; + + if (!(package = msihandle2msiinfo( handle, MSIHANDLETYPE_PACKAGE ))) + return ERROR_INVALID_HANDLE; + + /* features may not have been loaded yet */ + msi_load_all_components( package ); + msi_load_all_features( package ); + + r = MSI_GetFeatureInfo( package, feature, attrs, title, title_len, help, help_len ); + msiobj_release( &package->hdr ); + return r; +} + /*********************************************************************** * MsiSetComponentStateA (MSI.@) */ @@ -1158,7 +1468,7 @@ static UINT MSI_SetComponentStateW(MSIPACKAGE *package, LPCWSTR szComponent, TRACE("%p %s %d\n", package, debugstr_w(szComponent), iState); - comp = get_loaded_component(package, szComponent); + comp = msi_get_loaded_component(package, szComponent); if (!comp) return ERROR_UNKNOWN_COMPONENT; @@ -1176,7 +1486,7 @@ UINT MSI_GetComponentStateW(MSIPACKAGE *package, LPCWSTR szComponent, TRACE("%p %s %p %p\n", package, debugstr_w(szComponent), piInstalled, piAction); - comp = get_loaded_component(package,szComponent); + comp = msi_get_loaded_component(package,szComponent); if (!comp) return ERROR_UNKNOWN_COMPONENT; @@ -1307,9 +1617,7 @@ LANGID WINAPI MsiGetLanguage(MSIHANDLE hInstall) { MSIPACKAGE* package; LANGID langid; - static const WCHAR szProductLanguage[] = - {'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0}; - + package = msihandle2msiinfo(hInstall, MSIHANDLETYPE_PACKAGE); if (!package) { @@ -1336,8 +1644,6 @@ LANGID WINAPI MsiGetLanguage(MSIHANDLE hInstall) UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel ) { - static const WCHAR szInstallLevel[] = { - 'I','N','S','T','A','L','L','L','E','V','E','L',0 }; static const WCHAR fmt[] = { '%','d',0 }; WCHAR level[6]; UINT r; diff --git a/reactos/dll/win32/msi/media.c b/reactos/dll/win32/msi/media.c index 37d353017e1..69bcb91de12 100644 --- a/reactos/dll/win32/msi/media.c +++ b/reactos/dll/win32/msi/media.c @@ -61,14 +61,12 @@ static BOOL source_matches_volume(MSIMEDIAINFO *mi, LPCWSTR source_root) PathStripToRootW(root); PathAddBackslashW(root); - if (!GetVolumeInformationW(root, volume_name, MAX_PATH + 1, - NULL, NULL, NULL, NULL, 0)) + if (!GetVolumeInformationW(root, volume_name, MAX_PATH + 1, NULL, NULL, NULL, NULL, 0)) { - ERR("Failed to get volume information\n"); + WARN("failed to get volume information for %s (%u)\n", debugstr_w(root), GetLastError()); return FALSE; } - - return !strcmpW( mi->volume_label, volume_name ); + return !strcmpiW( mi->volume_label, volume_name ); } static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi) @@ -83,9 +81,9 @@ static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi) INSTALLUILEVEL_NONE && !gUIHandlerA && !gUIHandlerW && !gUIHandlerRecord) return ERROR_SUCCESS; - error = generate_error_string(package, 1302, 1, mi->disk_prompt); + error = msi_build_error_string(package, 1302, 1, mi->disk_prompt); error_dialog = msi_dup_property(package->db, error_prop); - source_dir = msi_dup_property(package->db, cszSourceDir); + source_dir = msi_dup_property(package->db, szSourceDir); while (r == ERROR_SUCCESS && !source_matches_volume(mi, source_dir)) { @@ -117,6 +115,17 @@ static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi) return r; } +static MSICABINETSTREAM *msi_get_cabinet_stream( MSIPACKAGE *package, UINT disk_id ) +{ + MSICABINETSTREAM *cab; + + LIST_FOR_EACH_ENTRY( cab, &package->cabinet_streams, MSICABINETSTREAM, entry ) + { + if (cab->disk_id == disk_id) return cab; + } + return NULL; +} + static void * CDECL cabinet_alloc(ULONG cb) { return msi_alloc(cb); @@ -198,27 +207,44 @@ static LONG CDECL cabinet_seek(INT_PTR hf, LONG dist, int seektype) return SetFilePointer(handle, dist, NULL, seektype); } -struct cab_stream +struct package_disk { - MSIDATABASE *db; - WCHAR *name; + MSIPACKAGE *package; + UINT id; }; -static struct cab_stream cab_stream; +static struct package_disk package_disk; static INT_PTR CDECL cabinet_open_stream( char *pszFile, int oflag, int pmode ) { - UINT r; - IStream *stm; + MSICABINETSTREAM *cab; + IStream *stream; + WCHAR *encoded; + HRESULT hr; - r = db_get_raw_stream( cab_stream.db, cab_stream.name, &stm ); - if (r != ERROR_SUCCESS) + cab = msi_get_cabinet_stream( package_disk.package, package_disk.id ); + if (!cab) { - WARN("Failed to get cabinet stream %u\n", r); + WARN("failed to get cabinet stream\n"); return 0; } - - return (INT_PTR)stm; + if (!cab->stream[0] || !(encoded = encode_streamname( FALSE, cab->stream + 1 ))) + { + WARN("failed to encode stream name\n"); + return 0; + } + if (msi_clone_open_stream( package_disk.package->db, cab->storage, encoded, &stream ) != ERROR_SUCCESS) + { + hr = IStorage_OpenStream( cab->storage, encoded, NULL, STGM_READ|STGM_SHARE_EXCLUSIVE, 0, &stream ); + if (FAILED(hr)) + { + WARN("failed to open stream 0x%08x\n", hr); + msi_free( encoded ); + return 0; + } + } + msi_free( encoded ); + return (INT_PTR)stream; } static UINT CDECL cabinet_read_stream( INT_PTR hf, void *pv, UINT cb ) @@ -378,14 +404,9 @@ static INT_PTR cabinet_next_cabinet_stream( FDINOTIFICATIONTYPE fdint, ERR("Failed to get next cabinet information: %u\n", rc); return -1; } + package_disk.id = mi->disk_id; - msi_free( cab_stream.name ); - cab_stream.name = encode_streamname( FALSE, mi->cabinet + 1 ); - if (!cab_stream.name) - return -1; - - TRACE("next cabinet is %s\n", debugstr_w(mi->cabinet)); - + TRACE("next cabinet is %s disk id %u\n", debugstr_w(mi->cabinet), mi->disk_id); return 0; } @@ -435,32 +456,36 @@ static INT_PTR cabinet_copy_file(FDINOTIFICATIONTYPE fdint, } if (err == ERROR_SHARING_VIOLATION || err == ERROR_USER_MAPPED_FILE) { - WCHAR tmpfileW[MAX_PATH], *tmppathW, *p; + WCHAR *tmpfileW, *tmppathW, *p; DWORD len; TRACE("file in use, scheduling rename operation\n"); - GetTempFileNameW(szBackSlash, szMsi, 0, tmpfileW); - len = strlenW(path) + strlenW(tmpfileW) + 1; - if (!(tmppathW = msi_alloc(len * sizeof(WCHAR)))) - return ERROR_OUTOFMEMORY; - - strcpyW(tmppathW, path); + if (!(tmppathW = strdupW( path ))) return ERROR_OUTOFMEMORY; if ((p = strrchrW(tmppathW, '\\'))) *p = 0; - strcatW(tmppathW, tmpfileW); + len = strlenW( tmppathW ) + 16; + if (!(tmpfileW = msi_alloc(len * sizeof(WCHAR)))) + { + msi_free( tmppathW ); + return ERROR_OUTOFMEMORY; + } + if (!GetTempFileNameW(tmppathW, szMsi, 0, tmpfileW)) tmpfileW[0] = 0; + msi_free( tmppathW ); - handle = CreateFileW(tmppathW, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, attrs, NULL); + handle = CreateFileW(tmpfileW, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, attrs, NULL); if (handle != INVALID_HANDLE_VALUE && MoveFileExW(path, NULL, MOVEFILE_DELAY_UNTIL_REBOOT) && - MoveFileExW(tmppathW, path, MOVEFILE_DELAY_UNTIL_REBOOT)) + MoveFileExW(tmpfileW, path, MOVEFILE_DELAY_UNTIL_REBOOT)) { data->package->need_reboot = 1; } else + { WARN("failed to schedule rename operation %s (error %d)\n", debugstr_w(path), GetLastError()); - - msi_free(tmppathW); + DeleteFileW( tmpfileW ); + } + msi_free(tmpfileW); } else WARN("failed to create %s (error %d)\n", debugstr_w(path), err); @@ -553,7 +578,7 @@ static BOOL extract_cabinet( MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data ERF erf; BOOL ret = FALSE; - TRACE("Extracting %s\n", debugstr_w(mi->cabinet)); + TRACE("extracting %s disk id %u\n", debugstr_w(mi->cabinet), mi->disk_id); hfdi = FDICreate( cabinet_alloc, cabinet_free, cabinet_open, cabinet_read, cabinet_write, cabinet_close, cabinet_seek, 0, &erf ); @@ -593,7 +618,7 @@ static BOOL extract_cabinet_stream( MSIPACKAGE *package, MSIMEDIAINFO *mi, LPVOI ERF erf; BOOL ret = FALSE; - TRACE("Extracting %s\n", debugstr_w(mi->cabinet)); + TRACE("extracting %s disk id %u\n", debugstr_w(mi->cabinet), mi->disk_id); hfdi = FDICreate( cabinet_alloc, cabinet_free, cabinet_open_stream, cabinet_read_stream, cabinet_write, cabinet_close_stream, cabinet_seek_stream, 0, &erf ); @@ -603,22 +628,14 @@ static BOOL extract_cabinet_stream( MSIPACKAGE *package, MSIMEDIAINFO *mi, LPVOI return FALSE; } - cab_stream.db = package->db; - cab_stream.name = encode_streamname( FALSE, mi->cabinet + 1 ); - if (!cab_stream.name) - goto done; + package_disk.package = package; + package_disk.id = mi->disk_id; ret = FDICopy( hfdi, filename, NULL, 0, cabinet_notify_stream, NULL, data ); - if (!ret) - ERR("FDICopy failed\n"); + if (!ret) ERR("FDICopy failed\n"); -done: FDIDestroy( hfdi ); - msi_free( cab_stream.name ); - - if (ret) - mi->is_extracted = TRUE; - + if (ret) mi->is_extracted = TRUE; return ret; } @@ -656,20 +673,20 @@ static UINT get_drive_type(const WCHAR *path) return GetDriveTypeW(root); } -UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi) +UINT msi_load_media_info(MSIPACKAGE *package, UINT Sequence, MSIMEDIAINFO *mi) { + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','M','e','d','i','a','`',' ', + 'W','H','E','R','E',' ','`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ', + '>','=',' ','%','i',' ','O','R','D','E','R',' ','B','Y',' ','`','D','i','s','k','I','d','`',0}; MSIRECORD *row; - LPWSTR source_dir; - LPWSTR source; + LPWSTR source_dir, source; DWORD options; - static const WCHAR query[] = { - 'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ', - '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ', - '`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ','>','=',' ','%','i', - ' ','O','R','D','E','R',' ','B','Y',' ','`','D','i','s','k','I','d','`',0}; + if (Sequence <= mi->last_sequence) /* already loaded */ + return ERROR_SUCCESS; - row = MSI_QueryGetRecord(package->db, query, file->Sequence); + row = MSI_QueryGetRecord(package->db, query, Sequence); if (!row) { TRACE("Unable to query row\n"); @@ -691,8 +708,9 @@ UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi) mi->first_volume = strdupW(mi->volume_label); msi_set_sourcedir_props(package, FALSE); - source_dir = msi_dup_property(package->db, cszSourceDir); + source_dir = msi_dup_property(package->db, szSourceDir); lstrcpyW(mi->sourcedir, source_dir); + PathAddBackslashW(mi->sourcedir); mi->type = get_drive_type(source_dir); options = MSICODE_PRODUCT; @@ -720,6 +738,7 @@ UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi) options, INSTALLPROPERTY_LASTUSEDSOURCEW, source); msi_free(source_dir); + TRACE("sequence %u -> cabinet %s disk id %u\n", Sequence, debugstr_w(mi->cabinet), mi->disk_id); return ERROR_SUCCESS; } @@ -777,6 +796,7 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi) } lstrcpyW(mi->sourcedir, volume); + PathAddBackslashW(mi->sourcedir); TRACE("Found network source %s\n", debugstr_w(mi->sourcedir)); return ERROR_SUCCESS; } @@ -798,15 +818,19 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi) volume, &volumesz, prompt, &promptsz) == ERROR_SUCCESS) { mi->disk_id = id; - mi->volume_label = msi_realloc(mi->volume_label, ++volumesz * sizeof(WCHAR)); - lstrcpyW(mi->volume_label, volume); - mi->disk_prompt = msi_realloc(mi->disk_prompt, ++promptsz * sizeof(WCHAR)); - lstrcpyW(mi->disk_prompt, prompt); + msi_free( mi->volume_label ); + if (!(mi->volume_label = msi_alloc( ++volumesz * sizeof(WCHAR) ))) return ERROR_OUTOFMEMORY; + strcpyW( mi->volume_label, volume ); + + msi_free( mi->disk_prompt ); + if (!(mi->disk_prompt = msi_alloc( ++promptsz * sizeof(WCHAR) ))) return ERROR_OUTOFMEMORY; + strcpyW( mi->disk_prompt, prompt ); if (source_matches_volume(mi, source)) { /* FIXME: what about SourceDir */ lstrcpyW(mi->sourcedir, source); + PathAddBackslashW(mi->sourcedir); TRACE("Found disk source %s\n", debugstr_w(mi->sourcedir)); return ERROR_SUCCESS; } @@ -815,77 +839,99 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi) return ERROR_FUNCTION_FAILED; } -UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi) +UINT ready_media( MSIPACKAGE *package, BOOL compressed, MSIMEDIAINFO *mi ) { - UINT rc = ERROR_SUCCESS; - WCHAR *cabinet_file; + UINT rc; + WCHAR *cabinet_file = NULL; /* media info for continuous cabinet is already loaded */ - if (mi->is_continuous) - return ERROR_SUCCESS; + if (mi->is_continuous) return ERROR_SUCCESS; - /* cabinet is internal, no checks needed */ - if (!mi->cabinet || mi->cabinet[0] == '#') - return ERROR_SUCCESS; - - cabinet_file = get_cabinet_filename(mi); - - /* package should be downloaded */ - if (file->IsCompressed && - GetFileAttributesW(cabinet_file) == INVALID_FILE_ATTRIBUTES && - package->BaseURL && UrlIsW(package->BaseURL, URLIS_URL)) + if (mi->cabinet) { - WCHAR temppath[MAX_PATH], *p; + /* cabinet is internal, no checks needed */ + if (mi->cabinet[0] == '#') return ERROR_SUCCESS; - rc = msi_download_file(cabinet_file, temppath); - if (rc != ERROR_SUCCESS) + if (!(cabinet_file = get_cabinet_filename( mi ))) return ERROR_OUTOFMEMORY; + + /* package should be downloaded */ + if (compressed && GetFileAttributesW( cabinet_file ) == INVALID_FILE_ATTRIBUTES && + package->BaseURL && UrlIsW( package->BaseURL, URLIS_URL )) { - ERR("Failed to download %s (%u)\n", debugstr_w(cabinet_file), rc); - msi_free(cabinet_file); - return rc; - } - if ((p = strrchrW(temppath, '\\'))) *p = 0; - strcpyW(mi->sourcedir, temppath); - msi_free(mi->cabinet); - mi->cabinet = strdupW(p + 1); + WCHAR temppath[MAX_PATH], *p; - msi_free(cabinet_file); - return ERROR_SUCCESS; - } - - /* check volume matches, change media if not */ - if (mi->volume_label && mi->disk_id > 1 && - strcmpW( mi->first_volume, mi->volume_label )) - { - LPWSTR source = msi_dup_property(package->db, cszSourceDir); - BOOL matches; - - matches = source_matches_volume(mi, source); - msi_free(source); - - if ((mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE) && !matches) - { - rc = msi_change_media(package, mi); - if (rc != ERROR_SUCCESS) + if ((rc = msi_download_file( cabinet_file, temppath )) != ERROR_SUCCESS) { - msi_free(cabinet_file); + ERR("failed to download %s (%u)\n", debugstr_w(cabinet_file), rc); + msi_free( cabinet_file ); + return rc; + } + if ((p = strrchrW( temppath, '\\' ))) *p = 0; + strcpyW( mi->sourcedir, temppath ); + PathAddBackslashW( mi->sourcedir ); + msi_free( mi->cabinet ); + mi->cabinet = strdupW( p + 1 ); + msi_free( cabinet_file ); + return ERROR_SUCCESS; + } + } + /* check volume matches, change media if not */ + if (mi->volume_label && mi->disk_id > 1 && strcmpW( mi->first_volume, mi->volume_label )) + { + WCHAR *source = msi_dup_property( package->db, szSourceDir ); + BOOL match = source_matches_volume( mi, source ); + msi_free( source ); + + if (!match && (mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE)) + { + if ((rc = msi_change_media( package, mi )) != ERROR_SUCCESS) + { + msi_free( cabinet_file ); return rc; } } } - - if (file->IsCompressed && - GetFileAttributesW(cabinet_file) == INVALID_FILE_ATTRIBUTES) + if (mi->cabinet) { - rc = find_published_source(package, mi); - if (rc != ERROR_SUCCESS) + if (compressed && GetFileAttributesW( cabinet_file ) == INVALID_FILE_ATTRIBUTES) { - ERR("Cabinet not found: %s\n", debugstr_w(cabinet_file)); - msi_free(cabinet_file); - return ERROR_INSTALL_FAILURE; + if ((rc = find_published_source( package, mi )) != ERROR_SUCCESS) + { + ERR("cabinet not found: %s\n", debugstr_w(cabinet_file)); + msi_free( cabinet_file ); + return ERROR_INSTALL_FAILURE; + } } } - - msi_free(cabinet_file); + msi_free( cabinet_file ); + return ERROR_SUCCESS; +} + +UINT msi_add_cabinet_stream( MSIPACKAGE *package, UINT disk_id, IStorage *storage, const WCHAR *name ) +{ + MSICABINETSTREAM *cab, *item; + + TRACE("%p, %u, %p, %s\n", package, disk_id, storage, debugstr_w(name)); + + LIST_FOR_EACH_ENTRY( item, &package->cabinet_streams, MSICABINETSTREAM, entry ) + { + if (item->disk_id == disk_id) + { + TRACE("duplicate disk id %u\n", disk_id); + return ERROR_FUNCTION_FAILED; + } + } + if (!(cab = msi_alloc( sizeof(*cab) ))) return ERROR_OUTOFMEMORY; + if (!(cab->stream = msi_alloc( (strlenW( name ) + 1) * sizeof(WCHAR ) ))) + { + msi_free( cab ); + return ERROR_OUTOFMEMORY; + } + strcpyW( cab->stream, name ); + cab->disk_id = disk_id; + cab->storage = storage; + IStorage_AddRef( storage ); + list_add_tail( &package->cabinet_streams, &cab->entry ); + return ERROR_SUCCESS; } diff --git a/reactos/dll/win32/msi/msi.c b/reactos/dll/win32/msi/msi.c index 325a5b04634..cc83e39cf3b 100644 --- a/reactos/dll/win32/msi/msi.c +++ b/reactos/dll/win32/msi/msi.c @@ -28,28 +28,36 @@ #include "winreg.h" #include "winnls.h" #include "shlwapi.h" -#include "wine/debug.h" #include "msi.h" #include "msidefs.h" #include "msiquery.h" #include "msipriv.h" +#include "msiserver.h" #include "wincrypt.h" #include "winver.h" #include "winuser.h" #include "shlobj.h" #include "shobjidl.h" #include "objidl.h" +#include "wintrust.h" +#include "softpub.h" + +#include "initguid.h" +#include "msxml2.h" + +#include "wine/debug.h" #include "wine/unicode.h" WINE_DEFAULT_DEBUG_CHANNEL(msi); static const WCHAR installerW[] = {'\\','I','n','s','t','a','l','l','e','r',0}; -static UINT msi_locate_product(LPCWSTR szProduct, MSIINSTALLCONTEXT *context) +UINT msi_locate_product(LPCWSTR szProduct, MSIINSTALLCONTEXT *context) { HKEY hkey = NULL; *context = MSIINSTALLCONTEXT_NONE; + if (!szProduct) return ERROR_UNKNOWN_PRODUCT; if (MSIREG_OpenProductKey(szProduct, NULL, MSIINSTALLCONTEXT_USERMANAGED, &hkey, FALSE) == ERROR_SUCCESS) @@ -299,7 +307,6 @@ done: return r; } - static UINT get_patch_product_codes( LPCWSTR szPatchPackage, WCHAR ***product_codes ) { MSIHANDLE patch, info = 0; @@ -345,7 +352,7 @@ done: static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWSTR szCommandLine) { - UINT r, i; + UINT i, r = ERROR_FUNCTION_FAILED; DWORD size; LPCWSTR cmd_ptr = szCommandLine; LPWSTR cmd, *codes = NULL; @@ -488,6 +495,33 @@ UINT WINAPI MsiApplyMultiplePatchesW(LPCWSTR szPatchPackages, return r; } +static void free_patchinfo( DWORD count, MSIPATCHSEQUENCEINFOW *info ) +{ + DWORD i; + for (i = 0; i < count; i++) msi_free( (WCHAR *)info[i].szPatchData ); + msi_free( info ); +} + +static MSIPATCHSEQUENCEINFOW *patchinfoAtoW( DWORD count, const MSIPATCHSEQUENCEINFOA *info ) +{ + DWORD i; + MSIPATCHSEQUENCEINFOW *ret; + + if (!(ret = msi_alloc( count * sizeof(MSIPATCHSEQUENCEINFOW) ))) return NULL; + for (i = 0; i < count; i++) + { + if (info[i].szPatchData && !(ret[i].szPatchData = strdupAtoW( info[i].szPatchData ))) + { + free_patchinfo( i, ret ); + return NULL; + } + ret[i].ePatchDataType = info[i].ePatchDataType; + ret[i].dwOrder = info[i].dwOrder; + ret[i].uStatus = info[i].uStatus; + } + return ret; +} + UINT WINAPI MsiDetermineApplicablePatchesA(LPCSTR szProductPackagePath, DWORD cPatchInfo, PMSIPATCHSEQUENCEINFOA pPatchInfo) { @@ -495,24 +529,16 @@ UINT WINAPI MsiDetermineApplicablePatchesA(LPCSTR szProductPackagePath, WCHAR *package_path = NULL; MSIPATCHSEQUENCEINFOW *psi; - TRACE("(%s, %d, %p)\n", debugstr_a(szProductPackagePath), cPatchInfo, pPatchInfo); + TRACE("%s, %u, %p\n", debugstr_a(szProductPackagePath), cPatchInfo, pPatchInfo); if (szProductPackagePath && !(package_path = strdupAtoW( szProductPackagePath ))) return ERROR_OUTOFMEMORY; - psi = msi_alloc( cPatchInfo * sizeof(*psi) ); - if (!psi) + if (!(psi = patchinfoAtoW( cPatchInfo, pPatchInfo ))) { msi_free( package_path ); return ERROR_OUTOFMEMORY; } - - for (i = 0; i < cPatchInfo; i++) - { - psi[i].szPatchData = strdupAtoW( pPatchInfo[i].szPatchData ); - psi[i].ePatchDataType = pPatchInfo[i].ePatchDataType; - } - r = MsiDetermineApplicablePatchesW( package_path, cPatchInfo, psi ); if (r == ERROR_SUCCESS) { @@ -522,11 +548,8 @@ UINT WINAPI MsiDetermineApplicablePatchesA(LPCSTR szProductPackagePath, pPatchInfo[i].uStatus = psi[i].uStatus; } } - msi_free( package_path ); - for (i = 0; i < cPatchInfo; i++) - msi_free( (WCHAR *)psi[i].szPatchData ); - msi_free( psi ); + free_patchinfo( cPatchInfo, psi ); return r; } @@ -559,13 +582,151 @@ static UINT MSI_ApplicablePatchW( MSIPACKAGE *package, LPCWSTR patch ) return r; } +/* IXMLDOMDocument should be set to XPath mode already */ +static UINT MSI_ApplicablePatchXML( MSIPACKAGE *package, IXMLDOMDocument *desc ) +{ + static const WCHAR queryW[] = {'M','s','i','P','a','t','c','h','/', + 'T','a','r','g','e','t','P','r','o','d','u','c','t','/', + 'T','a','r','g','e','t','P','r','o','d','u','c','t','C','o','d','e',0}; + UINT r = ERROR_FUNCTION_FAILED; + IXMLDOMNodeList *list; + LPWSTR product_code; + IXMLDOMNode *node; + HRESULT hr; + BSTR s; + + product_code = msi_dup_property( package->db, szProductCode ); + if (!product_code) + { + /* FIXME: the property ProductCode should be written into the DB somewhere */ + ERR("no product code to check\n"); + return ERROR_SUCCESS; + } + + s = SysAllocString(queryW); + hr = IXMLDOMDocument_selectNodes( desc, s, &list ); + SysFreeString(s); + if (hr != S_OK) + return ERROR_INVALID_PATCH_XML; + + while (IXMLDOMNodeList_nextNode( list, &node ) == S_OK && r != ERROR_SUCCESS) + { + hr = IXMLDOMNode_get_text( node, &s ); + IXMLDOMNode_Release( node ); + if (!strcmpW( s, product_code )) r = ERROR_SUCCESS; + SysFreeString(s); + } + IXMLDOMNodeList_Release( list ); + + if (r != ERROR_SUCCESS) + TRACE("patch not applicable\n"); + + msi_free( product_code ); + return r; +} + +static UINT determine_patch_sequence( MSIPACKAGE *package, DWORD count, MSIPATCHSEQUENCEINFOW *info ) +{ + IXMLDOMDocument *desc = NULL; + DWORD i; + + if (count > 1) + FIXME("patch ordering not supported\n"); + + for (i = 0; i < count; i++) + { + switch (info[i].ePatchDataType) + { + case MSIPATCH_DATATYPE_PATCHFILE: + { + if (MSI_ApplicablePatchW( package, info[i].szPatchData ) != ERROR_SUCCESS) + { + info[i].dwOrder = ~0u; + info[i].uStatus = ERROR_PATCH_TARGET_NOT_FOUND; + } + else + { + info[i].dwOrder = i; + info[i].uStatus = ERROR_SUCCESS; + } + break; + } + case MSIPATCH_DATATYPE_XMLPATH: + case MSIPATCH_DATATYPE_XMLBLOB: + { + VARIANT_BOOL b; + HRESULT hr; + BSTR s; + + if (!desc) + { + hr = CoCreateInstance( &CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, + &IID_IXMLDOMDocument, (void**)&desc ); + if (hr != S_OK) + { + ERR("failed to create DOMDocument30 instance, 0x%08x\n", hr); + return ERROR_FUNCTION_FAILED; + } + } + + s = SysAllocString( info[i].szPatchData ); + if (info[i].ePatchDataType == MSIPATCH_DATATYPE_XMLPATH) + { + VARIANT src; + + V_VT(&src) = VT_BSTR; + V_BSTR(&src) = s; + hr = IXMLDOMDocument_load( desc, src, &b ); + } + else + hr = IXMLDOMDocument_loadXML( desc, s, &b ); + SysFreeString( s ); + if ( hr != S_OK ) + { + ERR("failed to parse patch description\n"); + IXMLDOMDocument_Release( desc ); + break; + } + + if (MSI_ApplicablePatchXML( package, desc ) != ERROR_SUCCESS) + { + info[i].dwOrder = ~0u; + info[i].uStatus = ERROR_PATCH_TARGET_NOT_FOUND; + } + else + { + info[i].dwOrder = i; + info[i].uStatus = ERROR_SUCCESS; + } + break; + } + default: + { + FIXME("unknown patch data type %u\n", info[i].ePatchDataType); + info[i].dwOrder = i; + info[i].uStatus = ERROR_SUCCESS; + break; + } + } + + TRACE("szPatchData: %s\n", debugstr_w(info[i].szPatchData)); + TRACE("ePatchDataType: %u\n", info[i].ePatchDataType); + TRACE("dwOrder: %u\n", info[i].dwOrder); + TRACE("uStatus: %u\n", info[i].uStatus); + } + + if (desc) IXMLDOMDocument_Release( desc ); + + return ERROR_SUCCESS; +} + UINT WINAPI MsiDetermineApplicablePatchesW(LPCWSTR szProductPackagePath, DWORD cPatchInfo, PMSIPATCHSEQUENCEINFOW pPatchInfo) { - UINT i, r, ret = ERROR_FUNCTION_FAILED; + UINT r; MSIPACKAGE *package; - TRACE("(%s, %d, %p)\n", debugstr_w(szProductPackagePath), cPatchInfo, pPatchInfo); + TRACE("%s, %u, %p\n", debugstr_w(szProductPackagePath), cPatchInfo, pPatchInfo); r = MSI_OpenPackageW( szProductPackagePath, &package ); if (r != ERROR_SUCCESS) @@ -573,100 +734,97 @@ UINT WINAPI MsiDetermineApplicablePatchesW(LPCWSTR szProductPackagePath, ERR("failed to open package %u\n", r); return r; } + r = determine_patch_sequence( package, cPatchInfo, pPatchInfo ); + msiobj_release( &package->hdr ); + return r; +} - for (i = 0; i < cPatchInfo; i++) +UINT WINAPI MsiDeterminePatchSequenceA( LPCSTR product, LPCSTR usersid, + MSIINSTALLCONTEXT context, DWORD count, PMSIPATCHSEQUENCEINFOA patchinfo ) +{ + UINT i, r; + WCHAR *productW, *usersidW = NULL; + MSIPATCHSEQUENCEINFOW *patchinfoW; + + TRACE("%s, %s, %d, %d, %p\n", debugstr_a(product), debugstr_a(usersid), + context, count, patchinfo); + + if (!product) return ERROR_INVALID_PARAMETER; + if (!(productW = strdupAtoW( product ))) return ERROR_OUTOFMEMORY; + if (usersid && !(usersidW = strdupAtoW( usersid ))) { - switch (pPatchInfo[i].ePatchDataType) - { - case MSIPATCH_DATATYPE_PATCHFILE: - { - FIXME("patch ordering not supported\n"); - r = MSI_ApplicablePatchW( package, pPatchInfo[i].szPatchData ); - if (r != ERROR_SUCCESS) - { - pPatchInfo[i].dwOrder = ~0u; - pPatchInfo[i].uStatus = ERROR_PATCH_TARGET_NOT_FOUND; - } - else - { - pPatchInfo[i].dwOrder = i; - pPatchInfo[i].uStatus = ret = ERROR_SUCCESS; - } - break; - } - default: - { - FIXME("patch data type %u not supported\n", pPatchInfo[i].ePatchDataType); - pPatchInfo[i].dwOrder = ~0u; - pPatchInfo[i].uStatus = ERROR_PATCH_TARGET_NOT_FOUND; - break; - } - } - - TRACE(" szPatchData: %s\n", debugstr_w(pPatchInfo[i].szPatchData)); - TRACE("ePatchDataType: %u\n", pPatchInfo[i].ePatchDataType); - TRACE(" dwOrder: %u\n", pPatchInfo[i].dwOrder); - TRACE(" uStatus: %u\n", pPatchInfo[i].uStatus); + msi_free( productW ); + return ERROR_OUTOFMEMORY; } - return ret; + if (!(patchinfoW = patchinfoAtoW( count, patchinfo ))) + { + msi_free( productW ); + msi_free( usersidW ); + return ERROR_OUTOFMEMORY; + } + r = MsiDeterminePatchSequenceW( productW, usersidW, context, count, patchinfoW ); + if (r == ERROR_SUCCESS) + { + for (i = 0; i < count; i++) + { + patchinfo[i].dwOrder = patchinfoW[i].dwOrder; + patchinfo[i].uStatus = patchinfoW[i].uStatus; + } + } + msi_free( productW ); + msi_free( usersidW ); + free_patchinfo( count, patchinfoW ); + return r; } -UINT WINAPI MsiDeterminePatchSequenceA(LPCSTR szProductCode, LPCSTR szUserSid, - MSIINSTALLCONTEXT dwContext, DWORD cPatchInfo, PMSIPATCHSEQUENCEINFOA pPatchInfo) -{ - FIXME("(%s, %s, %d, %d, %p): stub!\n", debugstr_a(szProductCode), - debugstr_a(szUserSid), dwContext, cPatchInfo, pPatchInfo); - - return ERROR_CALL_NOT_IMPLEMENTED; -} - -UINT WINAPI MsiDeterminePatchSequenceW(LPCWSTR szProductCode, LPCWSTR szUserSid, - MSIINSTALLCONTEXT dwContext, DWORD cPatchInfo, PMSIPATCHSEQUENCEINFOW pPatchInfo) -{ - FIXME("(%s, %s, %d, %d, %p): stub!\n", debugstr_w(szProductCode), - debugstr_w(szUserSid), dwContext, cPatchInfo, pPatchInfo); - - return ERROR_CALL_NOT_IMPLEMENTED; -} - -static UINT msi_open_package(LPCWSTR product, MSIINSTALLCONTEXT context, - MSIPACKAGE **package) +static UINT open_package( const WCHAR *product, const WCHAR *usersid, + MSIINSTALLCONTEXT context, MSIPACKAGE **package ) { UINT r; - DWORD sz; HKEY props; - LPWSTR localpack; - WCHAR sourcepath[MAX_PATH]; - WCHAR filename[MAX_PATH]; + WCHAR *localpath, sourcepath[MAX_PATH], filename[MAX_PATH]; - r = MSIREG_OpenInstallProps(product, context, NULL, &props, FALSE); - if (r != ERROR_SUCCESS) - return ERROR_BAD_CONFIGURATION; + r = MSIREG_OpenInstallProps( product, context, usersid, &props, FALSE ); + if (r != ERROR_SUCCESS) return ERROR_BAD_CONFIGURATION; - localpack = msi_reg_get_val_str(props, szLocalPackage); - if (localpack) + if ((localpath = msi_reg_get_val_str( props, szLocalPackage ))) { - lstrcpyW(sourcepath, localpack); - msi_free(localpack); + strcpyW( sourcepath, localpath ); + msi_free( localpath ); } - - if (!localpack || GetFileAttributesW(sourcepath) == INVALID_FILE_ATTRIBUTES) + RegCloseKey( props ); + if (!localpath || GetFileAttributesW( sourcepath ) == INVALID_FILE_ATTRIBUTES) { - sz = sizeof(sourcepath); - MsiSourceListGetInfoW(product, NULL, context, MSICODE_PRODUCT, - INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz); - + DWORD sz = sizeof(sourcepath); + MsiSourceListGetInfoW( product, usersid, context, MSICODE_PRODUCT, + INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz ); sz = sizeof(filename); - MsiSourceListGetInfoW(product, NULL, context, MSICODE_PRODUCT, - INSTALLPROPERTY_PACKAGENAMEW, filename, &sz); - - lstrcatW(sourcepath, filename); + MsiSourceListGetInfoW( product, usersid, context, MSICODE_PRODUCT, + INSTALLPROPERTY_PACKAGENAMEW, filename, &sz ); + strcatW( sourcepath, filename ); } - - if (GetFileAttributesW(sourcepath) == INVALID_FILE_ATTRIBUTES) + if (GetFileAttributesW( sourcepath ) == INVALID_FILE_ATTRIBUTES) return ERROR_INSTALL_SOURCE_ABSENT; - return MSI_OpenPackageW(sourcepath, package); + return MSI_OpenPackageW( sourcepath, package ); +} + +UINT WINAPI MsiDeterminePatchSequenceW( LPCWSTR product, LPCWSTR usersid, + MSIINSTALLCONTEXT context, DWORD count, PMSIPATCHSEQUENCEINFOW patchinfo ) +{ + UINT r; + MSIPACKAGE *package; + + TRACE("%s, %s, %d, %d, %p\n", debugstr_w(product), debugstr_w(usersid), + context, count, patchinfo); + + if (!product) return ERROR_INVALID_PARAMETER; + r = open_package( product, usersid, context, &package ); + if (r != ERROR_SUCCESS) return r; + + r = determine_patch_sequence( package, count, patchinfo ); + msiobj_release( &package->hdr ); + return r; } UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel, @@ -681,7 +839,7 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel, static const WCHAR szInstalled[] = { ' ','I','n','s','t','a','l','l','e','d','=','1',0}; - static const WCHAR szInstallLevel[] = { + static const WCHAR szMaxInstallLevel[] = { ' ','I','N','S','T','A','L','L','L','E','V','E','L','=','3','2','7','6','7',0}; static const WCHAR szRemoveAll[] = { ' ','R','E','M','O','V','E','=','A','L','L',0}; @@ -705,7 +863,7 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel, if (r != ERROR_SUCCESS) return r; - r = msi_open_package(szProduct, context, &package); + r = open_package(szProduct, NULL, context, &package); if (r != ERROR_SUCCESS) return r; @@ -715,7 +873,7 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel, sz += lstrlenW(szCommandLine); if (eInstallState != INSTALLSTATE_DEFAULT) - sz += lstrlenW(szInstallLevel); + sz += lstrlenW(szMaxInstallLevel); if (eInstallState == INSTALLSTATE_ABSENT) sz += lstrlenW(szRemoveAll); @@ -735,7 +893,7 @@ UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel, lstrcpyW(commandline,szCommandLine); if (eInstallState != INSTALLSTATE_DEFAULT) - lstrcatW(commandline, szInstallLevel); + lstrcatW(commandline, szMaxInstallLevel); if (eInstallState == INSTALLSTATE_ABSENT) lstrcatW(commandline, szRemoveAll); @@ -1568,11 +1726,11 @@ UINT WINAPI MsiGetPatchInfoExW(LPCWSTR szPatchCode, LPCWSTR szProductCode, r = ERROR_UNKNOWN_PATCH; - res = RegOpenKeyExW(udprod, szPatches, 0, KEY_READ, &patches); + res = RegOpenKeyExW(udprod, szPatches, 0, KEY_WOW64_64KEY|KEY_READ, &patches); if (res != ERROR_SUCCESS) goto done; - res = RegOpenKeyExW(patches, squished_patch, 0, KEY_READ, &patch); + res = RegOpenKeyExW(patches, squished_patch, 0, KEY_WOW64_64KEY|KEY_READ, &patch); if (res != ERROR_SUCCESS) goto done; @@ -1582,7 +1740,7 @@ UINT WINAPI MsiGetPatchInfoExW(LPCWSTR szPatchCode, LPCWSTR szProductCode, &prod, FALSE) != ERROR_SUCCESS) goto done; - res = RegOpenKeyExW(prod, szPatches, 0, KEY_ALL_ACCESS, &prodpatches); + res = RegOpenKeyExW(prod, szPatches, 0, KEY_WOW64_64KEY|KEY_ALL_ACCESS, &prodpatches); if (res != ERROR_SUCCESS) goto done; @@ -1791,16 +1949,133 @@ UINT WINAPI MsiEnableLogW(DWORD dwLogMode, LPCWSTR szLogFile, DWORD attributes) return ERROR_SUCCESS; } -UINT WINAPI MsiEnumComponentCostsW(MSIHANDLE hInstall, LPCWSTR szComponent, - DWORD dwIndex, INSTALLSTATE iState, - LPWSTR lpDriveBuf, DWORD *pcchDriveBuf, - int *piCost, int *pTempCost) +UINT WINAPI MsiEnumComponentCostsA( MSIHANDLE handle, LPCSTR component, DWORD index, + INSTALLSTATE state, LPSTR drive, DWORD *buflen, + int *cost, int *temp ) { - FIXME("(%d, %s, %d, %d, %p, %p, %p %p): stub!\n", hInstall, - debugstr_w(szComponent), dwIndex, iState, lpDriveBuf, - pcchDriveBuf, piCost, pTempCost); + UINT r; + DWORD len; + WCHAR *driveW, *componentW = NULL; - return ERROR_NO_MORE_ITEMS; + TRACE("%d, %s, %u, %d, %p, %p, %p %p\n", handle, debugstr_a(component), index, + state, drive, buflen, cost, temp); + + if (!drive || !buflen) return ERROR_INVALID_PARAMETER; + if (component && !(componentW = strdupAtoW( component ))) return ERROR_OUTOFMEMORY; + + len = *buflen; + if (!(driveW = msi_alloc( len * sizeof(WCHAR) ))) + { + msi_free( componentW ); + return ERROR_OUTOFMEMORY; + } + r = MsiEnumComponentCostsW( handle, componentW, index, state, driveW, buflen, cost, temp ); + if (!r) + { + WideCharToMultiByte( CP_ACP, 0, driveW, -1, drive, len, NULL, NULL ); + } + msi_free( componentW ); + msi_free( driveW ); + return r; +} + +static UINT set_drive( WCHAR *buffer, WCHAR letter ) +{ + buffer[0] = letter; + buffer[1] = ':'; + buffer[2] = 0; + return 2; +} + +UINT WINAPI MsiEnumComponentCostsW( MSIHANDLE handle, LPCWSTR component, DWORD index, + INSTALLSTATE state, LPWSTR drive, DWORD *buflen, + int *cost, int *temp ) +{ + UINT r = ERROR_NO_MORE_ITEMS; + MSICOMPONENT *comp = NULL; + MSIPACKAGE *package; + MSIFILE *file; + STATSTG stat = {0}; + WCHAR path[MAX_PATH]; + + TRACE("%d, %s, %u, %d, %p, %p, %p %p\n", handle, debugstr_w(component), index, + state, drive, buflen, cost, temp); + + if (!drive || !buflen || !cost || !temp) return ERROR_INVALID_PARAMETER; + if (!(package = msihandle2msiinfo( handle, MSIHANDLETYPE_PACKAGE ))) + { + HRESULT hr; + IWineMsiRemotePackage *remote_package; + BSTR bname = NULL; + + if (!(remote_package = (IWineMsiRemotePackage *)msi_get_remote( handle ))) + return ERROR_INVALID_HANDLE; + + if (component && !(bname = SysAllocString( component ))) + { + IWineMsiRemotePackage_Release( remote_package ); + return ERROR_OUTOFMEMORY; + } + hr = IWineMsiRemotePackage_EnumComponentCosts( remote_package, bname, index, state, drive, buflen, cost, temp ); + IWineMsiRemotePackage_Release( remote_package ); + SysFreeString( bname ); + if (FAILED(hr)) + { + if (HRESULT_FACILITY(hr) == FACILITY_WIN32) return HRESULT_CODE(hr); + return ERROR_FUNCTION_FAILED; + } + return ERROR_SUCCESS; + } + + if (!msi_get_property_int( package->db, szCostingComplete, 0 )) + { + msiobj_release( &package->hdr ); + return ERROR_FUNCTION_NOT_CALLED; + } + if (component && component[0] && !(comp = msi_get_loaded_component( package, component ))) + { + msiobj_release( &package->hdr ); + return ERROR_UNKNOWN_COMPONENT; + } + if (*buflen < 3) + { + *buflen = 2; + msiobj_release( &package->hdr ); + return ERROR_MORE_DATA; + } + if (index) + { + msiobj_release( &package->hdr ); + return ERROR_NO_MORE_ITEMS; + } + + drive[0] = 0; + *cost = *temp = 0; + GetWindowsDirectoryW( path, MAX_PATH ); + if (component && component[0]) + { + if (comp->assembly && !comp->assembly->application) *temp = comp->Cost; + if (!comp->Enabled || !comp->KeyPath) + { + *cost = 0; + *buflen = set_drive( drive, path[0] ); + r = ERROR_SUCCESS; + } + else if ((file = msi_get_loaded_file( package, comp->KeyPath ))) + { + *cost = max( 8, comp->Cost / 512 ); + *buflen = set_drive( drive, file->TargetPath[0] ); + r = ERROR_SUCCESS; + } + } + else if (IStorage_Stat( package->db->storage, &stat, STATFLAG_NONAME ) == S_OK) + { + *temp = max( 8, stat.cbSize.QuadPart / 512 ); + *buflen = set_drive( drive, path[0] ); + r = ERROR_SUCCESS; + } + msiobj_release( &package->hdr ); + return r; } UINT WINAPI MsiQueryComponentStateA(LPCSTR szProductCode, @@ -1975,9 +2250,6 @@ INSTALLSTATE WINAPI MsiQueryProductStateW(LPCWSTR szProduct) DWORD val; UINT r; - static const WCHAR szWindowsInstaller[] = { - 'W','i','n','d','o','w','s','I','n','s','t','a','l','l','e','r',0}; - TRACE("%s\n", debugstr_w(szProduct)); if (!szProduct || !*szProduct) @@ -2126,8 +2398,7 @@ LANGID WINAPI MsiLoadStringW( MSIHANDLE handle, UINT id, LPWSTR lpBuffer, if( !p ) return 0; - for (i = 0; i < (id&0xf); i++) - p += *p + 1; + for (i = 0; i < (id & 0xf); i++) p += *p + 1; len = *p; if( nBufferMax <= len ) @@ -2137,7 +2408,6 @@ LANGID WINAPI MsiLoadStringW( MSIHANDLE handle, UINT id, LPWSTR lpBuffer, lpBuffer[ len ] = 0; TRACE("found -> %s\n", debugstr_w(lpBuffer)); - return lang; } @@ -2261,22 +2531,82 @@ UINT WINAPI MsiProvideComponentFromDescriptorW( LPCWSTR szDescriptor, return ERROR_CALL_NOT_IMPLEMENTED; } -HRESULT WINAPI MsiGetFileSignatureInformationA( LPCSTR szSignedObjectPath, - DWORD dwFlags, PCCERT_CONTEXT* ppcCertContext, LPBYTE pbHashData, - LPDWORD pcbHashData) +HRESULT WINAPI MsiGetFileSignatureInformationA( LPCSTR path, DWORD flags, PCCERT_CONTEXT *cert, + LPBYTE hash, LPDWORD hashlen ) { - FIXME("%s %08x %p %p %p\n", debugstr_a(szSignedObjectPath), dwFlags, - ppcCertContext, pbHashData, pcbHashData); - return ERROR_CALL_NOT_IMPLEMENTED; + UINT r; + WCHAR *pathW = NULL; + + TRACE("%s %08x %p %p %p\n", debugstr_a(path), flags, cert, hash, hashlen); + + if (path && !(pathW = strdupAtoW( path ))) return ERROR_OUTOFMEMORY; + r = MsiGetFileSignatureInformationW( pathW, flags, cert, hash, hashlen ); + msi_free( pathW ); + return r; } -HRESULT WINAPI MsiGetFileSignatureInformationW( LPCWSTR szSignedObjectPath, - DWORD dwFlags, PCCERT_CONTEXT* ppcCertContext, LPBYTE pbHashData, - LPDWORD pcbHashData) +HRESULT WINAPI MsiGetFileSignatureInformationW( LPCWSTR path, DWORD flags, PCCERT_CONTEXT *cert, + LPBYTE hash, LPDWORD hashlen ) { - FIXME("%s %08x %p %p %p\n", debugstr_w(szSignedObjectPath), dwFlags, - ppcCertContext, pbHashData, pcbHashData); - return ERROR_CALL_NOT_IMPLEMENTED; + static GUID generic_verify_v2 = WINTRUST_ACTION_GENERIC_VERIFY_V2; + HRESULT hr; + WINTRUST_DATA data; + WINTRUST_FILE_INFO info; + CRYPT_PROVIDER_SGNR *signer; + CRYPT_PROVIDER_CERT *provider; + + TRACE("%s %08x %p %p %p\n", debugstr_w(path), flags, cert, hash, hashlen); + + if (!path || !cert) return E_INVALIDARG; + + info.cbStruct = sizeof(info); + info.pcwszFilePath = path; + info.hFile = NULL; + info.pgKnownSubject = NULL; + + data.cbStruct = sizeof(data); + data.pPolicyCallbackData = NULL; + data.pSIPClientData = NULL; + data.dwUIChoice = WTD_UI_NONE; + data.fdwRevocationChecks = WTD_REVOKE_WHOLECHAIN; + data.dwUnionChoice = WTD_CHOICE_FILE; + data.u.pFile = &info; + data.dwStateAction = WTD_STATEACTION_VERIFY; + data.hWVTStateData = NULL; + data.pwszURLReference = NULL; + data.dwProvFlags = 0; + data.dwUIContext = WTD_UICONTEXT_INSTALL; + hr = WinVerifyTrustEx( INVALID_HANDLE_VALUE, &generic_verify_v2, &data ); + if (FAILED(hr)) goto done; + + if (!(signer = WTHelperGetProvSignerFromChain( data.hWVTStateData, 0, FALSE, 0 ))) + { + hr = TRUST_E_NOSIGNATURE; + goto done; + } + if (hash) + { + DWORD len = signer->psSigner->EncryptedHash.cbData; + if (*hashlen < len) + { + *hashlen = len; + hr = HRESULT_FROM_WIN32(ERROR_MORE_DATA); + goto done; + } + memcpy( hash, signer->psSigner->EncryptedHash.pbData, len ); + *hashlen = len; + } + if (!(provider = WTHelperGetProvCertFromChain( signer, 0 ))) + { + hr = TRUST_E_PROVIDER_UNKNOWN; + goto done; + } + *cert = CertDuplicateCertificateContext( provider->pCert ); + +done: + data.dwStateAction = WTD_STATEACTION_CLOSE; + WinVerifyTrustEx( INVALID_HANDLE_VALUE, &generic_verify_v2, &data ); + return hr; } /****************************************************************** @@ -2456,6 +2786,8 @@ UINT WINAPI MsiVerifyPackageW( LPCWSTR szPackage ) static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent, awstring* lpPathBuf, LPDWORD pcchBuf) { + static const WCHAR wininstaller[] = + {'W','i','n','d','o','w','s','I','n','s','t','a','l','l','e','r',0}; WCHAR squished_pc[GUID_SIZE]; WCHAR squished_comp[GUID_SIZE]; HKEY hkey; @@ -2463,12 +2795,6 @@ static INSTALLSTATE MSI_GetComponentPath(LPCWSTR szProduct, LPCWSTR szComponent, INSTALLSTATE state; DWORD version; - static const WCHAR wininstaller[] = { - 'W','i','n','d','o','w','s','I','n','s','t','a','l','l','e','r',0}; - - TRACE("%s %s %p %p\n", debugstr_w(szProduct), - debugstr_w(szComponent), lpPathBuf->str.w, pcchBuf); - if (!szProduct || !szComponent) return INSTALLSTATE_INVALIDARG; @@ -2543,6 +2869,8 @@ INSTALLSTATE WINAPI MsiGetComponentPathW(LPCWSTR szProduct, LPCWSTR szComponent, { awstring path; + TRACE("%s %s %p %p\n", debugstr_w(szProduct), debugstr_w(szComponent), lpPathBuf, pcchBuf); + path.unicode = TRUE; path.str.w = lpPathBuf; @@ -2559,6 +2887,8 @@ INSTALLSTATE WINAPI MsiGetComponentPathA(LPCSTR szProduct, LPCSTR szComponent, INSTALLSTATE r = INSTALLSTATE_UNKNOWN; awstring path; + TRACE("%s %s %p %p\n", debugstr_a(szProduct), debugstr_a(szComponent), lpPathBuf, pcchBuf); + szwProduct = strdupAtoW( szProduct ); if( szProduct && !szwProduct) goto end; @@ -2788,11 +3118,8 @@ end: return ret; } -/****************************************************************** - * MsiGetFileVersionW [MSI.@] - */ -UINT WINAPI MsiGetFileVersionW(LPCWSTR szFilePath, LPWSTR lpVersionBuf, - LPDWORD pcchVersionBuf, LPWSTR lpLangBuf, LPDWORD pcchLangBuf) +static UINT get_file_version( const WCHAR *path, WCHAR *verbuf, DWORD *verlen, + WCHAR *langbuf, DWORD *langlen ) { static const WCHAR szVersionResource[] = {'\\',0}; static const WCHAR szVersionFormat[] = { @@ -2801,91 +3128,94 @@ UINT WINAPI MsiGetFileVersionW(LPCWSTR szFilePath, LPWSTR lpVersionBuf, '\\','V','a','r','F','i','l','e','I','n','f','o','\\', 'T','r','a','n','s','l','a','t','i','o','n',0}; static const WCHAR szLangFormat[] = {'%','d',0}; - UINT ret = 0; - DWORD dwVerLen, gle; - LPVOID lpVer = NULL; + UINT ret = ERROR_SUCCESS; + DWORD len, error; + LPVOID version; VS_FIXEDFILEINFO *ffi; USHORT *lang; - UINT puLen; WCHAR tmp[32]; - TRACE("%s %p %d %p %d\n", debugstr_w(szFilePath), - lpVersionBuf, pcchVersionBuf?*pcchVersionBuf:0, - lpLangBuf, pcchLangBuf?*pcchLangBuf:0); + if (!(len = GetFileVersionInfoSizeW( path, NULL ))) + { + error = GetLastError(); + if (error == ERROR_BAD_PATHNAME) return ERROR_FILE_NOT_FOUND; + return error; + } + if (!(version = msi_alloc( len ))) return ERROR_OUTOFMEMORY; + if (!GetFileVersionInfoW( path, 0, len, version )) + { + msi_free( version ); + return GetLastError(); + } + if (verlen) + { + if (VerQueryValueW( version, szVersionResource, (LPVOID *)&ffi, &len ) && len > 0) + { + sprintfW( tmp, szVersionFormat, + HIWORD(ffi->dwFileVersionMS), LOWORD(ffi->dwFileVersionMS), + HIWORD(ffi->dwFileVersionLS), LOWORD(ffi->dwFileVersionLS) ); + if (verbuf) lstrcpynW( verbuf, tmp, *verlen ); + len = strlenW( tmp ); + if (len >= *verlen) ret = ERROR_MORE_DATA; + *verlen = len; + } + else + { + if (verbuf) *verbuf = 0; + *verlen = 0; + } + } + if (langlen) + { + if (VerQueryValueW( version, szLangResource, (LPVOID *)&lang, &len ) && len > 0) + { + sprintfW( tmp, szLangFormat, *lang ); + if (langbuf) lstrcpynW( langbuf, tmp, *langlen ); + len = strlenW( tmp ); + if (len >= *langlen) ret = ERROR_MORE_DATA; + *langlen = len; + } + else + { + if (langbuf) *langbuf = 0; + *langlen = 0; + } + } + msi_free( version ); + return ret; +} - if ((lpVersionBuf && !pcchVersionBuf) || - (lpLangBuf && !pcchLangBuf)) + +/****************************************************************** + * MsiGetFileVersionW [MSI.@] + */ +UINT WINAPI MsiGetFileVersionW( LPCWSTR path, LPWSTR verbuf, LPDWORD verlen, + LPWSTR langbuf, LPDWORD langlen ) +{ + UINT ret; + + TRACE("%s %p %u %p %u\n", debugstr_w(path), verbuf, verlen ? *verlen : 0, + langbuf, langlen ? *langlen : 0); + + if ((verbuf && !verlen) || (langbuf && !langlen)) return ERROR_INVALID_PARAMETER; - dwVerLen = GetFileVersionInfoSizeW(szFilePath, NULL); - if( !dwVerLen ) + ret = get_file_version( path, verbuf, verlen, langbuf, langlen ); + if (ret == ERROR_RESOURCE_DATA_NOT_FOUND) { - gle = GetLastError(); - if (gle == ERROR_BAD_PATHNAME) - return ERROR_FILE_NOT_FOUND; - else if (gle == ERROR_RESOURCE_DATA_NOT_FOUND) - return ERROR_FILE_INVALID; - - return gle; - } - - lpVer = msi_alloc(dwVerLen); - if( !lpVer ) - { - ret = ERROR_OUTOFMEMORY; - goto end; - } - - if( !GetFileVersionInfoW(szFilePath, 0, dwVerLen, lpVer) ) - { - ret = GetLastError(); - goto end; - } - - if (pcchVersionBuf) - { - if( VerQueryValueW(lpVer, szVersionResource, (LPVOID*)&ffi, &puLen) && - (puLen > 0) ) + int len; + WCHAR *version = msi_font_version_from_file( path ); + if (!version) return ERROR_FILE_INVALID; + len = strlenW( version ); + if (*verlen > len) { - wsprintfW(tmp, szVersionFormat, - HIWORD(ffi->dwFileVersionMS), LOWORD(ffi->dwFileVersionMS), - HIWORD(ffi->dwFileVersionLS), LOWORD(ffi->dwFileVersionLS)); - if (lpVersionBuf) lstrcpynW(lpVersionBuf, tmp, *pcchVersionBuf); - - if (strlenW(tmp) >= *pcchVersionBuf) - ret = ERROR_MORE_DATA; - - *pcchVersionBuf = lstrlenW(tmp); - } - else - { - if (lpVersionBuf) *lpVersionBuf = 0; - *pcchVersionBuf = 0; + strcpyW( verbuf, version ); + ret = ERROR_SUCCESS; } + else ret = ERROR_MORE_DATA; + *verlen = len; + msi_free( version ); } - - if (pcchLangBuf) - { - if (VerQueryValueW(lpVer, szLangResource, (LPVOID*)&lang, &puLen) && - (puLen > 0)) - { - wsprintfW(tmp, szLangFormat, *lang); - if (lpLangBuf) lstrcpynW(lpLangBuf, tmp, *pcchLangBuf); - - if (strlenW(tmp) >= *pcchLangBuf) - ret = ERROR_MORE_DATA; - - *pcchLangBuf = lstrlenW(tmp); - } - else - { - if (lpLangBuf) *lpLangBuf = 0; - *pcchLangBuf = 0; - } - } - -end: - msi_free(lpVer); return ret; } @@ -3014,10 +3344,6 @@ static UINT MSI_ProvideQualifiedComponentEx(LPCWSTR szComponent, DWORD sz; UINT rc; - TRACE("%s %s %i %s %i %i %p %p\n", debugstr_w(szComponent), - debugstr_w(szQualifier), dwInstallMode, debugstr_w(szProduct), - Unused1, Unused2, lpPathBuf, pcchPathBuf); - rc = MSIREG_OpenUserComponentsKey(szComponent, &hkey, FALSE); if (rc != ERROR_SUCCESS) return ERROR_INDEX_ABSENT; @@ -3053,6 +3379,10 @@ UINT WINAPI MsiProvideQualifiedComponentExW(LPCWSTR szComponent, { awstring path; + TRACE("%s %s %u %s %u %u %p %p\n", debugstr_w(szComponent), + debugstr_w(szQualifier), dwInstallMode, debugstr_w(szProduct), + Unused1, Unused2, lpPathBuf, pcchPathBuf); + path.unicode = TRUE; path.str.w = lpPathBuf; @@ -3305,7 +3635,7 @@ UINT WINAPI MsiCollectUserInfoW(LPCWSTR szProduct) if (!package) return ERROR_CALL_NOT_IMPLEMENTED; - rc = ACTION_PerformUIAction(package, szFirstRun, -1); + rc = ACTION_PerformUIAction(package, szFirstRun, SCRIPT_NONE); msiobj_release( &package->hdr ); MsiCloseHandle(handle); @@ -3331,7 +3661,7 @@ UINT WINAPI MsiCollectUserInfoA(LPCSTR szProduct) if (!package) return ERROR_CALL_NOT_IMPLEMENTED; - rc = ACTION_PerformUIAction(package, szFirstRun, -1); + rc = ACTION_PerformUIAction(package, szFirstRun, SCRIPT_NONE); msiobj_release( &package->hdr ); MsiCloseHandle(handle); @@ -3371,7 +3701,6 @@ end: */ UINT WINAPI MsiConfigureFeatureW(LPCWSTR szProduct, LPCWSTR szFeature, INSTALLSTATE eInstallState) { - static const WCHAR szCostInit[] = { 'C','o','s','t','I','n','i','t','i','a','l','i','z','e',0 }; MSIPACKAGE *package = NULL; UINT r; WCHAR sourcepath[MAX_PATH], filename[MAX_PATH]; @@ -3413,7 +3742,7 @@ UINT WINAPI MsiConfigureFeatureW(LPCWSTR szProduct, LPCWSTR szFeature, INSTALLST MsiSetInternalUI( INSTALLUILEVEL_BASIC, NULL ); - r = ACTION_PerformUIAction( package, szCostInit, -1 ); + r = ACTION_PerformUIAction( package, szCostInitialize, SCRIPT_NONE ); if (r != ERROR_SUCCESS) goto end; @@ -3542,21 +3871,21 @@ UINT WINAPI MsiGetShortcutTargetW( LPCWSTR szShortcutTarget, return ERROR_FUNCTION_FAILED; } -UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature, - DWORD dwReinstallMode ) +UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature, DWORD dwReinstallMode ) { - MSIPACKAGE* package = NULL; + static const WCHAR fmtW[] = {'%','s','=','%','s',' ','%','s','=','%','s',0}; + MSIPACKAGE *package; + MSIINSTALLCONTEXT context; UINT r; - WCHAR sourcepath[MAX_PATH]; - WCHAR filename[MAX_PATH]; - static const WCHAR szLogVerbose[] = { - ' ','L','O','G','V','E','R','B','O','S','E',0 }; - WCHAR reinstallmode[11]; - LPWSTR ptr; + WCHAR sourcepath[MAX_PATH], filename[MAX_PATH], reinstallmode[11]; + WCHAR *ptr, *cmdline; DWORD sz; - FIXME("%s %s 0x%08x\n", - debugstr_w(szProduct), debugstr_w(szFeature), dwReinstallMode); + TRACE("%s, %s, 0x%08x\n", debugstr_w(szProduct), debugstr_w(szFeature), dwReinstallMode); + + r = msi_locate_product( szProduct, &context ); + if (r != ERROR_SUCCESS) + return r; ptr = reinstallmode; @@ -3583,14 +3912,12 @@ UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature, *ptr = 0; sz = sizeof(sourcepath); - MsiSourceListGetInfoW(szProduct, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz); - + MsiSourceListGetInfoW( szProduct, NULL, context, MSICODE_PRODUCT, + INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz ); sz = sizeof(filename); - MsiSourceListGetInfoW(szProduct, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEW, filename, &sz); - - lstrcatW( sourcepath, filename ); + MsiSourceListGetInfoW( szProduct, NULL, context, MSICODE_PRODUCT, + INSTALLPROPERTY_PACKAGENAMEW, filename, &sz ); + strcatW( sourcepath, filename ); if (dwReinstallMode & REINSTALLMODE_PACKAGE) r = MSI_OpenPackageW( sourcepath, &package ); @@ -3600,14 +3927,18 @@ UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature, if (r != ERROR_SUCCESS) return r; - msi_set_property( package->db, szReinstallMode, reinstallmode ); - msi_set_property( package->db, szInstalled, szOne ); - msi_set_property( package->db, szLogVerbose, szOne ); - msi_set_property( package->db, szReinstall, szFeature ); - - r = MSI_InstallPackage( package, sourcepath, NULL ); + sz = (strlenW( fmtW ) + strlenW( szReinstallMode ) + strlenW( reinstallmode )) * sizeof(WCHAR); + sz += (strlenW( szReinstall ) + strlenW( szFeature )) * sizeof(WCHAR); + if (!(cmdline = msi_alloc( sz ))) + { + msiobj_release( &package->hdr ); + return ERROR_OUTOFMEMORY; + } + sprintfW( cmdline, fmtW, szReinstallMode, reinstallmode, szReinstall, szFeature ); + r = MSI_InstallPackage( package, sourcepath, cmdline ); msiobj_release( &package->hdr ); + msi_free( cmdline ); return r; } diff --git a/reactos/dll/win32/msi/msi.rbuild b/reactos/dll/win32/msi/msi.rbuild index d71529f2f0e..563b2c0bdfe 100644 --- a/reactos/dll/win32/msi/msi.rbuild +++ b/reactos/dll/win32/msi/msi.rbuild @@ -27,7 +27,6 @@ font.c format.c handle.c - helpers.c insert.c install.c join.c @@ -36,10 +35,9 @@ msi_main.c msiquery.c package.c - preview.c + patch.c record.c registry.c - regsvr.c script.c select.c source.c @@ -74,6 +72,9 @@ ntdll pseh msiserver_interface + wintrust + crypt32 + imagehlp msiserver msiheader diff --git a/reactos/dll/win32/msi/msi.spec b/reactos/dll/win32/msi/msi.spec index c1e35530782..5f4a51f3900 100644 --- a/reactos/dll/win32/msi/msi.spec +++ b/reactos/dll/win32/msi/msi.spec @@ -48,8 +48,8 @@ 52 stdcall MsiGetDatabaseState(long) 53 stdcall MsiGetFeatureCostA(long str long long ptr) 54 stdcall MsiGetFeatureCostW(long wstr long long ptr) -55 stub MsiGetFeatureInfoA -56 stub MsiGetFeatureInfoW +55 stdcall MsiGetFeatureInfoA(long str ptr ptr ptr ptr ptr) +56 stdcall MsiGetFeatureInfoW(long wstr ptr ptr ptr ptr ptr) 57 stdcall MsiGetFeatureStateA(long str ptr ptr) 58 stdcall MsiGetFeatureStateW(long wstr ptr ptr) 59 stdcall MsiGetFeatureUsageA(str str ptr ptr) @@ -178,8 +178,8 @@ 182 stdcall -private DllGetVersion(ptr) 183 stub MsiGetProductCodeFromPackageCodeA 184 stub MsiGetProductCodeFromPackageCodeW -185 stub MsiCreateTransformSummaryInfoA -186 stub MsiCreateTransformSummaryInfoW +185 stdcall MsiCreateTransformSummaryInfoA(long long str long long) +186 stdcall MsiCreateTransformSummaryInfoW(long long wstr long long) 187 stub MsiQueryFeatureStateFromDescriptorA 188 stub MsiQueryFeatureStateFromDescriptorW 189 stdcall MsiConfigureProductExA(str long long str) @@ -199,8 +199,8 @@ 203 stdcall MsiProvideQualifiedComponentExW(wstr wstr long wstr long long ptr ptr) 204 stdcall MsiEnumRelatedProductsA(str long long ptr) 205 stdcall MsiEnumRelatedProductsW(wstr long long ptr) -206 stub MsiSetFeatureAttributesA -207 stub MsiSetFeatureAttributesW +206 stdcall MsiSetFeatureAttributesA(long str long) +207 stdcall MsiSetFeatureAttributesW(long wstr long) 208 stdcall MsiSourceListClearAllA(str str long) 209 stdcall MsiSourceListClearAllW(wstr wstr long) 210 stdcall MsiSourceListAddSourceA(str str long str) @@ -213,7 +213,7 @@ 217 stdcall MsiGetShortcutTargetW(wstr ptr ptr ptr) 218 stdcall MsiGetFileHashA(str long ptr) 219 stdcall MsiGetFileHashW(wstr long ptr) -220 stub MsiEnumComponentCostsA +220 stdcall MsiEnumComponentCostsA(long str long long ptr ptr ptr ptr) 221 stdcall MsiEnumComponentCostsW(long wstr long long ptr ptr ptr ptr) 222 stdcall MsiCreateAndVerifyInstallerDirectory(long) 223 stdcall MsiGetFileSignatureInformationA(str long ptr ptr ptr) diff --git a/reactos/dll/win32/msi/msi_main.c b/reactos/dll/win32/msi/msi_main.c index 93f65430545..669d93bce3e 100644 --- a/reactos/dll/win32/msi/msi_main.c +++ b/reactos/dll/win32/msi/msi_main.c @@ -49,8 +49,6 @@ LPVOID gUIContext = NULL; WCHAR *gszLogFile = NULL; HINSTANCE msi_hInstance; -static WCHAR msi_path[MAX_PATH]; -static ITypeLib *msi_typelib; /* * Dll lifetime tracking declaration @@ -77,7 +75,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) DisableThreadLibraryCalls(hinstDLL); break; case DLL_PROCESS_DETACH: - if (msi_typelib) ITypeLib_Release( msi_typelib ); msi_dialog_unregister_class(); msi_free_handle_table(); msi_free( gszLogFile ); @@ -86,39 +83,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) return TRUE; } -static CRITICAL_SECTION MSI_typelib_cs; -static CRITICAL_SECTION_DEBUG MSI_typelib_cs_debug = -{ - 0, 0, &MSI_typelib_cs, - { &MSI_typelib_cs_debug.ProcessLocksList, - &MSI_typelib_cs_debug.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": MSI_typelib_cs") } -}; -static CRITICAL_SECTION MSI_typelib_cs = { &MSI_typelib_cs_debug, -1, 0, 0, 0, 0 }; - -ITypeLib *get_msi_typelib( LPWSTR *path ) -{ - EnterCriticalSection( &MSI_typelib_cs ); - - if (!msi_typelib) - { - TRACE("loading typelib\n"); - - if (GetModuleFileNameW( msi_hInstance, msi_path, MAX_PATH )) - LoadTypeLib( msi_path, &msi_typelib ); - } - - LeaveCriticalSection( &MSI_typelib_cs ); - - if (path) - *path = msi_path; - - if (msi_typelib) - ITypeLib_AddRef( msi_typelib ); - - return msi_typelib; -} - typedef struct tagIClassFactoryImpl { IClassFactory IClassFactory_iface; HRESULT (*create_object)( IUnknown*, LPVOID* ); @@ -262,3 +226,19 @@ HRESULT WINAPI DllCanUnloadNow(void) { return dll_count == 0 ? S_OK : S_FALSE; } + +/*********************************************************************** + * DllRegisterServer (MSI.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( msi_hInstance ); +} + +/*********************************************************************** + * DllUnregisterServer (MSI.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( msi_hInstance ); +} diff --git a/reactos/dll/win32/msi/msipriv.h b/reactos/dll/win32/msi/msipriv.h index 56a8a93c807..2c9385a2a50 100644 --- a/reactos/dll/win32/msi/msipriv.h +++ b/reactos/dll/win32/msi/msipriv.h @@ -47,6 +47,7 @@ static const BOOL is_64bit = sizeof(void *) > sizeof(int); #define MSITYPE_NULLABLE 0x1000 #define MSITYPE_KEY 0x2000 #define MSITYPE_TEMPORARY 0x4000 +#define MSITYPE_UNKNOWN 0x8000 #define MAX_STREAM_NAME_LEN 62 #define LONG_STR_BYTES 3 @@ -75,6 +76,9 @@ struct tagMSIOBJECTHDR msihandledestructor destructor; }; +#define MSI_INITIAL_MEDIA_TRANSFORM_OFFSET 10000 +#define MSI_INITIAL_MEDIA_TRANSFORM_DISKID 30000 + typedef struct tagMSIDATABASE { MSIOBJECTHDR hdr; @@ -83,8 +87,9 @@ typedef struct tagMSIDATABASE UINT bytes_per_strref; LPWSTR path; LPWSTR deletefile; - LPWSTR localfile; LPCWSTR mode; + UINT media_transform_offset; + UINT media_transform_disk_id; struct list tables; struct list transforms; struct list streams; @@ -154,13 +159,24 @@ typedef struct tagMSIMEDIAINFO WCHAR sourcedir[MAX_PATH]; } MSIMEDIAINFO; +typedef struct tagMSICABINETSTREAM +{ + struct list entry; + UINT disk_id; + IStorage *storage; + WCHAR *stream; +} MSICABINETSTREAM; + typedef struct tagMSIPATCHINFO { struct list entry; LPWSTR patchcode; + LPWSTR products; LPWSTR transforms; + LPWSTR filename; LPWSTR localfile; MSIPATCHSTATE state; + BOOL delete_on_close; } MSIPATCHINFO; typedef struct tagMSIBINARY @@ -248,11 +264,10 @@ typedef struct tagMSIVIEWOPS /* * get_column_info - returns the name and type of a specific column * - * The name and tablename is HeapAlloc'ed by this function and should be - * freed by the caller. * The column information can be queried at any time. */ - UINT (*get_column_info)( struct tagMSIVIEW *view, UINT n, LPWSTR *name, UINT *type, BOOL *temporary, LPWSTR *tableName); + UINT (*get_column_info)( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, UINT *type, + BOOL *temporary, LPCWSTR *table_name ); /* * modify - not yet implemented properly @@ -312,6 +327,8 @@ struct tagMSIVIEW { MSIOBJECTHDR hdr; const MSIVIEWOPS *ops; + MSIDBERROR error; + const WCHAR *error_column; }; struct msi_dialog_tag; @@ -326,6 +343,7 @@ enum platform enum clr_version { + CLR_VERSION_V10, CLR_VERSION_V11, CLR_VERSION_V20, CLR_VERSION_MAX @@ -343,9 +361,11 @@ typedef struct tagMSIPACKAGE struct list components; struct list features; struct list files; + struct list filepatches; struct list tempfiles; struct list folders; struct list binaries; + struct list cabinet_streams; LPWSTR ActionFormat; LPWSTR LastAction; HANDLE log_file; @@ -365,6 +385,8 @@ typedef struct tagMSIPACKAGE LPWSTR BaseURL; LPWSTR PackagePath; LPWSTR ProductCode; + LPWSTR localfile; + BOOL delete_on_close; UINT CurrentInstallState; msi_dialog *dialog; @@ -384,6 +406,7 @@ typedef struct tagMSIPACKAGE unsigned char commit_action_running : 1; unsigned char rollback_action_running : 1; unsigned char need_reboot : 1; + unsigned char need_rollback : 1; } MSIPACKAGE; typedef struct tagMSIPREVIEW @@ -471,27 +494,38 @@ typedef struct tagFeatureList MSIFEATURE *feature; } FeatureList; +enum folder_state +{ + FOLDER_STATE_UNINITIALIZED, + FOLDER_STATE_EXISTS, + FOLDER_STATE_CREATED, + FOLDER_STATE_CREATED_PERSISTENT, + FOLDER_STATE_REMOVED +}; + typedef struct tagMSIFOLDER { struct list entry; + struct list children; LPWSTR Directory; LPWSTR Parent; LPWSTR TargetDefault; LPWSTR SourceLongPath; LPWSTR SourceShortPath; - LPWSTR ResolvedTarget; LPWSTR ResolvedSource; - LPWSTR Property; /* initially set property */ - INT State; - /* 0 = uninitialized */ - /* 1 = existing */ - /* 2 = created remove if empty */ - /* 3 = created persist if empty */ - INT Cost; - INT Space; + enum folder_state State; + BOOL persistent; + INT Cost; + INT Space; } MSIFOLDER; +typedef struct tagFolderList +{ + struct list entry; + MSIFOLDER *folder; +} FolderList; + typedef enum _msi_file_state { msifs_invalid, msifs_missing, @@ -528,6 +562,16 @@ typedef struct tagMSITEMPFILE LPWSTR Path; } MSITEMPFILE; +typedef struct tagMSIFILEPATCH +{ + struct list entry; + MSIFILE *File; + INT Sequence; + INT PatchSize; + INT Attributes; + BOOL IsApplied; +} MSIFILEPATCH; + typedef struct tagMSIAPPID { struct list entry; @@ -614,11 +658,13 @@ struct tagMSIMIME BOOL InstallMe; }; -enum SCRIPTS { - INSTALL_SCRIPT = 0, - COMMIT_SCRIPT = 1, - ROLLBACK_SCRIPT = 2, - TOTAL_SCRIPTS = 3 +enum SCRIPTS +{ + SCRIPT_NONE = -1, + SCRIPT_INSTALL = 0, + SCRIPT_COMMIT = 1, + SCRIPT_ROLLBACK = 2, + SCRIPT_MAX = 3 }; #define SEQUENCE_UI 0x1 @@ -627,8 +673,8 @@ enum SCRIPTS { typedef struct tagMSISCRIPT { - LPWSTR *Actions[TOTAL_SCRIPTS]; - UINT ActionCount[TOTAL_SCRIPTS]; + LPWSTR *Actions[SCRIPT_MAX]; + UINT ActionCount[SCRIPT_MAX]; BOOL ExecuteSequenceRun; BOOL CurrentlyScripting; UINT InWhatSequence; @@ -653,12 +699,6 @@ typedef struct tagMSISCRIPT #define MSIHANDLE_MAGIC 0x4d434923 -DEFINE_GUID(CLSID_IMsiServer, 0x000C101C,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); -DEFINE_GUID(CLSID_IMsiServerX1, 0x000C103E,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); -DEFINE_GUID(CLSID_IMsiServerX2, 0x000C1090,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); -DEFINE_GUID(CLSID_IMsiServerX3, 0x000C1094,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); - -DEFINE_GUID(CLSID_IMsiServerMessage, 0x000C101D,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); /* handle unicode/ascii output in the Msi* API functions */ typedef struct { BOOL unicode; @@ -676,28 +716,27 @@ typedef struct { } str; } awcstring; -UINT msi_strcpy_to_awstring( LPCWSTR str, awstring *awbuf, DWORD *sz ); +UINT msi_strcpy_to_awstring( LPCWSTR str, awstring *awbuf, DWORD *sz ) DECLSPEC_HIDDEN; /* msi server interface */ -extern ITypeLib *get_msi_typelib( LPWSTR *path ); -extern HRESULT create_msi_custom_remote( IUnknown *pOuter, LPVOID *ppObj ); -extern HRESULT create_msi_remote_package( IUnknown *pOuter, LPVOID *ppObj ); -extern HRESULT create_msi_remote_database( IUnknown *pOuter, LPVOID *ppObj ); -extern IUnknown *msi_get_remote(MSIHANDLE handle); +extern HRESULT create_msi_custom_remote( IUnknown *pOuter, LPVOID *ppObj ) DECLSPEC_HIDDEN; +extern HRESULT create_msi_remote_package( IUnknown *pOuter, LPVOID *ppObj ) DECLSPEC_HIDDEN; +extern HRESULT create_msi_remote_database( IUnknown *pOuter, LPVOID *ppObj ) DECLSPEC_HIDDEN; +extern IUnknown *msi_get_remote(MSIHANDLE handle) DECLSPEC_HIDDEN; /* handle functions */ -extern void *msihandle2msiinfo(MSIHANDLE handle, UINT type); -extern MSIHANDLE alloc_msihandle( MSIOBJECTHDR * ); -extern MSIHANDLE alloc_msi_remote_handle( IUnknown *unk ); -extern void *alloc_msiobject(UINT type, UINT size, msihandledestructor destroy ); -extern void msiobj_addref(MSIOBJECTHDR *); -extern int msiobj_release(MSIOBJECTHDR *); -extern void msiobj_lock(MSIOBJECTHDR *); -extern void msiobj_unlock(MSIOBJECTHDR *); -extern void msi_free_handle_table(void); +extern void *msihandle2msiinfo(MSIHANDLE handle, UINT type) DECLSPEC_HIDDEN; +extern MSIHANDLE alloc_msihandle( MSIOBJECTHDR * ) DECLSPEC_HIDDEN; +extern MSIHANDLE alloc_msi_remote_handle( IUnknown *unk ) DECLSPEC_HIDDEN; +extern void *alloc_msiobject(UINT type, UINT size, msihandledestructor destroy ) DECLSPEC_HIDDEN; +extern void msiobj_addref(MSIOBJECTHDR *) DECLSPEC_HIDDEN; +extern int msiobj_release(MSIOBJECTHDR *) DECLSPEC_HIDDEN; +extern void msiobj_lock(MSIOBJECTHDR *) DECLSPEC_HIDDEN; +extern void msiobj_unlock(MSIOBJECTHDR *) DECLSPEC_HIDDEN; +extern void msi_free_handle_table(void) DECLSPEC_HIDDEN; -extern void free_cached_tables( MSIDATABASE *db ); -extern UINT MSI_CommitTables( MSIDATABASE *db ); +extern void free_cached_tables( MSIDATABASE *db ) DECLSPEC_HIDDEN; +extern UINT MSI_CommitTables( MSIDATABASE *db ) DECLSPEC_HIDDEN; /* string table functions */ @@ -707,193 +746,201 @@ enum StringPersistence StringNonPersistent = 1 }; -extern BOOL msi_addstringW( string_table *st, const WCHAR *data, int len, USHORT refcount, enum StringPersistence persistence ); -extern UINT msi_string2idW( const string_table *st, LPCWSTR buffer, UINT *id ); -extern VOID msi_destroy_stringtable( string_table *st ); -extern const WCHAR *msi_string_lookup_id( const string_table *st, UINT id ); -extern HRESULT msi_init_string_table( IStorage *stg ); -extern string_table *msi_load_string_table( IStorage *stg, UINT *bytes_per_strref ); -extern UINT msi_save_string_table( const string_table *st, IStorage *storage, UINT *bytes_per_strref ); -extern UINT msi_get_string_table_codepage( const string_table *st ); -extern UINT msi_set_string_table_codepage( string_table *st, UINT codepage ); +extern BOOL msi_addstringW( string_table *st, const WCHAR *data, int len, USHORT refcount, enum StringPersistence persistence ) DECLSPEC_HIDDEN; +extern UINT msi_string2idW( const string_table *st, LPCWSTR buffer, UINT *id ) DECLSPEC_HIDDEN; +extern VOID msi_destroy_stringtable( string_table *st ) DECLSPEC_HIDDEN; +extern const WCHAR *msi_string_lookup_id( const string_table *st, UINT id ) DECLSPEC_HIDDEN; +extern HRESULT msi_init_string_table( IStorage *stg ) DECLSPEC_HIDDEN; +extern string_table *msi_load_string_table( IStorage *stg, UINT *bytes_per_strref ) DECLSPEC_HIDDEN; +extern UINT msi_save_string_table( const string_table *st, IStorage *storage, UINT *bytes_per_strref ) DECLSPEC_HIDDEN; +extern UINT msi_get_string_table_codepage( const string_table *st ) DECLSPEC_HIDDEN; +extern UINT msi_set_string_table_codepage( string_table *st, UINT codepage ) DECLSPEC_HIDDEN; -extern BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name ); -extern MSICONDITION MSI_DatabaseIsTablePersistent( MSIDATABASE *db, LPCWSTR table ); +extern BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name ) DECLSPEC_HIDDEN; +extern MSICONDITION MSI_DatabaseIsTablePersistent( MSIDATABASE *db, LPCWSTR table ) DECLSPEC_HIDDEN; extern UINT read_stream_data( IStorage *stg, LPCWSTR stname, BOOL table, - BYTE **pdata, UINT *psz ); + BYTE **pdata, UINT *psz ) DECLSPEC_HIDDEN; extern UINT write_stream_data( IStorage *stg, LPCWSTR stname, - LPCVOID data, UINT sz, BOOL bTable ); + LPCVOID data, UINT sz, BOOL bTable ) DECLSPEC_HIDDEN; /* transform functions */ -extern UINT msi_table_apply_transform( MSIDATABASE *db, IStorage *stg ); +extern UINT msi_table_apply_transform( MSIDATABASE *db, IStorage *stg ) DECLSPEC_HIDDEN; extern UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db, - LPCWSTR szTransformFile, int iErrorCond ); -extern void append_storage_to_db( MSIDATABASE *db, IStorage *stg ); + LPCWSTR szTransformFile, int iErrorCond ) DECLSPEC_HIDDEN; +extern void append_storage_to_db( MSIDATABASE *db, IStorage *stg ) DECLSPEC_HIDDEN; +extern UINT msi_apply_transforms( MSIPACKAGE *package ) DECLSPEC_HIDDEN; /* patch functions */ -extern UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si ); -extern UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch ); -extern UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIPATCHINFO *patch ); +extern UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si ) DECLSPEC_HIDDEN; +extern UINT msi_apply_patches( MSIPACKAGE *package ) DECLSPEC_HIDDEN; +extern UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code ) DECLSPEC_HIDDEN; +extern void msi_free_patchinfo( MSIPATCHINFO *patch ) DECLSPEC_HIDDEN; /* action internals */ -extern UINT MSI_InstallPackage( MSIPACKAGE *, LPCWSTR, LPCWSTR ); -extern UINT ACTION_DialogBox( MSIPACKAGE*, LPCWSTR); -extern UINT ACTION_ForceReboot(MSIPACKAGE *package); -extern UINT MSI_Sequence( MSIPACKAGE *package, LPCWSTR szTable, INT iSequenceMode ); -extern UINT MSI_SetFeatureStates( MSIPACKAGE *package ); -extern UINT msi_parse_command_line( MSIPACKAGE *package, LPCWSTR szCommandLine, - BOOL preserve_case ); +extern UINT MSI_InstallPackage( MSIPACKAGE *, LPCWSTR, LPCWSTR ) DECLSPEC_HIDDEN; +extern UINT ACTION_DialogBox( MSIPACKAGE*, LPCWSTR) DECLSPEC_HIDDEN; +extern UINT ACTION_ForceReboot(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT MSI_Sequence( MSIPACKAGE *package, LPCWSTR szTable ) DECLSPEC_HIDDEN; +extern UINT MSI_SetFeatureStates( MSIPACKAGE *package ) DECLSPEC_HIDDEN; +extern UINT msi_parse_command_line( MSIPACKAGE *package, LPCWSTR szCommandLine, BOOL preserve_case ) DECLSPEC_HIDDEN; +extern UINT msi_schedule_action( MSIPACKAGE *package, UINT script, const WCHAR *action ) DECLSPEC_HIDDEN; +extern INSTALLSTATE msi_get_component_action( MSIPACKAGE *package, MSICOMPONENT *comp ) DECLSPEC_HIDDEN; +extern INSTALLSTATE msi_get_feature_action( MSIPACKAGE *package, MSIFEATURE *feature ) DECLSPEC_HIDDEN; +extern UINT msi_load_all_components( MSIPACKAGE *package ) DECLSPEC_HIDDEN; +extern UINT msi_load_all_features( MSIPACKAGE *package ) DECLSPEC_HIDDEN; +extern UINT msi_validate_product_id( MSIPACKAGE *package ) DECLSPEC_HIDDEN; /* record internals */ -extern void MSI_CloseRecord( MSIOBJECTHDR * ); -extern UINT MSI_RecordSetIStream( MSIRECORD *, UINT, IStream *); -extern UINT MSI_RecordGetIStream( MSIRECORD *, UINT, IStream **); -extern const WCHAR *MSI_RecordGetString( const MSIRECORD *, UINT ); -extern MSIRECORD *MSI_CreateRecord( UINT ); -extern UINT MSI_RecordSetInteger( MSIRECORD *, UINT, int ); -extern UINT MSI_RecordSetIntPtr( MSIRECORD *, UINT, INT_PTR ); -extern UINT MSI_RecordSetStringW( MSIRECORD *, UINT, LPCWSTR ); -extern BOOL MSI_RecordIsNull( MSIRECORD *, UINT ); -extern UINT MSI_RecordGetStringW( MSIRECORD * , UINT, LPWSTR, LPDWORD); -extern UINT MSI_RecordGetStringA( MSIRECORD *, UINT, LPSTR, LPDWORD); -extern int MSI_RecordGetInteger( MSIRECORD *, UINT ); -extern INT_PTR MSI_RecordGetIntPtr( MSIRECORD *, UINT ); -extern UINT MSI_RecordReadStream( MSIRECORD *, UINT, char *, LPDWORD); -extern UINT MSI_RecordSetStream(MSIRECORD *, UINT, IStream *); -extern UINT MSI_RecordGetFieldCount( const MSIRECORD *rec ); -extern UINT MSI_RecordStreamToFile( MSIRECORD *, UINT, LPCWSTR ); -extern UINT MSI_RecordSetStreamFromFileW( MSIRECORD *, UINT, LPCWSTR ); -extern UINT MSI_RecordCopyField( MSIRECORD *, UINT, MSIRECORD *, UINT ); -extern MSIRECORD *MSI_CloneRecord( MSIRECORD * ); -extern BOOL MSI_RecordsAreEqual( MSIRECORD *, MSIRECORD * ); +extern void MSI_CloseRecord( MSIOBJECTHDR * ) DECLSPEC_HIDDEN; +extern UINT MSI_RecordSetIStream( MSIRECORD *, UINT, IStream *) DECLSPEC_HIDDEN; +extern UINT MSI_RecordGetIStream( MSIRECORD *, UINT, IStream **) DECLSPEC_HIDDEN; +extern const WCHAR *MSI_RecordGetString( const MSIRECORD *, UINT ) DECLSPEC_HIDDEN; +extern MSIRECORD *MSI_CreateRecord( UINT ) DECLSPEC_HIDDEN; +extern UINT MSI_RecordSetInteger( MSIRECORD *, UINT, int ) DECLSPEC_HIDDEN; +extern UINT MSI_RecordSetIntPtr( MSIRECORD *, UINT, INT_PTR ) DECLSPEC_HIDDEN; +extern UINT MSI_RecordSetStringW( MSIRECORD *, UINT, LPCWSTR ) DECLSPEC_HIDDEN; +extern BOOL MSI_RecordIsNull( MSIRECORD *, UINT ) DECLSPEC_HIDDEN; +extern UINT MSI_RecordGetStringW( MSIRECORD * , UINT, LPWSTR, LPDWORD) DECLSPEC_HIDDEN; +extern UINT MSI_RecordGetStringA( MSIRECORD *, UINT, LPSTR, LPDWORD) DECLSPEC_HIDDEN; +extern int MSI_RecordGetInteger( MSIRECORD *, UINT ) DECLSPEC_HIDDEN; +extern INT_PTR MSI_RecordGetIntPtr( MSIRECORD *, UINT ) DECLSPEC_HIDDEN; +extern UINT MSI_RecordReadStream( MSIRECORD *, UINT, char *, LPDWORD) DECLSPEC_HIDDEN; +extern UINT MSI_RecordSetStream(MSIRECORD *, UINT, IStream *) DECLSPEC_HIDDEN; +extern UINT MSI_RecordGetFieldCount( const MSIRECORD *rec ) DECLSPEC_HIDDEN; +extern UINT MSI_RecordStreamToFile( MSIRECORD *, UINT, LPCWSTR ) DECLSPEC_HIDDEN; +extern UINT MSI_RecordSetStreamFromFileW( MSIRECORD *, UINT, LPCWSTR ) DECLSPEC_HIDDEN; +extern UINT MSI_RecordCopyField( MSIRECORD *, UINT, MSIRECORD *, UINT ) DECLSPEC_HIDDEN; +extern MSIRECORD *MSI_CloneRecord( MSIRECORD * ) DECLSPEC_HIDDEN; +extern BOOL MSI_RecordsAreEqual( MSIRECORD *, MSIRECORD * ) DECLSPEC_HIDDEN; +extern BOOL MSI_RecordsAreFieldsEqual(MSIRECORD *a, MSIRECORD *b, UINT field) DECLSPEC_HIDDEN; /* stream internals */ -extern void enum_stream_names( IStorage *stg ); -extern LPWSTR encode_streamname(BOOL bTable, LPCWSTR in); -extern BOOL decode_streamname(LPCWSTR in, LPWSTR out); +extern void enum_stream_names( IStorage *stg ) DECLSPEC_HIDDEN; +extern LPWSTR encode_streamname(BOOL bTable, LPCWSTR in) DECLSPEC_HIDDEN; +extern BOOL decode_streamname(LPCWSTR in, LPWSTR out) DECLSPEC_HIDDEN; /* database internals */ -extern UINT db_get_raw_stream( MSIDATABASE *, LPCWSTR, IStream ** ); -void db_destroy_stream( MSIDATABASE *, LPCWSTR ); -extern UINT MSI_OpenDatabaseW( LPCWSTR, LPCWSTR, MSIDATABASE ** ); -extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** ); -extern UINT MSI_OpenQuery( MSIDATABASE *, MSIQUERY **, LPCWSTR, ... ); +extern UINT msi_get_raw_stream( MSIDATABASE *, LPCWSTR, IStream ** ) DECLSPEC_HIDDEN; +extern UINT msi_clone_open_stream( MSIDATABASE *, IStorage *, const WCHAR *, IStream ** ) DECLSPEC_HIDDEN; +void msi_destroy_stream( MSIDATABASE *, const WCHAR * ) DECLSPEC_HIDDEN; +extern UINT MSI_OpenDatabaseW( LPCWSTR, LPCWSTR, MSIDATABASE ** ) DECLSPEC_HIDDEN; +extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** ) DECLSPEC_HIDDEN; +extern UINT MSI_OpenQuery( MSIDATABASE *, MSIQUERY **, LPCWSTR, ... ) DECLSPEC_HIDDEN; typedef UINT (*record_func)( MSIRECORD *, LPVOID ); -extern UINT MSI_IterateRecords( MSIQUERY *, LPDWORD, record_func, LPVOID ); -extern MSIRECORD *MSI_QueryGetRecord( MSIDATABASE *db, LPCWSTR query, ... ); -extern UINT MSI_DatabaseGetPrimaryKeys( MSIDATABASE *, LPCWSTR, MSIRECORD ** ); +extern UINT MSI_IterateRecords( MSIQUERY *, LPDWORD, record_func, LPVOID ) DECLSPEC_HIDDEN; +extern MSIRECORD *MSI_QueryGetRecord( MSIDATABASE *db, LPCWSTR query, ... ) DECLSPEC_HIDDEN; +extern UINT MSI_DatabaseGetPrimaryKeys( MSIDATABASE *, LPCWSTR, MSIRECORD ** ) DECLSPEC_HIDDEN; /* view internals */ -extern UINT MSI_ViewExecute( MSIQUERY*, MSIRECORD * ); -extern UINT MSI_ViewFetch( MSIQUERY*, MSIRECORD ** ); -extern UINT MSI_ViewClose( MSIQUERY* ); -extern UINT MSI_ViewGetColumnInfo(MSIQUERY *, MSICOLINFO, MSIRECORD **); -extern UINT MSI_ViewModify( MSIQUERY *, MSIMODIFY, MSIRECORD * ); -extern UINT VIEW_find_column( MSIVIEW *, LPCWSTR, LPCWSTR, UINT * ); -extern UINT msi_view_get_row(MSIDATABASE *, MSIVIEW *, UINT, MSIRECORD **); +extern UINT MSI_ViewExecute( MSIQUERY*, MSIRECORD * ) DECLSPEC_HIDDEN; +extern UINT MSI_ViewFetch( MSIQUERY*, MSIRECORD ** ) DECLSPEC_HIDDEN; +extern UINT MSI_ViewClose( MSIQUERY* ) DECLSPEC_HIDDEN; +extern UINT MSI_ViewGetColumnInfo(MSIQUERY *, MSICOLINFO, MSIRECORD **) DECLSPEC_HIDDEN; +extern UINT MSI_ViewModify( MSIQUERY *, MSIMODIFY, MSIRECORD * ) DECLSPEC_HIDDEN; +extern UINT VIEW_find_column( MSIVIEW *, LPCWSTR, LPCWSTR, UINT * ) DECLSPEC_HIDDEN; +extern UINT msi_view_get_row(MSIDATABASE *, MSIVIEW *, UINT, MSIRECORD **) DECLSPEC_HIDDEN; /* install internals */ -extern UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel ); +extern UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel ) DECLSPEC_HIDDEN; /* package internals */ -extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *, LPCWSTR ); -extern UINT MSI_OpenPackageW( LPCWSTR szPackage, MSIPACKAGE **pPackage ); -extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR ); -extern INT MSI_ProcessMessage( MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD * ); -extern MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *, LPCWSTR ); -extern UINT MSI_GetComponentStateW( MSIPACKAGE *, LPCWSTR, INSTALLSTATE *, INSTALLSTATE * ); -extern UINT MSI_GetFeatureStateW( MSIPACKAGE *, LPCWSTR, INSTALLSTATE *, INSTALLSTATE * ); -extern UINT WINAPI MSI_SetFeatureStateW(MSIPACKAGE*, LPCWSTR, INSTALLSTATE ); -extern UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename ); -extern UINT msi_package_add_info(MSIPACKAGE *, DWORD, DWORD, LPCWSTR, LPWSTR); -extern UINT msi_package_add_media_disk(MSIPACKAGE *, DWORD, DWORD, DWORD, LPWSTR, LPWSTR); -extern UINT msi_clone_properties(MSIPACKAGE *); -extern UINT msi_set_context(MSIPACKAGE *); -extern void msi_adjust_privilege_properties(MSIPACKAGE *); -extern UINT MSI_GetFeatureCost(MSIPACKAGE *, MSIFEATURE *, MSICOSTTREE, INSTALLSTATE, LPINT); +extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *, LPCWSTR ) DECLSPEC_HIDDEN; +extern UINT MSI_OpenPackageW( LPCWSTR szPackage, MSIPACKAGE **pPackage ) DECLSPEC_HIDDEN; +extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR ) DECLSPEC_HIDDEN; +extern INT MSI_ProcessMessage( MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD * ) DECLSPEC_HIDDEN; +extern MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *, LPCWSTR ) DECLSPEC_HIDDEN; +extern UINT MSI_GetComponentStateW( MSIPACKAGE *, LPCWSTR, INSTALLSTATE *, INSTALLSTATE * ) DECLSPEC_HIDDEN; +extern UINT MSI_GetFeatureStateW( MSIPACKAGE *, LPCWSTR, INSTALLSTATE *, INSTALLSTATE * ) DECLSPEC_HIDDEN; +extern UINT MSI_SetFeatureStateW(MSIPACKAGE*, LPCWSTR, INSTALLSTATE ) DECLSPEC_HIDDEN; +extern UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename ) DECLSPEC_HIDDEN; +extern UINT msi_package_add_info(MSIPACKAGE *, DWORD, DWORD, LPCWSTR, LPWSTR) DECLSPEC_HIDDEN; +extern UINT msi_package_add_media_disk(MSIPACKAGE *, DWORD, DWORD, DWORD, LPWSTR, LPWSTR) DECLSPEC_HIDDEN; +extern UINT msi_clone_properties(MSIPACKAGE *) DECLSPEC_HIDDEN; +extern UINT msi_set_context(MSIPACKAGE *) DECLSPEC_HIDDEN; +extern void msi_adjust_privilege_properties(MSIPACKAGE *) DECLSPEC_HIDDEN; +extern UINT MSI_GetFeatureCost(MSIPACKAGE *, MSIFEATURE *, MSICOSTTREE, INSTALLSTATE, LPINT) DECLSPEC_HIDDEN; /* for deformating */ -extern UINT MSI_FormatRecordW( MSIPACKAGE *, MSIRECORD *, LPWSTR, LPDWORD ); +extern UINT MSI_FormatRecordW( MSIPACKAGE *, MSIRECORD *, LPWSTR, LPDWORD ) DECLSPEC_HIDDEN; /* registry data encoding/decoding functions */ -extern BOOL unsquash_guid(LPCWSTR in, LPWSTR out); -extern BOOL squash_guid(LPCWSTR in, LPWSTR out); -extern BOOL encode_base85_guid(GUID *,LPWSTR); -extern BOOL decode_base85_guid(LPCWSTR,GUID*); -extern UINT MSIREG_OpenUninstallKey(MSIPACKAGE *package, HKEY *key, BOOL create); -extern UINT MSIREG_DeleteUninstallKey(MSIPACKAGE *package); +extern BOOL unsquash_guid(LPCWSTR in, LPWSTR out) DECLSPEC_HIDDEN; +extern BOOL squash_guid(LPCWSTR in, LPWSTR out) DECLSPEC_HIDDEN; +extern BOOL encode_base85_guid(GUID *,LPWSTR) DECLSPEC_HIDDEN; +extern BOOL decode_base85_guid(LPCWSTR,GUID*) DECLSPEC_HIDDEN; +extern UINT MSIREG_OpenUninstallKey(const WCHAR *, enum platform, HKEY *, BOOL) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteUninstallKey(const WCHAR *, enum platform) DECLSPEC_HIDDEN; extern UINT MSIREG_OpenProductKey(LPCWSTR szProduct, LPCWSTR szUserSid, - MSIINSTALLCONTEXT context, HKEY* key, BOOL create); + MSIINSTALLCONTEXT context, HKEY* key, BOOL create) DECLSPEC_HIDDEN; extern UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, - HKEY *key, BOOL create); -extern UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create); + HKEY *key, BOOL create) DECLSPEC_HIDDEN; +extern UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create) DECLSPEC_HIDDEN; UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, - HKEY *key, BOOL create); -extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create); + HKEY *key, BOOL create) DECLSPEC_HIDDEN; +extern UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create) DECLSPEC_HIDDEN; extern UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid, - HKEY *key, BOOL create); -extern UINT MSIREG_OpenPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create); + HKEY *key, BOOL create) DECLSPEC_HIDDEN; +extern UINT MSIREG_OpenPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create) DECLSPEC_HIDDEN; extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext, - LPCWSTR szUserSid, HKEY *key, BOOL create); + LPCWSTR szUserSid, HKEY *key, BOOL create) DECLSPEC_HIDDEN; extern UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext, - HKEY *key, BOOL create); + HKEY *key, BOOL create) DECLSPEC_HIDDEN; extern UINT MSIREG_OpenUserDataProductPatchesKey(LPCWSTR product, MSIINSTALLCONTEXT context, - HKEY *key, BOOL create); + HKEY *key, BOOL create) DECLSPEC_HIDDEN; extern UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext, - LPCWSTR szUserSid, HKEY *key, BOOL create); -extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create); -extern UINT MSIREG_OpenUserUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create); -extern UINT MSIREG_DeleteProductKey(LPCWSTR szProduct); -extern UINT MSIREG_DeleteUserProductKey(LPCWSTR szProduct); -extern UINT MSIREG_DeleteUserDataPatchKey(LPCWSTR patch, MSIINSTALLCONTEXT context); -extern UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct); -extern UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct); -extern UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid); -extern UINT MSIREG_DeleteUserUpgradeCodesKey(LPCWSTR szUpgradeCode); -extern UINT MSIREG_DeleteClassesUpgradeCodesKey(LPCWSTR szUpgradeCode); -extern UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL create); -extern UINT MSIREG_DeleteLocalClassesProductKey(LPCWSTR szProductCode); -extern UINT MSIREG_DeleteLocalClassesFeaturesKey(LPCWSTR szProductCode); + LPCWSTR szUserSid, HKEY *key, BOOL create) DECLSPEC_HIDDEN; +extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create) DECLSPEC_HIDDEN; +extern UINT MSIREG_OpenUserUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteProductKey(LPCWSTR szProduct) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteUserProductKey(LPCWSTR szProduct) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteUserDataPatchKey(LPCWSTR patch, MSIINSTALLCONTEXT context) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteUserUpgradeCodesKey(LPCWSTR szUpgradeCode) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteClassesUpgradeCodesKey(LPCWSTR szUpgradeCode) DECLSPEC_HIDDEN; +extern UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL create) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteLocalClassesProductKey(LPCWSTR szProductCode) DECLSPEC_HIDDEN; +extern UINT MSIREG_DeleteLocalClassesFeaturesKey(LPCWSTR szProductCode) DECLSPEC_HIDDEN; +extern UINT msi_locate_product(LPCWSTR szProduct, MSIINSTALLCONTEXT *context) DECLSPEC_HIDDEN; +extern LPWSTR msi_reg_get_val_str( HKEY hkey, LPCWSTR name ) DECLSPEC_HIDDEN; +extern BOOL msi_reg_get_val_dword( HKEY hkey, LPCWSTR name, DWORD *val) DECLSPEC_HIDDEN; -extern LPWSTR msi_reg_get_val_str( HKEY hkey, LPCWSTR name ); -extern BOOL msi_reg_get_val_dword( HKEY hkey, LPCWSTR name, DWORD *val); +extern DWORD msi_version_str_to_dword(LPCWSTR p) DECLSPEC_HIDDEN; +extern void msi_parse_version_string(LPCWSTR, PDWORD, PDWORD) DECLSPEC_HIDDEN; +extern VS_FIXEDFILEINFO *msi_get_disk_file_version(LPCWSTR) DECLSPEC_HIDDEN; +extern int msi_compare_file_versions(VS_FIXEDFILEINFO *, const WCHAR *) DECLSPEC_HIDDEN; +extern int msi_compare_font_versions(const WCHAR *, const WCHAR *) DECLSPEC_HIDDEN; +extern DWORD msi_get_disk_file_size(LPCWSTR) DECLSPEC_HIDDEN; +extern BOOL msi_file_hash_matches(MSIFILE *) DECLSPEC_HIDDEN; -extern DWORD msi_version_str_to_dword(LPCWSTR p); -extern void msi_parse_version_string(LPCWSTR, PDWORD, PDWORD); -extern VS_FIXEDFILEINFO *msi_get_disk_file_version(LPCWSTR); -extern int msi_compare_file_versions(VS_FIXEDFILEINFO *, const WCHAR *); -extern int msi_compare_font_versions(const WCHAR *, const WCHAR *); -extern DWORD msi_get_disk_file_size(LPCWSTR); -extern BOOL msi_file_hash_matches(MSIFILE *); - -extern LONG msi_reg_set_val_str( HKEY hkey, LPCWSTR name, LPCWSTR value ); -extern LONG msi_reg_set_val_multi_str( HKEY hkey, LPCWSTR name, LPCWSTR value ); -extern LONG msi_reg_set_val_dword( HKEY hkey, LPCWSTR name, DWORD val ); -extern LONG msi_reg_set_subkey_val( HKEY hkey, LPCWSTR path, LPCWSTR name, LPCWSTR val ); +extern LONG msi_reg_set_val_str( HKEY hkey, LPCWSTR name, LPCWSTR value ) DECLSPEC_HIDDEN; +extern LONG msi_reg_set_val_multi_str( HKEY hkey, LPCWSTR name, LPCWSTR value ) DECLSPEC_HIDDEN; +extern LONG msi_reg_set_val_dword( HKEY hkey, LPCWSTR name, DWORD val ) DECLSPEC_HIDDEN; +extern LONG msi_reg_set_subkey_val( HKEY hkey, LPCWSTR path, LPCWSTR name, LPCWSTR val ) DECLSPEC_HIDDEN; /* msi dialog interface */ typedef UINT (*msi_dialog_event_handler)( MSIPACKAGE*, LPCWSTR, LPCWSTR, msi_dialog* ); -extern msi_dialog *msi_dialog_create( MSIPACKAGE*, LPCWSTR, msi_dialog*, msi_dialog_event_handler ); -extern UINT msi_dialog_run_message_loop( msi_dialog* ); -extern void msi_dialog_end_dialog( msi_dialog* ); -extern void msi_dialog_check_messages( HANDLE ); -extern void msi_dialog_do_preview( msi_dialog* ); -extern void msi_dialog_destroy( msi_dialog* ); -extern void msi_dialog_unregister_class( void ); -extern void msi_dialog_handle_event( msi_dialog*, LPCWSTR, LPCWSTR, MSIRECORD * ); -extern UINT msi_dialog_reset( msi_dialog *dialog ); -extern UINT msi_dialog_directorylist_up( msi_dialog *dialog ); -extern msi_dialog *msi_dialog_get_parent( msi_dialog *dialog ); -extern LPWSTR msi_dialog_get_name( msi_dialog *dialog ); -extern UINT msi_spawn_error_dialog( MSIPACKAGE*, LPWSTR, LPWSTR ); +extern msi_dialog *msi_dialog_create( MSIPACKAGE*, LPCWSTR, msi_dialog*, msi_dialog_event_handler ) DECLSPEC_HIDDEN; +extern UINT msi_dialog_run_message_loop( msi_dialog* ) DECLSPEC_HIDDEN; +extern void msi_dialog_end_dialog( msi_dialog* ) DECLSPEC_HIDDEN; +extern void msi_dialog_check_messages( HANDLE ) DECLSPEC_HIDDEN; +extern void msi_dialog_destroy( msi_dialog* ) DECLSPEC_HIDDEN; +extern void msi_dialog_unregister_class( void ) DECLSPEC_HIDDEN; +extern void msi_dialog_handle_event( msi_dialog*, LPCWSTR, LPCWSTR, MSIRECORD * ) DECLSPEC_HIDDEN; +extern UINT msi_dialog_reset( msi_dialog *dialog ) DECLSPEC_HIDDEN; +extern UINT msi_dialog_directorylist_up( msi_dialog *dialog ) DECLSPEC_HIDDEN; +extern msi_dialog *msi_dialog_get_parent( msi_dialog *dialog ) DECLSPEC_HIDDEN; +extern LPWSTR msi_dialog_get_name( msi_dialog *dialog ) DECLSPEC_HIDDEN; +extern UINT msi_spawn_error_dialog( MSIPACKAGE*, LPWSTR, LPWSTR ) DECLSPEC_HIDDEN; /* summary information */ -extern MSISUMMARYINFO *MSI_GetSummaryInformationW( IStorage *stg, UINT uiUpdateCount ); -extern LPWSTR msi_suminfo_dup_string( MSISUMMARYINFO *si, UINT uiProperty ); -extern INT msi_suminfo_get_int32( MSISUMMARYINFO *si, UINT uiProperty ); -extern LPWSTR msi_get_suminfo_product( IStorage *stg ); -extern UINT msi_add_suminfo( MSIDATABASE *db, LPWSTR **records, int num_records, int num_columns ); +extern MSISUMMARYINFO *MSI_GetSummaryInformationW( IStorage *stg, UINT uiUpdateCount ) DECLSPEC_HIDDEN; +extern LPWSTR msi_suminfo_dup_string( MSISUMMARYINFO *si, UINT uiProperty ) DECLSPEC_HIDDEN; +extern INT msi_suminfo_get_int32( MSISUMMARYINFO *si, UINT uiProperty ) DECLSPEC_HIDDEN; +extern LPWSTR msi_get_suminfo_product( IStorage *stg ) DECLSPEC_HIDDEN; +extern UINT msi_add_suminfo( MSIDATABASE *db, LPWSTR **records, int num_records, int num_columns ) DECLSPEC_HIDDEN; /* undocumented functions */ UINT WINAPI MsiCreateAndVerifyInstallerDirectory( DWORD ); @@ -903,79 +950,84 @@ LANGID WINAPI MsiLoadStringW( MSIHANDLE, UINT, LPWSTR, int, LANGID ); LANGID WINAPI MsiLoadStringA( MSIHANDLE, UINT, LPSTR, int, LANGID ); /* UI globals */ -extern INSTALLUILEVEL gUILevel; -extern HWND gUIhwnd; -extern INSTALLUI_HANDLERA gUIHandlerA; -extern INSTALLUI_HANDLERW gUIHandlerW; -extern INSTALLUI_HANDLER_RECORD gUIHandlerRecord; -extern DWORD gUIFilter; -extern LPVOID gUIContext; -extern WCHAR *gszLogFile; -extern HINSTANCE msi_hInstance; +extern INSTALLUILEVEL gUILevel DECLSPEC_HIDDEN; +extern HWND gUIhwnd DECLSPEC_HIDDEN; +extern INSTALLUI_HANDLERA gUIHandlerA DECLSPEC_HIDDEN; +extern INSTALLUI_HANDLERW gUIHandlerW DECLSPEC_HIDDEN; +extern INSTALLUI_HANDLER_RECORD gUIHandlerRecord DECLSPEC_HIDDEN; +extern DWORD gUIFilter DECLSPEC_HIDDEN; +extern LPVOID gUIContext DECLSPEC_HIDDEN; +extern WCHAR *gszLogFile DECLSPEC_HIDDEN; +extern HINSTANCE msi_hInstance DECLSPEC_HIDDEN; /* action related functions */ -extern UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script); -extern UINT ACTION_PerformUIAction(MSIPACKAGE *package, const WCHAR *action, UINT script); -extern void ACTION_FinishCustomActions( const MSIPACKAGE* package); -extern UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action, UINT script, BOOL execute); +extern UINT ACTION_PerformAction(MSIPACKAGE *package, const WCHAR *action, UINT script) DECLSPEC_HIDDEN; +extern UINT ACTION_PerformUIAction(MSIPACKAGE *package, const WCHAR *action, UINT script) DECLSPEC_HIDDEN; +extern void ACTION_FinishCustomActions( const MSIPACKAGE* package) DECLSPEC_HIDDEN; +extern UINT ACTION_CustomAction(MSIPACKAGE *package,const WCHAR *action, UINT script, BOOL execute) DECLSPEC_HIDDEN; /* actions in other modules */ -extern UINT ACTION_AppSearch(MSIPACKAGE *package); -extern UINT ACTION_CCPSearch(MSIPACKAGE *package); -extern UINT ACTION_FindRelatedProducts(MSIPACKAGE *package); -extern UINT ACTION_InstallFiles(MSIPACKAGE *package); -extern UINT ACTION_RemoveFiles(MSIPACKAGE *package); -extern UINT ACTION_MoveFiles(MSIPACKAGE *package); -extern UINT ACTION_DuplicateFiles(MSIPACKAGE *package); -extern UINT ACTION_RemoveDuplicateFiles(MSIPACKAGE *package); -extern UINT ACTION_RegisterClassInfo(MSIPACKAGE *package); -extern UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package); -extern UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package); -extern UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package); -extern UINT ACTION_RegisterFonts(MSIPACKAGE *package); -extern UINT ACTION_UnregisterClassInfo(MSIPACKAGE *package); -extern UINT ACTION_UnregisterExtensionInfo(MSIPACKAGE *package); -extern UINT ACTION_UnregisterFonts(MSIPACKAGE *package); -extern UINT ACTION_UnregisterMIMEInfo(MSIPACKAGE *package); -extern UINT ACTION_UnregisterProgIdInfo(MSIPACKAGE *package); -extern UINT ACTION_MsiPublishAssemblies(MSIPACKAGE *package); -extern UINT ACTION_MsiUnpublishAssemblies(MSIPACKAGE *package); +extern UINT ACTION_AppSearch(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_CCPSearch(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_FindRelatedProducts(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_InstallFiles(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_PatchFiles( MSIPACKAGE *package ) DECLSPEC_HIDDEN; +extern UINT ACTION_RemoveFiles(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_MoveFiles(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_DuplicateFiles(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_RemoveDuplicateFiles(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_RegisterClassInfo(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_RegisterFonts(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_UnregisterClassInfo(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_UnregisterExtensionInfo(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_UnregisterFonts(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_UnregisterMIMEInfo(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_UnregisterProgIdInfo(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_MsiPublishAssemblies(MSIPACKAGE *package) DECLSPEC_HIDDEN; +extern UINT ACTION_MsiUnpublishAssemblies(MSIPACKAGE *package) DECLSPEC_HIDDEN; /* Helpers */ -extern DWORD deformat_string(MSIPACKAGE *package, LPCWSTR ptr, WCHAR** data ); -extern LPWSTR msi_dup_record_field(MSIRECORD *row, INT index); -extern LPWSTR msi_dup_property( MSIDATABASE *db, LPCWSTR prop ); -extern UINT msi_set_property( MSIDATABASE *, LPCWSTR, LPCWSTR ); -extern UINT msi_get_property( MSIDATABASE *, LPCWSTR, LPWSTR, LPDWORD ); -extern int msi_get_property_int( MSIDATABASE *package, LPCWSTR prop, int def ); -extern LPWSTR resolve_source_folder(MSIPACKAGE *package, LPCWSTR name, MSIFOLDER **folder); -extern LPWSTR resolve_target_folder(MSIPACKAGE *package, LPCWSTR name, BOOL set_prop, BOOL load_prop, MSIFOLDER **folder); -extern LPWSTR resolve_file_source(MSIPACKAGE *package, MSIFILE *file); -extern void msi_reset_folders( MSIPACKAGE *package, BOOL source ); -extern MSICOMPONENT *get_loaded_component( MSIPACKAGE* package, LPCWSTR Component ); -extern MSIFEATURE *get_loaded_feature( MSIPACKAGE* package, LPCWSTR Feature ); -extern MSIFILE *get_loaded_file( MSIPACKAGE* package, LPCWSTR file ); -extern MSIFOLDER *get_loaded_folder( MSIPACKAGE *package, LPCWSTR dir ); -extern int track_tempfile(MSIPACKAGE *package, LPCWSTR path); -extern UINT schedule_action(MSIPACKAGE *package, UINT script, LPCWSTR action); -extern void msi_free_action_script(MSIPACKAGE *package, UINT script); -extern LPWSTR build_icon_path(MSIPACKAGE *, LPCWSTR); -extern LPWSTR build_directory_name(DWORD , ...); -extern BOOL create_full_pathW(const WCHAR *path); -extern void reduce_to_longfilename(WCHAR*); -extern LPWSTR create_component_advertise_string(MSIPACKAGE*, MSICOMPONENT*, LPCWSTR); -extern void ACTION_UpdateComponentStates(MSIPACKAGE *package, MSIFEATURE *feature); -extern UINT register_unique_action(MSIPACKAGE *, LPCWSTR); -extern BOOL check_unique_action(const MSIPACKAGE *, LPCWSTR); -extern WCHAR* generate_error_string(MSIPACKAGE *, UINT, DWORD, ... ); +extern DWORD deformat_string(MSIPACKAGE *package, LPCWSTR ptr, WCHAR** data ) DECLSPEC_HIDDEN; +extern WCHAR *msi_dup_record_field(MSIRECORD *row, INT index) DECLSPEC_HIDDEN; +extern LPWSTR msi_dup_property( MSIDATABASE *db, LPCWSTR prop ) DECLSPEC_HIDDEN; +extern UINT msi_set_property( MSIDATABASE *, LPCWSTR, LPCWSTR ) DECLSPEC_HIDDEN; +extern UINT msi_get_property( MSIDATABASE *, LPCWSTR, LPWSTR, LPDWORD ) DECLSPEC_HIDDEN; +extern int msi_get_property_int( MSIDATABASE *package, LPCWSTR prop, int def ) DECLSPEC_HIDDEN; +extern WCHAR *msi_resolve_source_folder(MSIPACKAGE *package, const WCHAR *name, MSIFOLDER **folder) DECLSPEC_HIDDEN; +extern void msi_resolve_target_folder(MSIPACKAGE *package, const WCHAR *name, BOOL load_prop) DECLSPEC_HIDDEN; +extern WCHAR *msi_normalize_path(const WCHAR *) DECLSPEC_HIDDEN; +extern WCHAR *msi_resolve_file_source(MSIPACKAGE *package, MSIFILE *file) DECLSPEC_HIDDEN; +extern const WCHAR *msi_get_target_folder(MSIPACKAGE *package, const WCHAR *name) DECLSPEC_HIDDEN; +extern void msi_reset_folders( MSIPACKAGE *package, BOOL source ) DECLSPEC_HIDDEN; +extern MSICOMPONENT *msi_get_loaded_component(MSIPACKAGE *package, const WCHAR *Component) DECLSPEC_HIDDEN; +extern MSIFEATURE *msi_get_loaded_feature(MSIPACKAGE *package, const WCHAR *Feature) DECLSPEC_HIDDEN; +extern MSIFILE *msi_get_loaded_file(MSIPACKAGE *package, const WCHAR *file) DECLSPEC_HIDDEN; +extern MSIFILEPATCH *msi_get_loaded_filepatch(MSIPACKAGE* package, const WCHAR *key) DECLSPEC_HIDDEN; +extern MSIFOLDER *msi_get_loaded_folder(MSIPACKAGE *package, const WCHAR *dir) DECLSPEC_HIDDEN; +extern int msi_track_tempfile(MSIPACKAGE *package, const WCHAR *path) DECLSPEC_HIDDEN; +extern void msi_free_action_script(MSIPACKAGE *package, UINT script) DECLSPEC_HIDDEN; +extern WCHAR *msi_build_icon_path(MSIPACKAGE *, const WCHAR *) DECLSPEC_HIDDEN; +extern WCHAR *msi_build_directory_name(DWORD , ...) DECLSPEC_HIDDEN; +extern BOOL msi_create_full_path(const WCHAR *path) DECLSPEC_HIDDEN; +extern void msi_reduce_to_long_filename(WCHAR *) DECLSPEC_HIDDEN; +extern WCHAR *msi_create_component_advertise_string(MSIPACKAGE *, MSICOMPONENT *, const WCHAR *) DECLSPEC_HIDDEN; +extern void ACTION_UpdateComponentStates(MSIPACKAGE *package, MSIFEATURE *feature) DECLSPEC_HIDDEN; +extern UINT msi_register_unique_action(MSIPACKAGE *, const WCHAR *) DECLSPEC_HIDDEN; +extern BOOL msi_action_is_unique(const MSIPACKAGE *, const WCHAR *) DECLSPEC_HIDDEN; +extern WCHAR *msi_build_error_string(MSIPACKAGE *, UINT, DWORD, ...) DECLSPEC_HIDDEN; extern UINT msi_set_last_used_source(LPCWSTR product, LPCWSTR usersid, - MSIINSTALLCONTEXT context, DWORD options, LPCWSTR value); -extern UINT msi_get_local_package_name(LPWSTR path, LPCWSTR suffix); -extern UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace); -extern MSIASSEMBLY *load_assembly(MSIPACKAGE *, MSICOMPONENT *); -extern UINT install_assembly(MSIPACKAGE *, MSICOMPONENT *); -extern WCHAR *font_version_from_file(const WCHAR *); -extern WCHAR **msi_split_string(const WCHAR *, WCHAR); + MSIINSTALLCONTEXT context, DWORD options, LPCWSTR value) DECLSPEC_HIDDEN; +extern UINT msi_create_empty_local_file(LPWSTR path, LPCWSTR suffix) DECLSPEC_HIDDEN; +extern UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace) DECLSPEC_HIDDEN; +extern MSIASSEMBLY *msi_load_assembly(MSIPACKAGE *, MSICOMPONENT *) DECLSPEC_HIDDEN; +extern UINT msi_install_assembly(MSIPACKAGE *, MSICOMPONENT *) DECLSPEC_HIDDEN; +extern BOOL msi_init_assembly_caches(MSIPACKAGE *) DECLSPEC_HIDDEN; +extern void msi_destroy_assembly_caches(MSIPACKAGE *) DECLSPEC_HIDDEN; +extern WCHAR *msi_font_version_from_file(const WCHAR *) DECLSPEC_HIDDEN; +extern WCHAR **msi_split_string(const WCHAR *, WCHAR) DECLSPEC_HIDDEN; /* media */ @@ -993,35 +1045,37 @@ typedef struct PVOID user; } MSICABDATA; -extern UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi); -extern UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi); -extern void msi_free_media_info(MSIMEDIAINFO *mi); -extern BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data); +extern UINT ready_media(MSIPACKAGE *package, BOOL compressed, MSIMEDIAINFO *mi) DECLSPEC_HIDDEN; +extern UINT msi_load_media_info(MSIPACKAGE *package, UINT Sequence, MSIMEDIAINFO *mi) DECLSPEC_HIDDEN; +extern void msi_free_media_info(MSIMEDIAINFO *mi) DECLSPEC_HIDDEN; +extern BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data) DECLSPEC_HIDDEN; +extern UINT msi_add_cabinet_stream(MSIPACKAGE *, UINT, IStorage *, const WCHAR *) DECLSPEC_HIDDEN; /* control event stuff */ extern VOID ControlEvent_FireSubscribedEvent(MSIPACKAGE *package, LPCWSTR event, - MSIRECORD *data); -extern VOID ControlEvent_CleanupDialogSubscriptions(MSIPACKAGE *package, LPWSTR dialog); -extern VOID ControlEvent_CleanupSubscriptions(MSIPACKAGE *package); + MSIRECORD *data) DECLSPEC_HIDDEN; +extern VOID ControlEvent_CleanupDialogSubscriptions(MSIPACKAGE *package, LPWSTR dialog) DECLSPEC_HIDDEN; +extern VOID ControlEvent_CleanupSubscriptions(MSIPACKAGE *package) DECLSPEC_HIDDEN; extern VOID ControlEvent_SubscribeToEvent(MSIPACKAGE *package, msi_dialog *dialog, - LPCWSTR event, LPCWSTR control, LPCWSTR attribute); + LPCWSTR event, LPCWSTR control, LPCWSTR attribute) DECLSPEC_HIDDEN; /* OLE automation */ -extern HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj); -extern HRESULT create_session(MSIHANDLE msiHandle, IDispatch *pInstaller, IDispatch **pDispatch); -extern HRESULT load_type_info(IDispatch *iface, ITypeInfo **pptinfo, REFIID clsid, LCID lcid); +extern HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; +extern HRESULT create_session(MSIHANDLE msiHandle, IDispatch *pInstaller, IDispatch **pDispatch) DECLSPEC_HIDDEN; +extern HRESULT load_type_info(IDispatch *iface, ITypeInfo **pptinfo, REFIID clsid, LCID lcid) DECLSPEC_HIDDEN; /* Scripting */ -extern DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function, LPCWSTR action); +extern DWORD call_script(MSIHANDLE hPackage, INT type, LPCWSTR script, LPCWSTR function, LPCWSTR action) DECLSPEC_HIDDEN; -/* User Interface messages from the actions */ -extern void ui_progress(MSIPACKAGE *, int, int, int, int); -extern void ui_actiondata(MSIPACKAGE *, LPCWSTR, MSIRECORD *); +/* User interface messages from the actions */ +extern void msi_ui_progress(MSIPACKAGE *, int, int, int, int) DECLSPEC_HIDDEN; +extern void msi_ui_actiondata(MSIPACKAGE *, const WCHAR *, MSIRECORD *) DECLSPEC_HIDDEN; /* common strings */ -static const WCHAR cszSourceDir[] = {'S','o','u','r','c','e','D','i','r',0}; -static const WCHAR cszSOURCEDIR[] = {'S','O','U','R','C','E','D','I','R',0}; -static const WCHAR cszRootDrive[] = {'R','O','O','T','D','R','I','V','E',0}; +static const WCHAR szSourceDir[] = {'S','o','u','r','c','e','D','i','r',0}; +static const WCHAR szSOURCEDIR[] = {'S','O','U','R','C','E','D','I','R',0}; +static const WCHAR szRootDrive[] = {'R','O','O','T','D','R','I','V','E',0}; +static const WCHAR szTargetDir[] = {'T','A','R','G','E','T','D','I','R',0}; static const WCHAR szLocalSid[] = {'S','-','1','-','5','-','1','8',0}; static const WCHAR szEmpty[] = {0}; static const WCHAR szAll[] = {'A','L','L',0}; @@ -1052,6 +1106,7 @@ static const WCHAR szRegisterMIMEInfo[] = {'R','e','g','i','s','t','e','r','M',' static const WCHAR szDuplicateFiles[] = {'D','u','p','l','i','c','a','t','e','F','i','l','e','s',0}; static const WCHAR szRemoveDuplicateFiles[] = {'R','e','m','o','v','e','D','u','p','l','i','c','a','t','e','F','i','l','e','s',0}; static const WCHAR szInstallFiles[] = {'I','n','s','t','a','l','l','F','i','l','e','s',0}; +static const WCHAR szPatchFiles[] = {'P','a','t','c','h','F','i','l','e','s',0}; static const WCHAR szRemoveFiles[] = {'R','e','m','o','v','e','F','i','l','e','s',0}; static const WCHAR szFindRelatedProducts[] = {'F','i','n','d','R','e','l','a','t','e','d','P','r','o','d','u','c','t','s',0}; static const WCHAR szAllUsers[] = {'A','L','L','U','S','E','R','S',0}; @@ -1097,6 +1152,21 @@ static const WCHAR szWow6432Node[] = {'W','o','w','6','4','3','2','N','o','d','e static const WCHAR szStreams[] = {'_','S','t','r','e','a','m','s',0}; static const WCHAR szStorages[] = {'_','S','t','o','r','a','g','e','s',0}; static const WCHAR szMsiPublishAssemblies[] = {'M','s','i','P','u','b','l','i','s','h','A','s','s','e','m','b','l','i','e','s',0}; +static const WCHAR szCostingComplete[] = {'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0}; +static const WCHAR szTempFolder[] = {'T','e','m','p','F','o','l','d','e','r',0}; +static const WCHAR szDatabase[] = {'D','A','T','A','B','A','S','E',0}; +static const WCHAR szCRoot[] = {'C',':','\\',0}; +static const WCHAR szProductLanguage[] = {'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0}; +static const WCHAR szProductVersion[] = {'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0}; +static const WCHAR szWindowsInstaller[] = {'W','i','n','d','o','w','s','I','n','s','t','a','l','l','e','r',0}; +static const WCHAR szStringData[] = {'_','S','t','r','i','n','g','D','a','t','a',0}; +static const WCHAR szStringPool[] = {'_','S','t','r','i','n','g','P','o','o','l',0}; +static const WCHAR szInstallLevel[] = {'I','N','S','T','A','L','L','L','E','V','E','L',0}; +static const WCHAR szCostInitialize[] = {'C','o','s','t','I','n','i','t','i','a','l','i','z','e',0}; +static const WCHAR szAppDataFolder[] = {'A','p','p','D','a','t','a','F','o','l','d','e','r',0}; +static const WCHAR szRollbackDisabled[] = {'R','o','l','l','b','a','c','k','D','i','s','a','b','l','e','d',0}; +static const WCHAR szName[] = {'N','a','m','e',0}; +static const WCHAR szData[] = {'D','a','t','a',0}; /* memory allocation macro functions */ static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1); diff --git a/reactos/dll/win32/msi/msiquery.c b/reactos/dll/win32/msi/msiquery.c index 4ccf5f65f8f..433b3c772f6 100644 --- a/reactos/dll/win32/msi/msiquery.c +++ b/reactos/dll/win32/msi/msiquery.c @@ -58,8 +58,7 @@ static void MSI_CloseView( MSIOBJECTHDR *arg ) UINT VIEW_find_column( MSIVIEW *table, LPCWSTR name, LPCWSTR table_name, UINT *n ) { - LPWSTR col_name; - LPWSTR haystack_table_name; + LPCWSTR col_name, haystack_table_name; UINT i, count, r; r = table->ops->get_dimensions( table, NULL, &count ); @@ -70,7 +69,6 @@ UINT VIEW_find_column( MSIVIEW *table, LPCWSTR name, LPCWSTR table_name, UINT *n { INT x; - col_name = NULL; r = table->ops->get_column_info( table, i, &col_name, NULL, NULL, &haystack_table_name ); if( r != ERROR_SUCCESS ) @@ -78,15 +76,12 @@ UINT VIEW_find_column( MSIVIEW *table, LPCWSTR name, LPCWSTR table_name, UINT *n x = strcmpW( name, col_name ); if( table_name ) x |= strcmpW( table_name, haystack_table_name ); - msi_free( col_name ); - msi_free( haystack_table_name ); if( !x ) { *n = i; return ERROR_SUCCESS; } } - return ERROR_INVALID_PARAMETER; } @@ -506,6 +501,8 @@ static UINT msi_set_record_type_string( MSIRECORD *rec, UINT field, szType[0] = 'v'; else if (type & MSITYPE_LOCALIZABLE) szType[0] = 'l'; + else if (type & MSITYPE_UNKNOWN) + szType[0] = 'f'; else if (type & MSITYPE_STRING) { if (temporary) @@ -536,7 +533,7 @@ UINT MSI_ViewGetColumnInfo( MSIQUERY *query, MSICOLINFO info, MSIRECORD **prec ) UINT r = ERROR_FUNCTION_FAILED, i, count = 0, type; MSIRECORD *rec; MSIVIEW *view = query->view; - LPWSTR name; + LPCWSTR name; BOOL temporary; if( !view ) @@ -558,17 +555,14 @@ UINT MSI_ViewGetColumnInfo( MSIQUERY *query, MSICOLINFO info, MSIRECORD **prec ) for( i=0; iops->get_column_info( view, i+1, &name, &type, &temporary, - NULL ); + r = view->ops->get_column_info( view, i+1, &name, &type, &temporary, NULL ); if( r != ERROR_SUCCESS ) continue; if (info == MSICOLINFO_NAMES) MSI_RecordSetStringW( rec, i+1, name ); else msi_set_record_type_string( rec, i+1, type, temporary ); - msi_free( name ); } - *prec = rec; return ERROR_SUCCESS; } @@ -650,66 +644,66 @@ UINT WINAPI MsiViewModify( MSIHANDLE hView, MSIMODIFY eModifyMode, return r; } -MSIDBERROR WINAPI MsiViewGetErrorW( MSIHANDLE handle, LPWSTR szColumnNameBuffer, - LPDWORD pcchBuf ) +MSIDBERROR WINAPI MsiViewGetErrorW( MSIHANDLE handle, LPWSTR buffer, LPDWORD buflen ) { - MSIQUERY *query = NULL; - static const WCHAR szError[] = { 0 }; - MSIDBERROR r = MSIDBERROR_NOERROR; + MSIQUERY *query; + const WCHAR *column; + MSIDBERROR r; DWORD len; - FIXME("%d %p %p - returns empty error string\n", - handle, szColumnNameBuffer, pcchBuf ); + TRACE("%u %p %p\n", handle, buffer, buflen); - if( !pcchBuf ) + if (!buflen) return MSIDBERROR_INVALIDARG; query = msihandle2msiinfo( handle, MSIHANDLETYPE_VIEW ); if( !query ) return MSIDBERROR_INVALIDARG; - len = strlenW( szError ); - if( szColumnNameBuffer ) + if ((r = query->view->error)) column = query->view->error_column; + else column = szEmpty; + + len = strlenW( column ); + if (buffer) { - if( *pcchBuf > len ) - lstrcpyW( szColumnNameBuffer, szError ); + if (*buflen > len) + strcpyW( buffer, column ); else r = MSIDBERROR_MOREDATA; } - *pcchBuf = len; - + *buflen = len; msiobj_release( &query->hdr ); return r; } -MSIDBERROR WINAPI MsiViewGetErrorA( MSIHANDLE handle, LPSTR szColumnNameBuffer, - LPDWORD pcchBuf ) +MSIDBERROR WINAPI MsiViewGetErrorA( MSIHANDLE handle, LPSTR buffer, LPDWORD buflen ) { - static const CHAR szError[] = { 0 }; - MSIQUERY *query = NULL; - MSIDBERROR r = MSIDBERROR_NOERROR; + MSIQUERY *query; + const WCHAR *column; + MSIDBERROR r; DWORD len; - FIXME("%d %p %p - returns empty error string\n", - handle, szColumnNameBuffer, pcchBuf ); + TRACE("%u %p %p\n", handle, buffer, buflen); - if( !pcchBuf ) + if (!buflen) return MSIDBERROR_INVALIDARG; query = msihandle2msiinfo( handle, MSIHANDLETYPE_VIEW ); - if( !query ) + if (!query) return MSIDBERROR_INVALIDARG; - len = strlen( szError ); - if( szColumnNameBuffer ) + if ((r = query->view->error)) column = query->view->error_column; + else column = szEmpty; + + len = WideCharToMultiByte( CP_ACP, 0, column, -1, NULL, 0, NULL, NULL ); + if (buffer) { - if( *pcchBuf > len ) - lstrcpyA( szColumnNameBuffer, szError ); + if (*buflen >= len) + WideCharToMultiByte( CP_ACP, 0, column, -1, buffer, *buflen, NULL, NULL ); else r = MSIDBERROR_MOREDATA; } - *pcchBuf = len; - + *buflen = len - 1; msiobj_release( &query->hdr ); return r; } @@ -839,6 +833,12 @@ UINT WINAPI MsiDatabaseCommit( MSIHANDLE hdb ) return ERROR_SUCCESS; } + if (db->mode == MSIDBOPEN_READONLY) + { + msiobj_release( &db->hdr ); + return ERROR_SUCCESS; + } + /* FIXME: lock the database */ r = MSI_CommitTables( db ); diff --git a/reactos/dll/win32/msi/msiserver.h b/reactos/dll/win32/msi/msiserver.h new file mode 100644 index 00000000000..a925a87e415 --- /dev/null +++ b/reactos/dll/win32/msi/msiserver.h @@ -0,0 +1,2411 @@ +/*** Autogenerated by WIDL 1.3.35 from msiserver.idl - Do not edit ***/ + +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 475 +#endif + +#include +#include + +#if !defined(COM_NO_WINDOWS_H) && !defined(__WINESRC__) +#include +#include +#endif + +#ifndef __WIDL_MSISERVER_H +#define __WIDL_MSISERVER_H + +/* Forward declarations */ + +#ifndef __IWineMsiRemoteDatabase_FWD_DEFINED__ +#define __IWineMsiRemoteDatabase_FWD_DEFINED__ +typedef interface IWineMsiRemoteDatabase IWineMsiRemoteDatabase; +#endif + +#ifndef __IWineMsiRemotePackage_FWD_DEFINED__ +#define __IWineMsiRemotePackage_FWD_DEFINED__ +typedef interface IWineMsiRemotePackage IWineMsiRemotePackage; +#endif + +#ifndef __IWineMsiRemoteCustomAction_FWD_DEFINED__ +#define __IWineMsiRemoteCustomAction_FWD_DEFINED__ +typedef interface IWineMsiRemoteCustomAction IWineMsiRemoteCustomAction; +#endif + +#ifndef __IMsiServer_FWD_DEFINED__ +#define __IMsiServer_FWD_DEFINED__ +typedef interface IMsiServer IMsiServer; +#endif + +#ifndef __IMsiMessage_FWD_DEFINED__ +#define __IMsiMessage_FWD_DEFINED__ +typedef interface IMsiMessage IMsiMessage; +#endif + +#ifndef __IMsiCustomAction_FWD_DEFINED__ +#define __IMsiCustomAction_FWD_DEFINED__ +typedef interface IMsiCustomAction IMsiCustomAction; +#endif + +#ifndef __IMsiRemoteAPI_FWD_DEFINED__ +#define __IMsiRemoteAPI_FWD_DEFINED__ +typedef interface IMsiRemoteAPI IMsiRemoteAPI; +#endif + +#ifndef __MsiServer_FWD_DEFINED__ +#define __MsiServer_FWD_DEFINED__ +typedef struct MsiServer MsiServer; +#endif /* defined __MsiServer_FWD_DEFINED__ */ + +#ifndef __MsiServerMessage_FWD_DEFINED__ +#define __MsiServerMessage_FWD_DEFINED__ +typedef struct MsiServerMessage MsiServerMessage; +#endif /* defined __MsiServerMessage_FWD_DEFINED__ */ + +#ifndef __PSFactoryBuffer_FWD_DEFINED__ +#define __PSFactoryBuffer_FWD_DEFINED__ +typedef struct PSFactoryBuffer PSFactoryBuffer; +#endif /* defined __PSFactoryBuffer_FWD_DEFINED__ */ + +#ifndef __MsiTransform_FWD_DEFINED__ +#define __MsiTransform_FWD_DEFINED__ +typedef struct MsiTransform MsiTransform; +#endif /* defined __MsiTransform_FWD_DEFINED__ */ + +#ifndef __MsiDatabase_FWD_DEFINED__ +#define __MsiDatabase_FWD_DEFINED__ +typedef struct MsiDatabase MsiDatabase; +#endif /* defined __MsiDatabase_FWD_DEFINED__ */ + +#ifndef __MsiPatch_FWD_DEFINED__ +#define __MsiPatch_FWD_DEFINED__ +typedef struct MsiPatch MsiPatch; +#endif /* defined __MsiPatch_FWD_DEFINED__ */ + +#ifndef __MsiServerX3_FWD_DEFINED__ +#define __MsiServerX3_FWD_DEFINED__ +typedef struct MsiServerX3 MsiServerX3; +#endif /* defined __MsiServerX3_FWD_DEFINED__ */ + +#ifndef __WineMsiRemoteCustomAction_FWD_DEFINED__ +#define __WineMsiRemoteCustomAction_FWD_DEFINED__ +typedef struct WineMsiRemoteCustomAction WineMsiRemoteCustomAction; +#endif /* defined __WineMsiRemoteCustomAction_FWD_DEFINED__ */ + +#ifndef __WineMsiRemotePackage_FWD_DEFINED__ +#define __WineMsiRemotePackage_FWD_DEFINED__ +typedef struct WineMsiRemotePackage WineMsiRemotePackage; +#endif /* defined __WineMsiRemotePackage_FWD_DEFINED__ */ + +#ifndef __Installer_FWD_DEFINED__ +#define __Installer_FWD_DEFINED__ +typedef interface Installer Installer; +#endif + +#ifndef __Record_FWD_DEFINED__ +#define __Record_FWD_DEFINED__ +typedef interface Record Record; +#endif + +#ifndef __StringList_FWD_DEFINED__ +#define __StringList_FWD_DEFINED__ +typedef interface StringList StringList; +#endif + +#ifndef __RecordList_FWD_DEFINED__ +#define __RecordList_FWD_DEFINED__ +typedef interface RecordList RecordList; +#endif + +#ifndef __UIPreview_FWD_DEFINED__ +#define __UIPreview_FWD_DEFINED__ +typedef interface UIPreview UIPreview; +#endif + +#ifndef __SummaryInfo_FWD_DEFINED__ +#define __SummaryInfo_FWD_DEFINED__ +typedef interface SummaryInfo SummaryInfo; +#endif + +#ifndef __View_FWD_DEFINED__ +#define __View_FWD_DEFINED__ +typedef interface View View; +#endif + +#ifndef __Database_FWD_DEFINED__ +#define __Database_FWD_DEFINED__ +typedef interface Database Database; +#endif + +#ifndef __Session_FWD_DEFINED__ +#define __Session_FWD_DEFINED__ +typedef interface Session Session; +#endif + +#ifndef __FeatureInfo_FWD_DEFINED__ +#define __FeatureInfo_FWD_DEFINED__ +typedef interface FeatureInfo FeatureInfo; +#endif + +#ifndef __Product_FWD_DEFINED__ +#define __Product_FWD_DEFINED__ +typedef interface Product Product; +#endif + +#ifndef __Patch_FWD_DEFINED__ +#define __Patch_FWD_DEFINED__ +typedef interface Patch Patch; +#endif + +#ifndef __MsiInstaller_FWD_DEFINED__ +#define __MsiInstaller_FWD_DEFINED__ +typedef struct MsiInstaller MsiInstaller; +#endif /* defined __MsiInstaller_FWD_DEFINED__ */ + +/* Headers for imported files */ + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#if 0 +typedef ULONG MSIHANDLE; +typedef int INSTALLMESSAGE; +typedef int MSICONDITION; +typedef int MSIRUNMODE; +typedef int INSTALLSTATE; +#endif +/***************************************************************************** + * IWineMsiRemoteDatabase interface + */ +#ifndef __IWineMsiRemoteDatabase_INTERFACE_DEFINED__ +#define __IWineMsiRemoteDatabase_INTERFACE_DEFINED__ + +DEFINE_GUID(IID_IWineMsiRemoteDatabase, 0x7bde2046, 0xd03b, 0x4ffc, 0xb8,0x4c, 0xa0,0x98,0xf3,0x8c,0xff,0x0b); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("7bde2046-d03b-4ffc-b84c-a098f38cff0b") +IWineMsiRemoteDatabase : public IUnknown +{ + virtual HRESULT STDMETHODCALLTYPE IsTablePersistent( + LPCWSTR table, + MSICONDITION *persistent) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetPrimaryKeys( + LPCWSTR table, + MSIHANDLE *keys) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetSummaryInformation( + UINT updatecount, + MSIHANDLE *suminfo) = 0; + + virtual HRESULT STDMETHODCALLTYPE OpenView( + LPCWSTR query, + MSIHANDLE *view) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetMsiHandle( + MSIHANDLE handle) = 0; + +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(IWineMsiRemoteDatabase, 0x7bde2046, 0xd03b, 0x4ffc, 0xb8,0x4c, 0xa0,0x98,0xf3,0x8c,0xff,0x0b) +#endif +#else +typedef struct IWineMsiRemoteDatabaseVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + IWineMsiRemoteDatabase* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + IWineMsiRemoteDatabase* This); + + ULONG (STDMETHODCALLTYPE *Release)( + IWineMsiRemoteDatabase* This); + + /*** IWineMsiRemoteDatabase methods ***/ + HRESULT (STDMETHODCALLTYPE *IsTablePersistent)( + IWineMsiRemoteDatabase* This, + LPCWSTR table, + MSICONDITION *persistent); + + HRESULT (STDMETHODCALLTYPE *GetPrimaryKeys)( + IWineMsiRemoteDatabase* This, + LPCWSTR table, + MSIHANDLE *keys); + + HRESULT (STDMETHODCALLTYPE *GetSummaryInformation)( + IWineMsiRemoteDatabase* This, + UINT updatecount, + MSIHANDLE *suminfo); + + HRESULT (STDMETHODCALLTYPE *OpenView)( + IWineMsiRemoteDatabase* This, + LPCWSTR query, + MSIHANDLE *view); + + HRESULT (STDMETHODCALLTYPE *SetMsiHandle)( + IWineMsiRemoteDatabase* This, + MSIHANDLE handle); + + END_INTERFACE +} IWineMsiRemoteDatabaseVtbl; +interface IWineMsiRemoteDatabase { + CONST_VTBL IWineMsiRemoteDatabaseVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IWineMsiRemoteDatabase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IWineMsiRemoteDatabase_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IWineMsiRemoteDatabase_Release(This) (This)->lpVtbl->Release(This) +/*** IWineMsiRemoteDatabase methods ***/ +#define IWineMsiRemoteDatabase_IsTablePersistent(This,table,persistent) (This)->lpVtbl->IsTablePersistent(This,table,persistent) +#define IWineMsiRemoteDatabase_GetPrimaryKeys(This,table,keys) (This)->lpVtbl->GetPrimaryKeys(This,table,keys) +#define IWineMsiRemoteDatabase_GetSummaryInformation(This,updatecount,suminfo) (This)->lpVtbl->GetSummaryInformation(This,updatecount,suminfo) +#define IWineMsiRemoteDatabase_OpenView(This,query,view) (This)->lpVtbl->OpenView(This,query,view) +#define IWineMsiRemoteDatabase_SetMsiHandle(This,handle) (This)->lpVtbl->SetMsiHandle(This,handle) +#endif + +#endif + +HRESULT STDMETHODCALLTYPE IWineMsiRemoteDatabase_IsTablePersistent_Proxy( + IWineMsiRemoteDatabase* This, + LPCWSTR table, + MSICONDITION *persistent); +void __RPC_STUB IWineMsiRemoteDatabase_IsTablePersistent_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemoteDatabase_GetPrimaryKeys_Proxy( + IWineMsiRemoteDatabase* This, + LPCWSTR table, + MSIHANDLE *keys); +void __RPC_STUB IWineMsiRemoteDatabase_GetPrimaryKeys_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemoteDatabase_GetSummaryInformation_Proxy( + IWineMsiRemoteDatabase* This, + UINT updatecount, + MSIHANDLE *suminfo); +void __RPC_STUB IWineMsiRemoteDatabase_GetSummaryInformation_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemoteDatabase_OpenView_Proxy( + IWineMsiRemoteDatabase* This, + LPCWSTR query, + MSIHANDLE *view); +void __RPC_STUB IWineMsiRemoteDatabase_OpenView_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemoteDatabase_SetMsiHandle_Proxy( + IWineMsiRemoteDatabase* This, + MSIHANDLE handle); +void __RPC_STUB IWineMsiRemoteDatabase_SetMsiHandle_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); + +#endif /* __IWineMsiRemoteDatabase_INTERFACE_DEFINED__ */ + +/***************************************************************************** + * IWineMsiRemotePackage interface + */ +#ifndef __IWineMsiRemotePackage_INTERFACE_DEFINED__ +#define __IWineMsiRemotePackage_INTERFACE_DEFINED__ + +DEFINE_GUID(IID_IWineMsiRemotePackage, 0x902b3592, 0x9d08, 0x4dfd, 0xa5,0x93, 0xd0,0x7c,0x52,0x54,0x64,0x21); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("902b3592-9d08-4dfd-a593-d07c52546421") +IWineMsiRemotePackage : public IUnknown +{ + virtual HRESULT STDMETHODCALLTYPE SetMsiHandle( + MSIHANDLE handle) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetActiveDatabase( + MSIHANDLE *handle) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetProperty( + BSTR property, + BSTR value, + DWORD *size) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetProperty( + BSTR property, + BSTR value) = 0; + + virtual HRESULT STDMETHODCALLTYPE ProcessMessage( + INSTALLMESSAGE message, + MSIHANDLE record) = 0; + + virtual HRESULT STDMETHODCALLTYPE DoAction( + BSTR action) = 0; + + virtual HRESULT STDMETHODCALLTYPE Sequence( + BSTR table, + int sequence) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetTargetPath( + BSTR folder, + BSTR value, + DWORD *size) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetTargetPath( + BSTR folder, + BSTR value) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetSourcePath( + BSTR folder, + BSTR value, + DWORD *size) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetMode( + MSIRUNMODE mode, + BOOL *ret) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetMode( + MSIRUNMODE mode, + BOOL state) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetFeatureState( + BSTR feature, + INSTALLSTATE *installed, + INSTALLSTATE *action) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetFeatureState( + BSTR feature, + INSTALLSTATE state) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetComponentState( + BSTR component, + INSTALLSTATE *installed, + INSTALLSTATE *action) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetComponentState( + BSTR component, + INSTALLSTATE state) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetLanguage( + LANGID *language) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetInstallLevel( + int level) = 0; + + virtual HRESULT STDMETHODCALLTYPE FormatRecord( + MSIHANDLE record, + BSTR *value) = 0; + + virtual HRESULT STDMETHODCALLTYPE EvaluateCondition( + BSTR condition) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetFeatureCost( + BSTR feature, + INT cost_tree, + INSTALLSTATE state, + INT *cost) = 0; + + virtual HRESULT STDMETHODCALLTYPE EnumComponentCosts( + BSTR component, + DWORD index, + INSTALLSTATE state, + BSTR drive, + DWORD *buflen, + INT *cost, + INT *temp) = 0; + +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(IWineMsiRemotePackage, 0x902b3592, 0x9d08, 0x4dfd, 0xa5,0x93, 0xd0,0x7c,0x52,0x54,0x64,0x21) +#endif +#else +typedef struct IWineMsiRemotePackageVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + IWineMsiRemotePackage* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + IWineMsiRemotePackage* This); + + ULONG (STDMETHODCALLTYPE *Release)( + IWineMsiRemotePackage* This); + + /*** IWineMsiRemotePackage methods ***/ + HRESULT (STDMETHODCALLTYPE *SetMsiHandle)( + IWineMsiRemotePackage* This, + MSIHANDLE handle); + + HRESULT (STDMETHODCALLTYPE *GetActiveDatabase)( + IWineMsiRemotePackage* This, + MSIHANDLE *handle); + + HRESULT (STDMETHODCALLTYPE *GetProperty)( + IWineMsiRemotePackage* This, + BSTR property, + BSTR value, + DWORD *size); + + HRESULT (STDMETHODCALLTYPE *SetProperty)( + IWineMsiRemotePackage* This, + BSTR property, + BSTR value); + + HRESULT (STDMETHODCALLTYPE *ProcessMessage)( + IWineMsiRemotePackage* This, + INSTALLMESSAGE message, + MSIHANDLE record); + + HRESULT (STDMETHODCALLTYPE *DoAction)( + IWineMsiRemotePackage* This, + BSTR action); + + HRESULT (STDMETHODCALLTYPE *Sequence)( + IWineMsiRemotePackage* This, + BSTR table, + int sequence); + + HRESULT (STDMETHODCALLTYPE *GetTargetPath)( + IWineMsiRemotePackage* This, + BSTR folder, + BSTR value, + DWORD *size); + + HRESULT (STDMETHODCALLTYPE *SetTargetPath)( + IWineMsiRemotePackage* This, + BSTR folder, + BSTR value); + + HRESULT (STDMETHODCALLTYPE *GetSourcePath)( + IWineMsiRemotePackage* This, + BSTR folder, + BSTR value, + DWORD *size); + + HRESULT (STDMETHODCALLTYPE *GetMode)( + IWineMsiRemotePackage* This, + MSIRUNMODE mode, + BOOL *ret); + + HRESULT (STDMETHODCALLTYPE *SetMode)( + IWineMsiRemotePackage* This, + MSIRUNMODE mode, + BOOL state); + + HRESULT (STDMETHODCALLTYPE *GetFeatureState)( + IWineMsiRemotePackage* This, + BSTR feature, + INSTALLSTATE *installed, + INSTALLSTATE *action); + + HRESULT (STDMETHODCALLTYPE *SetFeatureState)( + IWineMsiRemotePackage* This, + BSTR feature, + INSTALLSTATE state); + + HRESULT (STDMETHODCALLTYPE *GetComponentState)( + IWineMsiRemotePackage* This, + BSTR component, + INSTALLSTATE *installed, + INSTALLSTATE *action); + + HRESULT (STDMETHODCALLTYPE *SetComponentState)( + IWineMsiRemotePackage* This, + BSTR component, + INSTALLSTATE state); + + HRESULT (STDMETHODCALLTYPE *GetLanguage)( + IWineMsiRemotePackage* This, + LANGID *language); + + HRESULT (STDMETHODCALLTYPE *SetInstallLevel)( + IWineMsiRemotePackage* This, + int level); + + HRESULT (STDMETHODCALLTYPE *FormatRecord)( + IWineMsiRemotePackage* This, + MSIHANDLE record, + BSTR *value); + + HRESULT (STDMETHODCALLTYPE *EvaluateCondition)( + IWineMsiRemotePackage* This, + BSTR condition); + + HRESULT (STDMETHODCALLTYPE *GetFeatureCost)( + IWineMsiRemotePackage* This, + BSTR feature, + INT cost_tree, + INSTALLSTATE state, + INT *cost); + + HRESULT (STDMETHODCALLTYPE *EnumComponentCosts)( + IWineMsiRemotePackage* This, + BSTR component, + DWORD index, + INSTALLSTATE state, + BSTR drive, + DWORD *buflen, + INT *cost, + INT *temp); + + END_INTERFACE +} IWineMsiRemotePackageVtbl; +interface IWineMsiRemotePackage { + CONST_VTBL IWineMsiRemotePackageVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IWineMsiRemotePackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IWineMsiRemotePackage_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IWineMsiRemotePackage_Release(This) (This)->lpVtbl->Release(This) +/*** IWineMsiRemotePackage methods ***/ +#define IWineMsiRemotePackage_SetMsiHandle(This,handle) (This)->lpVtbl->SetMsiHandle(This,handle) +#define IWineMsiRemotePackage_GetActiveDatabase(This,handle) (This)->lpVtbl->GetActiveDatabase(This,handle) +#define IWineMsiRemotePackage_GetProperty(This,property,value,size) (This)->lpVtbl->GetProperty(This,property,value,size) +#define IWineMsiRemotePackage_SetProperty(This,property,value) (This)->lpVtbl->SetProperty(This,property,value) +#define IWineMsiRemotePackage_ProcessMessage(This,message,record) (This)->lpVtbl->ProcessMessage(This,message,record) +#define IWineMsiRemotePackage_DoAction(This,action) (This)->lpVtbl->DoAction(This,action) +#define IWineMsiRemotePackage_Sequence(This,table,sequence) (This)->lpVtbl->Sequence(This,table,sequence) +#define IWineMsiRemotePackage_GetTargetPath(This,folder,value,size) (This)->lpVtbl->GetTargetPath(This,folder,value,size) +#define IWineMsiRemotePackage_SetTargetPath(This,folder,value) (This)->lpVtbl->SetTargetPath(This,folder,value) +#define IWineMsiRemotePackage_GetSourcePath(This,folder,value,size) (This)->lpVtbl->GetSourcePath(This,folder,value,size) +#define IWineMsiRemotePackage_GetMode(This,mode,ret) (This)->lpVtbl->GetMode(This,mode,ret) +#define IWineMsiRemotePackage_SetMode(This,mode,state) (This)->lpVtbl->SetMode(This,mode,state) +#define IWineMsiRemotePackage_GetFeatureState(This,feature,installed,action) (This)->lpVtbl->GetFeatureState(This,feature,installed,action) +#define IWineMsiRemotePackage_SetFeatureState(This,feature,state) (This)->lpVtbl->SetFeatureState(This,feature,state) +#define IWineMsiRemotePackage_GetComponentState(This,component,installed,action) (This)->lpVtbl->GetComponentState(This,component,installed,action) +#define IWineMsiRemotePackage_SetComponentState(This,component,state) (This)->lpVtbl->SetComponentState(This,component,state) +#define IWineMsiRemotePackage_GetLanguage(This,language) (This)->lpVtbl->GetLanguage(This,language) +#define IWineMsiRemotePackage_SetInstallLevel(This,level) (This)->lpVtbl->SetInstallLevel(This,level) +#define IWineMsiRemotePackage_FormatRecord(This,record,value) (This)->lpVtbl->FormatRecord(This,record,value) +#define IWineMsiRemotePackage_EvaluateCondition(This,condition) (This)->lpVtbl->EvaluateCondition(This,condition) +#define IWineMsiRemotePackage_GetFeatureCost(This,feature,cost_tree,state,cost) (This)->lpVtbl->GetFeatureCost(This,feature,cost_tree,state,cost) +#define IWineMsiRemotePackage_EnumComponentCosts(This,component,index,state,drive,buflen,cost,temp) (This)->lpVtbl->EnumComponentCosts(This,component,index,state,drive,buflen,cost,temp) +#endif + +#endif + +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetMsiHandle_Proxy( + IWineMsiRemotePackage* This, + MSIHANDLE handle); +void __RPC_STUB IWineMsiRemotePackage_SetMsiHandle_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetActiveDatabase_Proxy( + IWineMsiRemotePackage* This, + MSIHANDLE *handle); +void __RPC_STUB IWineMsiRemotePackage_GetActiveDatabase_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetProperty_Proxy( + IWineMsiRemotePackage* This, + BSTR property, + BSTR value, + DWORD *size); +void __RPC_STUB IWineMsiRemotePackage_GetProperty_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetProperty_Proxy( + IWineMsiRemotePackage* This, + BSTR property, + BSTR value); +void __RPC_STUB IWineMsiRemotePackage_SetProperty_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_ProcessMessage_Proxy( + IWineMsiRemotePackage* This, + INSTALLMESSAGE message, + MSIHANDLE record); +void __RPC_STUB IWineMsiRemotePackage_ProcessMessage_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_DoAction_Proxy( + IWineMsiRemotePackage* This, + BSTR action); +void __RPC_STUB IWineMsiRemotePackage_DoAction_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_Sequence_Proxy( + IWineMsiRemotePackage* This, + BSTR table, + int sequence); +void __RPC_STUB IWineMsiRemotePackage_Sequence_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetTargetPath_Proxy( + IWineMsiRemotePackage* This, + BSTR folder, + BSTR value, + DWORD *size); +void __RPC_STUB IWineMsiRemotePackage_GetTargetPath_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetTargetPath_Proxy( + IWineMsiRemotePackage* This, + BSTR folder, + BSTR value); +void __RPC_STUB IWineMsiRemotePackage_SetTargetPath_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetSourcePath_Proxy( + IWineMsiRemotePackage* This, + BSTR folder, + BSTR value, + DWORD *size); +void __RPC_STUB IWineMsiRemotePackage_GetSourcePath_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetMode_Proxy( + IWineMsiRemotePackage* This, + MSIRUNMODE mode, + BOOL *ret); +void __RPC_STUB IWineMsiRemotePackage_GetMode_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetMode_Proxy( + IWineMsiRemotePackage* This, + MSIRUNMODE mode, + BOOL state); +void __RPC_STUB IWineMsiRemotePackage_SetMode_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetFeatureState_Proxy( + IWineMsiRemotePackage* This, + BSTR feature, + INSTALLSTATE *installed, + INSTALLSTATE *action); +void __RPC_STUB IWineMsiRemotePackage_GetFeatureState_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetFeatureState_Proxy( + IWineMsiRemotePackage* This, + BSTR feature, + INSTALLSTATE state); +void __RPC_STUB IWineMsiRemotePackage_SetFeatureState_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetComponentState_Proxy( + IWineMsiRemotePackage* This, + BSTR component, + INSTALLSTATE *installed, + INSTALLSTATE *action); +void __RPC_STUB IWineMsiRemotePackage_GetComponentState_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetComponentState_Proxy( + IWineMsiRemotePackage* This, + BSTR component, + INSTALLSTATE state); +void __RPC_STUB IWineMsiRemotePackage_SetComponentState_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetLanguage_Proxy( + IWineMsiRemotePackage* This, + LANGID *language); +void __RPC_STUB IWineMsiRemotePackage_GetLanguage_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetInstallLevel_Proxy( + IWineMsiRemotePackage* This, + int level); +void __RPC_STUB IWineMsiRemotePackage_SetInstallLevel_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_FormatRecord_Proxy( + IWineMsiRemotePackage* This, + MSIHANDLE record, + BSTR *value); +void __RPC_STUB IWineMsiRemotePackage_FormatRecord_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_EvaluateCondition_Proxy( + IWineMsiRemotePackage* This, + BSTR condition); +void __RPC_STUB IWineMsiRemotePackage_EvaluateCondition_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetFeatureCost_Proxy( + IWineMsiRemotePackage* This, + BSTR feature, + INT cost_tree, + INSTALLSTATE state, + INT *cost); +void __RPC_STUB IWineMsiRemotePackage_GetFeatureCost_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); +HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_EnumComponentCosts_Proxy( + IWineMsiRemotePackage* This, + BSTR component, + DWORD index, + INSTALLSTATE state, + BSTR drive, + DWORD *buflen, + INT *cost, + INT *temp); +void __RPC_STUB IWineMsiRemotePackage_EnumComponentCosts_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); + +#endif /* __IWineMsiRemotePackage_INTERFACE_DEFINED__ */ + +/***************************************************************************** + * IWineMsiRemoteCustomAction interface + */ +#ifndef __IWineMsiRemoteCustomAction_INTERFACE_DEFINED__ +#define __IWineMsiRemoteCustomAction_INTERFACE_DEFINED__ + +DEFINE_GUID(IID_IWineMsiRemoteCustomAction, 0x56d58b64, 0x8780, 0x4c22, 0xa8,0xbc, 0x8b,0x0b,0x29,0xe4,0xa9,0xf8); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("56d58b64-8780-4c22-a8bc-8b0b29e4a9f8") +IWineMsiRemoteCustomAction : public IUnknown +{ + virtual HRESULT STDMETHODCALLTYPE GetActionInfo( + LPCGUID guid, + INT *type, + MSIHANDLE *handle, + BSTR *dllname, + BSTR *function, + IWineMsiRemotePackage **package) = 0; + +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(IWineMsiRemoteCustomAction, 0x56d58b64, 0x8780, 0x4c22, 0xa8,0xbc, 0x8b,0x0b,0x29,0xe4,0xa9,0xf8) +#endif +#else +typedef struct IWineMsiRemoteCustomActionVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + IWineMsiRemoteCustomAction* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + IWineMsiRemoteCustomAction* This); + + ULONG (STDMETHODCALLTYPE *Release)( + IWineMsiRemoteCustomAction* This); + + /*** IWineMsiRemoteCustomAction methods ***/ + HRESULT (STDMETHODCALLTYPE *GetActionInfo)( + IWineMsiRemoteCustomAction* This, + LPCGUID guid, + INT *type, + MSIHANDLE *handle, + BSTR *dllname, + BSTR *function, + IWineMsiRemotePackage **package); + + END_INTERFACE +} IWineMsiRemoteCustomActionVtbl; +interface IWineMsiRemoteCustomAction { + CONST_VTBL IWineMsiRemoteCustomActionVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IWineMsiRemoteCustomAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IWineMsiRemoteCustomAction_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IWineMsiRemoteCustomAction_Release(This) (This)->lpVtbl->Release(This) +/*** IWineMsiRemoteCustomAction methods ***/ +#define IWineMsiRemoteCustomAction_GetActionInfo(This,guid,type,handle,dllname,function,package) (This)->lpVtbl->GetActionInfo(This,guid,type,handle,dllname,function,package) +#endif + +#endif + +HRESULT STDMETHODCALLTYPE IWineMsiRemoteCustomAction_GetActionInfo_Proxy( + IWineMsiRemoteCustomAction* This, + LPCGUID guid, + INT *type, + MSIHANDLE *handle, + BSTR *dllname, + BSTR *function, + IWineMsiRemotePackage **package); +void __RPC_STUB IWineMsiRemoteCustomAction_GetActionInfo_Stub( + IRpcStubBuffer* This, + IRpcChannelBuffer* pRpcChannelBuffer, + PRPC_MESSAGE pRpcMessage, + DWORD* pdwStubPhase); + +#endif /* __IWineMsiRemoteCustomAction_INTERFACE_DEFINED__ */ + +/***************************************************************************** + * IMsiServer interface + */ +#ifndef __IMsiServer_INTERFACE_DEFINED__ +#define __IMsiServer_INTERFACE_DEFINED__ + +DEFINE_GUID(IID_IMsiServer, 0x000c101c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c101c-0000-0000-c000-000000000046") +IMsiServer : public IUnknown +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(IMsiServer, 0x000c101c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct IMsiServerVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + IMsiServer* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + IMsiServer* This); + + ULONG (STDMETHODCALLTYPE *Release)( + IMsiServer* This); + + END_INTERFACE +} IMsiServerVtbl; +interface IMsiServer { + CONST_VTBL IMsiServerVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IMsiServer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IMsiServer_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IMsiServer_Release(This) (This)->lpVtbl->Release(This) +#endif + +#endif + + +#endif /* __IMsiServer_INTERFACE_DEFINED__ */ + +/***************************************************************************** + * IMsiMessage interface + */ +#ifndef __IMsiMessage_INTERFACE_DEFINED__ +#define __IMsiMessage_INTERFACE_DEFINED__ + +DEFINE_GUID(IID_IMsiMessage, 0x000c101d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c101d-0000-0000-c000-000000000046") +IMsiMessage : public IUnknown +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(IMsiMessage, 0x000c101d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct IMsiMessageVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + IMsiMessage* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + IMsiMessage* This); + + ULONG (STDMETHODCALLTYPE *Release)( + IMsiMessage* This); + + END_INTERFACE +} IMsiMessageVtbl; +interface IMsiMessage { + CONST_VTBL IMsiMessageVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IMsiMessage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IMsiMessage_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IMsiMessage_Release(This) (This)->lpVtbl->Release(This) +#endif + +#endif + + +#endif /* __IMsiMessage_INTERFACE_DEFINED__ */ + +/***************************************************************************** + * IMsiCustomAction interface + */ +#ifndef __IMsiCustomAction_INTERFACE_DEFINED__ +#define __IMsiCustomAction_INTERFACE_DEFINED__ + +DEFINE_GUID(IID_IMsiCustomAction, 0x000c1025, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c1025-0000-0000-c000-000000000046") +IMsiCustomAction : public IUnknown +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(IMsiCustomAction, 0x000c1025, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct IMsiCustomActionVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + IMsiCustomAction* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + IMsiCustomAction* This); + + ULONG (STDMETHODCALLTYPE *Release)( + IMsiCustomAction* This); + + END_INTERFACE +} IMsiCustomActionVtbl; +interface IMsiCustomAction { + CONST_VTBL IMsiCustomActionVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IMsiCustomAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IMsiCustomAction_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IMsiCustomAction_Release(This) (This)->lpVtbl->Release(This) +#endif + +#endif + + +#endif /* __IMsiCustomAction_INTERFACE_DEFINED__ */ + +/***************************************************************************** + * IMsiRemoteAPI interface + */ +#ifndef __IMsiRemoteAPI_INTERFACE_DEFINED__ +#define __IMsiRemoteAPI_INTERFACE_DEFINED__ + +DEFINE_GUID(IID_IMsiRemoteAPI, 0x000c1033, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c1033-0000-0000-c000-000000000046") +IMsiRemoteAPI : public IUnknown +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(IMsiRemoteAPI, 0x000c1033, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct IMsiRemoteAPIVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + IMsiRemoteAPI* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + IMsiRemoteAPI* This); + + ULONG (STDMETHODCALLTYPE *Release)( + IMsiRemoteAPI* This); + + END_INTERFACE +} IMsiRemoteAPIVtbl; +interface IMsiRemoteAPI { + CONST_VTBL IMsiRemoteAPIVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define IMsiRemoteAPI_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define IMsiRemoteAPI_AddRef(This) (This)->lpVtbl->AddRef(This) +#define IMsiRemoteAPI_Release(This) (This)->lpVtbl->Release(This) +#endif + +#endif + + +#endif /* __IMsiRemoteAPI_INTERFACE_DEFINED__ */ + +/***************************************************************************** + * MsiServer coclass + */ + +DEFINE_GUID(CLSID_MsiServer, 0x000c101c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); + +#ifdef __cplusplus +class DECLSPEC_UUID("000c101c-0000-0000-c000-000000000046") MsiServer; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(MsiServer, 0x000c101c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#endif + +/***************************************************************************** + * MsiServerMessage coclass + */ + +DEFINE_GUID(CLSID_MsiServerMessage, 0x000c101d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); + +#ifdef __cplusplus +class DECLSPEC_UUID("000c101d-0000-0000-c000-000000000046") MsiServerMessage; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(MsiServerMessage, 0x000c101d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#endif + +/***************************************************************************** + * PSFactoryBuffer coclass + */ + +DEFINE_GUID(CLSID_PSFactoryBuffer, 0x000c103e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); + +#ifdef __cplusplus +class DECLSPEC_UUID("000c103e-0000-0000-c000-000000000046") PSFactoryBuffer; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(PSFactoryBuffer, 0x000c103e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#endif + +/***************************************************************************** + * MsiTransform coclass + */ + +DEFINE_GUID(CLSID_MsiTransform, 0x000c1082, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); + +#ifdef __cplusplus +class DECLSPEC_UUID("000c1082-0000-0000-c000-000000000046") MsiTransform; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(MsiTransform, 0x000c1082, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#endif + +/***************************************************************************** + * MsiDatabase coclass + */ + +DEFINE_GUID(CLSID_MsiDatabase, 0x000c1084, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); + +#ifdef __cplusplus +class DECLSPEC_UUID("000c1084-0000-0000-c000-000000000046") MsiDatabase; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(MsiDatabase, 0x000c1084, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#endif + +/***************************************************************************** + * MsiPatch coclass + */ + +DEFINE_GUID(CLSID_MsiPatch, 0x000c1086, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); + +#ifdef __cplusplus +class DECLSPEC_UUID("000c1086-0000-0000-c000-000000000046") MsiPatch; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(MsiPatch, 0x000c1086, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#endif + +/***************************************************************************** + * MsiServerX3 coclass + */ + +DEFINE_GUID(CLSID_MsiServerX3, 0x000c1094, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); + +#ifdef __cplusplus +class DECLSPEC_UUID("000c1094-0000-0000-c000-000000000046") MsiServerX3; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(MsiServerX3, 0x000c1094, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#endif + +/***************************************************************************** + * WineMsiRemoteCustomAction coclass + */ + +DEFINE_GUID(CLSID_WineMsiRemoteCustomAction, 0xba26e6fa, 0x4f27, 0x4f56, 0x95,0x3a, 0x3f,0x90,0x27,0x20,0x18,0xaa); + +#ifdef __cplusplus +class DECLSPEC_UUID("ba26e6fa-4f27-4f56-953a-3f90272018aa") WineMsiRemoteCustomAction; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(WineMsiRemoteCustomAction, 0xba26e6fa, 0x4f27, 0x4f56, 0x95,0x3a, 0x3f,0x90,0x27,0x20,0x18,0xaa) +#endif +#endif + +/***************************************************************************** + * WineMsiRemotePackage coclass + */ + +DEFINE_GUID(CLSID_WineMsiRemotePackage, 0x902b3592, 0x9d08, 0x4dfd, 0xa5,0x93, 0xd0,0x7c,0x52,0x54,0x64,0x21); + +#ifdef __cplusplus +class DECLSPEC_UUID("902b3592-9d08-4dfd-a593-d07c52546421") WineMsiRemotePackage; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(WineMsiRemotePackage, 0x902b3592, 0x9d08, 0x4dfd, 0xa5,0x93, 0xd0,0x7c,0x52,0x54,0x64,0x21) +#endif +#endif + + +DEFINE_GUID(LIBID_WindowsInstaller, 0x000c1092, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); + +#ifndef __Installer_FWD_DEFINED__ +#define __Installer_FWD_DEFINED__ +typedef interface Installer Installer; +#endif + +#ifndef __Record_FWD_DEFINED__ +#define __Record_FWD_DEFINED__ +typedef interface Record Record; +#endif + +#ifndef __Session_FWD_DEFINED__ +#define __Session_FWD_DEFINED__ +typedef interface Session Session; +#endif + +#ifndef __Database_FWD_DEFINED__ +#define __Database_FWD_DEFINED__ +typedef interface Database Database; +#endif + +#ifndef __SummaryInfo_FWD_DEFINED__ +#define __SummaryInfo_FWD_DEFINED__ +typedef interface SummaryInfo SummaryInfo; +#endif + +#ifndef __View_FWD_DEFINED__ +#define __View_FWD_DEFINED__ +typedef interface View View; +#endif + +#ifndef __UIPreview_FWD_DEFINED__ +#define __UIPreview_FWD_DEFINED__ +typedef interface UIPreview UIPreview; +#endif + +#ifndef __FeatureInfo_FWD_DEFINED__ +#define __FeatureInfo_FWD_DEFINED__ +typedef interface FeatureInfo FeatureInfo; +#endif + +#ifndef __RecordList_FWD_DEFINED__ +#define __RecordList_FWD_DEFINED__ +typedef interface RecordList RecordList; +#endif + +#ifndef __StringList_FWD_DEFINED__ +#define __StringList_FWD_DEFINED__ +typedef interface StringList StringList; +#endif + +#ifndef __Product_FWD_DEFINED__ +#define __Product_FWD_DEFINED__ +typedef interface Product Product; +#endif + +#ifndef __Patch_FWD_DEFINED__ +#define __Patch_FWD_DEFINED__ +typedef interface Patch Patch; +#endif + +typedef enum __WIDL_msiserver_generated_name_00000000 { + msiInstallStateNotUsed = -7, + msiInstallStateBadConfig = -6, + msiInstallStateIncomplete = -5, + msiInstallStateSourceAbsent = -4, + msiInstallStateInvalidArg = -2, + msiInstallStateUnknown = -1, + msiInstallStateBroken = 0, + msiInstallStateAdvertised = 1, + msiInstallStateRemoved = 1, + msiInstallStateAbsent = 2, + msiInstallStateLocal = 3, + msiInstallStateSource = 4, + msiInstallStateDefault = 5 +} MsiInstallState; +typedef enum __WIDL_msiserver_generated_name_00000001 { + msiOpenDatabaseModeReadOnly = 0, + msiOpenDatabaseModeTransact = 1, + msiOpenDatabaseModeDirect = 2, + msiOpenDatabaseModeCreate = 3, + msiOpenDatabaseModeCreateDirect = 4, + msiOpenDatabaseModePatchFile = 32 +} MsiOpenDatabaseMode; +typedef enum __WIDL_msiserver_generated_name_00000002 { + msiUILevelNoChange = 0, + msiUILevelDefault = 1, + msiUILevelNone = 2, + msiUILevelBasic = 3, + msiUILevelReduced = 4, + msiUILevelFull = 5, + msiUILevelHideCancel = 32, + msiUILevelProgressOnly = 64, + msiUILevelEndDialog = 128, + msiUILevelSourceResOnly = 256 +} MsiUILevel; +/***************************************************************************** + * Installer dispinterface + */ +#ifndef __Installer_DISPINTERFACE_DEFINED__ +#define __Installer_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_Installer, 0x000c1090, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c1090-0000-0000-c000-000000000046") +Installer : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(Installer, 0x000c1090, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct InstallerVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + Installer* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + Installer* This); + + ULONG (STDMETHODCALLTYPE *Release)( + Installer* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + Installer* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + Installer* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + Installer* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + Installer* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} InstallerVtbl; +interface Installer { + CONST_VTBL InstallerVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define Installer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define Installer_AddRef(This) (This)->lpVtbl->AddRef(This) +#define Installer_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define Installer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define Installer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define Installer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define Installer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __Installer_DISPINTERFACE_DEFINED__ */ + +/***************************************************************************** + * Record dispinterface + */ +#ifndef __Record_DISPINTERFACE_DEFINED__ +#define __Record_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_Record, 0x000c1093, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c1093-0000-0000-c000-000000000046") +Record : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(Record, 0x000c1093, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct RecordVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + Record* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + Record* This); + + ULONG (STDMETHODCALLTYPE *Release)( + Record* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + Record* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + Record* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + Record* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + Record* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} RecordVtbl; +interface Record { + CONST_VTBL RecordVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define Record_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define Record_AddRef(This) (This)->lpVtbl->AddRef(This) +#define Record_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define Record_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define Record_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define Record_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define Record_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __Record_DISPINTERFACE_DEFINED__ */ + +/***************************************************************************** + * StringList dispinterface + */ +#ifndef __StringList_DISPINTERFACE_DEFINED__ +#define __StringList_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_StringList, 0x000c1095, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c1095-0000-0000-c000-000000000046") +StringList : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(StringList, 0x000c1095, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct StringListVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + StringList* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + StringList* This); + + ULONG (STDMETHODCALLTYPE *Release)( + StringList* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + StringList* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + StringList* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + StringList* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + StringList* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} StringListVtbl; +interface StringList { + CONST_VTBL StringListVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define StringList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define StringList_AddRef(This) (This)->lpVtbl->AddRef(This) +#define StringList_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define StringList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define StringList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define StringList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define StringList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __StringList_DISPINTERFACE_DEFINED__ */ + +/***************************************************************************** + * RecordList dispinterface + */ +#ifndef __RecordList_DISPINTERFACE_DEFINED__ +#define __RecordList_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_RecordList, 0x000c1096, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c1096-0000-0000-c000-000000000046") +RecordList : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(RecordList, 0x000c1096, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct RecordListVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + RecordList* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + RecordList* This); + + ULONG (STDMETHODCALLTYPE *Release)( + RecordList* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + RecordList* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + RecordList* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + RecordList* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + RecordList* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} RecordListVtbl; +interface RecordList { + CONST_VTBL RecordListVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define RecordList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define RecordList_AddRef(This) (This)->lpVtbl->AddRef(This) +#define RecordList_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define RecordList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define RecordList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define RecordList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define RecordList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __RecordList_DISPINTERFACE_DEFINED__ */ + +/***************************************************************************** + * UIPreview dispinterface + */ +#ifndef __UIPreview_DISPINTERFACE_DEFINED__ +#define __UIPreview_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_UIPreview, 0x000c109a, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c109a-0000-0000-c000-000000000046") +UIPreview : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(UIPreview, 0x000c109a, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct UIPreviewVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + UIPreview* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + UIPreview* This); + + ULONG (STDMETHODCALLTYPE *Release)( + UIPreview* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + UIPreview* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + UIPreview* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + UIPreview* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + UIPreview* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} UIPreviewVtbl; +interface UIPreview { + CONST_VTBL UIPreviewVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define UIPreview_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define UIPreview_AddRef(This) (This)->lpVtbl->AddRef(This) +#define UIPreview_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define UIPreview_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define UIPreview_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define UIPreview_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define UIPreview_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __UIPreview_DISPINTERFACE_DEFINED__ */ + +/***************************************************************************** + * SummaryInfo dispinterface + */ +#ifndef __SummaryInfo_DISPINTERFACE_DEFINED__ +#define __SummaryInfo_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_SummaryInfo, 0x000c109b, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c109b-0000-0000-c000-000000000046") +SummaryInfo : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(SummaryInfo, 0x000c109b, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct SummaryInfoVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + SummaryInfo* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + SummaryInfo* This); + + ULONG (STDMETHODCALLTYPE *Release)( + SummaryInfo* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + SummaryInfo* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + SummaryInfo* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + SummaryInfo* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + SummaryInfo* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} SummaryInfoVtbl; +interface SummaryInfo { + CONST_VTBL SummaryInfoVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define SummaryInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define SummaryInfo_AddRef(This) (This)->lpVtbl->AddRef(This) +#define SummaryInfo_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define SummaryInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define SummaryInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define SummaryInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define SummaryInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __SummaryInfo_DISPINTERFACE_DEFINED__ */ + +typedef enum __WIDL_msiserver_generated_name_00000003 { + msiViewModifySeek = -1, + msiViewModifyRefresh = 0, + msiViewModifyInsert = 1, + msiViewModifyUpdate = 2, + msiViewModifyAssign = 3, + msiViewModifyReplace = 4, + msiViewModifyMerge = 5, + msiViewModifyDelete = 6, + msiViewModifyInsertTemporary = 7, + msiViewModifyValidate = 8, + msiViewModifyValidateNew = 9, + msiViewModifyValidateField = 10, + msiViewModifyValidateDelete = 11 +} _MsiViewModify; +/***************************************************************************** + * View dispinterface + */ +#ifndef __View_DISPINTERFACE_DEFINED__ +#define __View_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_View, 0x000c109c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c109c-0000-0000-c000-000000000046") +View : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(View, 0x000c109c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct ViewVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + View* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + View* This); + + ULONG (STDMETHODCALLTYPE *Release)( + View* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + View* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + View* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + View* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + View* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} ViewVtbl; +interface View { + CONST_VTBL ViewVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define View_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define View_AddRef(This) (This)->lpVtbl->AddRef(This) +#define View_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define View_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define View_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define View_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define View_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __View_DISPINTERFACE_DEFINED__ */ + +/***************************************************************************** + * Database dispinterface + */ +#ifndef __Database_DISPINTERFACE_DEFINED__ +#define __Database_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_Database, 0x000c109d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c109d-0000-0000-c000-000000000046") +Database : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(Database, 0x000c109d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct DatabaseVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + Database* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + Database* This); + + ULONG (STDMETHODCALLTYPE *Release)( + Database* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + Database* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + Database* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + Database* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + Database* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} DatabaseVtbl; +interface Database { + CONST_VTBL DatabaseVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define Database_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define Database_AddRef(This) (This)->lpVtbl->AddRef(This) +#define Database_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define Database_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define Database_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define Database_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define Database_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __Database_DISPINTERFACE_DEFINED__ */ + +typedef enum __WIDL_msiserver_generated_name_00000004 { + msiDoActionStatusNoAction = 0, + msiDoActionStatusSuccess = 1, + msiDoActionStatusUserExit = 2, + msiDoActionStatusFailure = 3, + msiDoActionStatusSuspend = 4, + msiDoActionStatusFinished = 5, + msiDoActionStatusWrongState = 6, + msiDoActionStatusBadActionData = 7 +} MsiDoActionStatus; +typedef enum __WIDL_msiserver_generated_name_00000005 { + msiRunModeAdmin = 0, + msiRunModeAdvertise = 1, + msiRunModeMaintenance = 2, + msiRunModeRollbackEnabled = 3, + msiRunModeLogEnabled = 4, + msiRunModeOperations = 5, + msiRunModeRebootAtEnd = 6, + msiRunModeRebootNow = 7, + msiRunModeCabinet = 8, + msiRunModeSourceShortNames = 9, + msiRunModeTargetShortNames = 10, + msiRunModeWindows9x = 12, + msiRunModeZawEnabled = 13, + msiRunModeScheduled = 16, + msiRunModeRollback = 17, + msiRunModeCommit = 18 +} MsiRunMode; +typedef enum __WIDL_msiserver_generated_name_00000006 { + msiEvaluateConditionFalse = 0, + msiEvaluateConditionTrue = 1, + msiEvaluateConditionNone = 2, + msiEvaluateConditionError = 3 +} _MsiEvaluateCondition; +typedef enum __WIDL_msiserver_generated_name_00000007 { + msiMessageStatusError = -1, + msiMessageStatusNone = 0, + msiMessageStatusOk = 1, + msiMessageStatusCancel = 2, + msiMessageStatusAbort = 3, + msiMessageStatusRetry = 4, + msiMessageStatusIgnore = 5, + msiMessageStatusYes = 6, + msiMessageStatusNo = 7 +} MsiMessageStatus; +typedef enum __WIDL_msiserver_generated_name_00000008 { + msiMessageTypeFatalExit = 0, + msiMessageTypeError = 0x1000000, + msiMessageTypeWarning = 0x2000000, + msiMessageTypeUser = 0x3000000, + msiMessageTypeInfo = 0x4000000, + msiMessageTypeFilesInUse = 0x5000000, + msiMessageTypeResolveSource = 0x6000000, + msiMessageTypeOutOfDiskSpace = 0x7000000, + msiMessageTypeActionStart = 0x8000000, + msiMessageTypeActionData = 0x9000000, + msiMessageTypeProgress = 0xa000000, + msiMessageTypeCommonData = 0xb000000, + msiMessageTypeOk = 0, + msiMessageTypeOkCancel = 1, + msiMessageTypeAbortRetryIgnore = 2, + msiMessageTypeYesNoCancel = 3, + msiMessageTypeYesNo = 4, + msiMessageTypeRetryCancel = 5, + msiMessageTypeDefault1 = 0, + msiMessageTypeDefault2 = 256, + msiMessageTypeDefault3 = 512 +} MsiMessageType; +/***************************************************************************** + * Session dispinterface + */ +#ifndef __Session_DISPINTERFACE_DEFINED__ +#define __Session_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_Session, 0x000c109e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c109e-0000-0000-c000-000000000046") +Session : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(Session, 0x000c109e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct SessionVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + Session* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + Session* This); + + ULONG (STDMETHODCALLTYPE *Release)( + Session* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + Session* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + Session* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + Session* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + Session* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} SessionVtbl; +interface Session { + CONST_VTBL SessionVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define Session_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define Session_AddRef(This) (This)->lpVtbl->AddRef(This) +#define Session_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define Session_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define Session_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define Session_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define Session_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __Session_DISPINTERFACE_DEFINED__ */ + +/***************************************************************************** + * FeatureInfo dispinterface + */ +#ifndef __FeatureInfo_DISPINTERFACE_DEFINED__ +#define __FeatureInfo_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_FeatureInfo, 0x000c109f, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c109f-0000-0000-c000-000000000046") +FeatureInfo : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(FeatureInfo, 0x000c109f, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct FeatureInfoVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + FeatureInfo* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + FeatureInfo* This); + + ULONG (STDMETHODCALLTYPE *Release)( + FeatureInfo* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + FeatureInfo* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + FeatureInfo* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + FeatureInfo* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + FeatureInfo* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} FeatureInfoVtbl; +interface FeatureInfo { + CONST_VTBL FeatureInfoVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define FeatureInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define FeatureInfo_AddRef(This) (This)->lpVtbl->AddRef(This) +#define FeatureInfo_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define FeatureInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define FeatureInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define FeatureInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define FeatureInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __FeatureInfo_DISPINTERFACE_DEFINED__ */ + +/***************************************************************************** + * Product dispinterface + */ +#ifndef __Product_DISPINTERFACE_DEFINED__ +#define __Product_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_Product, 0x000c10a0, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c10a0-0000-0000-c000-000000000046") +Product : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(Product, 0x000c10a0, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct ProductVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + Product* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + Product* This); + + ULONG (STDMETHODCALLTYPE *Release)( + Product* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + Product* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + Product* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + Product* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + Product* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} ProductVtbl; +interface Product { + CONST_VTBL ProductVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define Product_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define Product_AddRef(This) (This)->lpVtbl->AddRef(This) +#define Product_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define Product_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define Product_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define Product_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define Product_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __Product_DISPINTERFACE_DEFINED__ */ + +/***************************************************************************** + * Patch dispinterface + */ +#ifndef __Patch_DISPINTERFACE_DEFINED__ +#define __Patch_DISPINTERFACE_DEFINED__ + +DEFINE_GUID(DIID_Patch, 0x000c10a1, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); +#if defined(__cplusplus) && !defined(CINTERFACE) +MIDL_INTERFACE("000c10a1-0000-0000-c000-000000000046") +Patch : public IDispatch +{ +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(Patch, 0x000c10a1, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#else +typedef struct PatchVtbl { + BEGIN_INTERFACE + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + Patch* This, + REFIID riid, + void **ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + Patch* This); + + ULONG (STDMETHODCALLTYPE *Release)( + Patch* This); + + /*** IDispatch methods ***/ + HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( + Patch* This, + UINT *pctinfo); + + HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( + Patch* This, + UINT iTInfo, + LCID lcid, + ITypeInfo **ppTInfo); + + HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( + Patch* This, + REFIID riid, + LPOLESTR *rgszNames, + UINT cNames, + LCID lcid, + DISPID *rgDispId); + + HRESULT (STDMETHODCALLTYPE *Invoke)( + Patch* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS *pDispParams, + VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, + UINT *puArgErr); + + END_INTERFACE +} PatchVtbl; +interface Patch { + CONST_VTBL PatchVtbl* lpVtbl; +}; + +#ifdef COBJMACROS +/*** IUnknown methods ***/ +#define Patch_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) +#define Patch_AddRef(This) (This)->lpVtbl->AddRef(This) +#define Patch_Release(This) (This)->lpVtbl->Release(This) +/*** IDispatch methods ***/ +#define Patch_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) +#define Patch_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) +#define Patch_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) +#define Patch_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) +#endif + +#endif + +#endif /* __Patch_DISPINTERFACE_DEFINED__ */ + +/***************************************************************************** + * MsiInstaller coclass + */ + +DEFINE_GUID(CLSID_MsiInstaller, 0x000c1090, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); + +#ifdef __cplusplus +class DECLSPEC_UUID("000c1090-0000-0000-c000-000000000046") MsiInstaller; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL(MsiInstaller, 0x000c1090, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) +#endif +#endif + +/* Begin additional prototypes for all interfaces */ + +ULONG __RPC_USER BSTR_UserSize (ULONG *, ULONG, BSTR *); +unsigned char * __RPC_USER BSTR_UserMarshal (ULONG *, unsigned char *, BSTR *); +unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *); +void __RPC_USER BSTR_UserFree (ULONG *, BSTR *); + +/* End additional prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __WIDL_MSISERVER_H */ diff --git a/reactos/dll/win32/msi/msiserver.idl b/reactos/dll/win32/msi/msiserver.idl index 262be4919bb..669d7f28a89 100644 --- a/reactos/dll/win32/msi/msiserver.idl +++ b/reactos/dll/win32/msi/msiserver.idl @@ -23,12 +23,6 @@ import "wtypes.idl"; import "objidl.idl"; import "oaidl.idl"; -#ifndef __WIDL__ -#define threading(model) -#define progid(str) -#define vi_progid(str) -#endif - cpp_quote("#if 0") typedef unsigned long MSIHANDLE; typedef int INSTALLMESSAGE; @@ -60,14 +54,14 @@ interface IWineMsiRemotePackage : IUnknown { HRESULT SetMsiHandle( [in] MSIHANDLE handle ); HRESULT GetActiveDatabase( [out] MSIHANDLE *handle ); - HRESULT GetProperty( [in] BSTR property, [out] BSTR *value, [out] DWORD *size ); + HRESULT GetProperty( [in] BSTR property, [out, size_is(*size)] BSTR value, [in, out] DWORD *size ); HRESULT SetProperty( [in] BSTR property, [in] BSTR value ); HRESULT ProcessMessage( [in] INSTALLMESSAGE message, [in] MSIHANDLE record ); HRESULT DoAction( [in] BSTR action ); HRESULT Sequence( [in] BSTR table, [in] int sequence ); - HRESULT GetTargetPath( [in] BSTR folder, [out] BSTR *value, [out] DWORD *size ); + HRESULT GetTargetPath( [in] BSTR folder, [out, size_is(*size)] BSTR value, [in, out] DWORD *size ); HRESULT SetTargetPath( [in] BSTR folder, [in] BSTR value ); - HRESULT GetSourcePath( [in] BSTR folder, [out] BSTR *value, [out] DWORD *size ); + HRESULT GetSourcePath( [in] BSTR folder, [out, size_is(*size)] BSTR value, [in, out] DWORD *size ); HRESULT GetMode( [in] MSIRUNMODE mode, [out] BOOL *ret ); HRESULT SetMode( [in] MSIRUNMODE mode, [in] BOOL state ); HRESULT GetFeatureState( [in] BSTR feature, [out] INSTALLSTATE *installed, [out] INSTALLSTATE *action ); @@ -78,7 +72,9 @@ interface IWineMsiRemotePackage : IUnknown HRESULT SetInstallLevel( [in] int level ); HRESULT FormatRecord( [in] MSIHANDLE record, [out] BSTR *value ); HRESULT EvaluateCondition( [in] BSTR condition ); - HRESULT GetFeatureCost( [in] BSTR feature, [in] INT cost_tree, [in] INSTALLSTATE state, [out] INT *cost); + HRESULT GetFeatureCost( [in] BSTR feature, [in] INT cost_tree, [in] INSTALLSTATE state, [out] INT *cost ); + HRESULT EnumComponentCosts( [in] BSTR component, [in] DWORD index, [in] INSTALLSTATE state, + [out, size_is(*buflen)] BSTR drive, [in, out] DWORD *buflen, [out] INT *cost, [out] INT *temp ); } [ diff --git a/reactos/dll/win32/msi/package.c b/reactos/dll/win32/msi/package.c index c84c28a7516..89da1da2289 100644 --- a/reactos/dll/win32/msi/package.c +++ b/reactos/dll/win32/msi/package.c @@ -90,6 +90,26 @@ static void free_feature( MSIFEATURE *feature ) msi_free( feature ); } +static void free_folder( MSIFOLDER *folder ) +{ + struct list *item, *cursor; + + LIST_FOR_EACH_SAFE( item, cursor, &folder->children ) + { + FolderList *fl = LIST_ENTRY( item, FolderList, entry ); + list_remove( &fl->entry ); + msi_free( fl ); + } + msi_free( folder->Parent ); + msi_free( folder->Directory ); + msi_free( folder->TargetDefault ); + msi_free( folder->SourceLongPath ); + msi_free( folder->SourceShortPath ); + msi_free( folder->ResolvedTarget ); + msi_free( folder->ResolvedSource ); + msi_free( folder ); +} + static void free_extension( MSIEXTENSION *ext ) { struct list *item, *cursor; @@ -121,15 +141,22 @@ static void free_assembly( MSIASSEMBLY *assembly ) msi_free( assembly ); } +void msi_free_action_script( MSIPACKAGE *package, UINT script ) +{ + UINT i; + for (i = 0; i < package->script->ActionCount[script]; i++) + msi_free( package->script->Actions[script][i] ); + + msi_free( package->script->Actions[script] ); + package->script->Actions[script] = NULL; + package->script->ActionCount[script] = 0; +} + static void free_package_structures( MSIPACKAGE *package ) { INT i; struct list *item, *cursor; - TRACE("Freeing package action data\n"); - - remove_tracked_tempfiles(package); - LIST_FOR_EACH_SAFE( item, cursor, &package->features ) { MSIFEATURE *feature = LIST_ENTRY( item, MSIFEATURE, entry ); @@ -140,17 +167,8 @@ static void free_package_structures( MSIPACKAGE *package ) LIST_FOR_EACH_SAFE( item, cursor, &package->folders ) { MSIFOLDER *folder = LIST_ENTRY( item, MSIFOLDER, entry ); - list_remove( &folder->entry ); - msi_free( folder->Parent ); - msi_free( folder->Directory ); - msi_free( folder->TargetDefault ); - msi_free( folder->SourceLongPath ); - msi_free( folder->SourceShortPath ); - msi_free( folder->ResolvedTarget ); - msi_free( folder->ResolvedSource ); - msi_free( folder->Property ); - msi_free( folder ); + free_folder( folder ); } LIST_FOR_EACH_SAFE( item, cursor, &package->components ) @@ -265,7 +283,7 @@ static void free_package_structures( MSIPACKAGE *package ) if (package->script) { - for (i = 0; i < TOTAL_SCRIPTS; i++) + for (i = 0; i < SCRIPT_MAX; i++) msi_free_action_script( package, i ); for (i = 0; i < package->script->UniqueActionsCount; i++) @@ -275,17 +293,6 @@ static void free_package_structures( MSIPACKAGE *package ) msi_free( package->script ); } - LIST_FOR_EACH_SAFE( item, cursor, &package->patches ) - { - MSIPATCHINFO *patch = LIST_ENTRY( item, MSIPATCHINFO, entry ); - - list_remove( &patch->entry ); - msi_free( patch->patchcode ); - msi_free( patch->transforms ); - msi_free( patch->localfile ); - msi_free( patch ); - } - LIST_FOR_EACH_SAFE( item, cursor, &package->binaries ) { MSIBINARY *binary = LIST_ENTRY( item, MSIBINARY, entry ); @@ -300,6 +307,28 @@ static void free_package_structures( MSIPACKAGE *package ) msi_free( binary ); } + LIST_FOR_EACH_SAFE( item, cursor, &package->cabinet_streams ) + { + MSICABINETSTREAM *cab = LIST_ENTRY( item, MSICABINETSTREAM, entry ); + + list_remove( &cab->entry ); + IStorage_Release( cab->storage ); + msi_free( cab->stream ); + msi_free( cab ); + } + + LIST_FOR_EACH_SAFE( item, cursor, &package->patches ) + { + MSIPATCHINFO *patch = LIST_ENTRY( item, MSIPATCHINFO, entry ); + + list_remove( &patch->entry ); + if (patch->delete_on_close && !DeleteFileW( patch->localfile )) + { + ERR("failed to delete %s (%u)\n", debugstr_w(patch->localfile), GetLastError()); + } + msi_free_patchinfo( patch ); + } + msi_free( package->BaseURL ); msi_free( package->PackagePath ); msi_free( package->ProductCode ); @@ -307,6 +336,8 @@ static void free_package_structures( MSIPACKAGE *package ) msi_free( package->LastAction ); msi_free( package->langids ); + remove_tracked_tempfiles(package); + /* cleanup control event subscriptions */ ControlEvent_CleanupSubscriptions( package ); } @@ -326,25 +357,27 @@ static void MSI_FreePackage( MSIOBJECTHDR *arg) for (i = 0; i < CLR_VERSION_MAX; i++) if (package->cache_net[i]) IAssemblyCache_Release( package->cache_net[i] ); if (package->cache_sxs) IAssemblyCache_Release( package->cache_sxs ); + + if (package->delete_on_close) DeleteFileW( package->localfile ); + msi_free( package->localfile ); } static UINT create_temp_property_table(MSIPACKAGE *package) { - MSIQUERY *view = NULL; + static const WCHAR query[] = { + 'C','R','E','A','T','E',' ','T','A','B','L','E',' ', + '`','_','P','r','o','p','e','r','t','y','`',' ','(',' ', + '`','_','P','r','o','p','e','r','t','y','`',' ', + 'C','H','A','R','(','5','6',')',' ','N','O','T',' ','N','U','L','L',' ', + 'T','E','M','P','O','R','A','R','Y',',',' ', + '`','V','a','l','u','e','`',' ','C','H','A','R','(','9','8',')',' ', + 'N','O','T',' ','N','U','L','L',' ','T','E','M','P','O','R','A','R','Y', + ' ','P','R','I','M','A','R','Y',' ','K','E','Y',' ', + '`','_','P','r','o','p','e','r','t','y','`',')',' ','H','O','L','D',0}; + MSIQUERY *view; UINT rc; - static const WCHAR CreateSql[] = { - 'C','R','E','A','T','E',' ','T','A','B','L','E',' ', - '`','_','P','r','o','p','e','r','t','y','`',' ','(',' ', - '`','_','P','r','o','p','e','r','t','y','`',' ', - 'C','H','A','R','(','5','6',')',' ','N','O','T',' ','N','U','L','L',' ', - 'T','E','M','P','O','R','A','R','Y',',',' ', - '`','V','a','l','u','e','`',' ','C','H','A','R','(','9','8',')',' ', - 'N','O','T',' ','N','U','L','L',' ','T','E','M','P','O','R','A','R','Y', - ' ','P','R','I','M','A','R','Y',' ','K','E','Y',' ', - '`','_','P','r','o','p','e','r','t','y','`',')',' ','H','O','L','D',0}; - - rc = MSI_DatabaseOpenViewW(package->db, CreateSql, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return rc; @@ -356,22 +389,20 @@ static UINT create_temp_property_table(MSIPACKAGE *package) UINT msi_clone_properties(MSIPACKAGE *package) { - MSIQUERY *view_select = NULL; - UINT rc; - static const WCHAR query_select[] = { - 'S','E','L','E','C','T',' ','*',' ', - 'F','R','O','M',' ','`','P','r','o','p','e','r','t','y','`',0}; + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','P','r','o','p','e','r','t','y','`',0}; static const WCHAR query_insert[] = { - 'I','N','S','E','R','T',' ','i','n','t','o',' ', - '`','_','P','r','o','p','e','r','t','y','`',' ', - '(','`','_','P','r','o','p','e','r','t','y','`',',', - '`','V','a','l','u','e','`',')',' ', - 'V','A','L','U','E','S',' ','(','?',',','?',')',0}; + 'I','N','S','E','R','T',' ','I','N','T','O',' ', + '`','_','P','r','o','p','e','r','t','y','`',' ', + '(','`','_','P','r','o','p','e','r','t','y','`',',','`','V','a','l','u','e','`',')',' ', + 'V','A','L','U','E','S',' ','(','?',',','?',')',0}; static const WCHAR query_update[] = { 'U','P','D','A','T','E',' ','`','_','P','r','o','p','e','r','t','y','`',' ', 'S','E','T',' ','`','V','a','l','u','e','`',' ','=',' ','?',' ', 'W','H','E','R','E',' ','`','_','P','r','o','p','e','r','t','y','`',' ','=',' ','?',0}; + MSIQUERY *view_select; + UINT rc; rc = MSI_DatabaseOpenViewW( package->db, query_select, &view_select ); if (rc != ERROR_SUCCESS) @@ -446,16 +477,17 @@ UINT msi_clone_properties(MSIPACKAGE *package) */ static UINT set_installed_prop( MSIPACKAGE *package ) { - HKEY hkey = 0; + HKEY hkey; UINT r; - r = MSIREG_OpenUninstallKey( package, &hkey, FALSE ); + if (!package->ProductCode) return ERROR_FUNCTION_FAILED; + + r = MSIREG_OpenUninstallKey( package->ProductCode, package->platform, &hkey, FALSE ); if (r == ERROR_SUCCESS) { RegCloseKey( hkey ); msi_set_property( package->db, szInstalled, szOne ); } - return r; } @@ -662,15 +694,12 @@ static VOID set_installer_properties(MSIPACKAGE *package) static const WCHAR szDesktopFolder[] = {'D','e','s','k','t','o','p','F','o','l','d','e','r',0}; static const WCHAR szProgramMenuFolder[] = {'P','r','o','g','r','a','m','M','e','n','u','F','o','l','d','e','r',0}; static const WCHAR szAdminToolsFolder[] = {'A','d','m','i','n','T','o','o','l','s','F','o','l','d','e','r',0}; - static const WCHAR szAppDataFolder[] = {'A','p','p','D','a','t','a','F','o','l','d','e','r',0}; static const WCHAR szSystemFolder[] = {'S','y','s','t','e','m','F','o','l','d','e','r',0}; static const WCHAR szSystem16Folder[] = {'S','y','s','t','e','m','1','6','F','o','l','d','e','r',0}; static const WCHAR szLocalAppDataFolder[] = {'L','o','c','a','l','A','p','p','D','a','t','a','F','o','l','d','e','r',0}; static const WCHAR szMyPicturesFolder[] = {'M','y','P','i','c','t','u','r','e','s','F','o','l','d','e','r',0}; static const WCHAR szPersonalFolder[] = {'P','e','r','s','o','n','a','l','F','o','l','d','e','r',0}; - static const WCHAR szWindowsFolder[] = {'W','i','n','d','o','w','s','F','o','l','d','e','r',0}; static const WCHAR szWindowsVolume[] = {'W','i','n','d','o','w','s','V','o','l','u','m','e',0}; - static const WCHAR szTempFolder[]= {'T','e','m','p','F','o','l','d','e','r',0}; static const WCHAR szPrivileged[] = {'P','r','i','v','i','l','e','g','e','d',0}; static const WCHAR szVersion9x[] = {'V','e','r','s','i','o','n','9','X',0}; static const WCHAR szVersionNT[] = {'V','e','r','s','i','o','n','N','T',0}; @@ -722,14 +751,13 @@ static VOID set_installer_properties(MSIPACKAGE *package) static const WCHAR szNetHoodFolder[] = {'N','e','t','H','o','o','d','F','o','l','d','e','r',0}; static const WCHAR szPrintHoodFolder[] = {'P','r','i','n','t','H','o','o','d','F','o','l','d','e','r',0}; static const WCHAR szRecentFolder[] = {'R','e','c','e','n','t','F','o','l','d','e','r',0}; + static const WCHAR szComputerName[] = {'C','o','m','p','u','t','e','r','N','a','m','e',0}; /* * Other things that probably should be set: * - * ComputerName VirtualMemory - * ShellAdvSupport DefaultUIFont PackagecodeChanging - * CaptionHeight BorderTop BorderSide TextHeight - * RedirectedDllSupport + * VirtualMemory ShellAdvSupport DefaultUIFont PackagecodeChanging + * CaptionHeight BorderTop BorderSide TextHeight RedirectedDllSupport */ SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, 0, pth); @@ -975,7 +1003,7 @@ static VOID set_installer_properties(MSIPACKAGE *package) msi_set_property( package->db, szProductState, bufstr ); len = 0; - if (!GetUserNameW( NULL, &len ) && GetLastError() == ERROR_MORE_DATA) + if (!GetUserNameW( NULL, &len ) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { WCHAR *username; if ((username = msi_alloc( len * sizeof(WCHAR) ))) @@ -985,6 +1013,17 @@ static VOID set_installer_properties(MSIPACKAGE *package) msi_free( username ); } } + len = 0; + if (!GetComputerNameW( NULL, &len ) && GetLastError() == ERROR_BUFFER_OVERFLOW) + { + WCHAR *computername; + if ((computername = msi_alloc( len * sizeof(WCHAR) ))) + { + if (GetComputerNameW( computername, &len )) + msi_set_property( package->db, szComputerName, computername ); + msi_free( computername ); + } + } } static UINT msi_load_summary_properties( MSIPACKAGE *package ) @@ -1065,6 +1104,7 @@ static MSIPACKAGE *msi_alloc_package( void ) list_init( &package->components ); list_init( &package->features ); list_init( &package->files ); + list_init( &package->filepatches ); list_init( &package->tempfiles ); list_init( &package->folders ); list_init( &package->subscriptions ); @@ -1078,6 +1118,7 @@ static MSIPACKAGE *msi_alloc_package( void ) list_init( &package->sourcelist_media ); list_init( &package->patches ); list_init( &package->binaries ); + list_init( &package->cabinet_streams ); } return package; @@ -1113,7 +1154,6 @@ void msi_adjust_privilege_properties( MSIPACKAGE *package ) MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url ) { - static const WCHAR szLevel[] = { 'U','I','L','e','v','e','l',0 }; static const WCHAR szpi[] = {'%','i',0}; MSIPACKAGE *package; WCHAR uilevel[10]; @@ -1142,7 +1182,7 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url ) set_installer_properties( package ); sprintfW(uilevel,szpi,gUILevel); - msi_set_property(package->db, szLevel, uilevel); + msi_set_property(package->db, szUILevel, uilevel); r = msi_load_summary_properties( package ); if (r != ERROR_SUCCESS) @@ -1156,48 +1196,16 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url ) package->log_file = INVALID_HANDLE_VALUE; } - return package; } -/* - * copy_package_to_temp [internal] - * - * copy the msi file to a temp file to prevent locking a CD - * with a multi disc install - * - * FIXME: I think this is wrong, and instead of copying the package, - * we should read all the tables to memory, then open the - * database to read binary streams on demand. - */ -static UINT copy_package_to_temp( LPCWSTR szPackage, LPWSTR filename ) -{ - WCHAR path[MAX_PATH]; - - GetTempPathW( MAX_PATH, path ); - GetTempFileNameW( path, szMsi, 0, filename ); - - if( !CopyFileW( szPackage, filename, FALSE ) ) - { - UINT error = GetLastError(); - if ( error == ERROR_FILE_NOT_FOUND ) - ERR("can't find %s\n", debugstr_w(szPackage)); - else - ERR("failed to copy package %s to %s (%u)\n", debugstr_w(szPackage), debugstr_w(filename), error); - DeleteFileW( filename ); - return error; - } - - return ERROR_SUCCESS; -} - UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename ) { LPINTERNET_CACHE_ENTRY_INFOW cache_entry; DWORD size = 0; HRESULT hr; - /* call will always fail, becase size is 0, + /* call will always fail, because size is 0, * but will return ERROR_FILE_NOT_FOUND first * if the file doesn't exist */ @@ -1227,7 +1235,7 @@ UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename ) return ERROR_SUCCESS; } -UINT msi_get_local_package_name( LPWSTR path, LPCWSTR suffix ) +UINT msi_create_empty_local_file( LPWSTR path, LPCWSTR suffix ) { static const WCHAR szInstaller[] = { '\\','I','n','s','t','a','l','l','e','r','\\',0}; @@ -1260,67 +1268,6 @@ UINT msi_get_local_package_name( LPWSTR path, LPCWSTR suffix ) return ERROR_SUCCESS; } -static UINT apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code ) -{ - UINT r; - DWORD len; - WCHAR patch_file[MAX_PATH]; - MSIDATABASE *patch_db; - MSIPATCHINFO *patch_info; - MSISUMMARYINFO *si; - - len = sizeof(patch_file) / sizeof(WCHAR); - r = MsiGetPatchInfoExW( patch_code, package->ProductCode, NULL, package->Context, - INSTALLPROPERTY_LOCALPACKAGEW, patch_file, &len ); - if (r != ERROR_SUCCESS) - { - ERR("failed to get patch filename %u\n", r); - return r; - } - - r = MSI_OpenDatabaseW( patch_file, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &patch_db ); - if (r != ERROR_SUCCESS) - { - ERR("failed to open patch database %s\n", debugstr_w( patch_file )); - return r; - } - - si = MSI_GetSummaryInformationW( patch_db->storage, 0 ); - if (!si) - { - msiobj_release( &patch_db->hdr ); - return ERROR_FUNCTION_FAILED; - } - - r = msi_parse_patch_summary( si, &patch_info ); - msiobj_release( &si->hdr ); - if (r != ERROR_SUCCESS) - { - ERR("failed to parse patch summary %u\n", r); - msiobj_release( &patch_db->hdr ); - return r; - } - - patch_info->localfile = strdupW( patch_file ); - if (!patch_info->localfile) - { - msiobj_release( &patch_db->hdr ); - return ERROR_OUTOFMEMORY; - } - - r = msi_apply_patch_db( package, patch_db, patch_info ); - msiobj_release( &patch_db->hdr ); - if (r != ERROR_SUCCESS) - { - ERR("failed to apply patch %u\n", r); - msi_free( patch_info->patchcode ); - msi_free( patch_info->transforms ); - msi_free( patch_info->localfile ); - msi_free( patch_info ); - } - return r; -} - static UINT msi_parse_summary( MSISUMMARYINFO *si, MSIPACKAGE *package ) { WCHAR *template, *p, *q; @@ -1343,6 +1290,7 @@ static UINT msi_parse_summary( MSISUMMARYINFO *si, MSIPACKAGE *package ) return ERROR_PATCH_PACKAGE_INVALID; } *p = 0; + if ((q = strchrW( template, ',' ))) *q = 0; if (!template[0] || !strcmpW( template, szIntel )) package->platform = PLATFORM_INTEL; else if (!strcmpW( template, szIntel64 )) @@ -1392,6 +1340,10 @@ static UINT validate_package( MSIPACKAGE *package ) BOOL is_wow64; UINT i; + if (package->platform == PLATFORM_INTEL64) + { + return ERROR_INSTALL_PLATFORM_UNSUPPORTED; + } IsWow64Process( GetCurrentProcess(), &is_wow64 ); if (package->platform == PLATFORM_X64) { @@ -1422,22 +1374,156 @@ static UINT validate_package( MSIPACKAGE *package ) return ERROR_INSTALL_LANGUAGE_UNSUPPORTED; } +int msi_track_tempfile( MSIPACKAGE *package, const WCHAR *path ) +{ + MSITEMPFILE *temp; + + TRACE("%s\n", debugstr_w(path)); + + LIST_FOR_EACH_ENTRY( temp, &package->tempfiles, MSITEMPFILE, entry ) + { + if (!strcmpW( path, temp->Path )) return 0; + } + if (!(temp = msi_alloc_zero( sizeof (MSITEMPFILE) ))) return -1; + list_add_head( &package->tempfiles, &temp->entry ); + temp->Path = strdupW( path ); + return 0; +} + +static WCHAR *get_product_code( MSIDATABASE *db ) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','`','V','a','l','u','e','`',' ', + 'F','R','O','M',' ','`','P','r','o','p','e','r','t','y','`',' ', + 'W','H','E','R','E',' ','`','P','r','o','p','e','r','t','y','`','=', + '\'','P','r','o','d','u','c','t','C','o','d','e','\'',0}; + MSIQUERY *view; + MSIRECORD *rec; + WCHAR *ret = NULL; + + if (MSI_DatabaseOpenViewW( db, query, &view ) != ERROR_SUCCESS) + { + return NULL; + } + if (MSI_ViewExecute( view, 0 ) != ERROR_SUCCESS) + { + MSI_ViewClose( view ); + msiobj_release( &view->hdr ); + return NULL; + } + if (MSI_ViewFetch( view, &rec ) == ERROR_SUCCESS) + { + ret = strdupW( MSI_RecordGetString( rec, 1 ) ); + msiobj_release( &rec->hdr ); + } + MSI_ViewClose( view ); + msiobj_release( &view->hdr ); + return ret; +} + +static UINT get_registered_local_package( const WCHAR *product, const WCHAR *package, WCHAR *localfile ) +{ + MSIINSTALLCONTEXT context; + HKEY product_key, props_key; + WCHAR *registered_package = NULL, unsquashed[GUID_SIZE]; + UINT r; + + r = msi_locate_product( product, &context ); + if (r != ERROR_SUCCESS) + return r; + + r = MSIREG_OpenProductKey( product, NULL, context, &product_key, FALSE ); + if (r != ERROR_SUCCESS) + return r; + + r = MSIREG_OpenInstallProps( product, context, NULL, &props_key, FALSE ); + if (r != ERROR_SUCCESS) + { + RegCloseKey( product_key ); + return r; + } + r = ERROR_FUNCTION_FAILED; + registered_package = msi_reg_get_val_str( product_key, INSTALLPROPERTY_PACKAGECODEW ); + if (!registered_package) + goto done; + + unsquash_guid( registered_package, unsquashed ); + if (!strcmpiW( package, unsquashed )) + { + WCHAR *filename = msi_reg_get_val_str( props_key, INSTALLPROPERTY_LOCALPACKAGEW ); + strcpyW( localfile, filename ); + msi_free( filename ); + r = ERROR_SUCCESS; + } +done: + msi_free( registered_package ); + RegCloseKey( props_key ); + RegCloseKey( product_key ); + return r; +} + +static WCHAR *get_package_code( MSIDATABASE *db ) +{ + WCHAR *ret; + MSISUMMARYINFO *si; + + if (!(si = MSI_GetSummaryInformationW( db->storage, 0 ))) + { + WARN("failed to load summary info\n"); + return NULL; + } + ret = msi_suminfo_dup_string( si, PID_REVNUMBER ); + msiobj_release( &si->hdr ); + return ret; +} + +static UINT get_local_package( const WCHAR *filename, WCHAR *localfile ) +{ + WCHAR *product_code, *package_code; + MSIDATABASE *db; + UINT r; + + if ((r = MSI_OpenDatabaseW( filename, MSIDBOPEN_READONLY, &db )) != ERROR_SUCCESS) + { + if (GetFileAttributesW( filename ) == INVALID_FILE_ATTRIBUTES) + return ERROR_FILE_NOT_FOUND; + return r; + } + if (!(product_code = get_product_code( db ))) + { + msiobj_release( &db->hdr ); + return ERROR_INSTALL_PACKAGE_INVALID; + } + if (!(package_code = get_package_code( db ))) + { + msi_free( product_code ); + msiobj_release( &db->hdr ); + return ERROR_INSTALL_PACKAGE_INVALID; + } + r = get_registered_local_package( product_code, package_code, localfile ); + msi_free( package_code ); + msi_free( product_code ); + msiobj_release( &db->hdr ); + return r; +} + UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) { - static const WCHAR Database[] = {'D','A','T','A','B','A','S','E',0}; static const WCHAR dotmsi[] = {'.','m','s','i',0}; - MSIDATABASE *db = NULL; + MSIDATABASE *db; MSIPACKAGE *package; MSIHANDLE handle; LPWSTR ptr, base_url = NULL; UINT r; - WCHAR temppath[MAX_PATH], localfile[MAX_PATH], cachefile[MAX_PATH]; + WCHAR localfile[MAX_PATH], cachefile[MAX_PATH]; LPCWSTR file = szPackage; DWORD index = 0; MSISUMMARYINFO *si; + BOOL delete_on_close = FALSE; TRACE("%s %p\n", debugstr_w(szPackage), pPackage); + localfile[0] = 0; if( szPackage[0] == '#' ) { handle = atoiW(&szPackage[1]); @@ -1461,87 +1547,53 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) if ( UrlIsW( szPackage, URLIS_URL ) ) { r = msi_download_file( szPackage, cachefile ); - if ( r != ERROR_SUCCESS ) + if (r != ERROR_SUCCESS) return r; - r = copy_package_to_temp( cachefile, temppath ); - if ( r != ERROR_SUCCESS ) - return r; - - file = temppath; + file = cachefile; base_url = strdupW( szPackage ); - if ( !base_url ) + if (!base_url) return ERROR_OUTOFMEMORY; ptr = strrchrW( base_url, '/' ); if (ptr) *(ptr + 1) = '\0'; } - else + r = get_local_package( file, localfile ); + if (r != ERROR_SUCCESS || GetFileAttributesW( localfile ) == INVALID_FILE_ATTRIBUTES) { - r = copy_package_to_temp( szPackage, temppath ); - if ( r != ERROR_SUCCESS ) + r = msi_create_empty_local_file( localfile, dotmsi ); + if (r != ERROR_SUCCESS) return r; - file = temppath; + if (!CopyFileW( file, localfile, FALSE )) + { + r = GetLastError(); + WARN("unable to copy package %s to %s (%u)\n", debugstr_w(file), debugstr_w(localfile), r); + DeleteFileW( localfile ); + return r; + } + delete_on_close = TRUE; } - - r = msi_get_local_package_name( localfile, dotmsi ); + TRACE("opening package %s\n", debugstr_w( localfile )); + r = MSI_OpenDatabaseW( localfile, MSIDBOPEN_TRANSACT, &db ); if (r != ERROR_SUCCESS) return r; - - TRACE("Copying to local package %s\n", debugstr_w(localfile)); - - if (!CopyFileW( file, localfile, FALSE )) - { - ERR("Unable to copy package (%s -> %s) (error %u)\n", - debugstr_w(file), debugstr_w(localfile), GetLastError()); - return GetLastError(); - } - - TRACE("Opening relocated package %s\n", debugstr_w( file )); - - /* transforms that add binary streams require that we open the database - * read/write, which is safe because we always create a copy that is thrown - * away when we're done. - */ - r = MSI_OpenDatabaseW( file, MSIDBOPEN_TRANSACT, &db ); - if( r != ERROR_SUCCESS ) - { - if (file != szPackage) - DeleteFileW( file ); - - if (GetFileAttributesW(szPackage) == INVALID_FILE_ATTRIBUTES) - return ERROR_FILE_NOT_FOUND; - - return r; - } - - db->localfile = strdupW( localfile ); } - package = MSI_CreatePackage( db, base_url ); msi_free( base_url ); msiobj_release( &db->hdr ); - if( !package ) - { - if (file != szPackage) - DeleteFileW( file ); - - return ERROR_INSTALL_PACKAGE_INVALID; - } - - if( file != szPackage ) - track_tempfile( package, file ); + if (!package) return ERROR_INSTALL_PACKAGE_INVALID; + package->localfile = strdupW( localfile ); + package->delete_on_close = delete_on_close; si = MSI_GetSummaryInformationW( db->storage, 0 ); if (!si) { - WARN("failed to load summary info %u\n", r); + WARN("failed to load summary info\n"); msiobj_release( &package->hdr ); return ERROR_INSTALL_PACKAGE_INVALID; } - r = msi_parse_summary( si, package ); msiobj_release( &si->hdr ); if (r != ERROR_SUCCESS) @@ -1550,14 +1602,13 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) msiobj_release( &package->hdr ); return r; } - r = validate_package( package ); if (r != ERROR_SUCCESS) { msiobj_release( &package->hdr ); return r; } - msi_set_property( package->db, Database, db->path ); + msi_set_property( package->db, szDatabase, db->path ); if( UrlIsW( szPackage, URLIS_URL ) ) msi_set_property( package->db, szOriginalDatabase, szPackage ); @@ -1570,7 +1621,6 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) GetFullPathNameW( szPackage, MAX_PATH, fullpath, NULL ); msi_set_property( package->db, szOriginalDatabase, fullpath ); } - msi_set_context( package ); while (1) @@ -1583,27 +1633,23 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage) TRACE("found registered patch %s\n", debugstr_w(patch_code)); - r = apply_registered_patch( package, patch_code ); + r = msi_apply_registered_patch( package, patch_code ); if (r != ERROR_SUCCESS) { ERR("registered patch failed to apply %u\n", r); msiobj_release( &package->hdr ); return r; } - index++; } - if (index) { msi_clone_properties( package ); msi_adjust_privilege_properties( package ); } - if (gszLogFile) package->log_file = CreateFileW( gszLogFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); - *pPackage = package; return ERROR_SUCCESS; } @@ -1701,8 +1747,7 @@ MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall) return handle; } -INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, - MSIRECORD *record) +INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, MSIRECORD *record ) { static const WCHAR szActionData[] = {'A','c','t','i','o','n','D','a','t','a',0}; @@ -1711,13 +1756,14 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, static const WCHAR szActionText[] = {'A','c','t','i','o','n','T','e','x','t',0}; LPWSTR message; - DWORD sz, total_size = 0, log_type = 0; - INT i, rc = 0; + DWORD i, len, total_len, log_type = 0; + INT rc = 0; char *msg; - int len; TRACE("%x\n", eMessageType); + if ((eMessageType & 0xff000000) == INSTALLMESSAGE_FATALEXIT) + log_type |= INSTALLLOGMODE_FATALEXIT; if ((eMessageType & 0xff000000) == INSTALLMESSAGE_ERROR) log_type |= INSTALLLOGMODE_ERROR; if ((eMessageType & 0xff000000) == INSTALLMESSAGE_WARNING) @@ -1726,15 +1772,24 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, log_type |= INSTALLLOGMODE_USER; if ((eMessageType & 0xff000000) == INSTALLMESSAGE_INFO) log_type |= INSTALLLOGMODE_INFO; + if ((eMessageType & 0xff000000) == INSTALLMESSAGE_RESOLVESOURCE) + log_type |= INSTALLLOGMODE_RESOLVESOURCE; + if ((eMessageType & 0xff000000) == INSTALLMESSAGE_OUTOFDISKSPACE) + log_type |= INSTALLLOGMODE_OUTOFDISKSPACE; if ((eMessageType & 0xff000000) == INSTALLMESSAGE_COMMONDATA) log_type |= INSTALLLOGMODE_COMMONDATA; if ((eMessageType & 0xff000000) == INSTALLMESSAGE_ACTIONSTART) log_type |= INSTALLLOGMODE_ACTIONSTART; if ((eMessageType & 0xff000000) == INSTALLMESSAGE_ACTIONDATA) log_type |= INSTALLLOGMODE_ACTIONDATA; - /* just a guess */ if ((eMessageType & 0xff000000) == INSTALLMESSAGE_PROGRESS) - log_type |= 0x800; + log_type |= INSTALLLOGMODE_PROGRESS; + if ((eMessageType & 0xff000000) == INSTALLMESSAGE_INITIALIZE) + log_type |= INSTALLLOGMODE_INITIALIZE; + if ((eMessageType & 0xff000000) == INSTALLMESSAGE_TERMINATE) + log_type |= INSTALLLOGMODE_TERMINATE; + if ((eMessageType & 0xff000000) == INSTALLMESSAGE_SHOWDIALOG) + log_type |= INSTALLLOGMODE_SHOWDIALOG; if ((eMessageType & 0xff000000) == INSTALLMESSAGE_ACTIONSTART) { @@ -1767,35 +1822,39 @@ INT MSI_ProcessMessage( MSIPACKAGE *package, INSTALLMESSAGE eMessageType, } else { - INT msg_field=1; - message = msi_alloc(1*sizeof (WCHAR)); - message[0]=0; - msg_field = MSI_RecordGetFieldCount(record); - for (i = 1; i <= msg_field; i++) + static const WCHAR format[] = {'%','u',':',' ',0}; + UINT count = MSI_RecordGetFieldCount( record ); + WCHAR *p; + + total_len = 1; + for (i = 1; i <= count; i++) { - LPWSTR tmp; - WCHAR number[3]; - static const WCHAR format[] = { '%','i',':',' ',0}; - sz = 0; - MSI_RecordGetStringW(record,i,NULL,&sz); - sz+=4; - total_size+=sz*sizeof(WCHAR); - tmp = msi_alloc(sz*sizeof(WCHAR)); - message = msi_realloc(message,total_size*sizeof (WCHAR)); - - MSI_RecordGetStringW(record,i,tmp,&sz); - - if (msg_field > 1) - { - sprintfW(number,format,i); - strcatW(message,number); - } - strcatW(message,tmp); - if (msg_field > 1) - strcatW(message, szSpace); - - msi_free(tmp); + len = 0; + MSI_RecordGetStringW( record, i, NULL, &len ); + total_len += len + 13; } + p = message = msi_alloc( total_len * sizeof(WCHAR) ); + if (!p) return ERROR_OUTOFMEMORY; + + for (i = 1; i <= count; i++) + { + if (count > 1) + { + len = sprintfW( p, format, i ); + total_len -= len; + p += len; + } + len = total_len; + MSI_RecordGetStringW( record, i, p, &len ); + total_len -= len; + p += len; + if (count > 1 && total_len) + { + *p++ = ' '; + total_len--; + } + } + p[0] = 0; } TRACE("%p %p %p %x %x %s\n", gUIHandlerA, gUIHandlerW, gUIHandlerRecord, @@ -1955,27 +2014,24 @@ void msi_reset_folders( MSIPACKAGE *package, BOOL source ) UINT msi_set_property( MSIDATABASE *db, LPCWSTR szName, LPCWSTR szValue ) { - MSIQUERY *view; - MSIRECORD *row = NULL; - UINT rc; - DWORD sz = 0; - WCHAR Query[1024]; - - static const WCHAR Insert[] = { - 'I','N','S','E','R','T',' ','i','n','t','o',' ', - '`','_','P','r','o','p','e','r','t','y','`',' ','(', - '`','_','P','r','o','p','e','r','t','y','`',',', - '`','V','a','l','u','e','`',')',' ','V','A','L','U','E','S' - ,' ','(','?',',','?',')',0}; - static const WCHAR Update[] = { - 'U','P','D','A','T','E',' ','`','_','P','r','o','p','e','r','t','y','`', - ' ','s','e','t',' ','`','V','a','l','u','e','`',' ','=',' ','?',' ', - 'w','h','e','r','e',' ','`','_','P','r','o','p','e','r','t','y','`', - ' ','=',' ','\'','%','s','\'',0}; - static const WCHAR Delete[] = { + static const WCHAR insert_query[] = { + 'I','N','S','E','R','T',' ','I','N','T','O',' ', + '`','_','P','r','o','p','e','r','t','y','`',' ', + '(','`','_','P','r','o','p','e','r','t','y','`',',','`','V','a','l','u','e','`',')',' ', + 'V','A','L','U','E','S',' ','(','?',',','?',')',0}; + static const WCHAR update_query[] = { + 'U','P','D','A','T','E',' ','`','_','P','r','o','p','e','r','t','y','`',' ', + 'S','E','T',' ','`','V','a','l','u','e','`',' ','=',' ','?',' ','W','H','E','R','E',' ', + '`','_','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',0}; + static const WCHAR delete_query[] = { 'D','E','L','E','T','E',' ','F','R','O','M',' ', '`','_','P','r','o','p','e','r','t','y','`',' ','W','H','E','R','E',' ', '`','_','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',0}; + MSIQUERY *view; + MSIRECORD *row = NULL; + DWORD sz = 0; + WCHAR query[1024]; + UINT rc; TRACE("%p %s %s\n", db, debugstr_w(szName), debugstr_w(szValue)); @@ -1989,35 +2045,32 @@ UINT msi_set_property( MSIDATABASE *db, LPCWSTR szName, LPCWSTR szValue ) rc = msi_get_property(db, szName, 0, &sz); if (!szValue || !*szValue) { - sprintfW(Query, Delete, szName); + sprintfW(query, delete_query, szName); } else if (rc == ERROR_MORE_DATA || rc == ERROR_SUCCESS) { - sprintfW(Query, Update, szName); + sprintfW(query, update_query, szName); row = MSI_CreateRecord(1); MSI_RecordSetStringW(row, 1, szValue); } else { - strcpyW(Query, Insert); + strcpyW(query, insert_query); row = MSI_CreateRecord(2); MSI_RecordSetStringW(row, 1, szName); MSI_RecordSetStringW(row, 2, szValue); } - rc = MSI_DatabaseOpenViewW(db, Query, &view); + rc = MSI_DatabaseOpenViewW(db, query, &view); if (rc == ERROR_SUCCESS) { rc = MSI_ViewExecute(view, row); MSI_ViewClose(view); msiobj_release(&view->hdr); } - - if (row) - msiobj_release(&row->hdr); - + if (row) msiobj_release(&row->hdr); return rc; } @@ -2065,7 +2118,7 @@ UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue } ret = msi_set_property( package->db, szName, szValue ); - if (ret == ERROR_SUCCESS && !strcmpW( szName, cszSourceDir )) + if (ret == ERROR_SUCCESS && !strcmpW( szName, szSourceDir )) msi_reset_folders( package, TRUE ); msiobj_release( &package->hdr ); @@ -2074,15 +2127,13 @@ UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue static MSIRECORD *msi_get_property_row( MSIDATABASE *db, LPCWSTR name ) { - MSIQUERY *view; - MSIRECORD *rec, *row = NULL; - UINT r; - static const WCHAR query[]= { 'S','E','L','E','C','T',' ','`','V','a','l','u','e','`',' ', - 'F','R','O','M',' ' ,'`','_','P','r','o','p','e','r','t','y','`', - ' ','W','H','E','R','E',' ' ,'`','_','P','r','o','p','e','r','t','y','`', - '=','?',0}; + 'F','R','O','M',' ' ,'`','_','P','r','o','p','e','r','t','y','`',' ', + 'W','H','E','R','E',' ' ,'`','_','P','r','o','p','e','r','t','y','`','=','?',0}; + MSIRECORD *rec, *row = NULL; + MSIQUERY *view; + UINT r; if (!name || !*name) return NULL; @@ -2101,7 +2152,6 @@ static MSIRECORD *msi_get_property_row( MSIDATABASE *db, LPCWSTR name ) MSI_ViewClose(view); msiobj_release(&view->hdr); } - msiobj_release(&rec->hdr); return row; } @@ -2216,7 +2266,7 @@ static UINT MSI_GetProperty( MSIHANDLE handle, LPCWSTR name, goto done; } - hr = IWineMsiRemotePackage_GetProperty( remote_package, bname, (BSTR *)value, &len ); + hr = IWineMsiRemotePackage_GetProperty( remote_package, bname, value, &len ); if (FAILED(hr)) goto done; @@ -2368,15 +2418,11 @@ static HRESULT WINAPI mrp_GetActiveDatabase( IWineMsiRemotePackage *iface, MSIHA return S_OK; } -static HRESULT WINAPI mrp_GetProperty( IWineMsiRemotePackage *iface, BSTR property, BSTR *value, DWORD *size ) +static HRESULT WINAPI mrp_GetProperty( IWineMsiRemotePackage *iface, BSTR property, BSTR value, DWORD *size ) { msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r; - - r = MsiGetPropertyW(This->package, (LPWSTR)property, (LPWSTR)value, size); - if (r != ERROR_SUCCESS) - return HRESULT_FROM_WIN32(r); - + UINT r = MsiGetPropertyW(This->package, property, value, size); + if (r != ERROR_SUCCESS) return HRESULT_FROM_WIN32(r); return S_OK; } @@ -2408,10 +2454,10 @@ static HRESULT WINAPI mrp_Sequence( IWineMsiRemotePackage *iface, BSTR table, in return HRESULT_FROM_WIN32(r); } -static HRESULT WINAPI mrp_GetTargetPath( IWineMsiRemotePackage *iface, BSTR folder, BSTR *value, DWORD *size ) +static HRESULT WINAPI mrp_GetTargetPath( IWineMsiRemotePackage *iface, BSTR folder, BSTR value, DWORD *size ) { msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiGetTargetPathW(This->package, (LPWSTR)folder, (LPWSTR)value, size); + UINT r = MsiGetTargetPathW(This->package, folder, value, size); return HRESULT_FROM_WIN32(r); } @@ -2422,10 +2468,10 @@ static HRESULT WINAPI mrp_SetTargetPath( IWineMsiRemotePackage *iface, BSTR fold return HRESULT_FROM_WIN32(r); } -static HRESULT WINAPI mrp_GetSourcePath( IWineMsiRemotePackage *iface, BSTR folder, BSTR *value, DWORD *size ) +static HRESULT WINAPI mrp_GetSourcePath( IWineMsiRemotePackage *iface, BSTR folder, BSTR value, DWORD *size ) { msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); - UINT r = MsiGetSourcePathW(This->package, (LPWSTR)folder, (LPWSTR)value, size); + UINT r = MsiGetSourcePathW(This->package, folder, value, size); return HRESULT_FROM_WIN32(r); } @@ -2519,6 +2565,15 @@ static HRESULT WINAPI mrp_GetFeatureCost( IWineMsiRemotePackage *iface, BSTR fea return HRESULT_FROM_WIN32(r); } +static HRESULT WINAPI mrp_EnumComponentCosts( IWineMsiRemotePackage *iface, BSTR component, + DWORD index, INSTALLSTATE state, BSTR drive, + DWORD *buflen, INT *cost, INT *temp ) +{ + msi_remote_package_impl* This = impl_from_IWineMsiRemotePackage( iface ); + UINT r = MsiEnumComponentCostsW(This->package, component, index, state, drive, buflen, cost, temp); + return HRESULT_FROM_WIN32(r); +} + static const IWineMsiRemotePackageVtbl msi_remote_package_vtbl = { mrp_QueryInterface, @@ -2545,6 +2600,7 @@ static const IWineMsiRemotePackageVtbl msi_remote_package_vtbl = mrp_FormatRecord, mrp_EvaluateCondition, mrp_GetFeatureCost, + mrp_EnumComponentCosts }; HRESULT create_msi_remote_package( IUnknown *pOuter, LPVOID *ppObj ) diff --git a/reactos/dll/win32/msi/patch.c b/reactos/dll/win32/msi/patch.c new file mode 100644 index 00000000000..4801872b32b --- /dev/null +++ b/reactos/dll/win32/msi/patch.c @@ -0,0 +1,783 @@ +/* + * Implementation of the Microsoft Installer (msi.dll) + * + * Copyright 2004,2005 Aric Stewart for CodeWeavers + * Copyright 2011 Hans Leidekker 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 +#define COBJMACROS +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "objbase.h" +#include "shlwapi.h" +#include "wine/debug.h" +#include "wine/unicode.h" +#include "msipriv.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msi); + +static BOOL match_language( MSIPACKAGE *package, LANGID langid ) +{ + UINT i; + + if (!package->num_langids || !langid) return TRUE; + for (i = 0; i < package->num_langids; i++) + { + if (package->langids[i] == langid) return TRUE; + } + return FALSE; +} + +static UINT check_transform_applicable( MSIPACKAGE *package, IStorage *patch ) +{ + LPWSTR prod_code, patch_product, template = NULL; + UINT ret = ERROR_FUNCTION_FAILED; + + prod_code = msi_dup_property( package->db, szProductCode ); + patch_product = msi_get_suminfo_product( patch ); + + TRACE("db = %s patch = %s\n", debugstr_w(prod_code), debugstr_w(patch_product)); + + if (strstrW( patch_product, prod_code )) + { + MSISUMMARYINFO *si; + const WCHAR *p; + + si = MSI_GetSummaryInformationW( patch, 0 ); + if (!si) + { + ERR("no summary information!\n"); + goto end; + } + template = msi_suminfo_dup_string( si, PID_TEMPLATE ); + if (!template) + { + ERR("no template property!\n"); + msiobj_release( &si->hdr ); + goto end; + } + if (!template[0]) + { + ret = ERROR_SUCCESS; + msiobj_release( &si->hdr ); + goto end; + } + TRACE("template: %s\n", debugstr_w(template)); + p = strchrW( template, ';' ); + if (p && match_language( package, atoiW( p + 1 ) )) + { + TRACE("applicable transform\n"); + ret = ERROR_SUCCESS; + } + /* FIXME: check platform */ + msiobj_release( &si->hdr ); + } + +end: + msi_free( patch_product ); + msi_free( prod_code ); + msi_free( template ); + return ret; +} + +static UINT apply_substorage_transform( MSIPACKAGE *package, MSIDATABASE *patch_db, LPCWSTR name ) +{ + UINT ret = ERROR_FUNCTION_FAILED; + IStorage *stg = NULL; + HRESULT r; + + TRACE("%p %s\n", package, debugstr_w(name)); + + if (*name++ != ':') + { + ERR("expected a colon in %s\n", debugstr_w(name)); + return ERROR_FUNCTION_FAILED; + } + r = IStorage_OpenStorage( patch_db->storage, name, NULL, STGM_SHARE_EXCLUSIVE, NULL, 0, &stg ); + if (SUCCEEDED(r)) + { + ret = check_transform_applicable( package, stg ); + if (ret == ERROR_SUCCESS) + msi_table_apply_transform( package->db, stg ); + else + TRACE("substorage transform %s wasn't applicable\n", debugstr_w(name)); + IStorage_Release( stg ); + } + else + { + ERR("failed to open substorage %s\n", debugstr_w(name)); + } + return ERROR_SUCCESS; +} + +UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si ) +{ + LPWSTR guid_list, *guids, product_code; + UINT i, ret = ERROR_FUNCTION_FAILED; + + product_code = msi_dup_property( package->db, szProductCode ); + if (!product_code) + { + /* FIXME: the property ProductCode should be written into the DB somewhere */ + ERR("no product code to check\n"); + return ERROR_SUCCESS; + } + guid_list = msi_suminfo_dup_string( si, PID_TEMPLATE ); + guids = msi_split_string( guid_list, ';' ); + for (i = 0; guids[i] && ret != ERROR_SUCCESS; i++) + { + if (!strcmpW( guids[i], product_code )) ret = ERROR_SUCCESS; + } + msi_free( guids ); + msi_free( guid_list ); + msi_free( product_code ); + return ret; +} + +static UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch ) +{ + MSIPATCHINFO *pi; + UINT r = ERROR_SUCCESS; + WCHAR *p; + + if (!(pi = msi_alloc_zero( sizeof(MSIPATCHINFO) ))) + { + return ERROR_OUTOFMEMORY; + } + if (!(pi->patchcode = msi_suminfo_dup_string( si, PID_REVNUMBER ))) + { + msi_free( pi ); + return ERROR_OUTOFMEMORY; + } + p = pi->patchcode; + if (*p != '{') + { + msi_free( pi->patchcode ); + msi_free( pi ); + return ERROR_PATCH_PACKAGE_INVALID; + } + if (!(p = strchrW( p + 1, '}' ))) + { + msi_free( pi->patchcode ); + msi_free( pi ); + return ERROR_PATCH_PACKAGE_INVALID; + } + if (p[1]) + { + FIXME("patch obsoletes %s\n", debugstr_w(p + 1)); + p[1] = 0; + } + TRACE("patch code %s\n", debugstr_w(pi->patchcode)); + if (!(pi->products = msi_suminfo_dup_string( si, PID_TEMPLATE ))) + { + msi_free( pi->patchcode ); + msi_free( pi ); + return ERROR_OUTOFMEMORY; + } + if (!(pi->transforms = msi_suminfo_dup_string( si, PID_LASTAUTHOR ))) + { + msi_free( pi->patchcode ); + msi_free( pi->products ); + msi_free( pi ); + return ERROR_OUTOFMEMORY; + } + *patch = pi; + return r; +} + +static UINT patch_set_media_source_prop( MSIPACKAGE *package ) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','`','S','o','u','r','c','e','`',' ','F','R','O','M',' ', + '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ','`','S','o','u','r','c','e','`',' ', + 'I','S',' ','N','O','T',' ','N','U','L','L',0}; + MSIQUERY *view; + MSIRECORD *rec; + const WCHAR *property; + WCHAR *patch; + UINT r; + + r = MSI_DatabaseOpenViewW( package->db, query, &view ); + if (r != ERROR_SUCCESS) + return r; + + r = MSI_ViewExecute( view, 0 ); + if (r != ERROR_SUCCESS) + goto done; + + if (MSI_ViewFetch( view, &rec ) == ERROR_SUCCESS) + { + property = MSI_RecordGetString( rec, 1 ); + patch = msi_dup_property( package->db, szPatch ); + msi_set_property( package->db, property, patch ); + msi_free( patch ); + msiobj_release( &rec->hdr ); + } + +done: + msiobj_release( &view->hdr ); + return r; +} + +struct patch_offset +{ + struct list entry; + WCHAR *name; + UINT sequence; +}; + +struct patch_offset_list +{ + struct list files; + UINT count, min, max; + UINT offset_to_apply; +}; + +static struct patch_offset_list *patch_offset_list_create( void ) +{ + struct patch_offset_list *pos = msi_alloc( sizeof(struct patch_offset_list) ); + list_init( &pos->files ); + pos->count = pos->max = 0; + pos->min = 999999; + return pos; +} + +static void patch_offset_list_free( struct patch_offset_list *pos ) +{ + struct patch_offset *po, *po2; + + LIST_FOR_EACH_ENTRY_SAFE( po, po2, &pos->files, struct patch_offset, entry ) + { + msi_free( po->name ); + msi_free( po ); + } + msi_free( pos ); +} + +static void patch_offset_get_patches( MSIDATABASE *db, UINT last_sequence, struct patch_offset_list *pos ) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','P','a','t','c','h',' ', + 'W','H','E','R','E',' ','S','e','q','u','e','n','c','e',' ','<','=',' ','?',' ', + 'O','R','D','E','R',' ','B','Y',' ','S','e','q','u','e','n','c','e',0}; + MSIQUERY *view; + MSIRECORD *rec; + UINT r; + + r = MSI_DatabaseOpenViewW( db, query, &view ); + if (r != ERROR_SUCCESS) + return; + + rec = MSI_CreateRecord( 1 ); + MSI_RecordSetInteger( rec, 1, last_sequence ); + + r = MSI_ViewExecute( view, rec ); + msiobj_release( &rec->hdr ); + if (r != ERROR_SUCCESS) + return; + + while (MSI_ViewFetch( view, &rec ) == ERROR_SUCCESS) + { + UINT sequence = MSI_RecordGetInteger( rec, 2 ); + + /* FIXME: we only use the max/min sequence numbers for now */ + pos->min = min( pos->min, sequence ); + pos->max = max( pos->max, sequence ); + pos->count++; + msiobj_release( &rec->hdr ); + } + msiobj_release( &view->hdr ); +} + +static void patch_offset_get_files( MSIDATABASE *db, UINT last_sequence, struct patch_offset_list *pos ) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','F','i','l','e',' ', + 'W','H','E','R','E',' ','S','e','q','u','e','n','c','e',' ','<','=',' ','?',' ', + 'O','R','D','E','R',' ','B','Y',' ','S','e','q','u','e','n','c','e',0}; + MSIQUERY *view; + MSIRECORD *rec; + UINT r; + + r = MSI_DatabaseOpenViewW( db, query, &view ); + if (r != ERROR_SUCCESS) + return; + + rec = MSI_CreateRecord( 1 ); + MSI_RecordSetInteger( rec, 1, last_sequence ); + + r = MSI_ViewExecute( view, rec ); + msiobj_release( &rec->hdr ); + if (r != ERROR_SUCCESS) + return; + + while (MSI_ViewFetch( view, &rec ) == ERROR_SUCCESS) + { + UINT attributes = MSI_RecordGetInteger( rec, 7 ); + if (attributes & msidbFileAttributesPatchAdded) + { + struct patch_offset *po = msi_alloc( sizeof(struct patch_offset) ); + + po->name = msi_dup_record_field( rec, 1 ); + po->sequence = MSI_RecordGetInteger( rec, 8 ); + pos->min = min( pos->min, po->sequence ); + pos->max = max( pos->max, po->sequence ); + list_add_tail( &pos->files, &po->entry ); + pos->count++; + } + msiobj_release( &rec->hdr ); + } + msiobj_release( &view->hdr ); +} + +static UINT patch_offset_modify_db( MSIDATABASE *db, struct patch_offset_list *pos ) +{ + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','F','i','l','e',' ', + 'W','H','E','R','E',' ','S','e','q','u','e','n','c','e',' ','>','=',' ','?',' ', + 'A','N','D',' ','S','e','q','u','e','n','c','e',' ','<','=',' ','?',' ', + 'O','R','D','E','R',' ','B','Y',' ','S','e','q','u','e','n','c','e',0}; + struct patch_offset *po; + MSIRECORD *rec; + MSIQUERY *view; + UINT r; + + r = MSI_DatabaseOpenViewW( db, query, &view ); + if (r != ERROR_SUCCESS) + return ERROR_SUCCESS; + + rec = MSI_CreateRecord( 2 ); + MSI_RecordSetInteger( rec, 1, pos->min ); + MSI_RecordSetInteger( rec, 2, pos->max ); + + r = MSI_ViewExecute( view, rec ); + msiobj_release( &rec->hdr ); + if (r != ERROR_SUCCESS) + goto done; + + LIST_FOR_EACH_ENTRY( po, &pos->files, struct patch_offset, entry ) + { + UINT r_fetch; + while ((r_fetch = MSI_ViewFetch( view, &rec )) == ERROR_SUCCESS) + { + const WCHAR *file = MSI_RecordGetString( rec, 1 ); + UINT seq; + + if (!strcmpiW( file, po->name )) + { + /* update record */ + seq = MSI_RecordGetInteger( rec, 8 ); + MSI_RecordSetInteger( rec, 8, seq + pos->offset_to_apply ); + r = MSI_ViewModify( view, MSIMODIFY_UPDATE, rec ); + if (r != ERROR_SUCCESS) + ERR("Failed to update offset for file %s\n", debugstr_w(file)); + msiobj_release( &rec->hdr ); + break; + } + msiobj_release( &rec->hdr ); + } + if (r_fetch != ERROR_SUCCESS) break; + } + +done: + msiobj_release( &view->hdr ); + return ERROR_SUCCESS; +} + +static const WCHAR patch_media_query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','M','e','d','i','a','`',' ', + 'W','H','E','R','E',' ','`','S','o','u','r','c','e','`',' ','I','S',' ','N','O','T',' ','N','U','L','L',' ', + 'A','N','D',' ','`','C','a','b','i','n','e','t','`',' ','I','S',' ','N','O','T',' ','N','U','L','L',' ', + 'O','R','D','E','R',' ','B','Y',' ','`','D','i','s','k','I','d','`',0}; + +struct patch_media +{ + struct list entry; + UINT disk_id; + UINT last_sequence; + WCHAR *prompt; + WCHAR *cabinet; + WCHAR *volume; + WCHAR *source; +}; + +static UINT add_patch_media( MSIPACKAGE *package, IStorage *patch ) +{ + static const WCHAR delete_query[] = { + 'D','E','L','E','T','E',' ','F','R','O','M',' ','`','M','e','d','i','a','`',' ', + 'W','H','E','R','E',' ','`','D','i','s','k','I','d','`','=','?',0}; + static const WCHAR insert_query[] = { + 'I','N','S','E','R','T',' ','I','N','T','O',' ','`','M','e','d','i','a','`',' ', + '(','`','D','i','s','k','I','d','`',',','`','L','a','s','t','S','e','q','u','e','n','c','e','`',',', + '`','D','i','s','k','P','r','o','m','p','t','`',',','`','C','a','b','i','n','e','t','`',',', + '`','V','o','l','u','m','e','L','a','b','e','l','`',',','`','S','o','u','r','c','e','`',')',' ', + 'V','A','L','U','E','S',' ','(','?',',','?',',','?',',','?',',','?',',','?',')',0}; + MSIQUERY *view; + MSIRECORD *rec; + UINT r, disk_id; + struct list media_list; + struct patch_media *media, *next; + + r = MSI_DatabaseOpenViewW( package->db, patch_media_query, &view ); + if (r != ERROR_SUCCESS) return r; + + r = MSI_ViewExecute( view, 0 ); + if (r != ERROR_SUCCESS) + { + msiobj_release( &view->hdr ); + TRACE("query failed %u\n", r); + return r; + } + list_init( &media_list ); + while (MSI_ViewFetch( view, &rec ) == ERROR_SUCCESS) + { + disk_id = MSI_RecordGetInteger( rec, 1 ); + TRACE("disk_id %u\n", disk_id); + if (disk_id >= MSI_INITIAL_MEDIA_TRANSFORM_DISKID) + { + msiobj_release( &rec->hdr ); + continue; + } + if (!(media = msi_alloc( sizeof( *media )))) goto done; + media->disk_id = disk_id; + media->last_sequence = MSI_RecordGetInteger( rec, 2 ); + media->prompt = msi_dup_record_field( rec, 3 ); + media->cabinet = msi_dup_record_field( rec, 4 ); + media->volume = msi_dup_record_field( rec, 5 ); + media->source = msi_dup_record_field( rec, 6 ); + + list_add_tail( &media_list, &media->entry ); + msiobj_release( &rec->hdr ); + } + LIST_FOR_EACH_ENTRY( media, &media_list, struct patch_media, entry ) + { + MSIQUERY *delete_view, *insert_view; + + r = MSI_DatabaseOpenViewW( package->db, delete_query, &delete_view ); + if (r != ERROR_SUCCESS) goto done; + + rec = MSI_CreateRecord( 1 ); + MSI_RecordSetInteger( rec, 1, media->disk_id ); + + r = MSI_ViewExecute( delete_view, rec ); + msiobj_release( &delete_view->hdr ); + msiobj_release( &rec->hdr ); + if (r != ERROR_SUCCESS) goto done; + + r = MSI_DatabaseOpenViewW( package->db, insert_query, &insert_view ); + if (r != ERROR_SUCCESS) goto done; + + disk_id = package->db->media_transform_disk_id; + TRACE("disk id %u\n", disk_id); + TRACE("last sequence %u\n", media->last_sequence); + TRACE("prompt %s\n", debugstr_w(media->prompt)); + TRACE("cabinet %s\n", debugstr_w(media->cabinet)); + TRACE("volume %s\n", debugstr_w(media->volume)); + TRACE("source %s\n", debugstr_w(media->source)); + + rec = MSI_CreateRecord( 6 ); + MSI_RecordSetInteger( rec, 1, disk_id ); + MSI_RecordSetInteger( rec, 2, media->last_sequence ); + MSI_RecordSetStringW( rec, 3, media->prompt ); + MSI_RecordSetStringW( rec, 4, media->cabinet ); + MSI_RecordSetStringW( rec, 5, media->volume ); + MSI_RecordSetStringW( rec, 6, media->source ); + + r = MSI_ViewExecute( insert_view, rec ); + msiobj_release( &insert_view->hdr ); + msiobj_release( &rec->hdr ); + if (r != ERROR_SUCCESS) goto done; + + r = msi_add_cabinet_stream( package, disk_id, patch, media->cabinet ); + if (r != ERROR_SUCCESS) WARN("failed to add cabinet stream %u\n", r); + package->db->media_transform_disk_id++; + } + +done: + msiobj_release( &view->hdr ); + LIST_FOR_EACH_ENTRY_SAFE( media, next, &media_list, struct patch_media, entry ) + { + list_remove( &media->entry ); + msi_free( media->prompt ); + msi_free( media->cabinet ); + msi_free( media->volume ); + msi_free( media->source ); + msi_free( media ); + } + return r; +} + +static UINT set_patch_offsets( MSIDATABASE *db ) +{ + MSIQUERY *view; + MSIRECORD *rec; + UINT r; + + r = MSI_DatabaseOpenViewW( db, patch_media_query, &view ); + if (r != ERROR_SUCCESS) + return r; + + r = MSI_ViewExecute( view, 0 ); + if (r != ERROR_SUCCESS) + goto done; + + while (MSI_ViewFetch( view, &rec ) == ERROR_SUCCESS) + { + UINT last_sequence = MSI_RecordGetInteger( rec, 2 ); + struct patch_offset_list *pos; + + /* FIXME: set/check Source field instead? */ + if (last_sequence >= MSI_INITIAL_MEDIA_TRANSFORM_OFFSET) + { + msiobj_release( &rec->hdr ); + continue; + } + pos = patch_offset_list_create(); + patch_offset_get_files( db, last_sequence, pos ); + patch_offset_get_patches( db, last_sequence, pos ); + if (pos->count) + { + UINT offset = db->media_transform_offset - pos->min; + last_sequence = offset + pos->max; + + /* FIXME: this is for the patch table, which is not yet properly transformed */ + last_sequence += pos->min; + pos->offset_to_apply = offset; + patch_offset_modify_db( db, pos ); + + MSI_RecordSetInteger( rec, 2, last_sequence ); + r = MSI_ViewModify( view, MSIMODIFY_UPDATE, rec ); + if (r != ERROR_SUCCESS) + ERR("Failed to update Media table entry, expect breakage (%u)\n", r); + db->media_transform_offset = last_sequence + 1; + } + patch_offset_list_free( pos ); + msiobj_release( &rec->hdr ); + } + +done: + msiobj_release( &view->hdr ); + return r; +} + +static UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIPATCHINFO *patch ) +{ + UINT i, r = ERROR_SUCCESS; + WCHAR **substorage; + + /* apply substorage transforms */ + substorage = msi_split_string( patch->transforms, ';' ); + for (i = 0; substorage && substorage[i] && r == ERROR_SUCCESS; i++) + { + r = apply_substorage_transform( package, patch_db, substorage[i] ); + if (r == ERROR_SUCCESS) + { + add_patch_media( package, patch_db->storage ); + set_patch_offsets( package->db ); + } + } + msi_free( substorage ); + if (r != ERROR_SUCCESS) + return r; + + patch_set_media_source_prop( package ); + + patch->state = MSIPATCHSTATE_APPLIED; + list_add_tail( &package->patches, &patch->entry ); + return ERROR_SUCCESS; +} + +void msi_free_patchinfo( MSIPATCHINFO *patch ) +{ + msi_free( patch->patchcode ); + msi_free( patch->products ); + msi_free( patch->transforms ); + msi_free( patch->filename ); + msi_free( patch->localfile ); + msi_free( patch ); +} + +static UINT msi_apply_patch_package( MSIPACKAGE *package, const WCHAR *file ) +{ + static const WCHAR dotmsp[] = {'.','m','s','p',0}; + MSIDATABASE *patch_db = NULL; + WCHAR localfile[MAX_PATH]; + MSISUMMARYINFO *si; + MSIPATCHINFO *patch = NULL; + UINT r = ERROR_SUCCESS; + + TRACE("%p %s\n", package, debugstr_w(file)); + + r = MSI_OpenDatabaseW( file, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &patch_db ); + if (r != ERROR_SUCCESS) + { + ERR("failed to open patch collection %s\n", debugstr_w( file ) ); + return r; + } + if (!(si = MSI_GetSummaryInformationW( patch_db->storage, 0 ))) + { + msiobj_release( &patch_db->hdr ); + return ERROR_FUNCTION_FAILED; + } + r = msi_check_patch_applicable( package, si ); + if (r != ERROR_SUCCESS) + { + TRACE("patch not applicable\n"); + r = ERROR_SUCCESS; + goto done; + } + r = msi_parse_patch_summary( si, &patch ); + if ( r != ERROR_SUCCESS ) + goto done; + + r = msi_create_empty_local_file( localfile, dotmsp ); + if ( r != ERROR_SUCCESS ) + goto done; + + r = ERROR_OUTOFMEMORY; + if (!(patch->filename = strdupW( file ))) goto done; + if (!(patch->localfile = strdupW( localfile ))) goto done; + + r = msi_apply_patch_db( package, patch_db, patch ); + if (r != ERROR_SUCCESS) WARN("patch failed to apply %u\n", r); + +done: + msiobj_release( &si->hdr ); + msiobj_release( &patch_db->hdr ); + if (patch && r != ERROR_SUCCESS) + { + DeleteFileW( patch->localfile ); + msi_free_patchinfo( patch ); + } + return r; +} + +/* get the PATCH property, and apply all the patches it specifies */ +UINT msi_apply_patches( MSIPACKAGE *package ) +{ + LPWSTR patch_list, *patches; + UINT i, r = ERROR_SUCCESS; + + patch_list = msi_dup_property( package->db, szPatch ); + + TRACE("patches to be applied: %s\n", debugstr_w(patch_list)); + + patches = msi_split_string( patch_list, ';' ); + for (i = 0; patches && patches[i] && r == ERROR_SUCCESS; i++) + r = msi_apply_patch_package( package, patches[i] ); + + msi_free( patches ); + msi_free( patch_list ); + return r; +} + +UINT msi_apply_transforms( MSIPACKAGE *package ) +{ + static const WCHAR szTransforms[] = {'T','R','A','N','S','F','O','R','M','S',0}; + LPWSTR xform_list, *xforms; + UINT i, r = ERROR_SUCCESS; + + xform_list = msi_dup_property( package->db, szTransforms ); + xforms = msi_split_string( xform_list, ';' ); + + for (i = 0; xforms && xforms[i] && r == ERROR_SUCCESS; i++) + { + if (xforms[i][0] == ':') + r = apply_substorage_transform( package, package->db, xforms[i] ); + else + { + WCHAR *transform; + + if (!PathIsRelativeW( xforms[i] )) transform = xforms[i]; + else + { + WCHAR *p = strrchrW( package->PackagePath, '\\' ); + DWORD len = p - package->PackagePath + 1; + + if (!(transform = msi_alloc( (len + strlenW( xforms[i] ) + 1) * sizeof(WCHAR)) )) + { + msi_free( xforms ); + msi_free( xform_list ); + return ERROR_OUTOFMEMORY; + } + memcpy( transform, package->PackagePath, len * sizeof(WCHAR) ); + memcpy( transform + len, xforms[i], (strlenW( xforms[i] ) + 1) * sizeof(WCHAR) ); + } + r = MSI_DatabaseApplyTransformW( package->db, transform, 0 ); + if (transform != xforms[i]) msi_free( transform ); + } + } + msi_free( xforms ); + msi_free( xform_list ); + return r; +} + +UINT msi_apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code ) +{ + UINT r; + DWORD len; + WCHAR patch_file[MAX_PATH]; + MSIDATABASE *patch_db; + MSIPATCHINFO *patch_info; + MSISUMMARYINFO *si; + + len = sizeof(patch_file) / sizeof(WCHAR); + r = MsiGetPatchInfoExW( patch_code, package->ProductCode, NULL, package->Context, + INSTALLPROPERTY_LOCALPACKAGEW, patch_file, &len ); + if (r != ERROR_SUCCESS) + { + ERR("failed to get patch filename %u\n", r); + return r; + } + r = MSI_OpenDatabaseW( patch_file, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &patch_db ); + if (r != ERROR_SUCCESS) + { + ERR("failed to open patch database %s\n", debugstr_w( patch_file )); + return r; + } + si = MSI_GetSummaryInformationW( patch_db->storage, 0 ); + if (!si) + { + msiobj_release( &patch_db->hdr ); + return ERROR_FUNCTION_FAILED; + } + r = msi_parse_patch_summary( si, &patch_info ); + msiobj_release( &si->hdr ); + if (r != ERROR_SUCCESS) + { + ERR("failed to parse patch summary %u\n", r); + msiobj_release( &patch_db->hdr ); + return r; + } + patch_info->localfile = strdupW( patch_file ); + if (!patch_info->localfile) + { + msiobj_release( &patch_db->hdr ); + msi_free_patchinfo( patch_info ); + return ERROR_OUTOFMEMORY; + } + r = msi_apply_patch_db( package, patch_db, patch_info ); + msiobj_release( &patch_db->hdr ); + if (r != ERROR_SUCCESS) + { + ERR("failed to apply patch %u\n", r); + msi_free_patchinfo( patch_info ); + } + return r; +} diff --git a/reactos/dll/win32/msi/preview.c b/reactos/dll/win32/msi/preview.c deleted file mode 100644 index 458e4a1cb0b..00000000000 --- a/reactos/dll/win32/msi/preview.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Implementation of the Microsoft Installer (msi.dll) - * - * Copyright 2005 Mike McCormack 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 - */ - -#define COBJMACROS - -#include - -#include "windef.h" -#include "winbase.h" -#include "winnls.h" -#include "msi.h" -#include "msipriv.h" -#include "msiserver.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -WINE_DEFAULT_DEBUG_CHANNEL(msi); - -static void MSI_ClosePreview( MSIOBJECTHDR *arg ) -{ - MSIPREVIEW *preview = (MSIPREVIEW *) arg; - - msiobj_release( &preview->package->hdr ); -} - -static MSIPREVIEW *MSI_EnableUIPreview( MSIDATABASE *db ) -{ - MSIPREVIEW *preview = NULL; - MSIPACKAGE *package; - - package = MSI_CreatePackage( db, NULL ); - if( package ) - { - preview = alloc_msiobject( MSIHANDLETYPE_PREVIEW, sizeof (MSIPREVIEW), - MSI_ClosePreview ); - if( preview ) - { - preview->package = package; - msiobj_addref( &package->hdr ); - } - msiobj_release( &package->hdr ); - } - return preview; -} - -UINT WINAPI MsiEnableUIPreview( MSIHANDLE hdb, MSIHANDLE* phPreview ) -{ - MSIDATABASE *db; - MSIPREVIEW *preview; - UINT r = ERROR_FUNCTION_FAILED; - - TRACE("%d %p\n", hdb, phPreview); - - db = msihandle2msiinfo( hdb, MSIHANDLETYPE_DATABASE ); - if( !db ) - { - IWineMsiRemoteDatabase *remote_database; - - remote_database = (IWineMsiRemoteDatabase *)msi_get_remote( hdb ); - if ( !remote_database ) - return ERROR_INVALID_HANDLE; - - *phPreview = 0; - - IWineMsiRemoteDatabase_Release( remote_database ); - WARN("MsiEnableUIPreview not allowed during a custom action!\n"); - - return ERROR_FUNCTION_FAILED; - } - - preview = MSI_EnableUIPreview( db ); - if( preview ) - { - *phPreview = alloc_msihandle( &preview->hdr ); - msiobj_release( &preview->hdr ); - r = ERROR_SUCCESS; - if (! *phPreview) - r = ERROR_NOT_ENOUGH_MEMORY; - } - msiobj_release( &db->hdr ); - - return r; -} - -static UINT preview_event_handler( MSIPACKAGE *package, LPCWSTR event, - LPCWSTR argument, msi_dialog *dialog ) -{ - MESSAGE("Preview dialog event '%s' (arg='%s')\n", - debugstr_w( event ), debugstr_w( argument )); - return ERROR_SUCCESS; -} - -static UINT MSI_PreviewDialogW( MSIPREVIEW *preview, LPCWSTR szDialogName ) -{ - msi_dialog *dialog = NULL; - UINT r = ERROR_SUCCESS; - - if( preview->dialog ) - msi_dialog_destroy( preview->dialog ); - - /* an empty name means we should just destroy the current preview dialog */ - if( szDialogName ) - { - dialog = msi_dialog_create( preview->package, szDialogName, NULL, - preview_event_handler ); - if( dialog ) - msi_dialog_do_preview( dialog ); - else - r = ERROR_FUNCTION_FAILED; - } - preview->dialog = dialog; - - return r; -} - -UINT WINAPI MsiPreviewDialogW( MSIHANDLE hPreview, LPCWSTR szDialogName ) -{ - MSIPREVIEW *preview; - UINT r; - - TRACE("%d %s\n", hPreview, debugstr_w(szDialogName)); - - preview = msihandle2msiinfo( hPreview, MSIHANDLETYPE_PREVIEW ); - if( !preview ) - return ERROR_INVALID_HANDLE; - - r = MSI_PreviewDialogW( preview, szDialogName ); - - msiobj_release( &preview->hdr ); - - return r; -} - -UINT WINAPI MsiPreviewDialogA( MSIHANDLE hPreview, LPCSTR szDialogName ) -{ - UINT r; - LPWSTR strW = NULL; - - TRACE("%d %s\n", hPreview, debugstr_a(szDialogName)); - - if( szDialogName ) - { - strW = strdupAtoW( szDialogName ); - if( !strW ) - return ERROR_OUTOFMEMORY; - } - r = MsiPreviewDialogW( hPreview, strW ); - msi_free( strW ); - return r; -} - -UINT WINAPI MsiPreviewBillboardW( MSIHANDLE hPreview, LPCWSTR szControlName, - LPCWSTR szBillboard) -{ - FIXME("%d %s %s\n", hPreview, debugstr_w(szControlName), - debugstr_w(szBillboard)); - return ERROR_CALL_NOT_IMPLEMENTED; -} - -UINT WINAPI MsiPreviewBillboardA( MSIHANDLE hPreview, LPCSTR szControlName, - LPCSTR szBillboard) -{ - FIXME("%d %s %s\n", hPreview, debugstr_a(szControlName), - debugstr_a(szBillboard)); - return ERROR_CALL_NOT_IMPLEMENTED; -} diff --git a/reactos/dll/win32/msi/query.h b/reactos/dll/win32/msi/query.h index a43663de697..ca34b4c5d38 100644 --- a/reactos/dll/win32/msi/query.h +++ b/reactos/dll/win32/msi/query.h @@ -68,10 +68,19 @@ struct complex_expr struct expr *right; }; -struct ext_column +struct tagJOINTABLE; +union ext_column { - LPCWSTR column; - LPCWSTR table; + struct + { + LPCWSTR column; + LPCWSTR table; + } unparsed; + struct + { + UINT column; + struct tagJOINTABLE *table; + } parsed; }; struct expr @@ -83,53 +92,50 @@ struct expr INT ival; UINT uval; LPCWSTR sval; - struct ext_column column; - UINT col_number; + union ext_column column; } u; }; UINT MSI_ParseSQL( MSIDATABASE *db, LPCWSTR command, MSIVIEW **phview, - struct list *mem ); + struct list *mem ) DECLSPEC_HIDDEN; -UINT TABLE_CreateView( MSIDATABASE *db, LPCWSTR name, MSIVIEW **view ); +UINT TABLE_CreateView( MSIDATABASE *db, LPCWSTR name, MSIVIEW **view ) DECLSPEC_HIDDEN; UINT SELECT_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table, - const column_info *columns ); + const column_info *columns ) DECLSPEC_HIDDEN; -UINT DISTINCT_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table ); +UINT DISTINCT_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table ) DECLSPEC_HIDDEN; UINT ORDER_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table, - column_info *columns ); + column_info *columns ) DECLSPEC_HIDDEN; -UINT WHERE_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table, - struct expr *cond ); +UINT WHERE_CreateView( MSIDATABASE *db, MSIVIEW **view, LPWSTR tables, + struct expr *cond ) DECLSPEC_HIDDEN; UINT CREATE_CreateView( MSIDATABASE *db, MSIVIEW **view, LPCWSTR table, - column_info *col_info, BOOL hold ); + column_info *col_info, BOOL hold ) DECLSPEC_HIDDEN; UINT INSERT_CreateView( MSIDATABASE *db, MSIVIEW **view, LPCWSTR table, - column_info *columns, column_info *values, BOOL temp ); + column_info *columns, column_info *values, BOOL temp ) DECLSPEC_HIDDEN; -UINT UPDATE_CreateView( MSIDATABASE *db, MSIVIEW **view, LPCWSTR table, - column_info *list, struct expr *expr ); +UINT UPDATE_CreateView( MSIDATABASE *db, MSIVIEW **view, LPWSTR table, + column_info *list, struct expr *expr ) DECLSPEC_HIDDEN; -UINT DELETE_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table ); +UINT DELETE_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table ) DECLSPEC_HIDDEN; -UINT JOIN_CreateView( MSIDATABASE *db, MSIVIEW **view, LPWSTR tables ); +UINT ALTER_CreateView( MSIDATABASE *db, MSIVIEW **view, LPCWSTR name, column_info *colinfo, int hold ) DECLSPEC_HIDDEN; -UINT ALTER_CreateView( MSIDATABASE *db, MSIVIEW **view, LPCWSTR name, column_info *colinfo, int hold ); +UINT STREAMS_CreateView( MSIDATABASE *db, MSIVIEW **view ) DECLSPEC_HIDDEN; -UINT STREAMS_CreateView( MSIDATABASE *db, MSIVIEW **view ); +UINT STORAGES_CreateView( MSIDATABASE *db, MSIVIEW **view ) DECLSPEC_HIDDEN; -UINT STORAGES_CreateView( MSIDATABASE *db, MSIVIEW **view ); +UINT DROP_CreateView( MSIDATABASE *db, MSIVIEW **view, LPCWSTR name ) DECLSPEC_HIDDEN; -UINT DROP_CreateView( MSIDATABASE *db, MSIVIEW **view, LPCWSTR name ); +int sqliteGetToken(const WCHAR *z, int *tokenType, int *skip) DECLSPEC_HIDDEN; -int sqliteGetToken(const WCHAR *z, int *tokenType); - -MSIRECORD *msi_query_merge_record( UINT fields, const column_info *vl, MSIRECORD *rec ); +MSIRECORD *msi_query_merge_record( UINT fields, const column_info *vl, MSIRECORD *rec ) DECLSPEC_HIDDEN; UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info, - MSICONDITION persistent, MSITABLE **table_ret); + MSICONDITION persistent ) DECLSPEC_HIDDEN; #endif /* __WINE_MSI_QUERY_H */ diff --git a/reactos/dll/win32/msi/record.c b/reactos/dll/win32/msi/record.c index fc30f793436..1dace787906 100644 --- a/reactos/dll/win32/msi/record.c +++ b/reactos/dll/win32/msi/record.c @@ -494,6 +494,7 @@ UINT MSI_RecordGetStringW(MSIRECORD *rec, UINT iField, case MSIFIELD_NULL: if( szValue && *pcchValue > 0 ) szValue[0] = 0; + break; default: break; } @@ -833,7 +834,7 @@ UINT MSI_RecordReadStream(MSIRECORD *rec, UINT iField, char *buf, LPDWORD sz) ofs.QuadPart = cur.QuadPart = 0; end.QuadPart = 0; - r = IStream_Seek( stm, ofs, STREAM_SEEK_SET, &cur ); + IStream_Seek( stm, ofs, STREAM_SEEK_SET, &cur ); IStream_Seek( stm, ofs, STREAM_SEEK_END, &end ); ofs.QuadPart = cur.QuadPart; IStream_Seek( stm, ofs, STREAM_SEEK_SET, &cur ); @@ -994,6 +995,34 @@ MSIRECORD *MSI_CloneRecord(MSIRECORD *rec) return clone; } +BOOL MSI_RecordsAreFieldsEqual(MSIRECORD *a, MSIRECORD *b, UINT field) +{ + if (a->fields[field].type != b->fields[field].type) + return FALSE; + + switch (a->fields[field].type) + { + case MSIFIELD_NULL: + break; + + case MSIFIELD_INT: + if (a->fields[field].u.iVal != b->fields[field].u.iVal) + return FALSE; + break; + + case MSIFIELD_WSTR: + if (strcmpW(a->fields[field].u.szwVal, b->fields[field].u.szwVal)) + return FALSE; + break; + + case MSIFIELD_STREAM: + default: + return FALSE; + } + return TRUE; +} + + BOOL MSI_RecordsAreEqual(MSIRECORD *a, MSIRECORD *b) { UINT i; @@ -1003,29 +1032,35 @@ BOOL MSI_RecordsAreEqual(MSIRECORD *a, MSIRECORD *b) for (i = 0; i <= a->count; i++) { - if (a->fields[i].type != b->fields[i].type) + if (!MSI_RecordsAreFieldsEqual( a, b, i )) return FALSE; - - switch (a->fields[i].type) - { - case MSIFIELD_NULL: - break; - - case MSIFIELD_INT: - if (a->fields[i].u.iVal != b->fields[i].u.iVal) - return FALSE; - break; - - case MSIFIELD_WSTR: - if (strcmpW(a->fields[i].u.szwVal, b->fields[i].u.szwVal)) - return FALSE; - break; - - case MSIFIELD_STREAM: - default: - return FALSE; - } } return TRUE; } + +WCHAR *msi_dup_record_field( MSIRECORD *rec, INT field ) +{ + DWORD sz = 0; + WCHAR *str; + UINT r; + + if (MSI_RecordIsNull( rec, field )) return NULL; + + r = MSI_RecordGetStringW( rec, field, NULL, &sz ); + if (r != ERROR_SUCCESS) + return NULL; + + sz++; + str = msi_alloc( sz * sizeof(WCHAR) ); + if (!str) return NULL; + str[0] = 0; + r = MSI_RecordGetStringW( rec, field, str, &sz ); + if (r != ERROR_SUCCESS) + { + ERR("failed to get string!\n"); + msi_free( str ); + return NULL; + } + return str; +} diff --git a/reactos/dll/win32/msi/registry.c b/reactos/dll/win32/msi/registry.c index 017aa2405c9..e5d2c519a96 100644 --- a/reactos/dll/win32/msi/registry.c +++ b/reactos/dll/win32/msi/registry.c @@ -44,225 +44,158 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); * This module will be all the helper functions for registry access by the * installer bits. */ -static const WCHAR szUserFeatures_fmt[] = { -'S','o','f','t','w','a','r','e','\\', -'M','i','c','r','o','s','o','f','t','\\', -'I','n','s','t','a','l','l','e','r','\\', -'F','e','a','t','u','r','e','s','\\', -'%','s',0}; static const WCHAR szUserDataFeatures_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'U','s','e','r','D','a','t','a','\\', -'%','s','\\','P','r','o','d','u','c','t','s','\\', -'%','s','\\','F','e','a','t','u','r','e','s',0}; - -static const WCHAR szInstaller_Features_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'F','e','a','t','u','r','e','s','\\', -'%','s',0}; - -static const WCHAR szInstaller_Components[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'C','o','m','p','o','n','e','n','t','s',0 }; - -static const WCHAR szUser_Components_fmt[] = { -'S','o','f','t','w','a','r','e','\\', -'M','i','c','r','o','s','o','f','t','\\', -'I','n','s','t','a','l','l','e','r','\\', -'C','o','m','p','o','n','e','n','t','s','\\', -'%','s',0}; + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','s','e','r','D','a','t','a','\\', + '%','s','\\','P','r','o','d','u','c','t','s','\\','%','s','\\','F','e','a','t','u','r','e','s',0}; static const WCHAR szUserDataComp_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'U','s','e','r','D','a','t','a','\\', -'%','s','\\','C','o','m','p','o','n','e','n','t','s','\\','%','s',0}; + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','s','e','r','D','a','t','a','\\', + '%','s','\\','C','o','m','p','o','n','e','n','t','s','\\','%','s',0}; -static const WCHAR szUninstall_fmt[] = { -'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','\\', -'U','n','i','n','s','t','a','l','l','\\', -'%','s',0 }; - -static const WCHAR szUninstall_32node_fmt[] = { -'S','o','f','t','w','a','r','e','\\', -'W','o','w','6','4','3','2','N','o','d','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','\\', -'U','n','i','n','s','t','a','l','l','\\', -'%','s',0 }; - -static const WCHAR szUserProduct[] = { -'S','o','f','t','w','a','r','e','\\', -'M','i','c','r','o','s','o','f','t','\\', -'I','n','s','t','a','l','l','e','r','\\', -'P','r','o','d','u','c','t','s',0}; - -static const WCHAR szUserProduct_fmt[] = { -'S','o','f','t','w','a','r','e','\\', -'M','i','c','r','o','s','o','f','t','\\', -'I','n','s','t','a','l','l','e','r','\\', -'P','r','o','d','u','c','t','s','\\', -'%','s',0}; - -static const WCHAR szUserPatch_fmt[] = { -'S','o','f','t','w','a','r','e','\\', -'M','i','c','r','o','s','o','f','t','\\', -'I','n','s','t','a','l','l','e','r','\\', -'P','a','t','c','h','e','s','\\', -'%','s',0}; - -static const WCHAR szInstaller_Products[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'P','r','o','d','u','c','t','s',0}; - -static const WCHAR szInstaller_Products_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'P','r','o','d','u','c','t','s','\\', -'%','s',0}; - -static const WCHAR szInstaller_Patches_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'P','a','t','c','h','e','s','\\', -'%','s',0}; - -static const WCHAR szInstaller_UpgradeCodes_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'U','p','g','r','a','d','e','C','o','d','e','s','\\', -'%','s',0}; - -static const WCHAR szInstaller_UserUpgradeCodes_fmt[] = { -'S','o','f','t','w','a','r','e','\\', -'M','i','c','r','o','s','o','f','t','\\', -'I','n','s','t','a','l','l','e','r','\\', -'U','p','g','r','a','d','e','C','o','d','e','s','\\', -'%','s',0}; +static const WCHAR szUserDataComponents_fmt[] = { + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','s','e','r','D','a','t','a','\\', + '%','s','\\','C','o','m','p','o','n','e','n','t','s',0}; static const WCHAR szUserDataProd_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'U','s','e','r','D','a','t','a','\\', -'%','s','\\','P','r','o','d','u','c','t','s','\\','%','s',0}; + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','s','e','r','D','a','t','a','\\', + '%','s','\\','P','r','o','d','u','c','t','s','\\','%','s',0}; + +static const WCHAR szUserDataProducts_fmt[] = { + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','s','e','r','D','a','t','a','\\', + '%','s','\\','P','r','o','d','u','c','t','s',0}; static const WCHAR szUserDataPatch_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'U','s','e','r','D','a','t','a','\\', -'%','s','\\','P','a','t','c','h','e','s','\\','%','s',0}; + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','s','e','r','D','a','t','a','\\', + '%','s','\\','P','a','t','c','h','e','s','\\','%','s',0}; + +static const WCHAR szUserDataPatches_fmt[] = { + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','s','e','r','D','a','t','a','\\', + '%','s','\\','P','a','t','c','h','e','s',0}; static const WCHAR szUserDataProductPatches_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'U','s','e','r','D','a','t','a','\\', -'%','s','\\','P','r','o','d','u','c','t','s','\\','%','s','\\', -'P','a','t','c','h','e','s',0}; + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','s','e','r','D','a','t','a','\\', + '%','s','\\','P','r','o','d','u','c','t','s','\\','%','s','\\','P','a','t','c','h','e','s',0}; static const WCHAR szInstallProperties_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'U','s','e','r','D','a','t','a','\\', -'%','s','\\','P','r','o','d','u','c','t','s','\\','%','s','\\', -'I','n','s','t','a','l','l','P','r','o','p','e','r','t','i','e','s',0}; - -static const WCHAR szInstaller_LocalClassesProd[] = { -'S','o','f','t','w','a','r','e','\\', -'C','l','a','s','s','e','s','\\', -'I','n','s','t','a','l','l','e','r','\\', -'P','r','o','d','u','c','t','s',0}; - -static const WCHAR szInstaller_LocalClassesProd_fmt[] = { -'S','o','f','t','w','a','r','e','\\', -'C','l','a','s','s','e','s','\\', -'I','n','s','t','a','l','l','e','r','\\', -'P','r','o','d','u','c','t','s','\\','%','s',0}; - -static const WCHAR szInstaller_LocalClassesFeat_fmt[] = { -'S','o','f','t','w','a','r','e','\\', -'C','l','a','s','s','e','s','\\', -'I','n','s','t','a','l','l','e','r','\\', -'F','e','a','t','u','r','e','s','\\','%','s',0}; + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','s','e','r','D','a','t','a','\\', + '%','s','\\','P','r','o','d','u','c','t','s','\\','%','s','\\', + 'I','n','s','t','a','l','l','P','r','o','p','e','r','t','i','e','s',0}; static const WCHAR szInstaller_LocalManaged_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'M','a','n','a','g','e','d','\\','%','s','\\', -'I','n','s','t','a','l','l','e','r','\\', -'P','r','o','d','u','c','t','s',0}; + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','M','a','n','a','g','e','d','\\','%','s','\\', + 'I','n','s','t','a','l','l','e','r','\\','P','r','o','d','u','c','t','s',0}; static const WCHAR szInstaller_LocalManagedProd_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'M','a','n','a','g','e','d','\\','%','s','\\', -'I','n','s','t','a','l','l','e','r','\\', -'P','r','o','d','u','c','t','s','\\','%','s',0}; + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','M','a','n','a','g','e','d','\\','%','s','\\', + 'I','n','s','t','a','l','l','e','r','\\','P','r','o','d','u','c','t','s','\\','%','s',0}; static const WCHAR szInstaller_LocalManagedFeat_fmt[] = { -'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','\\', -'I','n','s','t','a','l','l','e','r','\\', -'M','a','n','a','g','e','d','\\','%','s','\\', -'I','n','s','t','a','l','l','e','r','\\', -'F','e','a','t','u','r','e','s','\\','%','s',0}; + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','M','a','n','a','g','e','d','\\','%','s','\\', + 'I','n','s','t','a','l','l','e','r','\\','F','e','a','t','u','r','e','s','\\','%','s',0}; -static const WCHAR szInstaller_ClassesUpgrade_fmt[] = { -'I','n','s','t','a','l','l','e','r','\\', -'U','p','g','r','a','d','e','C','o','d','e','s','\\', -'%','s',0}; +static const WCHAR szInstaller_Products[] = { + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','P','r','o','d','u','c','t','s',0}; + +static const WCHAR szInstaller_Patches[] = { + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','P','a','t','c','h','e','s',0}; + +static const WCHAR szInstaller_Components[] = { + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','C','o','m','p','o','n','e','n','t','s',0}; + +static const WCHAR szInstaller_LocalClassesProducts[] = { + 'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s','\\', + 'I','n','s','t','a','l','l','e','r','\\','P','r','o','d','u','c','t','s',0}; + +static const WCHAR szInstaller_LocalClassesFeatures[] = { + 'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s','\\', + 'I','n','s','t','a','l','l','e','r','\\','F','e','a','t','u','r','e','s',0}; + +static const WCHAR szInstaller_LocalClassesProd[] = { + 'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s','\\', + 'I','n','s','t','a','l','l','e','r','\\','P','r','o','d','u','c','t','s','\\',0}; + +static const WCHAR szInstaller_LocalClassesFeat[] = { + 'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s','\\', + 'I','n','s','t','a','l','l','e','r','\\','F','e','a','t','u','r','e','s','\\',0}; + +static const WCHAR szInstaller_ClassesUpgradeCode[] = { + 'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','p','g','r','a','d','e','C','o','d','e','s','\\',0}; + +static const WCHAR szInstaller_ClassesUpgradeCodes[] = { + 'S','o','f','t','w','a','r','e','\\','C','l','a','s','s','e','s','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','p','g','r','a','d','e','C','o','d','e','s',0}; + +static const WCHAR szInstaller_Features[] = { + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','F','e','a','t','u','r','e','s','\\',0}; + +static const WCHAR szInstaller_UpgradeCodes[] = { + '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','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','p','g','r','a','d','e','C','o','d','e','s','\\',0}; + +static const WCHAR szInstaller_UserUpgradeCodes[] = { + 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', + 'I','n','s','t','a','l','l','e','r','\\','U','p','g','r','a','d','e','C','o','d','e','s','\\',0}; + +static const WCHAR szUninstall[] = { + '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','\\', + 'U','n','i','n','s','t','a','l','l','\\',0}; + +static const WCHAR szUninstall_32node[] = { + 'S','o','f','t','w','a','r','e','\\','W','o','w','6','4','3','2','N','o','d','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','\\','U','n','i','n','s','t','a','l','l','\\',0}; + +static const WCHAR szUserComponents[] = { + 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', + 'I','n','s','t','a','l','l','e','r','\\','C','o','m','p','o','n','e','n','t','s','\\',0}; + +static const WCHAR szUserFeatures[] = { + 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', + 'I','n','s','t','a','l','l','e','r','\\','F','e','a','t','u','r','e','s','\\',0}; + +static const WCHAR szUserProducts[] = { + 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', + 'I','n','s','t','a','l','l','e','r','\\','P','r','o','d','u','c','t','s','\\',0}; + +static const WCHAR szUserPatches[] = { + 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', + 'I','n','s','t','a','l','l','e','r','\\','P','a','t','c','h','e','s','\\',0}; BOOL unsquash_guid(LPCWSTR in, LPWSTR out) { @@ -492,244 +425,213 @@ BOOL msi_reg_get_val_dword( HKEY hkey, LPCWSTR name, DWORD *val) return r == ERROR_SUCCESS && type == REG_DWORD; } -static UINT get_user_sid(LPWSTR *usersid) +static WCHAR *get_user_sid(void) { HANDLE token; - BYTE buf[1024]; - DWORD size; - PTOKEN_USER user; + DWORD size = 256; + TOKEN_USER *user; + WCHAR *ret; - if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) - return ERROR_FUNCTION_FAILED; - - size = sizeof(buf); - if (!GetTokenInformation(token, TokenUser, buf, size, &size)) { - CloseHandle(token); - return ERROR_FUNCTION_FAILED; + if (!OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY, &token )) return NULL; + if (!(user = msi_alloc( size ))) + { + CloseHandle( token ); + return NULL; } - - user = (PTOKEN_USER)buf; - if (!ConvertSidToStringSidW(user->User.Sid, usersid)) { - CloseHandle(token); - return ERROR_FUNCTION_FAILED; + if (!GetTokenInformation( token, TokenUser, user, size, &size )) + { + msi_free( user ); + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER || !(user = msi_alloc( size ))) + { + CloseHandle( token ); + return NULL; + } + GetTokenInformation( token, TokenUser, user, size, &size ); } - CloseHandle(token); - return ERROR_SUCCESS; + CloseHandle( token ); + if (!ConvertSidToStringSidW( user->User.Sid, &ret )) + { + msi_free( user ); + return NULL; + } + msi_free( user ); + return ret; } -UINT MSIREG_OpenUninstallKey(MSIPACKAGE *package, HKEY *key, BOOL create) -{ - UINT rc; - WCHAR keypath[0x200]; - - TRACE("%s\n", debugstr_w(package->ProductCode)); - - if (is_64bit && package->platform == PLATFORM_INTEL) - sprintfW(keypath, szUninstall_32node_fmt, package->ProductCode); - else - sprintfW(keypath, szUninstall_fmt, package->ProductCode); - - if (create) - rc = RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, KEY_ALL_ACCESS, NULL, key, NULL); - else - rc = RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, KEY_ALL_ACCESS, key); - - return rc; -} - -UINT MSIREG_DeleteUninstallKey(MSIPACKAGE *package) +UINT MSIREG_OpenUninstallKey(const WCHAR *product, enum platform platform, HKEY *key, BOOL create) { WCHAR keypath[0x200]; - TRACE("%s\n", debugstr_w(package->ProductCode)); + TRACE("%s\n", debugstr_w(product)); - if (is_64bit && package->platform == PLATFORM_INTEL) - sprintfW(keypath, szUninstall_32node_fmt, package->ProductCode); + if (is_64bit && platform == PLATFORM_INTEL) + { + strcpyW(keypath, szUninstall_32node); + strcatW(keypath, product); + } else - sprintfW(keypath, szUninstall_fmt, package->ProductCode); + { + strcpyW(keypath, szUninstall); + strcatW(keypath, product); + } + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, KEY_ALL_ACCESS, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, KEY_ALL_ACCESS, key); +} +UINT MSIREG_DeleteUninstallKey(const WCHAR *product, enum platform platform) +{ + WCHAR keypath[0x200]; + + TRACE("%s\n", debugstr_w(product)); + + if (is_64bit && platform == PLATFORM_INTEL) + { + strcpyW(keypath, szUninstall_32node); + strcatW(keypath, product); + } + else + { + strcpyW(keypath, szUninstall); + strcatW(keypath, product); + } return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); } -UINT MSIREG_OpenProductKey(LPCWSTR szProduct, LPCWSTR szUserSid, - MSIINSTALLCONTEXT context, HKEY *key, BOOL create) +UINT MSIREG_OpenProductKey(LPCWSTR szProduct, LPCWSTR szUserSid, MSIINSTALLCONTEXT context, HKEY *key, BOOL create) { - UINT r; LPWSTR usersid = NULL; HKEY root = HKEY_LOCAL_MACHINE; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[MAX_PATH]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_pc[GUID_SIZE], keypath[MAX_PATH]; - TRACE("(%s, %d, %d)\n", debugstr_w(szProduct), context, create); - - if (!squash_guid(szProduct, squished_pc)) - return ERROR_FUNCTION_FAILED; - - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szProduct, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProduct), debugstr_w(squished_pc)); if (context == MSIINSTALLCONTEXT_MACHINE) { - sprintfW(keypath, szInstaller_LocalClassesProd_fmt, squished_pc); + strcpyW(keypath, szInstaller_LocalClassesProd); + strcatW(keypath, squished_pc); } else if (context == MSIINSTALLCONTEXT_USERUNMANAGED) { root = HKEY_CURRENT_USER; - sprintfW(keypath, szUserProduct_fmt, squished_pc); + strcpyW(keypath, szUserProducts); + strcatW(keypath, squished_pc); } else { if (!szUserSid) { - r = get_user_sid(&usersid); - if (r != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", r); - return r; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - szUserSid = usersid; } - - sprintfW(keypath, szInstaller_LocalManagedProd_fmt, - szUserSid, squished_pc); + sprintfW(keypath, szInstaller_LocalManagedProd_fmt, szUserSid, squished_pc); LocalFree(usersid); } - - if (create) - return RegCreateKeyW(root, keypath, key); - - return RegOpenKeyW(root, keypath, key); + if (create) return RegCreateKeyExW(root, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(root, keypath, 0, access, key); } UINT MSIREG_DeleteUserProductKey(LPCWSTR szProduct) { - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n",debugstr_w(szProduct)); - if (!squash_guid(szProduct,squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); - - sprintfW(keypath,szUserProduct_fmt,squished_pc); + if (!squash_guid(szProduct, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProduct), debugstr_w(squished_pc)); + strcpyW(keypath, szUserProducts); + strcatW(keypath, squished_pc); return RegDeleteTreeW(HKEY_CURRENT_USER, keypath); } -UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create) +UINT MSIREG_OpenUserPatchesKey(LPCWSTR szPatch, HKEY *key, BOOL create) { - UINT rc; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n",debugstr_w(szPatch)); - if (!squash_guid(szPatch,squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szPatch, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szPatch), debugstr_w(squished_pc)); - sprintfW(keypath,szUserPatch_fmt,squished_pc); + strcpyW(keypath, szUserPatches); + strcatW(keypath, squished_pc); - if (create) - rc = RegCreateKeyW(HKEY_CURRENT_USER,keypath,key); - else - rc = RegOpenKeyW(HKEY_CURRENT_USER,keypath,key); - - return rc; + if (create) return RegCreateKeyW(HKEY_CURRENT_USER, keypath, key); + return RegOpenKeyW(HKEY_CURRENT_USER, keypath, key); } -UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, - HKEY *key, BOOL create) +UINT MSIREG_OpenFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, HKEY *key, BOOL create) { - UINT r; LPWSTR usersid; HKEY root = HKEY_LOCAL_MACHINE; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[MAX_PATH]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_pc[GUID_SIZE], keypath[MAX_PATH]; - TRACE("(%s, %d, %d)\n", debugstr_w(szProduct), context, create); - - if (!squash_guid(szProduct, squished_pc)) - return ERROR_FUNCTION_FAILED; - - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szProduct, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProduct), debugstr_w(squished_pc)); if (context == MSIINSTALLCONTEXT_MACHINE) { - sprintfW(keypath, szInstaller_LocalClassesFeat_fmt, squished_pc); + strcpyW(keypath, szInstaller_LocalClassesFeat); + strcatW(keypath, squished_pc); } else if (context == MSIINSTALLCONTEXT_USERUNMANAGED) { root = HKEY_CURRENT_USER; - sprintfW(keypath, szUserFeatures_fmt, squished_pc); + strcpyW(keypath, szUserFeatures); + strcatW(keypath, squished_pc); } else { - r = get_user_sid(&usersid); - if (r != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", r); - return r; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - sprintfW(keypath, szInstaller_LocalManagedFeat_fmt, usersid, squished_pc); LocalFree(usersid); } - - if (create) - return RegCreateKeyW(root, keypath, key); - - return RegOpenKeyW(root, keypath, key); + if (create) return RegCreateKeyExW(root, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(root, keypath, 0, access, key); } UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct) { - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n",debugstr_w(szProduct)); - if (!squash_guid(szProduct,squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szProduct, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProduct), debugstr_w(squished_pc)); - sprintfW(keypath,szUserFeatures_fmt,squished_pc); + strcpyW(keypath, szUserFeatures); + strcatW(keypath, squished_pc); return RegDeleteTreeW(HKEY_CURRENT_USER, keypath); } -static UINT MSIREG_OpenInstallerFeaturesKey(LPCWSTR szProduct, HKEY* key, BOOL create) +static UINT MSIREG_OpenInstallerFeaturesKey(LPCWSTR szProduct, HKEY *key, BOOL create) { - UINT rc; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n",debugstr_w(szProduct)); - if (!squash_guid(szProduct,squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szProduct, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProduct), debugstr_w(squished_pc)); - sprintfW(keypath,szInstaller_Features_fmt,squished_pc); + strcpyW(keypath, szInstaller_Features); + strcatW(keypath, squished_pc); - if (create) - rc = RegCreateKeyW(HKEY_LOCAL_MACHINE,keypath,key); - else - rc = RegOpenKeyW(HKEY_LOCAL_MACHINE,keypath,key); - - return rc; + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, key); } -UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, - HKEY *key, BOOL create) +UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context, HKEY *key, BOOL create) { - UINT r; LPWSTR usersid; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("(%s, %d, %d)\n", debugstr_w(szProduct), context, create); - - if (!squash_guid(szProduct, squished_pc)) - return ERROR_FUNCTION_FAILED; - - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szProduct, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProduct), debugstr_w(squished_pc)); if (context == MSIINSTALLCONTEXT_MACHINE) { @@ -737,122 +639,96 @@ UINT MSIREG_OpenUserDataFeaturesKey(LPCWSTR szProduct, MSIINSTALLCONTEXT context } else { - r = get_user_sid(&usersid); - if (r != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", r); - return r; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - sprintfW(keypath, szUserDataFeatures_fmt, usersid, squished_pc); LocalFree(usersid); } - - if (create) - return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key); - - return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key); + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, key); } -UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY* key, BOOL create) +UINT MSIREG_OpenUserComponentsKey(LPCWSTR szComponent, HKEY *key, BOOL create) { - UINT rc; - WCHAR squished_cc[GUID_SIZE]; - WCHAR keypath[0x200]; + WCHAR squished_cc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n",debugstr_w(szComponent)); - if (!squash_guid(szComponent,squished_cc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_cc)); + if (!squash_guid(szComponent, squished_cc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szComponent), debugstr_w(squished_cc)); - sprintfW(keypath,szUser_Components_fmt,squished_cc); + strcpyW(keypath, szUserComponents); + strcatW(keypath, squished_cc); - if (create) - rc = RegCreateKeyW(HKEY_CURRENT_USER,keypath,key); - else - rc = RegOpenKeyW(HKEY_CURRENT_USER,keypath,key); - - return rc; + if (create) return RegCreateKeyW(HKEY_CURRENT_USER, keypath, key); + return RegOpenKeyW(HKEY_CURRENT_USER, keypath, key); } -UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid, - HKEY *key, BOOL create) +UINT MSIREG_OpenUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid, HKEY *key, BOOL create) { - UINT rc; - WCHAR comp[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR comp[GUID_SIZE], keypath[0x200]; LPWSTR usersid; - TRACE("%s\n", debugstr_w(szComponent)); - if (!squash_guid(szComponent, comp)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(comp)); + if (!squash_guid(szComponent, comp)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szComponent), debugstr_w(comp)); if (!szUserSid) { - rc = get_user_sid(&usersid); - if (rc != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", rc); - return rc; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - sprintfW(keypath, szUserDataComp_fmt, usersid, comp); LocalFree(usersid); } else sprintfW(keypath, szUserDataComp_fmt, szUserSid, comp); - if (create) - rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key); - else - rc = RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key); - - return rc; + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, key); } UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid) { - UINT rc; - WCHAR comp[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR comp[GUID_SIZE], keypath[0x200]; LPWSTR usersid; + HKEY hkey; + LONG r; - TRACE("%s\n", debugstr_w(szComponent)); - if (!squash_guid(szComponent, comp)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(comp)); + if (!squash_guid(szComponent, comp)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szComponent), debugstr_w(comp)); if (!szUserSid) { - rc = get_user_sid(&usersid); - if (rc != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", rc); - return rc; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - - sprintfW(keypath, szUserDataComp_fmt, usersid, comp); + sprintfW(keypath, szUserDataComponents_fmt, usersid); LocalFree(usersid); } else - sprintfW(keypath, szUserDataComp_fmt, szUserSid, comp); + sprintfW(keypath, szUserDataComponents_fmt, szUserSid); - return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey)) return ERROR_SUCCESS; + r = RegDeleteTreeW(hkey, comp); + RegCloseKey(hkey); + return r; } -UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext, - LPCWSTR szUserSid, HKEY *key, BOOL create) +UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext, LPCWSTR szUserSid, HKEY *key, BOOL create) { - UINT rc; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; LPWSTR usersid; - TRACE("%s\n", debugstr_w(szProduct)); - if (!squash_guid(szProduct, squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szProduct, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProduct), debugstr_w(squished_pc)); if (dwContext == MSIINSTALLCONTEXT_MACHINE) sprintfW(keypath, szUserDataProd_fmt, szLocalSid, squished_pc); @@ -860,134 +736,105 @@ UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContex sprintfW(keypath, szUserDataProd_fmt, szUserSid, squished_pc); else { - rc = get_user_sid(&usersid); - if (rc != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", rc); - return rc; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - sprintfW(keypath, szUserDataProd_fmt, usersid, squished_pc); LocalFree(usersid); } - - if (create) - rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key); - else - rc = RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key); - - return rc; + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, key); } -UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext, - HKEY *key, BOOL create) +UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext, HKEY *key, BOOL create) { - UINT rc; - WCHAR squished_patch[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_patch[GUID_SIZE], keypath[0x200]; LPWSTR usersid; - TRACE("%s\n", debugstr_w(szPatch)); - if (!squash_guid(szPatch, squished_patch)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_patch)); + if (!squash_guid(szPatch, squished_patch)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szPatch), debugstr_w(squished_patch)); if (dwContext == MSIINSTALLCONTEXT_MACHINE) sprintfW(keypath, szUserDataPatch_fmt, szLocalSid, squished_patch); else { - rc = get_user_sid(&usersid); - if (rc != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", rc); - return rc; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - sprintfW(keypath, szUserDataPatch_fmt, usersid, squished_patch); LocalFree(usersid); } - - if (create) - return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key); - - return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key); + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, key); } UINT MSIREG_DeleteUserDataPatchKey(LPCWSTR patch, MSIINSTALLCONTEXT context) { - UINT r; - WCHAR squished_patch[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_patch[GUID_SIZE], keypath[0x200]; LPWSTR usersid; + HKEY hkey; + LONG r; - TRACE("%s\n", debugstr_w(patch)); - if (!squash_guid(patch, squished_patch)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_patch)); + if (!squash_guid(patch, squished_patch)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(patch), debugstr_w(squished_patch)); if (context == MSIINSTALLCONTEXT_MACHINE) - sprintfW(keypath, szUserDataPatch_fmt, szLocalSid, squished_patch); + sprintfW(keypath, szUserDataPatches_fmt, szLocalSid); else { - r = get_user_sid(&usersid); - if (r != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", r); - return r; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - - sprintfW(keypath, szUserDataPatch_fmt, usersid, squished_patch); + sprintfW(keypath, szUserDataPatches_fmt, usersid); LocalFree(usersid); } - - return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey)) return ERROR_SUCCESS; + r = RegDeleteTreeW(hkey, squished_patch); + RegCloseKey(hkey); + return r; } -UINT MSIREG_OpenUserDataProductPatchesKey(LPCWSTR product, MSIINSTALLCONTEXT context, - HKEY *key, BOOL create) +UINT MSIREG_OpenUserDataProductPatchesKey(LPCWSTR product, MSIINSTALLCONTEXT context, HKEY *key, BOOL create) { - UINT rc; - WCHAR squished_product[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_product[GUID_SIZE], keypath[0x200]; LPWSTR usersid; - TRACE("%s\n", debugstr_w(product)); - if (!squash_guid(product, squished_product)) - return ERROR_FUNCTION_FAILED; + if (!squash_guid(product, squished_product)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(product), debugstr_w(squished_product)); if (context == MSIINSTALLCONTEXT_MACHINE) sprintfW(keypath, szUserDataProductPatches_fmt, szLocalSid, squished_product); else { - rc = get_user_sid(&usersid); - if (rc != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", rc); - return rc; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - sprintfW(keypath, szUserDataProductPatches_fmt, usersid, squished_product); LocalFree(usersid); } - - if (create) - return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key); - - return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key); + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, key); } -UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext, - LPCWSTR szUserSid, HKEY *key, BOOL create) +UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext, LPCWSTR szUserSid, HKEY *key, BOOL create) { - UINT rc; LPWSTR usersid; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n", debugstr_w(szProduct)); - if (!squash_guid(szProduct, squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szProduct, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProduct), debugstr_w(squished_pc)); if (dwContext == MSIINSTALLCONTEXT_MACHINE) sprintfW(keypath, szInstallProperties_fmt, szLocalSid, squished_pc); @@ -995,206 +842,175 @@ UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext, sprintfW(keypath, szInstallProperties_fmt, szUserSid, squished_pc); else { - rc = get_user_sid(&usersid); - if (rc != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", rc); - return rc; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - sprintfW(keypath, szInstallProperties_fmt, usersid, squished_pc); LocalFree(usersid); } - - if (create) - return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key); - - return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key); + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, key); } UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct) { - UINT rc; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; LPWSTR usersid; + HKEY hkey; + LONG r; - TRACE("%s\n", debugstr_w(szProduct)); - if (!squash_guid(szProduct, squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szProduct, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProduct), debugstr_w(squished_pc)); - rc = get_user_sid(&usersid); - if (rc != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", rc); - return rc; + ERR("Failed to retrieve user SID\n"); + return ERROR_FUNCTION_FAILED; } - - sprintfW(keypath, szUserDataProd_fmt, usersid, squished_pc); - + sprintfW(keypath, szUserDataProducts_fmt, usersid); LocalFree(usersid); - return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey)) return ERROR_SUCCESS; + r = RegDeleteTreeW(hkey, squished_pc); + RegCloseKey(hkey); + return r; } UINT MSIREG_DeleteProductKey(LPCWSTR szProduct) { + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + HKEY hkey; + LONG r; - TRACE("%s\n", debugstr_w(szProduct)); - if (!squash_guid(szProduct, squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szProduct, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProduct), debugstr_w(squished_pc)); - sprintfW(keypath, szInstaller_Products_fmt, squished_pc); - - return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szInstaller_Products, 0, access, &hkey)) return ERROR_SUCCESS; + r = RegDeleteTreeW(hkey, squished_pc); + RegCloseKey(hkey); + return r; } -UINT MSIREG_OpenPatchesKey(LPCWSTR szPatch, HKEY* key, BOOL create) +UINT MSIREG_OpenPatchesKey(LPCWSTR szPatch, HKEY *key, BOOL create) { - UINT rc; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n",debugstr_w(szPatch)); - if (!squash_guid(szPatch,squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szPatch, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szPatch), debugstr_w(squished_pc)); - sprintfW(keypath,szInstaller_Patches_fmt,squished_pc); + sprintfW(keypath, szInstaller_Patches, squished_pc); - if (create) - rc = RegCreateKeyW(HKEY_LOCAL_MACHINE,keypath,key); - else - rc = RegOpenKeyW(HKEY_LOCAL_MACHINE,keypath,key); - - return rc; + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, key); } -UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL create) +UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY *key, BOOL create) { - UINT rc; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n",debugstr_w(szUpgradeCode)); - if (!squash_guid(szUpgradeCode,squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szUpgradeCode, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szUpgradeCode), debugstr_w(squished_pc)); - sprintfW(keypath,szInstaller_UpgradeCodes_fmt,squished_pc); + strcpyW(keypath, szInstaller_UpgradeCodes); + strcatW(keypath, squished_pc); - if (create) - rc = RegCreateKeyW(HKEY_LOCAL_MACHINE,keypath,key); - else - rc = RegOpenKeyW(HKEY_LOCAL_MACHINE,keypath,key); - - return rc; + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, key); } UINT MSIREG_OpenUserUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL create) { - UINT rc; - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n",debugstr_w(szUpgradeCode)); - if (!squash_guid(szUpgradeCode,squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szUpgradeCode, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szUpgradeCode), debugstr_w(squished_pc)); - sprintfW(keypath,szInstaller_UserUpgradeCodes_fmt,squished_pc); + strcpyW(keypath, szInstaller_UserUpgradeCodes); + strcatW(keypath, squished_pc); - if (create) - rc = RegCreateKeyW(HKEY_CURRENT_USER,keypath,key); - else - rc = RegOpenKeyW(HKEY_CURRENT_USER,keypath,key); - - return rc; + if (create) return RegCreateKeyW(HKEY_CURRENT_USER, keypath, key); + return RegOpenKeyW(HKEY_CURRENT_USER, keypath, key); } UINT MSIREG_DeleteUserUpgradeCodesKey(LPCWSTR szUpgradeCode) { - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n",debugstr_w(szUpgradeCode)); - if (!squash_guid(szUpgradeCode,squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); - - sprintfW(keypath,szInstaller_UserUpgradeCodes_fmt,squished_pc); + if (!squash_guid(szUpgradeCode, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szUpgradeCode), debugstr_w(squished_pc)); + strcpyW(keypath, szInstaller_UserUpgradeCodes); + strcatW(keypath, squished_pc); return RegDeleteTreeW(HKEY_CURRENT_USER, keypath); } UINT MSIREG_DeleteLocalClassesProductKey(LPCWSTR szProductCode) { + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + HKEY hkey; + LONG r; - TRACE("%s\n", debugstr_w(szProductCode)); + if (!squash_guid(szProductCode, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProductCode), debugstr_w(squished_pc)); - if (!squash_guid(szProductCode, squished_pc)) - return ERROR_FUNCTION_FAILED; - - TRACE("squished (%s)\n", debugstr_w(squished_pc)); - - sprintfW(keypath, szInstaller_LocalClassesProd_fmt, squished_pc); - - return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szInstaller_LocalClassesProducts, 0, access, &hkey)) return ERROR_SUCCESS; + r = RegDeleteTreeW(hkey, squished_pc); + RegCloseKey(hkey); + return r; } UINT MSIREG_DeleteLocalClassesFeaturesKey(LPCWSTR szProductCode) { + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + HKEY hkey; + LONG r; - TRACE("%s\n", debugstr_w(szProductCode)); + if (!squash_guid(szProductCode, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szProductCode), debugstr_w(squished_pc)); - if (!squash_guid(szProductCode, squished_pc)) - return ERROR_FUNCTION_FAILED; - - TRACE("squished (%s)\n", debugstr_w(squished_pc)); - - sprintfW(keypath, szInstaller_LocalClassesFeat_fmt, squished_pc); - - return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath); + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szInstaller_LocalClassesFeatures, 0, access, &hkey)) return ERROR_SUCCESS; + r = RegDeleteTreeW(hkey, squished_pc); + RegCloseKey(hkey); + return r; } -UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY* key, BOOL create) +UINT MSIREG_OpenClassesUpgradeCodesKey(LPCWSTR szUpgradeCode, HKEY *key, BOOL create) { - WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; + WCHAR squished_pc[GUID_SIZE], keypath[0x200]; - TRACE("%s\n", debugstr_w(szUpgradeCode)); - if (!squash_guid(szUpgradeCode, squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szUpgradeCode, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szUpgradeCode), debugstr_w(squished_pc)); - sprintfW(keypath, szInstaller_ClassesUpgrade_fmt, squished_pc); + strcpyW(keypath, szInstaller_ClassesUpgradeCode); + strcatW(keypath, squished_pc); - if (create) - return RegCreateKeyW(HKEY_CLASSES_ROOT, keypath, key); - - return RegOpenKeyW(HKEY_CLASSES_ROOT, keypath, key); + if (create) return RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, key, NULL); + return RegOpenKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, access, key); } UINT MSIREG_DeleteClassesUpgradeCodesKey(LPCWSTR szUpgradeCode) { + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; WCHAR squished_pc[GUID_SIZE]; - WCHAR keypath[0x200]; + HKEY hkey; + LONG r; - TRACE("%s\n", debugstr_w(szUpgradeCode)); - if (!squash_guid(szUpgradeCode, squished_pc)) - return ERROR_FUNCTION_FAILED; - TRACE("squished (%s)\n", debugstr_w(squished_pc)); + if (!squash_guid(szUpgradeCode, squished_pc)) return ERROR_FUNCTION_FAILED; + TRACE("%s squished %s\n", debugstr_w(szUpgradeCode), debugstr_w(squished_pc)); - sprintfW(keypath, szInstaller_ClassesUpgrade_fmt, squished_pc); - - return RegDeleteTreeW(HKEY_CLASSES_ROOT, keypath); + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, szInstaller_ClassesUpgradeCodes, 0, access, &hkey)) return ERROR_SUCCESS; + r = RegDeleteTreeW(hkey, squished_pc); + RegCloseKey(hkey); + return r; } /************************************************************************* @@ -1323,9 +1139,13 @@ UINT WINAPI MsiEnumProductsA(DWORD index, LPSTR lpguid) UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid) { + static const WCHAR pathW[] = { + 'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', + 'I','n','s','t','a','l','l','e','r','\\','P','r','o','d','u','c','t','s',0}; UINT r; WCHAR szKeyName[SQUISH_GUID_SIZE]; HKEY key; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; DWORD machine_count, managed_count, unmanaged_count; WCHAR keypath[MAX_PATH]; LPWSTR usersid = NULL; @@ -1341,7 +1161,7 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid) return ERROR_INVALID_PARAMETER; key = 0; - r = RegCreateKeyW(HKEY_LOCAL_MACHINE, szInstaller_LocalClassesProd, &key); + r = RegCreateKeyExW(HKEY_LOCAL_MACHINE, szInstaller_LocalClassesProducts, 0, NULL, 0, access, NULL, &key, NULL); if( r != ERROR_SUCCESS ) goto failed; r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &machine_count, NULL, NULL, @@ -1362,17 +1182,16 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid) RegCloseKey(key); key = 0; - r = get_user_sid(&usersid); - if (r != ERROR_SUCCESS || !usersid) + if (!(usersid = get_user_sid())) { - ERR("Failed to retrieve user SID: %d\n", r); + ERR("Failed to retrieve user SID\n"); last_index = 0; - return r; + return ERROR_FUNCTION_FAILED; } sprintfW(keypath, szInstaller_LocalManaged_fmt, usersid); LocalFree(usersid); - r = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, &key); + r = RegCreateKeyExW(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &key, NULL); if( r != ERROR_SUCCESS ) goto failed; r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &managed_count, NULL, NULL, @@ -1393,7 +1212,7 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid) RegCloseKey(key); key = 0; - r = RegCreateKeyW(HKEY_CURRENT_USER, szUserProduct, &key); + r = RegCreateKeyW(HKEY_CURRENT_USER, pathW, &key); if( r != ERROR_SUCCESS ) goto failed; r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &unmanaged_count, NULL, NULL, @@ -1485,21 +1304,22 @@ UINT WINAPI MsiEnumComponentsA(DWORD index, LPSTR lpguid) UINT WINAPI MsiEnumComponentsW(DWORD index, LPWSTR lpguid) { - HKEY hkeyComponents = 0; - DWORD r; + HKEY hkey; + REGSAM access = KEY_WOW64_64KEY | KEY_ALL_ACCESS; WCHAR szKeyName[SQUISH_GUID_SIZE]; + DWORD r; TRACE("%d %p\n", index, lpguid); - r = RegCreateKeyW(HKEY_LOCAL_MACHINE, szInstaller_Components, &hkeyComponents); + r = RegCreateKeyExW(HKEY_LOCAL_MACHINE, szInstaller_Components, 0, NULL, 0, access, NULL, &hkey, NULL); if( r != ERROR_SUCCESS ) return ERROR_NO_MORE_ITEMS; - r = RegEnumKeyW(hkeyComponents, index, szKeyName, SQUISH_GUID_SIZE); + r = RegEnumKeyW(hkey, index, szKeyName, SQUISH_GUID_SIZE); if( r == ERROR_SUCCESS ) unsquash_guid(szKeyName, lpguid); - RegCloseKey(hkeyComponents); + RegCloseKey(hkey); return r; } @@ -1949,7 +1769,6 @@ static UINT msi_check_product_patches(LPCWSTR prodcode, LPCWSTR usersid, if (res != ERROR_SUCCESS) goto done; - ptr = patches; for (ptr = patches; *ptr && r == ERROR_NO_MORE_ITEMS; ptr += lstrlenW(ptr) + 1) { if (!unsquash_guid(ptr, patch)) @@ -2089,8 +1908,8 @@ static UINT msi_enum_patches(LPCWSTR szProductCode, LPCWSTR szUserSid, if (!szUserSid) { - get_user_sid(&usersid); - szUserSid = usersid; + szUserSid = usersid = get_user_sid(); + if (!usersid) return ERROR_FUNCTION_FAILED; } if (dwContext & MSIINSTALLCONTEXT_USERMANAGED) diff --git a/reactos/dll/win32/msi/regsvr.c b/reactos/dll/win32/msi/regsvr.c deleted file mode 100644 index 11a296524bb..00000000000 --- a/reactos/dll/win32/msi/regsvr.c +++ /dev/null @@ -1,663 +0,0 @@ -/* - * self-registerable dll functions for msi.dll - * - * Copyright (C) 2004 Raphael Junqueira - * - * 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 "config.h" - -#include -#include - -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winreg.h" -#include "winerror.h" - -#include "ole2.h" -#include "olectl.h" -#include "oleauto.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -#include "msi.h" -#include "initguid.h" -#include "msipriv.h" - -WINE_DEFAULT_DEBUG_CHANNEL(msi); - -/* - * Near the bottom of this file are the exported DllRegisterServer and - * DllUnregisterServer, which make all this worthwhile. - */ - -/*********************************************************************** - * interface for self-registering - */ -struct regsvr_interface { - IID const *iid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - IID const *base_iid; /* can be NULL to omit */ - int num_methods; /* can be <0 to omit */ - CLSID const *ps_clsid; /* can be NULL to omit */ - CLSID const *ps_clsid32; /* can be NULL to omit */ -}; - -static HRESULT register_interfaces(struct regsvr_interface const *list); -static HRESULT unregister_interfaces(struct regsvr_interface const *list); - -/** - * @todo: maybe adding typelibs support here - * [Software\\Classes\\CLSID\\{000C1090-0000-0000-C000-000000000046}\\TypeLib] 1080380217 - * @="{000C1092-0000-0000-C000-000000000046}" - */ -struct regsvr_coclass { - CLSID const *clsid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - LPCSTR iph32; /* can be NULL to omit */ - LPCSTR ips; /* can be NULL to omit */ - LPCSTR ips32; /* can be NULL to omit */ - LPCSTR ips32_tmodel; /* can be NULL to omit, if apartment, iph32 must be set */ - DWORD flags; - LPCSTR progid; /* can be NULL to omit */ - LPCSTR viprogid; /* can be NULL to omit */ - LPCSTR progid_extra; /* can be NULL to omit */ - LPCSTR dllversion; /* can be NULL to omit */ -}; - -/* flags for regsvr_coclass.flags */ -#define PROGID_CLSID 0x00000010 - -static HRESULT register_coclasses(struct regsvr_coclass const *list); -static HRESULT unregister_coclasses(struct regsvr_coclass const *list); - -/*********************************************************************** - * static string constants - */ -static WCHAR const interface_keyname[10] = { - 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; -static WCHAR const base_ifa_keyname[14] = { - 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', - 'e', 0 }; -static WCHAR const num_methods_keyname[11] = { - 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; -static WCHAR const ps_clsid_keyname[15] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', 0 }; -static WCHAR const ps_clsid32_keyname[17] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', '3', '2', 0 }; -static WCHAR const clsid_keyname[6] = { - 'C', 'L', 'S', 'I', 'D', 0 }; -static WCHAR const curver_keyname[7] = { - 'C', 'u', 'r', 'V', 'e', 'r', 0 }; -static WCHAR const iph32_keyname[] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'H', 'a', 'n', 'd', 'l', 'e', 'r', - '3', '2', 0 }; -static WCHAR const ips_keyname[13] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static WCHAR const ips32_keyname[15] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static WCHAR const progid_keyname[7] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static WCHAR const viprogid_keyname[25] = { - 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p', - 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D', - 0 }; -static WCHAR const dllversion_keyname[11] = { - 'D', 'l', 'l', 'V', 'e', 'r', 's', 'i', 'o', 'n', 0 }; -static char const tmodel_valuename[] = "ThreadingModel"; - -/*********************************************************************** - * static helper functions - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); -static LONG register_key_defvalueW(HKEY base, WCHAR const *name, - WCHAR const *value); -static LONG register_key_defvalueA(HKEY base, WCHAR const *name, - char const *value); -static LONG register_progid(WCHAR const *clsid, - char const *progid, char const *curver_progid, - char const *name, char const *extra); - -/*********************************************************************** - * register_interfaces - */ -static HRESULT register_interfaces(struct regsvr_interface const *list) { - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - HKEY iid_key; - - StringFromGUID2(list->iid, buf, 39); - res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_interface_key; - - if (list->name) { - res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->base_iid) { - res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (0 <= list->num_methods) { - static WCHAR const fmt[3] = { '%', 'd', 0 }; - HKEY key; - - res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - - sprintfW(buf, fmt, list->num_methods); - res = RegSetValueExW(key, NULL, 0, REG_SZ, - (CONST BYTE*)buf, - (lstrlenW(buf) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid) { - res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid32) { - res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - error_close_iid_key: - RegCloseKey(iid_key); - } - -error_close_interface_key: - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_interfaces - */ -static HRESULT unregister_interfaces(struct regsvr_interface const *list) { - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, - KEY_READ | KEY_WRITE, &interface_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->iid, buf, 39); - res = RegDeleteTreeW(interface_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - } - - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * register_coclasses - */ -static HRESULT register_coclasses(struct regsvr_coclass const *list) { - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - HKEY clsid_key; - - StringFromGUID2(list->clsid, buf, 39); - res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->name) { - res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->iph32) { - HKEY iph32_key; - - res = RegCreateKeyExW(clsid_key, iph32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &iph32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(iph32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->iph32, - lstrlenA(list->iph32) + 1); - RegCloseKey(iph32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips) { - res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips32) { - HKEY ips32_key; - - res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &ips32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->ips32, - lstrlenA(list->ips32) + 1); - if (res == ERROR_SUCCESS && list->ips32_tmodel) - res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, - (CONST BYTE*)list->ips32_tmodel, - strlen(list->ips32_tmodel) + 1); - RegCloseKey(ips32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->progid) { - res = register_key_defvalueA(clsid_key, progid_keyname, - list->progid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(list->flags & PROGID_CLSID ? buf : NULL, - list->progid, NULL, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->viprogid) { - res = register_key_defvalueA(clsid_key, viprogid_keyname, - list->viprogid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(list->flags & PROGID_CLSID ? buf : NULL, - list->viprogid, list->progid, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->dllversion) { - HKEY dllver_key; - - res = RegCreateKeyExW(clsid_key, dllversion_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &dllver_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(dllver_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->dllversion, - lstrlenA(list->dllversion) + 1); - RegCloseKey(dllver_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - - error_close_clsid_key: - RegCloseKey(clsid_key); - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_coclasses - */ -static HRESULT unregister_coclasses(struct regsvr_coclass const *list) { - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, - KEY_READ | KEY_WRITE, &coclass_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->clsid, buf, 39); - res = RegDeleteTreeW(coclass_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->progid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - - if (list->viprogid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * regsvr_key_guid - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) { - WCHAR buf[39]; - - StringFromGUID2(guid, buf, 39); - return register_key_defvalueW(base, name, buf); -} - -/*********************************************************************** - * regsvr_key_defvalueW - */ -static LONG register_key_defvalueW( - HKEY base, - WCHAR const *name, - WCHAR const *value) { - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - (lstrlenW(value) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_key_defvalueA - */ -static LONG register_key_defvalueA( - HKEY base, - WCHAR const *name, - char const *value) { - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - lstrlenA(value) + 1); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_progid - */ -static LONG register_progid( - WCHAR const *clsid, - char const *progid, - char const *curver_progid, - char const *name, - char const *extra) { - LONG res; - HKEY progid_key; - - res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &progid_key, NULL); - if (res != ERROR_SUCCESS) return res; - - if (name) { - res = RegSetValueExA(progid_key, NULL, 0, REG_SZ, - (CONST BYTE*)name, strlen(name) + 1); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (clsid) { - res = register_key_defvalueW(progid_key, clsid_keyname, clsid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (curver_progid) { - res = register_key_defvalueA(progid_key, curver_keyname, - curver_progid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (extra) { - HKEY extra_key; - - res = RegCreateKeyExA(progid_key, extra, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &extra_key, NULL); - if (res == ERROR_SUCCESS) - RegCloseKey(extra_key); - } - -error_close_progid_key: - RegCloseKey(progid_key); - return res; -} - -/*********************************************************************** - * coclass list - */ -static struct regsvr_coclass const coclass_list[] = { - { - &CLSID_IMsiServer, - "Msi install server", - "ole32.dll", - NULL, - "msi.dll", - "Apartment", - PROGID_CLSID, - "IMsiServer", - NULL, - NULL, - NULL - }, - { - &CLSID_IMsiServerMessage, - "Wine Installer Message RPC", - NULL, - NULL, - "msi.dll", - NULL, - PROGID_CLSID, - "WindowsInstaller.Message", - NULL, - NULL, - "3.1.4000" - }, - { - &CLSID_IMsiServerX1, - "Msi install server", - "ole32.dll", - NULL, - "msi.dll", - "Apartment", - 0, - "WindowsInstaller.Installer", - NULL, - NULL, - NULL - }, - { - &CLSID_IMsiServerX2, - "Msi install server", - "ole32.dll", - NULL, - "msi.dll", - "Apartment", - PROGID_CLSID, - "WindowsInstaller.Installer", - NULL, - NULL, - NULL - }, - { - &CLSID_IMsiServerX3, - "Msi install server", - "ole32.dll", - NULL, - "msi.dll", - "Apartment", - 0, - "WindowsInstaller.Installer", - NULL, - NULL, - NULL - }, - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * interface list - */ -/* - * we should declare: (@see ole32/regsvr.c for examples) - [-HKEY_CLASSES_ROOT\Interface\{000C101D-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C1025-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C1033-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C1090-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C1093-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C1095-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C109A-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C109B-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C109C-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C109D-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C109E-0000-0000-C000-000000000046}] - [-HKEY_CLASSES_ROOT\Interface\{000C109F-0000-0000-C000-000000000046}] -*/ - -static struct regsvr_interface const interface_list[] = { - { &CLSID_IMsiServer, - "IMsiServer", - NULL, - 18, - NULL, - NULL }, - { NULL } /* list terminator */ -}; - -static HRESULT register_msiexec(void) -{ - static const WCHAR key[] = { - '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', - '\\','I','n','s','t','a','l','l','e','r',0 }; - static const WCHAR val[] = { - 'I','n','s','t','a','l','l','e','r','L','o','c','a','t','i','o','n',0 }; - WCHAR path[MAX_PATH]; - HKEY hkey; - LONG res; - INT len; - - len = GetSystemDirectoryW(path, MAX_PATH); - if (!len || len > MAX_PATH) - return E_FAIL; - - res = RegCreateKeyExW(HKEY_LOCAL_MACHINE, key, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &hkey, NULL); - if (res != ERROR_SUCCESS) - return E_FAIL; - - res = RegSetValueExW(hkey, val, 0, REG_SZ, - (BYTE*)path, (len + 1)*sizeof(WCHAR)); - - RegCloseKey(hkey); - - return (res == ERROR_SUCCESS) ? S_OK : E_FAIL; -} - -/*********************************************************************** - * DllRegisterServer (MSI.@) - */ -HRESULT WINAPI DllRegisterServer(void) -{ - LPWSTR path = NULL; - ITypeLib *tl; - HRESULT hr; - - TRACE("\n"); - - hr = register_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = register_interfaces(interface_list); - if (SUCCEEDED(hr)) - hr = register_msiexec(); - - tl = get_msi_typelib( &path ); - if (tl) - { - hr = RegisterTypeLib( tl, path, NULL ); - ITypeLib_Release( tl ); - } - else - hr = E_FAIL; - - return hr; -} - -/*********************************************************************** - * DllUnregisterServer (MSI.@) - */ -HRESULT WINAPI DllUnregisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = unregister_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = unregister_interfaces(interface_list); - return hr; -} diff --git a/reactos/dll/win32/msi/select.c b/reactos/dll/win32/msi/select.c index f6b5daef2f9..982cf6a9369 100644 --- a/reactos/dll/win32/msi/select.c +++ b/reactos/dll/win32/msi/select.c @@ -57,11 +57,15 @@ static UINT SELECT_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT if( !sv->table ) return ERROR_FUNCTION_FAILED; - if( (col==0) || (col>sv->num_cols) ) + if( !col || col > sv->num_cols ) return ERROR_FUNCTION_FAILED; col = sv->cols[ col - 1 ]; - + if( !col ) + { + *val = 0; + return ERROR_SUCCESS; + } return sv->table->ops->fetch_int( sv->table, row, col, val ); } @@ -74,11 +78,15 @@ static UINT SELECT_fetch_stream( struct tagMSIVIEW *view, UINT row, UINT col, IS if( !sv->table ) return ERROR_FUNCTION_FAILED; - if( (col==0) || (col>sv->num_cols) ) + if( !col || col > sv->num_cols ) return ERROR_FUNCTION_FAILED; col = sv->cols[ col - 1 ]; - + if( !col ) + { + *stm = NULL; + return ERROR_SUCCESS; + } return sv->table->ops->fetch_stream( sv->table, row, col, stm ); } @@ -208,9 +216,8 @@ static UINT SELECT_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *co return sv->table->ops->get_dimensions( sv->table, rows, NULL ); } -static UINT SELECT_get_column_info( struct tagMSIVIEW *view, - UINT n, LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name) +static UINT SELECT_get_column_info( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, + UINT *type, BOOL *temporary, LPCWSTR *table_name ) { MSISELECTVIEW *sv = (MSISELECTVIEW*)view; @@ -219,11 +226,18 @@ static UINT SELECT_get_column_info( struct tagMSIVIEW *view, if( !sv->table ) return ERROR_FUNCTION_FAILED; - if( (n==0) || (n>sv->num_cols) ) + if( !n || n > sv->num_cols ) return ERROR_FUNCTION_FAILED; n = sv->cols[ n - 1 ]; - + if( !n ) + { + if (name) *name = szEmpty; + if (type) *type = MSITYPE_UNKNOWN | MSITYPE_VALID; + if (temporary) *temporary = FALSE; + if (table_name) *table_name = szEmpty; + return ERROR_SUCCESS; + } return sv->table->ops->get_column_info( sv->table, n, name, type, temporary, table_name ); } @@ -232,7 +246,6 @@ static UINT msi_select_update(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row) { MSISELECTVIEW *sv = (MSISELECTVIEW*)view; UINT r, i, num_columns, col, type, val; - LPWSTR name; LPCWSTR str; MSIRECORD *mod; @@ -248,8 +261,7 @@ static UINT msi_select_update(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row) { col = sv->cols[i]; - r = SELECT_get_column_info(view, i + 1, &name, &type, NULL, NULL); - msi_free(name); + r = SELECT_get_column_info(view, i + 1, NULL, &type, NULL, NULL); if (r != ERROR_SUCCESS) { ERR("Failed to get column information: %d\n", r); @@ -336,14 +348,6 @@ static UINT SELECT_find_matching_rows( struct tagMSIVIEW *view, UINT col, return sv->table->ops->find_matching_rows( sv->table, col, val, row, handle ); } -static UINT SELECT_sort(struct tagMSIVIEW *view, column_info *columns) -{ - MSISELECTVIEW *sv = (MSISELECTVIEW *)view; - - TRACE("%p %p\n", view, columns); - - return sv->table->ops->sort( sv->table, columns ); -} static const MSIVIEWOPS select_ops = { @@ -364,14 +368,14 @@ static const MSIVIEWOPS select_ops = NULL, NULL, NULL, - SELECT_sort, + NULL, NULL, }; static UINT SELECT_AddColumn( MSISELECTVIEW *sv, LPCWSTR name, LPCWSTR table_name ) { - UINT r, n=0; + UINT r, n; MSIVIEW *table; TRACE("%p adding %s.%s\n", sv, debugstr_w( table_name ), @@ -391,9 +395,13 @@ static UINT SELECT_AddColumn( MSISELECTVIEW *sv, LPCWSTR name, if( sv->num_cols >= sv->max_cols ) return ERROR_FUNCTION_FAILED; - r = VIEW_find_column( table, name, table_name, &n ); - if( r != ERROR_SUCCESS ) - return r; + if ( !name[0] ) n = 0; + else + { + r = VIEW_find_column( table, name, table_name, &n ); + if( r != ERROR_SUCCESS ) + return r; + } sv->cols[sv->num_cols] = n; TRACE("Translating column %s from %d -> %d\n", diff --git a/reactos/dll/win32/msi/sql.tab.c b/reactos/dll/win32/msi/sql.tab.c index f70760278e5..f2f0b779111 100644 --- a/reactos/dll/win32/msi/sql.tab.c +++ b/reactos/dll/win32/msi/sql.tab.c @@ -72,7 +72,6 @@ #define yydebug sql_debug #define yynerrs sql_nerrs - /* Copy the first part of user declarations. */ /* Line 189 of yacc.c */ @@ -157,7 +156,7 @@ static struct expr * EXPR_wildcard( void *info ); /* Line 189 of yacc.c */ -#line 161 "sql.tab.c" +#line 153 "sql.tab.c" /* Enabling traces. */ #ifndef YYDEBUG @@ -268,7 +267,7 @@ typedef union YYSTYPE /* Line 214 of yacc.c */ -#line 272 "sql.tab.c" +#line 264 "sql.tab.c" } YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define yystype YYSTYPE /* obsolescent; will be withdrawn */ @@ -280,7 +279,7 @@ typedef union YYSTYPE /* Line 264 of yacc.c */ -#line 284 "sql.tab.c" +#line 276 "sql.tab.c" #ifdef short # undef short @@ -493,18 +492,18 @@ union yyalloc #endif /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 35 +#define YYFINAL 36 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 144 +#define YYLAST 156 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 65 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 35 +#define YYNNTS 37 /* YYNRULES -- Number of rules. */ -#define YYNRULES 81 +#define YYNRULES 87 /* YYNRULES -- Number of states. */ -#define YYNSTATES 145 +#define YYNSTATES 154 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -559,11 +558,11 @@ static const yytype_uint16 yyprhs[] = 19, 30, 42, 49, 57, 64, 69, 72, 77, 83, 90, 92, 94, 98, 103, 107, 109, 112, 114, 117, 120, 122, 126, 128, 133, 135, 137, 139, 141, 143, - 145, 150, 152, 155, 159, 162, 164, 168, 170, 172, - 176, 179, 182, 184, 188, 192, 196, 200, 204, 208, - 212, 216, 220, 224, 228, 233, 235, 237, 239, 243, - 245, 249, 253, 255, 258, 260, 262, 264, 268, 270, - 272, 274 + 145, 148, 152, 155, 157, 161, 163, 165, 169, 171, + 174, 179, 181, 184, 189, 191, 195, 199, 203, 207, + 211, 215, 219, 223, 227, 231, 235, 240, 242, 244, + 246, 250, 252, 256, 260, 262, 265, 267, 269, 271, + 275, 277, 281, 283, 285, 287, 289, 291 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ @@ -571,46 +570,48 @@ static const yytype_int8 yyrhs[] = { 66, 0, -1, 67, -1, 82, -1, 69, -1, 68, -1, 70, -1, 71, -1, 72, -1, 74, -1, 22, - 25, 97, 31, 85, 42, 52, 31, 91, 42, -1, - 22, 25, 97, 31, 85, 42, 52, 31, 91, 42, - 50, -1, 8, 49, 97, 31, 75, 42, -1, 8, - 49, 97, 31, 75, 42, 18, -1, 51, 97, 44, - 92, 53, 89, -1, 51, 97, 44, 92, -1, 9, - 86, -1, 3, 49, 97, 73, -1, 3, 49, 97, - 19, 77, -1, 3, 49, 97, 19, 77, 18, -1, - 18, -1, 14, -1, 10, 49, 97, -1, 76, 41, + 25, 98, 31, 85, 42, 52, 31, 91, 42, -1, + 22, 25, 98, 31, 85, 42, 52, 31, 91, 42, + 50, -1, 8, 49, 98, 31, 75, 42, -1, 8, + 49, 98, 31, 75, 42, 18, -1, 51, 98, 44, + 92, 53, 89, -1, 51, 98, 44, 92, -1, 9, + 86, -1, 3, 49, 98, 73, -1, 3, 49, 98, + 19, 77, -1, 3, 49, 98, 19, 77, 18, -1, + 18, -1, 14, -1, 10, 49, 98, -1, 76, 41, 27, 85, -1, 76, 7, 77, -1, 77, -1, 96, 78, -1, 79, -1, 79, 33, -1, 79, 50, -1, 80, -1, 80, 36, 37, -1, 6, -1, 6, 31, 81, 42, -1, 30, -1, 45, -1, 23, -1, 29, - -1, 38, -1, 99, -1, 83, 40, 5, 85, -1, - 83, -1, 43, 84, -1, 43, 11, 84, -1, 85, - 86, -1, 96, -1, 96, 7, 85, -1, 47, -1, - 87, -1, 87, 53, 89, -1, 15, 97, -1, 15, - 88, -1, 97, -1, 97, 7, 88, -1, 31, 89, - 42, -1, 89, 4, 89, -1, 89, 39, 89, -1, - 95, 13, 90, -1, 95, 17, 90, -1, 95, 32, - 90, -1, 95, 28, 90, -1, 95, 16, 90, -1, - 95, 35, 90, -1, 95, 26, 37, -1, 95, 26, - 36, 37, -1, 95, -1, 94, -1, 94, -1, 94, - 7, 91, -1, 93, -1, 93, 7, 92, -1, 96, - 13, 94, -1, 99, -1, 34, 99, -1, 48, -1, - 54, -1, 96, -1, 97, 12, 98, -1, 98, -1, - 98, -1, 20, -1, 24, -1 + -1, 38, -1, 101, -1, 43, 83, -1, 43, 11, + 83, -1, 84, 86, -1, 97, -1, 97, 7, 84, + -1, 47, -1, 96, -1, 96, 7, 85, -1, 47, + -1, 15, 98, -1, 87, 40, 5, 85, -1, 87, + -1, 15, 88, -1, 15, 88, 53, 89, -1, 98, + -1, 98, 7, 88, -1, 31, 89, 42, -1, 89, + 4, 89, -1, 89, 39, 89, -1, 95, 13, 90, + -1, 95, 17, 90, -1, 95, 32, 90, -1, 95, + 28, 90, -1, 95, 16, 90, -1, 95, 35, 90, + -1, 95, 26, 37, -1, 95, 26, 36, 37, -1, + 95, -1, 94, -1, 94, -1, 94, 7, 91, -1, + 93, -1, 93, 7, 92, -1, 96, 13, 94, -1, + 101, -1, 34, 101, -1, 48, -1, 54, -1, 96, + -1, 98, 12, 99, -1, 99, -1, 98, 12, 99, + -1, 99, -1, 100, -1, 99, -1, 20, -1, 48, + -1, 24, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 133, 133, 141, 142, 143, 144, 145, 146, 147, - 151, 162, 176, 193, 209, 220, 234, 248, 259, 270, - 284, 288, 295, 310, 320, 330, 337, 346, 350, 354, - 361, 365, 372, 376, 380, 384, 388, 392, 396, 403, - 412, 425, 429, 433, 448, 468, 469, 473, 480, 481, - 496, 508, 523, 528, 537, 543, 549, 555, 561, 567, - 573, 579, 585, 591, 597, 606, 607, 611, 618, 629, - 630, 638, 646, 652, 658, 664, 673, 682, 688, 697, - 704, 712 + 0, 132, 132, 140, 141, 142, 143, 144, 145, 146, + 150, 161, 175, 192, 208, 219, 233, 247, 258, 269, + 283, 287, 294, 309, 319, 329, 336, 345, 349, 353, + 360, 364, 371, 375, 379, 383, 387, 391, 395, 402, + 411, 415, 430, 450, 451, 455, 462, 463, 467, 474, + 486, 499, 503, 515, 530, 534, 543, 549, 555, 561, + 567, 573, 579, 585, 591, 597, 603, 612, 613, 617, + 624, 635, 636, 644, 652, 658, 664, 670, 679, 688, + 694, 703, 709, 715, 724, 731, 739, 747 }; #endif @@ -633,10 +634,10 @@ static const char *const yytname[] = "query", "onequery", "oneinsert", "onecreate", "oneupdate", "onedelete", "onealter", "alterop", "onedrop", "table_def", "column_def", "column_and_type", "column_type", "data_type_l", "data_type", - "data_count", "oneselect", "unorderedsel", "selectfrom", "selcollist", - "from", "fromtable", "tablelist", "expr", "val", "constlist", + "data_count", "oneselect", "selectfrom", "selcollist", "collist", "from", + "unorderdfrom", "tablelist", "expr", "val", "constlist", "update_assign_list", "column_assignment", "const_val", "column_val", - "column", "table", "id", "number", 0 + "column", "selcolumn", "table", "id", "string", "number", 0 }; #endif @@ -662,11 +663,11 @@ static const yytype_uint8 yyr1[] = 68, 68, 69, 69, 70, 70, 71, 72, 72, 72, 73, 73, 74, 75, 76, 76, 77, 78, 78, 78, 79, 79, 80, 80, 80, 80, 80, 80, 80, 81, - 82, 82, 83, 83, 84, 85, 85, 85, 86, 86, - 87, 87, 88, 88, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 90, 90, 91, 91, 92, - 92, 93, 94, 94, 94, 94, 95, 96, 96, 97, - 98, 99 + 82, 82, 83, 84, 84, 84, 85, 85, 85, 86, + 86, 86, 87, 87, 88, 88, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 89, 90, 90, 91, + 91, 92, 92, 93, 94, 94, 94, 94, 95, 96, + 96, 97, 97, 97, 98, 99, 100, 101 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -676,11 +677,11 @@ static const yytype_uint8 yyr2[] = 10, 11, 6, 7, 6, 4, 2, 4, 5, 6, 1, 1, 3, 4, 3, 1, 2, 1, 2, 2, 1, 3, 1, 4, 1, 1, 1, 1, 1, 1, - 4, 1, 2, 3, 2, 1, 3, 1, 1, 3, - 2, 2, 1, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 4, 1, 1, 1, 3, 1, - 3, 3, 1, 2, 1, 1, 1, 3, 1, 1, - 1, 1 + 2, 3, 2, 1, 3, 1, 1, 3, 1, 2, + 4, 1, 2, 4, 1, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 4, 1, 1, 1, + 3, 1, 3, 3, 1, 2, 1, 1, 1, 3, + 1, 3, 1, 1, 1, 1, 1, 1 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -689,103 +690,107 @@ static const yytype_uint8 yyr2[] = static const yytype_uint8 yydefact[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, - 5, 4, 6, 7, 8, 9, 3, 41, 0, 0, - 0, 16, 48, 0, 0, 0, 80, 47, 42, 0, - 45, 0, 78, 0, 79, 1, 0, 0, 0, 51, - 50, 0, 22, 0, 43, 44, 0, 0, 0, 0, - 21, 20, 0, 17, 0, 0, 0, 49, 0, 76, - 0, 46, 77, 15, 69, 0, 40, 18, 0, 0, - 0, 25, 53, 52, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 19, 32, - 36, 37, 34, 38, 35, 26, 27, 30, 12, 0, - 0, 54, 55, 56, 81, 0, 74, 75, 57, 66, - 65, 72, 61, 58, 0, 63, 60, 59, 62, 0, - 14, 70, 71, 0, 28, 29, 0, 13, 24, 0, - 73, 64, 0, 0, 39, 31, 23, 0, 33, 0, - 67, 10, 0, 11, 68 + 5, 4, 6, 7, 8, 9, 3, 0, 0, 0, + 16, 51, 0, 0, 0, 85, 45, 86, 40, 0, + 43, 0, 82, 83, 0, 84, 1, 0, 0, 52, + 54, 0, 22, 0, 41, 42, 0, 0, 0, 21, + 20, 0, 17, 0, 0, 0, 0, 0, 44, 81, + 15, 71, 0, 0, 80, 18, 0, 0, 0, 25, + 0, 53, 0, 78, 55, 54, 48, 50, 46, 0, + 0, 0, 0, 0, 19, 32, 36, 37, 34, 38, + 35, 26, 27, 30, 12, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 72, 87, 0, 76, 77, 73, 74, 79, 0, 28, + 29, 0, 13, 24, 0, 56, 57, 58, 59, 68, + 67, 63, 60, 0, 65, 62, 61, 64, 47, 0, + 75, 0, 39, 31, 23, 66, 0, 33, 0, 69, + 10, 0, 11, 70 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - -1, 8, 9, 10, 11, 12, 13, 14, 53, 15, - 69, 70, 67, 95, 96, 97, 133, 16, 17, 28, - 29, 21, 22, 39, 57, 108, 139, 63, 64, 109, - 110, 59, 31, 32, 111 + -1, 8, 9, 10, 11, 12, 13, 14, 52, 15, + 67, 68, 65, 91, 92, 93, 141, 16, 28, 29, + 77, 20, 21, 39, 71, 128, 148, 60, 61, 129, + 130, 73, 30, 63, 64, 33, 116 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ -#define YYPACT_NINF -97 +#define YYPACT_NINF -80 static const yytype_int16 yypact[] = { - 4, -41, -19, 56, -14, 42, 14, 59, 72, -97, - -97, -97, -97, -97, -97, -97, -97, 36, 59, 59, - 59, -97, 30, 59, 59, 3, -97, -97, -97, 56, - 82, 79, 80, 50, -97, -97, 93, 51, 73, -97, - 96, 29, -97, 74, -97, -97, 3, 59, 59, 3, - -97, -97, 59, -97, 59, 59, 29, 20, 83, -97, - 3, -97, -97, 57, 99, 100, -97, 94, 52, 84, - 21, -97, -97, 96, -1, 29, 29, 54, 54, 54, - -26, 54, 54, 54, 85, 29, 59, 53, -97, 91, - -97, -97, -97, -97, -97, -97, 6, 78, 106, 59, - 98, -97, -97, 124, -97, 105, -97, -97, -97, -97, - -97, -97, -97, -97, 95, -97, -97, -97, -97, 81, - 20, -97, -97, 105, -97, -97, 97, -97, -97, 3, - -97, -97, 104, 88, -97, -97, -97, 53, -97, 89, - 129, 87, 53, -97, -97 + 36, -44, -39, -1, -26, 9, 50, 37, 56, -80, + -80, -80, -80, -80, -80, -80, -80, 37, 37, 37, + -80, 25, 37, 37, -18, -80, -80, -80, -80, -1, + 78, 47, 76, -80, 57, -80, -80, 105, 72, 51, + 55, 100, -80, 81, -80, -80, -18, 37, 37, -80, + -80, 37, -80, 37, 62, 37, -12, -12, -80, -80, + 63, 102, 108, 101, 76, 97, 45, 83, 2, -80, + 62, 3, 94, -80, -80, 126, -80, -80, 127, 93, + 62, 37, 52, 37, -80, 106, -80, -80, -80, -80, + -80, -80, 31, 103, 118, 37, 111, 11, 62, 62, + 60, 60, 60, -11, 60, 60, 60, -12, 88, 3, + -80, -80, 117, -80, -80, -80, -80, -80, 117, -80, + -80, 107, -80, -80, -12, -80, -80, 138, -80, -80, + -80, -80, -80, 109, -80, -80, -80, -80, -80, 112, + -80, 110, -80, -80, -80, -80, 52, -80, 113, 140, + 95, 52, -80, -80 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -97, -97, -97, -97, -97, -97, -97, -97, -97, -97, - -97, -97, -48, -97, -97, -97, -97, -97, -97, 113, - -45, 110, -97, 86, 10, 38, 0, 58, -97, -85, - -12, -6, 13, -2, -96 + -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, + -80, -80, -47, -80, -80, -80, -80, -80, 124, 104, + -53, 120, -80, 96, 19, 26, 5, 73, -80, -79, + -7, -29, -80, 14, -6, -80, -16 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -80 +#define YYTABLE_NINF -85 static const yytype_int16 yytable[] = { - 30, 61, 122, 75, 66, 34, 71, 1, 18, 130, - 114, 115, 2, 3, 4, 84, 34, 34, 34, 30, - 33, 34, 34, 26, 75, 25, 5, 134, 99, 58, - 19, 37, 38, 40, 26, 23, 42, 43, 76, 124, - 30, 101, 65, 30, 58, 62, 68, 6, 68, 26, - 27, 128, 140, 34, 30, 7, 125, 140, 89, 76, - 56, 27, 100, 58, 58, 50, 74, 24, 73, 51, - 52, 20, 35, 58, 26, 90, 36, 104, 104, 26, - 65, 91, 92, 41, 136, 102, 103, 105, 105, 46, - 93, 47, -79, 68, 48, 120, 77, 94, 49, 78, - 79, 106, 106, 55, 54, 60, 86, 107, 107, 80, - 85, 81, 88, 87, 126, 82, 112, 113, 83, 116, - 117, 118, 123, 30, 127, 129, 98, 119, 75, 104, - 138, 141, 131, 132, 135, 137, 142, 143, 44, 45, - 0, 72, 144, 0, 121 + 32, 35, 25, 115, 79, 17, 69, 98, 25, 95, + 18, 35, 35, 35, 19, 98, 35, 35, 32, 62, + 31, 34, 66, 22, 66, 133, 134, 78, 78, 26, + 27, 37, 38, 40, 23, 76, 42, 43, 31, 1, + 32, 59, 99, 96, 2, 3, 4, 72, 123, 35, + 99, 85, 62, 125, 138, -49, 36, 25, 5, 47, + 31, 24, 55, 72, 119, 41, 66, 149, 86, 75, + 25, 144, 149, 72, 87, 88, 111, 117, 78, 6, + 25, 120, 25, 89, 111, 46, 112, 7, -84, 97, + 90, 72, 72, 70, 112, 78, 140, 26, 27, 109, + 113, 48, 142, 53, 54, 56, 114, 100, 113, 81, + 101, 102, 57, 83, 114, 84, 80, 126, 127, 49, + 103, 82, 104, 50, 51, 94, 105, 131, 132, 106, + 135, 136, 137, 55, 107, 108, 122, 118, 124, 121, + 139, 111, 98, 146, 143, 152, 145, 151, 44, 45, + 58, 74, 147, 0, 110, 150, 153 }; static const yytype_int16 yycheck[] = { - 6, 46, 87, 4, 49, 7, 54, 3, 49, 105, - 36, 37, 8, 9, 10, 60, 18, 19, 20, 25, - 7, 23, 24, 20, 4, 11, 22, 123, 7, 41, - 49, 18, 19, 20, 20, 49, 23, 24, 39, 33, - 46, 42, 48, 49, 56, 47, 52, 43, 54, 20, - 47, 99, 137, 55, 60, 51, 50, 142, 6, 39, - 31, 47, 41, 75, 76, 14, 56, 25, 55, 18, - 19, 15, 0, 85, 20, 23, 40, 24, 24, 20, - 86, 29, 30, 53, 129, 75, 76, 34, 34, 7, - 38, 12, 12, 99, 44, 85, 13, 45, 5, 16, - 17, 48, 48, 7, 31, 31, 7, 54, 54, 26, - 53, 28, 18, 13, 36, 32, 78, 79, 35, 81, - 82, 83, 31, 129, 18, 27, 42, 42, 4, 24, - 42, 42, 37, 52, 37, 31, 7, 50, 25, 29, - -1, 55, 142, -1, 86 + 6, 7, 20, 82, 57, 49, 53, 4, 20, 7, + 49, 17, 18, 19, 15, 4, 22, 23, 24, 48, + 6, 7, 51, 49, 53, 36, 37, 56, 57, 47, + 48, 17, 18, 19, 25, 47, 22, 23, 24, 3, + 46, 47, 39, 41, 8, 9, 10, 54, 95, 55, + 39, 6, 81, 42, 107, 0, 0, 20, 22, 12, + 46, 11, 7, 70, 33, 40, 95, 146, 23, 55, + 20, 124, 151, 80, 29, 30, 24, 83, 107, 43, + 20, 50, 20, 38, 24, 7, 34, 51, 12, 70, + 45, 98, 99, 31, 34, 124, 112, 47, 48, 80, + 48, 44, 118, 31, 53, 5, 54, 13, 48, 7, + 16, 17, 31, 12, 54, 18, 53, 98, 99, 14, + 26, 13, 28, 18, 19, 42, 32, 101, 102, 35, + 104, 105, 106, 7, 7, 42, 18, 31, 27, 36, + 52, 24, 4, 31, 37, 50, 37, 7, 24, 29, + 46, 55, 42, -1, 81, 42, 151 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -793,20 +798,21 @@ static const yytype_int16 yycheck[] = static const yytype_uint8 yystos[] = { 0, 3, 8, 9, 10, 22, 43, 51, 66, 67, - 68, 69, 70, 71, 72, 74, 82, 83, 49, 49, - 15, 86, 87, 49, 25, 11, 20, 47, 84, 85, - 96, 97, 98, 97, 98, 0, 40, 97, 97, 88, - 97, 53, 97, 97, 84, 86, 7, 12, 44, 5, - 14, 18, 19, 73, 31, 7, 31, 89, 95, 96, - 31, 85, 98, 92, 93, 96, 85, 77, 96, 75, - 76, 77, 88, 97, 89, 4, 39, 13, 16, 17, - 26, 28, 32, 35, 85, 53, 7, 13, 18, 6, - 23, 29, 30, 38, 45, 78, 79, 80, 42, 7, - 41, 42, 89, 89, 24, 34, 48, 54, 90, 94, - 95, 99, 90, 90, 36, 37, 90, 90, 90, 42, - 89, 92, 94, 31, 33, 50, 36, 18, 77, 27, - 99, 37, 52, 81, 99, 37, 85, 31, 42, 91, - 94, 42, 7, 50, 91 + 68, 69, 70, 71, 72, 74, 82, 49, 49, 15, + 86, 87, 49, 25, 11, 20, 47, 48, 83, 84, + 97, 98, 99, 100, 98, 99, 0, 98, 98, 88, + 98, 40, 98, 98, 83, 86, 7, 12, 44, 14, + 18, 19, 73, 31, 53, 7, 5, 31, 84, 99, + 92, 93, 96, 98, 99, 77, 96, 75, 76, 77, + 31, 89, 95, 96, 88, 98, 47, 85, 96, 85, + 53, 7, 13, 12, 18, 6, 23, 29, 30, 38, + 45, 78, 79, 80, 42, 7, 41, 89, 4, 39, + 13, 16, 17, 26, 28, 32, 35, 7, 42, 89, + 92, 24, 34, 48, 54, 94, 101, 99, 31, 33, + 50, 36, 18, 77, 27, 42, 89, 89, 90, 94, + 95, 90, 90, 36, 37, 90, 90, 90, 85, 52, + 101, 81, 101, 37, 85, 37, 31, 42, 91, 94, + 42, 7, 50, 91 }; #define yyerrok (yyerrstatus = 0) @@ -1619,7 +1625,7 @@ yyreduce: case 2: /* Line 1455 of yacc.c */ -#line 134 "sql.y" +#line 133 "sql.y" { SQL_input* sql = (SQL_input*) info; *sql->view = (yyvsp[(1) - (1)].query); @@ -1629,7 +1635,7 @@ yyreduce: case 10: /* Line 1455 of yacc.c */ -#line 152 "sql.y" +#line 151 "sql.y" { SQL_input *sql = (SQL_input*) info; MSIVIEW *insert = NULL; @@ -1645,7 +1651,7 @@ yyreduce: case 11: /* Line 1455 of yacc.c */ -#line 163 "sql.y" +#line 162 "sql.y" { SQL_input *sql = (SQL_input*) info; MSIVIEW *insert = NULL; @@ -1661,7 +1667,7 @@ yyreduce: case 12: /* Line 1455 of yacc.c */ -#line 177 "sql.y" +#line 176 "sql.y" { SQL_input* sql = (SQL_input*) info; MSIVIEW *create = NULL; @@ -1683,7 +1689,7 @@ yyreduce: case 13: /* Line 1455 of yacc.c */ -#line 194 "sql.y" +#line 193 "sql.y" { SQL_input* sql = (SQL_input*) info; MSIVIEW *create = NULL; @@ -1701,7 +1707,7 @@ yyreduce: case 14: /* Line 1455 of yacc.c */ -#line 210 "sql.y" +#line 209 "sql.y" { SQL_input* sql = (SQL_input*) info; MSIVIEW *update = NULL; @@ -1717,7 +1723,7 @@ yyreduce: case 15: /* Line 1455 of yacc.c */ -#line 221 "sql.y" +#line 220 "sql.y" { SQL_input* sql = (SQL_input*) info; MSIVIEW *update = NULL; @@ -1733,7 +1739,7 @@ yyreduce: case 16: /* Line 1455 of yacc.c */ -#line 235 "sql.y" +#line 234 "sql.y" { SQL_input* sql = (SQL_input*) info; MSIVIEW *delete = NULL; @@ -1749,7 +1755,7 @@ yyreduce: case 17: /* Line 1455 of yacc.c */ -#line 249 "sql.y" +#line 248 "sql.y" { SQL_input* sql = (SQL_input*) info; MSIVIEW *alter = NULL; @@ -1765,7 +1771,7 @@ yyreduce: case 18: /* Line 1455 of yacc.c */ -#line 260 "sql.y" +#line 259 "sql.y" { SQL_input *sql = (SQL_input *)info; MSIVIEW *alter = NULL; @@ -1781,7 +1787,7 @@ yyreduce: case 19: /* Line 1455 of yacc.c */ -#line 271 "sql.y" +#line 270 "sql.y" { SQL_input *sql = (SQL_input *)info; MSIVIEW *alter = NULL; @@ -1797,7 +1803,7 @@ yyreduce: case 20: /* Line 1455 of yacc.c */ -#line 285 "sql.y" +#line 284 "sql.y" { (yyval.integer) = 1; ;} @@ -1806,7 +1812,7 @@ yyreduce: case 21: /* Line 1455 of yacc.c */ -#line 289 "sql.y" +#line 288 "sql.y" { (yyval.integer) = -1; ;} @@ -1815,7 +1821,7 @@ yyreduce: case 22: /* Line 1455 of yacc.c */ -#line 296 "sql.y" +#line 295 "sql.y" { SQL_input* sql = (SQL_input*) info; MSIVIEW* drop = NULL; @@ -1832,7 +1838,7 @@ yyreduce: case 23: /* Line 1455 of yacc.c */ -#line 311 "sql.y" +#line 310 "sql.y" { if( SQL_MarkPrimaryKeys( &(yyvsp[(1) - (4)].column_list), (yyvsp[(4) - (4)].column_list) ) ) (yyval.column_list) = (yyvsp[(1) - (4)].column_list); @@ -1844,7 +1850,7 @@ yyreduce: case 24: /* Line 1455 of yacc.c */ -#line 321 "sql.y" +#line 320 "sql.y" { column_info *ci; @@ -1859,7 +1865,7 @@ yyreduce: case 25: /* Line 1455 of yacc.c */ -#line 331 "sql.y" +#line 330 "sql.y" { (yyval.column_list) = (yyvsp[(1) - (1)].column_list); ;} @@ -1868,7 +1874,7 @@ yyreduce: case 26: /* Line 1455 of yacc.c */ -#line 338 "sql.y" +#line 337 "sql.y" { (yyval.column_list) = (yyvsp[(1) - (2)].column_list); (yyval.column_list)->type = ((yyvsp[(2) - (2)].column_type) | MSITYPE_VALID); @@ -1879,7 +1885,7 @@ yyreduce: case 27: /* Line 1455 of yacc.c */ -#line 347 "sql.y" +#line 346 "sql.y" { (yyval.column_type) = (yyvsp[(1) - (1)].column_type); ;} @@ -1888,7 +1894,7 @@ yyreduce: case 28: /* Line 1455 of yacc.c */ -#line 351 "sql.y" +#line 350 "sql.y" { (yyval.column_type) = (yyvsp[(1) - (2)].column_type) | MSITYPE_LOCALIZABLE; ;} @@ -1897,7 +1903,7 @@ yyreduce: case 29: /* Line 1455 of yacc.c */ -#line 355 "sql.y" +#line 354 "sql.y" { (yyval.column_type) = (yyvsp[(1) - (2)].column_type) | MSITYPE_TEMPORARY; ;} @@ -1906,7 +1912,7 @@ yyreduce: case 30: /* Line 1455 of yacc.c */ -#line 362 "sql.y" +#line 361 "sql.y" { (yyval.column_type) |= MSITYPE_NULLABLE; ;} @@ -1915,7 +1921,7 @@ yyreduce: case 31: /* Line 1455 of yacc.c */ -#line 366 "sql.y" +#line 365 "sql.y" { (yyval.column_type) = (yyvsp[(1) - (3)].column_type); ;} @@ -1924,7 +1930,7 @@ yyreduce: case 32: /* Line 1455 of yacc.c */ -#line 373 "sql.y" +#line 372 "sql.y" { (yyval.column_type) = MSITYPE_STRING | 1; ;} @@ -1933,7 +1939,7 @@ yyreduce: case 33: /* Line 1455 of yacc.c */ -#line 377 "sql.y" +#line 376 "sql.y" { (yyval.column_type) = MSITYPE_STRING | 0x400 | (yyvsp[(3) - (4)].column_type); ;} @@ -1942,7 +1948,7 @@ yyreduce: case 34: /* Line 1455 of yacc.c */ -#line 381 "sql.y" +#line 380 "sql.y" { (yyval.column_type) = MSITYPE_STRING | 0x400; ;} @@ -1951,7 +1957,7 @@ yyreduce: case 35: /* Line 1455 of yacc.c */ -#line 385 "sql.y" +#line 384 "sql.y" { (yyval.column_type) = 2 | 0x400; ;} @@ -1960,7 +1966,7 @@ yyreduce: case 36: /* Line 1455 of yacc.c */ -#line 389 "sql.y" +#line 388 "sql.y" { (yyval.column_type) = 2 | 0x400; ;} @@ -1969,7 +1975,7 @@ yyreduce: case 37: /* Line 1455 of yacc.c */ -#line 393 "sql.y" +#line 392 "sql.y" { (yyval.column_type) = 4; ;} @@ -1978,7 +1984,7 @@ yyreduce: case 38: /* Line 1455 of yacc.c */ -#line 397 "sql.y" +#line 396 "sql.y" { (yyval.column_type) = MSITYPE_STRING | MSITYPE_VALID; ;} @@ -1987,7 +1993,7 @@ yyreduce: case 39: /* Line 1455 of yacc.c */ -#line 404 "sql.y" +#line 403 "sql.y" { if( ( (yyvsp[(1) - (1)].integer) > 255 ) || ( (yyvsp[(1) - (1)].integer) < 0 ) ) YYABORT; @@ -1998,34 +2004,16 @@ yyreduce: case 40: /* Line 1455 of yacc.c */ -#line 413 "sql.y" - { - UINT r; - - if( (yyvsp[(4) - (4)].column_list) ) - { - r = (yyvsp[(1) - (4)].query)->ops->sort( (yyvsp[(1) - (4)].query), (yyvsp[(4) - (4)].column_list) ); - if ( r != ERROR_SUCCESS) - YYABORT; - } - - (yyval.query) = (yyvsp[(1) - (4)].query); - ;} - break; - - case 42: - -/* Line 1455 of yacc.c */ -#line 430 "sql.y" +#line 412 "sql.y" { (yyval.query) = (yyvsp[(2) - (2)].query); ;} break; - case 43: + case 41: /* Line 1455 of yacc.c */ -#line 434 "sql.y" +#line 416 "sql.y" { SQL_input* sql = (SQL_input*) info; MSIVIEW* distinct = NULL; @@ -2039,10 +2027,10 @@ yyreduce: ;} break; - case 44: + case 42: /* Line 1455 of yacc.c */ -#line 449 "sql.y" +#line 431 "sql.y" { SQL_input* sql = (SQL_input*) info; MSIVIEW* select = NULL; @@ -2061,19 +2049,37 @@ yyreduce: ;} break; - case 46: + case 44: /* Line 1455 of yacc.c */ -#line 470 "sql.y" +#line 452 "sql.y" { (yyvsp[(1) - (3)].column_list)->next = (yyvsp[(3) - (3)].column_list); ;} break; + case 45: + +/* Line 1455 of yacc.c */ +#line 456 "sql.y" + { + (yyval.column_list) = NULL; + ;} + break; + case 47: /* Line 1455 of yacc.c */ -#line 474 "sql.y" +#line 464 "sql.y" + { + (yyvsp[(1) - (3)].column_list)->next = (yyvsp[(3) - (3)].column_list); + ;} + break; + + case 48: + +/* Line 1455 of yacc.c */ +#line 468 "sql.y" { (yyval.column_list) = NULL; ;} @@ -2082,24 +2088,7 @@ yyreduce: case 49: /* Line 1455 of yacc.c */ -#line 482 "sql.y" - { - SQL_input* sql = (SQL_input*) info; - MSIVIEW* where = NULL; - UINT r; - - r = WHERE_CreateView( sql->db, &where, (yyvsp[(1) - (3)].query), (yyvsp[(3) - (3)].expr) ); - if( r != ERROR_SUCCESS ) - YYABORT; - - PARSER_BUBBLE_UP_VIEW( sql, (yyval.query), where ); - ;} - break; - - case 50: - -/* Line 1455 of yacc.c */ -#line 497 "sql.y" +#line 475 "sql.y" { SQL_input* sql = (SQL_input*) info; MSIVIEW* table = NULL; @@ -2113,36 +2102,71 @@ yyreduce: ;} break; - case 51: + case 50: /* Line 1455 of yacc.c */ -#line 509 "sql.y" +#line 487 "sql.y" { - SQL_input* sql = (SQL_input*) info; - MSIVIEW* join = NULL; UINT r; - r = JOIN_CreateView( sql->db, &join, (yyvsp[(2) - (2)].string) ); - if( r != ERROR_SUCCESS ) - YYABORT; + if( (yyvsp[(4) - (4)].column_list) ) + { + r = (yyvsp[(1) - (4)].query)->ops->sort( (yyvsp[(1) - (4)].query), (yyvsp[(4) - (4)].column_list) ); + if ( r != ERROR_SUCCESS) + YYABORT; + } - PARSER_BUBBLE_UP_VIEW( sql, (yyval.query), join ); + (yyval.query) = (yyvsp[(1) - (4)].query); ;} break; case 52: /* Line 1455 of yacc.c */ -#line 524 "sql.y" +#line 504 "sql.y" { - (yyval.string) = (yyvsp[(1) - (1)].string); + SQL_input* sql = (SQL_input*) info; + MSIVIEW* where = NULL; + UINT r; + + r = WHERE_CreateView( sql->db, &where, (yyvsp[(2) - (2)].string), NULL ); + if( r != ERROR_SUCCESS ) + YYABORT; + + PARSER_BUBBLE_UP_VIEW( sql, (yyval.query), where ); ;} break; case 53: /* Line 1455 of yacc.c */ -#line 529 "sql.y" +#line 516 "sql.y" + { + SQL_input* sql = (SQL_input*) info; + MSIVIEW* where = NULL; + UINT r; + + r = WHERE_CreateView( sql->db, &where, (yyvsp[(2) - (4)].string), (yyvsp[(4) - (4)].expr) ); + if( r != ERROR_SUCCESS ) + YYABORT; + + PARSER_BUBBLE_UP_VIEW( sql, (yyval.query), where ); + ;} + break; + + case 54: + +/* Line 1455 of yacc.c */ +#line 531 "sql.y" + { + (yyval.string) = (yyvsp[(1) - (1)].string); + ;} + break; + + case 55: + +/* Line 1455 of yacc.c */ +#line 535 "sql.y" { (yyval.string) = parser_add_table( info, (yyvsp[(3) - (3)].string), (yyvsp[(1) - (3)].string) ); if (!(yyval.string)) @@ -2150,34 +2174,12 @@ yyreduce: ;} break; - case 54: - -/* Line 1455 of yacc.c */ -#line 538 "sql.y" - { - (yyval.expr) = (yyvsp[(2) - (3)].expr); - if( !(yyval.expr) ) - YYABORT; - ;} - break; - - case 55: + case 56: /* Line 1455 of yacc.c */ #line 544 "sql.y" { - (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_AND, (yyvsp[(3) - (3)].expr) ); - if( !(yyval.expr) ) - YYABORT; - ;} - break; - - case 56: - -/* Line 1455 of yacc.c */ -#line 550 "sql.y" - { - (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_OR, (yyvsp[(3) - (3)].expr) ); + (yyval.expr) = (yyvsp[(2) - (3)].expr); if( !(yyval.expr) ) YYABORT; ;} @@ -2186,9 +2188,9 @@ yyreduce: case 57: /* Line 1455 of yacc.c */ -#line 556 "sql.y" +#line 550 "sql.y" { - (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_EQ, (yyvsp[(3) - (3)].expr) ); + (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_AND, (yyvsp[(3) - (3)].expr) ); if( !(yyval.expr) ) YYABORT; ;} @@ -2197,9 +2199,9 @@ yyreduce: case 58: /* Line 1455 of yacc.c */ -#line 562 "sql.y" +#line 556 "sql.y" { - (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_GT, (yyvsp[(3) - (3)].expr) ); + (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_OR, (yyvsp[(3) - (3)].expr) ); if( !(yyval.expr) ) YYABORT; ;} @@ -2208,9 +2210,9 @@ yyreduce: case 59: /* Line 1455 of yacc.c */ -#line 568 "sql.y" +#line 562 "sql.y" { - (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_LT, (yyvsp[(3) - (3)].expr) ); + (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_EQ, (yyvsp[(3) - (3)].expr) ); if( !(yyval.expr) ) YYABORT; ;} @@ -2219,9 +2221,9 @@ yyreduce: case 60: /* Line 1455 of yacc.c */ -#line 574 "sql.y" +#line 568 "sql.y" { - (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_LE, (yyvsp[(3) - (3)].expr) ); + (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_GT, (yyvsp[(3) - (3)].expr) ); if( !(yyval.expr) ) YYABORT; ;} @@ -2230,9 +2232,9 @@ yyreduce: case 61: /* Line 1455 of yacc.c */ -#line 580 "sql.y" +#line 574 "sql.y" { - (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_GE, (yyvsp[(3) - (3)].expr) ); + (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_LT, (yyvsp[(3) - (3)].expr) ); if( !(yyval.expr) ) YYABORT; ;} @@ -2241,9 +2243,9 @@ yyreduce: case 62: /* Line 1455 of yacc.c */ -#line 586 "sql.y" +#line 580 "sql.y" { - (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_NE, (yyvsp[(3) - (3)].expr) ); + (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_LE, (yyvsp[(3) - (3)].expr) ); if( !(yyval.expr) ) YYABORT; ;} @@ -2252,9 +2254,9 @@ yyreduce: case 63: /* Line 1455 of yacc.c */ -#line 592 "sql.y" +#line 586 "sql.y" { - (yyval.expr) = EXPR_unary( info, (yyvsp[(1) - (3)].expr), OP_ISNULL ); + (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_GE, (yyvsp[(3) - (3)].expr) ); if( !(yyval.expr) ) YYABORT; ;} @@ -2262,8 +2264,30 @@ yyreduce: case 64: +/* Line 1455 of yacc.c */ +#line 592 "sql.y" + { + (yyval.expr) = EXPR_complex( info, (yyvsp[(1) - (3)].expr), OP_NE, (yyvsp[(3) - (3)].expr) ); + if( !(yyval.expr) ) + YYABORT; + ;} + break; + + case 65: + /* Line 1455 of yacc.c */ #line 598 "sql.y" + { + (yyval.expr) = EXPR_unary( info, (yyvsp[(1) - (3)].expr), OP_ISNULL ); + if( !(yyval.expr) ) + YYABORT; + ;} + break; + + case 66: + +/* Line 1455 of yacc.c */ +#line 604 "sql.y" { (yyval.expr) = EXPR_unary( info, (yyvsp[(1) - (4)].expr), OP_NOTNULL ); if( !(yyval.expr) ) @@ -2271,10 +2295,10 @@ yyreduce: ;} break; - case 67: + case 69: /* Line 1455 of yacc.c */ -#line 612 "sql.y" +#line 618 "sql.y" { (yyval.column_list) = parser_alloc_column( info, NULL, NULL ); if( !(yyval.column_list) ) @@ -2283,10 +2307,10 @@ yyreduce: ;} break; - case 68: + case 70: /* Line 1455 of yacc.c */ -#line 619 "sql.y" +#line 625 "sql.y" { (yyval.column_list) = parser_alloc_column( info, NULL, NULL ); if( !(yyval.column_list) ) @@ -2296,54 +2320,32 @@ yyreduce: ;} break; - case 70: + case 72: /* Line 1455 of yacc.c */ -#line 631 "sql.y" +#line 637 "sql.y" { (yyval.column_list) = (yyvsp[(1) - (3)].column_list); (yyval.column_list)->next = (yyvsp[(3) - (3)].column_list); ;} break; - case 71: + case 73: /* Line 1455 of yacc.c */ -#line 639 "sql.y" +#line 645 "sql.y" { (yyval.column_list) = (yyvsp[(1) - (3)].column_list); (yyval.column_list)->val = (yyvsp[(3) - (3)].expr); ;} break; - case 72: - -/* Line 1455 of yacc.c */ -#line 647 "sql.y" - { - (yyval.expr) = EXPR_ival( info, (yyvsp[(1) - (1)].integer) ); - if( !(yyval.expr) ) - YYABORT; - ;} - break; - - case 73: + case 74: /* Line 1455 of yacc.c */ #line 653 "sql.y" { - (yyval.expr) = EXPR_ival( info, -(yyvsp[(2) - (2)].integer) ); - if( !(yyval.expr) ) - YYABORT; - ;} - break; - - case 74: - -/* Line 1455 of yacc.c */ -#line 659 "sql.y" - { - (yyval.expr) = EXPR_sval( info, &(yyvsp[(1) - (1)].str) ); + (yyval.expr) = EXPR_ival( info, (yyvsp[(1) - (1)].integer) ); if( !(yyval.expr) ) YYABORT; ;} @@ -2352,9 +2354,9 @@ yyreduce: case 75: /* Line 1455 of yacc.c */ -#line 665 "sql.y" +#line 659 "sql.y" { - (yyval.expr) = EXPR_wildcard( info ); + (yyval.expr) = EXPR_ival( info, -(yyvsp[(2) - (2)].integer) ); if( !(yyval.expr) ) YYABORT; ;} @@ -2363,9 +2365,9 @@ yyreduce: case 76: /* Line 1455 of yacc.c */ -#line 674 "sql.y" +#line 665 "sql.y" { - (yyval.expr) = EXPR_column( info, (yyvsp[(1) - (1)].column_list) ); + (yyval.expr) = EXPR_sval( info, &(yyvsp[(1) - (1)].str) ); if( !(yyval.expr) ) YYABORT; ;} @@ -2374,10 +2376,10 @@ yyreduce: case 77: /* Line 1455 of yacc.c */ -#line 683 "sql.y" +#line 671 "sql.y" { - (yyval.column_list) = parser_alloc_column( info, (yyvsp[(1) - (3)].string), (yyvsp[(3) - (3)].string) ); - if( !(yyval.column_list) ) + (yyval.expr) = EXPR_wildcard( info ); + if( !(yyval.expr) ) YYABORT; ;} break; @@ -2385,10 +2387,10 @@ yyreduce: case 78: /* Line 1455 of yacc.c */ -#line 689 "sql.y" +#line 680 "sql.y" { - (yyval.column_list) = parser_alloc_column( info, NULL, (yyvsp[(1) - (1)].string) ); - if( !(yyval.column_list) ) + (yyval.expr) = EXPR_column( info, (yyvsp[(1) - (1)].column_list) ); + if( !(yyval.expr) ) YYABORT; ;} break; @@ -2396,18 +2398,21 @@ yyreduce: case 79: /* Line 1455 of yacc.c */ -#line 698 "sql.y" +#line 689 "sql.y" { - (yyval.string) = (yyvsp[(1) - (1)].string); + (yyval.column_list) = parser_alloc_column( info, (yyvsp[(1) - (3)].string), (yyvsp[(3) - (3)].string) ); + if( !(yyval.column_list) ) + YYABORT; ;} break; case 80: /* Line 1455 of yacc.c */ -#line 705 "sql.y" +#line 695 "sql.y" { - if ( SQL_getstring( info, &(yyvsp[(1) - (1)].str), &(yyval.string) ) != ERROR_SUCCESS || !(yyval.string) ) + (yyval.column_list) = parser_alloc_column( info, NULL, (yyvsp[(1) - (1)].string) ); + if( !(yyval.column_list) ) YYABORT; ;} break; @@ -2415,7 +2420,69 @@ yyreduce: case 81: /* Line 1455 of yacc.c */ -#line 713 "sql.y" +#line 704 "sql.y" + { + (yyval.column_list) = parser_alloc_column( info, (yyvsp[(1) - (3)].string), (yyvsp[(3) - (3)].string) ); + if( !(yyval.column_list) ) + YYABORT; + ;} + break; + + case 82: + +/* Line 1455 of yacc.c */ +#line 710 "sql.y" + { + (yyval.column_list) = parser_alloc_column( info, NULL, (yyvsp[(1) - (1)].string) ); + if( !(yyval.column_list) ) + YYABORT; + ;} + break; + + case 83: + +/* Line 1455 of yacc.c */ +#line 716 "sql.y" + { + (yyval.column_list) = parser_alloc_column( info, NULL, (yyvsp[(1) - (1)].string) ); + if( !(yyval.column_list) ) + YYABORT; + ;} + break; + + case 84: + +/* Line 1455 of yacc.c */ +#line 725 "sql.y" + { + (yyval.string) = (yyvsp[(1) - (1)].string); + ;} + break; + + case 85: + +/* Line 1455 of yacc.c */ +#line 732 "sql.y" + { + if ( SQL_getstring( info, &(yyvsp[(1) - (1)].str), &(yyval.string) ) != ERROR_SUCCESS || !(yyval.string) ) + YYABORT; + ;} + break; + + case 86: + +/* Line 1455 of yacc.c */ +#line 740 "sql.y" + { + if ( SQL_getstring( info, &(yyvsp[(1) - (1)].str), &(yyval.string) ) != ERROR_SUCCESS || !(yyval.string) ) + YYABORT; + ;} + break; + + case 87: + +/* Line 1455 of yacc.c */ +#line 748 "sql.y" { (yyval.integer) = SQL_getint( info ); ;} @@ -2424,7 +2491,7 @@ yyreduce: /* Line 1455 of yacc.c */ -#line 2428 "sql.tab.c" +#line 2488 "sql.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -2636,7 +2703,7 @@ yyreturn: /* Line 1675 of yacc.c */ -#line 718 "sql.y" +#line 753 "sql.y" static LPWSTR parser_add_table( void *info, LPCWSTR list, LPCWSTR table ) @@ -2684,7 +2751,7 @@ static column_info *parser_alloc_column( void *info, LPCWSTR table, LPCWSTR colu static int sql_lex( void *SQL_lval, SQL_input *sql ) { - int token; + int token, skip; struct sql_str * str = SQL_lval; do @@ -2694,11 +2761,12 @@ static int sql_lex( void *SQL_lval, SQL_input *sql ) return 0; /* end of input */ /* TRACE("string : %s\n", debugstr_w(&sql->command[sql->n])); */ - sql->len = sqliteGetToken( &sql->command[sql->n], &token ); + sql->len = sqliteGetToken( &sql->command[sql->n], &token, &skip ); if( sql->len==0 ) break; str->data = &sql->command[sql->n]; str->len = sql->len; + sql->n += skip; } while( token == TK_SPACE ); @@ -2799,8 +2867,8 @@ static struct expr * EXPR_column( void *info, const column_info *column ) if( e ) { e->type = EXPR_COLUMN; - e->u.column.column = column->column; - e->u.column.table = column->table; + e->u.column.unparsed.column = column->column; + e->u.column.unparsed.table = column->table; } return e; } diff --git a/reactos/dll/win32/msi/sql.y b/reactos/dll/win32/msi/sql.y index 01217378534..ead7743171d 100644 --- a/reactos/dll/win32/msi/sql.y +++ b/reactos/dll/win32/msi/sql.y @@ -111,16 +111,15 @@ static struct expr * EXPR_wildcard( void *info ); %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION COLUMN AGG_FUNCTION. -%type table tablelist id -%type selcollist column column_and_type column_def table_def +%type table tablelist id string +%type selcollist collist selcolumn column column_and_type column_def table_def %type column_assignment update_assign_list constlist -%type query from fromtable selectfrom unorderedsel +%type query from selectfrom unorderdfrom %type oneupdate onedelete oneselect onequery onecreate oneinsert onealter onedrop %type expr val column_val const_val %type column_type data_type data_type_l data_count %type number alterop -/* Reference: http://mates.ms.mff.cuni.cz/oracle/doc/ora815nt/server.815/a67779/operator.htm */ %left TK_OR %left TK_AND %left TK_NOT @@ -148,7 +147,7 @@ onequery: ; oneinsert: - TK_INSERT TK_INTO table TK_LP selcollist TK_RP TK_VALUES TK_LP constlist TK_RP + TK_INSERT TK_INTO table TK_LP collist TK_RP TK_VALUES TK_LP constlist TK_RP { SQL_input *sql = (SQL_input*) info; MSIVIEW *insert = NULL; @@ -159,7 +158,7 @@ oneinsert: PARSER_BUBBLE_UP_VIEW( sql, $$, insert ); } - | TK_INSERT TK_INTO table TK_LP selcollist TK_RP TK_VALUES TK_LP constlist TK_RP TK_TEMPORARY + | TK_INSERT TK_INTO table TK_LP collist TK_RP TK_VALUES TK_LP constlist TK_RP TK_TEMPORARY { SQL_input *sql = (SQL_input*) info; MSIVIEW *insert = NULL; @@ -307,7 +306,7 @@ onedrop: ; table_def: - column_def TK_PRIMARY TK_KEY selcollist + column_def TK_PRIMARY TK_KEY collist { if( SQL_MarkPrimaryKeys( &$1, $4 ) ) $$ = $1; @@ -409,23 +408,6 @@ data_count: ; oneselect: - unorderedsel TK_ORDER TK_BY selcollist - { - UINT r; - - if( $4 ) - { - r = $1->ops->sort( $1, $4 ); - if ( r != ERROR_SUCCESS) - YYABORT; - } - - $$ = $1; - } - | unorderedsel - ; - -unorderedsel: TK_SELECT selectfrom { $$ = $2; @@ -465,8 +447,20 @@ selectfrom: ; selcollist: + selcolumn + | selcolumn TK_COMMA selcollist + { + $1->next = $3; + } + | TK_STAR + { + $$ = NULL; + } + ; + +collist: column - | column TK_COMMA selcollist + | column TK_COMMA collist { $1->next = $3; } @@ -477,22 +471,6 @@ selcollist: ; from: - fromtable - | fromtable TK_WHERE expr - { - SQL_input* sql = (SQL_input*) info; - MSIVIEW* where = NULL; - UINT r; - - r = WHERE_CreateView( sql->db, &where, $1, $3 ); - if( r != ERROR_SUCCESS ) - YYABORT; - - PARSER_BUBBLE_UP_VIEW( sql, $$, where ); - } - ; - -fromtable: TK_FROM table { SQL_input* sql = (SQL_input*) info; @@ -505,17 +483,46 @@ fromtable: PARSER_BUBBLE_UP_VIEW( sql, $$, table ); } - | TK_FROM tablelist + | unorderdfrom TK_ORDER TK_BY collist { - SQL_input* sql = (SQL_input*) info; - MSIVIEW* join = NULL; UINT r; - r = JOIN_CreateView( sql->db, &join, $2 ); + if( $4 ) + { + r = $1->ops->sort( $1, $4 ); + if ( r != ERROR_SUCCESS) + YYABORT; + } + + $$ = $1; + } + | unorderdfrom + ; + +unorderdfrom: + TK_FROM tablelist + { + SQL_input* sql = (SQL_input*) info; + MSIVIEW* where = NULL; + UINT r; + + r = WHERE_CreateView( sql->db, &where, $2, NULL ); if( r != ERROR_SUCCESS ) YYABORT; - PARSER_BUBBLE_UP_VIEW( sql, $$, join ); + PARSER_BUBBLE_UP_VIEW( sql, $$, where ); + } + | TK_FROM tablelist TK_WHERE expr + { + SQL_input* sql = (SQL_input*) info; + MSIVIEW* where = NULL; + UINT r; + + r = WHERE_CreateView( sql->db, &where, $2, $4 ); + if( r != ERROR_SUCCESS ) + YYABORT; + + PARSER_BUBBLE_UP_VIEW( sql, $$, where ); } ; @@ -524,8 +531,7 @@ tablelist: { $$ = $1; } - | - table TK_COMMA tablelist + | table TK_COMMA tablelist { $$ = parser_add_table( info, $3, $1 ); if (!$$) @@ -693,6 +699,27 @@ column: } ; +selcolumn: + table TK_DOT id + { + $$ = parser_alloc_column( info, $1, $3 ); + if( !$$ ) + YYABORT; + } + | id + { + $$ = parser_alloc_column( info, NULL, $1 ); + if( !$$ ) + YYABORT; + } + | string + { + $$ = parser_alloc_column( info, NULL, $1 ); + if( !$$ ) + YYABORT; + } + ; + table: id { @@ -708,6 +735,14 @@ id: } ; +string: + TK_STRING + { + if ( SQL_getstring( info, &$1, &$$ ) != ERROR_SUCCESS || !$$ ) + YYABORT; + } + ; + number: TK_INTEGER { @@ -762,7 +797,7 @@ static column_info *parser_alloc_column( void *info, LPCWSTR table, LPCWSTR colu static int sql_lex( void *SQL_lval, SQL_input *sql ) { - int token; + int token, skip; struct sql_str * str = SQL_lval; do @@ -772,11 +807,12 @@ static int sql_lex( void *SQL_lval, SQL_input *sql ) return 0; /* end of input */ /* TRACE("string : %s\n", debugstr_w(&sql->command[sql->n])); */ - sql->len = sqliteGetToken( &sql->command[sql->n], &token ); + sql->len = sqliteGetToken( &sql->command[sql->n], &token, &skip ); if( sql->len==0 ) break; str->data = &sql->command[sql->n]; str->len = sql->len; + sql->n += skip; } while( token == TK_SPACE ); @@ -877,8 +913,8 @@ static struct expr * EXPR_column( void *info, const column_info *column ) if( e ) { e->type = EXPR_COLUMN; - e->u.column.column = column->column; - e->u.column.table = column->table; + e->u.column.unparsed.column = column->column; + e->u.column.unparsed.table = column->table; } return e; } diff --git a/reactos/dll/win32/msi/storages.c b/reactos/dll/win32/msi/storages.c index 56f252fa37f..c980df8aa32 100644 --- a/reactos/dll/win32/msi/storages.c +++ b/reactos/dll/win32/msi/storages.c @@ -280,16 +280,9 @@ static UINT STORAGES_get_dimensions(struct tagMSIVIEW *view, UINT *rows, UINT *c return ERROR_SUCCESS; } -static UINT STORAGES_get_column_info(struct tagMSIVIEW *view, UINT n, - LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name) +static UINT STORAGES_get_column_info( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, + UINT *type, BOOL *temporary, LPCWSTR *table_name ) { - LPCWSTR name_ptr = NULL; - - static const WCHAR Name[] = {'N','a','m','e',0}; - static const WCHAR Data[] = {'D','a','t','a',0}; - static const WCHAR _Storages[] = {'_','S','t','o','r','a','g','e','s',0}; - TRACE("(%p, %d, %p, %p, %p, %p)\n", view, n, name, type, temporary, table_name); @@ -299,35 +292,17 @@ static UINT STORAGES_get_column_info(struct tagMSIVIEW *view, UINT n, switch (n) { case 1: - name_ptr = Name; - if (type) *type = MSITYPE_STRING | MAX_STORAGES_NAME_LEN; + if (name) *name = szName; + if (type) *type = MSITYPE_STRING | MSITYPE_VALID | MAX_STORAGES_NAME_LEN; break; case 2: - name_ptr = Data; + if (name) *name = szData; if (type) *type = MSITYPE_STRING | MSITYPE_VALID | MSITYPE_NULLABLE; break; } - - if (name) - { - *name = strdupW(name_ptr); - if (!*name) return ERROR_FUNCTION_FAILED; - } - - if (table_name) - { - *table_name = strdupW(_Storages); - if (!*table_name) - { - msi_free(name); - return ERROR_FUNCTION_FAILED; - } - } - - if (temporary) - *temporary = FALSE; - + if (table_name) *table_name = szStorages; + if (temporary) *temporary = FALSE; return ERROR_SUCCESS; } @@ -557,7 +532,7 @@ UINT STORAGES_CreateView(MSIDATABASE *db, MSIVIEW **view) TRACE("(%p, %p)\n", db, view); - sv = msi_alloc(sizeof(MSISTORAGESVIEW)); + sv = msi_alloc_zero( sizeof(MSISTORAGESVIEW) ); if (!sv) return ERROR_FUNCTION_FAILED; diff --git a/reactos/dll/win32/msi/streams.c b/reactos/dll/win32/msi/streams.c index 44c4e67718b..71616e93eb0 100644 --- a/reactos/dll/win32/msi/streams.c +++ b/reactos/dll/win32/msi/streams.c @@ -182,7 +182,7 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U } encname = encode_streamname(FALSE, name); - db_destroy_stream(sv->db, encname); + msi_destroy_stream(sv->db, encname); r = write_stream_data(sv->db->storage, name, data, count, FALSE); if (r != ERROR_SUCCESS) @@ -267,16 +267,9 @@ static UINT STREAMS_get_dimensions(struct tagMSIVIEW *view, UINT *rows, UINT *co return ERROR_SUCCESS; } -static UINT STREAMS_get_column_info(struct tagMSIVIEW *view, UINT n, - LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name) +static UINT STREAMS_get_column_info( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, + UINT *type, BOOL *temporary, LPCWSTR *table_name ) { - LPCWSTR name_ptr = NULL; - - static const WCHAR Name[] = {'N','a','m','e',0}; - static const WCHAR Data[] = {'D','a','t','a',0}; - static const WCHAR _Streams[] = {'_','S','t','r','e','a','m','s',0}; - TRACE("(%p, %d, %p, %p, %p, %p)\n", view, n, name, type, temporary, table_name); @@ -286,45 +279,29 @@ static UINT STREAMS_get_column_info(struct tagMSIVIEW *view, UINT n, switch (n) { case 1: - name_ptr = Name; + if (name) *name = szName; if (type) *type = MSITYPE_STRING | MSITYPE_VALID | MAX_STREAM_NAME_LEN; break; case 2: - name_ptr = Data; + if (name) *name = szData; if (type) *type = MSITYPE_STRING | MSITYPE_VALID | MSITYPE_NULLABLE; break; } - - if (name) - { - *name = strdupW(name_ptr); - if (!*name) return ERROR_FUNCTION_FAILED; - } - - if (table_name) - { - *table_name = strdupW(_Streams); - if (!*table_name) - { - msi_free(name); - return ERROR_FUNCTION_FAILED; - } - } - - if (temporary) - *temporary = FALSE; - + if (table_name) *table_name = szStreams; + if (temporary) *temporary = FALSE; return ERROR_SUCCESS; } static UINT streams_find_row(MSISTREAMSVIEW *sv, MSIRECORD *rec, UINT *row) { LPCWSTR str; - UINT i, id, data; + UINT r, i, id, data; str = MSI_RecordGetString(rec, 1); - msi_string2idW(sv->db->strings, str, &id); + r = msi_string2idW(sv->db->strings, str, &id); + if (r != ERROR_SUCCESS) + return r; for (i = 0; i < sv->num_rows; i++) { @@ -529,12 +506,12 @@ static INT add_streams_to_table(MSISTREAMSVIEW *sv) /* these streams appear to be unencoded */ if (*stat.pwcsName == 0x0005) { - r = db_get_raw_stream(sv->db, stat.pwcsName, &stream->stream); + r = msi_get_raw_stream(sv->db, stat.pwcsName, &stream->stream); } else { encname = encode_streamname(FALSE, stat.pwcsName); - r = db_get_raw_stream(sv->db, encname, &stream->stream); + r = msi_get_raw_stream(sv->db, encname, &stream->stream); msi_free(encname); } CoTaskMemFree(stat.pwcsName); @@ -566,7 +543,7 @@ UINT STREAMS_CreateView(MSIDATABASE *db, MSIVIEW **view) TRACE("(%p, %p)\n", db, view); - sv = msi_alloc(sizeof(MSISTREAMSVIEW)); + sv = msi_alloc_zero( sizeof(MSISTREAMSVIEW) ); if (!sv) return ERROR_FUNCTION_FAILED; diff --git a/reactos/dll/win32/msi/string.c b/reactos/dll/win32/msi/string.c index 406803337f4..4185c15f7c1 100644 --- a/reactos/dll/win32/msi/string.c +++ b/reactos/dll/win32/msi/string.c @@ -41,12 +41,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb); -typedef struct _msistring +struct msistring { USHORT persistent_refcount; USHORT nonpersistent_refcount; LPWSTR str; -} msistring; +}; struct string_table { @@ -54,8 +54,8 @@ struct string_table UINT freeslot; UINT codepage; UINT sortcount; - msistring *strings; /* an array of strings */ - UINT *sorted; /* index */ + struct msistring *strings; /* an array of strings */ + UINT *sorted; /* index */ }; static BOOL validate_codepage( UINT codepage ) @@ -81,7 +81,7 @@ static string_table *init_stringtable( int entries, UINT codepage ) if( entries < 1 ) entries = 1; - st->strings = msi_alloc_zero( sizeof (msistring) * entries ); + st->strings = msi_alloc_zero( sizeof(struct msistring) * entries ); if( !st->strings ) { msi_free( st ); @@ -122,7 +122,7 @@ VOID msi_destroy_stringtable( string_table *st ) static int st_find_free_entry( string_table *st ) { UINT i, sz, *s; - msistring *p; + struct msistring *p; TRACE("%p\n", st); @@ -140,7 +140,7 @@ static int st_find_free_entry( string_table *st ) /* dynamically resize */ sz = st->maxcount + 1 + st->maxcount/2; - p = msi_realloc_zero( st->strings, sz*sizeof(msistring) ); + p = msi_realloc_zero( st->strings, sz * sizeof(struct msistring) ); if( !p ) return -1; @@ -461,11 +461,6 @@ static void string_totalsize( const string_table *st, UINT *datasize, UINT *pool TRACE("data %u pool %u codepage %x\n", *datasize, *poolsize, st->codepage ); } -static const WCHAR szStringData[] = { - '_','S','t','r','i','n','g','D','a','t','a',0 }; -static const WCHAR szStringPool[] = { - '_','S','t','r','i','n','g','P','o','o','l',0 }; - HRESULT msi_init_string_table( IStorage *stg ) { USHORT zero[2] = { 0, 0 }; diff --git a/reactos/dll/win32/msi/suminfo.c b/reactos/dll/win32/msi/suminfo.c index 2a9cd713001..e0c99b8b488 100644 --- a/reactos/dll/win32/msi/suminfo.c +++ b/reactos/dll/win32/msi/suminfo.c @@ -516,9 +516,7 @@ UINT WINAPI MsiGetSummaryInformationW( MSIHANDLE hDatabase, msiobj_release( &si->hdr ); } - if( db ) - msiobj_release( &db->hdr ); - + msiobj_release( &db->hdr ); return ret; } @@ -977,3 +975,24 @@ UINT WINAPI MsiSummaryInfoPersist( MSIHANDLE handle ) msiobj_release( &si->hdr ); return ret; } + +UINT WINAPI MsiCreateTransformSummaryInfoA( MSIHANDLE db, MSIHANDLE db_ref, LPCSTR transform, int error, int validation ) +{ + UINT r; + WCHAR *transformW = NULL; + + TRACE("%u, %u, %s, %d, %d\n", db, db_ref, debugstr_a(transform), error, validation); + + if (transform && !(transformW = strdupAtoW( transform ))) + return ERROR_OUTOFMEMORY; + + r = MsiCreateTransformSummaryInfoW( db, db_ref, transformW, error, validation ); + msi_free( transformW ); + return r; +} + +UINT WINAPI MsiCreateTransformSummaryInfoW( MSIHANDLE db, MSIHANDLE db_ref, LPCWSTR transform, int error, int validation ) +{ + FIXME("%u, %u, %s, %d, %d\n", db, db_ref, debugstr_w(transform), error, validation); + return ERROR_FUNCTION_FAILED; +} diff --git a/reactos/dll/win32/msi/table.c b/reactos/dll/win32/msi/table.c index 14f4d307ddd..d3c6714717f 100644 --- a/reactos/dll/win32/msi/table.c +++ b/reactos/dll/win32/msi/table.c @@ -52,23 +52,16 @@ typedef struct tagMSICOLUMNHASHENTRY typedef struct tagMSICOLUMNINFO { - LPWSTR tablename; - UINT number; - LPWSTR colname; - UINT type; - UINT offset; - INT ref_count; - BOOL temporary; + LPCWSTR tablename; + UINT number; + LPCWSTR colname; + UINT type; + UINT offset; + INT ref_count; + BOOL temporary; MSICOLUMNHASHENTRY **hash_table; } MSICOLUMNINFO; -typedef struct tagMSIORDERINFO -{ - UINT *reorder; - UINT num_cols; - UINT cols[1]; -} MSIORDERINFO; - struct tagMSITABLE { BYTE **data; @@ -82,18 +75,12 @@ struct tagMSITABLE WCHAR name[1]; }; -static const WCHAR szStringData[] = { - '_','S','t','r','i','n','g','D','a','t','a',0 }; -static const WCHAR szStringPool[] = { - '_','S','t','r','i','n','g','P','o','o','l',0 }; - /* information for default tables */ -static WCHAR szTables[] = { '_','T','a','b','l','e','s',0 }; -static WCHAR szTable[] = { 'T','a','b','l','e',0 }; -static WCHAR szName[] = { 'N','a','m','e',0 }; -static WCHAR szColumns[] = { '_','C','o','l','u','m','n','s',0 }; -static WCHAR szNumber[] = { 'N','u','m','b','e','r',0 }; -static WCHAR szType[] = { 'T','y','p','e',0 }; +static const WCHAR szTables[] = {'_','T','a','b','l','e','s',0}; +static const WCHAR szTable[] = {'T','a','b','l','e',0}; +static const WCHAR szColumns[] = {'_','C','o','l','u','m','n','s',0}; +static const WCHAR szNumber[] = {'N','u','m','b','e','r',0}; +static const WCHAR szType[] = {'T','y','p','e',0}; static const MSICOLUMNINFO _Columns_cols[4] = { { szColumns, 1, szTable, MSITYPE_VALID | MSITYPE_STRING | MSITYPE_KEY | 64, 0, 0, 0, NULL }, @@ -108,14 +95,6 @@ static const MSICOLUMNINFO _Tables_cols[1] = { #define MAX_STREAM_NAME 0x1f -static UINT table_get_column_info( MSIDATABASE *db, LPCWSTR name, - MSICOLUMNINFO **pcols, UINT *pcount ); -static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo, - DWORD count ); -static UINT get_tablecolumns( MSIDATABASE *db, - LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz); -static void msi_free_colinfo( MSICOLUMNINFO *colinfo, UINT count ); - static inline UINT bytes_per_column( MSIDATABASE *db, const MSICOLUMNINFO *col, UINT bytes_per_strref ) { if( MSITYPE_IS_BINARY(col->type) ) @@ -386,6 +365,12 @@ end: return ret; } +static void msi_free_colinfo( MSICOLUMNINFO *colinfo, UINT count ) +{ + UINT i; + for (i = 0; i < count; i++) msi_free( colinfo[i].hash_table ); +} + static void free_table( MSITABLE *table ) { UINT i; @@ -518,6 +503,54 @@ static MSITABLE *find_cached_table( MSIDATABASE *db, LPCWSTR name ) return NULL; } +static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo, DWORD count ) +{ + DWORD i; + + for (i = 0; colinfo && i < count; i++) + { + assert( i + 1 == colinfo[i].number ); + if (i) colinfo[i].offset = colinfo[i - 1].offset + + bytes_per_column( db, &colinfo[i - 1], LONG_STR_BYTES ); + else colinfo[i].offset = 0; + + TRACE("column %d is [%s] with type %08x ofs %d\n", + colinfo[i].number, debugstr_w(colinfo[i].colname), + colinfo[i].type, colinfo[i].offset); + } +} + +static UINT get_defaulttablecolumns( MSIDATABASE *db, LPCWSTR name, MSICOLUMNINFO *colinfo, UINT *sz ) +{ + const MSICOLUMNINFO *p; + DWORD i, n; + + TRACE("%s\n", debugstr_w(name)); + + if (!strcmpW( name, szTables )) + { + p = _Tables_cols; + n = 1; + } + else if (!strcmpW( name, szColumns )) + { + p = _Columns_cols; + n = 4; + } + else return ERROR_FUNCTION_FAILED; + + for (i = 0; i < n; i++) + { + if (colinfo && i < *sz) colinfo[i] = p[i]; + if (colinfo && i >= *sz) break; + } + table_calc_column_offsets( db, colinfo, n ); + *sz = n; + return ERROR_SUCCESS; +} + +static UINT get_tablecolumns( MSIDATABASE *db, LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz ); + static UINT table_get_column_info( MSIDATABASE *db, LPCWSTR name, MSICOLUMNINFO **pcols, UINT *pcount ) { UINT r, column_count = 0; @@ -526,36 +559,168 @@ static UINT table_get_column_info( MSIDATABASE *db, LPCWSTR name, MSICOLUMNINFO /* get the number of columns in this table */ column_count = 0; r = get_tablecolumns( db, name, NULL, &column_count ); - if( r != ERROR_SUCCESS ) + if (r != ERROR_SUCCESS) return r; *pcount = column_count; /* if there's no columns, there's no table */ - if( column_count == 0 ) + if (!column_count) return ERROR_INVALID_PARAMETER; - TRACE("Table %s found\n", debugstr_w(name) ); + TRACE("table %s found\n", debugstr_w(name)); - columns = msi_alloc( column_count*sizeof (MSICOLUMNINFO) ); - if( !columns ) + columns = msi_alloc( column_count * sizeof(MSICOLUMNINFO) ); + if (!columns) return ERROR_FUNCTION_FAILED; r = get_tablecolumns( db, name, columns, &column_count ); - if( r != ERROR_SUCCESS ) + if (r != ERROR_SUCCESS) { msi_free( columns ); return ERROR_FUNCTION_FAILED; } - *pcols = columns; - return r; } -UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info, - MSICONDITION persistent, MSITABLE **table_ret) +static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret ) { + MSITABLE *table; + UINT r; + + /* first, see if the table is cached */ + table = find_cached_table( db, name ); + if (table) + { + *table_ret = table; + return ERROR_SUCCESS; + } + + /* nonexistent tables should be interpreted as empty tables */ + table = msi_alloc( sizeof(MSITABLE) + lstrlenW( name ) * sizeof(WCHAR) ); + if (!table) + return ERROR_FUNCTION_FAILED; + + table->row_count = 0; + table->data = NULL; + table->data_persistent = NULL; + table->colinfo = NULL; + table->col_count = 0; + table->persistent = MSICONDITION_TRUE; + lstrcpyW( table->name, name ); + + if (!strcmpW( name, szTables ) || !strcmpW( name, szColumns )) + table->persistent = MSICONDITION_NONE; + + r = table_get_column_info( db, name, &table->colinfo, &table->col_count ); + if (r != ERROR_SUCCESS) + { + free_table( table ); + return r; + } + r = read_table_from_storage( db, table, db->storage ); + if (r != ERROR_SUCCESS) + { + free_table( table ); + return r; + } + list_add_head( &db->tables, &table->entry ); + *table_ret = table; + return ERROR_SUCCESS; +} + +static UINT read_table_int( BYTE *const *data, UINT row, UINT col, UINT bytes ) +{ + UINT ret = 0, i; + + for (i = 0; i < bytes; i++) + ret += data[row][col + i] << i * 8; + + return ret; +} + +static UINT get_tablecolumns( MSIDATABASE *db, LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz ) +{ + UINT r, i, n = 0, table_id, count, maxcount = *sz; + MSITABLE *table = NULL; + + TRACE("%s\n", debugstr_w(szTableName)); + + /* first check if there is a default table with that name */ + r = get_defaulttablecolumns( db, szTableName, colinfo, sz ); + if (r == ERROR_SUCCESS && *sz) + return r; + + r = get_table( db, szColumns, &table ); + if (r != ERROR_SUCCESS) + { + ERR("couldn't load _Columns table\n"); + return ERROR_FUNCTION_FAILED; + } + + /* convert table and column names to IDs from the string table */ + r = msi_string2idW( db->strings, szTableName, &table_id ); + if (r != ERROR_SUCCESS) + { + WARN("Couldn't find id for %s\n", debugstr_w(szTableName)); + return r; + } + TRACE("Table id is %d, row count is %d\n", table_id, table->row_count); + + /* Note: _Columns table doesn't have non-persistent data */ + + /* if maxcount is non-zero, assume it's exactly right for this table */ + memset( colinfo, 0, maxcount * sizeof(*colinfo) ); + count = table->row_count; + for (i = 0; i < count; i++) + { + if (read_table_int( table->data, i, 0, LONG_STR_BYTES) != table_id) continue; + if (colinfo) + { + UINT id = read_table_int( table->data, i, table->colinfo[2].offset, LONG_STR_BYTES ); + UINT col = read_table_int( table->data, i, table->colinfo[1].offset, sizeof(USHORT) ) - (1 << 15); + + /* check the column number is in range */ + if (col < 1 || col > maxcount) + { + ERR("column %d out of range\n", col); + continue; + } + /* check if this column was already set */ + if (colinfo[col - 1].number) + { + ERR("duplicate column %d\n", col); + continue; + } + colinfo[col - 1].tablename = msi_string_lookup_id( db->strings, table_id ); + colinfo[col - 1].number = col; + colinfo[col - 1].colname = msi_string_lookup_id( db->strings, id ); + colinfo[col - 1].type = read_table_int( table->data, i, table->colinfo[3].offset, + sizeof(USHORT) ) - (1 << 15); + colinfo[col - 1].offset = 0; + colinfo[col - 1].ref_count = 0; + colinfo[col - 1].hash_table = NULL; + } + n++; + } + TRACE("%s has %d columns\n", debugstr_w(szTableName), n); + + if (colinfo && n != maxcount) + { + ERR("missing column in table %s\n", debugstr_w(szTableName)); + msi_free_colinfo( colinfo, maxcount ); + return ERROR_FUNCTION_FAILED; + } + table_calc_column_offsets( db, colinfo, n ); + *sz = n; + return ERROR_SUCCESS; +} + +UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info, + MSICONDITION persistent ) +{ + enum StringPersistence string_persistence = (persistent) ? StringPersistent : StringNonPersistent; UINT r, nField; MSIVIEW *tv = NULL; MSIRECORD *rec = NULL; @@ -595,9 +760,12 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info, for( i = 0, col = col_info; col; i++, col = col->next ) { - table->colinfo[ i ].tablename = strdupW( col->table ); + UINT table_id = msi_addstringW( db->strings, col->table, -1, 1, string_persistence ); + UINT col_id = msi_addstringW( db->strings, col->column, -1, 1, string_persistence ); + + table->colinfo[ i ].tablename = msi_string_lookup_id( db->strings, table_id ); table->colinfo[ i ].number = i + 1; - table->colinfo[ i ].colname = strdupW( col->column ); + table->colinfo[ i ].colname = msi_string_lookup_id( db->strings, col_id ); table->colinfo[ i ].type = col->type; table->colinfo[ i ].offset = 0; table->colinfo[ i ].ref_count = 0; @@ -695,74 +863,13 @@ err: tv->ops->delete( tv ); if (r == ERROR_SUCCESS) - { list_add_head( &db->tables, &table->entry ); - *table_ret = table; - } else free_table( table ); return r; } -static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret ) -{ - MSITABLE *table; - UINT r; - - /* first, see if the table is cached */ - table = find_cached_table( db, name ); - if( table ) - { - *table_ret = table; - return ERROR_SUCCESS; - } - - /* nonexistent tables should be interpreted as empty tables */ - table = msi_alloc( sizeof (MSITABLE) + lstrlenW(name)*sizeof (WCHAR) ); - if( !table ) - return ERROR_FUNCTION_FAILED; - - table->row_count = 0; - table->data = NULL; - table->data_persistent = NULL; - table->colinfo = NULL; - table->col_count = 0; - table->persistent = MSICONDITION_TRUE; - lstrcpyW( table->name, name ); - - if ( !strcmpW( name, szTables ) || !strcmpW( name, szColumns ) ) - table->persistent = MSICONDITION_NONE; - - r = table_get_column_info( db, name, &table->colinfo, &table->col_count); - if (r != ERROR_SUCCESS) - { - free_table ( table ); - return r; - } - - r = read_table_from_storage( db, table, db->storage ); - if( r != ERROR_SUCCESS ) - { - free_table( table ); - return r; - } - - list_add_head( &db->tables, &table->entry ); - *table_ret = table; - return ERROR_SUCCESS; -} - -static UINT read_table_int(BYTE *const *data, UINT row, UINT col, UINT bytes) -{ - UINT ret = 0, i; - - for (i = 0; i < bytes; i++) - ret += data[row][col + i] << i * 8; - - return ret; -} - static UINT save_table( MSIDATABASE *db, const MSITABLE *t, UINT bytes_per_strref ) { BYTE *rawdata = NULL; @@ -838,184 +945,20 @@ err: return r; } -static void table_calc_column_offsets( MSIDATABASE *db, MSICOLUMNINFO *colinfo, DWORD count ) -{ - DWORD i; - - for( i=0; colinfo && (i= *sz) ) - break; - } - table_calc_column_offsets( db, colinfo, n ); - *sz = n; - return ERROR_SUCCESS; -} - -static void msi_free_colinfo( MSICOLUMNINFO *colinfo, UINT count ) -{ - UINT i; - - for( i=0; istrings, stringid )); -} - -static UINT get_tablecolumns( MSIDATABASE *db, - LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz) -{ - UINT r, i, n=0, table_id, count, maxcount = *sz; - MSITABLE *table = NULL; - - TRACE("%s\n", debugstr_w(szTableName)); - - /* first check if there is a default table with that name */ - r = get_defaulttablecolumns( db, szTableName, colinfo, sz ); - if( ( r == ERROR_SUCCESS ) && *sz ) - return r; - - r = get_table( db, szColumns, &table ); - if( r != ERROR_SUCCESS ) - { - ERR("couldn't load _Columns table\n"); - return ERROR_FUNCTION_FAILED; - } - - /* convert table and column names to IDs from the string table */ - r = msi_string2idW( db->strings, szTableName, &table_id ); - if( r != ERROR_SUCCESS ) - { - WARN("Couldn't find id for %s\n", debugstr_w(szTableName)); - return r; - } - - TRACE("Table id is %d, row count is %d\n", table_id, table->row_count); - - /* Note: _Columns table doesn't have non-persistent data */ - - /* if maxcount is non-zero, assume it's exactly right for this table */ - memset( colinfo, 0, maxcount*sizeof(*colinfo) ); - count = table->row_count; - for( i=0; idata, i, 0, LONG_STR_BYTES) != table_id ) - continue; - if( colinfo ) - { - UINT id = read_table_int(table->data, i, table->colinfo[2].offset, LONG_STR_BYTES); - UINT col = read_table_int(table->data, i, table->colinfo[1].offset, sizeof(USHORT)) - (1<<15); - - /* check the column number is in range */ - if (col<1 || col>maxcount) - { - ERR("column %d out of range\n", col); - continue; - } - - /* check if this column was already set */ - if (colinfo[ col - 1 ].number) - { - ERR("duplicate column %d\n", col); - continue; - } - - colinfo[ col - 1 ].tablename = msi_makestring( db, table_id ); - colinfo[ col - 1 ].number = col; - colinfo[ col - 1 ].colname = msi_makestring( db, id ); - colinfo[ col - 1 ].type = read_table_int(table->data, i, - table->colinfo[3].offset, - sizeof(USHORT)) - (1<<15); - colinfo[ col - 1 ].offset = 0; - colinfo[ col - 1 ].ref_count = 0; - colinfo[ col - 1 ].hash_table = NULL; - } - n++; - } - - TRACE("%s has %d columns\n", debugstr_w(szTableName), n); - - if (colinfo && n != maxcount) - { - ERR("missing column in table %s\n", debugstr_w(szTableName)); - msi_free_colinfo(colinfo, maxcount ); - return ERROR_FUNCTION_FAILED; - } - - table_calc_column_offsets( db, colinfo, n ); - *sz = n; - - return ERROR_SUCCESS; -} - static void msi_update_table_columns( MSIDATABASE *db, LPCWSTR name ) { MSITABLE *table; - LPWSTR tablename; UINT size, offset, old_count; UINT n; - /* We may free name in msi_free_colinfo. */ - tablename = strdupW( name ); - - table = find_cached_table( db, tablename ); + table = find_cached_table( db, name ); old_count = table->col_count; msi_free_colinfo( table->colinfo, table->col_count ); msi_free( table->colinfo ); table->colinfo = NULL; - table_get_column_info( db, tablename, &table->colinfo, &table->col_count ); - if (!table->col_count) - goto done; + table_get_column_info( db, name, &table->colinfo, &table->col_count ); + if (!table->col_count) return; size = msi_table_get_row_size( db, table->colinfo, table->col_count, LONG_STR_BYTES ); offset = table->colinfo[table->col_count - 1].offset; @@ -1026,9 +969,6 @@ static void msi_update_table_columns( MSIDATABASE *db, LPCWSTR name ) if (old_count < table->col_count) memset( &table->data[n][offset], 0, size - offset ); } - -done: - msi_free(tablename); } /* try to find the table name in the _Tables table */ @@ -1072,7 +1012,6 @@ typedef struct tagMSITABLEVIEW MSIDATABASE *db; MSITABLE *table; MSICOLUMNINFO *columns; - MSIORDERINFO *order; UINT num_cols; UINT row_size; WCHAR name[1]; @@ -1100,9 +1039,6 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT * return ERROR_FUNCTION_FAILED; } - if (tv->order) - row = tv->order->reorder[row]; - n = bytes_per_column( tv->db, &tv->columns[col - 1], LONG_STR_BYTES ); if (n != 2 && n != 3 && n != 4) { @@ -1226,7 +1162,7 @@ static UINT TABLE_fetch_stream( struct tagMSIVIEW *view, UINT row, UINT col, ISt } encname = encode_streamname( FALSE, full_name ); - r = db_get_raw_stream( tv->db, encname, stm ); + r = msi_get_raw_stream( tv->db, encname, stm ); if( r ) ERR("fetching stream %s, error = %d\n",debugstr_w(full_name), r); @@ -1279,24 +1215,19 @@ static UINT TABLE_get_row( struct tagMSIVIEW *view, UINT row, MSIRECORD **rec ) if (!tv->table) return ERROR_INVALID_PARAMETER; - if (tv->order) - row = tv->order->reorder[row]; - return msi_view_get_row(tv->db, view, row, rec); } static UINT msi_addstreamW( MSIDATABASE *db, LPCWSTR name, IStream *data ) { - UINT r; - MSIQUERY *query = NULL; - MSIRECORD *rec = NULL; - static const WCHAR insert[] = { - 'I','N','S','E','R','T',' ','I','N','T','O',' ', - '`','_','S','t','r','e','a','m','s','`',' ', - '(','`','N','a','m','e','`',',', - '`','D','a','t','a','`',')',' ', - 'V','A','L','U','E','S',' ','(','?',',','?',')',0}; + 'I','N','S','E','R','T',' ','I','N','T','O',' ', + '`','_','S','t','r','e','a','m','s','`',' ', + '(','`','N','a','m','e','`',',','`','D','a','t','a','`',')',' ', + 'V','A','L','U','E','S',' ','(','?',',','?',')',0}; + MSIQUERY *query = NULL; + MSIRECORD *rec; + UINT r; TRACE("%p %s %p\n", db, debugstr_w(name), data); @@ -1321,7 +1252,6 @@ static UINT msi_addstreamW( MSIDATABASE *db, LPCWSTR name, IStream *data ) err: msiobj_release( &query->hdr ); msiobj_release( &rec->hdr ); - return r; } @@ -1551,8 +1481,8 @@ static UINT TABLE_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *col } static UINT TABLE_get_column_info( struct tagMSIVIEW *view, - UINT n, LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name ) + UINT n, LPCWSTR *name, UINT *type, BOOL *temporary, + LPCWSTR *table_name ) { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; @@ -1563,14 +1493,14 @@ static UINT TABLE_get_column_info( struct tagMSIVIEW *view, if( name ) { - *name = strdupW( tv->columns[n-1].colname ); + *name = tv->columns[n-1].colname; if( !*name ) return ERROR_FUNCTION_FAILED; } if( table_name ) { - *table_name = strdupW( tv->columns[n-1].tablename ); + *table_name = tv->columns[n-1].tablename; if( !*table_name ) return ERROR_FUNCTION_FAILED; } @@ -1584,9 +1514,9 @@ static UINT TABLE_get_column_info( struct tagMSIVIEW *view, return ERROR_SUCCESS; } -static UINT msi_table_find_row( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *row ); +static UINT msi_table_find_row( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *row, UINT *column ); -static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec ) +static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *column ) { UINT r, row, i; @@ -1604,7 +1534,10 @@ static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec ) str = MSI_RecordGetString( rec, i+1 ); if (str == NULL || str[0] == 0) + { + if (column) *column = i; return ERROR_INVALID_DATA; + } } else { @@ -1612,12 +1545,15 @@ static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec ) n = MSI_RecordGetInteger( rec, i+1 ); if (n == MSI_NULL_INTEGER) + { + if (column) *column = i; return ERROR_INVALID_DATA; + } } } /* check there's no duplicate keys */ - r = msi_table_find_row( tv, rec, &row ); + r = msi_table_find_row( tv, rec, &row, column ); if (r == ERROR_SUCCESS) return ERROR_FUNCTION_FAILED; @@ -1690,7 +1626,7 @@ static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, TRACE("%p %p %s\n", tv, rec, temporary ? "TRUE" : "FALSE" ); /* check that the key is unique - can we find a matching row? */ - r = table_validate_new( tv, rec ); + r = table_validate_new( tv, rec, NULL ); if( r != ERROR_SUCCESS ) return ERROR_FUNCTION_FAILED; @@ -1765,7 +1701,7 @@ static UINT msi_table_update(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row) if (!tv->table) return ERROR_INVALID_PARAMETER; - r = msi_table_find_row(tv, rec, &new_row); + r = msi_table_find_row(tv, rec, &new_row, NULL); if (r != ERROR_SUCCESS) { ERR("can't find row to modify\n"); @@ -1776,9 +1712,6 @@ static UINT msi_table_update(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row) if (row != new_row + 1) return ERROR_FUNCTION_FAILED; - if(tv->order) - new_row = tv->order->reorder[new_row]; - return TABLE_set_row(view, new_row, rec, (1 << tv->num_cols) - 1); } @@ -1790,7 +1723,7 @@ static UINT msi_table_assign(struct tagMSIVIEW *view, MSIRECORD *rec) if (!tv->table) return ERROR_INVALID_PARAMETER; - r = msi_table_find_row(tv, rec, &row); + r = msi_table_find_row(tv, rec, &row, NULL); if (r == ERROR_SUCCESS) return TABLE_set_row(view, row, rec, (1 << tv->num_cols) - 1); else @@ -1802,7 +1735,7 @@ static UINT modify_delete_row( struct tagMSIVIEW *view, MSIRECORD *rec ) MSITABLEVIEW *tv = (MSITABLEVIEW *)view; UINT row, r; - r = msi_table_find_row(tv, rec, &row); + r = msi_table_find_row(tv, rec, &row, NULL); if (r != ERROR_SUCCESS) return r; @@ -1833,7 +1766,7 @@ static UINT TABLE_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *rec, UINT row) { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; - UINT r; + UINT r, column; TRACE("%p %d %p\n", view, eModifyMode, rec ); @@ -1843,18 +1776,24 @@ static UINT TABLE_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode, r = modify_delete_row( view, rec ); break; case MSIMODIFY_VALIDATE_NEW: - r = table_validate_new( tv, rec ); + r = table_validate_new( tv, rec, &column ); + if (r != ERROR_SUCCESS) + { + tv->view.error = MSIDBERROR_DUPLICATEKEY; + tv->view.error_column = tv->columns[column].colname; + r = ERROR_INVALID_DATA; + } break; case MSIMODIFY_INSERT: - r = table_validate_new( tv, rec ); + r = table_validate_new( tv, rec, NULL ); if (r != ERROR_SUCCESS) break; r = TABLE_insert_row( view, rec, -1, FALSE ); break; case MSIMODIFY_INSERT_TEMPORARY: - r = table_validate_new( tv, rec ); + r = table_validate_new( tv, rec, NULL ); if (r != ERROR_SUCCESS) break; r = TABLE_insert_row( view, rec, -1, TRUE ); @@ -1897,13 +1836,6 @@ static UINT TABLE_delete( struct tagMSIVIEW *view ) tv->table = NULL; tv->columns = NULL; - if (tv->order) - { - msi_free( tv->order->reorder ); - msi_free( tv->order ); - tv->order = NULL; - } - msi_free( tv ); return ERROR_SUCCESS; @@ -2022,7 +1954,7 @@ static UINT TABLE_remove_column(struct tagMSIVIEW *view, LPCWSTR table, UINT num if (r != ERROR_SUCCESS) return r; - r = msi_table_find_row((MSITABLEVIEW *)columns, rec, &row); + r = msi_table_find_row((MSITABLEVIEW *)columns, rec, &row, NULL); if (r != ERROR_SUCCESS) goto done; @@ -2116,161 +2048,6 @@ done: return r; } -static UINT order_add_column(struct tagMSIVIEW *view, MSIORDERINFO *order, LPCWSTR name) -{ - UINT n, r, count; - MSITABLEVIEW *tv = (MSITABLEVIEW*)view; - - r = TABLE_get_dimensions(view, NULL, &count); - if (r != ERROR_SUCCESS) - return r; - - if (order->num_cols >= count) - return ERROR_FUNCTION_FAILED; - - r = VIEW_find_column(view, name, tv->name, &n); - if (r != ERROR_SUCCESS) - return r; - - order->cols[order->num_cols] = n; - TRACE("Ordering by column %s (%d)\n", debugstr_w(name), n); - - order->num_cols++; - - return ERROR_SUCCESS; -} - -static UINT order_compare(struct tagMSIVIEW *view, MSIORDERINFO *order, - UINT a, UINT b, UINT *swap) -{ - UINT r, i, a_val = 0, b_val = 0; - - *swap = 0; - for (i = 0; i < order->num_cols; i++) - { - r = TABLE_fetch_int(view, a, order->cols[i], &a_val); - if (r != ERROR_SUCCESS) - return r; - - r = TABLE_fetch_int(view, b, order->cols[i], &b_val); - if (r != ERROR_SUCCESS) - return r; - - if (a_val != b_val) - { - if (a_val > b_val) - *swap = 1; - break; - } - } - - return ERROR_SUCCESS; -} - -static UINT order_mergesort(struct tagMSIVIEW *view, MSIORDERINFO *order, - UINT left, UINT right) -{ - UINT r, i, j, temp; - UINT swap = 0, center = (left + right) / 2; - UINT *array = order->reorder; - - if (left == right) - return ERROR_SUCCESS; - - /* sort the left half */ - r = order_mergesort(view, order, left, center); - if (r != ERROR_SUCCESS) - return r; - - /* sort the right half */ - r = order_mergesort(view, order, center + 1, right); - if (r != ERROR_SUCCESS) - return r; - - for (i = left, j = center + 1; (i <= center) && (j <= right); i++) - { - r = order_compare(view, order, array[i], array[j], &swap); - if (r != ERROR_SUCCESS) - return r; - - if (swap) - { - temp = array[j]; - memmove(&array[i + 1], &array[i], (j - i) * sizeof(UINT)); - array[i] = temp; - j++; - center++; - } - } - - return ERROR_SUCCESS; -} - -static UINT order_verify(struct tagMSIVIEW *view, MSIORDERINFO *order, UINT num_rows) -{ - UINT i, swap, r; - - for (i = 1; i < num_rows; i++) - { - r = order_compare(view, order, order->reorder[i - 1], - order->reorder[i], &swap); - if (r != ERROR_SUCCESS) - return r; - - if (!swap) - continue; - - ERR("Bad order! %d\n", i); - return ERROR_FUNCTION_FAILED; - } - - return ERROR_SUCCESS; -} - -static UINT TABLE_sort(struct tagMSIVIEW *view, column_info *columns) -{ - MSITABLEVIEW *tv = (MSITABLEVIEW *)view; - MSIORDERINFO *order; - column_info *ptr; - UINT r, i; - UINT rows, cols; - - TRACE("sorting table %s\n", debugstr_w(tv->name)); - - r = TABLE_get_dimensions(view, &rows, &cols); - if (r != ERROR_SUCCESS) - return r; - - if (rows == 0) - return ERROR_SUCCESS; - - order = msi_alloc_zero(sizeof(MSIORDERINFO) + sizeof(UINT) * cols); - if (!order) - return ERROR_OUTOFMEMORY; - - for (ptr = columns; ptr; ptr = ptr->next) - order_add_column(view, order, ptr->column); - - order->reorder = msi_alloc(rows * sizeof(UINT)); - if (!order->reorder) - return ERROR_OUTOFMEMORY; - - for (i = 0; i < rows; i++) - order->reorder[i] = i; - - r = order_mergesort(view, order, 0, rows - 1); - if (r != ERROR_SUCCESS) - return r; - - r = order_verify(view, order, rows); - if (r != ERROR_SUCCESS) - return r; - - tv->order = order; - - return ERROR_SUCCESS; -} - static UINT TABLE_drop(struct tagMSIVIEW *view) { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; @@ -2299,7 +2076,7 @@ static UINT TABLE_drop(struct tagMSIVIEW *view) if (r != ERROR_SUCCESS) return r; - r = msi_table_find_row((MSITABLEVIEW *)tables, rec, &row); + r = msi_table_find_row((MSITABLEVIEW *)tables, rec, &row, NULL); if (r != ERROR_SUCCESS) goto done; @@ -2336,7 +2113,7 @@ static const MSIVIEWOPS table_ops = TABLE_release, TABLE_add_column, TABLE_remove_column, - TABLE_sort, + NULL, TABLE_drop, }; @@ -2665,7 +2442,7 @@ static UINT* msi_record_to_row( const MSITABLEVIEW *tv, MSIRECORD *rec ) return data; } -static UINT msi_row_matches( MSITABLEVIEW *tv, UINT row, const UINT *data ) +static UINT msi_row_matches( MSITABLEVIEW *tv, UINT row, const UINT *data, UINT *column ) { UINT i, r, x, ret = ERROR_FUNCTION_FAILED; @@ -2688,14 +2465,13 @@ static UINT msi_row_matches( MSITABLEVIEW *tv, UINT row, const UINT *data ) ret = ERROR_FUNCTION_FAILED; break; } - + if (column) *column = i; ret = ERROR_SUCCESS; } - return ret; } -static UINT msi_table_find_row( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *row ) +static UINT msi_table_find_row( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *row, UINT *column ) { UINT i, r = ERROR_FUNCTION_FAILED, *data; @@ -2704,7 +2480,7 @@ static UINT msi_table_find_row( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *row ) return r; for( i = 0; i < tv->table->row_count; i++ ) { - r = msi_row_matches( tv, i, data ); + r = msi_row_matches( tv, i, data, column ); if( r == ERROR_SUCCESS ) { *row = i; @@ -2763,7 +2539,6 @@ static UINT msi_table_load_transform( MSIDATABASE *db, IStorage *stg, debugstr_w(name), tv->num_cols, tv->row_size, rawsize ); /* interpret the data */ - r = ERROR_SUCCESS; for( n=0; n < rawsize; ) { mask = rawdata[n] | (rawdata[n+1] << 8); @@ -2849,7 +2624,7 @@ static UINT msi_table_load_transform( MSIDATABASE *db, IStorage *stg, if (TRACE_ON(msidb)) dump_record( rec ); - r = msi_table_find_row( tv, rec, &row ); + r = msi_table_find_row( tv, rec, &row, NULL ); if (r == ERROR_SUCCESS) { if (!mask) diff --git a/reactos/dll/win32/msi/tokenize.c b/reactos/dll/win32/msi/tokenize.c index e17ded88861..c43288848ac 100644 --- a/reactos/dll/win32/msi/tokenize.c +++ b/reactos/dll/win32/msi/tokenize.c @@ -9,7 +9,7 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* -** An tokenizer for SQL +** A tokenizer for SQL ** ** This file contains C code that splits an SQL input string up into ** individual tokens and sends those tokens one-by-one over to the @@ -190,19 +190,19 @@ static const char isIdChar[] = { ** -1 if the token is (or might be) incomplete. Store the token ** type in *tokenType before returning. */ -int sqliteGetToken(const WCHAR *z, int *tokenType){ +int sqliteGetToken(const WCHAR *z, int *tokenType, int *skip){ int i; + + *skip = 0; switch( *z ){ - case ' ': case '\t': case '\n': case '\f': { + case ' ': case '\t': case '\n': case '\f': for(i=1; isspace(z[i]) && z[i] != '\r'; i++){} *tokenType = TK_SPACE; return i; - } - case '-': { + case '-': if( z[1]==0 ) return -1; *tokenType = TK_MINUS; return 1; - } case '(': *tokenType = TK_LP; return 1; @@ -215,7 +215,7 @@ int sqliteGetToken(const WCHAR *z, int *tokenType){ case '=': *tokenType = TK_EQ; return 1; - case '<': { + case '<': if( z[1]=='=' ){ *tokenType = TK_LE; return 2; @@ -226,8 +226,7 @@ int sqliteGetToken(const WCHAR *z, int *tokenType){ *tokenType = TK_LT; return 1; } - } - case '>': { + case '>': if( z[1]=='=' ){ *tokenType = TK_GE; return 2; @@ -235,8 +234,7 @@ int sqliteGetToken(const WCHAR *z, int *tokenType){ *tokenType = TK_GT; return 1; } - } - case '!': { + case '!': if( z[1]!='=' ){ *tokenType = TK_ILLEGAL; return 2; @@ -244,7 +242,6 @@ int sqliteGetToken(const WCHAR *z, int *tokenType){ *tokenType = TK_NE; return 2; } - } case '?': *tokenType = TK_WILDCARD; return 1; @@ -264,32 +261,29 @@ int sqliteGetToken(const WCHAR *z, int *tokenType){ *tokenType = TK_STRING; return i; } - case '.': { + case '.': if( !isdigit(z[1]) ){ *tokenType = TK_DOT; return 1; } /* Fall thru into the next case */ - } case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': { + case '5': case '6': case '7': case '8': case '9': *tokenType = TK_INTEGER; for(i=1; isdigit(z[i]); i++){} return i; - } - case '[': { + case '[': for(i=1; z[i] && z[i-1]!=']'; i++){} *tokenType = TK_ID; return i; - } - default: { + default: if( !isIdChar[*z] ){ break; } for(i=1; isIdChar[z[i]]; i++){} *tokenType = sqliteKeywordCode(z, i); + if( *tokenType == TK_ID && z[i] == '`' ) *skip = 1; return i; - } } *tokenType = TK_ILLEGAL; return 1; diff --git a/reactos/dll/win32/msi/update.c b/reactos/dll/win32/msi/update.c index c80d5a90d6a..d0e3c28f792 100644 --- a/reactos/dll/win32/msi/update.c +++ b/reactos/dll/win32/msi/update.c @@ -154,9 +154,8 @@ static UINT UPDATE_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *co return wv->ops->get_dimensions( wv, rows, cols ); } -static UINT UPDATE_get_column_info( struct tagMSIVIEW *view, - UINT n, LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR* table_name ) +static UINT UPDATE_get_column_info( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, + UINT *type, BOOL *temporary, LPCWSTR *table_name ) { MSIUPDATEVIEW *uv = (MSIUPDATEVIEW*)view; MSIVIEW *wv; @@ -226,32 +225,23 @@ static const MSIVIEWOPS update_ops = NULL, }; -UINT UPDATE_CreateView( MSIDATABASE *db, MSIVIEW **view, LPCWSTR table, +UINT UPDATE_CreateView( MSIDATABASE *db, MSIVIEW **view, LPWSTR table, column_info *columns, struct expr *expr ) { MSIUPDATEVIEW *uv = NULL; UINT r; - MSIVIEW *tv = NULL, *sv = NULL, *wv = NULL; + MSIVIEW *sv = NULL, *wv = NULL; TRACE("%p\n", uv ); - r = TABLE_CreateView( db, table, &tv ); + if (expr) + r = WHERE_CreateView( db, &wv, table, expr ); + else + r = TABLE_CreateView( db, table, &wv ); + if( r != ERROR_SUCCESS ) return r; - if (expr) - { - /* add conditions first */ - r = WHERE_CreateView( db, &wv, tv, expr ); - if( r != ERROR_SUCCESS ) - { - tv->ops->delete( tv ); - return r; - } - } - else - wv = tv; - /* then select the columns we want */ r = SELECT_CreateView( db, &sv, wv, columns ); if( r != ERROR_SUCCESS ) diff --git a/reactos/dll/win32/msi/upgrade.c b/reactos/dll/win32/msi/upgrade.c index b131d666fe2..94806610045 100644 --- a/reactos/dll/win32/msi/upgrade.c +++ b/reactos/dll/win32/msi/upgrade.c @@ -89,7 +89,7 @@ static void append_productcode(MSIPACKAGE* package, LPCWSTR action_property, strcatW(newprop,productid); r = msi_set_property( package->db, action_property, newprop ); - if (r == ERROR_SUCCESS && !strcmpW( action_property, cszSourceDir )) + if (r == ERROR_SUCCESS && !strcmpW( action_property, szSourceDir )) msi_reset_folders( package, TRUE ); TRACE("Found Related Product... %s now %s\n", @@ -123,33 +123,31 @@ static UINT ITERATE_FindRelatedProducts(MSIRECORD *rec, LPVOID param) while (rc == ERROR_SUCCESS) { rc = RegEnumValueW(hkey, index, product, &sz, NULL, NULL, NULL, NULL); - TRACE("Looking at (%i) %s\n",index,debugstr_w(product)); if (rc == ERROR_SUCCESS) { WCHAR productid[GUID_SIZE]; - LPCWSTR ver; - LPCWSTR language; - LPCWSTR action_property; - DWORD check = 0x00000000; - DWORD comp_ver = 0x00000000; - DWORD sz = 0x100; + LPCWSTR ver, language, action_property; + DWORD check = 0, comp_ver, sz = 0x100; HKEY hukey; INT r; + TRACE("Looking at index %u product %s\n", index, debugstr_w(product)); + unsquash_guid(product, productid); - rc = MSIREG_OpenProductKey(productid, NULL, package->Context, - &hukey, FALSE); - if (rc != ERROR_SUCCESS) + if (MSIREG_OpenProductKey(productid, NULL, MSIINSTALLCONTEXT_USERMANAGED, &hukey, FALSE) && + MSIREG_OpenProductKey(productid, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, &hukey, FALSE) && + MSIREG_OpenProductKey(productid, NULL, MSIINSTALLCONTEXT_MACHINE, &hukey, FALSE)) { + TRACE("product key not found\n"); rc = ERROR_SUCCESS; index ++; continue; } sz = sizeof(DWORD); - RegQueryValueExW(hukey, INSTALLPROPERTY_VERSIONW, NULL, NULL, - (LPBYTE)&check, &sz); - /* check min */ + RegQueryValueExW(hukey, INSTALLPROPERTY_VERSIONW, NULL, NULL, (LPBYTE)&check, &sz); + + /* check version minimum */ ver = MSI_RecordGetString(rec,2); if (ver) { @@ -157,13 +155,14 @@ static UINT ITERATE_FindRelatedProducts(MSIRECORD *rec, LPVOID param) r = check - comp_ver; if (r < 0 || (r == 0 && !(attributes & msidbUpgradeAttributesVersionMinInclusive))) { + TRACE("version below minimum\n"); RegCloseKey(hukey); index ++; continue; } } - /* check max */ + /* check version maximum */ ver = MSI_RecordGetString(rec,3); if (ver) { @@ -175,26 +174,26 @@ static UINT ITERATE_FindRelatedProducts(MSIRECORD *rec, LPVOID param) index ++; continue; } + TRACE("version above maximum\n"); } - /* check language*/ + /* check language */ sz = sizeof(DWORD); - RegQueryValueExW(hukey, INSTALLPROPERTY_LANGUAGEW, NULL, NULL, - (LPBYTE)&check, &sz); + RegQueryValueExW(hukey, INSTALLPROPERTY_LANGUAGEW, NULL, NULL, (LPBYTE)&check, &sz); RegCloseKey(hukey); language = MSI_RecordGetString(rec,4); - TRACE("Checking languages %x and %s\n", check, - debugstr_w(language)); if (!check_language(check, language, attributes)) { index ++; + TRACE("language doesn't match\n"); continue; } + TRACE("found related product\n"); action_property = MSI_RecordGetString(rec, 7); append_productcode(package, action_property, productid); MSI_RecordSetStringW(uirow, 1, productid); - ui_actiondata(package, szFindRelatedProducts, uirow); + msi_ui_actiondata(package, szFindRelatedProducts, uirow); } index ++; } @@ -206,32 +205,30 @@ static UINT ITERATE_FindRelatedProducts(MSIRECORD *rec, LPVOID param) UINT ACTION_FindRelatedProducts(MSIPACKAGE *package) { - static const WCHAR Query[] = - {'S','E','L','E','C','T',' ','*',' ','F','R','O','M', - ' ','`','U','p','g','r','a','d','e','`',0}; - UINT rc = ERROR_SUCCESS; + static const WCHAR query[] = { + 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ', + '`','U','p','g','r','a','d','e','`',0}; MSIQUERY *view; + UINT rc; if (msi_get_property_int(package->db, szInstalled, 0)) { TRACE("Skipping FindRelatedProducts action: product already installed\n"); return ERROR_SUCCESS; } - - if (check_unique_action(package, szFindRelatedProducts)) + if (msi_action_is_unique(package, szFindRelatedProducts)) { TRACE("Skipping FindRelatedProducts action: already done in UI sequence\n"); return ERROR_SUCCESS; } else - register_unique_action(package, szFindRelatedProducts); + msi_register_unique_action(package, szFindRelatedProducts); - rc = MSI_DatabaseOpenViewW(package->db, Query, &view); + rc = MSI_DatabaseOpenViewW(package->db, query, &view); if (rc != ERROR_SUCCESS) return ERROR_SUCCESS; rc = MSI_IterateRecords(view, NULL, ITERATE_FindRelatedProducts, package); msiobj_release(&view->hdr); - return rc; } diff --git a/reactos/dll/win32/msi/where.c b/reactos/dll/win32/msi/where.c index 35a6074a650..36c8ec83e01 100644 --- a/reactos/dll/win32/msi/where.c +++ b/reactos/dll/win32/msi/where.c @@ -2,6 +2,7 @@ * Implementation of the Microsoft Installer (msi.dll) * * Copyright 2002 Mike McCormack for CodeWeavers + * Copyright 2011 Bernhard Loos * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,6 +20,7 @@ */ #include +#include #include "windef.h" #include "winbase.h" @@ -36,269 +38,499 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb); -#define MSI_HASH_TABLE_SIZE 37 - -typedef struct tagMSIHASHENTRY -{ - struct tagMSIHASHENTRY *next; - UINT value; - UINT row; -} MSIHASHENTRY; - /* below is the query interface to a table */ +typedef struct tagMSIROWENTRY +{ + struct tagMSIWHEREVIEW *wv; /* used during sorting */ + UINT values[1]; +} MSIROWENTRY; + +typedef struct tagJOINTABLE +{ + struct tagJOINTABLE *next; + MSIVIEW *view; + UINT col_count; + UINT row_count; + UINT table_index; +} JOINTABLE; + +typedef struct tagMSIORDERINFO +{ + UINT col_count; + UINT error; + union ext_column columns[1]; +} MSIORDERINFO; typedef struct tagMSIWHEREVIEW { MSIVIEW view; MSIDATABASE *db; - MSIVIEW *table; + JOINTABLE *tables; UINT row_count; - MSIHASHENTRY **reorder; + UINT col_count; + UINT table_count; + MSIROWENTRY **reorder; + UINT reorder_size; /* number of entries available in reorder */ struct expr *cond; UINT rec_index; + MSIORDERINFO *order_info; } MSIWHEREVIEW; -static void free_hash_table(MSIHASHENTRY **table) -{ - MSIHASHENTRY *new, *old; - int i; +static UINT WHERE_evaluate( MSIWHEREVIEW *wv, const UINT rows[], + struct expr *cond, INT *val, MSIRECORD *record ); - if (!table) +#define INITIAL_REORDER_SIZE 16 + +#define INVALID_ROW_INDEX (-1) + +static void free_reorder(MSIWHEREVIEW *wv) +{ + UINT i; + + if (!wv->reorder) return; - for (i = 0; i < MSI_HASH_TABLE_SIZE; i++) - { - new = table[i]; + for (i = 0; i < wv->row_count; i++) + msi_free(wv->reorder[i]); - while (new) - { - old = new; - new = old->next; - msi_free(old); - } - - table[i] = NULL; - } - - msi_free(table); + msi_free( wv->reorder ); + wv->reorder = NULL; + wv->reorder_size = 0; + wv->row_count = 0; } -static UINT find_entry_in_hash(MSIHASHENTRY **table, UINT row, UINT *val) +static UINT init_reorder(MSIWHEREVIEW *wv) { - MSIHASHENTRY *entry; + MSIROWENTRY **new = msi_alloc_zero(sizeof(MSIROWENTRY *) * INITIAL_REORDER_SIZE); + if (!new) + return ERROR_OUTOFMEMORY; - if (!table) - return ERROR_SUCCESS; + free_reorder(wv); - if (!(entry = table[row % MSI_HASH_TABLE_SIZE])) - { - WARN("Row not found in hash table!\n"); - return ERROR_FUNCTION_FAILED; - } + wv->reorder = new; + wv->reorder_size = INITIAL_REORDER_SIZE; - while (entry && entry->row != row) - entry = entry->next; - - if (entry) *val = entry->value; return ERROR_SUCCESS; } -static UINT add_entry_to_hash(MSIHASHENTRY **table, UINT row, UINT val) +static inline UINT find_row(MSIWHEREVIEW *wv, UINT row, UINT *(values[])) { - MSIHASHENTRY *new = msi_alloc(sizeof(MSIHASHENTRY)); - MSIHASHENTRY *prev; + if (row >= wv->row_count) + return ERROR_NO_MORE_ITEMS; + + *values = wv->reorder[row]->values; + + return ERROR_SUCCESS; +} + +static UINT add_row(MSIWHEREVIEW *wv, UINT vals[]) +{ + MSIROWENTRY *new; + + if (wv->reorder_size <= wv->row_count) + { + MSIROWENTRY **new_reorder; + UINT newsize = wv->reorder_size * 2; + + new_reorder = msi_realloc_zero(wv->reorder, sizeof(MSIROWENTRY *) * newsize); + if (!new_reorder) + return ERROR_OUTOFMEMORY; + + wv->reorder = new_reorder; + wv->reorder_size = newsize; + } + + new = msi_alloc(FIELD_OFFSET( MSIROWENTRY, values[wv->table_count] )); if (!new) return ERROR_OUTOFMEMORY; - new->next = NULL; - new->value = val; - new->row = row; + wv->reorder[wv->row_count++] = new; - prev = table[row % MSI_HASH_TABLE_SIZE]; - if (prev) - new->next = prev; - - table[row % MSI_HASH_TABLE_SIZE] = new; + memcpy(new->values, vals, wv->table_count * sizeof(UINT)); + new->wv = wv; return ERROR_SUCCESS; } +static JOINTABLE *find_table(MSIWHEREVIEW *wv, UINT col, UINT *table_col) +{ + JOINTABLE *table = wv->tables; + + if(col == 0 || col > wv->col_count) + return NULL; + + while (col > table->col_count) + { + col -= table->col_count; + table = table->next; + assert(table); + } + + *table_col = col; + return table; +} + +static UINT parse_column(MSIWHEREVIEW *wv, union ext_column *column, + UINT *column_type) +{ + JOINTABLE *table = wv->tables; + UINT i, r; + + do + { + LPCWSTR table_name; + + if (column->unparsed.table) + { + r = table->view->ops->get_column_info(table->view, 1, NULL, NULL, + NULL, &table_name); + if (r != ERROR_SUCCESS) + return r; + if (strcmpW(table_name, column->unparsed.table) != 0) + continue; + } + + for(i = 1; i <= table->col_count; i++) + { + LPCWSTR col_name; + + r = table->view->ops->get_column_info(table->view, i, &col_name, column_type, + NULL, NULL); + if(r != ERROR_SUCCESS ) + return r; + + if(strcmpW(col_name, column->unparsed.column)) + continue; + column->parsed.column = i; + column->parsed.table = table; + return ERROR_SUCCESS; + } + } + while ((table = table->next)); + + WARN("Couldn't find column %s.%s\n", debugstr_w( column->unparsed.table ), debugstr_w( column->unparsed.column ) ); + return ERROR_BAD_QUERY_SYNTAX; +} + static UINT WHERE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT *val ) { MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view; + JOINTABLE *table; + UINT *rows; UINT r; TRACE("%p %d %d %p\n", wv, row, col, val ); - if( !wv->table ) + if( !wv->tables ) return ERROR_FUNCTION_FAILED; - if( row > wv->row_count ) - return ERROR_NO_MORE_ITEMS; - - r = find_entry_in_hash(wv->reorder, row, &row); + r = find_row(wv, row, &rows); if (r != ERROR_SUCCESS) return r; - return wv->table->ops->fetch_int( wv->table, row, col, val ); + table = find_table(wv, col, &col); + if (!table) + return ERROR_FUNCTION_FAILED; + + return table->view->ops->fetch_int(table->view, rows[table->table_index], col, val); } static UINT WHERE_fetch_stream( struct tagMSIVIEW *view, UINT row, UINT col, IStream **stm ) { MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view; + JOINTABLE *table; + UINT *rows; UINT r; TRACE("%p %d %d %p\n", wv, row, col, stm ); - if( !wv->table ) + if( !wv->tables ) return ERROR_FUNCTION_FAILED; - if( row > wv->row_count ) - return ERROR_NO_MORE_ITEMS; - - r = find_entry_in_hash(wv->reorder, row, &row); + r = find_row(wv, row, &rows); if (r != ERROR_SUCCESS) return r; - return wv->table->ops->fetch_stream( wv->table, row, col, stm ); + table = find_table(wv, col, &col); + if (!table) + return ERROR_FUNCTION_FAILED; + + return table->view->ops->fetch_stream( table->view, rows[table->table_index], col, stm ); } static UINT WHERE_get_row( struct tagMSIVIEW *view, UINT row, MSIRECORD **rec ) { MSIWHEREVIEW *wv = (MSIWHEREVIEW *)view; - UINT r; TRACE("%p %d %p\n", wv, row, rec ); - if (!wv->table) + if (!wv->tables) return ERROR_FUNCTION_FAILED; - if (row > wv->row_count) - return ERROR_NO_MORE_ITEMS; - - r = find_entry_in_hash(wv->reorder, row, &row); - if (r != ERROR_SUCCESS) - return r; - - return wv->table->ops->get_row(wv->table, row, rec); + return msi_view_get_row( wv->db, view, row, rec ); } static UINT WHERE_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UINT mask ) { MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view; - UINT r; + UINT i, r, offset = 0; + JOINTABLE *table = wv->tables; + UINT *rows; + UINT mask_copy = mask; TRACE("%p %d %p %08x\n", wv, row, rec, mask ); - if( !wv->table ) + if( !wv->tables ) return ERROR_FUNCTION_FAILED; - if( row > wv->row_count ) - return ERROR_NO_MORE_ITEMS; - - r = find_entry_in_hash(wv->reorder, row, &row); + r = find_row(wv, row, &rows); if (r != ERROR_SUCCESS) return r; - return wv->table->ops->set_row( wv->table, row, rec, mask ); + if (mask >= 1 << wv->col_count) + return ERROR_INVALID_PARAMETER; + + do + { + for (i = 0; i < table->col_count; i++) { + UINT type; + + if (!(mask_copy & (1 << i))) + continue; + r = table->view->ops->get_column_info(table->view, i + 1, NULL, + &type, NULL, NULL ); + if (r != ERROR_SUCCESS) + return r; + if (type & MSITYPE_KEY) + return ERROR_FUNCTION_FAILED; + } + mask_copy >>= table->col_count; + } + while (mask_copy && (table = table->next)); + + table = wv->tables; + + do + { + const UINT col_count = table->col_count; + UINT i; + MSIRECORD *reduced; + UINT reduced_mask = (mask >> offset) & ((1 << col_count) - 1); + + if (!reduced_mask) + { + offset += col_count; + continue; + } + + reduced = MSI_CreateRecord(col_count); + if (!reduced) + return ERROR_FUNCTION_FAILED; + + for (i = 1; i <= col_count; i++) + { + r = MSI_RecordCopyField(rec, i + offset, reduced, i); + if (r != ERROR_SUCCESS) + break; + } + + offset += col_count; + + if (r == ERROR_SUCCESS) + r = table->view->ops->set_row(table->view, rows[table->table_index], reduced, reduced_mask); + + msiobj_release(&reduced->hdr); + } + while ((table = table->next)); + return r; } static UINT WHERE_delete_row(struct tagMSIVIEW *view, UINT row) { MSIWHEREVIEW *wv = (MSIWHEREVIEW *)view; UINT r; + UINT *rows; TRACE("(%p %d)\n", view, row); - if ( !wv->table ) + if (!wv->tables) return ERROR_FUNCTION_FAILED; - if ( row > wv->row_count ) - return ERROR_NO_MORE_ITEMS; - - r = find_entry_in_hash( wv->reorder, row, &row ); + r = find_row(wv, row, &rows); if ( r != ERROR_SUCCESS ) return r; - return wv->table->ops->delete_row( wv->table, row ); + if (wv->table_count > 1) + return ERROR_CALL_NOT_IMPLEMENTED; + + return wv->tables->view->ops->delete_row(wv->tables->view, rows[0]); } -static INT INT_evaluate_binary( INT lval, UINT op, INT rval ) +static INT INT_evaluate_binary( MSIWHEREVIEW *wv, const UINT rows[], + const struct complex_expr *expr, INT *val, MSIRECORD *record ) { - switch( op ) + UINT rl, rr; + INT lval, rval; + + rl = WHERE_evaluate(wv, rows, expr->left, &lval, record); + if (rl != ERROR_SUCCESS && rl != ERROR_CONTINUE) + return rl; + rr = WHERE_evaluate(wv, rows, expr->right, &rval, record); + if (rr != ERROR_SUCCESS && rr != ERROR_CONTINUE) + return rr; + + if (rl == ERROR_CONTINUE || rr == ERROR_CONTINUE) + { + if (rl == rr) + { + *val = TRUE; + return ERROR_CONTINUE; + } + + if (expr->op == OP_AND) + { + if ((rl == ERROR_CONTINUE && !rval) || (rr == ERROR_CONTINUE && !lval)) + { + *val = FALSE; + return ERROR_SUCCESS; + } + } + else if (expr->op == OP_OR) + { + if ((rl == ERROR_CONTINUE && rval) || (rr == ERROR_CONTINUE && lval)) + { + *val = TRUE; + return ERROR_SUCCESS; + } + } + + *val = TRUE; + return ERROR_CONTINUE; + } + + switch( expr->op ) { case OP_EQ: - return ( lval == rval ); + *val = ( lval == rval ); + break; case OP_AND: - return ( lval && rval ); + *val = ( lval && rval ); + break; case OP_OR: - return ( lval || rval ); + *val = ( lval || rval ); + break; case OP_GT: - return ( lval > rval ); + *val = ( lval > rval ); + break; case OP_LT: - return ( lval < rval ); + *val = ( lval < rval ); + break; case OP_LE: - return ( lval <= rval ); + *val = ( lval <= rval ); + break; case OP_GE: - return ( lval >= rval ); + *val = ( lval >= rval ); + break; case OP_NE: - return ( lval != rval ); + *val = ( lval != rval ); + break; default: - ERR("Unknown operator %d\n", op ); + ERR("Unknown operator %d\n", expr->op ); + return ERROR_FUNCTION_FAILED; } - return 0; + + return ERROR_SUCCESS; } -static INT INT_evaluate_unary( INT lval, UINT op ) +static inline UINT expr_fetch_value(const union ext_column *expr, const UINT rows[], UINT *val) { - switch( op ) + JOINTABLE *table = expr->parsed.table; + + if( rows[table->table_index] == INVALID_ROW_INDEX ) + { + *val = 1; + return ERROR_CONTINUE; + } + return table->view->ops->fetch_int(table->view, rows[table->table_index], + expr->parsed.column, val); +} + + +static UINT INT_evaluate_unary( MSIWHEREVIEW *wv, const UINT rows[], + const struct complex_expr *expr, INT *val, MSIRECORD *record ) +{ + UINT r; + UINT lval; + + r = expr_fetch_value(&expr->left->u.column, rows, &lval); + if(r != ERROR_SUCCESS) + return r; + + switch( expr->op ) { case OP_ISNULL: - return ( !lval ); + *val = !lval; + break; case OP_NOTNULL: - return ( lval ); + *val = lval; + break; default: - ERR("Unknown operator %d\n", op ); + ERR("Unknown operator %d\n", expr->op ); + return ERROR_FUNCTION_FAILED; } - return 0; + return ERROR_SUCCESS; } -static const WCHAR *STRING_evaluate( MSIWHEREVIEW *wv, UINT row, +static UINT STRING_evaluate( MSIWHEREVIEW *wv, const UINT rows[], const struct expr *expr, - const MSIRECORD *record ) + const MSIRECORD *record, + const WCHAR **str ) { - UINT val = 0, r; + UINT val = 0, r = ERROR_SUCCESS; switch( expr->type ) { case EXPR_COL_NUMBER_STRING: - r = wv->table->ops->fetch_int( wv->table, row, expr->u.col_number, &val ); - if( r != ERROR_SUCCESS ) - return NULL; - return msi_string_lookup_id( wv->db->strings, val ); + r = expr_fetch_value(&expr->u.column, rows, &val); + if (r == ERROR_SUCCESS) + *str = msi_string_lookup_id(wv->db->strings, val); + else + *str = NULL; + break; case EXPR_SVAL: - return expr->u.sval; + *str = expr->u.sval; + break; case EXPR_WILDCARD: - return MSI_RecordGetString( record, ++wv->rec_index ); + *str = MSI_RecordGetString(record, ++wv->rec_index); + break; default: ERR("Invalid expression type\n"); + r = ERROR_FUNCTION_FAILED; + *str = NULL; break; } - return NULL; + return r; } -static UINT STRCMP_Evaluate( MSIWHEREVIEW *wv, UINT row, const struct expr *cond, +static UINT STRCMP_Evaluate( MSIWHEREVIEW *wv, const UINT rows[], const struct complex_expr *expr, INT *val, const MSIRECORD *record ) { int sr; const WCHAR *l_str, *r_str; + UINT r; + + *val = TRUE; + r = STRING_evaluate(wv, rows, expr->left, record, &l_str); + if (r == ERROR_CONTINUE) + return r; + r = STRING_evaluate(wv, rows, expr->right, record, &r_str); + if (r == ERROR_CONTINUE) + return r; - l_str = STRING_evaluate( wv, row, cond->u.expr.left, record ); - r_str = STRING_evaluate( wv, row, cond->u.expr.right, record ); if( l_str == r_str || ((!l_str || !*l_str) && (!r_str || !*r_str)) ) sr = 0; @@ -309,32 +541,34 @@ static UINT STRCMP_Evaluate( MSIWHEREVIEW *wv, UINT row, const struct expr *cond else sr = strcmpW( l_str, r_str ); - *val = ( cond->u.expr.op == OP_EQ && ( sr == 0 ) ) || - ( cond->u.expr.op == OP_NE && ( sr != 0 ) ); + *val = ( expr->op == OP_EQ && ( sr == 0 ) ) || + ( expr->op == OP_NE && ( sr != 0 ) ); return ERROR_SUCCESS; } -static UINT WHERE_evaluate( MSIWHEREVIEW *wv, UINT row, +static UINT WHERE_evaluate( MSIWHEREVIEW *wv, const UINT rows[], struct expr *cond, INT *val, MSIRECORD *record ) { UINT r, tval; - INT lval, rval; if( !cond ) + { + *val = TRUE; return ERROR_SUCCESS; + } switch( cond->type ) { case EXPR_COL_NUMBER: - r = wv->table->ops->fetch_int( wv->table, row, cond->u.col_number, &tval ); + r = expr_fetch_value(&cond->u.column, rows, &tval); if( r != ERROR_SUCCESS ) return r; *val = tval - 0x8000; return ERROR_SUCCESS; case EXPR_COL_NUMBER32: - r = wv->table->ops->fetch_int( wv->table, row, cond->u.col_number, &tval ); + r = expr_fetch_value(&cond->u.column, rows, &tval); if( r != ERROR_SUCCESS ) return r; *val = tval - 0x80000000; @@ -345,24 +579,13 @@ static UINT WHERE_evaluate( MSIWHEREVIEW *wv, UINT row, return ERROR_SUCCESS; case EXPR_COMPLEX: - r = WHERE_evaluate( wv, row, cond->u.expr.left, &lval, record ); - if( r != ERROR_SUCCESS ) - return r; - r = WHERE_evaluate( wv, row, cond->u.expr.right, &rval, record ); - if( r != ERROR_SUCCESS ) - return r; - *val = INT_evaluate_binary( lval, cond->u.expr.op, rval ); - return ERROR_SUCCESS; + return INT_evaluate_binary(wv, rows, &cond->u.expr, val, record); case EXPR_UNARY: - r = wv->table->ops->fetch_int( wv->table, row, cond->u.expr.left->u.col_number, &tval ); - if( r != ERROR_SUCCESS ) - return r; - *val = INT_evaluate_unary( tval, cond->u.expr.op ); - return ERROR_SUCCESS; + return INT_evaluate_unary( wv, rows, &cond->u.expr, val, record ); case EXPR_STRCMP: - return STRCMP_Evaluate( wv, row, cond, val, record ); + return STRCMP_Evaluate( wv, rows, &cond->u.expr, val, record ); case EXPR_WILDCARD: *val = MSI_RecordGetInteger( record, ++wv->rec_index ); @@ -376,105 +599,241 @@ static UINT WHERE_evaluate( MSIWHEREVIEW *wv, UINT row, return ERROR_SUCCESS; } +static UINT check_condition( MSIWHEREVIEW *wv, MSIRECORD *record, JOINTABLE **tables, + UINT table_rows[] ) +{ + UINT r = ERROR_FUNCTION_FAILED; + INT val; + + for (table_rows[(*tables)->table_index] = 0; + table_rows[(*tables)->table_index] < (*tables)->row_count; + table_rows[(*tables)->table_index]++) + { + val = 0; + wv->rec_index = 0; + r = WHERE_evaluate( wv, table_rows, wv->cond, &val, record ); + if (r != ERROR_SUCCESS && r != ERROR_CONTINUE) + break; + if (val) + { + if (*(tables + 1)) + { + r = check_condition(wv, record, tables + 1, table_rows); + if (r != ERROR_SUCCESS) + break; + } + else + { + if (r != ERROR_SUCCESS) + break; + add_row (wv, table_rows); + } + } + } + table_rows[(*tables)->table_index] = INVALID_ROW_INDEX; + return r; +} + +static int compare_entry( const void *left, const void *right ) +{ + const MSIROWENTRY *le = *(const MSIROWENTRY**)left; + const MSIROWENTRY *re = *(const MSIROWENTRY**)right; + const MSIWHEREVIEW *wv = le->wv; + MSIORDERINFO *order = wv->order_info; + UINT i, j, r, l_val, r_val; + + assert(le->wv == re->wv); + + if (order) + { + for (i = 0; i < order->col_count; i++) + { + const union ext_column *column = &order->columns[i]; + + r = column->parsed.table->view->ops->fetch_int(column->parsed.table->view, + le->values[column->parsed.table->table_index], + column->parsed.column, &l_val); + if (r != ERROR_SUCCESS) + { + order->error = r; + return 0; + } + + r = column->parsed.table->view->ops->fetch_int(column->parsed.table->view, + re->values[column->parsed.table->table_index], + column->parsed.column, &r_val); + if (r != ERROR_SUCCESS) + { + order->error = r; + return 0; + } + + if (l_val != r_val) + return l_val < r_val ? -1 : 1; + } + } + + for (j = 0; j < wv->table_count; j++) + { + if (le->values[j] != re->values[j]) + return le->values[j] < re->values[j] ? -1 : 1; + } + return 0; +} + +static void add_to_array( JOINTABLE **array, JOINTABLE *elem ) +{ + while (*array && *array != elem) + array++; + if (!*array) + *array = elem; +} + +static BOOL in_array( JOINTABLE **array, JOINTABLE *elem ) +{ + while (*array && *array != elem) + array++; + return *array != NULL; +} + +#define CONST_EXPR 1 /* comparison to a constant value */ +#define JOIN_TO_CONST_EXPR 0x10000 /* comparison to a table involved with + a CONST_EXPR comaprison */ + +static UINT reorder_check( const struct expr *expr, JOINTABLE **ordered_tables, + BOOL process_joins, JOINTABLE **lastused ) +{ + UINT res = 0; + + switch (expr->type) + { + case EXPR_WILDCARD: + case EXPR_SVAL: + case EXPR_UVAL: + return 0; + case EXPR_COL_NUMBER: + case EXPR_COL_NUMBER32: + case EXPR_COL_NUMBER_STRING: + if (in_array(ordered_tables, expr->u.column.parsed.table)) + return JOIN_TO_CONST_EXPR; + *lastused = expr->u.column.parsed.table; + return CONST_EXPR; + case EXPR_STRCMP: + case EXPR_COMPLEX: + res = reorder_check(expr->u.expr.right, ordered_tables, process_joins, lastused); + /* fall through */ + case EXPR_UNARY: + res += reorder_check(expr->u.expr.left, ordered_tables, process_joins, lastused); + if (res == 0) + return 0; + if (res == CONST_EXPR) + add_to_array(ordered_tables, *lastused); + if (process_joins && res == JOIN_TO_CONST_EXPR + CONST_EXPR) + add_to_array(ordered_tables, *lastused); + return res; + default: + ERR("Unknown expr type: %i\n", expr->type); + assert(0); + return 0x1000000; + } +} + +/* reorders the tablelist in a way to evaluate the condition as fast as possible */ +static JOINTABLE **ordertables( MSIWHEREVIEW *wv ) +{ + JOINTABLE *table; + JOINTABLE **tables; + + tables = msi_alloc_zero( (wv->table_count + 1) * sizeof(*tables) ); + + if (wv->cond) + { + table = NULL; + reorder_check(wv->cond, tables, FALSE, &table); + table = NULL; + reorder_check(wv->cond, tables, TRUE, &table); + } + + table = wv->tables; + while (table) + { + add_to_array(tables, table); + table = table->next; + } + return tables; +} + static UINT WHERE_execute( struct tagMSIVIEW *view, MSIRECORD *record ) { MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view; - UINT count = 0, r, i; - INT val; - MSIVIEW *table = wv->table; + UINT r; + JOINTABLE *table = wv->tables; + UINT *rows; + JOINTABLE **ordered_tables; + int i = 0; TRACE("%p %p\n", wv, record); if( !table ) return ERROR_FUNCTION_FAILED; - r = table->ops->execute( table, record ); - if( r != ERROR_SUCCESS ) + r = init_reorder(wv); + if (r != ERROR_SUCCESS) return r; - r = table->ops->get_dimensions( table, &count, NULL ); - if( r != ERROR_SUCCESS ) - return r; - - free_hash_table(wv->reorder); - wv->reorder = msi_alloc_zero(MSI_HASH_TABLE_SIZE * sizeof(MSIHASHENTRY *)); - if( !wv->reorder ) - return ERROR_OUTOFMEMORY; - - wv->row_count = 0; - -if (0) /* disable optimization, there's no guarantee that strings are in the string table */ -{ - if (wv->cond->type == EXPR_STRCMP) + do { - MSIITERHANDLE handle = NULL; - UINT row, value, col; - struct expr *col_cond = wv->cond->u.expr.left; - struct expr *val_cond = wv->cond->u.expr.right; + table->view->ops->execute(table->view, NULL); - /* swap conditionals */ - if (col_cond->type != EXPR_COL_NUMBER_STRING) + r = table->view->ops->get_dimensions(table->view, &table->row_count, NULL); + if (r != ERROR_SUCCESS) { - val_cond = wv->cond->u.expr.left; - col_cond = wv->cond->u.expr.right; - } - - if ((col_cond->type == EXPR_COL_NUMBER_STRING) && (val_cond->type == EXPR_SVAL)) - { - col = col_cond->u.col_number; - /* special case for "" - translate it into nil */ - if (!val_cond->u.sval[0]) - value = 0; - else - { - r = msi_string2idW(wv->db->strings, val_cond->u.sval, &value); - if (r != ERROR_SUCCESS) - { - TRACE("no id for %s, assuming it doesn't exist in the table\n", debugstr_w(wv->cond->u.expr.right->u.sval)); - return ERROR_SUCCESS; - } - } - - do - { - r = table->ops->find_matching_rows(table, col, value, &row, &handle); - if (r == ERROR_SUCCESS) - add_entry_to_hash(wv->reorder, wv->row_count++, row); - } while (r == ERROR_SUCCESS); - - if (r == ERROR_NO_MORE_ITEMS) - return ERROR_SUCCESS; - else - return r; - } - /* else fallback to slow case */ - } -} - - for( i=0; irec_index = 0; - r = WHERE_evaluate( wv, i, wv->cond, &val, record ); - if( r != ERROR_SUCCESS ) + ERR("failed to get table dimensions\n"); return r; - if( val ) - add_entry_to_hash( wv->reorder, wv->row_count++, i ); - } + } - return ERROR_SUCCESS; + /* each table must have at least one row */ + if (table->row_count == 0) + return ERROR_SUCCESS; + } + while ((table = table->next)); + + ordered_tables = ordertables( wv ); + + rows = msi_alloc( wv->table_count * sizeof(*rows) ); + for (i = 0; i < wv->table_count; i++) + rows[i] = INVALID_ROW_INDEX; + + r = check_condition(wv, record, ordered_tables, rows); + + if (wv->order_info) + wv->order_info->error = ERROR_SUCCESS; + + qsort(wv->reorder, wv->row_count, sizeof(MSIROWENTRY *), compare_entry); + + if (wv->order_info) + r = wv->order_info->error; + + msi_free( rows ); + msi_free( ordered_tables ); + return r; } static UINT WHERE_close( struct tagMSIVIEW *view ) { MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view; + JOINTABLE *table = wv->tables; TRACE("%p\n", wv ); - if( !wv->table ) + if (!table) return ERROR_FUNCTION_FAILED; - return wv->table->ops->close( wv->table ); + do + table->view->ops->close(table->view); + while ((table = table->next)); + + return ERROR_SUCCESS; } static UINT WHERE_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *cols ) @@ -483,60 +842,172 @@ static UINT WHERE_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *col TRACE("%p %p %p\n", wv, rows, cols ); - if( !wv->table ) + if(!wv->tables) return ERROR_FUNCTION_FAILED; - if( rows ) + if (rows) { - if( !wv->reorder ) + if (!wv->reorder) return ERROR_FUNCTION_FAILED; *rows = wv->row_count; } - return wv->table->ops->get_dimensions( wv->table, NULL, cols ); + if (cols) + *cols = wv->col_count; + + return ERROR_SUCCESS; } -static UINT WHERE_get_column_info( struct tagMSIVIEW *view, - UINT n, LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name) +static UINT WHERE_get_column_info( struct tagMSIVIEW *view, UINT n, LPCWSTR *name, + UINT *type, BOOL *temporary, LPCWSTR *table_name ) { MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view; + JOINTABLE *table; TRACE("%p %d %p %p %p %p\n", wv, n, name, type, temporary, table_name ); - if( !wv->table ) + if(!wv->tables) return ERROR_FUNCTION_FAILED; - return wv->table->ops->get_column_info( wv->table, n, name, - type, temporary, table_name ); + table = find_table(wv, n, &n); + if (!table) + return ERROR_FUNCTION_FAILED; + + return table->view->ops->get_column_info(table->view, n, name, + type, temporary, table_name); +} + +static UINT join_find_row( MSIWHEREVIEW *wv, MSIRECORD *rec, UINT *row ) +{ + LPCWSTR str; + UINT r, i, id, data; + + str = MSI_RecordGetString( rec, 1 ); + r = msi_string2idW( wv->db->strings, str, &id ); + if (r != ERROR_SUCCESS) + return r; + + for (i = 0; i < wv->row_count; i++) + { + WHERE_fetch_int( &wv->view, i, 1, &data ); + + if (data == id) + { + *row = i; + return ERROR_SUCCESS; + } + } + + return ERROR_FUNCTION_FAILED; +} + +static UINT join_modify_update( struct tagMSIVIEW *view, MSIRECORD *rec ) +{ + MSIWHEREVIEW *wv = (MSIWHEREVIEW *)view; + UINT r, row, i, mask = 0; + MSIRECORD *current; + + + r = join_find_row( wv, rec, &row ); + if (r != ERROR_SUCCESS) + return r; + + r = msi_view_get_row( wv->db, view, row, ¤t ); + if (r != ERROR_SUCCESS) + return r; + + assert(MSI_RecordGetFieldCount(rec) == MSI_RecordGetFieldCount(current)); + + for (i = MSI_RecordGetFieldCount(rec); i > 0; i--) + { + if (!MSI_RecordsAreFieldsEqual(rec, current, i)) + mask |= 1 << (i - 1); + } + msiobj_release(¤t->hdr); + + return WHERE_set_row( view, row, rec, mask ); } static UINT WHERE_modify( struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *rec, UINT row ) { MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view; + JOINTABLE *table = wv->tables; + UINT r; TRACE("%p %d %p\n", wv, eModifyMode, rec); - find_entry_in_hash(wv->reorder, row - 1, &row); - row++; + if (!table) + return ERROR_FUNCTION_FAILED; - return wv->table->ops->modify( wv->table, eModifyMode, rec, row ); + if (!table->next) + { + UINT *rows; + + if (find_row(wv, row - 1, &rows) == ERROR_SUCCESS) + row = rows[0] + 1; + else + row = -1; + + return table->view->ops->modify(table->view, eModifyMode, rec, row); + } + + switch (eModifyMode) + { + case MSIMODIFY_UPDATE: + return join_modify_update( view, rec ); + + case MSIMODIFY_ASSIGN: + case MSIMODIFY_DELETE: + case MSIMODIFY_INSERT: + case MSIMODIFY_INSERT_TEMPORARY: + case MSIMODIFY_MERGE: + case MSIMODIFY_REPLACE: + case MSIMODIFY_SEEK: + case MSIMODIFY_VALIDATE: + case MSIMODIFY_VALIDATE_DELETE: + case MSIMODIFY_VALIDATE_FIELD: + case MSIMODIFY_VALIDATE_NEW: + r = ERROR_FUNCTION_FAILED; + break; + + case MSIMODIFY_REFRESH: + r = ERROR_CALL_NOT_IMPLEMENTED; + break; + + default: + WARN("%p %d %p %u - unknown mode\n", view, eModifyMode, rec, row ); + r = ERROR_INVALID_PARAMETER; + break; + } + + return r; } static UINT WHERE_delete( struct tagMSIVIEW *view ) { MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view; + JOINTABLE *table = wv->tables; TRACE("%p\n", wv ); - if( wv->table ) - wv->table->ops->delete( wv->table ); - wv->table = 0; + while(table) + { + JOINTABLE *next; - free_hash_table(wv->reorder); - wv->reorder = NULL; - wv->row_count = 0; + table->view->ops->delete(table->view); + table->view = NULL; + next = table->next; + msi_free(table); + table = next; + } + wv->tables = NULL; + wv->table_count = 0; + + free_reorder(wv); + + msi_free(wv->order_info); + wv->order_info = NULL; msiobj_release( &wv->db->hdr ); msi_free( wv ); @@ -548,30 +1019,79 @@ static UINT WHERE_find_matching_rows( struct tagMSIVIEW *view, UINT col, UINT val, UINT *row, MSIITERHANDLE *handle ) { MSIWHEREVIEW *wv = (MSIWHEREVIEW*)view; - UINT r; + UINT i, row_value; TRACE("%p, %d, %u, %p\n", view, col, val, *handle); - if( !wv->table ) + if (!wv->tables) return ERROR_FUNCTION_FAILED; - r = wv->table->ops->find_matching_rows( wv->table, col, val, row, handle ); - if (r != ERROR_SUCCESS) - return r; + if (col == 0 || col > wv->col_count) + return ERROR_INVALID_PARAMETER; - if( *row > wv->row_count ) - return ERROR_NO_MORE_ITEMS; + for (i = PtrToUlong(*handle); i < wv->row_count; i++) + { + if (view->ops->fetch_int( view, i, col, &row_value ) != ERROR_SUCCESS) + continue; - return find_entry_in_hash(wv->reorder, *row, row); + if (row_value == val) + { + *row = i; + *handle = UlongToPtr(i + 1); + return ERROR_SUCCESS; + } + } + + return ERROR_NO_MORE_ITEMS; } static UINT WHERE_sort(struct tagMSIVIEW *view, column_info *columns) { MSIWHEREVIEW *wv = (MSIWHEREVIEW *)view; + JOINTABLE *table = wv->tables; + column_info *column = columns; + MSIORDERINFO *orderinfo; + UINT r, count = 0; + int i; TRACE("%p %p\n", view, columns); - return wv->table->ops->sort(wv->table, columns); + if (!table) + return ERROR_FUNCTION_FAILED; + + while (column) + { + count++; + column = column->next; + } + + if (count == 0) + return ERROR_SUCCESS; + + orderinfo = msi_alloc(sizeof(MSIORDERINFO) + (count - 1) * sizeof(union ext_column)); + if (!orderinfo) + return ERROR_OUTOFMEMORY; + + orderinfo->col_count = count; + + column = columns; + + for (i = 0; i < count; i++) + { + orderinfo->columns[i].unparsed.column = column->column; + orderinfo->columns[i].unparsed.table = column->table; + + r = parse_column(wv, &orderinfo->columns[i], NULL); + if (r != ERROR_SUCCESS) + goto error; + } + + wv->order_info = orderinfo; + + return ERROR_SUCCESS; +error: + msi_free(orderinfo); + return r; } static const MSIVIEWOPS where_ops = @@ -597,48 +1117,40 @@ static const MSIVIEWOPS where_ops = NULL, }; -static UINT WHERE_VerifyCondition( MSIDATABASE *db, MSIVIEW *table, struct expr *cond, +static UINT WHERE_VerifyCondition( MSIWHEREVIEW *wv, struct expr *cond, UINT *valid ) { - UINT r, val = 0; + UINT r; switch( cond->type ) { case EXPR_COLUMN: - r = VIEW_find_column( table, cond->u.column.column, - cond->u.column.table, &val ); - if( r == ERROR_SUCCESS ) - { - UINT type = 0; - r = table->ops->get_column_info( table, val, NULL, &type, - NULL, NULL ); - if( r == ERROR_SUCCESS ) - { - if (type&MSITYPE_STRING) - cond->type = EXPR_COL_NUMBER_STRING; - else if ((type&0xff) == 4) - cond->type = EXPR_COL_NUMBER32; - else - cond->type = EXPR_COL_NUMBER; - cond->u.col_number = val; - *valid = 1; - } - else - *valid = 0; - } + { + UINT type; + + *valid = FALSE; + + r = parse_column(wv, &cond->u.column, &type); + if (r != ERROR_SUCCESS) + break; + + if (type&MSITYPE_STRING) + cond->type = EXPR_COL_NUMBER_STRING; + else if ((type&0xff) == 4) + cond->type = EXPR_COL_NUMBER32; else - { - *valid = 0; - WARN("Couldn't find column %s.%s\n", debugstr_w( cond->u.column.table ), debugstr_w( cond->u.column.column ) ); - } + cond->type = EXPR_COL_NUMBER; + + *valid = TRUE; break; + } case EXPR_COMPLEX: - r = WHERE_VerifyCondition( db, table, cond->u.expr.left, valid ); + r = WHERE_VerifyCondition( wv, cond->u.expr.left, valid ); if( r != ERROR_SUCCESS ) return r; if( !*valid ) return ERROR_SUCCESS; - r = WHERE_VerifyCondition( db, table, cond->u.expr.right, valid ); + r = WHERE_VerifyCondition( wv, cond->u.expr.right, valid ); if( r != ERROR_SUCCESS ) return r; @@ -670,7 +1182,7 @@ static UINT WHERE_VerifyCondition( MSIDATABASE *db, MSIVIEW *table, struct expr *valid = FALSE; return ERROR_INVALID_PARAMETER; } - r = WHERE_VerifyCondition( db, table, cond->u.expr.left, valid ); + r = WHERE_VerifyCondition( wv, cond->u.expr.left, valid ); if( r != ERROR_SUCCESS ) return r; break; @@ -694,29 +1206,14 @@ static UINT WHERE_VerifyCondition( MSIDATABASE *db, MSIVIEW *table, struct expr return ERROR_SUCCESS; } -UINT WHERE_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table, +UINT WHERE_CreateView( MSIDATABASE *db, MSIVIEW **view, LPWSTR tables, struct expr *cond ) { MSIWHEREVIEW *wv = NULL; - UINT count = 0, r, valid = 0; + UINT r, valid = 0; + WCHAR *ptr; - TRACE("%p\n", table ); - - r = table->ops->get_dimensions( table, NULL, &count ); - if( r != ERROR_SUCCESS ) - { - ERR("can't get table dimensions\n"); - return r; - } - - if( cond ) - { - r = WHERE_VerifyCondition( db, table, cond, &valid ); - if( r != ERROR_SUCCESS ) - return r; - if( !valid ) - return ERROR_FUNCTION_FAILED; - } + TRACE("(%s)\n", debugstr_w(tables) ); wv = msi_alloc_zero( sizeof *wv ); if( !wv ) @@ -726,12 +1223,67 @@ UINT WHERE_CreateView( MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table, wv->view.ops = &where_ops; msiobj_addref( &db->hdr ); wv->db = db; - wv->table = table; - wv->row_count = 0; - wv->reorder = NULL; wv->cond = cond; - wv->rec_index = 0; + + while (*tables) + { + JOINTABLE *table; + + if ((ptr = strchrW(tables, ' '))) + *ptr = '\0'; + + table = msi_alloc(sizeof(JOINTABLE)); + if (!table) + { + r = ERROR_OUTOFMEMORY; + goto end; + } + + r = TABLE_CreateView(db, tables, &table->view); + if (r != ERROR_SUCCESS) + { + WARN("can't create table: %s\n", debugstr_w(tables)); + msi_free(table); + r = ERROR_BAD_QUERY_SYNTAX; + goto end; + } + + r = table->view->ops->get_dimensions(table->view, NULL, + &table->col_count); + if (r != ERROR_SUCCESS) + { + ERR("can't get table dimensions\n"); + goto end; + } + + wv->col_count += table->col_count; + table->table_index = wv->table_count++; + + table->next = wv->tables; + wv->tables = table; + + if (!ptr) + break; + + tables = ptr + 1; + } + + if( cond ) + { + r = WHERE_VerifyCondition( wv, cond, &valid ); + if( r != ERROR_SUCCESS ) + goto end; + if( !valid ) { + r = ERROR_FUNCTION_FAILED; + goto end; + } + } + *view = (MSIVIEW*) wv; return ERROR_SUCCESS; +end: + WHERE_delete(&wv->view); + + return r; } diff --git a/reactos/include/psdk/msi.h b/reactos/include/psdk/msi.h index 550ce954b62..6d283afd1ea 100644 --- a/reactos/include/psdk/msi.h +++ b/reactos/include/psdk/msi.h @@ -198,15 +198,25 @@ typedef enum tagMSISOURCETYPE MSISOURCETYPE_UNKNOWN = 0x00000000L, MSISOURCETYPE_NETWORK = 0x00000001L, MSISOURCETYPE_URL = 0x00000002L, - MSISOURCETYPE_MEDIA = 0x00000004 + MSISOURCETYPE_MEDIA = 0x00000004L } MSISOURCETYPE; typedef enum tagMSICODE { MSICODE_PRODUCT = 0x00000000L, - MSICODE_PATCH = 0x40000000L + MSICODE_PATCH = 0x40000000L } MSICODE; +typedef enum tagINSTALLFEATUREATTRIBUTE +{ + INSTALLFEATUREATTRIBUTE_FAVORLOCAL = 1 << 0, + INSTALLFEATUREATTRIBUTE_FAVORSOURCE = 1 << 1, + INSTALLFEATUREATTRIBUTE_FOLLOWPARENT = 1 << 2, + INSTALLFEATUREATTRIBUTE_FAVORADVERTISE = 1 << 3, + INSTALLFEATUREATTRIBUTE_DISALLOWADVERTISE = 1 << 4, + INSTALLFEATUREATTRIBUTE_NOUNSUPPORTEDADVERTISE = 1 << 5 +} INSTALLFEATUREATTRIBUTE; + typedef struct _MSIFILEHASHINFO { ULONG dwFileHashInfoSize; ULONG dwData[4]; @@ -523,6 +533,10 @@ INSTALLSTATE WINAPI MsiQueryFeatureStateA(LPCSTR, LPCSTR); INSTALLSTATE WINAPI MsiQueryFeatureStateW(LPCWSTR, LPCWSTR); #define MsiQueryFeatureState WINELIB_NAME_AW(MsiQueryFeatureState) +UINT WINAPI MsiGetFeatureInfoA(MSIHANDLE, LPCSTR, LPDWORD, LPSTR, LPDWORD, LPSTR, LPDWORD); +UINT WINAPI MsiGetFeatureInfoW(MSIHANDLE, LPCWSTR, LPDWORD, LPWSTR, LPDWORD, LPWSTR, LPDWORD); +#define MsiGetFeatureInfo WINELIB_NAME_AW(MsiGetFeatureInfo) + UINT WINAPI MsiGetFeatureUsageA(LPCSTR, LPCSTR, LPDWORD, LPWORD); UINT WINAPI MsiGetFeatureUsageW(LPCWSTR, LPCWSTR, LPDWORD, LPWORD); #define MsiGetFeatureUsage WINELIB_NAME_AW(MsiGetFeatureUsage) @@ -659,6 +673,10 @@ UINT WINAPI MsiDetermineApplicablePatchesA(LPCSTR, DWORD, PMSIPATCHSEQUENCEINFOA UINT WINAPI MsiDetermineApplicablePatchesW(LPCWSTR, DWORD, PMSIPATCHSEQUENCEINFOW); #define MsiDetermineApplicablePatches WINELIB_NAME_AW(MsiDetermineApplicablePatches) +UINT WINAPI MsiDeterminePatchSequenceA(LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, PMSIPATCHSEQUENCEINFOA); +UINT WINAPI MsiDeterminePatchSequenceW(LPCWSTR, LPCWSTR, MSIINSTALLCONTEXT, DWORD, PMSIPATCHSEQUENCEINFOW); +#define MsiDeterminePatchSequence WINELIB_NAME_AW(MsiDeterminePatchSequence) + UINT WINAPI MsiApplyMultiplePatchesA(LPCSTR, LPCSTR, LPCSTR); UINT WINAPI MsiApplyMultiplePatchesW(LPCWSTR, LPCWSTR, LPCWSTR); #define MsiApplyMultiplePatches WINELIB_NAME_AW(MsiApplyMultiplePatches) diff --git a/reactos/include/psdk/msidefs.h b/reactos/include/psdk/msidefs.h index a3b487c8573..640bfa16ef3 100644 --- a/reactos/include/psdk/msidefs.h +++ b/reactos/include/psdk/msidefs.h @@ -38,7 +38,11 @@ enum msidbFileAttributes { msidbFileAttributesNoncompressed = 0x00002000, msidbFileAttributesCompressed = 0x00004000 }; - + +enum msidbPatchAttributes { + msidbPatchAttributesNonVital = 0x00000001 +}; + enum msidbDialogAttributes { msidbDialogAttributesVisible = 0x00000001, msidbDialogAttributesModal = 0x00000002, diff --git a/reactos/include/psdk/msiquery.h b/reactos/include/psdk/msiquery.h index 2ea8320c04d..fbd46515cf3 100644 --- a/reactos/include/psdk/msiquery.h +++ b/reactos/include/psdk/msiquery.h @@ -248,6 +248,10 @@ MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE); UINT WINAPI MsiViewGetColumnInfo(MSIHANDLE, MSICOLINFO, MSIHANDLE*); INT WINAPI MsiProcessMessage(MSIHANDLE, INSTALLMESSAGE, MSIHANDLE); +UINT WINAPI MsiSetFeatureAttributesA(MSIHANDLE, LPCSTR, DWORD); +UINT WINAPI MsiSetFeatureAttributesW(MSIHANDLE, LPCWSTR, DWORD); +#define MsiSetFeatureAttributes WINELIB_NAME_AW(MsiSetFeatureAttributes) + UINT WINAPI MsiSetFeatureStateA(MSIHANDLE, LPCSTR, INSTALLSTATE); UINT WINAPI MsiSetFeatureStateW(MSIHANDLE, LPCWSTR, INSTALLSTATE); #define MsiSetFeatureState WINELIB_NAME_AW(MsiSetFeatureState) From 14c14451f5d4f47178c5944d4944553bb45fdec5 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 21 Jan 2012 17:21:57 +0000 Subject: [PATCH 007/289] [MSI_WINETEST] Sync msi_winetest.exe with Wine head svn path=/trunk/; revision=55047 --- rostests/winetests/msi/CMakeLists.txt | 1 + rostests/winetests/msi/action.c | 6100 ++++++++++++++++++++++++ rostests/winetests/msi/automation.c | 387 +- rostests/winetests/msi/db.c | 777 +++- rostests/winetests/msi/format.c | 532 ++- rostests/winetests/msi/install.c | 6108 +++++++------------------ rostests/winetests/msi/msi.c | 1069 +++-- rostests/winetests/msi/msi.rbuild | 1 + rostests/winetests/msi/package.c | 1930 ++++++-- rostests/winetests/msi/patch.c | 176 +- rostests/winetests/msi/record.c | 3 + rostests/winetests/msi/source.c | 351 +- rostests/winetests/msi/suminfo.c | 15 +- rostests/winetests/msi/testlist.c | 3 +- 14 files changed, 11851 insertions(+), 5602 deletions(-) create mode 100644 rostests/winetests/msi/action.c diff --git a/rostests/winetests/msi/CMakeLists.txt b/rostests/winetests/msi/CMakeLists.txt index c395e4d55ae..adacf626d07 100644 --- a/rostests/winetests/msi/CMakeLists.txt +++ b/rostests/winetests/msi/CMakeLists.txt @@ -4,6 +4,7 @@ add_definitions( -D_DLL -D__USE_CRTIMP) list(APPEND SOURCE + action.c automation.c db.c format.c diff --git a/rostests/winetests/msi/action.c b/rostests/winetests/msi/action.c new file mode 100644 index 00000000000..3743e502a17 --- /dev/null +++ b/rostests/winetests/msi/action.c @@ -0,0 +1,6100 @@ +/* + * Copyright (C) 2006 James Hawkins + * Copyright 2010 Hans Leidekker for CodeWeavers + * + * Tests concentrating on standard actions + * + * 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 _WIN32_MSI 300 +#include + +#include +#include +#include +#include +#include +#include + +#include "wine/test.h" + +static UINT (WINAPI *pMsiQueryComponentStateA) + (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPCSTR, INSTALLSTATE *); +static UINT (WINAPI *pMsiSourceListEnumSourcesA) + (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD); +static UINT (WINAPI *pMsiSourceListGetInfoA) + (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD); +static INSTALLSTATE (WINAPI *pMsiGetComponentPathExA) + (LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPSTR, LPDWORD); + +static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR *); +static BOOL (WINAPI *pGetTokenInformation)(HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD); +static BOOL (WINAPI *pOpenProcessToken)(HANDLE, DWORD, PHANDLE); +static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD); +static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); + +static HMODULE hsrclient; +static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD); +static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA *, STATEMGRSTATUS *); + +static BOOL is_wow64; +static const BOOL is_64bit = sizeof(void *) > sizeof(int); + +static const char *msifile = "msitest.msi"; +static CHAR CURR_DIR[MAX_PATH]; +static CHAR PROG_FILES_DIR[MAX_PATH]; +static CHAR COMMON_FILES_DIR[MAX_PATH]; +static CHAR APP_DATA_DIR[MAX_PATH]; +static CHAR WINDOWS_DIR[MAX_PATH]; + +/* msi database data */ + +static const char component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n" + "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n" + "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\tNOT REINSTALL\tone.txt\n" + "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n" + "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n" + "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n" + "component\t\tMSITESTDIR\t0\t1\tfile\n" + "service_comp\t\tMSITESTDIR\t0\t1\tservice_file"; + +static const char directory_dat[] = + "Directory\tDirectory_Parent\tDefaultDir\n" + "s72\tS72\tl255\n" + "Directory\tDirectory\n" + "CABOUTDIR\tMSITESTDIR\tcabout\n" + "CHANGEDDIR\tMSITESTDIR\tchanged:second\n" + "FIRSTDIR\tMSITESTDIR\tfirst\n" + "MSITESTDIR\tProgramFilesFolder\tmsitest\n" + "NEWDIR\tCABOUTDIR\tnew\n" + "ProgramFilesFolder\tTARGETDIR\t.\n" + "TARGETDIR\t\tSourceDir"; + +static const char feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "Five\t\tFive\tThe Five Feature\t5\t3\tNEWDIR\t0\n" + "Four\t\tFour\tThe Four Feature\t4\t3\tCABOUTDIR\t0\n" + "One\t\tOne\tThe One Feature\t1\t3\tMSITESTDIR\t0\n" + "Three\t\tThree\tThe Three Feature\t3\t3\tCHANGEDDIR\t0\n" + "Two\t\tTwo\tThe Two Feature\t2\t3\tFIRSTDIR\t0\n" + "feature\t\t\t\t2\t1\tTARGETDIR\t0\n" + "service_feature\t\t\t\t2\t1\tTARGETDIR\t0"; + +static const char feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "Five\tFive\n" + "Four\tFour\n" + "One\tOne\n" + "Three\tThree\n" + "Two\tTwo\n" + "feature\tcomponent\n" + "service_feature\tservice_comp\n"; + +static const char file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "five.txt\tFive\tfive.txt\t1000\t\t\t16384\t5\n" + "four.txt\tFour\tfour.txt\t1000\t\t\t16384\t4\n" + "one.txt\tOne\tone.txt\t1000\t\t\t0\t1\n" + "three.txt\tThree\tthree.txt\t1000\t\t\t0\t3\n" + "two.txt\tTwo\ttwo.txt\t1000\t\t\t0\t2\n" + "file\tcomponent\tfilename\t100\t\t\t8192\t1\n" + "service_file\tservice_comp\tservice.exe\t100\t\t\t8192\t1"; + +static const char install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "AllocateRegistrySpace\tNOT Installed\t1550\n" + "CostFinalize\t\t1000\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "ResolveSource\t\t950\n" + "MoveFiles\t\t1700\n" + "InstallFiles\t\t4000\n" + "DuplicateFiles\t\t4500\n" + "WriteEnvironmentStrings\t\t4550\n" + "CreateShortcuts\t\t4600\n" + "InstallServices\t\t5000\n" + "InstallFinalize\t\t6600\n" + "InstallInitialize\t\t1500\n" + "InstallValidate\t\t1400\n" + "LaunchConditions\t\t100\n" + "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000"; + +static const char media_dat[] = + "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" + "i2\ti4\tL64\tS255\tS32\tS72\n" + "Media\tDiskId\n" + "1\t3\t\t\tDISK1\t\n" + "2\t5\t\tmsitest.cab\tDISK2\t\n"; + +static const char property_dat[] = + "Property\tValue\n" + "s72\tl0\n" + "Property\tProperty\n" + "DefaultUIFont\tDlgFont8\n" + "HASUIRUN\t0\n" + "INSTALLLEVEL\t3\n" + "InstallMode\tTypical\n" + "Manufacturer\tWine\n" + "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" + "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" + "ProductID\tnone\n" + "ProductLanguage\t1033\n" + "ProductName\tMSITEST\n" + "ProductVersion\t1.1.1\n" + "PROMPTROLLBACKCOST\tP\n" + "Setup\tSetup\n" + "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" + "AdminProperties\tPOSTADMIN\n" + "ROOTDRIVE\tC:\\\n" + "SERVNAME\tTestService\n" + "SERVDISP\tTestServiceDisp\n" + "MSIFASTINSTALL\t1\n"; + +static const char environment_dat[] = + "Environment\tName\tValue\tComponent_\n" + "s72\tl255\tL255\ts72\n" + "Environment\tEnvironment\n" + "Var1\t=-MSITESTVAR1\t1\tOne\n" + "Var2\tMSITESTVAR2\t1\tOne\n" + "Var3\t=-MSITESTVAR3\t1\tOne\n" + "Var4\tMSITESTVAR4\t1\tOne\n" + "Var5\t-MSITESTVAR5\t\tOne\n" + "Var6\tMSITESTVAR6\t\tOne\n" + "Var7\t!-MSITESTVAR7\t\tOne\n" + "Var8\t!-*MSITESTVAR8\t\tOne\n" + "Var9\t=-MSITESTVAR9\t\tOne\n" + "Var10\t=MSITESTVAR10\t\tOne\n" + "Var11\t+-MSITESTVAR11\t[~];1\tOne\n" + "Var12\t+-MSITESTVAR11\t[~];2\tOne\n" + "Var13\t+-MSITESTVAR12\t[~];1\tOne\n" + "Var14\t=MSITESTVAR13\t[~];1\tOne\n" + "Var15\t=MSITESTVAR13\t[~];2\tOne\n" + "Var16\t=MSITESTVAR14\t;1;\tOne\n" + "Var17\t=MSITESTVAR15\t;;1;;\tOne\n" + "Var18\t=MSITESTVAR16\t 1 \tOne\n" + "Var19\t+-MSITESTVAR17\t1\tOne\n" + "Var20\t+-MSITESTVAR17\t;;2;;[~]\tOne\n" + "Var21\t+-MSITESTVAR18\t1\tOne\n" + "Var22\t+-MSITESTVAR18\t[~];;2;;\tOne\n" + "Var23\t+-MSITESTVAR19\t1\tOne\n" + "Var24\t+-MSITESTVAR19\t[~]2\tOne\n" + "Var25\t+-MSITESTVAR20\t1\tOne\n" + "Var26\t+-MSITESTVAR20\t2[~]\tOne\n"; + +static const char service_install_dat[] = + "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t" + "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n" + "s72\ts255\tL255\ti4\ti4\ti4\tS255\tS255\tS255\tS255\tS255\ts72\tL255\n" + "ServiceInstall\tServiceInstall\n" + "TestService\t[SERVNAME]\t[SERVDISP]\t2\t3\t0\t\tservice1[~]+group1[~]service2[~]+group2[~][~]\tTestService\t\t-a arg\tservice_comp\tdescription"; + +static const char service_control_dat[] = + "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n" + "s72\tl255\ti2\tL255\tI2\ts72\n" + "ServiceControl\tServiceControl\n" + "ServiceControl\tTestService\t8\t\t0\tservice_comp"; + +static const char sss_service_control_dat[] = + "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n" + "s72\tl255\ti2\tL255\tI2\ts72\n" + "ServiceControl\tServiceControl\n" + "ServiceControl\tSpooler\t1\t\t0\tservice_comp"; + +static const char sss_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "ResolveSource\t\t950\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "DeleteServices\t\t5000\n" + "MoveFiles\t\t5100\n" + "InstallFiles\t\t5200\n" + "DuplicateFiles\t\t5300\n" + "StartServices\t\t5400\n" + "InstallFinalize\t\t6000\n"; + +static const char sds_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "ResolveSource\t\t950\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "DeleteServices\tInstalled\t5000\n" + "MoveFiles\t\t5100\n" + "InstallFiles\t\t5200\n" + "DuplicateFiles\t\t5300\n" + "InstallServices\tNOT Installed\t5400\n" + "RegisterProduct\t\t5500\n" + "PublishFeatures\t\t5600\n" + "PublishProduct\t\t5700\n" + "InstallFinalize\t\t6000\n"; + +static const char rof_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n"; + +static const char rof_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "feature\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0\n" + "montecristo\t\tFeature\tFeature\t2\t1\tTARGETDIR\t0"; + +static const char rof_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "feature\tmaximus\n" + "montecristo\tmaximus"; + +static const char rof_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1"; + +static const char rof_media_dat[] = + "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" + "i2\ti4\tL64\tS255\tS32\tS72\n" + "Media\tDiskId\n" + "1\t1\t\t\tDISK1\t\n"; + +static const char ci2_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "feature\taugustus"; + +static const char ci2_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "augustus\taugustus\taugustus\t500\t\t\t8192\t1"; + +static const char pp_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "ValidateProductID\t\t700\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\tPROCESS_COMPONENTS=1 Or FULL=1\t1600\n" + "UnpublishFeatures\tUNPUBLISH_FEATURES=1 Or FULL=1\t1800\n" + "RemoveFiles\t\t3500\n" + "InstallFiles\t\t4000\n" + "RegisterUser\tREGISTER_USER=1 Or FULL=1\t6000\n" + "RegisterProduct\tREGISTER_PRODUCT=1 Or FULL=1\t6100\n" + "PublishFeatures\tPUBLISH_FEATURES=1 Or FULL=1\t6300\n" + "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n" + "InstallFinalize\t\t6600"; + +static const char pp_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\t\tmaximus\n"; + +static const char ppc_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\t\tmaximus\n" + "augustus\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\taugustus\n"; + +static const char ppc_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1\n" + "augustus\taugustus\taugustus\t500\t\t\t8192\t2"; + +static const char ppc_media_dat[] = + "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" + "i2\ti4\tL64\tS255\tS32\tS72\n" + "Media\tDiskId\n" + "1\t2\t\t\tDISK1\t\n"; + +static const char ppc_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "feature\tmaximus\n" + "feature\taugustus\n" + "montecristo\tmaximus"; + +static const char cwd_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "augustus\t\tMSITESTDIR\t0\t\taugustus\n"; + +static const char rem_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t0\t\thydrogen\n" + "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\thelium\n" + "lithium\t\tMSITESTDIR\t2\t\tlithium\n"; + +static const char rem_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "feature\thydrogen\n" + "feature\thelium\n" + "feature\tlithium"; + +static const char rem_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "hydrogen\thydrogen\thydrogen\t0\t\t\t8192\t1\n" + "helium\thelium\thelium\t0\t\t\t8192\t1\n" + "lithium\tlithium\tlithium\t0\t\t\t8192\t1"; + +static const char rem_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "ValidateProductID\t\t700\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "UnpublishFeatures\t\t1800\n" + "RemoveFiles\t\t3500\n" + "InstallFiles\t\t4000\n" + "RegisterProduct\t\t6100\n" + "PublishFeatures\t\t6300\n" + "PublishProduct\t\t6400\n" + "InstallFinalize\t\t6600"; + +static const char rem_remove_files_dat[] = + "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n" + "s72\ts72\tS255\ts72\tI2\n" + "RemoveFile\tFileKey\n" + "furlong\thydrogen\tfurlong\tMSITESTDIR\t1\n" + "firkin\thelium\tfirkin\tMSITESTDIR\t1\n" + "fortnight\tlithium\tfortnight\tMSITESTDIR\t1\n" + "becquerel\thydrogen\tbecquerel\tMSITESTDIR\t2\n" + "dioptre\thelium\tdioptre\tMSITESTDIR\t2\n" + "attoparsec\tlithium\tattoparsec\tMSITESTDIR\t2\n" + "storeys\thydrogen\tstoreys\tMSITESTDIR\t3\n" + "block\thelium\tblock\tMSITESTDIR\t3\n" + "siriometer\tlithium\tsiriometer\tMSITESTDIR\t3\n" + "nanoacre\thydrogen\t\tCABOUTDIR\t3\n"; + +static const char mov_move_file_dat[] = + "FileKey\tComponent_\tSourceName\tDestName\tSourceFolder\tDestFolder\tOptions\n" + "s72\ts72\tS255\tS255\tS72\ts72\ti2\n" + "MoveFile\tFileKey\n" + "abkhazia\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t0\n" + "bahamas\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t1\n" + "cambodia\taugustus\tcameroon\tcanada\tSourceDir\tMSITESTDIR\t0\n" + "denmark\taugustus\tdjibouti\tdominica\tSourceDir\tMSITESTDIR\t1\n" + "ecuador\taugustus\tegypt\telsalvador\tNotAProp\tMSITESTDIR\t1\n" + "fiji\taugustus\tfinland\tfrance\tSourceDir\tNotAProp\t1\n" + "gabon\taugustus\tgambia\tgeorgia\tSOURCEFULL\tMSITESTDIR\t1\n" + "haiti\taugustus\thonduras\thungary\tSourceDir\tDESTFULL\t1\n" + "iceland\taugustus\tindia\tindonesia\tMSITESTDIR\tMSITESTDIR\t1\n" + "jamaica\taugustus\tjapan\tjordan\tFILEPATHBAD\tMSITESTDIR\t1\n" + "kazakhstan\taugustus\t\tkiribati\tFILEPATHGOOD\tMSITESTDIR\t1\n" + "laos\taugustus\tlatvia\tlebanon\tSourceDir\tMSITESTDIR\t1\n" + "namibia\taugustus\tnauru\tkiribati\tSourceDir\tMSITESTDIR\t1\n" + "pakistan\taugustus\tperu\tsfn|poland\tSourceDir\tMSITESTDIR\t1\n" + "wildcard\taugustus\tapp*\twildcard\tSourceDir\tMSITESTDIR\t1\n" + "single\taugustus\tf?o\tsingle\tSourceDir\tMSITESTDIR\t1\n" + "wildcardnodest\taugustus\tbudd*\t\tSourceDir\tMSITESTDIR\t1\n" + "singlenodest\taugustus\tb?r\t\tSourceDir\tMSITESTDIR\t1\n"; + +static const char df_directory_dat[] = + "Directory\tDirectory_Parent\tDefaultDir\n" + "s72\tS72\tl255\n" + "Directory\tDirectory\n" + "THIS\tMSITESTDIR\tthis\n" + "DOESNOT\tTHIS\tdoesnot\n" + "NONEXISTENT\tDOESNOT\texist\n" + "MSITESTDIR\tProgramFilesFolder\tmsitest\n" + "ProgramFilesFolder\tTARGETDIR\t.\n" + "TARGETDIR\t\tSourceDir"; + +static const char df_duplicate_file_dat[] = + "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n" + "s72\ts72\ts72\tS255\tS72\n" + "DuplicateFile\tFileKey\n" + "maximus\tmaximus\tmaximus\taugustus\t\n" + "caesar\tmaximus\tmaximus\t\tNONEXISTENT\n" + "augustus\tnosuchcomponent\tmaximus\t\tMSITESTDIR\n"; + +static const char wrv_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "augustus\t\tMSITESTDIR\t0\t\taugustus\n"; + +static const char wrv_registry_dat[] = + "Registry\tRoot\tKey\tName\tValue\tComponent_\n" + "s72\ti2\tl255\tL255\tL0\ts72\n" + "Registry\tRegistry\n" + "regdata\t2\tSOFTWARE\\Wine\\msitest\tValue\t[~]one[~]two[~]three\taugustus"; + +static const char cf_directory_dat[] = + "Directory\tDirectory_Parent\tDefaultDir\n" + "s72\tS72\tl255\n" + "Directory\tDirectory\n" + "FIRSTDIR\tMSITESTDIR\tfirst\n" + "SECONDDIR\tMSITESTDIR\tsecond\n" + "THIRDDIR\tMSITESTDIR\tthird\n" + "MSITESTDIR\tProgramFilesFolder\tmsitest\n" + "ProgramFilesFolder\tTARGETDIR\t.\n" + "TARGETDIR\t\tSourceDir"; + +static const char cf_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "One\t{F8CD42AC-9C38-48FE-8664-B35FD121012A}\tFIRSTDIR\t0\t\tone.txt\n" + "Two\t{DE2DB02E-2DDF-4E34-8CF6-DCA13E29DF52}\tSECONDDIR\t0\t\ttwo.txt\n"; + +static const char cf_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "One\t\tOne\tThe One Feature\t1\t3\tFIRSTDIR\t0\n" + "Two\t\tTwo\tThe Two Feature\t1\t3\tSECONDDIR\t0\n"; + +static const char cf_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "One\tOne\n" + "Two\tTwo\n"; + +static const char cf_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "one.txt\tOne\tone.txt\t0\t\t\t0\t1\n" + "two.txt\tTwo\ttwo.txt\t0\t\t\t0\t2\n"; + +static const char cf_create_folders_dat[] = + "Directory_\tComponent_\n" + "s72\ts72\n" + "CreateFolder\tDirectory_\tComponent_\n" + "FIRSTDIR\tOne\n" + "SECONDDIR\tTwo\n" + "THIRDDIR\tTwo\n"; + +static const char cf_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "CostFinalize\t\t1000\n" + "ValidateProductID\t\t700\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "RemoveFiles\t\t3500\n" + "CreateFolders\t\t3700\n" + "RemoveFolders\t\t3800\n" + "InstallFiles\t\t4000\n" + "RegisterUser\t\t6000\n" + "RegisterProduct\t\t6100\n" + "PublishFeatures\t\t6300\n" + "PublishProduct\t\t6400\n" + "InstallFinalize\t\t6600\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "UnpublishFeatures\t\t1800\n" + "InstallValidate\t\t1400\n" + "LaunchConditions\t\t100\n"; + +static const char sr_selfreg_dat[] = + "File_\tCost\n" + "s72\tI2\n" + "SelfReg\tFile_\n" + "one.txt\t1\n"; + +static const char sr_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "CostFinalize\t\t1000\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "ResolveSource\t\t950\n" + "MoveFiles\t\t1700\n" + "SelfUnregModules\t\t3900\n" + "InstallFiles\t\t4000\n" + "DuplicateFiles\t\t4500\n" + "WriteEnvironmentStrings\t\t4550\n" + "CreateShortcuts\t\t4600\n" + "InstallFinalize\t\t6600\n" + "InstallInitialize\t\t1500\n" + "InstallValidate\t\t1400\n" + "LaunchConditions\t\t100\n"; + +static const char font_media_dat[] = + "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" + "i2\ti4\tL64\tS255\tS32\tS72\n" + "Media\tDiskId\n" + "1\t3\t\t\tDISK1\t\n"; + +static const char font_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "font.ttf\tfonts\tfont.ttf\t1000\t\t\t8192\t1\n"; + +static const char font_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "fonts\t\t\tfont feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char font_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "fonts\t{F5920ED0-1183-4B8F-9330-86CE56557C05}\tMSITESTDIR\t0\t\tfont.ttf\n"; + +static const char font_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "fonts\tfonts\n"; + +static const char font_dat[] = + "File_\tFontTitle\n" + "s72\tS128\n" + "Font\tFile_\n" + "font.ttf\tmsi test font\n"; + +static const char font_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "ValidateProductID\t\t700\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "UnpublishFeatures\t\t1800\n" + "RemoveFiles\t\t3500\n" + "InstallFiles\t\t4000\n" + "RegisterFonts\t\t4100\n" + "UnregisterFonts\t\t4200\n" + "RegisterUser\t\t6000\n" + "RegisterProduct\t\t6100\n" + "PublishFeatures\t\t6300\n" + "PublishProduct\t\t6400\n" + "InstallFinalize\t\t6600"; + +static const char vp_property_dat[] = + "Property\tValue\n" + "s72\tl0\n" + "Property\tProperty\n" + "HASUIRUN\t0\n" + "INSTALLLEVEL\t3\n" + "InstallMode\tTypical\n" + "Manufacturer\tWine\n" + "PIDTemplate\t###-#######\n" + "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" + "ProductLanguage\t1033\n" + "ProductName\tMSITEST\n" + "ProductVersion\t1.1.1\n" + "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" + "MSIFASTINSTALL\t1\n"; + +static const char vp_custom_action_dat[] = + "Action\tType\tSource\tTarget\tISComments\n" + "s72\ti2\tS64\tS0\tS255\n" + "CustomAction\tAction\n" + "SetProductID1\t51\tProductID\t1\t\n" + "SetProductID2\t51\tProductID\t2\t\n" + "TestProductID1\t19\t\t\tHalts installation\n" + "TestProductID2\t19\t\t\tHalts installation\n"; + +static const char vp_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "SetProductID1\tSET_PRODUCT_ID=1\t3000\n" + "SetProductID2\tSET_PRODUCT_ID=2\t3100\n" + "ValidateProductID\t\t3200\n" + "InstallExecute\t\t3300\n" + "TestProductID1\tProductID=1\t3400\n" + "TestProductID2\tProductID=\"123-1234567\"\t3500\n" + "InstallFiles\t\t4000\n" + "InstallFinalize\t\t6000\n"; + +static const char odbc_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "ODBCdriver.dll\todbc\tODBCdriver.dll\t1000\t\t\t8192\t1\n" + "ODBCdriver2.dll\todbc\tODBCdriver2.dll\t1000\t\t\t8192\t2\n" + "ODBCtranslator.dll\todbc\tODBCtranslator.dll\t1000\t\t\t8192\t3\n" + "ODBCtranslator2.dll\todbc\tODBCtranslator2.dll\t1000\t\t\t8192\t4\n" + "ODBCsetup.dll\todbc\tODBCsetup.dll\t1000\t\t\t8192\t5\n"; + +static const char odbc_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "odbc\t\t\todbc feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char odbc_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "odbc\todbc\n"; + +static const char odbc_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "odbc\t{B6F3E4AE-35D1-4B72-9044-989F03E20A43}\tMSITESTDIR\t0\t\tODBCdriver.dll\n"; + +static const char odbc_driver_dat[] = + "Driver\tComponent_\tDescription\tFile_\tFile_Setup\n" + "s72\ts72\ts255\ts72\tS72\n" + "ODBCDriver\tDriver\n" + "ODBC test driver\todbc\tODBC test driver\tODBCdriver.dll\t\n" + "ODBC test driver2\todbc\tODBC test driver2\tODBCdriver2.dll\tODBCsetup.dll\n"; + +static const char odbc_translator_dat[] = + "Translator\tComponent_\tDescription\tFile_\tFile_Setup\n" + "s72\ts72\ts255\ts72\tS72\n" + "ODBCTranslator\tTranslator\n" + "ODBC test translator\todbc\tODBC test translator\tODBCtranslator.dll\t\n" + "ODBC test translator2\todbc\tODBC test translator2\tODBCtranslator2.dll\tODBCsetup.dll\n"; + +static const char odbc_datasource_dat[] = + "DataSource\tComponent_\tDescription\tDriverDescription\tRegistration\n" + "s72\ts72\ts255\ts255\ti2\n" + "ODBCDataSource\tDataSource\n" + "ODBC data source\todbc\tODBC data source\tODBC driver\t0\n"; + +static const char odbc_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "InstallODBC\t\t3000\n" + "RemoveODBC\t\t3100\n" + "RemoveFiles\t\t3900\n" + "InstallFiles\t\t4000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char odbc_media_dat[] = + "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" + "i2\ti4\tL64\tS255\tS32\tS72\n" + "Media\tDiskId\n" + "1\t5\t\t\tDISK1\t\n"; + +static const char tl_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "typelib.dll\ttypelib\ttypelib.dll\t1000\t\t\t8192\t1\n"; + +static const char tl_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "typelib\t\t\ttypelib feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char tl_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "typelib\ttypelib\n"; + +static const char tl_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "typelib\t{BB4C26FD-89D8-4E49-AF1C-DB4DCB5BF1B0}\tMSITESTDIR\t0\t\ttypelib.dll\n"; + +static const char tl_typelib_dat[] = + "LibID\tLanguage\tComponent_\tVersion\tDescription\tDirectory_\tFeature_\tCost\n" + "s38\ti2\ts72\tI4\tL128\tS72\ts38\tI4\n" + "TypeLib\tLibID\tLanguage\tComponent_\n" + "{EAC5166A-9734-4D91-878F-1DD02304C66C}\t0\ttypelib\t1793\t\tMSITESTDIR\ttypelib\t\n"; + +static const char tl_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RegisterTypeLibraries\tREGISTER_TYPELIB=1\t3000\n" + "UnregisterTypeLibraries\t\t3100\n" + "RegisterProduct\t\t5100\n" + "PublishFeatures\t\t5200\n" + "PublishProduct\t\t5300\n" + "InstallFinalize\t\t6000\n"; + +static const char crs_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "target.txt\tshortcut\ttarget.txt\t1000\t\t\t8192\t1\n"; + +static const char crs_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "shortcut\t\t\tshortcut feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char crs_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "shortcut\tshortcut\n"; + +static const char crs_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "shortcut\t{5D20E3C6-7206-498F-AC28-87AF2F9AD4CC}\tMSITESTDIR\t0\t\ttarget.txt\n"; + +static const char crs_shortcut_dat[] = + "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n" + "s72\ts72\tl128\ts72\ts72\tL255\tL255\tI2\tS72\tI2\tI2\tS72\n" + "Shortcut\tShortcut\n" + "shortcut\tMSITESTDIR\tshortcut\tshortcut\t[MSITESTDIR]target.txt\t\t\t\t\t\t\t\n"; + +static const char crs_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RemoveShortcuts\t\t3000\n" + "CreateShortcuts\t\t3100\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char pub_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "english.txt\tpublish\tenglish.txt\t1000\t\t\t8192\t1\n"; + +static const char pub_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "publish\t\t\tpublish feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char pub_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "publish\tpublish\n"; + +static const char pub_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "publish\t{B4EA0ACF-6238-426E-9C6D-7869F0F9C768}\tMSITESTDIR\t0\t\tenglish.txt\n"; + +static const char pub_publish_component_dat[] = + "ComponentId\tQualifier\tComponent_\tAppData\tFeature_\n" + "s38\ts255\ts72\tL255\ts38\n" + "PublishComponent\tComponentId\tQualifier\tComponent_\n" + "{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}\tenglish.txt\tpublish\t\tpublish\n"; + +static const char pub_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "PublishComponents\t\t3000\n" + "UnpublishComponents\t\t3100\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char rd_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "original.txt\tduplicate\toriginal.txt\t1000\t\t\t8192\t1\n" + "original2.txt\tduplicate\toriginal2.txt\t1000\t\t\t8192\t2\n" + "original3.txt\tduplicate2\toriginal3.txt\t1000\t\t\t8192\t3\n"; + +static const char rd_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "duplicate\t\t\tduplicate feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char rd_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "duplicate\tduplicate\n"; + +static const char rd_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "duplicate\t{EB45D06A-ADFE-44E3-8D41-B7DE150E41AD}\tMSITESTDIR\t0\t\toriginal.txt\n" + "duplicate2\t{B8BA60E0-B2E9-488E-9D0E-E60F25F04F97}\tMSITESTDIR\t0\tDUPLICATE2=1\toriginal3.txt\n"; + +static const char rd_duplicate_file_dat[] = + "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n" + "s72\ts72\ts72\tS255\tS72\n" + "DuplicateFile\tFileKey\n" + "duplicate\tduplicate\toriginal.txt\tduplicate.txt\t\n" + "duplicate2\tduplicate\toriginal2.txt\t\tMSITESTDIR\n" + "duplicate3\tduplicate2\toriginal3.txt\tduplicate2.txt\t\n"; + +static const char rd_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveDuplicateFiles\t\t1900\n" + "InstallFiles\t\t2000\n" + "DuplicateFiles\t\t2100\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char rrv_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "registry.txt\tregistry\tregistry.txt\t1000\t\t\t8192\t1\n"; + +static const char rrv_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "registry\t\t\tregistry feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char rrv_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "registry\tregistry\n"; + +static const char rrv_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "registry\t{DA97585B-962D-45EB-AD32-DA15E60CA9EE}\tMSITESTDIR\t0\t\tregistry.txt\n"; + +static const char rrv_registry_dat[] = + "Registry\tRoot\tKey\tName\tValue\tComponent_\n" + "s72\ti2\tl255\tL255\tL0\ts72\n" + "Registry\tRegistry\n" + "reg1\t2\tSOFTWARE\\Wine\\keyA\t\tA\tregistry\n" + "reg2\t2\tSOFTWARE\\Wine\\keyA\tvalueA\tA\tregistry\n" + "reg3\t2\tSOFTWARE\\Wine\\key1\t-\t\tregistry\n"; + +static const char rrv_remove_registry_dat[] = + "RemoveRegistry\tRoot\tKey\tName\tComponent_\n" + "s72\ti2\tl255\tL255\ts72\n" + "RemoveRegistry\tRemoveRegistry\n" + "reg1\t2\tSOFTWARE\\Wine\\keyB\t\tregistry\n" + "reg2\t2\tSOFTWARE\\Wine\\keyB\tValueB\tregistry\n" + "reg3\t2\tSOFTWARE\\Wine\\key2\t-\tregistry\n"; + +static const char rrv_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RemoveRegistryValues\t\t3000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char frp_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "product.txt\tproduct\tproduct.txt\t1000\t\t\t8192\t1\n"; + +static const char frp_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "product\t\t\tproduct feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char frp_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "product\tproduct\n"; + +static const char frp_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "product\t{44725EE0-EEA8-40BD-8162-A48224A2FEA1}\tMSITESTDIR\t0\t\tproduct.txt\n"; + +static const char frp_custom_action_dat[] = + "Action\tType\tSource\tTarget\tISComments\n" + "s72\ti2\tS64\tS0\tS255\n" + "CustomAction\tAction\n" + "TestProp\t19\t\t\tPROP set\n"; + +static const char frp_upgrade_dat[] = + "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n" + "s38\tS20\tS20\tS255\ti4\tS255\ts72\n" + "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n" + "{4C0EAA15-0264-4E5A-8758-609EF142B92D}\t1.1.1\t2.2.2\t\t768\t\tPROP\n"; + +static const char frp_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "FindRelatedProducts\t\t50\n" + "TestProp\tPROP AND NOT REMOVE\t51\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char riv_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "inifile.txt\tinifile\tinifile.txt\t1000\t\t\t8192\t1\n"; + +static const char riv_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "inifile\t\t\tinifile feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char riv_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "inifile\tinifile\n"; + +static const char riv_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "inifile\t{A0F15705-4F57-4437-88C4-6C8B37ACC6DE}\tMSITESTDIR\t0\t\tinifile.txt\n"; + +static const char riv_ini_file_dat[] = + "IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n" + "s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n" + "IniFile\tIniFile\n" + "inifile1\ttest.ini\tMSITESTDIR\tsection1\tkey1\tvalue1\t0\tinifile\n"; + +static const char riv_remove_ini_file_dat[] = + "RemoveIniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n" + "s72\tl255\tS72\tl96\tl128\tL255\ti2\ts72\n" + "RemoveIniFile\tRemoveIniFile\n" + "inifile1\ttest.ini\tMSITESTDIR\tsectionA\tkeyA\tvalueA\t2\tinifile\n"; + +static const char riv_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RemoveIniValues\t\t3000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char res_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "envvar.txt\tenvvar\tenvvar.txt\t1000\t\t\t8192\t1\n"; + +static const char res_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "envvar\t\t\tenvvar feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char res_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "envvar\tenvvar\n"; + +static const char res_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "envvar\t{45EE9AF4-E5D1-445F-8BB7-B22D4EEBD29E}\tMSITESTDIR\t0\t\tenvvar.txt\n"; + +static const char res_environment_dat[] = + "Environment\tName\tValue\tComponent_\n" + "s72\tl255\tL255\ts72\n" + "Environment\tEnvironment\n" + "var1\t=-MSITESTVAR1\t1\tenvvar\n" + "var2\t=+-MSITESTVAR2\t1\tenvvar\n" + "var3\t=MSITESTVAR3\t1\tenvvar\n" + "var4\t=-MSITESTVAR4\t\tenvvar\n" + "var5\t=MSITESTVAR5\t\tenvvar\n"; + +static const char res_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "RemoveEnvironmentStrings\t\t3000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char rci_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "class.txt\tclass\tclass.txt\t1000\t\t\t8192\t1\n"; + +static const char rci_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "class\t\t\tclass feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char rci_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "class\tclass\n"; + +static const char rci_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "class\t{89A98345-F8A1-422E-A48B-0250B5809F2D}\tMSITESTDIR\t0\t\tclass.txt\n"; + +static const char rci_appid_dat[] = + "AppId\tRemoteServerName\tLocalService\tServiceParameters\tDllSurrogate\tActivateAtStorage\tRunAsInteractiveUser\n" + "s38\tS255\tS255\tS255\tS255\tI2\tI2\n" + "AppId\tAppId\n" + "{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\t\t\t\t\t\t\n"; + +static const char rci_class_dat[] = + "CLSID\tContext\tComponent_\tProgId_Default\tDescription\tAppId_\tFileTypeMask\tIcon_\tIconIndex\tDefInprocHandler\tArgument\tFeature_\tAttributes\n" + "s38\ts32\ts72\tS255\tL255\tS38\tS255\tS72\tI2\tS32\tS255\ts38\tI2\n" + "Class\tCLSID\tContext\tComponent_\n" + "{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tLocalServer\tclass\t\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tclass\t\n"; + +static const char rci_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "UnregisterClassInfo\t\t3000\n" + "RegisterClassInfo\t\t4000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char rei_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "extension.txt\textension\textension.txt\t1000\t\t\t8192\t1\n"; + +static const char rei_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "extension\t\t\textension feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char rei_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "extension\textension\n"; + +static const char rei_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "extension\t{9A3060D4-60BA-4A82-AB55-9FB148AD013C}\tMSITESTDIR\t0\t\textension.txt\n"; + +static const char rei_extension_dat[] = + "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n" + "s255\ts72\tS255\tS64\ts38\n" + "Extension\tExtension\tComponent_\n" + "extension\textension\tProg.Id.1\t\textension\n"; + +static const char rei_verb_dat[] = + "Extension_\tVerb\tSequence\tCommand\tArgument\n" + "s255\ts32\tI2\tL255\tL255\n" + "Verb\tExtension_\tVerb\n" + "extension\tOpen\t1\t&Open\t/argument\n"; + +static const char rei_progid_dat[] = + "ProgId\tProgId_Parent\tClass_\tDescription\tIcon_\tIconIndex\n" + "s255\tS255\tS38\tL255\tS72\tI2\n" + "ProgId\tProgId\n" + "Prog.Id.1\t\t\tdescription\t\t\n"; + +static const char rei_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "UnregisterExtensionInfo\t\t3000\n" + "RegisterExtensionInfo\t\t4000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char rmi_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "mime.txt\tmime\tmime.txt\t1000\t\t\t8192\t1\n"; + +static const char rmi_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "mime\t\t\tmime feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char rmi_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "mime\tmime\n"; + +static const char rmi_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "mime\t{A1D630CE-13A7-4882-AFDD-148E2BBAFC6D}\tMSITESTDIR\t0\t\tmime.txt\n"; + +static const char rmi_extension_dat[] = + "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n" + "s255\ts72\tS255\tS64\ts38\n" + "Extension\tExtension\tComponent_\n" + "mime\tmime\t\tmime/type\tmime\n"; + +static const char rmi_verb_dat[] = + "Extension_\tVerb\tSequence\tCommand\tArgument\n" + "s255\ts32\tI2\tL255\tL255\n" + "Verb\tExtension_\tVerb\n" + "mime\tOpen\t1\t&Open\t/argument\n"; + +static const char rmi_mime_dat[] = + "ContentType\tExtension_\tCLSID\n" + "s64\ts255\tS38\n" + "MIME\tContentType\n" + "mime/type\tmime\t\n"; + +static const char rmi_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "RemoveFiles\t\t1700\n" + "InstallFiles\t\t2000\n" + "UnregisterExtensionInfo\t\t3000\n" + "UnregisterMIMEInfo\t\t3500\n" + "RegisterExtensionInfo\t\t4000\n" + "RegisterMIMEInfo\t\t4500\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +static const char pa_file_dat[] = + "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "win32.txt\twin32\twin32.txt\t1000\t\t\t8192\t1\n" + "manifest.txt\twin32\tmanifest.txt\t1000\t\t\t8192\t1\n" + "win32_local.txt\twin32_local\twin32_local.txt\t1000\t\t\t8192\t1\n" + "manifest_local.txt\twin32_local\tmanifest_local.txt\t1000\t\t\t8192\t1\n" + "dotnet.txt\tdotnet\tdotnet.txt\t1000\t\t\t8192\t1\n" + "dotnet_local.txt\tdotnet_local\tdotnet_local.txt\t1000\t\t\t8192\t1\n" + "application_win32.txt\twin32_local\tapplication_win32.txt\t1000\t\t\t8192\t1\n" + "application_dotnet.txt\tdotnet_local\tapplication_dotnet.txt\t1000\t\t\t8192\t1\n"; + +static const char pa_feature_dat[] = + "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "assembly\t\t\tassembly feature\t1\t2\tMSITESTDIR\t0\n"; + +static const char pa_feature_comp_dat[] = + "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "assembly\twin32\n" + "assembly\twin32_local\n" + "assembly\tdotnet\n" + "assembly\tdotnet_local\n"; + +static const char pa_component_dat[] = + "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "win32\t{F515549E-7E61-425D-AAC1-9BEF2E066D06}\tMSITESTDIR\t0\t\twin32.txt\n" + "win32_local\t{D34D3FBA-6789-4E57-AD1A-1281297DC201}\tMSITESTDIR\t0\t\twin32_local.txt\n" + "dotnet\t{8943164F-2B31-4C09-A894-493A8CBDE0A4}\tMSITESTDIR\t0\t\tdotnet.txt\n" + "dotnet_local\t{4E8567E8-8EAE-4E36-90F1-B99D33C663F8}\tMSITESTDIR\t0\t\tdotnet_local.txt\n"; + +static const char pa_msi_assembly_dat[] = + "Component_\tFeature_\tFile_Manifest\tFile_Application\tAttributes\n" + "s72\ts38\tS72\tS72\tI2\n" + "MsiAssembly\tComponent_\n" + "win32\tassembly\tmanifest.txt\t\t1\n" + "win32_local\tassembly\tmanifest_local.txt\tapplication_win32.txt\t1\n" + "dotnet\tassembly\t\t\t0\n" + "dotnet_local\tassembly\t\tapplication_dotnet.txt\t0\n"; + +static const char pa_msi_assembly_name_dat[] = + "Component_\tName\tValue\n" + "s72\ts255\ts255\n" + "MsiAssemblyName\tComponent_\tName\n" + "win32\tName\tWine.Win32.Assembly\n" + "win32\tprocessorArchitecture\tx86\n" + "win32\tpublicKeyToken\tabcdef0123456789\n" + "win32\ttype\twin32\n" + "win32\tversion\t1.0.0.0\n" + "win32_local\tName\tWine.Win32.Local.Assembly\n" + "win32_local\tprocessorArchitecture\tx86\n" + "win32_local\tpublicKeyToken\tabcdef0123456789\n" + "win32_local\ttype\twin32\n" + "win32_local\tversion\t1.0.0.0\n" + "dotnet\tName\tWine.Dotnet.Assembly\n" + "dotnet\tprocessorArchitecture\tMSIL\n" + "dotnet\tpublicKeyToken\tabcdef0123456789\n" + "dotnet\tculture\tneutral\n" + "dotnet\tversion\t1.0.0.0\n" + "dotnet_local\tName\tWine.Dotnet.Local.Assembly\n" + "dotnet_local\tprocessorArchitecture\tMSIL\n" + "dotnet_local\tpublicKeyToken\tabcdef0123456789\n" + "dotnet_local\tculture\tneutral\n" + "dotnet_local\tversion\t1.0.0.0\n"; + +static const char pa_install_exec_seq_dat[] = + "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "ProcessComponents\t\t1600\n" + "MsiPublishAssemblies\t\t3000\n" + "MsiUnpublishAssemblies\t\t4000\n" + "RegisterProduct\t\t5000\n" + "PublishFeatures\t\t5100\n" + "PublishProduct\t\t5200\n" + "InstallFinalize\t\t6000\n"; + +typedef struct _msi_table +{ + const char *filename; + const char *data; + unsigned int size; +} msi_table; + +#define ADD_TABLE(x) {#x".idt", x##_dat, sizeof(x##_dat)} + +static const msi_table env_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property), + ADD_TABLE(environment) +}; + +static const msi_table pp_tables[] = +{ + ADD_TABLE(pp_component), + ADD_TABLE(directory), + ADD_TABLE(rof_feature), + ADD_TABLE(rof_feature_comp), + ADD_TABLE(rof_file), + ADD_TABLE(pp_install_exec_seq), + ADD_TABLE(rof_media), + ADD_TABLE(property), +}; + +static const msi_table ppc_tables[] = +{ + ADD_TABLE(ppc_component), + ADD_TABLE(directory), + ADD_TABLE(rof_feature), + ADD_TABLE(ppc_feature_comp), + ADD_TABLE(ppc_file), + ADD_TABLE(pp_install_exec_seq), + ADD_TABLE(ppc_media), + ADD_TABLE(property), +}; + +static const msi_table rem_tables[] = +{ + ADD_TABLE(rem_component), + ADD_TABLE(directory), + ADD_TABLE(rof_feature), + ADD_TABLE(rem_feature_comp), + ADD_TABLE(rem_file), + ADD_TABLE(rem_install_exec_seq), + ADD_TABLE(rof_media), + ADD_TABLE(property), + ADD_TABLE(rem_remove_files), +}; + +static const msi_table mov_tables[] = +{ + ADD_TABLE(cwd_component), + ADD_TABLE(directory), + ADD_TABLE(rof_feature), + ADD_TABLE(ci2_feature_comp), + ADD_TABLE(ci2_file), + ADD_TABLE(install_exec_seq), + ADD_TABLE(rof_media), + ADD_TABLE(property), + ADD_TABLE(mov_move_file), +}; + +static const msi_table df_tables[] = +{ + ADD_TABLE(rof_component), + ADD_TABLE(df_directory), + ADD_TABLE(rof_feature), + ADD_TABLE(rof_feature_comp), + ADD_TABLE(rof_file), + ADD_TABLE(install_exec_seq), + ADD_TABLE(rof_media), + ADD_TABLE(property), + ADD_TABLE(df_duplicate_file), +}; + +static const msi_table wrv_tables[] = +{ + ADD_TABLE(wrv_component), + ADD_TABLE(directory), + ADD_TABLE(rof_feature), + ADD_TABLE(ci2_feature_comp), + ADD_TABLE(ci2_file), + ADD_TABLE(install_exec_seq), + ADD_TABLE(rof_media), + ADD_TABLE(property), + ADD_TABLE(wrv_registry), +}; + +static const msi_table cf_tables[] = +{ + ADD_TABLE(cf_component), + ADD_TABLE(cf_directory), + ADD_TABLE(cf_feature), + ADD_TABLE(cf_feature_comp), + ADD_TABLE(cf_file), + ADD_TABLE(cf_create_folders), + ADD_TABLE(cf_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table sss_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(sss_install_exec_seq), + ADD_TABLE(sss_service_control), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table sds_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(sds_install_exec_seq), + ADD_TABLE(service_control), + ADD_TABLE(service_install), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table sr_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(sr_selfreg), + ADD_TABLE(sr_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table font_tables[] = +{ + ADD_TABLE(font_component), + ADD_TABLE(directory), + ADD_TABLE(font_feature), + ADD_TABLE(font_feature_comp), + ADD_TABLE(font_file), + ADD_TABLE(font), + ADD_TABLE(font_install_exec_seq), + ADD_TABLE(font_media), + ADD_TABLE(property) +}; + +static const msi_table vp_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(vp_custom_action), + ADD_TABLE(vp_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(vp_property) +}; + +static const msi_table odbc_tables[] = +{ + ADD_TABLE(odbc_component), + ADD_TABLE(directory), + ADD_TABLE(odbc_feature), + ADD_TABLE(odbc_feature_comp), + ADD_TABLE(odbc_file), + ADD_TABLE(odbc_driver), + ADD_TABLE(odbc_translator), + ADD_TABLE(odbc_datasource), + ADD_TABLE(odbc_install_exec_seq), + ADD_TABLE(odbc_media), + ADD_TABLE(property) +}; + +static const msi_table tl_tables[] = +{ + ADD_TABLE(tl_component), + ADD_TABLE(directory), + ADD_TABLE(tl_feature), + ADD_TABLE(tl_feature_comp), + ADD_TABLE(tl_file), + ADD_TABLE(tl_typelib), + ADD_TABLE(tl_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table crs_tables[] = +{ + ADD_TABLE(crs_component), + ADD_TABLE(directory), + ADD_TABLE(crs_feature), + ADD_TABLE(crs_feature_comp), + ADD_TABLE(crs_file), + ADD_TABLE(crs_shortcut), + ADD_TABLE(crs_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table pub_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(pub_component), + ADD_TABLE(pub_feature), + ADD_TABLE(pub_feature_comp), + ADD_TABLE(pub_file), + ADD_TABLE(pub_publish_component), + ADD_TABLE(pub_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table rd_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(rd_component), + ADD_TABLE(rd_feature), + ADD_TABLE(rd_feature_comp), + ADD_TABLE(rd_file), + ADD_TABLE(rd_duplicate_file), + ADD_TABLE(rd_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table rrv_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(rrv_component), + ADD_TABLE(rrv_feature), + ADD_TABLE(rrv_feature_comp), + ADD_TABLE(rrv_file), + ADD_TABLE(rrv_registry), + ADD_TABLE(rrv_remove_registry), + ADD_TABLE(rrv_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table frp_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(frp_component), + ADD_TABLE(frp_feature), + ADD_TABLE(frp_feature_comp), + ADD_TABLE(frp_file), + ADD_TABLE(frp_upgrade), + ADD_TABLE(frp_custom_action), + ADD_TABLE(frp_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table riv_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(riv_component), + ADD_TABLE(riv_feature), + ADD_TABLE(riv_feature_comp), + ADD_TABLE(riv_file), + ADD_TABLE(riv_ini_file), + ADD_TABLE(riv_remove_ini_file), + ADD_TABLE(riv_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table res_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(res_component), + ADD_TABLE(res_feature), + ADD_TABLE(res_feature_comp), + ADD_TABLE(res_file), + ADD_TABLE(res_environment), + ADD_TABLE(res_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table rci_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(rci_component), + ADD_TABLE(rci_feature), + ADD_TABLE(rci_feature_comp), + ADD_TABLE(rci_file), + ADD_TABLE(rci_appid), + ADD_TABLE(rci_class), + ADD_TABLE(rci_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table rei_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(rei_component), + ADD_TABLE(rei_feature), + ADD_TABLE(rei_feature_comp), + ADD_TABLE(rei_file), + ADD_TABLE(rei_extension), + ADD_TABLE(rei_verb), + ADD_TABLE(rei_progid), + ADD_TABLE(rei_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table rmi_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(rmi_component), + ADD_TABLE(rmi_feature), + ADD_TABLE(rmi_feature_comp), + ADD_TABLE(rmi_file), + ADD_TABLE(rmi_extension), + ADD_TABLE(rmi_verb), + ADD_TABLE(rmi_mime), + ADD_TABLE(rmi_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table pa_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(pa_component), + ADD_TABLE(pa_feature), + ADD_TABLE(pa_feature_comp), + ADD_TABLE(pa_file), + ADD_TABLE(pa_msi_assembly), + ADD_TABLE(pa_msi_assembly_name), + ADD_TABLE(pa_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +/* cabinet definitions */ + +/* make the max size large so there is only one cab file */ +#define MEDIA_SIZE 0x7FFFFFFF +#define FOLDER_THRESHOLD 900000 + +/* the FCI callbacks */ + +static void * CDECL mem_alloc(ULONG cb) +{ + return HeapAlloc(GetProcessHeap(), 0, cb); +} + +static void CDECL mem_free(void *memory) +{ + HeapFree(GetProcessHeap(), 0, memory); +} + +static BOOL CDECL get_next_cabinet(PCCAB pccab, ULONG cbPrevCab, void *pv) +{ + sprintf(pccab->szCab, pv, pccab->iCab); + return TRUE; +} + +static LONG CDECL progress(UINT typeStatus, ULONG cb1, ULONG cb2, void *pv) +{ + return 0; +} + +static int CDECL file_placed(PCCAB pccab, char *pszFile, LONG cbFile, + BOOL fContinuation, void *pv) +{ + return 0; +} + +static INT_PTR CDECL fci_open(char *pszFile, int oflag, int pmode, int *err, void *pv) +{ + HANDLE handle; + DWORD dwAccess = 0; + DWORD dwShareMode = 0; + DWORD dwCreateDisposition = OPEN_EXISTING; + + dwAccess = GENERIC_READ | GENERIC_WRITE; + dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; + + if (GetFileAttributesA(pszFile) != INVALID_FILE_ATTRIBUTES) + dwCreateDisposition = OPEN_EXISTING; + else + dwCreateDisposition = CREATE_NEW; + + handle = CreateFileA(pszFile, dwAccess, dwShareMode, NULL, + dwCreateDisposition, 0, NULL); + + ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszFile); + + return (INT_PTR)handle; +} + +static UINT CDECL fci_read(INT_PTR hf, void *memory, UINT cb, int *err, void *pv) +{ + HANDLE handle = (HANDLE)hf; + DWORD dwRead; + BOOL res; + + res = ReadFile(handle, memory, cb, &dwRead, NULL); + ok(res, "Failed to ReadFile\n"); + + return dwRead; +} + +static UINT CDECL fci_write(INT_PTR hf, void *memory, UINT cb, int *err, void *pv) +{ + HANDLE handle = (HANDLE)hf; + DWORD dwWritten; + BOOL res; + + res = WriteFile(handle, memory, cb, &dwWritten, NULL); + ok(res, "Failed to WriteFile\n"); + + return dwWritten; +} + +static int CDECL fci_close(INT_PTR hf, int *err, void *pv) +{ + HANDLE handle = (HANDLE)hf; + ok(CloseHandle(handle), "Failed to CloseHandle\n"); + + return 0; +} + +static LONG CDECL fci_seek(INT_PTR hf, LONG dist, int seektype, int *err, void *pv) +{ + HANDLE handle = (HANDLE)hf; + DWORD ret; + + ret = SetFilePointer(handle, dist, NULL, seektype); + ok(ret != INVALID_SET_FILE_POINTER, "Failed to SetFilePointer\n"); + + return ret; +} + +static int CDECL fci_delete(char *pszFile, int *err, void *pv) +{ + BOOL ret = DeleteFileA(pszFile); + ok(ret, "Failed to DeleteFile %s\n", pszFile); + + return 0; +} + +static void init_functionpointers(void) +{ + HMODULE hmsi = GetModuleHandleA("msi.dll"); + HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll"); + HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); + +#define GET_PROC(mod, func) \ + p ## func = (void*)GetProcAddress(mod, #func); \ + if(!p ## func) \ + trace("GetProcAddress(%s) failed\n", #func); + + GET_PROC(hmsi, MsiQueryComponentStateA); + GET_PROC(hmsi, MsiSourceListEnumSourcesA); + GET_PROC(hmsi, MsiSourceListGetInfoA); + GET_PROC(hmsi, MsiGetComponentPathExA); + + GET_PROC(hadvapi32, ConvertSidToStringSidA); + GET_PROC(hadvapi32, GetTokenInformation); + GET_PROC(hadvapi32, OpenProcessToken); + GET_PROC(hadvapi32, RegDeleteKeyExA) + GET_PROC(hkernel32, IsWow64Process) + + hsrclient = LoadLibraryA("srclient.dll"); + GET_PROC(hsrclient, SRRemoveRestorePoint); + GET_PROC(hsrclient, SRSetRestorePointA); + +#undef GET_PROC +} + +static BOOL is_process_limited(void) +{ + HANDLE token; + + if (!pOpenProcessToken || !pGetTokenInformation) return FALSE; + + if (pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) + { + BOOL ret; + TOKEN_ELEVATION_TYPE type = TokenElevationTypeDefault; + DWORD size; + + ret = pGetTokenInformation(token, TokenElevationType, &type, sizeof(type), &size); + CloseHandle(token); + return (ret && type == TokenElevationTypeLimited); + } + return FALSE; +} + +static char *get_user_sid(void) +{ + HANDLE token; + DWORD size = 0; + TOKEN_USER *user; + char *usersid = NULL; + + if (!pConvertSidToStringSidA) + { + win_skip("ConvertSidToStringSidA is not available\n"); + return NULL; + } + OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token); + GetTokenInformation(token, TokenUser, NULL, size, &size); + + user = HeapAlloc(GetProcessHeap(), 0, size); + GetTokenInformation(token, TokenUser, user, size, &size); + pConvertSidToStringSidA(user->User.Sid, &usersid); + HeapFree(GetProcessHeap(), 0, user); + + CloseHandle(token); + return usersid; +} + +static BOOL CDECL get_temp_file(char *pszTempName, int cbTempName, void *pv) +{ + LPSTR tempname; + + tempname = HeapAlloc(GetProcessHeap(), 0, MAX_PATH); + GetTempFileNameA(".", "xx", 0, tempname); + + if (tempname && (strlen(tempname) < (unsigned)cbTempName)) + { + lstrcpyA(pszTempName, tempname); + HeapFree(GetProcessHeap(), 0, tempname); + return TRUE; + } + + HeapFree(GetProcessHeap(), 0, tempname); + + return FALSE; +} + +static INT_PTR CDECL get_open_info(char *pszName, USHORT *pdate, USHORT *ptime, + USHORT *pattribs, int *err, void *pv) +{ + BY_HANDLE_FILE_INFORMATION finfo; + FILETIME filetime; + HANDLE handle; + DWORD attrs; + BOOL res; + + handle = CreateFile(pszName, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); + + ok(handle != INVALID_HANDLE_VALUE, "Failed to CreateFile %s\n", pszName); + + res = GetFileInformationByHandle(handle, &finfo); + ok(res, "Expected GetFileInformationByHandle to succeed\n"); + + FileTimeToLocalFileTime(&finfo.ftLastWriteTime, &filetime); + FileTimeToDosDateTime(&filetime, pdate, ptime); + + attrs = GetFileAttributes(pszName); + ok(attrs != INVALID_FILE_ATTRIBUTES, "Failed to GetFileAttributes\n"); + + return (INT_PTR)handle; +} + +static BOOL add_file(HFCI hfci, const char *file, TCOMP compress) +{ + char path[MAX_PATH]; + char filename[MAX_PATH]; + + lstrcpyA(path, CURR_DIR); + lstrcatA(path, "\\"); + lstrcatA(path, file); + + lstrcpyA(filename, file); + + return FCIAddFile(hfci, path, filename, FALSE, get_next_cabinet, + progress, get_open_info, compress); +} + +static void set_cab_parameters(PCCAB pCabParams, const CHAR *name, DWORD max_size) +{ + ZeroMemory(pCabParams, sizeof(CCAB)); + + pCabParams->cb = max_size; + pCabParams->cbFolderThresh = FOLDER_THRESHOLD; + pCabParams->setID = 0xbeef; + pCabParams->iCab = 1; + lstrcpyA(pCabParams->szCabPath, CURR_DIR); + lstrcatA(pCabParams->szCabPath, "\\"); + lstrcpyA(pCabParams->szCab, name); +} + +static void create_cab_file(const CHAR *name, DWORD max_size, const CHAR *files) +{ + CCAB cabParams; + LPCSTR ptr; + HFCI hfci; + ERF erf; + BOOL res; + + set_cab_parameters(&cabParams, name, max_size); + + hfci = FCICreate(&erf, file_placed, mem_alloc, mem_free, fci_open, + fci_read, fci_write, fci_close, fci_seek, fci_delete, + get_temp_file, &cabParams, NULL); + + ok(hfci != NULL, "Failed to create an FCI context\n"); + + ptr = files; + while (*ptr) + { + res = add_file(hfci, ptr, tcompTYPE_MSZIP); + ok(res, "Failed to add file: %s\n", ptr); + ptr += lstrlen(ptr) + 1; + } + + res = FCIFlushCabinet(hfci, FALSE, get_next_cabinet, progress); + ok(res, "Failed to flush the cabinet\n"); + + res = FCIDestroy(hfci); + ok(res, "Failed to destroy the cabinet\n"); +} + +static BOOL get_user_dirs(void) +{ + HKEY hkey; + DWORD type, size; + + if (RegOpenKey(HKEY_CURRENT_USER, + "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders", &hkey)) + return FALSE; + + size = MAX_PATH; + if (RegQueryValueExA(hkey, "AppData", 0, &type, (LPBYTE)APP_DATA_DIR, &size)) + { + RegCloseKey(hkey); + return FALSE; + } + + RegCloseKey(hkey); + return TRUE; +} + +static BOOL get_system_dirs(void) +{ + HKEY hkey; + DWORD type, size; + + if (RegOpenKey(HKEY_LOCAL_MACHINE, + "Software\\Microsoft\\Windows\\CurrentVersion", &hkey)) + return FALSE; + + size = MAX_PATH; + if (RegQueryValueExA(hkey, "ProgramFilesDir (x86)", 0, &type, (LPBYTE)PROG_FILES_DIR, &size) && + RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR, &size)) + { + RegCloseKey(hkey); + return FALSE; + } + + size = MAX_PATH; + if (RegQueryValueExA(hkey, "CommonFilesDir (x86)", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size) && + RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size)) + { + RegCloseKey(hkey); + return FALSE; + } + + RegCloseKey(hkey); + + if (!GetWindowsDirectoryA(WINDOWS_DIR, MAX_PATH)) + return FALSE; + + return TRUE; +} + +static void create_file_data(LPCSTR name, LPCSTR data, DWORD size) +{ + HANDLE file; + DWORD written; + + file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + if (file == INVALID_HANDLE_VALUE) + return; + + WriteFile(file, data, strlen(data), &written, NULL); + + if (size) + { + SetFilePointer(file, size, NULL, FILE_BEGIN); + SetEndOfFile(file); + } + + CloseHandle(file); +} + +#define create_file(name, size) create_file_data(name, name, size) + +static void create_test_files(void) +{ + CreateDirectoryA("msitest", NULL); + create_file("msitest\\one.txt", 100); + CreateDirectoryA("msitest\\first", NULL); + create_file("msitest\\first\\two.txt", 100); + CreateDirectoryA("msitest\\second", NULL); + create_file("msitest\\second\\three.txt", 100); + + create_file("four.txt", 100); + create_file("five.txt", 100); + create_cab_file("msitest.cab", MEDIA_SIZE, "four.txt\0five.txt\0"); + + create_file("msitest\\filename", 100); + create_file("msitest\\service.exe", 100); + + DeleteFileA("four.txt"); + DeleteFileA("five.txt"); +} + +static BOOL delete_pf(const CHAR *rel_path, BOOL is_file) +{ + CHAR path[MAX_PATH]; + + lstrcpyA(path, PROG_FILES_DIR); + lstrcatA(path, "\\"); + lstrcatA(path, rel_path); + + if (is_file) + return DeleteFileA(path); + else + return RemoveDirectoryA(path); +} + +static void delete_test_files(void) +{ + DeleteFileA("msitest.msi"); + DeleteFileA("msitest.cab"); + DeleteFileA("msitest\\second\\three.txt"); + DeleteFileA("msitest\\first\\two.txt"); + DeleteFileA("msitest\\one.txt"); + DeleteFileA("msitest\\service.exe"); + DeleteFileA("msitest\\filename"); + RemoveDirectoryA("msitest\\second"); + RemoveDirectoryA("msitest\\first"); + RemoveDirectoryA("msitest"); +} + +static void write_file(const CHAR *filename, const char *data, int data_size) +{ + DWORD size; + HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + WriteFile(hf, data, data_size, &size, NULL); + CloseHandle(hf); +} + +static void write_msi_summary_info(MSIHANDLE db, INT version, INT wordcount, const char *template) +{ + MSIHANDLE summary; + UINT r; + + r = MsiGetSummaryInformationA(db, NULL, 5, &summary); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, template); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL, + "{004757CA-5092-49c2-AD20-28E1CE0DF5F2}"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, version, NULL, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, wordcount, NULL, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiSummaryInfoSetPropertyA(summary, PID_TITLE, VT_LPSTR, 0, NULL, "MSITEST"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + /* write the summary changes back to the stream */ + r = MsiSummaryInfoPersist(summary); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + MsiCloseHandle(summary); +} + +#define create_database(name, tables, num_tables) \ + create_database_wordcount(name, tables, num_tables, 100, 0, ";1033"); + +#define create_database_template(name, tables, num_tables, version, template) \ + create_database_wordcount(name, tables, num_tables, version, 0, template); + +static void create_database_wordcount(const CHAR *name, const msi_table *tables, + int num_tables, INT version, INT wordcount, + const char *template) +{ + MSIHANDLE db; + UINT r; + int j; + + r = MsiOpenDatabaseA(name, MSIDBOPEN_CREATE, &db); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + /* import the tables into the database */ + for (j = 0; j < num_tables; j++) + { + const msi_table *table = &tables[j]; + + write_file(table->filename, table->data, (table->size - 1) * sizeof(char)); + + r = MsiDatabaseImportA(db, CURR_DIR, table->filename); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + DeleteFileA(table->filename); + } + + write_msi_summary_info(db, version, wordcount, template); + + r = MsiDatabaseCommit(db); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + MsiCloseHandle(db); +} + +static BOOL notify_system_change(DWORD event_type, STATEMGRSTATUS *status) +{ + RESTOREPOINTINFOA spec; + + spec.dwEventType = event_type; + spec.dwRestorePtType = APPLICATION_INSTALL; + spec.llSequenceNumber = status->llSequenceNumber; + lstrcpyA(spec.szDescription, "msitest restore point"); + + return pSRSetRestorePointA(&spec, status); +} + +static void remove_restore_point(DWORD seq_number) +{ + DWORD res; + + res = pSRRemoveRestorePoint(seq_number); + if (res != ERROR_SUCCESS) + trace("Failed to remove the restore point : %08x\n", res); +} + +static LONG delete_key( HKEY key, LPCSTR subkey, REGSAM access ) +{ + if (pRegDeleteKeyExA) + return pRegDeleteKeyExA( key, subkey, access, 0 ); + return RegDeleteKeyA( key, subkey ); +} + +static BOOL file_exists(LPCSTR file) +{ + return GetFileAttributes(file) != INVALID_FILE_ATTRIBUTES; +} + +static BOOL pf_exists(LPCSTR file) +{ + CHAR path[MAX_PATH]; + + lstrcpyA(path, PROG_FILES_DIR); + lstrcatA(path, "\\"); + lstrcatA(path, file); + + return file_exists(path); +} + +static void delete_pfmsitest_files(void) +{ + SHFILEOPSTRUCT shfl; + CHAR path[MAX_PATH+11]; + + lstrcpyA(path, PROG_FILES_DIR); + lstrcatA(path, "\\msitest\\*"); + path[strlen(path) + 1] = '\0'; + + shfl.hwnd = NULL; + shfl.wFunc = FO_DELETE; + shfl.pFrom = path; + shfl.pTo = NULL; + shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT | FOF_NOERRORUI; + + SHFileOperation(&shfl); + + lstrcpyA(path, PROG_FILES_DIR); + lstrcatA(path, "\\msitest"); + RemoveDirectoryA(path); +} + +static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase, DWORD line) +{ + char val[MAX_PATH]; + DWORD size, type; + LONG res; + + size = MAX_PATH; + val[0] = '\0'; + res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)val, &size); + + if (res != ERROR_SUCCESS || + (type != REG_SZ && type != REG_EXPAND_SZ && type != REG_MULTI_SZ)) + { + ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n"); + return; + } + + if (!expected) + ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val); + else + { + if (bcase) + ok_(__FILE__, line)(!lstrcmpA(val, expected), "Expected %s, got %s\n", expected, val); + else + ok_(__FILE__, line)(!lstrcmpiA(val, expected), "Expected %s, got %s\n", expected, val); + } +} + +static void check_reg_dword(HKEY prodkey, LPCSTR name, DWORD expected, DWORD line) +{ + DWORD val, size, type; + LONG res; + + size = sizeof(DWORD); + res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size); + + if (res != ERROR_SUCCESS || type != REG_DWORD) + { + ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n"); + return; + } + + ok_(__FILE__, line)(val == expected, "Expected %d, got %d\n", expected, val); +} + +static void check_reg_dword4(HKEY prodkey, LPCSTR name, DWORD expected1, DWORD expected2, DWORD expected3, + DWORD expected4, DWORD line) +{ + DWORD val, size, type; + LONG res; + + size = sizeof(DWORD); + res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size); + + if (res != ERROR_SUCCESS || type != REG_DWORD) + { + ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n"); + return; + } + + ok_(__FILE__, line)(val == expected1 || val == expected2 || val == expected3 || val == expected4, + "Expected %d, %d, %d or %d, got %d\n", expected1, expected2, expected3, expected4, val); +} + +static void check_reg_dword5(HKEY prodkey, LPCSTR name, DWORD expected1, DWORD expected2, DWORD expected3, + DWORD expected4, DWORD expected5, DWORD line) +{ + DWORD val, size, type; + LONG res; + + size = sizeof(DWORD); + res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size); + + if (res != ERROR_SUCCESS || type != REG_DWORD) + { + ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n"); + return; + } + + ok_(__FILE__, line)(val == expected1 || val == expected2 || val == expected3 || val == expected4 || + val == expected5, + "Expected %d, %d, %d, %d or %d, got %d\n", expected1, expected2, expected3, expected4, expected5, val); +} + +#define CHECK_REG_STR(prodkey, name, expected) \ + check_reg_str(prodkey, name, expected, TRUE, __LINE__); + +#define CHECK_DEL_REG_STR(prodkey, name, expected) \ + check_reg_str(prodkey, name, expected, TRUE, __LINE__); \ + RegDeleteValueA(prodkey, name); + +#define CHECK_REG_ISTR(prodkey, name, expected) \ + check_reg_str(prodkey, name, expected, FALSE, __LINE__); + +#define CHECK_DEL_REG_ISTR(prodkey, name, expected) \ + check_reg_str(prodkey, name, expected, FALSE, __LINE__); \ + RegDeleteValueA(prodkey, name); + +#define CHECK_REG_DWORD(prodkey, name, expected) \ + check_reg_dword(prodkey, name, expected, __LINE__); + +#define CHECK_DEL_REG_DWORD(prodkey, name, expected) \ + check_reg_dword(prodkey, name, expected, __LINE__); \ + RegDeleteValueA(prodkey, name); + +#define CHECK_REG_DWORD2(prodkey, name, expected1, expected2) \ + check_reg_dword2(prodkey, name, expected1, expected2, __LINE__); + +#define CHECK_DEL_REG_DWORD2(prodkey, name, expected1, expected2) \ + check_reg_dword2(prodkey, name, expected1, expected2, __LINE__); \ + RegDeleteValueA(prodkey, name); + +#define CHECK_REG_DWORD4(prodkey, name, expected1, expected2, expected3, expected4) \ + check_reg_dword4(prodkey, name, expected1, expected2, expected3, expected4, __LINE__); + +#define CHECK_DEL_REG_DWORD5(prodkey, name, expected1, expected2, expected3, expected4 ,expected5) \ + check_reg_dword5(prodkey, name, expected1, expected2, expected3, expected4, expected5, __LINE__); \ + RegDeleteValueA(prodkey, name); + +static void get_date_str(LPSTR date) +{ + SYSTEMTIME systime; + + static const char date_fmt[] = "%d%02d%02d"; + GetLocalTime(&systime); + sprintf(date, date_fmt, systime.wYear, systime.wMonth, systime.wDay); +} + +static void test_register_product(void) +{ + UINT r; + LONG res; + HKEY hkey, props, usage; + LPSTR usersid; + char date[MAX_PATH], temp[MAX_PATH], keypath[MAX_PATH], path[MAX_PATH]; + DWORD size, type; + REGSAM access = KEY_ALL_ACCESS; + + static const CHAR uninstall[] = "Software\\Microsoft\\Windows\\CurrentVersion" + "\\Uninstall\\{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"; + static const CHAR uninstall_32node[] = "Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion" + "\\Uninstall\\{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"; + static const CHAR userdata[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer" + "\\UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB"; + static const CHAR ugkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer" + "\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2"; + static const CHAR userugkey[] = "Software\\Microsoft\\Installer\\UpgradeCodes" + "\\51AAE0C44620A5E4788506E91F249BD2"; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + if (!(usersid = get_user_sid())) + return; + + get_date_str(date); + GetTempPath(MAX_PATH, temp); + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\maximus", 500); + + create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); + + if (is_wow64) + access |= KEY_WOW64_64KEY; + + MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); + + /* RegisterProduct */ + r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + res = RegOpenKeyA(HKEY_CURRENT_USER, userugkey, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + if (is_64bit) + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall_32node, 0, KEY_ALL_ACCESS, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + else + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_ALL_ACCESS, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST"); + CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1"); + CHECK_DEL_REG_STR(hkey, "InstallDate", date); + CHECK_DEL_REG_STR(hkey, "InstallSource", temp); + CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_DEL_REG_STR(hkey, "Publisher", "Wine"); + CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", NULL); + CHECK_DEL_REG_STR(hkey, "Comments", NULL); + CHECK_DEL_REG_STR(hkey, "Contact", NULL); + CHECK_DEL_REG_STR(hkey, "HelpLink", NULL); + CHECK_DEL_REG_STR(hkey, "HelpTelephone", NULL); + CHECK_DEL_REG_STR(hkey, "InstallLocation", NULL); + CHECK_DEL_REG_STR(hkey, "Readme", NULL); + CHECK_DEL_REG_STR(hkey, "Size", NULL); + CHECK_DEL_REG_STR(hkey, "URLInfoAbout", NULL); + CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", NULL); + CHECK_DEL_REG_DWORD(hkey, "Language", 1033); + CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001); + CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1); + CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1); + CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1); + todo_wine + { + CHECK_DEL_REG_DWORD5(hkey, "EstimatedSize", 12, -12, 4, 10, 24); + } + + delete_key(hkey, "", access); + RegCloseKey(hkey); + + sprintf(keypath, userdata, usersid); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + res = RegOpenKeyExA(hkey, "InstallProperties", 0, access, &props); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + size = sizeof(path); + RegQueryValueExA(props, "LocalPackage", NULL, &type, (LPBYTE)path, &size); + DeleteFileA(path); + RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */ + + CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST"); + CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1"); + CHECK_DEL_REG_STR(props, "InstallDate", date); + CHECK_DEL_REG_STR(props, "InstallSource", temp); + CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_DEL_REG_STR(props, "Publisher", "Wine"); + CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", NULL); + CHECK_DEL_REG_STR(props, "Comments", NULL); + CHECK_DEL_REG_STR(props, "Contact", NULL); + CHECK_DEL_REG_STR(props, "HelpLink", NULL); + CHECK_DEL_REG_STR(props, "HelpTelephone", NULL); + CHECK_DEL_REG_STR(props, "InstallLocation", NULL); + CHECK_DEL_REG_STR(props, "Readme", NULL); + CHECK_DEL_REG_STR(props, "Size", NULL); + CHECK_DEL_REG_STR(props, "URLInfoAbout", NULL); + CHECK_DEL_REG_STR(props, "URLUpdateInfo", NULL); + CHECK_DEL_REG_DWORD(props, "Language", 1033); + CHECK_DEL_REG_DWORD(props, "Version", 0x1010001); + CHECK_DEL_REG_DWORD(props, "VersionMajor", 1); + CHECK_DEL_REG_DWORD(props, "VersionMinor", 1); + CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1); + todo_wine + { + CHECK_DEL_REG_DWORD5(props, "EstimatedSize", 12, -12, 4, 10, 24); + } + + delete_key(props, "", access); + RegCloseKey(props); + + res = RegOpenKeyExA(hkey, "Usage", 0, access, &usage); + todo_wine + { + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + delete_key(usage, "", access); + RegCloseKey(usage); + delete_key(hkey, "", access); + RegCloseKey(hkey); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, ugkey, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL); + + delete_key(hkey, "", access); + RegCloseKey(hkey); + + /* RegisterProduct, machine */ + r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 ALLUSERS=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, userugkey, 0, access, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + if (is_64bit) + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall_32node, 0, KEY_ALL_ACCESS, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + else + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, uninstall, 0, KEY_ALL_ACCESS, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST"); + CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1"); + CHECK_DEL_REG_STR(hkey, "InstallDate", date); + CHECK_DEL_REG_STR(hkey, "InstallSource", temp); + CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_DEL_REG_STR(hkey, "Publisher", "Wine"); + CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", NULL); + CHECK_DEL_REG_STR(hkey, "Comments", NULL); + CHECK_DEL_REG_STR(hkey, "Contact", NULL); + CHECK_DEL_REG_STR(hkey, "HelpLink", NULL); + CHECK_DEL_REG_STR(hkey, "HelpTelephone", NULL); + CHECK_DEL_REG_STR(hkey, "InstallLocation", NULL); + CHECK_DEL_REG_STR(hkey, "Readme", NULL); + CHECK_DEL_REG_STR(hkey, "Size", NULL); + CHECK_DEL_REG_STR(hkey, "URLInfoAbout", NULL); + CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", NULL); + CHECK_DEL_REG_DWORD(hkey, "Language", 1033); + CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001); + CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1); + CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1); + CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1); + todo_wine + { + CHECK_DEL_REG_DWORD5(hkey, "EstimatedSize", 12, -12, 4, 10, 24); + } + + delete_key(hkey, "", access); + RegCloseKey(hkey); + + sprintf(keypath, userdata, "S-1-5-18"); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + res = RegOpenKeyExA(hkey, "InstallProperties", 0, access, &props); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + size = sizeof(path); + RegQueryValueExA(props, "LocalPackage", NULL, &type, (LPBYTE)path, &size); + DeleteFileA(path); + RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */ + + CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST"); + CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1"); + CHECK_DEL_REG_STR(props, "InstallDate", date); + CHECK_DEL_REG_STR(props, "InstallSource", temp); + CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_DEL_REG_STR(props, "Publisher", "Wine"); + CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", NULL); + CHECK_DEL_REG_STR(props, "Comments", NULL); + CHECK_DEL_REG_STR(props, "Contact", NULL); + CHECK_DEL_REG_STR(props, "HelpLink", NULL); + CHECK_DEL_REG_STR(props, "HelpTelephone", NULL); + CHECK_DEL_REG_STR(props, "InstallLocation", NULL); + CHECK_DEL_REG_STR(props, "Readme", NULL); + CHECK_DEL_REG_STR(props, "Size", NULL); + CHECK_DEL_REG_STR(props, "URLInfoAbout", NULL); + CHECK_DEL_REG_STR(props, "URLUpdateInfo", NULL); + CHECK_DEL_REG_DWORD(props, "Language", 1033); + CHECK_DEL_REG_DWORD(props, "Version", 0x1010001); + CHECK_DEL_REG_DWORD(props, "VersionMajor", 1); + CHECK_DEL_REG_DWORD(props, "VersionMinor", 1); + CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1); + todo_wine + { + CHECK_DEL_REG_DWORD5(props, "EstimatedSize", 12, -12, 4, 10, 24); + } + + delete_key(props, "", access); + RegCloseKey(props); + + res = RegOpenKeyExA(hkey, "Usage", 0, access, &usage); + todo_wine + { + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + delete_key(usage, "", access); + RegCloseKey(usage); + delete_key(hkey, "", access); + RegCloseKey(hkey); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, ugkey, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL); + + delete_key(hkey, "", access); + RegCloseKey(hkey); + +error: + DeleteFile(msifile); + DeleteFile("msitest\\maximus"); + RemoveDirectory("msitest"); + HeapFree(GetProcessHeap(), 0, usersid); +} + +static void test_publish_product(void) +{ + UINT r; + LONG res; + LPSTR usersid; + HKEY sourcelist, net, props; + HKEY hkey, patches, media; + CHAR keypath[MAX_PATH]; + CHAR temp[MAX_PATH]; + CHAR path[MAX_PATH]; + BOOL old_installer = FALSE; + REGSAM access = KEY_ALL_ACCESS; + + static const CHAR prodpath[] = "Software\\Microsoft\\Windows\\CurrentVersion" + "\\Installer\\UserData\\%s\\Products" + "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; + static const CHAR cuprodpath[] = "Software\\Microsoft\\Installer\\Products" + "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; + static const CHAR cuupgrades[] = "Software\\Microsoft\\Installer\\UpgradeCodes" + "\\51AAE0C44620A5E4788506E91F249BD2"; + static const CHAR badprod[] = "Software\\Microsoft\\Windows\\CurrentVersion" + "\\Installer\\Products" + "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; + static const CHAR machprod[] = "Software\\Classes\\Installer\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB"; + static const CHAR machup[] = "Software\\Classes\\Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2"; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + if (!(usersid = get_user_sid())) + return; + + GetTempPath(MAX_PATH, temp); + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\maximus", 500); + + create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); + + if (is_wow64) + access |= KEY_WOW64_64KEY; + + MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); + + /* PublishProduct, current user */ + r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, badprod, 0, access, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + sprintf(keypath, prodpath, usersid); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey); + if (res == ERROR_FILE_NOT_FOUND) + { + res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey); + if (res == ERROR_SUCCESS) + { + win_skip("Windows Installer < 3.0 detected\n"); + RegCloseKey(hkey); + old_installer = TRUE; + goto currentuser; + } + else + { + win_skip("Install failed, no need to continue\n"); + return; + } + } + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + res = RegOpenKeyExA(hkey, "InstallProperties", 0, access, &props); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegOpenKeyExA(hkey, "Patches", 0, access, &patches); + todo_wine + { + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + CHECK_DEL_REG_STR(patches, "AllPatches", NULL); + } + + delete_key(patches, "", access); + RegCloseKey(patches); + delete_key(hkey, "", access); + RegCloseKey(hkey); + +currentuser: + res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_DEL_REG_STR(hkey, "ProductName", "MSITEST"); + CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052c94DA02821EECD05F2F"); + CHECK_DEL_REG_DWORD(hkey, "Language", 1033); + CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001); + if (!old_installer) + CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0); + CHECK_DEL_REG_DWORD(hkey, "Assignment", 0); + CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184); + CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0); + CHECK_DEL_REG_STR(hkey, "Clients", ":"); + + res = RegOpenKeyA(hkey, "SourceList", &sourcelist); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + lstrcpyA(path, "n;1;"); + lstrcatA(path, temp); + CHECK_DEL_REG_STR(sourcelist, "LastUsedSource", path); + CHECK_DEL_REG_STR(sourcelist, "PackageName", "msitest.msi"); + + res = RegOpenKeyA(sourcelist, "Net", &net); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_DEL_REG_STR(net, "1", temp); + + RegDeleteKeyA(net, ""); + RegCloseKey(net); + + res = RegOpenKeyA(sourcelist, "Media", &media); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_DEL_REG_STR(media, "1", "DISK1;"); + + RegDeleteKeyA(media, ""); + RegCloseKey(media); + RegDeleteKeyA(sourcelist, ""); + RegCloseKey(sourcelist); + RegDeleteKeyA(hkey, ""); + RegCloseKey(hkey); + + res = RegOpenKeyA(HKEY_CURRENT_USER, cuupgrades, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL); + + RegDeleteKeyA(hkey, ""); + RegCloseKey(hkey); + + /* PublishProduct, machine */ + r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 ALLUSERS=1"); + if (old_installer) + goto machprod; + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, badprod, 0, access, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + sprintf(keypath, prodpath, "S-1-5-18"); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + res = RegOpenKeyExA(hkey, "InstallProperties", 0, access, &props); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegOpenKeyExA(hkey, "Patches", 0, access, &patches); + todo_wine + { + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + CHECK_DEL_REG_STR(patches, "AllPatches", NULL); + } + + delete_key(patches, "", access); + RegCloseKey(patches); + delete_key(hkey, "", access); + RegCloseKey(hkey); + +machprod: + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, machprod, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_DEL_REG_STR(hkey, "ProductName", "MSITEST"); + CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052c94DA02821EECD05F2F"); + CHECK_DEL_REG_DWORD(hkey, "Language", 1033); + CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001); + if (!old_installer) + CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0); + todo_wine CHECK_DEL_REG_DWORD(hkey, "Assignment", 1); + CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184); + CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0); + CHECK_DEL_REG_STR(hkey, "Clients", ":"); + + res = RegOpenKeyExA(hkey, "SourceList", 0, access, &sourcelist); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + lstrcpyA(path, "n;1;"); + lstrcatA(path, temp); + CHECK_DEL_REG_STR(sourcelist, "LastUsedSource", path); + CHECK_DEL_REG_STR(sourcelist, "PackageName", "msitest.msi"); + + res = RegOpenKeyExA(sourcelist, "Net", 0, access, &net); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_DEL_REG_STR(net, "1", temp); + + res = delete_key(net, "", access); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegCloseKey(net); + + res = RegOpenKeyExA(sourcelist, "Media", 0, access, &media); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_DEL_REG_STR(media, "1", "DISK1;"); + + res = delete_key(media, "", access); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegCloseKey(media); + res = delete_key(sourcelist, "", access); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegCloseKey(sourcelist); + res = delete_key(hkey, "", access); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegCloseKey(hkey); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, machup, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL); + + res = delete_key(hkey, "", access); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegCloseKey(hkey); + +error: + DeleteFile(msifile); + DeleteFile("msitest\\maximus"); + RemoveDirectory("msitest"); + HeapFree(GetProcessHeap(), 0, usersid); +} + +static void test_publish_features(void) +{ + UINT r; + LONG res; + HKEY hkey; + LPSTR usersid; + CHAR keypath[MAX_PATH]; + REGSAM access = KEY_ALL_ACCESS; + + static const CHAR cupath[] = "Software\\Microsoft\\Installer\\Features" + "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; + static const CHAR udfeatpath[] = "Software\\Microsoft\\Windows\\CurrentVersion" + "\\Installer\\UserData\\%s\\Products" + "\\84A88FD7F6998CE40A22FB59F6B9C2BB\\Features"; + static const CHAR udpridpath[] = "Software\\Microsoft\\Windows\\CurrentVersion" + "\\Installer\\UserData\\%s\\Products" + "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; + static const CHAR featkey[] = "Software\\Microsoft\\Windows\\CurrentVersion" + "\\Installer\\Features"; + static const CHAR classfeat[] = "Software\\Classes\\Installer\\Features" + "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + if (!(usersid = get_user_sid())) + return; + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\maximus", 500); + + create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); + + if (is_wow64) + access |= KEY_WOW64_64KEY; + + MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); + + /* PublishFeatures, current user */ + r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, featkey, 0, access, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, classfeat, 0, access, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_REG_STR(hkey, "feature", ""); + CHECK_REG_STR(hkey, "montecristo", ""); + + RegDeleteValueA(hkey, "feature"); + RegDeleteValueA(hkey, "montecristo"); + delete_key(hkey, "", access); + RegCloseKey(hkey); + + sprintf(keypath, udfeatpath, usersid); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE"); + CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE"); + + RegDeleteValueA(hkey, "feature"); + RegDeleteValueA(hkey, "montecristo"); + delete_key(hkey, "", access); + RegCloseKey(hkey); + sprintf(keypath, udpridpath, usersid); + delete_key(HKEY_LOCAL_MACHINE, keypath, access); + + /* PublishFeatures, machine */ + r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1 ALLUSERS=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, featkey, 0, access, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, classfeat, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_REG_STR(hkey, "feature", ""); + CHECK_REG_STR(hkey, "montecristo", ""); + + RegDeleteValueA(hkey, "feature"); + RegDeleteValueA(hkey, "montecristo"); + delete_key(hkey, "", access); + RegCloseKey(hkey); + + sprintf(keypath, udfeatpath, "S-1-5-18"); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE"); + CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE"); + + RegDeleteValueA(hkey, "feature"); + RegDeleteValueA(hkey, "montecristo"); + delete_key(hkey, "", access); + RegCloseKey(hkey); + sprintf(keypath, udpridpath, "S-1-5-18"); + delete_key(HKEY_LOCAL_MACHINE, keypath, access); + +error: + DeleteFile(msifile); + DeleteFile("msitest\\maximus"); + RemoveDirectory("msitest"); + HeapFree(GetProcessHeap(), 0, usersid); +} + +static LPSTR reg_get_val_str(HKEY hkey, LPCSTR name) +{ + DWORD len = 0; + LPSTR val; + LONG r; + + r = RegQueryValueExA(hkey, name, NULL, NULL, NULL, &len); + if (r != ERROR_SUCCESS) + return NULL; + + len += sizeof (WCHAR); + val = HeapAlloc(GetProcessHeap(), 0, len); + if (!val) return NULL; + val[0] = 0; + RegQueryValueExA(hkey, name, NULL, NULL, (LPBYTE)val, &len); + return val; +} + +static void get_owner_company(LPSTR *owner, LPSTR *company) +{ + LONG res; + HKEY hkey; + REGSAM access = KEY_ALL_ACCESS; + + *owner = *company = NULL; + + if (is_wow64) + access |= KEY_WOW64_64KEY; + + res = RegOpenKeyA(HKEY_CURRENT_USER, + "Software\\Microsoft\\MS Setup (ACME)\\User Info", &hkey); + if (res == ERROR_SUCCESS) + { + *owner = reg_get_val_str(hkey, "DefName"); + *company = reg_get_val_str(hkey, "DefCompany"); + RegCloseKey(hkey); + } + + if (!*owner || !*company) + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "Software\\Microsoft\\Windows\\CurrentVersion", 0, access, &hkey); + if (res == ERROR_SUCCESS) + { + *owner = reg_get_val_str(hkey, "RegisteredOwner"); + *company = reg_get_val_str(hkey, "RegisteredOrganization"); + RegCloseKey(hkey); + } + } + + if (!*owner || !*company) + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, + "Software\\Microsoft\\Windows NT\\CurrentVersion", 0, access, &hkey); + if (res == ERROR_SUCCESS) + { + *owner = reg_get_val_str(hkey, "RegisteredOwner"); + *company = reg_get_val_str(hkey, "RegisteredOrganization"); + RegCloseKey(hkey); + } + } +} + +static void test_register_user(void) +{ + UINT r; + LONG res; + HKEY props; + LPSTR usersid; + LPSTR owner, company; + CHAR keypath[MAX_PATH]; + REGSAM access = KEY_ALL_ACCESS; + + static const CHAR keypropsfmt[] = + "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\" + "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties"; + static const CHAR keypridfmt[] = + "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\" + "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB"; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + if (!(usersid = get_user_sid())) + return; + + get_owner_company(&owner, &company); + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\maximus", 500); + + create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); + + if (is_wow64) + access |= KEY_WOW64_64KEY; + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + /* RegisterUser, per-user */ + r = MsiInstallProductA(msifile, "REGISTER_USER=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + sprintf(keypath, keypropsfmt, usersid); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &props); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_REG_STR(props, "ProductID", "none"); + CHECK_REG_STR(props, "RegCompany", company); + CHECK_REG_STR(props, "RegOwner", owner); + + RegDeleteValueA(props, "ProductID"); + RegDeleteValueA(props, "RegCompany"); + RegDeleteValueA(props, "RegOwner"); + delete_key(props, "", access); + RegCloseKey(props); + sprintf(keypath, keypridfmt, usersid); + delete_key(HKEY_LOCAL_MACHINE, keypath, access); + + /* RegisterUser, machine */ + r = MsiInstallProductA(msifile, "REGISTER_USER=1 ALLUSERS=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + sprintf(keypath, keypropsfmt, "S-1-5-18"); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &props); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + CHECK_REG_STR(props, "ProductID", "none"); + CHECK_REG_STR(props, "RegCompany", company); + CHECK_REG_STR(props, "RegOwner", owner); + + RegDeleteValueA(props, "ProductID"); + RegDeleteValueA(props, "RegCompany"); + RegDeleteValueA(props, "RegOwner"); + delete_key(props, "", access); + RegCloseKey(props); + sprintf(keypath, keypridfmt, "S-1-5-18"); + delete_key(HKEY_LOCAL_MACHINE, keypath, access); + +error: + HeapFree(GetProcessHeap(), 0, company); + HeapFree(GetProcessHeap(), 0, owner); + + DeleteFile(msifile); + DeleteFile("msitest\\maximus"); + RemoveDirectory("msitest"); + LocalFree(usersid); +} + +static void test_process_components(void) +{ + UINT r; + LONG res; + DWORD size; + HKEY comp, hkey; + LPSTR usersid; + CHAR val[MAX_PATH]; + CHAR keypath[MAX_PATH]; + CHAR program_files_maximus[MAX_PATH]; + REGSAM access = KEY_ALL_ACCESS; + + static const CHAR keyfmt[] = + "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\" + "UserData\\%s\\Components\\%s"; + static const CHAR compkey[] = + "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Components"; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + if (!(usersid = get_user_sid())) + return; + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\maximus", 500); + + create_database(msifile, ppc_tables, sizeof(ppc_tables) / sizeof(msi_table)); + + if (is_wow64) + access |= KEY_WOW64_64KEY; + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + /* ProcessComponents, per-user */ + r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + sprintf(keypath, keyfmt, usersid, "CBABC2FDCCB35E749A8944D8C1C098B5"); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + size = MAX_PATH; + res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB", + NULL, NULL, (LPBYTE)val, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + lstrcpyA(program_files_maximus,PROG_FILES_DIR); + lstrcatA(program_files_maximus,"\\msitest\\maximus"); + + ok(!lstrcmpiA(val, program_files_maximus), + "Expected \"%s\", got \"%s\"\n", program_files_maximus, val); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB"); + delete_key(comp, "", access); + RegCloseKey(comp); + + sprintf(keypath, keyfmt, usersid, "241C3DA58FECD0945B9687D408766058"); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + size = MAX_PATH; + res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB", + NULL, NULL, (LPBYTE)val, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(!lstrcmpA(val, "01\\msitest\\augustus"), + "Expected \"01\\msitest\\augustus\", got \"%s\"\n", val); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB"); + delete_key(comp, "", access); + RegCloseKey(comp); + + /* ProcessComponents, machine */ + r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1 ALLUSERS=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + sprintf(keypath, keyfmt, "S-1-5-18", "CBABC2FDCCB35E749A8944D8C1C098B5"); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + size = MAX_PATH; + res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB", + NULL, NULL, (LPBYTE)val, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(!lstrcmpiA(val, program_files_maximus), + "Expected \"%s\", got \"%s\"\n", program_files_maximus, val); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB"); + delete_key(comp, "", access); + RegCloseKey(comp); + + sprintf(keypath, keyfmt, "S-1-5-18", "241C3DA58FECD0945B9687D408766058"); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &comp); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + size = MAX_PATH; + res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB", + NULL, NULL, (LPBYTE)val, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(!lstrcmpA(val, "01\\msitest\\augustus"), + "Expected \"01\\msitest\\augustus\", got \"%s\"\n", val); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, compkey, 0, access, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB"); + delete_key(comp, "", access); + RegCloseKey(comp); + +error: + DeleteFile(msifile); + DeleteFile("msitest\\maximus"); + RemoveDirectory("msitest"); + LocalFree(usersid); +} + +static void test_publish(void) +{ + UINT r; + LONG res; + HKEY uninstall, prodkey, uninstall_32node = NULL; + INSTALLSTATE state; + CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"; + char date[MAX_PATH], temp[MAX_PATH]; + REGSAM access = KEY_ALL_ACCESS; + + static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; + static const CHAR subkey_32node[] = "Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; + + if (!pMsiQueryComponentStateA) + { + win_skip("MsiQueryComponentStateA is not available\n"); + return; + } + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + get_date_str(date); + GetTempPath(MAX_PATH, temp); + + if (is_wow64) + access |= KEY_WOW64_64KEY; + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, subkey, 0, KEY_ALL_ACCESS, &uninstall); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + if (is_64bit) + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, subkey_32node, 0, KEY_ALL_ACCESS, &uninstall_32node); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\maximus", 500); + + create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + /* nothing published */ + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + /* PublishProduct and RegisterProduct */ + r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 PUBLISH_PRODUCT=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + if (is_64bit) + { + res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + else + { + res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey); + if (is_wow64 && res == ERROR_FILE_NOT_FOUND) /* XP - Vista, Wow64 */ + res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); + CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); + CHECK_REG_STR(prodkey, "InstallDate", date); + CHECK_REG_STR(prodkey, "InstallSource", temp); + CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "Publisher", "Wine"); + CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); + CHECK_REG_STR(prodkey, "Comments", NULL); + CHECK_REG_STR(prodkey, "Contact", NULL); + CHECK_REG_STR(prodkey, "HelpLink", NULL); + CHECK_REG_STR(prodkey, "HelpTelephone", NULL); + CHECK_REG_STR(prodkey, "InstallLocation", NULL); + CHECK_REG_STR(prodkey, "Readme", NULL); + CHECK_REG_STR(prodkey, "Size", NULL); + CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); + CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); + CHECK_REG_DWORD(prodkey, "Language", 1033); + CHECK_REG_DWORD(prodkey, "Version", 0x1010001); + CHECK_REG_DWORD(prodkey, "VersionMajor", 1); + CHECK_REG_DWORD(prodkey, "VersionMinor", 1); + CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); + todo_wine + { + CHECK_REG_DWORD4(prodkey, "EstimatedSize", 12, -12, 10, 24); + } + + RegCloseKey(prodkey); + + r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(pf_exists("msitest\\maximus"), "File deleted\n"); + ok(pf_exists("msitest"), "File deleted\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + /* complete install */ + r = MsiInstallProductA(msifile, "FULL=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + if (is_64bit) + { + res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + else + { + res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); + CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); + CHECK_REG_STR(prodkey, "InstallDate", date); + CHECK_REG_STR(prodkey, "InstallSource", temp); + CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "Publisher", "Wine"); + CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); + CHECK_REG_STR(prodkey, "Comments", NULL); + CHECK_REG_STR(prodkey, "Contact", NULL); + CHECK_REG_STR(prodkey, "HelpLink", NULL); + CHECK_REG_STR(prodkey, "HelpTelephone", NULL); + CHECK_REG_STR(prodkey, "InstallLocation", NULL); + CHECK_REG_STR(prodkey, "Readme", NULL); + CHECK_REG_STR(prodkey, "Size", NULL); + CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); + CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); + CHECK_REG_DWORD(prodkey, "Language", 1033); + CHECK_REG_DWORD(prodkey, "Version", 0x1010001); + CHECK_REG_DWORD(prodkey, "VersionMajor", 1); + CHECK_REG_DWORD(prodkey, "VersionMinor", 1); + CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); + todo_wine + { + CHECK_REG_DWORD4(prodkey, "EstimatedSize", 12, -12, 10, 24); + } + + RegCloseKey(prodkey); + + /* no UnpublishFeatures */ + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); + ok(!pf_exists("msitest"), "Directory not deleted\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + /* complete install */ + r = MsiInstallProductA(msifile, "FULL=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + if (is_64bit) + { + res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + else + { + res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); + CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); + CHECK_REG_STR(prodkey, "InstallDate", date); + CHECK_REG_STR(prodkey, "InstallSource", temp); + CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "Publisher", "Wine"); + CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); + CHECK_REG_STR(prodkey, "Comments", NULL); + CHECK_REG_STR(prodkey, "Contact", NULL); + CHECK_REG_STR(prodkey, "HelpLink", NULL); + CHECK_REG_STR(prodkey, "HelpTelephone", NULL); + CHECK_REG_STR(prodkey, "InstallLocation", NULL); + CHECK_REG_STR(prodkey, "Readme", NULL); + CHECK_REG_STR(prodkey, "Size", NULL); + CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); + CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); + CHECK_REG_DWORD(prodkey, "Language", 1033); + CHECK_REG_DWORD(prodkey, "Version", 0x1010001); + CHECK_REG_DWORD(prodkey, "VersionMajor", 1); + CHECK_REG_DWORD(prodkey, "VersionMinor", 1); + CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); + todo_wine + { + CHECK_REG_DWORD4(prodkey, "EstimatedSize", 12, -12, 10, 24); + } + + RegCloseKey(prodkey); + + /* UnpublishFeatures, only feature removed. Only works when entire product is removed */ + r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(pf_exists("msitest\\maximus"), "File deleted\n"); + ok(pf_exists("msitest"), "Directory deleted\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + if (is_64bit) + { + res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + else + { + res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); + CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); + CHECK_REG_STR(prodkey, "InstallDate", date); + CHECK_REG_STR(prodkey, "InstallSource", temp); + CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "Publisher", "Wine"); + CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); + CHECK_REG_STR(prodkey, "Comments", NULL); + CHECK_REG_STR(prodkey, "Contact", NULL); + CHECK_REG_STR(prodkey, "HelpLink", NULL); + CHECK_REG_STR(prodkey, "HelpTelephone", NULL); + CHECK_REG_STR(prodkey, "InstallLocation", NULL); + CHECK_REG_STR(prodkey, "Readme", NULL); + CHECK_REG_STR(prodkey, "Size", NULL); + CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); + CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); + CHECK_REG_DWORD(prodkey, "Language", 1033); + CHECK_REG_DWORD(prodkey, "Version", 0x1010001); + CHECK_REG_DWORD(prodkey, "VersionMajor", 1); + CHECK_REG_DWORD(prodkey, "VersionMinor", 1); + CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); + todo_wine + { + CHECK_REG_DWORD4(prodkey, "EstimatedSize", 12, -12, 10, 24); + } + + RegCloseKey(prodkey); + + /* complete install */ + r = MsiInstallProductA(msifile, "FULL=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + if (is_64bit) + { + res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + else + { + res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); + CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); + CHECK_REG_STR(prodkey, "InstallDate", date); + CHECK_REG_STR(prodkey, "InstallSource", temp); + CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "Publisher", "Wine"); + CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); + CHECK_REG_STR(prodkey, "Comments", NULL); + CHECK_REG_STR(prodkey, "Contact", NULL); + CHECK_REG_STR(prodkey, "HelpLink", NULL); + CHECK_REG_STR(prodkey, "HelpTelephone", NULL); + CHECK_REG_STR(prodkey, "InstallLocation", NULL); + CHECK_REG_STR(prodkey, "Readme", NULL); + CHECK_REG_STR(prodkey, "Size", NULL); + CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); + CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); + CHECK_REG_DWORD(prodkey, "Language", 1033); + CHECK_REG_DWORD(prodkey, "Version", 0x1010001); + CHECK_REG_DWORD(prodkey, "VersionMajor", 1); + CHECK_REG_DWORD(prodkey, "VersionMinor", 1); + CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); + todo_wine + { + CHECK_REG_DWORD4(prodkey, "EstimatedSize", 12, -20, 10, 24); + } + + RegCloseKey(prodkey); + + /* UnpublishFeatures, both features removed */ + r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); + ok(!pf_exists("msitest"), "Directory not deleted\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + /* complete install */ + r = MsiInstallProductA(msifile, "FULL=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + + if (is_64bit) + { + res = RegOpenKeyExA(uninstall_32node, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + else + { + res = RegOpenKeyExA(uninstall, prodcode, 0, KEY_ALL_ACCESS, &prodkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + } + + CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); + CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); + CHECK_REG_STR(prodkey, "InstallDate", date); + CHECK_REG_STR(prodkey, "InstallSource", temp); + CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "Publisher", "Wine"); + CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); + CHECK_REG_STR(prodkey, "Comments", NULL); + CHECK_REG_STR(prodkey, "Contact", NULL); + CHECK_REG_STR(prodkey, "HelpLink", NULL); + CHECK_REG_STR(prodkey, "HelpTelephone", NULL); + CHECK_REG_STR(prodkey, "InstallLocation", NULL); + CHECK_REG_STR(prodkey, "Readme", NULL); + CHECK_REG_STR(prodkey, "Size", NULL); + CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); + CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); + CHECK_REG_DWORD(prodkey, "Language", 1033); + CHECK_REG_DWORD(prodkey, "Version", 0x1010001); + CHECK_REG_DWORD(prodkey, "VersionMajor", 1); + CHECK_REG_DWORD(prodkey, "VersionMinor", 1); + CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); + todo_wine + { + CHECK_REG_DWORD4(prodkey, "EstimatedSize", 12, -12, 10, 24); + } + + RegCloseKey(prodkey); + + /* complete uninstall */ + r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); + ok(!pf_exists("msitest"), "Directory not deleted\n"); + + state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + res = RegOpenKeyExA(uninstall, prodcode, 0, access, &prodkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + /* make sure 'Program Files\msitest' is removed */ + delete_pfmsitest_files(); + +error: + RegCloseKey(uninstall); + RegCloseKey(uninstall_32node); + DeleteFile(msifile); + DeleteFile("msitest\\maximus"); + RemoveDirectory("msitest"); +} + +static void test_publish_sourcelist(void) +{ + UINT r; + DWORD size; + CHAR value[MAX_PATH]; + CHAR path[MAX_PATH]; + CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"; + + if (!pMsiSourceListEnumSourcesA || !pMsiSourceListGetInfoA) + { + win_skip("MsiSourceListEnumSourcesA and/or MsiSourceListGetInfoA are not available\n"); + return; + } + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\maximus", 500); + + create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + /* nothing published */ + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); + ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); + ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); + + r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + /* after RegisterProduct */ + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); + ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); + ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); + + r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + /* after ProcessComponents */ + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); + ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); + ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); + + r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + /* after PublishFeatures */ + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); + ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); + ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); + ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); + ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); + + r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(pf_exists("msitest\\maximus"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + /* after PublishProduct */ + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(value, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value); + ok(size == 11, "Expected 11, got %d\n", size); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATH, value, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value); + ok(size == 0, "Expected 0, got %d\n", size); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, INSTALLPROPERTY_DISKPROMPT, value, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value); + ok(size == 0, "Expected 0, got %d\n", size); + + lstrcpyA(path, CURR_DIR); + lstrcatA(path, "\\"); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value); + ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPE, value, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(value, "n"), "Expected \"n\", got \"%s\"\n", value); + ok(size == 1, "Expected 1, got %d\n", size); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); + ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); + ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value); + ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size); + + size = MAX_PATH; + lstrcpyA(value, "aaa"); + r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, + MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 1, value, &size); + ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); + ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); + + /* complete uninstall */ + r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); + ok(!pf_exists("msitest"), "Directory not deleted\n"); + + /* make sure 'Program Files\msitest' is removed */ + delete_pfmsitest_files(); + +error: + DeleteFile(msifile); + DeleteFile("msitest\\maximus"); + RemoveDirectory("msitest"); +} + +static void create_pf_data(LPCSTR file, LPCSTR data, BOOL is_file) +{ + CHAR path[MAX_PATH]; + + lstrcpyA(path, PROG_FILES_DIR); + lstrcatA(path, "\\"); + lstrcatA(path, file); + + if (is_file) + create_file_data(path, data, 500); + else + CreateDirectoryA(path, NULL); +} + +#define create_pf(file, is_file) create_pf_data(file, file, is_file) + +static void test_remove_files(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\hydrogen", 500); + create_file("msitest\\helium", 500); + create_file("msitest\\lithium", 500); + + create_database(msifile, rem_tables, sizeof(rem_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(pf_exists("msitest\\hydrogen"), "File not installed\n"); + ok(!pf_exists("msitest\\helium"), "File installed\n"); + ok(pf_exists("msitest\\lithium"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n"); + ok(!pf_exists("msitest\\helium"), "File not deleted\n"); + ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n"); + ok(delete_pf("msitest", FALSE), "Directory deleted\n"); + + create_pf("msitest", FALSE); + create_pf("msitest\\hydrogen", TRUE); + create_pf("msitest\\helium", TRUE); + create_pf("msitest\\lithium", TRUE); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(pf_exists("msitest\\hydrogen"), "File not installed\n"); + ok(pf_exists("msitest\\helium"), "File not installed\n"); + ok(pf_exists("msitest\\lithium"), "File not installed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n"); + ok(delete_pf("msitest\\helium", TRUE), "File deleted\n"); + ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n"); + ok(delete_pf("msitest", FALSE), "Directory deleted\n"); + + create_pf("msitest", FALSE); + create_pf("msitest\\furlong", TRUE); + create_pf("msitest\\firkin", TRUE); + create_pf("msitest\\fortnight", TRUE); + create_pf("msitest\\becquerel", TRUE); + create_pf("msitest\\dioptre", TRUE); + create_pf("msitest\\attoparsec", TRUE); + create_pf("msitest\\storeys", TRUE); + create_pf("msitest\\block", TRUE); + create_pf("msitest\\siriometer", TRUE); + create_pf("msitest\\cabout", FALSE); + create_pf("msitest\\cabout\\blocker", TRUE); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(pf_exists("msitest\\hydrogen"), "File not installed\n"); + ok(!pf_exists("msitest\\helium"), "File installed\n"); + ok(pf_exists("msitest\\lithium"), "File not installed\n"); + ok(!pf_exists("msitest\\furlong"), "File not deleted\n"); + ok(!pf_exists("msitest\\firkin"), "File not deleted\n"); + ok(!pf_exists("msitest\\fortnight"), "File not deleted\n"); + ok(pf_exists("msitest\\becquerel"), "File not installed\n"); + ok(pf_exists("msitest\\dioptre"), "File not installed\n"); + ok(pf_exists("msitest\\attoparsec"), "File not installed\n"); + ok(!pf_exists("msitest\\storeys"), "File not deleted\n"); + ok(!pf_exists("msitest\\block"), "File not deleted\n"); + ok(!pf_exists("msitest\\siriometer"), "File not deleted\n"); + ok(pf_exists("msitest\\cabout"), "Directory removed\n"); + ok(pf_exists("msitest"), "File not installed\n"); + + create_pf("msitest\\furlong", TRUE); + create_pf("msitest\\firkin", TRUE); + create_pf("msitest\\fortnight", TRUE); + create_pf("msitest\\storeys", TRUE); + create_pf("msitest\\block", TRUE); + create_pf("msitest\\siriometer", TRUE); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(!delete_pf("msitest\\hydrogen", TRUE), "File not deleted\n"); + ok(!delete_pf("msitest\\helium", TRUE), "File not deleted\n"); + ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n"); + ok(delete_pf("msitest\\furlong", TRUE), "File deleted\n"); + ok(delete_pf("msitest\\firkin", TRUE), "File deleted\n"); + ok(delete_pf("msitest\\fortnight", TRUE), "File deleted\n"); + ok(!delete_pf("msitest\\becquerel", TRUE), "File not deleted\n"); + ok(!delete_pf("msitest\\dioptre", TRUE), "File not deleted\n"); + ok(delete_pf("msitest\\attoparsec", TRUE), "File deleted\n"); + ok(!delete_pf("msitest\\storeys", TRUE), "File not deleted\n"); + ok(!delete_pf("msitest\\block", TRUE), "File not deleted\n"); + ok(delete_pf("msitest\\siriometer", TRUE), "File deleted\n"); + ok(pf_exists("msitest\\cabout"), "Directory deleted\n"); + ok(pf_exists("msitest"), "Directory deleted\n"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\hydrogen", TRUE), "File not installed\n"); + ok(!delete_pf("msitest\\helium", TRUE), "File installed\n"); + ok(delete_pf("msitest\\lithium", TRUE), "File not installed\n"); + ok(pf_exists("msitest\\cabout"), "Directory deleted\n"); + ok(pf_exists("msitest"), "Directory deleted\n"); + + delete_pf("msitest\\cabout\\blocker", TRUE); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(!delete_pf("msitest\\cabout", FALSE), "Directory not deleted\n"); + delete_pf("msitest", FALSE); + +error: + DeleteFile(msifile); + DeleteFile("msitest\\hydrogen"); + DeleteFile("msitest\\helium"); + DeleteFile("msitest\\lithium"); + RemoveDirectory("msitest"); +} + +static void test_move_files(void) +{ + UINT r; + char props[MAX_PATH]; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\augustus", 100); + create_file("cameroon", 100); + create_file("djibouti", 100); + create_file("egypt", 100); + create_file("finland", 100); + create_file("gambai", 100); + create_file("honduras", 100); + create_file("msitest\\india", 100); + create_file("japan", 100); + create_file("kenya", 100); + CreateDirectoryA("latvia", NULL); + create_file("nauru", 100); + create_file("peru", 100); + create_file("apple", 100); + create_file("application", 100); + create_file("ape", 100); + create_file("foo", 100); + create_file("fao", 100); + create_file("fbod", 100); + create_file("budding", 100); + create_file("buddy", 100); + create_file("bud", 100); + create_file("bar", 100); + create_file("bur", 100); + create_file("bird", 100); + + create_database(msifile, mov_tables, sizeof(mov_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + /* if the source or dest property is not a full path, + * windows tries to access it as a network resource + */ + + sprintf(props, "SOURCEFULL=\"%s\\\" DESTFULL=\"%s\\msitest\" " + "FILEPATHBAD=\"%s\\japan\" FILEPATHGOOD=\"%s\\kenya\"", + CURR_DIR, PROG_FILES_DIR, CURR_DIR, CURR_DIR); + + r = MsiInstallProductA(msifile, props); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); + ok(!delete_pf("msitest\\dest", TRUE), "File copied\n"); + ok(delete_pf("msitest\\canada", TRUE), "File not copied\n"); + ok(delete_pf("msitest\\dominica", TRUE), "File not moved\n"); + ok(!delete_pf("msitest\\elsalvador", TRUE), "File moved\n"); + ok(!delete_pf("msitest\\france", TRUE), "File moved\n"); + ok(!delete_pf("msitest\\georgia", TRUE), "File moved\n"); + ok(delete_pf("msitest\\hungary", TRUE), "File not moved\n"); + ok(!delete_pf("msitest\\indonesia", TRUE), "File moved\n"); + ok(!delete_pf("msitest\\jordan", TRUE), "File moved\n"); + ok(delete_pf("msitest\\kiribati", TRUE), "File not moved\n"); + ok(!delete_pf("msitest\\lebanon", TRUE), "File moved\n"); + ok(!delete_pf("msitest\\lebanon", FALSE), "Directory moved\n"); + ok(delete_pf("msitest\\poland", TRUE), "File not moved\n"); + /* either apple or application will be moved depending on directory order */ + if (!delete_pf("msitest\\apple", TRUE)) + ok(delete_pf("msitest\\application", TRUE), "File not moved\n"); + else + ok(!delete_pf("msitest\\application", TRUE), "File should not exist\n"); + ok(delete_pf("msitest\\wildcard", TRUE), "File not moved\n"); + ok(!delete_pf("msitest\\ape", TRUE), "File moved\n"); + /* either fao or foo will be moved depending on directory order */ + if (delete_pf("msitest\\foo", TRUE)) + ok(!delete_pf("msitest\\fao", TRUE), "File should not exist\n"); + else + ok(delete_pf("msitest\\fao", TRUE), "File not moved\n"); + ok(delete_pf("msitest\\single", TRUE), "File not moved\n"); + ok(!delete_pf("msitest\\fbod", TRUE), "File moved\n"); + ok(delete_pf("msitest\\budding", TRUE), "File not moved\n"); + ok(delete_pf("msitest\\buddy", TRUE), "File not moved\n"); + ok(!delete_pf("msitest\\bud", TRUE), "File moved\n"); + ok(delete_pf("msitest\\bar", TRUE), "File not moved\n"); + ok(delete_pf("msitest\\bur", TRUE), "File not moved\n"); + ok(!delete_pf("msitest\\bird", TRUE), "File moved\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + ok(DeleteFileA("cameroon"), "File moved\n"); + ok(!DeleteFileA("djibouti"), "File not moved\n"); + ok(DeleteFileA("egypt"), "File moved\n"); + ok(DeleteFileA("finland"), "File moved\n"); + ok(DeleteFileA("gambai"), "File moved\n"); + ok(!DeleteFileA("honduras"), "File not moved\n"); + ok(DeleteFileA("msitest\\india"), "File moved\n"); + ok(DeleteFileA("japan"), "File moved\n"); + ok(!DeleteFileA("kenya"), "File not moved\n"); + ok(RemoveDirectoryA("latvia"), "Directory moved\n"); + ok(!DeleteFileA("nauru"), "File not moved\n"); + ok(!DeleteFileA("peru"), "File not moved\n"); + ok(!DeleteFileA("apple"), "File not moved\n"); + ok(!DeleteFileA("application"), "File not moved\n"); + ok(DeleteFileA("ape"), "File moved\n"); + ok(!DeleteFileA("foo"), "File not moved\n"); + ok(!DeleteFileA("fao"), "File not moved\n"); + ok(DeleteFileA("fbod"), "File moved\n"); + ok(!DeleteFileA("budding"), "File not moved\n"); + ok(!DeleteFileA("buddy"), "File not moved\n"); + ok(DeleteFileA("bud"), "File moved\n"); + ok(!DeleteFileA("bar"), "File not moved\n"); + ok(!DeleteFileA("bur"), "File not moved\n"); + ok(DeleteFileA("bird"), "File moved\n"); + +error: + DeleteFile("cameroon"); + DeleteFile("djibouti"); + DeleteFile("egypt"); + DeleteFile("finland"); + DeleteFile("gambai"); + DeleteFile("honduras"); + DeleteFile("japan"); + DeleteFile("kenya"); + DeleteFile("nauru"); + DeleteFile("peru"); + DeleteFile("apple"); + DeleteFile("application"); + DeleteFile("ape"); + DeleteFile("foo"); + DeleteFile("fao"); + DeleteFile("fbod"); + DeleteFile("budding"); + DeleteFile("buddy"); + DeleteFile("bud"); + DeleteFile("bar"); + DeleteFile("bur"); + DeleteFile("bird"); + DeleteFile("msitest\\india"); + DeleteFile("msitest\\augustus"); + RemoveDirectory("latvia"); + RemoveDirectory("msitest"); + DeleteFile(msifile); +} + +static void test_duplicate_files(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\maximus", 500); + create_database(msifile, df_tables, sizeof(df_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + /* fails if the destination folder is not a valid property */ + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\augustus", TRUE), "File not duplicated\n"); + ok(delete_pf("msitest\\this\\doesnot\\exist\\maximus", TRUE), "File not duplicated\n"); + ok(delete_pf("msitest\\this\\doesnot\\exist", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\this\\doesnot", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\this", FALSE), "Directory not created\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + +error: + DeleteFile("msitest\\maximus"); + RemoveDirectory("msitest"); + DeleteFile(msifile); +} + +static void test_write_registry_values(void) +{ + UINT r; + LONG res; + HKEY hkey; + DWORD type, size; + CHAR path[MAX_PATH]; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\augustus", 500); + + create_database(msifile, wrv_tables, sizeof(wrv_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + if (is_64bit) + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wow6432Node\\Wine\\msitest", 0, KEY_ALL_ACCESS, &hkey); + else + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", 0, KEY_ALL_ACCESS, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + size = MAX_PATH; + type = REG_MULTI_SZ; + memset(path, 'a', MAX_PATH); + res = RegQueryValueExA(hkey, "Value", NULL, &type, (LPBYTE)path, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(!memcmp(path, "one\0two\0three\0\0", size), "Wrong multi-sz data\n"); + ok(size == 15, "Expected 15, got %d\n", size); + ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type); + + RegDeleteValueA(hkey, "Value"); + RegCloseKey(hkey); + RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); + +error: + DeleteFile(msifile); + DeleteFile("msitest\\augustus"); + RemoveDirectory("msitest"); +} + +static void test_envvar(void) +{ + static const char *results[] = + { + "1;2", /* MSITESTVAR11 */ + "1", /* MSITESTVAR12 */ + "1;2", /* MSITESTVAR13 */ + ";1;", /* MSITESTVAR14 */ + ";;1;;", /* MSITESTVAR15 */ + " 1 ", /* MSITESTVAR16 */ + ";;2;;1", /* MSITESTVAR17 */ + "1;;2;;", /* MSITESTVAR18 */ + "1", /* MSITESTVAR19 */ + "1", /* MSITESTVAR20 */ + NULL + }; + UINT r; + HKEY env; + LONG res; + DWORD type, size; + char buffer[16]; + UINT i; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_database(msifile, env_tables, sizeof(env_tables) / sizeof(msi_table)); + + res = RegCreateKeyExA(HKEY_CURRENT_USER, "Environment", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &env, NULL); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + res = RegSetValueExA(env, "MSITESTVAR1", 0, REG_SZ, (const BYTE *)"0", 2); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + res = RegSetValueExA(env, "MSITESTVAR2", 0, REG_SZ, (const BYTE *)"0", 2); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + type = REG_NONE; + size = sizeof(buffer); + buffer[0] = 0; + res = RegQueryValueExA(env, "MSITESTVAR1", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "Expected \"1\", got %s\n", buffer); + + res = RegDeleteValueA(env, "MSITESTVAR1"); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + type = REG_NONE; + size = sizeof(buffer); + buffer[0] = 0; + res = RegQueryValueExA(env, "MSITESTVAR2", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "Expected \"1\", got %s\n", buffer); + + res = RegDeleteValueA(env, "MSITESTVAR2"); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + res = RegDeleteValueA(env, "MSITESTVAR3"); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + res = RegDeleteValueA(env, "MSITESTVAR4"); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + res = RegDeleteValueA(env, "MSITESTVAR5"); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegDeleteValueA(env, "MSITESTVAR6"); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegDeleteValueA(env, "MSITESTVAR7"); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegDeleteValueA(env, "MSITESTVAR8"); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegDeleteValueA(env, "MSITESTVAR9"); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegDeleteValueA(env, "MSITESTVAR10"); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + i = 11; + while (results[i - 11]) + { + char name[20]; + sprintf(name, "MSITESTVAR%d", i); + + type = REG_NONE; + size = sizeof(buffer); + buffer[0] = 0; + res = RegQueryValueExA(env, name, NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "%d: Expected ERROR_SUCCESS, got %d\n", i, res); + ok(type == REG_SZ, "%d: Expected REG_SZ, got %u\n", i, type); + ok(!lstrcmp(buffer, results[i - 11]), "%d: Expected %s, got %s\n", i, results[i - 11], buffer); + + res = RegDeleteValueA(env, name); + ok(res == ERROR_SUCCESS, "%d: Expected ERROR_SUCCESS, got %d\n", i, res); + i++; + } + + delete_pf("msitest\\cabout\\new\\five.txt", TRUE); + delete_pf("msitest\\cabout\\new", FALSE); + delete_pf("msitest\\cabout\\four.txt", TRUE); + delete_pf("msitest\\cabout", FALSE); + delete_pf("msitest\\changed\\three.txt", TRUE); + delete_pf("msitest\\changed", FALSE); + delete_pf("msitest\\first\\two.txt", TRUE); + delete_pf("msitest\\first", FALSE); + delete_pf("msitest\\filename", TRUE); + delete_pf("msitest\\one.txt", TRUE); + delete_pf("msitest\\service.exe", TRUE); + delete_pf("msitest", FALSE); + +error: + RegDeleteValueA(env, "MSITESTVAR1"); + RegDeleteValueA(env, "MSITESTVAR2"); + RegCloseKey(env); + + delete_test_files(); + DeleteFile(msifile); +} + +static void test_create_remove_folder(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + CreateDirectoryA("msitest", NULL); + CreateDirectoryA("msitest\\first", NULL); + CreateDirectoryA("msitest\\second", NULL); + create_file("msitest\\first\\one.txt", 1000); + create_file("msitest\\second\\two.txt", 1000); + create_database(msifile, cf_tables, sizeof(cf_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(pf_exists("msitest\\first\\one.txt"), "file not installed\n"); + ok(pf_exists("msitest\\first"), "directory not created\n"); + ok(pf_exists("msitest\\second\\two.txt"), "file not installed\n"); + ok(pf_exists("msitest\\second"), "directory not created\n"); + ok(pf_exists("msitest\\third"), "directory not created\n"); + ok(pf_exists("msitest"), "directory not created\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!pf_exists("msitest\\first\\one.txt"), "file not removed\n"); + ok(!pf_exists("msitest\\first"), "directory not removed\n"); + ok(!pf_exists("msitest\\second\\two.txt"), "file not removed\n"); + ok(!pf_exists("msitest\\second"), "directory not removed\n"); + ok(!pf_exists("msitest\\third"), "directory not removed\n"); + todo_wine ok(!pf_exists("msitest"), "directory not removed\n"); + +error: + DeleteFileA("msitest\\first\\one.txt"); + DeleteFileA("msitest\\second\\two.txt"); + RemoveDirectoryA("msitest\\first"); + RemoveDirectoryA("msitest\\second"); + RemoveDirectoryA("msitest"); + DeleteFile(msifile); +} + +static void test_start_services(void) +{ + UINT r; + SC_HANDLE scm, service; + BOOL ret; + DWORD error = ERROR_SUCCESS; + + scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + if (!scm && GetLastError() == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + return; + } + ok(scm != NULL, "Failed to open the SC Manager\n"); + if (!scm) return; + + service = OpenService(scm, "Spooler", SC_MANAGER_ALL_ACCESS); + if (!service && GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST) + { + win_skip("The 'Spooler' service does not exist\n"); + CloseServiceHandle(scm); + return; + } + ok(service != NULL, "Failed to open Spooler, error %d\n", GetLastError()); + if (!service) { + CloseServiceHandle(scm); + return; + } + + ret = StartService(service, 0, NULL); + if (!ret && (error = GetLastError()) != ERROR_SERVICE_ALREADY_RUNNING) + { + skip("Spooler service not available, skipping test\n"); + CloseServiceHandle(service); + CloseServiceHandle(scm); + return; + } + + CloseServiceHandle(service); + CloseServiceHandle(scm); + + create_test_files(); + create_database(msifile, sss_tables, sizeof(sss_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + + delete_test_files(); + DeleteFile(msifile); + + if (error == ERROR_SUCCESS) + { + SERVICE_STATUS status; + + scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + service = OpenService(scm, "Spooler", SC_MANAGER_ALL_ACCESS); + + ret = ControlService(service, SERVICE_CONTROL_STOP, &status); + ok(ret, "ControlService failed %u\n", GetLastError()); + + CloseServiceHandle(service); + CloseServiceHandle(scm); + } +} + +static void test_delete_services(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_database(msifile, sds_tables, sizeof(sds_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + +error: + delete_test_files(); + DeleteFile(msifile); +} + +static void test_self_registration(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_database(msifile, sr_tables, sizeof(sr_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + +error: + delete_test_files(); + DeleteFile(msifile); +} + +static void test_register_font(void) +{ + static const char regfont1[] = "Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; + static const char regfont2[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Fonts"; + LONG ret; + HKEY key; + UINT r; + REGSAM access = KEY_ALL_ACCESS; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\font.ttf", 1000); + create_database(msifile, font_tables, sizeof(font_tables) / sizeof(msi_table)); + + if (is_wow64) + access |= KEY_WOW64_64KEY; + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, regfont1, 0, access, &key); + if (ret) + RegOpenKeyExA(HKEY_LOCAL_MACHINE, regfont2, 0, access, &key); + + ret = RegQueryValueExA(key, "msi test font", NULL, NULL, NULL, NULL); + ok(ret != ERROR_FILE_NOT_FOUND, "unexpected result %d\n", ret); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + ret = RegQueryValueExA(key, "msi test font", NULL, NULL, NULL, NULL); + ok(ret == ERROR_FILE_NOT_FOUND, "unexpected result %d\n", ret); + + RegDeleteValueA(key, "msi test font"); + RegCloseKey(key); + +error: + DeleteFileA("msitest\\font.ttf"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_validate_product_id(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_database(msifile, vp_tables, sizeof(vp_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiInstallProductA(msifile, "SET_PRODUCT_ID=1"); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + r = MsiInstallProductA(msifile, "SET_PRODUCT_ID=2"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiInstallProductA(msifile, "PIDKEY=123-1234567"); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + +error: + delete_test_files(); + DeleteFile(msifile); +} + +static void test_install_remove_odbc(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\ODBCdriver.dll", 1000); + create_file("msitest\\ODBCdriver2.dll", 1000); + create_file("msitest\\ODBCtranslator.dll", 1000); + create_file("msitest\\ODBCtranslator2.dll", 1000); + create_file("msitest\\ODBCsetup.dll", 1000); + create_database(msifile, odbc_tables, sizeof(odbc_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(pf_exists("msitest\\ODBCdriver.dll"), "file not created\n"); + ok(pf_exists("msitest\\ODBCdriver2.dll"), "file not created\n"); + ok(pf_exists("msitest\\ODBCtranslator.dll"), "file not created\n"); + ok(pf_exists("msitest\\ODBCtranslator2.dll"), "file not created\n"); + ok(pf_exists("msitest\\ODBCsetup.dll"), "file not created\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\ODBCdriver.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\ODBCdriver2.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\ODBCtranslator.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\ODBCtranslator2.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\ODBCsetup.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + +error: + DeleteFileA("msitest\\ODBCdriver.dll"); + DeleteFileA("msitest\\ODBCdriver2.dll"); + DeleteFileA("msitest\\ODBCtranslator.dll"); + DeleteFileA("msitest\\ODBCtranslator2.dll"); + DeleteFileA("msitest\\ODBCsetup.dll"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_register_typelib(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\typelib.dll", 1000); + create_database(msifile, tl_tables, sizeof(tl_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, "REGISTER_TYPELIB=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\typelib.dll", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + +error: + DeleteFileA("msitest\\typelib.dll"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_create_remove_shortcut(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\target.txt", 1000); + create_database(msifile, crs_tables, sizeof(crs_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(pf_exists("msitest\\target.txt"), "file not created\n"); + ok(pf_exists("msitest\\shortcut.lnk"), "file not created\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\shortcut.lnk", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\target.txt", TRUE), "file not removed\n"); + todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + +error: + DeleteFileA("msitest\\target.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_publish_components(void) +{ + static char keypath[] = + "Software\\Microsoft\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA"; + + UINT r; + LONG res; + HKEY key; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\english.txt", 1000); + create_database(msifile, pub_tables, sizeof(pub_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CURRENT_USER, keypath, &key); + ok(res == ERROR_SUCCESS, "components key not created %d\n", res); + + res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, NULL); + ok(res == ERROR_SUCCESS, "value not found %d\n", res); + RegCloseKey(key); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CURRENT_USER, keypath, &key); + ok(res == ERROR_FILE_NOT_FOUND, "unexpected result %d\n", res); + + ok(!delete_pf("msitest\\english.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + +error: + DeleteFileA("msitest\\english.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_remove_duplicate_files(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\original.txt", 1000); + create_file("msitest\\original2.txt", 1000); + create_file("msitest\\original3.txt", 1000); + create_database(msifile, rd_tables, sizeof(rd_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(pf_exists("msitest\\original.txt"), "file not created\n"); + ok(pf_exists("msitest\\original2.txt"), "file not created\n"); + ok(!pf_exists("msitest\\original3.txt"), "file created\n"); + ok(pf_exists("msitest\\duplicate.txt"), "file not created\n"); + ok(!pf_exists("msitest\\duplicate2.txt"), "file created\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\original.txt", TRUE), "file removed\n"); + ok(!delete_pf("msitest\\original2.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\original3.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\duplicate.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest\\duplicate2.txt", TRUE), "file not removed\n"); + ok(delete_pf("msitest", FALSE), "directory removed\n"); + +error: + DeleteFileA("msitest\\original.txt"); + DeleteFileA("msitest\\original2.txt"); + DeleteFileA("msitest\\original3.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_remove_registry_values(void) +{ + UINT r; + LONG res; + HKEY key; + REGSAM access = KEY_ALL_ACCESS; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\registry.txt", 1000); + create_database(msifile, rrv_tables, sizeof(rrv_tables) / sizeof(msi_table)); + + if (is_wow64) + access |= KEY_WOW64_64KEY; + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", 0, NULL, 0, access, NULL, &key, NULL); + RegSetValueExA(key, "value1", 0, REG_SZ, (const BYTE *)"1", 2); + RegCloseKey(key); + + RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", 0, NULL, 0, access, NULL, &key, NULL); + RegSetValueExA(key, "value2", 0, REG_SZ, (const BYTE *)"2", 2); + RegCloseKey(key); + + RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", 0, NULL, 0, access, NULL, &key, NULL); + RegSetValueExA(key, "", 0, REG_SZ, (const BYTE *)"default", 8); + RegSetValueExA(key, "valueA", 0, REG_SZ, (const BYTE *)"A", 2); + RegSetValueExA(key, "valueB", 0, REG_SZ, (const BYTE *)"B", 2); + RegCloseKey(key); + + RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyB", 0, NULL, 0, access, NULL, &key, NULL); + RegSetValueExA(key, "", 0, REG_SZ, (const BYTE *)"default", 8); + RegSetValueExA(key, "valueB", 0, REG_SZ, (const BYTE *)"B", 2); + RegCloseKey(key); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", 0, access, &key); + ok(res == ERROR_SUCCESS, "key removed\n"); + RegCloseKey(key); + + if (is_64bit) + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wow6432Node\\Wine\\key2", 0, KEY_ALL_ACCESS, &key); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + } + else + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", 0, KEY_ALL_ACCESS, &key); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + } + + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", 0, NULL, 0, access, NULL, &key, NULL); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegCloseKey(key); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + if (is_64bit) + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wow6432Node\\Wine\\key1", 0, KEY_ALL_ACCESS, &key); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + } + else + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", 0, KEY_ALL_ACCESS, &key); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + } + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", 0, access, &key); + ok(res == ERROR_SUCCESS, "key removed\n"); + RegCloseKey(key); + + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", 0, access, &key); + ok(res == ERROR_SUCCESS, "key removed\n"); + RegCloseKey(key); + + if (is_64bit) + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wow6432Node\\Wine\\keyB", 0, KEY_ALL_ACCESS, &key); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + } + else + { + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyB", 0, KEY_ALL_ACCESS, &key); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + } + + delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", access); + delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", access); + delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine", access); + + ok(!delete_pf("msitest\\registry.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + +error: + delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", access); + delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", access); + delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", access); + delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyB", access); + + DeleteFileA("msitest\\registry.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_find_related_products(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\product.txt", 1000); + create_database(msifile, frp_tables, sizeof(frp_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + /* install again, so it finds the upgrade code */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\product.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + +error: + DeleteFileA("msitest\\product.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_remove_ini_values(void) +{ + UINT r; + DWORD len; + char inifile[MAX_PATH], buf[0x10]; + HANDLE file; + BOOL ret; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\inifile.txt", 1000); + create_database(msifile, riv_tables, sizeof(riv_tables) / sizeof(msi_table)); + + lstrcpyA(inifile, PROG_FILES_DIR); + lstrcatA(inifile, "\\msitest"); + ret = CreateDirectoryA(inifile, NULL); + if (!ret && GetLastError() == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + lstrcatA(inifile, "\\test.ini"); + file = CreateFileA(inifile, GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, 0, NULL); + CloseHandle(file); + + ret = WritePrivateProfileStringA("section1", "key1", "value1", inifile); + ok(ret, "failed to write profile string %u\n", GetLastError()); + + ret = WritePrivateProfileStringA("sectionA", "keyA", "valueA", inifile); + ok(ret, "failed to write profile string %u\n", GetLastError()); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + len = GetPrivateProfileStringA("section1", "key1", NULL, buf, sizeof(buf), inifile); + ok(len == 6, "got %u expected 6\n", len); + + len = GetPrivateProfileStringA("sectionA", "keyA", NULL, buf, sizeof(buf), inifile); + ok(!len, "got %u expected 0\n", len); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + len = GetPrivateProfileStringA("section1", "key1", NULL, buf, sizeof(buf), inifile); + ok(!len, "got %u expected 0\n", len); + + len = GetPrivateProfileStringA("sectionA", "keyA", NULL, buf, sizeof(buf), inifile); + ok(!len, "got %u expected 0\n", len); + + todo_wine ok(!delete_pf("msitest\\test.ini", TRUE), "file removed\n"); + ok(!delete_pf("msitest\\inifile.txt", TRUE), "file not removed\n"); + ok(delete_pf("msitest", FALSE), "directory removed\n"); + +error: + DeleteFileA("msitest\\inifile.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_remove_env_strings(void) +{ + UINT r; + LONG res; + HKEY key; + DWORD type, size; + char buffer[0x10]; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\envvar.txt", 1000); + create_database(msifile, res_tables, sizeof(res_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + res = RegOpenKeyA(HKEY_CURRENT_USER, "Environment", &key); + ok(!res, "failed to open environment key %d\n", res); + + RegSetValueExA(key, "MSITESTVAR1", 0, REG_SZ, (const BYTE *)"1", 2); + RegSetValueExA(key, "MSITESTVAR2", 0, REG_SZ, (const BYTE *)"1", 2); + RegSetValueExA(key, "MSITESTVAR3", 0, REG_SZ, (const BYTE *)"1", 2); + RegSetValueExA(key, "MSITESTVAR4", 0, REG_SZ, (const BYTE *)"1", 2); + RegSetValueExA(key, "MSITESTVAR5", 0, REG_SZ, (const BYTE *)"1", 2); + + RegCloseKey(key); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CURRENT_USER, "Environment", &key); + ok(!res, "failed to open environment key %d\n", res); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR1", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR2", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR3", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR4", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR5", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + + RegCloseKey(key); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CURRENT_USER, "Environment", &key); + ok(!res, "failed to open environment key %d\n", res); + + res = RegQueryValueExA(key, "MSITESTVAR1", NULL, NULL, NULL, NULL); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegQueryValueExA(key, "MSITESTVAR2", NULL, NULL, NULL, NULL); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR3", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + RegDeleteValueA(key, "MSITESTVAR3"); + + res = RegQueryValueExA(key, "MSITESTVAR4", NULL, NULL, NULL, NULL); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + type = REG_NONE; + buffer[0] = 0; + size = sizeof(buffer); + res = RegQueryValueExA(key, "MSITESTVAR5", NULL, &type, (LPBYTE)buffer, &size); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); + ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); + RegDeleteValueA(key, "MSITESTVAR5"); + + ok(!delete_pf("msitest\\envvar.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + +error: + RegDeleteValueA(key, "MSITESTVAR1"); + RegDeleteValueA(key, "MSITESTVAR2"); + RegDeleteValueA(key, "MSITESTVAR3"); + RegDeleteValueA(key, "MSITESTVAR4"); + RegDeleteValueA(key, "MSITESTVAR5"); + RegCloseKey(key); + + DeleteFileA("msitest\\envvar.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_register_class_info(void) +{ + UINT r; + LONG res; + HKEY hkey; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\class.txt", 1000); + create_database(msifile, rci_tables, sizeof(rci_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + if (is_64bit) + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Wow6432Node\\CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); + else + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "FileType\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "AppID\\{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + if (is_64bit) + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Wow6432Node\\CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); + else + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "FileType\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "AppID\\{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + ok(!delete_pf("msitest\\class.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + +error: + DeleteFileA("msitest\\class.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_register_extension_info(void) +{ + UINT r; + LONG res; + HKEY hkey; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\extension.txt", 1000); + create_database(msifile, rei_tables, sizeof(rei_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, ".extension", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Prog.Id.1\\shell\\Open\\command", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, ".extension", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Prog.Id.1", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + ok(!delete_pf("msitest\\extension.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + +error: + DeleteFileA("msitest\\extension.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_register_mime_info(void) +{ + UINT r; + LONG res; + HKEY hkey; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\mime.txt", 1000); + create_database(msifile, rmi_tables, sizeof(rmi_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "MIME\\Database\\Content Type\\mime/type", &hkey); + ok(res == ERROR_SUCCESS, "key not created\n"); + RegCloseKey(hkey); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, "MIME\\Database\\Content Type\\mime/type", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); + + ok(!delete_pf("msitest\\mime.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + +error: + DeleteFileA("msitest\\mime.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +static void test_publish_assemblies(void) +{ + static const char manifest[] = + ""; + static const char manifest_local[] = + ""; + static const char classes_path_dotnet[] = + "Installer\\Assemblies\\Global"; + static const char classes_path_dotnet_local[] = + "Installer\\Assemblies\\C:|Program Files|msitest|application_dotnet.txt"; + static const char classes_path_dotnet_local_wow64[] = + "Installer\\Assemblies\\C:|Program Files (x86)|msitest|application_dotnet.txt"; + static const char classes_path_win32[] = + "Installer\\Win32Assemblies\\Global"; + static const char classes_path_win32_local[] = + "Installer\\Win32Assemblies\\C:|Program Files|msitest|application_win32.txt"; + static const char classes_path_win32_local_wow64[] = + "Installer\\Win32Assemblies\\C:|Program Files (x86)|msitest|application_win32.txt"; + static const char path_dotnet[] = + "Software\\Microsoft\\Installer\\Assemblies\\Global"; + static const char path_dotnet_local[] = + "Software\\Microsoft\\Installer\\Assemblies\\C:|Program Files|msitest|application_dotnet.txt"; + static const char path_dotnet_local_wow64[] = + "Software\\Microsoft\\Installer\\Assemblies\\C:|Program Files (x86)|msitest|application_dotnet.txt"; + static const char path_win32[] = + "Software\\Microsoft\\Installer\\Win32Assemblies\\Global"; + static const char path_win32_local[] = + "Software\\Microsoft\\Installer\\Win32Assemblies\\C:|Program Files|msitest|application_win32.txt"; + static const char path_win32_local_wow64[] = + "Software\\Microsoft\\Installer\\Win32Assemblies\\C:|Program Files (x86)|msitest|application_win32.txt"; + static const char name_dotnet[] = + "Wine.Dotnet.Assembly,processorArchitecture=\"MSIL\",publicKeyToken=\"abcdef0123456789\"," + "version=\"1.0.0.0\",culture=\"neutral\""; + static const char name_dotnet_local[] = + "Wine.Dotnet.Local.Assembly,processorArchitecture=\"MSIL\",publicKeyToken=\"abcdef0123456789\"," + "version=\"1.0.0.0\",culture=\"neutral\""; + static const char name_win32[] = + "Wine.Win32.Assembly,processorArchitecture=\"x86\",publicKeyToken=\"abcdef0123456789\"," + "type=\"win32\",version=\"1.0.0.0\""; + static const char name_win32_local[] = + "Wine.Win32.Local.Assembly,processorArchitecture=\"x86\",publicKeyToken=\"abcdef0123456789\"," + "type=\"win32\",version=\"1.0.0.0\""; + UINT r; + LONG res; + HKEY hkey; + const char *path; + int access; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\win32.txt", 1000); + create_file("msitest\\win32_local.txt", 1000); + create_file("msitest\\dotnet.txt", 1000); + create_file("msitest\\dotnet_local.txt", 1000); + create_file_data("msitest\\manifest.txt", manifest, 0); + create_file_data("msitest\\manifest_local.txt", manifest_local, 0); + create_file("msitest\\application_win32.txt", 1000); + create_file("msitest\\application_dotnet.txt", 1000); + create_database(msifile, pa_tables, sizeof(pa_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto done; + } + if (r == ERROR_INSTALL_FAILURE) + { + skip("No support for installing side-by-side assemblies\n"); + goto done; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CURRENT_USER, path_dotnet, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + CHECK_REG_STR(hkey, name_dotnet, "rcHQPHq?CA@Uv-XqMI1e>Z'q,T*76M@=YEg6My?~]"); + RegCloseKey(hkey); + + path = (is_wow64 || is_64bit) ? path_dotnet_local_wow64 : path_dotnet_local; + res = RegOpenKeyA(HKEY_CURRENT_USER, path, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + CHECK_REG_STR(hkey, name_dotnet_local, "rcHQPHq?CA@Uv-XqMI1e>LF,8A?0d.AW@vcZ$Cgox"); + RegCloseKey(hkey); + + res = RegOpenKeyA(HKEY_CURRENT_USER, path_win32, &hkey); + ok(res == ERROR_SUCCESS || res == ERROR_FILE_NOT_FOUND /* win2k without sxs support */, + "Expected ERROR_SUCCESS, got %d\n", res); + if (res == ERROR_SUCCESS) CHECK_REG_STR(hkey, name_win32, "rcHQPHq?CA@Uv-XqMI1e>}NJjwR'%D9v1p!v{WV(%"); + RegCloseKey(hkey); + + path = (is_wow64 || is_64bit) ? path_win32_local_wow64 : path_win32_local; + res = RegOpenKeyA(HKEY_CURRENT_USER, path, &hkey); + ok(res == ERROR_SUCCESS || res == ERROR_FILE_NOT_FOUND /* win2k without sxs support */, + "Expected ERROR_SUCCESS, got %d\n", res); + if (res == ERROR_SUCCESS) CHECK_REG_STR(hkey, name_win32_local, "rcHQPHq?CA@Uv-XqMI1e>C)Uvlj*53A)u(QQ9=)X!"); + RegCloseKey(hkey); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CURRENT_USER, path_dotnet, &hkey); + ok(res == ERROR_SUCCESS || res == ERROR_FILE_NOT_FOUND, "got %d\n", res); + if (res == ERROR_SUCCESS) + { + res = RegDeleteValueA(hkey, name_dotnet); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + RegCloseKey(hkey); + } + + path = (is_wow64 || is_64bit) ? path_dotnet_local_wow64 : path_dotnet_local; + res = RegOpenKeyA(HKEY_CURRENT_USER, path, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegOpenKeyA(HKEY_CURRENT_USER, path_win32, &hkey); + ok(res == ERROR_SUCCESS || res == ERROR_FILE_NOT_FOUND, "got %d\n", res); + if (res == ERROR_SUCCESS) + { + res = RegDeleteValueA(hkey, name_win32); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + RegCloseKey(hkey); + } + + path = (is_wow64 || is_64bit) ? path_win32_local_wow64 : path_win32_local; + res = RegOpenKeyA(HKEY_CURRENT_USER, path, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + r = MsiInstallProductA(msifile, "ALLUSERS=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + access = KEY_QUERY_VALUE; + res = RegOpenKeyExA(HKEY_CLASSES_ROOT, classes_path_dotnet, 0, access, &hkey); + if (res == ERROR_FILE_NOT_FOUND && is_wow64) /* Vista WOW64 */ + { + trace("Using 64-bit registry view for HKCR\\Installer\n"); + access = KEY_QUERY_VALUE | KEY_WOW64_64KEY; + res = RegOpenKeyExA(HKEY_CLASSES_ROOT, classes_path_dotnet, 0, access, &hkey); + } + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + CHECK_REG_STR(hkey, name_dotnet, "rcHQPHq?CA@Uv-XqMI1e>Z'q,T*76M@=YEg6My?~]"); + RegCloseKey(hkey); + + path = (is_wow64 || is_64bit) ? classes_path_dotnet_local_wow64 : classes_path_dotnet_local; + res = RegOpenKeyExA(HKEY_CLASSES_ROOT, path, 0, access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + CHECK_REG_STR(hkey, name_dotnet_local, "rcHQPHq?CA@Uv-XqMI1e>LF,8A?0d.AW@vcZ$Cgox"); + RegCloseKey(hkey); + + res = RegOpenKeyExA(HKEY_CLASSES_ROOT, classes_path_win32, 0, access, &hkey); + ok(res == ERROR_SUCCESS || res == ERROR_FILE_NOT_FOUND /* win2k without sxs support */, + "Expected ERROR_SUCCESS, got %d\n", res); + if (res == ERROR_SUCCESS) CHECK_REG_STR(hkey, name_win32, "rcHQPHq?CA@Uv-XqMI1e>}NJjwR'%D9v1p!v{WV(%"); + RegCloseKey(hkey); + + path = (is_wow64 || is_64bit) ? classes_path_win32_local_wow64 : classes_path_win32_local; + res = RegOpenKeyExA(HKEY_CLASSES_ROOT, path, 0, access, &hkey); + ok(res == ERROR_SUCCESS || res == ERROR_FILE_NOT_FOUND /* win2k without sxs support */, + "Expected ERROR_SUCCESS, got %d\n", res); + if (res == ERROR_SUCCESS) CHECK_REG_STR(hkey, name_win32_local, "rcHQPHq?CA@Uv-XqMI1e>C)Uvlj*53A)u(QQ9=)X!"); + RegCloseKey(hkey); + + r = MsiInstallProductA(msifile, "REMOVE=ALL ALLUSERS=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, classes_path_dotnet, &hkey); + ok(res == ERROR_SUCCESS || res == ERROR_FILE_NOT_FOUND, "got %d\n", res); + if (res == ERROR_SUCCESS) + { + res = RegDeleteValueA(hkey, name_dotnet); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + RegCloseKey(hkey); + } + + path = (is_wow64 || is_64bit) ? classes_path_dotnet_local_wow64 : classes_path_dotnet_local; + res = RegOpenKeyA(HKEY_CLASSES_ROOT, path, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + res = RegOpenKeyA(HKEY_CLASSES_ROOT, classes_path_win32, &hkey); + ok(res == ERROR_SUCCESS || res == ERROR_FILE_NOT_FOUND, "got %d\n", res); + if (res == ERROR_SUCCESS) + { + res = RegDeleteValueA(hkey, name_win32); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + RegCloseKey(hkey); + } + + path = (is_wow64 || is_64bit) ? classes_path_win32_local_wow64 : classes_path_win32_local; + res = RegOpenKeyA(HKEY_CLASSES_ROOT, path, &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + +done: + DeleteFileA("msitest\\win32.txt"); + DeleteFileA("msitest\\win32_local.txt"); + DeleteFileA("msitest\\dotnet.txt"); + DeleteFileA("msitest\\dotnet_local.txt"); + DeleteFileA("msitest\\manifest.txt"); + DeleteFileA("msitest\\manifest_local.txt"); + DeleteFileA("msitest\\application_win32.txt"); + DeleteFileA("msitest\\application_dotnet.txt"); + delete_test_files(); + DeleteFile(msifile); +} + +START_TEST(action) +{ + DWORD len; + char temp_path[MAX_PATH], prev_path[MAX_PATH], log_file[MAX_PATH]; + STATEMGRSTATUS status; + BOOL ret = FALSE; + + init_functionpointers(); + + if (pIsWow64Process) + pIsWow64Process(GetCurrentProcess(), &is_wow64); + + GetCurrentDirectoryA(MAX_PATH, prev_path); + GetTempPath(MAX_PATH, temp_path); + SetCurrentDirectoryA(temp_path); + + lstrcpyA(CURR_DIR, temp_path); + len = lstrlenA(CURR_DIR); + + if(len && (CURR_DIR[len - 1] == '\\')) + CURR_DIR[len - 1] = 0; + + ok(get_system_dirs(), "failed to retrieve system dirs\n"); + ok(get_user_dirs(), "failed to retrieve user dirs\n"); + + /* Create a restore point ourselves so we circumvent the multitude of restore points + * that would have been created by all the installation and removal tests. + * + * This is not needed on version 5.0 where setting MSIFASTINSTALL prevents the + * creation of restore points. + */ + if (pSRSetRestorePointA && !pMsiGetComponentPathExA) + { + memset(&status, 0, sizeof(status)); + ret = notify_system_change(BEGIN_NESTED_SYSTEM_CHANGE, &status); + } + + /* Create only one log file and don't append. We have to pass something + * for the log mode for this to work. The logfile needs to have an absolute + * path otherwise we still end up with some extra logfiles as some tests + * change the current directory. + */ + lstrcpyA(log_file, temp_path); + lstrcatA(log_file, "\\msitest.log"); + MsiEnableLogA(INSTALLLOGMODE_FATALEXIT, log_file, 0); + + test_register_product(); + test_publish_product(); + test_publish_features(); + test_register_user(); + test_process_components(); + test_publish(); + test_publish_sourcelist(); + test_remove_files(); + test_move_files(); + test_duplicate_files(); + test_write_registry_values(); + test_envvar(); + test_create_remove_folder(); + test_start_services(); + test_delete_services(); + test_self_registration(); + test_register_font(); + test_validate_product_id(); + test_install_remove_odbc(); + test_register_typelib(); + test_create_remove_shortcut(); + test_publish_components(); + test_remove_duplicate_files(); + test_remove_registry_values(); + test_find_related_products(); + test_remove_ini_values(); + test_remove_env_strings(); + test_register_class_info(); + test_register_extension_info(); + test_register_mime_info(); + test_publish_assemblies(); + + DeleteFileA(log_file); + + if (pSRSetRestorePointA && !pMsiGetComponentPathExA && ret) + { + ret = notify_system_change(END_NESTED_SYSTEM_CHANGE, &status); + if (ret) + remove_restore_point(status.llSequenceNumber); + } + FreeLibrary(hsrclient); + + SetCurrentDirectoryA(prev_path); +} diff --git a/rostests/winetests/msi/automation.c b/rostests/winetests/msi/automation.c index bad4882fac7..8ae18bd9511 100644 --- a/rostests/winetests/msi/automation.c +++ b/rostests/winetests/msi/automation.c @@ -32,16 +32,22 @@ #include "wine/test.h" +static BOOL is_wow64; + +static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD); +static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); + DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); static const char *msifile = "winetest-automation.msi"; static const WCHAR szMsifile[] = {'w','i','n','e','t','e','s','t','-','a','u','t','o','m','a','t','i','o','n','.','m','s','i',0}; static const WCHAR szMSITEST[] = { 'M','S','I','T','E','S','T',0 }; -static const WCHAR szProductCode[] = { '{','F','1','C','3','A','F','5','0','-','8','B','5','6','-','4','A','6','9','-','A','0','0','C','-','0','0','7','7','3','F','E','4','2','F','3','0','}',0 }; +static const WCHAR szProductCode[] = { '{','8','3','7','4','5','0','f','a','-','a','3','9','b','-','4','b','c','8','-','b','3','2','1','-','0','8','b','3','9','3','f','7','8','4','b','3','}',0 }; static const WCHAR szUpgradeCode[] = { '{','C','E','0','6','7','E','8','D','-','2','E','1','A','-','4','3','6','7','-','B','7','3','4','-','4','E','B','2','B','D','A','D','6','5','6','5','}',0 }; static const WCHAR szProductInfoException[] = { 'P','r','o','d','u','c','t','I','n','f','o',',','P','r','o','d','u','c','t',',','A','t','t','r','i','b','u','t','e',0 }; static const WCHAR WINE_INSTALLPROPERTY_PACKAGENAMEW[] = {'P','a','c','k','a','g','e','N','a','m','e',0}; static const WCHAR WINE_INSTALLPROPERTY_PRODUCTNAMEW[] = {'P','r','o','d','u','c','t','N','a','m','e',0}; +static const WCHAR WINE_INSTALLPROPERTY_LOCALPACKAGEW[] = {'L','o','c','a','l','P','a','c','k','a','g','e',0}; static FILETIME systemtime; static CHAR CURR_DIR[MAX_PATH]; static EXCEPINFO excepinfo; @@ -74,7 +80,7 @@ static const CHAR directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n" "MSITESTDIR\tProgramFilesFolder\tmsitest\n" "NEWDIR\tCABOUTDIR\tnew\n" "ProgramFilesFolder\tTARGETDIR\t.\n" - "TARGETDIR\t\tSourceDir"; + "TARGETDIR\t\tSourceDir\n"; static const CHAR feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" @@ -120,7 +126,7 @@ static const CHAR install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "InstallInitialize\t\t1500\n" "InstallValidate\t\t1400\n" "LaunchConditions\t\t100\n" - "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000"; + "WriteRegistryValues\tSourceDir And SOURCEDIR\t5000\n"; static const CHAR media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" "i2\ti4\tL64\tS255\tS32\tS72\n" @@ -136,22 +142,23 @@ static const CHAR property_dat[] = "Property\tValue\n" "InstallMode\tTypical\n" "Manufacturer\tWine\n" "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" - "ProductCode\t{F1C3AF50-8B56-4A69-A00C-00773FE42F30}\n" + "ProductCode\t{837450fa-a39b-4bc8-b321-08b393f784b3}\n" "ProductID\tnone\n" "ProductLanguage\t1033\n" "ProductName\tMSITEST\n" "ProductVersion\t1.1.1\n" "PROMPTROLLBACKCOST\tP\n" "Setup\tSetup\n" - "UpgradeCode\t{CE067E8D-2E1A-4367-B734-4EB2BDAD6565}"; + "UpgradeCode\t{CE067E8D-2E1A-4367-B734-4EB2BDAD6565}\n" + "MSIFASTINSTALL\t1\n"; static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n" "s72\ti2\tl255\tL255\tL0\ts72\n" "Registry\tRegistry\n" - "Apples\t2\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n" - "Oranges\t2\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n" - "regdata\t2\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n" - "OrderTest\t2\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent"; + "Apples\t1\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n" + "Oranges\t1\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n" + "regdata\t1\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n" + "OrderTest\t1\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent\n"; typedef struct _msi_table { @@ -199,6 +206,29 @@ static const msi_summary_info summary_info[] = ADD_INFO_FILETIME(PID_LASTPRINTED, &systemtime) }; +static void init_functionpointers(void) +{ + HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll"); + HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); + +#define GET_PROC(dll, func) \ + p ## func = (void *)GetProcAddress(dll, #func); \ + if(!p ## func) \ + trace("GetProcAddress(%s) failed\n", #func); + + GET_PROC(hadvapi32, RegDeleteKeyExA) + GET_PROC(hkernel32, IsWow64Process) + +#undef GET_PROC +} + +static LONG delete_key_portable( HKEY key, LPCSTR subkey, REGSAM access ) +{ + if (pRegDeleteKeyExA) + return pRegDeleteKeyExA( key, subkey, access, 0 ); + return RegDeleteKeyA( key, subkey ); +} + /* * Database Helpers */ @@ -273,6 +303,7 @@ static void create_database(const CHAR *name, const msi_table *tables, int num_t static BOOL create_package(LPWSTR path) { + static const WCHAR slashW[] = {'\\',0}; DWORD len; /* Prepare package */ @@ -286,9 +317,8 @@ static BOOL create_package(LPWSTR path) if (!len) return FALSE; - /* lstrcatW does not work on win95 */ - path[len - 1] = '\\'; - memcpy(&path[len], szMsifile, sizeof(szMsifile)); + lstrcatW(path, slashW); + lstrcatW(path, szMsifile); return TRUE; } @@ -386,17 +416,6 @@ static void delete_test_files(void) /* ok-like statement which takes two unicode strings or one unicode and one ANSI string as arguments */ static CHAR string1[MAX_PATH], string2[MAX_PATH]; -/* lstrcmpW is not supported on Win9x */ -static int strcmp_ww(const WCHAR* str1, const WCHAR* str2) -{ - CHAR str1A[MAX_PATH], str2A[MAX_PATH]; - - WideCharToMultiByte(CP_ACP, 0, str1, -1, str1A, MAX_PATH, NULL, NULL); - WideCharToMultiByte(CP_ACP, 0, str2, -1, str2A, MAX_PATH, NULL, NULL); - - return lstrcmpA(str1A, str2A); -} - #define ok_w2(format, szString1, szString2) \ \ do { \ @@ -460,7 +479,7 @@ static DISPID get_dispid( IDispatch *disp, const char *name ) str = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR) ); if (str) { - len = MultiByteToWideChar(CP_ACP, 0, name, -1, str, len ); + MultiByteToWideChar(CP_ACP, 0, name, -1, str, len ); r = IDispatch_GetIDsOfNames( disp, &IID_NULL, &str, 1, 0, &id ); HeapFree(GetProcessHeap(), 0, str); if (r != S_OK) @@ -470,113 +489,79 @@ static DISPID get_dispid( IDispatch *disp, const char *name ) return id; } +typedef struct { + DISPID did; + const char *name; + BOOL todo; +} get_did_t; + +static const get_did_t get_did_data[] = { + { 1, "CreateRecord" }, + { 2, "OpenPackage" }, + { 3, "OpenProduct" }, + { 4, "OpenDatabase" }, + { 5, "SummaryInformation" }, + { 6, "UILevel" }, + { 7, "EnableLog" }, + { 8, "InstallProduct" }, + { 9, "Version" }, + { 10, "LastErrorRecord" }, + { 11, "RegistryValue" }, + { 12, "Environment" }, + { 13, "FileAttributes" }, + { 15, "FileSize" }, + { 16, "FileVersion" }, + { 17, "ProductState" }, + { 18, "ProductInfo" }, + { 19, "ConfigureProduct", TRUE }, + { 20, "ReinstallProduct", TRUE }, + { 21, "CollectUserInfo", TRUE }, + { 22, "ApplyPatch", TRUE }, + { 23, "FeatureParent", TRUE }, + { 24, "FeatureState", TRUE }, + { 25, "UseFeature", TRUE }, + { 26, "FeatureUsageCount", TRUE }, + { 27, "FeatureUsageDate", TRUE }, + { 28, "ConfigureFeature", TRUE }, + { 29, "ReinstallFeature", TRUE }, + { 30, "ProvideComponent", TRUE }, + { 31, "ComponentPath", TRUE }, + { 32, "ProvideQualifiedComponent", TRUE }, + { 33, "QualifierDescription", TRUE }, + { 34, "ComponentQualifiers", TRUE }, + { 35, "Products" }, + { 36, "Features", TRUE }, + { 37, "Components", TRUE }, + { 38, "ComponentClients", TRUE }, + { 39, "Patches", TRUE }, + { 40, "RelatedProducts" }, + { 41, "PatchInfo", TRUE }, + { 42, "PatchTransforms", TRUE }, + { 43, "AddSource", TRUE }, + { 44, "ClearSourceList", TRUE }, + { 45, "ForceSourceListResolution", TRUE }, + { 46, "ShortcutTarget", TRUE }, + { 47, "FileHash", TRUE }, + { 48, "FileSignatureInfo", TRUE }, + { 0 } +}; + static void test_dispid(void) { + const get_did_t *ptr = get_did_data; DISPID dispid; - dispid = get_dispid(pInstaller, "CreateRecord"); - ok(dispid == 1, "Expected 1, got %d\n", dispid); - dispid = get_dispid(pInstaller, "OpenPackage"); - ok(dispid == 2, "Expected 2, got %d\n", dispid); - dispid = get_dispid(pInstaller, "OpenProduct"); - ok(dispid == 3, "Expected 3, got %d\n", dispid); - dispid = get_dispid(pInstaller, "OpenDatabase"); - ok(dispid == 4, "Expected 4, got %d\n", dispid); - dispid = get_dispid(pInstaller, "SummaryInformation"); - ok(dispid == 5, "Expected 5, got %d\n", dispid); - dispid = get_dispid( pInstaller, "UILevel" ); - ok(dispid == 6, "Expected 6, got %d\n", dispid); - dispid = get_dispid(pInstaller, "EnableLog"); - ok(dispid == 7, "Expected 7, got %d\n", dispid); - dispid = get_dispid(pInstaller, "InstallProduct"); - ok(dispid == 8, "Expected 8, got %d\n", dispid); - dispid = get_dispid(pInstaller, "Version"); - ok(dispid == 9, "Expected 9, got %d\n", dispid); - dispid = get_dispid(pInstaller, "LastErrorRecord"); - ok(dispid == 10, "Expected 10, got %d\n", dispid); - dispid = get_dispid(pInstaller, "RegistryValue"); - ok(dispid == 11, "Expected 11, got %d\n", dispid); - dispid = get_dispid(pInstaller, "Environment"); - ok(dispid == 12, "Expected 12, got %d\n", dispid); - dispid = get_dispid(pInstaller, "FileAttributes"); - ok(dispid == 13, "Expected 13, got %d\n", dispid); - dispid = get_dispid(pInstaller, "FileSize"); - ok(dispid == 15, "Expected 15, got %d\n", dispid); - dispid = get_dispid(pInstaller, "FileVersion"); - ok(dispid == 16, "Expected 16, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ProductState"); - ok(dispid == 17, "Expected 17, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ProductInfo"); - ok(dispid == 18, "Expected 18, got %d\n", dispid); - todo_wine + while (ptr->name) { - dispid = get_dispid(pInstaller, "ConfigureProduct"); - ok(dispid == 19, "Expected 19, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ReinstallProduct"); - ok(dispid == 20 , "Expected 20, got %d\n", dispid); - dispid = get_dispid(pInstaller, "CollectUserInfo"); - ok(dispid == 21, "Expected 21, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ApplyPatch"); - ok(dispid == 22, "Expected 22, got %d\n", dispid); - dispid = get_dispid(pInstaller, "FeatureParent"); - ok(dispid == 23, "Expected 23, got %d\n", dispid); - dispid = get_dispid(pInstaller, "FeatureState"); - ok(dispid == 24, "Expected 24, got %d\n", dispid); - dispid = get_dispid(pInstaller, "UseFeature"); - ok(dispid == 25, "Expected 25, got %d\n", dispid); - dispid = get_dispid(pInstaller, "FeatureUsageCount"); - ok(dispid == 26, "Expected 26, got %d\n", dispid); - dispid = get_dispid(pInstaller, "FeatureUsageDate"); - ok(dispid == 27, "Expected 27, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ConfigureFeature"); - ok(dispid == 28, "Expected 28, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ReinstallFeature"); - ok(dispid == 29, "Expected 29, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ProvideComponent"); - ok(dispid == 30, "Expected 30, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ComponentPath"); - ok(dispid == 31, "Expected 31, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ProvideQualifiedComponent"); - ok(dispid == 32, "Expected 32, got %d\n", dispid); - dispid = get_dispid(pInstaller, "QualifierDescription"); - ok(dispid == 33, "Expected 33, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ComponentQualifiers"); - ok(dispid == 34, "Expected 34, got %d\n", dispid); - } - dispid = get_dispid(pInstaller, "Products"); - ok(dispid == 35, "Expected 35, got %d\n", dispid); - todo_wine - { - dispid = get_dispid(pInstaller, "Features"); - ok(dispid == 36, "Expected 36, got %d\n", dispid); - dispid = get_dispid(pInstaller, "Components"); - ok(dispid == 37, "Expected 37, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ComponentClients"); - ok(dispid == 38, "Expected 38, got %d\n", dispid); - dispid = get_dispid(pInstaller, "Patches"); - ok(dispid == 39, "Expected 39, got %d\n", dispid); - } - dispid = get_dispid(pInstaller, "RelatedProducts"); - ok(dispid == 40, "Expected 40, got %d\n", dispid); - todo_wine - { - dispid = get_dispid(pInstaller, "PatchInfo"); - ok(dispid == 41, "Expected 41, got %d\n", dispid); - dispid = get_dispid(pInstaller, "PatchTransforms"); - ok(dispid == 42, "Expected 42, got %d\n", dispid); - dispid = get_dispid(pInstaller, "AddSource"); - ok(dispid == 43, "Expected 43, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ClearSourceList"); - ok(dispid == 44, "Expected 44, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ForceSourceListResolution"); - ok(dispid == 45, "Expected 45, got %d\n", dispid); - dispid = get_dispid(pInstaller, "ShortcutTarget"); - ok(dispid == 46, "Expected 46, got %d\n", dispid); - dispid = get_dispid(pInstaller, "FileHash"); - ok(dispid == 47, "Expected 47, got %d\n", dispid); - dispid = get_dispid(pInstaller, "FileSignatureInfo"); - ok(dispid == 48, "Expected 48, got %d\n", dispid); + dispid = get_dispid(pInstaller, ptr->name); + if (ptr->todo) + todo_wine + ok(dispid == ptr->did, "%s: expected %d, got %d\n", ptr->name, ptr->did, dispid); + else + ok(dispid == ptr->did, "%s: expected %d, got %d\n", ptr->name, ptr->did, dispid); + ptr++; } + dispid = get_dispid(pInstaller, "RemovePatches"); ok(dispid == 49 || dispid == -1, "Expected 49 or -1, got %d\n", dispid); dispid = get_dispid(pInstaller, "ApplyMultiplePatches"); @@ -632,10 +617,10 @@ static void test_dispatch(void) /* Test invoking this function (without parameters passed) */ if (0) /* All of these crash MSI on Windows XP */ { - hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, NULL, NULL, NULL, NULL); - hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, NULL, NULL, &excepinfo, NULL); + IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, NULL, NULL, NULL, NULL); + IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, NULL, NULL, &excepinfo, NULL); VariantInit(&varresult); - hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, NULL, &varresult, &excepinfo, NULL); + IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, NULL, &varresult, &excepinfo, NULL); } /* Try with NULL params */ @@ -733,6 +718,12 @@ static void test_dispatch(void) V_VT(&vararg[0]) = VT_BSTR; V_BSTR(&vararg[0]) = SysAllocString(path); hr = IDispatch_Invoke(pInstaller, dispid, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL); + if (hr == DISP_E_EXCEPTION) + { + skip("OpenPackage failed, insufficient rights?\n"); + DeleteFileW(path); + return; + } ok(hr == S_OK, "IDispatch::Invoke returned 0x%08x\n", hr); VariantClear(&vararg[0]); VariantClear(&varresult); @@ -836,7 +827,7 @@ static HRESULT invoke(IDispatch *pDispatch, LPCSTR szName, WORD wFlags, DISPPARA len = MultiByteToWideChar(CP_ACP, 0, szName, -1, NULL, 0 ); name = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR) ); if (!name) return E_FAIL; - len = MultiByteToWideChar(CP_ACP, 0, szName, -1, name, len ); + MultiByteToWideChar(CP_ACP, 0, szName, -1, name, len ); hr = IDispatch_GetIDsOfNames(pDispatch, &IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &dispid); HeapFree(GetProcessHeap(), 0, name); ok(hr == S_OK, "IDispatch::GetIDsOfNames returned 0x%08x\n", hr); @@ -925,9 +916,7 @@ static HRESULT Installer_RegistryValueW(HKEY hkey, LPCWSTR szKey, LPCWSTR szValu V_BSTR(&vararg) = SysAllocString(szValue); hr = Installer_RegistryValue(hkey, szKey, vararg, &varresult, VT_BSTR); - if (V_BSTR(&varresult)) - /* lstrcpyW is not implemented on Win95 (lstrlenW is though) */ - memcpy(szString, V_BSTR(&varresult), (lstrlenW(V_BSTR(&varresult)) + 1) * sizeof(WCHAR)); + if (V_BSTR(&varresult)) lstrcpyW(szString, V_BSTR(&varresult)); VariantClear(&varresult); return hr; } @@ -943,8 +932,7 @@ static HRESULT Installer_RegistryValueI(HKEY hkey, LPCWSTR szKey, int iValue, LP V_I4(&vararg) = iValue; hr = Installer_RegistryValue(hkey, szKey, vararg, &varresult, vtResult); - if (SUCCEEDED(hr) && vtResult == VT_BSTR) - memcpy(szString, V_BSTR(&varresult), (lstrlenW(V_BSTR(&varresult)) + 1) * sizeof(WCHAR)); + if (SUCCEEDED(hr) && vtResult == VT_BSTR) lstrcpyW(szString, V_BSTR(&varresult)); VariantClear(&varresult); return hr; } @@ -1035,8 +1023,7 @@ static HRESULT Installer_ProductInfo(LPCWSTR szProduct, LPCWSTR szAttribute, LPW V_BSTR(&vararg[0]) = SysAllocString(szAttribute); hr = invoke(pInstaller, "ProductInfo", DISPATCH_PROPERTYGET, &dispparams, &varresult, VT_BSTR); - if (V_BSTR(&varresult)) - memcpy(szString, V_BSTR(&varresult), (lstrlenW(V_BSTR(&varresult)) + 1) * sizeof(WCHAR)); + if (V_BSTR(&varresult)) lstrcpyW(szString, V_BSTR(&varresult)); VariantClear(&varresult); return hr; } @@ -1075,12 +1062,25 @@ static HRESULT Installer_VersionGet(LPWSTR szVersion) HRESULT hr; hr = invoke(pInstaller, "Version", DISPATCH_PROPERTYGET, &dispparams, &varresult, VT_BSTR); - if (V_BSTR(&varresult)) - memcpy(szVersion, V_BSTR(&varresult), (lstrlenW(V_BSTR(&varresult)) + 1) * sizeof(WCHAR)); + if (V_BSTR(&varresult)) lstrcpyW(szVersion, V_BSTR(&varresult)); VariantClear(&varresult); return hr; } +static HRESULT Installer_UILevelPut(int level) +{ + VARIANT varresult; + VARIANTARG vararg; + DISPID dispid = DISPID_PROPERTYPUT; + DISPPARAMS dispparams = {&vararg, &dispid, sizeof(vararg)/sizeof(VARIANTARG), 1}; + + VariantInit(&vararg); + V_VT(&vararg) = VT_I4; + V_I4(&vararg) = level; + + return invoke(pInstaller, "UILevel", DISPATCH_PROPERTYPUT, &dispparams, &varresult, VT_EMPTY); +} + static HRESULT Session_Installer(IDispatch *pSession, IDispatch **pInst) { VARIANT varresult; @@ -1104,8 +1104,7 @@ static HRESULT Session_PropertyGet(IDispatch *pSession, LPCWSTR szName, LPWSTR s V_BSTR(&vararg[0]) = SysAllocString(szName); hr = invoke(pSession, "Property", DISPATCH_PROPERTYGET, &dispparams, &varresult, VT_BSTR); - if (V_BSTR(&varresult)) - memcpy(szReturn, V_BSTR(&varresult), (lstrlenW(V_BSTR(&varresult)) + 1) * sizeof(WCHAR)); + if (V_BSTR(&varresult)) lstrcpyW(szReturn, V_BSTR(&varresult)); VariantClear(&varresult); return hr; } @@ -1404,8 +1403,7 @@ static HRESULT Record_StringDataGet(IDispatch *pRecord, int iField, LPWSTR szStr V_I4(&vararg[0]) = iField; hr = invoke(pRecord, "StringData", DISPATCH_PROPERTYGET, &dispparams, &varresult, VT_BSTR); - if (V_BSTR(&varresult)) - memcpy(szString, V_BSTR(&varresult), (lstrlenW(V_BSTR(&varresult)) + 1) * sizeof(WCHAR)); + if (V_BSTR(&varresult)) lstrcpyW(szString, V_BSTR(&varresult)); VariantClear(&varresult); return hr; } @@ -1482,8 +1480,7 @@ static HRESULT StringList_Item(IDispatch *pStringList, int iIndex, LPWSTR szStri V_I4(&vararg[0]) = iIndex; hr = invoke(pStringList, "Item", DISPATCH_PROPERTYGET, &dispparams, &varresult, VT_BSTR); - if (V_BSTR(&varresult)) - memcpy(szString, V_BSTR(&varresult), (lstrlenW(V_BSTR(&varresult)) + 1) * sizeof(WCHAR)); + if (V_BSTR(&varresult)) lstrcpyW(szString, V_BSTR(&varresult)); VariantClear(&varresult); return hr; } @@ -1837,7 +1834,7 @@ static void test_Session(IDispatch *pSession) memset(stringw, 0, sizeof(stringw)); hr = Session_PropertyGet(pSession, szProductName, stringw); ok(hr == S_OK, "Session_PropertyGet failed, hresult 0x%08x\n", hr); - if (strcmp_ww(stringw, szMSITEST) != 0) + if (lstrcmpW(stringw, szMSITEST) != 0) { len = WideCharToMultiByte(CP_ACP, 0, stringw, -1, string, MAX_PATH, NULL, NULL); ok(len, "WideCharToMultiByteChar returned error %d\n", GetLastError()); @@ -1850,7 +1847,7 @@ static void test_Session(IDispatch *pSession) memset(stringw, 0, sizeof(stringw)); hr = Session_PropertyGet(pSession, szProductName, stringw); ok(hr == S_OK, "Session_PropertyGet failed, hresult 0x%08x\n", hr); - if (strcmp_ww(stringw, szProductName) != 0) + if (lstrcmpW(stringw, szProductName) != 0) { len = WideCharToMultiByte(CP_ACP, 0, stringw, -1, string, MAX_PATH, NULL, NULL); ok(len, "WideCharToMultiByteChar returned error %d\n", GetLastError()); @@ -2054,7 +2051,8 @@ static void test_Installer_RegistryValue(void) "RegSetValueExW failed\n"); ok(!RegSetValueExW(hkey,szThree,0,REG_BINARY, (const BYTE *)qw, 4), "RegSetValueExW failed\n"); - ok(SetEnvironmentVariableA("MSITEST", "Four"), "SetEnvironmentVariableA failed %d\n", GetLastError()); + bRet = SetEnvironmentVariableA("MSITEST", "Four"); + ok(bRet, "SetEnvironmentVariableA failed %d\n", GetLastError()); ok(!RegSetValueExW(hkey,szFour,0,REG_EXPAND_SZ, (const BYTE *)szExpand, sizeof(szExpand)), "RegSetValueExW failed\n"); ok(!RegSetValueExW(hkey,szFive,0,REG_MULTI_SZ, (const BYTE *)szFive, sizeof(szFive)), @@ -2209,7 +2207,7 @@ static void test_Installer_Products(BOOL bProductInstalled) ok(iValue == INSTALLSTATE_DEFAULT || iValue == INSTALLSTATE_ADVERTISED, "Installer_ProductState returned %d, expected %d or %d\n", iValue, INSTALLSTATE_DEFAULT, INSTALLSTATE_ADVERTISED); /* Not found our product code yet? Check */ - if (!bProductFound && !strcmp_ww(szString, szProductCode)) + if (!bProductFound && !lstrcmpW(szString, szProductCode)) bProductFound = TRUE; /* IEnumVARIANT::Next */ @@ -2239,7 +2237,7 @@ static void test_Installer_Products(BOOL bProductInstalled) if (0) /* Crashes on Windows XP */ { /* IEnumVARIANT::Clone, NULL pointer */ - hr = IEnumVARIANT_Clone(pEnum, NULL); + IEnumVARIANT_Clone(pEnum, NULL); } /* IEnumVARIANT::Clone */ @@ -2314,30 +2312,30 @@ static void test_Installer_Products(BOOL bProductInstalled) /* Delete a registry subkey, including all its subkeys (RegDeleteKey does not work on keys with subkeys without * deleting the subkeys first) */ -static UINT delete_registry_key(HKEY hkeyParent, LPCSTR subkey) +static UINT delete_registry_key(HKEY hkeyParent, LPCSTR subkey, REGSAM access) { UINT ret; CHAR *string = NULL; HKEY hkey; DWORD dwSize; - ret = RegOpenKey(hkeyParent, subkey, &hkey); + ret = RegOpenKeyEx(hkeyParent, subkey, 0, access, &hkey); if (ret != ERROR_SUCCESS) return ret; ret = RegQueryInfoKeyA(hkey, NULL, NULL, NULL, NULL, &dwSize, NULL, NULL, NULL, NULL, NULL, NULL); if (ret != ERROR_SUCCESS) return ret; if (!(string = HeapAlloc(GetProcessHeap(), 0, ++dwSize))) return ERROR_NOT_ENOUGH_MEMORY; while (RegEnumKeyA(hkey, 0, string, dwSize) == ERROR_SUCCESS) - delete_registry_key(hkey, string); + delete_registry_key(hkey, string, access); RegCloseKey(hkey); HeapFree(GetProcessHeap(), 0, string); - RegDeleteKeyA(hkeyParent, subkey); + delete_key_portable(hkeyParent, subkey, access); return ERROR_SUCCESS; } /* Find a specific registry subkey at any depth within the given key and subkey and return its parent key. */ -static UINT find_registry_key(HKEY hkeyParent, LPCSTR subkey, LPCSTR findkey, HKEY *phkey) +static UINT find_registry_key(HKEY hkeyParent, LPCSTR subkey, LPCSTR findkey, REGSAM access, HKEY *phkey) { UINT ret; CHAR *string = NULL; @@ -2348,7 +2346,7 @@ static UINT find_registry_key(HKEY hkeyParent, LPCSTR subkey, LPCSTR findkey, HK *phkey = 0; - ret = RegOpenKey(hkeyParent, subkey, &hkey); + ret = RegOpenKeyEx(hkeyParent, subkey, 0, access, &hkey); if (ret != ERROR_SUCCESS) return ret; ret = RegQueryInfoKeyA(hkey, NULL, NULL, NULL, NULL, &dwSize, NULL, NULL, NULL, NULL, NULL, NULL); if (ret != ERROR_SUCCESS) return ret; @@ -2362,7 +2360,7 @@ static UINT find_registry_key(HKEY hkeyParent, LPCSTR subkey, LPCSTR findkey, HK *phkey = hkey; found = TRUE; } - else if (find_registry_key(hkey, string, findkey, phkey) == ERROR_SUCCESS) found = TRUE; + else if (find_registry_key(hkey, string, findkey, access, phkey) == ERROR_SUCCESS) found = TRUE; } if (*phkey != hkey) RegCloseKey(hkey); @@ -2380,14 +2378,22 @@ static void test_Installer_InstallProduct(void) DWORD num, size, type; int iValue, iCount; IDispatch *pStringList = NULL; + REGSAM access = KEY_ALL_ACCESS; + + if (is_wow64) + access |= KEY_WOW64_64KEY; create_test_files(); + /* Avoid an interactive dialog in case of insufficient privileges. */ + hr = Installer_UILevelPut(INSTALLUILEVEL_NONE); + ok(hr == S_OK, "Expected UILevel property put invoke to return S_OK, got 0x%08x\n", hr); + /* Installer::InstallProduct */ hr = Installer_InstallProduct(szMsifile, NULL); if (hr == DISP_E_EXCEPTION) { - skip("Installer object not supported.\n"); + skip("InstallProduct failed, insufficient rights?\n"); delete_test_files(); return; } @@ -2446,20 +2452,24 @@ static void test_Installer_InstallProduct(void) IDispatch_Release(pStringList); } + hr = Installer_ProductInfo(szProductCode, WINE_INSTALLPROPERTY_LOCALPACKAGEW, szString); + ok(hr == S_OK, "Installer_ProductInfo failed, hresult 0x%08x\n", hr); + DeleteFileW( szString ); + /* Check & clean up installed files & registry keys */ ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); size = MAX_PATH; @@ -2487,40 +2497,36 @@ static void test_Installer_InstallProduct(void) RegCloseKey(hkey); - res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + res = RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Remove registry keys written by RegisterProduct standard action */ - res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{F1C3AF50-8B56-4A69-A00C-00773FE42F30}"); + res = delete_key_portable(HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{837450fa-a39b-4bc8-b321-08b393f784b3}", + KEY_WOW64_32KEY); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UpgradeCodes\\D8E760ECA1E276347B43E42BDBDA5656"); + res = delete_key_portable(HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UpgradeCodes\\D8E760ECA1E276347B43E42BDBDA5656", access); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - res = find_registry_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData", "05FA3C1F65B896A40AC00077F34EF203", &hkey); - ok(res == ERROR_SUCCESS || - broken(res == ERROR_FILE_NOT_FOUND), /* win9x */ - "Expected ERROR_SUCCESS, got %d\n", res); - if (res == ERROR_SUCCESS) - { - res = delete_registry_key(hkey, "05FA3C1F65B896A40AC00077F34EF203"); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - RegCloseKey(hkey); + res = find_registry_key(HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData", "af054738b93a8cb43b12803b397f483b", access, &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - res = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Products\\05FA3C1F65B896A40AC00077F34EF203"); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - } - else - { - /* win9x defaults to a per-machine install. */ - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Products\\05FA3C1F65B896A40AC00077F34EF203"); - } + res = delete_registry_key(hkey, "af054738b93a8cb43b12803b397f483b", access); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegCloseKey(hkey); + + res = delete_key_portable(HKEY_LOCAL_MACHINE, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\Products\\af054738b93a8cb43b12803b397f483b", access); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); /* Remove registry keys written by PublishProduct standard action */ res = RegOpenKey(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Installer", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - res = delete_registry_key(hkey, "Products\\05FA3C1F65B896A40AC00077F34EF203"); + res = delete_registry_key(hkey, "Products\\af054738b93a8cb43b12803b397f483b", KEY_ALL_ACCESS); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = RegDeleteKeyA(hkey, "UpgradeCodes\\D8E760ECA1E276347B43E42BDBDA5656"); @@ -2528,7 +2534,7 @@ static void test_Installer_InstallProduct(void) RegCloseKey(hkey); - /* Delete installation files we installed */ + /* Delete installation files we created */ delete_test_files(); } @@ -2592,6 +2598,12 @@ static void test_Installer(void) /* Installer::OpenPackage */ hr = Installer_OpenPackage(szPath, 0, &pSession); + if (hr == DISP_E_EXCEPTION) + { + skip("OpenPackage failed, insufficient rights?\n"); + DeleteFileW(szPath); + return; + } ok(hr == S_OK, "Installer_OpenPackage failed, hresult 0x%08x\n", hr); if (hr == S_OK) { @@ -2663,6 +2675,11 @@ START_TEST(automation) CLSID clsid; IUnknown *pUnk; + init_functionpointers(); + + if (pIsWow64Process) + pIsWow64Process(GetCurrentProcess(), &is_wow64); + GetSystemTimeAsFileTime(&systemtime); GetCurrentDirectoryA(MAX_PATH, prev_path); diff --git a/rostests/winetests/msi/db.c b/rostests/winetests/msi/db.c index 5e8505ad109..d33eb0c857e 100644 --- a/rostests/winetests/msi/db.c +++ b/rostests/winetests/msi/db.c @@ -96,6 +96,9 @@ static void test_msidatabase(void) res = MsiOpenDatabase( msifile, MSIDBOPEN_READONLY, &hdb ); ok( res == ERROR_SUCCESS , "Failed to open database\n" ); + res = MsiDatabaseCommit( hdb ); + ok( res == ERROR_SUCCESS , "Failed to commit database\n" ); + res = MsiCloseHandle( hdb ); ok( res == ERROR_SUCCESS , "Failed to close database\n" ); @@ -182,6 +185,22 @@ static UINT run_query( MSIHANDLE hdb, MSIHANDLE hrec, const char *query ) return r; } +static UINT run_queryW( MSIHANDLE hdb, MSIHANDLE hrec, const WCHAR *query ) +{ + MSIHANDLE hview = 0; + UINT r; + + r = MsiDatabaseOpenViewW(hdb, query, &hview); + if( r != ERROR_SUCCESS ) + return r; + + r = MsiViewExecute(hview, hrec); + if( r == ERROR_SUCCESS ) + r = MsiViewClose(hview); + MsiCloseHandle(hview); + return r; +} + static UINT create_component_table( MSIHANDLE hdb ) { return run_query( hdb, 0, @@ -278,7 +297,7 @@ make_add_entry(binary, static void test_msiinsert(void) { - MSIHANDLE hdb = 0, hview = 0, hrec = 0; + MSIHANDLE hdb = 0, hview = 0, hview2 = 0, hrec = 0; UINT r; const char *query; char buf[80]; @@ -303,6 +322,14 @@ static void test_msiinsert(void) r = MsiCloseHandle(hview); ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + query = "SELECT * FROM phone WHERE number = '8675309'"; + r = MsiDatabaseOpenView(hdb, query, &hview2); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + r = MsiViewExecute(hview2, 0); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + r = MsiViewFetch(hview2, &hrec); + ok(r == ERROR_NO_MORE_ITEMS, "MsiViewFetch produced items\n"); + /* insert a value into it */ query = "INSERT INTO `phone` ( `id`, `name`, `number` )" "VALUES('1', 'Abe', '8675309')"; @@ -315,6 +342,20 @@ static void test_msiinsert(void) r = MsiCloseHandle(hview); ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + r = MsiViewFetch(hview2, &hrec); + ok(r == ERROR_NO_MORE_ITEMS, "MsiViewFetch produced items\n"); + r = MsiViewExecute(hview2, 0); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + r = MsiViewFetch(hview2, &hrec); + ok(r == ERROR_SUCCESS, "MsiViewFetch failed: %u\n", r); + + r = MsiCloseHandle(hrec); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + r = MsiViewClose(hview2); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); + r = MsiCloseHandle(hview2); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + query = "SELECT * FROM `phone` WHERE `id` = 1"; r = do_query(hdb, query, &hrec); ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n"); @@ -686,6 +727,36 @@ static void test_msibadqueries(void) r = try_query( hdb, "select * from 'c'"); ok(r == ERROR_BAD_QUERY_SYNTAX, "query failed\n"); + r = try_query( hdb, "select `c`.`b` from `c` order by `c`.`order`"); + ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = try_query( hdb, "select `c`.b` from `c`"); + ok( r == ERROR_SUCCESS, "query failed: %u\n", r ); + + r = try_query( hdb, "select `c`.`b from `c`"); + ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = try_query( hdb, "select `c`.b from `c`"); + ok( r == ERROR_SUCCESS, "query failed: %u\n", r ); + + r = try_query( hdb, "select `c.`b` from `c`"); + ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = try_query( hdb, "select c`.`b` from `c`"); + ok( r == ERROR_SUCCESS, "query failed: %u\n", r ); + + r = try_query( hdb, "select c.`b` from `c`"); + ok( r == ERROR_SUCCESS, "query failed: %u\n", r ); + + r = try_query( hdb, "select `c`.`b` from c`"); + ok( r == ERROR_SUCCESS, "query failed: %u\n", r ); + + r = try_query( hdb, "select `c`.`b` from `c"); + ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = try_query( hdb, "select `c`.`b` from c"); + ok( r == ERROR_SUCCESS, "query failed: %u\n", r ); + r = try_query( hdb, "CREATE TABLE `\5a` (`b` CHAR NOT NULL PRIMARY KEY `b`)" ); ok( r == ERROR_SUCCESS , "query failed: %u\n", r ); @@ -738,6 +809,19 @@ static void test_viewmodify(void) r = run_query( hdb, 0, query ); ok(r == ERROR_SUCCESS, "query failed\n"); + query = "CREATE TABLE `_Validation` ( " + "`Table` CHAR(32) NOT NULL, `Column` CHAR(32) NOT NULL, " + "`Nullable` CHAR(4) NOT NULL, `MinValue` INT, `MaxValue` INT, " + "`KeyTable` CHAR(255), `KeyColumn` SHORT, `Category` CHAR(32), " + "`Set` CHAR(255), `Description` CHAR(255) PRIMARY KEY `Table`, `Column`)"; + r = run_query( hdb, 0, query ); + ok(r == ERROR_SUCCESS, "query failed\n"); + + query = "INSERT INTO `_Validation` ( `Table`, `Column`, `Nullable` ) " + "VALUES('phone', 'id', 'N')"; + r = run_query( hdb, 0, query ); + ok(r == ERROR_SUCCESS, "query failed\n"); + /* check what the error function reports without doing anything */ sz = 0; /* passing NULL as the 3rd param make function to crash on older platforms */ @@ -792,6 +876,13 @@ static void test_viewmodify(void) r = MsiViewModify(hview, -1, hrec ); ok(r == ERROR_INVALID_DATA, "MsiViewModify failed\n"); + sz = sizeof buffer; + buffer[0] = 'x'; + err = MsiViewGetError( hview, buffer, &sz ); + ok(err == MSIDBERROR_NOERROR, "MsiViewGetError return\n"); + ok(buffer[0] == 0, "buffer not cleared\n"); + ok(sz == 0, "size not zero\n"); + r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "failed to close record\n"); @@ -810,6 +901,20 @@ static void test_viewmodify(void) r = MsiViewModify(hview, MSIMODIFY_INSERT_TEMPORARY, hrec ); ok(r == ERROR_SUCCESS, "MsiViewModify failed\n"); + /* validate it */ + r = MsiViewExecute(hview, 0); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + + r = MsiViewModify(hview, MSIMODIFY_VALIDATE_NEW, hrec ); + ok(r == ERROR_INVALID_DATA, "MsiViewModify failed %u\n", r); + + sz = sizeof buffer; + buffer[0] = 'x'; + err = MsiViewGetError( hview, buffer, &sz ); + ok(err == MSIDBERROR_DUPLICATEKEY, "MsiViewGetError returned %u\n", err); + ok(!strcmp(buffer, "id"), "expected \"id\" c, got \"%s\"\n", buffer); + ok(sz == 2, "size not 2\n"); + /* insert the same thing again */ r = MsiViewExecute(hview, 0); ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); @@ -1998,7 +2103,7 @@ static const CHAR suminfo[] = "PropertyId\tValue\n" "4\tWineHQ\n" "5\tInstaller\n" "6\tInstaller comments\n" - "7\tIntel;1033\n" + "7\tIntel;1033,2057\n" "9\t{12345678-1234-1234-1234-123456789012}\n" "12\t2009/04/12 15:46:11\n" "13\t2009/04/12 15:46:11\n" @@ -2107,8 +2212,8 @@ static void test_suminfo_import(void) r = MsiSummaryInfoGetPropertyA(hsi, PID_TEMPLATE, &type, NULL, NULL, str_value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(type == VT_LPSTR, "Expected VT_LPSTR, got %u\n", type); - ok(!strcmp(str_value, "Intel;1033"), - "Expected \"Intel;1033\", got %s\n", str_value); + ok(!strcmp(str_value, "Intel;1033,2057"), + "Expected \"Intel;1033,2057\", got %s\n", str_value); size = sizeof(str_value); r = MsiSummaryInfoGetPropertyA(hsi, PID_REVNUMBER, &type, NULL, NULL, str_value, &size); @@ -2170,24 +2275,17 @@ static void test_msiimport(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = add_table_to_db(hdb, endlines1); - if (r == ERROR_FUNCTION_FAILED) - { - /* win9x doesn't handle this case */ - skip("endlines not handled correctly.\n"); - MsiCloseHandle(hdb); - DeleteFileA(msifile); - return; - } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = add_table_to_db(hdb, endlines2); - ok(r == ERROR_FUNCTION_FAILED, - "Expected ERROR_FUNCTION_FAILED, got %d\n", r); + ok(r == ERROR_FUNCTION_FAILED, "Expected ERROR_FUNCTION_FAILED, got %d\n", r); query = "SELECT * FROM `TestTable`"; r = MsiDatabaseOpenView(hdb, query, &view); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiViewGetColumnInfo(view, MSICOLINFO_NAMES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); count = MsiRecordGetFieldCount(rec); ok(count == 9, "Expected 9, got %d\n", count); ok(check_record(rec, 1, "FirstPrimaryColumn"), "Expected FirstPrimaryColumn\n"); @@ -2202,6 +2300,7 @@ static void test_msiimport(void) MsiCloseHandle(rec); r = MsiViewGetColumnInfo(view, MSICOLINFO_TYPES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); count = MsiRecordGetFieldCount(rec); ok(count == 9, "Expected 9, got %d\n", count); ok(check_record(rec, 1, "s255"), "Expected s255\n"); @@ -2247,6 +2346,7 @@ static void test_msiimport(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiViewGetColumnInfo(view, MSICOLINFO_NAMES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); count = MsiRecordGetFieldCount(rec); ok(count == 2, "Expected 2, got %d\n", count); ok(check_record(rec, 1, "PrimaryOne"), "Expected PrimaryOne\n"); @@ -2255,6 +2355,7 @@ static void test_msiimport(void) MsiCloseHandle(rec); r = MsiViewGetColumnInfo(view, MSICOLINFO_TYPES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); count = MsiRecordGetFieldCount(rec); ok(count == 2, "Expected 2, got %d\n", count); ok(check_record(rec, 1, "s255"), "Expected s255\n"); @@ -2294,6 +2395,7 @@ static void test_msiimport(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiViewGetColumnInfo(view, MSICOLINFO_NAMES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); count = MsiRecordGetFieldCount(rec); ok(count == 6, "Expected 6, got %d\n", count); ok(check_record(rec, 1, "A"), "Expected A\n"); @@ -2305,6 +2407,7 @@ static void test_msiimport(void) MsiCloseHandle(rec); r = MsiViewGetColumnInfo(view, MSICOLINFO_TYPES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); count = MsiRecordGetFieldCount(rec); ok(count == 6, "Expected 6, got %d\n", count); ok(check_record(rec, 1, "s72"), "Expected s72\n"); @@ -2877,7 +2980,7 @@ static UINT set_summary_info(MSIHANDLE hdb) ok( res == ERROR_SUCCESS , "Failed to set summary info\n" ); res = MsiSummaryInfoSetProperty(suminfo,7, VT_LPSTR, 0,NULL, - ";1033"); + ";1033,2057"); ok( res == ERROR_SUCCESS , "Failed to set summary info\n" ); res = MsiSummaryInfoSetProperty(suminfo,9, VT_LPSTR, 0,NULL, @@ -2916,6 +3019,7 @@ static MSIHANDLE create_package_db(LPCSTR filename) ok( res == ERROR_SUCCESS , "Failed to commit database\n" ); res = set_summary_info(hdb); + ok( res == ERROR_SUCCESS , "Failed to set summary info\n" ); res = create_directory_table(hdb); ok( res == ERROR_SUCCESS , "Failed to create directory table\n" ); @@ -2923,27 +3027,31 @@ static MSIHANDLE create_package_db(LPCSTR filename) return hdb; } -static MSIHANDLE package_from_db(MSIHANDLE hdb) +static UINT package_from_db(MSIHANDLE hdb, MSIHANDLE *handle) { UINT res; - CHAR szPackage[10]; + CHAR szPackage[12]; MSIHANDLE hPackage; - sprintf(szPackage,"#%i",hdb); - res = MsiOpenPackage(szPackage,&hPackage); + sprintf(szPackage, "#%u", hdb); + res = MsiOpenPackage(szPackage, &hPackage); if (res != ERROR_SUCCESS) - return 0; + return res; res = MsiCloseHandle(hdb); if (res != ERROR_SUCCESS) - return 0; + { + MsiCloseHandle(hPackage); + return res; + } - return hPackage; + *handle = hPackage; + return ERROR_SUCCESS; } static void test_try_transform(void) { - MSIHANDLE hdb, hview, hrec, hpkg; + MSIHANDLE hdb, hview, hrec, hpkg = 0; LPCSTR query; UINT r; DWORD sz; @@ -3117,8 +3225,13 @@ static void test_try_transform(void) MsiCloseHandle(hview); /* check that the property was added */ - hpkg = package_from_db(hdb); - ok(hpkg != 0, "Expected non-NULL hpkg\n"); + r = package_from_db(hdb, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); sz = MAX_PATH; r = MsiGetProperty(hpkg, "prop", buffer, &sz); @@ -3126,8 +3239,9 @@ static void test_try_transform(void) ok(!lstrcmp(buffer, "val"), "Expected val, got %s\n", buffer); MsiCloseHandle(hpkg); - MsiCloseHandle(hdb); +error: + MsiCloseHandle(hdb); DeleteFile(msifile); DeleteFile(mstfile); } @@ -3833,7 +3947,7 @@ static void test_join(void) /* primary key cannot be updated */ r = MsiViewModify(hview, MSIMODIFY_UPDATE, hrec); - todo_wine ok( r == ERROR_FUNCTION_FAILED, "failed to update row: %d\n", r ); + ok( r == ERROR_FUNCTION_FAILED, "failed to update row: %d\n", r ); MsiCloseHandle(hrec); MsiViewClose(hview); @@ -4191,6 +4305,7 @@ static void test_integers(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiViewGetColumnInfo(view, MSICOLINFO_NAMES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); count = MsiRecordGetFieldCount(rec); ok(count == 8, "Expected 8, got %d\n", count); ok(check_record(rec, 1, "one"), "Expected one\n"); @@ -4204,6 +4319,7 @@ static void test_integers(void) MsiCloseHandle(rec); r = MsiViewGetColumnInfo(view, MSICOLINFO_TYPES, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); count = MsiRecordGetFieldCount(rec); ok(count == 8, "Expected 8, got %d\n", count); ok(check_record(rec, 1, "I2"), "Expected I2\n"); @@ -4919,6 +5035,172 @@ static void test_rows_order(void) DeleteFile(msifile); } +static void test_collation(void) +{ + static const WCHAR query1[] = + {'I','N','S','E','R','T',' ','I','N','T','O',' ','`','b','a','r','`',' ', + '(','`','f','o','o','`',',','`','b','a','z','`',')',' ','V','A','L','U','E','S',' ', + '(','\'','a',0x30a,'\'',',','\'','C','\'',')',0}; + static const WCHAR query2[] = + {'I','N','S','E','R','T',' ','I','N','T','O',' ','`','b','a','r','`',' ', + '(','`','f','o','o','`',',','`','b','a','z','`',')',' ','V','A','L','U','E','S',' ', + '(','\'',0xe5,'\'',',','\'','D','\'',')',0}; + static const WCHAR query3[] = + {'C','R','E','A','T','E',' ','T','A','B','L','E',' ','`','b','a','z','`',' ', + '(',' ','`','a',0x30a,'`',' ','L','O','N','G','C','H','A','R',' ','N','O','T',' ','N','U','L','L',',', + ' ','`',0xe5,'`',' ','L','O','N','G','C','H','A','R',' ','N','O','T',' ','N','U','L','L',' ', + 'P','R','I','M','A','R','Y',' ','K','E','Y',' ','`','a',0x30a,'`',')',0}; + static const WCHAR query4[] = + {'C','R','E','A','T','E',' ','T','A','B','L','E',' ','`','a',0x30a,'`',' ', + '(',' ','`','f','o','o','`',' ','L','O','N','G','C','H','A','R',' ','N','O','T',' ', + 'N','U','L','L',' ','P','R','I','M','A','R','Y',' ','K','E','Y',' ','`','f','o','o','`',')',0}; + static const WCHAR query5[] = + {'C','R','E','A','T','E',' ','T','A','B','L','E',' ','`',0xe5,'`',' ', + '(',' ','`','f','o','o','`',' ','L','O','N','G','C','H','A','R',' ','N','O','T',' ', + 'N','U','L','L',' ','P','R','I','M','A','R','Y',' ','K','E','Y',' ','`','f','o','o','`',')',0}; + static const WCHAR query6[] = + {'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ','`','b','a','r','`',' ','W','H','E','R','E', + ' ','`','f','o','o','`',' ','=','\'',0xe5,'\'',0}; + static const WCHAR letter_C[] = {'C',0}; + static const WCHAR letter_D[] = {'D',0}; + static const WCHAR letter_a_ring[] = {'a',0x30a,0}; + static const WCHAR letter_a_with_ring[] = {0xe5,0}; + const char *query; + MSIHANDLE hdb = 0, hview = 0, hrec = 0; + UINT r; + char buffer[100]; + WCHAR bufferW[100]; + DWORD sz; + + r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb); + ok(r == ERROR_SUCCESS, "MsiOpenDatabase failed\n"); + + query = "CREATE TABLE `bar` ( " + "`foo` LONGCHAR NOT NULL, " + "`baz` LONGCHAR NOT NULL " + "PRIMARY KEY `foo` )"; + r = run_query(hdb, 0, query); + ok(r == ERROR_SUCCESS, "failed to create table\n"); + + r = run_query(hdb, 0, query); + ok(r == ERROR_BAD_QUERY_SYNTAX, "wrong error %u\n", r); + + r = run_query(hdb, 0, "INSERT INTO `bar` " + "( `foo`, `baz` ) VALUES ( '\2', 'A' )"); + ok(r == ERROR_SUCCESS, "cannot add value to table %u\n", r); + + r = run_query(hdb, 0, "INSERT INTO `bar` " + "( `foo`, `baz` ) VALUES ( '\1', 'B' )"); + ok(r == ERROR_SUCCESS, "cannot add value to table %u\n", r); + + r = run_queryW(hdb, 0, query1); + ok(r == ERROR_SUCCESS, "cannot add value to table %u\n", r); + + r = run_queryW(hdb, 0, query2); + ok(r == ERROR_SUCCESS, "cannot add value to table %u\n", r); + + r = run_queryW(hdb, 0, query3); + ok(r == ERROR_SUCCESS, "cannot create table %u\n", r); + + r = run_queryW(hdb, 0, query4); + ok(r == ERROR_SUCCESS, "cannot create table %u\n", r); + + r = run_queryW(hdb, 0, query5); + ok(r == ERROR_SUCCESS, "cannot create table %u\n", r); + + query = "SELECT * FROM `bar`"; + r = MsiDatabaseOpenView(hdb, query, &hview); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + r = MsiViewExecute(hview, 0); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + + r = MsiViewFetch(hview, &hrec); + ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n"); + sz = sizeof(buffer); + r = MsiRecordGetString(hrec, 1, buffer, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmp(buffer, "\2"), "Expected \\2, got '%s'\n", buffer); + sz = sizeof(buffer); + r = MsiRecordGetString(hrec, 2, buffer, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmp(buffer, "A"), "Expected A, got '%s'\n", buffer); + MsiCloseHandle(hrec); + + r = MsiViewFetch(hview, &hrec); + ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n"); + sz = sizeof(buffer); + r = MsiRecordGetString(hrec, 1, buffer, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmp(buffer, "\1"), "Expected \\1, got '%s'\n", buffer); + sz = sizeof(buffer); + r = MsiRecordGetString(hrec, 2, buffer, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmp(buffer, "B"), "Expected B, got '%s'\n", buffer); + MsiCloseHandle(hrec); + + r = MsiViewFetch(hview, &hrec); + ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n"); + sz = sizeof(bufferW) / sizeof(bufferW[0]); + r = MsiRecordGetStringW(hrec, 1, bufferW, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!memcmp(bufferW, letter_a_ring, sizeof(letter_a_ring)), + "Expected %s, got %s\n", wine_dbgstr_w(letter_a_ring), wine_dbgstr_w(bufferW)); + sz = sizeof(bufferW) / sizeof(bufferW[0]); + r = MsiRecordGetStringW(hrec, 2, bufferW, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpW(bufferW, letter_C), "Expected C, got %s\n", wine_dbgstr_w(bufferW)); + MsiCloseHandle(hrec); + + r = MsiViewFetch(hview, &hrec); + ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n"); + sz = sizeof(bufferW) / sizeof(bufferW[0]); + r = MsiRecordGetStringW(hrec, 1, bufferW, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!memcmp(bufferW, letter_a_with_ring, sizeof(letter_a_with_ring)), + "Expected %s, got %s\n", wine_dbgstr_w(letter_a_with_ring), wine_dbgstr_w(bufferW)); + sz = sizeof(bufferW) / sizeof(bufferW[0]); + r = MsiRecordGetStringW(hrec, 2, bufferW, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpW(bufferW, letter_D), "Expected D, got %s\n", wine_dbgstr_w(bufferW)); + MsiCloseHandle(hrec); + + r = MsiViewClose(hview); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); + r = MsiCloseHandle(hview); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + + r = MsiDatabaseOpenViewW(hdb, query6, &hview); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + r = MsiViewExecute(hview, 0); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + + r = MsiViewFetch(hview, &hrec); + ok(r == ERROR_SUCCESS, "MsiViewFetch failed\n"); + sz = sizeof(bufferW) / sizeof(bufferW[0]); + r = MsiRecordGetStringW(hrec, 1, bufferW, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!memcmp(bufferW, letter_a_with_ring, sizeof(letter_a_with_ring)), + "Expected %s, got %s\n", wine_dbgstr_w(letter_a_with_ring), wine_dbgstr_w(bufferW)); + sz = sizeof(bufferW) / sizeof(bufferW[0]); + r = MsiRecordGetStringW(hrec, 2, bufferW, &sz); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpW(bufferW, letter_D), "Expected D, got %s\n", wine_dbgstr_w(bufferW)); + MsiCloseHandle(hrec); + + r = MsiViewFetch(hview, &hrec); + ok(r == ERROR_NO_MORE_ITEMS, "MsiViewFetch failed\n"); + + r = MsiViewClose(hview); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); + r = MsiCloseHandle(hview); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + + r = MsiCloseHandle(hdb); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + + DeleteFile(msifile); +} + static void test_select_markers(void) { MSIHANDLE hdb = 0, rec, view, res; @@ -5063,6 +5345,7 @@ static void test_select_markers(void) static void test_viewmodify_update(void) { MSIHANDLE hdb = 0, hview = 0, hrec = 0; + UINT i, test_max, offset, count; const char *query; UINT r; @@ -5229,6 +5512,90 @@ static void test_viewmodify_update(void) r = MsiCloseHandle(hview); ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + query = "CREATE TABLE `table2` (`A` INT, `B` INT PRIMARY KEY `A`)"; + r = run_query( hdb, 0, query ); + ok(r == ERROR_SUCCESS, "query failed\n"); + + query = "INSERT INTO `table2` (`A`, `B`) VALUES (?, ?)"; + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + + test_max = 100; + offset = 1234; + for(i = 0; i < test_max; i++) + { + + hrec = MsiCreateRecord( 2 ); + MsiRecordSetInteger( hrec, 1, test_max - i ); + MsiRecordSetInteger( hrec, 2, i ); + + r = MsiViewExecute( hview, hrec ); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + + r = MsiCloseHandle( hrec ); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + } + + r = MsiViewClose( hview ); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + r = MsiCloseHandle( hview ); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + + /* Update. */ + query = "SELECT * FROM `table2` ORDER BY `B`"; + r = MsiDatabaseOpenView( hdb, query, &hview); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + r = MsiViewExecute( hview, 0 ); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + + count = 0; + while (MsiViewFetch( hview, &hrec ) == ERROR_SUCCESS) + { + UINT b = MsiRecordGetInteger( hrec, 2 ); + + r = MsiRecordSetInteger( hrec, 2, b + offset); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + + r = MsiViewModify( hview, MSIMODIFY_UPDATE, hrec ); + ok(r == ERROR_SUCCESS, "Got %d\n", r); + + r = MsiCloseHandle(hrec); + ok(r == ERROR_SUCCESS, "failed to close record\n"); + count++; + } + ok(count == test_max, "Got count %d\n", count); + + r = MsiViewClose(hview); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); + r = MsiCloseHandle(hview); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + + /* Recheck. */ + query = "SELECT * FROM `table2` ORDER BY `B`"; + r = MsiDatabaseOpenView( hdb, query, &hview); + ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); + r = MsiViewExecute( hview, 0 ); + ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); + + count = 0; + while (MsiViewFetch( hview, &hrec ) == ERROR_SUCCESS) + { + UINT a = MsiRecordGetInteger( hrec, 1 ); + UINT b = MsiRecordGetInteger( hrec, 2 ); + ok( ( test_max - a + offset) == b, "Got (%d, %d), expected (%d, %d)\n", + a, b, test_max - a + offset, b); + + r = MsiCloseHandle(hrec); + ok(r == ERROR_SUCCESS, "failed to close record\n"); + count++; + } + ok(count == test_max, "Got count %d\n", count); + + r = MsiViewClose(hview); + ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); + r = MsiCloseHandle(hview); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + r = MsiCloseHandle( hdb ); ok(r == ERROR_SUCCESS, "MsiOpenDatabase close failed\n"); } @@ -5488,16 +5855,13 @@ static void test_stringtable(void) sz = sizeof(buffer); r = MsiRecordGetString(hrec, 2, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmp(buffer, "one"), "Expected one, got %s\n", buffer); + ok(!lstrcmp(buffer, "one"), "Expected one, got '%s'\n", buffer); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiViewFetch(hview, &hrec); - todo_wine - { - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); - } + ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); r = MsiViewClose(hview); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -5525,7 +5889,7 @@ static void test_stringtable(void) sz = sizeof(buffer); r = MsiRecordGetString(hrec, 2, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmp(buffer, "two"), "Expected two, got %s\n", buffer); + ok(!lstrcmp(buffer, "two"), "Expected two, got '%s'\n", buffer); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -5542,7 +5906,7 @@ static void test_stringtable(void) sz = sizeof(buffer); r = MsiRecordGetString(hrec, 2, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmp(buffer, "five"), "Expected five, got %s\n", buffer); + ok(!lstrcmp(buffer, "five"), "Expected five, got '%s'\n", buffer); r = MsiCloseHandle(hrec); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -5570,11 +5934,8 @@ static void test_stringtable(void) hr = IStream_Read(stm, data, MAX_PATH, &read); ok(hr == S_OK, "Expected S_OK, got %d\n", hr); - todo_wine - { - ok(read == 4, "Expected 4, got %d\n", read); - ok(!memcmp(data, data10, read), "Unexpected data\n"); - } + ok(read == 4, "Expected 4, got %d\n", read); + todo_wine ok(!memcmp(data, data10, read), "Unexpected data\n"); hr = IStream_Release(stm); ok(hr == S_OK, "Expected S_OK, got %d\n", hr); @@ -6780,6 +7141,7 @@ static void test_forcecodepage(void) UINT r; DeleteFile(msifile); + GetCurrentDirectoryA(MAX_PATH, CURR_DIR); r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -6817,7 +7179,24 @@ static void test_forcecodepage(void) read_file_data("forcecodepage.idt", buffer); ok(!lstrcmpA(buffer, "\r\n\r\n0\t_ForceCodepage\r\n"), - "Expected \"\r\n\r\n0\t_ForceCodepage\r\n\", got \"%s\"", buffer); + "Expected \"\r\n\r\n0\t_ForceCodepage\r\n\", got \"%s\"\n", buffer); + + create_file_data("forcecodepage.idt", "\r\n\r\n850\t_ForceCodepage\r\n", 0); + + r = MsiDatabaseImportA(hdb, CURR_DIR, "forcecodepage.idt"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiDatabaseExport(hdb, "_ForceCodepage", CURR_DIR, "forcecodepage.idt"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + read_file_data("forcecodepage.idt", buffer); + ok(!lstrcmpA(buffer, "\r\n\r\n850\t_ForceCodepage\r\n"), + "Expected \"\r\n\r\n850\t_ForceCodepage\r\n\", got \"%s\"\n", buffer); + + create_file_data("forcecodepage.idt", "\r\n\r\n9999\t_ForceCodepage\r\n", 0); + + r = MsiDatabaseImportA(hdb, CURR_DIR, "forcecodepage.idt"); + ok(r == ERROR_FUNCTION_FAILED, "Expected ERROR_SUCCESS, got %d\n", r); MsiCloseHandle(hdb); DeleteFileA(msifile); @@ -7172,8 +7551,7 @@ static void test_storages_table(void) static void test_dbtopackage(void) { MSIHANDLE hdb, hpkg; - CHAR package[10]; - CHAR buf[MAX_PATH]; + CHAR package[12], buf[MAX_PATH]; DWORD size; UINT r; @@ -7192,8 +7570,13 @@ static void test_dbtopackage(void) r = add_custom_action_entry(hdb, "'SetProp', 51, 'MYPROP', 'grape'"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - sprintf(package, "#%i", hdb); + sprintf(package, "#%u", hdb); r = MsiOpenPackage(package, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* property is not set yet */ @@ -7251,7 +7634,7 @@ static void test_dbtopackage(void) r = add_custom_action_entry(hdb, "'SetProp', 51, 'MYPROP', 'grape'"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - sprintf(package, "#%i", hdb); + sprintf(package, "#%u", hdb); r = MsiOpenPackage(package, &hpkg); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -7292,8 +7675,10 @@ static void test_dbtopackage(void) ok(size == 0, "Expected 0, got %d\n", size); } - MsiCloseHandle(hdb); MsiCloseHandle(hpkg); + +error: + MsiCloseHandle(hdb); DeleteFileA(msifile); } @@ -7847,10 +8232,12 @@ static void test_dbmerge(void) size = MAX_PATH; r = MsiRecordGetString(hrec, 1, buf, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(buf, "Table"), "Expected \"Table\", got \"%s\"\n", buf); size = MAX_PATH; r = MsiRecordGetString(hrec, 2, buf, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(buf, "NumRowMergeConflicts"), "Expected \"NumRowMergeConflicts\", got \"%s\"\n", buf); @@ -7861,10 +8248,12 @@ static void test_dbmerge(void) size = MAX_PATH; r = MsiRecordGetString(hrec, 1, buf, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(buf, "s255"), "Expected \"s255\", got \"%s\"\n", buf); size = MAX_PATH; r = MsiRecordGetString(hrec, 2, buf, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(buf, "i2"), "Expected \"i2\", got \"%s\"\n", buf); MsiCloseHandle(hrec); @@ -7965,10 +8354,7 @@ static void test_dbmerge(void) GetCurrentDirectoryA(MAX_PATH, buf); r = MsiDatabaseImportA(hdb, buf, "codepage.idt"); - todo_wine - { - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); query = "DROP TABLE `One`"; r = run_query(hdb, 0, query); @@ -8214,7 +8600,7 @@ static void test_select_with_tablenames(void) DeleteFileA(msifile); } -UINT ordervals[6][3] = +static const UINT ordervals[6][3] = { { MSI_NULL_INTEGER, 12, 13 }, { 1, 2, 3 }, @@ -8480,6 +8866,7 @@ static void test_columnorder(void) query = "SELECT * FROM `T`"; r = do_query(hdb, query, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); sz = MAX_PATH; lstrcpyA(buf, "kiwi"); @@ -8705,6 +9092,7 @@ static void test_columnorder(void) query = "SELECT * FROM `Z`"; r = do_query(hdb, query, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiRecordGetInteger(rec, 1); ok(r == 2, "Expected 2, got %d\n", r); @@ -8870,6 +9258,7 @@ static void test_createtable(void) size = sizeof(buffer); res = MsiRecordGetString(hrec, 1, buffer, &size ); todo_wine ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + MsiCloseHandle( hrec ); res = MsiViewClose( htab ); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); @@ -8899,10 +9288,12 @@ static void test_createtable(void) res = MsiViewGetColumnInfo( htab, MSICOLINFO_NAMES, &hrec ); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + buffer[0] = 0; size = sizeof(buffer); res = MsiRecordGetString(hrec, 1, buffer, &size ); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); ok(!strcmp(buffer,"b"), "b != %s\n", buffer); + MsiCloseHandle( hrec ); res = MsiViewClose( htab ); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); @@ -8926,6 +9317,7 @@ static void test_createtable(void) res = MsiViewGetColumnInfo( htab, MSICOLINFO_NAMES, &hrec ); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + buffer[0] = 0; size = sizeof(buffer); res = MsiRecordGetString(hrec, 1, buffer, &size ); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); @@ -8950,6 +9342,288 @@ static void test_createtable(void) DeleteFileA(msifile); } +static void test_embedded_nulls(void) +{ + static const char control_table[] = + "Dialog\tText\n" + "s72\tL0\n" + "Control\tDialog\n" + "LicenseAgreementDlg\ttext\x11\x19text\0text"; + UINT r, sz; + MSIHANDLE hdb, hrec; + char buffer[32]; + + r = MsiOpenDatabaseA( msifile, MSIDBOPEN_CREATE, &hdb ); + ok( r == ERROR_SUCCESS, "failed to open database %u\n", r ); + + GetCurrentDirectoryA( MAX_PATH, CURR_DIR ); + write_file( "temp_file", control_table, sizeof(control_table) ); + r = MsiDatabaseImportA( hdb, CURR_DIR, "temp_file" ); + ok( r == ERROR_SUCCESS, "failed to import table %u\n", r ); + DeleteFileA( "temp_file" ); + + r = do_query( hdb, "SELECT `Text` FROM `Control` WHERE `Dialog` = 'LicenseAgreementDlg'", &hrec ); + ok( r == ERROR_SUCCESS, "query failed %u\n", r ); + + buffer[0] = 0; + sz = sizeof(buffer); + r = MsiRecordGetStringA( hrec, 1, buffer, &sz ); + ok( r == ERROR_SUCCESS, "failed to get string %u\n", r ); + ok( !memcmp( "text\r\ntext\ntext", buffer, sizeof("text\r\ntext\ntext") - 1 ), "wrong buffer contents \"%s\"\n", buffer ); + + MsiCloseHandle( hrec ); + MsiCloseHandle( hdb ); + DeleteFileA( msifile ); +} + +static void test_select_column_names(void) +{ + MSIHANDLE hdb = 0, rec, rec2, view; + char buffer[32]; + UINT r, size; + + DeleteFile(msifile); + + r = MsiOpenDatabase( msifile, MSIDBOPEN_CREATE, &hdb ); + ok( r == ERROR_SUCCESS , "failed to open database: %u\n", r ); + + r = try_query( hdb, "CREATE TABLE `t` (`a` CHAR NOT NULL, `b` CHAR PRIMARY KEY `a`)"); + ok( r == ERROR_SUCCESS , "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT `t`.`b` FROM `t` WHERE `t`.`b` = `x`" ); + ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT '', `t`.`b` FROM `t` WHERE `t`.`b` = 'x'" ); + ok( r == ERROR_SUCCESS , "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT *, `t`.`b` FROM `t` WHERE `t`.`b` = 'x'" ); + todo_wine ok( r == ERROR_SUCCESS, "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT 'b', `t`.`b` FROM `t` WHERE `t`.`b` = 'x'" ); + ok( r == ERROR_SUCCESS , "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT `t`.`b`, '' FROM `t` WHERE `t`.`b` = 'x'" ); + ok( r == ERROR_SUCCESS , "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT `t`.`b`, '' FROM `t` WHERE `t`.`b` = 'x' ORDER BY `b`" ); + ok( r == ERROR_SUCCESS , "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT `t`.`b`, '' FROM `t` WHERE `t`.`b` = 'x' ORDER BY 'b'" ); + ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT 't'.'b' FROM `t` WHERE `t`.`b` = 'x'" ); + ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT 'b' FROM `t` WHERE `t`.`b` = 'x'" ); + ok( r == ERROR_SUCCESS , "query failed: %u\n", r ); + + r = try_query( hdb, "INSERT INTO `t` ( `a`, `b` ) VALUES( '1', '2' )" ); + ok( r == ERROR_SUCCESS , "query failed: %u\n", r ); + + r = try_query( hdb, "INSERT INTO `t` ( `a`, `b` ) VALUES( '3', '4' )" ); + ok( r == ERROR_SUCCESS , "query failed: %u\n", r ); + + r = MsiDatabaseOpenView( hdb, "SELECT '' FROM `t`", &view ); + ok( r == ERROR_SUCCESS, "failed to open database view: %u\n", r ); + + r = MsiViewExecute( view, 0 ); + ok( r == ERROR_SUCCESS, "failed to execute view: %u\n", r ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + r = MsiRecordGetFieldCount( rec ); + ok( r == 1, "got %u\n", r ); + r = MsiViewGetColumnInfo( view, MSICOLINFO_NAMES, &rec2 ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + r = MsiRecordGetFieldCount( rec2 ); + ok( r == 1, "got %u\n", r ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec2, 1, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !buffer[0], "got \"%s\"\n", buffer ); + MsiCloseHandle( rec2 ); + r = MsiViewGetColumnInfo( view, MSICOLINFO_TYPES, &rec2 ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + r = MsiRecordGetFieldCount( rec2 ); + ok( r == 1, "got %u\n", r ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec2, 1, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !lstrcmpA( buffer, "f0" ), "got \"%s\"\n", buffer ); + MsiCloseHandle( rec2 ); + + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 1, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !buffer[0], "got \"%s\"\n", buffer ); + MsiCloseHandle( rec ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 1, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !buffer[0], "got \"%s\"\n", buffer ); + MsiCloseHandle( rec ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_NO_MORE_ITEMS, "unexpected result: %u\n", r ); + MsiCloseHandle( rec ); + + MsiViewClose( view ); + MsiCloseHandle( view ); + + r = MsiDatabaseOpenView( hdb, "SELECT `a`, '' FROM `t`", &view ); + ok( r == ERROR_SUCCESS, "failed to open database view: %u\n", r ); + + r = MsiViewExecute( view, 0 ); + ok( r == ERROR_SUCCESS, "failed to execute view: %u\n", r ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + r = MsiRecordGetFieldCount( rec ); + ok( r == 2, "got %u\n", r ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 1, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !lstrcmpA( buffer, "1" ), "got \"%s\"\n", buffer ); + MsiCloseHandle( rec ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 2, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !buffer[0], "got \"%s\"\n", buffer ); + MsiCloseHandle( rec ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_NO_MORE_ITEMS, "unexpected result: %u\n", r ); + MsiCloseHandle( rec ); + + MsiViewClose( view ); + MsiCloseHandle( view ); + + r = MsiDatabaseOpenView( hdb, "SELECT '', `a` FROM `t`", &view ); + ok( r == ERROR_SUCCESS, "failed to open database view: %u\n", r ); + + r = MsiViewExecute( view, 0 ); + ok( r == ERROR_SUCCESS, "failed to execute view: %u\n", r ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + r = MsiRecordGetFieldCount( rec ); + ok( r == 2, "got %u\n", r ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 1, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !buffer[0], "got \"%s\"\n", buffer ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 2, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !lstrcmpA( buffer, "1" ), "got \"%s\"\n", buffer ); + MsiCloseHandle( rec ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 1, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !buffer[0], "got \"%s\"\n", buffer ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 2, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !lstrcmpA( buffer, "3" ), "got \"%s\"\n", buffer ); + MsiCloseHandle( rec ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_NO_MORE_ITEMS, "unexpected result: %u\n", r ); + MsiCloseHandle( rec ); + + MsiViewClose( view ); + MsiCloseHandle( view ); + + r = MsiDatabaseOpenView( hdb, "SELECT `a`, '', `b` FROM `t`", &view ); + ok( r == ERROR_SUCCESS, "failed to open database view: %u\n", r ); + + r = MsiViewExecute( view, 0 ); + ok( r == ERROR_SUCCESS, "failed to execute view: %u\n", r ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + r = MsiRecordGetFieldCount( rec ); + ok( r == 3, "got %u\n", r ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 1, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !lstrcmpA( buffer, "1" ), "got \"%s\"\n", buffer ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 2, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !buffer[0], "got \"%s\"\n", buffer ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 3, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !lstrcmpA( buffer, "2" ), "got \"%s\"\n", buffer ); + MsiCloseHandle( rec ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 1, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !lstrcmpA( buffer, "3" ), "got \"%s\"\n", buffer ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 2, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !buffer[0], "got \"%s\"\n", buffer ); + size = sizeof(buffer); + memset( buffer, 0x55, sizeof(buffer) ); + r = MsiRecordGetStringA( rec, 3, buffer, &size ); + ok( r == ERROR_SUCCESS, "unexpected result: %u\n", r ); + ok( !lstrcmpA( buffer, "4" ), "got \"%s\"\n", buffer ); + MsiCloseHandle( rec ); + + r = MsiViewFetch( view, &rec ); + ok( r == ERROR_NO_MORE_ITEMS, "unexpected result: %u\n", r ); + MsiCloseHandle( rec ); + + MsiViewClose( view ); + MsiCloseHandle( view ); + + r = try_query( hdb, "SELECT '' FROM `t` WHERE `t`.`b` = 'x'" ); + ok( r == ERROR_SUCCESS , "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT `` FROM `t` WHERE `t`.`b` = 'x'" ); + todo_wine ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT `b` FROM 't' WHERE `t`.`b` = 'x'" ); + ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT `b` FROM `t` WHERE 'b' = 'x'" ); + ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = try_query( hdb, "SELECT `t`.`b`, `` FROM `t` WHERE `t`.`b` = 'x'" ); + todo_wine ok( r == ERROR_BAD_QUERY_SYNTAX, "query failed: %u\n", r ); + + r = MsiCloseHandle( hdb ); + ok(r == ERROR_SUCCESS , "failed to close database: %u\n", r); +} START_TEST(db) { @@ -9003,4 +9677,7 @@ START_TEST(db) test_columnorder(); test_suminfo_import(); test_createtable(); + test_collation(); + test_embedded_nulls(); + test_select_column_names(); } diff --git a/rostests/winetests/msi/format.c b/rostests/winetests/msi/format.c index 3d4029cb0ac..3ecfc66ad25 100644 --- a/rostests/winetests/msi/format.c +++ b/rostests/winetests/msi/format.c @@ -201,15 +201,20 @@ static MSIHANDLE create_package_db(void) DeleteFile(msifile); /* create an empty database */ - res = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb ); - ok( res == ERROR_SUCCESS , "Failed to create database\n" ); + res = MsiOpenDatabase(msifile, MSIDBOPEN_CREATEDIRECT, &hdb ); + ok( res == ERROR_SUCCESS , "Failed to create database %u\n", res ); if( res != ERROR_SUCCESS ) - return hdb; + return 0; res = MsiDatabaseCommit( hdb ); ok( res == ERROR_SUCCESS , "Failed to commit database\n" ); + if( res != ERROR_SUCCESS ) + return 0; res = set_summary_info(hdb); + ok( res == ERROR_SUCCESS , "Failed to set summary info %u\n", res ); + if( res != ERROR_SUCCESS ) + return 0; res = run_query( hdb, "CREATE TABLE `Directory` ( " @@ -217,25 +222,31 @@ static MSIHANDLE create_package_db(void) "`Directory_Parent` CHAR(255), " "`DefaultDir` CHAR(255) NOT NULL " "PRIMARY KEY `Directory`)" ); - ok( res == ERROR_SUCCESS , "Failed to create directory table\n" ); + ok( res == ERROR_SUCCESS , "Failed to create directory table %u\n", res ); return hdb; } -static MSIHANDLE package_from_db(MSIHANDLE hdb) +static UINT package_from_db(MSIHANDLE hdb, MSIHANDLE *handle) { UINT res; - CHAR szPackage[10]; + CHAR szPackage[12]; MSIHANDLE hPackage; - sprintf(szPackage,"#%i",hdb); - res = MsiOpenPackage(szPackage,&hPackage); - ok( res == ERROR_SUCCESS , "Failed to open package\n" ); + sprintf(szPackage, "#%u", hdb); + res = MsiOpenPackage(szPackage, &hPackage); + if (res != ERROR_SUCCESS) + return res; res = MsiCloseHandle(hdb); - ok( res == ERROR_SUCCESS , "Failed to close db handle\n" ); + if (res != ERROR_SUCCESS) + { + MsiCloseHandle(hPackage); + return res; + } - return hPackage; + *handle = hPackage; + return ERROR_SUCCESS; } static void create_test_file(const CHAR *name) @@ -250,22 +261,21 @@ static void create_test_file(const CHAR *name) CloseHandle(file); } -static MSIHANDLE helper_createpackage( const char *szName ) +static UINT helper_createpackage( const char *szName, MSIHANDLE *handle ) { - MSIHANDLE hdb = 0; + MSIHANDLE hPackage, suminfo, hdb = 0; UINT res; - CHAR szPackage[10]; - MSIHANDLE hPackage; - MSIHANDLE suminfo; DeleteFile(szName); /* create an empty database */ - res = MsiOpenDatabase(szName, MSIDBOPEN_CREATE, &hdb ); - ok( res == ERROR_SUCCESS , "Failed to create database\n" ); + res = MsiOpenDatabase(szName, MSIDBOPEN_CREATEDIRECT, &hdb ); + ok( res == ERROR_SUCCESS , "Failed to create database %u\n", res ); + if (res != ERROR_SUCCESS) + return res; res = MsiDatabaseCommit( hdb ); - ok( res == ERROR_SUCCESS , "Failed to commit database\n" ); + ok( res == ERROR_SUCCESS , "Failed to commit database %u\n", res ); /* build summary info */ res = MsiGetSummaryInformation(hdb, NULL, 7, &suminfo); @@ -303,14 +313,15 @@ static MSIHANDLE helper_createpackage( const char *szName ) res = MsiCloseHandle( suminfo); ok( res == ERROR_SUCCESS , "Failed to close suminfo\n" ); - sprintf(szPackage,"#%i",hdb); - res = MsiOpenPackage(szPackage,&hPackage); - ok( res == ERROR_SUCCESS , "Failed to open package\n" ); + res = package_from_db( hdb, &hPackage ); + MsiCloseHandle(hdb); - res = MsiCloseHandle( hdb ); - ok( res == ERROR_SUCCESS , "Failed to close database\n" ); + if (res != ERROR_SUCCESS) + DeleteFileA( szName ); + else + *handle = hPackage; - return hPackage; + return res; } static void test_createpackage(void) @@ -318,11 +329,16 @@ static void test_createpackage(void) MSIHANDLE hPackage = 0; UINT res; - hPackage = helper_createpackage( msifile ); - ok ( hPackage != 0, " Failed to create package\n"); + res = helper_createpackage( msifile, &hPackage ); + if (res == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + return; + } + ok( res == ERROR_SUCCESS, "Failed to create package %u\n", res ); - res = MsiCloseHandle( hPackage); - ok( res == ERROR_SUCCESS , "Failed to close package\n" ); + res = MsiCloseHandle( hPackage ); + ok( res == ERROR_SUCCESS , "Failed to close package %u\n", res ); DeleteFile( msifile ); } @@ -457,7 +473,9 @@ static void test_formatrecord(void) /* now put something in the first field */ r = MsiRecordSetString(hrec, 0, "[1] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -468,6 +486,7 @@ static void test_formatrecord(void) /* empty string */ r = MsiRecordSetString(hrec, 0, ""); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); @@ -477,7 +496,9 @@ static void test_formatrecord(void) /* play games with recursive lookups */ r = MsiRecordSetString(hrec, 0, "[[1]] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -487,7 +508,9 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"hey hey"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "[[1]] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "[2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -497,8 +520,11 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"[[2]] hey"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "[[[3]]] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -513,9 +539,13 @@ static void test_formatrecord(void) ok( hrec, "failed to create record\n"); r = MsiRecordSetString(hrec, 0, "[[3][1]] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -525,10 +555,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"big hey"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "[[3][4][1]] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -538,10 +573,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"big hey"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "[[3][[4]][1]] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -552,10 +592,15 @@ static void test_formatrecord(void) /* incorrect formats */ r = MsiRecordSetString(hrec, 0, "[[[3][[4]][1]] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -565,10 +610,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"[[[3][[4]][1]] [2]"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "[[3][[4]][1]] [2]]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -581,10 +631,15 @@ static void test_formatrecord(void) /* play games with {} */ r = MsiRecordSetString(hrec, 0, "{[3][1]} [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -594,10 +649,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"12 hey"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "[{[3][1]}] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -608,10 +668,15 @@ static void test_formatrecord(void) r = MsiRecordSetString(hrec, 0, "{test} [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -621,10 +686,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"{test} hey"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{[test]} [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -634,10 +704,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"{[test]} hey"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{[1][2][3][4]} [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -647,10 +722,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer," hey"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{[1][2][3][dummy]} [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -660,10 +740,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"{2hey1[dummy]} hey"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{[1][2][3][4][dummy]} [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -673,10 +758,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"{2hey1[dummy]} hey"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{{[1][2]}[3][4][dummy]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -686,10 +776,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"{{2hey}1[dummy]}"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{{[1][2]}[3]{[4][dummy]}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hey"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -699,10 +794,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{{[1][2]}[3]} {[1][2]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "3"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -712,10 +812,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"{{12}3} {12}"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{[1][2]} {{[1][2]}[3]} {[1][2]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "3"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -725,10 +830,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"12 {{12}3} {12}"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{[4]}{[1][2]} {{[1][2]}[3]} {[1][2]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "3"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -738,10 +848,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"12 {{12}3} {12}"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{blah} {[4]}{[1][2]} {{[1][2]}[3]} {[1][2]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "3"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -751,10 +866,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"{blah} 12 {{12}3} {12}"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{{[1]}[2]} {[4]}{[1][2]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "3"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -764,10 +884,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"{{1}2} {}{12}"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{{[1]}} {[4]}{[1][2]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "3"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -777,10 +902,15 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer," 12"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "{{{[1]}} {[4]}{[1][2]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "1"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "3"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 12, "big"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -793,7 +923,9 @@ static void test_formatrecord(void) /* now put play games with escaping */ r = MsiRecordSetString(hrec, 0, "[1] [2] [\\3asdf]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -804,7 +936,9 @@ static void test_formatrecord(void) /* now put play games with escaping */ r = MsiRecordSetString(hrec, 0, "[1] [2] [\\x]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -813,28 +947,32 @@ static void test_formatrecord(void) ok( sz == 12, "size wrong\n"); ok( 0 == strcmp(buffer,"boo hoo [\\x]"), "wrong output\n"); - MsiRecordSetString(hrec, 0, "[\\x]"); + r = MsiRecordSetString(hrec, 0, "[\\x]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 4, "size wrong: %d\n", sz); ok( 0 == strcmp(buffer,"[\\x]"), "wrong output: %s\n", buffer); - MsiRecordSetString(hrec, 0, "{\\x}"); + r = MsiRecordSetString(hrec, 0, "{\\x}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 4, "size wrong: %d\n", sz); ok( 0 == strcmp(buffer,"{\\x}"), "wrong output: %s\n", buffer); - MsiRecordSetString(hrec, 0, "[abc\\x]"); + r = MsiRecordSetString(hrec, 0, "[abc\\x]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 7, "size wrong: %d\n", sz); ok( 0 == strcmp(buffer,"[abc\\x]"), "wrong output: %s\n", buffer); - MsiRecordSetString(hrec, 0, "[\\[]Bracket Text[\\]]"); + r = MsiRecordSetString(hrec, 0, "[\\[]Bracket Text[\\]]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); @@ -843,7 +981,9 @@ static void test_formatrecord(void) /* now try other formats without a package */ r = MsiRecordSetString(hrec, 0, "[1] [2] [property]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -853,7 +993,9 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"boo hoo [property]"), "wrong output\n"); r = MsiRecordSetString(hrec, 0, "[1] [~] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -863,6 +1005,7 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"boo [~] hoo"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "[1]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetInteger(hrec, 1, 123456); ok( r == ERROR_SUCCESS, "set integer failed\n"); sz = sizeof buffer; @@ -872,6 +1015,7 @@ static void test_formatrecord(void) ok( 0 == strcmp(buffer,"123456"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "[~]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); @@ -879,6 +1023,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 2, "size wrong\n"); @@ -887,6 +1032,7 @@ static void test_formatrecord(void) /* MsiFormatRecord doesn't seem to handle a negative too well */ r = MsiRecordSetString(hrec, 0, "[-1]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 4, "size wrong\n"); @@ -894,6 +1040,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{[]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 4, "size wrong\n"); @@ -901,6 +1048,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[0]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); @@ -908,6 +1056,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[100]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 0, "size wrong\n"); @@ -915,8 +1064,11 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{[1] [2]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 7, "size wrong\n"); @@ -924,6 +1076,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 0, "size wrong\n"); @@ -931,6 +1084,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{foo}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 5, "size wrong\n"); @@ -938,7 +1092,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{boo [1]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 7, "size wrong\n"); @@ -946,7 +1102,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{[1]}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 0, "size wrong\n"); @@ -954,7 +1112,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{ {[1]}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -965,7 +1125,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{[1]} }"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 8, "size wrong\n"); @@ -973,7 +1135,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{ [1]}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 0, "size wrong\n"); @@ -981,7 +1145,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{[1] }}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 0, "size wrong\n"); @@ -989,6 +1155,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{a}{b}{c }{ d}{any text}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 0, "size wrong\n"); @@ -996,6 +1163,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{a} }"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 6, "size wrong\n"); @@ -1003,22 +1171,23 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{a} {b}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 0, "size wrong\n"); ok( 0 == strcmp(buffer,""), "wrong output\n"); ok( r == ERROR_SUCCESS, "format failed\n"); - todo_wine { r = MsiRecordSetString(hrec, 0, "{{a} b}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); - ok( sz == 0, "size wrong\n"); - ok( 0 == strcmp(buffer,""), "wrong output\n"); - } + todo_wine ok( sz == 0, "size wrong\n"); + todo_wine ok( 0 == strcmp(buffer,""), "wrong output\n"); ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{a b}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 0, "size wrong\n"); @@ -1026,6 +1195,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{ }"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); @@ -1033,32 +1203,33 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, " {{a}}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 2, "size wrong\n"); ok( 0 == strcmp(buffer," }"), "wrong output\n"); ok( r == ERROR_SUCCESS, "format failed\n"); - todo_wine { r = MsiRecordSetString(hrec, 0, "{{ almost {{ any }} text }}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); - ok( sz == 8, "size wrong\n"); - ok( 0 == strcmp(buffer," text }}"), "wrong output\n"); - } + todo_wine ok( sz == 8, "size wrong\n"); + todo_wine ok( 0 == strcmp(buffer," text }}"), "wrong output\n"); ok( r == ERROR_SUCCESS, "format failed\n"); - todo_wine { r = MsiRecordSetString(hrec, 0, "{{ } { hidden ][ [ }}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); - ok( sz == 0, "size wrong\n"); - ok( 0 == strcmp(buffer,""), "wrong output\n"); - } + todo_wine ok( sz == 0, "size wrong\n"); + todo_wine ok( 0 == strcmp(buffer,""), "wrong output\n"); ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[ 1]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 4, "size wrong\n"); @@ -1066,33 +1237,39 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[01]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); ok( 0 == strcmp(buffer,"hoo"), "wrong output\n"); ok( r == ERROR_SUCCESS, "format failed\n"); - todo_wine { r = MsiRecordSetString(hrec, 0, "{{test}} [01"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); - ok( sz == 4, "size wrong\n"); - ok( 0 == strcmp(buffer," [01"), "wrong output\n"); - } + todo_wine ok( sz == 4, "size wrong\n"); + todo_wine ok( 0 == strcmp(buffer," [01"), "wrong output\n"); ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[\\[]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 4, "size wrong\n"); ok( 0 == strcmp(buffer,"[\\[]"), "wrong output\n"); ok( r == ERROR_SUCCESS, "format failed\n"); - MsiRecordSetString(hrec, 0, "[\\[]"); - MsiRecordSetString(hrec, 1, "hoo"); + r = MsiRecordSetString(hrec, 0, "[\\[]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); + r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof(buffer); r = MsiFormatRecord(0, hrec, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -1100,7 +1277,9 @@ static void test_formatrecord(void) ok(!lstrcmpA(buffer, "[\\[]"), "Expected \"[\\[]\", got \"%s\"\n", buffer); r = MsiRecordSetString(hrec, 0, "[foo]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 5, "size wrong\n"); @@ -1108,7 +1287,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[01.]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 5, "size wrong\n"); @@ -1117,6 +1298,7 @@ static void test_formatrecord(void) SetEnvironmentVariable("FOO", "BAR"); r = MsiRecordSetString(hrec, 0, "[%FOO]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 6, "size wrong\n"); @@ -1124,7 +1306,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{[1]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 6, "size wrong\n"); @@ -1132,7 +1316,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{ {[1]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 8, "size wrong\n"); @@ -1140,7 +1326,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{ {[1]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 8, "size wrong\n"); @@ -1148,7 +1336,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{ {{[1]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 9, "size wrong\n"); @@ -1156,7 +1346,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[1]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 4, "size wrong\n"); @@ -1164,6 +1356,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{ {{a}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 7, "size wrong\n"); @@ -1171,6 +1364,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{ {{a}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 7, "size wrong\n"); @@ -1178,7 +1372,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "0{1{2{3{4[1]5}6}7}8}9"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1189,7 +1385,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "0{1{2[1]3}4"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1200,7 +1398,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "0{1{2[1]3}4"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1211,7 +1411,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{[1.} [1]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 9, "size wrong\n"); @@ -1222,8 +1424,11 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{[{[1]}]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "foo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1234,8 +1439,11 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{[1][}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "foo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1246,8 +1454,11 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[1]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "[2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "foo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); @@ -1255,7 +1466,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[{{boo}}1]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); @@ -1266,8 +1479,11 @@ static void test_formatrecord(void) } r = MsiRecordSetString(hrec, 0, "[{{boo}}1]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 0, "[1{{boo}}]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); @@ -1275,7 +1491,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{[1]{{boo} }}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1286,7 +1504,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{[1{{boo}}]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1297,7 +1517,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{{[1]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 6, "size wrong: got %u, expected 3\n", sz); @@ -1305,7 +1527,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{[1{{bo}o}}]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 13, "size wrong\n"); @@ -1313,6 +1537,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{[1{{b{o}o}}]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1323,7 +1548,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{ {[1]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1335,7 +1562,9 @@ static void test_formatrecord(void) /* {} inside a substitution does strange things... */ r = MsiRecordSetString(hrec, 0, "[[1]{}]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1346,7 +1575,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[[1]{}[1]]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1357,7 +1588,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[a[1]b[1]c{}d[1]e]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1368,7 +1601,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[a[1]b"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 6, "size wrong\n"); @@ -1376,7 +1611,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "a[1]b]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 4, "size wrong\n"); @@ -1384,7 +1621,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "]a[1]b"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 4, "size wrong\n"); @@ -1392,7 +1631,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "]a[1]b"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 4, "size wrong\n"); @@ -1400,7 +1641,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "\\[1]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 2, "size wrong\n"); @@ -1408,7 +1651,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "\\{[1]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "2"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 2, "size wrong\n"); @@ -1416,7 +1661,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "a{b[1]c}d"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 2, "size wrong\n"); @@ -1424,7 +1671,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{a[0]b}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "foo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 9, "size wrong\n"); @@ -1432,6 +1681,7 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[foo]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); ok( sz == 5, "size wrong\n"); @@ -1439,7 +1689,9 @@ static void test_formatrecord(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "{[1][-1][1]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "foo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(0, hrec, buffer, &sz); todo_wine @@ -1451,70 +1703,80 @@ static void test_formatrecord(void) /* nested braces */ sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{abcd}"); + r = MsiRecordSetString(hrec, 0, "{abcd}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 6, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"{abcd}"), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{a[one]bc[two]de[one]f}"); + r = MsiRecordSetString(hrec, 0, "{a[one]bc[two]de[one]f}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 23, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"{a[one]bc[two]de[one]f}"), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{a[one]bc[bad]de[two]f}"); + r = MsiRecordSetString(hrec, 0, "{a[one]bc[bad]de[two]f}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 23, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"{a[one]bc[bad]de[two]f}"), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{[bad]}"); + r = MsiRecordSetString(hrec, 0, "{[bad]}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 7, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"{[bad]}"), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{abc{d[one]ef}"); /* missing final brace */ + r = MsiRecordSetString(hrec, 0, "{abc{d[one]ef}"); /* missing final brace */ + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 14, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"{abc{d[one]ef}"), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{abc{d[one]ef}}"); + r = MsiRecordSetString(hrec, 0, "{abc{d[one]ef}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 15, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"{abc{d[one]ef}}"), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{abc}{{def}hi{j[one]k}}"); + r = MsiRecordSetString(hrec, 0, "{abc}{{def}hi{j[one]k}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 5, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"{abc}"), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{{def}hi{j[one]k}}"); + r = MsiRecordSetString(hrec, 0, "{{def}hi{j[one]k}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 0, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{{def}hi{jk}}"); + r = MsiRecordSetString(hrec, 0, "{{def}hi{jk}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 0, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{{{def}}hi{jk}}"); + r = MsiRecordSetString(hrec, 0, "{{{def}}hi{jk}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); todo_wine @@ -1524,7 +1786,8 @@ static void test_formatrecord(void) } sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{{def}hi{{jk}}}"); + r = MsiRecordSetString(hrec, 0, "{{def}hi{{jk}}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); todo_wine @@ -1534,42 +1797,48 @@ static void test_formatrecord(void) } sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{{def}{jk}}"); + r = MsiRecordSetString(hrec, 0, "{{def}{jk}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 0, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{{def}}"); + r = MsiRecordSetString(hrec, 0, "{{def}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 0, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,""), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{a{b}c}"); + r = MsiRecordSetString(hrec, 0, "{a{b}c}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 7, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"{a{b}c}"), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{a{b}}"); + r = MsiRecordSetString(hrec, 0, "{a{b}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 6, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"{a{b}}"), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{{b}c}"); + r = MsiRecordSetString(hrec, 0, "{{b}c}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 6, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"{{b}c}"), "wrong output (%s)\n",buffer); sz = sizeof buffer; - MsiRecordSetString(hrec, 0, "{{{{}}}}"); + r = MsiRecordSetString(hrec, 0, "{{{{}}}}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); todo_wine @@ -1581,15 +1850,18 @@ static void test_formatrecord(void) sz = sizeof buffer; MsiRecordSetInteger(hrec, 1, 100); MsiRecordSetInteger(hrec, 2, -100); - MsiRecordSetString(hrec, 0, "[1] [2]"); + r = MsiRecordSetString(hrec, 0, "[1] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed\n"); ok( sz == 8, "size wrong(%i)\n",sz); ok( 0 == strcmp(buffer,"100 -100"), "wrong output (%s)\n",buffer); sz = sizeof(buffer); - MsiRecordSetString(hrec, 0, "[1] {[noprop] [twoprop]} {abcdef}"); - MsiRecordSetString(hrec, 1, "one"); + r = MsiRecordSetString(hrec, 0, "[1] {[noprop] [twoprop]} {abcdef}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); + r = MsiRecordSetString(hrec, 1, "one"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(sz == 33, "Expected 33, got %d\n",sz); @@ -1597,8 +1869,10 @@ static void test_formatrecord(void) "Expected \"one {[noprop] [twoprop]} {abcdef}\", got \"%s\"\n", buffer); sz = sizeof(buffer); - MsiRecordSetString(hrec, 0, "[1] {[noprop] [one]} {abcdef}"); - MsiRecordSetString(hrec, 1, "one"); + r = MsiRecordSetString(hrec, 0, "[1] {[noprop] [one]} {abcdef}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); + r = MsiRecordSetString(hrec, 1, "one"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(sz == 29, "Expected 29, got %d\n",sz); @@ -1606,8 +1880,10 @@ static void test_formatrecord(void) "Expected \"one {[noprop] [one]} {abcdef}\", got \"%s\"\n", buffer); sz = sizeof(buffer); - MsiRecordSetString(hrec, 0, "[1] {[one]} {abcdef}"); - MsiRecordSetString(hrec, 1, "one"); + r = MsiRecordSetString(hrec, 0, "[1] {[one]} {abcdef}"); + ok( r == ERROR_SUCCESS, "set string failed\n"); + r = MsiRecordSetString(hrec, 1, "one"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiFormatRecord(0, hrec, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(sz == 20, "Expected 20, got %d\n",sz); @@ -1625,8 +1901,13 @@ static void test_formatrecord_package(void) UINT r; DWORD sz=100; - package = helper_createpackage( msifile ); - ok(package!=0, "Unable to create package\n"); + r = helper_createpackage( msifile, &package ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + return; + } + ok( r == ERROR_SUCCESS, "Unable to create package %u\n", r ); hrec = MsiCreateRecord(12); ok( hrec, "failed to create record\n"); @@ -1638,17 +1919,29 @@ static void test_formatrecord_package(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec,0,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,1,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,2,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,3,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,4,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,5,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,6,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,7,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,8,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,9,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,10,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,11,NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec,12,NULL); ok( r == ERROR_SUCCESS, "set string failed\n"); @@ -1662,11 +1955,17 @@ static void test_formatrecord_package(void) ok( r == ERROR_SUCCESS, "failed to set propertY: %d\n", r); r = MsiRecordSetString(hrec, 0, NULL); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "[2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "stuff"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "prop"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 4, "[prop]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 5, "[noprop]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; r = MsiFormatRecord(package, hrec, buffer, &sz); ok( r == ERROR_SUCCESS, "format failed with empty buffer (%i)\n",r); @@ -1680,7 +1979,9 @@ static void test_formatrecord_package(void) /* now put play games with escaping */ r = MsiRecordSetString(hrec, 0, "[1] [2] [\\3asdf]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -1690,7 +1991,9 @@ static void test_formatrecord_package(void) ok( 0 == strcmp(buffer,"boo hoo 3"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "[1] [2] [\\x]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -1831,7 +2134,9 @@ static void test_formatrecord_package(void) /* null characters */ r = MsiRecordSetString(hrec, 0, "[1] [~] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -1842,9 +2147,12 @@ static void test_formatrecord_package(void) ok(!lstrcmpA(&buffer[5], " hoo"), "Expected \" hoo\", got \"%s\"\n", &buffer[5]); - MsiRecordSetString(hrec, 0, "[1] [~abc] [2]"); - MsiRecordSetString(hrec, 1, "boo"); - MsiRecordSetString(hrec, 2, "hoo"); + r = MsiRecordSetString(hrec, 0, "[1] [~abc] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); + r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); + r = MsiRecordSetString(hrec, 2, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof(buffer); r = MsiFormatRecord(package, hrec, buffer, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -1855,7 +2163,9 @@ static void test_formatrecord_package(void) r = MsiSetProperty(package,"dummy","Bork"); ok( r == ERROR_SUCCESS, "set property failed\n"); r = MsiRecordSetString(hrec, 0, "[1] [dummy] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -1865,7 +2175,9 @@ static void test_formatrecord_package(void) ok( 0 == strcmp(buffer,"boo Bork hoo"), "wrong output\n"); r = MsiRecordSetString(hrec, 0, "[1] [invalid] [2]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -1876,12 +2188,17 @@ static void test_formatrecord_package(void) /* nesting tests */ r = MsiSetProperty(package,"dummya","foo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiSetProperty(package,"dummyb","baa"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiSetProperty(package,"adummyc","whoa"); ok( r == ERROR_SUCCESS, "set property failed\n"); r = MsiRecordSetString(hrec, 0, "[dummy[1]] [dummy[2]] [[1]dummy[3]]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "a"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "b"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "c"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -1891,11 +2208,15 @@ static void test_formatrecord_package(void) ok( 0 == strcmp(buffer,"foo baa whoa"), "wrong output (%s)\n",buffer); r = MsiSetProperty(package,"dummya","1"); + ok( r == ERROR_SUCCESS, "set property failed\n"); r = MsiSetProperty(package,"dummyb","[2]"); ok( r == ERROR_SUCCESS, "set property failed\n"); r = MsiRecordSetString(hrec, 0, "[dummya] [[dummya]] [dummyb]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "aaa"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "bbb"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "ccc"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -1908,13 +2229,19 @@ static void test_formatrecord_package(void) } r = MsiSetProperty(package,"dummya","1"); + ok( r == ERROR_SUCCESS, "set property failed\n"); r = MsiSetProperty(package,"dummyb","a"); + ok( r == ERROR_SUCCESS, "set property failed\n"); r = MsiSetProperty(package,"dummyc","\\blath"); + ok( r == ERROR_SUCCESS, "set property failed\n"); r = MsiSetProperty(package,"dummyd","[\\blath]"); ok( r == ERROR_SUCCESS, "set property failed\n"); r = MsiRecordSetString(hrec, 0, "[dummyc] [[dummyc]] [dummy[dummyb]]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "aaa"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "bbb"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "ccc"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -1924,8 +2251,11 @@ static void test_formatrecord_package(void) ok( 0 == strcmp(buffer,"\\blath b 1"), "wrong output (%s)\n",buffer); r = MsiRecordSetString(hrec, 0, "[1] [2] [[\\3asdf]]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "yeah"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -1938,8 +2268,11 @@ static void test_formatrecord_package(void) } r = MsiRecordSetString(hrec, 0, "[1] [2] [[3]]"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 1, "boo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 2, "hoo"); + ok( r == ERROR_SUCCESS, "set string failed\n"); r = MsiRecordSetString(hrec, 3, "\\help"); ok( r == ERROR_SUCCESS, "set string failed\n"); sz = sizeof buffer; @@ -2120,7 +2453,7 @@ static void test_formatrecord_package(void) static void test_formatrecord_tables(void) { - MSIHANDLE hdb, hpkg, hrec; + MSIHANDLE hdb, hrec, hpkg = 0; CHAR buf[MAX_PATH]; CHAR curr_dir[MAX_PATH]; CHAR expected[MAX_PATH]; @@ -2186,19 +2519,26 @@ static void test_formatrecord_tables(void) ok( r == ERROR_SUCCESS, "cannot create CustomAction table: %d\n", r); r = add_custom_action_entry( hdb, "'MyCustom', 51, 'prop', '[!temporal_file]'" ); - ok( r == ERROR_SUCCESS, "cannt add custom action: %d\n", r); + ok( r == ERROR_SUCCESS, "cannot add custom action: %d\n", r); r = add_custom_action_entry( hdb, "'EscapeIt1', 51, 'prop', '[\\[]Bracket Text[\\]]'" ); - ok( r == ERROR_SUCCESS, "cannt add custom action: %d\n", r); + ok( r == ERROR_SUCCESS, "cannot add custom action: %d\n", r); r = add_custom_action_entry( hdb, "'EscapeIt2', 51, 'prop', '[\\xabcd]'" ); - ok( r == ERROR_SUCCESS, "cannt add custom action: %d\n", r); + ok( r == ERROR_SUCCESS, "cannot add custom action: %d\n", r); r = add_custom_action_entry( hdb, "'EscapeIt3', 51, 'prop', '[abcd\\xefgh]'" ); - ok( r == ERROR_SUCCESS, "cannt add custom action: %d\n", r); + ok( r == ERROR_SUCCESS, "cannot add custom action: %d\n", r); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + MsiCloseHandle( hdb ); + DeleteFile( msifile ); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); MsiCloseHandle( hdb ); @@ -2244,6 +2584,8 @@ static void test_formatrecord_tables(void) ok( r == ERROR_SUCCESS, "format record failed: %d\n", r); ok( !lstrcmp( buf, "1: " ), "Expected '1: ', got %s\n", buf ); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiDoAction(hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "CostInitialize failed: %d\n", r); @@ -2381,12 +2723,18 @@ static void test_formatrecord_tables(void) static void test_processmessage(void) { - MSIHANDLE hrec; - MSIHANDLE package; - int r; + MSIHANDLE hrec, package; + UINT r; - package = helper_createpackage( msifile ); - ok(package!=0, "Unable to create package\n"); + MsiSetInternalUI(INSTALLUILEVEL_BASIC, NULL); + + r = helper_createpackage( msifile, &package ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + return; + } + ok( r == ERROR_SUCCESS, "Unable to create package %u\n", r ); hrec = MsiCreateRecord(3); ok( hrec, "failed to create record\n"); diff --git a/rostests/winetests/msi/install.c b/rostests/winetests/msi/install.c index 365c8a68184..8e4e4b79ecc 100644 --- a/rostests/winetests/msi/install.c +++ b/rostests/winetests/msi/install.c @@ -42,20 +42,28 @@ static UINT (WINAPI *pMsiSourceListEnumSourcesA) (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPSTR, LPDWORD); static UINT (WINAPI *pMsiSourceListGetInfoA) (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD); +static INSTALLSTATE (WINAPI *pMsiGetComponentPathExA) + (LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPSTR, LPDWORD); static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*); +static BOOL (WINAPI *pGetTokenInformation)( HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD ); +static BOOL (WINAPI *pOpenProcessToken)( HANDLE, DWORD, PHANDLE ); +static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD); +static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); static HMODULE hsrclient = 0; static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD); static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*); -static BOOL on_win9x = FALSE; +static BOOL is_wow64; +static const BOOL is_64bit = sizeof(void *) > sizeof(int); static const char *msifile = "msitest.msi"; static const char *msifile2 = "winetest2.msi"; static const char *mstfile = "winetest.mst"; static CHAR CURR_DIR[MAX_PATH]; static CHAR PROG_FILES_DIR[MAX_PATH]; +static CHAR PROG_FILES_DIR_NATIVE[MAX_PATH]; static CHAR COMMON_FILES_DIR[MAX_PATH]; static CHAR APP_DATA_DIR[MAX_PATH]; static CHAR WINDOWS_DIR[MAX_PATH]; @@ -164,7 +172,8 @@ static const CHAR property_dat[] = "Property\tValue\n" "AdminProperties\tPOSTADMIN\n" "ROOTDRIVE\tC:\\\n" "SERVNAME\tTestService\n" - "SERVDISP\tTestServiceDisp\n"; + "SERVDISP\tTestServiceDisp\n" + "MSIFASTINSTALL\t1\n"; static const CHAR aup_property_dat[] = "Property\tValue\n" "s72\tl0\n" @@ -187,7 +196,8 @@ static const CHAR aup_property_dat[] = "Property\tValue\n" "AdminProperties\tPOSTADMIN\n" "ROOTDRIVE\tC:\\\n" "SERVNAME\tTestService\n" - "SERVDISP\tTestServiceDisp\n"; + "SERVDISP\tTestServiceDisp\n" + "MSIFASTINSTALL\t1\n"; static const CHAR aup2_property_dat[] = "Property\tValue\n" "s72\tl0\n" @@ -210,7 +220,8 @@ static const CHAR aup2_property_dat[] = "Property\tValue\n" "AdminProperties\tPOSTADMIN\n" "ROOTDRIVE\tC:\\\n" "SERVNAME\tTestService\n" - "SERVDISP\tTestServiceDisp\n"; + "SERVDISP\tTestServiceDisp\n" + "MSIFASTINSTALL\t1\n"; static const CHAR icon_property_dat[] = "Property\tValue\n" "s72\tl0\n" @@ -232,56 +243,14 @@ static const CHAR icon_property_dat[] = "Property\tValue\n" "AdminProperties\tPOSTADMIN\n" "ROOTDRIVE\tC:\\\n" "SERVNAME\tTestService\n" - "SERVDISP\tTestServiceDisp\n"; + "SERVDISP\tTestServiceDisp\n" + "MSIFASTINSTALL\t1\n"; static const CHAR shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n" "s72\ts72\tl128\ts72\ts72\tS255\tL255\tI2\tS72\tI2\tI2\tS72\n" "Shortcut\tShortcut\n" "Shortcut\tMSITESTDIR\tShortcut\tcomponent\tShortcut\t\tShortcut\t\t\t\t\t\n"; -static const CHAR environment_dat[] = "Environment\tName\tValue\tComponent_\n" - "s72\tl255\tL255\ts72\n" - "Environment\tEnvironment\n" - "Var1\t=-MSITESTVAR1\t1\tOne\n" - "Var2\tMSITESTVAR2\t1\tOne\n" - "Var3\t=-MSITESTVAR3\t1\tOne\n" - "Var4\tMSITESTVAR4\t1\tOne\n" - "Var5\t-MSITESTVAR5\t\tOne\n" - "Var6\tMSITESTVAR6\t\tOne\n" - "Var7\t!-MSITESTVAR7\t\tOne\n" - "Var8\t!-*MSITESTVAR8\t\tOne\n" - "Var9\t=-MSITESTVAR9\t\tOne\n" - "Var10\t=MSITESTVAR10\t\tOne\n" - "Var11\t+-MSITESTVAR11\t[~];1\tOne\n" - "Var12\t+-MSITESTVAR11\t[~];2\tOne\n" - "Var13\t+-MSITESTVAR12\t[~];1\tOne\n" - "Var14\t=MSITESTVAR13\t[~];1\tOne\n" - "Var15\t=MSITESTVAR13\t[~];2\tOne\n" - "Var16\t=MSITESTVAR14\t;1;\tOne\n" - "Var17\t=MSITESTVAR15\t;;1;;\tOne\n" - "Var18\t=MSITESTVAR16\t 1 \tOne\n" - "Var19\t+-MSITESTVAR17\t1\tOne\n" - "Var20\t+-MSITESTVAR17\t;;2;;[~]\tOne\n" - "Var21\t+-MSITESTVAR18\t1\tOne\n" - "Var22\t+-MSITESTVAR18\t[~];;2;;\tOne\n" - "Var23\t+-MSITESTVAR19\t1\tOne\n" - "Var24\t+-MSITESTVAR19\t[~]2\tOne\n" - "Var25\t+-MSITESTVAR20\t1\tOne\n" - "Var26\t+-MSITESTVAR20\t2[~]\tOne\n"; - -/* Expected results, starting from MSITESTVAR11 onwards */ -static const CHAR *environment_dat_results[] = {"1;2", /*MSITESTVAR11*/ - "1", /*MSITESTVAR12*/ - "1;2", /*MSITESTVAR13*/ - ";1;", /*MSITESTVAR14*/ - ";;1;;", /*MSITESTVAR15*/ - " 1 ", /*MSITESTVAR16*/ - ";;2;;1", /*MSITESTVAR17*/ - "1;;2;;", /*MSITESTVAR18*/ - "1", /*MSITESTVAR19*/ - "1", /*MSITESTVAR20*/ - NULL}; - static const CHAR condition_dat[] = "Feature_\tLevel\tCondition\n" "s38\ti2\tS255\n" "Condition\tFeature_\tLevel\n" @@ -308,7 +277,8 @@ static const CHAR up_property_dat[] = "Property\tValue\n" "ROOTDRIVE\tC:\\\n" "SERVNAME\tTestService\n" "SERVDISP\tTestServiceDisp\n" - "RemovePreviousVersions\t1\n"; + "RemovePreviousVersions\t1\n" + "MSIFASTINSTALL\t1\n"; static const CHAR up2_property_dat[] = "Property\tValue\n" "s72\tl0\n" @@ -330,7 +300,8 @@ static const CHAR up2_property_dat[] = "Property\tValue\n" "AdminProperties\tPOSTADMIN\n" "ROOTDRIVE\tC:\\\n" "SERVNAME\tTestService\n" - "SERVDISP\tTestServiceDisp\n"; + "SERVDISP\tTestServiceDisp\n" + "MSIFASTINSTALL\t1\n"; static const CHAR up3_property_dat[] = "Property\tValue\n" "s72\tl0\n" @@ -353,15 +324,16 @@ static const CHAR up3_property_dat[] = "Property\tValue\n" "ROOTDRIVE\tC:\\\n" "SERVNAME\tTestService\n" "SERVDISP\tTestServiceDisp\n" - "RemovePreviousVersions\t1\n"; + "RemovePreviousVersions\t1\n" + "MSIFASTINSTALL\t1\n"; static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n" "s72\ti2\tl255\tL255\tL0\ts72\n" "Registry\tRegistry\n" - "Apples\t2\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n" - "Oranges\t2\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n" - "regdata\t2\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n" - "OrderTest\t2\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent"; + "Apples\t1\tSOFTWARE\\Wine\\msitest\tName\timaname\tOne\n" + "Oranges\t1\tSOFTWARE\\Wine\\msitest\tnumber\t#314\tTwo\n" + "regdata\t1\tSOFTWARE\\Wine\\msitest\tblah\tbad\tdangler\n" + "OrderTest\t1\tSOFTWARE\\Wine\\msitest\tOrderTestName\tOrderTestValue\tcomponent"; static const CHAR service_install_dat[] = "ServiceInstall\tName\tDisplayName\tServiceType\tStartType\tErrorControl\t" "LoadOrderGroup\tDependencies\tStartName\tPassword\tArguments\tComponent_\tDescription\n" @@ -374,30 +346,6 @@ static const CHAR service_control_dat[] = "ServiceControl\tName\tEvent\tArgument "ServiceControl\tServiceControl\n" "ServiceControl\tTestService\t8\t\t0\tservice_comp"; -static const CHAR sss_service_control_dat[] = "ServiceControl\tName\tEvent\tArguments\tWait\tComponent_\n" - "s72\tl255\ti2\tL255\tI2\ts72\n" - "ServiceControl\tServiceControl\n" - "ServiceControl\tSpooler\t1\t\t0\tservice_comp"; - -static const CHAR sss_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "CostFinalize\t\t1000\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "ResolveSource\t\t950\n" - "MoveFiles\t\t1700\n" - "InstallFiles\t\t4000\n" - "DuplicateFiles\t\t4500\n" - "WriteEnvironmentStrings\t\t4550\n" - "CreateShortcuts\t\t4600\n" - "StartServices\t\t5000\n" - "DeleteServices\t\t5500\n" - "InstallFinalize\t\t6600\n" - "InstallInitialize\t\t1500\n" - "InstallValidate\t\t1400\n" - "LaunchConditions\t\t100\n"; - /* tables for test_continuouscabs */ static const CHAR cc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" @@ -567,6 +515,18 @@ static const CHAR sdp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISCom "CustomAction\tAction\n" "SetDirProperty\t51\tMSITESTDIR\t[CommonFilesFolder]msitest\\\t\n"; +static const CHAR pv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t800\n" + "FileCost\t\t900\n" + "CostFinalize\t\t1000\n" + "InstallValidate\t\t1400\n" + "InstallInitialize\t\t1500\n" + "InstallFiles\t\t4000\n" + "InstallFinalize\t\t6600\n"; + static const CHAR cie_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" "Component\tComponent\n" @@ -683,30 +643,6 @@ static const CHAR pp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "PublishProduct\tPUBLISH_PRODUCT=1 Or FULL=1\t6400\n" "InstallFinalize\t\t6600"; -static const CHAR ppc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "maximus\t{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}\tMSITESTDIR\t0\tUILevel=5\tmaximus\n" - "augustus\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\taugustus\n"; - -static const CHAR ppc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "maximus\tmaximus\tmaximus\t500\t\t\t8192\t1\n" - "augustus\taugustus\taugustus\t500\t\t\t8192\t2"; - -static const CHAR ppc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" - "i2\ti4\tL64\tS255\tS32\tS72\n" - "Media\tDiskId\n" - "1\t2\t\t\tDISK1\t\n"; - -static const CHAR ppc_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "feature\tmaximus\n" - "feature\taugustus\n" - "montecristo\tmaximus"; - static const CHAR tp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" "Component\tComponent\n" @@ -745,20 +681,6 @@ static const CHAR amp_component_dat[] = "Component\tComponentId\tDirectory_\tAtt "Component\tComponent\n" "augustus\t\tMSITESTDIR\t0\tMYPROP=2718 and MyProp=42\taugustus\n"; -static const CHAR rem_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "hydrogen\t{C844BD1E-1907-4C00-8BC9-150BD70DF0A1}\tMSITESTDIR\t0\t\thydrogen\n" - "helium\t{5AD3C142-CEF8-490D-B569-784D80670685}\tMSITESTDIR\t1\t\thelium\n" - "lithium\t\tMSITESTDIR\t2\t\tlithium\n"; - -static const CHAR rem_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "feature\thydrogen\n" - "feature\thelium\n" - "feature\tlithium"; - static const CHAR rem_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" "File\tFile\n" @@ -784,49 +706,14 @@ static const CHAR rem_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "PublishProduct\t\t6400\n" "InstallFinalize\t\t6600"; -static const CHAR rem_remove_files_dat[] = "FileKey\tComponent_\tFileName\tDirProperty\tInstallMode\n" - "s72\ts72\tS255\ts72\tI2\n" - "RemoveFile\tFileKey\n" - "furlong\thydrogen\tfurlong\tMSITESTDIR\t1\n" - "firkin\thelium\tfirkin\tMSITESTDIR\t1\n" - "fortnight\tlithium\tfortnight\tMSITESTDIR\t1\n" - "becquerel\thydrogen\tbecquerel\tMSITESTDIR\t2\n" - "dioptre\thelium\tdioptre\tMSITESTDIR\t2\n" - "attoparsec\tlithium\tattoparsec\tMSITESTDIR\t2\n" - "storeys\thydrogen\tstoreys\tMSITESTDIR\t3\n" - "block\thelium\tblock\tMSITESTDIR\t3\n" - "siriometer\tlithium\tsiriometer\tMSITESTDIR\t3\n" - "nanoacre\thydrogen\t\tCABOUTDIR\t3\n"; - -static const CHAR mov_move_file_dat[] = "FileKey\tComponent_\tSourceName\tDestName\tSourceFolder\tDestFolder\tOptions\n" - "s72\ts72\tS255\tS255\tS72\ts72\ti2\n" - "MoveFile\tFileKey\n" - "abkhazia\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t0\n" - "bahamas\taugustus\tnonexistent\tdest\tSourceDir\tMSITESTDIR\t1\n" - "cambodia\taugustus\tcameroon\tcanada\tSourceDir\tMSITESTDIR\t0\n" - "denmark\taugustus\tdjibouti\tdominica\tSourceDir\tMSITESTDIR\t1\n" - "ecuador\taugustus\tegypt\telsalvador\tNotAProp\tMSITESTDIR\t1\n" - "fiji\taugustus\tfinland\tfrance\tSourceDir\tNotAProp\t1\n" - "gabon\taugustus\tgambia\tgeorgia\tSOURCEFULL\tMSITESTDIR\t1\n" - "haiti\taugustus\thonduras\thungary\tSourceDir\tDESTFULL\t1\n" - "iceland\taugustus\tindia\tindonesia\tMSITESTDIR\tMSITESTDIR\t1\n" - "jamaica\taugustus\tjapan\tjordan\tFILEPATHBAD\tMSITESTDIR\t1\n" - "kazakhstan\taugustus\t\tkiribati\tFILEPATHGOOD\tMSITESTDIR\t1\n" - "laos\taugustus\tlatvia\tlebanon\tSourceDir\tMSITESTDIR\t1\n" - "namibia\taugustus\tnauru\tkiribati\tSourceDir\tMSITESTDIR\t1\n" - "pakistan\taugustus\tperu\tsfn|poland\tSourceDir\tMSITESTDIR\t1\n" - "wildcard\taugustus\tapp*\twildcard\tSourceDir\tMSITESTDIR\t1\n" - "single\taugustus\tf?o\tsingle\tSourceDir\tMSITESTDIR\t1\n" - "wildcardnodest\taugustus\tbudd*\t\tSourceDir\tMSITESTDIR\t1\n" - "singlenodest\taugustus\tb?r\t\tSourceDir\tMSITESTDIR\t1\n"; - static const CHAR mc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" "Component\tComponent\n" "maximus\t\tMSITESTDIR\t0\t1\tmaximus\n" "augustus\t\tMSITESTDIR\t0\t1\taugustus\n" "caesar\t\tMSITESTDIR\t0\t1\tcaesar\n" - "gaius\t\tMSITESTDIR\t0\tGAIUS=1\tgaius\n"; + "gaius\t\tMSITESTDIR\t0\tGAIUS=1\tgaius\n" + "tiberius\t\tMSITESTDIR\t0\t\ttiberius\n"; static const CHAR mc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" @@ -834,7 +721,8 @@ static const CHAR mc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion "maximus\tmaximus\tmaximus\t500\t\t\t16384\t1\n" "augustus\taugustus\taugustus\t500\t\t\t0\t2\n" "caesar\tcaesar\tcaesar\t500\t\t\t16384\t3\n" - "gaius\tgaius\tgaius\t500\t\t\t16384\t4"; + "gaius\tgaius\tgaius\t500\t\t\t16384\t4\n" + "tiberius\ttiberius\ttiberius\t500\t\t\t0\t5\n"; static const CHAR mc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" "i2\ti4\tL64\tS255\tS32\tS72\n" @@ -842,40 +730,19 @@ static const CHAR mc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tV "1\t1\t\ttest1.cab\tDISK1\t\n" "2\t2\t\ttest2.cab\tDISK2\t\n" "3\t3\t\ttest3.cab\tDISK3\t\n" - "4\t4\t\ttest3.cab\tDISK3\t\n"; + "4\t4\t\ttest3.cab\tDISK3\t\n" + "5\t5\t\ttest4.cab\tDISK4\t\n"; static const CHAR mc_file_hash_dat[] = "File_\tOptions\tHashPart1\tHashPart2\tHashPart3\tHashPart4\n" "s72\ti2\ti4\ti4\ti4\ti4\n" "MsiFileHash\tFile_\n" "caesar\t0\t850433704\t-241429251\t675791761\t-1221108824"; -static const CHAR df_directory_dat[] = "Directory\tDirectory_Parent\tDefaultDir\n" - "s72\tS72\tl255\n" - "Directory\tDirectory\n" - "THIS\tMSITESTDIR\tthis\n" - "DOESNOT\tTHIS\tdoesnot\n" - "NONEXISTENT\tDOESNOT\texist\n" - "MSITESTDIR\tProgramFilesFolder\tmsitest\n" - "ProgramFilesFolder\tTARGETDIR\t.\n" - "TARGETDIR\t\tSourceDir"; - -static const CHAR df_duplicate_file_dat[] = "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n" - "s72\ts72\ts72\tS255\tS72\n" - "DuplicateFile\tFileKey\n" - "maximus\tmaximus\tmaximus\taugustus\t\n" - "caesar\tmaximus\tmaximus\t\tNONEXISTENT\n" - "augustus\tnosuchcomponent\tmaximus\t\tMSITESTDIR\n"; - static const CHAR wrv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" "Component\tComponent\n" "augustus\t\tMSITESTDIR\t0\t\taugustus\n"; -static const CHAR wrv_registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n" - "s72\ti2\tl255\tL255\tL0\ts72\n" - "Registry\tRegistry\n" - "regdata\t2\tSOFTWARE\\Wine\\msitest\tValue\t[~]one[~]two[~]three\taugustus"; - static const CHAR ca51_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" "Component\tComponent\n" @@ -1113,331 +980,6 @@ static const CHAR aup_custom_action_dat[] = "Action\tType\tSource\tTarget\tISCom "CustomAction\tAction\n" "TestAllUsersProp\t19\t\tTest failed\t\n"; -static const CHAR cf_create_folders_dat[] = "Directory_\tComponent_\n" - "s72\ts72\n" - "CreateFolder\tDirectory_\tComponent_\n" - "FIRSTDIR\tOne\n"; - -static const CHAR cf_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "CostFinalize\t\t1000\n" - "ValidateProductID\t\t700\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "RemoveFiles\t\t3500\n" - "CreateFolders\t\t3700\n" - "InstallExecute\t\t3800\n" - "TestCreateFolders\t\t3900\n" - "InstallFiles\t\t4000\n" - "RegisterUser\t\t6000\n" - "RegisterProduct\t\t6100\n" - "PublishFeatures\t\t6300\n" - "PublishProduct\t\t6400\n" - "InstallFinalize\t\t6600\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "UnpublishFeatures\t\t1800\n" - "InstallValidate\t\t1400\n" - "LaunchConditions\t\t100\n"; - -static const CHAR cf_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" - "s72\ti2\tS64\tS0\tS255\n" - "CustomAction\tAction\n" - "TestCreateFolders\t19\t\tHalts installation\t\n"; - -static const CHAR rf_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "CostFinalize\t\t1000\n" - "ValidateProductID\t\t700\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "RemoveFiles\t\t3500\n" - "CreateFolders\t\t3600\n" - "RemoveFolders\t\t3700\n" - "InstallExecute\t\t3800\n" - "TestCreateFolders\t\t3900\n" - "InstallFiles\t\t4000\n" - "RegisterUser\t\t6000\n" - "RegisterProduct\t\t6100\n" - "PublishFeatures\t\t6300\n" - "PublishProduct\t\t6400\n" - "InstallFinalize\t\t6600\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "UnpublishFeatures\t\t1800\n" - "InstallValidate\t\t1400\n" - "LaunchConditions\t\t100\n"; - - -static const CHAR sr_selfreg_dat[] = "File_\tCost\n" - "s72\tI2\n" - "SelfReg\tFile_\n" - "one.txt\t1\n"; - -static const CHAR sr_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "CostFinalize\t\t1000\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "ResolveSource\t\t950\n" - "MoveFiles\t\t1700\n" - "SelfUnregModules\t\t3900\n" - "InstallFiles\t\t4000\n" - "DuplicateFiles\t\t4500\n" - "WriteEnvironmentStrings\t\t4550\n" - "CreateShortcuts\t\t4600\n" - "InstallFinalize\t\t6600\n" - "InstallInitialize\t\t1500\n" - "InstallValidate\t\t1400\n" - "LaunchConditions\t\t100\n"; - -static const CHAR font_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" - "i2\ti4\tL64\tS255\tS32\tS72\n" - "Media\tDiskId\n" - "1\t3\t\t\tDISK1\t\n"; - -static const CHAR font_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "font.ttf\tfonts\tfont.ttf\t1000\t\t\t8192\t1\n"; - -static const CHAR font_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "fonts\t\t\tfont feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR font_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "fonts\t{F5920ED0-1183-4B8F-9330-86CE56557C05}\tMSITESTDIR\t0\t\tfont.ttf\n"; - -static const CHAR font_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "fonts\tfonts\n"; - -static const CHAR font_dat[] = "File_\tFontTitle\n" - "s72\tS128\n" - "Font\tFile_\n" - "font.ttf\tmsi test font\n"; - -static const CHAR font_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "ValidateProductID\t\t700\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "UnpublishFeatures\t\t1800\n" - "RemoveFiles\t\t3500\n" - "InstallFiles\t\t4000\n" - "RegisterFonts\t\t4100\n" - "UnregisterFonts\t\t4200\n" - "RegisterUser\t\t6000\n" - "RegisterProduct\t\t6100\n" - "PublishFeatures\t\t6300\n" - "PublishProduct\t\t6400\n" - "InstallFinalize\t\t6600"; - -static const CHAR vp_property_dat[] = "Property\tValue\n" - "s72\tl0\n" - "Property\tProperty\n" - "HASUIRUN\t0\n" - "INSTALLLEVEL\t3\n" - "InstallMode\tTypical\n" - "Manufacturer\tWine\n" - "PIDTemplate\t###-#######\n" - "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" - "ProductLanguage\t1033\n" - "ProductName\tMSITEST\n" - "ProductVersion\t1.1.1\n" - "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n"; - -static const CHAR vp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" - "s72\ti2\tS64\tS0\tS255\n" - "CustomAction\tAction\n" - "SetProductID1\t51\tProductID\t1\t\n" - "SetProductID2\t51\tProductID\t2\t\n" - "TestProductID1\t19\t\t\tHalts installation\n" - "TestProductID2\t19\t\t\tHalts installation\n"; - -static const CHAR vp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "SetProductID1\tSET_PRODUCT_ID=1\t3000\n" - "SetProductID2\tSET_PRODUCT_ID=2\t3100\n" - "ValidateProductID\t\t3200\n" - "InstallExecute\t\t3300\n" - "TestProductID1\tProductID=1\t3400\n" - "TestProductID2\tProductID=\"123-1234567\"\t3500\n" - "InstallFiles\t\t4000\n" - "InstallFinalize\t\t6000\n"; - -static const CHAR odbc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "ODBCdriver.dll\todbc\tODBCdriver.dll\t1000\t\t\t8192\t1\n" - "ODBCdriver2.dll\todbc\tODBCdriver2.dll\t1000\t\t\t8192\t2\n" - "ODBCtranslator.dll\todbc\tODBCtranslator.dll\t1000\t\t\t8192\t3\n" - "ODBCtranslator2.dll\todbc\tODBCtranslator2.dll\t1000\t\t\t8192\t4\n" - "ODBCsetup.dll\todbc\tODBCsetup.dll\t1000\t\t\t8192\t5\n"; - -static const CHAR odbc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "odbc\t\t\todbc feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR odbc_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "odbc\todbc\n"; - -static const CHAR odbc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "odbc\t{B6F3E4AE-35D1-4B72-9044-989F03E20A43}\tMSITESTDIR\t0\t\tODBCdriver.dll\n"; - -static const CHAR odbc_driver_dat[] = "Driver\tComponent_\tDescription\tFile_\tFile_Setup\n" - "s72\ts72\ts255\ts72\tS72\n" - "ODBCDriver\tDriver\n" - "ODBC test driver\todbc\tODBC test driver\tODBCdriver.dll\t\n" - "ODBC test driver2\todbc\tODBC test driver2\tODBCdriver2.dll\tODBCsetup.dll\n"; - -static const CHAR odbc_translator_dat[] = "Translator\tComponent_\tDescription\tFile_\tFile_Setup\n" - "s72\ts72\ts255\ts72\tS72\n" - "ODBCTranslator\tTranslator\n" - "ODBC test translator\todbc\tODBC test translator\tODBCtranslator.dll\t\n" - "ODBC test translator2\todbc\tODBC test translator2\tODBCtranslator2.dll\tODBCsetup.dll\n"; - -static const CHAR odbc_datasource_dat[] = "DataSource\tComponent_\tDescription\tDriverDescription\tRegistration\n" - "s72\ts72\ts255\ts255\ti2\n" - "ODBCDataSource\tDataSource\n" - "ODBC data source\todbc\tODBC data source\tODBC driver\t0\n"; - -static const CHAR odbc_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "InstallODBC\t\t3000\n" - "RemoveODBC\t\t3100\n" - "RemoveFiles\t\t3900\n" - "InstallFiles\t\t4000\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; - -static const CHAR odbc_media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" - "i2\ti4\tL64\tS255\tS32\tS72\n" - "Media\tDiskId\n" - "1\t5\t\t\tDISK1\t\n"; - -static const CHAR tl_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "typelib.dll\ttypelib\ttypelib.dll\t1000\t\t\t8192\t1\n"; - -static const CHAR tl_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "typelib\t\t\ttypelib feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR tl_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "typelib\ttypelib\n"; - -static const CHAR tl_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "typelib\t{BB4C26FD-89D8-4E49-AF1C-DB4DCB5BF1B0}\tMSITESTDIR\t0\t\ttypelib.dll\n"; - -static const CHAR tl_typelib_dat[] = "LibID\tLanguage\tComponent_\tVersion\tDescription\tDirectory_\tFeature_\tCost\n" - "s38\ti2\ts72\tI4\tL128\tS72\ts38\tI4\n" - "TypeLib\tLibID\tLanguage\tComponent_\n" - "{EAC5166A-9734-4D91-878F-1DD02304C66C}\t0\ttypelib\t1793\t\tMSITESTDIR\ttypelib\t\n"; - -static const CHAR tl_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "RemoveFiles\t\t1700\n" - "InstallFiles\t\t2000\n" - "RegisterTypeLibraries\tREGISTER_TYPELIB=1\t3000\n" - "UnregisterTypeLibraries\t\t3100\n" - "RegisterProduct\t\t5100\n" - "PublishFeatures\t\t5200\n" - "PublishProduct\t\t5300\n" - "InstallFinalize\t\t6000\n"; - -static const CHAR crs_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "target.txt\tshortcut\ttarget.txt\t1000\t\t\t8192\t1\n"; - -static const CHAR crs_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "shortcut\t\t\tshortcut feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR crs_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "shortcut\tshortcut\n"; - -static const CHAR crs_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "shortcut\t{5D20E3C6-7206-498F-AC28-87AF2F9AD4CC}\tMSITESTDIR\t0\t\ttarget.txt\n"; - -static const CHAR crs_shortcut_dat[] = "Shortcut\tDirectory_\tName\tComponent_\tTarget\tArguments\tDescription\tHotkey\tIcon_\tIconIndex\tShowCmd\tWkDir\n" - "s72\ts72\tl128\ts72\ts72\tL255\tL255\tI2\tS72\tI2\tI2\tS72\n" - "Shortcut\tShortcut\n" - "shortcut\tMSITESTDIR\tshortcut\tshortcut\t[MSITESTDIR]target.txt\t\t\t\t\t\t\t\n"; - -static const CHAR crs_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "RemoveFiles\t\t1700\n" - "InstallFiles\t\t2000\n" - "RemoveShortcuts\t\t3000\n" - "CreateShortcuts\t\t3100\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; - static const CHAR fo_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" "File\tFile\n" @@ -1495,452 +1037,205 @@ static const CHAR fo_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "PublishProduct\t\t5200\n" "InstallFinalize\t\t6000\n"; -static const CHAR pub_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "english.txt\tpublish\tenglish.txt\t1000\t\t\t8192\t1\n"; - -static const CHAR pub_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "publish\t\t\tpublish feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR pub_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "publish\tpublish\n"; - -static const CHAR pub_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "publish\t{B4EA0ACF-6238-426E-9C6D-7869F0F9C768}\tMSITESTDIR\t0\t\tenglish.txt\n"; - -static const CHAR pub_publish_component_dat[] = "ComponentId\tQualifier\tComponent_\tAppData\tFeature_\n" - "s38\ts255\ts72\tL255\ts38\n" - "PublishComponent\tComponentId\tQualifier\tComponent_\n" - "{92AFCBC0-9CA6-4270-8454-47C5EE2B8FAA}\tenglish.txt\tpublish\t\tpublish\n"; - -static const CHAR pub_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "RemoveFiles\t\t1700\n" - "InstallFiles\t\t2000\n" - "PublishComponents\t\t3000\n" - "UnpublishComponents\t\t3100\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; - -static const CHAR rd_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" +static const CHAR sd_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" "File\tFile\n" - "original.txt\tduplicate\toriginal.txt\t1000\t\t\t8192\t1\n" - "original2.txt\tduplicate\toriginal2.txt\t1000\t\t\t8192\t2\n" - "original3.txt\tduplicate2\toriginal3.txt\t1000\t\t\t8192\t3\n"; + "sourcedir.txt\tsourcedir\tsourcedir.txt\t1000\t\t\t8192\t1\n"; -static const CHAR rd_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" +static const CHAR sd_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" "Feature\tFeature\n" - "duplicate\t\t\tduplicate feature\t1\t2\tMSITESTDIR\t0\n"; + "sourcedir\t\t\tsourcedir feature\t1\t2\tMSITESTDIR\t0\n"; -static const CHAR rd_feature_comp_dat[] = "Feature_\tComponent_\n" +static const CHAR sd_feature_comp_dat[] = "Feature_\tComponent_\n" "s38\ts72\n" "FeatureComponents\tFeature_\tComponent_\n" - "duplicate\tduplicate\n"; + "sourcedir\tsourcedir\n"; -static const CHAR rd_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" +static const CHAR sd_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" "s72\tS38\ts72\ti2\tS255\tS72\n" "Component\tComponent\n" - "duplicate\t{EB45D06A-ADFE-44E3-8D41-B7DE150E41AD}\tMSITESTDIR\t0\t\toriginal.txt\n" - "duplicate2\t{B8BA60E0-B2E9-488E-9D0E-E60F25F04F97}\tMSITESTDIR\t0\tDUPLICATE2=1\toriginal3.txt\n"; + "sourcedir\t{DD422F92-3ED8-49B5-A0B7-F266F98357DF}\tMSITESTDIR\t0\t\tsourcedir.txt\n"; -static const CHAR rd_duplicate_file_dat[] = "FileKey\tComponent_\tFile_\tDestName\tDestFolder\n" - "s72\ts72\ts72\tS255\tS72\n" - "DuplicateFile\tFileKey\n" - "duplicate\tduplicate\toriginal.txt\tduplicate.txt\t\n" - "duplicate2\tduplicate\toriginal2.txt\t\tMSITESTDIR\n" - "duplicate3\tduplicate2\toriginal3.txt\tduplicate2.txt\t\n"; +static const CHAR sd_install_ui_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallUISequence\tAction\n" + "TestSourceDirProp1\tnot SourceDir and not SOURCEDIR and not Installed\t99\n" + "AppSearch\t\t100\n" + "TestSourceDirProp2\tnot SourceDir and not SOURCEDIR and not Installed\t101\n" + "LaunchConditions\tnot Installed \t110\n" + "TestSourceDirProp3\tnot SourceDir and not SOURCEDIR and not Installed\t111\n" + "FindRelatedProducts\t\t120\n" + "TestSourceDirProp4\tnot SourceDir and not SOURCEDIR and not Installed\t121\n" + "CCPSearch\t\t130\n" + "TestSourceDirProp5\tnot SourceDir and not SOURCEDIR and not Installed\t131\n" + "RMCCPSearch\t\t140\n" + "TestSourceDirProp6\tnot SourceDir and not SOURCEDIR and not Installed\t141\n" + "ValidateProductID\t\t150\n" + "TestSourceDirProp7\tnot SourceDir and not SOURCEDIR and not Installed\t151\n" + "CostInitialize\t\t800\n" + "TestSourceDirProp8\tnot SourceDir and not SOURCEDIR and not Installed\t801\n" + "FileCost\t\t900\n" + "TestSourceDirProp9\tnot SourceDir and not SOURCEDIR and not Installed\t901\n" + "IsolateComponents\t\t1000\n" + "TestSourceDirProp10\tnot SourceDir and not SOURCEDIR and not Installed\t1001\n" + "CostFinalize\t\t1100\n" + "TestSourceDirProp11\tnot SourceDir and not SOURCEDIR and not Installed\t1101\n" + "MigrateFeatureStates\t\t1200\n" + "TestSourceDirProp12\tnot SourceDir and not SOURCEDIR and not Installed\t1201\n" + "ExecuteAction\t\t1300\n" + "TestSourceDirProp13\tnot SourceDir and not SOURCEDIR and not Installed\t1301\n"; -static const CHAR rd_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" +static const CHAR sd_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "TestSourceDirProp14\tSourceDir and SOURCEDIR and not Installed\t99\n" + "LaunchConditions\t\t100\n" + "TestSourceDirProp15\tSourceDir and SOURCEDIR and not Installed\t101\n" + "ValidateProductID\t\t700\n" + "TestSourceDirProp16\tSourceDir and SOURCEDIR and not Installed\t701\n" + "CostInitialize\t\t800\n" + "TestSourceDirProp17\tSourceDir and SOURCEDIR and not Installed\t801\n" + "ResolveSource\tResolveSource and not Installed\t850\n" + "TestSourceDirProp18\tResolveSource and not SourceDir and not SOURCEDIR and not Installed\t851\n" + "TestSourceDirProp19\tnot ResolveSource and SourceDir and SOURCEDIR and not Installed\t852\n" + "FileCost\t\t900\n" + "TestSourceDirProp20\tSourceDir and SOURCEDIR and not Installed\t901\n" + "IsolateComponents\t\t1000\n" + "TestSourceDirProp21\tSourceDir and SOURCEDIR and not Installed\t1001\n" + "CostFinalize\t\t1100\n" + "TestSourceDirProp22\tSourceDir and SOURCEDIR and not Installed\t1101\n" + "MigrateFeatureStates\t\t1200\n" + "TestSourceDirProp23\tSourceDir and SOURCEDIR and not Installed\t1201\n" + "InstallValidate\t\t1400\n" + "TestSourceDirProp24\tSourceDir and SOURCEDIR and not Installed\t1401\n" + "InstallInitialize\t\t1500\n" + "TestSourceDirProp25\tSourceDir and SOURCEDIR and not Installed\t1501\n" + "ProcessComponents\t\t1600\n" + "TestSourceDirProp26\tnot SourceDir and not SOURCEDIR and not Installed\t1601\n" + "UnpublishFeatures\t\t1800\n" + "TestSourceDirProp27\tnot SourceDir and not SOURCEDIR and not Installed\t1801\n" + "RemoveFiles\t\t3500\n" + "TestSourceDirProp28\tnot SourceDir and not SOURCEDIR and not Installed\t3501\n" + "InstallFiles\t\t4000\n" + "TestSourceDirProp29\tnot SourceDir and not SOURCEDIR and not Installed\t4001\n" + "RegisterUser\t\t6000\n" + "TestSourceDirProp30\tnot SourceDir and not SOURCEDIR and not Installed\t6001\n" + "RegisterProduct\t\t6100\n" + "TestSourceDirProp31\tnot SourceDir and not SOURCEDIR and not Installed\t6101\n" + "PublishFeatures\t\t6300\n" + "TestSourceDirProp32\tnot SourceDir and not SOURCEDIR and not Installed\t6301\n" + "PublishProduct\t\t6400\n" + "TestSourceDirProp33\tnot SourceDir and not SOURCEDIR and not Installed\t6401\n" + "InstallExecute\t\t6500\n" + "TestSourceDirProp34\tnot SourceDir and not SOURCEDIR and not Installed\t6501\n" + "InstallFinalize\t\t6600\n" + "TestSourceDirProp35\tnot SourceDir and not SOURCEDIR and not Installed\t6601\n"; + +static const CHAR sd_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" + "s72\ti2\tS64\tS0\tS255\n" + "CustomAction\tAction\n" + "TestSourceDirProp1\t19\t\tTest 1 failed\t\n" + "TestSourceDirProp2\t19\t\tTest 2 failed\t\n" + "TestSourceDirProp3\t19\t\tTest 3 failed\t\n" + "TestSourceDirProp4\t19\t\tTest 4 failed\t\n" + "TestSourceDirProp5\t19\t\tTest 5 failed\t\n" + "TestSourceDirProp6\t19\t\tTest 6 failed\t\n" + "TestSourceDirProp7\t19\t\tTest 7 failed\t\n" + "TestSourceDirProp8\t19\t\tTest 8 failed\t\n" + "TestSourceDirProp9\t19\t\tTest 9 failed\t\n" + "TestSourceDirProp10\t19\t\tTest 10 failed\t\n" + "TestSourceDirProp11\t19\t\tTest 11 failed\t\n" + "TestSourceDirProp12\t19\t\tTest 12 failed\t\n" + "TestSourceDirProp13\t19\t\tTest 13 failed\t\n" + "TestSourceDirProp14\t19\t\tTest 14 failed\t\n" + "TestSourceDirProp15\t19\t\tTest 15 failed\t\n" + "TestSourceDirProp16\t19\t\tTest 16 failed\t\n" + "TestSourceDirProp17\t19\t\tTest 17 failed\t\n" + "TestSourceDirProp18\t19\t\tTest 18 failed\t\n" + "TestSourceDirProp19\t19\t\tTest 19 failed\t\n" + "TestSourceDirProp20\t19\t\tTest 20 failed\t\n" + "TestSourceDirProp21\t19\t\tTest 21 failed\t\n" + "TestSourceDirProp22\t19\t\tTest 22 failed\t\n" + "TestSourceDirProp23\t19\t\tTest 23 failed\t\n" + "TestSourceDirProp24\t19\t\tTest 24 failed\t\n" + "TestSourceDirProp25\t19\t\tTest 25 failed\t\n" + "TestSourceDirProp26\t19\t\tTest 26 failed\t\n" + "TestSourceDirProp27\t19\t\tTest 27 failed\t\n" + "TestSourceDirProp28\t19\t\tTest 28 failed\t\n" + "TestSourceDirProp29\t19\t\tTest 29 failed\t\n" + "TestSourceDirProp30\t19\t\tTest 30 failed\t\n" + "TestSourceDirProp31\t19\t\tTest 31 failed\t\n" + "TestSourceDirProp32\t19\t\tTest 32 failed\t\n" + "TestSourceDirProp33\t19\t\tTest 33 failed\t\n" + "TestSourceDirProp34\t19\t\tTest 34 failed\t\n" + "TestSourceDirProp35\t19\t\tTest 35 failed\t\n"; + +static const CHAR cl_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" + "s72\ti2\tS64\tS0\tS255\n" + "CustomAction\tAction\n" + "TestCommandlineProp\t19\t\tTest1\t\n"; + +static const CHAR cl_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" "s72\tS255\tI2\n" "InstallExecuteSequence\tAction\n" "LaunchConditions\t\t100\n" + "ValidateProductID\t\t700\n" "CostInitialize\t\t800\n" "FileCost\t\t900\n" "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" + "TestCommandlineProp\tP=\"one\"\t1100\n" "InstallInitialize\t\t1500\n" "ProcessComponents\t\t1600\n" - "RemoveDuplicateFiles\t\t1900\n" - "InstallFiles\t\t2000\n" - "DuplicateFiles\t\t2100\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; + "InstallValidate\t\t1400\n" + "InstallFinalize\t\t5000\n"; -static const CHAR rrv_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "registry.txt\tregistry\tregistry.txt\t1000\t\t\t8192\t1\n"; +static const CHAR uc_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" + "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" + "File\tFile\n" + "upgradecode.txt\tupgradecode\tupgradecode.txt\t1000\t\t\t8192\t1\n"; -static const CHAR rrv_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "registry\t\t\tregistry feature\t1\t2\tMSITESTDIR\t0\n"; +static const CHAR uc_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" + "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" + "Feature\tFeature\n" + "upgradecode\t\t\tupgradecode feature\t1\t2\tMSITESTDIR\t0\n"; -static const CHAR rrv_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "registry\tregistry\n"; +static const CHAR uc_feature_comp_dat[] = "Feature_\tComponent_\n" + "s38\ts72\n" + "FeatureComponents\tFeature_\tComponent_\n" + "upgradecode\tupgradecode\n"; -static const CHAR rrv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "registry\t{DA97585B-962D-45EB-AD32-DA15E60CA9EE}\tMSITESTDIR\t0\t\tregistry.txt\n"; +static const CHAR uc_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" + "s72\tS38\ts72\ti2\tS255\tS72\n" + "Component\tComponent\n" + "upgradecode\t{6952B732-2FCB-4E47-976F-989FCBD7EDFB}\tMSITESTDIR\t0\t\tupgradecode.txt\n"; -static const CHAR rrv_registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n" - "s72\ti2\tl255\tL255\tL0\ts72\n" - "Registry\tRegistry\n" - "reg1\t2\tSOFTWARE\\Wine\\keyA\t\tA\tregistry\n" - "reg2\t2\tSOFTWARE\\Wine\\keyA\tvalueA\tA\tregistry\n" - "reg3\t2\tSOFTWARE\\Wine\\key1\t-\t\tregistry\n"; +static const CHAR uc_property_dat[] = "Property\tValue\n" + "s72\tl0\n" + "Property\tProperty\n" + "INSTALLLEVEL\t3\n" + "ProductCode\t{E5FB1241-F547-4BA7-A60E-8E75797268D4}\n" + "ProductName\tMSITEST\n" + "ProductVersion\t1.1.1\n" + "UpgradeCode\t#UPGEADECODE#\n" + "MSIFASTINSTALL\t1\n"; -static const CHAR rrv_remove_registry_dat[] = "RemoveRegistry\tRoot\tKey\tName\tComponent_\n" - "s72\ti2\tl255\tL255\ts72\n" - "RemoveRegistry\tRemoveRegistry\n" - "reg1\t2\tSOFTWARE\\Wine\\keyB\t\tregistry\n" - "reg2\t2\tSOFTWARE\\Wine\\keyB\tValueB\tregistry\n" - "reg3\t2\tSOFTWARE\\Wine\\key2\t-\tregistry\n"; - -static const CHAR rrv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "RemoveFiles\t\t1700\n" - "InstallFiles\t\t2000\n" - "RemoveRegistryValues\t\t3000\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; - -static const CHAR frp_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "product.txt\tproduct\tproduct.txt\t1000\t\t\t8192\t1\n"; - -static const CHAR frp_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "product\t\t\tproduct feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR frp_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "product\tproduct\n"; - -static const CHAR frp_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "product\t{44725EE0-EEA8-40BD-8162-A48224A2FEA1}\tMSITESTDIR\t0\t\tproduct.txt\n"; - -static const CHAR frp_custom_action_dat[] = "Action\tType\tSource\tTarget\tISComments\n" - "s72\ti2\tS64\tS0\tS255\n" - "CustomAction\tAction\n" - "TestProp\t19\t\t\tPROP set\n"; - -static const CHAR frp_upgrade_dat[] = "UpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\tRemove\tActionProperty\n" - "s38\tS20\tS20\tS255\ti4\tS255\ts72\n" - "Upgrade\tUpgradeCode\tVersionMin\tVersionMax\tLanguage\tAttributes\n" - "{4C0EAA15-0264-4E5A-8758-609EF142B92D}\t1.1.1\t2.2.2\t\t768\t\tPROP\n"; - -static const CHAR frp_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "FindRelatedProducts\t\t50\n" - "TestProp\tPROP AND NOT REMOVE\t51\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "RemoveFiles\t\t1700\n" - "InstallFiles\t\t2000\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; - -static const CHAR riv_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "inifile.txt\tinifile\tinifile.txt\t1000\t\t\t8192\t1\n"; - -static const CHAR riv_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "inifile\t\t\tinifile feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR riv_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "inifile\tinifile\n"; - -static const CHAR riv_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "inifile\t{A0F15705-4F57-4437-88C4-6C8B37ACC6DE}\tMSITESTDIR\t0\t\tinifile.txt\n"; - -static const CHAR riv_ini_file_dat[] = "IniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n" - "s72\tl255\tS72\tl96\tl128\tl255\ti2\ts72\n" - "IniFile\tIniFile\n" - "inifile1\ttest.ini\tMSITESTDIR\tsection1\tkey1\tvalue1\t0\tinifile\n"; - -static const CHAR riv_remove_ini_file_dat[] = "RemoveIniFile\tFileName\tDirProperty\tSection\tKey\tValue\tAction\tComponent_\n" - "s72\tl255\tS72\tl96\tl128\tL255\ti2\ts72\n" - "RemoveIniFile\tRemoveIniFile\n" - "inifile1\ttest.ini\tMSITESTDIR\tsectionA\tkeyA\tvalueA\t2\tinifile\n"; - -static const CHAR riv_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "RemoveFiles\t\t1700\n" - "InstallFiles\t\t2000\n" - "RemoveIniValues\t\t3000\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; - -static const CHAR res_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "envvar.txt\tenvvar\tenvvar.txt\t1000\t\t\t8192\t1\n"; - -static const CHAR res_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "envvar\t\t\tenvvar feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR res_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "envvar\tenvvar\n"; - -static const CHAR res_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "envvar\t{45EE9AF4-E5D1-445F-8BB7-B22D4EEBD29E}\tMSITESTDIR\t0\t\tenvvar.txt\n"; - -static const CHAR res_environment_dat[] = "Environment\tName\tValue\tComponent_\n" - "s72\tl255\tL255\ts72\n" - "Environment\tEnvironment\n" - "var1\t=-MSITESTVAR1\t1\tenvvar\n" - "var2\t=+-MSITESTVAR2\t1\tenvvar\n" - "var3\t=MSITESTVAR3\t1\tenvvar\n" - "var4\t=-MSITESTVAR4\t\tenvvar\n" - "var5\t=MSITESTVAR5\t\tenvvar\n"; - -static const CHAR res_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "RemoveFiles\t\t1700\n" - "InstallFiles\t\t2000\n" - "RemoveEnvironmentStrings\t\t3000\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; - -static const CHAR rci_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "class.txt\tclass\tclass.txt\t1000\t\t\t8192\t1\n"; - -static const CHAR rci_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "class\t\t\tclass feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR rci_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "class\tclass\n"; - -static const CHAR rci_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "class\t{89A98345-F8A1-422E-A48B-0250B5809F2D}\tMSITESTDIR\t0\t\tclass.txt\n"; - -static const CHAR rci_appid_dat[] = "AppId\tRemoteServerName\tLocalService\tServiceParameters\tDllSurrogate\tActivateAtStorage\tRunAsInteractiveUser\n" - "s38\tS255\tS255\tS255\tS255\tI2\tI2\n" - "AppId\tAppId\n" - "{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\t\t\t\t\t\t\n"; - -static const CHAR rci_class_dat[] = "CLSID\tContext\tComponent_\tProgId_Default\tDescription\tAppId_\tFileTypeMask\tIcon_\tIconIndex\tDefInprocHandler\tArgument\tFeature_\tAttributes\n" - "s38\ts32\ts72\tS255\tL255\tS38\tS255\tS72\tI2\tS32\tS255\ts38\tI2\n" - "Class\tCLSID\tContext\tComponent_\n" - "{110913E7-86D1-4BF3-9922-BA103FCDDDFA}\tLocalServer\tclass\t\tdescription\t{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}\tmask1;mask2\t\t\t2\t\tclass\t\n"; - -static const CHAR rci_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "RemoveFiles\t\t1700\n" - "InstallFiles\t\t2000\n" - "UnregisterClassInfo\t\t3000\n" - "RegisterClassInfo\t\t4000\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; - -static const CHAR rei_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "extension.txt\textension\textension.txt\t1000\t\t\t8192\t1\n"; - -static const CHAR rei_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "extension\t\t\textension feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR rei_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "extension\textension\n"; - -static const CHAR rei_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "extension\t{9A3060D4-60BA-4A82-AB55-9FB148AD013C}\tMSITESTDIR\t0\t\textension.txt\n"; - -static const CHAR rei_extension_dat[] = "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n" - "s255\ts72\tS255\tS64\ts38\n" - "Extension\tExtension\tComponent_\n" - "extension\textension\tProg.Id.1\t\textension\n"; - -static const CHAR rei_verb_dat[] = "Extension_\tVerb\tSequence\tCommand\tArgument\n" - "s255\ts32\tI2\tL255\tL255\n" - "Verb\tExtension_\tVerb\n" - "extension\tOpen\t1\t&Open\t/argument\n"; - -static const CHAR rei_progid_dat[] = "ProgId\tProgId_Parent\tClass_\tDescription\tIcon_\tIconIndex\n" - "s255\tS255\tS38\tL255\tS72\tI2\n" - "ProgId\tProgId\n" - "Prog.Id.1\t\t\tdescription\t\t\n"; - -static const CHAR rei_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "RemoveFiles\t\t1700\n" - "InstallFiles\t\t2000\n" - "UnregisterExtensionInfo\t\t3000\n" - "RegisterExtensionInfo\t\t4000\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; - -static const CHAR rmi_file_dat[] = "File\tComponent_\tFileName\tFileSize\tVersion\tLanguage\tAttributes\tSequence\n" - "s72\ts72\tl255\ti4\tS72\tS20\tI2\ti2\n" - "File\tFile\n" - "mime.txt\tmime\tmime.txt\t1000\t\t\t8192\t1\n"; - -static const CHAR rmi_feature_dat[] = "Feature\tFeature_Parent\tTitle\tDescription\tDisplay\tLevel\tDirectory_\tAttributes\n" - "s38\tS38\tL64\tL255\tI2\ti2\tS72\ti2\n" - "Feature\tFeature\n" - "mime\t\t\tmime feature\t1\t2\tMSITESTDIR\t0\n"; - -static const CHAR rmi_feature_comp_dat[] = "Feature_\tComponent_\n" - "s38\ts72\n" - "FeatureComponents\tFeature_\tComponent_\n" - "mime\tmime\n"; - -static const CHAR rmi_component_dat[] = "Component\tComponentId\tDirectory_\tAttributes\tCondition\tKeyPath\n" - "s72\tS38\ts72\ti2\tS255\tS72\n" - "Component\tComponent\n" - "mime\t{A1D630CE-13A7-4882-AFDD-148E2BBAFC6D}\tMSITESTDIR\t0\t\tmime.txt\n"; - -static const CHAR rmi_extension_dat[] = "Extension\tComponent_\tProgId_\tMIME_\tFeature_\n" - "s255\ts72\tS255\tS64\ts38\n" - "Extension\tExtension\tComponent_\n" - "mime\tmime\t\tmime/type\tmime\n"; - -static const CHAR rmi_verb_dat[] = "Extension_\tVerb\tSequence\tCommand\tArgument\n" - "s255\ts32\tI2\tL255\tL255\n" - "Verb\tExtension_\tVerb\n" - "mime\tOpen\t1\t&Open\t/argument\n"; - -static const CHAR rmi_mime_dat[] = "ContentType\tExtension_\tCLSID\n" - "s64\ts255\tS38\n" - "MIME\tContentType\n" - "mime/type\tmime\t\n"; - -static const CHAR rmi_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" - "s72\tS255\tI2\n" - "InstallExecuteSequence\tAction\n" - "LaunchConditions\t\t100\n" - "CostInitialize\t\t800\n" - "FileCost\t\t900\n" - "CostFinalize\t\t1000\n" - "InstallValidate\t\t1400\n" - "InstallInitialize\t\t1500\n" - "ProcessComponents\t\t1600\n" - "RemoveFiles\t\t1700\n" - "InstallFiles\t\t2000\n" - "UnregisterExtensionInfo\t\t3000\n" - "UnregisterMIMEInfo\t\t3500\n" - "RegisterExtensionInfo\t\t4000\n" - "RegisterMIMEInfo\t\t4500\n" - "RegisterProduct\t\t5000\n" - "PublishFeatures\t\t5100\n" - "PublishProduct\t\t5200\n" - "InstallFinalize\t\t6000\n"; +static const CHAR uc_install_exec_seq_dat[] = "Action\tCondition\tSequence\n" + "s72\tS255\tI2\n" + "InstallExecuteSequence\tAction\n" + "LaunchConditions\t\t100\n" + "CostInitialize\t\t200\n" + "FileCost\t\t300\n" + "CostFinalize\t\t400\n" + "InstallInitialize\t\t500\n" + "ProcessComponents\t\t600\n" + "InstallValidate\t\t700\n" + "RemoveFiles\t\t800\n" + "InstallFiles\t\t900\n" + "RegisterProduct\t\t1000\n" + "PublishFeatures\t\t1100\n" + "PublishProduct\t\t1200\n" + "InstallFinalize\t\t1300\n"; typedef struct _msi_table { @@ -1992,19 +1287,6 @@ static const msi_table ps_tables[] = ADD_TABLE(condition) }; -static const msi_table env_tables[] = -{ - ADD_TABLE(component), - ADD_TABLE(directory), - ADD_TABLE(feature), - ADD_TABLE(feature_comp), - ADD_TABLE(file), - ADD_TABLE(install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property), - ADD_TABLE(environment) -}; - static const msi_table up_tables[] = { ADD_TABLE(component), @@ -2284,30 +1566,6 @@ static const msi_table spf_tables[] = ADD_TABLE(spf_install_ui_seq), }; -static const msi_table pp_tables[] = -{ - ADD_TABLE(ci_component), - ADD_TABLE(directory), - ADD_TABLE(rof_feature), - ADD_TABLE(rof_feature_comp), - ADD_TABLE(rof_file), - ADD_TABLE(pp_install_exec_seq), - ADD_TABLE(rof_media), - ADD_TABLE(property), -}; - -static const msi_table ppc_tables[] = -{ - ADD_TABLE(ppc_component), - ADD_TABLE(directory), - ADD_TABLE(rof_feature), - ADD_TABLE(ppc_feature_comp), - ADD_TABLE(ppc_file), - ADD_TABLE(pp_install_exec_seq), - ADD_TABLE(ppc_media), - ADD_TABLE(property), -}; - static const msi_table lus0_tables[] = { ADD_TABLE(ci_component), @@ -2394,32 +1652,6 @@ static const msi_table amp_tables[] = ADD_TABLE(property), }; -static const msi_table rem_tables[] = -{ - ADD_TABLE(rem_component), - ADD_TABLE(directory), - ADD_TABLE(rof_feature), - ADD_TABLE(rem_feature_comp), - ADD_TABLE(rem_file), - ADD_TABLE(rem_install_exec_seq), - ADD_TABLE(rof_media), - ADD_TABLE(property), - ADD_TABLE(rem_remove_files), -}; - -static const msi_table mov_tables[] = -{ - ADD_TABLE(cwd_component), - ADD_TABLE(directory), - ADD_TABLE(rof_feature), - ADD_TABLE(ci2_feature_comp), - ADD_TABLE(ci2_file), - ADD_TABLE(install_exec_seq), - ADD_TABLE(rof_media), - ADD_TABLE(property), - ADD_TABLE(mov_move_file), -}; - static const msi_table mc_tables[] = { ADD_TABLE(mc_component), @@ -2433,32 +1665,6 @@ static const msi_table mc_tables[] = ADD_TABLE(mc_file_hash), }; -static const msi_table df_tables[] = -{ - ADD_TABLE(rof_component), - ADD_TABLE(df_directory), - ADD_TABLE(rof_feature), - ADD_TABLE(rof_feature_comp), - ADD_TABLE(rof_file), - ADD_TABLE(install_exec_seq), - ADD_TABLE(rof_media), - ADD_TABLE(property), - ADD_TABLE(df_duplicate_file), -}; - -static const msi_table wrv_tables[] = -{ - ADD_TABLE(wrv_component), - ADD_TABLE(directory), - ADD_TABLE(rof_feature), - ADD_TABLE(ci2_feature_comp), - ADD_TABLE(ci2_file), - ADD_TABLE(install_exec_seq), - ADD_TABLE(rof_media), - ADD_TABLE(property), - ADD_TABLE(wrv_registry), -}; - static const msi_table sf_tables[] = { ADD_TABLE(wrv_component), @@ -2645,261 +1851,16 @@ static const msi_table fiuc_tables[] = ADD_TABLE(property), }; -static const msi_table cf_tables[] = -{ - ADD_TABLE(component), - ADD_TABLE(directory), - ADD_TABLE(feature), - ADD_TABLE(feature_comp), - ADD_TABLE(file), - ADD_TABLE(cf_create_folders), - ADD_TABLE(cf_install_exec_seq), - ADD_TABLE(cf_custom_action), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table rf_tables[] = -{ - ADD_TABLE(component), - ADD_TABLE(directory), - ADD_TABLE(feature), - ADD_TABLE(feature_comp), - ADD_TABLE(file), - ADD_TABLE(cf_create_folders), - ADD_TABLE(rf_install_exec_seq), - ADD_TABLE(cf_custom_action), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table sss_tables[] = -{ - ADD_TABLE(component), - ADD_TABLE(directory), - ADD_TABLE(feature), - ADD_TABLE(feature_comp), - ADD_TABLE(file), - ADD_TABLE(sss_install_exec_seq), - ADD_TABLE(sss_service_control), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table sds_tables[] = -{ - ADD_TABLE(component), - ADD_TABLE(directory), - ADD_TABLE(feature), - ADD_TABLE(feature_comp), - ADD_TABLE(file), - ADD_TABLE(sss_install_exec_seq), - ADD_TABLE(service_control), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table sr_tables[] = -{ - ADD_TABLE(component), - ADD_TABLE(directory), - ADD_TABLE(feature), - ADD_TABLE(feature_comp), - ADD_TABLE(file), - ADD_TABLE(sr_selfreg), - ADD_TABLE(sr_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table font_tables[] = -{ - ADD_TABLE(font_component), - ADD_TABLE(directory), - ADD_TABLE(font_feature), - ADD_TABLE(font_feature_comp), - ADD_TABLE(font_file), - ADD_TABLE(font), - ADD_TABLE(font_install_exec_seq), - ADD_TABLE(font_media), - ADD_TABLE(property) -}; - -static const msi_table vp_tables[] = -{ - ADD_TABLE(component), - ADD_TABLE(directory), - ADD_TABLE(feature), - ADD_TABLE(feature_comp), - ADD_TABLE(file), - ADD_TABLE(vp_custom_action), - ADD_TABLE(vp_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(vp_property) -}; - -static const msi_table odbc_tables[] = -{ - ADD_TABLE(odbc_component), - ADD_TABLE(directory), - ADD_TABLE(odbc_feature), - ADD_TABLE(odbc_feature_comp), - ADD_TABLE(odbc_file), - ADD_TABLE(odbc_driver), - ADD_TABLE(odbc_translator), - ADD_TABLE(odbc_datasource), - ADD_TABLE(odbc_install_exec_seq), - ADD_TABLE(odbc_media), - ADD_TABLE(property) -}; - -static const msi_table tl_tables[] = -{ - ADD_TABLE(tl_component), - ADD_TABLE(directory), - ADD_TABLE(tl_feature), - ADD_TABLE(tl_feature_comp), - ADD_TABLE(tl_file), - ADD_TABLE(tl_typelib), - ADD_TABLE(tl_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table crs_tables[] = -{ - ADD_TABLE(crs_component), - ADD_TABLE(directory), - ADD_TABLE(crs_feature), - ADD_TABLE(crs_feature_comp), - ADD_TABLE(crs_file), - ADD_TABLE(crs_shortcut), - ADD_TABLE(crs_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table pub_tables[] = +static const msi_table sd_tables[] = { ADD_TABLE(directory), - ADD_TABLE(pub_component), - ADD_TABLE(pub_feature), - ADD_TABLE(pub_feature_comp), - ADD_TABLE(pub_file), - ADD_TABLE(pub_publish_component), - ADD_TABLE(pub_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table rd_tables[] = -{ - ADD_TABLE(directory), - ADD_TABLE(rd_component), - ADD_TABLE(rd_feature), - ADD_TABLE(rd_feature_comp), - ADD_TABLE(rd_file), - ADD_TABLE(rd_duplicate_file), - ADD_TABLE(rd_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table rrv_tables[] = -{ - ADD_TABLE(directory), - ADD_TABLE(rrv_component), - ADD_TABLE(rrv_feature), - ADD_TABLE(rrv_feature_comp), - ADD_TABLE(rrv_file), - ADD_TABLE(rrv_registry), - ADD_TABLE(rrv_remove_registry), - ADD_TABLE(rrv_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table frp_tables[] = -{ - ADD_TABLE(directory), - ADD_TABLE(frp_component), - ADD_TABLE(frp_feature), - ADD_TABLE(frp_feature_comp), - ADD_TABLE(frp_file), - ADD_TABLE(frp_upgrade), - ADD_TABLE(frp_custom_action), - ADD_TABLE(frp_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table riv_tables[] = -{ - ADD_TABLE(directory), - ADD_TABLE(riv_component), - ADD_TABLE(riv_feature), - ADD_TABLE(riv_feature_comp), - ADD_TABLE(riv_file), - ADD_TABLE(riv_ini_file), - ADD_TABLE(riv_remove_ini_file), - ADD_TABLE(riv_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table res_tables[] = -{ - ADD_TABLE(directory), - ADD_TABLE(res_component), - ADD_TABLE(res_feature), - ADD_TABLE(res_feature_comp), - ADD_TABLE(res_file), - ADD_TABLE(res_environment), - ADD_TABLE(res_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table rci_tables[] = -{ - ADD_TABLE(directory), - ADD_TABLE(rci_component), - ADD_TABLE(rci_feature), - ADD_TABLE(rci_feature_comp), - ADD_TABLE(rci_file), - ADD_TABLE(rci_appid), - ADD_TABLE(rci_class), - ADD_TABLE(rci_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table rei_tables[] = -{ - ADD_TABLE(directory), - ADD_TABLE(rei_component), - ADD_TABLE(rei_feature), - ADD_TABLE(rei_feature_comp), - ADD_TABLE(rei_file), - ADD_TABLE(rei_extension), - ADD_TABLE(rei_verb), - ADD_TABLE(rei_progid), - ADD_TABLE(rei_install_exec_seq), - ADD_TABLE(media), - ADD_TABLE(property) -}; - -static const msi_table rmi_tables[] = -{ - ADD_TABLE(directory), - ADD_TABLE(rmi_component), - ADD_TABLE(rmi_feature), - ADD_TABLE(rmi_feature_comp), - ADD_TABLE(rmi_file), - ADD_TABLE(rmi_extension), - ADD_TABLE(rmi_verb), - ADD_TABLE(rmi_mime), - ADD_TABLE(rmi_install_exec_seq), + ADD_TABLE(sd_component), + ADD_TABLE(sd_feature), + ADD_TABLE(sd_feature_comp), + ADD_TABLE(sd_file), + ADD_TABLE(sd_install_exec_seq), + ADD_TABLE(sd_install_ui_seq), + ADD_TABLE(sd_custom_action), ADD_TABLE(media), ADD_TABLE(property) }; @@ -2930,6 +1891,43 @@ static const msi_table icon_base_tables[] = ADD_TABLE(icon_property), }; +static const msi_table pv_tables[] = +{ + ADD_TABLE(rof_component), + ADD_TABLE(directory), + ADD_TABLE(rof_feature), + ADD_TABLE(rof_feature_comp), + ADD_TABLE(rof_file), + ADD_TABLE(pv_install_exec_seq), + ADD_TABLE(rof_media), + ADD_TABLE(property) +}; + +static const msi_table cl_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(cl_custom_action), + ADD_TABLE(cl_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property) +}; + +static const msi_table uc_tables[] = +{ + ADD_TABLE(directory), + ADD_TABLE(uc_component), + ADD_TABLE(uc_feature), + ADD_TABLE(uc_feature_comp), + ADD_TABLE(uc_file), + ADD_TABLE(uc_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(uc_property) +}; + /* cabinet definitions */ /* make the max size large so there is only one cab file */ @@ -3044,6 +2042,7 @@ static void init_functionpointers(void) { HMODULE hmsi = GetModuleHandleA("msi.dll"); HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll"); + HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); #define GET_PROC(mod, func) \ p ## func = (void*)GetProcAddress(mod, #func); \ @@ -3054,8 +2053,13 @@ static void init_functionpointers(void) GET_PROC(hmsi, MsiSetExternalUIRecord); GET_PROC(hmsi, MsiSourceListEnumSourcesA); GET_PROC(hmsi, MsiSourceListGetInfoA); + GET_PROC(hmsi, MsiGetComponentPathExA); GET_PROC(hadvapi32, ConvertSidToStringSidA); + GET_PROC(hadvapi32, GetTokenInformation); + GET_PROC(hadvapi32, OpenProcessToken); + GET_PROC(hadvapi32, RegDeleteKeyExA) + GET_PROC(hkernel32, IsWow64Process) hsrclient = LoadLibraryA("srclient.dll"); GET_PROC(hsrclient, SRRemoveRestorePoint); @@ -3064,41 +2068,23 @@ static void init_functionpointers(void) #undef GET_PROC } -static BOOL check_win9x(void) -{ - SC_HANDLE scm; - - scm = OpenSCManager(NULL, NULL, GENERIC_ALL); - if (!scm && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) - return TRUE; - - CloseServiceHandle(scm); - - return FALSE; -} - -static LPSTR get_user_sid(LPSTR *usersid) +static BOOL is_process_limited(void) { HANDLE token; - BYTE buf[1024]; - DWORD size; - PTOKEN_USER user; - if (!pConvertSidToStringSidA) + if (!pOpenProcessToken || !pGetTokenInformation) return FALSE; + + if (pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) { - win_skip("ConvertSidToStringSidA is not available\n"); - return NULL; - } + BOOL ret; + TOKEN_ELEVATION_TYPE type = TokenElevationTypeDefault; + DWORD size; - *usersid = NULL; - OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token); - size = sizeof(buf); - GetTokenInformation(token, TokenUser, buf, size, &size); - user = (PTOKEN_USER)buf; - pConvertSidToStringSidA(user->User.Sid, usersid); - ok(*usersid != NULL, "pConvertSidToStringSidA failed lre=%d\n", GetLastError()); - CloseHandle(token); - return *usersid; + ret = pGetTokenInformation(token, TokenElevationType, &type, sizeof(type), &size); + CloseHandle(token); + return (ret && type == TokenElevationTypeLimited); + } + return FALSE; } static BOOL check_record(MSIHANDLE rec, UINT field, LPCSTR val) @@ -3253,14 +2239,21 @@ static BOOL get_system_dirs(void) } size = MAX_PATH; - if (RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size)) { + if (RegQueryValueExA(hkey, "CommonFilesDir (x86)", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size) && + RegQueryValueExA(hkey, "CommonFilesDir", 0, &type, (LPBYTE)COMMON_FILES_DIR, &size)) { + RegCloseKey(hkey); + return FALSE; + } + + size = MAX_PATH; + if (RegQueryValueExA(hkey, "ProgramFilesDir", 0, &type, (LPBYTE)PROG_FILES_DIR_NATIVE, &size)) { RegCloseKey(hkey); return FALSE; } RegCloseKey(hkey); - if(GetWindowsDirectoryA(WINDOWS_DIR, MAX_PATH) != ERROR_SUCCESS) + if(!GetWindowsDirectoryA(WINDOWS_DIR, MAX_PATH)) return FALSE; return TRUE; @@ -3322,6 +2315,20 @@ static BOOL delete_pf(const CHAR *rel_path, BOOL is_file) return RemoveDirectoryA(path); } +static BOOL delete_pf_native(const CHAR *rel_path, BOOL is_file) +{ + CHAR path[MAX_PATH]; + + lstrcpyA(path, PROG_FILES_DIR_NATIVE); + lstrcatA(path, "\\"); + lstrcatA(path, rel_path); + + if (is_file) + return DeleteFileA(path); + else + return RemoveDirectoryA(path); +} + static BOOL delete_cf(const CHAR *rel_path, BOOL is_file) { CHAR path[MAX_PATH]; @@ -3336,6 +2343,29 @@ static BOOL delete_cf(const CHAR *rel_path, BOOL is_file) return RemoveDirectoryA(path); } +static BOOL compare_pf_data(const char *filename, const char *data, DWORD size) +{ + DWORD read; + HANDLE handle; + BOOL ret = FALSE; + char *buffer, path[MAX_PATH]; + + lstrcpyA(path, PROG_FILES_DIR); + lstrcatA(path, "\\"); + lstrcatA(path, filename); + + handle = CreateFileA(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + buffer = HeapAlloc(GetProcessHeap(), 0, size); + if (buffer) + { + ReadFile(handle, buffer, size, &read, NULL); + if (read == size && !memcmp(data, buffer, size)) ret = TRUE; + HeapFree(GetProcessHeap(), 0, buffer); + } + CloseHandle(handle); + return ret; +} + static void delete_test_files(void) { DeleteFileA("msitest.msi"); @@ -3361,7 +2391,7 @@ static void write_file(const CHAR *filename, const char *data, int data_size) CloseHandle(hf); } -static void write_msi_summary_info(MSIHANDLE db, INT wordcount) +static void write_msi_summary_info(MSIHANDLE db, INT version, INT wordcount, const char *template) { MSIHANDLE summary; UINT r; @@ -3369,14 +2399,14 @@ static void write_msi_summary_info(MSIHANDLE db, INT wordcount) r = MsiGetSummaryInformationA(db, NULL, 5, &summary); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, ";1033"); + r = MsiSummaryInfoSetPropertyA(summary, PID_TEMPLATE, VT_LPSTR, 0, NULL, template); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); r = MsiSummaryInfoSetPropertyA(summary, PID_REVNUMBER, VT_LPSTR, 0, NULL, "{004757CA-5092-49c2-AD20-28E1CE0DF5F2}"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, 100, NULL, NULL); + r = MsiSummaryInfoSetPropertyA(summary, PID_PAGECOUNT, VT_I4, version, NULL, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); r = MsiSummaryInfoSetPropertyA(summary, PID_WORDCOUNT, VT_I4, wordcount, NULL, NULL); @@ -3393,10 +2423,14 @@ static void write_msi_summary_info(MSIHANDLE db, INT wordcount) } #define create_database(name, tables, num_tables) \ - create_database_wordcount(name, tables, num_tables, 0); + create_database_wordcount(name, tables, num_tables, 100, 0, ";1033"); + +#define create_database_template(name, tables, num_tables, version, template) \ + create_database_wordcount(name, tables, num_tables, version, 0, template); static void create_database_wordcount(const CHAR *name, const msi_table *tables, - int num_tables, INT wordcount) + int num_tables, INT version, INT wordcount, + const char *template) { MSIHANDLE db; UINT r; @@ -3418,7 +2452,7 @@ static void create_database_wordcount(const CHAR *name, const msi_table *tables, DeleteFileA(table->filename); } - write_msi_summary_info(db, wordcount); + write_msi_summary_info(db, version, wordcount, template); r = MsiDatabaseCommit(db); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -3465,6 +2499,13 @@ static void remove_restore_point(DWORD seq_number) trace("Failed to remove the restore point : %08x\n", res); } +static LONG delete_key( HKEY key, LPCSTR subkey, REGSAM access ) +{ + if (pRegDeleteKeyExA) + return pRegDeleteKeyExA( key, subkey, access, 0 ); + return RegDeleteKeyA( key, subkey ); +} + static void test_MsiInstallProduct(void) { UINT r; @@ -3472,13 +2513,19 @@ static void test_MsiInstallProduct(void) LONG res; HKEY hkey; DWORD num, size, type; + REGSAM access = KEY_ALL_ACCESS; - if (on_win9x) + if (is_process_limited()) { - win_skip("Services are not implemented on Win9x and WinMe\n"); + skip("process is limited\n"); return; } + if (is_wow64) + access |= KEY_WOW64_64KEY; + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + /* szPackagePath is NULL */ r = MsiInstallProductA(NULL, "INSTALL=ALL"); ok(r == ERROR_INVALID_PARAMETER, @@ -3499,22 +2546,27 @@ static void test_MsiInstallProduct(void) /* install, don't publish */ r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyEx(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", 0, access, &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); size = MAX_PATH; @@ -3542,28 +2594,28 @@ static void test_MsiInstallProduct(void) check_service_is_installed(); - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + delete_key(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", access); /* not published, reinstall */ r = MsiInstallProductA(msifile, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); create_database(msifile, up_tables, sizeof(up_tables) / sizeof(msi_table)); @@ -3572,21 +2624,21 @@ static void test_MsiInstallProduct(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); create_database(msifile, up2_tables, sizeof(up2_tables) / sizeof(msi_table)); @@ -3595,21 +2647,21 @@ static void test_MsiInstallProduct(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); create_database(msifile, up3_tables, sizeof(up3_tables) / sizeof(msi_table)); @@ -3618,21 +2670,21 @@ static void test_MsiInstallProduct(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + RegDeleteKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest"); create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table)); @@ -3641,19 +2693,19 @@ static void test_MsiInstallProduct(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table)); @@ -3663,19 +2715,19 @@ static void test_MsiInstallProduct(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); create_database(msifile, up5_tables, sizeof(up5_tables) / sizeof(msi_table)); @@ -3685,19 +2737,19 @@ static void test_MsiInstallProduct(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); create_database(msifile, up6_tables, sizeof(up6_tables) / sizeof(msi_table)); @@ -3707,19 +2759,19 @@ static void test_MsiInstallProduct(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); create_database(msifile, up7_tables, sizeof(up7_tables) / sizeof(msi_table)); @@ -3729,25 +2781,27 @@ static void test_MsiInstallProduct(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + res = RegOpenKeyA(HKEY_CURRENT_USER, "SOFTWARE\\Wine\\msitest", &hkey); ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); +error: delete_test_files(); + DeleteFileA(msifile); } static void test_MsiSetComponentState(void) @@ -3765,7 +2819,14 @@ static void test_MsiSetComponentState(void) lstrcat(path, "\\"); lstrcat(path, msifile); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiOpenPackage(path, &package); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); r = MsiDoAction(package, "CostInitialize"); @@ -3786,8 +2847,9 @@ static void test_MsiSetComponentState(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); MsiCloseHandle(package); - CoUninitialize(); +error: + CoUninitialize(); DeleteFileA(msifile); } @@ -3909,20 +2971,23 @@ static void test_continuouscabs(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + create_cc_test_files(); create_database(msifile, cc_tables, sizeof(cc_tables) / sizeof(msi_table)); MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); - if (r == ERROR_SUCCESS) /* win9x has a problem with this */ - { - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); delete_cab_files(); DeleteFile(msifile); @@ -3933,13 +2998,19 @@ static void test_continuouscabs(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n"); ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); +error: delete_cab_files(); DeleteFile(msifile); } @@ -3962,13 +3033,18 @@ static void test_caborder(void) create_cab_file("test3.cab", MEDIA_SIZE, "caesar\0"); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n"); ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n"); todo_wine { ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n"); - ok(!delete_pf("msitest", FALSE), "File is installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory is created\n"); } delete_cab_files(); @@ -3982,7 +3058,7 @@ static void test_caborder(void) ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n"); ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n"); ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n"); - ok(!delete_pf("msitest", FALSE), "File is installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory is created\n"); delete_cab_files(); DeleteFile(msifile); @@ -3993,7 +3069,7 @@ static void test_caborder(void) r = MsiInstallProductA(msifile, NULL); ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); ok(!delete_pf("msitest\\caesar", TRUE), "File is installed\n"); - ok(!delete_pf("msitest", FALSE), "File is installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory is created\n"); todo_wine { ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n"); @@ -4013,9 +3089,10 @@ static void test_caborder(void) { ok(!delete_pf("msitest\\augustus", TRUE), "File is installed\n"); ok(!delete_pf("msitest\\maximus", TRUE), "File is installed\n"); - ok(!delete_pf("msitest", FALSE), "File is installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory is created\n"); } +error: delete_cab_files(); DeleteFile("imperator"); DeleteFile("maximus"); @@ -4028,6 +3105,12 @@ static void test_mixedmedia(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\maximus", 500); create_file("msitest\\augustus", 500); @@ -4040,12 +3123,18 @@ static void test_mixedmedia(void) create_cab_file("test1.cab", MEDIA_SIZE, "caesar\0"); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); +error: /* Delete the files in the temp (current) folder */ DeleteFile("msitest\\maximus"); DeleteFile("msitest\\augustus"); @@ -4065,15 +3154,14 @@ static void test_samesequence(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); - if (r == ERROR_SUCCESS) /* win9x has a problem with this */ + ok(r == ERROR_SUCCESS || broken(r == ERROR_INSTALL_FAILURE), "Expected ERROR_SUCCESS, got %u\n", r); + if (r == ERROR_SUCCESS) { - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); } - delete_cab_files(); DeleteFile(msifile); } @@ -4088,15 +3176,14 @@ static void test_uiLevelFlags(void) MsiSetInternalUI(INSTALLUILEVEL_NONE | INSTALLUILEVEL_SOURCERESONLY, NULL); r = MsiInstallProductA(msifile, NULL); - if (r == ERROR_SUCCESS) /* win9x has a problem with this */ + ok(r == ERROR_SUCCESS || broken(r == ERROR_INSTALL_FAILURE), "Expected ERROR_SUCCESS, got %u\n", r); + if (r == ERROR_SUCCESS) { - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(!delete_pf("msitest\\maximus", TRUE), "UI install occurred, but execute-only was requested.\n"); ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); } - delete_cab_files(); DeleteFile(msifile); } @@ -4124,6 +3211,12 @@ static void test_readonlyfile(void) HANDLE file; CHAR path[MAX_PATH]; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\maximus", 500); create_database(msifile, rof_tables, sizeof(rof_tables) / sizeof(msi_table)); @@ -4142,11 +3235,17 @@ static void test_readonlyfile(void) CloseHandle(file); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(file_matches(path), "Expected file to be overwritten\n"); ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); +error: /* Delete the files in the temp (current) folder */ DeleteFile("msitest\\maximus"); RemoveDirectory("msitest"); @@ -4161,6 +3260,12 @@ static void test_readonlyfile_cab(void) CHAR path[MAX_PATH]; CHAR buf[16]; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("maximus", 500); create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0"); @@ -4182,6 +3287,11 @@ static void test_readonlyfile_cab(void) CloseHandle(file); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); memset( buf, 0, sizeof(buf) ); @@ -4193,8 +3303,9 @@ static void test_readonlyfile_cab(void) } ok(!memcmp( buf, "maximus", sizeof("maximus")-1 ), "Expected file to be overwritten, got '%s'\n", buf); ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); +error: /* Delete the files in the temp (current) folder */ delete_cab_files(); DeleteFile("msitest\\maximus"); @@ -4274,6 +3385,11 @@ static void test_lastusedsource(void) ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); r = MsiInstallProductA("msifile0.msi", "PUBLISH_PRODUCT=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); lstrcpyA(path, CURR_DIR); @@ -4284,11 +3400,8 @@ static void test_lastusedsource(void) r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - todo_wine - { ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value); ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size); - } r = MsiInstallProductA("msifile0.msi", "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -4313,11 +3426,8 @@ static void test_lastusedsource(void) r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - todo_wine - { ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value); ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size); - } r = MsiInstallProductA("msifile1.msi", "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -4341,11 +3451,8 @@ static void test_lastusedsource(void) r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - todo_wine - { ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value); ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size); - } r = MsiInstallProductA("msifile2.msi", "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -4357,6 +3464,7 @@ static void test_lastusedsource(void) ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %u\n", r); ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); +error: /* Delete the files in the temp (current) folder */ delete_cab_files(); DeleteFile("msitest\\maximus"); @@ -4370,6 +3478,12 @@ static void test_setdirproperty(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\maximus", 500); create_database(msifile, sdp_tables, sizeof(sdp_tables) / sizeof(msi_table)); @@ -4377,10 +3491,16 @@ static void test_setdirproperty(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_cf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_cf("msitest", FALSE), "File not installed\n"); + ok(delete_cf("msitest", FALSE), "Directory not created\n"); +error: /* Delete the files in the temp (current) folder */ DeleteFile(msifile); DeleteFile("msitest\\maximus"); @@ -4391,6 +3511,12 @@ static void test_cabisextracted(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\gaius", 500); create_file("maximus", 500); @@ -4406,13 +3532,19 @@ static void test_cabisextracted(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); ok(delete_pf("msitest\\gaius", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); +error: /* Delete the files in the temp (current) folder */ delete_cab_files(); DeleteFile(msifile); @@ -4428,6 +3560,12 @@ static void test_concurrentinstall(void) UINT r; CHAR path[MAX_PATH]; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); CreateDirectoryA("msitest\\msitest", NULL); create_file("msitest\\maximus", 500); @@ -4442,11 +3580,17 @@ static void test_concurrentinstall(void) MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(path); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); if (!delete_pf("msitest\\augustus", TRUE)) trace("concurrent installs not supported\n"); ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); DeleteFile(path); @@ -4454,8 +3598,9 @@ static void test_concurrentinstall(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); +error: DeleteFile(msifile); DeleteFile("msitest\\msitest\\augustus"); DeleteFile("msitest\\maximus"); @@ -4469,6 +3614,12 @@ static void test_setpropertyfolder(void) CHAR path[MAX_PATH]; DWORD attr; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + lstrcpyA(path, PROG_FILES_DIR); lstrcatA(path, "\\msitest\\added"); @@ -4480,21 +3631,27 @@ static void test_setpropertyfolder(void) MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); attr = GetFileAttributesA(path); if (attr != INVALID_FILE_ATTRIBUTES && (attr & FILE_ATTRIBUTE_DIRECTORY)) { ok(delete_pf("msitest\\added\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\added", FALSE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\added", FALSE), "Directory not created\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); } else { trace("changing folder property not supported\n"); ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); } +error: /* Delete the files in the temp (current) folder */ DeleteFile(msifile); DeleteFile("msitest\\maximus"); @@ -4530,7 +3687,7 @@ static void delete_pfmsitest_files(void) shfl.wFunc = FO_DELETE; shfl.pFrom = path; shfl.pTo = NULL; - shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT; + shfl.fFlags = FOF_FILESONLY | FOF_NOCONFIRMATION | FOF_NORECURSION | FOF_SILENT | FOF_NOERRORUI; SHFileOperation(&shfl); @@ -4539,1631 +3696,6 @@ static void delete_pfmsitest_files(void) RemoveDirectoryA(path); } -static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase, DWORD line) -{ - char val[MAX_PATH]; - DWORD size, type; - LONG res; - - size = MAX_PATH; - val[0] = '\0'; - res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)val, &size); - - if (res != ERROR_SUCCESS || - (type != REG_SZ && type != REG_EXPAND_SZ && type != REG_MULTI_SZ)) - { - ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n"); - return; - } - - if (!expected) - ok_(__FILE__, line)(lstrlenA(val) == 0, "Expected empty string, got %s\n", val); - else - { - if (bcase) - ok_(__FILE__, line)(!lstrcmpA(val, expected), "Expected %s, got %s\n", expected, val); - else - ok_(__FILE__, line)(!lstrcmpiA(val, expected), "Expected %s, got %s\n", expected, val); - } -} - -static void check_reg_dword(HKEY prodkey, LPCSTR name, DWORD expected, DWORD line) -{ - DWORD val, size, type; - LONG res; - - size = sizeof(DWORD); - res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size); - - if (res != ERROR_SUCCESS || type != REG_DWORD) - { - ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n"); - return; - } - - ok_(__FILE__, line)(val == expected, "Expected %d, got %d\n", expected, val); -} - -static void check_reg_dword2(HKEY prodkey, LPCSTR name, DWORD expected1, DWORD expected2, DWORD line) -{ - DWORD val, size, type; - LONG res; - - size = sizeof(DWORD); - res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size); - - if (res != ERROR_SUCCESS || type != REG_DWORD) - { - ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n"); - return; - } - - ok_(__FILE__, line)(val == expected1 || val == expected2, "Expected %d or %d, got %d\n", expected1, expected2, val); -} - -static void check_reg_dword3(HKEY prodkey, LPCSTR name, DWORD expected1, DWORD expected2, DWORD expected3, DWORD line) -{ - DWORD val, size, type; - LONG res; - - size = sizeof(DWORD); - res = RegQueryValueExA(prodkey, name, NULL, &type, (LPBYTE)&val, &size); - - if (res != ERROR_SUCCESS || type != REG_DWORD) - { - ok_(__FILE__, line)(FALSE, "Key doesn't exist or wrong type\n"); - return; - } - - ok_(__FILE__, line)(val == expected1 || val == expected2 || val == expected3, - "Expected %d, %d or %d, got %d\n", expected1, expected2, expected3, val); -} - -#define CHECK_REG_STR(prodkey, name, expected) \ - check_reg_str(prodkey, name, expected, TRUE, __LINE__); - -#define CHECK_DEL_REG_STR(prodkey, name, expected) \ - check_reg_str(prodkey, name, expected, TRUE, __LINE__); \ - RegDeleteValueA(prodkey, name); - -#define CHECK_REG_ISTR(prodkey, name, expected) \ - check_reg_str(prodkey, name, expected, FALSE, __LINE__); - -#define CHECK_DEL_REG_ISTR(prodkey, name, expected) \ - check_reg_str(prodkey, name, expected, FALSE, __LINE__); \ - RegDeleteValueA(prodkey, name); - -#define CHECK_REG_DWORD(prodkey, name, expected) \ - check_reg_dword(prodkey, name, expected, __LINE__); - -#define CHECK_DEL_REG_DWORD(prodkey, name, expected) \ - check_reg_dword(prodkey, name, expected, __LINE__); \ - RegDeleteValueA(prodkey, name); - -#define CHECK_REG_DWORD2(prodkey, name, expected1, expected2) \ - check_reg_dword2(prodkey, name, expected1, expected2, __LINE__); - -#define CHECK_DEL_REG_DWORD2(prodkey, name, expected1, expected2) \ - check_reg_dword2(prodkey, name, expected1, expected2, __LINE__); \ - RegDeleteValueA(prodkey, name); - -#define CHECK_REG_DWORD3(prodkey, name, expected1, expected2, expected3) \ - check_reg_dword3(prodkey, name, expected1, expected2, expected3, __LINE__); - -#define CHECK_DEL_REG_DWORD3(prodkey, name, expected1, expected2, expected3) \ - check_reg_dword3(prodkey, name, expected1, expected2, expected3, __LINE__); \ - RegDeleteValueA(prodkey, name); - -static void get_date_str(LPSTR date) -{ - SYSTEMTIME systime; - - static const char date_fmt[] = "%d%02d%02d"; - GetLocalTime(&systime); - sprintf(date, date_fmt, systime.wYear, systime.wMonth, systime.wDay); -} - -static void test_publish_registerproduct(void) -{ - UINT r; - LONG res; - HKEY hkey; - HKEY props, usage; - LPSTR usersid; - char date[MAX_PATH]; - char temp[MAX_PATH]; - char keypath[MAX_PATH]; - - static const CHAR uninstall[] = "Software\\Microsoft\\Windows\\CurrentVersion" - "\\Uninstall\\{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"; - static const CHAR userdata[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer" - "\\UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB"; - static const CHAR ugkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Installer" - "\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2"; - static const CHAR userugkey[] = "Software\\Microsoft\\Installer\\UpgradeCodes" - "\\51AAE0C44620A5E4788506E91F249BD2"; - - if (!get_user_sid(&usersid)) - return; - - get_date_str(date); - GetTempPath(MAX_PATH, temp); - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\maximus", 500); - - create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); - - /* RegisterProduct */ - r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - res = RegOpenKeyA(HKEY_CURRENT_USER, userugkey, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, uninstall, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST"); - CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1"); - CHECK_DEL_REG_STR(hkey, "InstallDate", date); - CHECK_DEL_REG_STR(hkey, "InstallSource", temp); - CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_DEL_REG_STR(hkey, "Publisher", "Wine"); - CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", NULL); - CHECK_DEL_REG_STR(hkey, "Comments", NULL); - CHECK_DEL_REG_STR(hkey, "Contact", NULL); - CHECK_DEL_REG_STR(hkey, "HelpLink", NULL); - CHECK_DEL_REG_STR(hkey, "HelpTelephone", NULL); - CHECK_DEL_REG_STR(hkey, "InstallLocation", NULL); - CHECK_DEL_REG_STR(hkey, "Readme", NULL); - CHECK_DEL_REG_STR(hkey, "Size", NULL); - CHECK_DEL_REG_STR(hkey, "URLInfoAbout", NULL); - CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", NULL); - CHECK_DEL_REG_DWORD(hkey, "Language", 1033); - CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001); - CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1); - CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1); - CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1); - todo_wine - { - CHECK_DEL_REG_DWORD3(hkey, "EstimatedSize", 12, -12, 4); - } - - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - sprintf(keypath, userdata, usersid); - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - res = RegOpenKeyA(hkey, "InstallProperties", &props); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */ - CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST"); - CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1"); - CHECK_DEL_REG_STR(props, "InstallDate", date); - CHECK_DEL_REG_STR(props, "InstallSource", temp); - CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_DEL_REG_STR(props, "Publisher", "Wine"); - CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", NULL); - CHECK_DEL_REG_STR(props, "Comments", NULL); - CHECK_DEL_REG_STR(props, "Contact", NULL); - CHECK_DEL_REG_STR(props, "HelpLink", NULL); - CHECK_DEL_REG_STR(props, "HelpTelephone", NULL); - CHECK_DEL_REG_STR(props, "InstallLocation", NULL); - CHECK_DEL_REG_STR(props, "Readme", NULL); - CHECK_DEL_REG_STR(props, "Size", NULL); - CHECK_DEL_REG_STR(props, "URLInfoAbout", NULL); - CHECK_DEL_REG_STR(props, "URLUpdateInfo", NULL); - CHECK_DEL_REG_DWORD(props, "Language", 1033); - CHECK_DEL_REG_DWORD(props, "Version", 0x1010001); - CHECK_DEL_REG_DWORD(props, "VersionMajor", 1); - CHECK_DEL_REG_DWORD(props, "VersionMinor", 1); - CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1); - todo_wine - { - CHECK_DEL_REG_DWORD3(props, "EstimatedSize", 12, -12, 4); - } - - RegDeleteKeyA(props, ""); - RegCloseKey(props); - - res = RegOpenKeyA(hkey, "Usage", &usage); - todo_wine - { - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - } - - RegDeleteKeyA(usage, ""); - RegCloseKey(usage); - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, ugkey, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL); - - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - /* RegisterProduct, machine */ - r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 ALLUSERS=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, userugkey, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, uninstall, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(hkey, "DisplayName", "MSITEST"); - CHECK_DEL_REG_STR(hkey, "DisplayVersion", "1.1.1"); - CHECK_DEL_REG_STR(hkey, "InstallDate", date); - CHECK_DEL_REG_STR(hkey, "InstallSource", temp); - CHECK_DEL_REG_ISTR(hkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_DEL_REG_STR(hkey, "Publisher", "Wine"); - CHECK_DEL_REG_STR(hkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_DEL_REG_STR(hkey, "AuthorizedCDFPrefix", NULL); - CHECK_DEL_REG_STR(hkey, "Comments", NULL); - CHECK_DEL_REG_STR(hkey, "Contact", NULL); - CHECK_DEL_REG_STR(hkey, "HelpLink", NULL); - CHECK_DEL_REG_STR(hkey, "HelpTelephone", NULL); - CHECK_DEL_REG_STR(hkey, "InstallLocation", NULL); - CHECK_DEL_REG_STR(hkey, "Readme", NULL); - CHECK_DEL_REG_STR(hkey, "Size", NULL); - CHECK_DEL_REG_STR(hkey, "URLInfoAbout", NULL); - CHECK_DEL_REG_STR(hkey, "URLUpdateInfo", NULL); - CHECK_DEL_REG_DWORD(hkey, "Language", 1033); - CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001); - CHECK_DEL_REG_DWORD(hkey, "VersionMajor", 1); - CHECK_DEL_REG_DWORD(hkey, "VersionMinor", 1); - CHECK_DEL_REG_DWORD(hkey, "WindowsInstaller", 1); - todo_wine - { - CHECK_DEL_REG_DWORD3(hkey, "EstimatedSize", 12, -12, 4); - } - - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - sprintf(keypath, userdata, "S-1-5-18"); - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - res = RegOpenKeyA(hkey, "InstallProperties", &props); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - RegDeleteValueA(props, "LocalPackage"); /* LocalPackage is nondeterministic */ - CHECK_DEL_REG_STR(props, "DisplayName", "MSITEST"); - CHECK_DEL_REG_STR(props, "DisplayVersion", "1.1.1"); - CHECK_DEL_REG_STR(props, "InstallDate", date); - CHECK_DEL_REG_STR(props, "InstallSource", temp); - CHECK_DEL_REG_ISTR(props, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_DEL_REG_STR(props, "Publisher", "Wine"); - CHECK_DEL_REG_STR(props, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_DEL_REG_STR(props, "AuthorizedCDFPrefix", NULL); - CHECK_DEL_REG_STR(props, "Comments", NULL); - CHECK_DEL_REG_STR(props, "Contact", NULL); - CHECK_DEL_REG_STR(props, "HelpLink", NULL); - CHECK_DEL_REG_STR(props, "HelpTelephone", NULL); - CHECK_DEL_REG_STR(props, "InstallLocation", NULL); - CHECK_DEL_REG_STR(props, "Readme", NULL); - CHECK_DEL_REG_STR(props, "Size", NULL); - CHECK_DEL_REG_STR(props, "URLInfoAbout", NULL); - CHECK_DEL_REG_STR(props, "URLUpdateInfo", NULL); - CHECK_DEL_REG_DWORD(props, "Language", 1033); - CHECK_DEL_REG_DWORD(props, "Version", 0x1010001); - CHECK_DEL_REG_DWORD(props, "VersionMajor", 1); - CHECK_DEL_REG_DWORD(props, "VersionMinor", 1); - CHECK_DEL_REG_DWORD(props, "WindowsInstaller", 1); - todo_wine - { - CHECK_DEL_REG_DWORD3(props, "EstimatedSize", 12, -12, 4); - } - - RegDeleteKeyA(props, ""); - RegCloseKey(props); - - res = RegOpenKeyA(hkey, "Usage", &usage); - todo_wine - { - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - } - - RegDeleteKeyA(usage, ""); - RegCloseKey(usage); - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, ugkey, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL); - - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - DeleteFile(msifile); - DeleteFile("msitest\\maximus"); - RemoveDirectory("msitest"); - HeapFree(GetProcessHeap(), 0, usersid); -} - -static void test_publish_publishproduct(void) -{ - UINT r; - LONG res; - LPSTR usersid; - HKEY sourcelist, net, props; - HKEY hkey, patches, media; - CHAR keypath[MAX_PATH]; - CHAR temp[MAX_PATH]; - CHAR path[MAX_PATH]; - BOOL old_installer = FALSE; - - static const CHAR prodpath[] = "Software\\Microsoft\\Windows\\CurrentVersion" - "\\Installer\\UserData\\%s\\Products" - "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; - static const CHAR cuprodpath[] = "Software\\Microsoft\\Installer\\Products" - "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; - static const CHAR cuupgrades[] = "Software\\Microsoft\\Installer\\UpgradeCodes" - "\\51AAE0C44620A5E4788506E91F249BD2"; - static const CHAR badprod[] = "Software\\Microsoft\\Windows\\CurrentVersion" - "\\Installer\\Products" - "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; - static const CHAR machprod[] = "Installer\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB"; - static const CHAR machup[] = "Installer\\UpgradeCodes\\51AAE0C44620A5E4788506E91F249BD2"; - - if (!get_user_sid(&usersid)) - return; - - GetTempPath(MAX_PATH, temp); - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\maximus", 500); - - create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); - - /* PublishProduct, current user */ - r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, badprod, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - sprintf(keypath, prodpath, usersid); - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey); - if (res == ERROR_FILE_NOT_FOUND) - { - res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey); - if (res == ERROR_SUCCESS) - { - win_skip("Windows Installer < 3.0 detected\n"); - RegCloseKey(hkey); - old_installer = TRUE; - goto currentuser; - } - else - { - win_skip("Install failed, no need to continue\n"); - return; - } - } - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - res = RegOpenKeyA(hkey, "InstallProperties", &props); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegOpenKeyA(hkey, "Patches", &patches); - todo_wine - { - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(patches, "AllPatches", NULL); - } - - RegDeleteKeyA(patches, ""); - RegCloseKey(patches); - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - -currentuser: - res = RegOpenKeyA(HKEY_CURRENT_USER, cuprodpath, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(hkey, "ProductName", "MSITEST"); - CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052c94DA02821EECD05F2F"); - CHECK_DEL_REG_DWORD(hkey, "Language", 1033); - CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001); - if (!old_installer) - CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0); - CHECK_DEL_REG_DWORD(hkey, "Assignment", 0); - CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184); - CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0); - CHECK_DEL_REG_STR(hkey, "Clients", ":"); - - res = RegOpenKeyA(hkey, "SourceList", &sourcelist); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - lstrcpyA(path, "n;1;"); - lstrcatA(path, temp); - CHECK_DEL_REG_STR(sourcelist, "LastUsedSource", path); - CHECK_DEL_REG_STR(sourcelist, "PackageName", "msitest.msi"); - - res = RegOpenKeyA(sourcelist, "Net", &net); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(net, "1", temp); - - RegDeleteKeyA(net, ""); - RegCloseKey(net); - - res = RegOpenKeyA(sourcelist, "Media", &media); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(media, "1", "DISK1;"); - - RegDeleteKeyA(media, ""); - RegCloseKey(media); - RegDeleteKeyA(sourcelist, ""); - RegCloseKey(sourcelist); - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - res = RegOpenKeyA(HKEY_CURRENT_USER, cuupgrades, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL); - - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - /* PublishProduct, machine */ - r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 ALLUSERS=1"); - if (old_installer) - goto machprod; - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, badprod, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - sprintf(keypath, prodpath, "S-1-5-18"); - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - res = RegOpenKeyA(hkey, "InstallProperties", &props); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegOpenKeyA(hkey, "Patches", &patches); - todo_wine - { - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(patches, "AllPatches", NULL); - } - - RegDeleteKeyA(patches, ""); - RegCloseKey(patches); - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - -machprod: - res = RegOpenKeyA(HKEY_CLASSES_ROOT, machprod, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(hkey, "ProductName", "MSITEST"); - CHECK_DEL_REG_STR(hkey, "PackageCode", "AC75740029052c94DA02821EECD05F2F"); - CHECK_DEL_REG_DWORD(hkey, "Language", 1033); - CHECK_DEL_REG_DWORD(hkey, "Version", 0x1010001); - if (!old_installer) - CHECK_DEL_REG_DWORD(hkey, "AuthorizedLUAApp", 0); - todo_wine CHECK_DEL_REG_DWORD(hkey, "Assignment", 1); - CHECK_DEL_REG_DWORD(hkey, "AdvertiseFlags", 0x184); - CHECK_DEL_REG_DWORD(hkey, "InstanceType", 0); - CHECK_DEL_REG_STR(hkey, "Clients", ":"); - - res = RegOpenKeyA(hkey, "SourceList", &sourcelist); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - lstrcpyA(path, "n;1;"); - lstrcatA(path, temp); - CHECK_DEL_REG_STR(sourcelist, "LastUsedSource", path); - CHECK_DEL_REG_STR(sourcelist, "PackageName", "msitest.msi"); - - res = RegOpenKeyA(sourcelist, "Net", &net); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(net, "1", temp); - - RegDeleteKeyA(net, ""); - RegCloseKey(net); - - res = RegOpenKeyA(sourcelist, "Media", &media); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(media, "1", "DISK1;"); - - RegDeleteKeyA(media, ""); - RegCloseKey(media); - RegDeleteKeyA(sourcelist, ""); - RegCloseKey(sourcelist); - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, machup, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_DEL_REG_STR(hkey, "84A88FD7F6998CE40A22FB59F6B9C2BB", NULL); - - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - DeleteFile(msifile); - DeleteFile("msitest\\maximus"); - RemoveDirectory("msitest"); - HeapFree(GetProcessHeap(), 0, usersid); -} - -static void test_publish_publishfeatures(void) -{ - UINT r; - LONG res; - HKEY hkey; - LPSTR usersid; - CHAR keypath[MAX_PATH]; - - static const CHAR cupath[] = "Software\\Microsoft\\Installer\\Features" - "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; - static const CHAR udpath[] = "Software\\Microsoft\\Windows\\CurrentVersion" - "\\Installer\\UserData\\%s\\Products" - "\\84A88FD7F6998CE40A22FB59F6B9C2BB\\Features"; - static const CHAR featkey[] = "Software\\Microsoft\\Windows\\CurrentVersion" - "\\Installer\\Features"; - static const CHAR classfeat[] = "Software\\Classes\\Installer\\Features" - "\\84A88FD7F6998CE40A22FB59F6B9C2BB"; - - if (!get_user_sid(&usersid)) - return; - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\maximus", 500); - - create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); - - /* PublishFeatures, current user */ - r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, featkey, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, classfeat, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(hkey, "feature", ""); - CHECK_REG_STR(hkey, "montecristo", ""); - - RegDeleteValueA(hkey, "feature"); - RegDeleteValueA(hkey, "montecristo"); - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - sprintf(keypath, udpath, usersid); - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE"); - CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE"); - - RegDeleteValueA(hkey, "feature"); - RegDeleteValueA(hkey, "montecristo"); - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - /* PublishFeatures, machine */ - r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1 ALLUSERS=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, featkey, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegOpenKeyA(HKEY_CURRENT_USER, cupath, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, classfeat, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(hkey, "feature", ""); - CHECK_REG_STR(hkey, "montecristo", ""); - - RegDeleteValueA(hkey, "feature"); - RegDeleteValueA(hkey, "montecristo"); - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - sprintf(keypath, udpath, "S-1-5-18"); - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(hkey, "feature", "VGtfp^p+,?82@JU1j_KE"); - CHECK_REG_STR(hkey, "montecristo", "VGtfp^p+,?82@JU1j_KE"); - - RegDeleteValueA(hkey, "feature"); - RegDeleteValueA(hkey, "montecristo"); - RegDeleteKeyA(hkey, ""); - RegCloseKey(hkey); - - DeleteFile(msifile); - DeleteFile("msitest\\maximus"); - RemoveDirectory("msitest"); - HeapFree(GetProcessHeap(), 0, usersid); -} - -static LPSTR reg_get_val_str(HKEY hkey, LPCSTR name) -{ - DWORD len = 0; - LPSTR val; - LONG r; - - r = RegQueryValueExA(hkey, name, NULL, NULL, NULL, &len); - if (r != ERROR_SUCCESS) - return NULL; - - len += sizeof (WCHAR); - val = HeapAlloc(GetProcessHeap(), 0, len); - if (!val) return NULL; - val[0] = 0; - RegQueryValueExA(hkey, name, NULL, NULL, (LPBYTE)val, &len); - return val; -} - -static void get_owner_company(LPSTR *owner, LPSTR *company) -{ - LONG res; - HKEY hkey; - - *owner = *company = NULL; - - res = RegOpenKeyA(HKEY_CURRENT_USER, - "Software\\Microsoft\\MS Setup (ACME)\\User Info", &hkey); - if (res == ERROR_SUCCESS) - { - *owner = reg_get_val_str(hkey, "DefName"); - *company = reg_get_val_str(hkey, "DefCompany"); - RegCloseKey(hkey); - } - - if (!*owner || !*company) - { - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, - "Software\\Microsoft\\Windows\\CurrentVersion", &hkey); - if (res == ERROR_SUCCESS) - { - *owner = reg_get_val_str(hkey, "RegisteredOwner"); - *company = reg_get_val_str(hkey, "RegisteredOrganization"); - RegCloseKey(hkey); - } - } - - if (!*owner || !*company) - { - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, - "Software\\Microsoft\\Windows NT\\CurrentVersion", &hkey); - if (res == ERROR_SUCCESS) - { - *owner = reg_get_val_str(hkey, "RegisteredOwner"); - *company = reg_get_val_str(hkey, "RegisteredOrganization"); - RegCloseKey(hkey); - } - } -} - -static void test_publish_registeruser(void) -{ - UINT r; - LONG res; - HKEY props; - LPSTR usersid; - LPSTR owner, company; - CHAR keypath[MAX_PATH]; - - static const CHAR keyfmt[] = - "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\" - "UserData\\%s\\Products\\84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties"; - - if (!get_user_sid(&usersid)) - return; - - get_owner_company(&owner, &company); - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\maximus", 500); - - create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); - - /* RegisterUser, per-user */ - r = MsiInstallProductA(msifile, "REGISTER_USER=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - sprintf(keypath, keyfmt, usersid); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &props); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(props, "ProductID", "none"); - CHECK_REG_STR(props, "RegCompany", company); - CHECK_REG_STR(props, "RegOwner", owner); - - RegDeleteValueA(props, "ProductID"); - RegDeleteValueA(props, "RegCompany"); - RegDeleteValueA(props, "RegOwner"); - RegDeleteKeyA(props, ""); - RegCloseKey(props); - - /* RegisterUser, machine */ - r = MsiInstallProductA(msifile, "REGISTER_USER=1 ALLUSERS=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - sprintf(keypath, keyfmt, "S-1-5-18"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &props); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(props, "ProductID", "none"); - CHECK_REG_STR(props, "RegCompany", company); - CHECK_REG_STR(props, "RegOwner", owner); - - RegDeleteValueA(props, "ProductID"); - RegDeleteValueA(props, "RegCompany"); - RegDeleteValueA(props, "RegOwner"); - RegDeleteKeyA(props, ""); - RegCloseKey(props); - - HeapFree(GetProcessHeap(), 0, company); - HeapFree(GetProcessHeap(), 0, owner); - - DeleteFile(msifile); - DeleteFile("msitest\\maximus"); - RemoveDirectory("msitest"); - LocalFree(usersid); -} - -static void test_publish_processcomponents(void) -{ - UINT r; - LONG res; - DWORD size; - HKEY comp, hkey; - LPSTR usersid; - CHAR val[MAX_PATH]; - CHAR keypath[MAX_PATH]; - CHAR program_files_maximus[MAX_PATH]; - - static const CHAR keyfmt[] = - "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\" - "UserData\\%s\\Components\\%s"; - static const CHAR compkey[] = - "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Components"; - - if (!get_user_sid(&usersid)) - return; - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\maximus", 500); - - create_database(msifile, ppc_tables, sizeof(ppc_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); - - /* ProcessComponents, per-user */ - r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - sprintf(keypath, keyfmt, usersid, "CBABC2FDCCB35E749A8944D8C1C098B5"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - size = MAX_PATH; - res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB", - NULL, NULL, (LPBYTE)val, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - lstrcpyA(program_files_maximus,PROG_FILES_DIR); - lstrcatA(program_files_maximus,"\\msitest\\maximus"); - - ok(!lstrcmpiA(val, program_files_maximus), - "Expected \"%s\", got \"%s\"\n", program_files_maximus, val); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB"); - RegDeleteKeyA(comp, ""); - RegCloseKey(comp); - - sprintf(keypath, keyfmt, usersid, "241C3DA58FECD0945B9687D408766058"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - size = MAX_PATH; - res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB", - NULL, NULL, (LPBYTE)val, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(!lstrcmpA(val, "01\\msitest\\augustus"), - "Expected \"01\\msitest\\augustus\", got \"%s\"\n", val); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB"); - RegDeleteKeyA(comp, ""); - RegCloseKey(comp); - - /* ProcessComponents, machine */ - r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1 ALLUSERS=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - sprintf(keypath, keyfmt, "S-1-5-18", "CBABC2FDCCB35E749A8944D8C1C098B5"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - size = MAX_PATH; - res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB", - NULL, NULL, (LPBYTE)val, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(!lstrcmpiA(val, program_files_maximus), - "Expected \"%s\", got \"%s\"\n", program_files_maximus, val); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB"); - RegDeleteKeyA(comp, ""); - RegCloseKey(comp); - - sprintf(keypath, keyfmt, "S-1-5-18", "241C3DA58FECD0945B9687D408766058"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &comp); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - size = MAX_PATH; - res = RegQueryValueExA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB", - NULL, NULL, (LPBYTE)val, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(!lstrcmpA(val, "01\\msitest\\augustus"), - "Expected \"01\\msitest\\augustus\", got \"%s\"\n", val); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, compkey, &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - RegDeleteValueA(comp, "84A88FD7F6998CE40A22FB59F6B9C2BB"); - RegDeleteKeyA(comp, ""); - RegCloseKey(comp); - - DeleteFile(msifile); - DeleteFile("msitest\\maximus"); - RemoveDirectory("msitest"); - LocalFree(usersid); -} - -static void test_publish(void) -{ - UINT r; - LONG res; - HKEY uninstall, prodkey; - INSTALLSTATE state; - CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"; - char date[MAX_PATH]; - char temp[MAX_PATH]; - - static const CHAR subkey[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"; - - if (!pMsiQueryComponentStateA) - { - win_skip("MsiQueryComponentStateA is not available\n"); - return; - } - - get_date_str(date); - GetTempPath(MAX_PATH, temp); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, subkey, &uninstall); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\maximus", 500); - - create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - /* nothing published */ - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - /* PublishProduct and RegisterProduct */ - r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1 PUBLISH_PRODUCT=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); - CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); - CHECK_REG_STR(prodkey, "InstallDate", date); - CHECK_REG_STR(prodkey, "InstallSource", temp); - CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "Publisher", "Wine"); - CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); - CHECK_REG_STR(prodkey, "Comments", NULL); - CHECK_REG_STR(prodkey, "Contact", NULL); - CHECK_REG_STR(prodkey, "HelpLink", NULL); - CHECK_REG_STR(prodkey, "HelpTelephone", NULL); - CHECK_REG_STR(prodkey, "InstallLocation", NULL); - CHECK_REG_STR(prodkey, "Readme", NULL); - CHECK_REG_STR(prodkey, "Size", NULL); - CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); - CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); - CHECK_REG_DWORD(prodkey, "Language", 1033); - CHECK_REG_DWORD(prodkey, "Version", 0x1010001); - CHECK_REG_DWORD(prodkey, "VersionMajor", 1); - CHECK_REG_DWORD(prodkey, "VersionMinor", 1); - CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); - todo_wine - { - CHECK_REG_DWORD2(prodkey, "EstimatedSize", 12, -12); - } - - RegCloseKey(prodkey); - - r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(pf_exists("msitest\\maximus"), "File deleted\n"); - ok(pf_exists("msitest"), "File deleted\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - /* complete install */ - r = MsiInstallProductA(msifile, "FULL=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); - CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); - CHECK_REG_STR(prodkey, "InstallDate", date); - CHECK_REG_STR(prodkey, "InstallSource", temp); - CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "Publisher", "Wine"); - CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); - CHECK_REG_STR(prodkey, "Comments", NULL); - CHECK_REG_STR(prodkey, "Contact", NULL); - CHECK_REG_STR(prodkey, "HelpLink", NULL); - CHECK_REG_STR(prodkey, "HelpTelephone", NULL); - CHECK_REG_STR(prodkey, "InstallLocation", NULL); - CHECK_REG_STR(prodkey, "Readme", NULL); - CHECK_REG_STR(prodkey, "Size", NULL); - CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); - CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); - CHECK_REG_DWORD(prodkey, "Language", 1033); - CHECK_REG_DWORD(prodkey, "Version", 0x1010001); - CHECK_REG_DWORD(prodkey, "VersionMajor", 1); - CHECK_REG_DWORD(prodkey, "VersionMinor", 1); - CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); - todo_wine - { - CHECK_REG_DWORD2(prodkey, "EstimatedSize", 12, -12); - } - - RegCloseKey(prodkey); - - /* no UnpublishFeatures */ - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); - ok(!pf_exists("msitest"), "Directory not deleted\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - /* complete install */ - r = MsiInstallProductA(msifile, "FULL=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); - CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); - CHECK_REG_STR(prodkey, "InstallDate", date); - CHECK_REG_STR(prodkey, "InstallSource", temp); - CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "Publisher", "Wine"); - CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); - CHECK_REG_STR(prodkey, "Comments", NULL); - CHECK_REG_STR(prodkey, "Contact", NULL); - CHECK_REG_STR(prodkey, "HelpLink", NULL); - CHECK_REG_STR(prodkey, "HelpTelephone", NULL); - CHECK_REG_STR(prodkey, "InstallLocation", NULL); - CHECK_REG_STR(prodkey, "Readme", NULL); - CHECK_REG_STR(prodkey, "Size", NULL); - CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); - CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); - CHECK_REG_DWORD(prodkey, "Language", 1033); - CHECK_REG_DWORD(prodkey, "Version", 0x1010001); - CHECK_REG_DWORD(prodkey, "VersionMajor", 1); - CHECK_REG_DWORD(prodkey, "VersionMinor", 1); - CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); - todo_wine - { - CHECK_REG_DWORD2(prodkey, "EstimatedSize", 12, -12); - } - - RegCloseKey(prodkey); - - /* UnpublishFeatures, only feature removed. Only works when entire product is removed */ - r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine ok(pf_exists("msitest\\maximus"), "File deleted\n"); - todo_wine ok(pf_exists("msitest"), "Directory deleted\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); - CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); - CHECK_REG_STR(prodkey, "InstallDate", date); - CHECK_REG_STR(prodkey, "InstallSource", temp); - CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "Publisher", "Wine"); - CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); - CHECK_REG_STR(prodkey, "Comments", NULL); - CHECK_REG_STR(prodkey, "Contact", NULL); - CHECK_REG_STR(prodkey, "HelpLink", NULL); - CHECK_REG_STR(prodkey, "HelpTelephone", NULL); - CHECK_REG_STR(prodkey, "InstallLocation", NULL); - CHECK_REG_STR(prodkey, "Readme", NULL); - CHECK_REG_STR(prodkey, "Size", NULL); - CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); - CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); - CHECK_REG_DWORD(prodkey, "Language", 1033); - CHECK_REG_DWORD(prodkey, "Version", 0x1010001); - CHECK_REG_DWORD(prodkey, "VersionMajor", 1); - CHECK_REG_DWORD(prodkey, "VersionMinor", 1); - CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); - todo_wine - { - CHECK_REG_DWORD2(prodkey, "EstimatedSize", 12, -12); - } - - RegCloseKey(prodkey); - - /* complete install */ - r = MsiInstallProductA(msifile, "FULL=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); - CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); - CHECK_REG_STR(prodkey, "InstallDate", date); - CHECK_REG_STR(prodkey, "InstallSource", temp); - CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "Publisher", "Wine"); - CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); - CHECK_REG_STR(prodkey, "Comments", NULL); - CHECK_REG_STR(prodkey, "Contact", NULL); - CHECK_REG_STR(prodkey, "HelpLink", NULL); - CHECK_REG_STR(prodkey, "HelpTelephone", NULL); - CHECK_REG_STR(prodkey, "InstallLocation", NULL); - CHECK_REG_STR(prodkey, "Readme", NULL); - CHECK_REG_STR(prodkey, "Size", NULL); - CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); - CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); - CHECK_REG_DWORD(prodkey, "Language", 1033); - CHECK_REG_DWORD(prodkey, "Version", 0x1010001); - CHECK_REG_DWORD(prodkey, "VersionMajor", 1); - CHECK_REG_DWORD(prodkey, "VersionMinor", 1); - CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); - todo_wine - { - CHECK_REG_DWORD2(prodkey, "EstimatedSize", 12, -20); - } - - RegCloseKey(prodkey); - - /* UnpublishFeatures, both features removed */ - r = MsiInstallProductA(msifile, "UNPUBLISH_FEATURES=1 REMOVE=feature,montecristo"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); - ok(!pf_exists("msitest"), "Directory not deleted\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - /* complete install */ - r = MsiInstallProductA(msifile, "FULL=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - CHECK_REG_STR(prodkey, "DisplayName", "MSITEST"); - CHECK_REG_STR(prodkey, "DisplayVersion", "1.1.1"); - CHECK_REG_STR(prodkey, "InstallDate", date); - CHECK_REG_STR(prodkey, "InstallSource", temp); - CHECK_REG_ISTR(prodkey, "ModifyPath", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "Publisher", "Wine"); - CHECK_REG_STR(prodkey, "UninstallString", "MsiExec.exe /I{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - CHECK_REG_STR(prodkey, "AuthorizedCDFPrefix", NULL); - CHECK_REG_STR(prodkey, "Comments", NULL); - CHECK_REG_STR(prodkey, "Contact", NULL); - CHECK_REG_STR(prodkey, "HelpLink", NULL); - CHECK_REG_STR(prodkey, "HelpTelephone", NULL); - CHECK_REG_STR(prodkey, "InstallLocation", NULL); - CHECK_REG_STR(prodkey, "Readme", NULL); - CHECK_REG_STR(prodkey, "Size", NULL); - CHECK_REG_STR(prodkey, "URLInfoAbout", NULL); - CHECK_REG_STR(prodkey, "URLUpdateInfo", NULL); - CHECK_REG_DWORD(prodkey, "Language", 1033); - CHECK_REG_DWORD(prodkey, "Version", 0x1010001); - CHECK_REG_DWORD(prodkey, "VersionMajor", 1); - CHECK_REG_DWORD(prodkey, "VersionMinor", 1); - CHECK_REG_DWORD(prodkey, "WindowsInstaller", 1); - todo_wine - { - CHECK_REG_DWORD2(prodkey, "EstimatedSize", 12, -12); - } - - RegCloseKey(prodkey); - - /* complete uninstall */ - r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); - ok(!pf_exists("msitest"), "Directory not deleted\n"); - - state = MsiQueryProductState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "feature"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - state = MsiQueryFeatureState("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", "montecristo"); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - "{DF2CBABC-3BCC-47E5-A998-448D1C0C895B}", &state); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - - res = RegOpenKeyA(uninstall, prodcode, &prodkey); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - /* make sure 'Program Files\msitest' is removed */ - delete_pfmsitest_files(); - - RegCloseKey(uninstall); - DeleteFile(msifile); - DeleteFile("msitest\\maximus"); - RemoveDirectory("msitest"); -} - -static void test_publishsourcelist(void) -{ - UINT r; - DWORD size; - CHAR value[MAX_PATH]; - CHAR path[MAX_PATH]; - CHAR prodcode[] = "{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}"; - - if (!pMsiSourceListEnumSourcesA || !pMsiSourceListGetInfoA) - { - win_skip("MsiSourceListEnumSourcesA and/or MsiSourceListGetInfoA are not available\n"); - return; - } - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\maximus", 500); - - create_database(msifile, pp_tables, sizeof(pp_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - /* nothing published */ - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); - ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); - ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); - - r = MsiInstallProductA(msifile, "REGISTER_PRODUCT=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - /* after RegisterProduct */ - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); - ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); - ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); - - r = MsiInstallProductA(msifile, "PROCESS_COMPONENTS=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - /* after ProcessComponents */ - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); - ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); - ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); - - r = MsiInstallProductA(msifile, "PUBLISH_FEATURES=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - /* after PublishFeatures */ - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); - ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); - ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); - ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); - ok(!lstrcmpA(value, "aaa"), "Expected \"aaa\", got \"%s\"\n", value); - - r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(pf_exists("msitest\\maximus"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - /* after PublishProduct */ - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, value, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(value, "msitest.msi"), "Expected 'msitest.msi', got %s\n", value); - ok(size == 11, "Expected 11, got %d\n", size); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_MEDIAPACKAGEPATH, value, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value); - ok(size == 0, "Expected 0, got %d\n", size); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_DISKPROMPT, value, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(value, ""), "Expected \"\", got \"%s\"\n", value); - ok(size == 0, "Expected 0, got %d\n", size); - - lstrcpyA(path, CURR_DIR); - lstrcatA(path, "\\"); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCE, value, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value); - ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListGetInfoA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDTYPE, value, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(value, "n"), "Expected \"n\", got \"%s\"\n", value); - ok(size == 1, "Expected 1, got %d\n", size); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT | MSISOURCETYPE_URL, 0, value, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); - ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); - ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 0, value, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(value, path), "Expected \"%s\", got \"%s\"\n", path, value); - ok(size == lstrlenA(path), "Expected %d, got %d\n", lstrlenA(path), size); - - size = MAX_PATH; - lstrcpyA(value, "aaa"); - r = pMsiSourceListEnumSourcesA(prodcode, NULL, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT | MSISOURCETYPE_NETWORK, 1, value, &size); - ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); - ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); - ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); - - /* complete uninstall */ - r = MsiInstallProductA(msifile, "FULL=1 REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!pf_exists("msitest\\maximus"), "File not deleted\n"); - ok(!pf_exists("msitest"), "Directory not deleted\n"); - - /* make sure 'Program Files\msitest' is removed */ - delete_pfmsitest_files(); - - DeleteFile(msifile); - DeleteFile("msitest\\maximus"); - RemoveDirectory("msitest"); -} - static UINT run_query(MSIHANDLE hdb, MSIHANDLE hrec, const char *query) { MSIHANDLE hview = 0; @@ -6236,10 +3768,8 @@ static void generate_transform(void) r = MsiDatabaseGenerateTransform(hdb1, hdb2, mstfile, 0, 0); ok(r == ERROR_SUCCESS, "return code %d, should be ERROR_SUCCESS\n", r); -#if 0 /* not implemented in wine yet */ r = MsiCreateTransformSummaryInfo(hdb2, hdb2, mstfile, 0, 0); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); -#endif + todo_wine ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); MsiCloseHandle(hdb1); MsiCloseHandle(hdb2); @@ -6327,6 +3857,12 @@ static void test_transformprop(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\augustus", 500); @@ -6335,9 +3871,14 @@ static void test_transformprop(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); - ok(!delete_pf("msitest", FALSE), "File installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory created\n"); if (0) generate_transform(); @@ -6347,8 +3888,9 @@ static void test_transformprop(void) r = MsiInstallProductA(msifile, "TRANSFORMS=winetest.mst"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); +error: /* Delete the files in the temp (current) folder */ DeleteFile(msifile); DeleteFile(msifile2); @@ -6363,6 +3905,12 @@ static void test_currentworkingdir(void) CHAR drive[MAX_PATH], path[MAX_PATH]; LPSTR ptr; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\augustus", 500); @@ -6379,14 +3927,19 @@ static void test_currentworkingdir(void) { ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r); ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); - ok(!delete_pf("msitest", FALSE), "File installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory created\n"); } sprintf(path, "%s\\%s", CURR_DIR, msifile); r = MsiInstallProductA(path, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); lstrcpyA(drive, CURR_DIR); drive[2] = '\\'; @@ -6403,10 +3956,10 @@ static void test_currentworkingdir(void) r = MsiInstallProductA(ptr, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); +error: SetCurrentDirectoryA(CURR_DIR); - DeleteFile(msifile); DeleteFile("msitest\\augustus"); RemoveDirectory("msitest"); @@ -6452,22 +4005,28 @@ static void test_admin(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); - ok(!delete_pf("msitest", FALSE), "File installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory created\n"); ok(!DeleteFile("c:\\msitest\\augustus"), "File installed\n"); ok(!RemoveDirectory("c:\\msitest"), "File installed\n"); r = MsiInstallProductA(msifile, "ACTION=ADMIN"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); - ok(!delete_pf("msitest", FALSE), "File installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory created\n"); todo_wine { ok(DeleteFile("c:\\msitest\\augustus"), "File not installed\n"); ok(RemoveDirectory("c:\\msitest"), "File not installed\n"); } +error: DeleteFile(msifile); DeleteFile("msitest\\augustus"); RemoveDirectory("msitest"); @@ -6508,6 +4067,12 @@ static void test_adminprops(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\augustus", 500); @@ -6518,10 +4083,16 @@ static void test_adminprops(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File installed\n"); + ok(delete_pf("msitest", FALSE), "Directory created\n"); +error: DeleteFile(msifile); DeleteFile("msitest\\augustus"); RemoveDirectory("msitest"); @@ -6543,271 +4114,50 @@ static void create_pf_data(LPCSTR file, LPCSTR data, BOOL is_file) #define create_pf(file, is_file) create_pf_data(file, file, is_file) -static void test_removefiles(void) -{ - UINT r; - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\hydrogen", 500); - create_file("msitest\\helium", 500); - create_file("msitest\\lithium", 500); - - create_database(msifile, rem_tables, sizeof(rem_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(pf_exists("msitest\\hydrogen"), "File not installed\n"); - ok(!pf_exists("msitest\\helium"), "File installed\n"); - ok(pf_exists("msitest\\lithium"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n"); - ok(!pf_exists("msitest\\helium"), "File not deleted\n"); - ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n"); - ok(delete_pf("msitest", FALSE), "File deleted\n"); - - create_pf("msitest", FALSE); - create_pf("msitest\\hydrogen", TRUE); - create_pf("msitest\\helium", TRUE); - create_pf("msitest\\lithium", TRUE); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(pf_exists("msitest\\hydrogen"), "File not installed\n"); - ok(pf_exists("msitest\\helium"), "File not installed\n"); - ok(pf_exists("msitest\\lithium"), "File not installed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(!pf_exists("msitest\\hydrogen"), "File not deleted\n"); - ok(delete_pf("msitest\\helium", TRUE), "File deleted\n"); - ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n"); - ok(delete_pf("msitest", FALSE), "File deleted\n"); - - create_pf("msitest", FALSE); - create_pf("msitest\\furlong", TRUE); - create_pf("msitest\\firkin", TRUE); - create_pf("msitest\\fortnight", TRUE); - create_pf("msitest\\becquerel", TRUE); - create_pf("msitest\\dioptre", TRUE); - create_pf("msitest\\attoparsec", TRUE); - create_pf("msitest\\storeys", TRUE); - create_pf("msitest\\block", TRUE); - create_pf("msitest\\siriometer", TRUE); - create_pf("msitest\\cabout", FALSE); - create_pf("msitest\\cabout\\blocker", TRUE); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(pf_exists("msitest\\hydrogen"), "File not installed\n"); - ok(!pf_exists("msitest\\helium"), "File installed\n"); - ok(pf_exists("msitest\\lithium"), "File not installed\n"); - ok(!pf_exists("msitest\\furlong"), "File not deleted\n"); - ok(!pf_exists("msitest\\firkin"), "File not deleted\n"); - ok(!pf_exists("msitest\\fortnight"), "File not deleted\n"); - ok(pf_exists("msitest\\becquerel"), "File not installed\n"); - ok(pf_exists("msitest\\dioptre"), "File not installed\n"); - ok(pf_exists("msitest\\attoparsec"), "File not installed\n"); - ok(!pf_exists("msitest\\storeys"), "File not deleted\n"); - ok(!pf_exists("msitest\\block"), "File not deleted\n"); - ok(!pf_exists("msitest\\siriometer"), "File not deleted\n"); - ok(pf_exists("msitest\\cabout"), "Directory removed\n"); - ok(pf_exists("msitest"), "File not installed\n"); - - create_pf("msitest\\furlong", TRUE); - create_pf("msitest\\firkin", TRUE); - create_pf("msitest\\fortnight", TRUE); - create_pf("msitest\\storeys", TRUE); - create_pf("msitest\\block", TRUE); - create_pf("msitest\\siriometer", TRUE); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(!delete_pf("msitest\\hydrogen", TRUE), "File not deleted\n"); - ok(!delete_pf("msitest\\helium", TRUE), "File not deleted\n"); - ok(delete_pf("msitest\\lithium", TRUE), "File deleted\n"); - ok(delete_pf("msitest\\furlong", TRUE), "File deleted\n"); - ok(delete_pf("msitest\\firkin", TRUE), "File deleted\n"); - ok(delete_pf("msitest\\fortnight", TRUE), "File deleted\n"); - ok(!delete_pf("msitest\\becquerel", TRUE), "File not deleted\n"); - ok(!delete_pf("msitest\\dioptre", TRUE), "File not deleted\n"); - ok(delete_pf("msitest\\attoparsec", TRUE), "File deleted\n"); - ok(!delete_pf("msitest\\storeys", TRUE), "File not deleted\n"); - ok(!delete_pf("msitest\\block", TRUE), "File not deleted\n"); - ok(delete_pf("msitest\\siriometer", TRUE), "File deleted\n"); - ok(pf_exists("msitest\\cabout"), "Directory deleted\n"); - ok(pf_exists("msitest"), "Directory deleted\n"); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(delete_pf("msitest\\hydrogen", TRUE), "File not installed\n"); - ok(!delete_pf("msitest\\helium", TRUE), "File installed\n"); - ok(delete_pf("msitest\\lithium", TRUE), "File not installed\n"); - ok(pf_exists("msitest\\cabout"), "Directory deleted\n"); - ok(pf_exists("msitest"), "Directory deleted\n"); - - delete_pf("msitest\\cabout\\blocker", TRUE); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(!delete_pf("msitest\\cabout", FALSE), "Directory not deleted\n"); - ok(delete_pf("msitest", FALSE), "Directory deleted\n"); - - DeleteFile(msifile); - DeleteFile("msitest\\hydrogen"); - DeleteFile("msitest\\helium"); - DeleteFile("msitest\\lithium"); - RemoveDirectory("msitest"); -} - -static void test_movefiles(void) -{ - UINT r; - char props[MAX_PATH]; - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\augustus", 100); - create_file("cameroon", 100); - create_file("djibouti", 100); - create_file("egypt", 100); - create_file("finland", 100); - create_file("gambai", 100); - create_file("honduras", 100); - create_file("msitest\\india", 100); - create_file("japan", 100); - create_file("kenya", 100); - CreateDirectoryA("latvia", NULL); - create_file("nauru", 100); - create_file("peru", 100); - create_file("apple", 100); - create_file("application", 100); - create_file("ape", 100); - create_file("foo", 100); - create_file("fao", 100); - create_file("fbod", 100); - create_file("budding", 100); - create_file("buddy", 100); - create_file("bud", 100); - create_file("bar", 100); - create_file("bur", 100); - create_file("bird", 100); - - create_database(msifile, mov_tables, sizeof(mov_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); - - /* if the source or dest property is not a full path, - * windows tries to access it as a network resource - */ - - sprintf(props, "SOURCEFULL=\"%s\\\" DESTFULL=\"%s\\msitest\" " - "FILEPATHBAD=\"%s\\japan\" FILEPATHGOOD=\"%s\\kenya\"", - CURR_DIR, PROG_FILES_DIR, CURR_DIR, CURR_DIR); - - r = MsiInstallProductA(msifile, props); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); - ok(!delete_pf("msitest\\dest", TRUE), "File copied\n"); - ok(delete_pf("msitest\\canada", TRUE), "File not copied\n"); - ok(delete_pf("msitest\\dominica", TRUE), "File not moved\n"); - ok(!delete_pf("msitest\\elsalvador", TRUE), "File moved\n"); - ok(!delete_pf("msitest\\france", TRUE), "File moved\n"); - ok(!delete_pf("msitest\\georgia", TRUE), "File moved\n"); - ok(delete_pf("msitest\\hungary", TRUE), "File not moved\n"); - ok(!delete_pf("msitest\\indonesia", TRUE), "File moved\n"); - ok(!delete_pf("msitest\\jordan", TRUE), "File moved\n"); - ok(delete_pf("msitest\\kiribati", TRUE), "File not moved\n"); - ok(!delete_pf("msitest\\lebanon", TRUE), "File moved\n"); - ok(!delete_pf("msitest\\lebanon", FALSE), "Directory moved\n"); - ok(delete_pf("msitest\\poland", TRUE), "File not moved\n"); - /* either apple or application will be moved depending on directory order */ - if (!delete_pf("msitest\\apple", TRUE)) - ok(delete_pf("msitest\\application", TRUE), "File not moved\n"); - else - ok(!delete_pf("msitest\\application", TRUE), "File should not exist\n"); - ok(delete_pf("msitest\\wildcard", TRUE), "File not moved\n"); - ok(!delete_pf("msitest\\ape", TRUE), "File moved\n"); - /* either fao or foo will be moved depending on directory order */ - if (delete_pf("msitest\\foo", TRUE)) - ok(!delete_pf("msitest\\fao", TRUE), "File should not exist\n"); - else - ok(delete_pf("msitest\\fao", TRUE), "File not moved\n"); - ok(delete_pf("msitest\\single", TRUE), "File not moved\n"); - ok(!delete_pf("msitest\\fbod", TRUE), "File moved\n"); - ok(delete_pf("msitest\\budding", TRUE), "File not moved\n"); - ok(delete_pf("msitest\\buddy", TRUE), "File not moved\n"); - ok(!delete_pf("msitest\\bud", TRUE), "File moved\n"); - ok(delete_pf("msitest\\bar", TRUE), "File not moved\n"); - ok(delete_pf("msitest\\bur", TRUE), "File not moved\n"); - ok(!delete_pf("msitest\\bird", TRUE), "File moved\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - ok(DeleteFileA("cameroon"), "File moved\n"); - ok(!DeleteFileA("djibouti"), "File not moved\n"); - ok(DeleteFileA("egypt"), "File moved\n"); - ok(DeleteFileA("finland"), "File moved\n"); - ok(DeleteFileA("gambai"), "File moved\n"); - ok(!DeleteFileA("honduras"), "File not moved\n"); - ok(DeleteFileA("msitest\\india"), "File moved\n"); - ok(DeleteFileA("japan"), "File moved\n"); - ok(!DeleteFileA("kenya"), "File not moved\n"); - ok(RemoveDirectoryA("latvia"), "Directory moved\n"); - ok(!DeleteFileA("nauru"), "File not moved\n"); - ok(!DeleteFileA("peru"), "File not moved\n"); - ok(!DeleteFileA("apple"), "File not moved\n"); - ok(!DeleteFileA("application"), "File not moved\n"); - ok(DeleteFileA("ape"), "File moved\n"); - ok(!DeleteFileA("foo"), "File not moved\n"); - ok(!DeleteFileA("fao"), "File not moved\n"); - ok(DeleteFileA("fbod"), "File moved\n"); - ok(!DeleteFileA("budding"), "File not moved\n"); - ok(!DeleteFileA("buddy"), "File not moved\n"); - ok(DeleteFileA("bud"), "File moved\n"); - ok(!DeleteFileA("bar"), "File not moved\n"); - ok(!DeleteFileA("bur"), "File not moved\n"); - ok(DeleteFileA("bird"), "File moved\n"); - - DeleteFile("msitest\\augustus"); - RemoveDirectory("msitest"); - DeleteFile(msifile); -} - static void test_missingcab(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\augustus", 500); create_file("maximus", 500); + create_file("tiberius", 500); create_database(msifile, mc_tables, sizeof(mc_tables) / sizeof(msi_table)); MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); create_cab_file("test1.cab", MEDIA_SIZE, "maximus\0"); + create_cab_file("test4.cab", MEDIA_SIZE, "tiberius\0"); create_pf("msitest", FALSE); create_pf_data("msitest\\caesar", "abcdefgh", TRUE); + create_pf_data("msitest\\tiberius", "abcdefgh", TRUE); r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS || - broken(r == ERROR_INSTALL_FAILURE), /* win9x */ - "Expected ERROR_SUCCESS, got %u\n", r); - if (r == ERROR_SUCCESS) + if (r == ERROR_INSTALL_PACKAGE_REJECTED) { - ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); + skip("Not enough rights to perform tests\n"); + goto error; } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); ok(delete_pf("msitest\\caesar", TRUE), "File not installed\n"); + ok(compare_pf_data("msitest\\tiberius", "abcdefgh", sizeof("abcdefgh")), "Wrong file contents\n"); + ok(delete_pf("msitest\\tiberius", TRUE), "File not installed\n"); ok(!delete_pf("msitest\\gaius", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); create_pf("msitest", FALSE); create_pf_data("msitest\\caesar", "abcdefgh", TRUE); + create_pf_data("msitest\\tiberius", "abcdefgh", TRUE); create_pf("msitest\\gaius", TRUE); r = MsiInstallProductA(msifile, "GAIUS=1"); @@ -6818,87 +4168,32 @@ static void test_missingcab(void) ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); } ok(delete_pf("msitest\\caesar", TRUE), "File removed\n"); + ok(compare_pf_data("msitest\\tiberius", "abcdefgh", sizeof("abcdefgh")), "Wrong file contents\n"); + ok(delete_pf("msitest\\tiberius", TRUE), "File removed\n"); ok(delete_pf("msitest\\gaius", TRUE), "File removed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); +error: + delete_pf("msitest", FALSE); DeleteFile("msitest\\augustus"); RemoveDirectory("msitest"); DeleteFile("maximus"); + DeleteFile("tiberius"); DeleteFile("test1.cab"); + DeleteFile("test4.cab"); DeleteFile(msifile); } -static void test_duplicatefiles(void) -{ - UINT r; - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\maximus", 500); - create_database(msifile, df_tables, sizeof(df_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - /* fails if the destination folder is not a valid property */ - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(delete_pf("msitest\\maximus", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\augustus", TRUE), "File not duplicated\n"); - ok(delete_pf("msitest\\this\\doesnot\\exist\\maximus", TRUE), "File not duplicated\n"); - ok(delete_pf("msitest\\this\\doesnot\\exist", FALSE), "File not duplicated\n"); - ok(delete_pf("msitest\\this\\doesnot", FALSE), "File not duplicated\n"); - ok(delete_pf("msitest\\this", FALSE), "File not duplicated\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - DeleteFile("msitest\\maximus"); - RemoveDirectory("msitest"); - DeleteFile(msifile); -} - -static void test_writeregistryvalues(void) -{ - UINT r; - LONG res; - HKEY hkey; - DWORD type, size; - CHAR path[MAX_PATH]; - - CreateDirectoryA("msitest", NULL); - create_file("msitest\\augustus", 500); - - create_database(msifile, wrv_tables, sizeof(wrv_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File installed\n"); - - res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - size = MAX_PATH; - type = REG_MULTI_SZ; - memset(path, 'a', MAX_PATH); - res = RegQueryValueExA(hkey, "Value", NULL, &type, (LPBYTE)path, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(!memcmp(path, "one\0two\0three\0\0", size), "Wrong multi-sz data\n"); - ok(size == 15, "Expected 15, got %d\n", size); - ok(type == REG_MULTI_SZ, "Expected REG_MULTI_SZ, got %d\n", type); - - DeleteFile(msifile); - DeleteFile("msitest\\augustus"); - RemoveDirectory("msitest"); - - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine"); -} - static void test_sourcefolder(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("augustus", 500); @@ -6907,14 +4202,18 @@ static void test_sourcefolder(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); todo_wine { - ok(!delete_pf("msitest", FALSE), "File installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory created\n"); } - RemoveDirectoryA("msitest"); r = MsiInstallProductA(msifile, NULL); @@ -6923,9 +4222,10 @@ static void test_sourcefolder(void) ok(!delete_pf("msitest\\augustus", TRUE), "File installed\n"); todo_wine { - ok(!delete_pf("msitest", FALSE), "File installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory created\n"); } +error: DeleteFile(msifile); DeleteFile("augustus"); } @@ -6934,6 +4234,12 @@ static void test_customaction51(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\augustus", 500); @@ -6942,10 +4248,16 @@ static void test_customaction51(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File installed\n"); + ok(delete_pf("msitest", FALSE), "Directory created\n"); +error: DeleteFile(msifile); DeleteFile("msitest\\augustus"); RemoveDirectory("msitest"); @@ -6955,6 +4267,12 @@ static void test_installstate(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\alpha", 500); create_file("msitest\\beta", 500); @@ -6974,6 +4292,11 @@ static void test_installstate(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\alpha", TRUE), "File not installed\n"); ok(!delete_pf("msitest\\beta", TRUE), "File installed\n"); @@ -6987,7 +4310,7 @@ static void test_installstate(void) ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n"); ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n"); ok(!delete_pf("msitest\\mu", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); r = MsiInstallProductA(msifile, "ADDLOCAL=\"one,two,three,four\""); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -7003,7 +4326,7 @@ static void test_installstate(void) ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n"); ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n"); ok(!delete_pf("msitest\\mu", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); r = MsiInstallProductA(msifile, "ADDSOURCE=\"one,two,three,four\""); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -7019,7 +4342,7 @@ static void test_installstate(void) ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n"); ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n"); ok(!delete_pf("msitest\\mu", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); r = MsiInstallProductA(msifile, "REMOVE=\"one,two,three,four\""); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -7035,8 +4358,9 @@ static void test_installstate(void) ok(!delete_pf("msitest\\kappa", TRUE), "File installed\n"); ok(!delete_pf("msitest\\lambda", TRUE), "File installed\n"); ok(!delete_pf("msitest\\mu", TRUE), "File installed\n"); - ok(!delete_pf("msitest", FALSE), "File installed\n"); + ok(!delete_pf("msitest", FALSE), "Directory created\n"); +error: DeleteFile(msifile); DeleteFile("msitest\\alpha"); DeleteFile("msitest\\beta"); @@ -7053,7 +4377,7 @@ static void test_installstate(void) RemoveDirectory("msitest"); } -struct sourcepathmap +static const struct sourcepathmap { BOOL sost; /* shortone\shorttwo */ BOOL solt; /* shortone\longtwo */ @@ -7402,12 +4726,12 @@ static void test_sourcepath(void) if (r == ERROR_SUCCESS) { ok(delete_pf("msitest\\augustus", TRUE), "%d: File not installed\n", i); - ok(delete_pf("msitest", FALSE), "%d: File not installed\n", i); + ok(delete_pf("msitest", FALSE), "%d: Directory not created\n", i); } else { ok(!delete_pf("msitest\\augustus", TRUE), "%d: File installed\n", i); - todo_wine ok(!delete_pf("msitest", FALSE), "%d: File installed\n", i); + todo_wine ok(!delete_pf("msitest", FALSE), "%d: Directory installed\n", i); } DeleteFileA("shortone\\shorttwo\\augustus"); @@ -7431,12 +4755,12 @@ static void test_MsiConfigureProductEx(void) LONG res; DWORD type, size; HKEY props, source; - CHAR keypath[MAX_PATH * 2]; - CHAR localpack[MAX_PATH]; + CHAR keypath[MAX_PATH * 2], localpackage[MAX_PATH], packagename[MAX_PATH]; + REGSAM access = KEY_ALL_ACCESS; - if (on_win9x) + if (is_process_limited()) { - win_skip("Different registry keys on Win9x and WinMe\n"); + skip("process is limited\n"); return; } @@ -7447,6 +4771,9 @@ static void test_MsiConfigureProductEx(void) create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table)); + if (is_wow64) + access |= KEY_WOW64_64KEY; + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); /* NULL szProduct */ @@ -7497,6 +4824,11 @@ static void test_MsiConfigureProductEx(void) /* install the product, per-user unmanaged */ r = MsiInstallProductA(msifile, "INSTALLLEVEL=10 PROPVAR=42"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(pf_exists("msitest\\hydrogen"), "File not installed\n"); ok(pf_exists("msitest\\helium"), "File not installed\n"); @@ -7555,7 +4887,7 @@ static void test_MsiConfigureProductEx(void) DeleteFileA(msifile); - /* local msifile is removed */ + /* msifile is removed */ r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT, "PROPVAR=42"); @@ -7581,7 +4913,13 @@ static void test_MsiConfigureProductEx(void) lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, "84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties"); - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &props); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &props); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + type = REG_SZ; + size = MAX_PATH; + res = RegQueryValueExA(props, "LocalPackage", NULL, &type, + (LPBYTE)localpackage, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ, @@ -7602,7 +4940,7 @@ static void test_MsiConfigureProductEx(void) RegCloseKey(props); create_database(msifile, mcp_tables, sizeof(mcp_tables) / sizeof(msi_table)); - /* LastUsedSource (local msi package) can be used as a last resort */ + /* LastUsedSource can be used as a last resort */ r = MsiConfigureProductExA("{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}", INSTALLLEVEL_DEFAULT, INSTALLSTATE_ABSENT, "PROPVAR=42"); @@ -7611,6 +4949,7 @@ static void test_MsiConfigureProductEx(void) ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n"); ok(!delete_pf("msitest", FALSE), "Directory not removed\n"); + DeleteFileA( localpackage ); /* install the product, machine */ r = MsiInstallProductA(msifile, "ALLUSERS=1 INSTALLLEVEL=10 PROPVAR=42"); @@ -7624,7 +4963,13 @@ static void test_MsiConfigureProductEx(void) lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, "84A88FD7F6998CE40A22FB59F6B9C2BB\\InstallProperties"); - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &props); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &props); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + type = REG_SZ; + size = MAX_PATH; + res = RegQueryValueExA(props, "LocalPackage", NULL, &type, + (LPBYTE)localpackage, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ, @@ -7634,13 +4979,13 @@ static void test_MsiConfigureProductEx(void) lstrcpyA(keypath, "SOFTWARE\\Classes\\Installer\\Products\\"); lstrcatA(keypath, "84A88FD7F6998CE40A22FB59F6B9C2BB\\SourceList"); - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &source); + res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, access, &source); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); type = REG_SZ; size = MAX_PATH; res = RegQueryValueExA(source, "PackageName", NULL, &type, - (LPBYTE)localpack, &size); + (LPBYTE)packagename, &size); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = RegSetValueExA(source, "PackageName", 0, REG_SZ, @@ -7658,9 +5003,14 @@ static void test_MsiConfigureProductEx(void) ok(pf_exists("msitest\\lithium"), "File not installed\n"); ok(pf_exists("msitest"), "File not installed\n"); - /* restore the SourceList */ + /* restore PackageName */ res = RegSetValueExA(source, "PackageName", 0, REG_SZ, - (const BYTE *)localpack, lstrlenA(localpack) + 1); + (const BYTE *)packagename, lstrlenA(packagename) + 1); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + + /* restore LocalPackage */ + res = RegSetValueExA(props, "LocalPackage", 0, REG_SZ, + (const BYTE *)localpackage, lstrlenA(localpackage) + 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* finally remove the product */ @@ -7671,21 +5021,29 @@ static void test_MsiConfigureProductEx(void) ok(!delete_pf("msitest\\hydrogen", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\helium", TRUE), "File not removed\n"); ok(!delete_pf("msitest\\lithium", TRUE), "File not removed\n"); - ok(!delete_pf("msitest", FALSE), "File not removed\n"); + ok(!delete_pf("msitest", FALSE), "Directory not removed\n"); - DeleteFileA(msifile); RegCloseKey(source); RegCloseKey(props); + +error: DeleteFileA("msitest\\hydrogen"); DeleteFileA("msitest\\helium"); DeleteFileA("msitest\\lithium"); RemoveDirectoryA("msitest"); + DeleteFileA(msifile); } static void test_missingcomponent(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\hydrogen", 500); create_file("msitest\\helium", 500); @@ -7697,6 +5055,11 @@ static void test_missingcomponent(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, "INSTALLLEVEL=10 PROPVAR=42"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(pf_exists("msitest\\hydrogen"), "File not installed\n"); ok(pf_exists("msitest\\helium"), "File not installed\n"); @@ -7712,6 +5075,7 @@ static void test_missingcomponent(void) ok(!pf_exists("msitest\\beryllium"), "File installed\n"); ok(!delete_pf("msitest", FALSE), "Directory not removed\n"); +error: DeleteFileA(msifile); DeleteFileA("msitest\\hydrogen"); DeleteFileA("msitest\\helium"); @@ -7725,6 +5089,12 @@ static void test_sourcedirprop(void) UINT r; CHAR props[MAX_PATH]; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\augustus", 500); @@ -7733,9 +5103,14 @@ static void test_sourcedirprop(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File installed\n"); + ok(delete_pf("msitest", FALSE), "Directory created\n"); DeleteFile("msitest\\augustus"); RemoveDirectory("msitest"); @@ -7749,18 +5124,28 @@ static void test_sourcedirprop(void) r = MsiInstallProductA(msifile, props); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\augustus", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File installed\n"); + ok(delete_pf("msitest", FALSE), "Directory created\n"); - DeleteFile(msifile); DeleteFile("altsource\\msitest\\augustus"); RemoveDirectory("altsource\\msitest"); RemoveDirectory("altsource"); + +error: + DeleteFile("msitest\\augustus"); + RemoveDirectory("msitest"); + DeleteFile(msifile); } static void test_adminimage(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); CreateDirectoryA("msitest\\first", NULL); CreateDirectoryA("msitest\\second", NULL); @@ -7776,25 +5161,33 @@ static void test_adminimage(void) create_database_wordcount(msifile, ai_tables, sizeof(ai_tables) / sizeof(msi_table), - msidbSumInfoSourceTypeAdminImage); + 100, msidbSumInfoSourceTypeAdminImage, ";1033"); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); - DeleteFileA("msitest.msi"); +error: + DeleteFileA("msifile"); DeleteFileA("msitest\\cabout\\new\\five.txt"); DeleteFileA("msitest\\cabout\\four.txt"); DeleteFileA("msitest\\second\\three.txt"); @@ -7813,6 +5206,12 @@ static void test_propcase(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + CreateDirectoryA("msitest", NULL); create_file("msitest\\augustus", 500); @@ -7821,10 +5220,16 @@ static void test_propcase(void) MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, "MyProp=42"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\augustus", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); +error: DeleteFile(msifile); DeleteFile("msitest\\augustus"); RemoveDirectory("msitest"); @@ -7895,10 +5300,23 @@ static void test_shortcut(void) UINT r; HRESULT hr; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + create_test_files(); create_database(msifile, sc_tables, sizeof(sc_tables) / sizeof(msi_table)); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); @@ -7917,173 +5335,80 @@ static void test_shortcut(void) CoUninitialize(); - delete_pf("msitest\\cabout\\new\\five.txt", TRUE); - delete_pf("msitest\\cabout\\new", FALSE); - delete_pf("msitest\\cabout\\four.txt", TRUE); - delete_pf("msitest\\cabout", FALSE); - delete_pf("msitest\\changed\\three.txt", TRUE); - delete_pf("msitest\\changed", FALSE); - delete_pf("msitest\\first\\two.txt", TRUE); - delete_pf("msitest\\first", FALSE); - delete_pf("msitest\\filename", TRUE); - delete_pf("msitest\\one.txt", TRUE); - delete_pf("msitest\\service.exe", TRUE); - delete_pf("msitest\\Shortcut.lnk", TRUE); - delete_pf("msitest", FALSE); - delete_test_files(); -} - -static void test_envvar(void) -{ - UINT r; - HKEY env; - LONG res; - DWORD type, size; - char buffer[16]; - UINT i; - - if (on_win9x) - { - win_skip("Environment variables are handled differently on Win9x and WinMe\n"); - return; - } - - create_test_files(); - create_database(msifile, env_tables, sizeof(env_tables) / sizeof(msi_table)); - - res = RegCreateKeyExA(HKEY_CURRENT_USER, "Environment", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &env, NULL); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - res = RegSetValueExA(env, "MSITESTVAR1", 0, REG_SZ, (const BYTE *)"0", 2); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - res = RegSetValueExA(env, "MSITESTVAR2", 0, REG_SZ, (const BYTE *)"0", 2); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - type = REG_NONE; - size = sizeof(buffer); - buffer[0] = 0; - res = RegQueryValueExA(env, "MSITESTVAR1", NULL, &type, (LPBYTE)buffer, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type); - ok(!lstrcmp(buffer, "1"), "Expected \"1\", got %s\n", buffer); - - res = RegDeleteValueA(env, "MSITESTVAR1"); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - type = REG_NONE; - size = sizeof(buffer); - buffer[0] = 0; - res = RegQueryValueExA(env, "MSITESTVAR2", NULL, &type, (LPBYTE)buffer, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(type == REG_SZ, "Expected REG_SZ, got %u\n", type); - ok(!lstrcmp(buffer, "1"), "Expected \"1\", got %s\n", buffer); - - res = RegDeleteValueA(env, "MSITESTVAR2"); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - res = RegDeleteValueA(env, "MSITESTVAR3"); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - res = RegDeleteValueA(env, "MSITESTVAR4"); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - - res = RegDeleteValueA(env, "MSITESTVAR5"); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegDeleteValueA(env, "MSITESTVAR6"); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegDeleteValueA(env, "MSITESTVAR7"); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegDeleteValueA(env, "MSITESTVAR8"); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegDeleteValueA(env, "MSITESTVAR9"); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegDeleteValueA(env, "MSITESTVAR10"); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - i = 11; - while (environment_dat_results[(i-11)]) { - char name[20]; - sprintf(name, "MSITESTVAR%d", i); - - type = REG_NONE; - size = sizeof(buffer); - buffer[0] = 0; - res = RegQueryValueExA(env, name, NULL, &type, (LPBYTE)buffer, &size); - ok(res == ERROR_SUCCESS, "%d: Expected ERROR_SUCCESS, got %d\n", i, res); - ok(type == REG_SZ, "%d: Expected REG_SZ, got %u\n", i, type); - ok(!lstrcmp(buffer, environment_dat_results[(i-11)]), "%d: Expected %s, got %s\n", - i, environment_dat_results[(i-11)], buffer); - - res = RegDeleteValueA(env, name); - ok(res == ERROR_SUCCESS, "%d: Expected ERROR_SUCCESS, got %d\n", i, res); - i++; - } - - - RegCloseKey(env); - delete_pf("msitest\\cabout\\new\\five.txt", TRUE); - delete_pf("msitest\\cabout\\new", FALSE); - delete_pf("msitest\\cabout\\four.txt", TRUE); - delete_pf("msitest\\cabout", FALSE); - delete_pf("msitest\\changed\\three.txt", TRUE); - delete_pf("msitest\\changed", FALSE); - delete_pf("msitest\\first\\two.txt", TRUE); - delete_pf("msitest\\first", FALSE); - delete_pf("msitest\\filename", TRUE); - delete_pf("msitest\\one.txt", TRUE); - delete_pf("msitest\\service.exe", TRUE); - delete_pf("msitest", FALSE); + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + while (!delete_pf("msitest\\Shortcut.lnk", TRUE) && GetLastError() == ERROR_SHARING_VIOLATION) Sleep(1000); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + +error: delete_test_files(); + DeleteFile(msifile); } static void test_preselected(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + create_test_files(); create_database(msifile, ps_tables, sizeof(ps_tables) / sizeof(msi_table)); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiInstallProductA(msifile, "ADDLOCAL=One"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout\\new", FALSE), "File installed\n"); + ok(!delete_pf("msitest\\cabout\\new", FALSE), "Directory created\n"); ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout", FALSE), "File installed\n"); + ok(!delete_pf("msitest\\cabout", FALSE), "Directory created\n"); ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\changed", FALSE), "File installed\n"); + ok(!delete_pf("msitest\\changed", FALSE), "Directory created\n"); ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\first", FALSE), "File installed\n"); + ok(!delete_pf("msitest\\first", FALSE), "Directory created\n"); ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); r = MsiInstallProductA(msifile, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(!delete_pf("msitest\\one.txt", TRUE), "File installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); + +error: delete_test_files(); + DeleteFile(msifile); } static void test_installed_prop(void) @@ -8091,12 +5416,23 @@ static void test_installed_prop(void) static char prodcode[] = "{7df88a48-996f-4ec8-a022-bf956f9b2cbb}"; UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + create_test_files(); create_database(msifile, ip_tables, sizeof(ip_tables) / sizeof(msi_table)); MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiInstallProductA(msifile, "FULL=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); r = MsiInstallProductA(msifile, "FULL=1"); @@ -8106,28 +5442,36 @@ static void test_installed_prop(void) ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); +error: delete_test_files(); + DeleteFile(msifile); } static void test_allusers_prop(void) { UINT r; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + create_test_files(); create_database(msifile, aup_tables, sizeof(aup_tables) / sizeof(msi_table)); @@ -8135,20 +5479,25 @@ static void test_allusers_prop(void) /* ALLUSERS property unset */ r = MsiInstallProductA(msifile, "FULL=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -8158,24 +5507,22 @@ static void test_allusers_prop(void) create_test_files(); create_database(msifile, aup2_tables, sizeof(aup2_tables) / sizeof(msi_table)); - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - /* ALLUSERS property set to 1 */ r = MsiInstallProductA(msifile, "FULL=1"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -8185,24 +5532,22 @@ static void test_allusers_prop(void) create_test_files(); create_database(msifile, aup3_tables, sizeof(aup3_tables) / sizeof(msi_table)); - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - /* ALLUSERS property set to 2 */ r = MsiInstallProductA(msifile, "FULL=1"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n"); ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "Directory not created\n"); r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -8212,35 +5557,13 @@ static void test_allusers_prop(void) create_test_files(); create_database(msifile, aup4_tables, sizeof(aup4_tables) / sizeof(msi_table)); - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - /* ALLUSERS property set to 2, conditioned on ALLUSERS = 1 */ r = MsiInstallProductA(msifile, "FULL=1"); - if (r == ERROR_SUCCESS) - { - /* Win9x/WinMe */ - win_skip("Win9x and WinMe act differently with respect to ALLUSERS\n"); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); - ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); - ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); - ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); - ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\one.txt", TRUE), "File installed\n"); - ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "File not installed\n"); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - delete_test_files(); - } - else - ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); +error: + delete_test_files(); + DeleteFile(msifile); } static char session_manager[] = "System\\CurrentControlSet\\Control\\Session Manager"; @@ -8249,37 +5572,34 @@ static char rename_ops[] = "PendingFileRenameOperations"; static void process_pending_renames(HKEY hkey) { char *buf, *src, *dst, *buf2, *buf2ptr; - DWORD size, buf2len = 0; + DWORD size; LONG ret; BOOL found = FALSE; ret = RegQueryValueExA(hkey, rename_ops, NULL, NULL, NULL, &size); - buf = HeapAlloc(GetProcessHeap(), 0, size); - buf2ptr = buf2 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); - buf[0] = 0; + ok(!ret, "RegQueryValueExA failed %d\n", ret); + + buf = HeapAlloc(GetProcessHeap(), 0, size + 1); + buf2ptr = buf2 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size + 1); ret = RegQueryValueExA(hkey, rename_ops, NULL, NULL, (LPBYTE)buf, &size); - ok(!ret, "RegQueryValueExA failed %d (%u)\n", ret, GetLastError()); + buf[size] = 0; + ok(!ret, "RegQueryValueExA failed %d\n", ret); + if (ret) return; for (src = buf; *src; src = dst + strlen(dst) + 1) { DWORD flags = MOVEFILE_COPY_ALLOWED; + BOOL fileret; dst = src + strlen(src) + 1; if (!strstr(src, "msitest")) { lstrcpyA(buf2ptr, src); - buf2len += strlen(src) + 1; buf2ptr += strlen(src) + 1; - if (*dst) - { - lstrcpyA(buf2ptr, dst); - buf2ptr += strlen(dst) + 1; - buf2len += strlen(dst) + 1; - } - buf2ptr++; - buf2len++; + lstrcpyA(buf2ptr, dst); + buf2ptr += strlen(dst) + 1; continue; } @@ -8294,19 +5614,20 @@ static void process_pending_renames(HKEY hkey) if (*dst) { if (dst[0] == '\\' && dst[1] == '?' && dst[2] == '?' && dst[3] == '\\') dst += 4; - ok(MoveFileExA(src, dst, flags), "Failed to move file %s -> %s (%u)\n", src, dst, GetLastError()); + fileret = MoveFileExA(src, dst, flags); + ok(fileret, "Failed to move file %s -> %s (%u)\n", src, dst, GetLastError()); } else - ok(DeleteFileA(src), "Failed to delete file %s (%u)\n", src, GetLastError()); + { + fileret = DeleteFileA(src); + ok(fileret, "Failed to delete file %s (%u)\n", src, GetLastError()); + } } ok(found, "Expected a 'msitest' entry\n"); if (*buf2) - { - buf2len++; - RegSetValueExA(hkey, rename_ops, 0, REG_MULTI_SZ, (LPBYTE)buf2, buf2len); - } + RegSetValueExA(hkey, rename_ops, 0, REG_MULTI_SZ, (LPBYTE)buf2, buf2ptr + 1 - buf2); else RegDeleteValueA(hkey, rename_ops); @@ -8339,9 +5660,9 @@ static void test_file_in_use(void) HKEY hkey; char path[MAX_PATH]; - if (on_win9x) + if (is_process_limited()) { - win_skip("Pending file renaming is implemented differently on Win9x and WinMe\n"); + skip("process is limited\n"); return; } @@ -8361,6 +5682,11 @@ static void test_file_in_use(void) file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); r = MsiInstallProductA(msifile, "REBOOT=ReallySuppress FULL=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS_REBOOT_REQUIRED, "Expected ERROR_SUCCESS_REBOOT_REQUIRED got %u\n", r); ok(!file_matches_data(path, "msitest\\maximus"), "Expected file not to match\n"); CloseHandle(file); @@ -8376,8 +5702,14 @@ static void test_file_in_use(void) r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); +error: + RegCloseKey(hkey); + + delete_pf("msitest\\maximus", TRUE); + delete_pf("msitest", FALSE); DeleteFileA("msitest\\maximus"); delete_test_files(); + DeleteFile(msifile); } static void test_file_in_use_cab(void) @@ -8387,9 +5719,9 @@ static void test_file_in_use_cab(void) HKEY hkey; char path[MAX_PATH]; - if (on_win9x) + if (is_process_limited()) { - win_skip("Pending file renaming is implemented differently on Win9x and WinMe\n"); + skip("process is limited\n"); return; } @@ -8412,6 +5744,11 @@ static void test_file_in_use_cab(void) file = CreateFileA(path, GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); r = MsiInstallProductA(msifile, "REBOOT=ReallySuppress FULL=1"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS_REBOOT_REQUIRED, "Expected ERROR_SUCCESS_REBOOT_REQUIRED got %u\n", r); ok(!file_matches_data(path, "maximus"), "Expected file not to match\n"); CloseHandle(file); @@ -8427,8 +5764,15 @@ static void test_file_in_use_cab(void) r = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); +error: + RegCloseKey(hkey); + + delete_pf("msitest\\maximus", TRUE); + delete_pf("msitest", FALSE); + DeleteFileA("msitest\\maximus"); delete_cab_files(); delete_test_files(); + DeleteFile(msifile); } static INT CALLBACK handler_a(LPVOID context, UINT type, LPCSTR msg) @@ -8512,6 +5856,13 @@ static void test_MsiSetExternalUI(void) static void test_feature_override(void) { UINT r; + REGSAM access = KEY_ALL_ACCESS; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } create_test_files(); create_file("msitest\\override.txt", 1000); @@ -8519,7 +5870,17 @@ static void test_feature_override(void) create_file("msitest\\notpreselected.txt", 1000); create_database(msifile, fo_tables, sizeof(fo_tables) / sizeof(msi_table)); + if (is_wow64) + access |= KEY_WOW64_64KEY; + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiInstallProductA(msifile, "ADDLOCAL=override"); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); ok(pf_exists("msitest\\override.txt"), "file not installed\n"); @@ -8563,869 +5924,14 @@ static void test_feature_override(void) ok(delete_pf("msitest", FALSE), "directory removed\n"); } + delete_key(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest", access); + +error: DeleteFileA("msitest\\override.txt"); DeleteFileA("msitest\\preselected.txt"); DeleteFileA("msitest\\notpreselected.txt"); - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\msitest"); - delete_test_files(); -} - -static void test_create_folder(void) -{ - UINT r; - - create_test_files(); - create_database(msifile, cf_tables, sizeof(cf_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); - - ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout\\new", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\changed", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\first", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\one.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); - ok(!delete_pf("msitest", FALSE), "Directory created\n"); - - r = MsiInstallProductA(msifile, "LOCAL=Two"); - ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); - - ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout\\new", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\changed", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\first", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\one.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); - ok(!delete_pf("msitest", FALSE), "Directory created\n"); - - delete_test_files(); -} - -static void test_remove_folder(void) -{ - UINT r; - - create_test_files(); - create_database(msifile, rf_tables, sizeof(rf_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); - - ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout\\new", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\changed", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\first", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\one.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); - ok(!delete_pf("msitest", FALSE), "Directory created\n"); - - r = MsiInstallProductA(msifile, "LOCAL=Two"); - ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); - - ok(!delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout\\new", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\cabout\\four.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\cabout", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\changed\\three.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\changed", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\first\\two.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\first", FALSE), "Directory created\n"); - ok(!delete_pf("msitest\\filename", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\one.txt", TRUE), "File installed\n"); - ok(!delete_pf("msitest\\service.exe", TRUE), "File installed\n"); - ok(!delete_pf("msitest", FALSE), "Directory created\n"); - - delete_test_files(); -} - -static void test_start_services(void) -{ - UINT r; - SC_HANDLE scm, service; - BOOL ret; - DWORD error = ERROR_SUCCESS; - - if (on_win9x) - { - win_skip("Services are not implemented on Win9x and WinMe\n"); - return; - } - scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - ok(scm != NULL, "Failed to open the SC Manager\n"); - if (!scm) return; - - service = OpenService(scm, "Spooler", SC_MANAGER_ALL_ACCESS); - if (!service && GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST) - { - win_skip("The 'Spooler' service does not exist\n"); - CloseServiceHandle(scm); - return; - } - ok(service != NULL, "Failed to open Spooler, error %d\n", GetLastError()); - if (!service) { - CloseServiceHandle(scm); - return; - } - - ret = StartService(service, 0, NULL); - if (!ret && (error = GetLastError()) != ERROR_SERVICE_ALREADY_RUNNING) - { - skip("Terminal service not available, skipping test\n"); - CloseServiceHandle(service); - CloseServiceHandle(scm); - return; - } - - CloseServiceHandle(service); - CloseServiceHandle(scm); - - create_test_files(); - create_database(msifile, sss_tables, sizeof(sss_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "Directory not created\n"); - - delete_test_files(); - - if (error == ERROR_SUCCESS) - { - SERVICE_STATUS status; - - scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); - service = OpenService(scm, "Spooler", SC_MANAGER_ALL_ACCESS); - - ret = ControlService(service, SERVICE_CONTROL_STOP, &status); - ok(ret, "ControlService failed %u\n", GetLastError()); - - CloseServiceHandle(service); - CloseServiceHandle(scm); - } -} - -static void test_delete_services(void) -{ - UINT r; - - create_test_files(); - create_database(msifile, sds_tables, sizeof(sds_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "Directory not created\n"); - - delete_test_files(); -} - -static void test_self_registration(void) -{ - UINT r; - - create_test_files(); - create_database(msifile, sr_tables, sizeof(sr_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "Directory not created\n"); - - delete_test_files(); -} - -static void test_register_font(void) -{ - static const char regfont1[] = "Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"; - static const char regfont2[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Fonts"; - LONG ret; - HKEY key; - UINT r; - - create_test_files(); - create_file("msitest\\font.ttf", 1000); - create_database(msifile, font_tables, sizeof(font_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ret = RegOpenKeyA(HKEY_LOCAL_MACHINE, regfont1, &key); - if (ret) - RegOpenKeyA(HKEY_LOCAL_MACHINE, regfont2, &key); - - ret = RegQueryValueExA(key, "msi test font", NULL, NULL, NULL, NULL); - ok(ret != ERROR_FILE_NOT_FOUND, "unexpected result %d\n", ret); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - ret = RegQueryValueExA(key, "msi test font", NULL, NULL, NULL, NULL); - ok(ret == ERROR_FILE_NOT_FOUND, "unexpected result %d\n", ret); - - RegDeleteValueA(key, "msi test font"); - RegCloseKey(key); - DeleteFileA("msitest\\font.ttf"); - delete_test_files(); -} - -static void test_validate_product_id(void) -{ - UINT r; - - create_test_files(); - create_database(msifile, vp_tables, sizeof(vp_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - r = MsiInstallProductA(msifile, "SET_PRODUCT_ID=1"); - ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); - - r = MsiInstallProductA(msifile, "SET_PRODUCT_ID=2"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - r = MsiInstallProductA(msifile, "PIDKEY=123-1234567"); - ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); - - ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout\\new", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\cabout", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\changed", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\first", FALSE), "Directory not created\n"); - ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); - ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); - ok(delete_pf("msitest", FALSE), "Directory not created\n"); - - delete_test_files(); -} - -static void test_install_remove_odbc(void) -{ - UINT r; - - create_test_files(); - create_file("msitest\\ODBCdriver.dll", 1000); - create_file("msitest\\ODBCdriver2.dll", 1000); - create_file("msitest\\ODBCtranslator.dll", 1000); - create_file("msitest\\ODBCtranslator2.dll", 1000); - create_file("msitest\\ODBCsetup.dll", 1000); - create_database(msifile, odbc_tables, sizeof(odbc_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(pf_exists("msitest\\ODBCdriver.dll"), "file not created\n"); - ok(pf_exists("msitest\\ODBCdriver2.dll"), "file not created\n"); - ok(pf_exists("msitest\\ODBCtranslator.dll"), "file not created\n"); - ok(pf_exists("msitest\\ODBCtranslator2.dll"), "file not created\n"); - ok(pf_exists("msitest\\ODBCsetup.dll"), "file not created\n"); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(!delete_pf("msitest\\ODBCdriver.dll", TRUE), "file not removed\n"); - ok(!delete_pf("msitest\\ODBCdriver2.dll", TRUE), "file not removed\n"); - ok(!delete_pf("msitest\\ODBCtranslator.dll", TRUE), "file not removed\n"); - ok(!delete_pf("msitest\\ODBCtranslator2.dll", TRUE), "file not removed\n"); - ok(!delete_pf("msitest\\ODBCsetup.dll", TRUE), "file not removed\n"); - ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - DeleteFileA("msitest\\ODBCdriver.dll"); - DeleteFileA("msitest\\ODBCdriver2.dll"); - DeleteFileA("msitest\\ODBCtranslator.dll"); - DeleteFileA("msitest\\ODBCtranslator2.dll"); - DeleteFileA("msitest\\ODBCsetup.dll"); - delete_test_files(); -} - -static void test_register_typelib(void) -{ - UINT r; - - create_test_files(); - create_file("msitest\\typelib.dll", 1000); - create_database(msifile, tl_tables, sizeof(tl_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, "REGISTER_TYPELIB=1"); - ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(!delete_pf("msitest\\typelib.dll", TRUE), "file not removed\n"); - ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - DeleteFileA("msitest\\typelib.dll"); - delete_test_files(); -} - -static void test_create_remove_shortcut(void) -{ - UINT r; - - create_test_files(); - create_file("msitest\\target.txt", 1000); - create_database(msifile, crs_tables, sizeof(crs_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(pf_exists("msitest\\target.txt"), "file not created\n"); - ok(pf_exists("msitest\\shortcut.lnk"), "file not created\n"); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(!delete_pf("msitest\\shortcut.lnk", TRUE), "file not removed\n"); - ok(!delete_pf("msitest\\target.txt", TRUE), "file not removed\n"); - todo_wine ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - DeleteFileA("msitest\\target.txt"); - delete_test_files(); -} - -static void test_publish_components(void) -{ - static char keypath[] = - "Software\\Microsoft\\Installer\\Components\\0CBCFA296AC907244845745CEEB2F8AA"; - - UINT r; - LONG res; - HKEY key; - - create_test_files(); - create_file("msitest\\english.txt", 1000); - create_database(msifile, pub_tables, sizeof(pub_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_CURRENT_USER, keypath, &key); - ok(res == ERROR_SUCCESS, "components key not created %d\n", res); - - res = RegQueryValueExA(key, "english.txt", NULL, NULL, NULL, NULL); - ok(res == ERROR_SUCCESS, "value not found %d\n", res); - RegCloseKey(key); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_CURRENT_USER, keypath, &key); - ok(res == ERROR_FILE_NOT_FOUND, "unexpected result %d\n", res); - - ok(!delete_pf("msitest\\english.txt", TRUE), "file not removed\n"); - ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - DeleteFileA("msitest\\english.txt"); - delete_test_files(); -} - -static void test_remove_duplicate_files(void) -{ - UINT r; - - create_test_files(); - create_file("msitest\\original.txt", 1000); - create_file("msitest\\original2.txt", 1000); - create_file("msitest\\original3.txt", 1000); - create_database(msifile, rd_tables, sizeof(rd_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(pf_exists("msitest\\original.txt"), "file not created\n"); - ok(pf_exists("msitest\\original2.txt"), "file not created\n"); - ok(!pf_exists("msitest\\original3.txt"), "file created\n"); - ok(pf_exists("msitest\\duplicate.txt"), "file not created\n"); - ok(!pf_exists("msitest\\duplicate2.txt"), "file created\n"); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(delete_pf("msitest\\original.txt", TRUE), "file removed\n"); - ok(!delete_pf("msitest\\original2.txt", TRUE), "file not removed\n"); - ok(!delete_pf("msitest\\original3.txt", TRUE), "file not removed\n"); - ok(!delete_pf("msitest\\duplicate.txt", TRUE), "file not removed\n"); - ok(!delete_pf("msitest\\duplicate2.txt", TRUE), "file not removed\n"); - ok(delete_pf("msitest", FALSE), "directory removed\n"); - - DeleteFileA("msitest\\original.txt"); - DeleteFileA("msitest\\original2.txt"); - DeleteFileA("msitest\\original3.txt"); - delete_test_files(); -} - -static void test_remove_registry_values(void) -{ - UINT r; - LONG res; - HKEY key; - - create_test_files(); - create_file("msitest\\registry.txt", 1000); - create_database(msifile, rrv_tables, sizeof(rrv_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", &key); - RegSetValueExA(key, "value1", 0, REG_SZ, (const BYTE *)"1", 2); - RegCloseKey(key); - - RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", &key); - RegSetValueExA(key, "value2", 0, REG_SZ, (const BYTE *)"2", 2); - RegCloseKey(key); - - RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", &key); - RegSetValueExA(key, "", 0, REG_SZ, (const BYTE *)"default", 8); - RegSetValueExA(key, "valueA", 0, REG_SZ, (const BYTE *)"A", 2); - RegSetValueExA(key, "valueB", 0, REG_SZ, (const BYTE *)"B", 2); - RegCloseKey(key); - - RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyB", &key); - RegSetValueExA(key, "", 0, REG_SZ, (const BYTE *)"default", 8); - RegSetValueExA(key, "valueB", 0, REG_SZ, (const BYTE *)"B", 2); - RegCloseKey(key); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", &key); - ok(res == ERROR_SUCCESS, "key removed\n"); - RegCloseKey(key); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", &key); - ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); - - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", &key); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - RegCloseKey(key); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key1", &key); - ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2", &key); - ok(res == ERROR_SUCCESS, "key removed\n"); - RegCloseKey(key); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA", &key); - ok(res == ERROR_SUCCESS, "key removed\n"); - RegCloseKey(key); - - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyB", &key); - ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); - - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\keyA"); - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\key2"); - RegDeleteKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine"); - - ok(!delete_pf("msitest\\registry.txt", TRUE), "file not removed\n"); - ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - DeleteFileA("msitest\\registry.txt"); - delete_test_files(); -} - -static void test_find_related_products(void) -{ - UINT r; - - create_test_files(); - create_file("msitest\\product.txt", 1000); - create_database(msifile, frp_tables, sizeof(frp_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - /* install again, so it finds the upgrade code */ - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - ok(!delete_pf("msitest\\product.txt", TRUE), "file not removed\n"); - ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - DeleteFileA("msitest\\product.txt"); - delete_test_files(); -} - -static void test_remove_ini_values(void) -{ - UINT r; - DWORD len; - char inifile[MAX_PATH], buf[0x10]; - HANDLE file; - BOOL ret; - - create_test_files(); - create_file("msitest\\inifile.txt", 1000); - create_database(msifile, riv_tables, sizeof(riv_tables) / sizeof(msi_table)); - - lstrcpyA(inifile, PROG_FILES_DIR); - lstrcatA(inifile, "\\msitest"); - CreateDirectoryA(inifile, NULL); - lstrcatA(inifile, "\\test.ini"); - file = CreateFileA(inifile, GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, 0, NULL); - CloseHandle(file); - - ret = WritePrivateProfileStringA("section1", "key1", "value1", inifile); - ok(ret, "failed to write profile string %u\n", GetLastError()); - - ret = WritePrivateProfileStringA("sectionA", "keyA", "valueA", inifile); - ok(ret, "failed to write profile string %u\n", GetLastError()); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - len = GetPrivateProfileStringA("section1", "key1", NULL, buf, sizeof(buf), inifile); - ok(len == 6, "got %u expected 6\n", len); - - len = GetPrivateProfileStringA("sectionA", "keyA", NULL, buf, sizeof(buf), inifile); - ok(!len, "got %u expected 0\n", len); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - len = GetPrivateProfileStringA("section1", "key1", NULL, buf, sizeof(buf), inifile); - ok(!len, "got %u expected 0\n", len); - - len = GetPrivateProfileStringA("sectionA", "keyA", NULL, buf, sizeof(buf), inifile); - ok(!len, "got %u expected 0\n", len); - - todo_wine ok(!delete_pf("msitest\\test.ini", TRUE), "file removed\n"); - ok(!delete_pf("msitest\\inifile.txt", TRUE), "file not removed\n"); - ok(delete_pf("msitest", FALSE), "directory removed\n"); - - DeleteFileA("msitest\\inifile.txt"); - delete_test_files(); -} - -static void test_remove_env_strings(void) -{ - UINT r; - LONG res; - HKEY key; - DWORD type, size; - char buffer[0x10]; - - if (on_win9x) - { - win_skip("Environment variables are handled differently on win9x and winme\n"); - return; - } - - create_test_files(); - create_file("msitest\\envvar.txt", 1000); - create_database(msifile, res_tables, sizeof(res_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - res = RegOpenKeyA(HKEY_CURRENT_USER, "Environment", &key); - ok(!res, "failed to open environment key %d\n", res); - - RegSetValueExA(key, "MSITESTVAR1", 0, REG_SZ, (const BYTE *)"1", 2); - RegSetValueExA(key, "MSITESTVAR2", 0, REG_SZ, (const BYTE *)"1", 2); - RegSetValueExA(key, "MSITESTVAR3", 0, REG_SZ, (const BYTE *)"1", 2); - RegSetValueExA(key, "MSITESTVAR4", 0, REG_SZ, (const BYTE *)"1", 2); - RegSetValueExA(key, "MSITESTVAR5", 0, REG_SZ, (const BYTE *)"1", 2); - - RegCloseKey(key); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_CURRENT_USER, "Environment", &key); - ok(!res, "failed to open environment key %d\n", res); - - type = REG_NONE; - buffer[0] = 0; - size = sizeof(buffer); - res = RegQueryValueExA(key, "MSITESTVAR1", NULL, &type, (LPBYTE)buffer, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); - ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); - - type = REG_NONE; - buffer[0] = 0; - size = sizeof(buffer); - res = RegQueryValueExA(key, "MSITESTVAR2", NULL, &type, (LPBYTE)buffer, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); - ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); - - type = REG_NONE; - buffer[0] = 0; - size = sizeof(buffer); - res = RegQueryValueExA(key, "MSITESTVAR3", NULL, &type, (LPBYTE)buffer, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); - ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); - - type = REG_NONE; - buffer[0] = 0; - size = sizeof(buffer); - res = RegQueryValueExA(key, "MSITESTVAR4", NULL, &type, (LPBYTE)buffer, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); - ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); - - type = REG_NONE; - buffer[0] = 0; - size = sizeof(buffer); - res = RegQueryValueExA(key, "MSITESTVAR5", NULL, &type, (LPBYTE)buffer, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); - ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); - - RegCloseKey(key); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_CURRENT_USER, "Environment", &key); - ok(!res, "failed to open environment key %d\n", res); - - res = RegQueryValueExA(key, "MSITESTVAR1", NULL, NULL, NULL, NULL); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - res = RegQueryValueExA(key, "MSITESTVAR2", NULL, NULL, NULL, NULL); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - type = REG_NONE; - buffer[0] = 0; - size = sizeof(buffer); - res = RegQueryValueExA(key, "MSITESTVAR3", NULL, &type, (LPBYTE)buffer, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); - ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); - RegDeleteValueA(key, "MSITESTVAR3"); - - res = RegQueryValueExA(key, "MSITESTVAR4", NULL, NULL, NULL, NULL); - ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); - - type = REG_NONE; - buffer[0] = 0; - size = sizeof(buffer); - res = RegQueryValueExA(key, "MSITESTVAR5", NULL, &type, (LPBYTE)buffer, &size); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - ok(type == REG_SZ, "expected REG_SZ, got %u\n", type); - ok(!lstrcmp(buffer, "1"), "expected \"1\", got \"%s\"\n", buffer); - RegDeleteValueA(key, "MSITESTVAR5"); - - RegCloseKey(key); - - ok(!delete_pf("msitest\\envvar.txt", TRUE), "file not removed\n"); - ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - DeleteFileA("msitest\\envvar.txt"); - delete_test_files(); -} - -static void test_register_class_info(void) -{ - UINT r; - LONG res; - HKEY hkey; - - create_test_files(); - create_file("msitest\\class.txt", 1000); - create_database(msifile, rci_tables, sizeof(rci_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, "CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); - ok(res == ERROR_SUCCESS, "key not created\n"); - RegCloseKey(hkey); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, "FileType\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); - ok(res == ERROR_SUCCESS, "key not created\n"); - RegCloseKey(hkey); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, "AppID\\{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}", &hkey); - ok(res == ERROR_SUCCESS, "key not created\n"); - RegCloseKey(hkey); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, "CLSID\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, "FileType\\{110913E7-86D1-4BF3-9922-BA103FCDDDFA}", &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, "AppID\\{CFCC3B38-E683-497D-9AB4-CB40AAFE307F}", &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); - - ok(!delete_pf("msitest\\class.txt", TRUE), "file not removed\n"); - ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - DeleteFileA("msitest\\class.txt"); - delete_test_files(); -} - -static void test_register_extension_info(void) -{ - UINT r; - LONG res; - HKEY hkey; - - create_test_files(); - create_file("msitest\\extension.txt", 1000); - create_database(msifile, rei_tables, sizeof(rei_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, ".extension", &hkey); - ok(res == ERROR_SUCCESS, "key not created\n"); - RegCloseKey(hkey); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Prog.Id.1\\shell\\Open\\command", &hkey); - ok(res == ERROR_SUCCESS, "key not created\n"); - RegCloseKey(hkey); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, ".extension", &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, "Prog.Id.1", &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); - - ok(!delete_pf("msitest\\extension.txt", TRUE), "file not removed\n"); - ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - DeleteFileA("msitest\\extension.txt"); - delete_test_files(); -} - -static void test_register_mime_info(void) -{ - UINT r; - LONG res; - HKEY hkey; - - create_test_files(); - create_file("msitest\\mime.txt", 1000); - create_database(msifile, rmi_tables, sizeof(rmi_tables) / sizeof(msi_table)); - - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - - r = MsiInstallProductA(msifile, NULL); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, "MIME\\Database\\Content Type\\mime/type", &hkey); - ok(res == ERROR_SUCCESS, "key not created\n"); - RegCloseKey(hkey); - - r = MsiInstallProductA(msifile, "REMOVE=ALL"); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); - - res = RegOpenKeyA(HKEY_CLASSES_ROOT, "MIME\\Database\\Content Type\\mime/type", &hkey); - ok(res == ERROR_FILE_NOT_FOUND, "key not removed\n"); - - ok(!delete_pf("msitest\\mime.txt", TRUE), "file not removed\n"); - ok(!delete_pf("msitest", FALSE), "directory not removed\n"); - - DeleteFileA("msitest\\mime.txt"); delete_test_files(); + DeleteFile(msifile); } static void test_icon_table(void) @@ -9433,11 +5939,19 @@ static void test_icon_table(void) MSIHANDLE hdb = 0, record; LPCSTR query; UINT res; - CHAR path[MAX_PATH], win9xpath[MAX_PATH]; + CHAR path[MAX_PATH]; static const char prodcode[] = "{7DF88A49-996F-4EC8-A022-BF956F9B2CBB}"; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + create_database(msifile, icon_base_tables, sizeof(icon_base_tables) / sizeof(msi_table)); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + res = MsiOpenDatabase(msifile, MSIDBOPEN_TRANSACT, &hdb); ok(res == ERROR_SUCCESS, "failed to open db: %d\n", res); @@ -9449,7 +5963,6 @@ static void test_icon_table(void) record = MsiCreateRecord(1); res = MsiRecordSetStream(record, 1, "icon.ico"); ok(res == ERROR_SUCCESS, "Failed to add stream data to record: %d\n", res); - DeleteFile("icon.ico"); query = "INSERT INTO `Icon` (`Name`, `Data`) VALUES ('testicon', ?)"; res = run_query(hdb, record, query); @@ -9457,6 +5970,7 @@ static void test_icon_table(void) res = MsiCloseHandle(record); ok(res == ERROR_SUCCESS, "Failed to close record handle: %d\n", res); + DeleteFileA("icon.ico"); res = MsiDatabaseCommit(hdb); ok(res == ERROR_SUCCESS, "Failed to commit database: %d\n", res); res = MsiCloseHandle(hdb); @@ -9464,6 +5978,12 @@ static void test_icon_table(void) /* per-user */ res = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1"); + if (res == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } ok(res == ERROR_SUCCESS, "Failed to do per-user install: %d\n", res); lstrcpyA(path, APP_DATA_DIR); @@ -9475,32 +5995,627 @@ static void test_icon_table(void) res = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(res == ERROR_SUCCESS, "Failed to uninstall per-user\n"); + ok(!file_exists(path), "Per-user icon file not removed (%s)\n", path); /* system-wide */ res = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1 ALLUSERS=1"); ok(res == ERROR_SUCCESS, "Failed to system-wide install: %d\n", res); - /* win9x with MSI 2.0 installs the icon to a different folder, same as above */ - lstrcpyA(win9xpath, APP_DATA_DIR); - lstrcatA(path, "\\"); - lstrcatA(path, "Microsoft\\Installer\\"); - lstrcatA(path, prodcode); - lstrcatA(path, "\\testicon"); - lstrcpyA(path, WINDOWS_DIR); lstrcatA(path, "\\"); lstrcatA(path, "Installer\\"); lstrcatA(path, prodcode); lstrcatA(path, "\\testicon"); - ok(file_exists(path) || file_exists(win9xpath), - "System-wide icon file isn't where it's expected (%s)\n", path); + ok(file_exists(path), "System-wide icon file isn't where it's expected (%s)\n", path); res = MsiInstallProductA(msifile, "REMOVE=ALL"); ok(res == ERROR_SUCCESS, "Failed to uninstall system-wide\n"); + ok(!file_exists(path), "System-wide icon file not removed (%s)\n", path); delete_pfmsitest_files(); + DeleteFile(msifile); +} + +static void test_sourcedir_props(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_file("msitest\\sourcedir.txt", 1000); + create_database(msifile, sd_tables, sizeof(sd_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_FULL, NULL); + + /* full UI, no ResolveSource action */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\sourcedir.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + /* full UI, ResolveSource action */ + r = MsiInstallProductA(msifile, "ResolveSource=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\sourcedir.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + /* no UI, no ResolveSource action */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\sourcedir.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + /* no UI, ResolveSource action */ + r = MsiInstallProductA(msifile, "ResolveSource=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\sourcedir.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + DeleteFileA("msitest\\sourcedir.txt"); + DeleteFile(msifile); +} + +static void test_package_validation(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\maximus", 500); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;1033"); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); + ok(delete_pf("msitest", FALSE), "directory does not exist\n"); DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel,9999;9999"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel,1033;9999"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel,9999;1033"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); + ok(delete_pf("msitest", FALSE), "directory does not exist\n"); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel64,9999;1033"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel32,1033;1033"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "Intel32,9999;1033"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;9999"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_LANGUAGE_UNSUPPORTED, "Expected ERROR_INSTALL_LANGUAGE_UNSUPPORTED, got %u\n", r); + ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n"); + ok(!delete_pf("msitest", FALSE), "directory exists\n"); + + if (GetSystemDefaultLangID() == MAKELANGID( LANG_ENGLISH, SUBLANG_ENGLISH_US )) + { + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;9"); + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); + ok(delete_pf("msitest", FALSE), "directory does not exist\n"); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;1024"); + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); + ok(delete_pf("msitest", FALSE), "directory does not exist\n"); + } + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel32;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); + ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n"); + ok(!delete_pf("msitest", FALSE), "directory exists\n"); + + if (is_64bit && !is_wow64) + { + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); + ok(delete_pf("msitest", FALSE), "directory does not exist\n"); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_PACKAGE_INVALID, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r); + ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n"); + ok(!delete_pf("msitest", FALSE), "directory exists\n"); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); + ok(delete_pf("msitest", FALSE), "directory does not exist\n"); + } + else if (is_wow64) + { + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); + ok(delete_pf("msitest", FALSE), "directory does not exist\n"); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_PACKAGE_INVALID, "Expected ERROR_INSTALL_PACKAGE_INVALID, got %u\n", r); + ok(!delete_pf_native("msitest\\maximus", TRUE), "file exists\n"); + ok(!delete_pf_native("msitest", FALSE), "directory exists\n"); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf_native("msitest\\maximus", TRUE), "file exists\n"); + ok(delete_pf_native("msitest", FALSE), "directory exists\n"); + } + else + { + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "Intel;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + ok(delete_pf("msitest\\maximus", TRUE), "file does not exist\n"); + ok(delete_pf("msitest", FALSE), "directory does not exist\n"); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 100, "x64;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); + ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n"); + ok(!delete_pf("msitest", FALSE), "directory exists\n"); + + DeleteFile(msifile); + create_database_template(msifile, pv_tables, sizeof(pv_tables)/sizeof(msi_table), 200, "x64;0"); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_INSTALL_PLATFORM_UNSUPPORTED, "Expected ERROR_INSTALL_PLATFORM_UNSUPPORTED, got %u\n", r); + ok(!delete_pf("msitest\\maximus", TRUE), "file exists\n"); + ok(!delete_pf("msitest", FALSE), "directory exists\n"); + } + +error: + /* Delete the files in the temp (current) folder */ + DeleteFile(msifile); + DeleteFile("msitest\\maximus"); + RemoveDirectory("msitest"); +} + +static void test_command_line_parsing(void) +{ + UINT r; + const char *cmd; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + create_test_files(); + create_database(msifile, cl_tables, sizeof(cl_tables)/sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + cmd = " "; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "="; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "=="; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "one"; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "=one"; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "P="; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = " P="; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P= "; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "P=\"\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\"\"\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "P=\"\"\"\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\" "; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "P= \""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "P= \"\" "; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\" \""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=one"; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + cmd = "P= one"; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + cmd = "P=\"one"; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "P=one\""; + r = MsiInstallProductA(msifile, cmd); + todo_wine ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\"one\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + cmd = "P= \"one\" "; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + cmd = "P=\"one\"\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "P=\"\"one\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "P=\"\"one\"\""; + r = MsiInstallProductA(msifile, cmd); + todo_wine ok(r == ERROR_INVALID_COMMAND_LINE, "Expected ERROR_INVALID_COMMAND_LINE, got %u\n", r); + + cmd = "P=\"one two\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\"\"\"one\"\" two\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\"\"\"one\"\" two\" Q=three"; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\"\" Q=\"two\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\"one\" Q=\"two\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + cmd = "P=\"one=two\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "Q=\"\" P=\"one\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %u\n", r); + + cmd = "P=\"\"\"one\"\"\" Q=\"two\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\"one \"\"two\"\"\" Q=\"three\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + cmd = "P=\"\"\"one\"\" two\" Q=\"three\""; + r = MsiInstallProductA(msifile, cmd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + DeleteFile(msifile); + RemoveDirectory("msitest"); +} + +static void test_upgrade_code(void) +{ + UINT r; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + + CreateDirectoryA("msitest", NULL); + create_file("msitest\\upgradecode.txt", 1000); + create_database(msifile, uc_tables, sizeof(uc_tables) / sizeof(msi_table)); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(pf_exists("msitest\\upgradecode.txt"), "file not installed\n"); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(!delete_pf("msitest\\upgradecode.txt", TRUE), "file not removed\n"); + ok(!delete_pf("msitest", FALSE), "directory not removed\n"); + + DeleteFileA("msitest\\upgradecode.txt"); + RemoveDirectoryA("msitest"); + DeleteFile(msifile); +} + +static void test_MsiGetFeatureInfo(void) +{ + UINT r; + MSIHANDLE package; + char title[32], help[32], path[MAX_PATH]; + DWORD attrs, title_len, help_len; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + create_database( msifile, tables, sizeof(tables) / sizeof(tables[0]) ); + + strcpy( path, CURR_DIR ); + strcat( path, "\\" ); + strcat( path, msifile ); + + r = MsiOpenPackage( path, &package ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFileA( msifile ); + return; + } + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + r = MsiGetFeatureInfoA( 0, NULL, NULL, NULL, NULL, NULL, NULL ); + ok(r == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", r); + + r = MsiGetFeatureInfoA( package, NULL, NULL, NULL, NULL, NULL, NULL ); + ok(r == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", r); + + r = MsiGetFeatureInfoA( package, "", NULL, NULL, NULL, NULL, NULL ); + ok(r == ERROR_UNKNOWN_FEATURE, "expected ERROR_UNKNOWN_FEATURE, got %u\n", r); + + r = MsiGetFeatureInfoA( package, "One", NULL, NULL, NULL, NULL, NULL ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + r = MsiGetFeatureInfoA( 0, "One", NULL, NULL, NULL, NULL, NULL ); + ok(r == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %u\n", r); + + title_len = help_len = 0; + r = MsiGetFeatureInfoA( package, "One", NULL, NULL, &title_len, NULL, &help_len ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + ok(title_len == 3, "expected 3, got %u\n", title_len); + ok(help_len == 15, "expected 15, got %u\n", help_len); + + title[0] = help[0] = 0; + title_len = help_len = 0; + r = MsiGetFeatureInfoA( package, "One", NULL, title, &title_len, help, &help_len ); + ok(r == ERROR_MORE_DATA, "expected ERROR_MORE_DATA, got %u\n", r); + ok(title_len == 3, "expected 3, got %u\n", title_len); + ok(help_len == 15, "expected 15, got %u\n", help_len); + + attrs = 0; + title[0] = help[0] = 0; + title_len = sizeof(title); + help_len = sizeof(help); + r = MsiGetFeatureInfoA( package, "One", &attrs, title, &title_len, help, &help_len ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORLOCAL, "expected INSTALLFEATUREATTRIBUTE_FAVORLOCAL, got %u\n", attrs); + ok(title_len == 3, "expected 3, got %u\n", title_len); + ok(help_len == 15, "expected 15, got %u\n", help_len); + ok(!strcmp(title, "One"), "expected \"One\", got \"%s\"\n", title); + ok(!strcmp(help, "The One Feature"), "expected \"The One Feature\", got \"%s\"\n", help); + + attrs = 0; + title[0] = help[0] = 0; + title_len = sizeof(title); + help_len = sizeof(help); + r = MsiGetFeatureInfoA( package, "feature", &attrs, title, &title_len, help, &help_len ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORLOCAL, "expected INSTALLFEATUREATTRIBUTE_FAVORLOCAL, got %u\n", attrs); + ok(!title_len, "expected 0, got %u\n", title_len); + ok(!help_len, "expected 0, got %u\n", help_len); + ok(!title[0], "expected \"\", got \"%s\"\n", title); + ok(!help[0], "expected \"\", got \"%s\"\n", help); + + MsiCloseHandle( package ); + DeleteFileA( msifile ); +} + +static void test_MsiSetFeatureAttributes(void) +{ + UINT r; + DWORD attrs; + char path[MAX_PATH]; + MSIHANDLE package; + + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + create_database( msifile, tables, sizeof(tables) / sizeof(tables[0]) ); + + strcpy( path, CURR_DIR ); + strcat( path, "\\" ); + strcat( path, msifile ); + + r = MsiOpenPackage( path, &package ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFileA( msifile ); + return; + } + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL ); + ok(r == ERROR_FUNCTION_FAILED, "Expected ERROR_FUNCTION_FAILED, got %u\n", r); + + r = MsiDoAction( package, "CostInitialize" ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + r = MsiSetFeatureAttributesA( 0, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL ); + ok(r == ERROR_INVALID_HANDLE, "expected ERROR_INVALID_HANDLE, got %u\n", r); + + r = MsiSetFeatureAttributesA( package, "", INSTALLFEATUREATTRIBUTE_FAVORLOCAL ); + ok(r == ERROR_UNKNOWN_FEATURE, "expected ERROR_UNKNOWN_FEATURE, got %u\n", r); + + r = MsiSetFeatureAttributesA( package, NULL, INSTALLFEATUREATTRIBUTE_FAVORLOCAL ); + ok(r == ERROR_UNKNOWN_FEATURE, "expected ERROR_UNKNOWN_FEATURE, got %u\n", r); + + r = MsiSetFeatureAttributesA( package, "One", 0 ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + attrs = 0xdeadbeef; + r = MsiGetFeatureInfoA( package, "One", &attrs, NULL, NULL, NULL, NULL ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORLOCAL, + "expected INSTALLFEATUREATTRIBUTE_FAVORLOCAL, got 0x%08x\n", attrs); + + r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + attrs = 0; + r = MsiGetFeatureInfoA( package, "One", &attrs, NULL, NULL, NULL, NULL ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORLOCAL, + "expected INSTALLFEATUREATTRIBUTE_FAVORLOCAL, got 0x%08x\n", attrs); + + r = MsiDoAction( package, "FileCost" ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORSOURCE ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + attrs = 0; + r = MsiGetFeatureInfoA( package, "One", &attrs, NULL, NULL, NULL, NULL ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + ok(attrs == INSTALLFEATUREATTRIBUTE_FAVORSOURCE, + "expected INSTALLFEATUREATTRIBUTE_FAVORSOURCE, got 0x%08x\n", attrs); + + r = MsiDoAction( package, "CostFinalize" ); + ok(r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + + r = MsiSetFeatureAttributesA( package, "One", INSTALLFEATUREATTRIBUTE_FAVORLOCAL ); + ok(r == ERROR_FUNCTION_FAILED, "expected ERROR_FUNCTION_FAILED, got %u\n", r); + + MsiCloseHandle( package ); + DeleteFileA( msifile ); } START_TEST(install) @@ -9512,7 +6627,8 @@ START_TEST(install) init_functionpointers(); - on_win9x = check_win9x(); + if (pIsWow64Process) + pIsWow64Process(GetCurrentProcess(), &is_wow64); GetCurrentDirectoryA(MAX_PATH, prev_path); GetTempPath(MAX_PATH, temp_path); @@ -9524,13 +6640,16 @@ START_TEST(install) if(len && (CURR_DIR[len - 1] == '\\')) CURR_DIR[len - 1] = 0; - get_system_dirs(); - get_user_dirs(); + ok(get_system_dirs(), "failed to retrieve system dirs\n"); + ok(get_user_dirs(), "failed to retrieve user dirs\n"); /* Create a restore point ourselves so we circumvent the multitude of restore points * that would have been created by all the installation and removal tests. + * + * This is not needed on version 5.0 where setting MSIFASTINSTALL prevents the + * creation of restore points. */ - if (pSRSetRestorePointA) + if (pSRSetRestorePointA && !pMsiGetComponentPathExA) { memset(&status, 0, sizeof(status)); ret = notify_system_change(BEGIN_NESTED_SYSTEM_CHANGE, &status); @@ -9559,22 +6678,11 @@ START_TEST(install) test_cabisextracted(); test_concurrentinstall(); test_setpropertyfolder(); - test_publish_registerproduct(); - test_publish_publishproduct(); - test_publish_publishfeatures(); - test_publish_registeruser(); - test_publish_processcomponents(); - test_publish(); - test_publishsourcelist(); test_transformprop(); test_currentworkingdir(); test_admin(); test_adminprops(); - test_removefiles(); - test_movefiles(); test_missingcab(); - test_duplicatefiles(); - test_writeregistryvalues(); test_sourcefolder(); test_customaction51(); test_installstate(); @@ -9586,7 +6694,6 @@ START_TEST(install) test_propcase(); test_int_widths(); test_shortcut(); - test_envvar(); test_lastusedsource(); test_preselected(); test_installed_prop(); @@ -9595,30 +6702,17 @@ START_TEST(install) test_MsiSetExternalUI(); test_allusers_prop(); test_feature_override(); - test_create_folder(); - test_remove_folder(); - test_start_services(); - test_delete_services(); - test_self_registration(); - test_register_font(); - test_validate_product_id(); - test_install_remove_odbc(); - test_register_typelib(); - test_create_remove_shortcut(); - test_publish_components(); - test_remove_duplicate_files(); - test_remove_registry_values(); - test_find_related_products(); - test_remove_ini_values(); - test_remove_env_strings(); - test_register_class_info(); - test_register_extension_info(); - test_register_mime_info(); test_icon_table(); + test_sourcedir_props(); + test_package_validation(); + test_command_line_parsing(); + test_upgrade_code(); + test_MsiGetFeatureInfo(); + test_MsiSetFeatureAttributes(); DeleteFileA(log_file); - if (pSRSetRestorePointA && ret) + if (pSRSetRestorePointA && !pMsiGetComponentPathExA && ret) { ret = notify_system_change(END_NESTED_SYSTEM_CHANGE, &status); if (ret) diff --git a/rostests/winetests/msi/msi.c b/rostests/winetests/msi/msi.c index b377320131e..6ba0e115f6b 100644 --- a/rostests/winetests/msi/msi.c +++ b/rostests/winetests/msi/msi.c @@ -29,9 +29,12 @@ #include "wine/test.h" +static BOOL is_wow64; static const char msifile[] = "winetest.msi"; static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*); +static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD); +static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); static INSTALLSTATE (WINAPI *pMsiGetComponentPathA) (LPCSTR, LPCSTR, LPSTR, DWORD*); @@ -57,6 +60,7 @@ static void init_functionpointers(void) { HMODULE hmsi = GetModuleHandleA("msi.dll"); HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll"); + HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); #define GET_PROC(dll, func) \ p ## func = (void *)GetProcAddress(dll, #func); \ @@ -74,6 +78,8 @@ static void init_functionpointers(void) GET_PROC(hmsi, MsiGetPatchInfoExA) GET_PROC(hadvapi32, ConvertSidToStringSidA) + GET_PROC(hadvapi32, RegDeleteKeyExA) + GET_PROC(hkernel32, IsWow64Process) #undef GET_PROC } @@ -223,6 +229,13 @@ static void test_usefeature(void) ok( r == INSTALLSTATE_INVALIDARG, "wrong return val\n"); } +static LONG delete_key( HKEY key, LPCSTR subkey, REGSAM access ) +{ + if (pRegDeleteKeyExA) + return pRegDeleteKeyExA( key, subkey, access, 0 ); + return RegDeleteKeyA( key, subkey ); +} + static void test_null(void) { MSIHANDLE hpkg; @@ -231,6 +244,10 @@ static void test_null(void) DWORD dwType, cbData; LPBYTE lpData = NULL; INSTALLSTATE state; + REGSAM access = KEY_ALL_ACCESS; + + if (is_wow64) + access |= KEY_WOW64_64KEY; r = pMsiOpenPackageExW(NULL, 0, &hpkg); ok( r == ERROR_INVALID_PARAMETER,"wrong error\n"); @@ -257,7 +274,12 @@ static void test_null(void) * necessary registry values */ /* empty product string */ - r = RegOpenKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", &hkey); + r = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", 0, access, &hkey); + if (r == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + return; + } ok( r == ERROR_SUCCESS, "wrong error %d\n", r); r = RegQueryValueExA(hkey, NULL, 0, &dwType, lpData, &cbData); @@ -275,6 +297,13 @@ static void test_null(void) } r = RegSetValueA(hkey, NULL, REG_SZ, "test", strlen("test")); + if (r == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + HeapFree(GetProcessHeap(), 0, lpData); + RegCloseKey(hkey); + return; + } ok( r == ERROR_SUCCESS, "wrong error %d\n", r); r = MsiGetProductInfoA("", "", NULL, NULL); @@ -297,7 +326,8 @@ static void test_null(void) ok( r == ERROR_SUCCESS, "wrong error %d\n", r); /* empty attribute */ - r = RegCreateKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{F1C3AF50-8B56-4A69-A00C-00773FE42F30}", &hkey); + r = RegCreateKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{F1C3AF50-8B56-4A69-A00C-00773FE42F30}", + 0, NULL, 0, access, NULL, &hkey, NULL); ok( r == ERROR_SUCCESS, "wrong error %d\n", r); r = RegSetValueA(hkey, NULL, REG_SZ, "test", strlen("test")); @@ -309,7 +339,8 @@ static void test_null(void) r = RegCloseKey(hkey); ok( r == ERROR_SUCCESS, "wrong error %d\n", r); - r = RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{F1C3AF50-8B56-4A69-A00C-00773FE42F30}"); + r = delete_key(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{F1C3AF50-8B56-4A69-A00C-00773FE42F30}", + access & KEY_WOW64_64KEY); ok( r == ERROR_SUCCESS, "wrong error %d\n", r); } @@ -453,9 +484,7 @@ static void test_MsiGetFileHash(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ret = memcmp(&hash, &hash_data[i].hash, HASHSIZE); - ok(ret == 0 || - broken(ret != 0), /* win95 */ - "Hash incorrect\n"); + ok(!ret, "Hash incorrect\n"); DeleteFile(name); } @@ -513,23 +542,23 @@ static void create_test_guid(LPSTR prodcode, LPSTR squashed) WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL); } -static void get_user_sid(LPSTR *usersid) +static char *get_user_sid(void) { HANDLE token; - DWORD size; - PTOKEN_USER user; + DWORD size = 0; + TOKEN_USER *user; + char *usersid = NULL; OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token); - - size = 0; GetTokenInformation(token, TokenUser, NULL, size, &size); + user = HeapAlloc(GetProcessHeap(), 0, size); - GetTokenInformation(token, TokenUser, user, size, &size); - pConvertSidToStringSidA(user->User.Sid, usersid); - + pConvertSidToStringSidA(user->User.Sid, &usersid); HeapFree(GetProcessHeap(), 0, user); + CloseHandle(token); + return usersid; } static void test_MsiQueryProductState(void) @@ -542,39 +571,66 @@ static void test_MsiQueryProductState(void) LONG res; HKEY userkey, localkey, props; HKEY prodkey; - DWORD data; + DWORD data, error; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(prodcode, prod_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* NULL prodcode */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(NULL); + error = GetLastError(); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* empty prodcode */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(""); + error = GetLastError(); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* garbage prodcode */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA("garbage"); + error = GetLastError(); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* guid without brackets */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA("6700E8CF-95AB-4D9C-BC2C-15840DEA7A5D"); + error = GetLastError(); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* guid with brackets */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA("{6700E8CF-95AB-4D9C-BC2C-15840DEA7A5D}"); + error = GetLastError(); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); /* same length as guid, but random */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA("A938G02JF-2NF3N93-VN3-2NNF-3KGKALDNF93"); + error = GetLastError(); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* MSIINSTALLCONTEXT_USERUNMANAGED */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(prodcode); + error = GetLastError(); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); @@ -583,75 +639,114 @@ static void test_MsiQueryProductState(void) ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user product key exists */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(prodcode); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"); lstrcatA(keypath, prodcode); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + RegDeleteKeyA(userkey, ""); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local uninstall key exists */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(prodcode); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); data = 1; res = RegSetValueExA(localkey, "WindowsInstaller", 0, REG_DWORD, (const BYTE *)&data, sizeof(DWORD)); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* WindowsInstaller value exists */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(prodcode); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); RegDeleteValueA(localkey, "WindowsInstaller"); - RegDeleteKeyA(localkey, ""); + delete_key(localkey, "", access & KEY_WOW64_64KEY); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); lstrcatA(keypath, usersid); lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local product key exists */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(prodcode); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); - res = RegCreateKeyA(localkey, "InstallProperties", &props); + res = RegCreateKeyExA(localkey, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* install properties key exists */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(prodcode); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); data = 1; res = RegSetValueExA(props, "WindowsInstaller", 0, REG_DWORD, (const BYTE *)&data, sizeof(DWORD)); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* WindowsInstaller value exists */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(prodcode); + error = GetLastError(); ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); data = 2; res = RegSetValueExA(props, "WindowsInstaller", 0, REG_DWORD, (const BYTE *)&data, sizeof(DWORD)); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* WindowsInstaller value is not 1 */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(prodcode); + error = GetLastError(); ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); RegDeleteKeyA(userkey, ""); /* user product key does not exist */ + SetLastError(0xdeadbeef); state = MsiQueryProductStateA(prodcode); + error = GetLastError(); ok(state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); RegDeleteValueA(props, "WindowsInstaller"); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(localkey, ""); + delete_key(localkey, "", access & KEY_WOW64_64KEY); RegCloseKey(localkey); RegDeleteKeyA(userkey, ""); RegCloseKey(userkey); @@ -663,7 +758,7 @@ static void test_MsiQueryProductState(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryProductStateA(prodcode); @@ -675,14 +770,14 @@ static void test_MsiQueryProductState(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryProductStateA(prodcode); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); - res = RegCreateKeyA(localkey, "InstallProperties", &props); + res = RegCreateKeyExA(localkey, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryProductStateA(prodcode); @@ -698,11 +793,11 @@ static void test_MsiQueryProductState(void) ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); RegDeleteValueA(props, "WindowsInstaller"); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(localkey, ""); + delete_key(localkey, "", access & KEY_WOW64_64KEY); RegCloseKey(localkey); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); /* MSIINSTALLCONTEXT_MACHINE */ @@ -710,7 +805,7 @@ static void test_MsiQueryProductState(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryProductStateA(prodcode); @@ -720,14 +815,14 @@ static void test_MsiQueryProductState(void) lstrcatA(keypath, "S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryProductStateA(prodcode); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); - res = RegCreateKeyA(localkey, "InstallProperties", &props); + res = RegCreateKeyExA(localkey, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryProductStateA(prodcode); @@ -743,11 +838,11 @@ static void test_MsiQueryProductState(void) ok(state == INSTALLSTATE_DEFAULT, "Expected INSTALLSTATE_DEFAULT, got %d\n", state); RegDeleteValueA(props, "WindowsInstaller"); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(localkey, ""); + delete_key(localkey, "", access & KEY_WOW64_64KEY); RegCloseKey(localkey); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); LocalFree(usersid); @@ -817,47 +912,82 @@ static void test_MsiQueryFeatureState(void) INSTALLSTATE state; LPSTR usersid; LONG res; + REGSAM access = KEY_ALL_ACCESS; + DWORD error; create_test_guid(prodcode, prod_squashed); compose_base85_guid(component, comp_base85, comp_squashed); compose_base85_guid(component, comp_base85 + 20, comp_squashed2); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* NULL prodcode */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(NULL, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* empty prodcode */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA("", "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* garbage prodcode */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA("garbage", "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* guid without brackets */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA("6700E8CF-95AB-4D9C-BC2C-15840DEA7A5D", "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* guid with brackets */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA("{6700E8CF-95AB-4D9C-BC2C-15840DEA7A5D}", "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_ALREADY_EXISTS) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); /* same length as guid, but random */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA("A938G02JF-2NF3N93-VN3-2NNF-3KGKALDNF93", "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* NULL szFeature */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, NULL); + error = GetLastError(); ok(state == INSTALLSTATE_INVALIDARG, "Expected INSTALLSTATE_INVALIDARG, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* empty szFeature */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, ""); + error = GetLastError(); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); /* feature key does not exist yet */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); /* MSIINSTALLCONTEXT_USERUNMANAGED */ @@ -868,15 +998,23 @@ static void test_MsiQueryFeatureState(void) ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* feature key exists */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(userkey, "feature", 0, REG_SZ, (const BYTE *)"", 2); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* feature value exists */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); lstrcatA(keypath, usersid); @@ -884,43 +1022,71 @@ static void test_MsiQueryFeatureState(void) lstrcatA(keypath, prod_squashed); lstrcatA(keypath, "\\Features"); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + RegDeleteKeyA(userkey, ""); + RegCloseKey(userkey); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* userdata features key exists */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)"aaaaaaaaaaaaaaaaaaa", 20); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_BADCONFIG, "Expected INSTALLSTATE_BADCONFIG, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)"aaaaaaaaaaaaaaaaaaaa", 21); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)"aaaaaaaaaaaaaaaaaaaaa", 22); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(localkey, "feature", 0, REG_SZ, (const BYTE *)comp_base85, 41); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); lstrcatA(keypath, usersid); lstrcatA(keypath, "\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); @@ -928,63 +1094,95 @@ static void test_MsiQueryFeatureState(void) lstrcatA(keypath, "\\Components\\"); lstrcatA(keypath, comp_squashed2); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey2); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey2, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"", 1); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"apple", 6); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_ADVERTISED, "Expected INSTALLSTATE_ADVERTISED, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(compkey2, prod_squashed, 0, REG_SZ, (const BYTE *)"orange", 7); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* INSTALLSTATE_LOCAL */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"01\\", 4); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* INSTALLSTATE_SOURCE */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"01", 3); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* bad INSTALLSTATE_SOURCE */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"01a", 4); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* INSTALLSTATE_SOURCE */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"01", 3); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* bad INSTALLSTATE_SOURCE */ + SetLastError(0xdeadbeef); state = MsiQueryFeatureStateA(prodcode, "feature"); + error = GetLastError(); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(error == ERROR_SUCCESS || broken(error == ERROR_NO_TOKEN) /* win2k */, + "expected ERROR_SUCCESS, got %u\n", error); RegDeleteValueA(compkey, prod_squashed); RegDeleteValueA(compkey2, prod_squashed); - RegDeleteKeyA(compkey, ""); - RegDeleteKeyA(compkey2, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); + delete_key(compkey2, "", access & KEY_WOW64_64KEY); RegDeleteValueA(localkey, "feature"); RegDeleteValueA(userkey, "feature"); RegDeleteKeyA(userkey, ""); @@ -1000,7 +1198,7 @@ static void test_MsiQueryFeatureState(void) lstrcatA(keypath, "\\Installer\\Features\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* feature key exists */ @@ -1020,7 +1218,7 @@ static void test_MsiQueryFeatureState(void) lstrcatA(keypath, prod_squashed); lstrcatA(keypath, "\\Features"); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* userdata features key exists */ @@ -1056,7 +1254,7 @@ static void test_MsiQueryFeatureState(void) lstrcatA(keypath, "\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); @@ -1064,7 +1262,7 @@ static void test_MsiQueryFeatureState(void) lstrcatA(keypath, "\\Components\\"); lstrcatA(keypath, comp_squashed2); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey2); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey2, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryFeatureStateA(prodcode, "feature"); @@ -1090,11 +1288,11 @@ static void test_MsiQueryFeatureState(void) RegDeleteValueA(compkey, prod_squashed); RegDeleteValueA(compkey2, prod_squashed); - RegDeleteKeyA(compkey, ""); - RegDeleteKeyA(compkey2, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); + delete_key(compkey2, "", access & KEY_WOW64_64KEY); RegDeleteValueA(localkey, "feature"); RegDeleteValueA(userkey, "feature"); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access & KEY_WOW64_64KEY); RegCloseKey(compkey); RegCloseKey(compkey2); RegCloseKey(localkey); @@ -1105,7 +1303,7 @@ static void test_MsiQueryFeatureState(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Features\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* feature key exists */ @@ -1124,7 +1322,7 @@ static void test_MsiQueryFeatureState(void) lstrcatA(keypath, prod_squashed); lstrcatA(keypath, "\\Features"); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* userdata features key exists */ @@ -1159,14 +1357,14 @@ static void test_MsiQueryFeatureState(void) lstrcatA(keypath, "S-1-5-18\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); lstrcatA(keypath, "S-1-5-18\\Components\\"); lstrcatA(keypath, comp_squashed2); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey2); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey2, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MsiQueryFeatureStateA(prodcode, "feature"); @@ -1192,11 +1390,11 @@ static void test_MsiQueryFeatureState(void) RegDeleteValueA(compkey, prod_squashed); RegDeleteValueA(compkey2, prod_squashed); - RegDeleteKeyA(compkey, ""); - RegDeleteKeyA(compkey2, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); + delete_key(compkey2, "", access & KEY_WOW64_64KEY); RegDeleteValueA(localkey, "feature"); RegDeleteValueA(userkey, "feature"); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access & KEY_WOW64_64KEY); RegCloseKey(compkey); RegCloseKey(compkey2); RegCloseKey(localkey); @@ -1217,6 +1415,8 @@ static void test_MsiQueryComponentState(void) LPSTR usersid; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; + DWORD error; static const INSTALLSTATE MAGIC_ERROR = 0xdeadbeef; @@ -1228,61 +1428,94 @@ static void test_MsiQueryComponentState(void) create_test_guid(prodcode, prod_squashed); compose_base85_guid(component, comp_base85, comp_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* NULL szProductCode */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(NULL, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(state == MAGIC_ERROR, "Expected 0xdeadbeef, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* empty szProductCode */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA("", NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(state == MAGIC_ERROR, "Expected 0xdeadbeef, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* random szProductCode */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA("random", NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(state == MAGIC_ERROR, "Expected 0xdeadbeef, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* GUID-length szProductCode */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA("DJANE93KNDNAS-2KN2NR93KMN3LN13=L1N3KDE", NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(state == MAGIC_ERROR, "Expected 0xdeadbeef, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* GUID-length with brackets */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA("{JANE93KNDNAS-2KN2NR93KMN3LN13=L1N3KD}", NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(state == MAGIC_ERROR, "Expected 0xdeadbeef, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* actual GUID */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(state == MAGIC_ERROR, "Expected 0xdeadbeef, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(state == MAGIC_ERROR, "Expected 0xdeadbeef, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); /* create local system product key */ @@ -1290,101 +1523,130 @@ static void test_MsiQueryComponentState(void) lstrcatA(keypath, prod_squashed); lstrcatA(keypath, "\\InstallProperties"); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local system product key exists */ state = MAGIC_ERROR; r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(state == MAGIC_ERROR, "Expected 0xdeadbeef, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); res = RegSetValueExA(prodkey, "LocalPackage", 0, REG_SZ, (const BYTE *)"msitest.msi", 11); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* LocalPackage value exists */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\S-1-5-18\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* component key exists */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"", 0); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* component\product exists */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + error = GetLastError(); ok(state == INSTALLSTATE_NOTUSED || state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_NOTUSED or INSTALLSTATE_LOCAL, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); /* NULL component, product exists */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, NULL, &state); + error = GetLastError(); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); ok(state == MAGIC_ERROR, "Expected state not changed, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"hi", 2); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* INSTALLSTATE_LOCAL */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"01\\", 4); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* INSTALLSTATE_SOURCE */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"01", 3); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* bad INSTALLSTATE_SOURCE */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"01a", 4); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* INSTALLSTATE_SOURCE */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); res = RegSetValueExA(compkey, prod_squashed, 0, REG_SZ, (const BYTE *)"01", 3); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* bad INSTALLSTATE_SOURCE */ state = MAGIC_ERROR; + SetLastError(0xdeadbeef); r = pMsiQueryComponentStateA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, component, &state); + error = GetLastError(); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok(error == 0xdeadbeef, "expected 0xdeadbeef, got %u\n", error); RegDeleteValueA(prodkey, "LocalPackage"); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegDeleteValueA(compkey, prod_squashed); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); RegCloseKey(compkey); @@ -1415,7 +1677,7 @@ static void test_MsiQueryComponentState(void) lstrcatA(keypath, prod_squashed); lstrcatA(keypath, "\\InstallProperties"); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = RegSetValueExA(prodkey, "LocalPackage", 0, REG_SZ, (const BYTE *)"msitest.msi", 11); @@ -1433,7 +1695,7 @@ static void test_MsiQueryComponentState(void) lstrcatA(keypath, "\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* component key exists */ @@ -1486,7 +1748,7 @@ static void test_MsiQueryComponentState(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); state = MAGIC_ERROR; @@ -1494,7 +1756,7 @@ static void test_MsiQueryComponentState(void) ok(r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r); ok(state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); @@ -1503,7 +1765,7 @@ static void test_MsiQueryComponentState(void) lstrcatA(keypath, prod_squashed); lstrcatA(keypath, "\\InstallProperties"); - res = RegOpenKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = RegSetValueExA(prodkey, "ManagedLocalPackage", 0, REG_SZ, (const BYTE *)"msitest.msi", 11); @@ -1516,9 +1778,9 @@ static void test_MsiQueryComponentState(void) RegDeleteValueA(prodkey, "LocalPackage"); RegDeleteValueA(prodkey, "ManagedLocalPackage"); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegDeleteValueA(compkey, prod_squashed); - RegDeleteKeyA(compkey, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); RegCloseKey(compkey); LocalFree(usersid); @@ -1537,11 +1799,15 @@ static void test_MsiGetComponentPath(void) INSTALLSTATE state; LPSTR usersid; DWORD size, val; + REGSAM access = KEY_ALL_ACCESS; LONG res; create_test_guid(prodcode, prod_squashed); compose_base85_guid(component, comp_base85, comp_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* NULL szProduct */ size = MAX_PATH; @@ -1597,7 +1863,13 @@ static void test_MsiGetComponentPath(void) lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local system component key exists */ @@ -1634,7 +1906,7 @@ static void test_MsiGetComponentPath(void) lstrcatA(keypath, prod_squashed); lstrcatA(keypath, "\\InstallProperties"); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &installprop); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &installprop, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); val = 1; @@ -1674,9 +1946,9 @@ static void test_MsiGetComponentPath(void) ok(size == 10, "Expected 10, got %d\n", size); RegDeleteValueA(compkey, prod_squashed); - RegDeleteKeyA(compkey, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); RegDeleteValueA(installprop, "WindowsInstaller"); - RegDeleteKeyA(installprop, ""); + delete_key(installprop, "", access & KEY_WOW64_64KEY); RegCloseKey(compkey); RegCloseKey(installprop); DeleteFileA("C:\\imapath"); @@ -1687,7 +1959,7 @@ static void test_MsiGetComponentPath(void) lstrcatA(keypath, "\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user managed component key exists */ @@ -1724,7 +1996,7 @@ static void test_MsiGetComponentPath(void) lstrcatA(keypath, prod_squashed); lstrcatA(keypath, "\\InstallProperties"); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &installprop); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &installprop, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); val = 1; @@ -1764,9 +2036,9 @@ static void test_MsiGetComponentPath(void) ok(size == 10, "Expected 10, got %d\n", size); RegDeleteValueA(compkey, prod_squashed); - RegDeleteKeyA(compkey, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); RegDeleteValueA(installprop, "WindowsInstaller"); - RegDeleteKeyA(installprop, ""); + delete_key(installprop, "", access & KEY_WOW64_64KEY); RegCloseKey(compkey); RegCloseKey(installprop); DeleteFileA("C:\\imapath"); @@ -1777,7 +2049,7 @@ static void test_MsiGetComponentPath(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user managed product key exists */ @@ -1797,7 +2069,7 @@ static void test_MsiGetComponentPath(void) lstrcatA(keypath, "\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user managed component key exists */ @@ -1834,7 +2106,7 @@ static void test_MsiGetComponentPath(void) lstrcatA(keypath, prod_squashed); lstrcatA(keypath, "\\InstallProperties"); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &installprop); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &installprop, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); val = 1; @@ -1874,10 +2146,10 @@ static void test_MsiGetComponentPath(void) ok(size == 10, "Expected 10, got %d\n", size); RegDeleteValueA(compkey, prod_squashed); - RegDeleteKeyA(prodkey, ""); - RegDeleteKeyA(compkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); + delete_key(compkey, "", access & KEY_WOW64_64KEY); RegDeleteValueA(installprop, "WindowsInstaller"); - RegDeleteKeyA(installprop, ""); + delete_key(installprop, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); RegCloseKey(compkey); RegCloseKey(installprop); @@ -1906,7 +2178,7 @@ static void test_MsiGetComponentPath(void) lstrcatA(keypath, "\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user unmanaged component key exists */ @@ -1957,7 +2229,7 @@ static void test_MsiGetComponentPath(void) RegDeleteValueA(compkey, prod_squashed); RegDeleteKeyA(prodkey, ""); - RegDeleteKeyA(compkey, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); RegCloseKey(compkey); DeleteFileA("C:\\imapath"); @@ -1965,7 +2237,7 @@ static void test_MsiGetComponentPath(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local classes product key exists */ @@ -1983,7 +2255,7 @@ static void test_MsiGetComponentPath(void) lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local user component key exists */ @@ -2033,8 +2305,8 @@ static void test_MsiGetComponentPath(void) ok(size == 10, "Expected 10, got %d\n", size); RegDeleteValueA(compkey, prod_squashed); - RegDeleteKeyA(prodkey, ""); - RegDeleteKeyA(compkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); + delete_key(compkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); RegCloseKey(compkey); DeleteFileA("C:\\imapath"); @@ -2056,11 +2328,15 @@ static void test_MsiGetProductCode(void) LPSTR usersid; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(prodcode, prod_squashed); create_test_guid(prodcode2, prod2_squashed); compose_base85_guid(component, comp_base85, comp_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* szComponent is NULL */ lstrcpyA(product, "prod"); @@ -2110,7 +2386,13 @@ static void test_MsiGetProductCode(void) lstrcatA(keypath, "\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user unmanaged component key exists */ @@ -2137,7 +2419,7 @@ static void test_MsiGetProductCode(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user managed product key of first product exists */ @@ -2146,7 +2428,7 @@ static void test_MsiGetProductCode(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(product, prodcode), "Expected %s, got %s\n", prodcode, product); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); @@ -2167,7 +2449,7 @@ static void test_MsiGetProductCode(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local classes product key exists */ @@ -2176,7 +2458,7 @@ static void test_MsiGetProductCode(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(product, prodcode), "Expected %s, got %s\n", prodcode, product); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); @@ -2185,7 +2467,7 @@ static void test_MsiGetProductCode(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod2_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user managed product key of second product exists */ @@ -2194,18 +2476,18 @@ static void test_MsiGetProductCode(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(product, prodcode2), "Expected %s, got %s\n", prodcode2, product); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); RegDeleteValueA(compkey, prod_squashed); RegDeleteValueA(compkey, prod2_squashed); - RegDeleteKeyA(compkey, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); RegCloseKey(compkey); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local user component key exists */ @@ -2232,7 +2514,7 @@ static void test_MsiGetProductCode(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user managed product key of first product exists */ @@ -2241,7 +2523,7 @@ static void test_MsiGetProductCode(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(product, prodcode), "Expected %s, got %s\n", prodcode, product); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); @@ -2262,7 +2544,7 @@ static void test_MsiGetProductCode(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local classes product key exists */ @@ -2271,7 +2553,7 @@ static void test_MsiGetProductCode(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(product, prodcode), "Expected %s, got %s\n", prodcode, product); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); @@ -2280,7 +2562,7 @@ static void test_MsiGetProductCode(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod2_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user managed product key of second product exists */ @@ -2289,11 +2571,11 @@ static void test_MsiGetProductCode(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(product, prodcode2), "Expected %s, got %s\n", prodcode2, product); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); RegDeleteValueA(compkey, prod_squashed); RegDeleteValueA(compkey, prod2_squashed); - RegDeleteKeyA(compkey, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); RegCloseKey(compkey); LocalFree(usersid); } @@ -2313,11 +2595,15 @@ static void test_MsiEnumClients(void) LPSTR usersid; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(prodcode, prod_squashed); create_test_guid(prodcode2, prod2_squashed); compose_base85_guid(component, comp_base85, comp_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* NULL szComponent */ product[0] = '\0'; @@ -2347,7 +2633,13 @@ static void test_MsiEnumClients(void) lstrcatA(keypath, "\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user unmanaged component key exists */ @@ -2410,14 +2702,14 @@ static void test_MsiEnumClients(void) RegDeleteValueA(compkey, prod_squashed); RegDeleteValueA(compkey, prod2_squashed); - RegDeleteKeyA(compkey, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); RegCloseKey(compkey); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Components\\"); lstrcatA(keypath, comp_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &compkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &compkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user local component key exists */ @@ -2480,7 +2772,7 @@ static void test_MsiEnumClients(void) RegDeleteValueA(compkey, prod_squashed); RegDeleteValueA(compkey, prod2_squashed); - RegDeleteKeyA(compkey, ""); + delete_key(compkey, "", access & KEY_WOW64_64KEY); RegCloseKey(compkey); LocalFree(usersid); } @@ -2753,10 +3045,14 @@ static void test_MsiGetProductInfo(void) CHAR keypath[MAX_PATH]; LPSTR usersid; DWORD sz, val = 42; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(prodcode, prod_squashed); create_test_guid(packcode, pack_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* NULL szProduct */ sz = MAX_PATH; @@ -2856,7 +3152,13 @@ static void test_MsiGetProductInfo(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* managed product code exists */ @@ -2868,7 +3170,7 @@ static void test_MsiGetProductInfo(void) ok(!lstrcmpA(buf, "apple"), "Expected buf to be unchanged, got %s\n", buf); ok(sz == MAX_PATH, "Expected MAX_PATH, got %d\n", sz); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\"); @@ -2876,7 +3178,7 @@ static void test_MsiGetProductInfo(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local user product code exists */ @@ -2893,7 +3195,7 @@ static void test_MsiGetProductInfo(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* both local and managed product code exist */ @@ -2905,7 +3207,7 @@ static void test_MsiGetProductInfo(void) ok(!lstrcmpA(buf, "apple"), "Expected buf to be unchanged, got %s\n", buf); ok(sz == MAX_PATH, "Expected MAX_PATH, got %d\n", sz); - res = RegCreateKeyA(localkey, "InstallProperties", &propkey); + res = RegCreateKeyExA(localkey, "InstallProperties", 0, NULL, 0, access, NULL, &propkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -2974,9 +3276,9 @@ static void test_MsiGetProductInfo(void) RegDeleteValueA(propkey, "IMadeThis"); RegDeleteValueA(propkey, "HelpLink"); - RegDeleteKeyA(propkey, ""); - RegDeleteKeyA(localkey, ""); - RegDeleteKeyA(prodkey, ""); + delete_key(propkey, "", access & KEY_WOW64_64KEY); + delete_key(localkey, "", access & KEY_WOW64_64KEY); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(propkey); RegCloseKey(localkey); RegCloseKey(prodkey); @@ -3001,7 +3303,7 @@ static void test_MsiGetProductInfo(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local user product key exists */ @@ -3013,7 +3315,7 @@ static void test_MsiGetProductInfo(void) ok(!lstrcmpA(buf, "apple"), "Expected \"apple\", got \"%s\"\n", buf); ok(sz == MAX_PATH, "Expected MAX_PATH, got %d\n", sz); - res = RegCreateKeyA(localkey, "InstallProperties", &propkey); + res = RegCreateKeyExA(localkey, "InstallProperties", 0, NULL, 0, access, NULL, &propkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -3036,8 +3338,8 @@ static void test_MsiGetProductInfo(void) ok(sz == 4, "Expected 4, got %d\n", sz); RegDeleteValueA(propkey, "HelpLink"); - RegDeleteKeyA(propkey, ""); - RegDeleteKeyA(localkey, ""); + delete_key(propkey, "", access & KEY_WOW64_64KEY); + delete_key(localkey, "", access & KEY_WOW64_64KEY); RegDeleteKeyA(prodkey, ""); RegCloseKey(propkey); RegCloseKey(localkey); @@ -3046,7 +3348,7 @@ static void test_MsiGetProductInfo(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* classes product key exists */ @@ -3063,7 +3365,7 @@ static void test_MsiGetProductInfo(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local user product key exists */ @@ -3075,7 +3377,7 @@ static void test_MsiGetProductInfo(void) ok(!lstrcmpA(buf, "apple"), "Expected \"apple\", got \"%s\"\n", buf); ok(sz == MAX_PATH, "Expected MAX_PATH, got %d\n", sz); - res = RegCreateKeyA(localkey, "InstallProperties", &propkey); + res = RegCreateKeyExA(localkey, "InstallProperties", 0, NULL, 0, access, NULL, &propkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -3087,8 +3389,8 @@ static void test_MsiGetProductInfo(void) ok(!lstrcmpA(buf, "apple"), "Expected \"apple\", got \"%s\"\n", buf); ok(sz == MAX_PATH, "Expected MAX_PATH, got %d\n", sz); - RegDeleteKeyA(propkey, ""); - RegDeleteKeyA(localkey, ""); + delete_key(propkey, "", access & KEY_WOW64_64KEY); + delete_key(localkey, "", access & KEY_WOW64_64KEY); RegCloseKey(propkey); RegCloseKey(localkey); @@ -3096,7 +3398,7 @@ static void test_MsiGetProductInfo(void) lstrcatA(keypath, "S-1-5-18\\\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Local System product key exists */ @@ -3108,7 +3410,7 @@ static void test_MsiGetProductInfo(void) ok(!lstrcmpA(buf, "apple"), "Expected \"apple\", got \"%s\"\n", buf); ok(sz == MAX_PATH, "Expected MAX_PATH, got %d\n", sz); - res = RegCreateKeyA(localkey, "InstallProperties", &propkey); + res = RegCreateKeyExA(localkey, "InstallProperties", 0, NULL, 0, access, NULL, &propkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -3877,7 +4179,7 @@ static void test_MsiGetProductInfo(void) "Expected buf to be unchanged, got \"%s\"\n", buf); ok(sz == MAX_PATH, "Expected sz to be unchanged, got %d\n", sz); - res = RegCreateKeyA(prodkey, "SourceList", &source); + res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists, but PackageName val does not exist */ @@ -3994,8 +4296,8 @@ static void test_MsiGetProductInfo(void) RegDeleteValueA(propkey, "Version"); RegDeleteValueA(propkey, "ProductIcon"); RegDeleteValueA(propkey, "AuthorizedLUAApp"); - RegDeleteKeyA(propkey, ""); - RegDeleteKeyA(localkey, ""); + delete_key(propkey, "", access & KEY_WOW64_64KEY); + delete_key(localkey, "", access & KEY_WOW64_64KEY); RegDeleteValueA(prodkey, "InstanceType"); RegDeleteValueA(prodkey, "Transforms"); RegDeleteValueA(prodkey, "Language"); @@ -4006,8 +4308,8 @@ static void test_MsiGetProductInfo(void) RegDeleteValueA(prodkey, "ProductIcon"); RegDeleteValueA(prodkey, "AuthorizedLUAApp"); RegDeleteValueA(source, "PackageName"); - RegDeleteKeyA(source, ""); - RegDeleteKeyA(prodkey, ""); + delete_key(source, "", access & KEY_WOW64_64KEY); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(propkey); RegCloseKey(localkey); RegCloseKey(source); @@ -4029,6 +4331,7 @@ static void test_MsiGetProductInfoEx(void) CHAR keypath[MAX_PATH]; LPSTR usersid; DWORD sz; + REGSAM access = KEY_ALL_ACCESS; if (!pMsiGetProductInfoExA) { @@ -4038,7 +4341,10 @@ static void test_MsiGetProductInfoEx(void) create_test_guid(prodcode, prod_squashed); create_test_guid(packcode, pack_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* NULL szProductCode */ sz = MAX_PATH; @@ -4162,7 +4468,13 @@ static void test_MsiGetProductInfoEx(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local user product key exists */ @@ -4176,7 +4488,7 @@ static void test_MsiGetProductInfoEx(void) ok(!lstrcmpA(buf, "apple"), "Expected buf to be unchanged, got %s\n", buf); ok(sz == MAX_PATH, "Expected MAX_PATH, got %d\n", sz); - res = RegCreateKeyA(localkey, "InstallProperties", &propkey); + res = RegCreateKeyExA(localkey, "InstallProperties", 0, NULL, 0, access, NULL, &propkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -4658,7 +4970,7 @@ static void test_MsiGetProductInfoEx(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user product key exists */ @@ -4678,7 +4990,7 @@ static void test_MsiGetProductInfoEx(void) lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_CURRENT_USER, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); sz = MAX_PATH; @@ -4686,7 +4998,14 @@ static void test_MsiGetProductInfoEx(void) r = pMsiGetProductInfoExA(prodcode, usersid, MSIINSTALLCONTEXT_USERUNMANAGED, INSTALLPROPERTY_PRODUCTSTATE, buf, &sz); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(r == ERROR_SUCCESS || broken(r == ERROR_UNKNOWN_PRODUCT), "Expected ERROR_SUCCESS, got %d\n", r); + if (r == ERROR_UNKNOWN_PRODUCT) + { + win_skip("skipping remaining tests for MsiGetProductInfoEx\n"); + delete_key(prodkey, "", access); + RegCloseKey(prodkey); + return; + } ok(!lstrcmpA(buf, "1"), "Expected \"1\", got \"%s\"\n", buf); ok(sz == 1, "Expected 1, got %d\n", sz); @@ -5069,7 +5388,7 @@ static void test_MsiGetProductInfoEx(void) RegDeleteValueA(prodkey, "HelpTelephone"); RegDeleteValueA(prodkey, "HelpLink"); RegDeleteValueA(prodkey, "LocalPackage"); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); /* MSIINSTALLCONTEXT_USERMANAGED */ @@ -5079,7 +5398,7 @@ static void test_MsiGetProductInfoEx(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local user product key exists */ @@ -5093,7 +5412,7 @@ static void test_MsiGetProductInfoEx(void) ok(!lstrcmpA(buf, "apple"), "Expected buf to be unchanged, got %s\n", buf); ok(sz == MAX_PATH, "Expected MAX_PATH, got %d\n", sz); - res = RegCreateKeyA(localkey, "InstallProperties", &propkey); + res = RegCreateKeyExA(localkey, "InstallProperties", 0, NULL, 0, access, NULL, &propkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -5482,9 +5801,9 @@ static void test_MsiGetProductInfoEx(void) RegDeleteValueA(propkey, "HelpTelephone"); RegDeleteValueA(propkey, "HelpLink"); RegDeleteValueA(propkey, "ManagedLocalPackage"); - RegDeleteKeyA(propkey, ""); + delete_key(propkey, "", access & KEY_WOW64_64KEY); RegCloseKey(propkey); - RegDeleteKeyA(localkey, ""); + delete_key(localkey, "", access & KEY_WOW64_64KEY); RegCloseKey(localkey); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); @@ -5492,7 +5811,7 @@ static void test_MsiGetProductInfoEx(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user product key exists */ @@ -5505,7 +5824,7 @@ static void test_MsiGetProductInfoEx(void) ok(!lstrcmpA(buf, "1"), "Expected \"1\", got \"%s\"\n", buf); ok(sz == 1, "Expected 1, got %d\n", sz); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access & KEY_WOW64_64KEY); RegCloseKey(userkey); lstrcpyA(keypath, "Software\\Microsoft\\Installer\\Products\\"); @@ -5544,7 +5863,7 @@ static void test_MsiGetProductInfoEx(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = RegSetValueExA(userkey, "HelpLink", 0, REG_SZ, (LPBYTE)"link", 5); @@ -5925,9 +6244,9 @@ static void test_MsiGetProductInfoEx(void) RegDeleteValueA(userkey, "InstallDate"); RegDeleteValueA(userkey, "HelpTelephone"); RegDeleteValueA(userkey, "HelpLink"); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access & KEY_WOW64_64KEY); RegCloseKey(userkey); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); /* MSIINSTALLCONTEXT_MACHINE */ @@ -5946,7 +6265,7 @@ static void test_MsiGetProductInfoEx(void) lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &localkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &localkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local system product key exists */ @@ -5960,7 +6279,7 @@ static void test_MsiGetProductInfoEx(void) ok(!lstrcmpA(buf, "apple"), "Expected buf to be unchanged, got %s\n", buf); ok(sz == MAX_PATH, "Expected MAX_PATH, got %d\n", sz); - res = RegCreateKeyA(localkey, "InstallProperties", &propkey); + res = RegCreateKeyExA(localkey, "InstallProperties", 0, NULL, 0, access, NULL, &propkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -6349,15 +6668,15 @@ static void test_MsiGetProductInfoEx(void) RegDeleteValueA(propkey, "HelpTelephone"); RegDeleteValueA(propkey, "HelpLink"); RegDeleteValueA(propkey, "LocalPackage"); - RegDeleteKeyA(propkey, ""); + delete_key(propkey, "", access & KEY_WOW64_64KEY); RegCloseKey(propkey); - RegDeleteKeyA(localkey, ""); + delete_key(localkey, "", access & KEY_WOW64_64KEY); RegCloseKey(localkey); lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local classes product key exists */ @@ -6748,7 +7067,7 @@ static void test_MsiGetProductInfoEx(void) RegDeleteValueA(prodkey, "InstallDate"); RegDeleteValueA(prodkey, "HelpTelephone"); RegDeleteValueA(prodkey, "HelpLink"); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); LocalFree(usersid); } @@ -6772,9 +7091,13 @@ static void test_MsiGetUserInfo(void) HKEY prodkey, userprod, props; LPSTR usersid; LONG res; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(prodcode, prod_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* NULL szProduct */ INIT_USERINFO(); @@ -6942,7 +7265,13 @@ static void test_MsiGetUserInfo(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* managed product key exists */ @@ -6963,10 +7292,10 @@ static void test_MsiGetUserInfo(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userprod); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userprod, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - res = RegCreateKeyA(userprod, "InstallProperties", &props); + res = RegCreateKeyExA(userprod, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -7089,11 +7418,11 @@ static void test_MsiGetUserInfo(void) RegDeleteValueA(props, "ProductID"); RegDeleteValueA(props, "RegCompany"); RegDeleteValueA(props, "RegOwner"); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(userprod, ""); + delete_key(userprod, "", access & KEY_WOW64_64KEY); RegCloseKey(userprod); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); /* MSIINSTALLCONTEXT_USERUNMANAGED */ @@ -7123,10 +7452,10 @@ static void test_MsiGetUserInfo(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userprod); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userprod, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - res = RegCreateKeyA(userprod, "InstallProperties", &props); + res = RegCreateKeyExA(userprod, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -7207,9 +7536,9 @@ static void test_MsiGetUserInfo(void) RegDeleteValueA(props, "ProductID"); RegDeleteValueA(props, "RegCompany"); RegDeleteValueA(props, "RegOwner"); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(userprod, ""); + delete_key(userprod, "", access & KEY_WOW64_64KEY); RegCloseKey(userprod); RegDeleteKeyA(prodkey, ""); RegCloseKey(prodkey); @@ -7220,7 +7549,7 @@ static void test_MsiGetUserInfo(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* product key exists */ @@ -7240,10 +7569,10 @@ static void test_MsiGetUserInfo(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userprod); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userprod, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - res = RegCreateKeyA(userprod, "InstallProperties", &props); + res = RegCreateKeyExA(userprod, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -7324,11 +7653,11 @@ static void test_MsiGetUserInfo(void) RegDeleteValueA(props, "ProductID"); RegDeleteValueA(props, "RegCompany"); RegDeleteValueA(props, "RegOwner"); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(userprod, ""); + delete_key(userprod, "", access & KEY_WOW64_64KEY); RegCloseKey(userprod); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); LocalFree(usersid); } @@ -7346,12 +7675,16 @@ static void test_MsiOpenProduct(void) DWORD size; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; GetCurrentDirectoryA(MAX_PATH, path); lstrcatA(path, "\\"); create_test_guid(prodcode, prod_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; hdb = create_package_db(prodcode); MsiCloseHandle(hdb); @@ -7413,7 +7746,13 @@ static void test_MsiOpenProduct(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* managed product key exists */ @@ -7429,7 +7768,7 @@ static void test_MsiOpenProduct(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user product key exists */ @@ -7439,7 +7778,7 @@ static void test_MsiOpenProduct(void) "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(hprod == 0xdeadbeef, "Expected hprod to be unchanged\n"); - res = RegCreateKeyA(userkey, "InstallProperties", &props); + res = RegCreateKeyExA(userkey, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -7470,11 +7809,11 @@ static void test_MsiOpenProduct(void) MsiCloseHandle(hprod); RegDeleteValueA(props, "ManagedLocalPackage"); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access & KEY_WOW64_64KEY); RegCloseKey(userkey); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); /* MSIINSTALLCONTEXT_USERUNMANAGED */ @@ -7498,7 +7837,7 @@ static void test_MsiOpenProduct(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user product key exists */ @@ -7508,7 +7847,7 @@ static void test_MsiOpenProduct(void) "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(hprod == 0xdeadbeef, "Expected hprod to be unchanged\n"); - res = RegCreateKeyA(userkey, "InstallProperties", &props); + res = RegCreateKeyExA(userkey, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -7539,9 +7878,9 @@ static void test_MsiOpenProduct(void) MsiCloseHandle(hprod); RegDeleteValueA(props, "LocalPackage"); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access & KEY_WOW64_64KEY); RegCloseKey(userkey); RegDeleteKeyA(prodkey, ""); RegCloseKey(prodkey); @@ -7551,7 +7890,7 @@ static void test_MsiOpenProduct(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* managed product key exists */ @@ -7565,7 +7904,7 @@ static void test_MsiOpenProduct(void) lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* user product key exists */ @@ -7575,7 +7914,7 @@ static void test_MsiOpenProduct(void) "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(hprod == 0xdeadbeef, "Expected hprod to be unchanged\n"); - res = RegCreateKeyA(userkey, "InstallProperties", &props); + res = RegCreateKeyExA(userkey, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -7612,6 +7951,11 @@ static void test_MsiOpenProduct(void) /* LocalPackage has just the package name */ hprod = 0xdeadbeef; r = MsiOpenProductA(prodcode, &hprod); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_INSTALL_PACKAGE_OPEN_FAILED || r == ERROR_SUCCESS, "Expected ERROR_INSTALL_PACKAGE_OPEN_FAILED or ERROR_SUCCESS, got %d\n", r); if (r == ERROR_SUCCESS) @@ -7634,12 +7978,13 @@ static void test_MsiOpenProduct(void) "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); ok(hprod == 0xdeadbeef, "Expected hprod to be unchanged\n"); +error: RegDeleteValueA(props, "LocalPackage"); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access & KEY_WOW64_64KEY); RegCloseKey(userkey); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); DeleteFileA(msifile); @@ -7657,10 +8002,14 @@ static void test_MsiEnumPatchesEx_usermanaged(LPCSTR usersid, LPCSTR expectedsid DWORD size, data; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(prodcode, prod_squashed); create_test_guid(patch, patch_squashed); + if (is_wow64) + access |= KEY_WOW64_64KEY; + /* MSIPATCHSTATE_APPLIED */ lstrcpyA(patchcode, "apple"); @@ -7671,6 +8020,11 @@ static void test_MsiEnumPatchesEx_usermanaged(LPCSTR usersid, LPCSTR expectedsid r = pMsiEnumPatchesExA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, MSIPATCHSTATE_APPLIED, 0, patchcode, targetprod, &context, targetsid, &size); + if (r == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + return; + } ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); ok(!lstrcmpA(patchcode, "apple"), "Expected patchcode to be unchanged, got %s\n", patchcode); @@ -7687,7 +8041,12 @@ static void test_MsiEnumPatchesEx_usermanaged(LPCSTR usersid, LPCSTR expectedsid lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* managed product key exists */ @@ -7710,7 +8069,7 @@ static void test_MsiEnumPatchesEx_usermanaged(LPCSTR usersid, LPCSTR expectedsid "Expected targetsid to be unchanged, got %s\n", targetsid); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(prodkey, "Patches", &patches); + res = RegCreateKeyExA(prodkey, "Patches", 0, NULL, 0, access, NULL, &patches, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* patches key exists */ @@ -8031,7 +8390,7 @@ static void test_MsiEnumPatchesEx_usermanaged(LPCSTR usersid, LPCSTR expectedsid lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &udprod); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &udprod, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* UserData product key exists */ @@ -8054,7 +8413,7 @@ static void test_MsiEnumPatchesEx_usermanaged(LPCSTR usersid, LPCSTR expectedsid "Expected targetsid to be unchanged, got %s\n", targetsid); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(udprod, "Patches", &udpatch); + res = RegCreateKeyExA(udprod, "Patches", 0, NULL, 0, access, NULL, &udpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* UserData patches key exists */ @@ -8077,7 +8436,7 @@ static void test_MsiEnumPatchesEx_usermanaged(LPCSTR usersid, LPCSTR expectedsid "Expected targetsid to be unchanged, got %s\n", targetsid); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(udpatch, patch_squashed, &hpatch); + res = RegCreateKeyExA(udpatch, patch_squashed, 0, NULL, 0, access, NULL, &hpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* specific UserData patch key exists */ @@ -8221,16 +8580,16 @@ static void test_MsiEnumPatchesEx_usermanaged(LPCSTR usersid, LPCSTR expectedsid ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); RegDeleteValueA(hpatch, "State"); - RegDeleteKeyA(hpatch, ""); + delete_key(hpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(hpatch); - RegDeleteKeyA(udpatch, ""); + delete_key(udpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(udpatch); - RegDeleteKeyA(udprod, ""); + delete_key(udprod, "", access & KEY_WOW64_64KEY); RegCloseKey(udprod); RegDeleteValueA(patches, "Patches"); - RegDeleteKeyA(patches, ""); + delete_key(patches, "", access & KEY_WOW64_64KEY); RegCloseKey(patches); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); } @@ -8246,10 +8605,14 @@ static void test_MsiEnumPatchesEx_userunmanaged(LPCSTR usersid, LPCSTR expecteds DWORD size, data; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(prodcode, prod_squashed); create_test_guid(patch, patch_squashed); + if (is_wow64) + access |= KEY_WOW64_64KEY; + /* MSIPATCHSTATE_APPLIED */ lstrcpyA(patchcode, "apple"); @@ -8371,9 +8734,10 @@ static void test_MsiEnumPatchesEx_userunmanaged(LPCSTR usersid, LPCSTR expecteds "Expected targetsid to be unchanged, got %s\n", targetsid); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + patch_squashed[lstrlenA(patch_squashed) + 1] = 0; res = RegSetValueExA(patches, "Patches", 0, REG_MULTI_SZ, (const BYTE *)patch_squashed, - lstrlenA(patch_squashed) + 1); + lstrlenA(patch_squashed) + 2); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches value exists */ @@ -8429,7 +8793,12 @@ static void test_MsiEnumPatchesEx_userunmanaged(LPCSTR usersid, LPCSTR expecteds lstrcatA(keypath, "\\Patches\\"); lstrcatA(keypath, patch_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* userdata patch key exists */ @@ -8479,7 +8848,7 @@ static void test_MsiEnumPatchesEx_userunmanaged(LPCSTR usersid, LPCSTR expecteds lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &udprod); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &udprod, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* UserData product key exists */ @@ -8502,7 +8871,7 @@ static void test_MsiEnumPatchesEx_userunmanaged(LPCSTR usersid, LPCSTR expecteds "Expected targetsid to be unchanged, got %s\n", targetsid); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(udprod, "Patches", &udpatch); + res = RegCreateKeyExA(udprod, "Patches", 0, NULL, 0, access, NULL, &udpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* UserData patches key exists */ @@ -8525,7 +8894,7 @@ static void test_MsiEnumPatchesEx_userunmanaged(LPCSTR usersid, LPCSTR expecteds "Expected targetsid to be unchanged, got %s\n", targetsid); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(udpatch, patch_squashed, &hpatch); + res = RegCreateKeyExA(udpatch, patch_squashed, 0, NULL, 0, access, NULL, &hpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* specific UserData patch key exists */ @@ -8669,16 +9038,18 @@ static void test_MsiEnumPatchesEx_userunmanaged(LPCSTR usersid, LPCSTR expecteds ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); RegDeleteValueA(hpatch, "State"); - RegDeleteKeyA(hpatch, ""); + delete_key(hpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(hpatch); - RegDeleteKeyA(udpatch, ""); + delete_key(udpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(udpatch); - RegDeleteKeyA(udprod, ""); + delete_key(udprod, "", access & KEY_WOW64_64KEY); RegCloseKey(udprod); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access & KEY_WOW64_64KEY); RegCloseKey(userkey); RegDeleteValueA(patches, patch_squashed); RegDeleteValueA(patches, "Patches"); + +error: RegDeleteKeyA(patches, ""); RegCloseKey(patches); RegDeleteKeyA(prodkey, ""); @@ -8697,10 +9068,14 @@ static void test_MsiEnumPatchesEx_machine(void) DWORD size, data; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(prodcode, prod_squashed); create_test_guid(patch, patch_squashed); + if (is_wow64) + access |= KEY_WOW64_64KEY; + /* MSIPATCHSTATE_APPLIED */ lstrcpyA(patchcode, "apple"); @@ -8725,7 +9100,12 @@ static void test_MsiEnumPatchesEx_machine(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local product key exists */ @@ -8748,7 +9128,7 @@ static void test_MsiEnumPatchesEx_machine(void) "Expected targetsid to be unchanged, got %s\n", targetsid); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(prodkey, "Patches", &patches); + res = RegCreateKeyExA(prodkey, "Patches", 0, NULL, 0, access, NULL, &patches, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches key exists */ @@ -8875,7 +9255,7 @@ static void test_MsiEnumPatchesEx_machine(void) lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &udprod); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &udprod, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local UserData product key exists */ @@ -8898,7 +9278,7 @@ static void test_MsiEnumPatchesEx_machine(void) "Expected \"\", got \"%s\"\n", targetsid); ok(size == 0, "Expected 0, got %d\n", size); - res = RegCreateKeyA(udprod, "Patches", &udpatch); + res = RegCreateKeyExA(udprod, "Patches", 0, NULL, 0, access, NULL, &udpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local UserData Patches key exists */ @@ -8921,7 +9301,7 @@ static void test_MsiEnumPatchesEx_machine(void) "Expected \"\", got \"%s\"\n", targetsid); ok(size == 0, "Expected 0, got %d\n", size); - res = RegCreateKeyA(udpatch, patch_squashed, &hpatch); + res = RegCreateKeyExA(udpatch, patch_squashed, 0, NULL, 0, access, NULL, &hpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local UserData Product patch key exists */ @@ -9105,16 +9485,16 @@ static void test_MsiEnumPatchesEx_machine(void) RegDeleteValueA(patches, patch_squashed); RegDeleteValueA(patches, "Patches"); - RegDeleteKeyA(patches, ""); + delete_key(patches, "", access & KEY_WOW64_64KEY); RegCloseKey(patches); RegDeleteValueA(hpatch, "State"); - RegDeleteKeyA(hpatch, ""); + delete_key(hpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(hpatch); - RegDeleteKeyA(udpatch, ""); + delete_key(udpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(udpatch); - RegDeleteKeyA(udprod, ""); + delete_key(udprod, "", access & KEY_WOW64_64KEY); RegCloseKey(udprod); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); } @@ -9135,7 +9515,7 @@ static void test_MsiEnumPatchesEx(void) } create_test_guid(prodcode, prod_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); /* empty szProductCode */ lstrcpyA(patchcode, "apple"); @@ -9392,10 +9772,14 @@ static void test_MsiEnumPatches(void) LPSTR usersid; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(prodcode, prod_squashed); create_test_guid(patchcode, patch_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* NULL szProduct */ size = MAX_PATH; @@ -9497,7 +9881,13 @@ static void test_MsiEnumPatches(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* managed product key exists */ @@ -9512,7 +9902,7 @@ static void test_MsiEnumPatches(void) "Expected lpTransformsBuf to be unchanged, got \"%s\"\n", transforms); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(prodkey, "Patches", &patches); + res = RegCreateKeyExA(prodkey, "Patches", 0, NULL, 0, access, NULL, &patches, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* patches key exists */ @@ -9671,9 +10061,9 @@ static void test_MsiEnumPatches(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); RegDeleteValueA(patches, "Patches"); - RegDeleteKeyA(patches, ""); + delete_key(patches, "", access & KEY_WOW64_64KEY); RegCloseKey(patches); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); /* MSIINSTALLCONTEXT_USERUNMANAGED */ @@ -9807,7 +10197,7 @@ static void test_MsiEnumPatches(void) lstrcatA(keypath, "\\Patches\\"); lstrcatA(keypath, patch_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* userdata patch key exists */ @@ -9822,7 +10212,7 @@ static void test_MsiEnumPatches(void) "Expected \"whatever\", got \"%s\"\n", transforms); ok(size == 8 || size == MAX_PATH, "Expected 8 or MAX_PATH, got %d\n", size); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access & KEY_WOW64_64KEY); RegCloseKey(userkey); RegDeleteValueA(patches, patch_squashed); RegDeleteValueA(patches, "Patches"); @@ -9848,7 +10238,7 @@ static void test_MsiEnumPatches(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local product key exists */ @@ -9863,7 +10253,7 @@ static void test_MsiEnumPatches(void) "Expected lpTransformsBuf to be unchanged, got \"%s\"\n", transforms); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(prodkey, "Patches", &patches); + res = RegCreateKeyExA(prodkey, "Patches", 0, NULL, 0, access, NULL, &patches, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches key exists */ @@ -9957,7 +10347,7 @@ static void test_MsiEnumPatches(void) lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &udprod); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &udprod, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local UserData product key exists */ @@ -9972,7 +10362,7 @@ static void test_MsiEnumPatches(void) "Expected \"whatever\", got \"%s\"\n", transforms); ok(size == 8 || size == MAX_PATH, "Expected 8 or MAX_PATH, got %d\n", size); - res = RegCreateKeyA(udprod, "Patches", &udpatch); + res = RegCreateKeyExA(udprod, "Patches", 0, NULL, 0, access, NULL, &udpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local UserData Patches key exists */ @@ -9987,7 +10377,7 @@ static void test_MsiEnumPatches(void) "Expected \"whatever\", got \"%s\"\n", transforms); ok(size == 8 || size == MAX_PATH, "Expected 8 or MAX_PATH, got %d\n", size); - res = RegCreateKeyA(udpatch, patch_squashed, &hpatch); + res = RegCreateKeyExA(udpatch, patch_squashed, 0, NULL, 0, access, NULL, &hpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local UserData Product patch key exists */ @@ -10057,16 +10447,16 @@ static void test_MsiEnumPatches(void) RegDeleteValueA(patches, patch_squashed); RegDeleteValueA(patches, "Patches"); - RegDeleteKeyA(patches, ""); + delete_key(patches, "", access & KEY_WOW64_64KEY); RegCloseKey(patches); RegDeleteValueA(hpatch, "State"); - RegDeleteKeyA(hpatch, ""); + delete_key(hpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(hpatch); - RegDeleteKeyA(udpatch, ""); + delete_key(udpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(udpatch); - RegDeleteKeyA(udprod, ""); + delete_key(udprod, "", access & KEY_WOW64_64KEY); RegCloseKey(udprod); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); LocalFree(usersid); } @@ -10082,6 +10472,7 @@ static void test_MsiGetPatchInfoEx(void) DWORD size; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; if (!pMsiGetPatchInfoExA) { @@ -10091,7 +10482,10 @@ static void test_MsiGetPatchInfoEx(void) create_test_guid(prodcode, prod_squashed); create_test_guid(patchcode, patch_squashed); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; /* NULL szPatchCode */ lstrcpyA(val, "apple"); @@ -10334,7 +10728,13 @@ static void test_MsiGetPatchInfoEx(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &udprod); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &udprod, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local UserData product key exists */ @@ -10349,7 +10749,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(udprod, "InstallProperties", &props); + res = RegCreateKeyExA(udprod, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -10363,7 +10763,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(udprod, "Patches", &patches); + res = RegCreateKeyExA(udprod, "Patches", 0, NULL, 0, access, NULL, &patches, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches key exists */ @@ -10377,7 +10777,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(patches, patch_squashed, &hpatch); + res = RegCreateKeyExA(patches, patch_squashed, 0, NULL, 0, access, NULL, &hpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches key exists */ @@ -10396,7 +10796,7 @@ static void test_MsiGetPatchInfoEx(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* managed product key exists */ @@ -10410,7 +10810,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(prodkey, "Patches", &prodpatches); + res = RegCreateKeyExA(prodkey, "Patches", 0, NULL, 0, access, NULL, &prodpatches, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches key exists */ @@ -10444,7 +10844,7 @@ static void test_MsiGetPatchInfoEx(void) lstrcatA(keypath, "\\Patches\\"); lstrcatA(keypath, patch_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &udpatch); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &udpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* UserData Patches key exists */ @@ -10630,9 +11030,9 @@ static void test_MsiGetPatchInfoEx(void) ok(size == 16, "Expected 16, got %d\n", size); RegDeleteValueA(prodpatches, patch_squashed); - RegDeleteKeyA(prodpatches, ""); + delete_key(prodpatches, "", access & KEY_WOW64_64KEY); RegCloseKey(prodpatches); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); /* UserData is sufficient for all properties @@ -10665,15 +11065,15 @@ static void test_MsiGetPatchInfoEx(void) RegDeleteValueA(hpatch, "Uninstallable"); RegDeleteValueA(hpatch, "Installed"); RegDeleteValueA(udpatch, "ManagedLocalPackage"); - RegDeleteKeyA(udpatch, ""); + delete_key(udpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(udpatch); - RegDeleteKeyA(hpatch, ""); + delete_key(hpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(hpatch); - RegDeleteKeyA(patches, ""); + delete_key(patches, "", access & KEY_WOW64_64KEY); RegCloseKey(patches); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(udprod, ""); + delete_key(udprod, "", access & KEY_WOW64_64KEY); RegCloseKey(udprod); /* MSIINSTALLCONTEXT_USERUNMANAGED */ @@ -10694,7 +11094,7 @@ static void test_MsiGetPatchInfoEx(void) lstrcatA(keypath, "\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &udprod); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &udprod, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local UserData product key exists */ @@ -10709,7 +11109,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(udprod, "InstallProperties", &props); + res = RegCreateKeyExA(udprod, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -10723,7 +11123,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(udprod, "Patches", &patches); + res = RegCreateKeyExA(udprod, "Patches", 0, NULL, 0, access, NULL, &patches, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches key exists */ @@ -10737,7 +11137,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(patches, patch_squashed, &hpatch); + res = RegCreateKeyExA(patches, patch_squashed, 0, NULL, 0, access, NULL, &hpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches key exists */ @@ -10802,7 +11202,7 @@ static void test_MsiGetPatchInfoEx(void) lstrcatA(keypath, "\\Patches\\"); lstrcatA(keypath, patch_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &udpatch); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &udpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* UserData Patches key exists */ @@ -10839,7 +11239,7 @@ static void test_MsiGetPatchInfoEx(void) ok(size == 10, "Expected 10, got %d\n", size); RegDeleteValueA(prodpatches, patch_squashed); - RegDeleteKeyA(prodpatches, ""); + delete_key(prodpatches, "", access & KEY_WOW64_64KEY); RegCloseKey(prodpatches); RegDeleteKeyA(prodkey, ""); RegCloseKey(prodkey); @@ -10869,15 +11269,15 @@ static void test_MsiGetPatchInfoEx(void) ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); RegDeleteValueA(udpatch, "LocalPackage"); - RegDeleteKeyA(udpatch, ""); + delete_key(udpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(udpatch); - RegDeleteKeyA(hpatch, ""); + delete_key(hpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(hpatch); - RegDeleteKeyA(patches, ""); + delete_key(patches, "", access & KEY_WOW64_64KEY); RegCloseKey(patches); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(udprod, ""); + delete_key(udprod, "", access & KEY_WOW64_64KEY); RegCloseKey(udprod); /* MSIINSTALLCONTEXT_MACHINE */ @@ -10897,7 +11297,7 @@ static void test_MsiGetPatchInfoEx(void) lstrcatA(keypath, "\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &udprod); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &udprod, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local UserData product key exists */ @@ -10912,7 +11312,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(udprod, "InstallProperties", &props); + res = RegCreateKeyExA(udprod, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* InstallProperties key exists */ @@ -10926,7 +11326,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(udprod, "Patches", &patches); + res = RegCreateKeyExA(udprod, "Patches", 0, NULL, 0, access, NULL, &patches, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches key exists */ @@ -10940,7 +11340,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(patches, patch_squashed, &hpatch); + res = RegCreateKeyExA(patches, patch_squashed, 0, NULL, 0, access, NULL, &hpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches key exists */ @@ -10957,7 +11357,7 @@ static void test_MsiGetPatchInfoEx(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* local product key exists */ @@ -10971,7 +11371,7 @@ static void test_MsiGetPatchInfoEx(void) "Expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - res = RegCreateKeyA(prodkey, "Patches", &prodpatches); + res = RegCreateKeyExA(prodkey, "Patches", 0, NULL, 0, access, NULL, &prodpatches, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Patches key exists */ @@ -11004,7 +11404,7 @@ static void test_MsiGetPatchInfoEx(void) lstrcatA(keypath, "\\UserData\\S-1-5-18\\Patches\\"); lstrcatA(keypath, patch_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &udpatch); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &udpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* UserData Patches key exists */ @@ -11041,9 +11441,9 @@ static void test_MsiGetPatchInfoEx(void) ok(size == 10, "Expected 10, got %d\n", size); RegDeleteValueA(prodpatches, patch_squashed); - RegDeleteKeyA(prodpatches, ""); + delete_key(prodpatches, "", access & KEY_WOW64_64KEY); RegCloseKey(prodpatches); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access & KEY_WOW64_64KEY); RegCloseKey(prodkey); /* UserData is sufficient for all properties @@ -11071,15 +11471,15 @@ static void test_MsiGetPatchInfoEx(void) ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); RegDeleteValueA(udpatch, "LocalPackage"); - RegDeleteKeyA(udpatch, ""); + delete_key(udpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(udpatch); - RegDeleteKeyA(hpatch, ""); + delete_key(hpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(hpatch); - RegDeleteKeyA(patches, ""); + delete_key(patches, "", access & KEY_WOW64_64KEY); RegCloseKey(patches); - RegDeleteKeyA(props, ""); + delete_key(props, "", access & KEY_WOW64_64KEY); RegCloseKey(props); - RegDeleteKeyA(udprod, ""); + delete_key(udprod, "", access & KEY_WOW64_64KEY); RegCloseKey(udprod); LocalFree(usersid); } @@ -11094,11 +11494,15 @@ static void test_MsiGetPatchInfo(void) HKEY hkey_udpatch, hkey_udpatches, hkey_udproductpatches, hkey_udproductpatch; DWORD size; LONG res; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(patch_code, patch_squashed); create_test_guid(prod_code, prod_squashed); MultiByteToWideChar(CP_ACP, 0, patch_code, -1, patch_codeW, MAX_PATH); + if (is_wow64) + access |= KEY_WOW64_64KEY; + r = MsiGetPatchInfoA(NULL, NULL, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", r); @@ -11118,7 +11522,12 @@ static void test_MsiGetPatchInfo(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey_product); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &hkey_product, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + return; + } ok(res == ERROR_SUCCESS, "expected ERROR_SUCCESS got %d\n", res); /* product key exists */ @@ -11129,7 +11538,7 @@ static void test_MsiGetPatchInfo(void) ok(!lstrcmpA(val, "apple"), "expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "expected size to be unchanged got %u\n", size); - res = RegCreateKeyA(hkey_product, "Patches", &hkey_patches); + res = RegCreateKeyExA(hkey_product, "Patches", 0, NULL, 0, access, NULL, &hkey_patches, NULL); ok(res == ERROR_SUCCESS, "expected ERROR_SUCCESS got %d\n", res); /* patches key exists */ @@ -11140,7 +11549,7 @@ static void test_MsiGetPatchInfo(void) ok(!lstrcmpA(val, "apple"), "expected val to be unchanged got \"%s\"\n", val); ok(size == MAX_PATH, "expected size to be unchanged got %u\n", size); - res = RegCreateKeyA(hkey_patches, patch_squashed, &hkey_patch); + res = RegCreateKeyExA(hkey_patches, patch_squashed, 0, NULL, 0, access, NULL, &hkey_patch, NULL); ok(res == ERROR_SUCCESS, "expected ERROR_SUCCESS got %d\n", res); /* patch key exists */ @@ -11155,7 +11564,7 @@ static void test_MsiGetPatchInfo(void) lstrcatA(keypath, "\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey_udproduct); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &hkey_udproduct, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", res); /* UserData product key exists */ @@ -11166,7 +11575,7 @@ static void test_MsiGetPatchInfo(void) ok(!lstrcmpA(val, "apple"), "expected val to be unchanged got \"%s\"\n", val); ok(size == MAX_PATH, "expected size to be unchanged got %u\n", size); - res = RegCreateKeyA(hkey_udproduct, "InstallProperties", &hkey_udprops); + res = RegCreateKeyExA(hkey_udproduct, "InstallProperties", 0, NULL, 0, access, NULL, &hkey_udprops, NULL); ok(res == ERROR_SUCCESS, "expected ERROR_SUCCESS got %d\n", res); /* InstallProperties key exists */ @@ -11177,7 +11586,7 @@ static void test_MsiGetPatchInfo(void) ok(!lstrcmpA(val, "apple"), "expected val to be unchanged, got \"%s\"\n", val); ok(size == MAX_PATH, "expected size to be unchanged got %u\n", size); - res = RegCreateKeyA(hkey_udproduct, "Patches", &hkey_udpatches); + res = RegCreateKeyExA(hkey_udproduct, "Patches", 0, NULL, 0, access, NULL, &hkey_udpatches, NULL); ok(res == ERROR_SUCCESS, "expected ERROR_SUCCESS got %d\n", res); /* UserData Patches key exists */ @@ -11188,10 +11597,10 @@ static void test_MsiGetPatchInfo(void) ok(!lstrcmpA(val, "apple"), "expected val to be unchanged got \"%s\"\n", val); ok(size == MAX_PATH, "expected size to be unchanged got %u\n", size); - res = RegCreateKeyA(hkey_udproduct, "Patches", &hkey_udproductpatches); + res = RegCreateKeyExA(hkey_udproduct, "Patches", 0, NULL, 0, access, NULL, &hkey_udproductpatches, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - res = RegCreateKeyA(hkey_udproductpatches, patch_squashed, &hkey_udproductpatch); + res = RegCreateKeyExA(hkey_udproductpatches, patch_squashed, 0, NULL, 0, access, NULL, &hkey_udproductpatch, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* UserData product patch key exists */ @@ -11206,7 +11615,7 @@ static void test_MsiGetPatchInfo(void) lstrcatA(keypath, "\\UserData\\S-1-5-18\\Patches\\"); lstrcatA(keypath, patch_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &hkey_udpatch); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &hkey_udpatch, NULL); ok(res == ERROR_SUCCESS, "expected ERROR_SUCCESS got %d\n", res); res = RegSetValueExA(hkey_udpatch, "LocalPackage", 0, REG_SZ, (const BYTE *)"c:\\test.msp", 12); @@ -11241,23 +11650,23 @@ static void test_MsiGetPatchInfo(void) ok(valW[0], "expected > 0 got %u\n", valW[0]); ok(size == 11, "expected 11 got %u\n", size); - RegDeleteKeyA(hkey_udproductpatch, ""); + delete_key(hkey_udproductpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(hkey_udproductpatch); - RegDeleteKeyA(hkey_udproductpatches, ""); + delete_key(hkey_udproductpatches, "", access & KEY_WOW64_64KEY); RegCloseKey(hkey_udproductpatches); - RegDeleteKeyA(hkey_udpatch, ""); + delete_key(hkey_udpatch, "", access & KEY_WOW64_64KEY); RegCloseKey(hkey_udpatch); - RegDeleteKeyA(hkey_patches, ""); + delete_key(hkey_patches, "", access & KEY_WOW64_64KEY); RegCloseKey(hkey_patches); - RegDeleteKeyA(hkey_product, ""); + delete_key(hkey_product, "", access & KEY_WOW64_64KEY); RegCloseKey(hkey_product); - RegDeleteKeyA(hkey_patch, ""); + delete_key(hkey_patch, "", access & KEY_WOW64_64KEY); RegCloseKey(hkey_patch); - RegDeleteKeyA(hkey_udpatches, ""); + delete_key(hkey_udpatches, "", access & KEY_WOW64_64KEY); RegCloseKey(hkey_udpatches); - RegDeleteKeyA(hkey_udprops, ""); + delete_key(hkey_udprops, "", access & KEY_WOW64_64KEY); RegCloseKey(hkey_udprops); - RegDeleteKeyA(hkey_udproduct, ""); + delete_key(hkey_udproduct, "", access & KEY_WOW64_64KEY); RegCloseKey(hkey_udproduct); } @@ -11271,16 +11680,26 @@ static void test_MsiEnumProducts(void) char keypath1[MAX_PATH], keypath2[MAX_PATH], keypath3[MAX_PATH]; char *usersid; HKEY key1, key2, key3; + REGSAM access = KEY_ALL_ACCESS; create_test_guid(product1, product_squashed1); create_test_guid(product2, product_squashed2); create_test_guid(product3, product_squashed3); - get_user_sid(&usersid); + usersid = get_user_sid(); + + if (is_wow64) + access |= KEY_WOW64_64KEY; strcpy(keypath1, "Software\\Classes\\Installer\\Products\\"); strcat(keypath1, product_squashed1); - r = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath1, &key1); + r = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath1, 0, NULL, 0, access, NULL, &key1, NULL); + if (r == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + LocalFree(usersid); + return; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); strcpy(keypath2, "Software\\Microsoft\\Windows\\CurrentVersion\\Installer\\Managed\\"); @@ -11288,7 +11707,7 @@ static void test_MsiEnumProducts(void) strcat(keypath2, "\\Installer\\Products\\"); strcat(keypath2, product_squashed2); - r = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath2, &key2); + r = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath2, 0, NULL, 0, access, NULL, &key2, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); strcpy(keypath3, "Software\\Microsoft\\Installer\\Products\\"); @@ -11325,8 +11744,8 @@ static void test_MsiEnumProducts(void) ok(found2, "product2 not found\n"); ok(found3, "product3 not found\n"); - RegDeleteKeyA(key1, ""); - RegDeleteKeyA(key2, ""); + delete_key(key1, "", access & KEY_WOW64_64KEY); + delete_key(key2, "", access & KEY_WOW64_64KEY); RegDeleteKeyA(key3, ""); RegCloseKey(key1); RegCloseKey(key2); @@ -11334,10 +11753,54 @@ static void test_MsiEnumProducts(void) LocalFree(usersid); } +static void test_MsiGetFileSignatureInformation(void) +{ + HRESULT hr; + const CERT_CONTEXT *cert; + DWORD len; + + hr = MsiGetFileSignatureInformationA( NULL, 0, NULL, NULL, NULL ); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got 0x%08x\n", hr); + + hr = MsiGetFileSignatureInformationA( NULL, 0, NULL, NULL, &len ); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got 0x%08x\n", hr); + + hr = MsiGetFileSignatureInformationA( NULL, 0, &cert, NULL, &len ); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got 0x%08x\n", hr); + + hr = MsiGetFileSignatureInformationA( "", 0, NULL, NULL, NULL ); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got 0x%08x\n", hr); + + hr = MsiGetFileSignatureInformationA( "signature.bin", 0, NULL, NULL, NULL ); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got 0x%08x\n", hr); + + hr = MsiGetFileSignatureInformationA( "signature.bin", 0, NULL, NULL, &len ); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got 0x%08x\n", hr); + + hr = MsiGetFileSignatureInformationA( "signature.bin", 0, &cert, NULL, &len ); + todo_wine ok(hr == CRYPT_E_FILE_ERROR, "expected CRYPT_E_FILE_ERROR got 0x%08x\n", hr); + + create_file( "signature.bin", "signature", sizeof("signature") ); + + hr = MsiGetFileSignatureInformationA( "signature.bin", 0, NULL, NULL, NULL ); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got 0x%08x\n", hr); + + hr = MsiGetFileSignatureInformationA( "signature.bin", 0, NULL, NULL, &len ); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got 0x%08x\n", hr); + + hr = MsiGetFileSignatureInformationA( "signature.bin", 0, &cert, NULL, &len ); + todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_FUNCTION_FAILED), "got 0x%08x\n", hr); + + DeleteFileA( "signature.bin" ); +} + START_TEST(msi) { init_functionpointers(); + if (pIsWow64Process) + pIsWow64Process(GetCurrentProcess(), &is_wow64); + test_usefeature(); test_null(); test_getcomponentpath(); @@ -11364,6 +11827,6 @@ START_TEST(msi) test_MsiGetPatchInfo(); test_MsiEnumProducts(); } - test_MsiGetFileVersion(); + test_MsiGetFileSignatureInformation(); } diff --git a/rostests/winetests/msi/msi.rbuild b/rostests/winetests/msi/msi.rbuild index 67a8c078752..1533c4cbf7d 100644 --- a/rostests/winetests/msi/msi.rbuild +++ b/rostests/winetests/msi/msi.rbuild @@ -4,6 +4,7 @@ . + action.c automation.c db.c format.c diff --git a/rostests/winetests/msi/package.c b/rostests/winetests/msi/package.c index d2514ce5a7f..9808dfa7126 100644 --- a/rostests/winetests/msi/package.c +++ b/rostests/winetests/msi/package.c @@ -27,15 +27,27 @@ #include #include #include +#include #include "wine/test.h" +static BOOL is_wow64; static const char msifile[] = "winetest-package.msi"; -char CURR_DIR[MAX_PATH]; +static char CURR_DIR[MAX_PATH]; static UINT (WINAPI *pMsiApplyMultiplePatchesA)(LPCSTR, LPCSTR, LPCSTR); +static INSTALLSTATE (WINAPI *pMsiGetComponentPathExA)(LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCONTEXT, LPSTR, LPDWORD); +static HRESULT (WINAPI *pSHGetFolderPathA)(HWND, int, HANDLE, DWORD, LPSTR); static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*); +static BOOL (WINAPI *pGetTokenInformation)( HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD ); +static BOOL (WINAPI *pOpenProcessToken)( HANDLE, DWORD, PHANDLE ); +static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD); +static LONG (WINAPI *pRegDeleteKeyExW)(HKEY, LPCWSTR, REGSAM, DWORD); +static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); +static void (WINAPI *pGetSystemInfo)(LPSYSTEM_INFO); +static void (WINAPI *pGetNativeSystemInfo)(LPSYSTEM_INFO); +static UINT (WINAPI *pGetSystemWow64DirectoryA)(LPSTR, UINT); static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD); static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*); @@ -44,14 +56,26 @@ static void init_functionpointers(void) { HMODULE hmsi = GetModuleHandleA("msi.dll"); HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll"); + HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); + HMODULE hshell32 = GetModuleHandleA("shell32.dll"); HMODULE hsrclient; #define GET_PROC(mod, func) \ p ## func = (void*)GetProcAddress(mod, #func); GET_PROC(hmsi, MsiApplyMultiplePatchesA); + GET_PROC(hmsi, MsiGetComponentPathExA); + GET_PROC(hshell32, SHGetFolderPathA); GET_PROC(hadvapi32, ConvertSidToStringSidA); + GET_PROC(hadvapi32, GetTokenInformation); + GET_PROC(hadvapi32, OpenProcessToken); + GET_PROC(hadvapi32, RegDeleteKeyExA) + GET_PROC(hadvapi32, RegDeleteKeyExW) + GET_PROC(hkernel32, IsWow64Process) + GET_PROC(hkernel32, GetNativeSystemInfo) + GET_PROC(hkernel32, GetSystemInfo) + GET_PROC(hkernel32, GetSystemWow64DirectoryA) hsrclient = LoadLibraryA("srclient.dll"); GET_PROC(hsrclient, SRRemoveRestorePoint); @@ -59,33 +83,58 @@ static void init_functionpointers(void) #undef GET_PROC } - -static LPSTR get_user_sid(LPSTR *usersid) +static BOOL is_process_limited(void) { HANDLE token; - BYTE buf[1024]; - DWORD size; - PTOKEN_USER user; + + if (!pOpenProcessToken || !pGetTokenInformation) return FALSE; + + if (pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) + { + BOOL ret; + TOKEN_ELEVATION_TYPE type = TokenElevationTypeDefault; + DWORD size; + + ret = pGetTokenInformation(token, TokenElevationType, &type, sizeof(type), &size); + CloseHandle(token); + return (ret && type == TokenElevationTypeLimited); + } + return FALSE; +} + +static LONG delete_key( HKEY key, LPCSTR subkey, REGSAM access ) +{ + if (pRegDeleteKeyExA) + return pRegDeleteKeyExA( key, subkey, access, 0 ); + return RegDeleteKeyA( key, subkey ); +} + +static char *get_user_sid(void) +{ + HANDLE token; + DWORD size = 0; + TOKEN_USER *user; + char *usersid = NULL; if (!pConvertSidToStringSidA) { win_skip("ConvertSidToStringSidA is not available\n"); return NULL; } - - *usersid = NULL; OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token); - size = sizeof(buf); - GetTokenInformation(token, TokenUser, buf, size, &size); - user = (PTOKEN_USER)buf; - pConvertSidToStringSidA(user->User.Sid, usersid); - ok(*usersid != NULL, "pConvertSidToStringSidA failed lre=%d\n", GetLastError()); + GetTokenInformation(token, TokenUser, NULL, size, &size); + + user = HeapAlloc(GetProcessHeap(), 0, size); + GetTokenInformation(token, TokenUser, user, size, &size); + pConvertSidToStringSidA(user->User.Sid, &usersid); + HeapFree(GetProcessHeap(), 0, user); + CloseHandle(token); - return *usersid; + return usersid; } /* RegDeleteTreeW from dlls/advapi32/registry.c */ -static LSTATUS package_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey) +static LSTATUS package_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey, REGSAM access) { LONG ret; DWORD dwMaxSubkeyLen, dwMaxValueLen; @@ -95,7 +144,7 @@ static LSTATUS package_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey) if(lpszSubKey) { - ret = RegOpenKeyExW(hKey, lpszSubKey, 0, KEY_READ, &hSubKey); + ret = RegOpenKeyExW(hKey, lpszSubKey, 0, access, &hSubKey); if (ret) return ret; } @@ -123,12 +172,17 @@ static LSTATUS package_RegDeleteTreeW(HKEY hKey, LPCWSTR lpszSubKey) if (RegEnumKeyExW(hSubKey, 0, lpszName, &dwSize, NULL, NULL, NULL, NULL)) break; - ret = package_RegDeleteTreeW(hSubKey, lpszName); + ret = package_RegDeleteTreeW(hSubKey, lpszName, access); if (ret) goto cleanup; } if (lpszSubKey) - ret = RegDeleteKeyW(hKey, lpszSubKey); + { + if (pRegDeleteKeyExW) + ret = pRegDeleteKeyExW(hKey, lpszSubKey, access, 0); + else + ret = RegDeleteKeyW(hKey, lpszSubKey); + } else while (TRUE) { @@ -210,6 +264,10 @@ static void set_component_path(LPCSTR filename, MSIINSTALLCONTEXT context, CHAR path[MAX_PATH]; LPCSTR prod = NULL; HKEY hkey; + REGSAM access = KEY_ALL_ACCESS; + + if (is_wow64) + access |= KEY_WOW64_64KEY; MultiByteToWideChar(CP_ACP, 0, guid, -1, guidW, MAX_PATH); squash_guid(guidW, squashedW); @@ -248,7 +306,7 @@ static void set_component_path(LPCSTR filename, MSIINSTALLCONTEXT context, "7D2F387510109040002000060BECB6AB", usersid); } - RegCreateKeyA(HKEY_LOCAL_MACHINE, comppath, &hkey); + RegCreateKeyExA(HKEY_LOCAL_MACHINE, comppath, 0, NULL, 0, access, NULL, &hkey, NULL); lstrcpyA(path, CURR_DIR); lstrcatA(path, "\\"); @@ -257,7 +315,7 @@ static void set_component_path(LPCSTR filename, MSIINSTALLCONTEXT context, RegSetValueExA(hkey, prod, 0, REG_SZ, (LPBYTE)path, lstrlenA(path)); RegCloseKey(hkey); - RegCreateKeyA(HKEY_LOCAL_MACHINE, prodpath, &hkey); + RegCreateKeyExA(HKEY_LOCAL_MACHINE, prodpath, 0, NULL, 0, access, NULL, &hkey, NULL); RegCloseKey(hkey); } @@ -269,6 +327,10 @@ static void delete_component_path(LPCSTR guid, MSIINSTALLCONTEXT context, LPSTR CHAR squashed[MAX_PATH]; CHAR comppath[MAX_PATH]; CHAR prodpath[MAX_PATH]; + REGSAM access = KEY_ALL_ACCESS; + + if (is_wow64) + access |= KEY_WOW64_64KEY; MultiByteToWideChar(CP_ACP, 0, guid, -1, guidW, MAX_PATH); squash_guid(guidW, squashedW); @@ -305,10 +367,10 @@ static void delete_component_path(LPCSTR guid, MSIINSTALLCONTEXT context, LPSTR } MultiByteToWideChar(CP_ACP, 0, comppath, -1, substrW, MAX_PATH); - package_RegDeleteTreeW(HKEY_LOCAL_MACHINE, substrW); + package_RegDeleteTreeW(HKEY_LOCAL_MACHINE, substrW, access); MultiByteToWideChar(CP_ACP, 0, prodpath, -1, substrW, MAX_PATH); - package_RegDeleteTreeW(HKEY_LOCAL_MACHINE, substrW); + package_RegDeleteTreeW(HKEY_LOCAL_MACHINE, substrW, access); } static UINT do_query(MSIHANDLE hdb, const char *query, MSIHANDLE *phrec) @@ -574,10 +636,6 @@ make_add_entry(appsearch, "INSERT INTO `AppSearch` " "(`Property`, `Signature_`) VALUES( %s )") -make_add_entry(reglocator, - "INSERT INTO `RegLocator` " - "(`Signature_`, `Root`, `Key`, `Name`, `Type`) VALUES( %s )") - make_add_entry(signature, "INSERT INTO `Signature` " "(`Signature`, `FileName`, `MinVersion`, `MaxVersion`," @@ -616,6 +674,23 @@ make_add_entry(inilocator, "(`Signature_`, `FileName`, `Section`, `Key`, `Field`, `Type`) " "VALUES( %s )") +static UINT add_reglocator_entry( MSIHANDLE hdb, const char *sig, UINT root, const char *path, + const char *name, UINT type ) +{ + const char insert[] = + "INSERT INTO `RegLocator` (`Signature_`, `Root`, `Key`, `Name`, `Type`) " + "VALUES( '%s', %u, '%s', '%s', %u )"; + char *query; + UINT sz, r; + + sz = strlen( sig ) + 10 + strlen( path ) + strlen( name ) + 10 + sizeof( insert ); + query = HeapAlloc( GetProcessHeap(), 0, sz ); + sprintf( query, insert, sig, root, path, name, type ); + r = run_query( hdb, query ); + HeapFree( GetProcessHeap(), 0, query ); + return r; +} + static UINT set_summary_info(MSIHANDLE hdb) { UINT res; @@ -670,7 +745,7 @@ static MSIHANDLE create_package_db(void) /* create an empty database */ res = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb ); - ok( res == ERROR_SUCCESS , "Failed to create database\n" ); + ok( res == ERROR_SUCCESS , "Failed to create database %u\n", res ); if( res != ERROR_SUCCESS ) return hdb; @@ -678,6 +753,7 @@ static MSIHANDLE create_package_db(void) ok( res == ERROR_SUCCESS , "Failed to commit database\n" ); res = set_summary_info(hdb); + ok( res == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", res); res = run_query( hdb, "CREATE TABLE `Directory` ( " @@ -690,22 +766,29 @@ static MSIHANDLE create_package_db(void) return hdb; } -static MSIHANDLE package_from_db(MSIHANDLE hdb) +static UINT package_from_db(MSIHANDLE hdb, MSIHANDLE *handle) { UINT res; - CHAR szPackage[10]; + CHAR szPackage[12]; MSIHANDLE hPackage; - sprintf(szPackage,"#%i",hdb); - res = MsiOpenPackage(szPackage,&hPackage); + sprintf(szPackage, "#%u", hdb); + res = MsiOpenPackage(szPackage, &hPackage); if (res != ERROR_SUCCESS) - return 0; + { + MsiCloseHandle(hdb); + return res; + } res = MsiCloseHandle(hdb); if (res != ERROR_SUCCESS) - return 0; + { + MsiCloseHandle(hPackage); + return res; + } - return hPackage; + *handle = hPackage; + return ERROR_SUCCESS; } static void create_test_file(const CHAR *name) @@ -809,8 +892,14 @@ static void test_createpackage(void) MSIHANDLE hPackage = 0; UINT res; - hPackage = package_from_db(create_package_db()); - ok( hPackage != 0, " Failed to create package\n"); + res = package_from_db(create_package_db(), &hPackage); + if (res == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( res == ERROR_SUCCESS, " Failed to create package %u\n", res ); res = MsiCloseHandle( hPackage); ok( res == ERROR_SUCCESS , "Failed to close package\n" ); @@ -825,8 +914,14 @@ static void test_doaction( void ) r = MsiDoAction( -1, NULL ); ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n"); - hpkg = package_from_db(create_package_db()); - ok( hpkg, "failed to create package\n"); + r = package_from_db(create_package_db(), &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r); r = MsiDoAction(hpkg, NULL); ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n"); @@ -851,8 +946,14 @@ static void test_gettargetpath_bad(void) DWORD sz; UINT r; - hpkg = package_from_db(create_package_db()); - ok( hpkg, "failed to create package\n"); + r = package_from_db(create_package_db(), &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r); r = MsiGetTargetPath( 0, NULL, NULL, NULL ); ok( r == ERROR_INVALID_PARAMETER, "wrong return val\n"); @@ -971,8 +1072,16 @@ static void test_settargetpath(void) r = add_file_entry( hdb, "'TestFile', 'TestComp', 'testfile.txt', 0, '', '1033', 8192, 1" ); ok( r == S_OK, "cannot add file to the File table: %d\n", r ); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -1025,6 +1134,7 @@ static void test_settargetpath(void) r = MsiSetTargetPath( hpkg, "TARGETDIR", tempdir ); ok( r == ERROR_SUCCESS, "MsiSetTargetPath on subsubdir returned %d\n", r ); + buffer[0] = 0; sz = sizeof buffer - 1; lstrcat( tempdir, "\\" ); r = MsiGetTargetPath( hpkg, "TARGETDIR", buffer, &sz ); @@ -1035,13 +1145,29 @@ static void test_settargetpath(void) query_file_path( hpkg, "[#RootFile]", buffer ); ok( !lstrcmp(buffer, file), "Expected %s, got %s\n", file, buffer); + buffer[0] = 0; + sz = sizeof(buffer); + r = MsiGetPropertyA( hpkg, "TestParent", buffer, &sz ); + ok( r == ERROR_SUCCESS, "MsiGetProperty returned %u\n", r ); + lstrcatA( tempdir, "TestParent\\" ); + ok( !lstrcmpi(buffer, tempdir), "Expected \"%s\", got \"%s\"\n", tempdir, buffer ); + r = MsiSetTargetPath( hpkg, "TestParent", "C:\\one\\two" ); ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r ); + buffer[0] = 0; + sz = sizeof(buffer); + r = MsiGetPropertyA( hpkg, "TestParent", buffer, &sz ); + ok( r == ERROR_SUCCESS, "MsiGetProperty returned %u\n", r ); + ok( lstrcmpi(buffer, "C:\\one\\two\\TestDir\\"), + "Expected \"C:\\one\\two\\TestDir\\\", got \"%s\"\n", buffer ); + + buffer[0] = 0; query_file_path( hpkg, "[#TestFile]", buffer ); ok( !lstrcmpi(buffer, "C:\\one\\two\\TestDir\\testfile.txt"), "Expected C:\\one\\two\\TestDir\\testfile.txt, got %s\n", buffer ); + buffer[0] = 0; sz = sizeof buffer - 1; r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz ); ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r); @@ -1050,21 +1176,50 @@ static void test_settargetpath(void) r = MsiSetTargetPath( hpkg, "TestParent", "C:\\one\\two\\three" ); ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r ); + buffer[0] = 0; sz = sizeof buffer - 1; r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz ); ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r); ok( !lstrcmpi(buffer, "C:\\one\\two\\three\\"), "Expected C:\\one\\two\\three\\, got %s\n", buffer); + r = MsiSetTargetPath( hpkg, "TestParent", "C:\\\\one\\\\two " ); + ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r ); + + buffer[0] = 0; + sz = sizeof buffer - 1; + r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz ); + ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r); + ok( !lstrcmpi(buffer, "C:\\one\\two\\"), "Expected \"C:\\one\\two\\\", got %s\n", buffer); + + r = MsiSetTargetPath( hpkg, "TestParent", "C:\\\\ Program Files \\\\ " ); + ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r ); + + buffer[0] = 0; + sz = sizeof buffer - 1; + r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz ); + ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r); + ok( !lstrcmpi(buffer, "C:\\Program Files\\"), "Expected \"C:\\Program Files\\\", got %s\n", buffer); + MsiCloseHandle( hpkg ); } static void test_condition(void) { + static const WCHAR cond1[] = {'\"','a',0x30a,'\"','<','\"',0xe5,'\"',0}; + static const WCHAR cond2[] = {'\"','a',0x30a,'\"','>','\"',0xe5,'\"',0}; + static const WCHAR cond3[] = {'\"','a',0x30a,'\"','<','>','\"',0xe5,'\"',0}; + static const WCHAR cond4[] = {'\"','a',0x30a,'\"','=','\"',0xe5,'\"',0}; MSICONDITION r; MSIHANDLE hpkg; - hpkg = package_from_db(create_package_db()); - ok( hpkg, "failed to create package\n"); + r = package_from_db(create_package_db(), &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r); r = MsiEvaluateCondition(0, NULL); ok( r == MSICONDITION_ERROR, "wrong return val\n"); @@ -1773,6 +1928,22 @@ static void test_condition(void) r = MsiEvaluateCondition(hpkg, "A <= X"); ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r); + r = MsiEvaluateConditionW(hpkg, cond1); + ok( r == MSICONDITION_TRUE || broken(r == MSICONDITION_FALSE), + "wrong return val (%d)\n", r); + + r = MsiEvaluateConditionW(hpkg, cond2); + ok( r == MSICONDITION_FALSE || broken(r == MSICONDITION_TRUE), + "wrong return val (%d)\n", r); + + r = MsiEvaluateConditionW(hpkg, cond3); + ok( r == MSICONDITION_TRUE || broken(r == MSICONDITION_FALSE), + "wrong return val (%d)\n", r); + + r = MsiEvaluateConditionW(hpkg, cond4); + ok( r == MSICONDITION_FALSE || broken(r == MSICONDITION_TRUE), + "wrong return val (%d)\n", r); + MsiCloseHandle( hpkg ); DeleteFile(msifile); } @@ -1810,8 +1981,14 @@ static void test_props(void) "VALUES( 'MetadataCompName', 'Photoshop.dll' )"); ok( r == ERROR_SUCCESS , "Failed\n" ); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r); /* test invalid values */ r = MsiGetProperty( 0, NULL, NULL, NULL ); @@ -2014,8 +2191,14 @@ static void test_property_table(void) hdb = create_package_db(); ok( hdb, "failed to create package\n"); - hpkg = package_from_db(hdb); - ok( hpkg, "failed to create package\n"); + r = package_from_db(hdb, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r); MsiCloseHandle(hdb); @@ -2068,8 +2251,8 @@ static void test_property_table(void) r = add_property_entry(hdb, "'prop', 'val'"); ok(r == ERROR_SUCCESS, "cannot add property: %d\n", r); - hpkg = package_from_db(hdb); - ok(hpkg, "failed to create package\n"); + r = package_from_db(hdb, &hpkg); + ok(r == ERROR_SUCCESS, "failed to create package %u\n", r); MsiCloseHandle(hdb); @@ -2190,6 +2373,11 @@ static void test_msipackage(void) /* empty szPackagePath */ r = MsiOpenPackage("", &hpack); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + return; + } todo_wine { ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -2274,8 +2462,14 @@ static void test_formatrecord2(void) DWORD sz; UINT r; - hpkg = package_from_db(create_package_db()); - ok( hpkg, "failed to create package\n"); + r = package_from_db(create_package_db(), &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r); r = MsiSetProperty(hpkg, "Manufacturer", " " ); ok( r == ERROR_SUCCESS, "set property failed\n"); @@ -2289,9 +2483,12 @@ static void test_formatrecord2(void) buffer[0] = 0; sz = sizeof buffer; r = MsiFormatRecord( hpkg, hrec, buffer, &sz ); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); r = MsiRecordSetString(hrec, 0, "[foo][1]"); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); sz = sizeof buffer; r = MsiFormatRecord(hpkg, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); @@ -2299,6 +2496,7 @@ static void test_formatrecord2(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "x[~]x"); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); sz = sizeof buffer; r = MsiFormatRecord(hpkg, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); @@ -2306,7 +2504,9 @@ static void test_formatrecord2(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[foo.$%}][1]"); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); r = MsiRecordSetString(hrec, 1, "hoo"); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); sz = sizeof buffer; r = MsiFormatRecord(hpkg, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); @@ -2314,6 +2514,7 @@ static void test_formatrecord2(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[\\[]"); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); sz = sizeof buffer; r = MsiFormatRecord(hpkg, hrec, buffer, &sz); ok( sz == 1, "size wrong\n"); @@ -2322,6 +2523,7 @@ static void test_formatrecord2(void) SetEnvironmentVariable("FOO", "BAR"); r = MsiRecordSetString(hrec, 0, "[%FOO]"); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); sz = sizeof buffer; r = MsiFormatRecord(hpkg, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); @@ -2329,7 +2531,9 @@ static void test_formatrecord2(void) ok( r == ERROR_SUCCESS, "format failed\n"); r = MsiRecordSetString(hrec, 0, "[[1]]"); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); r = MsiRecordSetString(hrec, 1, "%FOO"); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); sz = sizeof buffer; r = MsiFormatRecord(hpkg, hrec, buffer, &sz); ok( sz == 3, "size wrong\n"); @@ -2352,6 +2556,12 @@ static void test_states(void) static const CHAR msifile3[] = "winetest3-package.msi"; static const CHAR msifile4[] = "winetest4-package.msi"; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + hdb = create_package_db(); ok ( hdb, "failed to create package database\n" ); @@ -2361,7 +2571,7 @@ static void test_states(void) r = create_property_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create Property table: %d\n", r ); - r = add_property_entry( hdb, "'ProductCode', '{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}'" ); + r = add_property_entry( hdb, "'ProductCode', '{7262AC98-EEBD-4364-8CE3-D654F6A425B9}'" ); ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r ); r = add_property_entry( hdb, "'ProductLanguage', '1033'" ); @@ -2373,6 +2583,9 @@ static void test_states(void) r = add_property_entry( hdb, "'ProductVersion', '1.1.1'" ); ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r ); + r = add_property_entry( hdb, "'MSIFASTINSTALL', '1'" ); + ok( r == ERROR_SUCCESS, "cannot add property entry: %d\n", r ); + r = create_install_execute_sequence_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create InstallExecuteSequence table: %d\n", r ); @@ -2542,6 +2755,13 @@ static void test_states(void) r = add_component_entry( hdb, "'chi', '{E6B539AB-5DA9-4236-A2D2-E341A50B4C38}', 'TARGETDIR', 1, '', 'chi_file'" ); ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r ); + /* msidbFeatureAttributesUIDisallowAbsent */ + r = add_feature_entry( hdb, "'eleven', '', '', '', 2, 1, '', 16" ); + ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r ); + + r = add_component_entry( hdb, "'psi', '{A06B23B5-746B-427A-8A6E-FD6AC8F46A95}', 'TARGETDIR', 1, '', 'psi_file'" ); + ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r ); + r = create_feature_components_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r ); @@ -2611,6 +2831,9 @@ static void test_states(void) r = add_feature_components_entry( hdb, "'ten', 'chi'" ); ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r ); + r = add_feature_components_entry( hdb, "'eleven', 'psi'" ); + ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r ); + r = create_file_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r ); @@ -2678,6 +2901,9 @@ static void test_states(void) r = add_file_entry( hdb, "'chi_file', 'chi', 'chi.txt', 100, '', '1033', 8192, 1" ); ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r); + r = add_file_entry( hdb, "'psi_file', 'psi', 'psi.txt', 100, '', '1033', 8192, 1" ); + ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r); + MsiDatabaseCommit(hdb); /* these properties must not be in the saved msi file */ @@ -2696,8 +2922,14 @@ static void test_states(void) r = add_property_entry( hdb, "'REINSTALLMODE', 'omus'"); ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); MsiCloseHandle(hdb); @@ -2775,6 +3007,13 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -2922,6 +3161,13 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -2995,6 +3241,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -3142,9 +3395,31 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiDoAction( hpkg, "FileCost"); ok( r == ERROR_SUCCESS, "file cost failed\n"); + r = MsiGetFeatureState(hpkg, "one", NULL, NULL); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "one", NULL, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + + state = 0xdeadbee; + r = MsiGetFeatureState( hpkg, "one", &state, NULL); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetFeatureState(hpkg, "one", &state, &action); @@ -3215,6 +3490,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -3362,6 +3644,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "CostFinalize"); ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r); @@ -3435,6 +3724,13 @@ static void test_states(void) ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -3582,8 +3878,17 @@ static void test_states(void) ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + MsiCloseHandle( hpkg ); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + /* publish the features and components */ r = MsiInstallProduct(msifile, "ADDLOCAL=one,four ADDSOURCE=two,three REMOVE=six,seven REINSTALL=eight,nine,ten"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -3604,8 +3909,8 @@ static void test_states(void) r = add_property_entry( hdb, "'REINSTALL', 'eight,nine,ten'"); ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); MsiCloseHandle(hdb); @@ -3679,6 +3984,13 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -3826,6 +4138,13 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -3899,6 +4218,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -4046,6 +4372,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "FileCost"); ok( r == ERROR_SUCCESS, "file cost failed\n"); @@ -4259,6 +4592,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "CostFinalize"); ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r); @@ -4332,6 +4672,13 @@ static void test_states(void) ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -4479,6 +4826,13 @@ static void test_states(void) ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + MsiCloseHandle(hpkg); /* uninstall the product */ @@ -4496,8 +4850,8 @@ static void test_states(void) r = add_property_entry( hdb, "'ADDLOCAL', 'one,two,three,four,five,six,seven,eight,nine,ten'"); ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); state = 0xdeadbee; action = 0xdeadbee; @@ -4569,6 +4923,13 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -4716,6 +5077,13 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -4789,6 +5157,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -4936,6 +5311,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "FileCost"); ok( r == ERROR_SUCCESS, "file cost failed\n"); @@ -5009,6 +5391,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -5156,6 +5545,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "CostFinalize"); ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r); @@ -5229,6 +5625,13 @@ static void test_states(void) ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); todo_wine ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + todo_wine ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -5241,7 +5644,7 @@ static void test_states(void) r = MsiGetComponentState(hpkg, "beta", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; @@ -5304,35 +5707,35 @@ static void test_states(void) r = MsiGetComponentState(hpkg, "lambda", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "mu", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "nu", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "xi", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "omicron", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; @@ -5346,35 +5749,42 @@ static void test_states(void) r = MsiGetComponentState(hpkg, "rho", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "sigma", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "tau", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + todo_wine ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "phi", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + todo_wine ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "chi", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + todo_wine ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); MsiCloseHandle(hpkg); @@ -5393,8 +5803,8 @@ static void test_states(void) r = add_property_entry( hdb, "'ADDSOURCE', 'one,two,three,four,five,six,seven,eight,nine,ten'"); ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); state = 0xdeadbee; action = 0xdeadbee; @@ -5466,6 +5876,13 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -5613,6 +6030,13 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -5686,6 +6110,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -5833,6 +6264,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "FileCost"); ok( r == ERROR_SUCCESS, "file cost failed\n"); @@ -5906,6 +6344,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -6053,6 +6498,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "CostFinalize"); ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r); @@ -6061,14 +6513,14 @@ static void test_states(void) r = MsiGetFeatureState(hpkg, "one", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetFeatureState(hpkg, "two", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; @@ -6082,7 +6534,7 @@ static void test_states(void) r = MsiGetFeatureState(hpkg, "four", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; @@ -6096,42 +6548,49 @@ static void test_states(void) r = MsiGetFeatureState(hpkg, "six", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetFeatureState(hpkg, "seven", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetFeatureState(hpkg, "eight", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetFeatureState(hpkg, "nine", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetFeatureState(hpkg, "ten", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + todo_wine ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; @@ -6152,7 +6611,7 @@ static void test_states(void) r = MsiGetComponentState(hpkg, "theta", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; @@ -6201,7 +6660,7 @@ static void test_states(void) r = MsiGetComponentState(hpkg, "lambda", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; @@ -6222,14 +6681,14 @@ static void test_states(void) r = MsiGetComponentState(hpkg, "xi", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "omicron", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; @@ -6250,28 +6709,35 @@ static void test_states(void) r = MsiGetComponentState(hpkg, "sigma", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "tau", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "phi", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "chi", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); MsiCloseHandle(hpkg); @@ -6286,8 +6752,8 @@ static void test_states(void) r = add_property_entry( hdb, "'ADDSOURCE', 'one,two,three,four,five,six,seven,eight,nine,ten'"); ok( r == ERROR_SUCCESS, "cannot add property: %d\n", r ); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); state = 0xdeadbee; action = 0xdeadbee; @@ -6359,6 +6825,13 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -6506,6 +6979,13 @@ static void test_states(void) ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %d\n", r ); + ok( state == 0xdeadbee, "Expected 0xdeadbee, got %d\n", state); + ok( action == 0xdeadbee, "Expected 0xdeadbee, got %d\n", action); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -6579,6 +7059,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -6726,6 +7213,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "FileCost"); ok( r == ERROR_SUCCESS, "file cost failed\n"); @@ -6799,6 +7293,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -6946,6 +7447,13 @@ static void test_states(void) ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + r = MsiDoAction( hpkg, "CostFinalize"); ok( r == ERROR_SUCCESS, "cost finalize failed: %d\n", r); @@ -7019,6 +7527,13 @@ static void test_states(void) ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); ok( action == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "eleven", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + todo_wine ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "alpha", &state, &action); @@ -7031,7 +7546,7 @@ static void test_states(void) r = MsiGetComponentState(hpkg, "beta", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; @@ -7094,35 +7609,35 @@ static void test_states(void) r = MsiGetComponentState(hpkg, "lambda", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "mu", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "nu", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "xi", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "omicron", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; @@ -7136,35 +7651,42 @@ static void test_states(void) r = MsiGetComponentState(hpkg, "rho", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "sigma", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); - ok( state == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "tau", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "phi", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); - ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "chi", &state, &action); ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); + + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetComponentState(hpkg, "psi", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); ok( state == INSTALLSTATE_SOURCE, "Expected INSTALLSTATE_SOURCE, got %d\n", state); + ok( action == INSTALLSTATE_UNKNOWN, "Expected INSTALLSTATE_UNKNOWN, got %d\n", action); MsiCloseHandle(hpkg); @@ -7186,8 +7708,14 @@ static void test_getproperty(void) DWORD size; UINT r; - hPackage = package_from_db(create_package_db()); - ok( hPackage != 0, " Failed to create package\n"); + r = package_from_db(create_package_db(), &hPackage); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "Failed to create package %u\n", r ); /* set the property */ r = MsiSetProperty(hPackage, "Name", "Value"); @@ -7228,6 +7756,7 @@ static void test_removefiles(void) MSIHANDLE hpkg; UINT r; MSIHANDLE hdb; + INSTALLSTATE installed, action; hdb = create_package_db(); ok ( hdb, "failed to create package database\n" ); @@ -7262,6 +7791,9 @@ static void test_removefiles(void) r = add_component_entry( hdb, "'carbon', '', 'TARGETDIR', 0, '', 'carbon_file'" ); ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r ); + r = add_component_entry( hdb, "'oxygen', '', 'TARGETDIR', 0, '0', 'oxygen_file'" ); + ok( r == ERROR_SUCCESS, "cannot add component: %d\n", r ); + r = create_feature_components_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table: %d\n", r ); @@ -7283,6 +7815,9 @@ static void test_removefiles(void) r = add_feature_components_entry( hdb, "'one', 'carbon'" ); ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r ); + r = add_feature_components_entry( hdb, "'one', 'oxygen'" ); + ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r ); + r = create_file_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create File table: %d\n", r ); @@ -7304,11 +7839,20 @@ static void test_removefiles(void) r = add_file_entry( hdb, "'carbon_file', 'carbon', 'carbon.txt', 0, '', '1033', 16384, 1" ); ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r); + r = add_file_entry( hdb, "'oxygen_file', 'oxygen', 'oxygen.txt', 0, '', '1033', 16384, 1" ); + ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r); + r = create_remove_file_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create Remove File table: %d\n", r); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); MsiCloseHandle( hdb ); @@ -7318,25 +7862,43 @@ static void test_removefiles(void) create_test_file( "beryllium.txt" ); create_test_file( "boron.txt" ); create_test_file( "carbon.txt" ); + create_test_file( "oxygen.txt" ); r = MsiSetProperty( hpkg, "TARGETDIR", CURR_DIR ); ok( r == ERROR_SUCCESS, "set property failed\n"); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + + r = MsiGetComponentState( hpkg, "oxygen", &installed, &action ); + ok( r == ERROR_UNKNOWN_COMPONENT, "expected ERROR_UNKNOWN_COMPONENT, got %u\n", r ); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); r = MsiDoAction( hpkg, "FileCost"); - ok( r == ERROR_SUCCESS, "cost finalize failed\n"); + ok( r == ERROR_SUCCESS, "file cost failed\n"); + + installed = action = 0xdeadbeef; + r = MsiGetComponentState( hpkg, "oxygen", &installed, &action ); + ok( r == ERROR_SUCCESS, "failed to get component state %u\n", r ); + ok( installed == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", installed ); + ok( action == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", action ); r = MsiDoAction( hpkg, "CostFinalize"); ok( r == ERROR_SUCCESS, "cost finalize failed\n"); r = MsiDoAction( hpkg, "InstallValidate"); - ok( r == ERROR_SUCCESS, "cost finalize failed\n"); + ok( r == ERROR_SUCCESS, "install validate failed\n"); r = MsiSetComponentState( hpkg, "hydrogen", INSTALLSTATE_ABSENT ); ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r); + installed = action = 0xdeadbeef; + r = MsiGetComponentState( hpkg, "hydrogen", &installed, &action ); + ok( r == ERROR_SUCCESS, "failed to get component state %u\n", r ); + ok( installed == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", installed ); + todo_wine ok( action == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", action ); + r = MsiSetComponentState( hpkg, "helium", INSTALLSTATE_LOCAL ); ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r); @@ -7352,15 +7914,37 @@ static void test_removefiles(void) r = MsiSetComponentState( hpkg, "carbon", INSTALLSTATE_SOURCE ); ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r); + installed = action = 0xdeadbeef; + r = MsiGetComponentState( hpkg, "oxygen", &installed, &action ); + ok( r == ERROR_SUCCESS, "failed to get component state %u\n", r ); + ok( installed == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", installed ); + ok( action == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", action ); + + r = MsiSetComponentState( hpkg, "oxygen", INSTALLSTATE_ABSENT ); + ok( r == ERROR_SUCCESS, "failed to set component state: %d\n", r); + + installed = action = 0xdeadbeef; + r = MsiGetComponentState( hpkg, "oxygen", &installed, &action ); + ok( r == ERROR_SUCCESS, "failed to get component state %u\n", r ); + ok( installed == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", installed ); + ok( action == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", action ); + r = MsiDoAction( hpkg, "RemoveFiles"); ok( r == ERROR_SUCCESS, "remove files failed\n"); + installed = action = 0xdeadbeef; + r = MsiGetComponentState( hpkg, "oxygen", &installed, &action ); + ok( r == ERROR_SUCCESS, "failed to get component state %u\n", r ); + ok( installed == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", installed ); + ok( action == INSTALLSTATE_UNKNOWN, "expected INSTALLSTATE_UNKNOWN, got %d\n", action ); + ok(DeleteFileA("hydrogen.txt"), "Expected hydrogen.txt to exist\n"); ok(DeleteFileA("lithium.txt"), "Expected lithium.txt to exist\n"); ok(DeleteFileA("beryllium.txt"), "Expected beryllium.txt to exist\n"); ok(DeleteFileA("carbon.txt"), "Expected carbon.txt to exist\n"); ok(DeleteFileA("helium.txt"), "Expected helium.txt to exist\n"); ok(DeleteFileA("boron.txt"), "Expected boron.txt to exist\n"); + ok(DeleteFileA("oxygen.txt"), "Expected oxygen.txt to exist\n"); MsiCloseHandle( hpkg ); DeleteFileA(msifile); @@ -7372,7 +7956,7 @@ static void test_appsearch(void) UINT r; MSIHANDLE hdb; CHAR prop[MAX_PATH]; - DWORD size = MAX_PATH; + DWORD size; hdb = create_package_db(); ok ( hdb, "failed to create package database\n" ); @@ -7383,33 +7967,57 @@ static void test_appsearch(void) r = add_appsearch_entry( hdb, "'WEBBROWSERPROG', 'NewSignature1'" ); ok( r == ERROR_SUCCESS, "cannot add entry: %d\n", r ); + r = add_appsearch_entry( hdb, "'NOTEPAD', 'NewSignature2'" ); + ok( r == ERROR_SUCCESS, "cannot add entry: %d\n", r ); + r = create_reglocator_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r ); - r = add_reglocator_entry( hdb, "'NewSignature1', 0, 'htmlfile\\shell\\open\\command', '', 1" ); + r = add_reglocator_entry( hdb, "NewSignature1", 0, "htmlfile\\shell\\open\\command", "", 1 ); + ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r ); + + r = create_drlocator_table( hdb ); + ok( r == ERROR_SUCCESS, "cannot create DrLocator table: %d\n", r ); + + r = add_drlocator_entry( hdb, "'NewSignature2', 0, 'c:\\windows\\system32', 0" ); ok( r == ERROR_SUCCESS, "cannot create RegLocator table: %d\n", r ); r = create_signature_table( hdb ); ok( r == ERROR_SUCCESS, "cannot create Signature table: %d\n", r ); r = add_signature_entry( hdb, "'NewSignature1', 'FileName', '', '', '', '', '', '', ''" ); - ok( r == ERROR_SUCCESS, "cannot create Signature table: %d\n", r ); + ok( r == ERROR_SUCCESS, "cannot add signature: %d\n", r ); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = add_signature_entry( hdb, "'NewSignature2', 'NOTEPAD.EXE|notepad.exe', '', '', '', '', '', '', ''" ); + ok( r == ERROR_SUCCESS, "cannot add signature: %d\n", r ); + r = package_from_db( hdb, &hpkg ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); MsiCloseHandle( hdb ); + if (r != ERROR_SUCCESS) + goto done; + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiDoAction( hpkg, "AppSearch" ); ok( r == ERROR_SUCCESS, "AppSearch failed: %d\n", r); + size = sizeof(prop); r = MsiGetPropertyA( hpkg, "WEBBROWSERPROG", prop, &size ); ok( r == ERROR_SUCCESS, "get property failed: %d\n", r); - todo_wine - { - ok( lstrlenA(prop) != 0, "Expected non-zero length\n"); - } + ok( lstrlenA(prop) != 0, "Expected non-zero length\n"); + size = sizeof(prop); + r = MsiGetPropertyA( hpkg, "NOTEPAD", prop, &size ); + ok( r == ERROR_SUCCESS, "get property failed: %d\n", r); + +done: MsiCloseHandle( hpkg ); DeleteFileA(msifile); } @@ -7423,9 +8031,15 @@ static void test_appsearch_complocator(void) DWORD size; UINT r; - if (!get_user_sid(&usersid)) + if (!(usersid = get_user_sid())) return; + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } + create_test_file("FileName1"); create_test_file("FileName4"); set_component_path("FileName1", MSIINSTALLCONTEXT_MACHINE, @@ -7587,12 +8201,19 @@ static void test_appsearch_complocator(void) r = add_signature_entry(hdb, "'NewSignature12', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - hpkg = package_from_db(hdb); - ok(hpkg, "Expected a valid package handle\n"); + r = package_from_db(hdb, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected a valid package handle %u\n", r); r = MsiSetPropertyA(hpkg, "SIGPROP8", "october"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiDoAction(hpkg, "AppSearch"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -7686,6 +8307,9 @@ static void test_appsearch_complocator(void) delete_component_path("{EC30CE73-4CF9-4908-BABD-1ED82E1515FD}", MSIINSTALLCONTEXT_MACHINE, NULL); + MsiCloseHandle(hpkg); + +error: DeleteFileA("FileName1"); DeleteFileA("FileName2"); DeleteFileA("FileName3"); @@ -7696,7 +8320,6 @@ static void test_appsearch_complocator(void) DeleteFileA("FileName8.dll"); DeleteFileA("FileName9.dll"); DeleteFileA("FileName10.dll"); - MsiCloseHandle(hpkg); DeleteFileA(msifile); LocalFree(usersid); } @@ -7704,19 +8327,15 @@ static void test_appsearch_complocator(void) static void test_appsearch_reglocator(void) { MSIHANDLE hpkg, hdb; - CHAR path[MAX_PATH]; - CHAR prop[MAX_PATH]; - DWORD binary[2]; - DWORD size, val; - BOOL space, version; - HKEY hklm, classes; - HKEY hkcu, users; - LPSTR pathdata; - LPSTR pathvar; + CHAR path[MAX_PATH], prop[MAX_PATH]; + DWORD binary[2], size, val; + BOOL space, version, is_64bit = sizeof(void *) > sizeof(int); + HKEY hklm, classes, hkcu, users; + LPSTR pathdata, pathvar, ptr; LPCSTR str; - LPSTR ptr; LONG res; - UINT r; + UINT r, type = 0; + SYSTEM_INFO si; version = TRUE; if (!create_file_with_version("test.dll", MAKELONG(2, 1), MAKELONG(4, 3))) @@ -7725,6 +8344,11 @@ static void test_appsearch_reglocator(void) DeleteFileA("test.dll"); res = RegCreateKeyA(HKEY_CLASSES_ROOT, "Software\\Wine", &classes); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); res = RegSetValueExA(classes, "Value1", 0, REG_SZ, @@ -7834,11 +8458,13 @@ static void test_appsearch_reglocator(void) sprintf(path, "\"%s\\FileName1\" -option", CURR_DIR); res = RegSetValueExA(hklm, "value16", 0, REG_SZ, (const BYTE *)path, lstrlenA(path) + 1); + ok( res == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", res); space = (strchr(CURR_DIR, ' ')) ? TRUE : FALSE; sprintf(path, "%s\\FileName1 -option", CURR_DIR); res = RegSetValueExA(hklm, "value17", 0, REG_SZ, (const BYTE *)path, lstrlenA(path) + 1); + ok( res == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", res); hdb = create_package_db(); ok(hdb, "Expected a valid database handle\n"); @@ -7939,154 +8565,152 @@ static void test_appsearch_reglocator(void) r = create_reglocator_table(hdb); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + type = msidbLocatorTypeRawValue; + if (is_64bit) + type |= msidbLocatorType64bit; + /* HKLM, msidbLocatorTypeRawValue, REG_SZ */ - str = "'NewSignature1', 2, 'Software\\Wine', 'Value1', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature1", 2, "Software\\Wine", "Value1", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeRawValue, positive DWORD */ - str = "'NewSignature2', 2, 'Software\\Wine', 'Value2', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature2", 2, "Software\\Wine", "Value2", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeRawValue, negative DWORD */ - str = "'NewSignature3', 2, 'Software\\Wine', 'Value3', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature3", 2, "Software\\Wine", "Value3", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeRawValue, REG_EXPAND_SZ */ - str = "'NewSignature4', 2, 'Software\\Wine', 'Value4', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature4", 2, "Software\\Wine", "Value4", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeRawValue, REG_EXPAND_SZ */ - str = "'NewSignature5', 2, 'Software\\Wine', 'Value5', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature5", 2, "Software\\Wine", "Value5", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeRawValue, REG_MULTI_SZ */ - str = "'NewSignature6', 2, 'Software\\Wine', 'Value6', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature6", 2, "Software\\Wine", "Value6", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeRawValue, REG_BINARY */ - str = "'NewSignature7', 2, 'Software\\Wine', 'Value7', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature7", 2, "Software\\Wine", "Value7", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeRawValue, REG_SZ first char is # */ - str = "'NewSignature8', 2, 'Software\\Wine', 'Value8', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature8", 2, "Software\\Wine", "Value8", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + type = msidbLocatorTypeFileName; + if (is_64bit) + type |= msidbLocatorType64bit; + /* HKLM, msidbLocatorTypeFileName, signature, file exists */ - str = "'NewSignature9', 2, 'Software\\Wine', 'Value9', 1"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature9", 2, "Software\\Wine", "Value9", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeFileName, signature, file does not exist */ - str = "'NewSignature10', 2, 'Software\\Wine', 'Value10', 1"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature10", 2, "Software\\Wine", "Value10", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeFileName, no signature */ - str = "'NewSignature11', 2, 'Software\\Wine', 'Value9', 1"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature11", 2, "Software\\Wine", "Value9", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + type = msidbLocatorTypeDirectory; + if (is_64bit) + type |= msidbLocatorType64bit; + /* HKLM, msidbLocatorTypeDirectory, no signature, file exists */ - str = "'NewSignature12', 2, 'Software\\Wine', 'Value9', 0"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature12", 2, "Software\\Wine", "Value9", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeDirectory, no signature, directory exists */ - str = "'NewSignature13', 2, 'Software\\Wine', 'Value11', 0"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature13", 2, "Software\\Wine", "Value11", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeDirectory, signature, file exists */ - str = "'NewSignature14', 2, 'Software\\Wine', 'Value9', 0"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature14", 2, "Software\\Wine", "Value9", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + type = msidbLocatorTypeRawValue; + if (is_64bit) + type |= msidbLocatorType64bit; + /* HKCR, msidbLocatorTypeRawValue, REG_SZ */ - str = "'NewSignature15', 0, 'Software\\Wine', 'Value1', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature15", 0, "Software\\Wine", "Value1", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKCU, msidbLocatorTypeRawValue, REG_SZ */ - str = "'NewSignature16', 1, 'Software\\Wine', 'Value1', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature16", 1, "Software\\Wine", "Value1", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKU, msidbLocatorTypeRawValue, REG_SZ */ - str = "'NewSignature17', 3, 'S-1-5-18\\Software\\Wine', 'Value1', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature17", 3, "S-1-5-18\\Software\\Wine", "Value1", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeRawValue, REG_SZ, NULL Name */ - str = "'NewSignature18', 2, 'Software\\Wine', '', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature18", 2, "Software\\Wine", "", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeRawValue, REG_SZ, key does not exist */ - str = "'NewSignature19', 2, 'Software\\IDontExist', '', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature19", 2, "Software\\IDontExist", "", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeRawValue, REG_SZ, value is empty */ - str = "'NewSignature20', 2, 'Software\\Wine', 'Value12', 2"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature20", 2, "Software\\Wine", "Value12", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + type = msidbLocatorTypeFileName; + if (is_64bit) + type |= msidbLocatorType64bit; + /* HKLM, msidbLocatorTypeFileName, signature, file exists w/ version */ - str = "'NewSignature21', 2, 'Software\\Wine', 'Value13', 1"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature21", 2, "Software\\Wine", "Value13", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeFileName, file exists w/ version, version > max */ - str = "'NewSignature22', 2, 'Software\\Wine', 'Value14', 1"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature22", 2, "Software\\Wine", "Value14", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeFileName, file exists w/ version, sig->name ignored */ - str = "'NewSignature23', 2, 'Software\\Wine', 'Value15', 1"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature23", 2, "Software\\Wine", "Value15", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeFileName, no signature, directory exists */ - str = "'NewSignature24', 2, 'Software\\Wine', 'Value11', 1"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature24", 2, "Software\\Wine", "Value11", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeFileName, no signature, file does not exist */ - str = "'NewSignature25', 2, 'Software\\Wine', 'Value10', 1"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature25", 2, "Software\\Wine", "Value10", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + type = msidbLocatorTypeDirectory; + if (is_64bit) + type |= msidbLocatorType64bit; + /* HKLM, msidbLocatorTypeDirectory, signature, directory exists */ - str = "'NewSignature26', 2, 'Software\\Wine', 'Value11', 0"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature26", 2, "Software\\Wine", "Value11", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeDirectory, signature, file does not exist */ - str = "'NewSignature27', 2, 'Software\\Wine', 'Value10', 0"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature27", 2, "Software\\Wine", "Value10", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeDirectory, no signature, file does not exist */ - str = "'NewSignature28', 2, 'Software\\Wine', 'Value10', 0"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature28", 2, "Software\\Wine", "Value10", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + type = msidbLocatorTypeFileName; + if (is_64bit) + type |= msidbLocatorType64bit; + /* HKLM, msidbLocatorTypeFile, file exists, in quotes */ - str = "'NewSignature29', 2, 'Software\\Wine', 'Value16', 1"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature29", 2, "Software\\Wine", "Value16", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* HKLM, msidbLocatorTypeFile, file exists, no quotes */ - str = "'NewSignature30', 2, 'Software\\Wine', 'Value17', 1"; - r = add_reglocator_entry(hdb, str); + r = add_reglocator_entry(hdb, "NewSignature30", 2, "Software\\Wine", "Value17", type); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = create_signature_table(hdb); @@ -8133,8 +8757,10 @@ static void test_appsearch_reglocator(void) r = add_signature_entry(hdb, str); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - hpkg = package_from_db(hdb); - ok(hpkg, "Expected a valid package handle\n"); + r = package_from_db(hdb, &hpkg); + ok(r == ERROR_SUCCESS, "Expected a valid package handle %u\n", r); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiDoAction(hpkg, "AppSearch"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -8155,28 +8781,28 @@ static void test_appsearch_reglocator(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(prop, "#-42"), "Expected \"#-42\", got \"%s\"\n", prop); - size = ExpandEnvironmentStringsA("%PATH%", NULL, 0); - if (size == 0 && GetLastError() == ERROR_INVALID_PARAMETER) + memset(&si, 0, sizeof(si)); + if (pGetNativeSystemInfo) pGetNativeSystemInfo(&si); + + if (S(U(si)).wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) { - /* Workaround for Win95 */ - CHAR tempbuf[1]; - size = ExpandEnvironmentStringsA("%PATH%", tempbuf, 0); + size = ExpandEnvironmentStringsA("%PATH%", NULL, 0); + pathvar = HeapAlloc(GetProcessHeap(), 0, size); + ExpandEnvironmentStringsA("%PATH%", pathvar, size); + + size = 0; + r = MsiGetPropertyA(hpkg, "SIGPROP4", NULL, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + pathdata = HeapAlloc(GetProcessHeap(), 0, ++size); + r = MsiGetPropertyA(hpkg, "SIGPROP4", pathdata, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(pathdata, pathvar), + "Expected \"%s\", got \"%s\"\n", pathvar, pathdata); + + HeapFree(GetProcessHeap(), 0, pathvar); + HeapFree(GetProcessHeap(), 0, pathdata); } - pathvar = HeapAlloc(GetProcessHeap(), 0, size); - ExpandEnvironmentStringsA("%PATH%", pathvar, size); - - size = 0; - r = MsiGetPropertyA(hpkg, "SIGPROP4", NULL, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - - pathdata = HeapAlloc(GetProcessHeap(), 0, ++size); - r = MsiGetPropertyA(hpkg, "SIGPROP4", pathdata, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(pathdata, pathvar), - "Expected \"%s\", got \"%s\"\n", pathvar, pathdata); - - HeapFree(GetProcessHeap(), 0, pathvar); - HeapFree(GetProcessHeap(), 0, pathdata); size = MAX_PATH; r = MsiGetPropertyA(hpkg, "SIGPROP5", prop, &size); @@ -8357,7 +8983,7 @@ static void test_appsearch_reglocator(void) RegDeleteValueA(hklm, "Value15"); RegDeleteValueA(hklm, "Value16"); RegDeleteValueA(hklm, "Value17"); - RegDeleteKeyA(hklm, ""); + RegDeleteKey(hklm, ""); RegCloseKey(hklm); RegDeleteValueA(classes, "Value1"); @@ -8554,8 +9180,15 @@ static void test_appsearch_inilocator(void) r = add_signature_entry(hdb, "'NewSignature12', 'ignored', '1.1.1.1', '2.1.1.1', '', '', '', '', ''"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - hpkg = package_from_db(hdb); - ok(hpkg, "Expected a valid package handle\n"); + r = package_from_db(hdb, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected a valid package handle %u\n", r); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiDoAction(hpkg, "AppSearch"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -8632,12 +9265,14 @@ static void test_appsearch_inilocator(void) ok(!lstrcmpA(prop, path), "Expected \"%s\", got \"%s\"\n", path, prop); } + MsiCloseHandle(hpkg); + +error: delete_win_ini("IniFile.ini"); DeleteFileA("FileName1"); DeleteFileA("FileName2.dll"); DeleteFileA("FileName3.dll"); DeleteFileA("FileName4.dll"); - MsiCloseHandle(hpkg); DeleteFileA(msifile); } @@ -8807,7 +9442,7 @@ static void test_appsearch_drlocator(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* parent */ - r = add_reglocator_entry(hdb, "'NewSignature12', 2, 'htmlfile\\shell\\open\\nonexistent', '', 1"); + r = add_reglocator_entry(hdb, "NewSignature12", 2, "htmlfile\\shell\\open\\nonexistent", "", 1); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* parent is in RegLocator, no path, depth 0, no signature */ @@ -8850,8 +9485,15 @@ static void test_appsearch_drlocator(void) r = add_signature_entry(hdb, str); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - hpkg = package_from_db(hdb); - ok(hpkg, "Expected a valid package handle\n"); + r = package_from_db(hdb, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok(r == ERROR_SUCCESS, "Expected a valid package handle %u\n", r); + + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); r = MsiDoAction(hpkg, "AppSearch"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -8927,6 +9569,9 @@ static void test_appsearch_drlocator(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!prop[0], "Expected \"\", got \"%s\"\n", prop); + MsiCloseHandle(hpkg); + +error: DeleteFileA("FileName1"); DeleteFileA("FileName3.dll"); DeleteFileA("FileName4.dll"); @@ -8936,7 +9581,6 @@ static void test_appsearch_drlocator(void) RemoveDirectoryA("one\\two"); RemoveDirectoryA("one"); RemoveDirectoryA("another"); - MsiCloseHandle(hpkg); DeleteFileA(msifile); } @@ -8977,6 +9621,10 @@ static void test_featureparents(void) r = add_feature_entry( hdb, "'orion', '', '', '', 2, 1, '', 0" ); ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r ); + /* msidbFeatureAttributesUIDisallowAbsent */ + r = add_feature_entry( hdb, "'lyra', '', '', '', 2, 1, '', 16" ); + ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r ); + /* disabled because of install level */ r = add_feature_entry( hdb, "'waters', '', '', '', 15, 101, '', 9" ); ok( r == ERROR_SUCCESS, "cannot add feature: %d\n", r ); @@ -9027,6 +9675,7 @@ static void test_featureparents(void) /* msidbFeatureAttributesFavorLocal:msidbComponentAttributesOptional */ r = add_component_entry( hdb, "'lepus', '', 'TARGETDIR', 2, '', 'lepus_file'" ); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); r = add_feature_components_entry( hdb, "'zodiac', 'leo'" ); ok( r == ERROR_SUCCESS, "cannot add feature components: %d\n", r ); @@ -9112,11 +9761,19 @@ static void test_featureparents(void) r = add_file_entry( hdb, "'hydrus_file', 'hydrus', 'hydrus.txt', 0, '', '1033', 8192, 1" ); ok( r == ERROR_SUCCESS, "cannot add file: %d\n", r); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); MsiCloseHandle( hdb ); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiDoAction( hpkg, "CostInitialize"); ok( r == ERROR_SUCCESS, "cost init failed\n"); @@ -9147,6 +9804,13 @@ static void test_featureparents(void) ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "lyra", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_LOCAL, "Expected INSTALLSTATE_LOCAL, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetFeatureState(hpkg, "waters", &state, &action); @@ -9241,6 +9905,12 @@ static void test_featureparents(void) r = MsiSetFeatureState(hpkg, "orion", INSTALLSTATE_ABSENT); ok( r == ERROR_SUCCESS, "failed to set feature state: %d\n", r); + r = MsiSetFeatureState(hpkg, "lyra", INSTALLSTATE_ABSENT); + ok( r == ERROR_SUCCESS, "failed to set feature state: %d\n", r); + + r = MsiSetFeatureState(hpkg, "nosuchfeature", INSTALLSTATE_ABSENT); + ok( r == ERROR_UNKNOWN_FEATURE, "Expected ERROR_UNKNOWN_FEATURE, got %u\n", r); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetFeatureState(hpkg, "zodiac", &state, &action); @@ -9262,6 +9932,13 @@ static void test_featureparents(void) ok( state == INSTALLSTATE_ABSENT, "Expected orion INSTALLSTATE_ABSENT, got %d\n", state); ok( action == INSTALLSTATE_ABSENT, "Expected orion INSTALLSTATE_ABSENT, got %d\n", action); + state = 0xdeadbee; + action = 0xdeadbee; + r = MsiGetFeatureState(hpkg, "lyra", &state, &action); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r ); + ok( state == INSTALLSTATE_ABSENT, "Expected lyra INSTALLSTATE_ABSENT, got %d\n", state); + ok( action == INSTALLSTATE_ABSENT, "Expected lyra INSTALLSTATE_ABSENT, got %d\n", action); + state = 0xdeadbee; action = 0xdeadbee; r = MsiGetComponentState(hpkg, "leo", &state, &action); @@ -9346,13 +10023,17 @@ static void test_featureparents(void) static void test_installprops(void) { MSIHANDLE hpkg, hdb; - CHAR path[MAX_PATH]; - CHAR buf[MAX_PATH]; + CHAR path[MAX_PATH], buf[MAX_PATH]; DWORD size, type; LANGID langid; HKEY hkey1, hkey2; int res; UINT r; + REGSAM access = KEY_ALL_ACCESS; + SYSTEM_INFO si; + + if (is_wow64) + access |= KEY_WOW64_64KEY; GetCurrentDirectory(MAX_PATH, path); lstrcat(path, "\\"); @@ -9361,8 +10042,14 @@ static void test_installprops(void) hdb = create_package_db(); ok( hdb, "failed to create database\n"); - hpkg = package_from_db(hdb); - ok( hpkg, "failed to create package\n"); + r = package_from_db(hdb, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); MsiCloseHandle(hdb); @@ -9372,8 +10059,7 @@ static void test_installprops(void) ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf); RegOpenKey(HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\MS Setup (ACME)\\User Info", &hkey1); - - RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", &hkey2); + RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, access, &hkey2); size = MAX_PATH; type = REG_SZ; @@ -9385,14 +10071,10 @@ static void test_installprops(void) RegQueryValueEx(hkey2, "RegisteredOwner", NULL, &type, (LPBYTE)path, &size); } - /* win9x doesn't set this */ - if (*path) - { - size = MAX_PATH; - r = MsiGetProperty(hpkg, "USERNAME", buf, &size); - ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r); - ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf); - } + size = MAX_PATH; + r = MsiGetProperty(hpkg, "USERNAME", buf, &size); + ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok( !lstrcmp(buf, path), "Expected %s, got %s\n", path, buf); size = MAX_PATH; type = REG_SZ; @@ -9437,24 +10119,233 @@ static void test_installprops(void) ok( r == ERROR_SUCCESS, "failed to get property: %d\n", r); trace("PackageCode = %s\n", buf); + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ComputerName", buf, &size); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); + trace("ComputerName = %s\n", buf); + langid = GetUserDefaultLangID(); sprintf(path, "%d", langid); size = MAX_PATH; r = MsiGetProperty(hpkg, "UserLanguageID", buf, &size); - ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS< got %d\n", r); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); ok( !lstrcmpA(buf, path), "Expected \"%s\", got \"%s\"\n", path, buf); res = GetSystemMetrics(SM_CXSCREEN); size = MAX_PATH; r = MsiGetProperty(hpkg, "ScreenX", buf, &size); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf)); res = GetSystemMetrics(SM_CYSCREEN); size = MAX_PATH; r = MsiGetProperty(hpkg, "ScreenY", buf, &size); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS got %d\n", r); ok(atol(buf) == res, "Expected %d, got %ld\n", res, atol(buf)); + if (pGetSystemInfo && pSHGetFolderPathA) + { + pGetSystemInfo(&si); + if (S(U(si)).wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) + { + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "MsiAMD64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(buf[0], "property not set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "Msix64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(buf[0], "property not set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "System64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + GetSystemDirectoryA(path, MAX_PATH); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "SystemFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pGetSystemWow64DirectoryA(path, MAX_PATH); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFiles64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILESX86, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFiles64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES_COMMONX86, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "VersionNT64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(buf[0], "property not set\n"); + } + else if (S(U(si)).wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) + { + if (!is_wow64) + { + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "MsiAMD64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "Msix64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "System64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "SystemFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + GetSystemDirectoryA(path, MAX_PATH); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFiles64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFiles64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES_COMMON, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "VersionNT64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + } + else + { + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "MsiAMD64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(buf[0], "property not set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "Msix64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(buf[0], "property not set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "System64Folder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + GetSystemDirectoryA(path, MAX_PATH); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "SystemFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pGetSystemWow64DirectoryA(path, MAX_PATH); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFilesFolder64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "ProgramFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILESX86, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFilesFolder64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(!buf[0], "property set\n"); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "CommonFilesFolder", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + pSHGetFolderPathA(NULL, CSIDL_PROGRAM_FILES_COMMONX86, NULL, 0, path); + if (size) buf[size - 1] = 0; + ok(!lstrcmpiA(path, buf), "expected \"%s\", got \"%s\"\n", path, buf); + + buf[0] = 0; + size = MAX_PATH; + r = MsiGetProperty(hpkg, "VersionNT64", buf, &size); + ok(r == ERROR_SUCCESS, "failed to get property: %d\n", r); + ok(buf[0], "property not set\n"); + } + } + } + CloseHandle(hkey1); CloseHandle(hkey2); MsiCloseHandle(hpkg); @@ -9482,14 +10373,22 @@ static void test_launchconditions(void) r = add_launchcondition_entry( hdb, "'X != \"1\"', 'one'" ); ok( r == ERROR_SUCCESS, "cannot add launch condition: %d\n", r ); - hpkg = package_from_db( hdb ); - ok( hpkg, "failed to create package\n"); + r = package_from_db( hdb, &hpkg ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok( r == ERROR_SUCCESS, "failed to create package %u\n", r ); MsiCloseHandle( hdb ); r = MsiSetProperty( hpkg, "X", "1" ); ok( r == ERROR_SUCCESS, "failed to set property\n" ); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + /* invalid conditions are ignored */ r = MsiDoAction( hpkg, "LaunchConditions" ); ok( r == ERROR_SUCCESS, "cost init failed\n" ); @@ -9512,8 +10411,6 @@ static void test_ccpsearch(void) DWORD size = MAX_PATH; UINT r; - MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); - hdb = create_package_db(); ok(hdb, "failed to create package database\n"); @@ -9529,7 +10426,7 @@ static void test_ccpsearch(void) r = create_reglocator_table(hdb); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - r = add_reglocator_entry(hdb, "'CCP_random', 0, 'htmlfile\\shell\\open\\nonexistent', '', 1"); + r = add_reglocator_entry(hdb, "CCP_random", 0, "htmlfile\\shell\\open\\nonexistent", "", 1); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = create_drlocator_table(hdb); @@ -9541,11 +10438,19 @@ static void test_ccpsearch(void) r = create_signature_table(hdb); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - hpkg = package_from_db(hdb); - ok(hpkg, "failed to create package\n"); + r = package_from_db(hdb, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok(r == ERROR_SUCCESS, "failed to create package %u\n", r); MsiCloseHandle(hdb); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiDoAction(hpkg, "CCPSearch"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -9697,8 +10602,14 @@ static void test_complocator(void) r = add_signature_entry(hdb, "'labocania', 'labocania', '', '', '', '', '', '', ''"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - hpkg = package_from_db(hdb); - ok(hpkg, "failed to create package\n"); + r = package_from_db(hdb, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok(r == ERROR_SUCCESS, "failed to create package %u\n", r); MsiCloseHandle(hdb); @@ -9736,6 +10647,8 @@ static void test_complocator(void) set_component_path("neosodon", MSIINSTALLCONTEXT_MACHINE, "{0B499649-197A-48EF-93D2-AF1C17ED6E90}", NULL, FALSE); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiDoAction(hpkg, "AppSearch"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -9928,8 +10841,14 @@ static void test_MsiGetSourcePath(void) r = MsiDatabaseCommit(hdb); ok(r == ERROR_SUCCESS , "Failed to commit database\n"); - hpkg = package_from_db(hdb); - ok(hpkg, "failed to create package\n"); + r = package_from_db(hdb, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok(r == ERROR_SUCCESS, "failed to create package %u\n", r); MsiCloseHandle(hdb); @@ -9971,6 +10890,20 @@ static void test_MsiGetSourcePath(void) "Expected path to be unchanged, got \"%s\"\n", path); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path); + ok(size == 0, "Expected 0, got %d\n", size); + + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path); + ok(size == 0, "Expected 0, got %d\n", size); + /* try SourceDir */ size = MAX_PATH; lstrcpyA(path, "kiwi"); @@ -9990,6 +10923,13 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path does not exist, but the property exists */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path); + ok(size == 0, "Expected 0, got %d\n", size); + size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -10015,6 +10955,8 @@ static void test_MsiGetSourcePath(void) "Expected path to be unchanged, got \"%s\"\n", path); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiDoAction(hpkg, "CostInitialize"); ok(r == ERROR_SUCCESS, "cost init failed\n"); @@ -10044,15 +10986,19 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path does not exist, but the property exists */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine - { - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); - } + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); /* try SubDir after CostInitialize */ size = MAX_PATH; @@ -10099,6 +11045,13 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path does not exist, but the property exists */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -10151,6 +11104,13 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path does not exist, but the property exists */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -10203,6 +11163,13 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path does not exist, but the property exists */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -10275,6 +11242,31 @@ static void test_MsiGetSourcePath(void) ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + /* remove property */ + r = MsiSetProperty(hpkg, "SourceDir", NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* try SourceDir again */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetSourcePath(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + + /* set property to a valid directory */ + r = MsiSetProperty(hpkg, "SOURCEDIR", cwd); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + /* try SOURCEDIR again */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size); + ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r); + ok(!lstrcmpA(path, "kiwi"), + "Expected path to be unchanged, got \"%s\"\n", path); + ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); + MsiCloseHandle(hpkg); /* compressed source */ @@ -10284,8 +11276,8 @@ static void test_MsiGetSourcePath(void) set_suminfo_prop(hdb, PID_WORDCOUNT, msidbSumInfoSourceTypeCompressed); - hpkg = package_from_db(hdb); - ok(hpkg, "failed to create package\n"); + r = package_from_db(hdb, &hpkg); + ok(r == ERROR_SUCCESS, "failed to create package %u\n", r); /* try TARGETDIR */ size = MAX_PATH; @@ -10315,6 +11307,13 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path nor the property exist */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path); + ok(size == 0, "Expected 0, got %d\n", size); + size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -10371,15 +11370,19 @@ static void test_MsiGetSourcePath(void) } /* source path does not exist, but the property exists */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - todo_wine - { - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); - } + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); /* try SubDir after CostInitialize */ size = MAX_PATH; @@ -10428,6 +11431,13 @@ static void test_MsiGetSourcePath(void) } /* source path and the property exist */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -10482,6 +11492,13 @@ static void test_MsiGetSourcePath(void) } /* source path and the property exist */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -10536,6 +11553,13 @@ static void test_MsiGetSourcePath(void) } /* source path and the property exist */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SourceDir", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -10618,14 +11642,22 @@ static void test_shortlongsource(void) MsiDatabaseCommit(hdb); - hpkg = package_from_db(hdb); - ok(hpkg, "failed to create package\n"); + r = package_from_db(hdb, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok(r == ERROR_SUCCESS, "failed to create package %u\n", r); MsiCloseHandle(hdb); CreateDirectoryA("one", NULL); CreateDirectoryA("four", NULL); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiDoAction(hpkg, "CostInitialize"); ok(r == ERROR_SUCCESS, "file cost failed\n"); @@ -10758,8 +11790,8 @@ static void test_shortlongsource(void) set_suminfo_prop(hdb, PID_WORDCOUNT, msidbSumInfoSourceTypeSFN); - hpkg = package_from_db(hdb); - ok(hpkg, "failed to create package\n"); + r = package_from_db(hdb, &hpkg); + ok(r == ERROR_SUCCESS, "failed to create package %u\n", r); MsiCloseHandle(hdb); @@ -10900,7 +11932,7 @@ static void test_shortlongsource(void) static void test_sourcedir(void) { MSIHANDLE hdb, hpkg; - CHAR package[10]; + CHAR package[12]; CHAR path[MAX_PATH]; CHAR cwd[MAX_PATH]; CHAR subsrc[MAX_PATH]; @@ -10920,8 +11952,13 @@ static void test_sourcedir(void) r = add_directory_entry(hdb, "'TARGETDIR', '', 'SourceDir'"); ok(r == S_OK, "failed\n"); - sprintf(package, "#%i", hdb); + sprintf(package, "#%u", hdb); r = MsiOpenPackage(package, &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* properties only */ @@ -10942,6 +11979,8 @@ static void test_sourcedir(void) ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path); ok(size == 0, "Expected 0, got %d\n", size); + MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL); + r = MsiDoAction(hpkg, "CostInitialize"); ok(r == ERROR_SUCCESS, "file cost failed\n"); @@ -10999,6 +12038,23 @@ static void test_sourcedir(void) ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path); ok(size == 0, "Expected 0, got %d\n", size); + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetSourcePath(hpkg, "SOURCEDIR", path, &size); + ok(r == ERROR_DIRECTORY, "Expected ERROR_DIRECTORY, got %d\n", r); + ok(!lstrcmpA(path, "kiwi"), "Expected \"kiwi\", got \"%s\"\n", path); + ok(size == MAX_PATH, "Expected %d, got %d\n", MAX_PATH, size); + + /* SOURCEDIR after calling MsiGetSourcePath */ + size = MAX_PATH; + lstrcpyA(path, "kiwi"); + r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + todo_wine { + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + } + r = MsiDoAction(hpkg, "ResolveSource"); ok(r == ERROR_SUCCESS, "file cost failed\n"); @@ -11225,8 +12281,10 @@ static void test_sourcedir(void) "Expected path to be unchanged, got \"%s\"\n", path); ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); - MsiCloseHandle(hdb); MsiCloseHandle(hpkg); + +error: + MsiCloseHandle(hdb); DeleteFileA(msifile); } @@ -11331,9 +12389,7 @@ static void _test_file_access(LPCSTR file, const struct access_res *ares, DWORD line, idx, ares[idx].gothandle, (hfile != INVALID_HANDLE_VALUE)); - ok(lasterr == ares[idx].lasterr || - lasterr == 0xdeadbeef, /* win9x */ - "(%d, lasterr, %d): Expected %d, got %d\n", + ok(lasterr == ares[idx].lasterr, "(%d, lasterr, %d): Expected %d, got %d\n", line, idx, ares[idx].lasterr, lasterr); CloseHandle(hfile); @@ -11358,11 +12414,9 @@ static void test_access(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); test_file_access(msifile, create_commit); - MsiCloseHandle(hdb); test_file_access(msifile, create_close); - DeleteFileA(msifile); r = MsiOpenDatabaseA(msifile, MSIDBOPEN_CREATEDIRECT, &hdb); @@ -11374,11 +12428,9 @@ static void test_access(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); test_file_access(msifile, create_commit); - MsiCloseHandle(hdb); test_file_access(msifile, create_close); - DeleteFileA(msifile); } @@ -11392,6 +12444,11 @@ static void test_emptypackage(void) UINT r; r = MsiOpenPackageA("", &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + return; + } todo_wine { ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -11555,21 +12612,16 @@ static void test_MsiGetProductProperty(void) DWORD size; LONG res; UINT r; - SC_HANDLE scm; - - scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); - if (!scm && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) - { - win_skip("Different registry keys on Win9x and WinMe\n"); - return; - } - CloseServiceHandle(scm); + REGSAM access = KEY_ALL_ACCESS; GetCurrentDirectoryA(MAX_PATH, path); lstrcatA(path, "\\"); create_test_guid(prodcode, prod_squashed); + if (is_wow64) + access |= KEY_WOW64_64KEY; + r = MsiOpenDatabase(msifile, MSIDBOPEN_CREATE, &hdb); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); @@ -11608,14 +12660,20 @@ static void test_MsiGetProductProperty(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res == ERROR_ACCESS_DENIED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); lstrcpyA(keypath, "Software\\Microsoft\\Windows\\CurrentVersion\\"); lstrcatA(keypath, "Installer\\UserData\\S-1-5-18\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); if (res == ERROR_ACCESS_DENIED) { skip("Not enough rights to perform tests\n"); @@ -11625,7 +12683,7 @@ static void test_MsiGetProductProperty(void) } ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); - res = RegCreateKeyA(userkey, "InstallProperties", &props); + res = RegCreateKeyExA(userkey, "InstallProperties", 0, NULL, 0, access, NULL, &props, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); lstrcpyA(val, path); @@ -11760,11 +12818,11 @@ static void test_MsiGetProductProperty(void) MsiCloseHandle(hprod); RegDeleteValueA(props, "LocalPackage"); - RegDeleteKeyA(props, ""); + delete_key(props, "", access); RegCloseKey(props); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access); RegCloseKey(userkey); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access); RegCloseKey(prodkey); DeleteFileA(msifile); } @@ -11777,8 +12835,14 @@ static void test_MsiSetProperty(void) DWORD size; UINT r; - hpkg = package_from_db(create_package_db()); - ok(hpkg != 0, "Expected a valid package\n"); + r = package_from_db(create_package_db(), &hpkg); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + DeleteFile(msifile); + return; + } + ok(r == ERROR_SUCCESS, "Expected a valid package %u\n", r); /* invalid hInstall */ r = MsiSetPropertyA(0, "Prop", "Val"); @@ -11894,51 +12958,31 @@ static void test_MsiApplyMultiplePatches(void) ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r); r = pMsiApplyMultiplePatchesA(";", NULL, NULL); - todo_wine - { - if (type == DRIVE_FIXED) - ok(r == ERROR_PATH_NOT_FOUND, - "Expected ERROR_PATH_NOT_FOUND, got %u\n", r); - else - ok(r == ERROR_INVALID_NAME, - "Expected ERROR_INVALID_NAME, got %u\n", r); - } + if (type == DRIVE_FIXED) + todo_wine ok(r == ERROR_PATH_NOT_FOUND, "Expected ERROR_PATH_NOT_FOUND, got %u\n", r); + else + ok(r == ERROR_INVALID_NAME, "Expected ERROR_INVALID_NAME, got %u\n", r); r = pMsiApplyMultiplePatchesA(" ;", NULL, NULL); - todo_wine - { - if (type == DRIVE_FIXED) - ok(r == ERROR_PATCH_PACKAGE_OPEN_FAILED, - "Expected ERROR_PATCH_PACKAGE_OPEN_FAILED, got %u\n", r); - else - ok(r == ERROR_INVALID_NAME, - "Expected ERROR_INVALID_NAME, got %u\n", r); - } + if (type == DRIVE_FIXED) + todo_wine ok(r == ERROR_PATCH_PACKAGE_OPEN_FAILED, "Expected ERROR_PATCH_PACKAGE_OPEN_FAILED, got %u\n", r); + else + ok(r == ERROR_INVALID_NAME, "Expected ERROR_INVALID_NAME, got %u\n", r); r = pMsiApplyMultiplePatchesA(";;", NULL, NULL); - todo_wine - { - if (type == DRIVE_FIXED) - ok(r == ERROR_PATH_NOT_FOUND, - "Expected ERROR_PATH_NOT_FOUND, got %u\n", r); - else - ok(r == ERROR_INVALID_NAME, - "Expected ERROR_INVALID_NAME, got %u\n", r); - } + if (type == DRIVE_FIXED) + todo_wine ok(r == ERROR_PATH_NOT_FOUND, "Expected ERROR_PATH_NOT_FOUND, got %u\n", r); + else + ok(r == ERROR_INVALID_NAME, "Expected ERROR_INVALID_NAME, got %u\n", r); r = pMsiApplyMultiplePatchesA("nosuchpatchpackage;", NULL, NULL); todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r); r = pMsiApplyMultiplePatchesA(";nosuchpatchpackage", NULL, NULL); - todo_wine - { - if (type == DRIVE_FIXED) - ok(r == ERROR_PATH_NOT_FOUND, - "Expected ERROR_PATH_NOT_FOUND, got %u\n", r); - else - ok(r == ERROR_INVALID_NAME, - "Expected ERROR_INVALID_NAME, got %u\n", r); - } + if (type == DRIVE_FIXED) + todo_wine ok(r == ERROR_PATH_NOT_FOUND, "Expected ERROR_PATH_NOT_FOUND, got %u\n", r); + else + ok(r == ERROR_INVALID_NAME, "Expected ERROR_INVALID_NAME, got %u\n", r); r = pMsiApplyMultiplePatchesA("nosuchpatchpackage;nosuchpatchpackage", NULL, NULL); todo_wine ok(r == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %u\n", r); @@ -11958,6 +13002,231 @@ static void test_MsiApplyPatch(void) ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r); } +static void test_MsiEnumComponentCosts(void) +{ + MSIHANDLE hdb, hpkg; + char package[12], drive[3]; + DWORD len; + UINT r; + int cost, temp; + + hdb = create_package_db(); + ok( hdb, "failed to create database\n" ); + + r = create_property_table( hdb ); + ok( r == ERROR_SUCCESS, "cannot create Property table %u\n", r ); + + r = add_property_entry( hdb, "'ProductCode', '{379B1C47-40C1-42FA-A9BB-BEBB6F1B0172}'" ); + ok( r == ERROR_SUCCESS, "cannot add property entry %u\n", r ); + + r = add_property_entry( hdb, "'MSIFASTINSTALL', '1'" ); + ok( r == ERROR_SUCCESS, "cannot add property entry %u\n", r ); + + r = add_directory_entry( hdb, "'TARGETDIR', '', 'SourceDir'" ); + ok( r == ERROR_SUCCESS, "failed to add directory entry %u\n" , r ); + + r = create_media_table( hdb ); + ok( r == ERROR_SUCCESS, "cannot create Media table %u\n", r ); + + r = add_media_entry( hdb, "'1', '2', 'cabinet', '', '', ''"); + ok( r == ERROR_SUCCESS, "cannot add media entry %u\n", r ); + + r = create_file_table( hdb ); + ok( r == ERROR_SUCCESS, "cannot create File table %u\n", r ); + + r = add_file_entry( hdb, "'one.txt', 'one', 'one.txt', 4096, '', '', 8192, 1" ); + ok( r == ERROR_SUCCESS, "cannot add file %u\n", r ); + + r = create_component_table( hdb ); + ok( r == ERROR_SUCCESS, "cannot create Component table %u\n", r ); + + r = add_component_entry( hdb, "'one', '{B2F86B9D-8447-4BC5-8883-750C45AA31CA}', 'TARGETDIR', 0, '', 'one.txt'" ); + ok( r == ERROR_SUCCESS, "cannot add component %u\n", r ); + + r = add_component_entry( hdb, "'two', '{62A09F6E-0B74-4829-BDB7-CAB66F42CCE8}', 'TARGETDIR', 0, '', ''" ); + ok( r == ERROR_SUCCESS, "cannot add component %u\n", r ); + + r = create_feature_table( hdb ); + ok( r == ERROR_SUCCESS, "cannot create Feature table %u\n", r ); + + r = add_feature_entry( hdb, "'one', '', '', '', 0, 1, '', 0" ); + ok( r == ERROR_SUCCESS, "cannot add feature %u\n", r ); + + r = add_feature_entry( hdb, "'two', '', '', '', 0, 1, '', 0" ); + ok( r == ERROR_SUCCESS, "cannot add feature %u\n", r ); + + r = create_feature_components_table( hdb ); + ok( r == ERROR_SUCCESS, "cannot create FeatureComponents table %u\n", r ); + + r = add_feature_components_entry( hdb, "'one', 'one'" ); + ok( r == ERROR_SUCCESS, "cannot add feature/component pair %u\n", r ); + + r = add_feature_components_entry( hdb, "'two', 'two'" ); + ok( r == ERROR_SUCCESS, "cannot add feature/component pair %u\n", r ); + + r = create_install_execute_sequence_table( hdb ); + ok( r == ERROR_SUCCESS, "cannot create InstallExecuteSequence table %u\n", r ); + + r = add_install_execute_sequence_entry( hdb, "'CostInitialize', '', '800'" ); + ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry %u\n", r ); + + r = add_install_execute_sequence_entry( hdb, "'FileCost', '', '900'" ); + ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry %u\n", r ); + + r = add_install_execute_sequence_entry( hdb, "'CostFinalize', '', '1000'" ); + ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry %u\n", r ); + + r = add_install_execute_sequence_entry( hdb, "'InstallValidate', '', '1100'" ); + ok( r == ERROR_SUCCESS, "cannot add install execute sequence entry %u\n", r ); + + MsiDatabaseCommit( hdb ); + + sprintf( package, "#%u", hdb ); + r = MsiOpenPackageA( package, &hpkg ); + if (r == ERROR_INSTALL_PACKAGE_REJECTED) + { + skip("Not enough rights to perform tests\n"); + goto error; + } + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiEnumComponentCostsA( 0, NULL, 0, INSTALLSTATE_UNKNOWN, NULL, NULL, NULL, NULL ); + ok( r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r ); + + r = MsiEnumComponentCostsA( hpkg, NULL, 0, INSTALLSTATE_UNKNOWN, NULL, NULL, NULL, NULL ); + ok( r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r ); + + r = MsiEnumComponentCostsA( hpkg, NULL, 0, INSTALLSTATE_UNKNOWN, NULL, NULL, NULL, NULL ); + ok( r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r ); + + r = MsiEnumComponentCostsA( hpkg, "", 0, INSTALLSTATE_UNKNOWN, NULL, NULL, NULL, NULL ); + ok( r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r ); + + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_UNKNOWN, NULL, NULL, NULL, NULL ); + ok( r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r ); + + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, NULL, NULL, NULL, NULL ); + ok( r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r ); + + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, drive, NULL, NULL, NULL ); + ok( r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r ); + + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, drive, &len, NULL, NULL ); + ok( r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r ); + + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, drive, &len, &cost, NULL ); + ok( r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r ); + + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, drive, &len, &cost, &temp ); + todo_wine ok( r == ERROR_INVALID_HANDLE_STATE, "Expected ERROR_INVALID_HANDLE_STATE, got %u\n", r ); + + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, NULL, &len, &cost, &temp ); + ok( r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %u\n", r ); + + MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); + + r = MsiDoAction( hpkg, "CostInitialize" ); + ok( r == ERROR_SUCCESS, "CostInitialize failed %u\n", r ); + + r = MsiDoAction( hpkg, "FileCost" ); + ok( r == ERROR_SUCCESS, "FileCost failed %u\n", r ); + + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, drive, &len, &cost, &temp ); + ok( r == ERROR_FUNCTION_NOT_CALLED, "Expected ERROR_FUNCTION_NOT_CALLED, got %u\n", r ); + + r = MsiDoAction( hpkg, "CostFinalize" ); + ok( r == ERROR_SUCCESS, "CostFinalize failed %u\n", r ); + + /* contrary to what msdn says InstallValidate must be called too */ + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, drive, &len, &cost, &temp ); + todo_wine ok( r == ERROR_FUNCTION_NOT_CALLED, "Expected ERROR_FUNCTION_NOT_CALLED, got %u\n", r ); + + r = MsiDoAction( hpkg, "InstallValidate" ); + ok( r == ERROR_SUCCESS, "InstallValidate failed %u\n", r ); + + len = 0; + r = MsiEnumComponentCostsA( hpkg, "three", 0, INSTALLSTATE_LOCAL, drive, &len, &cost, &temp ); + ok( r == ERROR_UNKNOWN_COMPONENT, "Expected ERROR_UNKNOWN_COMPONENT, got %u\n", r ); + + len = 0; + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, drive, &len, &cost, &temp ); + ok( r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %u\n", r ); + ok( len == 2, "expected len == 2, got %u\n", len ); + + len = 2; + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, drive, &len, &cost, &temp ); + ok( r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %u\n", r ); + ok( len == 2, "expected len == 2, got %u\n", len ); + + len = 2; + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_UNKNOWN, drive, &len, &cost, &temp ); + ok( r == ERROR_MORE_DATA, "Expected ERROR_MORE_DATA, got %u\n", r ); + ok( len == 2, "expected len == 2, got %u\n", len ); + + /* install state doesn't seem to matter */ + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_UNKNOWN, drive, &len, &cost, &temp ); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r ); + + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_ABSENT, drive, &len, &cost, &temp ); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r ); + + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_SOURCE, drive, &len, &cost, &temp ); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r ); + + len = sizeof(drive); + drive[0] = 0; + cost = temp = 0xdead; + r = MsiEnumComponentCostsA( hpkg, "one", 0, INSTALLSTATE_LOCAL, drive, &len, &cost, &temp ); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r ); + ok( len == 2, "expected len == 2, got %u\n", len ); + ok( drive[0], "expected a drive\n" ); + ok( cost && cost != 0xdead, "expected cost > 0, got %d\n", cost ); + ok( !temp, "expected temp == 0, got %d\n", temp ); + + len = sizeof(drive); + drive[0] = 0; + cost = temp = 0xdead; + r = MsiEnumComponentCostsA( hpkg, "two", 0, INSTALLSTATE_LOCAL, drive, &len, &cost, &temp ); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r ); + ok( len == 2, "expected len == 2, got %u\n", len ); + ok( drive[0], "expected a drive\n" ); + ok( !cost, "expected cost == 0, got %d\n", cost ); + ok( !temp, "expected temp == 0, got %d\n", temp ); + + len = sizeof(drive); + drive[0] = 0; + cost = temp = 0xdead; + r = MsiEnumComponentCostsA( hpkg, "", 0, INSTALLSTATE_UNKNOWN, drive, &len, &cost, &temp ); + ok( r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r ); + ok( len == 2, "expected len == 2, got %u\n", len ); + ok( drive[0], "expected a drive\n" ); + ok( !cost, "expected cost == 0, got %d\n", cost ); + ok( temp && temp != 0xdead, "expected temp > 0, got %d\n", temp ); + + /* increased index */ + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "one", 1, INSTALLSTATE_LOCAL, drive, &len, &cost, &temp ); + ok( r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %u\n", r ); + + len = sizeof(drive); + r = MsiEnumComponentCostsA( hpkg, "", 1, INSTALLSTATE_UNKNOWN, drive, &len, &cost, &temp ); + ok( r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %u\n", r ); + + MsiCloseHandle( hpkg ); +error: + MsiCloseHandle( hdb ); + DeleteFileA( msifile ); +} + START_TEST(package) { STATEMGRSTATUS status; @@ -11965,12 +13234,18 @@ START_TEST(package) init_functionpointers(); + if (pIsWow64Process) + pIsWow64Process(GetCurrentProcess(), &is_wow64); + GetCurrentDirectoryA(MAX_PATH, CURR_DIR); /* Create a restore point ourselves so we circumvent the multitude of restore points * that would have been created by all the installation and removal tests. + * + * This is not needed on version 5.0 where setting MSIFASTINSTALL prevents the + * creation of restore points. */ - if (pSRSetRestorePointA) + if (pSRSetRestorePointA && !pMsiGetComponentPathExA) { memset(&status, 0, sizeof(status)); ret = notify_system_change(BEGIN_NESTED_SYSTEM_CHANGE, &status); @@ -12007,8 +13282,9 @@ START_TEST(package) test_MsiSetProperty(); test_MsiApplyMultiplePatches(); test_MsiApplyPatch(); + test_MsiEnumComponentCosts(); - if (pSRSetRestorePointA && ret) + if (pSRSetRestorePointA && !pMsiGetComponentPathExA && ret) { ret = notify_system_change(END_NESTED_SYSTEM_CHANGE, &status); if (ret) diff --git a/rostests/winetests/msi/patch.c b/rostests/winetests/msi/patch.c index 4e10505eb08..89d5bd0aae1 100644 --- a/rostests/winetests/msi/patch.c +++ b/rostests/winetests/msi/patch.c @@ -35,6 +35,8 @@ static UINT (WINAPI *pMsiGetPatchInfoExA)( LPCSTR, LPCSTR, LPCSTR, MSIINSTALLCON LPCSTR, LPSTR, DWORD * ); static UINT (WINAPI *pMsiEnumPatchesExA)( LPCSTR, LPCSTR, DWORD, DWORD, DWORD, LPSTR, LPSTR, MSIINSTALLCONTEXT *, LPSTR, LPDWORD ); +static BOOL (WINAPI *pGetTokenInformation)( HANDLE, TOKEN_INFORMATION_CLASS, LPVOID, DWORD, PDWORD ); +static BOOL (WINAPI *pOpenProcessToken)( HANDLE, DWORD, PHANDLE ); static const char *msifile = "winetest-patch.msi"; static const char *mspfile = "winetest-patch.msp"; @@ -55,7 +57,8 @@ static const char property_dat[] = "ProductLanguage\t1033\n" "ProductName\tmsitest\n" "ProductVersion\t1.1.1\n" - "PATCHNEWSUMMARYSUBJECT\tInstaller Database\n"; + "PATCHNEWSUMMARYSUBJECT\tInstaller Database\n" + "MSIFASTINSTALL\t1\n"; static const char media_dat[] = "DiskId\tLastSequence\tDiskPrompt\tCabinet\tVolumeLabel\tSource\n" @@ -138,6 +141,7 @@ static const struct msi_table tables[] = static void init_function_pointers( void ) { HMODULE hmsi = GetModuleHandleA( "msi.dll" ); + HMODULE hadvapi32 = GetModuleHandleA( "advapi32.dll" ); #define GET_PROC( mod, func ) \ p ## func = (void *)GetProcAddress( mod, #func ); \ @@ -147,9 +151,31 @@ static void init_function_pointers( void ) GET_PROC( hmsi, MsiApplyPatchA ); GET_PROC( hmsi, MsiGetPatchInfoExA ); GET_PROC( hmsi, MsiEnumPatchesExA ); + + GET_PROC( hadvapi32, GetTokenInformation ); + GET_PROC( hadvapi32, OpenProcessToken ); #undef GET_PROC } +static BOOL is_process_limited(void) +{ + HANDLE token; + + if (!pOpenProcessToken || !pGetTokenInformation) return FALSE; + + if (pOpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) + { + BOOL ret; + TOKEN_ELEVATION_TYPE type = TokenElevationTypeDefault; + DWORD size; + + ret = pGetTokenInformation(token, TokenElevationType, &type, sizeof(type), &size); + CloseHandle(token); + return (ret && type == TokenElevationTypeLimited); + } + return FALSE; +} + static BOOL get_program_files_dir( char *buf, char *buf2 ) { HKEY hkey; @@ -260,7 +286,7 @@ static void set_suminfo( const char *filename ) r = MsiSummaryInfoSetProperty( hsi, 7, VT_LPSTR, 0, NULL, ";1033" ); ok( r == ERROR_SUCCESS, "failed to set summary info %u\n", r ); - r = MsiSummaryInfoSetProperty( hsi, 9, VT_LPSTR, 0, NULL, "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}" ); + r = MsiSummaryInfoSetProperty( hsi, 9, VT_LPSTR, 0, NULL, "{E528DDD6-4801-4BEC-BBB6-C5EE0FD097E9}" ); ok( r == ERROR_SUCCESS, "failed to set summary info %u\n", r ); r = MsiSummaryInfoSetProperty( hsi, 14, VT_I4, 100, NULL, NULL ); @@ -681,7 +707,7 @@ static void test_simple_patch( void ) { UINT r; DWORD size; - char path[MAX_PATH], install_source[MAX_PATH]; + char path[MAX_PATH], install_source[MAX_PATH], buffer[32]; const char *query; MSIHANDLE hpackage, hdb, hview, hrec; @@ -690,6 +716,11 @@ static void test_simple_patch( void ) win_skip("MsiApplyPatchA is not available\n"); return; } + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } CreateDirectoryA( "msitest", NULL ); create_file( "msitest\\patch.txt", 1000 ); @@ -700,7 +731,11 @@ static void test_simple_patch( void ) MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); r = MsiInstallProductA( msifile, NULL ); - ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + if (r != ERROR_SUCCESS) + { + skip("Product installation failed with error code %u\n", r); + goto cleanup; + } size = get_pf_file_size( "msitest\\patch.txt" ); ok( size == 1000, "expected 1000, got %u\n", size ); @@ -749,6 +784,12 @@ static void test_simple_patch( void ) MsiViewClose( hview ); MsiCloseHandle( hview ); + buffer[0] = 0; + size = sizeof(buffer); + r = MsiGetProperty( hpackage, "PATCHNEWSUMMARYSUBJECT", buffer, &size ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + ok( !strcmp( buffer, "Installer Database" ), "expected \'Installer Database\', got \'%s\'\n", buffer ); + MsiCloseHandle( hdb ); MsiCloseHandle( hpackage ); @@ -759,7 +800,7 @@ static void test_simple_patch( void ) if (r == ERROR_PATCH_PACKAGE_INVALID) { win_skip("Windows Installer < 3.0 detected\n"); - return; + goto uninstall; } size = get_pf_file_size( "msitest\\patch.txt" ); @@ -801,6 +842,12 @@ static void test_simple_patch( void ) MsiViewClose( hview ); MsiCloseHandle( hview ); + buffer[0] = 0; + size = sizeof(buffer); + r = MsiGetProperty( hpackage, "PATCHNEWSUMMARYSUBJECT", buffer, &size ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + ok( !strcmp( buffer, "Installation Database" ), "expected \'Installation Database\', got \'%s\'\n", buffer ); + MsiCloseHandle( hdb ); MsiCloseHandle( hpackage ); @@ -827,6 +874,7 @@ static void test_simple_patch( void ) MsiCloseHandle( hview ); MsiCloseHandle( hdb ); +uninstall: size = sizeof(path); r = MsiGetProductInfoA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", "InstallSource", path, &size ); @@ -839,8 +887,10 @@ static void test_simple_patch( void ) ok( !delete_pf( "msitest\\patch.txt", TRUE ), "file not removed\n" ); ok( !delete_pf( "msitest", FALSE ), "directory not removed\n" ); +cleanup: DeleteFileA( msifile ); DeleteFileA( mspfile ); + DeleteFileA( "msitest\\patch.txt" ); RemoveDirectoryA( "msitest" ); } @@ -907,17 +957,85 @@ static UINT find_entry( MSIHANDLE hdb, const char *table, const char *entry ) return r; } +static INT get_integer( MSIHANDLE hdb, UINT field, const char *query) +{ + UINT r; + INT ret = -1; + MSIHANDLE hview, hrec; + + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewExecute( hview, 0 ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewFetch( hview, &hrec ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + if (r == ERROR_SUCCESS) + { + UINT r_tmp; + ret = MsiRecordGetInteger( hrec, field ); + MsiCloseHandle( hrec ); + + r_tmp = MsiViewFetch( hview, &hrec ); + ok( r_tmp == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r); + } + + MsiViewClose( hview ); + MsiCloseHandle( hview ); + return ret; +} + +static char *get_string( MSIHANDLE hdb, UINT field, const char *query) +{ + UINT r; + static char ret[MAX_PATH]; + MSIHANDLE hview, hrec; + + ret[0] = '\0'; + + r = MsiDatabaseOpenView( hdb, query, &hview ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewExecute( hview, 0 ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + + r = MsiViewFetch( hview, &hrec ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + if (r == ERROR_SUCCESS) + { + UINT size = MAX_PATH; + r = MsiRecordGetStringA( hrec, field, ret, &size ); + ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r); + MsiCloseHandle( hrec ); + + r = MsiViewFetch( hview, &hrec ); + ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r); + } + + MsiViewClose( hview ); + MsiCloseHandle( hview ); + return ret; +} + static void test_system_tables( void ) { UINT r; + char *cr; const char *query; MSIHANDLE hproduct, hdb, hview, hrec; + static const char patchsource[] = "MSPSRC0F96CDC04CDF4304B2837B9264889EF7"; if (!pMsiApplyPatchA) { win_skip("MsiApplyPatchA is not available\n"); return; } + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } CreateDirectoryA( "msitest", NULL ); create_file( "msitest\\patch.txt", 1000 ); @@ -928,7 +1046,11 @@ static void test_system_tables( void ) MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); r = MsiInstallProductA( msifile, NULL ); - ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + if (r != ERROR_SUCCESS) + { + skip("Product installation failed with error code %d\n", r); + goto cleanup; + } r = MsiOpenProductA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", &hproduct ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); @@ -973,6 +1095,9 @@ static void test_system_tables( void ) r = find_entry( hdb, "_Tables", "Media" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + r = get_integer( hdb, 1, "SELECT * FROM `Media` WHERE `VolumeLabel`=\'DISK1\'"); + ok( r == 1, "Got %u\n", r ); + r = find_entry( hdb, "_Tables", "_Property" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); @@ -989,7 +1114,7 @@ static void test_system_tables( void ) if (r == ERROR_PATCH_PACKAGE_INVALID) { win_skip("Windows Installer < 3.0 detected\n"); - return; + goto uninstall; } r = MsiOpenProductA( "{913B8D18-FBB6-4CAC-A239-C74C11E3FA74}", &hproduct ); @@ -1047,17 +1172,38 @@ static void test_system_tables( void ) r = find_entry( hdb, "_Tables", "PatchPackage" ); ok( r == ERROR_SUCCESS, "failed to find entry %u\n", r ); + cr = get_string( hdb, 6, "SELECT * FROM `Media` WHERE `Source` IS NOT NULL"); + todo_wine ok( !strcmp(cr, patchsource), "Expected \"%s\", got \"%s\"\n", patchsource, cr ); + + r = get_integer( hdb, 1, "SELECT * FROM `Media` WHERE `Source` IS NOT NULL"); + todo_wine ok( r == 100, "Got %u\n", r ); + + r = get_integer( hdb, 2, "SELECT * FROM `Media` WHERE `Source` IS NOT NULL"); + todo_wine ok( r == 10000, "Got %u\n", r ); + + r = get_integer( hdb, 1, "SELECT * FROM `Media` WHERE `VolumeLabel`=\'DISK1\'"); + ok( r == 1, "Got %u\n", r ); + + cr = get_string( hdb, 4, "SELECT * FROM `Media` WHERE `Source` IS NOT NULL"); + ok( !strcmp(cr, "#CAB_msitest"), "Expected \"#CAB_msitest\", got \"%s\"\n", cr ); + + r = get_integer( hdb, 8, "SELECT * FROM `File` WHERE `File` = 'patch.txt'"); + ok( r == 10000, "Got %u\n", r ); + MsiCloseHandle( hrec ); MsiViewClose( hview ); MsiCloseHandle( hview ); MsiCloseHandle( hdb ); MsiCloseHandle( hproduct ); +uninstall: r = MsiInstallProductA( msifile, "REMOVE=ALL" ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); +cleanup: DeleteFileA( msifile ); DeleteFileA( mspfile ); + DeleteFileA( "msitest\\patch.txt" ); RemoveDirectoryA( "msitest" ); } @@ -1071,6 +1217,11 @@ static void test_patch_registration( void ) win_skip("required functions not available\n"); return; } + if (is_process_limited()) + { + skip("process is limited\n"); + return; + } CreateDirectoryA( "msitest", NULL ); create_file( "msitest\\patch.txt", 1000 ); @@ -1081,7 +1232,11 @@ static void test_patch_registration( void ) MsiSetInternalUI( INSTALLUILEVEL_NONE, NULL ); r = MsiInstallProductA( msifile, NULL ); - ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); + if (r != ERROR_SUCCESS) + { + skip("Product installation failed with error code %d\n", r); + goto cleanup; + } r = MsiApplyPatchA( mspfile, NULL, INSTALLTYPE_DEFAULT, NULL ); ok( r == ERROR_SUCCESS || broken( r == ERROR_PATCH_PACKAGE_INVALID ), /* version 2.0 */ @@ -1090,7 +1245,7 @@ static void test_patch_registration( void ) if (r == ERROR_PATCH_PACKAGE_INVALID) { win_skip("Windows Installer < 3.0 detected\n"); - return; + goto uninstall; } buffer[0] = 0; @@ -1135,6 +1290,7 @@ static void test_patch_registration( void ) 0, patch_code, NULL, NULL, NULL, NULL ); ok( r == ERROR_NO_MORE_ITEMS, "expected ERROR_NO_MORE_ITEMS, got %u\n", r ); +uninstall: r = MsiInstallProductA( msifile, "REMOVE=ALL" ); ok( r == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %u\n", r ); @@ -1146,8 +1302,10 @@ static void test_patch_registration( void ) INSTALLPROPERTY_LOCALPACKAGE, buffer, &size ); ok( r == ERROR_UNKNOWN_PRODUCT, "expected ERROR_UNKNOWN_PRODUCT, got %u\n", r ); +cleanup: DeleteFileA( msifile ); DeleteFileA( mspfile ); + DeleteFileA( "msitest\\patch.txt" ); RemoveDirectoryA( "msitest" ); } diff --git a/rostests/winetests/msi/record.c b/rostests/winetests/msi/record.c index 0b807797215..2de43cb053f 100644 --- a/rostests/winetests/msi/record.c +++ b/rostests/winetests/msi/record.c @@ -589,6 +589,9 @@ static void test_fieldzero(void) MsiCloseHandle(rec); + r = MsiDatabaseGetPrimaryKeysA(hdb, "nosuchtable", &rec); + ok(r == ERROR_INVALID_TABLE, "Expected ERROR_INVALID_TABLE, got %d\n", r); + query = "SELECT * FROM `drone` WHERE `id` = 1"; r = MsiDatabaseOpenView(hdb, query, &hview); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); diff --git a/rostests/winetests/msi/source.c b/rostests/winetests/msi/source.c index 1826f2175be..74b7cf30f5a 100644 --- a/rostests/winetests/msi/source.c +++ b/rostests/winetests/msi/source.c @@ -31,8 +31,13 @@ #include "wine/test.h" +static BOOL is_wow64; + static BOOL (WINAPI *pConvertSidToStringSidA)(PSID, LPSTR*); +static LONG (WINAPI *pRegDeleteKeyExA)(HKEY, LPCSTR, REGSAM, DWORD); static BOOLEAN (WINAPI *pGetUserNameExA)(EXTENDED_NAME_FORMAT, LPSTR, PULONG); +static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); + static UINT (WINAPI *pMsiSourceListAddMediaDiskA) (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, DWORD, LPCSTR, LPCSTR); static UINT (WINAPI *pMsiSourceListAddSourceExA) @@ -53,6 +58,7 @@ static void init_functionpointers(void) { HMODULE hmsi = GetModuleHandleA("msi.dll"); HMODULE hadvapi32 = GetModuleHandleA("advapi32.dll"); + HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); HMODULE hsecur32 = LoadLibraryA("secur32.dll"); #define GET_PROC(dll, func) \ @@ -69,7 +75,8 @@ static void init_functionpointers(void) GET_PROC(hmsi, MsiSourceListAddSourceA) GET_PROC(hadvapi32, ConvertSidToStringSidA) - + GET_PROC(hadvapi32, RegDeleteKeyExA) + GET_PROC(hkernel32, IsWow64Process) GET_PROC(hsecur32, GetUserNameExA) #undef GET_PROC @@ -127,25 +134,28 @@ static void create_test_guid(LPSTR prodcode, LPSTR squashed) WideCharToMultiByte(CP_ACP, 0, squashedW, -1, squashed, MAX_PATH, NULL, NULL); } -static int get_user_sid(LPSTR *usersid) +static char *get_user_sid(void) { HANDLE token; - BYTE buf[1024]; - DWORD size; - PTOKEN_USER user; - BOOL rc; + DWORD size = 0; + TOKEN_USER *user; + char *usersid = NULL; if (!pConvertSidToStringSidA) - return 0; - rc=OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token); - if (!rc && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - return 0; - size = sizeof(buf); - GetTokenInformation(token, TokenUser, buf, size, &size); - user = (PTOKEN_USER)buf; - pConvertSidToStringSidA(user->User.Sid, usersid); + { + win_skip("ConvertSidToStringSidA is not available\n"); + return NULL; + } + OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token); + GetTokenInformation(token, TokenUser, NULL, size, &size); + + user = HeapAlloc(GetProcessHeap(), 0, size); + GetTokenInformation(token, TokenUser, user, size, &size); + pConvertSidToStringSidA(user->User.Sid, &usersid); + HeapFree(GetProcessHeap(), 0, user); + CloseHandle(token); - return 1; + return usersid; } static void check_reg_str(HKEY prodkey, LPCSTR name, LPCSTR expected, BOOL bcase, DWORD line) @@ -198,7 +208,7 @@ static void test_MsiSourceListGetInfo(void) } create_test_guid(prodcode, prod_squashed); - if (!get_user_sid(&usersid)) + if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListGetInfoA tests\n"); return; @@ -219,11 +229,6 @@ static void test_MsiSourceListGetInfo(void) MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - /* szProductCodeOrPatchCode */ - r = pMsiSourceListGetInfoA("garbage", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, - MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL); - ok(r == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %d\n", r); - /* guid without brackets */ r = pMsiSourceListGetInfoA("51CD2AD5-0482-4C46-8DDD-0ED1022AA1AA", usersid, MSIINSTALLCONTEXT_USERUNMANAGED, MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAME, NULL, NULL); @@ -631,6 +636,13 @@ static void test_MsiSourceListGetInfo(void) LocalFree(usersid); } +static LONG delete_key( HKEY key, LPCSTR subkey, REGSAM access ) +{ + if (pRegDeleteKeyExA) + return pRegDeleteKeyExA( key, subkey, access, 0 ); + return RegDeleteKeyA( key, subkey ); +} + static void test_MsiSourceListAddSourceEx(void) { CHAR prodcode[MAX_PATH]; @@ -640,9 +652,9 @@ static void test_MsiSourceListAddSourceEx(void) LPSTR usersid; LONG res; UINT r; - HKEY prodkey, userkey, hkey; - HKEY url, net; + HKEY prodkey, userkey, hkey, url, net; DWORD size; + REGSAM access = KEY_ALL_ACCESS; if (!pMsiSourceListAddSourceExA) { @@ -651,12 +663,15 @@ static void test_MsiSourceListAddSourceEx(void) } create_test_guid(prodcode, prod_squashed); - if (!get_user_sid(&usersid)) + if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListAddSourceExA tests\n"); return; } + if (is_wow64) + access |= KEY_WOW64_64KEY; + /* GetLastError is not set by the function */ /* NULL szProductCodeOrPatchCode */ @@ -900,8 +915,12 @@ static void test_MsiSourceListAddSourceEx(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + goto machine_tests; + } /* product key exists */ r = pMsiSourceListAddSourceExA(prodcode, usersid, @@ -909,7 +928,7 @@ static void test_MsiSourceListAddSourceEx(void) MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); - res = RegCreateKeyA(prodkey, "SourceList", &hkey); + res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &hkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); RegCloseKey(hkey); @@ -919,7 +938,7 @@ static void test_MsiSourceListAddSourceEx(void) MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - res = RegOpenKeyA(prodkey, "SourceList\\URL", &url); + res = RegOpenKeyExA(prodkey, "SourceList\\URL", 0, access, &url); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); size = MAX_PATH; @@ -937,7 +956,7 @@ static void test_MsiSourceListAddSourceEx(void) MSICODE_PRODUCT | MSISOURCETYPE_URL, "another", 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - res = RegOpenKeyA(prodkey, "SourceList\\URL", &url); + res = RegOpenKeyExA(prodkey, "SourceList\\URL", 0, access, &url); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); size = MAX_PATH; @@ -957,6 +976,7 @@ static void test_MsiSourceListAddSourceEx(void) /* MSIINSTALLCONTEXT_MACHINE */ +machine_tests: /* szUserSid must be NULL for MSIINSTALLCONTEXT_MACHINE */ r = pMsiSourceListAddSourceExA(prodcode, usersid, MSIINSTALLCONTEXT_MACHINE, @@ -971,8 +991,13 @@ static void test_MsiSourceListAddSourceEx(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + LocalFree(usersid); + return; + } /* product key exists */ r = pMsiSourceListAddSourceExA(prodcode, NULL, @@ -980,7 +1005,7 @@ static void test_MsiSourceListAddSourceEx(void) MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); - res = RegCreateKeyA(prodkey, "SourceList", &hkey); + res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &hkey, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); RegCloseKey(hkey); @@ -990,7 +1015,7 @@ static void test_MsiSourceListAddSourceEx(void) MSICODE_PRODUCT | MSISOURCETYPE_URL, "C:\\source", 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - res = RegOpenKeyA(prodkey, "SourceList\\URL", &url); + res = RegOpenKeyExA(prodkey, "SourceList\\URL", 0, access, &url); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); size = MAX_PATH; @@ -1001,7 +1026,7 @@ static void test_MsiSourceListAddSourceEx(void) RegCloseKey(url); RegCloseKey(prodkey); - HeapFree(GetProcessHeap(), 0, usersid); + LocalFree(usersid); } static void test_MsiSourceListEnumSources(void) @@ -1016,6 +1041,7 @@ static void test_MsiSourceListEnumSources(void) HKEY prodkey, userkey; HKEY url, net, source; DWORD size; + REGSAM access = KEY_ALL_ACCESS; if (!pMsiSourceListEnumSourcesA) { @@ -1024,12 +1050,15 @@ static void test_MsiSourceListEnumSources(void) } create_test_guid(prodcode, prod_squashed); - if (!get_user_sid(&usersid)) + if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListEnumSourcesA tests\n"); return; } + if (is_wow64) + access |= KEY_WOW64_64KEY; + /* GetLastError is not set by the function */ /* NULL szProductCodeOrPatchCode */ @@ -1362,8 +1391,12 @@ static void test_MsiSourceListEnumSources(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + goto machine_tests; + } /* user product key exists */ size = MAX_PATH; @@ -1375,7 +1408,7 @@ static void test_MsiSourceListEnumSources(void) ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); - res = RegCreateKeyA(userkey, "SourceList", &source); + res = RegCreateKeyExA(userkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists */ @@ -1388,7 +1421,7 @@ static void test_MsiSourceListEnumSources(void) ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); - res = RegCreateKeyA(source, "URL", &url); + res = RegCreateKeyExA(source, "URL", 0, NULL, 0, access, NULL, &url, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* URL key exists */ @@ -1425,7 +1458,7 @@ static void test_MsiSourceListEnumSources(void) ok(size == 5, "Expected 5, got %d\n", size); RegDeleteValueA(url, "1"); - RegDeleteKeyA(url, ""); + delete_key(url, "", access); RegCloseKey(url); /* SourceList key exists */ @@ -1438,7 +1471,7 @@ static void test_MsiSourceListEnumSources(void) ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); - res = RegCreateKeyA(source, "Net", &net); + res = RegCreateKeyExA(source, "Net", 0, NULL, 0, access, NULL, &net, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Net key exists */ @@ -1465,15 +1498,16 @@ static void test_MsiSourceListEnumSources(void) ok(size == 5, "Expected 5, got %d\n", size); RegDeleteValueA(net, "1"); - RegDeleteKeyA(net, ""); + delete_key(net, "", access); RegCloseKey(net); - RegDeleteKeyA(source, ""); + delete_key(source, "", access); RegCloseKey(source); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access); RegCloseKey(userkey); /* MSIINSTALLCONTEXT_MACHINE */ +machine_tests: /* szUserSid is non-NULL */ size = MAX_PATH; lstrcpyA(value, "aaa"); @@ -1484,7 +1518,7 @@ static void test_MsiSourceListEnumSources(void) ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); - /* szUserSid is non-NULL */ + /* szUserSid is NULL */ size = MAX_PATH; lstrcpyA(value, "aaa"); r = pMsiSourceListEnumSourcesA(prodcode, NULL, @@ -1497,8 +1531,13 @@ static void test_MsiSourceListEnumSources(void) lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + LocalFree(usersid); + return; + } /* user product key exists */ size = MAX_PATH; @@ -1510,7 +1549,7 @@ static void test_MsiSourceListEnumSources(void) ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); - res = RegCreateKeyA(prodkey, "SourceList", &source); + res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists */ @@ -1523,7 +1562,7 @@ static void test_MsiSourceListEnumSources(void) ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); - res = RegCreateKeyA(source, "URL", &url); + res = RegCreateKeyExA(source, "URL", 0, NULL, 0, access, NULL, &url, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* URL key exists */ @@ -1560,7 +1599,7 @@ static void test_MsiSourceListEnumSources(void) ok(size == 5, "Expected 5, got %d\n", size); RegDeleteValueA(url, "1"); - RegDeleteKeyA(url, ""); + delete_key(url, "", access); RegCloseKey(url); /* SourceList key exists */ @@ -1573,7 +1612,7 @@ static void test_MsiSourceListEnumSources(void) ok(!lstrcmpA(value, "aaa"), "Expected value to be unchanged, got %s\n", value); ok(size == MAX_PATH, "Expected MAX_PATH, got %d\n", size); - res = RegCreateKeyA(source, "Net", &net); + res = RegCreateKeyExA(source, "Net", 0, NULL, 0, access, NULL, &net, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Net key exists */ @@ -1600,11 +1639,11 @@ static void test_MsiSourceListEnumSources(void) ok(size == 5, "Expected 5, got %d\n", size); RegDeleteValueA(net, "1"); - RegDeleteKeyA(net, ""); + delete_key(net, "", access); RegCloseKey(net); - RegDeleteKeyA(source, ""); + delete_key(source, "", access); RegCloseKey(source); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access); RegCloseKey(prodkey); LocalFree(usersid); } @@ -1619,6 +1658,7 @@ static void test_MsiSourceListSetInfo(void) LPSTR usersid; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; if (!pMsiSourceListSetInfoA) { @@ -1627,12 +1667,15 @@ static void test_MsiSourceListSetInfo(void) } create_test_guid(prodcode, prod_squashed); - if (!get_user_sid(&usersid)) + if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListSetInfoA tests\n"); return; } + if (is_wow64) + access |= KEY_WOW64_64KEY; + /* GetLastError is not set by the function */ /* NULL szProductCodeOrPatchCode */ @@ -1942,8 +1985,12 @@ static void test_MsiSourceListSetInfo(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + goto machine_tests; + } /* user product key exists */ r = pMsiSourceListSetInfoA(prodcode, NULL, @@ -1952,7 +1999,7 @@ static void test_MsiSourceListSetInfo(void) ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); - res = RegCreateKeyA(userkey, "SourceList", &source); + res = RegCreateKeyExA(userkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists, no source type */ @@ -1962,25 +2009,31 @@ static void test_MsiSourceListSetInfo(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* Media key is created by MsiSourceListSetInfo */ - res = RegOpenKeyA(source, "Media", &media); + res = RegOpenKeyExA(source, "Media", 0, access, &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); CHECK_REG_STR(media, "MediaPackage", "path"); RegDeleteValueA(media, "MediaPackage"); - RegDeleteKeyA(media, ""); + delete_key(media, "", access); RegCloseKey(media); - RegDeleteKeyA(source, ""); + delete_key(source, "", access); RegCloseKey(source); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access); RegCloseKey(userkey); /* MSIINSTALLCONTEXT_MACHINE */ +machine_tests: lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + LocalFree(usersid); + return; + } /* user product key exists */ r = pMsiSourceListSetInfoA(prodcode, NULL, @@ -1989,7 +2042,7 @@ static void test_MsiSourceListSetInfo(void) ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); - res = RegCreateKeyA(prodkey, "SourceList", &source); + res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists, no source type */ @@ -1999,7 +2052,7 @@ static void test_MsiSourceListSetInfo(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* Media key is created by MsiSourceListSetInfo */ - res = RegOpenKeyA(source, "Media", &media); + res = RegOpenKeyExA(source, "Media", 0, access, &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); CHECK_REG_STR(media, "MediaPackage", "path"); @@ -2011,11 +2064,11 @@ static void test_MsiSourceListSetInfo(void) "Expected ERROR_INVALID_PARAMETER, got %d\n", r); RegDeleteValueA(media, "MediaPackage"); - RegDeleteKeyA(media, ""); + delete_key(media, "", access); RegCloseKey(media); - RegDeleteKeyA(source, ""); + delete_key(source, "", access); RegCloseKey(source); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access); RegCloseKey(prodkey); LocalFree(usersid); } @@ -2030,6 +2083,7 @@ static void test_MsiSourceListAddMediaDisk(void) LPSTR usersid; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; if (!pMsiSourceListAddMediaDiskA) { @@ -2038,12 +2092,15 @@ static void test_MsiSourceListAddMediaDisk(void) } create_test_guid(prodcode, prod_squashed); - if (!get_user_sid(&usersid)) + if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListAddMediaDiskA tests\n"); return; } + if (is_wow64) + access |= KEY_WOW64_64KEY; + /* GetLastError is not set by the function */ /* NULL szProductCodeOrPatchCode */ @@ -2238,8 +2295,12 @@ static void test_MsiSourceListAddMediaDisk(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + goto machine_tests; + } /* user product key exists */ r = pMsiSourceListAddMediaDiskA(prodcode, usersid, @@ -2248,7 +2309,7 @@ static void test_MsiSourceListAddMediaDisk(void) ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); - res = RegCreateKeyA(userkey, "SourceList", &source); + res = RegCreateKeyExA(userkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists */ @@ -2258,26 +2319,32 @@ static void test_MsiSourceListAddMediaDisk(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* Media subkey is created by MsiSourceListAddMediaDisk */ - res = RegOpenKeyA(source, "Media", &media); + res = RegOpenKeyExA(source, "Media", 0, access, &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); CHECK_REG_STR(media, "1", "label;prompt"); RegDeleteValueA(media, "1"); - RegDeleteKeyA(media, ""); + delete_key(media, "", access); RegCloseKey(media); - RegDeleteKeyA(source, ""); + delete_key(source, "", access); RegCloseKey(source); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access); RegCloseKey(userkey); /* MSIINSTALLCONTEXT_MACHINE */ +machine_tests: lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + LocalFree(usersid); + return; + } /* machine product key exists */ r = pMsiSourceListAddMediaDiskA(prodcode, NULL, @@ -2286,7 +2353,7 @@ static void test_MsiSourceListAddMediaDisk(void) ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); - res = RegCreateKeyA(prodkey, "SourceList", &source); + res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists */ @@ -2296,7 +2363,7 @@ static void test_MsiSourceListAddMediaDisk(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* Media subkey is created by MsiSourceListAddMediaDisk */ - res = RegOpenKeyA(source, "Media", &media); + res = RegOpenKeyExA(source, "Media", 0, access, &media); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); CHECK_REG_STR(media, "1", "label;prompt"); @@ -2309,11 +2376,11 @@ static void test_MsiSourceListAddMediaDisk(void) "Expected ERROR_INVALID_PARAMETER, got %d\n", r); RegDeleteValueA(media, "1"); - RegDeleteKeyA(media, ""); + delete_key(media, "", access); RegCloseKey(media); - RegDeleteKeyA(source, ""); + delete_key(source, "", access); RegCloseKey(source); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access); RegCloseKey(prodkey); LocalFree(usersid); } @@ -2325,14 +2392,12 @@ static void test_MsiSourceListEnumMediaDisks(void) CHAR keypath[MAX_PATH*2]; CHAR label[MAX_PATH]; CHAR prompt[MAX_PATH]; - HKEY prodkey, userkey; - HKEY media, source; - DWORD labelsz, promptsz; + HKEY prodkey, userkey, media, source; + DWORD labelsz, promptsz, val, id; LPSTR usersid; - DWORD val; - DWORD id; LONG res; UINT r; + REGSAM access = KEY_ALL_ACCESS; if (!pMsiSourceListEnumMediaDisksA) { @@ -2341,12 +2406,15 @@ static void test_MsiSourceListEnumMediaDisks(void) } create_test_guid(prodcode, prod_squashed); - if (!get_user_sid(&usersid)) + if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListEnumMediaDisksA tests\n"); return; } + if (is_wow64) + access |= KEY_WOW64_64KEY; + /* GetLastError is not set by the function */ /* NULL szProductCodeOrPatchCode */ @@ -2943,8 +3011,12 @@ static void test_MsiSourceListEnumMediaDisks(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + goto machine_tests; + } /* user product key exists */ r = pMsiSourceListEnumMediaDisksA(prodcode, usersid, MSIINSTALLCONTEXT_USERMANAGED, @@ -2953,7 +3025,7 @@ static void test_MsiSourceListEnumMediaDisks(void) ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); - res = RegCreateKeyA(userkey, "SourceList", &source); + res = RegCreateKeyExA(userkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists */ @@ -2973,7 +3045,7 @@ static void test_MsiSourceListEnumMediaDisks(void) ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", promptsz); - res = RegCreateKeyA(source, "Media", &media); + res = RegCreateKeyExA(source, "Media", 0, NULL, 0, access, NULL, &media, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Media key exists */ @@ -3013,20 +3085,26 @@ static void test_MsiSourceListEnumMediaDisks(void) ok(promptsz == 6, "Expected 6, got %d\n", promptsz); RegDeleteValueA(media, "2"); - RegDeleteKeyA(media, ""); + delete_key(media, "", access); RegCloseKey(media); - RegDeleteKeyA(source, ""); + delete_key(source, "", access); RegCloseKey(source); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access); RegCloseKey(userkey); /* MSIINSTALLCONTEXT_MACHINE */ +machine_tests: lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + LocalFree(usersid); + return; + } /* machine product key exists */ r = pMsiSourceListEnumMediaDisksA(prodcode, NULL, MSIINSTALLCONTEXT_MACHINE, @@ -3035,7 +3113,7 @@ static void test_MsiSourceListEnumMediaDisks(void) ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); - res = RegCreateKeyA(prodkey, "SourceList", &source); + res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists */ @@ -3055,7 +3133,7 @@ static void test_MsiSourceListEnumMediaDisks(void) ok(!lstrcmpA(prompt, "bbb"), "Expected \"bbb\", got \"%s\"\n", prompt); ok(promptsz == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", promptsz); - res = RegCreateKeyA(source, "Media", &media); + res = RegCreateKeyExA(source, "Media", 0, NULL, 0, access, NULL, &media, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* Media key exists */ @@ -3112,11 +3190,11 @@ static void test_MsiSourceListEnumMediaDisks(void) ok(promptsz == MAX_PATH, "Expected MAX_PATH, got %d\n", promptsz); RegDeleteValueA(media, "2"); - RegDeleteKeyA(media, ""); + delete_key(media, "", access); RegCloseKey(media); - RegDeleteKeyA(source, ""); + delete_key(source, "", access); RegCloseKey(source); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access); RegCloseKey(prodkey); LocalFree(usersid); } @@ -3130,9 +3208,9 @@ static void test_MsiSourceListAddSource(void) LPSTR usersid, ptr; LONG res; UINT r; - HKEY prodkey, userkey; - HKEY net, source; + HKEY prodkey, userkey, net, source; DWORD size; + REGSAM access = KEY_ALL_ACCESS; if (!pMsiSourceListAddSourceA) { @@ -3141,7 +3219,7 @@ static void test_MsiSourceListAddSource(void) } create_test_guid(prodcode, prod_squashed); - if (!get_user_sid(&usersid)) + if (!(usersid = get_user_sid())) { skip("User SID not available -> skipping MsiSourceListAddSourceA tests\n"); return; @@ -3161,6 +3239,9 @@ static void test_MsiSourceListAddSource(void) } trace("username: %s\n", username); + if (is_wow64) + access |= KEY_WOW64_64KEY; + /* GetLastError is not set by the function */ /* NULL szProduct */ @@ -3205,14 +3286,18 @@ static void test_MsiSourceListAddSource(void) lstrcatA(keypath, "\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &userkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &userkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + goto userunmanaged_tests; + } /* user product key exists */ r = pMsiSourceListAddSourceA(prodcode, username, 0, "source"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); - res = RegCreateKeyA(userkey, "SourceList", &source); + res = RegCreateKeyExA(userkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists */ @@ -3220,7 +3305,7 @@ static void test_MsiSourceListAddSource(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* Net key is created */ - res = RegOpenKeyA(source, "Net", &net); + res = RegOpenKeyExA(source, "Net", 0, access, &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* LastUsedSource does not exist and it is not created */ @@ -3230,7 +3315,7 @@ static void test_MsiSourceListAddSource(void) CHECK_REG_STR(net, "1", "source\\"); RegDeleteValueA(net, "1"); - RegDeleteKeyA(net, ""); + delete_key(net, "", access); RegCloseKey(net); res = RegSetValueExA(source, "LastUsedSource", 0, REG_SZ, (LPBYTE)"blah", 5); @@ -3241,14 +3326,14 @@ static void test_MsiSourceListAddSource(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* Net key is created */ - res = RegOpenKeyA(source, "Net", &net); + res = RegOpenKeyExA(source, "Net", 0, access, &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); CHECK_REG_STR(source, "LastUsedSource", "blah"); CHECK_REG_STR(net, "1", "source\\"); RegDeleteValueA(net, "1"); - RegDeleteKeyA(net, ""); + delete_key(net, "", access); RegCloseKey(net); res = RegSetValueExA(source, "LastUsedSource", 0, REG_SZ, (LPBYTE)"5", 2); @@ -3259,7 +3344,7 @@ static void test_MsiSourceListAddSource(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* Net key is created */ - res = RegOpenKeyA(source, "Net", &net); + res = RegOpenKeyExA(source, "Net", 0, access, &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); CHECK_REG_STR(source, "LastUsedSource", "5"); @@ -3288,15 +3373,16 @@ static void test_MsiSourceListAddSource(void) RegDeleteValueA(net, "1"); RegDeleteValueA(net, "2"); RegDeleteValueA(net, "3"); - RegDeleteKeyA(net, ""); + delete_key(net, "", access); RegCloseKey(net); - RegDeleteKeyA(source, ""); + delete_key(source, "", access); RegCloseKey(source); - RegDeleteKeyA(userkey, ""); + delete_key(userkey, "", access); RegCloseKey(userkey); /* MSIINSTALLCONTEXT_USERUNMANAGED */ +userunmanaged_tests: r = pMsiSourceListAddSourceA(prodcode, username, 0, "source"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); @@ -3304,7 +3390,11 @@ static void test_MsiSourceListAddSource(void) lstrcatA(keypath, prod_squashed); res = RegCreateKeyA(HKEY_CURRENT_USER, keypath, &userkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + goto machine_tests; + } /* user product key exists */ r = pMsiSourceListAddSourceA(prodcode, username, 0, "source"); @@ -3333,20 +3423,26 @@ static void test_MsiSourceListAddSource(void) /* MSIINSTALLCONTEXT_MACHINE */ +machine_tests: r = pMsiSourceListAddSourceA(prodcode, NULL, 0, "source"); ok(r == ERROR_UNKNOWN_PRODUCT, "Expected ERROR_UNKNOWN_PRODUCT, got %d\n", r); lstrcpyA(keypath, "Software\\Classes\\Installer\\Products\\"); lstrcatA(keypath, prod_squashed); - res = RegCreateKeyA(HKEY_LOCAL_MACHINE, keypath, &prodkey); - ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + res = RegCreateKeyExA(HKEY_LOCAL_MACHINE, keypath, 0, NULL, 0, access, NULL, &prodkey, NULL); + if (res != ERROR_SUCCESS) + { + skip("Product key creation failed with error code %u\n", res); + LocalFree(usersid); + return; + } /* machine product key exists */ r = pMsiSourceListAddSourceA(prodcode, NULL, 0, "source"); ok(r == ERROR_BAD_CONFIGURATION, "Expected ERROR_BAD_CONFIGURATION, got %d\n", r); - res = RegCreateKeyA(prodkey, "SourceList", &source); + res = RegCreateKeyExA(prodkey, "SourceList", 0, NULL, 0, access, NULL, &source, NULL); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); /* SourceList key exists */ @@ -3354,7 +3450,7 @@ static void test_MsiSourceListAddSource(void) ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); /* Net key is created */ - res = RegOpenKeyA(source, "Net", &net); + res = RegOpenKeyExA(source, "Net", 0, access, &net); ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); CHECK_REG_STR(net, "1", "source\\"); @@ -3368,11 +3464,11 @@ static void test_MsiSourceListAddSource(void) RegDeleteValueA(net, "2"); RegDeleteValueA(net, "1"); - RegDeleteKeyA(net, ""); + delete_key(net, "", access); RegCloseKey(net); - RegDeleteKeyA(source, ""); + delete_key(source, "", access); RegCloseKey(source); - RegDeleteKeyA(prodkey, ""); + delete_key(prodkey, "", access); RegCloseKey(prodkey); LocalFree(usersid); } @@ -3381,6 +3477,9 @@ START_TEST(source) { init_functionpointers(); + if (pIsWow64Process) + pIsWow64Process(GetCurrentProcess(), &is_wow64); + test_MsiSourceListGetInfo(); test_MsiSourceListAddSourceEx(); test_MsiSourceListEnumSources(); diff --git a/rostests/winetests/msi/suminfo.c b/rostests/winetests/msi/suminfo.c index a0b225b6bd9..76dac57c4e7 100644 --- a/rostests/winetests/msi/suminfo.c +++ b/rostests/winetests/msi/suminfo.c @@ -63,7 +63,7 @@ #define PID_MSISOURCE PID_WORDCOUNT #define PID_MSIRESTRICT PID_CHARCOUNT -const char *msifile = "winetest-suminfo.msi"; +static const char *msifile = "winetest-suminfo.msi"; static const WCHAR msifileW[] = { 'w','i','n','e','t','e','s','t','-','s','u','m','i','n','f','o','.','m','s','i',0 }; @@ -86,7 +86,18 @@ static void test_suminfo(void) ok(r == ERROR_INVALID_PARAMETER, "MsiGetSummaryInformation wrong error\n"); r = MsiGetSummaryInformation(hdb, NULL, 0, &hsuminfo); - ok(r == ERROR_SUCCESS, "MsiGetSummaryInformation failed\n"); + ok(r == ERROR_SUCCESS, "MsiGetSummaryInformation failed %u\n", r); + + r = MsiCloseHandle(hsuminfo); + ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); + + r = MsiGetSummaryInformation(0, "", 0, &hsuminfo); + todo_wine + ok(r == ERROR_INSTALL_PACKAGE_INVALID || r == ERROR_INSTALL_PACKAGE_OPEN_FAILED, + "MsiGetSummaryInformation failed %u\n", r); + + r = MsiGetSummaryInformation(hdb, "", 0, &hsuminfo); + ok(r == ERROR_SUCCESS, "MsiGetSummaryInformation failed %u\n", r); r = MsiSummaryInfoGetPropertyCount(0, NULL); ok(r == ERROR_INVALID_HANDLE, "getpropcount failed\n"); diff --git a/rostests/winetests/msi/testlist.c b/rostests/winetests/msi/testlist.c index 0691e873085..0664527c400 100644 --- a/rostests/winetests/msi/testlist.c +++ b/rostests/winetests/msi/testlist.c @@ -6,6 +6,7 @@ #define STANDALONE #include "wine/test.h" +extern void func_action(void); extern void func_automation(void); extern void func_db(void); extern void func_format(void); @@ -17,9 +18,9 @@ extern void func_record(void); extern void func_source(void); extern void func_suminfo(void); - const struct test winetest_testlist[] = { + { "action", func_action }, { "automation", func_automation }, { "db", func_db }, { "format", func_format }, From 71425e3fc49573f375cbcf8d03802d01a2ef629d Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 21 Jan 2012 17:29:25 +0000 Subject: [PATCH 008/289] [PSDK] Fix CMake msi.dll build? svn path=/trunk/; revision=55048 --- reactos/include/psdk/imagehlp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/psdk/imagehlp.h b/reactos/include/psdk/imagehlp.h index a138cadda08..7dc8d6bffa9 100644 --- a/reactos/include/psdk/imagehlp.h +++ b/reactos/include/psdk/imagehlp.h @@ -268,7 +268,7 @@ HANDLE IMAGEAPI FindExecutableImage(LPSTR,LPSTR,LPSTR); BOOL IMAGEAPI UpdateDebugInfoFile(LPSTR,LPSTR,LPSTR,PIMAGE_NT_HEADERS32); BOOL IMAGEAPI UpdateDebugInfoFileEx(LPSTR,LPSTR,LPSTR,PIMAGE_NT_HEADERS32,DWORD); BOOL IMAGEAPI BindImage(IN LPSTR,IN LPSTR,IN LPSTR); -BOOL IMAGEAPI BindImageEx(IN DWORD,IN LPSTR,IN LPSTR,IN LPSTR,IN PIMAGEHLP_STATUS_ROUTINE); +BOOL IMAGEAPI BindImageEx(IN DWORD,IN LPCSTR,IN LPCSTR,IN LPCSTR,IN PIMAGEHLP_STATUS_ROUTINE); BOOL IMAGEAPI ReBaseImage(IN LPSTR,IN LPSTR,IN BOOL, IN BOOL,IN BOOL, IN ULONG, OUT ULONG*, OUT ULONG_PTR*, OUT ULONG*, IN OUT ULONG_PTR*, IN ULONG); PLOADED_IMAGE IMAGEAPI ImageLoad(LPSTR,LPSTR); From f377c4d88552cd3726f0b606c3c727ed9ece1231 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 21 Jan 2012 17:41:53 +0000 Subject: [PATCH 009/289] [IMAGEHLP] Fix CMake build (will be that way after sync) [MSI] Allow warnings for the moment This should fix CMake build~ svn path=/trunk/; revision=55050 --- reactos/dll/win32/imagehlp/modify.c | 2 +- reactos/dll/win32/msi/CMakeLists.txt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/imagehlp/modify.c b/reactos/dll/win32/imagehlp/modify.c index a443b66c541..c2edcd08122 100644 --- a/reactos/dll/win32/imagehlp/modify.c +++ b/reactos/dll/win32/imagehlp/modify.c @@ -45,7 +45,7 @@ BOOL IMAGEAPI BindImage( * BindImageEx (IMAGEHLP.@) */ BOOL IMAGEAPI BindImageEx( - DWORD Flags, LPSTR ImageName, LPSTR DllPath, LPSTR SymbolPath, + DWORD Flags, LPCSTR ImageName, LPCSTR DllPath, LPCSTR SymbolPath, PIMAGEHLP_STATUS_ROUTINE StatusRoutine) { FIXME("(%d, %s, %s, %s, %p): stub\n", diff --git a/reactos/dll/win32/msi/CMakeLists.txt b/reactos/dll/win32/msi/CMakeLists.txt index 0e77a085bbb..2070aade3c7 100644 --- a/reactos/dll/win32/msi/CMakeLists.txt +++ b/reactos/dll/win32/msi/CMakeLists.txt @@ -97,6 +97,8 @@ add_importlibs(msi add_pch(msi msipriv.h) add_cd_file(TARGET msi DESTINATION reactos/system32 FOR all) +allow_warnings(msi) + endif(NOT MSVC) add_importlib_target(msi.spec) From 64b31ed54c7acb7e76e1acc0b8bc4f50b0a728fe Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 21 Jan 2012 17:46:22 +0000 Subject: [PATCH 010/289] [PSDK] Sync rpcproxy.h with Wine head svn path=/trunk/; revision=55051 --- reactos/include/psdk/rpcproxy.h | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/reactos/include/psdk/rpcproxy.h b/reactos/include/psdk/rpcproxy.h index 76a88128d83..4d2c63e62d6 100644 --- a/reactos/include/psdk/rpcproxy.h +++ b/reactos/include/psdk/rpcproxy.h @@ -203,6 +203,9 @@ RPCRTAPI HRESULT RPC_ENTRY RPCRTAPI HRESULT RPC_ENTRY NdrDllUnregisterProxy( HMODULE hDll, const ProxyFileInfo **pProxyFileList, const CLSID *pclsid ); +HRESULT __wine_register_resources( HMODULE module ) DECLSPEC_HIDDEN; +HRESULT __wine_unregister_resources( HMODULE module ) DECLSPEC_HIDDEN; + #define CSTDSTUBBUFFERRELEASE(pFactory) \ ULONG WINAPI CStdStubBuffer_Release(IRpcStubBuffer *This) \ { return NdrCStdStubBuffer_Release(This, (IPSFactoryBuffer *)pFactory); } @@ -285,6 +288,15 @@ ULONG WINAPI CStdStubBuffer2_Release(IRpcStubBuffer *This) \ # define DLLCANUNLOADNOW_ENTRY DllCanUnloadNow #endif +#ifdef WINE_REGISTER_DLL +# define WINE_DO_REGISTER_DLL(pfl, clsid) return __wine_register_resources( hProxyDll ) +# define WINE_DO_UNREGISTER_DLL(pfl, clsid) return __wine_unregister_resources( hProxyDll ) +#else +# define WINE_DO_REGISTER_DLL(pfl, clsid) return NdrDllRegisterProxy( hProxyDll, (pfl), (clsid) ) +# define WINE_DO_UNREGISTER_DLL(pfl, clsid) return NdrDllUnregisterProxy( hProxyDll, (pfl), (clsid) ) +#endif + + #define DLLDATA_GETPROXYDLLINFO(pfl, rclsid) \ void RPC_ENTRY GetProxyDllInfo(const ProxyFileInfo ***ppProxyFileInfo, \ const CLSID **ppClsid) DECLSPEC_HIDDEN; \ @@ -329,16 +341,16 @@ ULONG WINAPI CStdStubBuffer2_Release(IRpcStubBuffer *This) \ HRESULT WINAPI DLLREGISTERSERVER_ENTRY(void) DECLSPEC_HIDDEN; \ HRESULT WINAPI DLLREGISTERSERVER_ENTRY(void) \ { \ - return NdrDllRegisterProxy(hProxyDll, (pfl), (factory_clsid)); \ + WINE_DO_REGISTER_DLL( (pfl), (factory_clsid) ); \ } \ \ HRESULT WINAPI DLLUNREGISTERSERVER_ENTRY(void) DECLSPEC_HIDDEN; \ HRESULT WINAPI DLLUNREGISTERSERVER_ENTRY(void) \ { \ - return NdrDllUnregisterProxy(hProxyDll, (pfl), (factory_clsid)); \ + WINE_DO_UNREGISTER_DLL( (pfl), (factory_clsid) ); \ } -#ifdef REGISTER_PROXY_DLL +#if defined(REGISTER_PROXY_DLL) || defined(WINE_REGISTER_DLL) # define DLLREGISTRY_ROUTINES(pfl, factory_clsid) \ REGISTER_PROXY_DLL_ROUTINES(pfl, factory_clsid) #else From bfd5b961d5eb5badee41cc1aa533d70d7c0edf6e Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 21 Jan 2012 17:57:39 +0000 Subject: [PATCH 011/289] [BOOTDATA] Register CLSIDs for MSI svn path=/trunk/; revision=55052 --- reactos/boot/bootdata/hivecls_i386.inf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/boot/bootdata/hivecls_i386.inf b/reactos/boot/bootdata/hivecls_i386.inf index db2a2d2384c..ece32a86ad8 100644 --- a/reactos/boot/bootdata/hivecls_i386.inf +++ b/reactos/boot/bootdata/hivecls_i386.inf @@ -281,6 +281,10 @@ HKCR,"AVIFile\shell\open\command","",0x00020000,"%SystemRoot%\system32\mplay32.e HKCR,"CLSID",,0x00000012 +; For msi.dll +HKCR, "CLSID\{000C101D-0000-0000-C000-000000000046}", "DllVersion", "3.1.4000" +HKCR, "CLSID\{000C1090-0000-0000-C000-000000000046}", "InProcHandler32", "ole32.dll" + ; For Shell32.dll HKCR,"CLSID\{1F4DE370-D627-11D1-BA4F-00A0C91EEDBA}","",0x00000000,"Computer Search Results Folder" HKCR,"CLSID\{1F4DE370-D627-11D1-BA4F-00A0C91EEDBA}","LocalizedString",0x00020000,"@%SystemRoot%\system32\shell32.dll,-30521" From 485c250872e2cd857668272f4f24bd2c933f6f09 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sat, 21 Jan 2012 18:00:41 +0000 Subject: [PATCH 012/289] [MSI] Add forgotten dependency on CMake. Should fix build (finally) svn path=/trunk/; revision=55053 --- reactos/dll/win32/msi/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/msi/CMakeLists.txt b/reactos/dll/win32/msi/CMakeLists.txt index 2070aade3c7..14899fadcf6 100644 --- a/reactos/dll/win32/msi/CMakeLists.txt +++ b/reactos/dll/win32/msi/CMakeLists.txt @@ -75,7 +75,7 @@ set_source_files_properties(msi.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BIN set_module_type(msi win32dll) target_link_libraries(msi uuid ${PSEH_LIB} wine) add_dependencies(msi msi_idlheader) -add_delay_importlibs(msi odbccp32 crypt32 imagehlp) +add_delay_importlibs(msi odbccp32 crypt32 imagehlp wintrust) add_importlibs(msi advapi32 From 1481da8a2037596a683539d70ee55692331d21eb Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sat, 21 Jan 2012 21:36:17 +0000 Subject: [PATCH 013/289] [KERNEL32] - Fix MSVC build svn path=/trunk/; revision=55055 --- reactos/dll/win32/kernel32/client/proc.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/dll/win32/kernel32/client/proc.c b/reactos/dll/win32/kernel32/client/proc.c index 1a542b03dc4..0438eb15dc9 100644 --- a/reactos/dll/win32/kernel32/client/proc.c +++ b/reactos/dll/win32/kernel32/client/proc.c @@ -59,8 +59,7 @@ RTL_QUERY_REGISTRY_TABLE BasepAppCertTable[2] = 0, NULL, 0 - }, - {} + } }; PSAFER_REPLACE_PROCESS_THREAD_TOKENS g_SaferReplaceProcessThreadTokens; From a9d56f0a135e05eb7183f28c2daaed5144887e6a Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 21 Jan 2012 22:16:46 +0000 Subject: [PATCH 014/289] [CDFS] - Prevent an infinite loop in CdfsDeviceIoControl if the the verify request is successful but IoCallDriver keeps returning STATUS_VERIFY_REQUIRED svn path=/trunk/; revision=55057 --- reactos/drivers/filesystems/cdfs/common.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/filesystems/cdfs/common.c b/reactos/drivers/filesystems/cdfs/common.c index 0b62cbaca0c..d73864bb054 100644 --- a/reactos/drivers/filesystems/cdfs/common.c +++ b/reactos/drivers/filesystems/cdfs/common.c @@ -154,6 +154,7 @@ CdfsDeviceIoControl (IN PDEVICE_OBJECT DeviceObject, KEVENT Event; PIRP Irp; NTSTATUS Status; + BOOLEAN LastChance = FALSE; DPRINT("CdfsDeviceIoControl(DeviceObject %x, CtlCode %x, " "InputBuffer %x, InputBufferSize %x, OutputBuffer %x, " @@ -208,21 +209,30 @@ again: { PDEVICE_OBJECT DeviceToVerify; - DPRINT1("STATUS_VERIFY_REQUIRED\n"); DeviceToVerify = IoGetDeviceToVerify(PsGetCurrentThread()); IoSetDeviceToVerify(PsGetCurrentThread(), NULL); if (DeviceToVerify) { Status = IoVerifyVolume(DeviceToVerify, FALSE); - DPRINT1("IoVerifyVolume() returned (Status %lx)\n", Status); + DPRINT("IoVerifyVolume() returned (Status %lx)\n", Status); } - if (NT_SUCCESS(Status)) + if (NT_SUCCESS(Status) && !LastChance) { DPRINT1("Volume verify succeeded; trying request again\n"); + LastChance = TRUE; goto again; } + else if (NT_SUCCESS(Status)) + { + DPRINT1("Failed to read after successful verify, aborting\n"); + Status = STATUS_DEVICE_NOT_READY; + } + else + { + DPRINT1("IoVerifyVolume() failed (Status %lx)\n", Status); + } } DPRINT("Returning Status %x\n", Status); From 5e5122e56d8d4f1673de8510903489721c14aec4 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 22 Jan 2012 00:39:44 +0000 Subject: [PATCH 015/289] [NETSHELL] - Fix MSVC build svn path=/trunk/; revision=55058 --- reactos/dll/win32/netshell/lanconnectui.cpp | 2 +- reactos/dll/win32/netshell/lanstatusui.cpp | 6 +++--- reactos/dll/win32/netshell/precomp.h | 3 --- .../dll/win32/netshell/shfldr_netconnect.cpp | 18 +++++++++--------- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/reactos/dll/win32/netshell/lanconnectui.cpp b/reactos/dll/win32/netshell/lanconnectui.cpp index 08acced3db8..884d0c80c60 100644 --- a/reactos/dll/win32/netshell/lanconnectui.cpp +++ b/reactos/dll/win32/netshell/lanconnectui.cpp @@ -78,7 +78,7 @@ InitializePropertySheetPage(LPWSTR resname, DLGPROC dlgproc, LPARAM lParam, LPWS memset(&ppage, 0x0, sizeof(PROPSHEETPAGEW)); ppage.dwSize = sizeof(PROPSHEETPAGEW); ppage.dwFlags = PSP_DEFAULT; - ppage.u.pszTemplate = resname; + ppage.pszTemplate = resname; ppage.pfnDlgProc = dlgproc; ppage.lParam = lParam; ppage.hInstance = netshell_hInstance; diff --git a/reactos/dll/win32/netshell/lanstatusui.cpp b/reactos/dll/win32/netshell/lanstatusui.cpp index 7d57d94692f..b7b1cddea86 100644 --- a/reactos/dll/win32/netshell/lanstatusui.cpp +++ b/reactos/dll/win32/netshell/lanstatusui.cpp @@ -232,7 +232,7 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) nid.cbSize = sizeof(nid); nid.uID = pContext->uID; nid.hWnd = pContext->hwndStatusDlg; - nid.u.uVersion = 3; + nid.uVersion = 3; if (pContext->pNet->GetProperties(&pProperties) == S_OK) { @@ -859,7 +859,7 @@ ShowStatusPropertyDialog( ZeroMemory(hppages, sizeof(hppages)); pinfo.dwSize = sizeof(PROPSHEETHEADERW); pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; - pinfo.u3.phpage = hppages; + pinfo.phpage = hppages; pinfo.hwndParent = hwndDlg; if (pContext->pNet->GetProperties(&pProperties) == S_OK) @@ -1035,7 +1035,7 @@ CLanStatus::InitializeNetTaskbarNotifications() nid.cbSize = sizeof(nid); nid.uID = Index++; nid.uFlags = NIF_MESSAGE; - nid.u.uVersion = 3; + nid.uVersion = 3; nid.uCallbackMessage = WM_SHOWSTATUSDLG; nid.hWnd = hwndDlg; diff --git a/reactos/dll/win32/netshell/precomp.h b/reactos/dll/win32/netshell/precomp.h index 3ace7f62826..3702829f9f7 100644 --- a/reactos/dll/win32/netshell/precomp.h +++ b/reactos/dll/win32/netshell/precomp.h @@ -9,9 +9,6 @@ #include #include -#define COBJMACROS -#define NONAMELESSUNION -#define NONAMELESSSTRUCT #include #include diff --git a/reactos/dll/win32/netshell/shfldr_netconnect.cpp b/reactos/dll/win32/netshell/shfldr_netconnect.cpp index be01530fc94..241ea0e22d9 100644 --- a/reactos/dll/win32/netshell/shfldr_netconnect.cpp +++ b/reactos/dll/win32/netshell/shfldr_netconnect.cpp @@ -498,7 +498,7 @@ HRESULT WINAPI CNetworkConnections::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD d if (SUCCEEDED(hr)) { strRet->uType = STRRET_WSTR; - strRet->u.pOleStr = pszName; + strRet->pOleStr = pszName; } else { @@ -578,7 +578,7 @@ HRESULT WINAPI CNetworkConnections::GetDetailsOf( { psd->str.uType = STRRET_WSTR; if (LoadStringW(netshell_hInstance, NetConnectSFHeader[iColumn].colnameid, buffer, MAX_PATH)) - hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + hr = SHStrDupW(buffer, &psd->str.pOleStr); return hr; } @@ -608,7 +608,7 @@ HRESULT WINAPI CNetworkConnections::GetDetailsOf( if (LoadStringW(netshell_hInstance, IDS_TYPE_ETHERNET, buffer, MAX_PATH)) { psd->str.uType = STRRET_WSTR; - hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + hr = SHStrDupW(buffer, &psd->str.pOleStr); } } break; @@ -629,7 +629,7 @@ HRESULT WINAPI CNetworkConnections::GetDetailsOf( { buffer[MAX_PATH-1] = L'\0'; psd->str.uType = STRRET_WSTR; - hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + hr = SHStrDupW(buffer, &psd->str.pOleStr); } break; case COLUMN_DEVNAME: @@ -638,17 +638,17 @@ HRESULT WINAPI CNetworkConnections::GetDetailsOf( wcscpy(buffer, pProperties->pszwDeviceName); buffer[MAX_PATH-1] = L'\0'; psd->str.uType = STRRET_WSTR; - hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + hr = SHStrDupW(buffer, &psd->str.pOleStr); } else { - psd->str.u.cStr[0] = '\0'; + psd->str.cStr[0] = '\0'; psd->str.uType = STRRET_CSTR; } break; case COLUMN_PHONE: case COLUMN_OWNER: - psd->str.u.cStr[0] = '\0'; + psd->str.cStr[0] = '\0'; psd->str.uType = STRRET_CSTR; break; } @@ -840,7 +840,7 @@ PropSheetExCallback(HPROPSHEETPAGE hPage, LPARAM lParam) if (pinfo->nPages < MAX_PROPERTY_SHEET_PAGE) { - pinfo->u3.phpage[pinfo->nPages++] = hPage; + pinfo->phpage[pinfo->nPages++] = hPage; return TRUE; } return FALSE; @@ -903,7 +903,7 @@ ShowNetConnectionProperties( ZeroMemory(hppages, sizeof(hppages)); pinfo.dwSize = sizeof(PROPSHEETHEADERW); pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; - pinfo.u3.phpage = hppages; + pinfo.phpage = hppages; pinfo.hwndParent = hwnd; pinfo.pszCaption = pProperties->pszwName; From 1dd928f142c0c99d4f22f1d11aa382781c89df50 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 22 Jan 2012 00:44:51 +0000 Subject: [PATCH 016/289] - Add surrogate pair macros. svn path=/trunk/; revision=55059 --- reactos/include/psdk/winnls.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/reactos/include/psdk/winnls.h b/reactos/include/psdk/winnls.h index 5615ed1f13d..97727dc0df4 100644 --- a/reactos/include/psdk/winnls.h +++ b/reactos/include/psdk/winnls.h @@ -597,6 +597,15 @@ typedef struct _FILEMUIINFO { BYTE abBuffer[8]; } FILEMUIINFO, *PFILEMUIINFO; +#define HIGH_SURROGATE_START 0xd800 +#define HIGH_SURROGATE_END 0xdbff +#define LOW_SURROGATE_START 0xdc00 +#define LOW_SURROGATE_END 0xdfff + +#define IS_HIGH_SURROGATE(ch) ((ch) >= HIGH_SURROGATE_START && (ch) <= HIGH_SURROGATE_END) +#define IS_LOW_SURROGATE(ch) ((ch) >= LOW_SURROGATE_START && (ch) <= LOW_SURROGATE_END) +#define IS_SURROGATE_PAIR(high,low) (IS_HIGH_SURROGATE(high) && IS_LOW_SURROGATE(low)) + int WINAPI CompareStringA(LCID,DWORD,LPCSTR,int,LPCSTR,int); int WINAPI CompareStringW(LCID,DWORD,LPCWSTR,int,LPCWSTR,int); LCID WINAPI ConvertDefaultLocale(LCID); From 73f8b2c4a939cc044d0811a4e35bf025fdc3c934 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 22 Jan 2012 03:05:59 +0000 Subject: [PATCH 017/289] - Remove 16 bit code. svn path=/trunk/; revision=55060 --- reactos/dll/win32/comdlg32/cdlg16.h | 162 -------- reactos/dll/win32/comdlg32/colordlg16.c | 476 --------------------- reactos/dll/win32/comdlg32/commdlg.spec | 26 -- reactos/dll/win32/comdlg32/filedlg16.c | 524 ------------------------ reactos/dll/win32/comdlg32/printdlg.h | 102 ----- 5 files changed, 1290 deletions(-) delete mode 100644 reactos/dll/win32/comdlg32/cdlg16.h delete mode 100644 reactos/dll/win32/comdlg32/colordlg16.c delete mode 100644 reactos/dll/win32/comdlg32/commdlg.spec delete mode 100644 reactos/dll/win32/comdlg32/filedlg16.c delete mode 100644 reactos/dll/win32/comdlg32/printdlg.h diff --git a/reactos/dll/win32/comdlg32/cdlg16.h b/reactos/dll/win32/comdlg32/cdlg16.h deleted file mode 100644 index 00d204e7099..00000000000 --- a/reactos/dll/win32/comdlg32/cdlg16.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Common Dialog Boxes interface (16 bit implementation) - * - * Copyright 1994 Martin Ayotte - * Copyright 1996 Albrecht Kleine - * Copyright 1998 Bertho A. Stultiens - * - * 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_DLL_CDLG16_H -#define _WINE_DLL_CDLG16_H - -#include "dlgs.h" -#include "wine/windef16.h" -#include "wine/winbase16.h" -#include "wine/winuser16.h" -#include "wownt32.h" - -/* 16 bit api */ - -#include "pshpack1.h" - -typedef UINT16 (CALLBACK *LPOFNHOOKPROC16)(HWND16,UINT16,WPARAM16,LPARAM); - -typedef struct { - DWORD lStructSize; - HWND16 hwndOwner; - HINSTANCE16 hInstance; - SEGPTR lpstrFilter; - SEGPTR lpstrCustomFilter; - DWORD nMaxCustFilter; - DWORD nFilterIndex; - SEGPTR lpstrFile; - DWORD nMaxFile; - SEGPTR lpstrFileTitle; - DWORD nMaxFileTitle; - SEGPTR lpstrInitialDir; - SEGPTR lpstrTitle; - DWORD Flags; - UINT16 nFileOffset; - UINT16 nFileExtension; - SEGPTR lpstrDefExt; - LPARAM lCustData; - LPOFNHOOKPROC16 lpfnHook; - SEGPTR lpTemplateName; -} OPENFILENAME16,*LPOPENFILENAME16; - -typedef UINT16 (CALLBACK *LPCCHOOKPROC16) (HWND16, UINT16, WPARAM16, LPARAM); - -typedef struct { - DWORD lStructSize; - HWND16 hwndOwner; - HWND16 hInstance; - COLORREF rgbResult; - SEGPTR lpCustColors; - DWORD Flags; - LPARAM lCustData; - LPCCHOOKPROC16 lpfnHook; - SEGPTR lpTemplateName; -} CHOOSECOLOR16; -typedef CHOOSECOLOR16 *LPCHOOSECOLOR16; - -typedef UINT16 (CALLBACK *LPFRHOOKPROC16)(HWND16,UINT16,WPARAM16,LPARAM); -typedef struct { - DWORD lStructSize; /* size of this struct 0x20 */ - HWND16 hwndOwner; /* handle to owner's window */ - HINSTANCE16 hInstance; /* instance handle of.EXE that */ - /* contains cust. dlg. template */ - DWORD Flags; /* one or more of the FR_?? */ - SEGPTR lpstrFindWhat; /* ptr. to search string */ - SEGPTR lpstrReplaceWith; /* ptr. to replace string */ - UINT16 wFindWhatLen; /* size of find buffer */ - UINT16 wReplaceWithLen; /* size of replace buffer */ - LPARAM lCustData; /* data passed to hook fn. */ - LPFRHOOKPROC16 lpfnHook; - SEGPTR lpTemplateName; /* custom template name */ -} FINDREPLACE16, *LPFINDREPLACE16; - -typedef UINT16 (CALLBACK *LPCFHOOKPROC16)(HWND16,UINT16,WPARAM16,LPARAM); -typedef struct -{ - DWORD lStructSize; - HWND16 hwndOwner; /* caller's window handle */ - HDC16 hDC; /* printer DC/IC or NULL */ - SEGPTR lpLogFont; /* ptr. to a LOGFONT struct */ - short iPointSize; /* 10 * size in points of selected font */ - DWORD Flags; /* enum. type flags */ - COLORREF rgbColors; /* returned text color */ - LPARAM lCustData; /* data passed to hook fn. */ - LPCFHOOKPROC16 lpfnHook; - SEGPTR lpTemplateName; /* custom template name */ - HINSTANCE16 hInstance; /* instance handle of.EXE that */ - /* contains cust. dlg. template */ - SEGPTR lpszStyle; /* return the style field here */ - /* must be LF_FACESIZE or bigger */ - UINT16 nFontType; /* same value reported to the */ - /* EnumFonts callback with the */ - /* extra FONTTYPE_ bits added */ - short nSizeMin; /* minimum pt size allowed & */ - short nSizeMax; /* max pt size allowed if */ - /* CF_LIMITSIZE is used */ -} CHOOSEFONT16, *LPCHOOSEFONT16; - - -typedef UINT16 (CALLBACK *LPPRINTHOOKPROC16) (HWND16, UINT16, WPARAM16, LPARAM); -typedef UINT16 (CALLBACK *LPSETUPHOOKPROC16) (HWND16, UINT16, WPARAM16, LPARAM); -typedef struct -{ - DWORD lStructSize; - HWND16 hwndOwner; - HGLOBAL16 hDevMode; - HGLOBAL16 hDevNames; - HDC16 hDC; - DWORD Flags; - WORD nFromPage; - WORD nToPage; - WORD nMinPage; - WORD nMaxPage; - WORD nCopies; - HINSTANCE16 hInstance; - LPARAM lCustData; - LPPRINTHOOKPROC16 lpfnPrintHook; - LPSETUPHOOKPROC16 lpfnSetupHook; - SEGPTR lpPrintTemplateName; - SEGPTR lpSetupTemplateName; - HGLOBAL16 hPrintTemplate; - HGLOBAL16 hSetupTemplate; -} PRINTDLG16, *LPPRINTDLG16; - -BOOL16 WINAPI ChooseColor16(LPCHOOSECOLOR16 lpChCol); -HWND16 WINAPI FindText16( SEGPTR find); -BOOL16 WINAPI GetOpenFileName16(SEGPTR ofn); -BOOL16 WINAPI GetSaveFileName16(SEGPTR ofn); -BOOL16 WINAPI PrintDlg16( LPPRINTDLG16 print); -HWND16 WINAPI ReplaceText16( SEGPTR find); -BOOL16 WINAPI ChooseFont16(LPCHOOSEFONT16); -BOOL16 CALLBACK ColorDlgProc16( HWND16 hDlg16, UINT16 message, WPARAM16 wParam, LONG lParam ); -BOOL16 CALLBACK FileSaveDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam); -BOOL16 CALLBACK FileOpenDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam); -INT16 WINAPI FontFamilyEnumProc16( SEGPTR logfont, SEGPTR metrics, UINT16 nFontType, LPARAM lParam ); -INT16 WINAPI FontStyleEnumProc16( SEGPTR logfont, SEGPTR metrics, UINT16 nFontType, LPARAM lParam); -BOOL16 CALLBACK FormatCharDlgProc16(HWND16 hDlg16, UINT16 message, WPARAM16 wParam, LPARAM lParam); -short WINAPI GetFileTitle16(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf); -BOOL16 CALLBACK PrintDlgProc16(HWND16 hDlg16, UINT16 uMsg, WPARAM16 wParam, LPARAM lParam); -BOOL16 CALLBACK PrintSetupDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam); - -#include "poppack.h" - -#endif /* _WINE_DLL_CDLG16_H */ diff --git a/reactos/dll/win32/comdlg32/colordlg16.c b/reactos/dll/win32/comdlg32/colordlg16.c deleted file mode 100644 index adbcf9862a7..00000000000 --- a/reactos/dll/win32/comdlg32/colordlg16.c +++ /dev/null @@ -1,476 +0,0 @@ -/* - * COMMDLG - Color Dialog - * - * Copyright 1994 Martin Ayotte - * Copyright 1996 Albrecht Kleine - * - * 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 - */ - -/* BUGS : still seems to not refresh correctly - sometimes, especially when 2 instances of the - dialog are loaded at the same time */ - -#include -#include -#include -#include -#include -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "wine/winbase16.h" -#include "wine/winuser16.h" -#include "winuser.h" -#include "commdlg.h" -#include "dlgs.h" -#include "wine/debug.h" -#include "cderr.h" -#include "cdlg.h" -#include "cdlg16.h" - -WINE_DEFAULT_DEBUG_CHANNEL(commdlg); - -/* Chose Color PRIVATE Structure: - * - * This is a duplicate of the 32bit code with - * an extra member - */ -typedef struct CCPRIVATE -{ - LPCHOOSECOLORW lpcc; /* points to public known data structure */ - LPCHOOSECOLOR16 lpcc16; /* save the 16 bits pointer */ - int nextuserdef; /* next free place in user defined color array */ - HDC hdcMem; /* color graph used for BitBlt() */ - HBITMAP hbmMem; /* color graph bitmap */ - RECT fullsize; /* original dialog window size */ - UINT msetrgb; /* # of SETRGBSTRING message (today not used) */ - RECT old3angle; /* last position of l-marker */ - RECT oldcross; /* last position of color/saturation marker */ - BOOL updating; /* to prevent recursive WM_COMMAND/EN_UPDATE processing */ - int h; - int s; - int l; /* for temporary storing of hue,sat,lum */ - int capturedGraph; /* control mouse captured */ - RECT focusRect; /* rectangle last focused item */ - HWND hwndFocus; /* handle last focused item */ -} *LCCPRIV; - -/*********************************************************************** - * CC_WMInitDialog16 [internal] - */ -static LONG CC_WMInitDialog16( HWND hDlg, WPARAM wParam, LPARAM lParam ) -{ - int i, res; - int r, g, b; - HWND hwnd; - RECT rect; - POINT point; - LCCPRIV lpp; - CHOOSECOLORW *ch32; - CHOOSECOLOR16 *ch16 = (CHOOSECOLOR16 *) lParam; - - TRACE("WM_INITDIALOG lParam=%08lX\n", lParam); - lpp = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct CCPRIVATE) ); - - if (ch16->lStructSize != sizeof(CHOOSECOLOR16) ) - { - HeapFree(GetProcessHeap(), 0, lpp); - EndDialog (hDlg, 0) ; - return FALSE; - } - ch32 = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CHOOSECOLORW) ); - lpp->lpcc = ch32; - lpp->lpcc16 = ch16; - ch32->lStructSize = sizeof(CHOOSECOLORW); - ch32->hwndOwner = HWND_32(ch16->hwndOwner); - /* Should be an HINSTANCE but MS made a typo */ - ch32->hInstance = HWND_32(ch16->hInstance); - ch32->lpCustColors = MapSL(ch16->lpCustColors); - ch32->lpfnHook = (LPCCHOOKPROC) ch16->lpfnHook; /* only used as flag */ - ch32->Flags = ch16->Flags; - - SetWindowLongPtrW(hDlg, DWLP_USER, (LONG_PTR)lpp); - - if (!(lpp->lpcc->Flags & CC_SHOWHELP)) - ShowWindow( GetDlgItem(hDlg,0x40e), SW_HIDE); - lpp->msetrgb = RegisterWindowMessageA(SETRGBSTRINGA); - -#if 0 - cpos = MAKELONG(5,7); /* init */ - if (lpp->lpcc->Flags & CC_RGBINIT) - { - for (i = 0; i < 6; i++) - for (j = 0; j < 8; j++) - if (predefcolors[i][j] == lpp->lpcc->rgbResult) - { - cpos = MAKELONG(i,j); - goto found; - } - } - found: - /* FIXME: Draw_a_focus_rect & set_init_values */ -#endif - - GetWindowRect(hDlg, &lpp->fullsize); - if (lpp->lpcc->Flags & CC_FULLOPEN || lpp->lpcc->Flags & CC_PREVENTFULLOPEN) - { - hwnd = GetDlgItem(hDlg, 0x2cf); - EnableWindow(hwnd, FALSE); - } - if (!(lpp->lpcc->Flags & CC_FULLOPEN ) || lpp->lpcc->Flags & CC_PREVENTFULLOPEN) - { - rect = lpp->fullsize; - res = rect.bottom - rect.top; - hwnd = GetDlgItem(hDlg, 0x2c6); /* cut at left border */ - point.x = point.y = 0; - ClientToScreen(hwnd, &point); - ScreenToClient(hDlg,&point); - GetClientRect(hDlg, &rect); - point.x += GetSystemMetrics(SM_CXDLGFRAME); - SetWindowPos(hDlg, 0, 0, 0, point.x, res, SWP_NOMOVE|SWP_NOZORDER); - - for (i = 0x2bf; i < 0x2c5; i++) - ShowWindow( GetDlgItem(hDlg, i), SW_HIDE); - for (i = 0x2d3; i < 0x2d9; i++) - ShowWindow( GetDlgItem(hDlg, i), SW_HIDE); - ShowWindow( GetDlgItem(hDlg, 0x2c9), SW_HIDE); - ShowWindow( GetDlgItem(hDlg, 0x2c8), SW_HIDE); - ShowWindow( GetDlgItem(hDlg, 0x2c6), SW_HIDE); - ShowWindow( GetDlgItem(hDlg, 0x2c5), SW_HIDE); - ShowWindow( GetDlgItem(hDlg, 1090 ), SW_HIDE); - } - else - CC_SwitchToFullSize(hDlg, lpp->lpcc->rgbResult, NULL); - res = TRUE; - for (i = 0x2bf; i < 0x2c5; i++) - SendMessageA( GetDlgItem(hDlg, i), EM_LIMITTEXT, 3, 0); /* max 3 digits: xyz */ - if (CC_HookCallChk(lpp->lpcc)) - { - res = CallWindowProc16( (WNDPROC16)lpp->lpcc16->lpfnHook, - HWND_16(hDlg), WM_INITDIALOG, wParam, lParam); - } - - /* Set the initial values of the color chooser dialog */ - r = GetRValue(lpp->lpcc->rgbResult); - g = GetGValue(lpp->lpcc->rgbResult); - b = GetBValue(lpp->lpcc->rgbResult); - - CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult); - lpp->h = CC_RGBtoHSL('H', r, g, b); - lpp->s = CC_RGBtoHSL('S', r, g, b); - lpp->l = CC_RGBtoHSL('L', r, g, b); - - /* Doing it the long way because CC_EditSetRGB/HSL doesn't seem to work */ - SetDlgItemInt(hDlg, 703, lpp->h, TRUE); - SetDlgItemInt(hDlg, 704, lpp->s, TRUE); - SetDlgItemInt(hDlg, 705, lpp->l, TRUE); - SetDlgItemInt(hDlg, 706, r, TRUE); - SetDlgItemInt(hDlg, 707, g, TRUE); - SetDlgItemInt(hDlg, 708, b, TRUE); - - CC_PaintCross(hDlg, lpp->h, lpp->s); - CC_PaintTriangle(hDlg, lpp->l); - - return res; -} - -/*********************************************************************** - * CC_WMCommand16 [internal] - */ -static LRESULT CC_WMCommand16( HWND hDlg, WPARAM wParam, LPARAM lParam, WORD notifyCode, HWND hwndCtl ) -{ - int r, g, b, i, xx; - UINT cokmsg; - HDC hdc; - COLORREF *cr; - LCCPRIV lpp = (LCCPRIV)GetWindowLongPtrW(hDlg, DWLP_USER); - TRACE("CC_WMCommand wParam=%lx lParam=%lx\n", wParam, lParam); - switch (wParam) - { - case 0x2c2: /* edit notify RGB */ - case 0x2c3: - case 0x2c4: - if (notifyCode == EN_UPDATE && !lpp->updating) - { - i = CC_CheckDigitsInEdit(hwndCtl, 255); - r = GetRValue(lpp->lpcc->rgbResult); - g = GetGValue(lpp->lpcc->rgbResult); - b= GetBValue(lpp->lpcc->rgbResult); - xx = 0; - switch (wParam) - { - case 0x2c2: if ((xx = (i != r))) r = i; break; - case 0x2c3: if ((xx = (i != g))) g = i; break; - case 0x2c4: if ((xx = (i != b))) b = i; break; - } - if (xx) /* something has changed */ - { - lpp->lpcc->rgbResult = RGB(r, g, b); - CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult); - lpp->h = CC_RGBtoHSL('H', r, g, b); - lpp->s = CC_RGBtoHSL('S', r, g, b); - lpp->l = CC_RGBtoHSL('L', r, g, b); - CC_EditSetHSL(hDlg, lpp->h, lpp->s, lpp->l); - CC_PaintCross(hDlg, lpp->h, lpp->s); - CC_PaintTriangle(hDlg, lpp->l); - } - } - break; - - case 0x2bf: /* edit notify HSL */ - case 0x2c0: - case 0x2c1: - if (notifyCode == EN_UPDATE && !lpp->updating) - { - i = CC_CheckDigitsInEdit(hwndCtl , wParam == 0x2bf ? 239:240); - xx = 0; - switch (wParam) - { - case 0x2bf: if ((xx = ( i != lpp->h))) lpp->h = i; break; - case 0x2c0: if ((xx = ( i != lpp->s))) lpp->s = i; break; - case 0x2c1: if ((xx = ( i != lpp->l))) lpp->l = i; break; - } - if (xx) /* something has changed */ - { - r = CC_HSLtoRGB('R', lpp->h, lpp->s, lpp->l); - g = CC_HSLtoRGB('G', lpp->h, lpp->s, lpp->l); - b = CC_HSLtoRGB('B', lpp->h, lpp->s, lpp->l); - lpp->lpcc->rgbResult = RGB(r, g, b); - CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult); - CC_EditSetRGB(hDlg, lpp->lpcc->rgbResult); - CC_PaintCross(hDlg, lpp->h, lpp->s); - CC_PaintTriangle(hDlg, lpp->l); - } - } - break; - - case 0x2cf: - CC_SwitchToFullSize(hDlg, lpp->lpcc->rgbResult, &lpp->fullsize); - SetFocus( GetDlgItem(hDlg, 0x2bf)); - break; - - case 0x2c8: /* add colors ... column by column */ - cr = lpp->lpcc->lpCustColors; - cr[(lpp->nextuserdef % 2) * 8 + lpp->nextuserdef / 2] = lpp->lpcc->rgbResult; - if (++lpp->nextuserdef == 16) - lpp->nextuserdef = 0; - CC_PaintUserColorArray(hDlg, 2, 8, lpp->lpcc->lpCustColors); - break; - - case 0x2c9: /* resulting color */ - hdc = GetDC(hDlg); - lpp->lpcc->rgbResult = GetNearestColor(hdc, lpp->lpcc->rgbResult); - ReleaseDC(hDlg, hdc); - CC_EditSetRGB(hDlg, lpp->lpcc->rgbResult); - CC_PaintSelectedColor(hDlg, lpp->lpcc->rgbResult); - r = GetRValue(lpp->lpcc->rgbResult); - g = GetGValue(lpp->lpcc->rgbResult); - b = GetBValue(lpp->lpcc->rgbResult); - lpp->h = CC_RGBtoHSL('H', r, g, b); - lpp->s = CC_RGBtoHSL('S', r, g, b); - lpp->l = CC_RGBtoHSL('L', r, g, b); - CC_EditSetHSL(hDlg, lpp->h, lpp->s, lpp->l); - CC_PaintCross(hDlg, lpp->h, lpp->s); - CC_PaintTriangle(hDlg, lpp->l); - break; - - case 0x40e: /* Help! */ /* The Beatles, 1965 ;-) */ - i = RegisterWindowMessageA(HELPMSGSTRINGA); - if (lpp->lpcc16) - { - if (lpp->lpcc->hwndOwner) - SendMessageA(lpp->lpcc->hwndOwner, i, 0, (LPARAM)lpp->lpcc16); - if ( CC_HookCallChk(lpp->lpcc)) - CallWindowProc16( (WNDPROC16) lpp->lpcc16->lpfnHook, - HWND_16(hDlg), WM_COMMAND, psh15, - (LPARAM)lpp->lpcc16); - } - break; - - case IDOK : - cokmsg = RegisterWindowMessageA(COLOROKSTRINGA); - if (lpp->lpcc16) - { - if (lpp->lpcc->hwndOwner) - if (SendMessageA(lpp->lpcc->hwndOwner, cokmsg, 0, (LPARAM)lpp->lpcc16)) - break; /* do NOT close */ - } - if (lpp->lpcc16) - { - BYTE *ptr = MapSL(lpp->lpcc16->lpCustColors); - memcpy(ptr, lpp->lpcc->lpCustColors, sizeof(COLORREF)*16); - lpp->lpcc16->rgbResult = lpp->lpcc->rgbResult; - } - EndDialog(hDlg, 1) ; - return TRUE ; - - case IDCANCEL : - EndDialog(hDlg, 0) ; - return TRUE ; - - } - return FALSE; -} - -/*********************************************************************** - * ColorDlgProc (COMMDLG.8) - */ -BOOL16 CALLBACK ColorDlgProc16( HWND16 hDlg16, UINT16 message, - WPARAM16 wParam, LONG lParam ) -{ - BOOL16 res; - HWND hDlg = HWND_32(hDlg16); - - LCCPRIV lpp = (LCCPRIV)GetWindowLongPtrW(hDlg, DWLP_USER); - if (message != WM_INITDIALOG) - { - if (!lpp) - return FALSE; - res=0; - if (CC_HookCallChk(lpp->lpcc)) - res = CallWindowProc16( (WNDPROC16)lpp->lpcc16->lpfnHook, hDlg16, message, wParam, lParam); - if (res) - return res; - } - - /* FIXME: SetRGB message - if (message && message == msetrgb) - return HandleSetRGB(hDlg, lParam); - */ - - switch (message) - { - case WM_INITDIALOG: - return CC_WMInitDialog16(hDlg, wParam, lParam); - case WM_NCDESTROY: - DeleteDC(lpp->hdcMem); - DeleteObject(lpp->hbmMem); - HeapFree(GetProcessHeap(), 0, lpp->lpcc); - HeapFree(GetProcessHeap(), 0, lpp); - SetWindowLongPtrW(hDlg, DWLP_USER, 0); /* we don't need it anymore */ - break; - case WM_COMMAND: - if (CC_WMCommand16(hDlg, wParam, lParam, - HIWORD(lParam), HWND_32(LOWORD(lParam)))) - return TRUE; - break; - case WM_PAINT: - if (CC_WMPaint(hDlg, wParam, lParam)) - return TRUE; - break; - case WM_LBUTTONDBLCLK: - if (CC_MouseCheckResultWindow(hDlg,lParam)) - return TRUE; - break; - case WM_MOUSEMOVE: - if (CC_WMMouseMove(hDlg, lParam)) - return TRUE; - break; - case WM_LBUTTONUP: /* FIXME: ClipCursor off (if in color graph)*/ - if (CC_WMLButtonUp(hDlg, wParam, lParam)) - return TRUE; - break; - case WM_LBUTTONDOWN:/* FIXME: ClipCursor on (if in color graph)*/ - if (CC_WMLButtonDown(hDlg, wParam, lParam)) - return TRUE; - break; - } - return FALSE ; -} - -/*********************************************************************** - * ChooseColor (COMMDLG.5) - */ -BOOL16 WINAPI ChooseColor16( LPCHOOSECOLOR16 lpChCol ) -{ - HINSTANCE16 hInst; - HANDLE16 hDlgTmpl16 = 0, hResource16 = 0; - HGLOBAL16 hGlobal16 = 0; - BOOL16 bRet = FALSE; - LPVOID template; - FARPROC16 ptr; - - TRACE("ChooseColor\n"); - if (!lpChCol) return FALSE; - - if (lpChCol->Flags & CC_ENABLETEMPLATEHANDLE) - hDlgTmpl16 = lpChCol->hInstance; - else if (lpChCol->Flags & CC_ENABLETEMPLATE) - { - HANDLE16 hResInfo; - if (!(hResInfo = FindResource16(lpChCol->hInstance, - MapSL(lpChCol->lpTemplateName), - (LPSTR)RT_DIALOG))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE); - return FALSE; - } - if (!(hDlgTmpl16 = LoadResource16(lpChCol->hInstance, hResInfo))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); - return FALSE; - } - hResource16 = hDlgTmpl16; - } - else - { - HRSRC hResInfo; - HGLOBAL hDlgTmpl32; - LPCVOID template32; - DWORD size; - if (!(hResInfo = FindResourceA(COMDLG32_hInstance, "CHOOSE_COLOR", (LPSTR)RT_DIALOG))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE); - return FALSE; - } - if (!(hDlgTmpl32 = LoadResource(COMDLG32_hInstance, hResInfo)) || - !(template32 = LockResource(hDlgTmpl32))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); - return FALSE; - } - size = SizeofResource(COMDLG32_hInstance, hResInfo); - hGlobal16 = GlobalAlloc16(0, size); - if (!hGlobal16) - { - COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE); - ERR("alloc failure for %d bytes\n", size); - return FALSE; - } - template = GlobalLock16(hGlobal16); - if (!template) - { - COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE); - ERR("global lock failure for %x handle\n", hDlgTmpl16); - GlobalFree16(hGlobal16); - return FALSE; - } - ConvertDialog32To16(template32, size, template); - hDlgTmpl16 = hGlobal16; - } - - ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 8); - hInst = GetWindowLongPtrA(HWND_32(lpChCol->hwndOwner), GWLP_HINSTANCE); - bRet = DialogBoxIndirectParam16(hInst, hDlgTmpl16, lpChCol->hwndOwner, - (DLGPROC16) ptr, (DWORD)lpChCol); - if (hResource16) FreeResource16(hDlgTmpl16); - if (hGlobal16) - { - GlobalUnlock16(hGlobal16); - GlobalFree16(hGlobal16); - } - return bRet; -} diff --git a/reactos/dll/win32/comdlg32/commdlg.spec b/reactos/dll/win32/comdlg32/commdlg.spec deleted file mode 100644 index 4bdc3188b29..00000000000 --- a/reactos/dll/win32/comdlg32/commdlg.spec +++ /dev/null @@ -1,26 +0,0 @@ -1 pascal -ret16 GetOpenFileName(segptr) GetOpenFileName16 -2 pascal -ret16 GetSaveFileName(segptr) GetSaveFileName16 -5 pascal -ret16 ChooseColor(ptr) ChooseColor16 -6 pascal FileOpenDlgProc(word word word long) FileOpenDlgProc16 -7 pascal FileSaveDlgProc(word word word long) FileSaveDlgProc16 -8 pascal ColorDlgProc(word word word long) ColorDlgProc16 -#9 pascal LOADALTERBITMAP exported, shared data -11 pascal -ret16 FindText(segptr) FindText16 -12 pascal -ret16 ReplaceText(segptr) ReplaceText16 -13 pascal FindTextDlgProc(word word word long) FindTextDlgProc16 -14 pascal ReplaceTextDlgProc(word word word long) ReplaceTextDlgProc16 -15 pascal -ret16 ChooseFont(ptr) ChooseFont16 -16 pascal -ret16 FormatCharDlgProc(word word word long) FormatCharDlgProc16 -18 pascal -ret16 FontStyleEnumProc(ptr ptr word long) FontStyleEnumProc16 -19 pascal -ret16 FontFamilyEnumProc(ptr ptr word long) FontFamilyEnumProc16 -20 pascal -ret16 PrintDlg(ptr) PrintDlg16 -21 pascal PrintDlgProc(word word word long) PrintDlgProc16 -22 pascal PrintSetupDlgProc(word word word long) PrintSetupDlgProc16 -#23 pascal EDITINTEGERONLY exported, shared data -#25 pascal WANTARROWS exported, shared data -26 pascal CommDlgExtendedError() CommDlgExtendedError -27 pascal -ret16 GetFileTitle(str ptr word) GetFileTitle16 -#28 pascal WEP exported, shared data -#29 pascal DWLBSUBCLASS exported, shared data -#30 pascal DWUPARROWHACK exported, shared data -#31 pascal DWOKSUBCLASS exported, shared data diff --git a/reactos/dll/win32/comdlg32/filedlg16.c b/reactos/dll/win32/comdlg32/filedlg16.c deleted file mode 100644 index f8b5432238f..00000000000 --- a/reactos/dll/win32/comdlg32/filedlg16.c +++ /dev/null @@ -1,524 +0,0 @@ -/* - * COMMDLG - File Dialogs - * - * Copyright 1994 Martin Ayotte - * Copyright 1996 Albrecht Kleine - * - * 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 "wine/winbase16.h" -#include "winuser.h" -#include "wine/winuser16.h" -#include "wine/debug.h" -#include "cderr.h" -#include "commdlg.h" - -WINE_DEFAULT_DEBUG_CHANNEL(commdlg); - -#include "cdlg.h" -#include "cdlg16.h" -#include "filedlg31.h" - -typedef struct tagFD16_PRIVATE -{ - HANDLE16 hDlgTmpl16; /* handle for resource 16 */ - HANDLE16 hResource16; /* handle for allocated resource 16 */ - HANDLE16 hGlobal16; /* 16 bits mem block (resources) */ - OPENFILENAME16 *ofn16; /* original structure if 16 bits dialog */ -} FD16_PRIVATE, *PFD16_PRIVATE; - -/************************************************************************ - * FD16_MapOfnStruct16 [internal] - * map a 16 bits structure to a Unicode one - */ -static void FD16_MapOfnStruct16(const OPENFILENAME16 *ofn16, LPOPENFILENAMEW ofnW, BOOL open) -{ - OPENFILENAMEA ofnA; - /* first convert to linear pointers */ - memset(&ofnA, 0, sizeof(OPENFILENAMEA)); - ofnA.lStructSize = sizeof(OPENFILENAMEA); - ofnA.hwndOwner = HWND_32(ofn16->hwndOwner); - ofnA.hInstance = HINSTANCE_32(ofn16->hInstance); - if (ofn16->lpstrFilter) - ofnA.lpstrFilter = MapSL(ofn16->lpstrFilter); - if (ofn16->lpstrCustomFilter) - ofnA.lpstrCustomFilter = MapSL(ofn16->lpstrCustomFilter); - ofnA.nMaxCustFilter = ofn16->nMaxCustFilter; - ofnA.nFilterIndex = ofn16->nFilterIndex; - ofnA.lpstrFile = MapSL(ofn16->lpstrFile); - ofnA.nMaxFile = ofn16->nMaxFile; - ofnA.lpstrFileTitle = MapSL(ofn16->lpstrFileTitle); - ofnA.nMaxFileTitle = ofn16->nMaxFileTitle; - ofnA.lpstrInitialDir = MapSL(ofn16->lpstrInitialDir); - ofnA.lpstrTitle = MapSL(ofn16->lpstrTitle); - ofnA.Flags = ofn16->Flags; - ofnA.nFileOffset = ofn16->nFileOffset; - ofnA.nFileExtension = ofn16->nFileExtension; - ofnA.lpstrDefExt = MapSL(ofn16->lpstrDefExt); - if (HIWORD(ofn16->lpTemplateName)) - ofnA.lpTemplateName = MapSL(ofn16->lpTemplateName); - else - ofnA.lpTemplateName = (LPSTR) ofn16->lpTemplateName; /* resource number */ - /* now calls the 32 bits Ansi to Unicode version to complete the job */ - FD31_MapOfnStructA(&ofnA, ofnW, open); -} - -/*********************************************************************** - * FD16_GetTemplate [internal] - * - * Get a template (FALSE if failure) when 16 bits dialogs are used - * by a 16 bits application - * - */ -static BOOL FD16_GetTemplate(const FD31_DATA *lfs) -{ - PFD16_PRIVATE priv = (PFD16_PRIVATE) lfs->private1632; - LPOPENFILENAME16 ofn16 = priv->ofn16; - LPVOID template; - HGLOBAL16 hGlobal16 = 0; - - if (ofn16->Flags & OFN_ENABLETEMPLATEHANDLE) - priv->hDlgTmpl16 = ofn16->hInstance; - else if (ofn16->Flags & OFN_ENABLETEMPLATE) - { - HANDLE16 hResInfo; - if (!(hResInfo = FindResource16(ofn16->hInstance, - MapSL(ofn16->lpTemplateName), - (LPSTR)RT_DIALOG))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE); - return FALSE; - } - if (!(priv->hDlgTmpl16 = LoadResource16( ofn16->hInstance, hResInfo ))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); - return FALSE; - } - priv->hResource16 = priv->hDlgTmpl16; - } - else - { /* get resource from (32 bits) own Wine resource; convert it to 16 */ - HRSRC hResInfo; - HGLOBAL hDlgTmpl32; - LPCVOID template32; - DWORD size; - - if (!(hResInfo = FindResourceA(COMDLG32_hInstance, - lfs->open ? "OPEN_FILE":"SAVE_FILE", (LPSTR)RT_DIALOG))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE); - return FALSE; - } - if (!(hDlgTmpl32 = LoadResource(COMDLG32_hInstance, hResInfo )) || - !(template32 = LockResource( hDlgTmpl32 ))) - { - COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE); - return FALSE; - } - size = SizeofResource(COMDLG32_hInstance, hResInfo); - hGlobal16 = GlobalAlloc16(0, size); - if (!hGlobal16) - { - COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE); - ERR("alloc failure for %d bytes\n", size); - return FALSE; - } - template = GlobalLock16(hGlobal16); - if (!template) - { - COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE); - ERR("global lock failure for %x handle\n", hGlobal16); - GlobalFree16(hGlobal16); - return FALSE; - } - ConvertDialog32To16(template32, size, template); - priv->hDlgTmpl16 = hGlobal16; - priv->hGlobal16 = hGlobal16; - } - return TRUE; -} - -/************************************************************************ - * FD16_Init [internal] - * called from the common 16/32 code to initialize 16 bit data - */ -static BOOL CALLBACK FD16_Init(LPARAM lParam, PFD31_DATA lfs, DWORD data) -{ - PFD16_PRIVATE priv; - - priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FD16_PRIVATE)); - lfs->private1632 = priv; - if (NULL == lfs->private1632) return FALSE; - - priv->ofn16 = MapSL(lParam); - if (priv->ofn16->Flags & OFN_ENABLEHOOK) - if (priv->ofn16->lpfnHook) - lfs->hook = TRUE; - - lfs->ofnW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*lfs->ofnW)); - FD16_MapOfnStruct16(priv->ofn16, lfs->ofnW, lfs->open); - - if (! FD16_GetTemplate(lfs)) return FALSE; - - return TRUE; -} - -/*********************************************************************** - * FD16_CallWindowProc [internal] - * - * called from the common 16/32 code to call the appropriate hook - */ -static BOOL CALLBACK FD16_CallWindowProc(const FD31_DATA *lfs, UINT wMsg, WPARAM wParam, - LPARAM lParam) -{ - PFD16_PRIVATE priv = (PFD16_PRIVATE) lfs->private1632; - - if (priv->ofn16) - { - return (BOOL16) CallWindowProc16( - (WNDPROC16)priv->ofn16->lpfnHook, HWND_16(lfs->hwnd), - (UINT16)wMsg, (WPARAM16)wParam, lParam); - } - return FALSE; -} - - -/*********************************************************************** - * FD31_UpdateResult [internal] - * update the real client structures - */ -static void CALLBACK FD16_UpdateResult(const FD31_DATA *lfs) -{ - PFD16_PRIVATE priv = (PFD16_PRIVATE) lfs->private1632; - LPOPENFILENAMEW ofnW = lfs->ofnW; - - if (priv->ofn16) - { /* we have to convert to short (8.3) path */ - char tmp[1024]; /* MAX_PATHNAME_LEN */ - LPOPENFILENAME16 ofn16 = priv->ofn16; - char *dest = MapSL(ofn16->lpstrFile); - char *bs16; - if (!WideCharToMultiByte( CP_ACP, 0, ofnW->lpstrFile, -1, - tmp, sizeof(tmp), NULL, NULL )) - tmp[sizeof(tmp)-1] = 0; - GetShortPathNameA(tmp, dest, ofn16->nMaxFile); - - /* the same procedure as every year... */ - if((bs16 = strrchr(dest, '\\')) != NULL) - ofn16->nFileOffset = bs16 - dest +1; - else - ofn16->nFileOffset = 0; - ofn16->nFileExtension = 0; - while(dest[ofn16->nFileExtension] != '.' && dest[ofn16->nFileExtension] != '\0') - ofn16->nFileExtension++; - if (dest[ofn16->nFileExtension] == '\0') - ofn16->nFileExtension = 0; - else - ofn16->nFileExtension++; - } -} - - -/*********************************************************************** - * FD16_UpdateFileTitle [internal] - * update the real client structures - */ -static void CALLBACK FD16_UpdateFileTitle(const FD31_DATA *lfs) -{ - PFD16_PRIVATE priv = (PFD16_PRIVATE) lfs->private1632; - LPOPENFILENAMEW ofnW = lfs->ofnW; - - if (priv->ofn16) - { - char *dest = MapSL(priv->ofn16->lpstrFileTitle); - if (!WideCharToMultiByte( CP_ACP, 0, ofnW->lpstrFileTitle, -1, - dest, ofnW->nMaxFileTitle, NULL, NULL )) - dest[ofnW->nMaxFileTitle-1] = 0; - } -} - - -/*********************************************************************** - * FD16_SendLbGetCurSel [internal] - * retrieve selected listbox item - */ -static LRESULT CALLBACK FD16_SendLbGetCurSel(const FD31_DATA *lfs) -{ - return SendDlgItemMessageW(lfs->hwnd, lst1, LB_GETCURSEL16, 0, 0); -} - - -/************************************************************************ - * FD16_Destroy [internal] - * called from the common 16/32 code to cleanup 32 bit data - */ -static void CALLBACK FD16_Destroy(const FD31_DATA *lfs) -{ - PFD16_PRIVATE priv = (PFD16_PRIVATE) lfs->private1632; - - /* free resources for a 16 bits dialog */ - if (NULL != priv) - { - if (priv->hResource16) FreeResource16(priv->hResource16); - if (priv->hGlobal16) - { - GlobalUnlock16(priv->hGlobal16); - GlobalFree16(priv->hGlobal16); - } - FD31_FreeOfnW(lfs->ofnW); - HeapFree(GetProcessHeap(), 0, lfs->ofnW); - } -} - -static void FD16_SetupCallbacks(PFD31_CALLBACKS callbacks) -{ - callbacks->Init = FD16_Init; - callbacks->CWP = FD16_CallWindowProc; - callbacks->UpdateResult = FD16_UpdateResult; - callbacks->UpdateFileTitle = FD16_UpdateFileTitle; - callbacks->SendLbGetCurSel = FD16_SendLbGetCurSel; - callbacks->Destroy = FD16_Destroy; -} - -/*********************************************************************** - * FD16_MapDrawItemStruct [internal] - * map a 16 bits drawitem struct to 32 - */ -static void FD16_MapDrawItemStruct(const DRAWITEMSTRUCT16 *lpdis16, LPDRAWITEMSTRUCT lpdis) -{ - lpdis->CtlType = lpdis16->CtlType; - lpdis->CtlID = lpdis16->CtlID; - lpdis->itemID = lpdis16->itemID; - lpdis->itemAction = lpdis16->itemAction; - lpdis->itemState = lpdis16->itemState; - lpdis->hwndItem = HWND_32(lpdis16->hwndItem); - lpdis->hDC = HDC_32(lpdis16->hDC); - lpdis->rcItem.right = lpdis16->rcItem.right; - lpdis->rcItem.left = lpdis16->rcItem.left; - lpdis->rcItem.top = lpdis16->rcItem.top; - lpdis->rcItem.bottom = lpdis16->rcItem.bottom; - lpdis->itemData = lpdis16->itemData; -} - - -/*********************************************************************** - * FD16_WMMeasureItem16 [internal] - */ -static LONG FD16_WMMeasureItem(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam) -{ - LPMEASUREITEMSTRUCT16 lpmeasure; - - lpmeasure = MapSL(lParam); - lpmeasure->itemHeight = FD31_GetFldrHeight(); - return TRUE; -} - -/* ------------------ Dialog procedures ---------------------- */ - -/*********************************************************************** - * FileOpenDlgProc (COMMDLG.6) - */ -BOOL16 CALLBACK FileOpenDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam) -{ - HWND hWnd = HWND_32(hWnd16); - PFD31_DATA lfs = (PFD31_DATA)GetPropA(hWnd,FD31_OFN_PROP); - DRAWITEMSTRUCT dis; - - TRACE("msg=%x wparam=%x lParam=%lx\n", wMsg, wParam, lParam); - if ((wMsg != WM_INITDIALOG) && lfs && lfs->hook) - { - LRESULT lRet = (BOOL16)FD31_CallWindowProc(lfs, wMsg, wParam, lParam); - if (lRet) - return lRet; /* else continue message processing */ - } - switch (wMsg) - { - case WM_INITDIALOG: - return FD31_WMInitDialog(hWnd, wParam, lParam); - - case WM_MEASUREITEM: - return FD16_WMMeasureItem(hWnd16, wParam, lParam); - - case WM_DRAWITEM: - FD16_MapDrawItemStruct(MapSL(lParam), &dis); - return FD31_WMDrawItem(hWnd, wParam, lParam, FALSE, &dis); - - case WM_COMMAND: - return FD31_WMCommand(hWnd, lParam, HIWORD(lParam),wParam, lfs); -#if 0 - case WM_CTLCOLOR: - SetBkColor((HDC16)wParam, 0x00C0C0C0); - switch (HIWORD(lParam)) - { - case CTLCOLOR_BTN: - SetTextColor((HDC16)wParam, 0x00000000); - return hGRAYBrush; - case CTLCOLOR_STATIC: - SetTextColor((HDC16)wParam, 0x00000000); - return hGRAYBrush; - } - break; -#endif - } - return FALSE; -} - -/*********************************************************************** - * FileSaveDlgProc (COMMDLG.7) - */ -BOOL16 CALLBACK FileSaveDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam) -{ - HWND hWnd = HWND_32(hWnd16); - PFD31_DATA lfs = (PFD31_DATA)GetPropA(hWnd,FD31_OFN_PROP); - DRAWITEMSTRUCT dis; - - TRACE("msg=%x wparam=%x lParam=%lx\n", wMsg, wParam, lParam); - if ((wMsg != WM_INITDIALOG) && lfs && lfs->hook) - { - LRESULT lRet; - lRet = (BOOL16)FD31_CallWindowProc(lfs, wMsg, wParam, lParam); - if (lRet) - return lRet; /* else continue message processing */ - } - switch (wMsg) { - case WM_INITDIALOG: - return FD31_WMInitDialog(hWnd, wParam, lParam); - - case WM_MEASUREITEM: - return FD16_WMMeasureItem(hWnd16, wParam, lParam); - - case WM_DRAWITEM: - FD16_MapDrawItemStruct(MapSL(lParam), &dis); - return FD31_WMDrawItem(hWnd, wParam, lParam, TRUE, &dis); - - case WM_COMMAND: - return FD31_WMCommand(hWnd, lParam, HIWORD(lParam), wParam, lfs); - } - - /* - case WM_CTLCOLOR: - SetBkColor((HDC16)wParam, 0x00C0C0C0); - switch (HIWORD(lParam)) - { - case CTLCOLOR_BTN: - SetTextColor((HDC16)wParam, 0x00000000); - return hGRAYBrush; - case CTLCOLOR_STATIC: - SetTextColor((HDC16)wParam, 0x00000000); - return hGRAYBrush; - } - return FALSE; - - */ - return FALSE; -} - -/* ------------------ APIs ---------------------- */ - -/*********************************************************************** - * GetOpenFileName (COMMDLG.1) - * - * Creates a dialog box for the user to select a file to open. - * - * RETURNS - * TRUE on success: user selected a valid file - * FALSE on cancel, error, close or filename-does-not-fit-in-buffer. - * - * BUGS - * unknown, there are some FIXME's left. - */ -BOOL16 WINAPI GetOpenFileName16( - SEGPTR ofn /* [in/out] address of structure with data*/ - ) -{ - HINSTANCE16 hInst; - BOOL bRet = FALSE; - LPOPENFILENAME16 lpofn = MapSL(ofn); - PFD31_DATA lfs; - FARPROC16 ptr; - FD31_CALLBACKS callbacks; - PFD16_PRIVATE priv; - - if (!lpofn || !FD31_Init()) return FALSE; - - FD16_SetupCallbacks(&callbacks); - lfs = FD31_AllocPrivate((LPARAM) ofn, OPEN_DIALOG, &callbacks, 0); - if (lfs) - { - priv = (PFD16_PRIVATE) lfs->private1632; - hInst = GetWindowLongPtrA( HWND_32(lpofn->hwndOwner), GWLP_HINSTANCE ); - ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 6); - bRet = DialogBoxIndirectParam16( hInst, priv->hDlgTmpl16, lpofn->hwndOwner, - (DLGPROC16) ptr, (LPARAM) lfs); - FD31_DestroyPrivate(lfs); - } - - TRACE("return lpstrFile='%s' !\n", (char *)MapSL(lpofn->lpstrFile)); - return bRet; -} - -/*********************************************************************** - * GetSaveFileName (COMMDLG.2) - * - * Creates a dialog box for the user to select a file to save. - * - * RETURNS - * TRUE on success: user enters a valid file - * FALSE on cancel, error, close or filename-does-not-fit-in-buffer. - * - * BUGS - * unknown. There are some FIXME's left. - */ -BOOL16 WINAPI GetSaveFileName16( - SEGPTR ofn /* [in/out] address of structure with data*/ - ) -{ - HINSTANCE16 hInst; - BOOL bRet = FALSE; - LPOPENFILENAME16 lpofn = MapSL(ofn); - PFD31_DATA lfs; - FARPROC16 ptr; - FD31_CALLBACKS callbacks; - PFD16_PRIVATE priv; - - if (!lpofn || !FD31_Init()) return FALSE; - - FD16_SetupCallbacks(&callbacks); - lfs = FD31_AllocPrivate((LPARAM) ofn, SAVE_DIALOG, &callbacks, 0); - if (lfs) - { - priv = (PFD16_PRIVATE) lfs->private1632; - hInst = GetWindowLongPtrA( HWND_32(lpofn->hwndOwner), GWLP_HINSTANCE ); - ptr = GetProcAddress16(GetModuleHandle16("COMMDLG"), (LPCSTR) 7); - bRet = DialogBoxIndirectParam16( hInst, priv->hDlgTmpl16, lpofn->hwndOwner, - (DLGPROC16) ptr, (LPARAM) lfs); - FD31_DestroyPrivate(lfs); - } - - TRACE("return lpstrFile='%s' !\n", (char *)MapSL(lpofn->lpstrFile)); - return bRet; -} - - -/*********************************************************************** - * GetFileTitle (COMMDLG.27) - */ -short WINAPI GetFileTitle16(LPCSTR lpFile, LPSTR lpTitle, UINT16 cbBuf) -{ - return GetFileTitleA(lpFile, lpTitle, cbBuf); -} diff --git a/reactos/dll/win32/comdlg32/printdlg.h b/reactos/dll/win32/comdlg32/printdlg.h deleted file mode 100644 index 77a39f9ec84..00000000000 --- a/reactos/dll/win32/comdlg32/printdlg.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * COMMDLG - Print Dialog - * - * Copyright 1994 Martin Ayotte - * Copyright 1996 Albrecht Kleine - * Copyright 1999 Klaas van Gend - * Copyright 2000 Huw D M Davies - * - * 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_PRINTDLG_H -#define _WINE_PRINTDLG_H - -#include "cdlg.h" - -/* This PRINTDLGA internal structure stores - * pointers to several throughout useful structures. - */ - -typedef struct -{ - LPDEVMODEA lpDevMode; - LPPRINTDLGA lpPrintDlg; - LPPRINTER_INFO_2A lpPrinterInfo; - LPDRIVER_INFO_3A lpDriverInfo; - UINT HelpMessageID; - HICON hCollateIcon; /* PrintDlg only */ - HICON hNoCollateIcon; /* PrintDlg only */ - HICON hPortraitIcon; /* PrintSetupDlg only */ - HICON hLandscapeIcon; /* PrintSetupDlg only */ - HWND hwndUpDown; -} PRINT_PTRA; - -typedef struct -{ - LPDEVMODEW lpDevMode; - LPPRINTDLGW lpPrintDlg; - LPPRINTER_INFO_2W lpPrinterInfo; - LPDRIVER_INFO_3W lpDriverInfo; - UINT HelpMessageID; - HICON hCollateIcon; /* PrintDlg only */ - HICON hNoCollateIcon; /* PrintDlg only */ - HICON hPortraitIcon; /* PrintSetupDlg only */ - HICON hLandscapeIcon; /* PrintSetupDlg only */ - HWND hwndUpDown; -} PRINT_PTRW; - -/* Debugging info */ -static const struct pd_flags { - DWORD flag; - LPCSTR name; -} pd_flags[] = { - {PD_SELECTION, "PD_SELECTION "}, - {PD_PAGENUMS, "PD_PAGENUMS "}, - {PD_NOSELECTION, "PD_NOSELECTION "}, - {PD_NOPAGENUMS, "PD_NOPAGENUMS "}, - {PD_COLLATE, "PD_COLLATE "}, - {PD_PRINTTOFILE, "PD_PRINTTOFILE "}, - {PD_PRINTSETUP, "PD_PRINTSETUP "}, - {PD_NOWARNING, "PD_NOWARNING "}, - {PD_RETURNDC, "PD_RETURNDC "}, - {PD_RETURNIC, "PD_RETURNIC "}, - {PD_RETURNDEFAULT, "PD_RETURNDEFAULT "}, - {PD_SHOWHELP, "PD_SHOWHELP "}, - {PD_ENABLEPRINTHOOK, "PD_ENABLEPRINTHOOK "}, - {PD_ENABLESETUPHOOK, "PD_ENABLESETUPHOOK "}, - {PD_ENABLEPRINTTEMPLATE, "PD_ENABLEPRINTTEMPLATE "}, - {PD_ENABLESETUPTEMPLATE, "PD_ENABLESETUPTEMPLATE "}, - {PD_ENABLEPRINTTEMPLATEHANDLE, "PD_ENABLEPRINTTEMPLATEHANDLE "}, - {PD_ENABLESETUPTEMPLATEHANDLE, "PD_ENABLESETUPTEMPLATEHANDLE "}, - {PD_USEDEVMODECOPIES, "PD_USEDEVMODECOPIES[ANDCOLLATE] "}, - {PD_DISABLEPRINTTOFILE, "PD_DISABLEPRINTTOFILE "}, - {PD_HIDEPRINTTOFILE, "PD_HIDEPRINTTOFILE "}, - {PD_NONETWORKBUTTON, "PD_NONETWORKBUTTON "}, - {-1, NULL} -}; - -/* Internal Functions - * Do not Export to other applications or dlls - */ - -INT PRINTDLG_SetUpPrinterListComboA(HWND hDlg, UINT id, LPCSTR name); -BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, - PRINT_PTRA *PrintStructures); -BOOL PRINTDLG_OpenDefaultPrinter(HANDLE *hprn); -LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, - LPARAM lParam, PRINT_PTRA* PrintStructures); - -#endif /* _WINE_PRINTDLG_H */ From 256d09b06b0a7f331127cce3e35a459b5393eeaa Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 22 Jan 2012 11:01:32 +0000 Subject: [PATCH 018/289] [MSI] Delete useless file. Spotted by Thomas Faber svn path=/trunk/; revision=55061 --- reactos/dll/win32/msi/CMakeLists.txt | 1 - reactos/dll/win32/msi/join.c | 495 --------------------------- reactos/dll/win32/msi/msi.rbuild | 1 - 3 files changed, 497 deletions(-) delete mode 100644 reactos/dll/win32/msi/join.c diff --git a/reactos/dll/win32/msi/CMakeLists.txt b/reactos/dll/win32/msi/CMakeLists.txt index 14899fadcf6..57a26db3769 100644 --- a/reactos/dll/win32/msi/CMakeLists.txt +++ b/reactos/dll/win32/msi/CMakeLists.txt @@ -34,7 +34,6 @@ list(APPEND SOURCE handle.c insert.c install.c - join.c media.c msi.c msi_main.c diff --git a/reactos/dll/win32/msi/join.c b/reactos/dll/win32/msi/join.c deleted file mode 100644 index 7fe7f1c2677..00000000000 --- a/reactos/dll/win32/msi/join.c +++ /dev/null @@ -1,495 +0,0 @@ -/* - * Implementation of the Microsoft Installer (msi.dll) - * - * Copyright 2006 Mike McCormack 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 "msi.h" -#include "msiquery.h" -#include "objbase.h" -#include "objidl.h" -#include "msipriv.h" -#include "query.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -WINE_DEFAULT_DEBUG_CHANNEL(msidb); - -typedef struct tagJOINTABLE -{ - struct list entry; - MSIVIEW *view; - UINT columns; - UINT rows; - UINT next_rows; -} JOINTABLE; - -typedef struct tagMSIJOINVIEW -{ - MSIVIEW view; - MSIDATABASE *db; - struct list tables; - UINT columns; - UINT rows; -} MSIJOINVIEW; - -static UINT JOIN_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT *val ) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW*)view; - JOINTABLE *table; - UINT cols = 0; - UINT prev_rows = 1; - - if (col == 0 || col > jv->columns) - return ERROR_FUNCTION_FAILED; - - if (row >= jv->rows) - return ERROR_FUNCTION_FAILED; - - LIST_FOR_EACH_ENTRY(table, &jv->tables, JOINTABLE, entry) - { - if (col <= cols + table->columns) - { - row = (row % (jv->rows / table->next_rows)) / prev_rows; - col -= cols; - break; - } - - prev_rows *= table->rows; - cols += table->columns; - } - - return table->view->ops->fetch_int( table->view, row, col, val ); -} - -static UINT JOIN_fetch_stream( struct tagMSIVIEW *view, UINT row, UINT col, IStream **stm) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW*)view; - JOINTABLE *table; - UINT cols = 0; - UINT prev_rows = 1; - - TRACE("%p %d %d %p\n", jv, row, col, stm ); - - if (col == 0 || col > jv->columns) - return ERROR_FUNCTION_FAILED; - - if (row >= jv->rows) - return ERROR_FUNCTION_FAILED; - - LIST_FOR_EACH_ENTRY(table, &jv->tables, JOINTABLE, entry) - { - if (col <= cols + table->columns) - { - row = (row % (jv->rows / table->next_rows)) / prev_rows; - col -= cols; - break; - } - - prev_rows *= table->rows; - cols += table->columns; - } - - return table->view->ops->fetch_stream( table->view, row, col, stm ); -} - -static UINT JOIN_get_row( struct tagMSIVIEW *view, UINT row, MSIRECORD **rec ) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW*)view; - - TRACE("%p %d %p\n", jv, row, rec); - - return msi_view_get_row( jv->db, view, row, rec ); -} - -static UINT JOIN_execute( struct tagMSIVIEW *view, MSIRECORD *record ) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW*)view; - JOINTABLE *table; - UINT r, rows; - - TRACE("%p %p\n", jv, record); - - LIST_FOR_EACH_ENTRY(table, &jv->tables, JOINTABLE, entry) - { - table->view->ops->execute(table->view, NULL); - - r = table->view->ops->get_dimensions(table->view, &table->rows, NULL); - if (r != ERROR_SUCCESS) - { - ERR("failed to get table dimensions\n"); - return r; - } - - /* each table must have at least one row */ - if (table->rows == 0) - { - jv->rows = 0; - return ERROR_SUCCESS; - } - - if (jv->rows == 0) - jv->rows = table->rows; - else - jv->rows *= table->rows; - } - - rows = jv->rows; - LIST_FOR_EACH_ENTRY(table, &jv->tables, JOINTABLE, entry) - { - rows /= table->rows; - table->next_rows = rows; - } - - return ERROR_SUCCESS; -} - -static UINT JOIN_close( struct tagMSIVIEW *view ) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW*)view; - JOINTABLE *table; - - TRACE("%p\n", jv ); - - LIST_FOR_EACH_ENTRY(table, &jv->tables, JOINTABLE, entry) - { - table->view->ops->close(table->view); - } - - return ERROR_SUCCESS; -} - -static UINT JOIN_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *cols ) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW*)view; - - TRACE("%p %p %p\n", jv, rows, cols ); - - if (cols) - *cols = jv->columns; - - if (rows) - *rows = jv->rows; - - return ERROR_SUCCESS; -} - -static UINT JOIN_get_column_info( struct tagMSIVIEW *view, - UINT n, LPWSTR *name, UINT *type, BOOL *temporary, - LPWSTR *table_name ) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW*)view; - JOINTABLE *table; - UINT cols = 0; - - TRACE("%p %d %p %p %p %p\n", jv, n, name, type, temporary, table_name ); - - if (n == 0 || n > jv->columns) - return ERROR_FUNCTION_FAILED; - - LIST_FOR_EACH_ENTRY(table, &jv->tables, JOINTABLE, entry) - { - if (n <= cols + table->columns) - return table->view->ops->get_column_info(table->view, n - cols, - name, type, temporary, - table_name); - - cols += table->columns; - } - - return ERROR_FUNCTION_FAILED; -} - -static UINT join_find_row( MSIJOINVIEW *jv, MSIRECORD *rec, UINT *row ) -{ - LPCWSTR str; - UINT r, i, id, data; - - str = MSI_RecordGetString( rec, 1 ); - r = msi_string2idW( jv->db->strings, str, &id ); - if (r != ERROR_SUCCESS) - return r; - - for (i = 0; i < jv->rows; i++) - { - JOIN_fetch_int( &jv->view, i, 1, &data ); - - if (data == id) - { - *row = i; - return ERROR_SUCCESS; - } - } - - return ERROR_FUNCTION_FAILED; -} - -static UINT JOIN_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UINT mask ) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW*)view; - JOINTABLE *table; - UINT i, reduced_mask = 0, r = ERROR_SUCCESS, offset = 0, col_count; - MSIRECORD *reduced; - - TRACE("%p %d %p %u %08x\n", jv, row, rec, rec->count, mask ); - - if (mask >= 1 << jv->columns) - return ERROR_INVALID_PARAMETER; - - LIST_FOR_EACH_ENTRY(table, &jv->tables, JOINTABLE, entry) - { - r = table->view->ops->get_dimensions( table->view, NULL, &col_count ); - if (r != ERROR_SUCCESS) - return r; - - reduced = MSI_CreateRecord( col_count ); - if (!reduced) - return ERROR_FUNCTION_FAILED; - - for (i = 0; i < col_count; i++) - { - r = MSI_RecordCopyField( rec, i + offset + 1, reduced, i + 1 ); - if (r != ERROR_SUCCESS) - break; - } - - offset += col_count; - reduced_mask = mask >> (jv->columns - offset) & ((1 << col_count) - 1); - - if (r == ERROR_SUCCESS) - r = table->view->ops->set_row( table->view, row, reduced, reduced_mask ); - - msiobj_release( &reduced->hdr ); - } - - return r; -} - -static UINT join_modify_update( struct tagMSIVIEW *view, MSIRECORD *rec ) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW *)view; - UINT r, row; - - r = join_find_row( jv, rec, &row ); - if (r != ERROR_SUCCESS) - return r; - - return JOIN_set_row( view, row, rec, (1 << jv->columns) - 1 ); -} - -static UINT JOIN_modify( struct tagMSIVIEW *view, MSIMODIFY mode, MSIRECORD *rec, UINT row ) -{ - UINT r; - - TRACE("%p %d %p %u\n", view, mode, rec, row); - - switch (mode) - { - case MSIMODIFY_UPDATE: - return join_modify_update( view, rec ); - - case MSIMODIFY_ASSIGN: - case MSIMODIFY_DELETE: - case MSIMODIFY_INSERT: - case MSIMODIFY_INSERT_TEMPORARY: - case MSIMODIFY_MERGE: - case MSIMODIFY_REPLACE: - case MSIMODIFY_SEEK: - case MSIMODIFY_VALIDATE: - case MSIMODIFY_VALIDATE_DELETE: - case MSIMODIFY_VALIDATE_FIELD: - case MSIMODIFY_VALIDATE_NEW: - r = ERROR_FUNCTION_FAILED; - break; - - case MSIMODIFY_REFRESH: - r = ERROR_CALL_NOT_IMPLEMENTED; - break; - - default: - WARN("%p %d %p %u - unknown mode\n", view, mode, rec, row ); - r = ERROR_INVALID_PARAMETER; - break; - } - - return r; -} - -static UINT JOIN_delete( struct tagMSIVIEW *view ) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW*)view; - struct list *item, *cursor; - - TRACE("%p\n", jv ); - - LIST_FOR_EACH_SAFE(item, cursor, &jv->tables) - { - JOINTABLE* table = LIST_ENTRY(item, JOINTABLE, entry); - - list_remove(&table->entry); - table->view->ops->delete(table->view); - table->view = NULL; - msi_free(table); - } - - msi_free(jv); - - return ERROR_SUCCESS; -} - -static UINT JOIN_find_matching_rows( struct tagMSIVIEW *view, UINT col, - UINT val, UINT *row, MSIITERHANDLE *handle ) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW*)view; - UINT i, row_value; - - TRACE("%p, %d, %u, %p\n", view, col, val, *handle); - - if (col == 0 || col > jv->columns) - return ERROR_INVALID_PARAMETER; - - for (i = PtrToUlong(*handle); i < jv->rows; i++) - { - if (view->ops->fetch_int( view, i, col, &row_value ) != ERROR_SUCCESS) - continue; - - if (row_value == val) - { - *row = i; - (*(UINT *)handle) = i + 1; - return ERROR_SUCCESS; - } - } - - return ERROR_NO_MORE_ITEMS; -} - -static UINT JOIN_sort(struct tagMSIVIEW *view, column_info *columns) -{ - MSIJOINVIEW *jv = (MSIJOINVIEW *)view; - JOINTABLE *table; - UINT r; - - TRACE("%p %p\n", view, columns); - - LIST_FOR_EACH_ENTRY(table, &jv->tables, JOINTABLE, entry) - { - r = table->view->ops->sort(table->view, columns); - if (r != ERROR_SUCCESS) - return r; - } - - return ERROR_SUCCESS; -} - -static const MSIVIEWOPS join_ops = -{ - JOIN_fetch_int, - JOIN_fetch_stream, - JOIN_get_row, - NULL, - NULL, - NULL, - JOIN_execute, - JOIN_close, - JOIN_get_dimensions, - JOIN_get_column_info, - JOIN_modify, - JOIN_delete, - JOIN_find_matching_rows, - NULL, - NULL, - NULL, - NULL, - JOIN_sort, - NULL, -}; - -UINT JOIN_CreateView( MSIDATABASE *db, MSIVIEW **view, LPWSTR tables ) -{ - MSIJOINVIEW *jv = NULL; - UINT r = ERROR_SUCCESS; - JOINTABLE *table; - LPWSTR ptr; - - TRACE("%p (%s)\n", jv, debugstr_w(tables) ); - - jv = msi_alloc_zero( sizeof *jv ); - if( !jv ) - return ERROR_FUNCTION_FAILED; - - /* fill the structure */ - jv->view.ops = &join_ops; - jv->db = db; - jv->columns = 0; - jv->rows = 0; - - list_init(&jv->tables); - - while (*tables) - { - if ((ptr = strchrW(tables, ' '))) - *ptr = '\0'; - - table = msi_alloc(sizeof(JOINTABLE)); - if (!table) - { - r = ERROR_OUTOFMEMORY; - goto end; - } - - r = TABLE_CreateView( db, tables, &table->view ); - if( r != ERROR_SUCCESS ) - { - WARN("can't create table: %s\n", debugstr_w(tables)); - msi_free(table); - r = ERROR_BAD_QUERY_SYNTAX; - goto end; - } - - r = table->view->ops->get_dimensions( table->view, NULL, - &table->columns ); - if( r != ERROR_SUCCESS ) - { - ERR("can't get table dimensions\n"); - goto end; - } - - jv->columns += table->columns; - - list_add_head( &jv->tables, &table->entry ); - - if (!ptr) - break; - - tables = ptr + 1; - } - - *view = &jv->view; - return ERROR_SUCCESS; - -end: - jv->view.ops->delete( &jv->view ); - - return r; -} diff --git a/reactos/dll/win32/msi/msi.rbuild b/reactos/dll/win32/msi/msi.rbuild index 563b2c0bdfe..72c034dd15a 100644 --- a/reactos/dll/win32/msi/msi.rbuild +++ b/reactos/dll/win32/msi/msi.rbuild @@ -29,7 +29,6 @@ handle.c insert.c install.c - join.c media.c msi.c msi_main.c From 97b331fc372412a3a0f4daebe569ba21cf6c7f09 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 22 Jan 2012 11:04:20 +0000 Subject: [PATCH 019/289] [MSI] Partly revert r55050. It should work without now svn path=/trunk/; revision=55062 --- reactos/dll/win32/msi/CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/reactos/dll/win32/msi/CMakeLists.txt b/reactos/dll/win32/msi/CMakeLists.txt index 57a26db3769..4c465b1a5ff 100644 --- a/reactos/dll/win32/msi/CMakeLists.txt +++ b/reactos/dll/win32/msi/CMakeLists.txt @@ -96,8 +96,6 @@ add_importlibs(msi add_pch(msi msipriv.h) add_cd_file(TARGET msi DESTINATION reactos/system32 FOR all) -allow_warnings(msi) - endif(NOT MSVC) add_importlib_target(msi.spec) From f317e5c438c69b7d43c8f72ccdac0a35a243e2bc Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 22 Jan 2012 14:15:04 +0000 Subject: [PATCH 020/289] [PSDK] * Add some annotations. svn path=/trunk/; revision=55063 --- reactos/include/psdk/sal.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/reactos/include/psdk/sal.h b/reactos/include/psdk/sal.h index bfad3a404f7..efc61fb9c75 100644 --- a/reactos/include/psdk/sal.h +++ b/reactos/include/psdk/sal.h @@ -308,6 +308,8 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #else #define _SA_Must_inspect_ #endif +#define _Old_(x) x +#define __AuToQuOtE _SA_annotes0(SAL_AuToQuOtE) /****************************************************************************** * Public macros * @@ -390,7 +392,14 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #define _At_buffer_(t, i, b, a) _SA_annotes3(SAL_at_buffer, t, i, b) _Group_(a) #define _Must_inspect_result_ _SA_Must_inspect_ _Check_return_ #define _Always_(annos) _Group_(annos) _On_failure_(annos) + +#if (_MSC_VER >= 1600) #define _Points_to_data_ _Pre_ _At_(*_Curr_, _SA_annotes1(SAL_mayBePointer, __no)) +#else +// FIXME +#define _Points_to_data_ +#endif + #define _Return_type_success_(expr) _Success_(expr) #define _Struct_size_bytes_(size) _Writable_bytes_(size) #define _Unchanged_(e) _At_(e, _Post_equal_to_(_Old_(e)) _Const_) @@ -940,6 +949,8 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #define _Result_nullonfailure_ _On_failure_(_Notref_ _SA_Deref_ _Post_null_) #define _Result_zeroonfailure_ _On_failure_(_Notref_ _SA_Deref_ _Out_range_(==, 0)) +#define __inner_callback _SA_annotes0(__callback) + #define _Ret_ _Ret_valid_ #define _Ret_bytecap_(size) _SA_Ret1_(__notnull_impl_notref) _SA_Ret1_(__bytecap_impl(size)) #define _Ret_bytecap_c_(size) _SA_Ret1_(__notnull_impl_notref) _SA_Ret1_(__bytecap_c_impl(size)) @@ -996,6 +1007,29 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #define _Deref_ret_opt_z_ _SA_Deref_ret1_(__maybenull_impl_notref) _SA_Ret1_(__zterm_impl) #define _Deref_ret_z_ _SA_Deref_ret1_(__notnull_impl_notref) _SA_Deref_ret1_(__zterm_impl) +/* Additional annotation declarations */ +#define __ANNOTATION(fun) _SA_annotes0(SAL_annotation) void __SA_##fun +#define __PRIMOP(type, fun) _SA_annotes0(SAL_primop) type __SA_##fun; +#if (_MSC_VER < 1600) + +__ANNOTATION(SAL_satisfies(_In_ char);) + +#define _Inexpressible_(x) (x) + +#endif + +__ANNOTATION(SAL_constant(enum __SAL_YesNo);) +__ANNOTATION(SAL_TypeName(__AuToQuOtE char *)); + +__ANNOTATION(SAL_functionClassNew(_In_ char*);) +__PRIMOP(int, _In_function_class_(_In_ char*);) +#define _In_function_class_(x) _In_function_class_(#x) + +__ANNOTATION(SAL_interlocked(void);) + +__ANNOTATION(SAL_untrusted_data_source(__AuToQuOtE char *)); + + #else /* _USE_ATTRIBUTES_FOR_SAL || _USE_DECLSPECS_FOR_SAL */ /* Dummys */ @@ -1567,6 +1601,7 @@ REPEATABLE DECLARE_ATTR(EndAttribute, int unused;) SAL_end; #define _Reserved_ #define _Result_nullonfailure_ #define _Result_zeroonfailure_ +#define __inner_callback #define _Ret_ #define _Ret_bound_ #define _Ret_bytecap_(size) From 585b0e0314925de204def2c1b5348c2381de274f Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 22 Jan 2012 14:24:23 +0000 Subject: [PATCH 021/289] [GDI32] * Fix a typo. svn path=/trunk/; revision=55064 --- reactos/dll/win32/gdi32/misc/gdientry.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/gdi32/misc/gdientry.c b/reactos/dll/win32/gdi32/misc/gdientry.c index 6203fa03461..3b3000a1518 100644 --- a/reactos/dll/win32/gdi32/misc/gdientry.c +++ b/reactos/dll/win32/gdi32/misc/gdientry.c @@ -1784,7 +1784,7 @@ DdQueryDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal, pD3dBufferCallbacks->CanCreateExecuteBuffer = (LPDDHALEXEBUFCB_CANCREATEEXEBUF)DdCanCreateD3DBuffer; } - if ( D3dBufferCallbacks.CanCreateD3DBuffer) + if (D3dBufferCallbacks.CreateD3DBuffer) { pD3dBufferCallbacks->CreateExecuteBuffer = (LPDDHALEXEBUFCB_CREATEEXEBUF) DdCreateD3DBuffer; } From eae22609764742ae690f70c0d0166d8dae532955 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 22 Jan 2012 14:32:11 +0000 Subject: [PATCH 022/289] [MSHTML] * Adopt a compatible syntax for the resource files. svn path=/trunk/; revision=55065 --- reactos/dll/win32/mshtml/Bg.rc | 6 +++--- reactos/dll/win32/mshtml/Da.rc | 6 +++--- reactos/dll/win32/mshtml/De.rc | 9 ++++----- reactos/dll/win32/mshtml/En.rc | 6 +++--- reactos/dll/win32/mshtml/Es.rc | 6 +++--- reactos/dll/win32/mshtml/Fr.rc | 9 ++++----- reactos/dll/win32/mshtml/Hu.rc | 6 +++--- reactos/dll/win32/mshtml/It.rc | 6 +++--- reactos/dll/win32/mshtml/Ja.rc | 6 +++--- reactos/dll/win32/mshtml/Ko.rc | 6 +++--- reactos/dll/win32/mshtml/Lt.rc | 6 +++--- reactos/dll/win32/mshtml/Nl.rc | 6 +++--- reactos/dll/win32/mshtml/No.rc | 6 +++--- reactos/dll/win32/mshtml/Pl.rc | 6 +++--- reactos/dll/win32/mshtml/Pt.rc | 13 ++++++------- reactos/dll/win32/mshtml/Ro.rc | 6 +++--- reactos/dll/win32/mshtml/Ru.rc | 8 +++----- reactos/dll/win32/mshtml/Si.rc | 6 +++--- reactos/dll/win32/mshtml/Sv.rc | 6 +++--- reactos/dll/win32/mshtml/Tr.rc | 6 +++--- reactos/dll/win32/mshtml/Uk.rc | 6 +++--- reactos/dll/win32/mshtml/Zh.rc | 9 ++++----- reactos/dll/win32/mshtml/rsrc.rc | 1 - 23 files changed, 72 insertions(+), 79 deletions(-) diff --git a/reactos/dll/win32/mshtml/Bg.rc b/reactos/dll/win32/mshtml/Bg.rc index 03a466e1298..956a186685f 100644 --- a/reactos/dll/win32/mshtml/Bg.rc +++ b/reactos/dll/win32/mshtml/Bg.rc @@ -33,9 +33,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko Installer" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML to work correctly. Wine can automatically download and install it for you.\n\ +\n\ +Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Íàïðåäúê", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "Èíñòàëèðàé", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Da.rc b/reactos/dll/win32/mshtml/Da.rc index 13a0aa96f43..6d511abe4ad 100644 --- a/reactos/dll/win32/mshtml/Da.rc +++ b/reactos/dll/win32/mshtml/Da.rc @@ -38,9 +38,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Installere Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "Wine kunne ikke finde Gecko Pakken, som er nødvendig for at fÃ¥ applikationers indlejringaf HTML til at fungere korrekt. " \ - "Wine kan automatisk downloade, og installere det for dig.\n\n" \ - "Bemærk: Det anbefales at bruge distributions pakker i stedet. Se http://wiki.winehq.org/Gecko for flere detaljer.", + LTEXT "Wine kunne ikke finde Gecko Pakken, som er nødvendig for at fÃ¥ applikationers indlejringaf HTML til at fungere korrekt. Wine kan automatisk downloade, og installere det for dig.\n\ +\n\ +Bemærk: Det anbefales at bruge distributions pakker i stedet. Se http://wiki.winehq.org/Gecko for flere detaljer.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Fremgang", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "&Installer", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/De.rc b/reactos/dll/win32/mshtml/De.rc index 3929b953a6d..f673678e2a6 100644 --- a/reactos/dll/win32/mshtml/De.rc +++ b/reactos/dll/win32/mshtml/De.rc @@ -37,11 +37,10 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine-Gecko-Installation" FONT 8, "MS Shell Dlg" { - LTEXT "Wine kann das Gecko-Paket nicht finden. Es wird von Programmen mit eingebettetem HTML benötigt, " \ - "damit diese richtig funktionieren.\n" \ - "Wine kann das Paket für Sie herunterladen und installieren.\n\n" \ - "Hinweis: Es wird empfohlen das Paket ihrer Distribution zu verwenden. " \ - "Weitere Hinweise finden Sie unter http://wiki.winehq.org/Gecko", + LTEXT "Wine kann das Gecko-Paket nicht finden. Es wird von Programmen mit eingebettetem HTML benötigt, damit diese richtig funktionieren.\n\ +Wine kann das Paket für Sie herunterladen und installieren.\n\ +\n\ +Hinweis: Es wird empfohlen das Paket ihrer Distribution zu verwenden. Weitere Hinweise finden Sie unter http://wiki.winehq.org/Gecko", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Fortschritt", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12 DEFPUSHBUTTON "&Installieren", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/En.rc b/reactos/dll/win32/mshtml/En.rc index e44b3731472..44c619429f9 100644 --- a/reactos/dll/win32/mshtml/En.rc +++ b/reactos/dll/win32/mshtml/En.rc @@ -33,9 +33,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko Installer" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML to work correctly. Wine can automatically download and install it for you.\n\ +\n\ +Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Progress", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "&Install", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Es.rc b/reactos/dll/win32/mshtml/Es.rc index 4dc560f6e5a..45ed8e76919 100644 --- a/reactos/dll/win32/mshtml/Es.rc +++ b/reactos/dll/win32/mshtml/Es.rc @@ -35,9 +35,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Instalador de Gecko de Wine" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML to work correctly. Wine can automatically download and install it for you.\n\ +\n\ +Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Progreso", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12 DEFPUSHBUTTON "&Instalar", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Fr.rc b/reactos/dll/win32/mshtml/Fr.rc index 924e4b0bc78..ab19db2beb9 100644 --- a/reactos/dll/win32/mshtml/Fr.rc +++ b/reactos/dll/win32/mshtml/Fr.rc @@ -40,11 +40,10 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Programme d'installation de Gecko pour Wine" FONT 8, "MS Shell Dlg" { - LTEXT "Wine n'a pu trouver de paquet Gecko, qui est nécessaire pour que les applications "\ - "incorporant du HTML puissent fonctionner correctement.\nWine peut automatiquement "\ - "le télécharger et l'installer pour vous.\n\n" \ - "Note : il est recommandé d'utiliser le paquet de votre distribution si disponible. " \ - "Consultez http://wiki.winehq.org/Gecko pour plus de détails.", + LTEXT "Wine n'a pu trouver de paquet Gecko, qui est nécessaire pour que les applications incorporant du HTML puissent fonctionner correctement.\n\ +Wine peut automatiquement le télécharger et l'installer pour vous.\n\ +\n\ +Note : il est recommandé d'utiliser le paquet de votre distribution si disponible. Consultez http://wiki.winehq.org/Gecko pour plus de détails.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Progression", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 65, 240, 12 DEFPUSHBUTTON "&Installer", ID_DWL_INSTALL, 200, 85, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Hu.rc b/reactos/dll/win32/mshtml/Hu.rc index 31f54d1f274..1004edcf5f6 100644 --- a/reactos/dll/win32/mshtml/Hu.rc +++ b/reactos/dll/win32/mshtml/Hu.rc @@ -36,9 +36,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko Installer" FONT 8, "MS Shell Dlg" { - LTEXT "A Wine nem talált Gecko csomagot, ami ahhoz szükséges hogy a HTML-t beágyazó alkalmazások " \ - "megfelelÅ‘en működjenek. A Wine ezt automatikusan letöltheti és feltelepítheti Önnek.\n\n" \ - "Megjegyzés: Ajánlott a disztribúció csomagjának használata ez helyet. Lásd a http://wiki.winehq.org/Gecko címet a részletekért.", + LTEXT "A Wine nem talált Gecko csomagot, ami ahhoz szükséges hogy a HTML-t beágyazó alkalmazások megfelelÅ‘en működjenek. A Wine ezt automatikusan letöltheti és feltelepítheti Önnek.\n\ +\n\ +Megjegyzés: Ajánlott a disztribúció csomagjának használata ez helyet. Lásd a http://wiki.winehq.org/Gecko címet a részletekért.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Folyamat", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "&Telepítés", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/It.rc b/reactos/dll/win32/mshtml/It.rc index c8c00c2c84e..7ddb01416bf 100644 --- a/reactos/dll/win32/mshtml/It.rc +++ b/reactos/dll/win32/mshtml/It.rc @@ -36,9 +36,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Installer di Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "Wine non ha trovato un pacchetto Gecko che è necessario per applicazioni che incorporano HTML " \ - "per funzionare correttamente. Wine può automaticamente scaricarlo ed installarlo per te.\n\n" \ - "Nota: è raccomandato usare i pacchetti delle distribuzioni. Leggi http://wiki.winehq.org/Gecko per i dettagli.", + LTEXT "Wine non ha trovato un pacchetto Gecko che è necessario per applicazioni che incorporano HTML per funzionare correttamente. Wine può automaticamente scaricarlo ed installarlo per te.\n\ +\n\ +Nota: è raccomandato usare i pacchetti delle distribuzioni. Leggi http://wiki.winehq.org/Gecko per i dettagli.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Avanzamento", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "&Installa", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Ja.rc b/reactos/dll/win32/mshtml/Ja.rc index f8c0e44040c..d044cb83a34 100644 --- a/reactos/dll/win32/mshtml/Ja.rc +++ b/reactos/dll/win32/mshtml/Ja.rc @@ -36,9 +36,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko インストーラ" FONT 9, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML to work correctly. Wine can automatically download and install it for you.\n\ +\n\ +Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Progress", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "インストール(&I)", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Ko.rc b/reactos/dll/win32/mshtml/Ko.rc index f54152632d3..55d5bad23fd 100644 --- a/reactos/dll/win32/mshtml/Ko.rc +++ b/reactos/dll/win32/mshtml/Ko.rc @@ -34,9 +34,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko ¼³Ä¡ Ç®±×¸²" FONT 9, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML to work correctly. Wine can automatically download and install it for you.\n\ +\n\ +Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "ÁøÇàÁß", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "¼³Ä¡(&I)", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Lt.rc b/reactos/dll/win32/mshtml/Lt.rc index 5bfa31d574e..58210c4839f 100644 --- a/reactos/dll/win32/mshtml/Lt.rc +++ b/reactos/dll/win32/mshtml/Lt.rc @@ -36,9 +36,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko diegimo programa" FONT 8, "MS Shell Dlg" { - LTEXT "Wine nepavyko rasti Gecko paketo reikalingo programoms įterpianÄioms HTML " \ - "teisingai veikti. Wine gali automatiÅ¡kai atsiųsti ir įdiegti šį paketÄ….\n\n" \ - "Pastaba: rekomenduojama naudoti distribucijos paketus. Daugiau informacijos http://wiki.winehq.org/Gecko.", + LTEXT "Wine nepavyko rasti Gecko paketo reikalingo programoms įterpianÄioms HTML teisingai veikti. Wine gali automatiÅ¡kai atsiųsti ir įdiegti šį paketÄ….\n\ +\n\ +Pastaba: rekomenduojama naudoti distribucijos paketus. Daugiau informacijos http://wiki.winehq.org/Gecko.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Eiga", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 60, 240, 12 DEFPUSHBUTTON "&Ä®diegti", ID_DWL_INSTALL, 200, 80, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Nl.rc b/reactos/dll/win32/mshtml/Nl.rc index 34019870029..e3a366795db 100644 --- a/reactos/dll/win32/mshtml/Nl.rc +++ b/reactos/dll/win32/mshtml/Nl.rc @@ -35,9 +35,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine-Gecko-Installatie" FONT 8, "MS Shell Dlg" { - LTEXT "Wine kon geen Gecko pakket vinden. Gecko is nodig voor programma's die gebruik maken " \ - "van embedded HTML. Wine kan het automatisch voor u downloaden en installeren.\n\n" \ - "Noot: het is aanbevolen om distro pakketten te gebruiken. Zie http://wiki.winehq.org/Gecko voor details.", + LTEXT "Wine kon geen Gecko pakket vinden. Gecko is nodig voor programma's die gebruik maken van embedded HTML. Wine kan het automatisch voor u downloaden en installeren.\n\ +\n\ +Noot: het is aanbevolen om distro pakketten te gebruiken. Zie http://wiki.winehq.org/Gecko voor details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Voortgang", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12 DEFPUSHBUTTON "&Installeren", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/No.rc b/reactos/dll/win32/mshtml/No.rc index 89f87b9c47a..b70a906672c 100644 --- a/reactos/dll/win32/mshtml/No.rc +++ b/reactos/dll/win32/mshtml/No.rc @@ -37,9 +37,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Installere Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML to work correctly. Wine can automatically download and install it for you.\n\ +\n\ +Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Progress", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "&Installer", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Pl.rc b/reactos/dll/win32/mshtml/Pl.rc index 9e0a63556eb..bc1a81dd3a1 100644 --- a/reactos/dll/win32/mshtml/Pl.rc +++ b/reactos/dll/win32/mshtml/Pl.rc @@ -35,9 +35,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Instalator Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "Nie znaleziono paczki Gecko potrzebnej do prawid³owego dzia³ania aplikacji " \ - "zawieraj¹cych kod HTML . Wine mo¿e automatycznie pobraæ i zainstalowaæ t¹ paczkê dla ciebie.\n\n" \ - "Uwaga: Lepiej jednak u¿yæ paczki z twojej dystrybucji. Po szczegó³y zajrzyj na http://wiki.winehq.org/Gecko.", + LTEXT "Nie znaleziono paczki Gecko potrzebnej do prawid³owego dzia³ania aplikacji zawieraj¹cych kod HTML . Wine mo¿e automatycznie pobraæ i zainstalowaæ t¹ paczkê dla ciebie.\n\ +\n\ +Uwaga: Lepiej jednak u¿yæ paczki z twojej dystrybucji. Po szczegó³y zajrzyj na http://wiki.winehq.org/Gecko.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Postêp", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "&Zainstaluj", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Pt.rc b/reactos/dll/win32/mshtml/Pt.rc index 49874523b17..b1448327d01 100644 --- a/reactos/dll/win32/mshtml/Pt.rc +++ b/reactos/dll/win32/mshtml/Pt.rc @@ -49,9 +49,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Instalador Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "O Wine não pôde encontrar o pacote Gecko que é necessário para aplicações com HTML embutido " \ - "funcionarem corretamente. O Wine pode automaticamente efetuar o download e instalá-lo para você.\n\n" \ - "Nota: é recomendável usar os pacotes da sua distribuição ao invés disso. \n\ + LTEXT "O Wine não pôde encontrar o pacote Gecko que é necessário para aplicações com HTML embutido funcionarem corretamente. O Wine pode automaticamente efetuar o download e instalá-lo para você.\n\ +\n\ +Nota: é recomendável usar os pacotes da sua distribuição ao invés disso.\n\ Veja http://wiki.winehq.org/Gecko para mais detalhes.", ID_DWL_STATUS, 10, 10, 240, 60, SS_LEFT CONTROL "Progresso", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12 @@ -66,10 +66,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Instalador Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "O Wine não conseguiu encontrar o pacote Gecko que é necessário para aplicações com HTML embutido " \ - "funcionarem corretamente. O Wine pode automaticamente efetuar o download e instalá-lo por si.\n\n" \ - "Nota: é recomendável usar os pacotes da sua distribuição em vez disso. \n\ -Veja http://wiki.winehq.org/Gecko para mais detalhes.", + LTEXT "O Wine não conseguiu encontrar o pacote Gecko que é necessário para aplicações com HTML embutido funcionarem corretamente. O Wine pode automaticamente efetuar o download e instalá-lo por si.\n\n\ + Nota: é recomendável usar os pacotes da sua distribuição em vez disso. \n\ + Veja http://wiki.winehq.org/Gecko para mais detalhes.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Progresso", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12 DEFPUSHBUTTON "&Instalar", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Ro.rc b/reactos/dll/win32/mshtml/Ro.rc index 1c7a55851d9..ccfaf502f70 100644 --- a/reactos/dll/win32/mshtml/Ro.rc +++ b/reactos/dll/win32/mshtml/Ro.rc @@ -36,9 +36,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Instalator Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML to work correctly. Wine can automatically download and install it for you.\n\ +\n\ +Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Progres", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12 DEFPUSHBUTTON "&Instalează", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Ru.rc b/reactos/dll/win32/mshtml/Ru.rc index bd042725c67..9246fbc540a 100644 --- a/reactos/dll/win32/mshtml/Ru.rc +++ b/reactos/dll/win32/mshtml/Ru.rc @@ -36,11 +36,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "УÑтановка Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "Wine не может найти пакет Gecko, который необходим Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы приложений "\ - "Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ HTML. " \ - "Wine может автоматичеÑки загрузить и уÑтановить его Ð´Ð»Ñ Ð²Ð°Ñ.\n\n" \ - "Примечание: рекомендуетÑÑ Ð¸Ñпользовать пакет, предоÑтавлÑемый вашим диÑтрибутивом. "\ - "ПоÑетите http://wiki.winehq.org/Gecko Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ подробной информации.", + LTEXT "Wine не может найти пакет Gecko, который необходим Ð´Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы приложений Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ HTML. Wine может автоматичеÑки загрузить и уÑтановить его Ð´Ð»Ñ Ð²Ð°Ñ.\n\ +\n\ +Примечание: рекомендуетÑÑ Ð¸Ñпользовать пакет, предоÑтавлÑемый вашим диÑтрибутивом. ПоÑетите http://wiki.winehq.org/Gecko Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ подробной информации.", ID_DWL_STATUS, 10, 10, 240, 70, SS_LEFT CONTROL "ПрогреÑÑ", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 65, 240, 12 DEFPUSHBUTTON "&УÑтановить", ID_DWL_INSTALL, 180, 85, 70, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Si.rc b/reactos/dll/win32/mshtml/Si.rc index 0d6ee5f19ae..4dc41a01f72 100644 --- a/reactos/dll/win32/mshtml/Si.rc +++ b/reactos/dll/win32/mshtml/Si.rc @@ -35,9 +35,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Namestitev Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML to work correctly. Wine can automatically download and install it for you.\n\ +\n\ +Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Napredek", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12 DEFPUSHBUTTON "&Namesti", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Sv.rc b/reactos/dll/win32/mshtml/Sv.rc index 290fa75e247..c91f7877672 100644 --- a/reactos/dll/win32/mshtml/Sv.rc +++ b/reactos/dll/win32/mshtml/Sv.rc @@ -33,9 +33,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko Installationsprogram" FONT 8, "MS Shell Dlg" { - LTEXT "Wine kunde inte hitta paketet Gecko vilket krävs för att program med inbäddad HTML " \ - "ska fungera korrekt. Wine kan hämta och installera det automatiskt åt dig.\n\n" \ - "Obs: Du rekommenderas att använda din distributions paket i stället. Se http://wiki.winehq.org/Gecko för mer information.", + LTEXT "Wine kunde inte hitta paketet Gecko vilket krävs för att program med inbäddad HTML ska fungera korrekt. Wine kan hämta och installera det automatiskt åt dig.\n\ +\n\ +Obs: Du rekommenderas att använda din distributions paket i stället. Se http://wiki.winehq.org/Gecko för mer information.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Förlopp", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "&Installera", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Tr.rc b/reactos/dll/win32/mshtml/Tr.rc index efdc9d2e107..efe736c3136 100644 --- a/reactos/dll/win32/mshtml/Tr.rc +++ b/reactos/dll/win32/mshtml/Tr.rc @@ -33,9 +33,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko Kurucusu" FONT 8, "MS Shell Dlg" { - LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \ - "to work correctly. Wine can automatically download and install it for you.\n\n" \ - "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", + LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML to work correctly. Wine can automatically download and install it for you.\n\ +\n\ +Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "Ýlerleme", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12 DEFPUSHBUTTON "&Kur", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Uk.rc b/reactos/dll/win32/mshtml/Uk.rc index 5d57e8ffc38..b84f9378194 100644 --- a/reactos/dll/win32/mshtml/Uk.rc +++ b/reactos/dll/win32/mshtml/Uk.rc @@ -37,9 +37,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Ð’Ñтановлювач Wine Gecko" FONT 8, "MS Shell Dlg" { - LTEXT "Wine не може знайти пакунок Gecko, Ñкий потрібний Ð´Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— роботи додатків " \ - "з підтримкою HTML. Wine може автоматично завантажити та вÑтановити його Ð´Ð»Ñ Ð’Ð°Ñ.\n\n" \ - "Зауважте: РекомендуєтьÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати пакет з вашого диÑтрибутиву. Детальніше читайте http://wiki.winehq.org/Gecko.", + LTEXT "Wine не може знайти пакунок Gecko, Ñкий потрібний Ð´Ð»Ñ ÐºÐ¾Ñ€ÐµÐºÑ‚Ð½Ð¾Ñ— роботи додатків з підтримкою HTML. Wine може автоматично завантажити та вÑтановити його Ð´Ð»Ñ Ð’Ð°Ñ.\n\ +\n\ +Зауважте: РекомендуєтьÑÑ Ð²Ð¸ÐºÐ¾Ñ€Ð¸Ñтати пакет з вашого диÑтрибутиву. Детальніше читайте http://wiki.winehq.org/Gecko.", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "ПрогреÑ", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "&Ð’Ñтановити", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/Zh.rc b/reactos/dll/win32/mshtml/Zh.rc index 9a1b24bbf37..a4996c6110e 100644 --- a/reactos/dll/win32/mshtml/Zh.rc +++ b/reactos/dll/win32/mshtml/Zh.rc @@ -39,8 +39,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko 安装" FONT 9, "MS Shell Dlg" { - LTEXT "Wine 未找到到用于支æŒåµŒå…¥ HTML çš„ Gecko 引擎。Wine å¯ä»¥è‡ªåŠ¨å¹¶ä¸‹è½½å®‰è£…å®ƒã€‚\n\n" \ - "注æ„: æŽ¨èæ‚¨å®‰è£…为å‘行版定制的软件包。具体å‚看 http://wiki.winehq.org/Gecko。", + LTEXT "Wine 未找到到用于支æŒåµŒå…¥ HTML çš„ Gecko 引擎。Wine å¯ä»¥è‡ªåŠ¨å¹¶ä¸‹è½½å®‰è£…å®ƒã€‚\n\ +\n\ +注æ„: æŽ¨èæ‚¨å®‰è£…为å‘行版定制的软件包。具体å‚看 http://wiki.winehq.org/Gecko。", ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT CONTROL "进度", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "安装(&I)", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP @@ -87,9 +88,7 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN CAPTION "Wine Gecko 安è£" FONT 9, "MS Shell Dlg" { - LTEXT "這個é‹ç”¨ç¨‹å¼è¦é¡¯ç¤ºä¸€å€‹HTML ç¶²é . Wine 需è¦è£ä¸Š Gecko (Mozilla HTML " \ - "engine)æ‰èƒ½é¡¯ç¤ºHTMLç¶²é . 如果你想自動下載和安è£Gecko," \ - "請按'安è£'.", ID_DWL_STATUS, 10, 10, 240, 30, SS_LEFT + LTEXT "這個é‹ç”¨ç¨‹å¼è¦é¡¯ç¤ºä¸€å€‹HTML ç¶²é . Wine 需è¦è£ä¸Š Gecko (Mozilla HTML engine)æ‰èƒ½é¡¯ç¤ºHTMLç¶²é . 如果你想自動下載和安è£Gecko, 請按'安è£'.", ID_DWL_STATUS, 10, 10, 240, 30, SS_LEFT CONTROL "Progress", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 DEFPUSHBUTTON "安è£(&I)", ID_DWL_INSTALL, 200, 60, 50, 15, WS_GROUP | WS_TABSTOP PUSHBUTTON "å–æ¶ˆ(&C)", IDCANCEL, 140, 60, 50, 15, WS_GROUP | WS_TABSTOP diff --git a/reactos/dll/win32/mshtml/rsrc.rc b/reactos/dll/win32/mshtml/rsrc.rc index 18d87ba0d87..8a635ebbd23 100644 --- a/reactos/dll/win32/mshtml/rsrc.rc +++ b/reactos/dll/win32/mshtml/rsrc.rc @@ -59,7 +59,6 @@ #include "Uk.rc" #include "Zh.rc" - LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* @makedep: mshtml.inf */ From d88856271673172eb8a049f9b3f5f56bde99c0fa Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 22 Jan 2012 14:33:44 +0000 Subject: [PATCH 023/289] [MSI] * Adopt a compatible syntax for the resource file. svn path=/trunk/; revision=55066 --- reactos/dll/win32/msi/msi.rc | 54 ++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/reactos/dll/win32/msi/msi.rc b/reactos/dll/win32/msi/msi.rc index 985304c348d..019e3ad35c7 100644 --- a/reactos/dll/win32/msi/msi.rc +++ b/reactos/dll/win32/msi/msi.rc @@ -27,33 +27,33 @@ STRINGTABLE 4 "The specified installation package could not be opened. Please check the file path and try again." 5 "path %s not found" 9 "insert disk %s" - 10 "Windows Installer %s\n\n" \ - "Usage:\n" \ - "msiexec command {required parameter} [optional parameter]\n\n" \ - "Install a product:\n" \ - "\t/i {package|product_code} [property]\n" \ - "\t/package {package|product_code} [property]\n" \ - "\t/a package [property]\n" \ - "Repair an installation:\n" \ - "\t/f[p|o|e|d|c|a|u|m|s|v] {package|product_code}\n" \ - "Uninstall a product:\n" \ - "\t/uninstall {package|product_code} [property]\n" \ - "\t/x {package|product_code} [property]\n" \ - "Advertise a product:\n" \ - "\t/j[u|m] package [/t transform] [/g languageid]\n" \ - "Apply a patch:\n" \ - "\t/p patch_package [property]\n" \ - "\t/p patch_package /a package [property]\n" \ - "Log and UI Modifiers for above commands:\n" \ - "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \ - "\t/q{|n|b|r|f|n+|b+|b-}\n" \ - "Register MSI Service:\n" \ - "\t/y\n" \ - "Unregister MSI Service:\n" \ - "\t/z\n" \ - "Display this help:\n" \ - "\t/help\n" \ - "\t/?\n" + 10 "Windows Installer %s\n\n\ +Usage:\n\ +msiexec command {required parameter} [optional parameter]\n\n\ +Install a product:\n\ +\t/i {package|product_code} [property]\n\ +\t/package {package|product_code} [property]\n\ +\t/a package [property]\n\ +Repair an installation:\n\ +\t/f[p|o|e|d|c|a|u|m|s|v] {package|product_code}\n\ +Uninstall a product:\n\ +\t/uninstall {package|product_code} [property]\n\ +\t/x {package|product_code} [property]\n\ +Advertise a product:\n\ +\t/j[u|m] package [/t transform] [/g languageid]\n\ +Apply a patch:\n\ +\t/p patch_package [property]\n\ +\t/p patch_package /a package [property]\n\ +Log and UI Modifiers for above commands:\n\ +\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n\ +\t/q{|n|b|r|f|n+|b+|b-}\n\ +Register MSI Service:\n\ +\t/y\n\ +Unregister MSI Service:\n\ +\t/z\n\ +Display this help:\n\ +\t/help\n\ +\t/?\n" 11 "enter which folder contains %s" 12 "install source for feature missing" 13 "network drive for feature missing" From 7a3aa2082706d84e989df106d6fe280eb2760196 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 22 Jan 2012 14:43:53 +0000 Subject: [PATCH 024/289] [XDK] * Massive annotations commit. Dedicated to Timo. svn path=/trunk/; revision=55067 --- reactos/include/xdk/ccfuncs.h | 305 +++-- reactos/include/xdk/cctypes.h | 34 +- reactos/include/xdk/cmfuncs.h | 51 +- reactos/include/xdk/cmtypes.h | 12 +- reactos/include/xdk/exfuncs.h | 562 +++++--- reactos/include/xdk/extypes.h | 42 +- reactos/include/xdk/fsrtlfuncs.h | 1216 ++++++++++------- reactos/include/xdk/fsrtltypes.h | 46 +- reactos/include/xdk/halfuncs.h | 218 +-- reactos/include/xdk/haltypes.h | 232 ++-- reactos/include/xdk/interlocked.h | 30 +- reactos/include/xdk/iofuncs.h | 1647 +++++++++++++---------- reactos/include/xdk/iotypes.h | 1112 +++++++++------- reactos/include/xdk/kdfuncs.h | 74 +- reactos/include/xdk/kdtypes.h | 53 +- reactos/include/xdk/kefuncs.h | 781 +++++++---- reactos/include/xdk/ketypes.h | 131 +- reactos/include/xdk/mmfuncs.h | 416 +++--- reactos/include/xdk/mmtypes.h | 12 +- reactos/include/xdk/ntddk.template.h | 7 +- reactos/include/xdk/ntifs.template.h | 711 +++++----- reactos/include/xdk/nttmapi.h | 449 ++++--- reactos/include/xdk/obfuncs.h | 146 +- reactos/include/xdk/obtypes.h | 84 +- reactos/include/xdk/pofuncs.h | 102 +- reactos/include/xdk/potypes.h | 25 +- reactos/include/xdk/psfuncs.h | 146 +- reactos/include/xdk/pstypes.h | 48 +- reactos/include/xdk/rtlfuncs.h | 1835 +++++++++++++++----------- reactos/include/xdk/rtltypes.h | 105 +- reactos/include/xdk/sefuncs.h | 435 +++--- reactos/include/xdk/setypes.h | 20 +- reactos/include/xdk/wdm.template.h | 24 +- reactos/include/xdk/wmifuncs.h | 126 +- reactos/include/xdk/wmitypes.h | 15 +- reactos/include/xdk/x86/ke.h | 53 +- reactos/include/xdk/zwfuncs.h | 1093 ++++++++------- 37 files changed, 7148 insertions(+), 5250 deletions(-) diff --git a/reactos/include/xdk/ccfuncs.h b/reactos/include/xdk/ccfuncs.h index ff15927798f..f936a9e467e 100644 --- a/reactos/include/xdk/ccfuncs.h +++ b/reactos/include/xdk/ccfuncs.h @@ -14,19 +14,19 @@ NTKERNELAPI VOID NTAPI CcInitializeCacheMap( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes, - IN BOOLEAN PinAccess, - IN PCACHE_MANAGER_CALLBACKS Callbacks, - IN PVOID LazyWriteContext); + _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); + _In_ PFILE_OBJECT FileObject, + _In_opt_ PLARGE_INTEGER TruncateSize, + _In_opt_ PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent); NTKERNELAPI VOID @@ -39,256 +39,255 @@ NTKERNELAPI VOID NTAPI CcSetDirtyPageThreshold( - IN PFILE_OBJECT FileObject, - IN ULONG DirtyPageThreshold); + _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); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_opt_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _Out_opt_ PIO_STATUS_BLOCK IoStatus); NTKERNELAPI LARGE_INTEGER NTAPI CcGetFlushedValidData( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN BcbListHeld); + _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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER StartOffset, + _In_ PLARGE_INTEGER EndOffset, + _In_ BOOLEAN Wait); NTKERNELAPI PVOID NTAPI CcRemapBcb( - IN PVOID Bcb); + _In_ PVOID Bcb); NTKERNELAPI VOID NTAPI CcRepinBcb( - IN PVOID Bcb); + _In_ PVOID Bcb); NTKERNELAPI VOID NTAPI CcUnpinRepinnedBcb( - IN PVOID Bcb, - IN BOOLEAN WriteThrough, - OUT PIO_STATUS_BLOCK IoStatus); + _In_ PVOID Bcb, + _In_ BOOLEAN WriteThrough, + _Out_ PIO_STATUS_BLOCK IoStatus); NTKERNELAPI PFILE_OBJECT NTAPI CcGetFileObjectFromSectionPtrs( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer); NTKERNELAPI PFILE_OBJECT NTAPI CcGetFileObjectFromBcb( - IN PVOID Bcb); + _In_ PVOID Bcb); NTKERNELAPI BOOLEAN NTAPI CcCanIWrite( - IN PFILE_OBJECT FileObject, - IN ULONG BytesToWrite, - IN BOOLEAN Wait, - IN BOOLEAN Retrying); + _In_opt_ 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); + _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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _Out_writes_bytes_(Length) 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); + _In_ PFILE_OBJECT FileObject, + _In_ ULONG FileOffset, + _In_ ULONG Length, + _In_ ULONG PageCount, + _Out_writes_bytes_(Length) 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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_reads_bytes_(Length) PVOID Buffer); NTKERNELAPI VOID NTAPI CcFastCopyWrite( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN PVOID Buffer); + _In_ PFILE_OBJECT FileObject, + _In_ ULONG FileOffset, + _In_ ULONG Length, + _In_reads_bytes_(Length) 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); + _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); + _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); + _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); + _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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length); NTKERNELAPI NTSTATUS NTAPI -CcWaitForCurrentLazyWriterActivity( - VOID); +CcWaitForCurrentLazyWriterActivity(VOID); NTKERNELAPI VOID NTAPI CcSetReadAheadGranularity( - IN PFILE_OBJECT FileObject, - IN ULONG Granularity); + _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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG Flags, + _Outptr_ PVOID *Bcb, + _Outptr_result_bytebuffer_(Length) PVOID *Buffer); NTKERNELAPI BOOLEAN NTAPI CcPinMappedData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - IN OUT PVOID *Bcb); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG Flags, + _Inout_ 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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Zero, + _In_ ULONG Flags, + _Outptr_ PVOID *Bcb, + _Outptr_result_bytebuffer_(Length) PVOID *Buffer); NTKERNELAPI VOID NTAPI CcSetDirtyPinnedData( - IN PVOID BcbVoid, - IN PLARGE_INTEGER Lsn OPTIONAL); + _In_ PVOID BcbVoid, + _In_opt_ PLARGE_INTEGER Lsn); NTKERNELAPI VOID NTAPI CcUnpinData( - IN PVOID Bcb); + _In_ PVOID Bcb); NTKERNELAPI VOID NTAPI CcSetBcbOwnerPointer( - IN PVOID Bcb, - IN PVOID OwnerPointer); + _In_ PVOID Bcb, + _In_ PVOID OwnerPointer); NTKERNELAPI VOID NTAPI CcUnpinDataForThread( - IN PVOID Bcb, - IN ERESOURCE_THREAD ResourceThreadId); + _In_ PVOID Bcb, + _In_ ERESOURCE_THREAD ResourceThreadId); NTKERNELAPI VOID NTAPI CcSetAdditionalCacheAttributes( - IN PFILE_OBJECT FileObject, - IN BOOLEAN DisableReadAhead, - IN BOOLEAN DisableWriteBehind); + _In_ PFILE_OBJECT FileObject, + _In_ BOOLEAN DisableReadAhead, + _In_ BOOLEAN DisableWriteBehind); NTKERNELAPI BOOLEAN NTAPI CcIsThereDirtyData( - IN PVPB Vpb); + _In_ PVPB Vpb); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -298,25 +297,25 @@ NTKERNELAPI VOID NTAPI CcMdlWriteAbort( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain); + _In_ PFILE_OBJECT FileObject, + _In_ PMDL MdlChain); NTKERNELAPI VOID NTAPI CcSetLogHandleForFile( - IN PFILE_OBJECT FileObject, - IN PVOID LogHandle, - IN PFLUSH_TO_LSN FlushToLsnRoutine); + _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); + _In_ PVOID LogHandle, + _In_ PDIRTY_PAGE_ROUTINE DirtyPageRoutine, + _In_ PVOID Context1, + _In_ PVOID Context2); #endif @@ -325,23 +324,23 @@ NTKERNELAPI BOOLEAN NTAPI CcMapData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG Flags, + _Outptr_ PVOID *Bcb, + _Outptr_result_bytebuffer_(Length) 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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _Outptr_ PVOID *Bcb, + _Outptr_result_bytebuffer_(Length) PVOID *Buffer); #endif #if (NTDDI_VERSION >= NTDDI_VISTA) @@ -350,27 +349,27 @@ NTKERNELAPI NTSTATUS NTAPI CcSetFileSizesEx( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes); + _In_ PFILE_OBJECT FileObject, + _In_ PCC_FILE_SIZES FileSizes); NTKERNELAPI PFILE_OBJECT NTAPI CcGetFileObjectFromSectionPtrsRef( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer); NTKERNELAPI VOID NTAPI CcSetParallelFlushFile( - IN PFILE_OBJECT FileObject, - IN BOOLEAN EnableParallelFlush); + _In_ PFILE_OBJECT FileObject, + _In_ BOOLEAN EnableParallelFlush); NTKERNELAPI BOOLEAN CcIsThereDirtyDataEx( - IN PVPB Vpb, - IN PULONG NumberOfDirtyPages OPTIONAL); + _In_ PVPB Vpb, + _In_opt_ PULONG NumberOfDirtyPages); #endif @@ -379,11 +378,11 @@ 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); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_opt_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_opt_ ULONG Flags); #endif #define CcGetFileSizePointer(FO) ( \ @@ -395,19 +394,19 @@ NTKERNELAPI BOOLEAN NTAPI CcPurgeCacheSection( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - IN ULONG Flags); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_opt_ PLARGE_INTEGER FileOffset, + _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); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_opt_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN UninitializeCacheMaps); #endif #if (NTDDI_VERSION >= NTDDI_WIN7) @@ -415,9 +414,9 @@ NTKERNELAPI BOOLEAN NTAPI CcCopyWriteWontFlush( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length); #else #define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) #endif diff --git a/reactos/include/xdk/cctypes.h b/reactos/include/xdk/cctypes.h index 972abb78f6f..cd1f63ea62f 100644 --- a/reactos/include/xdk/cctypes.h +++ b/reactos/include/xdk/cctypes.h @@ -19,21 +19,21 @@ typedef struct _CC_FILE_SIZES { typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( - IN PVOID Context, - IN BOOLEAN Wait); + _In_ PVOID Context, + _In_ BOOLEAN Wait); typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) ( - IN PVOID Context); + _In_ PVOID Context); typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) ( - IN PVOID Context, - IN BOOLEAN Wait); + _In_ PVOID Context, + _In_ BOOLEAN Wait); typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) ( - IN PVOID Context); + _In_ PVOID Context); typedef struct _CACHE_MANAGER_CALLBACKS { PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; @@ -49,23 +49,23 @@ typedef struct _CACHE_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); + _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); + _In_ PVOID LogHandle, + _In_ LARGE_INTEGER Lsn); typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) ( - IN PVOID Context1, - IN PVOID Context2); + _In_ PVOID Context1, + _In_ PVOID Context2); #define UNINITIALIZE_CACHE_MAPS (1) #define DO_NOT_RETRY_PURGE (2) diff --git a/reactos/include/xdk/cmfuncs.h b/reactos/include/xdk/cmfuncs.h index 44571a7d2bc..eef6f5e84d0 100644 --- a/reactos/include/xdk/cmfuncs.h +++ b/reactos/include/xdk/cmfuncs.h @@ -4,65 +4,72 @@ $if (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI CmRegisterCallback( - IN PEX_CALLBACK_FUNCTION Function, - IN PVOID Context OPTIONAL, - OUT PLARGE_INTEGER Cookie); + _In_ PEX_CALLBACK_FUNCTION Function, + _In_opt_ PVOID Context, + _Out_ PLARGE_INTEGER Cookie); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI CmUnRegisterCallback( - IN LARGE_INTEGER Cookie); + _In_ LARGE_INTEGER Cookie); #endif #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI CmRegisterCallbackEx( - PEX_CALLBACK_FUNCTION Function, - PCUNICODE_STRING Altitude, - PVOID Driver, - PVOID Context, - PLARGE_INTEGER Cookie, - PVOID Reserved); + _In_ PEX_CALLBACK_FUNCTION Function, + _In_ PCUNICODE_STRING Altitude, + _In_ PVOID Driver, + _In_opt_ PVOID Context, + _Out_ PLARGE_INTEGER Cookie, + _Reserved_ PVOID Reserved); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI CmGetCallbackVersion( - OUT PULONG Major OPTIONAL, - OUT PULONG Minor OPTIONAL); + _Out_opt_ PULONG Major, + _Out_opt_ PULONG Minor); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI CmSetCallbackObjectContext( - IN OUT PVOID Object, - IN PLARGE_INTEGER Cookie, - IN PVOID NewContext, - OUT PVOID *OldContext OPTIONAL); + _Inout_ PVOID Object, + _In_ PLARGE_INTEGER Cookie, + _In_ PVOID NewContext, + _Out_opt_ PVOID *OldContext); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI CmCallbackGetKeyObjectID( - IN PLARGE_INTEGER Cookie, - IN PVOID Object, - OUT PULONG_PTR ObjectID OPTIONAL, - OUT PCUNICODE_STRING *ObjectName OPTIONAL); + _In_ PLARGE_INTEGER Cookie, + _In_ PVOID Object, + _Out_opt_ PULONG_PTR ObjectID, + _Outptr_opt_ PCUNICODE_STRING *ObjectName); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI CmGetBoundTransaction( - IN PLARGE_INTEGER Cookie, - IN PVOID Object); + _In_ PLARGE_INTEGER Cookie, + _In_ PVOID Object); #endif // NTDDI_VERSION >= NTDDI_VISTA diff --git a/reactos/include/xdk/cmtypes.h b/reactos/include/xdk/cmtypes.h index 41f52ec8f10..d00669f7c6b 100644 --- a/reactos/include/xdk/cmtypes.h +++ b/reactos/include/xdk/cmtypes.h @@ -586,13 +586,13 @@ typedef struct _KEY_VALUE_PARTIAL_INFORMATION { ULONG TitleIndex; ULONG Type; ULONG DataLength; - UCHAR Data[1]; + _Field_size_bytes_(DataLength) UCHAR Data[1]; } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 { ULONG Type; ULONG DataLength; - UCHAR Data[1]; + _Field_size_bytes_(DataLength) UCHAR Data[1]; } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64; typedef struct _KEY_VALUE_ENTRY { @@ -680,11 +680,13 @@ typedef enum _REG_NOTIFY_CLASS { MaxRegNtNotifyClass } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS; +_IRQL_requires_same_ +_Function_class_(EX_CALLBACK_FUNCTION) typedef NTSTATUS (NTAPI EX_CALLBACK_FUNCTION)( - IN PVOID CallbackContext, - IN PVOID Argument1, - IN PVOID Argument2); + _In_ PVOID CallbackContext, + _In_opt_ PVOID Argument1, + _In_opt_ PVOID Argument2); typedef EX_CALLBACK_FUNCTION *PEX_CALLBACK_FUNCTION; typedef struct _REG_DELETE_KEY_INFORMATION { diff --git a/reactos/include/xdk/exfuncs.h b/reactos/include/xdk/exfuncs.h index e754ea84c16..fffdac57ed2 100644 --- a/reactos/include/xdk/exfuncs.h +++ b/reactos/include/xdk/exfuncs.h @@ -42,23 +42,34 @@ ExiTryToAcquireFastMutex( #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_raises_(APC_LEVEL) +_IRQL_saves_global_(OldIrql, FastMutex) NTKERNELAPI VOID FASTCALL ExAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) + PFAST_MUTEX FastMutex); +_IRQL_requires_(APC_LEVEL) +_IRQL_restores_global_(OldIrql, FastMutex) NTKERNELAPI VOID FASTCALL ExReleaseFastMutex( - IN OUT PFAST_MUTEX FastMutex); + _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) + PFAST_MUTEX FastMutex); +_Must_inspect_result_ +_Success_(return!=FALSE) +_IRQL_raises_(APC_LEVEL) +_IRQL_saves_global_(OldIrql, FastMutex) NTKERNELAPI BOOLEAN FASTCALL ExTryToAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) + PFAST_MUTEX FastMutex); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -79,11 +90,11 @@ ExTryToAcquireFastMutex( defined(_NTHAL_) || defined(_NTOSP_) NTKERNELAPI USHORT -ExQueryDepthSList(IN PSLIST_HEADER ListHead); +ExQueryDepthSList(_In_ PSLIST_HEADER ListHead); #else FORCEINLINE USHORT -ExQueryDepthSList(IN PSLIST_HEADER ListHead) +ExQueryDepthSList(_In_ PSLIST_HEADER ListHead) { return (USHORT)(ListHead->Alignment & 0xffff); } @@ -97,13 +108,13 @@ ExpInterlockedFlushSList( NTKERNELAPI PSLIST_ENTRY ExpInterlockedPopEntrySList( - PSLIST_HEADER ListHead); + _Inout_ PSLIST_HEADER ListHead); NTKERNELAPI PSLIST_ENTRY ExpInterlockedPushEntrySList( - PSLIST_HEADER ListHead, - PSLIST_ENTRY ListEntry); + _Inout_ PSLIST_HEADER ListHead, + _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry); #define ExInterlockedFlushSList(Head) \ ExpInterlockedFlushSList(Head) @@ -124,7 +135,7 @@ NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedFlushSList( - IN OUT PSLIST_HEADER ListHead); + _Inout_ PSLIST_HEADER ListHead); #endif /* !defined(_WIN64) */ @@ -134,29 +145,31 @@ NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedPopEntrySList( - IN PSLIST_HEADER ListHead, - IN PKSPIN_LOCK Lock); + _Inout_ PSLIST_HEADER ListHead, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedPushEntrySList( - IN PSLIST_HEADER ListHead, - IN PSINGLE_LIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock); + _Inout_ PSLIST_HEADER ListHead, + _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI ExAllocateFromPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside); + _Inout_ PPAGED_LOOKASIDE_LIST Lookaside); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExFreeToPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry); + _Inout_ PPAGED_LOOKASIDE_LIST Lookaside, + _In_ PVOID Entry); #else /* !_WIN2K_COMPAT_SLIST_USAGE */ @@ -167,10 +180,11 @@ ExFreeToPagedLookasideList( InterlockedPushEntrySList(_ListHead, _ListEntry) #endif +_IRQL_requires_max_(APC_LEVEL) static __inline PVOID ExAllocateFromPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside) + _Inout_ PPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; @@ -195,11 +209,12 @@ ExAllocateFromPagedLookasideList( return Entry; } +_IRQL_requires_max_(APC_LEVEL) static __inline VOID ExFreeToPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry) + _Inout_ PPAGED_LOOKASIDE_LIST Lookaside, + _In_ PVOID Entry) { Lookaside->L.TotalFrees++; #ifdef NONAMELESSUNION @@ -246,7 +261,7 @@ ExFreeToPagedLookasideList( FORCEINLINE VOID ExInitializeFastMutex( - OUT PFAST_MUTEX FastMutex) + _Out_ PFAST_MUTEX FastMutex) { FastMutex->Count = FM_LOCK_BIT; FastMutex->Owner = NULL; @@ -340,20 +355,20 @@ NTKERNELAPI INTERLOCKED_RESULT FASTCALL Exfi386InterlockedIncrementLong( - IN OUT LONG volatile *Addend); + _Inout_ _Interlocked_operand_ LONG volatile *Addend); NTKERNELAPI INTERLOCKED_RESULT FASTCALL Exfi386InterlockedDecrementLong( - IN PLONG Addend); + _Inout_ _Interlocked_operand_ PLONG Addend); NTKERNELAPI ULONG FASTCALL Exfi386InterlockedExchangeUlong( - IN PULONG Target, - IN ULONG Value); + _Inout_ _Interlocked_operand_ PULONG Target, + _In_ ULONG Value); #endif @@ -363,199 +378,300 @@ $if (_NTIFS_) #define ExDisableResourceBoost ExDisableResourceBoostLite VOID -ExInitializePushLock ( - OUT PEX_PUSH_LOCK PushLock); +ExInitializePushLock( + _Out_ PEX_PUSH_LOCK PushLock); $endif (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WIN2K) $if (_WDMDDK_) +_IRQL_requires_max_(APC_LEVEL) +_Requires_lock_held_(_Global_critical_region_) NTKERNELAPI VOID FASTCALL ExAcquireFastMutexUnsafe( - IN OUT PFAST_MUTEX FastMutex); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) + PFAST_MUTEX FastMutex); +_IRQL_requires_max_(APC_LEVEL) +_Requires_lock_held_(_Global_critical_region_) NTKERNELAPI VOID FASTCALL ExReleaseFastMutexUnsafe( - IN OUT PFAST_MUTEX FastMutex); + _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) + PFAST_MUTEX FastMutex); +_Requires_lock_held_(_Global_critical_region_) +_Requires_lock_not_held_(*Resource) +_When_(Wait!=0, _Acquires_exclusive_lock_(*Resource)) +_IRQL_requires_max_(APC_LEVEL) +_When_(Wait!=0, _Post_satisfies_(return == 1)) +_When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) NTKERNELAPI BOOLEAN NTAPI ExAcquireResourceExclusiveLite( - IN OUT PERESOURCE Resource, - IN BOOLEAN Wait); + _Inout_ PERESOURCE Resource, + _In_ _Literal_ BOOLEAN Wait); +_IRQL_requires_max_(APC_LEVEL) +_Requires_lock_held_(_Global_critical_region_) +_When_(Wait!=0, _Post_satisfies_(return == 1)) +_When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) NTKERNELAPI BOOLEAN NTAPI ExAcquireResourceSharedLite( - IN OUT PERESOURCE Resource, - IN BOOLEAN Wait); + _Inout_ _Requires_lock_not_held_(*_Curr_) + _When_(return!=0, _Acquires_shared_lock_(*_Curr_)) + PERESOURCE Resource, + _In_ BOOLEAN Wait); +_IRQL_requires_max_(APC_LEVEL) +_Requires_lock_held_(_Global_critical_region_) +_When_(Wait!=0, _Post_satisfies_(return == 1)) +_When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) NTKERNELAPI BOOLEAN NTAPI ExAcquireSharedStarveExclusive( - IN OUT PERESOURCE Resource, - IN BOOLEAN Wait); + _Inout_ _Requires_lock_not_held_(*_Curr_) + _When_(return!=0, _Acquires_shared_lock_(*_Curr_)) + PERESOURCE Resource, + _In_ BOOLEAN Wait); +_IRQL_requires_max_(APC_LEVEL) +_Requires_lock_held_(_Global_critical_region_) +_When_(Wait!=0, _Post_satisfies_(return == 1)) +_When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) NTKERNELAPI BOOLEAN NTAPI ExAcquireSharedWaitForExclusive( - IN OUT PERESOURCE Resource, - IN BOOLEAN Wait); + _Inout_ _Requires_lock_not_held_(*_Curr_) + _When_(return!=0, _Acquires_lock_(*_Curr_)) + PERESOURCE Resource, + _In_ BOOLEAN Wait); +__drv_preferredFunction("ExAllocatePoolWithTag", + "No tag interferes with debugging.") +__drv_allocatesMem(Mem) +_When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_((PoolType & NonPagedPoolMustSucceed) != 0, + __drv_reportError("Must succeed pool allocations are forbidden. " + "Allocation failures cause a system crash")) +_When_((PoolType & (NonPagedPoolMustSucceed | + POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0, + _Post_maybenull_ _Must_inspect_result_) +_When_((PoolType & (NonPagedPoolMustSucceed | + POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0, + _Post_notnull_) +_Post_writable_byte_size_(NumberOfBytes) NTKERNELAPI PVOID NTAPI ExAllocatePool( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes); + __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes); +__drv_preferredFunction("ExAllocatePoolWithQuotaTag", + "No tag interferes with debugging.") +__drv_allocatesMem(Mem) +_When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_((PoolType & NonPagedPoolMustSucceed) != 0, + __drv_reportError("Must succeed pool allocations are forbidden. " + "Allocation failures cause a system crash")) +_When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0, + _Post_maybenull_ _Must_inspect_result_) +_When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_) +_Post_writable_byte_size_(NumberOfBytes) NTKERNELAPI PVOID NTAPI ExAllocatePoolWithQuota( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes); + __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes); +__drv_allocatesMem(Mem) +_When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_((PoolType & NonPagedPoolMustSucceed) != 0, + __drv_reportError("Must succeed pool allocations are forbidden. " + "Allocation failures cause a system crash")) +_When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0, + _Post_maybenull_ _Must_inspect_result_) +_When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_) +_Post_writable_byte_size_(NumberOfBytes) NTKERNELAPI PVOID NTAPI ExAllocatePoolWithQuotaTag( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag); + _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes, + _In_ ULONG Tag); #ifndef POOL_TAGGING #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b) #endif +__drv_allocatesMem(Mem) +_When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_((PoolType & NonPagedPoolMustSucceed) != 0, + __drv_reportError("Must succeed pool allocations are forbidden. " + "Allocation failures cause a system crash")) +_When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0, + _Post_maybenull_ _Must_inspect_result_) +_When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0, + _Post_notnull_) +_Post_writable_byte_size_(NumberOfBytes) NTKERNELAPI PVOID NTAPI ExAllocatePoolWithTag( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag); + _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes, + _In_ ULONG Tag); #ifndef POOL_TAGGING #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b) #endif +__drv_allocatesMem(Mem) +_When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_((PoolType & NonPagedPoolMustSucceed) != 0, + __drv_reportError("Must succeed pool allocations are forbidden. " + "Allocation failures cause a system crash")) +_When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0, + _Post_maybenull_ _Must_inspect_result_) +_When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0, + _Post_notnull_) +_Post_writable_byte_size_(NumberOfBytes) NTKERNELAPI PVOID NTAPI ExAllocatePoolWithTagPriority( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag, - IN EX_POOL_PRIORITY Priority); + _In_ __drv_strictTypeMatch(__drv_typeCond) POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes, + _In_ ULONG Tag, + _In_ __drv_strictTypeMatch(__drv_typeExpr) EX_POOL_PRIORITY Priority); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExConvertExclusiveToSharedLite( - IN OUT PERESOURCE Resource); + _Inout_ _Requires_lock_held_(*_Curr_) PERESOURCE Resource); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExCreateCallback( - OUT PCALLBACK_OBJECT *CallbackObject, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN Create, - IN BOOLEAN AllowMultipleCallbacks); + _Outptr_ PCALLBACK_OBJECT *CallbackObject, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ BOOLEAN Create, + _In_ BOOLEAN AllowMultipleCallbacks); NTKERNELAPI VOID NTAPI ExDeleteNPagedLookasideList( - IN OUT PNPAGED_LOOKASIDE_LIST Lookaside); + _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExDeletePagedLookasideList( - IN PPAGED_LOOKASIDE_LIST Lookaside); + _Inout_ PPAGED_LOOKASIDE_LIST Lookaside); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExDeleteResourceLite( - IN OUT PERESOURCE Resource); + _Inout_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExFreePool( - IN PVOID P); + _In_ __drv_freesMem(Mem) PVOID P); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExFreePoolWithTag( - IN PVOID P, - IN ULONG Tag); + _In_ __drv_freesMem(Mem) PVOID P, + _In_ ULONG Tag); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI ULONG NTAPI ExGetExclusiveWaiterCount( - IN PERESOURCE Resource); + _In_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI KPROCESSOR_MODE NTAPI ExGetPreviousMode(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI ULONG NTAPI ExGetSharedWaiterCount( - IN PERESOURCE Resource); + _In_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExInitializeNPagedLookasideList( - IN PNPAGED_LOOKASIDE_LIST Lookaside, - IN PALLOCATE_FUNCTION Allocate OPTIONAL, - IN PFREE_FUNCTION Free OPTIONAL, - IN ULONG Flags, - IN SIZE_T Size, - IN ULONG Tag, - IN USHORT Depth); + _Out_ PNPAGED_LOOKASIDE_LIST Lookaside, + _In_opt_ PALLOCATE_FUNCTION Allocate, + _In_opt_ PFREE_FUNCTION Free, + _In_ ULONG Flags, + _In_ SIZE_T Size, + _In_ ULONG Tag, + _In_ USHORT Depth); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExInitializePagedLookasideList( - IN PPAGED_LOOKASIDE_LIST Lookaside, - IN PALLOCATE_FUNCTION Allocate OPTIONAL, - IN PFREE_FUNCTION Free OPTIONAL, - IN ULONG Flags, - IN SIZE_T Size, - IN ULONG Tag, - IN USHORT Depth); + _Out_ PPAGED_LOOKASIDE_LIST Lookaside, + _In_opt_ PALLOCATE_FUNCTION Allocate, + _In_opt_ PFREE_FUNCTION Free, + _In_ ULONG Flags, + _In_ SIZE_T Size, + _In_ ULONG Tag, + _In_ USHORT Depth); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExInitializeResourceLite( - OUT PERESOURCE Resource); + _Out_ PERESOURCE Resource); NTKERNELAPI LARGE_INTEGER NTAPI ExInterlockedAddLargeInteger( - IN PLARGE_INTEGER Addend, - IN LARGE_INTEGER Increment, - IN PKSPIN_LOCK Lock); + _Inout_ PLARGE_INTEGER Addend, + _In_ LARGE_INTEGER Increment, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); #if defined(_WIN64) #define ExInterlockedAddLargeStatistic(Addend, Increment) \ @@ -569,9 +685,9 @@ NTKERNELAPI ULONG FASTCALL ExInterlockedAddUlong( - IN PULONG Addend, - IN ULONG Increment, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PULONG Addend, + _In_ ULONG Increment, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); #if defined(_AMD64_) || defined(_IA64_) @@ -584,9 +700,9 @@ NTKERNELAPI LONGLONG FASTCALL ExfInterlockedCompareExchange64( - IN OUT LONGLONG volatile *Destination, - IN PLONGLONG Exchange, - IN PLONGLONG Comperand); + _Inout_ _Interlocked_operand_ LONGLONG volatile *Destination, + _In_ PLONGLONG Exchange, + _In_ PLONGLONG Comperand); #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \ ExfInterlockedCompareExchange64(Destination, Exchange, Comperand) @@ -608,57 +724,60 @@ NTKERNELAPI PLIST_ENTRY FASTCALL ExInterlockedInsertHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY ListEntry, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PLIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); NTKERNELAPI PLIST_ENTRY FASTCALL ExInterlockedInsertTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY ListEntry, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PLIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedPopEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PSINGLE_LIST_ENTRY ListHead, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedPushEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PSINGLE_LIST_ENTRY ListEntry, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PSINGLE_LIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); NTKERNELAPI PLIST_ENTRY FASTCALL ExInterlockedRemoveHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PLIST_ENTRY ListHead, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI ExIsProcessorFeaturePresent( - IN ULONG ProcessorFeature); + _In_ ULONG ProcessorFeature); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI ExIsResourceAcquiredExclusiveLite( - IN PERESOURCE Resource); + _In_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI ULONG NTAPI ExIsResourceAcquiredSharedLite( - IN PERESOURCE Resource); + _In_ PERESOURCE Resource); #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite @@ -666,84 +785,99 @@ NTKERNELAPI VOID NTAPI ExLocalTimeToSystemTime( - IN PLARGE_INTEGER LocalTime, - OUT PLARGE_INTEGER SystemTime); + _In_ PLARGE_INTEGER LocalTime, + _Out_ PLARGE_INTEGER SystemTime); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExNotifyCallback( - IN PCALLBACK_OBJECT CallbackObject, - IN PVOID Argument1 OPTIONAL, - IN PVOID Argument2 OPTIONAL); + _In_ PCALLBACK_OBJECT CallbackObject, + _In_opt_ PVOID Argument1, + _In_opt_ PVOID Argument2); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExQueueWorkItem( - IN OUT PWORK_QUEUE_ITEM WorkItem, - IN WORK_QUEUE_TYPE QueueType); + _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem, + __drv_strictTypeMatch(__drv_typeExpr) _In_ WORK_QUEUE_TYPE QueueType); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI DECLSPEC_NORETURN VOID NTAPI ExRaiseStatus( - IN NTSTATUS Status); + _In_ NTSTATUS Status); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI ExRegisterCallback( - IN PCALLBACK_OBJECT CallbackObject, - IN PCALLBACK_FUNCTION CallbackFunction, - IN PVOID CallbackContext OPTIONAL); + _Inout_ PCALLBACK_OBJECT CallbackObject, + _In_ PCALLBACK_FUNCTION CallbackFunction, + _In_opt_ PVOID CallbackContext); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExReinitializeResourceLite( - IN OUT PERESOURCE Resource); + _Inout_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Requires_lock_held_(_Global_critical_region_) NTKERNELAPI VOID NTAPI ExReleaseResourceForThreadLite( - IN OUT PERESOURCE Resource, - IN ERESOURCE_THREAD ResourceThreadId); + _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) + PERESOURCE Resource, + _In_ ERESOURCE_THREAD ResourceThreadId); +_Requires_lock_held_(_Global_critical_region_) +_Requires_lock_held_(*Resource) +_Releases_lock_(*Resource) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL ExReleaseResourceLite( - IN OUT PERESOURCE Resource); + _Inout_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExSetResourceOwnerPointer( - IN OUT PERESOURCE Resource, - IN PVOID OwnerPointer); + _Inout_ PERESOURCE Resource, + _In_ PVOID OwnerPointer); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI ULONG NTAPI ExSetTimerResolution( - IN ULONG DesiredTime, - IN BOOLEAN SetResolution); + _In_ ULONG DesiredTime, + _In_ BOOLEAN SetResolution); NTKERNELAPI VOID NTAPI ExSystemTimeToLocalTime( - IN PLARGE_INTEGER SystemTime, - OUT PLARGE_INTEGER LocalTime); + _In_ PLARGE_INTEGER SystemTime, + _Out_ PLARGE_INTEGER LocalTime); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExUnregisterCallback( - IN OUT PVOID CbRegistration); + _Inout_ PVOID CbRegistration); $endif (_WDMDDK_) $if (_NTDDK_) @@ -751,40 +885,44 @@ NTKERNELAPI NTSTATUS NTAPI ExExtendZone( - IN OUT PZONE_HEADER Zone, - IN OUT PVOID Segment, - IN ULONG SegmentSize); + _Inout_ PZONE_HEADER Zone, + _Inout_ PVOID Segment, + _In_ ULONG SegmentSize); NTKERNELAPI NTSTATUS NTAPI ExInitializeZone( - OUT PZONE_HEADER Zone, - IN ULONG BlockSize, - IN OUT PVOID InitialSegment, - IN ULONG InitialSegmentSize); + _Out_ PZONE_HEADER Zone, + _In_ ULONG BlockSize, + _Inout_ PVOID InitialSegment, + _In_ ULONG InitialSegmentSize); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExInterlockedExtendZone( - IN OUT PZONE_HEADER Zone, - IN OUT PVOID Segment, - IN ULONG SegmentSize, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PZONE_HEADER Zone, + _Inout_ PVOID Segment, + _In_ ULONG SegmentSize, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExUuidCreate( - OUT UUID *Uuid); + _Out_ UUID *Uuid); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI DECLSPEC_NORETURN VOID NTAPI ExRaiseAccessViolation(VOID); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI DECLSPEC_NORETURN VOID @@ -794,22 +932,24 @@ ExRaiseDatatypeMisalignment(VOID); $endif (_NTDDK_) $if (_NTIFS_) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI SIZE_T NTAPI ExQueryPoolBlockSize( - IN PVOID PoolBlock, - OUT PBOOLEAN QuotaCharged); + _In_ PVOID PoolBlock, + _Out_ PBOOLEAN QuotaCharged); +_IRQL_requires_max_(DISPATCH_LEVEL) VOID -ExAdjustLookasideDepth( - VOID); +ExAdjustLookasideDepth(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExDisableResourceBoostLite( - IN PERESOURCE Resource); + _In_ PERESOURCE Resource); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -818,57 +958,59 @@ $if (_WDMDDK_ || _NTIFS_) $endif (_WDMDDK_ || _NTIFS_) $if (_WDMDDK_) +_Must_inspect_result_ +_Post_satisfies_(return == 0 || return == 1) NTKERNELAPI BOOLEAN FASTCALL ExAcquireRundownProtection( - IN OUT PEX_RUNDOWN_REF RunRef); + _Inout_ PEX_RUNDOWN_REF RunRef); NTKERNELAPI VOID FASTCALL ExInitializeRundownProtection( - OUT PEX_RUNDOWN_REF RunRef); + _Out_ PEX_RUNDOWN_REF RunRef); NTKERNELAPI VOID FASTCALL ExReInitializeRundownProtection( - IN OUT PEX_RUNDOWN_REF RunRef); + _Inout_ PEX_RUNDOWN_REF RunRef); NTKERNELAPI VOID FASTCALL ExReleaseRundownProtection( - IN OUT PEX_RUNDOWN_REF RunRef); + _Inout_ PEX_RUNDOWN_REF RunRef); NTKERNELAPI VOID FASTCALL ExRundownCompleted( - OUT PEX_RUNDOWN_REF RunRef); + _Out_ PEX_RUNDOWN_REF RunRef); NTKERNELAPI BOOLEAN NTAPI ExVerifySuite( - IN SUITE_TYPE SuiteType); + __drv_strictTypeMatch(__drv_typeExpr) _In_ SUITE_TYPE SuiteType); NTKERNELAPI VOID FASTCALL ExWaitForRundownProtectionRelease( - IN OUT PEX_RUNDOWN_REF RunRef); + _Inout_ PEX_RUNDOWN_REF RunRef); $endif (_WDMDDK_) $if (_NTIFS_) PSLIST_ENTRY FASTCALL InterlockedPushListSList( - IN OUT PSLIST_HEADER ListHead, - IN OUT PSLIST_ENTRY List, - IN OUT PSLIST_ENTRY ListEnd, - IN ULONG Count); + _Inout_ PSLIST_HEADER ListHead, + _Inout_ __drv_aliasesMem PSLIST_ENTRY List, + _Inout_ PSLIST_ENTRY ListEnd, + _In_ ULONG Count); $endif (_NTIFS_) $if (_WDMDDK_ || _NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -877,98 +1019,121 @@ $endif (_WDMDDK_ || _NTIFS_) $if (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WINXPSP2) +_Must_inspect_result_ +_Post_satisfies_(return == 0 || return == 1) NTKERNELAPI BOOLEAN FASTCALL ExAcquireRundownProtectionEx( - IN OUT PEX_RUNDOWN_REF RunRef, - IN ULONG Count); + _Inout_ PEX_RUNDOWN_REF RunRef, + _In_ ULONG Count); NTKERNELAPI VOID FASTCALL ExReleaseRundownProtectionEx( - IN OUT PEX_RUNDOWN_REF RunRef, - IN ULONG Count); + _Inout_ PEX_RUNDOWN_REF RunRef, + _In_ ULONG Count); #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */ #if (NTDDI_VERSION >= NTDDI_WS03SP1) +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PEX_RUNDOWN_REF_CACHE_AWARE NTAPI ExAllocateCacheAwareRundownProtection( - IN POOL_TYPE PoolType, - IN ULONG PoolTag); + __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType, + _In_ ULONG PoolTag); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI SIZE_T NTAPI ExSizeOfRundownProtectionCacheAware(VOID); +_IRQL_requires_max_(APC_LEVEL) +_Acquires_lock_(_Global_critical_region_) NTKERNELAPI PVOID NTAPI ExEnterCriticalRegionAndAcquireResourceShared( - IN OUT PERESOURCE Resource); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_shared_lock_(*_Curr_) + PERESOURCE Resource); +_IRQL_requires_max_(APC_LEVEL) +_Acquires_lock_(_Global_critical_region_) NTKERNELAPI PVOID NTAPI ExEnterCriticalRegionAndAcquireResourceExclusive( - IN OUT PERESOURCE Resource); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_) + PERESOURCE Resource); +_IRQL_requires_max_(APC_LEVEL) +_Acquires_lock_(_Global_critical_region_) NTKERNELAPI PVOID NTAPI ExEnterCriticalRegionAndAcquireSharedWaitForExclusive( - IN OUT PERESOURCE Resource); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) + PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Releases_lock_(_Global_critical_region_) NTKERNELAPI VOID FASTCALL ExReleaseResourceAndLeaveCriticalRegion( - IN OUT PERESOURCE Resource); + _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) + PERESOURCE Resource); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExInitializeRundownProtectionCacheAware( - OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, - IN SIZE_T RunRefSize); + _Out_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, + _In_ SIZE_T RunRefSize); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExFreeCacheAwareRundownProtection( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); +_Must_inspect_result_ +_Post_satisfies_(return == 0 || return == 1) NTKERNELAPI BOOLEAN FASTCALL ExAcquireRundownProtectionCacheAware( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); NTKERNELAPI VOID FASTCALL ExReleaseRundownProtectionCacheAware( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); +_Must_inspect_result_ +_Post_satisfies_(return == 0 || return == 1) NTKERNELAPI BOOLEAN FASTCALL ExAcquireRundownProtectionCacheAwareEx( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, - IN ULONG Count); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, + _In_ ULONG Count); NTKERNELAPI VOID FASTCALL ExReleaseRundownProtectionCacheAwareEx( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef, - IN ULONG Count); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRef, + _In_ ULONG Count); NTKERNELAPI VOID @@ -980,47 +1145,52 @@ NTKERNELAPI VOID FASTCALL ExReInitializeRundownProtectionCacheAware( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); NTKERNELAPI VOID FASTCALL ExRundownCompletedCacheAware( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExInitializeLookasideListEx( - OUT PLOOKASIDE_LIST_EX Lookaside, - IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL, - IN PFREE_FUNCTION_EX Free OPTIONAL, - IN POOL_TYPE PoolType, - IN ULONG Flags, - IN SIZE_T Size, - IN ULONG Tag, - IN USHORT Depth); + _Out_ PLOOKASIDE_LIST_EX Lookaside, + _In_opt_ PALLOCATE_FUNCTION_EX Allocate, + _In_opt_ PFREE_FUNCTION_EX Free, + _In_ POOL_TYPE PoolType, + _In_ ULONG Flags, + _In_ SIZE_T Size, + _In_ ULONG Tag, + _In_ USHORT Depth); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExDeleteLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside); + _Inout_ PLOOKASIDE_LIST_EX Lookaside); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExFlushLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside); + _Inout_ PLOOKASIDE_LIST_EX Lookaside); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) FORCEINLINE PVOID ExAllocateFromLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside) + _Inout_ PLOOKASIDE_LIST_EX Lookaside) { PVOID Entry; @@ -1047,11 +1217,12 @@ ExAllocateFromLookasideListEx( return Entry; } +_IRQL_requires_max_(DISPATCH_LEVEL) FORCEINLINE VOID ExFreeToLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside, - IN PVOID Entry) + _Inout_ PLOOKASIDE_LIST_EX Lookaside, + _In_ PVOID Entry) { Lookaside->L.TotalFrees += 1; if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { @@ -1067,21 +1238,23 @@ ExFreeToLookasideListEx( #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExSetResourceOwnerPointerEx( - IN OUT PERESOURCE Resource, - IN PVOID OwnerPointer, - IN ULONG Flags); + _Inout_ PERESOURCE Resource, + _In_ PVOID OwnerPointer, + _In_ ULONG Flags); #define FLAG_OWNER_POINTER_IS_THREAD 0x1 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ +_IRQL_requires_max_(DISPATCH_LEVEL) static __inline PVOID ExAllocateFromNPagedLookasideList( - IN OUT PNPAGED_LOOKASIDE_LIST Lookaside) + _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; @@ -1116,10 +1289,11 @@ ExAllocateFromNPagedLookasideList( return Entry; } +_IRQL_requires_max_(DISPATCH_LEVEL) static __inline VOID ExFreeToNPagedLookasideList( - IN OUT PNPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry) + _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside, + _In_ PVOID Entry) { Lookaside->L.TotalFrees++; #ifdef NONAMELESSUNION diff --git a/reactos/include/xdk/extypes.h b/reactos/include/xdk/extypes.h index d53c66432e3..4d9bcb952c7 100644 --- a/reactos/include/xdk/extypes.h +++ b/reactos/include/xdk/extypes.h @@ -56,33 +56,43 @@ typedef enum _EX_POOL_PRIORITY { typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX; +_IRQL_requires_same_ +_Function_class_(ALLOCATE_FUNCTION) typedef PVOID (NTAPI *PALLOCATE_FUNCTION)( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag); + _In_ POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes, + _In_ ULONG Tag); +_IRQL_requires_same_ +_Function_class_(ALLOCATE_FUNCTION_EX) typedef PVOID (NTAPI *PALLOCATE_FUNCTION_EX)( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag, - IN OUT PLOOKASIDE_LIST_EX Lookaside); + _In_ POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes, + _In_ ULONG Tag, + _Inout_ PLOOKASIDE_LIST_EX Lookaside); +_IRQL_requires_same_ +_Function_class_(FREE_FUNCTION) typedef VOID (NTAPI *PFREE_FUNCTION)( - IN PVOID Buffer); + _In_ PVOID Buffer); +_IRQL_requires_same_ +_Function_class_(FREE_FUNCTION_EX) typedef VOID (NTAPI *PFREE_FUNCTION_EX)( - IN PVOID Buffer, - IN OUT PLOOKASIDE_LIST_EX Lookaside); + _In_ PVOID Buffer, + _Inout_ PLOOKASIDE_LIST_EX Lookaside); +_IRQL_requires_same_ +_Function_class_(CALLBACK_FUNCTION) typedef VOID (NTAPI CALLBACK_FUNCTION)( - IN PVOID CallbackContext OPTIONAL, - IN PVOID Argument1 OPTIONAL, - IN PVOID Argument2 OPTIONAL); + _In_opt_ PVOID CallbackContext, + _In_opt_ PVOID Argument1, + _In_opt_ PVOID Argument2); typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION; #define GENERAL_LOOKASIDE_LAYOUT \ @@ -136,7 +146,7 @@ LOOKASIDE_CHECK(TotalFrees); LOOKASIDE_CHECK(Tag); LOOKASIDE_CHECK(Future); -typedef struct _PAGED_LOOKASIDE_LIST { +typedef struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST { GENERAL_LOOKASIDE L; #if !defined(_AMD64_) && !defined(_IA64_) FAST_MUTEX Lock__ObsoleteButDoNotDelete; @@ -182,9 +192,11 @@ typedef enum _WORK_QUEUE_TYPE { MaximumWorkQueue } WORK_QUEUE_TYPE; +_IRQL_requires_same_ +_Function_class_(WORKER_THREAD_ROUTINE) typedef VOID (NTAPI WORKER_THREAD_ROUTINE)( - IN PVOID Parameter); + _In_ PVOID Parameter); typedef WORKER_THREAD_ROUTINE *PWORKER_THREAD_ROUTINE; typedef struct _WORK_QUEUE_ITEM { diff --git a/reactos/include/xdk/fsrtlfuncs.h b/reactos/include/xdk/fsrtlfuncs.h index 3b411e76461..b98897c0bb8 100644 --- a/reactos/include/xdk/fsrtlfuncs.h +++ b/reactos/include/xdk/fsrtlfuncs.h @@ -6,124 +6,145 @@ $if (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WIN2K) +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCopyRead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_ ULONG LockKey, + _Out_writes_bytes_(Length) PVOID Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ PDEVICE_OBJECT DeviceObject); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCopyWrite( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - IN PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_ ULONG LockKey, + _In_reads_bytes_(Length) PVOID Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ PDEVICE_OBJECT DeviceObject); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlMdlReadDev( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject OPTIONAL); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _Outptr_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_opt_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlMdlReadCompleteDev( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain, - IN PDEVICE_OBJECT DeviceObject OPTIONAL); + _In_ PFILE_OBJECT FileObject, + _In_ PMDL MdlChain, + _In_opt_ PDEVICE_OBJECT DeviceObject); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlPrepareMdlWriteDev( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _Outptr_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ PDEVICE_OBJECT DeviceObject); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlMdlWriteCompleteDev( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain, - IN PDEVICE_OBJECT DeviceObject); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PMDL MdlChain, + _In_opt_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI FsRtlAcquireFileExclusive( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlReleaseFile( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlGetFileSize( - IN PFILE_OBJECT FileObject, - OUT PLARGE_INTEGER FileSize); + _In_ PFILE_OBJECT FileObject, + _Out_ PLARGE_INTEGER FileSize); +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI FsRtlIsTotalDeviceFailure( - IN NTSTATUS Status); + _In_ NTSTATUS Status); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFILE_LOCK NTAPI FsRtlAllocateFileLock( - IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, - IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL); + _In_opt_ PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine, + _In_opt_ PUNLOCK_ROUTINE UnlockRoutine); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlFreeFileLock( - IN PFILE_LOCK FileLock); + _In_ PFILE_LOCK FileLock); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlInitializeFileLock( - IN PFILE_LOCK FileLock, - IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, - IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL); + _Out_ PFILE_LOCK FileLock, + _In_opt_ PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine, + _In_opt_ PUNLOCK_ROUTINE UnlockRoutine); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlUninitializeFileLock( - IN PFILE_LOCK FileLock); + _Inout_ PFILE_LOCK FileLock); /* FsRtlProcessFileLock: @@ -146,13 +167,15 @@ FsRtlUninitializeFileLock( -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines. -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock. */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlProcessFileLock( - IN PFILE_LOCK FileLock, - IN PIRP Irp, - IN PVOID Context OPTIONAL); + _In_ PFILE_LOCK FileLock, + _In_ PIRP Irp, + _In_opt_ PVOID Context); /* FsRtlCheckLockForReadAccess: @@ -161,12 +184,14 @@ FsRtlProcessFileLock( location?), get IoGetRequestorProcess, and pass values on to FsRtlFastCheckLockForRead. */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCheckLockForReadAccess( - IN PFILE_LOCK FileLock, - IN PIRP Irp); + _In_ PFILE_LOCK FileLock, + _In_ PIRP Irp); /* FsRtlCheckLockForWriteAccess: @@ -175,34 +200,40 @@ FsRtlCheckLockForReadAccess( location?), get IoGetRequestorProcess, and pass values on to FsRtlFastCheckLockForWrite. */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCheckLockForWriteAccess( - IN PFILE_LOCK FileLock, - IN PIRP Irp); + _In_ PFILE_LOCK FileLock, + _In_ PIRP Irp); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlFastCheckLockForRead( - IN PFILE_LOCK FileLock, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key, - IN PFILE_OBJECT FileObject, - IN PVOID Process); + _In_ PFILE_LOCK FileLock, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key, + _In_ PFILE_OBJECT FileObject, + _In_ PVOID Process); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlFastCheckLockForWrite( - IN PFILE_LOCK FileLock, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key, - IN PFILE_OBJECT FileObject, - IN PVOID Process); + _In_ PFILE_LOCK FileLock, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key, + _In_ PFILE_OBJECT FileObject, + _In_ PVOID Process); /* FsRtlGetNextFileLock: @@ -216,44 +247,49 @@ FsRtlFastCheckLockForWrite( list, and FsRtlGetNextFileLock needs this to get next lock on subsequent calls with Restart = FALSE. */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFILE_LOCK_INFO NTAPI FsRtlGetNextFileLock( - IN PFILE_LOCK FileLock, - IN BOOLEAN Restart); + _In_ PFILE_LOCK FileLock, + _In_ BOOLEAN Restart); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlFastUnlockSingle( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN PEPROCESS Process, - IN ULONG Key, - IN PVOID Context OPTIONAL, - IN BOOLEAN AlreadySynchronized); + _In_ PFILE_LOCK FileLock, + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ PEPROCESS Process, + _In_ ULONG Key, + _In_opt_ PVOID Context, + _In_ BOOLEAN AlreadySynchronized); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlFastUnlockAll( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PEPROCESS Process, - IN PVOID Context OPTIONAL); + _In_ PFILE_LOCK FileLock, + _In_ PFILE_OBJECT FileObject, + _In_ PEPROCESS Process, + _In_opt_ PVOID Context); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlFastUnlockAllByKey( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PEPROCESS Process, - IN ULONG Key, - IN PVOID Context OPTIONAL); + _In_ PFILE_LOCK FileLock, + _In_ PFILE_OBJECT FileObject, + _In_ PEPROCESS Process, + _In_ ULONG Key, + _In_opt_ PVOID Context); /* FsRtlPrivateLock: @@ -264,536 +300,622 @@ FsRtlFastUnlockAllByKey( -Calls IoCompleteRequest if Irp -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) +__drv_preferredFunction(FsRtlFastLock, "Obsolete") NTKERNELAPI BOOLEAN NTAPI FsRtlPrivateLock( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN PEPROCESS Process, - IN ULONG Key, - IN BOOLEAN FailImmediately, - IN BOOLEAN ExclusiveLock, - OUT PIO_STATUS_BLOCK IoStatus, - IN PIRP Irp OPTIONAL, - IN PVOID Context, - IN BOOLEAN AlreadySynchronized); + _In_ PFILE_LOCK FileLock, + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ PEPROCESS Process, + _In_ ULONG Key, + _In_ BOOLEAN FailImmediately, + _In_ BOOLEAN ExclusiveLock, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_opt_ PIRP Irp, + _In_opt_ __drv_aliasesMem PVOID Context, + _In_ BOOLEAN AlreadySynchronized); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlInitializeTunnelCache( - IN PTUNNEL Cache); + _In_ PTUNNEL Cache); +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ PTUNNEL Cache, + _In_ ULONGLONG DirectoryKey, + _In_ PUNICODE_STRING ShortName, + _In_ PUNICODE_STRING LongName, + _In_ BOOLEAN KeyByShortName, + _In_ ULONG DataLength, + _In_reads_bytes_(DataLength) PVOID Data); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ PTUNNEL Cache, + _In_ ULONGLONG DirectoryKey, + _In_ PUNICODE_STRING Name, + _Out_ PUNICODE_STRING ShortName, + _Out_ PUNICODE_STRING LongName, + _Inout_ PULONG DataLength, + _Out_writes_bytes_to_(*DataLength, *DataLength) PVOID Data); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlDeleteKeyFromTunnelCache( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey); + _In_ PTUNNEL Cache, + _In_ ULONGLONG DirectoryKey); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlDeleteTunnelCache( - IN PTUNNEL Cache); + _In_ PTUNNEL Cache); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlDissectDbcs( - IN ANSI_STRING Name, - OUT PANSI_STRING FirstPart, - OUT PANSI_STRING RemainingPart); + _In_ ANSI_STRING Name, + _Out_ PANSI_STRING FirstPart, + _Out_ PANSI_STRING RemainingPart); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlDoesDbcsContainWildCards( - IN PANSI_STRING Name); + _In_ PANSI_STRING Name); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsDbcsInExpression( - IN PANSI_STRING Expression, - IN PANSI_STRING Name); + _In_ PANSI_STRING Expression, + _In_ PANSI_STRING Name); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsFatDbcsLegal( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible); + _In_ ANSI_STRING DbcsName, + _In_ BOOLEAN WildCardsPermissible, + _In_ BOOLEAN PathNamePermissible, + _In_ BOOLEAN LeadingBackslashPermissible); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsHpfsDbcsLegal( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible); + _In_ ANSI_STRING DbcsName, + _In_ BOOLEAN WildCardsPermissible, + _In_ BOOLEAN PathNamePermissible, + _In_ BOOLEAN LeadingBackslashPermissible); NTKERNELAPI NTSTATUS NTAPI FsRtlNormalizeNtstatus( - IN NTSTATUS Exception, - IN NTSTATUS GenericException); + _In_ NTSTATUS Exception, + _In_ NTSTATUS GenericException); +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI FsRtlIsNtstatusExpected( - IN NTSTATUS Ntstatus); + _In_ NTSTATUS Ntstatus); +_IRQL_requires_max_(APC_LEVEL) +__drv_preferredFunction(ExAllocateFromNPagedLookasideList, "The FsRtlAllocateResource routine is obsolete, but is exported to support existing driver binaries. Use ExAllocateFromNPagedLookasideList and ExInitializeResourceLite instead.") NTKERNELAPI PERESOURCE NTAPI -FsRtlAllocateResource( - VOID); +FsRtlAllocateResource(VOID); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlInitializeLargeMcb( - IN PLARGE_MCB Mcb, - IN POOL_TYPE PoolType); + _Out_ PLARGE_MCB Mcb, + _In_ POOL_TYPE PoolType); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlUninitializeLargeMcb( - IN PLARGE_MCB Mcb); + _Inout_ PLARGE_MCB Mcb); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlResetLargeMcb( - IN PLARGE_MCB Mcb, - IN BOOLEAN SelfSynchronized); + _Inout_ PLARGE_MCB Mcb, + _In_ BOOLEAN SelfSynchronized); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlTruncateLargeMcb( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn); + _Inout_ PLARGE_MCB Mcb, + _In_ LONGLONG Vbn); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlAddLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); + _Inout_ PLARGE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG Lbn, + _In_ LONGLONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlRemoveLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount); + _Inout_ PLARGE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ PLARGE_MCB Mcb, + _In_ LONGLONG Vbn, + _Out_opt_ PLONGLONG Lbn, + _Out_opt_ PLONGLONG SectorCountFromLbn, + _Out_opt_ PLONGLONG StartingLbn, + _Out_opt_ PLONGLONG SectorCountFromStartingLbn, + _Out_opt_ PULONG Index); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupLastLargeMcbEntry( - IN PLARGE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn); + _In_ PLARGE_MCB Mcb, + _Out_ PLONGLONG Vbn, + _Out_ PLONGLONG Lbn); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupLastLargeMcbEntryAndIndex( - IN PLARGE_MCB OpaqueMcb, - OUT PLONGLONG LargeVbn, - OUT PLONGLONG LargeLbn, - OUT PULONG Index); + _In_ PLARGE_MCB OpaqueMcb, + _Out_ PLONGLONG LargeVbn, + _Out_ PLONGLONG LargeLbn, + _Out_ PULONG Index); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI ULONG NTAPI FsRtlNumberOfRunsInLargeMcb( - IN PLARGE_MCB Mcb); + _In_ PLARGE_MCB Mcb); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlGetNextLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount); + _In_ PLARGE_MCB Mcb, + _In_ ULONG RunIndex, + _Out_ PLONGLONG Vbn, + _Out_ PLONGLONG Lbn, + _Out_ PLONGLONG SectorCount); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlSplitLargeMcb( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount); + _Inout_ PLARGE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG Amount); +_IRQL_requires_max_(APC_LEVEL) +__drv_preferredFunction(FsRtlInitializeLargeMcb, "Obsolete") NTKERNELAPI VOID NTAPI FsRtlInitializeMcb( - IN PMCB Mcb, - IN POOL_TYPE PoolType); + _Out_ PMCB Mcb, + _In_ POOL_TYPE PoolType); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlUninitializeMcb( - IN PMCB Mcb); + _Inout_ PMCB Mcb); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlTruncateMcb( - IN PMCB Mcb, - IN VBN Vbn); + _Inout_ PMCB Mcb, + _In_ VBN Vbn); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlAddMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - IN LBN Lbn, - IN ULONG SectorCount); + _Inout_ PMCB Mcb, + _In_ VBN Vbn, + _In_ LBN Lbn, + _In_ ULONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlRemoveMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - IN ULONG SectorCount); + _Inout_ PMCB Mcb, + _In_ VBN Vbn, + _In_ ULONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount OPTIONAL, - OUT PULONG Index); + _In_ PMCB Mcb, + _In_ VBN Vbn, + _Out_ PLBN Lbn, + _Out_opt_ PULONG SectorCount, + _Out_ PULONG Index); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupLastMcbEntry( - IN PMCB Mcb, - OUT PVBN Vbn, - OUT PLBN Lbn); + _In_ PMCB Mcb, + _Out_ PVBN Vbn, + _Out_ PLBN Lbn); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI ULONG NTAPI FsRtlNumberOfRunsInMcb( - IN PMCB Mcb); + _In_ PMCB Mcb); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlGetNextMcbEntry( - IN PMCB Mcb, - IN ULONG RunIndex, - OUT PVBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount); + _In_ PMCB Mcb, + _In_ ULONG RunIndex, + _Out_ PVBN Vbn, + _Out_ PLBN Lbn, + _Out_ PULONG SectorCount); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlBalanceReads( - IN PDEVICE_OBJECT TargetDevice); + _In_ PDEVICE_OBJECT TargetDevice); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlInitializeOplock( - IN OUT POPLOCK Oplock); + _Inout_ POPLOCK Oplock); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlUninitializeOplock( - IN OUT POPLOCK Oplock); + _Inout_ POPLOCK Oplock); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlOplockFsctrl( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount); + _In_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_ ULONG OpenCount); +_When_(CompletionRoutine != NULL, _Must_inspect_result_) +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_opt_ PVOID Context, + _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, + _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlOplockIsFastIoPossible( - IN POPLOCK Oplock); + _In_ POPLOCK Oplock); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCurrentBatchOplock( - IN POPLOCK Oplock); + _In_ POPLOCK Oplock); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlNotifyVolumeEvent( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode); + _In_ PFILE_OBJECT FileObject, + _In_ ULONG EventCode); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlNotifyInitializeSync( - IN PNOTIFY_SYNC *NotifySync); + _In_ PNOTIFY_SYNC *NotifySync); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlNotifyUninitializeSync( - IN PNOTIFY_SYNC *NotifySync); + _In_ PNOTIFY_SYNC *NotifySync); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList, + _In_ PVOID FsContext, + _In_ PSTRING FullDirectoryName, + _In_ BOOLEAN WatchTree, + _In_ BOOLEAN IgnoreBuffer, + _In_ ULONG CompletionFilter, + _In_opt_ PIRP NotifyIrp, + _In_opt_ PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback, + _In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectContext); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList, + _In_ PSTRING FullTargetName, + _In_ USHORT TargetNameOffset, + _In_opt_ PSTRING StreamName, + _In_opt_ PSTRING NormalizedParentName, + _In_ ULONG FilterMatch, + _In_ ULONG Action, + _In_opt_ PVOID TargetContext, + _In_opt_ PVOID FilterContext); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList, + _In_ PSTRING FullTargetName, + _In_ USHORT TargetNameOffset, + _In_opt_ PSTRING StreamName, + _In_opt_ PSTRING NormalizedParentName, + _In_ ULONG FilterMatch, + _In_ ULONG Action, + _In_opt_ PVOID TargetContext); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlNotifyCleanup( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList, + _In_ PVOID FsContext); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI FsRtlDissectName( - IN UNICODE_STRING Name, - OUT PUNICODE_STRING FirstPart, - OUT PUNICODE_STRING RemainingPart); + _In_ UNICODE_STRING Name, + _Out_ PUNICODE_STRING FirstPart, + _Out_ PUNICODE_STRING RemainingPart); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlDoesNameContainWildCards( - IN PUNICODE_STRING Name); + _In_ PUNICODE_STRING Name); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlAreNamesEqual( - IN PCUNICODE_STRING Name1, - IN PCUNICODE_STRING Name2, - IN BOOLEAN IgnoreCase, - IN PCWCH UpcaseTable OPTIONAL); + _In_ PCUNICODE_STRING Name1, + _In_ PCUNICODE_STRING Name2, + _In_ BOOLEAN IgnoreCase, + _In_reads_opt_(0x10000) PCWCH UpcaseTable); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsNameInExpression( - IN PUNICODE_STRING Expression, - IN PUNICODE_STRING Name, - IN BOOLEAN IgnoreCase, - IN PWCHAR UpcaseTable OPTIONAL); + _In_ PUNICODE_STRING Expression, + _In_ PUNICODE_STRING Name, + _In_ BOOLEAN IgnoreCase, + _In_opt_ PWCHAR UpcaseTable); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI FsRtlPostPagingFileStackOverflow( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); + _In_ PVOID Context, + _In_ PKEVENT Event, + _In_ PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI FsRtlPostStackOverflow ( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); + _In_ PVOID Context, + _In_ PKEVENT Event, + _In_ PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlRegisterUncProvider( - OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirectorDeviceName, - IN BOOLEAN MailslotsSupported); + _Out_ PHANDLE MupHandle, + _In_ PUNICODE_STRING RedirectorDeviceName, + _In_ BOOLEAN MailslotsSupported); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI FsRtlDeregisterUncProvider( - IN HANDLE Handle); + _In_ HANDLE Handle); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlTeardownPerStreamContexts( - IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); + _In_ PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _Out_ PHANDLE SectionHandle, + _Outptr_ PVOID *SectionObject, + _Out_opt_ PLARGE_INTEGER SectionFileSize, + _In_ PFILE_OBJECT FileObject, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PLARGE_INTEGER MaximumSize, + _In_ ULONG SectionPageProtection, + _In_ ULONG AllocationAttributes, + _In_ ULONG Flags); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList, + _In_ PVOID FsContext, + _In_ PSTRING FullDirectoryName, + _In_ BOOLEAN WatchTree, + _In_ BOOLEAN IgnoreBuffer, + _In_ ULONG CompletionFilter, + _In_opt_ PIRP NotifyIrp, + _In_opt_ PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback, + _In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectContext, + _In_opt_ PFILTER_REPORT_CHANGE FilterCallback); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlInsertPerStreamContext( - IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, - IN PFSRTL_PER_STREAM_CONTEXT Ptr); + _In_ PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, + _In_ PFSRTL_PER_STREAM_CONTEXT Ptr); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_STREAM_CONTEXT NTAPI FsRtlLookupPerStreamContextInternal( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PFSRTL_ADVANCED_FCB_HEADER StreamContext, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_STREAM_CONTEXT NTAPI FsRtlRemovePerStreamContext( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PFSRTL_ADVANCED_FCB_HEADER StreamContext, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); NTKERNELAPI VOID @@ -804,548 +926,639 @@ FsRtlIncrementCcFastReadNotPossible( NTKERNELAPI VOID NTAPI -FsRtlIncrementCcFastReadWait( - VOID); +FsRtlIncrementCcFastReadWait(VOID); NTKERNELAPI VOID NTAPI -FsRtlIncrementCcFastReadNoWait( - VOID); +FsRtlIncrementCcFastReadNoWait(VOID); NTKERNELAPI VOID NTAPI -FsRtlIncrementCcFastReadResourceMiss( - VOID); +FsRtlIncrementCcFastReadResourceMiss(VOID); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI LOGICAL NTAPI FsRtlIsPagingFile( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_WS03) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlInitializeBaseMcb( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType); + _Out_ PBASE_MCB Mcb, + _In_ POOL_TYPE PoolType); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlUninitializeBaseMcb( - IN PBASE_MCB Mcb); + _In_ PBASE_MCB Mcb); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlResetBaseMcb( - IN PBASE_MCB Mcb); + _Out_ PBASE_MCB Mcb); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlTruncateBaseMcb( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn); + _Inout_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlAddBaseMcbEntry( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); + _Inout_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG Lbn, + _In_ LONGLONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlRemoveBaseMcbEntry( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount); + _Inout_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn, + _Out_opt_ PLONGLONG Lbn, + _Out_opt_ PLONGLONG SectorCountFromLbn, + _Out_opt_ PLONGLONG StartingLbn, + _Out_opt_ PLONGLONG SectorCountFromStartingLbn, + _Out_opt_ PULONG Index); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupLastBaseMcbEntry( - IN PBASE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn); + _In_ PBASE_MCB Mcb, + _Out_ PLONGLONG Vbn, + _Out_ PLONGLONG Lbn); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupLastBaseMcbEntryAndIndex( - IN PBASE_MCB OpaqueMcb, - IN OUT PLONGLONG LargeVbn, - IN OUT PLONGLONG LargeLbn, - IN OUT PULONG Index); + _In_ PBASE_MCB OpaqueMcb, + _Inout_ PLONGLONG LargeVbn, + _Inout_ PLONGLONG LargeLbn, + _Inout_ PULONG Index); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI ULONG NTAPI FsRtlNumberOfRunsInBaseMcb( - IN PBASE_MCB Mcb); + _In_ PBASE_MCB Mcb); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlGetNextBaseMcbEntry( - IN PBASE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount); + _In_ PBASE_MCB Mcb, + _In_ ULONG RunIndex, + _Out_ PLONGLONG Vbn, + _Out_ PLONGLONG Lbn, + _Out_ PLONGLONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlSplitBaseMcb( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount); + _Inout_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG Amount); #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ #if (NTDDI_VERSION >= NTDDI_VISTA) +_When_(!Flags & MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE, _Must_inspect_result_) +_IRQL_requires_max_(APC_LEVEL) BOOLEAN NTAPI FsRtlInitializeBaseMcbEx( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType, - IN USHORT Flags); + _Out_ PBASE_MCB Mcb, + _In_ POOL_TYPE PoolType, + _In_ USHORT Flags); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTSTATUS NTAPI FsRtlAddBaseMcbEntryEx( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); + _Inout_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG Lbn, + _In_ LONGLONG SectorCount); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCurrentOplock( - IN POPLOCK Oplock); + _In_ POPLOCK Oplock); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _Inout_ POPLOCK Oplock, + _In_opt_ PIO_STACK_LOCATION IrpSp, + _In_ PIRP Irp, + _In_opt_ PVOID Context, + _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, + _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlNotifyVolumeEventEx( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode, - IN PTARGET_DEVICE_CUSTOM_NOTIFICATION Event); + _In_ PFILE_OBJECT FileObject, + _In_ ULONG EventCode, + _In_ PTARGET_DEVICE_CUSTOM_NOTIFICATION Event); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlNotifyCleanupAll( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI FsRtlRegisterUncProviderEx( - OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirDevName, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG Flags); + _Out_ PHANDLE MupHandle, + _In_ PUNICODE_STRING RedirDevName, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG Flags); +_Must_inspect_result_ +_When_(Irp!=NULL, _IRQL_requires_max_(PASSIVE_LEVEL)) +_When_(Irp==NULL, _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI NTSTATUS NTAPI FsRtlCancellableWaitForSingleObject( - IN PVOID Object, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PIRP Irp OPTIONAL); + _In_ PVOID Object, + _In_opt_ PLARGE_INTEGER Timeout, + _In_opt_ PIRP Irp); +_Must_inspect_result_ +_When_(Irp != NULL, _IRQL_requires_max_(PASSIVE_LEVEL)) +_When_(Irp == NULL, _IRQL_requires_max_(APC_LEVEL)) 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); + _In_ ULONG Count, + _In_reads_(Count) PVOID ObjectArray[], + _In_ WAIT_TYPE WaitType, + _In_opt_ PLARGE_INTEGER Timeout, + _In_opt_ PKWAIT_BLOCK WaitBlockArray, + _In_opt_ PIRP Irp); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlMupGetProviderInfoFromFileObject( - IN PFILE_OBJECT pFileObject, - IN ULONG Level, - OUT PVOID pBuffer, - IN OUT PULONG pBufferSize); + _In_ PFILE_OBJECT pFileObject, + _In_ ULONG Level, + _Out_writes_bytes_(*pBufferSize) PVOID pBuffer, + _Inout_ PULONG pBufferSize); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlMupGetProviderIdFromName( - IN PUNICODE_STRING pProviderName, - OUT PULONG32 pProviderId); + _In_ PUNICODE_STRING pProviderName, + _Out_ PULONG32 pProviderId); NTKERNELAPI VOID NTAPI -FsRtlIncrementCcFastMdlReadWait( - VOID); +FsRtlIncrementCcFastMdlReadWait(VOID); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlValidateReparsePointBuffer( - IN ULONG BufferLength, - IN PREPARSE_DATA_BUFFER ReparseBuffer); + _In_ ULONG BufferLength, + _In_reads_bytes_(BufferLength) PREPARSE_DATA_BUFFER ReparseBuffer); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlRemoveDotsFromPath( - IN OUT PWSTR OriginalString, - IN USHORT PathLength, - OUT USHORT *NewLength); + _Inout_updates_bytes_(PathLength) PWSTR OriginalString, + _In_ USHORT PathLength, + _Out_ USHORT *NewLength); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlAllocateExtraCreateParameterList( - IN FSRTL_ALLOCATE_ECPLIST_FLAGS Flags, - OUT PECP_LIST *EcpList); + _In_ FSRTL_ALLOCATE_ECPLIST_FLAGS Flags, + _Outptr_ PECP_LIST *EcpList); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlFreeExtraCreateParameterList( - IN PECP_LIST EcpList); + _In_ PECP_LIST EcpList); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ LPCGUID EcpType, + _In_ ULONG SizeOfContext, + _In_ FSRTL_ALLOCATE_ECP_FLAGS Flags, + _In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback, + _In_ ULONG PoolTag, + _Outptr_result_bytebuffer_(SizeOfContext) PVOID *EcpContext); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlFreeExtraCreateParameter( - IN PVOID EcpContext); + _In_ PVOID EcpContext); +_When_(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(!(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL), _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI VOID NTAPI FsRtlInitExtraCreateParameterLookasideList( - IN OUT PVOID Lookaside, - IN FSRTL_ECP_LOOKASIDE_FLAGS Flags, - IN SIZE_T Size, - IN ULONG Tag); + _Inout_ PVOID Lookaside, + _In_ FSRTL_ECP_LOOKASIDE_FLAGS Flags, + _In_ SIZE_T Size, + _In_ ULONG Tag); +_When_(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(!(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL), _IRQL_requires_max_(APC_LEVEL)) VOID NTAPI FsRtlDeleteExtraCreateParameterLookasideList( - IN OUT PVOID Lookaside, - IN FSRTL_ECP_LOOKASIDE_FLAGS Flags); + _Inout_ PVOID Lookaside, + _In_ FSRTL_ECP_LOOKASIDE_FLAGS Flags); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ LPCGUID EcpType, + ULONG SizeOfContext, + _In_ FSRTL_ALLOCATE_ECP_FLAGS Flags, + _In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback, + _Inout_ PVOID LookasideList, + _Outptr_ PVOID *EcpContext); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlInsertExtraCreateParameter( - IN OUT PECP_LIST EcpList, - IN OUT PVOID EcpContext); + _Inout_ PECP_LIST EcpList, + _Inout_ PVOID EcpContext); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlFindExtraCreateParameter( - IN PECP_LIST EcpList, - IN LPCGUID EcpType, - OUT PVOID *EcpContext OPTIONAL, - OUT ULONG *EcpContextSize OPTIONAL); + _In_ PECP_LIST EcpList, + _In_ LPCGUID EcpType, + _Outptr_opt_ PVOID *EcpContext, + _Out_opt_ ULONG *EcpContextSize); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlRemoveExtraCreateParameter( - IN OUT PECP_LIST EcpList, - IN LPCGUID EcpType, - OUT PVOID *EcpContext, - OUT ULONG *EcpContextSize OPTIONAL); + _Inout_ PECP_LIST EcpList, + _In_ LPCGUID EcpType, + _Outptr_ PVOID *EcpContext, + _Out_opt_ ULONG *EcpContextSize); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlGetEcpListFromIrp( - IN PIRP Irp, - OUT PECP_LIST *EcpList OPTIONAL); + _In_ PIRP Irp, + _Outptr_result_maybenull_ PECP_LIST *EcpList); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlSetEcpListIntoIrp( - IN OUT PIRP Irp, - IN PECP_LIST EcpList); + _Inout_ PIRP Irp, + _In_ PECP_LIST EcpList); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlGetNextExtraCreateParameter( - IN PECP_LIST EcpList, - IN PVOID CurrentEcpContext OPTIONAL, - OUT LPGUID NextEcpType OPTIONAL, - OUT PVOID *NextEcpContext OPTIONAL, - OUT ULONG *NextEcpContextSize OPTIONAL); + _In_ PECP_LIST EcpList, + _In_opt_ PVOID CurrentEcpContext, + _Out_opt_ LPGUID NextEcpType, + _Outptr_opt_ PVOID *NextEcpContext, + _Out_opt_ ULONG *NextEcpContextSize); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlAcknowledgeEcp( - IN PVOID EcpContext); + _In_ PVOID EcpContext); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsEcpAcknowledged( - IN PVOID EcpContext); + _In_ PVOID EcpContext); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsEcpFromUserMode( - IN PVOID EcpContext); + _In_ PVOID EcpContext); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlChangeBackingFileObject( - IN PFILE_OBJECT CurrentFileObject OPTIONAL, - IN PFILE_OBJECT NewFileObject, - IN FSRTL_CHANGE_BACKING_TYPE ChangeBackingType, - IN ULONG Flags); + _In_opt_ PFILE_OBJECT CurrentFileObject, + _In_ PFILE_OBJECT NewFileObject, + _In_ FSRTL_CHANGE_BACKING_TYPE ChangeBackingType, + _In_ ULONG Flags); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlLogCcFlushError( - IN PUNICODE_STRING FileName, - IN PDEVICE_OBJECT DeviceObject, - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN NTSTATUS FlushError, - IN ULONG Flags); + _In_ PUNICODE_STRING FileName, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_ NTSTATUS FlushError, + _In_ ULONG Flags); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI -FsRtlAreVolumeStartupApplicationsComplete( - VOID); +FsRtlAreVolumeStartupApplicationsComplete(VOID); NTKERNELAPI ULONG NTAPI -FsRtlQueryMaximumVirtualDiskNestingLevel( - VOID); +FsRtlQueryMaximumVirtualDiskNestingLevel(VOID); NTKERNELAPI NTSTATUS NTAPI FsRtlGetVirtualDiskNestingLevel( - IN PDEVICE_OBJECT DeviceObject, - OUT PULONG NestingLevel, - OUT PULONG NestingFlags OPTIONAL); + _In_ PDEVICE_OBJECT DeviceObject, + _Out_ PULONG NestingLevel, + _Out_opt_ PULONG NestingFlags); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #if (NTDDI_VERSION >= NTDDI_VISTASP1) +_When_(Flags | OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK, _Must_inspect_result_) +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_ ULONG Flags, + _In_opt_ PVOID Context, + _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, + _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine); #endif #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlAreThereCurrentOrInProgressFileLocks( - IN PFILE_LOCK FileLock); + _In_ PFILE_LOCK FileLock); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlOplockIsSharedRequest( - IN PIRP Irp); + _In_ PIRP Irp); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_ ULONG Flags, + _In_opt_ PVOID Context, + _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, + _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCurrentOplockH( - IN POPLOCK Oplock); + _In_ POPLOCK Oplock); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _Inout_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_ ULONG Flags, + _In_opt_ PVOID Context, + _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, + _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlOplockFsctrlEx( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount, - IN ULONG Flags); + _In_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_ ULONG OpenCount, + _In_ ULONG Flags); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlOplockKeysEqual( - IN PFILE_OBJECT Fo1 OPTIONAL, - IN PFILE_OBJECT Fo2 OPTIONAL); + _In_opt_ PFILE_OBJECT Fo1, + _In_opt_ PFILE_OBJECT Fo2); NTKERNELAPI NTSTATUS NTAPI FsRtlInitializeExtraCreateParameterList( - IN OUT PECP_LIST EcpList); + _Inout_ 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); + _Out_ PECP_HEADER Ecp, + _In_ ULONG EcpFlags, + _In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback, + _In_ ULONG TotalSize, + _In_ LPCGUID EcpType, + _In_opt_ PVOID ListAllocatedFrom); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlInsertPerFileContext( - IN PVOID* PerFileContextPointer, - IN PFSRTL_PER_FILE_CONTEXT Ptr); + _In_ PVOID* PerFileContextPointer, + _In_ PFSRTL_PER_FILE_CONTEXT Ptr); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_FILE_CONTEXT NTAPI FsRtlLookupPerFileContext( - IN PVOID* PerFileContextPointer, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PVOID* PerFileContextPointer, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_FILE_CONTEXT NTAPI FsRtlRemovePerFileContext( - IN PVOID* PerFileContextPointer, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PVOID* PerFileContextPointer, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlTeardownPerFileContexts( - IN PVOID* PerFileContextPointer); + _In_ PVOID* PerFileContextPointer); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlInsertPerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr); + _In_ PFILE_OBJECT FileObject, + _In_ PFSRTL_PER_FILEOBJECT_CONTEXT Ptr); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_FILEOBJECT_CONTEXT NTAPI FsRtlLookupPerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PFILE_OBJECT FileObject, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_FILEOBJECT_CONTEXT NTAPI FsRtlRemovePerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PFILE_OBJECT FileObject, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); #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) \ @@ -1463,12 +1676,13 @@ extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray; FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \ NULL) +_IRQL_requires_max_(APC_LEVEL) FORCEINLINE VOID NTAPI FsRtlSetupAdvancedHeader( - IN PVOID AdvHdr, - IN PFAST_MUTEX FMutex ) + _In_ PVOID AdvHdr, + _In_ PFAST_MUTEX FMutex ) { PFSRTL_ADVANCED_FCB_HEADER localAdvHdr = (PFSRTL_ADVANCED_FCB_HEADER)AdvHdr; diff --git a/reactos/include/xdk/fsrtltypes.h b/reactos/include/xdk/fsrtltypes.h index 1075be3f7b0..b8e8fe9f02d 100644 --- a/reactos/include/xdk/fsrtltypes.h +++ b/reactos/include/xdk/fsrtltypes.h @@ -102,9 +102,9 @@ typedef enum _FSRTL_COMPARISON_RESULT { #define FSRTL_VOLUME_BACKGROUND_FORMAT 14 typedef VOID -(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( - IN PVOID Context, - IN PKEVENT Event); +(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE)( + _In_ PVOID Context, + _In_ PKEVENT Event); #if (NTDDI_VERSION >= NTDDI_VISTA) @@ -112,12 +112,12 @@ typedef VOID #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_ECPLIST_FLAG_CHARGE_QUOTA 0x00000001 -#define FSRTL_ALLOCATE_ECP_FLAG_CHARGE_QUOTA 0x00000001 -#define FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL 0x00000002 +#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_ECP_LOOKASIDE_FLAG_NONPAGED_POOL 0x00000002 #define FSRTL_VIRTDISK_FULLY_ALLOCATED 0x00000001 #define FSRTL_VIRTDISK_NO_DRIVE_LETTER 0x00000002 @@ -133,8 +133,8 @@ typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_2 { typedef VOID (*PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK) ( - IN OUT PVOID EcpContext, - IN LPCGUID EcpType); + _Inout_ PVOID EcpContext, + _In_ LPCGUID EcpType); typedef struct _ECP_LIST ECP_LIST, *PECP_LIST; @@ -167,7 +167,7 @@ typedef struct _FSRTL_PER_STREAM_CONTEXT { #if (NTDDI_VERSION >= NTDDI_WIN2K) typedef VOID (*PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS) ( - IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); + _In_ PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); #endif typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT { @@ -181,8 +181,8 @@ typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT { typedef NTSTATUS (NTAPI *PCOMPLETE_LOCK_IRP_ROUTINE) ( - IN PVOID Context, - IN PIRP Irp); + _In_ PVOID Context, + _In_ PIRP Irp); typedef struct _FILE_LOCK_INFO { LARGE_INTEGER StartingByte; @@ -196,8 +196,8 @@ typedef struct _FILE_LOCK_INFO { typedef VOID (NTAPI *PUNLOCK_ROUTINE) ( - IN PVOID Context, - IN PFILE_LOCK_INFO FileLockInfo); + _In_ PVOID Context, + _In_ PFILE_LOCK_INFO FileLockInfo); typedef struct _FILE_LOCK { PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine; @@ -251,13 +251,13 @@ typedef PVOID OPLOCK, *POPLOCK; typedef VOID (NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) ( - IN PVOID Context, - IN PIRP Irp); + _In_ PVOID Context, + _In_ PIRP Irp); typedef VOID (NTAPI *POPLOCK_FS_PREPOST_IRP) ( - IN PVOID Context, - IN PIRP Irp); + _In_ PVOID Context, + _In_ PIRP Irp); #if (NTDDI_VERSION >= NTDDI_VISTASP1) #define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED 0x00000001 @@ -289,12 +289,12 @@ typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER; typedef BOOLEAN (NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( - IN PVOID NotifyContext, - IN PVOID TargetContext OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + _In_ PVOID NotifyContext, + _In_opt_ PVOID TargetContext, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext); typedef BOOLEAN (NTAPI *PFILTER_REPORT_CHANGE) ( - IN PVOID NotifyContext, - IN PVOID FilterContext); + _In_ PVOID NotifyContext, + _In_ PVOID FilterContext); $endif (_NTIFS_) diff --git a/reactos/include/xdk/halfuncs.h b/reactos/include/xdk/halfuncs.h index d257b7407e9..70431aa619c 100644 --- a/reactos/include/xdk/halfuncs.h +++ b/reactos/include/xdk/halfuncs.h @@ -5,14 +5,15 @@ #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) $if (_WDMDDK_) +__drv_preferredFunction("AllocateCommonBuffer","Obsolete") FORCEINLINE PVOID NTAPI HalAllocateCommonBuffer( - IN PDMA_ADAPTER DmaAdapter, - IN ULONG Length, - OUT PPHYSICAL_ADDRESS LogicalAddress, - IN BOOLEAN CacheEnabled) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ ULONG Length, + _Out_ PPHYSICAL_ADDRESS LogicalAddress, + _In_ BOOLEAN CacheEnabled) { PALLOCATE_COMMON_BUFFER allocateCommonBuffer; PVOID commonBuffer; @@ -23,15 +24,16 @@ HalAllocateCommonBuffer( return commonBuffer; } +__drv_preferredFunction("FreeCommonBuffer","Obsolete") FORCEINLINE VOID NTAPI HalFreeCommonBuffer( - IN PDMA_ADAPTER DmaAdapter, - IN ULONG Length, - IN PHYSICAL_ADDRESS LogicalAddress, - IN PVOID VirtualAddress, - IN BOOLEAN CacheEnabled) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ ULONG Length, + _In_ PHYSICAL_ADDRESS LogicalAddress, + _In_ PVOID VirtualAddress, + _In_ BOOLEAN CacheEnabled) { PFREE_COMMON_BUFFER freeCommonBuffer; @@ -40,11 +42,12 @@ HalFreeCommonBuffer( freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled ); } +__drv_preferredFunction("ReadDmaCounter","Obsolete") FORCEINLINE ULONG NTAPI HalReadDmaCounter( - IN PDMA_ADAPTER DmaAdapter) + _In_ PDMA_ADAPTER DmaAdapter) { PREAD_DMA_COUNTER readDmaCounter; ULONG counter; @@ -58,7 +61,7 @@ HalReadDmaCounter( FORCEINLINE ULONG HalGetDmaAlignment( - IN PDMA_ADAPTER DmaAdapter) + _In_ PDMA_ADAPTER DmaAdapter) { PGET_DMA_ALIGNMENT getDmaAlignment; ULONG alignment; @@ -80,65 +83,65 @@ NTHALAPI VOID NTAPI IoFreeAdapterChannel( - IN PADAPTER_OBJECT AdapterObject); + _In_ PADAPTER_OBJECT AdapterObject); //DECLSPEC_DEPRECATED_DDK NTHALAPI BOOLEAN NTAPI IoFlushAdapterBuffers( - IN PADAPTER_OBJECT AdapterObject, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN ULONG Length, - IN BOOLEAN WriteToDevice); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _In_ ULONG Length, + _In_ BOOLEAN WriteToDevice); //DECLSPEC_DEPRECATED_DDK NTHALAPI VOID NTAPI IoFreeMapRegisters( - IN PADAPTER_OBJECT AdapterObject, - IN PVOID MapRegisterBase, - IN ULONG NumberOfMapRegisters); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ PVOID MapRegisterBase, + _In_ ULONG NumberOfMapRegisters); //DECLSPEC_DEPRECATED_DDK NTHALAPI PVOID NTAPI HalAllocateCommonBuffer( - IN PADAPTER_OBJECT AdapterObject, - IN ULONG Length, - OUT PPHYSICAL_ADDRESS LogicalAddress, - IN BOOLEAN CacheEnabled); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ ULONG Length, + _Out_ PPHYSICAL_ADDRESS LogicalAddress, + _In_ BOOLEAN CacheEnabled); //DECLSPEC_DEPRECATED_DDK NTHALAPI VOID NTAPI HalFreeCommonBuffer( - IN PADAPTER_OBJECT AdapterObject, - IN ULONG Length, - IN PHYSICAL_ADDRESS LogicalAddress, - IN PVOID VirtualAddress, - IN BOOLEAN CacheEnabled); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ ULONG Length, + _In_ PHYSICAL_ADDRESS LogicalAddress, + _In_ PVOID VirtualAddress, + _In_ BOOLEAN CacheEnabled); //DECLSPEC_DEPRECATED_DDK NTHALAPI ULONG NTAPI HalReadDmaCounter( - IN PADAPTER_OBJECT AdapterObject); + _In_ PADAPTER_OBJECT AdapterObject); NTHALAPI NTSTATUS NTAPI HalAllocateAdapterChannel( - IN PADAPTER_OBJECT AdapterObject, - IN PWAIT_CONTEXT_BLOCK Wcb, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ PWAIT_CONTEXT_BLOCK Wcb, + _In_ ULONG NumberOfMapRegisters, + _In_ PDRIVER_CONTROL ExecutionRoutine); $endif (_NTDDK_) #endif /* USE_DMA_MACROS ... */ @@ -149,142 +152,145 @@ 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); + _In_ PUNICODE_STRING RegistryPath, + _In_opt_ PUNICODE_STRING DriverClassName, + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ INTERFACE_TYPE BusType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _Inout_ PCM_RESOURCE_LIST *AllocatedResources); +_IRQL_requires_max_(PASSIVE_LEVEL) NTHALAPI ULONG NTAPI HalGetInterruptVector( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN ULONG BusInterruptLevel, - IN ULONG BusInterruptVector, - OUT PKIRQL Irql, - OUT PKAFFINITY Affinity); + _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); + _In_ BUS_DATA_TYPE BusDataType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _In_reads_bytes_(Length) 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); + _In_ BUS_DATA_TYPE BusDataType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); NTHALAPI BOOLEAN NTAPI HalMakeBeep( - IN ULONG Frequency); + _In_ ULONG Frequency); #endif /* !defined(NO_LEGACY_DRIVERS) */ +_IRQL_requires_max_(PASSIVE_LEVEL) NTHALAPI PADAPTER_OBJECT NTAPI HalGetAdapter( - IN PDEVICE_DESCRIPTION DeviceDescription, - OUT PULONG NumberOfMapRegisters); + _In_ PDEVICE_DESCRIPTION DeviceDescription, + _Out_ PULONG NumberOfMapRegisters); VOID NTAPI HalPutDmaAdapter( - IN PADAPTER_OBJECT DmaAdapter); + _In_ PADAPTER_OBJECT DmaAdapter); NTHALAPI VOID NTAPI HalAcquireDisplayOwnership( - IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); + _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); + _In_ BUS_DATA_TYPE BusDataType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _Out_writes_bytes_(Length) 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); + _In_ BUS_DATA_TYPE BusDataType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _In_reads_bytes_(Length) 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); + _In_ INTERFACE_TYPE InterfaceType, + _In_ ULONG BusNumber, + _In_ PHYSICAL_ADDRESS BusAddress, + _Inout_ PULONG AddressSpace, + _Out_ PPHYSICAL_ADDRESS TranslatedAddress); NTHALAPI PVOID NTAPI HalAllocateCrashDumpRegisters( - IN PADAPTER_OBJECT AdapterObject, - IN OUT PULONG NumberOfMapRegisters); + _In_ PADAPTER_OBJECT AdapterObject, + _Inout_ 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); + _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); + _In_ PADAPTER_OBJECT DmaAdapter, + _In_ PSCATTER_GATHER_LIST ScatterGather, + _In_ BOOLEAN WriteToDevice); $endif (_NTDDK_) #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ $if (_NTDDK_) #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID FASTCALL HalExamineMBR( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG MBRTypeIdentifier, - OUT PVOID *Buffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG MBRTypeIdentifier, + _Out_ PVOID *Buffer); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_WIN7) @@ -292,15 +298,15 @@ HalExamineMBR( NTSTATUS NTAPI HalAllocateHardwareCounters( - IN PGROUP_AFFINITY GroupAffinty, - IN ULONG GroupCount, - IN PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList, - OUT PHANDLE CounterSetHandle); + _In_reads_(GroupCount) PGROUP_AFFINITY GroupAffinty, + _In_ ULONG GroupCount, + _In_ PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList, + _Out_ PHANDLE CounterSetHandle); NTSTATUS NTAPI HalFreeHardwareCounters( - IN HANDLE CounterSetHandle); + _In_ HANDLE CounterSetHandle); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -326,8 +332,8 @@ NTHALAPI VOID NTAPI HalBugCheckSystem( - IN PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource, - IN PWHEA_ERROR_RECORD ErrorRecord); + _In_ PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource, + _In_ PWHEA_ERROR_RECORD ErrorRecord); #else @@ -337,7 +343,7 @@ NTHALAPI VOID NTAPI HalBugCheckSystem( - IN PWHEA_ERROR_RECORD ErrorRecord); + _In_ PWHEA_ERROR_RECORD ErrorRecord); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ diff --git a/reactos/include/xdk/haltypes.h b/reactos/include/xdk/haltypes.h index 2084fac7f7f..941daef32be 100644 --- a/reactos/include/xdk/haltypes.h +++ b/reactos/include/xdk/haltypes.h @@ -3,17 +3,17 @@ $if (_NTDDK_) typedef BOOLEAN (NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)( - IN ULONG Columns, - IN ULONG Rows); + _In_ ULONG Columns, + _In_ ULONG Rows); typedef PBUS_HANDLER (FASTCALL *pHalHandlerForBus)( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber); + _In_ INTERFACE_TYPE InterfaceType, + _In_ ULONG BusNumber); typedef VOID (FASTCALL *pHalReferenceBusHandler)( - IN PBUS_HANDLER BusHandler); + _In_ PBUS_HANDLER BusHandler); typedef enum _HAL_QUERY_INFORMATION_CLASS { HalInstalledBusInformation, @@ -63,56 +63,55 @@ typedef enum _HAL_SET_INFORMATION_CLASS { typedef NTSTATUS (NTAPI *pHalQuerySystemInformation)( - IN HAL_QUERY_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN OUT PVOID Buffer, - OUT PULONG ReturnedLength); + _In_ HAL_QUERY_INFORMATION_CLASS InformationClass, + _In_ ULONG BufferSize, + _Inout_updates_bytes_to_(BufferSize, *ReturnedLength) PVOID Buffer, + _Out_ PULONG ReturnedLength); typedef NTSTATUS (NTAPI *pHalSetSystemInformation)( - IN HAL_SET_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN PVOID Buffer); + _In_ HAL_SET_INFORMATION_CLASS InformationClass, + _In_ ULONG BufferSize, + _In_ PVOID Buffer); typedef VOID (FASTCALL *pHalExamineMBR)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG MBRTypeIdentifier, - OUT PVOID *Buffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG MBRTypeIdentifier, + _Out_ PVOID *Buffer); typedef NTSTATUS (FASTCALL *pHalIoReadPartitionTable)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ BOOLEAN ReturnRecognizedPartitions, + _Out_ struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); typedef NTSTATUS (FASTCALL *pHalIoSetPartitionInformation)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG PartitionNumber, + _In_ ULONG PartitionType); typedef NTSTATUS (FASTCALL *pHalIoWritePartitionTable)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG SectorsPerTrack, + _In_ ULONG NumberOfHeads, + _In_ struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); typedef NTSTATUS (NTAPI *pHalQueryBusSlots)( - IN PBUS_HANDLER BusHandler, - IN ULONG BufferSize, - OUT PULONG SlotNumbers, - OUT PULONG ReturnedLength); + _In_ PBUS_HANDLER BusHandler, + _In_ ULONG BufferSize, + _Out_ PULONG SlotNumbers, + _Out_ PULONG ReturnedLength); typedef NTSTATUS -(NTAPI *pHalInitPnpDriver)( - VOID); +(NTAPI *pHalInitPnpDriver)(VOID); typedef struct _PM_DISPATCH_TABLE { ULONG Signature; @@ -122,69 +121,66 @@ typedef struct _PM_DISPATCH_TABLE { typedef NTSTATUS (NTAPI *pHalInitPowerManagement)( - IN PPM_DISPATCH_TABLE PmDriverDispatchTable, - OUT PPM_DISPATCH_TABLE *PmHalDispatchTable); + _In_ PPM_DISPATCH_TABLE PmDriverDispatchTable, + _Out_ PPM_DISPATCH_TABLE *PmHalDispatchTable); typedef struct _DMA_ADAPTER* (NTAPI *pHalGetDmaAdapter)( - IN PVOID Context, - IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, - OUT PULONG NumberOfMapRegisters); + _In_ PVOID Context, + _In_ struct _DEVICE_DESCRIPTION *DeviceDescriptor, + _Out_ PULONG NumberOfMapRegisters); typedef NTSTATUS (NTAPI *pHalGetInterruptTranslator)( - IN INTERFACE_TYPE ParentInterfaceType, - IN ULONG ParentBusNumber, - IN INTERFACE_TYPE BridgeInterfaceType, - IN USHORT Size, - IN USHORT Version, - OUT PTRANSLATOR_INTERFACE Translator, - OUT PULONG BridgeBusNumber); + _In_ INTERFACE_TYPE ParentInterfaceType, + _In_ ULONG ParentBusNumber, + _In_ INTERFACE_TYPE BridgeInterfaceType, + _In_ USHORT Size, + _In_ USHORT Version, + _Out_ PTRANSLATOR_INTERFACE Translator, + _Out_ PULONG BridgeBusNumber); typedef NTSTATUS -(NTAPI *pHalStartMirroring)( - VOID); +(NTAPI *pHalStartMirroring)(VOID); typedef NTSTATUS (NTAPI *pHalEndMirroring)( - IN ULONG PassNumber); + _In_ ULONG PassNumber); typedef NTSTATUS (NTAPI *pHalMirrorPhysicalMemory)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN LARGE_INTEGER NumberOfBytes); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ LARGE_INTEGER NumberOfBytes); typedef NTSTATUS (NTAPI *pHalMirrorVerify)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN LARGE_INTEGER NumberOfBytes); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ LARGE_INTEGER NumberOfBytes); typedef BOOLEAN (NTAPI *pHalTranslateBusAddress)( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); + _In_ INTERFACE_TYPE InterfaceType, + _In_ ULONG BusNumber, + _In_ PHYSICAL_ADDRESS BusAddress, + _Inout_ PULONG AddressSpace, + _Out_ PPHYSICAL_ADDRESS TranslatedAddress); typedef NTSTATUS (NTAPI *pHalAssignSlotResources)( - IN PUNICODE_STRING RegistryPath, - IN PUNICODE_STRING DriverClassName OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT DeviceObject, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN OUT PCM_RESOURCE_LIST *AllocatedResources); + _In_ PUNICODE_STRING RegistryPath, + _In_opt_ PUNICODE_STRING DriverClassName, + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ INTERFACE_TYPE BusType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _Inout_ PCM_RESOURCE_LIST *AllocatedResources); typedef VOID -(NTAPI *pHalHaltSystem)( - VOID); +(NTAPI *pHalHaltSystem)(VOID); typedef BOOLEAN -(NTAPI *pHalResetDisplay)( - VOID); +(NTAPI *pHalResetDisplay)(VOID); typedef struct _MAP_REGISTER_ENTRY { PVOID MapRegister; @@ -197,49 +193,47 @@ typedef UCHAR typedef BOOLEAN (NTAPI *pHalFindBusAddressTranslation)( - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress, - IN OUT PULONG_PTR Context, - IN BOOLEAN NextBus); + _In_ PHYSICAL_ADDRESS BusAddress, + _Inout_ PULONG AddressSpace, + _Out_ PPHYSICAL_ADDRESS TranslatedAddress, + _Inout_ PULONG_PTR Context, + _In_ BOOLEAN NextBus); typedef VOID -(NTAPI *pHalEndOfBoot)( - VOID); +(NTAPI *pHalEndOfBoot)(VOID); typedef PVOID (NTAPI *pHalGetAcpiTable)( - IN ULONG Signature, - IN PCSTR OemId OPTIONAL, - IN PCSTR OemTableId OPTIONAL); + _In_ ULONG Signature, + _In_opt_ PCSTR OemId, + _In_opt_ PCSTR OemTableId); #if defined(_IA64_) typedef NTSTATUS (*pHalGetErrorCapList)( - IN OUT PULONG CapsListLength, - IN OUT PUCHAR ErrorCapList); + _Inout_ PULONG CapsListLength, + _Inout_updates_bytes_(*CapsListLength) PUCHAR ErrorCapList); typedef NTSTATUS (*pHalInjectError)( - IN ULONG BufferLength, - IN PUCHAR Buffer); + _In_ ULONG BufferLength, + _In_reads_bytes_(BufferLength) PUCHAR Buffer); #endif typedef VOID -(NTAPI *PCI_ERROR_HANDLER_CALLBACK)( - VOID); +(NTAPI *PCI_ERROR_HANDLER_CALLBACK)(VOID); typedef VOID (NTAPI *pHalSetPciErrorHandlerCallback)( - IN PCI_ERROR_HANDLER_CALLBACK Callback); + _In_ PCI_ERROR_HANDLER_CALLBACK Callback); #if 1 /* Not present in WDK 7600 */ typedef VOID (FASTCALL *pHalIoAssignDriveLetters)( - IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN PSTRING NtDeviceName, - OUT PUCHAR NtSystemPath, - OUT PSTRING NtSystemPathString); + _In_ struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + _In_ PSTRING NtDeviceName, + _Out_ PUCHAR NtSystemPath, + _Out_ PSTRING NtSystemPathString); #endif typedef struct { @@ -367,10 +361,10 @@ typedef struct _HAL_PROCESSOR_FEATURE { typedef NTSTATUS (NTAPI *PHALIOREADWRITEHANDLER)( - IN BOOLEAN fRead, - IN ULONG dwAddr, - IN ULONG dwSize, - IN OUT PULONG pdwData); + _In_ BOOLEAN fRead, + _In_ ULONG dwAddr, + _In_ ULONG dwSize, + _Inout_ PULONG pdwData); typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST { ULONG BadAddrBegin; @@ -382,17 +376,15 @@ typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST { #if defined(_X86_) || defined(_IA64_) || defined(_AMD64_) typedef VOID -(NTAPI *PHALMCAINTERFACELOCK)( - VOID); +(NTAPI *PHALMCAINTERFACELOCK)(VOID); typedef VOID -(NTAPI *PHALMCAINTERFACEUNLOCK)( - VOID); +(NTAPI *PHALMCAINTERFACEUNLOCK)(VOID); typedef NTSTATUS (NTAPI *PHALMCAINTERFACEREADREGISTER)( - IN UCHAR BankNumber, - IN OUT PVOID Exception); + _In_ UCHAR BankNumber, + _Inout_ PVOID Exception); typedef struct _HAL_MCA_INTERFACE { PHALMCAINTERFACELOCK Lock; @@ -414,10 +406,10 @@ 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); + _In_ PVOID Context, + _In_ struct _KTRAP_FRAME *TrapFrame, + _In_ struct _KEXCEPTION_FRAME *ExceptionFrame, + _In_ PMCA_EXCEPTION Exception); #endif @@ -429,8 +421,8 @@ ERROR_SEVERITY VOID #endif (NTAPI *PDRIVER_EXCPTN_CALLBACK)( - IN PVOID Context, - IN PMCA_EXCEPTION BankLog); + _In_ PVOID Context, + _In_ PMCA_EXCEPTION BankLog); #endif typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK; @@ -485,13 +477,13 @@ typedef struct _HAL_ERROR_INFO { typedef VOID (NTAPI *PDRIVER_CMC_EXCEPTION_CALLBACK)( - IN PVOID Context, - IN PCMC_EXCEPTION CmcLog); + _In_ PVOID Context, + _In_ PCMC_EXCEPTION CmcLog); typedef VOID (NTAPI *PDRIVER_CPE_EXCEPTION_CALLBACK)( - IN PVOID Context, - IN PCPE_EXCEPTION CmcLog); + _In_ PVOID Context, + _In_ PCPE_EXCEPTION CmcLog); typedef struct _CMC_DRIVER_INFO { PDRIVER_CMC_EXCEPTION_CALLBACK ExceptionCallback; @@ -511,20 +503,20 @@ typedef struct _CPE_DRIVER_INFO { typedef NTSTATUS (*HALSENDCROSSPARTITIONIPI)( - IN USHORT ProcessorID, - IN UCHAR HardwareVector); + _In_ USHORT ProcessorID, + _In_ UCHAR HardwareVector); typedef NTSTATUS (*HALRESERVECROSSPARTITIONINTERRUPTVECTOR)( - OUT PULONG Vector, - OUT PKIRQL Irql, - IN OUT PGROUP_AFFINITY Affinity, - OUT PUCHAR HardwareVector); + _Out_ PULONG Vector, + _Out_ PKIRQL Irql, + _Inout_ PGROUP_AFFINITY Affinity, + _Out_ PUCHAR HardwareVector); typedef VOID (*HALFREECROSSPARTITIONINTERRUPTVECTOR)( - IN ULONG Vector, - IN PGROUP_AFFINITY Affinity); + _In_ ULONG Vector, + _In_ PGROUP_AFFINITY Affinity); typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE { HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi; diff --git a/reactos/include/xdk/interlocked.h b/reactos/include/xdk/interlocked.h index 722096bf18e..2360c64fd4d 100644 --- a/reactos/include/xdk/interlocked.h +++ b/reactos/include/xdk/interlocked.h @@ -9,8 +9,8 @@ static __inline__ BOOLEAN InterlockedBitTestAndSet( - IN LONG volatile *Base, - IN LONG Bit) + _Inout_updates_bytes_((Bit+7)/8) _Interlocked_operand_ LONG volatile *Base, + _In_ LONG Bit) { #if defined(_M_IX86) LONG OldBit; @@ -28,8 +28,8 @@ InterlockedBitTestAndSet( static __inline__ BOOLEAN InterlockedBitTestAndReset( - IN LONG volatile *Base, - IN LONG Bit) + _Inout_updates_bytes_((Bit+7)/8) _Interlocked_operand_ LONG volatile *Base, + _In_ LONG Bit) { #if defined(_M_IX86) LONG OldBit; @@ -74,35 +74,35 @@ NTKERNELAPI LONG FASTCALL InterlockedIncrement( - IN OUT LONG volatile *Addend); + _Inout_ _Interlocked_operand_ LONG volatile *Addend); NTKERNELAPI LONG FASTCALL InterlockedDecrement( - IN OUT LONG volatile *Addend); + _Inout_ _Interlocked_operand_ LONG volatile *Addend); NTKERNELAPI LONG FASTCALL InterlockedCompareExchange( - IN OUT LONG volatile *Destination, - IN LONG Exchange, - IN LONG Comparand); + _Inout_ _Interlocked_operand_ LONG volatile *Destination, + _In_ LONG Exchange, + _In_ LONG Comparand); NTKERNELAPI LONG FASTCALL InterlockedExchange( - IN OUT LONG volatile *Destination, - IN LONG Value); + _Inout_ _Interlocked_operand_ LONG volatile *Destination, + _In_ LONG Value); NTKERNELAPI LONG FASTCALL InterlockedExchangeAdd( - IN OUT LONG volatile *Addend, - IN LONG Value); + _Inout_ _Interlocked_operand_ LONG volatile *Addend, + _In_ LONG Value); #else /* !defined(NO_INTERLOCKED_INTRINSICS) */ @@ -180,8 +180,8 @@ InterlockedExchangeAdd( FORCEINLINE LONG64 InterlockedAdd64( - IN OUT LONG64 volatile *Addend, - IN LONG64 Value) + _Inout_ _Interlocked_operand_ LONG64 volatile *Addend, + _In_ LONG64 Value) { return InterlockedExchangeAdd64(Addend, Value) + Value; } diff --git a/reactos/include/xdk/iofuncs.h b/reactos/include/xdk/iofuncs.h index 9e2b35aa599..76a5d024fc3 100644 --- a/reactos/include/xdk/iofuncs.h +++ b/reactos/include/xdk/iofuncs.h @@ -453,14 +453,16 @@ WRITE_REGISTER_USHORT( #define DMA_MACROS_DEFINED +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) FORCEINLINE NTSTATUS IoAllocateAdapterChannel( - IN PDMA_ADAPTER DmaAdapter, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG NumberOfMapRegisters, + _In_ PDRIVER_CONTROL ExecutionRoutine, + _In_ PVOID Context) { PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel; AllocateAdapterChannel = @@ -470,19 +472,19 @@ IoAllocateAdapterChannel( DeviceObject, NumberOfMapRegisters, ExecutionRoutine, - Context ); + Context); } FORCEINLINE BOOLEAN NTAPI IoFlushAdapterBuffers( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN ULONG Length, - IN BOOLEAN WriteToDevice) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _In_ ULONG Length, + _In_ BOOLEAN WriteToDevice) { PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers; FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers; @@ -499,7 +501,7 @@ FORCEINLINE VOID NTAPI IoFreeAdapterChannel( - IN PDMA_ADAPTER DmaAdapter) + _In_ PDMA_ADAPTER DmaAdapter) { PFREE_ADAPTER_CHANNEL FreeAdapterChannel; FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel; @@ -511,9 +513,9 @@ FORCEINLINE VOID NTAPI IoFreeMapRegisters( - IN PDMA_ADAPTER DmaAdapter, - IN PVOID MapRegisterBase, - IN ULONG NumberOfMapRegisters) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PVOID MapRegisterBase, + _In_ ULONG NumberOfMapRegisters) { PFREE_MAP_REGISTERS FreeMapRegisters; FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters; @@ -525,12 +527,12 @@ FORCEINLINE PHYSICAL_ADDRESS NTAPI IoMapTransfer( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN OUT PULONG Length, - IN BOOLEAN WriteToDevice) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _Inout_ PULONG Length, + _In_ BOOLEAN WriteToDevice) { PMAP_TRANSFER MapTransfer; @@ -587,283 +589,346 @@ NTKERNELAPI NTSTATUS NTAPI IoRegisterFsRegistrationChangeEx( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); #endif $endif (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WIN2K) $if (_WDMDDK_) +_Acquires_lock_(_Global_cancel_spin_lock_) +_Requires_lock_not_held_(_Global_cancel_spin_lock_) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_raises_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoAcquireCancelSpinLock( - OUT PKIRQL Irql); + _Out_ _At_(*Irql, _IRQL_saves_) PKIRQL Irql); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoAcquireRemoveLockEx( - IN PIO_REMOVE_LOCK RemoveLock, - IN PVOID Tag OPTIONAL, - IN PCSTR File, - IN ULONG Line, - IN ULONG RemlockSize); + _Inout_ PIO_REMOVE_LOCK RemoveLock, + _In_opt_ PVOID Tag, + _In_ PCSTR File, + _In_ ULONG Line, + _In_ ULONG RemlockSize); + +_IRQL_requires_max_(DISPATCH_LEVEL) +_Ret_range_(<=, 0) NTKERNELAPI NTSTATUS NTAPI IoAllocateDriverObjectExtension( - IN PDRIVER_OBJECT DriverObject, - IN PVOID ClientIdentificationAddress, - IN ULONG DriverObjectExtensionSize, - OUT PVOID *DriverObjectExtension); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PVOID ClientIdentificationAddress, + _In_ ULONG DriverObjectExtensionSize, + _Post_ _At_(*DriverObjectExtension, _When_(return==0, + __drv_aliasesMem __drv_allocatesMem(Mem) _Post_notnull_)) + _When_(return == 0, _Outptr_result_bytebuffer_(DriverObjectExtensionSize)) + PVOID *DriverObjectExtension); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PVOID NTAPI IoAllocateErrorLogEntry( - IN PVOID IoObject, - IN UCHAR EntrySize); + _In_ PVOID IoObject, + _In_ UCHAR EntrySize); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PIRP NTAPI IoAllocateIrp( - IN CCHAR StackSize, - IN BOOLEAN ChargeQuota); + _In_ CCHAR StackSize, + _In_ BOOLEAN ChargeQuota); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PMDL NTAPI IoAllocateMdl( - IN PVOID VirtualAddress OPTIONAL, - IN ULONG Length, - IN BOOLEAN SecondaryBuffer, - IN BOOLEAN ChargeQuota, - IN OUT PIRP Irp OPTIONAL); + _In_opt_ __drv_aliasesMem PVOID VirtualAddress, + _In_ ULONG Length, + _In_ BOOLEAN SecondaryBuffer, + _In_ BOOLEAN ChargeQuota, + _Inout_opt_ PIRP Irp); +__drv_allocatesMem(Mem) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PIO_WORKITEM NTAPI IoAllocateWorkItem( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(APC_LEVEL) +_Ret_range_(<=, 0) NTKERNELAPI NTSTATUS NTAPI IoAttachDevice( - IN PDEVICE_OBJECT SourceDevice, - IN PUNICODE_STRING TargetDevice, - OUT PDEVICE_OBJECT *AttachedDevice); + _In_ _Kernel_requires_resource_held_(Memory) _When_(return==0, __drv_aliasesMem) + PDEVICE_OBJECT SourceDevice, + _In_ PUNICODE_STRING TargetDevice, + _Out_ PDEVICE_OBJECT *AttachedDevice); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack( - IN PDEVICE_OBJECT SourceDevice, - IN PDEVICE_OBJECT TargetDevice); + _In_ _Kernel_requires_resource_held_(Memory) _When_(return!=0, __drv_aliasesMem) + PDEVICE_OBJECT SourceDevice, + _In_ PDEVICE_OBJECT TargetDevice); +_Must_inspect_result_ +__drv_aliasesMem +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PIRP NTAPI IoBuildAsynchronousFsdRequest( - IN ULONG MajorFunction, - IN PDEVICE_OBJECT DeviceObject, - IN OUT PVOID Buffer OPTIONAL, - IN ULONG Length OPTIONAL, - IN PLARGE_INTEGER StartingOffset OPTIONAL, - IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL); + _In_ ULONG MajorFunction, + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_opt_ PVOID Buffer, + _In_opt_ ULONG Length, + _In_opt_ PLARGE_INTEGER StartingOffset, + _In_opt_ PIO_STATUS_BLOCK IoStatusBlock); +_Must_inspect_result_ +__drv_aliasesMem +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PIRP NTAPI IoBuildDeviceIoControlRequest( - IN ULONG IoControlCode, - IN PDEVICE_OBJECT DeviceObject, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength, - IN BOOLEAN InternalDeviceIoControl, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ ULONG IoControlCode, + _In_ PDEVICE_OBJECT DeviceObject, + _In_opt_ PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_opt_ PVOID OutputBuffer, + _In_ ULONG OutputBufferLength, + _In_ BOOLEAN InternalDeviceIoControl, + _In_ PKEVENT Event, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoBuildPartialMdl( - IN PMDL SourceMdl, - IN OUT PMDL TargetMdl, - IN PVOID VirtualAddress, - IN ULONG Length); + _In_ PMDL SourceMdl, + _Inout_ PMDL TargetMdl, + _In_ PVOID VirtualAddress, + _In_ ULONG Length); +_Must_inspect_result_ +__drv_aliasesMem +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PIRP NTAPI IoBuildSynchronousFsdRequest( - IN ULONG MajorFunction, - IN PDEVICE_OBJECT DeviceObject, - IN OUT PVOID Buffer OPTIONAL, - IN ULONG Length OPTIONAL, - IN PLARGE_INTEGER StartingOffset OPTIONAL, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ ULONG MajorFunction, + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_opt_ PVOID Buffer, + _In_opt_ ULONG Length, + _In_opt_ PLARGE_INTEGER StartingOffset, + _In_ PKEVENT Event, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Success_(TRUE) NTKERNELAPI NTSTATUS FASTCALL IofCallDriver( - IN PDEVICE_OBJECT DeviceObject, - IN OUT PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ __drv_aliasesMem PIRP Irp); #define IoCallDriver IofCallDriver +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL IofCompleteRequest( - IN PIRP Irp, - IN CCHAR PriorityBoost); + _In_ PIRP Irp, + _In_ CCHAR PriorityBoost); #define IoCompleteRequest IofCompleteRequest +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI IoCancelIrp( - IN PIRP Irp); + _In_ PIRP Irp); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoCheckShareAccess( - IN ACCESS_MASK DesiredAccess, - IN ULONG DesiredShareAccess, - IN OUT PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess, - IN BOOLEAN Update); + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG DesiredShareAccess, + _Inout_ PFILE_OBJECT FileObject, + _Inout_ PSHARE_ACCESS ShareAccess, + _In_ BOOLEAN Update); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL IofCompleteRequest( - IN PIRP Irp, - IN CCHAR PriorityBoost); + _In_ PIRP Irp, + _In_ CCHAR PriorityBoost); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoConnectInterrupt( - OUT PKINTERRUPT *InterruptObject, - IN PKSERVICE_ROUTINE ServiceRoutine, - IN PVOID ServiceContext OPTIONAL, - IN PKSPIN_LOCK SpinLock OPTIONAL, - IN ULONG Vector, - IN KIRQL Irql, - IN KIRQL SynchronizeIrql, - IN KINTERRUPT_MODE InterruptMode, - IN BOOLEAN ShareVector, - IN KAFFINITY ProcessorEnableMask, - IN BOOLEAN FloatingSave); + _Out_ PKINTERRUPT *InterruptObject, + _In_ PKSERVICE_ROUTINE ServiceRoutine, + _In_opt_ PVOID ServiceContext, + _In_opt_ PKSPIN_LOCK SpinLock, + _In_ ULONG Vector, + _In_ KIRQL Irql, + _In_ KIRQL SynchronizeIrql, + _In_ KINTERRUPT_MODE InterruptMode, + _In_ BOOLEAN ShareVector, + _In_ KAFFINITY ProcessorEnableMask, + _In_ BOOLEAN FloatingSave); +_IRQL_requires_max_(APC_LEVEL) +_Ret_range_(<=, 0) NTKERNELAPI NTSTATUS NTAPI IoCreateDevice( - IN PDRIVER_OBJECT DriverObject, - IN ULONG DeviceExtensionSize, - IN PUNICODE_STRING DeviceName OPTIONAL, - IN DEVICE_TYPE DeviceType, - IN ULONG DeviceCharacteristics, - IN BOOLEAN Exclusive, - OUT PDEVICE_OBJECT *DeviceObject); + _In_ PDRIVER_OBJECT DriverObject, + _In_ ULONG DeviceExtensionSize, + _In_opt_ PUNICODE_STRING DeviceName, + _In_ DEVICE_TYPE DeviceType, + _In_ ULONG DeviceCharacteristics, + _In_ BOOLEAN Exclusive, + _Outptr_result_nullonfailure_ + _At_(*DeviceObject, + __drv_allocatesMem(Mem) + _When_((((_In_function_class_(DRIVER_INITIALIZE)) + ||(_In_function_class_(DRIVER_DISPATCH)))), + __drv_aliasesMem)) + PDEVICE_OBJECT *DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoCreateFile( - 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); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG Disposition, + _In_ ULONG CreateOptions, + _In_opt_ PVOID EaBuffer, + _In_ ULONG EaLength, + _In_ CREATE_FILE_TYPE CreateFileType, + _In_opt_ PVOID InternalParameters, + _In_ ULONG Options); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PKEVENT NTAPI IoCreateNotificationEvent( - IN PUNICODE_STRING EventName, - OUT PHANDLE EventHandle); + _In_ PUNICODE_STRING EventName, + _Out_ PHANDLE EventHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoCreateSymbolicLink( - IN PUNICODE_STRING SymbolicLinkName, - IN PUNICODE_STRING DeviceName); + _In_ PUNICODE_STRING SymbolicLinkName, + _In_ PUNICODE_STRING DeviceName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PKEVENT NTAPI IoCreateSynchronizationEvent( - IN PUNICODE_STRING EventName, - OUT PHANDLE EventHandle); + _In_ PUNICODE_STRING EventName, + _Out_ PHANDLE EventHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoCreateUnprotectedSymbolicLink( - IN PUNICODE_STRING SymbolicLinkName, - IN PUNICODE_STRING DeviceName); + _In_ PUNICODE_STRING SymbolicLinkName, + _In_ PUNICODE_STRING DeviceName); +_IRQL_requires_max_(APC_LEVEL) +_Kernel_clear_do_init_(__yes) NTKERNELAPI VOID NTAPI IoDeleteDevice( - IN PDEVICE_OBJECT DeviceObject); + _In_ _Kernel_requires_resource_held_(Memory) __drv_freesMem(Mem) + PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoDeleteSymbolicLink( - IN PUNICODE_STRING SymbolicLinkName); + _In_ PUNICODE_STRING SymbolicLinkName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoDetachDevice( - IN OUT PDEVICE_OBJECT TargetDevice); + _Inout_ PDEVICE_OBJECT TargetDevice); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoDisconnectInterrupt( - IN PKINTERRUPT InterruptObject); + _In_ PKINTERRUPT InterruptObject); +__drv_freesMem(Mem) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoFreeIrp( - IN PIRP Irp); + _In_ PIRP Irp); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoFreeMdl( - IN PMDL Mdl); + PMDL Mdl); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoFreeWorkItem( - IN PIO_WORKITEM IoWorkItem); + _In_ __drv_freesMem(Mem) PIO_WORKITEM IoWorkItem); NTKERNELAPI PDEVICE_OBJECT @@ -871,75 +936,96 @@ NTAPI IoGetAttachedDevice( IN PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoGetBootDiskInformation( - IN OUT PBOOTDISK_INFORMATION BootDiskInformation, - IN ULONG Size); + _Inout_ PBOOTDISK_INFORMATION BootDiskInformation, + _In_ ULONG Size); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoGetDeviceInterfaceAlias( - IN PUNICODE_STRING SymbolicLinkName, - IN CONST GUID *AliasInterfaceClassGuid, - OUT PUNICODE_STRING AliasSymbolicLinkName); + _In_ PUNICODE_STRING SymbolicLinkName, + _In_ CONST GUID *AliasInterfaceClassGuid, + _Out_ + _When_(return==0, _At_(AliasSymbolicLinkName->Buffer, __drv_allocatesMem(Mem))) + PUNICODE_STRING AliasSymbolicLinkName); NTKERNELAPI PEPROCESS NTAPI IoGetCurrentProcess(VOID); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoGetDeviceInterfaces( - IN CONST GUID *InterfaceClassGuid, - IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, - IN ULONG Flags, - OUT PWSTR *SymbolicLinkList); + _In_ CONST GUID *InterfaceClassGuid, + _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ ULONG Flags, + _Outptr_result_nullonfailure_ + _At_(*SymbolicLinkList, _When_(return==0, __drv_allocatesMem(Mem))) + PZZWSTR *SymbolicLinkList); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoGetDeviceObjectPointer( - IN PUNICODE_STRING ObjectName, - IN ACCESS_MASK DesiredAccess, - OUT PFILE_OBJECT *FileObject, - OUT PDEVICE_OBJECT *DeviceObject); + _In_ PUNICODE_STRING ObjectName, + _In_ ACCESS_MASK DesiredAccess, + _Out_ PFILE_OBJECT *FileObject, + _Out_ PDEVICE_OBJECT *DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_((DeviceProperty & __string_type), + _At_(PropertyBuffer, _Post_z_)) +_When_((DeviceProperty & __multiString_type), + _At_(PropertyBuffer, _Post_ _NullNull_terminated_)) NTKERNELAPI NTSTATUS NTAPI IoGetDeviceProperty( - IN PDEVICE_OBJECT DeviceObject, - IN DEVICE_REGISTRY_PROPERTY DeviceProperty, - IN ULONG BufferLength, - OUT PVOID PropertyBuffer, - OUT PULONG ResultLength); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ DEVICE_REGISTRY_PROPERTY DeviceProperty, + _In_ ULONG BufferLength, + _Out_writes_bytes_opt_(BufferLength) PVOID PropertyBuffer, + _Deref_out_range_(<=, BufferLength) PULONG ResultLength); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PDMA_ADAPTER NTAPI IoGetDmaAdapter( - IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, - IN PDEVICE_DESCRIPTION DeviceDescription, - IN OUT PULONG NumberOfMapRegisters); + _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ PDEVICE_DESCRIPTION DeviceDescription, + _Out_ _When_(return!=0, _Kernel_IoGetDmaAdapter_ _At_(*NumberOfMapRegisters, _Must_inspect_result_)) + PULONG NumberOfMapRegisters); +__drv_aliasesMem +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PVOID NTAPI IoGetDriverObjectExtension( - IN PDRIVER_OBJECT DriverObject, - IN PVOID ClientIdentificationAddress); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PVOID ClientIdentificationAddress); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI @@ -949,311 +1035,365 @@ NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetRelatedDeviceObject( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoQueueWorkItem( - IN PIO_WORKITEM IoWorkItem, - IN PIO_WORKITEM_ROUTINE WorkerRoutine, - IN WORK_QUEUE_TYPE QueueType, - IN PVOID Context OPTIONAL); + _Inout_ PIO_WORKITEM IoWorkItem, + _In_ PIO_WORKITEM_ROUTINE WorkerRoutine, + _In_ WORK_QUEUE_TYPE QueueType, + _In_opt_ __drv_aliasesMem PVOID Context); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoInitializeIrp( - IN OUT PIRP Irp, - IN USHORT PacketSize, - IN CCHAR StackSize); + _Inout_ PIRP Irp, + _In_ USHORT PacketSize, + _In_ CCHAR StackSize); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoInitializeRemoveLockEx( - IN PIO_REMOVE_LOCK Lock, - IN ULONG AllocateTag, - IN ULONG MaxLockedMinutes, - IN ULONG HighWatermark, - IN ULONG RemlockSize); + _Out_ PIO_REMOVE_LOCK Lock, + _In_ ULONG AllocateTag, + _In_ ULONG MaxLockedMinutes, + _In_ ULONG HighWatermark, + _In_ ULONG RemlockSize); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoInitializeTimer( - IN PDEVICE_OBJECT DeviceObject, - IN PIO_TIMER_ROUTINE TimerRoutine, - IN PVOID Context OPTIONAL); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIO_TIMER_ROUTINE TimerRoutine, + _In_opt_ __drv_aliasesMem PVOID Context); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoInvalidateDeviceRelations( - IN PDEVICE_OBJECT DeviceObject, - IN DEVICE_RELATION_TYPE Type); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ DEVICE_RELATION_TYPE Type); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoInvalidateDeviceState( - IN PDEVICE_OBJECT PhysicalDeviceObject); + _In_ PDEVICE_OBJECT PhysicalDeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI IoIsWdmVersionAvailable( - IN UCHAR MajorVersion, - IN UCHAR MinorVersion); + _When_(MajorVersion!=1&&MajorVersion!=6, _In_ __drv_reportError("MajorVersion must be 1 or 6")) + UCHAR MajorVersion, + _In_ _When_(MinorVersion!=0 && MinorVersion!=5 && + MinorVersion!=16 && MinorVersion!=32 && + MinorVersion!=48, __drv_reportError("MinorVersion must be 0, 0x5, 0x10, 0x20, or 0x30")) + UCHAR MinorVersion); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoOpenDeviceInterfaceRegistryKey( - IN PUNICODE_STRING SymbolicLinkName, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE DeviceInterfaceKey); + _In_ PUNICODE_STRING SymbolicLinkName, + _In_ ACCESS_MASK DesiredAccess, + _Out_ PHANDLE DeviceInterfaceKey); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoOpenDeviceRegistryKey( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DevInstKeyType, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE DevInstRegKey); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG DevInstKeyType, + _In_ ACCESS_MASK DesiredAccess, + _Out_ PHANDLE DevInstRegKey); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoRegisterDeviceInterface( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN CONST GUID *InterfaceClassGuid, - IN PUNICODE_STRING ReferenceString OPTIONAL, - OUT PUNICODE_STRING SymbolicLinkName); + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ CONST GUID *InterfaceClassGuid, + _In_opt_ PUNICODE_STRING ReferenceString, + _Out_ _When_(return==0, _At_(SymbolicLinkName->Buffer, __drv_allocatesMem(Mem))) + PUNICODE_STRING SymbolicLinkName); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoRegisterPlugPlayNotification( - IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory, - IN ULONG EventCategoryFlags, - IN PVOID EventCategoryData OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, - IN OUT PVOID Context OPTIONAL, - OUT PVOID *NotificationEntry); + _In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory, + _In_ ULONG EventCategoryFlags, + _In_opt_ PVOID EventCategoryData, + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, + _Inout_opt_ __drv_aliasesMem PVOID Context, + _Outptr_result_nullonfailure_ + _At_(*NotificationEntry, _When_(return==0, __drv_allocatesMem(Mem))) + PVOID *NotificationEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoRegisterShutdownNotification( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_Requires_lock_held_(_Global_cancel_spin_lock_) +_Releases_lock_(_Global_cancel_spin_lock_) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoReleaseCancelSpinLock( - IN KIRQL Irql); + _In_ _IRQL_restores_ _IRQL_uses_cancel_ KIRQL Irql); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoReleaseRemoveLockAndWaitEx( - IN PIO_REMOVE_LOCK RemoveLock, - IN PVOID Tag OPTIONAL, - IN ULONG RemlockSize); + _Inout_ PIO_REMOVE_LOCK RemoveLock, + _In_opt_ PVOID Tag, + _In_ ULONG RemlockSize); NTKERNELAPI VOID NTAPI IoReleaseRemoveLockEx( - IN PIO_REMOVE_LOCK RemoveLock, - IN PVOID Tag OPTIONAL, - IN ULONG RemlockSize); + _Inout_ PIO_REMOVE_LOCK RemoveLock, + _In_opt_ PVOID Tag, + _In_ ULONG RemlockSize); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoRemoveShareAccess( - IN PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess); + _In_ PFILE_OBJECT FileObject, + _Inout_ PSHARE_ACCESS ShareAccess); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoReportTargetDeviceChange( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PVOID NotificationStructure); + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ PVOID NotificationStructure); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoReportTargetDeviceChangeAsynchronous( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PVOID NotificationStructure, - IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL, - IN PVOID Context OPTIONAL); + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ PVOID NotificationStructure, + _In_opt_ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback, + _In_opt_ PVOID Context); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoRequestDeviceEject( - IN PDEVICE_OBJECT PhysicalDeviceObject); + _In_ PDEVICE_OBJECT PhysicalDeviceObject); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoReuseIrp( - IN OUT PIRP Irp, - IN NTSTATUS Status); + _Inout_ PIRP Irp, + _In_ NTSTATUS Status); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoSetDeviceInterfaceState( - IN PUNICODE_STRING SymbolicLinkName, - IN BOOLEAN Enable); + _In_ PUNICODE_STRING SymbolicLinkName, + _In_ BOOLEAN Enable); NTKERNELAPI VOID NTAPI IoSetShareAccess( - IN ACCESS_MASK DesiredAccess, - IN ULONG DesiredShareAccess, - IN OUT PFILE_OBJECT FileObject, - OUT PSHARE_ACCESS ShareAccess); + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG DesiredShareAccess, + _Inout_ PFILE_OBJECT FileObject, + _Out_ PSHARE_ACCESS ShareAccess); +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoStartNextPacket( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN Cancelable); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoStartNextPacketByKey( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable, - IN ULONG Key); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN Cancelable, + _In_ ULONG Key); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoStartPacket( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PULONG Key OPTIONAL, - IN PDRIVER_CANCEL CancelFunction OPTIONAL); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_opt_ PULONG Key, + _In_opt_ PDRIVER_CANCEL CancelFunction); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoStartTimer( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoStopTimer( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) +__drv_freesMem(Pool) NTKERNELAPI NTSTATUS NTAPI IoUnregisterPlugPlayNotification( - IN PVOID NotificationEntry); + _In_ PVOID NotificationEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoUnregisterShutdownNotification( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoUpdateShareAccess( - IN PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess); + _In_ PFILE_OBJECT FileObject, + _Inout_ PSHARE_ACCESS ShareAccess); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoWMIAllocateInstanceIds( - IN GUID *Guid, - IN ULONG InstanceCount, - OUT ULONG *FirstInstanceId); + _In_ GUID *Guid, + _In_ ULONG InstanceCount, + _Out_ ULONG *FirstInstanceId); NTKERNELAPI NTSTATUS NTAPI IoWMIQuerySingleInstanceMultiple( - IN PVOID *DataBlockObjectList, - IN PUNICODE_STRING InstanceNames, - IN ULONG ObjectCount, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); + _In_reads_(ObjectCount) PVOID *DataBlockObjectList, + _In_reads_(ObjectCount) PUNICODE_STRING InstanceNames, + _In_ ULONG ObjectCount, + _Inout_ ULONG *InOutBufferSize, + _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoWMIRegistrationControl( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG Action); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG Action); NTKERNELAPI NTSTATUS NTAPI IoWMISuggestInstanceName( - IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, - IN PUNICODE_STRING SymbolicLinkName OPTIONAL, - IN BOOLEAN CombineNames, - OUT PUNICODE_STRING SuggestedInstanceName); + _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_opt_ PUNICODE_STRING SymbolicLinkName, + _In_ BOOLEAN CombineNames, + _Out_ PUNICODE_STRING SuggestedInstanceName); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Ret_range_(<=, 0) NTKERNELAPI NTSTATUS NTAPI IoWMIWriteEvent( - IN OUT PVOID WnodeEventItem); + _Inout_ _When_(return==0, __drv_aliasesMem) PVOID WnodeEventItem); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoWriteErrorLogEntry( - IN PVOID ElEntry); + _In_ PVOID ElEntry); NTKERNELAPI PIRP NTAPI IoGetTopLevelIrp(VOID); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoRegisterLastChanceShutdownNotification( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI VOID NTAPI IoSetTopLevelIrp( - IN PIRP Irp OPTIONAL); + _In_opt_ PIRP Irp); $endif (_WDMDDK_) $if (_NTDDK_) #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoAllocateAdapterChannel( - IN PADAPTER_OBJECT AdapterObject, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG NumberOfMapRegisters, + _In_ PDRIVER_CONTROL ExecutionRoutine, + _In_ PVOID Context); #endif #if !defined(DMA_MACROS_DEFINED) @@ -1262,185 +1402,203 @@ NTHALAPI PHYSICAL_ADDRESS NTAPI IoMapTransfer( - IN PADAPTER_OBJECT AdapterObject, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN OUT PULONG Length, - IN BOOLEAN WriteToDevice); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _Inout_ PULONG Length, + _In_ BOOLEAN WriteToDevice); #endif +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoAllocateController( - IN PCONTROLLER_OBJECT ControllerObject, - IN PDEVICE_OBJECT DeviceObject, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context OPTIONAL); + _In_ PCONTROLLER_OBJECT ControllerObject, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PDRIVER_CONTROL ExecutionRoutine, + _In_opt_ PVOID Context); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PCONTROLLER_OBJECT NTAPI IoCreateController( - IN ULONG Size); + _In_ ULONG Size); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoDeleteController( - IN PCONTROLLER_OBJECT ControllerObject); + _In_ PCONTROLLER_OBJECT ControllerObject); +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoFreeController( - IN PCONTROLLER_OBJECT ControllerObject); + _In_ PCONTROLLER_OBJECT ControllerObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetDeviceToVerify( - IN PETHREAD Thread); + _In_ PETHREAD Thread); NTKERNELAPI VOID NTAPI IoCancelFileOpen( - IN PDEVICE_OBJECT DeviceObject, - IN PFILE_OBJECT FileObject); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PFILE_OBJECT FileObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PGENERIC_MAPPING NTAPI IoGetFileObjectGenericMapping(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PIRP NTAPI IoMakeAssociatedIrp( - IN PIRP Irp, - IN CCHAR StackSize); + _In_ PIRP Irp, + _In_ CCHAR StackSize); NTKERNELAPI NTSTATUS NTAPI IoQueryDeviceDescription( - IN PINTERFACE_TYPE BusType OPTIONAL, - IN PULONG BusNumber OPTIONAL, - IN PCONFIGURATION_TYPE ControllerType OPTIONAL, - IN PULONG ControllerNumber OPTIONAL, - IN PCONFIGURATION_TYPE PeripheralType OPTIONAL, - IN PULONG PeripheralNumber OPTIONAL, - IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, - IN OUT PVOID Context OPTIONAL); + _In_opt_ PINTERFACE_TYPE BusType, + _In_opt_ PULONG BusNumber, + _In_opt_ PCONFIGURATION_TYPE ControllerType, + _In_opt_ PULONG ControllerNumber, + _In_opt_ PCONFIGURATION_TYPE PeripheralType, + _In_opt_ PULONG PeripheralNumber, + _In_ PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, + _Inout_opt_ PVOID Context); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI IoRaiseHardError( - IN PIRP Irp, - IN PVPB Vpb OPTIONAL, - IN PDEVICE_OBJECT RealDeviceObject); + _In_ PIRP Irp, + _In_opt_ PVPB Vpb, + _In_ PDEVICE_OBJECT RealDeviceObject); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI IoRaiseInformationalHardError( - IN NTSTATUS ErrorStatus, - IN PUNICODE_STRING String OPTIONAL, - IN PKTHREAD Thread OPTIONAL); + _In_ NTSTATUS ErrorStatus, + _In_opt_ PUNICODE_STRING String, + _In_opt_ PKTHREAD Thread); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoRegisterBootDriverReinitialization( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, - IN PVOID Context OPTIONAL); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_REINITIALIZE DriverReinitializationRoutine, + _In_opt_ PVOID Context); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoRegisterDriverReinitialization( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, - IN PVOID Context OPTIONAL); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_REINITIALIZE DriverReinitializationRoutine, + _In_opt_ PVOID Context); NTKERNELAPI NTSTATUS NTAPI IoAttachDeviceByPointer( - IN PDEVICE_OBJECT SourceDevice, - IN PDEVICE_OBJECT TargetDevice); + _In_ PDEVICE_OBJECT SourceDevice, + _In_ PDEVICE_OBJECT TargetDevice); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoReportDetectedDevice( - IN PDRIVER_OBJECT DriverObject, - IN INTERFACE_TYPE LegacyBusType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PCM_RESOURCE_LIST ResourceList OPTIONAL, - IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL, - IN BOOLEAN ResourceAssigned, - IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL); + _In_ PDRIVER_OBJECT DriverObject, + _In_ INTERFACE_TYPE LegacyBusType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _In_opt_ PCM_RESOURCE_LIST ResourceList, + _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements, + _In_ BOOLEAN ResourceAssigned, + _Inout_ PDEVICE_OBJECT *DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoReportResourceForDetection( - IN PDRIVER_OBJECT DriverObject, - IN PCM_RESOURCE_LIST DriverList OPTIONAL, - IN ULONG DriverListSize OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN PCM_RESOURCE_LIST DeviceList OPTIONAL, - IN ULONG DeviceListSize OPTIONAL, - OUT PBOOLEAN ConflictDetected); + _In_ PDRIVER_OBJECT DriverObject, + _In_reads_bytes_opt_(DriverListSize) PCM_RESOURCE_LIST DriverList, + _In_opt_ ULONG DriverListSize, + _In_opt_ PDEVICE_OBJECT DeviceObject, + _In_reads_bytes_opt_(DeviceListSize) PCM_RESOURCE_LIST DeviceList, + _In_opt_ ULONG DeviceListSize, + _Out_ PBOOLEAN ConflictDetected); NTKERNELAPI NTSTATUS NTAPI IoReportResourceUsage( - IN PUNICODE_STRING DriverClassName OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PCM_RESOURCE_LIST DriverList OPTIONAL, - IN ULONG DriverListSize OPTIONAL, - IN PDEVICE_OBJECT DeviceObject, - IN PCM_RESOURCE_LIST DeviceList OPTIONAL, - IN ULONG DeviceListSize OPTIONAL, - IN BOOLEAN OverrideConflict, - OUT PBOOLEAN ConflictDetected); + _In_opt_ PUNICODE_STRING DriverClassName, + _In_ PDRIVER_OBJECT DriverObject, + _In_reads_bytes_opt_(DriverListSize) PCM_RESOURCE_LIST DriverList, + _In_opt_ ULONG DriverListSize, + _In_opt_ PDEVICE_OBJECT DeviceObject, + _In_reads_bytes_opt_(DeviceListSize) PCM_RESOURCE_LIST DeviceList, + _In_opt_ ULONG DeviceListSize, + _In_ BOOLEAN OverrideConflict, + _Out_ PBOOLEAN ConflictDetected); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoSetHardErrorOrVerifyDevice( - IN PIRP Irp, - IN PDEVICE_OBJECT DeviceObject); + _In_ PIRP Irp, + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoAssignResources( - IN PUNICODE_STRING RegistryPath, - IN PUNICODE_STRING DriverClassName OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL, - IN OUT PCM_RESOURCE_LIST *AllocatedResources); + _In_ PUNICODE_STRING RegistryPath, + _In_opt_ PUNICODE_STRING DriverClassName, + _In_ PDRIVER_OBJECT DriverObject, + _In_opt_ PDEVICE_OBJECT DeviceObject, + _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources, + _Inout_ PCM_RESOURCE_LIST *AllocatedResources); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI IoSetThreadHardErrorMode( - IN BOOLEAN EnableHardErrors); + _In_ BOOLEAN EnableHardErrors); $endif (_NTDDK_) $if (_NTIFS_) @@ -1449,98 +1607,99 @@ NTKERNELAPI VOID NTAPI IoAcquireVpbSpinLock( - OUT PKIRQL Irql); + _Out_ PKIRQL Irql); NTKERNELAPI NTSTATUS NTAPI IoCheckDesiredAccess( - IN OUT PACCESS_MASK DesiredAccess, - IN ACCESS_MASK GrantedAccess); + _Inout_ PACCESS_MASK DesiredAccess, + _In_ ACCESS_MASK GrantedAccess); NTKERNELAPI NTSTATUS NTAPI IoCheckEaBufferValidity( - IN PFILE_FULL_EA_INFORMATION EaBuffer, - IN ULONG EaLength, - OUT PULONG ErrorOffset); + _In_ PFILE_FULL_EA_INFORMATION EaBuffer, + _In_ ULONG EaLength, + _Out_ PULONG ErrorOffset); NTKERNELAPI NTSTATUS NTAPI IoCheckFunctionAccess( - IN ACCESS_MASK GrantedAccess, - IN UCHAR MajorFunction, - IN UCHAR MinorFunction, - IN ULONG IoControlCode, - IN PVOID Argument1 OPTIONAL, - IN PVOID Argument2 OPTIONAL); + _In_ ACCESS_MASK GrantedAccess, + _In_ UCHAR MajorFunction, + _In_ UCHAR MinorFunction, + _In_ ULONG IoControlCode, + _In_opt_ PVOID Argument1, + _In_opt_ PVOID Argument2); NTKERNELAPI NTSTATUS NTAPI IoCheckQuerySetFileInformation( - IN FILE_INFORMATION_CLASS FileInformationClass, - IN ULONG Length, - IN BOOLEAN SetOperation); + _In_ FILE_INFORMATION_CLASS FileInformationClass, + _In_ ULONG Length, + _In_ BOOLEAN SetOperation); NTKERNELAPI NTSTATUS NTAPI IoCheckQuerySetVolumeInformation( - IN FS_INFORMATION_CLASS FsInformationClass, - IN ULONG Length, - IN BOOLEAN SetOperation); + _In_ FS_INFORMATION_CLASS FsInformationClass, + _In_ ULONG Length, + _In_ BOOLEAN SetOperation); NTKERNELAPI NTSTATUS NTAPI IoCheckQuotaBufferValidity( - IN PFILE_QUOTA_INFORMATION QuotaBuffer, - IN ULONG QuotaLength, - OUT PULONG ErrorOffset); + _In_ PFILE_QUOTA_INFORMATION QuotaBuffer, + _In_ ULONG QuotaLength, + _Out_ PULONG ErrorOffset); NTKERNELAPI PFILE_OBJECT NTAPI IoCreateStreamFileObject( - IN PFILE_OBJECT FileObject OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL); + _In_opt_ PFILE_OBJECT FileObject, + _In_opt_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI PFILE_OBJECT NTAPI IoCreateStreamFileObjectLite( - IN PFILE_OBJECT FileObject OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL); + _In_opt_ PFILE_OBJECT FileObject, + _In_opt_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI BOOLEAN NTAPI IoFastQueryNetworkAttributes( - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ACCESS_MASK DesiredAccess, - IN ULONG OpenOptions, - OUT PIO_STATUS_BLOCK IoStatus, - OUT PFILE_NETWORK_OPEN_INFORMATION Buffer); + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG OpenOptions, + _Out_ PIO_STATUS_BLOCK IoStatus, + _Out_ PFILE_NETWORK_OPEN_INFORMATION Buffer); NTKERNELAPI NTSTATUS NTAPI IoPageRead( - IN PFILE_OBJECT FileObject, - IN PMDL Mdl, - IN PLARGE_INTEGER Offset, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ PFILE_OBJECT FileObject, + _In_ PMDL Mdl, + _In_ PLARGE_INTEGER Offset, + _In_ PKEVENT Event, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetBaseFileSystemDeviceObject( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PCONFIGURATION_INFORMATION NTAPI @@ -1550,13 +1709,13 @@ NTKERNELAPI ULONG NTAPI IoGetRequestorProcessId( - IN PIRP Irp); + _In_ PIRP Irp); NTKERNELAPI PEPROCESS NTAPI IoGetRequestorProcess( - IN PIRP Irp); + _In_ PIRP Irp); NTKERNELAPI PIRP @@ -1567,130 +1726,130 @@ NTKERNELAPI BOOLEAN NTAPI IoIsOperationSynchronous( - IN PIRP Irp); + _In_ PIRP Irp); NTKERNELAPI BOOLEAN NTAPI IoIsSystemThread( - IN PETHREAD Thread); + _In_ PETHREAD Thread); NTKERNELAPI BOOLEAN NTAPI IoIsValidNameGraftingBuffer( - IN PIRP Irp, - IN PREPARSE_DATA_BUFFER ReparseBuffer); + _In_ PIRP Irp, + _In_ PREPARSE_DATA_BUFFER ReparseBuffer); NTKERNELAPI NTSTATUS NTAPI IoQueryFileInformation( - IN PFILE_OBJECT FileObject, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN ULONG Length, - OUT PVOID FileInformation, - OUT PULONG ReturnedLength); + _In_ PFILE_OBJECT FileObject, + _In_ FILE_INFORMATION_CLASS FileInformationClass, + _In_ ULONG Length, + _Out_ PVOID FileInformation, + _Out_ PULONG ReturnedLength); NTKERNELAPI NTSTATUS NTAPI IoQueryVolumeInformation( - IN PFILE_OBJECT FileObject, - IN FS_INFORMATION_CLASS FsInformationClass, - IN ULONG Length, - OUT PVOID FsInformation, - OUT PULONG ReturnedLength); + _In_ PFILE_OBJECT FileObject, + _In_ FS_INFORMATION_CLASS FsInformationClass, + _In_ ULONG Length, + _Out_ PVOID FsInformation, + _Out_ PULONG ReturnedLength); NTKERNELAPI VOID NTAPI IoQueueThreadIrp( - IN PIRP Irp); + _In_ PIRP Irp); NTKERNELAPI VOID NTAPI IoRegisterFileSystem( - IN PDEVICE_OBJECT DeviceObject); + _In_ __drv_aliasesMem PDEVICE_OBJECT DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoRegisterFsRegistrationChange( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); NTKERNELAPI VOID NTAPI IoReleaseVpbSpinLock( - IN KIRQL Irql); + _In_ KIRQL Irql); NTKERNELAPI VOID NTAPI IoSetDeviceToVerify( - IN PETHREAD Thread, - IN PDEVICE_OBJECT DeviceObject OPTIONAL); + _In_ PETHREAD Thread, + _In_opt_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoSetInformation( - IN PFILE_OBJECT FileObject, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN ULONG Length, - IN PVOID FileInformation); + _In_ PFILE_OBJECT FileObject, + _In_ FILE_INFORMATION_CLASS FileInformationClass, + _In_ ULONG Length, + _In_ PVOID FileInformation); NTKERNELAPI VOID NTAPI IoSetTopLevelIrp( - IN PIRP Irp OPTIONAL); + _In_opt_ PIRP Irp); NTKERNELAPI NTSTATUS NTAPI IoSynchronousPageWrite( - IN PFILE_OBJECT FileObject, - IN PMDL Mdl, - IN PLARGE_INTEGER FileOffset, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ PFILE_OBJECT FileObject, + _In_ PMDL Mdl, + _In_ PLARGE_INTEGER FileOffset, + _In_ PKEVENT Event, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); NTKERNELAPI PEPROCESS NTAPI IoThreadToProcess( - IN PETHREAD Thread); + _In_ PETHREAD Thread); NTKERNELAPI VOID NTAPI IoUnregisterFileSystem( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI VOID NTAPI IoUnregisterFsRegistrationChange( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); NTKERNELAPI NTSTATUS NTAPI IoVerifyVolume( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN AllowRawMount); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN AllowRawMount); NTKERNELAPI NTSTATUS NTAPI IoGetRequestorSessionId( - IN PIRP Irp, - OUT PULONG pSessionId); + _In_ PIRP Irp, + _Out_ PULONG pSessionId); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -1702,14 +1861,14 @@ NTKERNELAPI BOOLEAN NTAPI IoIsFileOriginRemote( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); NTKERNELAPI NTSTATUS NTAPI IoSetFileOrigin( - IN PFILE_OBJECT FileObject, - IN BOOLEAN Remote); + _In_ PFILE_OBJECT FileObject, + _In_ BOOLEAN Remote); #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */ $endif (_NTDDK_) @@ -1721,42 +1880,42 @@ NTKERNELAPI NTSTATUS NTAPI IoCsqInitialize( - IN PIO_CSQ Csq, - IN PIO_CSQ_INSERT_IRP 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); + _Out_ PIO_CSQ Csq, + _In_ PIO_CSQ_INSERT_IRP 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 VOID NTAPI IoCsqInsertIrp( - IN PIO_CSQ Csq, - IN PIRP Irp, - IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL); + _Inout_ PIO_CSQ Csq, + _Inout_ PIRP Irp, + _Out_opt_ PIO_CSQ_IRP_CONTEXT Context); NTKERNELAPI PIRP NTAPI IoCsqRemoveIrp( - IN PIO_CSQ Csq, - IN PIO_CSQ_IRP_CONTEXT Context); + _Inout_ PIO_CSQ Csq, + _Inout_ PIO_CSQ_IRP_CONTEXT Context); NTKERNELAPI PIRP NTAPI IoCsqRemoveNextIrp( - IN PIO_CSQ Csq, - IN PVOID PeekContext OPTIONAL); + _Inout_ PIO_CSQ Csq, + _In_opt_ PVOID PeekContext); NTKERNELAPI BOOLEAN NTAPI IoForwardIrpSynchronously( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp); #define IoForwardAndCatchIrp IoForwardIrpSynchronously @@ -1764,230 +1923,241 @@ NTKERNELAPI VOID NTAPI IoFreeErrorLogEntry( - PVOID ElEntry); + _In_ PVOID ElEntry); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoSetCompletionRoutineEx( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PIO_COMPLETION_ROUTINE CompletionRoutine, - IN PVOID Context, - IN BOOLEAN InvokeOnSuccess, - IN BOOLEAN InvokeOnError, - IN BOOLEAN InvokeOnCancel); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ PIO_COMPLETION_ROUTINE CompletionRoutine, + _In_opt_ PVOID Context, + _In_ BOOLEAN InvokeOnSuccess, + _In_ BOOLEAN InvokeOnError, + _In_ BOOLEAN InvokeOnCancel); VOID NTAPI IoSetStartIoAttributes( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN DeferredStartIo, - IN BOOLEAN NonCancelable); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN DeferredStartIo, + _In_ BOOLEAN NonCancelable); NTKERNELAPI NTSTATUS NTAPI IoWMIDeviceObjectToInstanceName( - IN PVOID DataBlockObject, - IN PDEVICE_OBJECT DeviceObject, - OUT PUNICODE_STRING InstanceName); + _In_ PVOID DataBlockObject, + _In_ PDEVICE_OBJECT DeviceObject, + _Out_ PUNICODE_STRING InstanceName); NTKERNELAPI NTSTATUS NTAPI IoWMIExecuteMethod( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN ULONG MethodId, - IN ULONG InBufferSize, - IN OUT PULONG OutBufferSize, - IN OUT PUCHAR InOutBuffer); + _In_ PVOID DataBlockObject, + _In_ PUNICODE_STRING InstanceName, + _In_ ULONG MethodId, + _In_ ULONG InBufferSize, + _Inout_ PULONG OutBufferSize, + _Inout_updates_bytes_to_opt_(*OutBufferSize, InBufferSize) PUCHAR InOutBuffer); NTKERNELAPI NTSTATUS NTAPI IoWMIHandleToInstanceName( - IN PVOID DataBlockObject, - IN HANDLE FileHandle, - OUT PUNICODE_STRING InstanceName); + _In_ PVOID DataBlockObject, + _In_ HANDLE FileHandle, + _Out_ PUNICODE_STRING InstanceName); NTKERNELAPI NTSTATUS NTAPI IoWMIOpenBlock( - IN GUID *DataBlockGuid, - IN ULONG DesiredAccess, - OUT PVOID *DataBlockObject); + _In_ GUID *DataBlockGuid, + _In_ ULONG DesiredAccess, + _Out_ PVOID *DataBlockObject); NTKERNELAPI NTSTATUS NTAPI IoWMIQueryAllData( - IN PVOID DataBlockObject, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); + _In_ PVOID DataBlockObject, + _Inout_ ULONG *InOutBufferSize, + _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer); NTKERNELAPI NTSTATUS NTAPI IoWMIQueryAllDataMultiple( - IN PVOID *DataBlockObjectList, - IN ULONG ObjectCount, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); + _In_reads_(ObjectCount) PVOID *DataBlockObjectList, + _In_ ULONG ObjectCount, + _Inout_ ULONG *InOutBufferSize, + _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer); NTKERNELAPI NTSTATUS NTAPI IoWMIQuerySingleInstance( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); + _In_ PVOID DataBlockObject, + _In_ PUNICODE_STRING InstanceName, + _Inout_ ULONG *InOutBufferSize, + _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer); NTKERNELAPI NTSTATUS NTAPI IoWMISetNotificationCallback( - IN OUT PVOID Object, - IN WMI_NOTIFICATION_CALLBACK Callback, - IN PVOID Context OPTIONAL); + _Inout_ PVOID Object, + _In_ WMI_NOTIFICATION_CALLBACK Callback, + _In_opt_ PVOID Context); NTKERNELAPI NTSTATUS NTAPI IoWMISetSingleInstance( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN ULONG Version, - IN ULONG ValueBufferSize, - IN PVOID ValueBuffer); + _In_ PVOID DataBlockObject, + _In_ PUNICODE_STRING InstanceName, + _In_ ULONG Version, + _In_ ULONG ValueBufferSize, + _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer); NTKERNELAPI NTSTATUS NTAPI IoWMISetSingleItem( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN ULONG DataItemId, - IN ULONG Version, - IN ULONG ValueBufferSize, - IN PVOID ValueBuffer); + _In_ PVOID DataBlockObject, + _In_ PUNICODE_STRING InstanceName, + _In_ ULONG DataItemId, + _In_ ULONG Version, + _In_ ULONG ValueBufferSize, + _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer); $endif (_WDMDDK_) $if (_NTDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS FASTCALL IoReadPartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ BOOLEAN ReturnRecognizedPartitions, + _Out_ struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS FASTCALL IoSetPartitionInformation( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG PartitionNumber, + _In_ ULONG PartitionType); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS FASTCALL IoWritePartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG SectorsPerTrack, + _In_ ULONG NumberOfHeads, + _In_ struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); NTKERNELAPI NTSTATUS NTAPI IoCreateDisk( - IN PDEVICE_OBJECT DeviceObject, - IN struct _CREATE_DISK* Disk OPTIONAL); + _In_ PDEVICE_OBJECT DeviceObject, + _In_opt_ struct _CREATE_DISK* Disk); NTKERNELAPI NTSTATUS NTAPI IoReadDiskSignature( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG BytesPerSector, - OUT PDISK_SIGNATURE Signature); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG BytesPerSector, + _Out_ PDISK_SIGNATURE Signature); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoReadPartitionTableEx( - IN PDEVICE_OBJECT DeviceObject, - OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); + _In_ PDEVICE_OBJECT DeviceObject, + _Out_ struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoSetPartitionInformationEx( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG PartitionNumber, - IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG PartitionNumber, + _In_ struct _SET_PARTITION_INFORMATION_EX *PartitionInfo); NTKERNELAPI NTSTATUS NTAPI IoSetSystemPartition( - IN PUNICODE_STRING VolumeNameString); + _In_ PUNICODE_STRING VolumeNameString); NTKERNELAPI NTSTATUS NTAPI IoVerifyPartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN FixErrors); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN FixErrors); NTKERNELAPI NTSTATUS NTAPI IoVolumeDeviceToDosName( - IN PVOID VolumeDeviceObject, - OUT PUNICODE_STRING DosName); + _In_ PVOID VolumeDeviceObject, + _Out_ _When_(return==0, + _At_(DosName->Buffer, __drv_allocatesMem(Mem))) + PUNICODE_STRING DosName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoWritePartitionTableEx( - IN PDEVICE_OBJECT DeviceObject, - IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout); + _In_ PDEVICE_OBJECT DeviceObject, + _In_reads_(_Inexpressible_(FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, PartitionEntry[0]))) + struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout); 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); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG Disposition, + _In_ ULONG CreateOptions, + _In_opt_ PVOID EaBuffer, + _In_ ULONG EaLength, + _In_ CREATE_FILE_TYPE CreateFileType, + _In_opt_ PVOID InternalParameters, + _In_ ULONG Options, + _In_opt_ PVOID DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoAttachDeviceToDeviceStackSafe( - IN PDEVICE_OBJECT SourceDevice, - IN PDEVICE_OBJECT TargetDevice, - OUT PDEVICE_OBJECT *AttachedToDeviceObject); + _In_ PDEVICE_OBJECT SourceDevice, + _In_ PDEVICE_OBJECT TargetDevice, + _Outptr_ PDEVICE_OBJECT *AttachedToDeviceObject); $endif (_NTDDK_) $if (_NTIFS_) @@ -1996,44 +2166,45 @@ NTKERNELAPI PFILE_OBJECT NTAPI IoCreateStreamFileObjectEx( - IN PFILE_OBJECT FileObject OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - OUT PHANDLE FileObjectHandle OPTIONAL); + _In_opt_ PFILE_OBJECT FileObject, + _In_opt_ PDEVICE_OBJECT DeviceObject, + _Out_opt_ PHANDLE FileObjectHandle); NTKERNELAPI NTSTATUS NTAPI IoQueryFileDosDeviceName( - IN PFILE_OBJECT FileObject, - OUT POBJECT_NAME_INFORMATION *ObjectNameInformation); + _In_ PFILE_OBJECT FileObject, + _Out_ POBJECT_NAME_INFORMATION *ObjectNameInformation); NTKERNELAPI NTSTATUS NTAPI IoEnumerateDeviceObjectList( - IN PDRIVER_OBJECT DriverObject, - OUT PDEVICE_OBJECT *DeviceObjectList, - IN ULONG DeviceObjectListSize, - OUT PULONG ActualNumberDeviceObjects); + _In_ PDRIVER_OBJECT DriverObject, + _Out_writes_bytes_to_opt_(DeviceObjectListSize,(*ActualNumberDeviceObjects)*sizeof(PDEVICE_OBJECT)) + PDEVICE_OBJECT *DeviceObjectList, + _In_ ULONG DeviceObjectListSize, + _Out_ PULONG ActualNumberDeviceObjects); NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetLowerDeviceObject( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetDeviceAttachmentBaseRef( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoGetDiskDeviceObject( - IN PDEVICE_OBJECT FileSystemDeviceObject, - OUT PDEVICE_OBJECT *DiskDeviceObject); + _In_ PDEVICE_OBJECT FileSystemDeviceObject, + _Out_ PDEVICE_OBJECT *DiskDeviceObject); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -2044,8 +2215,8 @@ NTKERNELAPI NTSTATUS NTAPI IoValidateDeviceIoControlAccess( - IN PIRP Irp, - IN ULONG RequiredAccess); + _In_ PIRP Irp, + _In_ ULONG RequiredAccess); #endif $endif (_WDMDDK_) @@ -2057,7 +2228,7 @@ NTKERNELAPI IO_PAGING_PRIORITY FASTCALL IoGetPagingIoPriority( - IN PIRP Irp); + _In_ PIRP Irp); $endif (_NTDDK_) $if (_WDMDDK_) @@ -2065,22 +2236,22 @@ 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); + _Out_ 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); + _Inout_ PIO_CSQ Csq, + _Inout_ PIRP Irp, + _Out_opt_ PIO_CSQ_IRP_CONTEXT Context, + _In_opt_ PVOID InsertContext); $endif (_WDMDDK_) $if (_WDMDDK_ || _NTDDK_) #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ @@ -2093,11 +2264,11 @@ $if (_NTDDK_) BOOLEAN NTAPI IoTranslateBusAddress( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); + _In_ INTERFACE_TYPE InterfaceType, + _In_ ULONG BusNumber, + _In_ PHYSICAL_ADDRESS BusAddress, + _Inout_ PULONG AddressSpace, + _Out_ PPHYSICAL_ADDRESS TranslatedAddress); $endif (_NTDDK_) $if (_NTIFS_) @@ -2105,9 +2276,10 @@ NTKERNELAPI NTSTATUS NTAPI IoEnumerateRegisteredFiltersList( - OUT PDRIVER_OBJECT *DriverObjectList, - IN ULONG DriverObjectListSize, - OUT PULONG ActualNumberDriverObjects); + _Out_writes_bytes_to_opt_(DriverObjectListSize,(*ActualNumberDriverObjects)*sizeof(PDRIVER_OBJECT)) + PDRIVER_OBJECT *DriverObjectList, + _In_ ULONG DriverObjectListSize, + _Out_ PULONG ActualNumberDriverObjects); $endif (_NTIFS_) $if (_NTDDK_ || _NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ @@ -2119,46 +2291,46 @@ NTKERNELAPI NTSTATUS NTAPI IoGetBootDiskInformationLite( - OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation); + _Outptr_ 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); + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG DesiredShareAccess, + _Inout_ PFILE_OBJECT FileObject, + _Inout_ PSHARE_ACCESS ShareAccess, + _In_ BOOLEAN Update, + _In_ PBOOLEAN WritePermission); NTKERNELAPI NTSTATUS NTAPI IoConnectInterruptEx( - IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters); + _Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters); NTKERNELAPI VOID NTAPI IoDisconnectInterruptEx( - IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters); + _In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters); LOGICAL NTAPI IoWithinStackLimits( - IN ULONG_PTR RegionStart, - IN SIZE_T RegionSize); + _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); + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG DesiredShareAccess, + _Inout_ PFILE_OBJECT FileObject, + _Out_ PSHARE_ACCESS ShareAccess, + _In_ PBOOLEAN WritePermission); ULONG NTAPI @@ -2167,86 +2339,93 @@ IoSizeofWorkItem(VOID); VOID NTAPI IoInitializeWorkItem( - IN PVOID IoObject, - IN PIO_WORKITEM IoWorkItem); + _In_ PVOID IoObject, + _Out_ PIO_WORKITEM IoWorkItem); VOID NTAPI IoUninitializeWorkItem( - IN PIO_WORKITEM IoWorkItem); + _Inout_ PIO_WORKITEM IoWorkItem); +_IRQL_requires_max_(DISPATCH_LEVEL) VOID NTAPI IoQueueWorkItemEx( - IN PIO_WORKITEM IoWorkItem, - IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine, - IN WORK_QUEUE_TYPE QueueType, - IN PVOID Context OPTIONAL); + _Inout_ PIO_WORKITEM IoWorkItem, + _In_ PIO_WORKITEM_ROUTINE_EX WorkerRoutine, + _In_ WORK_QUEUE_TYPE QueueType, + _In_opt_ __drv_aliasesMem PVOID Context); IO_PRIORITY_HINT NTAPI IoGetIoPriorityHint( - IN PIRP Irp); + _In_ PIRP Irp); NTSTATUS NTAPI IoSetIoPriorityHint( - IN PIRP Irp, - IN IO_PRIORITY_HINT PriorityHint); + _In_ PIRP Irp, + _In_ IO_PRIORITY_HINT PriorityHint); NTSTATUS NTAPI IoAllocateSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN ULONG Length, - IN PVOID Signature, - OUT PVOID *StreamIdentifier); + _In_ PFILE_OBJECT FileObject, + _In_ ULONG Length, + _In_ PVOID Signature, + _Out_ PVOID *StreamIdentifier); PVOID NTAPI IoGetSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN PVOID Signature); + _In_ PFILE_OBJECT FileObject, + _In_ PVOID Signature); NTSTATUS NTAPI IoFreeSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN PVOID Signature); + _In_ PFILE_OBJECT FileObject, + _In_ PVOID Signature); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoRequestDeviceEjectEx( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL, - IN PVOID Context OPTIONAL, - IN PDRIVER_OBJECT DriverObject OPTIONAL); + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_opt_ PIO_DEVICE_EJECT_CALLBACK Callback, + _In_opt_ PVOID Context, + _In_opt_ PDRIVER_OBJECT DriverObject); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ 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); + _In_ PDEVICE_OBJECT Pdo, + _In_ CONST DEVPROPKEY *PropertyKey, + _In_ LCID Lcid, + _In_ ULONG Flags, + _In_ DEVPROPTYPE Type, + _In_ ULONG Size, + _In_opt_ PVOID Data); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoGetDevicePropertyData( - PDEVICE_OBJECT Pdo, - CONST DEVPROPKEY *PropertyKey, - LCID Lcid, - ULONG Flags, - ULONG Size, - PVOID Data, - PULONG RequiredSize, - PDEVPROPTYPE Type); + _In_ PDEVICE_OBJECT Pdo, + _In_ CONST DEVPROPKEY *PropertyKey, + _In_ LCID Lcid, + _Reserved_ ULONG Flags, + _In_ ULONG Size, + _Out_ PVOID Data, + _Out_ PULONG RequiredSize, + _Out_ PDEVPROPTYPE Type); $endif (_WDMDDK_) $if (_NTDDK_) @@ -2254,56 +2433,56 @@ NTKERNELAPI NTSTATUS NTAPI IoUpdateDiskGeometry( - IN PDEVICE_OBJECT DeviceObject, - IN struct _DISK_GEOMETRY_EX* OldDiskGeometry, - IN struct _DISK_GEOMETRY_EX* NewDiskGeometry); + _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); + _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); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG Disposition, + _In_ ULONG CreateOptions, + _In_opt_ PVOID EaBuffer, + _In_ ULONG EaLength, + _In_ CREATE_FILE_TYPE CreateFileType, + _In_opt_ PVOID InternalParameters, + _In_ ULONG Options, + _In_opt_ PIO_DRIVER_CREATE_CONTEXT DriverContext); NTSTATUS NTAPI IoSetIrpExtraCreateParameter( - IN OUT PIRP Irp, - IN struct _ECP_LIST *ExtraCreateParameter); + _Inout_ PIRP Irp, + _In_ struct _ECP_LIST *ExtraCreateParameter); VOID NTAPI IoClearIrpExtraCreateParameter( - IN OUT PIRP Irp); + _Inout_ PIRP Irp); NTSTATUS NTAPI IoGetIrpExtraCreateParameter( - IN PIRP Irp, - OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL); + _In_ PIRP Irp, + _Outptr_result_maybenull_ struct _ECP_LIST **ExtraCreateParameter); BOOLEAN NTAPI IoIsFileObjectIgnoringSharing( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); $endif (_NTDDK_) $if (_NTIFS_) @@ -2312,12 +2491,12 @@ FORCEINLINE VOID NTAPI IoInitializePriorityInfo( - IN PIO_PRIORITY_INFO PriorityInfo) + _In_ PIO_PRIORITY_INFO PriorityInfo) { - PriorityInfo->Size = sizeof(IO_PRIORITY_INFO); - PriorityInfo->ThreadPriority = 0xffff; - PriorityInfo->IoPriority = IoPriorityNormal; - PriorityInfo->PagePriority = 0; + PriorityInfo->Size = sizeof(IO_PRIORITY_INFO); + PriorityInfo->ThreadPriority = 0xffff; + PriorityInfo->IoPriority = IoPriorityNormal; + PriorityInfo->PagePriority = 0; } $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -2326,13 +2505,15 @@ $if (_WDMDDK_) #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b) #if (NTDDI_VERSION >= NTDDI_WS08) +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoReplacePartitionUnit( - IN PDEVICE_OBJECT TargetPdo, - IN PDEVICE_OBJECT SparePdo, - IN ULONG Flags); + _In_ PDEVICE_OBJECT TargetPdo, + _In_ PDEVICE_OBJECT SparePdo, + _In_ ULONG Flags); #endif $endif (_WDMDDK_) @@ -2343,50 +2524,54 @@ NTKERNELAPI NTSTATUS NTAPI IoGetAffinityInterrupt( - IN PKINTERRUPT InterruptObject, - OUT PGROUP_AFFINITY GroupAffinity); + _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); + _In_ IO_CONTAINER_INFORMATION_CLASS InformationClass, + _In_opt_ PVOID ContainerObject, + _Inout_updates_bytes_opt_(BufferLength) PVOID Buffer, + _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); + _In_ IO_CONTAINER_NOTIFICATION_CLASS NotificationClass, + _In_ PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction, + _In_reads_bytes_opt_(NotificationInformationLength) PVOID NotificationInformation, + _In_ ULONG NotificationInformationLength, + _Out_ PVOID CallbackRegistration); VOID NTAPI IoUnregisterContainerNotification( - IN PVOID CallbackRegistration); + _In_ PVOID CallbackRegistration); +_IRQL_requires_max_(PASSIVE_LEVEL) +__drv_freesMem(Pool) NTKERNELAPI NTSTATUS NTAPI IoUnregisterPlugPlayNotificationEx( - IN PVOID NotificationEntry); + _In_ PVOID NotificationEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoGetDeviceNumaNode( - IN PDEVICE_OBJECT Pdo, - OUT PUSHORT NodeNumber); + _In_ PDEVICE_OBJECT Pdo, + _Out_ PUSHORT NodeNumber); $endif (_WDMDDK_) $if (_NTDDK_) NTSTATUS NTAPI IoSetFileObjectIgnoreSharing( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); $endif (_NTDDK_) $if (_NTIFS_) @@ -2395,17 +2580,17 @@ NTKERNELAPI NTSTATUS NTAPI IoRegisterFsRegistrationChangeMountAware( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine, - IN BOOLEAN SynchronizeWithMounts); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine, + _In_ BOOLEAN SynchronizeWithMounts); NTKERNELAPI NTSTATUS NTAPI IoReplaceFileObjectName( - IN PFILE_OBJECT FileObject, - IN PWSTR NewFileName, - IN USHORT FileNameLength); + _In_ PFILE_OBJECT FileObject, + _In_reads_bytes_(FileNameLength) PWSTR NewFileName, + _In_ USHORT FileNameLength); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -2415,7 +2600,7 @@ NTKERNELAPI ULONG NTAPI IoWMIDeviceObjectToProviderId( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); #else #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject)) #endif @@ -2431,7 +2616,7 @@ IoWMIDeviceObjectToProviderId( FORCEINLINE VOID IoSkipCurrentIrpStackLocation( - IN OUT PIRP Irp) + _Inout_ PIRP Irp) { ASSERT(Irp->CurrentLocation <= Irp->StackCount); Irp->CurrentLocation++; @@ -2445,7 +2630,7 @@ IoSkipCurrentIrpStackLocation( FORCEINLINE VOID IoSetNextIrpStackLocation( - IN OUT PIRP Irp) + _Inout_ PIRP Irp) { ASSERT(Irp->CurrentLocation > 0); Irp->CurrentLocation--; @@ -2456,10 +2641,11 @@ IoSetNextIrpStackLocation( #endif } +__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation( - IN PIRP Irp) + _In_ PIRP Irp) { ASSERT(Irp->CurrentLocation > 0); #ifdef NONAMELESSUNION @@ -2469,15 +2655,16 @@ IoGetNextIrpStackLocation( #endif } +_IRQL_requires_max_(DISPATCH_LEVEL) FORCEINLINE VOID IoSetCompletionRoutine( - IN PIRP Irp, - IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL, - IN PVOID Context OPTIONAL, - IN BOOLEAN InvokeOnSuccess, - IN BOOLEAN InvokeOnError, - IN BOOLEAN InvokeOnCancel) + _In_ PIRP Irp, + _In_opt_ PIO_COMPLETION_ROUTINE CompletionRoutine, + _In_opt_ __drv_aliasesMem PVOID Context, + _In_ BOOLEAN InvokeOnSuccess, + _In_ BOOLEAN InvokeOnError, + _In_ BOOLEAN InvokeOnCancel) { PIO_STACK_LOCATION irpSp; ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE ); @@ -2499,26 +2686,26 @@ IoSetCompletionRoutine( } } -/* - * PDRIVER_CANCEL - * IoSetCancelRoutine( - * IN PIRP Irp, - * IN PDRIVER_CANCEL CancelRoutine) - */ -#define IoSetCancelRoutine(_Irp, \ - _CancelRoutine) \ - ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \ - (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine))) +_IRQL_requires_max_(DISPATCH_LEVEL) +_Ret_maybenull_ +FORCEINLINE +PDRIVER_CANCEL +IoSetCancelRoutine( + _Inout_ PIRP Irp, + _In_opt_ PDRIVER_CANCEL CancelRoutine) +{ + return (PDRIVER_CANCEL)(ULONG_PTR) InterlockedExchangePointer((PVOID *)&(Irp)->CancelRoutine, (PVOID)(ULONG_PTR)(CancelRoutine)); +} -/* - * VOID - * IoRequestDpc( - * IN PDEVICE_OBJECT DeviceObject, - * IN PIRP Irp, - * IN PVOID Context); - */ -#define IoRequestDpc(DeviceObject, Irp, Context)( \ - KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context))) +FORCEINLINE +VOID +IoRequestDpc( + _Inout_ PDEVICE_OBJECT DeviceObject, + _In_opt_ PIRP Irp, + _In_opt_ __drv_aliasesMem PVOID Context) +{ + KeInsertQueueDpc(&DeviceObject->Dpc, Irp, Context); +} /* * VOID @@ -2541,20 +2728,22 @@ IoSetCompletionRoutine( IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK)) #if defined(_WIN64) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN IoIs32bitProcess( - IN PIRP Irp OPTIONAL); + _In_opt_ PIRP Irp); #endif #define PLUGPLAY_REGKEY_DEVICE 1 #define PLUGPLAY_REGKEY_DRIVER 2 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4 +__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation( - IN PIRP Irp) + _In_ PIRP Irp) { ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1); #ifdef NONAMELESSUNION @@ -2567,9 +2756,9 @@ IoGetCurrentIrpStackLocation( FORCEINLINE VOID IoMarkIrpPending( - IN OUT PIRP Irp) + _Inout_ PIRP Irp) { - IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED; + IoGetCurrentIrpStackLocation((Irp))->Control |= SL_PENDING_RETURNED; } /* @@ -2601,12 +2790,12 @@ IoMarkIrpPending( FORCEINLINE VOID IoInitializeDpcRequest( - IN PDEVICE_OBJECT DeviceObject, - IN PIO_DPC_ROUTINE DpcRoutine) + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIO_DPC_ROUTINE DpcRoutine) { - KeInitializeDpc( &DeviceObject->Dpc, - (PKDEFERRED_ROUTINE) DpcRoutine, - DeviceObject ); + KeInitializeDpc(&DeviceObject->Dpc, + (PKDEFERRED_ROUTINE) DpcRoutine, + DeviceObject); } #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001 @@ -2622,49 +2811,51 @@ IoInitializeDpcRequest( FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext( - IN OUT PIRP Irp) + _Inout_ PIRP Irp) { - PIO_STACK_LOCATION irpSp; - PIO_STACK_LOCATION nextIrpSp; - irpSp = IoGetCurrentIrpStackLocation(Irp); - nextIrpSp = IoGetNextIrpStackLocation(Irp); - RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); - nextIrpSp->Control = 0; + PIO_STACK_LOCATION irpSp; + PIO_STACK_LOCATION nextIrpSp; + irpSp = IoGetCurrentIrpStackLocation(Irp); + nextIrpSp = IoGetNextIrpStackLocation(Irp); + RtlCopyMemory(nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); + nextIrpSp->Control = 0; } +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI IoGetStackLimits( - OUT PULONG_PTR LowLimit, - OUT PULONG_PTR HighLimit); + _Out_ PULONG_PTR LowLimit, + _Out_ PULONG_PTR HighLimit); +_IRQL_requires_max_(APC_LEVEL) FORCEINLINE ULONG_PTR IoGetRemainingStackSize(VOID) { - ULONG_PTR End, Begin; - ULONG_PTR Result; + ULONG_PTR End, Begin; + ULONG_PTR Result; - IoGetStackLimits(&Begin, &End); - Result = (ULONG_PTR)(&End) - Begin; - return Result; + IoGetStackLimits(&Begin, &End); + Result = (ULONG_PTR)(&End) - Begin; + return Result; } #if (NTDDI_VERSION >= NTDDI_WS03) FORCEINLINE VOID IoInitializeThreadedDpcRequest( - IN PDEVICE_OBJECT DeviceObject, - IN PIO_DPC_ROUTINE DpcRoutine) + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIO_DPC_ROUTINE DpcRoutine) { #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:28128) #endif - KeInitializeThreadedDpc(&DeviceObject->Dpc, - (PKDEFERRED_ROUTINE) DpcRoutine, - DeviceObject ); + KeInitializeThreadedDpc(&DeviceObject->Dpc, + (PKDEFERRED_ROUTINE) DpcRoutine, + DeviceObject ); #ifdef _MSC_VER #pragma warning(pop) #endif diff --git a/reactos/include/xdk/iotypes.h b/reactos/include/xdk/iotypes.h index 9f358794700..2bd4f2f450b 100644 --- a/reactos/include/xdk/iotypes.h +++ b/reactos/include/xdk/iotypes.h @@ -181,12 +181,14 @@ typedef enum _IO_ALLOCATION_ACTION { DeallocateObjectKeepRegisters } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION; +_Function_class_(DRIVER_CONTROL) +_IRQL_requires_same_ typedef IO_ALLOCATION_ACTION (NTAPI DRIVER_CONTROL)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN PVOID MapRegisterBase, - IN PVOID Context); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ struct _IRP *Irp, + _In_ PVOID MapRegisterBase, + _In_ PVOID Context); typedef DRIVER_CONTROL *PDRIVER_CONTROL; typedef struct _WAIT_CONTEXT_BLOCK { @@ -261,7 +263,7 @@ $if (_WDMDDK_ || _DEVIOCTL_) $endif (_WDMDDK_ || _DEVIOCTL_) $if (_WDMDDK_) -typedef struct _DEVICE_OBJECT { +typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT { CSHORT Type; USHORT Size; LONG ReferenceCount; @@ -327,48 +329,48 @@ typedef struct _IO_INTERRUPT_MESSAGE_INFO { } 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; + _In_ PDEVICE_OBJECT PhysicalDeviceObject; + _Out_ PKINTERRUPT *InterruptObject; + _In_ PKSERVICE_ROUTINE ServiceRoutine; + _In_ PVOID ServiceContext; + _In_opt_ PKSPIN_LOCK SpinLock; + _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; + _In_ PDEVICE_OBJECT PhysicalDeviceObject; + _Out_ PKINTERRUPT *InterruptObject; + _In_ PKSERVICE_ROUTINE ServiceRoutine; + _In_ PVOID ServiceContext; + _In_opt_ PKSPIN_LOCK SpinLock; + _In_opt_ KIRQL SynchronizeIrql; + _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; + _In_ PDEVICE_OBJECT PhysicalDeviceObject; union { - OUT PVOID *Generic; - OUT PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable; - OUT PKINTERRUPT *InterruptObject; + _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; + _In_ PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine; + _In_ PVOID ServiceContext; + _In_opt_ PKSPIN_LOCK SpinLock; + _In_opt_ KIRQL SynchronizeIrql; + _In_ BOOLEAN FloatingSave; + _In_opt_ PKSERVICE_ROUTINE FallBackServiceRoutine; } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS; typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS { - IN OUT ULONG Version; + _Inout_ ULONG Version; _ANONYMOUS_UNION union { IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified; IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased; @@ -377,11 +379,11 @@ typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS { } IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS; typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS { - IN ULONG Version; + _In_ ULONG Version; union { - IN PVOID Generic; - IN PKINTERRUPT InterruptObject; - IN PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable; + _In_ PVOID Generic; + _In_ PKINTERRUPT InterruptObject; + _In_ PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable; } ConnectionContext; } IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS; @@ -428,12 +430,12 @@ typedef NTSTATUS 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); + _In_ PVOID SessionObject, + _In_ PVOID IoObject, + _In_ ULONG Event, + _In_ PVOID Context, + _In_reads_bytes_opt_(PayloadLength) PVOID NotificationPayload, + _In_ ULONG PayloadLength); typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION; @@ -470,17 +472,20 @@ typedef struct _IO_REMOVE_LOCK { typedef struct _IO_WORKITEM *PIO_WORKITEM; +_Function_class_(IO_WORKITEM_ROUTINE) +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ typedef VOID (NTAPI IO_WORKITEM_ROUTINE)( - IN PDEVICE_OBJECT DeviceObject, - IN PVOID Context); + _In_ PDEVICE_OBJECT DeviceObject, + _In_opt_ PVOID Context); typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE; typedef VOID (NTAPI IO_WORKITEM_ROUTINE_EX)( - IN PVOID IoObject, - IN PVOID Context OPTIONAL, - IN PIO_WORKITEM IoWorkItem); + _In_ PVOID IoObject, + _In_opt_ PVOID Context, + _In_ PIO_WORKITEM IoWorkItem); typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX; typedef struct _SHARE_ACCESS { @@ -596,9 +601,9 @@ typedef struct _IO_STATUS_BLOCK32 { typedef VOID (NTAPI *PIO_APC_ROUTINE)( - IN PVOID ApcContext, - IN PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG Reserved); + _In_ PVOID ApcContext, + _In_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG Reserved); #define PIO_APC_ROUTINE_DEFINED @@ -828,29 +833,35 @@ typedef VOID (NTAPI *PINTERFACE_DEREFERENCE)( PVOID Context); +_Function_class_(TRANSLATE_BUS_ADDRESS) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI TRANSLATE_BUS_ADDRESS)( - IN PVOID Context, - IN PHYSICAL_ADDRESS BusAddress, - IN ULONG Length, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); + _Inout_opt_ PVOID Context, + _In_ PHYSICAL_ADDRESS BusAddress, + _In_ ULONG Length, + _Out_ PULONG AddressSpace, + _Out_ PPHYSICAL_ADDRESS TranslatedAddress); typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS; +_Function_class_(GET_DMA_ADAPTER) +_IRQL_requires_same_ typedef struct _DMA_ADAPTER* (NTAPI GET_DMA_ADAPTER)( - IN PVOID Context, - IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, - OUT PULONG NumberOfMapRegisters); + _Inout_opt_ PVOID Context, + _In_ struct _DEVICE_DESCRIPTION *DeviceDescriptor, + _Out_ PULONG NumberOfMapRegisters); typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER; +_Function_class_(GET_SET_DEVICE_DATA) +_IRQL_requires_same_ typedef ULONG (NTAPI GET_SET_DEVICE_DATA)( - IN PVOID Context, - IN ULONG DataType, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); + _Inout_opt_ PVOID Context, + _In_ ULONG DataType, + _Inout_updates_bytes_(Length) PVOID Buffer, + _In_ ULONG Offset, + _In_ ULONG Length); typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA; typedef enum _DEVICE_INSTALL_STATE { @@ -873,8 +884,8 @@ typedef enum _DEVICE_REMOVAL_POLICY { } DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY; typedef VOID -(NTAPI*PREENUMERATE_SELF)( - IN PVOID Context); +(NTAPI *PREENUMERATE_SELF)( + _In_ PVOID Context); typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD { USHORT Size; @@ -887,8 +898,8 @@ typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD { typedef VOID (NTAPI *PIO_DEVICE_EJECT_CALLBACK)( - IN NTSTATUS Status, - IN OUT PVOID Context OPTIONAL); + _In_ NTSTATUS Status, + _Inout_opt_ PVOID Context); #define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1 @@ -914,20 +925,24 @@ typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS { UCHAR ProgIf; } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS; +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ typedef BOOLEAN (NTAPI PCI_IS_DEVICE_PRESENT)( - IN USHORT VendorID, - IN USHORT DeviceID, - IN UCHAR RevisionID, - IN USHORT SubVendorID, - IN USHORT SubSystemID, - IN ULONG Flags); + _In_ USHORT VendorID, + _In_ USHORT DeviceID, + _In_ UCHAR RevisionID, + _In_ USHORT SubVendorID, + _In_ USHORT SubSystemID, + _In_ ULONG Flags); typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT; +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ typedef BOOLEAN (NTAPI PCI_IS_DEVICE_PRESENT_EX)( - IN PVOID Context, - IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters); + _In_ PVOID Context, + _In_ PPCI_DEVICE_PRESENCE_PARAMETERS Parameters); typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX; typedef struct _BUS_INTERFACE_STANDARD { @@ -952,8 +967,9 @@ typedef struct _PCI_DEVICE_PRESENT_INTERFACE { PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx; } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE; +_Struct_size_bytes_(Size) typedef struct _DEVICE_CAPABILITIES { - USHORT Size; + _Field_range_(==, sizeof(struct _DEVICE_CAPABILITIES)) USHORT Size; USHORT Version; ULONG DeviceD1:1; ULONG DeviceD2:1; @@ -1048,13 +1064,14 @@ typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { #define PNP_REPLACE_NO_MAP MAXLONGLONG +_Must_inspect_result_ 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); + _In_ PHYSICAL_ADDRESS TargetPhysicalAddress, + _In_ PHYSICAL_ADDRESS SparePhysicalAddress, + _Inout_ PLARGE_INTEGER NumberOfBytes, + _Outptr_ PVOID *TargetAddress, + _Outptr_ PVOID *SpareAddress); typedef struct _PNP_REPLACE_MEMORY_LIST { ULONG AllocatedCount; @@ -1068,7 +1085,7 @@ typedef struct _PNP_REPLACE_MEMORY_LIST { typedef struct _PNP_REPLACE_PROCESSOR_LIST { PKAFFINITY Affinity; - ULONG GroupCount; + _Field_range_(<=, MAXIMUM_GROUPS) ULONG GroupCount; ULONG AllocatedCount; ULONG Count; ULONG ApicIds[ANYSIZE_ARRAY]; @@ -1099,49 +1116,58 @@ typedef VOID (NTAPI *PREPLACE_UNLOAD)( VOID); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_BEGIN)( - IN PPNP_REPLACE_PARAMETERS Parameters, - OUT PVOID *Context); + _In_ PPNP_REPLACE_PARAMETERS Parameters, + _Outptr_ PVOID *Context); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_END)( - IN PVOID Context); + _In_ PVOID Context); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)( - IN PVOID Context, - IN PHYSICAL_ADDRESS PhysicalAddress, - IN LARGE_INTEGER ByteCount); + _In_ PVOID Context, + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ LARGE_INTEGER ByteCount); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_SET_PROCESSOR_ID)( - IN PVOID Context, - IN ULONG ApicId, - IN BOOLEAN Target); + _In_ PVOID Context, + _In_ ULONG ApicId, + _In_ BOOLEAN Target); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_SWAP)( - IN PVOID Context); + _In_ PVOID Context); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)( - IN PVOID Context); + _In_ PVOID Context); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)( - IN PVOID Context); + _In_ PVOID Context); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_GET_MEMORY_DESTINATION)( - IN PVOID Context, - IN PHYSICAL_ADDRESS SourceAddress, - OUT PPHYSICAL_ADDRESS DestinationAddress); + _In_ PVOID Context, + _In_ PHYSICAL_ADDRESS SourceAddress, + _Out_ PPHYSICAL_ADDRESS DestinationAddress); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)( - IN PVOID Context, - IN BOOLEAN Enable); + _In_ PVOID Context, + _In_ BOOLEAN Enable); #define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1 #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \ @@ -1169,10 +1195,11 @@ typedef struct _PNP_REPLACE_DRIVER_INTERFACE { PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce; } PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE; +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_DRIVER_INIT)( - IN OUT PPNP_REPLACE_DRIVER_INTERFACE Interface, - IN PVOID Unused); + _Inout_ PPNP_REPLACE_DRIVER_INTERFACE Interface, + _In_ PVOID Unused); typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { DeviceUsageTypeUndefined, @@ -1187,30 +1214,40 @@ typedef struct _POWER_SEQUENCE { ULONG SequenceD3; } POWER_SEQUENCE, *PPOWER_SEQUENCE; +#ifdef _PREFAST_ +#define __string_type 0x1000 +#define __guid_type 0x2000 +#define __multiString_type 0x4000 +#else +#define __string_type 0 +#define __guid_type 0 +#define __multiString_type 0 +#endif + typedef enum { - DevicePropertyDeviceDescription = 0x0, - DevicePropertyHardwareID = 0x1, - DevicePropertyCompatibleIDs = 0x2, + DevicePropertyDeviceDescription = 0x0 | __string_type, + DevicePropertyHardwareID = 0x1 | __multiString_type, + DevicePropertyCompatibleIDs = 0x2 | __multiString_type, DevicePropertyBootConfiguration = 0x3, DevicePropertyBootConfigurationTranslated = 0x4, - DevicePropertyClassName = 0x5, - DevicePropertyClassGuid = 0x6, - DevicePropertyDriverKeyName = 0x7, - DevicePropertyManufacturer = 0x8, - DevicePropertyFriendlyName = 0x9, - DevicePropertyLocationInformation = 0xa, - DevicePropertyPhysicalDeviceObjectName = 0xb, - DevicePropertyBusTypeGuid = 0xc, + DevicePropertyClassName = 0x5 | __string_type, + DevicePropertyClassGuid = 0x6 | __string_type, + DevicePropertyDriverKeyName = 0x7 | __string_type, + DevicePropertyManufacturer = 0x8 | __string_type, + DevicePropertyFriendlyName = 0x9 | __string_type, + DevicePropertyLocationInformation = 0xa | __string_type, + DevicePropertyPhysicalDeviceObjectName = 0xb | __string_type, + DevicePropertyBusTypeGuid = 0xc | __guid_type, DevicePropertyLegacyBusType = 0xd, DevicePropertyBusNumber = 0xe, - DevicePropertyEnumeratorName = 0xf, + DevicePropertyEnumeratorName = 0xf | __string_type, DevicePropertyAddress = 0x10, DevicePropertyUINumber = 0x11, DevicePropertyInstallState = 0x12, DevicePropertyRemovalPolicy = 0x13, DevicePropertyResourceRequirements = 0x14, DevicePropertyAllocatedResources = 0x15, - DevicePropertyContainerID = 0x16 + DevicePropertyContainerID = 0x16 | __string_type } DEVICE_REGISTRY_PROPERTY; typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { @@ -1231,15 +1268,19 @@ typedef enum _IO_PRIORITY_HINT { #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 +_Function_class_(DRIVER_NOTIFICATION_CALLBACK_ROUTINE) +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE)( - IN PVOID NotificationStructure, - IN PVOID Context); + _In_ PVOID NotificationStructure, + _Inout_opt_ PVOID Context); typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE; +_Function_class_(DEVICE_CHANGE_COMPLETE_CALLBACK) +_IRQL_requires_same_ typedef VOID (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK)( - IN PVOID Context); + _Inout_opt_ PVOID Context); typedef DEVICE_CHANGE_COMPLETE_CALLBACK *PDEVICE_CHANGE_COMPLETE_CALLBACK; typedef enum _FILE_INFORMATION_CLASS { @@ -1412,251 +1453,305 @@ typedef struct _FILE_SFIO_VOLUME_INFORMATION { #define FM_LOCK_WAITER_WOKEN (0x2) #define FM_LOCK_WAITER_INC (0x4) +_Function_class_(FAST_IO_CHECK_IF_POSSIBLE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_CHECK_IF_POSSIBLE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - IN BOOLEAN CheckForReadOperation, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_ ULONG LockKey, + _In_ BOOLEAN CheckForReadOperation, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE; +_Function_class_(FAST_IO_READ) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_READ)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_ ULONG LockKey, + _Out_ PVOID Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_READ *PFAST_IO_READ; +_Function_class_(FAST_IO_WRITE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - IN PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_ ULONG LockKey, + _In_ PVOID Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_WRITE *PFAST_IO_WRITE; +_Function_class_(FAST_IO_QUERY_BASIC_INFO) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_QUERY_BASIC_INFO)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - OUT PFILE_BASIC_INFORMATION Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ BOOLEAN Wait, + _Out_ PFILE_BASIC_INFORMATION Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO; +_Function_class_(FAST_IO_QUERY_STANDARD_INFO) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_QUERY_STANDARD_INFO)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - OUT PFILE_STANDARD_INFORMATION Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ BOOLEAN Wait, + _Out_ PFILE_STANDARD_INFORMATION Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO; +_Function_class_(FAST_IO_LOCK) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_LOCK)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - PEPROCESS ProcessId, - ULONG Key, - BOOLEAN FailImmediately, - BOOLEAN ExclusiveLock, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ PEPROCESS ProcessId, + _In_ ULONG Key, + _In_ BOOLEAN FailImmediately, + _In_ BOOLEAN ExclusiveLock, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_LOCK *PFAST_IO_LOCK; +_Function_class_(FAST_IO_UNLOCK_SINGLE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_UNLOCK_SINGLE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - PEPROCESS ProcessId, - ULONG Key, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ PEPROCESS ProcessId, + _In_ ULONG Key, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE; +_Function_class_(FAST_IO_UNLOCK_ALL) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_UNLOCK_ALL)( - IN struct _FILE_OBJECT *FileObject, - PEPROCESS ProcessId, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PEPROCESS ProcessId, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL; +_Function_class_(FAST_IO_UNLOCK_ALL_BY_KEY) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)( - IN struct _FILE_OBJECT *FileObject, - PVOID ProcessId, - ULONG Key, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PVOID ProcessId, + _In_ ULONG Key, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY; +_Function_class_(FAST_IO_DEVICE_CONTROL) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_DEVICE_CONTROL)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength, - IN ULONG IoControlCode, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ BOOLEAN Wait, + _In_opt_ PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_opt_ PVOID OutputBuffer, + _In_ ULONG OutputBufferLength, + _In_ ULONG IoControlCode, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL; +_Function_class_(FAST_IO_ACQUIRE_FILE) +_IRQL_requires_same_ typedef VOID (NTAPI FAST_IO_ACQUIRE_FILE)( - IN struct _FILE_OBJECT *FileObject); + _In_ struct _FILE_OBJECT *FileObject); typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE; +_Function_class_(FAST_IO_RELEASE_FILE) +_IRQL_requires_same_ typedef VOID (NTAPI FAST_IO_RELEASE_FILE)( - IN struct _FILE_OBJECT *FileObject); + _In_ struct _FILE_OBJECT *FileObject); typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE; +_Function_class_(FAST_IO_DETACH_DEVICE) +_IRQL_requires_same_ typedef VOID (NTAPI FAST_IO_DETACH_DEVICE)( - IN struct _DEVICE_OBJECT *SourceDevice, - IN struct _DEVICE_OBJECT *TargetDevice); + _In_ struct _DEVICE_OBJECT *SourceDevice, + _In_ struct _DEVICE_OBJECT *TargetDevice); typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE; +_Function_class_(FAST_IO_QUERY_NETWORK_OPEN_INFO) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer, - OUT struct _IO_STATUS_BLOCK *IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ BOOLEAN Wait, + _Out_ struct _FILE_NETWORK_OPEN_INFORMATION *Buffer, + _Out_ struct _IO_STATUS_BLOCK *IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO; +_Function_class_(FAST_IO_ACQUIRE_FOR_MOD_WRITE) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER EndingOffset, - OUT struct _ERESOURCE **ResourceToRelease, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER EndingOffset, + _Out_ struct _ERESOURCE **ResourceToRelease, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE; +_Function_class_(FAST_IO_MDL_READ) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_MDL_READ)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _Out_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ; +_Function_class_(FAST_IO_MDL_READ_COMPLETE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_MDL_READ_COMPLETE)( - IN struct _FILE_OBJECT *FileObject, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PMDL MdlChain, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE; +_Function_class_(FAST_IO_PREPARE_MDL_WRITE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_PREPARE_MDL_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _Out_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE; +_Function_class_(FAST_IO_MDL_WRITE_COMPLETE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_MDL_WRITE_COMPLETE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PMDL MdlChain, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE; +_Function_class_(FAST_IO_READ_COMPRESSED) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_READ_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _Out_ PVOID Buffer, + _Out_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _Out_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo, + _In_ ULONG CompressedDataInfoLength, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED; +_Function_class_(FAST_IO_WRITE_COMPRESSED) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_WRITE_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - IN PVOID Buffer, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _In_ PVOID Buffer, + _Out_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo, + _In_ ULONG CompressedDataInfoLength, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED; +_Function_class_(FAST_IO_MDL_READ_COMPLETE_COMPRESSED) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PMDL MdlChain, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED; +_Function_class_(FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PMDL MdlChain, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED; +_Function_class_(FAST_IO_QUERY_OPEN) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_QUERY_OPEN)( - IN struct _IRP *Irp, - OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation, - IN struct _DEVICE_OBJECT *DeviceObject); + _Inout_ struct _IRP *Irp, + _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN; +_Function_class_(FAST_IO_RELEASE_FOR_MOD_WRITE) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN struct _ERESOURCE *ResourceToRelease, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ struct _ERESOURCE *ResourceToRelease, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE; +_Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)( - IN struct _FILE_OBJECT *FileObject, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH; +_Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)( - IN struct _FILE_OBJECT *FileObject, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH; typedef struct _FAST_IO_DISPATCH { @@ -2066,10 +2161,14 @@ typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST; #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */ +_Function_class_(DRIVER_ADD_DEVICE) +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ +_When_(return>=0, _Kernel_clear_do_init_(__yes)) typedef NTSTATUS (NTAPI DRIVER_ADD_DEVICE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN struct _DEVICE_OBJECT *PhysicalDeviceObject); + _In_ struct _DRIVER_OBJECT *DriverObject, + _In_ struct _DEVICE_OBJECT *PhysicalDeviceObject); typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE; typedef struct _DRIVER_EXTENSION { @@ -2083,27 +2182,39 @@ typedef struct _DRIVER_EXTENSION { #define DRVO_LEGACY_DRIVER 0x00000002 #define DRVO_BUILTIN_DRIVER 0x00000004 +_Function_class_(DRIVER_INITIALIZE) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI DRIVER_INITIALIZE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN PUNICODE_STRING RegistryPath); + _In_ struct _DRIVER_OBJECT *DriverObject, + _In_ PUNICODE_STRING RegistryPath); typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE; +_Function_class_(DRIVER_STARTIO) +_IRQL_always_function_min_(DISPATCH_LEVEL) +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_requires_same_ typedef VOID (NTAPI DRIVER_STARTIO)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp); + _Inout_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ struct _IRP *Irp); typedef DRIVER_STARTIO *PDRIVER_STARTIO; +_Function_class_(DRIVER_UNLOAD) +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ typedef VOID (NTAPI DRIVER_UNLOAD)( - IN struct _DRIVER_OBJECT *DriverObject); + _In_ struct _DRIVER_OBJECT *DriverObject); typedef DRIVER_UNLOAD *PDRIVER_UNLOAD; +_Function_class_(DRIVER_DISPATCH) +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI DRIVER_DISPATCH)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ struct _IRP *Irp); typedef DRIVER_DISPATCH *PDRIVER_DISPATCH; typedef struct _DRIVER_OBJECT { @@ -2132,120 +2243,122 @@ typedef struct _DMA_ADAPTER { typedef VOID (NTAPI *PPUT_DMA_ADAPTER)( - IN PDMA_ADAPTER DmaAdapter); + PDMA_ADAPTER DmaAdapter); typedef PVOID (NTAPI *PALLOCATE_COMMON_BUFFER)( - IN PDMA_ADAPTER DmaAdapter, - IN ULONG Length, - OUT PPHYSICAL_ADDRESS LogicalAddress, - IN BOOLEAN CacheEnabled); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ ULONG Length, + _Out_ PPHYSICAL_ADDRESS LogicalAddress, + _In_ BOOLEAN CacheEnabled); typedef VOID (NTAPI *PFREE_COMMON_BUFFER)( - IN PDMA_ADAPTER DmaAdapter, - IN ULONG Length, - IN PHYSICAL_ADDRESS LogicalAddress, - IN PVOID VirtualAddress, - IN BOOLEAN CacheEnabled); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ ULONG Length, + _In_ PHYSICAL_ADDRESS LogicalAddress, + _In_ PVOID VirtualAddress, + _In_ BOOLEAN CacheEnabled); typedef NTSTATUS (NTAPI *PALLOCATE_ADAPTER_CHANNEL)( - IN PDMA_ADAPTER DmaAdapter, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG NumberOfMapRegisters, + _In_ PDRIVER_CONTROL ExecutionRoutine, + _In_ PVOID Context); typedef BOOLEAN (NTAPI *PFLUSH_ADAPTER_BUFFERS)( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN ULONG Length, - IN BOOLEAN WriteToDevice); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _In_ ULONG Length, + _In_ BOOLEAN WriteToDevice); typedef VOID (NTAPI *PFREE_ADAPTER_CHANNEL)( - IN PDMA_ADAPTER DmaAdapter); + _In_ PDMA_ADAPTER DmaAdapter); typedef VOID (NTAPI *PFREE_MAP_REGISTERS)( - IN PDMA_ADAPTER DmaAdapter, + _In_ PDMA_ADAPTER DmaAdapter, PVOID MapRegisterBase, ULONG NumberOfMapRegisters); typedef PHYSICAL_ADDRESS (NTAPI *PMAP_TRANSFER)( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN OUT PULONG Length, - IN BOOLEAN WriteToDevice); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _Inout_ PULONG Length, + _In_ BOOLEAN WriteToDevice); typedef ULONG (NTAPI *PGET_DMA_ALIGNMENT)( - IN PDMA_ADAPTER DmaAdapter); + _In_ PDMA_ADAPTER DmaAdapter); typedef ULONG (NTAPI *PREAD_DMA_COUNTER)( - IN PDMA_ADAPTER DmaAdapter); + _In_ PDMA_ADAPTER DmaAdapter); +_Function_class_(DRIVER_LIST_CONTROL) +_IRQL_requires_same_ typedef VOID (NTAPI DRIVER_LIST_CONTROL)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN struct _SCATTER_GATHER_LIST *ScatterGather, - IN PVOID Context); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ struct _IRP *Irp, + _In_ struct _SCATTER_GATHER_LIST *ScatterGather, + _In_ PVOID Context); typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL; typedef NTSTATUS (NTAPI *PGET_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER 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); + _In_ PDMA_ADAPTER 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); typedef VOID (NTAPI *PPUT_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER DmaAdapter, - IN PSCATTER_GATHER_LIST ScatterGather, - IN BOOLEAN WriteToDevice); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PSCATTER_GATHER_LIST ScatterGather, + _In_ BOOLEAN WriteToDevice); typedef NTSTATUS (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl OPTIONAL, - IN PVOID CurrentVa, - IN ULONG Length, - OUT PULONG ScatterGatherListSize, - OUT PULONG pNumberOfMapRegisters OPTIONAL); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PMDL Mdl OPTIONAL, + _In_ PVOID CurrentVa, + _In_ ULONG Length, + _Out_ PULONG ScatterGatherListSize, + _Out_ OPTIONAL PULONG pNumberOfMapRegisters); typedef NTSTATUS (NTAPI *PBUILD_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER 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, - IN PVOID ScatterGatherBuffer, - IN ULONG ScatterGatherLength); + _In_ PDMA_ADAPTER 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, + _In_ PVOID ScatterGatherBuffer, + _In_ ULONG ScatterGatherLength); typedef NTSTATUS (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER DmaAdapter, - IN PSCATTER_GATHER_LIST ScatterGather, - IN PMDL OriginalMdl, - OUT PMDL *TargetMdl); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PSCATTER_GATHER_LIST ScatterGather, + _In_ PMDL OriginalMdl, + _Out_ PMDL *TargetMdl); typedef struct _DMA_OPERATIONS { ULONG Size; @@ -2334,13 +2447,18 @@ typedef struct _IO_RESOURCE_REQUIREMENTS_LIST { IO_RESOURCE_LIST List[1]; } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST; +_Function_class_(DRIVER_CANCEL) +_Requires_lock_held_(_Global_cancel_spin_lock_) +_Releases_lock_(_Global_cancel_spin_lock_) +_IRQL_requires_min_(DISPATCH_LEVEL) +_IRQL_requires_(DISPATCH_LEVEL) typedef VOID (NTAPI DRIVER_CANCEL)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp); + _Inout_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ _IRQL_uses_cancel_ struct _IRP *Irp); typedef DRIVER_CANCEL *PDRIVER_CANCEL; -typedef struct _IRP { +typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP { CSHORT Type; USHORT Size; struct _MDL *MdlAddress; @@ -2406,33 +2524,41 @@ typedef enum _IO_PAGING_PRIORITY { IoPagingPriorityReserved2 } IO_PAGING_PRIORITY; +_Function_class_(IO_COMPLETION_ROUTINE) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI IO_COMPLETION_ROUTINE)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN PVOID Context); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ struct _IRP *Irp, + _In_opt_ PVOID Context); typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE; +_Function_class_(IO_DPC_ROUTINE) +_IRQL_always_function_min_(DISPATCH_LEVEL) +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_requires_same_ typedef VOID (NTAPI IO_DPC_ROUTINE)( - IN struct _KDPC *Dpc, - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN PVOID Context); + _In_ struct _KDPC *Dpc, + _In_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ struct _IRP *Irp, + _In_opt_ PVOID Context); typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE; typedef NTSTATUS (NTAPI *PMM_DLL_INITIALIZE)( - IN PUNICODE_STRING RegistryPath); + _In_ PUNICODE_STRING RegistryPath); typedef NTSTATUS (NTAPI *PMM_DLL_UNLOAD)( VOID); +_Function_class_(IO_TIMER_ROUTINE) +_IRQL_requires_same_ typedef VOID (NTAPI IO_TIMER_ROUTINE)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN PVOID Context); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_opt_ PVOID Context); typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE; typedef struct _IO_SECURITY_CONTEXT { @@ -2452,41 +2578,41 @@ typedef struct _IO_CSQ_IRP_CONTEXT { typedef VOID (NTAPI *PIO_CSQ_INSERT_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp); typedef NTSTATUS (NTAPI IO_CSQ_INSERT_IRP_EX)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp, - IN PVOID InsertContext); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp, + _In_ PVOID InsertContext); typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX; typedef VOID (NTAPI *PIO_CSQ_REMOVE_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp); typedef PIRP (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp, - IN PVOID PeekContext); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp, + _In_ PVOID PeekContext); typedef VOID (NTAPI *PIO_CSQ_ACQUIRE_LOCK)( - IN struct _IO_CSQ *Csq, - OUT PKIRQL Irql); + _In_ struct _IO_CSQ *Csq, + _Out_ PKIRQL Irql); typedef VOID (NTAPI *PIO_CSQ_RELEASE_LOCK)( - IN struct _IO_CSQ *Csq, - IN KIRQL Irql); + _In_ struct _IO_CSQ *Csq, + _In_ KIRQL Irql); typedef VOID (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp); typedef struct _IO_CSQ { ULONG Type; @@ -2517,6 +2643,8 @@ typedef BOOLEAN PVOID, PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_CONNECT_VECTOR)( PDEVICE_OBJECT, @@ -2527,20 +2655,28 @@ typedef NTSTATUS PVOID, PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_DISCONNECT_VECTOR)( PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_ENABLE_EVENT)( PDEVICE_OBJECT, PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_DISABLE_EVENT)( PDEVICE_OBJECT, PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_CLEAR_STATUS)( PDEVICE_OBJECT, @@ -2551,12 +2687,15 @@ typedef VOID PVOID, ULONG); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)( PDEVICE_OBJECT, PDEVICE_NOTIFY_CALLBACK, PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef VOID (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( PDEVICE_OBJECT, @@ -2582,6 +2721,8 @@ typedef BOOLEAN PVOID ObjectContext, PVOID ServiceContext); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_CONNECT_VECTOR2)( PVOID Context, @@ -2592,37 +2733,49 @@ typedef NTSTATUS PVOID ServiceContext, PVOID *ObjectContext); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_DISCONNECT_VECTOR2)( PVOID Context, PVOID ObjectContext); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_ENABLE_EVENT2)( PVOID Context, PVOID ObjectContext); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_DISABLE_EVENT2)( PVOID Context, PVOID ObjectContext); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_CLEAR_STATUS2)( PVOID Context, PVOID ObjectContext); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef VOID (NTAPI *PDEVICE_NOTIFY_CALLBACK2)( PVOID NotificationContext, ULONG NotifyCode); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( PVOID Context, PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, PVOID NotificationContext); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef VOID (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( PVOID Context); @@ -2986,6 +3139,8 @@ $if (_WDMDDK_) #define WMIREGISTER 0 #define WMIUPDATE 1 +_Function_class_(WMI_NOTIFICATION_CALLBACK) +_IRQL_requires_same_ typedef VOID (NTAPI FWMI_NOTIFICATION_CALLBACK)( PVOID Wnode, @@ -3679,14 +3834,18 @@ typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY { #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1 +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)( - IN OUT PVOID Context); + _Inout_ PVOID Context); typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE; +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)( - IN OUT PVOID Context); + _Inout_ PVOID Context); typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE; typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE { @@ -3703,17 +3862,17 @@ typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE { typedef ULONG (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)( - IN PVOID Context, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); + _In_ PVOID Context, + _Out_writes_bytes_(Length) 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); + _In_ PVOID Context, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Offset, + _In_ ULONG Length); typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE { USHORT Size; @@ -3727,31 +3886,35 @@ typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE { #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1 +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_MSIX_SET_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry, - IN ULONG MessageNumber); + _In_ PVOID Context, + _In_ ULONG TableEntry, + _In_ ULONG MessageNumber); typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY; +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry); + _In_ PVOID Context, + _In_ ULONG TableEntry); typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY; +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_MSIX_GET_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry, - OUT PULONG MessageNumber, - OUT PBOOLEAN Masked); + _In_ PVOID Context, + _In_ ULONG TableEntry, + _Out_ PULONG MessageNumber, + _Out_ PBOOLEAN Masked); typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY; +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_MSIX_GET_TABLE_SIZE)( - IN PVOID Context, - OUT PULONG TableSize); + _In_ PVOID Context, + _Out_ PULONG TableSize); typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE; typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE { @@ -3859,17 +4022,17 @@ typedef enum _CONFIGURATION_TYPE { 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); + _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 enum _IO_QUERY_DEVICE_DATA_FORMAT { IoQueryDeviceIdentifier = 0, @@ -3880,9 +4043,9 @@ typedef enum _IO_QUERY_DEVICE_DATA_FORMAT { typedef VOID (NTAPI *PDRIVER_REINITIALIZE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN PVOID Context OPTIONAL, - IN ULONG Count); + _In_ struct _DRIVER_OBJECT *DriverObject, + _In_opt_ PVOID Context, + _In_ ULONG Count); typedef struct _CONTROLLER_OBJECT { CSHORT Type; @@ -3951,10 +4114,15 @@ typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD { UCHAR CapabilityID; } AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD; +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGET_LOCATION_STRING)( - IN OUT PVOID Context OPTIONAL, - OUT PWCHAR *LocationStrings); + _Inout_opt_ PVOID Context, + _Outptr_ + _At_(*LocationStrings, + _When_(return == 0, __drv_allocatesMem(Mem))) + PZZWSTR *LocationStrings); typedef struct _PNP_LOCATION_INTERFACE { USHORT Size; @@ -3985,38 +4153,38 @@ typedef struct _ARBITER_CONFLICT_INFO { } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO; typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS { - IN OUT PLIST_ENTRY ArbitrationList; - IN ULONG AllocateFromCount; - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; + _Inout_ 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 { - IN OUT PLIST_ENTRY ArbitrationList; - IN ULONG AllocateFromCount; - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; + _Inout_ 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 { - IN OUT PLIST_ENTRY ArbitrationList; + _Inout_ PLIST_ENTRY ArbitrationList; } ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS; typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS { - OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources; + _Out_ PCM_PARTIAL_RESOURCE_LIST *AllocatedResources; } ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS; typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS { - IN PDEVICE_OBJECT PhysicalDeviceObject; - IN PIO_RESOURCE_DESCRIPTOR ConflictingResource; - OUT PULONG ConflictCount; - OUT PARBITER_CONFLICT_INFO *Conflicts; + _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 { - IN PLIST_ENTRY ArbitrationList; + _In_ PLIST_ENTRY ArbitrationList; } ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS; typedef struct _ARBITER_ADD_RESERVED_PARAMETERS { - IN PDEVICE_OBJECT ReserveDevice; + _In_ PDEVICE_OBJECT ReserveDevice; } ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS; typedef struct _ARBITER_PARAMETERS { @@ -4067,9 +4235,9 @@ typedef struct _ARBITER_LIST_ENTRY { typedef NTSTATUS (NTAPI *PARBITER_HANDLER)( - IN OUT PVOID Context, - IN ARBITER_ACTION Action, - IN OUT PARBITER_PARAMETERS Parameters); + _Inout_opt_ PVOID Context, + _In_ ARBITER_ACTION Action, + _Inout_ PARBITER_PARAMETERS Parameters); #define ARBITER_PARTIAL 0x00000001 @@ -4090,21 +4258,21 @@ typedef enum _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); + _Inout_opt_ PVOID Context, + _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, + _In_ RESOURCE_TRANSLATION_DIRECTION Direction, + _In_opt_ ULONG AlternativesCount, + _In_reads_opt_(AlternativesCount) 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); + _Inout_opt_ PVOID Context, + _In_ PIO_RESOURCE_DESCRIPTOR Source, + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _Out_ PULONG TargetCount, + _Out_writes_(*TargetCount) PIO_RESOURCE_DESCRIPTOR *Target); typedef struct _TRANSLATOR_INTERFACE { USHORT Size; @@ -4673,26 +4841,26 @@ typedef struct _PHYSICAL_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); + _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); + _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); + _In_ struct _BUS_HANDLER *BusHandler, + _In_ PCI_SLOT_NUMBER Slot, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Offset, + _In_ ULONG Length); #define PCI_DATA_TAG ' ICP' #define PCI_DATA_VERSION 1 @@ -4713,33 +4881,33 @@ typedef struct _PCIBUSDATA { 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); + _In_ PVOID Context, + _In_ ULONG BusOffset, + _In_ ULONG Slot, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Offset, + _In_ ULONG Length); typedef VOID (NTAPI *PCI_PIN_TO_LINE)( - IN PVOID Context, - IN PPCI_COMMON_CONFIG PciData); + _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); + _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); + _In_ PVOID Context, + _Out_ PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability); typedef VOID (NTAPI *PCI_EXPRESS_WAKE_CONTROL)( - IN PVOID Context, - IN BOOLEAN EnableWake); + _In_ PVOID Context, + _In_ BOOLEAN EnableWake); typedef struct _PCI_BUS_INTERFACE_STANDARD { USHORT Size; @@ -6740,8 +6908,8 @@ typedef struct _REMOTE_LINK_TRACKING_INFORMATION { typedef VOID (NTAPI *PDRIVER_FS_NOTIFICATION) ( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN FsActive); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN FsActive); typedef enum _FS_FILTER_SECTION_SYNC_TYPE { SyncTypeOther = 0, @@ -6796,14 +6964,14 @@ typedef struct _FS_FILTER_CALLBACK_DATA { typedef NTSTATUS (NTAPI *PFS_FILTER_CALLBACK) ( - IN PFS_FILTER_CALLBACK_DATA Data, - OUT PVOID *CompletionContext); + _In_ PFS_FILTER_CALLBACK_DATA Data, + _Out_ PVOID *CompletionContext); typedef VOID (NTAPI *PFS_FILTER_COMPLETION_CALLBACK) ( - IN PFS_FILTER_CALLBACK_DATA Data, - IN NTSTATUS OperationStatus, - IN PVOID CompletionContext); + _In_ PFS_FILTER_CALLBACK_DATA Data, + _In_ NTSTATUS OperationStatus, + _In_ PVOID CompletionContext); typedef struct _FS_FILTER_CALLBACKS { ULONG SizeOfFsFilterCallbacks; @@ -6827,8 +6995,8 @@ NTKERNELAPI NTSTATUS NTAPI FsRtlRegisterFileSystemFilterCallbacks( - IN struct _DRIVER_OBJECT *FilterDriverObject, - IN PFS_FILTER_CALLBACKS Callbacks); + _In_ struct _DRIVER_OBJECT *FilterDriverObject, + _In_ PFS_FILTER_CALLBACKS Callbacks); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_VISTA) @@ -6836,10 +7004,10 @@ NTKERNELAPI NTSTATUS NTAPI FsRtlNotifyStreamFileObject( - IN struct _FILE_OBJECT * StreamFileObject, - IN struct _DEVICE_OBJECT *DeviceObjectHint OPTIONAL, - IN FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType, - IN BOOLEAN SafeToRecurse); + _In_ struct _FILE_OBJECT * StreamFileObject, + _In_opt_ struct _DEVICE_OBJECT *DeviceObjectHint, + _In_ FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType, + _In_ BOOLEAN SafeToRecurse); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #define DO_VERIFY_VOLUME 0x00000002 diff --git a/reactos/include/xdk/kdfuncs.h b/reactos/include/xdk/kdfuncs.h index 07312583144..8143dd2da1b 100644 --- a/reactos/include/xdk/kdfuncs.h +++ b/reactos/include/xdk/kdfuncs.h @@ -6,9 +6,9 @@ NTSYSAPI ULONG NTAPI DbgPrompt( - IN PCCH Prompt, - OUT PCH Response, - IN ULONG MaximumResponseLength); + _In_z_ PCCH Prompt, + _Out_writes_bytes_(MaximumResponseLength) PCH Response, + _In_ ULONG MaximumResponseLength); $endif (_NTDDK_) $if (_WDMDDK_) @@ -17,16 +17,16 @@ $if (_WDMDDK_) ULONG __cdecl DbgPrint( - IN PCSTR Format, - IN ...); + _In_z_ _Printf_format_string_ PCSTR Format, + ...); #if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSAPI ULONG __cdecl DbgPrintReturnControlC( - IN PCCH Format, - IN ...); + _In_z_ _Printf_format_string_ PCCH Format, + ...); #endif #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -35,10 +35,10 @@ NTSYSAPI ULONG __cdecl DbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCSTR Format, - IN ...); + _In_ ULONG ComponentId, + _In_ ULONG Level, + _In_z_ _Printf_format_string_ PCSTR Format, + ...); #ifdef _VA_LIST_DEFINED @@ -46,20 +46,20 @@ NTSYSAPI ULONG NTAPI vDbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); + _In_ ULONG ComponentId, + _In_ ULONG Level, + _In_z_ 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); + _In_z_ PCCH Prefix, + _In_ ULONG ComponentId, + _In_ ULONG Level, + _In_z_ PCCH Format, + _In_ va_list ap); #endif /* _VA_LIST_DEFINED */ @@ -67,16 +67,16 @@ NTSYSAPI NTSTATUS NTAPI DbgQueryDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level); + _In_ ULONG ComponentId, + _In_ ULONG Level); NTSYSAPI NTSTATUS NTAPI DbgSetDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level, - IN BOOLEAN State); + _In_ ULONG ComponentId, + _In_ ULONG Level, + _In_ BOOLEAN State); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -84,16 +84,16 @@ DbgSetDebugFilterState( typedef VOID (*PDEBUG_PRINT_CALLBACK)( - IN PSTRING Output, - IN ULONG ComponentId, - IN ULONG Level); + _In_ PSTRING Output, + _In_ ULONG ComponentId, + _In_ ULONG Level); NTSYSAPI NTSTATUS NTAPI DbgSetDebugPrintCallback( - IN PDEBUG_PRINT_CALLBACK DebugPrintCallback, - IN BOOLEAN Enable); + _In_ PDEBUG_PRINT_CALLBACK DebugPrintCallback, + _In_ BOOLEAN Enable); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -157,11 +157,13 @@ KdEnableDebugger(VOID); #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK) #define DbgBreakPoint __debugbreak #else +__analysis_noreturn VOID NTAPI DbgBreakPoint(VOID); #endif +__analysis_noreturn NTSYSAPI VOID NTAPI @@ -182,11 +184,11 @@ NTKERNELAPI NTSTATUS NTAPI KdChangeOption( - IN KD_OPTION Option, - IN ULONG InBufferBytes OPTIONAL, - IN PVOID InBuffer, - IN ULONG OutBufferBytes OPTIONAL, - OUT PVOID OutBuffer, - OUT PULONG OutBufferNeeded OPTIONAL); + _In_ KD_OPTION Option, + _In_opt_ ULONG InBufferBytes, + _In_ PVOID InBuffer, + _In_opt_ ULONG OutBufferBytes, + _Out_ PVOID OutBuffer, + _Out_opt_ PULONG OutBufferNeeded); #endif $endif (_WDMDDK_) diff --git a/reactos/include/xdk/kdtypes.h b/reactos/include/xdk/kdtypes.h index 0b7fe7fd35b..1c7efbcc405 100644 --- a/reactos/include/xdk/kdtypes.h +++ b/reactos/include/xdk/kdtypes.h @@ -36,59 +36,58 @@ typedef struct _DEBUG_DEVICE_DESCRIPTOR { typedef NTSTATUS (NTAPI *pKdSetupPciDeviceForDebugging)( - IN PVOID LoaderBlock OPTIONAL, - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); + _In_opt_ PVOID LoaderBlock, + _Inout_ PDEBUG_DEVICE_DESCRIPTOR PciDevice); typedef NTSTATUS (NTAPI *pKdReleasePciDeviceForDebugging)( - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); + _Inout_ PDEBUG_DEVICE_DESCRIPTOR PciDevice); typedef PVOID (NTAPI *pKdGetAcpiTablePhase0)( - IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN ULONG Signature); + _In_ struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + _In_ ULONG Signature); typedef VOID -(NTAPI *pKdCheckPowerButton)( - VOID); +(NTAPI *pKdCheckPowerButton)(VOID); #if (NTDDI_VERSION >= NTDDI_VISTA) typedef PVOID (NTAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages, - IN BOOLEAN FlushCurrentTLB); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ ULONG NumberPages, + _In_ BOOLEAN FlushCurrentTLB); typedef VOID (NTAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages, - IN BOOLEAN FlushCurrentTLB); + _In_ PVOID VirtualAddress, + _In_ ULONG NumberPages, + _In_ BOOLEAN FlushCurrentTLB); #else typedef PVOID (NTAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ ULONG NumberPages); typedef VOID (NTAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages); + _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); + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _Out_writes_bytes_(Length) 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); + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Offset, + _In_ ULONG Length); $endif (_NTDDK_) diff --git a/reactos/include/xdk/kefuncs.h b/reactos/include/xdk/kefuncs.h index 96b012bbd33..9b36804a4fd 100644 --- a/reactos/include/xdk/kefuncs.h +++ b/reactos/include/xdk/kefuncs.h @@ -6,59 +6,66 @@ NTKERNELAPI VOID NTAPI KeInitializeEvent( - OUT PRKEVENT Event, - IN EVENT_TYPE Type, - IN BOOLEAN State); + _Out_ PRKEVENT Event, + _In_ EVENT_TYPE Type, + _In_ BOOLEAN State); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeClearEvent( - IN OUT PRKEVENT Event); + _Inout_ PRKEVENT Event); $endif (_WDMDDK_) $if (_NTDDK_) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KeInvalidateRangeAllCaches( - IN PVOID BaseAddress, - IN ULONG Length); + _In_ PVOID BaseAddress, + _In_ ULONG Length); $endif (_NTDDK_) $if (_NTIFS_) NTSTATUS NTAPI KeGetProcessorNumberFromIndex( - IN ULONG ProcIndex, - OUT PPROCESSOR_NUMBER ProcNumber); + _In_ ULONG ProcIndex, + _Out_ PPROCESSOR_NUMBER ProcNumber); ULONG NTAPI KeGetProcessorIndexFromNumber( - IN PPROCESSOR_NUMBER ProcNumber); + _In_ PPROCESSOR_NUMBER ProcNumber); $endif (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WIN2K) $if (_WDMDDK_) #if defined(_NTDDK_) || defined(_NTIFS_) +_Maybe_raises_SEH_exception_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ProbeForRead( - IN CONST VOID *Address, /* CONST is added */ - IN SIZE_T Length, - IN ULONG Alignment); + __in_data_source(USER_MODE) _In_reads_bytes_(Length) CONST VOID *Address, /* CONST is added */ + _In_ SIZE_T Length, + _In_ ULONG Alignment); #endif /* defined(_NTDDK_) || defined(_NTIFS_) */ +_Maybe_raises_SEH_exception_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ProbeForWrite( - IN PVOID Address, - IN SIZE_T Length, - IN ULONG Alignment); + __in_data_source(USER_MODE) _Inout_updates_bytes_(Length) PVOID Address, + _In_ SIZE_T Length, + _In_ ULONG Alignment); $endif (_WDMDDK_) $if (_NTDDK_) @@ -66,29 +73,36 @@ NTKERNELAPI VOID NTAPI KeSetImportanceDpc( - IN OUT PRKDPC Dpc, - IN KDPC_IMPORTANCE Importance); + _Inout_ PRKDPC Dpc, + _In_ KDPC_IMPORTANCE Importance); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KePulseEvent( - IN OUT PRKEVENT Event, - IN KPRIORITY Increment, - IN BOOLEAN Wait); + _Inout_ PRKEVENT Event, + _In_ KPRIORITY Increment, + _In_ BOOLEAN Wait); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeSetBasePriorityThread( - IN OUT PRKTHREAD Thread, - IN LONG Increment); + _Inout_ PRKTHREAD Thread, + _In_ LONG Increment); +_Acquires_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeEnterCriticalRegion(VOID); +_Releases_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI @@ -99,30 +113,34 @@ DECLSPEC_NORETURN VOID NTAPI KeBugCheck( - IN ULONG BugCheckCode); + _In_ ULONG BugCheckCode); $endif(_NTDDK_) $if (_WDMDDK_ || _NTDDK_) #if defined(SINGLE_GROUP_LEGACY_API) $endif (_WDMDDK_ || _NTDDK_) $if (_WDMDDK_) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeRevertToUserAffinityThread(VOID); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeSetSystemAffinityThread( - IN KAFFINITY Affinity); + _In_ KAFFINITY Affinity); NTKERNELAPI VOID NTAPI KeSetTargetProcessorDpc( - IN OUT PRKDPC Dpc, - IN CCHAR Number); + _Inout_ PRKDPC Dpc, + _In_ CCHAR Number); NTKERNELAPI KAFFINITY @@ -135,8 +153,8 @@ NTKERNELAPI VOID NTAPI KeSetTargetProcessorDpc( - IN OUT PRKDPC Dpc, - IN CCHAR Number); + _Inout_ PRKDPC Dpc, + _In_ CCHAR Number); NTKERNELAPI KAFFINITY @@ -158,37 +176,51 @@ NTKERNELAPI VOID NTAPI KeQuerySystemTime( - OUT PLARGE_INTEGER CurrentTime); + _Out_ PLARGE_INTEGER CurrentTime); #endif /* !_M_AMD64 */ #if !defined(_X86_) && !defined(_M_ARM) +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) NTKERNELAPI KIRQL NTAPI KeAcquireSpinLockRaiseToDpc( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #define KeAcquireSpinLock(SpinLock, OldIrql) \ *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock) +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeAcquireSpinLockAtDpcLevel( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeReleaseSpinLock( - IN OUT PKSPIN_LOCK SpinLock, - IN KIRQL NewIrql); + _Inout_ PKSPIN_LOCK SpinLock, + _In_ _IRQL_restores_ KIRQL NewIrql); +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeReleaseSpinLockFromDpcLevel( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #endif /* !_X86_ */ #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK)) @@ -196,11 +228,11 @@ NTKERNELAPI VOID NTAPI KeInitializeSpinLock( - IN PKSPIN_LOCK SpinLock); + _Out_ PKSPIN_LOCK SpinLock); #else FORCEINLINE VOID -KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock) +KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock) { /* Clear the lock */ *SpinLock = 0; @@ -212,102 +244,116 @@ NTKERNELAPI VOID NTAPI KeBugCheckEx( - IN ULONG BugCheckCode, - IN ULONG_PTR BugCheckParameter1, - IN ULONG_PTR BugCheckParameter2, - IN ULONG_PTR BugCheckParameter3, - IN ULONG_PTR BugCheckParameter4); + _In_ ULONG BugCheckCode, + _In_ ULONG_PTR BugCheckParameter1, + _In_ ULONG_PTR BugCheckParameter2, + _In_ ULONG_PTR BugCheckParameter3, + _In_ ULONG_PTR BugCheckParameter4); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeCancelTimer( - IN OUT PKTIMER); + _Inout_ PKTIMER); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeDelayExecutionThread( - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Interval); + _In_ KPROCESSOR_MODE WaitMode, + _In_ BOOLEAN Alertable, + _In_ PLARGE_INTEGER Interval); +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI KeDeregisterBugCheckCallback( - IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord); + _Inout_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord); +_Acquires_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeEnterCriticalRegion(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeInitializeDeviceQueue( - OUT PKDEVICE_QUEUE DeviceQueue); + _Out_ PKDEVICE_QUEUE DeviceQueue); NTKERNELAPI VOID NTAPI KeInitializeDpc( - OUT PRKDPC Dpc, - IN PKDEFERRED_ROUTINE DeferredRoutine, - IN PVOID DeferredContext OPTIONAL); + _Out_ __drv_aliasesMem PRKDPC Dpc, + _In_ PKDEFERRED_ROUTINE DeferredRoutine, + _In_opt_ __drv_aliasesMem PVOID DeferredContext); NTKERNELAPI VOID NTAPI KeInitializeMutex( - OUT PRKMUTEX Mutex, - IN ULONG Level); + _Out_ PRKMUTEX Mutex, + _In_ ULONG Level); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI KeInitializeSemaphore( - OUT PRKSEMAPHORE Semaphore, - IN LONG Count, - IN LONG Limit); + _Out_ PRKSEMAPHORE Semaphore, + _In_ LONG Count, + _In_ LONG Limit); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeInitializeTimer( - OUT PKTIMER Timer); + _Out_ PKTIMER Timer); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeInitializeTimerEx( - OUT PKTIMER Timer, - IN TIMER_TYPE Type); + _Out_ PKTIMER Timer, + _In_ TIMER_TYPE Type); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeInsertByKeyDeviceQueue( - IN OUT PKDEVICE_QUEUE DeviceQueue, - IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, - IN ULONG SortKey); + _Inout_ PKDEVICE_QUEUE DeviceQueue, + _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, + _In_ ULONG SortKey); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeInsertDeviceQueue( - IN OUT PKDEVICE_QUEUE DeviceQueue, - IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); + _Inout_ PKDEVICE_QUEUE DeviceQueue, + _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); NTKERNELAPI BOOLEAN NTAPI KeInsertQueueDpc( - IN OUT PRKDPC Dpc, - IN PVOID SystemArgument1 OPTIONAL, - IN PVOID SystemArgument2 OPTIONAL); + _Inout_ PRKDPC Dpc, + _In_opt_ PVOID SystemArgument1, + _In_opt_ PVOID SystemArgument2); +_Releases_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI @@ -317,178 +363,206 @@ NTHALAPI LARGE_INTEGER NTAPI KeQueryPerformanceCounter( - OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL); + _Out_opt_ PLARGE_INTEGER PerformanceFrequency); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI KPRIORITY NTAPI KeQueryPriorityThread( - IN PRKTHREAD Thread); + _In_ PRKTHREAD Thread); NTKERNELAPI ULONG NTAPI KeQueryTimeIncrement(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeReadStateEvent( - IN PRKEVENT Event); + _In_ PRKEVENT Event); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeReadStateMutex( - IN PRKMUTEX Mutex); + _In_ PRKMUTEX Mutex); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeReadStateSemaphore( - IN PRKSEMAPHORE Semaphore); + _In_ PRKSEMAPHORE Semaphore); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeReadStateTimer( - IN PKTIMER Timer); + _In_ PKTIMER Timer); +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI KeRegisterBugCheckCallback( - OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord, - IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, - IN PVOID Buffer, - IN ULONG Length, - IN PUCHAR Component); + _Out_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord, + _In_ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, + _In_reads_bytes_opt_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_ PUCHAR Component); +_When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(Wait==1, _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI LONG NTAPI KeReleaseMutex( - IN OUT PRKMUTEX Mutex, - IN BOOLEAN Wait); + _Inout_ PRKMUTEX Mutex, + _In_ BOOLEAN Wait); +_When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(Wait==1, _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI LONG NTAPI KeReleaseSemaphore( - IN OUT PRKSEMAPHORE Semaphore, - IN KPRIORITY Increment, - IN LONG Adjustment, - IN BOOLEAN Wait); + _Inout_ PRKSEMAPHORE Semaphore, + _In_ KPRIORITY Increment, + _In_ LONG Adjustment, + _In_ _Literal_ BOOLEAN Wait); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI PKDEVICE_QUEUE_ENTRY NTAPI KeRemoveByKeyDeviceQueue( - IN OUT PKDEVICE_QUEUE DeviceQueue, - IN ULONG SortKey); + _Inout_ PKDEVICE_QUEUE DeviceQueue, + _In_ ULONG SortKey); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI PKDEVICE_QUEUE_ENTRY NTAPI KeRemoveDeviceQueue( - IN OUT PKDEVICE_QUEUE DeviceQueue); + _Inout_ PKDEVICE_QUEUE DeviceQueue); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeRemoveEntryDeviceQueue( - IN OUT PKDEVICE_QUEUE DeviceQueue, - IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); + _Inout_ PKDEVICE_QUEUE DeviceQueue, + _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); +_IRQL_requires_max_(HIGH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeRemoveQueueDpc( - IN OUT PRKDPC Dpc); + _Inout_ PRKDPC Dpc); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeResetEvent( - IN OUT PRKEVENT Event); + _Inout_ PRKEVENT Event); +_When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(Wait==1, _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI LONG NTAPI KeSetEvent( - IN OUT PRKEVENT Event, - IN KPRIORITY Increment, - IN BOOLEAN Wait); + _Inout_ PRKEVENT Event, + _In_ KPRIORITY Increment, + _In_ _Literal_ BOOLEAN Wait); NTKERNELAPI VOID NTAPI KeSetImportanceDpc( - IN OUT PRKDPC Dpc, - IN KDPC_IMPORTANCE Importance); + _Inout_ PRKDPC Dpc, + _In_ KDPC_IMPORTANCE Importance); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI KPRIORITY NTAPI KeSetPriorityThread( - IN OUT PKTHREAD Thread, - IN KPRIORITY Priority); + _Inout_ PKTHREAD Thread, + _In_ KPRIORITY Priority); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeSetTimer( - IN OUT PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN PKDPC Dpc OPTIONAL); + _Inout_ PKTIMER Timer, + _In_ LARGE_INTEGER DueTime, + _In_opt_ PKDPC Dpc); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeSetTimerEx( - IN OUT PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN LONG Period OPTIONAL, - IN PKDPC Dpc OPTIONAL); + _Inout_ PKTIMER Timer, + _In_ LARGE_INTEGER DueTime, + _In_ LONG Period OPTIONAL, + _In_opt_ PKDPC Dpc); NTHALAPI VOID NTAPI KeStallExecutionProcessor( - IN ULONG MicroSeconds); + _In_ ULONG MicroSeconds); +_IRQL_requires_max_(HIGH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeSynchronizeExecution( - IN OUT PKINTERRUPT Interrupt, - IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, - IN PVOID SynchronizeContext OPTIONAL); + _Inout_ PKINTERRUPT Interrupt, + _In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, + _In_opt_ __drv_aliasesMem PVOID SynchronizeContext); +_IRQL_requires_min_(PASSIVE_LEVEL) +_When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL)) +_When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL)) NTKERNELAPI NTSTATUS NTAPI KeWaitForMultipleObjects( - IN ULONG Count, - IN PVOID Object[], - IN WAIT_TYPE WaitType, - IN KWAIT_REASON WaitReason, - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL, - OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL); + _In_ ULONG Count, + _In_reads_(Count) PVOID Object[], + _In_ __drv_strictTypeMatch(__drv_typeConst) WAIT_TYPE WaitType, + _In_ __drv_strictTypeMatch(__drv_typeCond) KWAIT_REASON WaitReason, + _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE WaitMode, + _In_ BOOLEAN Alertable, + _In_opt_ PLARGE_INTEGER Timeout, + _Out_opt_ PKWAIT_BLOCK WaitBlockArray); #define KeWaitForMutexObject KeWaitForSingleObject +_IRQL_requires_min_(PASSIVE_LEVEL) +_When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL)) +_When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL)) NTKERNELAPI NTSTATUS NTAPI KeWaitForSingleObject( - IN PVOID Object, - IN KWAIT_REASON WaitReason, - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); + _In_ _Points_to_data_ PVOID Object, + _In_ __drv_strictTypeMatch(__drv_typeCond) KWAIT_REASON WaitReason, + _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE WaitMode, + _In_ BOOLEAN Alertable, + _In_opt_ PLARGE_INTEGER Timeout); $endif (_WDMDDK_) $if (_NTIFS_) @@ -496,114 +570,140 @@ NTKERNELAPI VOID NTAPI KeInitializeMutant( - OUT PRKMUTANT Mutant, - IN BOOLEAN InitialOwner); + _Out_ PRKMUTANT Mutant, + _In_ BOOLEAN InitialOwner); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeReadStateMutant( - IN PRKMUTANT Mutant); + _In_ PRKMUTANT Mutant); +_When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(Wait==1, _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI LONG NTAPI KeReleaseMutant( - IN OUT PRKMUTANT Mutant, - IN KPRIORITY Increment, - IN BOOLEAN Abandoned, - IN BOOLEAN Wait); + _Inout_ PRKMUTANT Mutant, + _In_ KPRIORITY Increment, + _In_ BOOLEAN Abandoned, + _In_ BOOLEAN Wait); NTKERNELAPI VOID NTAPI KeInitializeQueue( - OUT PRKQUEUE Queue, - IN ULONG Count); + _Out_ PRKQUEUE Queue, + _In_ ULONG Count); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeReadStateQueue( - IN PRKQUEUE Queue); + _In_ PRKQUEUE Queue); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeInsertQueue( - IN OUT PRKQUEUE Queue, - IN OUT PLIST_ENTRY Entry); + _Inout_ PRKQUEUE Queue, + _Inout_ PLIST_ENTRY Entry); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeInsertHeadQueue( - IN OUT PRKQUEUE Queue, - IN OUT PLIST_ENTRY Entry); + _Inout_ PRKQUEUE Queue, + _Inout_ PLIST_ENTRY Entry); +_IRQL_requires_min_(PASSIVE_LEVEL) +_When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL)) +_When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL)) NTKERNELAPI PLIST_ENTRY NTAPI KeRemoveQueue( - IN OUT PRKQUEUE Queue, - IN KPROCESSOR_MODE WaitMode, - IN PLARGE_INTEGER Timeout OPTIONAL); + _Inout_ PRKQUEUE Queue, + _In_ KPROCESSOR_MODE WaitMode, + _In_opt_ PLARGE_INTEGER Timeout); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeAttachProcess( - IN OUT PKPROCESS Process); + _Inout_ PKPROCESS Process); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI -KeDetachProcess( - VOID); +KeDetachProcess(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PLIST_ENTRY NTAPI KeRundownQueue( - IN OUT PRKQUEUE Queue); + _Inout_ PRKQUEUE Queue); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeStackAttachProcess( - IN OUT PKPROCESS Process, - OUT PKAPC_STATE ApcState); + _Inout_ PKPROCESS Process, + _Out_ PKAPC_STATE ApcState); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeUnstackDetachProcess( - IN PKAPC_STATE ApcState); + _In_ PKAPC_STATE ApcState); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI UCHAR NTAPI KeSetIdealProcessorThread( - IN OUT PKTHREAD Thread, - IN UCHAR Processor); + _Inout_ PKTHREAD Thread, + _In_ UCHAR Processor); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeSetKernelStackSwapEnable( - IN BOOLEAN Enable); + _In_ BOOLEAN Enable); #if defined(_X86_) +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_raises_(SYNCH_LEVEL) +_IRQL_saves_ NTHALAPI KIRQL FASTCALL KeAcquireSpinLockRaiseToSynch( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #else +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_raises_(SYNCH_LEVEL) +_IRQL_saves_ NTKERNELAPI KIRQL KeAcquireSpinLockRaiseToSynch( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #endif $endif (_NTIFS_) @@ -612,26 +712,43 @@ $endif (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WINXP) $if (_WDMDDK_) +_Requires_lock_not_held_(*LockHandle) +_Acquires_lock_(*LockHandle) +_Post_same_lock_(*SpinLock, *LockHandle) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_global_(QueuedSpinLock,LockHandle) +_IRQL_raises_(DISPATCH_LEVEL) _DECL_HAL_KE_IMPORT VOID FASTCALL KeAcquireInStackQueuedSpinLock( - IN OUT PKSPIN_LOCK SpinLock, - OUT PKLOCK_QUEUE_HANDLE LockHandle); + _Inout_ PKSPIN_LOCK SpinLock, + _Out_ PKLOCK_QUEUE_HANDLE LockHandle); +_Requires_lock_not_held_(*LockHandle) +_Acquires_lock_(*LockHandle) +_Post_same_lock_(*SpinLock, *LockHandle) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KeAcquireInStackQueuedSpinLockAtDpcLevel( - IN OUT PKSPIN_LOCK SpinLock, - OUT PKLOCK_QUEUE_HANDLE LockHandle); + _Inout_ PKSPIN_LOCK SpinLock, + _Out_ PKLOCK_QUEUE_HANDLE LockHandle); +_Requires_lock_not_held_(*Interrupt->ActualLock) +_Acquires_lock_(*Interrupt->ActualLock) +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(HIGH_LEVEL) NTKERNELAPI KIRQL NTAPI KeAcquireInterruptSpinLock( - IN OUT PKINTERRUPT Interrupt); + _Inout_ PKINTERRUPT Interrupt); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI @@ -642,40 +759,54 @@ ULONG NTAPI KeGetRecommendedSharedDataAlignment(VOID); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI ULONG NTAPI KeQueryRuntimeThread( - IN PKTHREAD Thread, - OUT PULONG UserTime); + _In_ PKTHREAD Thread, + _Out_ PULONG UserTime); +_Requires_lock_held_(*LockHandle) +_Releases_lock_(*LockHandle) +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KeReleaseInStackQueuedSpinLockFromDpcLevel( - IN PKLOCK_QUEUE_HANDLE LockHandle); + _In_ PKLOCK_QUEUE_HANDLE LockHandle); +_Requires_lock_held_(*Interrupt->ActualLock) +_Releases_lock_(*Interrupt->ActualLock) +_IRQL_requires_(HIGH_LEVEL) NTKERNELAPI VOID NTAPI KeReleaseInterruptSpinLock( - IN OUT PKINTERRUPT Interrupt, - IN KIRQL OldIrql); + _Inout_ PKINTERRUPT Interrupt, + _In_ _IRQL_restores_ KIRQL OldIrql); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI PKDEVICE_QUEUE_ENTRY NTAPI KeRemoveByKeyDeviceQueueIfBusy( - IN OUT PKDEVICE_QUEUE DeviceQueue, - IN ULONG SortKey); + _Inout_ PKDEVICE_QUEUE DeviceQueue, + _In_ ULONG SortKey); +_Requires_lock_held_(*LockHandle) +_Releases_lock_(*LockHandle) +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_restores_global_(QueuedSpinLock,LockHandle) _DECL_HAL_KE_IMPORT VOID FASTCALL KeReleaseInStackQueuedSpinLock( - IN PKLOCK_QUEUE_HANDLE LockHandle); + _In_ PKLOCK_QUEUE_HANDLE LockHandle); $endif (_WDMDDK_) $if (_NTDDK_) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI @@ -683,25 +814,32 @@ KeAreApcsDisabled(VOID); $endif (_NTDDK_) $if (_NTIFS_) +_Requires_lock_not_held_(Number) +_Acquires_lock_(Number) +_IRQL_raises_(DISPATCH_LEVEL) _DECL_HAL_KE_IMPORT KIRQL FASTCALL KeAcquireQueuedSpinLock( - IN OUT KSPIN_LOCK_QUEUE_NUMBER Number); + _In_ KSPIN_LOCK_QUEUE_NUMBER Number); +_Requires_lock_held_(Number) +_Releases_lock_(Number) _DECL_HAL_KE_IMPORT VOID FASTCALL KeReleaseQueuedSpinLock( - IN OUT KSPIN_LOCK_QUEUE_NUMBER Number, - IN KIRQL OldIrql); + _In_ KSPIN_LOCK_QUEUE_NUMBER Number, + _In_ KIRQL OldIrql); +_Must_inspect_result_ +_Post_satisfies_(return == 1 || return == 0) _DECL_HAL_KE_IMPORT LOGICAL FASTCALL KeTryToAcquireQueuedSpinLock( - IN KSPIN_LOCK_QUEUE_NUMBER Number, - OUT PKIRQL OldIrql); + _In_ KSPIN_LOCK_QUEUE_NUMBER Number, + _Out_ _At_(*OldIrql, _IRQL_saves_) PKIRQL OldIrql); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -709,24 +847,27 @@ $endif (_NTIFS_) $if (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WINXPSP1) +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI KeDeregisterBugCheckReasonCallback( - IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord); + _Inout_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord); +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI KeRegisterBugCheckReasonCallback( - OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, - IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, - IN KBUGCHECK_CALLBACK_REASON Reason, - IN PUCHAR Component); + _Out_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, + _In_ PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, + _In_ KBUGCHECK_CALLBACK_REASON Reason, + _In_ PUCHAR Component); #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */ #if (NTDDI_VERSION >= NTDDI_WINXPSP2) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI @@ -738,52 +879,64 @@ $if (_WDMDDK_ || _NTDDK_) $endif (_WDMDDK_ || _NTDDK_) $if (_WDMDDK_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI KeRegisterNmiCallback( - IN PNMI_CALLBACK CallbackRoutine, - IN PVOID Context OPTIONAL); + _In_ PNMI_CALLBACK CallbackRoutine, + _In_opt_ PVOID Context); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeDeregisterNmiCallback( - IN PVOID Handle); + _In_ PVOID Handle); NTKERNELAPI VOID NTAPI KeInitializeThreadedDpc( - OUT PRKDPC Dpc, - IN PKDEFERRED_ROUTINE DeferredRoutine, - IN PVOID DeferredContext OPTIONAL); + _Out_ PRKDPC Dpc, + _In_ PKDEFERRED_ROUTINE DeferredRoutine, + _In_opt_ PVOID DeferredContext); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(IPI_LEVEL-1) NTKERNELAPI ULONG_PTR NTAPI KeIpiGenericCall( - IN PKIPI_BROADCAST_WORKER BroadcastFunction, - IN ULONG_PTR Context); + _In_ PKIPI_BROADCAST_WORKER BroadcastFunction, + _In_ ULONG_PTR Context); +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ NTKERNELAPI KIRQL FASTCALL KeAcquireSpinLockForDpc( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KeReleaseSpinLockForDpc( - IN OUT PKSPIN_LOCK SpinLock, - IN KIRQL OldIrql); + _Inout_ PKSPIN_LOCK SpinLock, + _In_ _IRQL_restores_ KIRQL OldIrql); +_Must_inspect_result_ NTKERNELAPI BOOLEAN FASTCALL KeTestSpinLock( - IN PKSPIN_LOCK SpinLock); + _In_ PKSPIN_LOCK SpinLock); $endif (_WDMDDK_) $if (_NTDDK_) @@ -800,77 +953,117 @@ $if (_WDMDDK_ || _NTDDK_) $endif (_WDMDDK_ || _NTDDK_) $if (_WDMDDK_) +_Must_inspect_result_ +_IRQL_requires_min_(DISPATCH_LEVEL) +_Post_satisfies_(return == 1 || return == 0) NTKERNELAPI BOOLEAN FASTCALL KeTryToAcquireSpinLockAtDpcLevel( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ _Requires_lock_not_held_(*_Curr_) + _When_(return!=0, _Acquires_lock_(*_Curr_)) + PKSPIN_LOCK SpinLock); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeAreAllApcsDisabled(VOID); +_Acquires_lock_(_Global_critical_region_) +_Requires_lock_not_held_(*Mutex) +_Acquires_lock_(*Mutex) +_IRQL_requires_max_(APC_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) NTKERNELAPI VOID FASTCALL KeAcquireGuardedMutex( - IN OUT PKGUARDED_MUTEX GuardedMutex); + _Inout_ PKGUARDED_MUTEX GuardedMutex); +_Requires_lock_not_held_(*FastMutex) +_Acquires_lock_(*FastMutex) +_IRQL_requires_max_(APC_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) NTKERNELAPI VOID FASTCALL KeAcquireGuardedMutexUnsafe( - IN OUT PKGUARDED_MUTEX GuardedMutex); + _Inout_ PKGUARDED_MUTEX GuardedMutex); +_Acquires_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeEnterGuardedRegion(VOID); +_Releases_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeLeaveGuardedRegion(VOID); +_IRQL_requires_max_(APC_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) NTKERNELAPI VOID FASTCALL KeInitializeGuardedMutex( - OUT PKGUARDED_MUTEX GuardedMutex); + _Out_ PKGUARDED_MUTEX GuardedMutex); +_Requires_lock_held_(*FastMutex) +_Releases_lock_(*FastMutex) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID FASTCALL KeReleaseGuardedMutexUnsafe( - IN OUT PKGUARDED_MUTEX GuardedMutex); + _Inout_ PKGUARDED_MUTEX GuardedMutex); +_Releases_lock_(_Global_critical_region_) +_Requires_lock_held_(*Mutex) +_Releases_lock_(*Mutex) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID FASTCALL KeReleaseGuardedMutex( - IN OUT PKGUARDED_MUTEX GuardedMutex); + _Inout_ PKGUARDED_MUTEX GuardedMutex); +_Must_inspect_result_ +_Success_(return != FALSE) +_IRQL_requires_max_(APC_LEVEL) +_Post_satisfies_(return == 1 || return == 0) NTKERNELAPI BOOLEAN FASTCALL KeTryToAcquireGuardedMutex( - IN OUT PKGUARDED_MUTEX GuardedMutex); + _When_ (return, _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_)) _Acquires_lock_(_Global_critical_region_) + _Inout_ PKGUARDED_MUTEX GuardedMutex); $endif (_WDMDDK_) $if (_NTDDK_) +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeExpandKernelStackAndCallout( - IN PEXPAND_STACK_CALLOUT Callout, - IN PVOID Parameter OPTIONAL, - IN SIZE_T Size); + _In_ PEXPAND_STACK_CALLOUT Callout, + _In_opt_ PVOID Parameter, + _In_ SIZE_T Size); +_Acquires_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeEnterGuardedRegion(VOID); +_Releases_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI @@ -882,47 +1075,61 @@ $endif (_WDMDDK_ || _NTDDK_) #if (NTDDI_VERSION >= NTDDI_VISTA) $if (_WDMDDK_) +_Requires_lock_not_held_(*LockHandle) +_Acquires_lock_(*LockHandle) +_Post_same_lock_(*SpinLock, *LockHandle) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_global_(QueuedSpinLock,LockHandle) NTKERNELAPI VOID FASTCALL KeAcquireInStackQueuedSpinLockForDpc( - IN OUT PKSPIN_LOCK SpinLock, - OUT PKLOCK_QUEUE_HANDLE LockHandle); + _Inout_ PKSPIN_LOCK SpinLock, + _Out_ PKLOCK_QUEUE_HANDLE LockHandle); +_Requires_lock_held_(*LockHandle) +_Releases_lock_(*LockHandle) +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_restores_global_(QueuedSpinLock,LockHandle) NTKERNELAPI VOID FASTCALL KeReleaseInStackQueuedSpinLockForDpc( - IN PKLOCK_QUEUE_HANDLE LockHandle); + _In_ PKLOCK_QUEUE_HANDLE LockHandle); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeQueryDpcWatchdogInformation( - OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation); + _Out_ PKDPC_WATCHDOG_INFORMATION WatchdogInformation); $endif (_WDMDDK_) $if (_WDMDDK_ || _NTDDK_) #if defined(SINGLE_GROUP_LEGACY_API) $endif (_WDMDDK_ || _NTDDK_) $if (_WDMDDK_) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI KAFFINITY NTAPI KeSetSystemAffinityThreadEx( - IN KAFFINITY Affinity); + _In_ KAFFINITY Affinity); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeRevertToUserAffinityThreadEx( - IN KAFFINITY Affinity); + _In_ KAFFINITY Affinity); NTKERNELAPI ULONG NTAPI KeQueryActiveProcessorCount( - OUT PKAFFINITY ActiveProcessors OPTIONAL); + _Out_opt_ PKAFFINITY ActiveProcessors); NTKERNELAPI ULONG @@ -934,7 +1141,7 @@ NTKERNELAPI ULONG NTAPI KeQueryActiveProcessorCount( - OUT PKAFFINITY ActiveProcessors OPTIONAL); + _Out_opt_ PKAFFINITY ActiveProcessors); NTKERNELAPI ULONG @@ -945,22 +1152,26 @@ $if (_WDMDDK_ || _NTDDK_) #endif /* SINGLE_GROUP_LEGACY_API */ $endif (_WDMDDK_ || _NTDDK_) $if (_NTIFS_) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID KeQueryOwnerMutant( - IN PKMUTANT Mutant, - OUT PCLIENT_ID ClientId); + _In_ PKMUTANT Mutant, + _Out_ PCLIENT_ID ClientId); +_IRQL_requires_min_(PASSIVE_LEVEL) +_When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL)) +_When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL)) NTKERNELAPI ULONG NTAPI KeRemoveQueueEx( - IN OUT PKQUEUE Queue, - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL, - OUT PLIST_ENTRY *EntryArray, - IN ULONG Count); + _Inout_ PKQUEUE Queue, + _In_ KPROCESSOR_MODE WaitMode, + _In_ BOOLEAN Alertable, + _In_opt_ PLARGE_INTEGER Timeout, + _Out_writes_to_(Count, return) PLIST_ENTRY *EntryArray, + _In_ ULONG Count); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -968,17 +1179,19 @@ $endif (_NTIFS_) $if (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WS08) +_IRQL_requires_max_(APC_LEVEL) PVOID NTAPI KeRegisterProcessorChangeCallback( - IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction, - IN PVOID CallbackContext OPTIONAL, - IN ULONG Flags); + _In_ PPROCESSOR_CALLBACK_FUNCTION CallbackFunction, + _In_opt_ PVOID CallbackContext, + _In_ ULONG Flags); +_IRQL_requires_max_(APC_LEVEL) VOID NTAPI KeDeregisterProcessorChangeCallback( - IN PVOID CallbackHandle); + _In_ PVOID CallbackHandle); #endif /* (NTDDI_VERSION >= NTDDI_WS08) */ $endif (_WDMDDK_) @@ -987,47 +1200,59 @@ $if (_WDMDDK_ || _NTDDK_) $endif (_WDMDDK_ || _NTDDK_) $if (_WDMDDK_) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_same_ ULONG64 NTAPI KeQueryTotalCycleTimeProcess( - IN OUT PKPROCESS Process, - OUT PULONG64 CycleTimeStamp); + _Inout_ PKPROCESS Process, + _Out_ PULONG64 CycleTimeStamp); +_IRQL_requires_max_(APC_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_same_ ULONG64 NTAPI KeQueryTotalCycleTimeThread( - IN OUT PKTHREAD Thread, - OUT PULONG64 CycleTimeStamp); + _Inout_ PKTHREAD Thread, + _Out_ PULONG64 CycleTimeStamp); +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI KeSetTargetProcessorDpcEx( - IN OUT PKDPC Dpc, - IN PPROCESSOR_NUMBER ProcNumber); + _Inout_ PKDPC Dpc, + _In_ PPROCESSOR_NUMBER ProcNumber); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeSetSystemGroupAffinityThread( - IN PGROUP_AFFINITY Affinity, - OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL); + _In_ PGROUP_AFFINITY Affinity, + _Out_opt_ PGROUP_AFFINITY PreviousAffinity); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeRevertToUserGroupAffinityThread( - IN PGROUP_AFFINITY PreviousAffinity); + _In_ PGROUP_AFFINITY PreviousAffinity); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeSetCoalescableTimer( - IN OUT PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN ULONG Period, - IN ULONG TolerableDelay, - IN PKDPC Dpc OPTIONAL); + _Inout_ PKTIMER Timer, + _In_ LARGE_INTEGER DueTime, + _In_ ULONG Period, + _In_ ULONG TolerableDelay, + _In_opt_ PKDPC Dpc); NTKERNELAPI ULONGLONG @@ -1038,13 +1263,13 @@ NTKERNELAPI ULONG NTAPI KeQueryActiveProcessorCountEx( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI ULONG NTAPI KeQueryMaximumProcessorCountEx( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI USHORT @@ -1060,27 +1285,27 @@ NTKERNELAPI KAFFINITY NTAPI KeQueryGroupAffinity( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI ULONG NTAPI KeGetCurrentProcessorNumberEx( - OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL); + _Out_opt_ PPROCESSOR_NUMBER ProcNumber); NTKERNELAPI VOID NTAPI KeQueryNodeActiveAffinity( - IN USHORT NodeNumber, - OUT PGROUP_AFFINITY Affinity OPTIONAL, - OUT PUSHORT Count OPTIONAL); + _In_ USHORT NodeNumber, + _Out_opt_ PGROUP_AFFINITY Affinity, + _Out_opt_ PUSHORT Count); NTKERNELAPI USHORT NTAPI KeQueryNodeMaximumProcessorCount( - IN USHORT NodeNumber); + _In_ USHORT NodeNumber); NTKERNELAPI USHORT @@ -1092,51 +1317,60 @@ USHORT NTAPI KeGetCurrentNodeNumber(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) 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); + _In_opt_ PPROCESSOR_NUMBER ProcessorNumber OPTIONAL, + _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, + _Out_writes_bytes_opt_(*Length) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information, + _Inout_ PULONG Length); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Ret_range_(<=, 0) +_When_(return==0, _Kernel_float_saved_) NTKERNELAPI NTSTATUS NTAPI KeSaveExtendedProcessorState( - IN ULONG64 Mask, - OUT PXSTATE_SAVE XStateSave); + _In_ ULONG64 Mask, + _Out_ _Requires_lock_not_held_(*_Curr_) + _When_(return==0, _Acquires_lock_(*_Curr_)) + PXSTATE_SAVE XStateSave); +_Kernel_float_restored_ NTKERNELAPI VOID NTAPI KeRestoreExtendedProcessorState( - IN PXSTATE_SAVE XStateSave); + _In_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) + PXSTATE_SAVE XStateSave); NTSTATUS NTAPI KeGetProcessorNumberFromIndex( - IN ULONG ProcIndex, - OUT PPROCESSOR_NUMBER ProcNumber); + _In_ ULONG ProcIndex, + _Out_ PPROCESSOR_NUMBER ProcNumber); ULONG NTAPI KeGetProcessorIndexFromNumber( - IN PPROCESSOR_NUMBER ProcNumber); + _In_ PPROCESSOR_NUMBER ProcNumber); $endif (_WDMDDK_) $if (_NTDDK_) NTKERNELAPI ULONG NTAPI KeQueryActiveProcessorCountEx( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI ULONG NTAPI KeQueryMaximumProcessorCountEx( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI USHORT @@ -1152,27 +1386,27 @@ NTKERNELAPI KAFFINITY NTAPI KeQueryGroupAffinity( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI ULONG NTAPI KeGetCurrentProcessorNumberEx( - OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL); + _Out_opt_ PPROCESSOR_NUMBER ProcNumber); NTKERNELAPI VOID NTAPI KeQueryNodeActiveAffinity( - IN USHORT NodeNumber, - OUT PGROUP_AFFINITY Affinity OPTIONAL, - OUT PUSHORT Count OPTIONAL); + _In_ USHORT NodeNumber, + _Out_opt_ PGROUP_AFFINITY Affinity, + _Out_opt_ PUSHORT Count); NTKERNELAPI USHORT NTAPI KeQueryNodeMaximumProcessorCount( - IN USHORT NodeNumber); + _In_ USHORT NodeNumber); NTKERNELAPI USHORT @@ -1184,29 +1418,32 @@ USHORT NTAPI KeGetCurrentNodeNumber(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) 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); + _In_opt_ PPROCESSOR_NUMBER ProcessorNumber, + _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, + _Out_writes_bytes_opt_(*Length) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information, + _Inout_ PULONG Length); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeSetHardwareCounterConfiguration( - IN PHARDWARE_COUNTER CounterArray, - IN ULONG Count); + _In_reads_(Count) PHARDWARE_COUNTER CounterArray, + _In_ ULONG Count); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeQueryHardwareCounterConfiguration( - OUT PHARDWARE_COUNTER CounterArray, - IN ULONG MaximumCount, - OUT PULONG Count); + _Out_writes_to_(MaximumCount, *Count) PHARDWARE_COUNTER CounterArray, + _In_ ULONG MaximumCount, + _Out_ PULONG Count); $endif (_NTDDK_) $if (_WDMDDK_ || _NTDDK_) #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -1226,7 +1463,14 @@ KeFlushWriteBuffer(VOID); #define KeInitializeCallbackRecord(CallbackRecord) \ CallbackRecord->State = BufferEmpty; -#if DBG +#if defined(_PREFAST_) + +void __PREfastPagedCode(void); +void __PREfastPagedCodeLocked(void); +#define PAGED_CODE() __PREfastPagedCode(); +#define PAGED_CODE_LOCKED() __PREfastPagedCodeLocked(); + +#elif DBG #if (NTDDI_VERSION >= NTDDI_VISTA) #define PAGED_ASSERT( exp ) NT_ASSERT( exp ) @@ -1241,12 +1485,13 @@ KeFlushWriteBuffer(VOID); } \ } +#define PAGED_CODE_LOCKED() NOP_FUNCTION; + #else -#define PAGED_CODE() +#define PAGED_CODE() NOP_FUNCTION; +#define PAGED_CODE_LOCKED() NOP_FUNCTION; #endif /* DBG */ -#define PAGED_CODE_LOCKED() NOP_FUNCTION; $endif (_WDMDDK_) - diff --git a/reactos/include/xdk/ketypes.h b/reactos/include/xdk/ketypes.h index 71139eec7f8..0508315f226 100644 --- a/reactos/include/xdk/ketypes.h +++ b/reactos/include/xdk/ketypes.h @@ -73,7 +73,7 @@ typedef struct _PROCESSOR_RELATIONSHIP { UCHAR Flags; UCHAR Reserved[21]; USHORT GroupCount; - GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; + _Field_size_(GroupCount) GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; } PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; typedef struct _NUMA_NODE_RELATIONSHIP { @@ -264,29 +264,31 @@ typedef enum _KBUGCHECK_CALLBACK_REASON { struct _KBUGCHECK_REASON_CALLBACK_RECORD; +_Function_class_(KBUGCHECK_REASON_CALLBACK_ROUTINE) +_IRQL_requires_same_ typedef VOID (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE)( - IN KBUGCHECK_CALLBACK_REASON Reason, - IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record, - IN OUT PVOID ReasonSpecificData, - IN ULONG ReasonSpecificDataLength); + _In_ KBUGCHECK_CALLBACK_REASON Reason, + _In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record, + _Inout_ PVOID ReasonSpecificData, + _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; + _Inout_ PVOID Context; + _Inout_ 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; + _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 { @@ -298,10 +300,10 @@ typedef enum _KBUGCHECK_DUMP_IO_TYPE { } KBUGCHECK_DUMP_IO_TYPE; typedef struct _KBUGCHECK_DUMP_IO { - IN ULONG64 Offset; - IN PVOID Buffer; - IN ULONG BufferLength; - IN KBUGCHECK_DUMP_IO_TYPE Type; + _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 @@ -325,6 +327,8 @@ typedef enum _KBUGCHECK_BUFFER_DUMP_STATE { BufferIncomplete } KBUGCHECK_BUFFER_DUMP_STATE; +_Function_class_(KBUGCHECK_CALLBACK_ROUTINE) +_IRQL_requires_same_ typedef VOID (NTAPI KBUGCHECK_CALLBACK_ROUTINE)( IN PVOID Buffer, @@ -334,17 +338,19 @@ typedef KBUGCHECK_CALLBACK_ROUTINE *PKBUGCHECK_CALLBACK_ROUTINE; typedef struct _KBUGCHECK_CALLBACK_RECORD { LIST_ENTRY Entry; PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine; - PVOID Buffer; + _Field_size_bytes_opt_(Length) PVOID Buffer; ULONG Length; PUCHAR Component; ULONG_PTR Checksum; UCHAR State; } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD; +_Function_class_(NMI_CALLBACK) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI NMI_CALLBACK)( - IN PVOID Context, - IN BOOLEAN Handled); + _In_opt_ PVOID Context, + _In_ BOOLEAN Handled); typedef NMI_CALLBACK *PNMI_CALLBACK; typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE { @@ -362,11 +368,13 @@ typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT { #endif } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT; +_IRQL_requires_same_ +_Function_class_(PROCESSOR_CALLBACK_FUNCTION) typedef VOID (NTAPI PROCESSOR_CALLBACK_FUNCTION)( - IN PVOID CallbackContext, - IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext, - IN OUT PNTSTATUS OperationStatus); + _In_ PVOID CallbackContext, + _In_ PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext, + _Inout_ PNTSTATUS OperationStatus); typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION; #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1 @@ -468,26 +476,33 @@ typedef enum _KINTERRUPT_MODE { #define THREAD_WAIT_OBJECTS 3 +_IRQL_requires_same_ +_Function_class_(KSTART_ROUTINE) typedef VOID (NTAPI KSTART_ROUTINE)( - IN PVOID StartContext); + _In_ PVOID StartContext); typedef KSTART_ROUTINE *PKSTART_ROUTINE; typedef VOID (NTAPI *PKINTERRUPT_ROUTINE)( VOID); +_Function_class_(KSERVICE_ROUTINE) +_IRQL_requires_(HIGH_LEVEL) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI KSERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext); + _In_ struct _KINTERRUPT *Interrupt, + _In_ PVOID ServiceContext); typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; +_Function_class_(KMESSAGE_SERVICE_ROUTINE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI KMESSAGE_SERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext, - IN ULONG MessageID); + _In_ struct _KINTERRUPT *Interrupt, + _In_ PVOID ServiceContext, + _In_ ULONG MessageID); typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE; typedef enum _KD_OPTION { @@ -572,9 +587,12 @@ typedef struct _KIPI_COUNTS { ULONG GratuitousDPC; } KIPI_COUNTS, *PKIPI_COUNTS; +_IRQL_requires_same_ +_Function_class_(KIPI_BROADCAST_WORKER) +_IRQL_requires_(IPI_LEVEL) typedef ULONG_PTR (NTAPI KIPI_BROADCAST_WORKER)( - IN ULONG_PTR Argument); + _In_ ULONG_PTR Argument); typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER; typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; @@ -639,12 +657,15 @@ typedef enum _KSPIN_LOCK_QUEUE_NUMBER { #endif /* defined(_AMD64_) */ +_Function_class_(KDEFERRED_ROUTINE) +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_requires_same_ typedef VOID (NTAPI KDEFERRED_ROUTINE)( - IN struct _KDPC *Dpc, - IN PVOID DeferredContext OPTIONAL, - IN PVOID SystemArgument1 OPTIONAL, - IN PVOID SystemArgument2 OPTIONAL); + _In_ struct _KDPC *Dpc, + _In_opt_ PVOID DeferredContext, + _In_opt_ PVOID SystemArgument1, + _In_opt_ PVOID SystemArgument2); typedef KDEFERRED_ROUTINE *PKDEFERRED_ROUTINE; typedef enum _KDPC_IMPORTANCE { @@ -825,9 +846,11 @@ typedef enum _LOCK_OPERATION { #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)) +_Function_class_(KSYNCHRONIZE_ROUTINE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI KSYNCHRONIZE_ROUTINE)( - IN PVOID SynchronizeContext); + _In_ PVOID SynchronizeContext); typedef KSYNCHRONIZE_ROUTINE *PKSYNCHRONIZE_ROUTINE; typedef enum _POOL_TYPE { @@ -925,7 +948,7 @@ typedef struct _XSTATE_CONTEXT { ULONG64 Mask; ULONG Length; ULONG Reserved1; - PXSAVE_AREA Area; + _Field_size_bytes_opt_(Length) PXSAVE_AREA Area; #if defined(_X86_) ULONG Reserved2; #endif @@ -1003,20 +1026,22 @@ $endif (_WDMDDK_) $if (_NTDDK_) #define NX_SUPPORT_POLICY_ALWAYSOFF 0 -#define NX_SUPPORT_POLICY_ALWAYSON 1 -#define NX_SUPPORT_POLICY_OPTIN 2 -#define NX_SUPPORT_POLICY_OPTOUT 3 +#define NX_SUPPORT_POLICY_ALWAYSON 1 +#define NX_SUPPORT_POLICY_OPTIN 2 +#define NX_SUPPORT_POLICY_OPTOUT 3 +_IRQL_requires_same_ +_Function_class_(EXPAND_STACK_CALLOUT) typedef VOID (NTAPI EXPAND_STACK_CALLOUT)( - IN PVOID Parameter OPTIONAL); + _In_opt_ PVOID Parameter); typedef EXPAND_STACK_CALLOUT *PEXPAND_STACK_CALLOUT; typedef VOID (NTAPI *PTIMER_APC_ROUTINE)( - IN PVOID TimerContext, - IN ULONG TimerLowValue, - IN LONG TimerHighValue); + _In_ PVOID TimerContext, + _In_ ULONG TimerLowValue, + _In_ LONG TimerHighValue); typedef enum _TIMER_SET_INFORMATION_CLASS { TimerSetCoalescableTimer, @@ -1025,13 +1050,13 @@ typedef enum _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; + _In_ LARGE_INTEGER DueTime; + _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine; + _In_opt_ PVOID TimerContext; + _In_opt_ struct _COUNTED_REASON_CONTEXT *WakeContext; + _In_opt_ ULONG Period; + _In_ ULONG TolerableDelay; + _Out_opt_ PBOOLEAN PreviousState; } TIMER_SET_COALESCABLE_TIMER_INFO, *PTIMER_SET_COALESCABLE_TIMER_INFO; #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ diff --git a/reactos/include/xdk/mmfuncs.h b/reactos/include/xdk/mmfuncs.h index e389fad3044..6611fc9956a 100644 --- a/reactos/include/xdk/mmfuncs.h +++ b/reactos/include/xdk/mmfuncs.h @@ -181,8 +181,8 @@ $if (_NTIFS_) FORCEINLINE ULONG HEAP_MAKE_TAG_FLAGS( - IN ULONG TagBase, - IN ULONG Tag) + _In_ ULONG TagBase, + _In_ ULONG Tag) { //__assume_bound(TagBase); // FIXME return ((ULONG)((TagBase) + ((Tag) << HEAP_TAG_SHIFT))); @@ -191,191 +191,235 @@ $endif (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WIN2K) $if (_WDMDDK_) +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) NTKERNELAPI PVOID NTAPI MmAllocateContiguousMemory( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS HighestAcceptableAddress); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) 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); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, + _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, + _In_ MEMORY_CACHING_TYPE CacheType); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PMDL NTAPI MmAllocatePagesForMdl( - IN PHYSICAL_ADDRESS LowAddress, - IN PHYSICAL_ADDRESS HighAddress, - IN PHYSICAL_ADDRESS SkipBytes, - IN SIZE_T TotalBytes); + _In_ PHYSICAL_ADDRESS LowAddress, + _In_ PHYSICAL_ADDRESS HighAddress, + _In_ PHYSICAL_ADDRESS SkipBytes, + _In_ SIZE_T TotalBytes); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmBuildMdlForNonPagedPool( - IN OUT PMDLX MemoryDescriptorList); + _Inout_ PMDLX MemoryDescriptorList); //DECLSPEC_DEPRECATED_DDK NTKERNELAPI PMDL NTAPI MmCreateMdl( - IN PMDL MemoryDescriptorList OPTIONAL, - IN PVOID Base, - IN SIZE_T Length); + _Out_writes_bytes_opt_ (sizeof (MDL) + (sizeof (PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES (Base, Length))) + PMDL MemoryDescriptorList, + _In_reads_bytes_opt_ (Length) PVOID Base, + _In_ SIZE_T Length); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmFreeContiguousMemory( - IN PVOID BaseAddress); + _In_ PVOID BaseAddress); +_IRQL_requires_max_ (DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmFreeContiguousMemorySpecifyCache( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType); + _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes, + _In_ MEMORY_CACHING_TYPE CacheType); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmFreePagesFromMdl( - IN PMDLX MemoryDescriptorList); + _Inout_ PMDLX MemoryDescriptorList); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PVOID NTAPI MmGetSystemRoutineAddress( - IN PUNICODE_STRING SystemRoutineName); + _In_ PUNICODE_STRING SystemRoutineName); NTKERNELAPI LOGICAL NTAPI MmIsDriverVerifying( - IN struct _DRIVER_OBJECT *DriverObject); + _In_ struct _DRIVER_OBJECT *DriverObject); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI MmLockPagableDataSection( - IN PVOID AddressWithinSection); + _In_ PVOID AddressWithinSection); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Out_writes_bytes_opt_ (NumberOfBytes) NTKERNELAPI PVOID NTAPI MmMapIoSpace( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheEnable); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ SIZE_T NumberOfBytes, + _In_ MEMORY_CACHING_TYPE CacheType); +_Must_inspect_result_ +_When_(AccessMode==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(AccessMode==1, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI PVOID NTAPI MmMapLockedPages( - IN PMDL MemoryDescriptorList, - IN KPROCESSOR_MODE AccessMode); + _Inout_ PMDL MemoryDescriptorList, + _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) + KPROCESSOR_MODE AccessMode); +_Post_writable_byte_size_(MemoryDescriptorList->ByteCount) +_When_(AccessMode==KernelMode, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(AccessMode==UserMode, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL) _Post_notnull_) +_At_(MemoryDescriptorList->MappedSystemVa, _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)) +_Must_inspect_result_ +_Success_(return != NULL) NTKERNELAPI PVOID NTAPI MmMapLockedPagesSpecifyCache( - IN PMDLX MemoryDescriptorList, - IN KPROCESSOR_MODE AccessMode, - IN MEMORY_CACHING_TYPE CacheType, - IN PVOID BaseAddress OPTIONAL, - IN ULONG BugCheckOnFailure, - IN MM_PAGE_PRIORITY Priority); + _Inout_ PMDLX MemoryDescriptorList, + _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) + KPROCESSOR_MODE AccessMode, + _In_ __drv_strictTypeMatch(__drv_typeCond) MEMORY_CACHING_TYPE CacheType, + _In_opt_ PVOID BaseAddress, + _In_ ULONG BugCheckOnFailure, + _In_ MM_PAGE_PRIORITY Priority); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI MmPageEntireDriver( - IN PVOID AddressWithinSection); + _In_ PVOID AddressWithinSection); +_IRQL_requires_max_(DISPATCH_LEVEL) +_At_(MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset, + _Field_size_bytes_opt_(MemoryDescriptorList->ByteCount)) NTKERNELAPI VOID NTAPI MmProbeAndLockPages( - IN OUT PMDL MemoryDescriptorList, - IN KPROCESSOR_MODE AccessMode, - IN LOCK_OPERATION Operation); + _Inout_ PMDLX MemoryDescriptorList, + _In_ KPROCESSOR_MODE AccessMode, + _In_ LOCK_OPERATION Operation); NTKERNELAPI MM_SYSTEMSIZE NTAPI MmQuerySystemSize(VOID); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmResetDriverPaging( - IN PVOID AddressWithinSection); + _In_ PVOID AddressWithinSection); NTKERNELAPI SIZE_T NTAPI MmSizeOfMdl( - IN PVOID Base, - IN SIZE_T Length); + _In_reads_bytes_opt_ (Length) PVOID Base, + _In_ SIZE_T Length); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmUnlockPagableImageSection( - IN PVOID ImageSectionHandle); + _In_ PVOID ImageSectionHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmUnlockPages( - IN OUT PMDL MemoryDescriptorList); + _Inout_ PMDLX MemoryDescriptorList); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmUnmapIoSpace( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes); + _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI VOID NTAPI MmProbeAndLockProcessPages( - IN OUT PMDL MemoryDescriptorList, - IN PEPROCESS Process, - IN KPROCESSOR_MODE AccessMode, - IN LOCK_OPERATION Operation); + _Inout_ PMDL MemoryDescriptorList, + _In_ PEPROCESS Process, + _In_ KPROCESSOR_MODE AccessMode, + _In_ LOCK_OPERATION Operation); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmUnmapLockedPages( - IN PVOID BaseAddress, - IN PMDL MemoryDescriptorList); + _In_ PVOID BaseAddress, + _Inout_ PMDL MemoryDescriptorList); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) 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); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, + _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, + _In_ MEMORY_CACHING_TYPE CacheType, + _In_ NODE_REQUIREMENT PreferredNode); $endif (_WDMDDK_) $if (_NTDDK_) +_IRQL_requires_max_ (PASSIVE_LEVEL) NTKERNELAPI PPHYSICAL_MEMORY_RANGE NTAPI @@ -385,206 +429,243 @@ NTKERNELAPI PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress( - IN PVOID BaseAddress); + _In_ PVOID BaseAddress); NTKERNELAPI BOOLEAN NTAPI MmIsNonPagedSystemAddressValid( - IN PVOID VirtualAddress); + _In_ PVOID VirtualAddress); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) +_Out_writes_bytes_opt_(NumberOfBytes) NTKERNELAPI PVOID NTAPI MmAllocateNonCachedMemory( - IN SIZE_T NumberOfBytes); + _In_ SIZE_T NumberOfBytes); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmFreeNonCachedMemory( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes); + _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes); NTKERNELAPI PVOID NTAPI MmGetVirtualForPhysical( - IN PHYSICAL_ADDRESS PhysicalAddress); + _In_ PHYSICAL_ADDRESS PhysicalAddress); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmMapUserAddressesToPage( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN PVOID PageAddress); + _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes, + _In_ PVOID PageAddress); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) +_Out_writes_bytes_opt_(NumberOfBytes) NTKERNELAPI PVOID NTAPI MmMapVideoDisplay( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ SIZE_T NumberOfBytes, + _In_ MEMORY_CACHING_TYPE CacheType); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmMapViewInSessionSpace( - IN PVOID Section, - OUT PVOID *MappedBase, - IN OUT PSIZE_T ViewSize); + _In_ PVOID Section, + _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase, + _Inout_ PSIZE_T ViewSize); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmMapViewInSystemSpace( - IN PVOID Section, - OUT PVOID *MappedBase, - IN OUT PSIZE_T ViewSize); + _In_ PVOID Section, + _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase, + _Inout_ PSIZE_T ViewSize); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI MmIsAddressValid( - IN PVOID VirtualAddress); + _In_ PVOID VirtualAddress); NTKERNELAPI BOOLEAN NTAPI MmIsThisAnNtAsSystem(VOID); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmLockPagableSectionByHandle( - IN PVOID ImageSectionHandle); + _In_ PVOID ImageSectionHandle); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmUnmapViewInSessionSpace( - IN PVOID MappedBase); + _In_ PVOID MappedBase); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmUnmapViewInSystemSpace( - IN PVOID MappedBase); + _In_ PVOID MappedBase); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmUnsecureVirtualMemory( - IN HANDLE SecureHandle); + _In_ HANDLE SecureHandle); +_IRQL_requires_max_ (PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmRemovePhysicalMemory( - IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes); + _In_ PPHYSICAL_ADDRESS StartAddress, + _Inout_ PLARGE_INTEGER NumberOfBytes); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI HANDLE NTAPI MmSecureVirtualMemory( - IN PVOID Address, - IN SIZE_T Size, - IN ULONG ProbeMode); + __in_data_source(USER_MODE) _In_reads_bytes_ (Size) PVOID Address, + _In_ __in_data_source(USER_MODE) SIZE_T Size, + _In_ ULONG ProbeMode); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmUnmapVideoDisplay( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes); + _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes); +_IRQL_requires_max_ (PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmAddPhysicalMemory( - IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes); + _In_ PPHYSICAL_ADDRESS StartAddress, + _Inout_ PLARGE_INTEGER NumberOfBytes); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_(return != NULL, _Post_writable_byte_size_(NumberOfBytes)) NTKERNELAPI PVOID NTAPI MmAllocateContiguousMemory( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS HighestAcceptableAddress); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_(return != NULL, _Post_writable_byte_size_(NumberOfBytes)) 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); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, + _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, + _In_ MEMORY_CACHING_TYPE CacheType); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_(return != NULL, _Post_writable_byte_size_(NumberOfBytes)) 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); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, + _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, + _In_ MEMORY_CACHING_TYPE CacheType, + _In_ NODE_REQUIREMENT PreferredNode); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmFreeContiguousMemory( - IN PVOID BaseAddress); + _In_ PVOID BaseAddress); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmFreeContiguousMemorySpecifyCache( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType); + _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes, + _In_ MEMORY_CACHING_TYPE CacheType); $endif (_NTDDK_) $if (_NTIFS_) NTKERNELAPI BOOLEAN NTAPI -MmIsRecursiveIoFault( - VOID); +MmIsRecursiveIoFault(VOID); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI MmForceSectionClosed( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN DelayClose); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_ BOOLEAN DelayClose); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI MmFlushImageSection( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN MMFLUSH_TYPE FlushType); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_ MMFLUSH_TYPE FlushType); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI MmCanFileBeTruncated( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER NewFileSize OPTIONAL); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_opt_ PLARGE_INTEGER NewFileSize); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI MmSetAddressRangeModified( - IN PVOID Address, - IN SIZE_T Length); + _In_reads_bytes_ (Length) PVOID Address, + _In_ SIZE_T Length); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -594,72 +675,90 @@ $if (_WDMDDK_ || _NTIFS_) $endif (_WDMDDK_ || _NTIFS_) $if (_WDMDDK_) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmAdvanceMdl( - IN OUT PMDL Mdl, - IN ULONG NumberOfBytes); + _Inout_ PMDLX Mdl, + _In_ ULONG NumberOfBytes); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) +_When_ (return != NULL, _Out_writes_bytes_opt_ (NumberOfBytes)) NTKERNELAPI PVOID NTAPI MmAllocateMappingAddress( - IN SIZE_T NumberOfBytes, - IN ULONG PoolTag); + _In_ SIZE_T NumberOfBytes, + _In_ ULONG PoolTag); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmFreeMappingAddress( - IN PVOID BaseAddress, - IN ULONG PoolTag); + _In_ PVOID BaseAddress, + _In_ ULONG PoolTag); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmIsVerifierEnabled( - OUT PULONG VerifierFlags); + _Out_ PULONG VerifierFlags); +_Post_writable_byte_size_(MemoryDescriptorList->ByteCount) +_IRQL_requires_max_(DISPATCH_LEVEL) +_At_(MemoryDescriptorList->MappedSystemVa + MemoryDescriptorList->ByteOffset, + _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)) +_Must_inspect_result_ +_Success_(return != NULL) NTKERNELAPI PVOID NTAPI MmMapLockedPagesWithReservedMapping( - IN PVOID MappingAddress, - IN ULONG PoolTag, - IN PMDL MemoryDescriptorList, - IN MEMORY_CACHING_TYPE CacheType); + _In_ PVOID MappingAddress, + _In_ ULONG PoolTag, + _Inout_ PMDLX MemoryDescriptorList, + _In_ __drv_strictTypeMatch(__drv_typeCond) + MEMORY_CACHING_TYPE CacheType); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmProtectMdlSystemAddress( - IN PMDL MemoryDescriptorList, - IN ULONG NewProtect); + _In_ PMDLX MemoryDescriptorList, + _In_ ULONG NewProtect); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmUnmapReservedMapping( - IN PVOID BaseAddress, - IN ULONG PoolTag, - IN PMDL MemoryDescriptorList); + _In_ PVOID BaseAddress, + _In_ ULONG PoolTag, + _Inout_ PMDLX MemoryDescriptorList); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmAddVerifierThunks( - IN PVOID ThunkBuffer, - IN ULONG ThunkBufferSize); + _In_reads_bytes_ (ThunkBufferSize) PVOID ThunkBuffer, + _In_ ULONG ThunkBufferSize); $endif (_WDMDDK_) $if (_NTIFS_) +_IRQL_requires_max_ (PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmPrefetchPages( - IN ULONG NumberOfLists, - IN PREAD_LIST *ReadLists); + _In_ ULONG NumberOfLists, + _In_reads_ (NumberOfLists) PREAD_LIST *ReadLists); $endif (_NTIFS_) $if (_WDMDDK_ || _NTIFS_) @@ -669,15 +768,18 @@ $if (_WDMDDK_ || _NTDDK_) #if (NTDDI_VERSION >= NTDDI_WS03) $endif (_WDMDDK_ || _NTDDK_) $if (_WDMDDK_) +_IRQL_requires_max_ (DISPATCH_LEVEL) NTKERNELAPI LOGICAL NTAPI MmIsIoSpaceActive( - IN PHYSICAL_ADDRESS StartAddress, - IN SIZE_T NumberOfBytes); + _In_ PHYSICAL_ADDRESS StartAddress, + _In_ SIZE_T NumberOfBytes); $endif (_WDMDDK_) $if (_NTDDK_) +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI @@ -688,45 +790,51 @@ $if (_WDMDDK_ || _NTDDK_) $endif (_WDMDDK_ || _NTDDK_) $if (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WS03SP1) +_Must_inspect_result_ +_IRQL_requires_max_ (DISPATCH_LEVEL) NTKERNELAPI PMDL NTAPI MmAllocatePagesForMdlEx( - IN PHYSICAL_ADDRESS LowAddress, - IN PHYSICAL_ADDRESS HighAddress, - IN PHYSICAL_ADDRESS SkipBytes, - IN SIZE_T TotalBytes, - IN MEMORY_CACHING_TYPE CacheType, - IN ULONG Flags); + _In_ PHYSICAL_ADDRESS LowAddress, + _In_ PHYSICAL_ADDRESS HighAddress, + _In_ PHYSICAL_ADDRESS SkipBytes, + _In_ SIZE_T TotalBytes, + _In_ MEMORY_CACHING_TYPE CacheType, + _In_ ULONG Flags); #endif $endif (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_VISTA) $if (_WDMDDK_) +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI LOGICAL NTAPI MmIsDriverVerifyingByAddress( - IN PVOID AddressWithinSection); + _In_ PVOID AddressWithinSection); $endif (_WDMDDK_) $if (_NTDDK_) +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ PVOID VirtualAddress, + _Inout_ PSIZE_T NumberOfBytes, + _In_opt_ PMDLX NewMdl, + _In_ MM_ROTATE_DIRECTION Direction, + _In_ PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction, + _In_opt_ PVOID Context); $endif (_NTDDK_) $if (_NTIFS_) +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI ULONG NTAPI MmDoesFileHaveUserWritableReferences( - IN PSECTION_OBJECT_POINTERS SectionPointer); + _In_ PSECTION_OBJECT_POINTERS SectionPointer); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ diff --git a/reactos/include/xdk/mmtypes.h b/reactos/include/xdk/mmtypes.h index e7b248c9234..2b98aeef5ae 100644 --- a/reactos/include/xdk/mmtypes.h +++ b/reactos/include/xdk/mmtypes.h @@ -103,6 +103,8 @@ typedef ULONG PFN_COUNT; typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER; typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER; +_Struct_size_bytes_(_Inexpressible_(sizeof(struct _MDL) + + (ByteOffset + ByteCount + PAGE_SIZE-1) / PAGE_SIZE * sizeof(PFN_NUMBER))) typedef struct _MDL { struct _MDL *Next; CSHORT Size; @@ -113,7 +115,11 @@ typedef struct _MDL { ULONG ByteCount; ULONG ByteOffset; } MDL, *PMDL; +#if (_MSC_VER >= 1600) +typedef _Readable_bytes_(_Inexpressible_(polymorphism)) MDL *PMDLX; +#else typedef MDL *PMDLX; +#endif typedef enum _MEMORY_CACHING_TYPE_ORIG { MmFrameBufferCached = 2 @@ -154,9 +160,9 @@ typedef struct _PHYSICAL_MEMORY_RANGE { typedef NTSTATUS (NTAPI *PMM_ROTATE_COPY_CALLBACK_FUNCTION)( - IN PMDL DestinationMdl, - IN PMDL SourceMdl, - IN PVOID Context); + _In_ PMDL DestinationMdl, + _In_ PMDL SourceMdl, + _In_ PVOID Context); typedef enum _MM_ROTATE_DIRECTION { MmToFrameBuffer, diff --git a/reactos/include/xdk/ntddk.template.h b/reactos/include/xdk/ntddk.template.h index 90d8a1afd2b..4559760881f 100644 --- a/reactos/include/xdk/ntddk.template.h +++ b/reactos/include/xdk/ntddk.template.h @@ -171,7 +171,7 @@ typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION { typedef NTSTATUS (__cdecl *PFNFTH)( - IN OUT PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo); + _Inout_ PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo); typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER { ULONG ProviderSignature; @@ -182,7 +182,7 @@ typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER { typedef ULONG_PTR (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)( - IN PVOID Context); + _In_ PVOID Context); typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; @@ -245,11 +245,12 @@ typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { /* Filesystem runtime library routines */ #if (NTDDI_VERSION >= NTDDI_WIN2K) +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI FsRtlIsTotalDeviceFailure( - IN NTSTATUS Status); + _In_ NTSTATUS Status); #endif #ifdef __cplusplus diff --git a/reactos/include/xdk/ntifs.template.h b/reactos/include/xdk/ntifs.template.h index 9018b9798a4..16bc7a2df0e 100644 --- a/reactos/include/xdk/ntifs.template.h +++ b/reactos/include/xdk/ntifs.template.h @@ -66,529 +66,601 @@ $include (obtypes.h) $include (rtltypes.h) $include (rtlfuncs.h) +_IRQL_requires_max_(PASSIVE_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryObject( - IN HANDLE Handle OPTIONAL, - IN OBJECT_INFORMATION_CLASS ObjectInformationClass, - OUT PVOID ObjectInformation OPTIONAL, - IN ULONG ObjectInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_opt_ HANDLE Handle, + _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass, + _Out_writes_bytes_opt_(ObjectInformationLength) PVOID ObjectInformation, + _In_ ULONG ObjectInformationLength, + _Out_opt_ PULONG ReturnLength); #if (NTDDI_VERSION >= NTDDI_WIN2K) +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenThreadToken( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - OUT PHANDLE TokenHandle); + _In_ HANDLE ThreadHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ BOOLEAN OpenAsSelf, + _Out_ PHANDLE TokenHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenProcessToken( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE TokenHandle); + _In_ HANDLE ProcessHandle, + _In_ ACCESS_MASK DesiredAccess, + _Out_ PHANDLE TokenHandle); +_When_(TokenInformationClass == TokenAccessInformation, + _At_(TokenInformationLength, + _In_range_(>=, sizeof(TOKEN_ACCESS_INFORMATION)))) +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation OPTIONAL, - IN ULONG TokenInformationLength, - OUT PULONG ReturnLength); + _In_ HANDLE TokenHandle, + _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, + _Out_writes_bytes_to_opt_(TokenInformationLength, *ReturnLength) PVOID TokenInformation, + _In_ ULONG TokenInformationLength, + _Out_ PULONG ReturnLength); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAdjustPrivilegesToken( - IN HANDLE TokenHandle, - IN BOOLEAN DisableAllPrivileges, - IN PTOKEN_PRIVILEGES NewState OPTIONAL, - IN ULONG BufferLength, - OUT PTOKEN_PRIVILEGES PreviousState, - OUT PULONG ReturnLength OPTIONAL); + _In_ HANDLE TokenHandle, + _In_ BOOLEAN DisableAllPrivileges, + _In_opt_ PTOKEN_PRIVILEGES NewState, + _In_ ULONG BufferLength, + _Out_writes_bytes_to_opt_(BufferLength, *ReturnLength) PTOKEN_PRIVILEGES PreviousState, + _Out_ _When_(PreviousState == NULL, _Out_opt_) PULONG ReturnLength); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCreateFile( - 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 CreateDisposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer, - IN ULONG EaLength); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG CreateDisposition, + _In_ ULONG CreateOptions, + _In_reads_bytes_opt_(EaLength) PVOID EaBuffer, + _In_ ULONG EaLength); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtDeviceIoControlFile( - 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG IoControlCode, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtFsControlFile( - 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG FsControlCode, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtLockFile( - 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ PLARGE_INTEGER ByteOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key, + _In_ BOOLEAN FailImmediately, + _In_ BOOLEAN ExclusiveLock); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenFile( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG ShareAccess, - IN ULONG OpenOptions); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG ShareAccess, + _In_ ULONG OpenOptions); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryDirectoryFile( - 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass, + _In_ BOOLEAN ReturnSingleEntry, + _In_opt_ PUNICODE_STRING FileName, + _In_ BOOLEAN RestartScan); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryQuotaInformationFile( - 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); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_ BOOLEAN ReturnSingleEntry, + _In_reads_bytes_opt_(SidListLength) PVOID SidList, + _In_ ULONG SidListLength, + _In_reads_bytes_opt_((8 + (4 * ((SID *)StartSid)->SubAuthorityCount))) PSID StartSid, + _In_ BOOLEAN RestartScan); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FsInformation, + _In_ ULONG Length, + _In_ FS_INFORMATION_CLASS FsInformationClass); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtReadFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_opt_ PLARGE_INTEGER ByteOffset, + _In_opt_ PULONG Key); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID FsInformation, + _In_ ULONG Length, + _In_ FS_INFORMATION_CLASS FsInformationClass); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtWriteFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_opt_ PLARGE_INTEGER ByteOffset, + _In_opt_ PULONG Key); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtUnlockFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER ByteOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ PLARGE_INTEGER ByteOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key); +_IRQL_requires_max_(PASSIVE_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetSecurityObject( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ HANDLE Handle, + _In_ SECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); +_IRQL_requires_max_(PASSIVE_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQuerySecurityObject( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Length, - OUT PULONG LengthNeeded); + _In_ HANDLE Handle, + _In_ SECURITY_INFORMATION SecurityInformation, + _Out_writes_bytes_opt_(Length) PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ ULONG Length, + _Out_ PULONG LengthNeeded); +_IRQL_requires_max_(PASSIVE_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtClose( - IN HANDLE Handle); + _In_ HANDLE Handle); +_Must_inspect_result_ +__drv_allocatesMem(Mem) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAllocateVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN OUT PSIZE_T RegionSize, - IN ULONG AllocationType, - IN ULONG Protect); + _In_ HANDLE ProcessHandle, + _Outptr_result_bytebuffer_(*RegionSize) PVOID *BaseAddress, + _In_ ULONG_PTR ZeroBits, + _Inout_ PSIZE_T RegionSize, + _In_ ULONG AllocationType, + _In_ ULONG Protect); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtFreeVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - IN ULONG FreeType); + _In_ HANDLE ProcessHandle, + _Inout_ __drv_freesMem(Mem) PVOID *BaseAddress, + _Inout_ PSIZE_T RegionSize, + _In_ ULONG FreeType); #endif #if (NTDDI_VERSION >= NTDDI_WINXP) +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenThreadTokenEx( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); + _In_ HANDLE ThreadHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ BOOLEAN OpenAsSelf, + _In_ ULONG HandleAttributes, + _Out_ PHANDLE TokenHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenProcessTokenEx( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); + _In_ HANDLE ProcessHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG HandleAttributes, + _Out_ PHANDLE TokenHandle); +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI NtOpenJobObjectToken( - IN HANDLE JobHandle, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE TokenHandle); + _In_ HANDLE JobHandle, + _In_ ACCESS_MASK DesiredAccess, + _Out_ PHANDLE TokenHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtDuplicateToken( - IN HANDLE ExistingTokenHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN EffectiveOnly, - IN TOKEN_TYPE TokenType, - OUT PHANDLE NewTokenHandle); + _In_ HANDLE ExistingTokenHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ BOOLEAN EffectiveOnly, + _In_ TOKEN_TYPE TokenType, + _Out_ PHANDLE NewTokenHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtFilterToken( - IN HANDLE ExistingTokenHandle, - IN ULONG Flags, - IN PTOKEN_GROUPS SidsToDisable OPTIONAL, - IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL, - IN PTOKEN_GROUPS RestrictedSids OPTIONAL, - OUT PHANDLE NewTokenHandle); + _In_ HANDLE ExistingTokenHandle, + _In_ ULONG Flags, + _In_opt_ PTOKEN_GROUPS SidsToDisable, + _In_opt_ PTOKEN_PRIVILEGES PrivilegesToDelete, + _In_opt_ PTOKEN_GROUPS RestrictedSids, + _Out_ PHANDLE NewTokenHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtImpersonateAnonymousToken( - IN HANDLE ThreadHandle); + _In_ HANDLE ThreadHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - IN PVOID TokenInformation, - IN ULONG TokenInformationLength); + _In_ HANDLE TokenHandle, + _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, + _In_reads_bytes_(TokenInformationLength) PVOID TokenInformation, + _In_ ULONG TokenInformationLength); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAdjustGroupsToken( - IN HANDLE TokenHandle, - IN BOOLEAN ResetToDefault, - IN PTOKEN_GROUPS NewState OPTIONAL, - IN ULONG BufferLength OPTIONAL, - OUT PTOKEN_GROUPS PreviousState, - OUT PULONG ReturnLength); + _In_ HANDLE TokenHandle, + _In_ BOOLEAN ResetToDefault, + _In_opt_ PTOKEN_GROUPS NewState, + _In_opt_ ULONG BufferLength, + _Out_writes_bytes_to_opt_(BufferLength, *ReturnLength) PTOKEN_GROUPS PreviousState, + _Out_ PULONG ReturnLength); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrivilegeCheck( - IN HANDLE ClientToken, - IN OUT PPRIVILEGE_SET RequiredPrivileges, - OUT PBOOLEAN Result); + _In_ HANDLE ClientToken, + _Inout_ PPRIVILEGE_SET RequiredPrivileges, + _Out_ PBOOLEAN Result); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAccessCheckAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ACCESS_MASK DesiredAccess, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ PUNICODE_STRING ObjectTypeName, + _In_ PUNICODE_STRING ObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ ACCESS_MASK DesiredAccess, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ BOOLEAN ObjectCreation, + _Out_ PACCESS_MASK GrantedAccess, + _Out_ PNTSTATUS AccessStatus, + _Out_ PBOOLEAN GenerateOnClose); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAccessCheckByTypeAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL, - IN ULONG ObjectTypeLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ PUNICODE_STRING ObjectTypeName, + _In_ PUNICODE_STRING ObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSID PrincipalSelfSid, + _In_ ACCESS_MASK DesiredAccess, + _In_ AUDIT_EVENT_TYPE AuditType, + _In_ ULONG Flags, + _In_reads_opt_(ObjectTypeLength) POBJECT_TYPE_LIST ObjectTypeList, + _In_ ULONG ObjectTypeLength, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ BOOLEAN ObjectCreation, + _Out_ PACCESS_MASK GrantedAccess, + _Out_ PNTSTATUS AccessStatus, + _Out_ PBOOLEAN GenerateOnClose); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAccessCheckByTypeResultListAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL, - IN ULONG ObjectTypeLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ PUNICODE_STRING ObjectTypeName, + _In_ PUNICODE_STRING ObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSID PrincipalSelfSid, + _In_ ACCESS_MASK DesiredAccess, + _In_ AUDIT_EVENT_TYPE AuditType, + _In_ ULONG Flags, + _In_reads_opt_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList, + _In_ ULONG ObjectTypeListLength, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ BOOLEAN ObjectCreation, + _Out_writes_(ObjectTypeListLength) PACCESS_MASK GrantedAccess, + _Out_writes_(ObjectTypeListLength) PNTSTATUS AccessStatus, + _Out_ PBOOLEAN GenerateOnClose); +_Must_inspect_result_ +__kernel_entry +NTSYSCALLAPI NTSTATUS NTAPI NtAccessCheckByTypeResultListAndAuditAlarmByHandle( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN HANDLE ClientToken, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL, - IN ULONG ObjectTypeLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ HANDLE ClientToken, + _In_ PUNICODE_STRING ObjectTypeName, + _In_ PUNICODE_STRING ObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSID PrincipalSelfSid, + _In_ ACCESS_MASK DesiredAccess, + _In_ AUDIT_EVENT_TYPE AuditType, + _In_ ULONG Flags, + _In_reads_opt_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList, + _In_ ULONG ObjectTypeListLength, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ BOOLEAN ObjectCreation, + _Out_writes_(ObjectTypeListLength) PACCESS_MASK GrantedAccess, + _Out_writes_(ObjectTypeListLength) PNTSTATUS AccessStatus, + _Out_ PBOOLEAN GenerateOnClose); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenObjectAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, - IN HANDLE ClientToken, - IN ACCESS_MASK DesiredAccess, - IN ACCESS_MASK GrantedAccess, - IN PPRIVILEGE_SET Privileges OPTIONAL, - IN BOOLEAN ObjectCreation, - IN BOOLEAN AccessGranted, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ PUNICODE_STRING ObjectTypeName, + _In_ PUNICODE_STRING ObjectName, + _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ HANDLE ClientToken, + _In_ ACCESS_MASK DesiredAccess, + _In_ ACCESS_MASK GrantedAccess, + _In_opt_ PPRIVILEGE_SET Privileges, + _In_ BOOLEAN ObjectCreation, + _In_ BOOLEAN AccessGranted, + _Out_ PBOOLEAN GenerateOnClose); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrivilegeObjectAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN HANDLE ClientToken, - IN ACCESS_MASK DesiredAccess, - IN PPRIVILEGE_SET Privileges, - IN BOOLEAN AccessGranted); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ HANDLE ClientToken, + _In_ ACCESS_MASK DesiredAccess, + _In_ PPRIVILEGE_SET Privileges, + _In_ BOOLEAN AccessGranted); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCloseObjectAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN BOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ BOOLEAN GenerateOnClose); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtDeleteObjectAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN BOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ BOOLEAN GenerateOnClose); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrivilegedServiceAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PUNICODE_STRING ServiceName, - IN HANDLE ClientToken, - IN PPRIVILEGE_SET Privileges, - IN BOOLEAN AccessGranted); + _In_ PUNICODE_STRING SubsystemName, + _In_ PUNICODE_STRING ServiceName, + _In_ HANDLE ClientToken, + _In_ PPRIVILEGE_SET Privileges, + _In_ BOOLEAN AccessGranted); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationThread( - IN HANDLE ThreadHandle, - IN THREADINFOCLASS ThreadInformationClass, - IN PVOID ThreadInformation, - IN ULONG ThreadInformationLength); + _In_ HANDLE ThreadHandle, + _In_ THREADINFOCLASS ThreadInformationClass, + _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation, + _In_ ULONG ThreadInformationLength); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCreateSection( - 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); + _Out_ PHANDLE SectionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PLARGE_INTEGER MaximumSize, + _In_ ULONG SectionPageProtection, + _In_ ULONG AllocationAttributes, + _In_opt_ HANDLE FileHandle); #endif @@ -637,35 +709,40 @@ typedef enum _SECURITY_LOGON_TYPE { #endif /* _NTLSA_AUDIT_ */ +_IRQL_requires_same_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI LsaRegisterLogonProcess( - IN PLSA_STRING LogonProcessName, - OUT PHANDLE LsaHandle, - OUT PLSA_OPERATIONAL_MODE SecurityMode); + _In_ PLSA_STRING LogonProcessName, + _Out_ PHANDLE LsaHandle, + _Out_ PLSA_OPERATIONAL_MODE SecurityMode); +_IRQL_requires_same_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI LsaLogonUser( - IN HANDLE LsaHandle, - IN PLSA_STRING OriginName, - IN SECURITY_LOGON_TYPE LogonType, - IN ULONG AuthenticationPackage, - IN PVOID AuthenticationInformation, - IN ULONG AuthenticationInformationLength, - IN PTOKEN_GROUPS LocalGroups OPTIONAL, - IN PTOKEN_SOURCE SourceContext, - OUT PVOID *ProfileBuffer, - OUT PULONG ProfileBufferLength, - OUT PLUID LogonId, - OUT PHANDLE Token, - OUT PQUOTA_LIMITS Quotas, - OUT PNTSTATUS SubStatus); + _In_ HANDLE LsaHandle, + _In_ PLSA_STRING OriginName, + _In_ SECURITY_LOGON_TYPE LogonType, + _In_ ULONG AuthenticationPackage, + _In_reads_bytes_(AuthenticationInformationLength) PVOID AuthenticationInformation, + _In_ ULONG AuthenticationInformationLength, + _In_opt_ PTOKEN_GROUPS LocalGroups, + _In_ PTOKEN_SOURCE SourceContext, + _Out_ PVOID *ProfileBuffer, + _Out_ PULONG ProfileBufferLength, + _Inout_ PLUID LogonId, + _Out_ PHANDLE Token, + _Out_ PQUOTA_LIMITS Quotas, + _Out_ PNTSTATUS SubStatus); +_IRQL_requires_same_ NTSTATUS NTAPI LsaFreeReturnBuffer( - IN PVOID Buffer); + _In_ PVOID Buffer); #ifndef _NTLSA_IFS_ #define _NTLSA_IFS_ @@ -1664,16 +1741,6 @@ FsRtlAllocatePoolWithTag ( IN ULONG Tag ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsFatDbcsLegal ( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible -); - NTKERNELAPI BOOLEAN NTAPI diff --git a/reactos/include/xdk/nttmapi.h b/reactos/include/xdk/nttmapi.h index 9aaaf4446cb..7afe3533feb 100644 --- a/reactos/include/xdk/nttmapi.h +++ b/reactos/include/xdk/nttmapi.h @@ -154,7 +154,7 @@ typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION { typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION { ULONG LogPathLength; - WCHAR LogPath[1]; + _Field_size_(LogPathLength) WCHAR LogPath[1]; } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION; typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION { @@ -265,385 +265,488 @@ typedef struct _TRANSACTION_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); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ LPGUID Uow, + _In_opt_ HANDLE TmHandle, + _In_opt_ ULONG CreateOptions, + _In_opt_ ULONG IsolationLevel, + _In_opt_ ULONG IsolationFlags, + _In_opt_ PLARGE_INTEGER Timeout, + _In_opt_ PUNICODE_STRING Description); 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); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ LPGUID Uow, + _In_opt_ HANDLE TmHandle); 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); + _In_ HANDLE TransactionHandle, + _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation, + _In_ ULONG TransactionInformationLength, + _Out_opt_ PULONG ReturnLength); typedef NTSTATUS (NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - IN PVOID TransactionInformation, - IN ULONG TransactionInformationLength); + _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); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); typedef NTSTATUS (NTAPI *PFN_NT_ROLLBACK_TRANSACTION)( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); #if (NTDDI_VERSION >= NTDDI_VISTA) +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _Out_ PHANDLE TmHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PUNICODE_STRING LogFileName, + _In_opt_ ULONG CreateOptions, + _In_opt_ ULONG CommitStrength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _Out_ PHANDLE TmHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PUNICODE_STRING LogFileName, + _In_opt_ LPGUID TmIdentity, + _In_opt_ ULONG OpenOptions); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRenameTransactionManager( - IN PUNICODE_STRING LogFileName, - IN LPGUID ExistingTransactionManagerGuid); + _In_ PUNICODE_STRING LogFileName, + _In_ LPGUID ExistingTransactionManagerGuid); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRollforwardTransactionManager( - IN HANDLE TransactionManagerHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE TransactionManagerHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRecoverTransactionManager( - IN HANDLE TransactionManagerHandle); + _In_ HANDLE TransactionManagerHandle); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationTransactionManager( - IN HANDLE TransactionManagerHandle, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - OUT PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength, - OUT PULONG ReturnLength); + _In_ HANDLE TransactionManagerHandle, + _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation, + _In_ ULONG TransactionManagerInformationLength, + _Out_ PULONG ReturnLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationTransactionManager( - IN HANDLE TmHandle OPTIONAL, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - IN PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength); + _In_opt_ HANDLE TmHandle, + _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + _In_reads_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation, + _In_ ULONG TransactionManagerInformationLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtEnumerateTransactionObject( - IN HANDLE RootObjectHandle OPTIONAL, - IN KTMOBJECT_TYPE QueryType, - IN OUT PKTMOBJECT_CURSOR ObjectCursor, - IN ULONG ObjectCursorLength, - OUT PULONG ReturnLength); + _In_opt_ HANDLE RootObjectHandle, + _In_ KTMOBJECT_TYPE QueryType, + _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor, + _In_ ULONG ObjectCursorLength, + _Out_ PULONG ReturnLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ LPGUID Uow, + _In_opt_ HANDLE TmHandle, + _In_opt_ ULONG CreateOptions, + _In_opt_ ULONG IsolationLevel, + _In_opt_ ULONG IsolationFlags, + _In_opt_ PLARGE_INTEGER Timeout, + _In_opt_ PUNICODE_STRING Description); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenTransaction( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN LPGUID Uow, - IN HANDLE TmHandle OPTIONAL); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ LPGUID Uow, + _In_opt_ HANDLE TmHandle); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - OUT PVOID TransactionInformation, - IN ULONG TransactionInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_ HANDLE TransactionHandle, + _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation, + _In_ ULONG TransactionInformationLength, + _Out_opt_ PULONG ReturnLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - IN PVOID TransactionInformation, - IN ULONG TransactionInformationLength); + _In_ HANDLE TransactionHandle, + _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + _In_reads_bytes_(TransactionInformationLength) PVOID TransactionInformation, + _In_ ULONG TransactionInformationLength); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCommitTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRollbackTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _Out_ PHANDLE EnlistmentHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE ResourceManagerHandle, + _In_ HANDLE TransactionHandle, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ ULONG CreateOptions, + _In_ NOTIFICATION_MASK NotificationMask, + _In_opt_ PVOID EnlistmentKey); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenEnlistment( - OUT PHANDLE EnlistmentHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE ResourceManagerHandle, - IN LPGUID EnlistmentGuid, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + _Out_ PHANDLE EnlistmentHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE ResourceManagerHandle, + _In_ LPGUID EnlistmentGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationEnlistment( - IN HANDLE EnlistmentHandle, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - OUT PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength, - OUT PULONG ReturnLength); + _In_ HANDLE EnlistmentHandle, + _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation, + _In_ ULONG EnlistmentInformationLength, + _Out_ PULONG ReturnLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationEnlistment( - IN HANDLE EnlistmentHandle OPTIONAL, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - IN PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength); + _In_opt_ HANDLE EnlistmentHandle, + _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation, + _In_ ULONG EnlistmentInformationLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRecoverEnlistment( - IN HANDLE EnlistmentHandle, - IN PVOID EnlistmentKey OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PVOID EnlistmentKey); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrePrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCommitEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRollbackEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrePrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCommitComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtReadOnlyEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRollbackComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSinglePhaseReject( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _Out_ PHANDLE ResourceManagerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE TmHandle, + _In_ LPGUID RmGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ ULONG CreateOptions, + _In_opt_ PUNICODE_STRING Description); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenResourceManager( - OUT PHANDLE ResourceManagerHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE TmHandle, - IN LPGUID ResourceManagerGuid OPTIONAL, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + _Out_ PHANDLE ResourceManagerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE TmHandle, + _In_opt_ LPGUID ResourceManagerGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRecoverResourceManager( - IN HANDLE ResourceManagerHandle); + _In_ HANDLE ResourceManagerHandle); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _In_ HANDLE ResourceManagerHandle, + _Out_ PTRANSACTION_NOTIFICATION TransactionNotification, + _In_ ULONG NotificationLength, + _In_opt_ PLARGE_INTEGER Timeout, + _Out_opt_ PULONG ReturnLength, + _In_ ULONG Asynchronous, + _In_opt_ ULONG_PTR AsynchronousContext); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - OUT PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_ HANDLE ResourceManagerHandle, + _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation, + _In_ ULONG ResourceManagerInformationLength, + _Out_opt_ PULONG ReturnLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - IN PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength); + _In_ HANDLE ResourceManagerHandle, + _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation, + _In_ ULONG ResourceManagerInformationLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRegisterProtocolAddressInformation( - IN HANDLE ResourceManager, - IN PCRM_PROTOCOL_ID ProtocolId, - IN ULONG ProtocolInformationSize, - IN PVOID ProtocolInformation, - IN ULONG CreateOptions OPTIONAL); + _In_ HANDLE ResourceManager, + _In_ PCRM_PROTOCOL_ID ProtocolId, + _In_ ULONG ProtocolInformationSize, + _In_ PVOID ProtocolInformation, + _In_opt_ ULONG CreateOptions); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPropagationComplete( - IN HANDLE ResourceManagerHandle, - IN ULONG RequestCookie, - IN ULONG BufferLength, - IN PVOID Buffer); + _In_ HANDLE ResourceManagerHandle, + _In_ ULONG RequestCookie, + _In_ ULONG BufferLength, + _In_ PVOID Buffer); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPropagationFailed( - IN HANDLE ResourceManagerHandle, - IN ULONG RequestCookie, - IN NTSTATUS PropStatus); + _In_ HANDLE ResourceManagerHandle, + _In_ ULONG RequestCookie, + _In_ NTSTATUS PropStatus); #endif /* NTDDI_VERSION >= NTDDI_VISTA */ diff --git a/reactos/include/xdk/obfuncs.h b/reactos/include/xdk/obfuncs.h index ac427516c97..dc7d0ca824e 100644 --- a/reactos/include/xdk/obfuncs.h +++ b/reactos/include/xdk/obfuncs.h @@ -6,54 +6,60 @@ $endif (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WIN2K) $if (_WDMDDK_) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG_PTR FASTCALL ObfDereferenceObject( - IN PVOID Object); + _In_ PVOID Object); #define ObDereferenceObject ObfDereferenceObject +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI ObGetObjectSecurity( - IN PVOID Object, - OUT PSECURITY_DESCRIPTOR *SecurityDescriptor, - OUT PBOOLEAN MemoryAllocated); + _In_ PVOID Object, + _Out_ PSECURITY_DESCRIPTOR *SecurityDescriptor, + _Out_ PBOOLEAN MemoryAllocated); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG_PTR FASTCALL ObfReferenceObject( - IN PVOID Object); + _In_ PVOID Object); #define ObReferenceObject ObfReferenceObject +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI ObReferenceObjectByHandle( - IN HANDLE Handle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - OUT PVOID *Object, - OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL); + _In_ HANDLE Handle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PVOID *Object, + _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ObReferenceObjectByPointer( - IN PVOID Object, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode); + _In_ PVOID Object, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ObReleaseObjectSecurity( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN BOOLEAN MemoryAllocated); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ BOOLEAN MemoryAllocated); $endif (_WDMDDK_) $if (_NTIFS_) @@ -61,46 +67,46 @@ NTKERNELAPI NTSTATUS NTAPI ObInsertObject( - IN PVOID Object, - IN OUT PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess OPTIONAL, - IN ULONG ObjectPointerBias, - OUT PVOID *NewObject OPTIONAL, - OUT PHANDLE Handle OPTIONAL); + _In_ PVOID Object, + _Inout_opt_ PACCESS_STATE PassedAccessState, + _In_opt_ ACCESS_MASK DesiredAccess, + _In_ ULONG ObjectPointerBias, + _Out_opt_ PVOID *NewObject, + _Out_opt_ PHANDLE Handle); NTKERNELAPI NTSTATUS NTAPI ObOpenObjectByPointer( - IN PVOID Object, - IN ULONG HandleAttributes, - IN PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess OPTIONAL, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - OUT PHANDLE Handle); + _In_ PVOID Object, + _In_ ULONG HandleAttributes, + _In_opt_ PACCESS_STATE PassedAccessState, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PHANDLE Handle); NTKERNELAPI VOID NTAPI ObMakeTemporaryObject( - IN PVOID Object); + _In_ PVOID Object); NTKERNELAPI NTSTATUS NTAPI ObQueryNameString( - IN PVOID Object, - OUT POBJECT_NAME_INFORMATION ObjectNameInfo OPTIONAL, - IN ULONG Length, - OUT PULONG ReturnLength); + _In_ PVOID Object, + _Out_writes_bytes_opt_(Length) POBJECT_NAME_INFORMATION ObjectNameInfo, + _In_ ULONG Length, + _Out_ PULONG ReturnLength); NTKERNELAPI NTSTATUS NTAPI ObQueryObjectAuditingByHandle( - IN HANDLE Handle, - OUT PBOOLEAN GenerateOnClose); + _In_ HANDLE Handle, + _Out_ PBOOLEAN GenerateOnClose); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -110,7 +116,7 @@ NTKERNELAPI VOID NTAPI ObDereferenceObjectDeferDelete( - IN PVOID Object); + _In_ PVOID Object); $endif (_WDMDDK_) $if (_NTIFS_) @@ -118,7 +124,7 @@ NTKERNELAPI BOOLEAN NTAPI ObIsKernelHandle( - IN HANDLE Handle); + _In_ HANDLE Handle); $endif (_NTIFS_) #endif @@ -128,14 +134,14 @@ NTKERNELAPI NTSTATUS NTAPI ObRegisterCallbacks( - IN POB_CALLBACK_REGISTRATION CallbackRegistration, - OUT PVOID *RegistrationHandle); + _In_ POB_CALLBACK_REGISTRATION CallbackRegistration, + _Outptr_ PVOID *RegistrationHandle); NTKERNELAPI VOID NTAPI ObUnRegisterCallbacks( - IN PVOID RegistrationHandle); + _In_ PVOID RegistrationHandle); NTKERNELAPI USHORT @@ -147,48 +153,52 @@ $endif (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WIN7) $if (_WDMDDK_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI ObReferenceObjectByHandleWithTag( - IN HANDLE Handle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - IN ULONG Tag, - OUT PVOID *Object, - OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL); + _In_ HANDLE Handle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode, + _In_ ULONG Tag, + _Out_ PVOID *Object, + _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG_PTR FASTCALL ObfReferenceObjectWithTag( - IN PVOID Object, - IN ULONG Tag); + _In_ PVOID Object, + _In_ ULONG Tag); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ObReferenceObjectByPointerWithTag( - IN PVOID Object, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - IN ULONG Tag); + _In_ PVOID Object, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode, + _In_ ULONG Tag); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG_PTR FASTCALL ObfDereferenceObjectWithTag( - IN PVOID Object, - IN ULONG Tag); + _In_ PVOID Object, + _In_ ULONG Tag); NTKERNELAPI VOID NTAPI ObDereferenceObjectDeferDeleteWithTag( - IN PVOID Object, - IN ULONG Tag); + _In_ PVOID Object, + _In_ ULONG Tag); #define ObDereferenceObject ObfDereferenceObject #define ObReferenceObject ObfReferenceObject @@ -201,14 +211,14 @@ NTKERNELAPI NTSTATUS NTAPI ObOpenObjectByPointerWithTag( - IN PVOID Object, - IN ULONG HandleAttributes, - IN PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - IN ULONG Tag, - OUT PHANDLE Handle); + _In_ PVOID Object, + _In_ ULONG HandleAttributes, + _In_opt_ PACCESS_STATE PassedAccessState, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode, + _In_ ULONG Tag, + _Out_ PHANDLE Handle); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ diff --git a/reactos/include/xdk/obtypes.h b/reactos/include/xdk/obtypes.h index 4485febc89f..7063ab1d1e3 100644 --- a/reactos/include/xdk/obtypes.h +++ b/reactos/include/xdk/obtypes.h @@ -31,64 +31,64 @@ typedef ULONG OB_OPERATION; #define OB_OPERATION_HANDLE_DUPLICATE 0x00000002 typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION { - IN OUT ACCESS_MASK DesiredAccess; - IN ACCESS_MASK OriginalDesiredAccess; + _Inout_ 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; + _Inout_ 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; + _Inout_ OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation; + _Inout_ OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; } OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS; typedef struct _OB_PRE_OPERATION_INFORMATION { - IN OB_OPERATION Operation; + _In_ OB_OPERATION Operation; _ANONYMOUS_UNION union { - IN ULONG Flags; + _In_ ULONG Flags; _ANONYMOUS_STRUCT struct { - IN ULONG KernelHandle:1; - IN ULONG Reserved:31; + _In_ ULONG KernelHandle:1; + _In_ ULONG Reserved:31; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; - IN PVOID Object; - IN POBJECT_TYPE ObjectType; - OUT PVOID CallContext; - IN POB_PRE_OPERATION_PARAMETERS Parameters; + _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; + _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; + _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; + _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; + _In_ OB_OPERATION Operation; _ANONYMOUS_UNION union { - IN ULONG Flags; + _In_ ULONG Flags; _ANONYMOUS_STRUCT struct { - IN ULONG KernelHandle:1; - IN ULONG Reserved:31; + _In_ ULONG KernelHandle:1; + _In_ ULONG Reserved:31; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; - IN PVOID Object; - IN POBJECT_TYPE ObjectType; - IN PVOID CallContext; - IN NTSTATUS ReturnStatus; - IN POB_POST_OPERATION_PARAMETERS Parameters; + _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 { @@ -97,27 +97,27 @@ typedef enum _OB_PREOP_CALLBACK_STATUS { typedef OB_PREOP_CALLBACK_STATUS (NTAPI *POB_PRE_OPERATION_CALLBACK)( - IN PVOID RegistrationContext, - IN OUT POB_PRE_OPERATION_INFORMATION OperationInformation); + _In_ PVOID RegistrationContext, + _Inout_ POB_PRE_OPERATION_INFORMATION OperationInformation); typedef VOID (NTAPI *POB_POST_OPERATION_CALLBACK)( - IN PVOID RegistrationContext, - IN POB_POST_OPERATION_INFORMATION OperationInformation); + _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; + _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; + _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 { diff --git a/reactos/include/xdk/pofuncs.h b/reactos/include/xdk/pofuncs.h index a713c891340..7483576200e 100644 --- a/reactos/include/xdk/pofuncs.h +++ b/reactos/include/xdk/pofuncs.h @@ -7,65 +7,73 @@ $if (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoCallDriver( - IN struct _DEVICE_OBJECT *DeviceObject, - IN OUT struct _IRP *Irp); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ __drv_aliasesMem struct _IRP *Irp); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PULONG NTAPI PoRegisterDeviceForIdleDetection( - IN struct _DEVICE_OBJECT *DeviceObject, - IN ULONG ConservationIdleTime, - IN ULONG PerformanceIdleTime, - IN DEVICE_POWER_STATE State); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ ULONG ConservationIdleTime, + _In_ ULONG PerformanceIdleTime, + _In_ DEVICE_POWER_STATE State); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI PoRegisterSystemState( - IN OUT PVOID StateHandle OPTIONAL, - IN EXECUTION_STATE Flags); + _Inout_opt_ PVOID StateHandle, + _In_ EXECUTION_STATE Flags); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoRequestPowerIrp( - IN struct _DEVICE_OBJECT *DeviceObject, - IN UCHAR MinorFunction, - IN POWER_STATE PowerState, - IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL, - IN PVOID Context OPTIONAL, - OUT struct _IRP **Irp OPTIONAL); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ UCHAR MinorFunction, + _In_ POWER_STATE PowerState, + _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction, + _In_opt_ __drv_aliasesMem PVOID Context, + _Outptr_opt_ struct _IRP **Irp); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI POWER_STATE NTAPI PoSetPowerState( - IN struct _DEVICE_OBJECT *DeviceObject, - IN POWER_STATE_TYPE Type, - IN POWER_STATE State); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ POWER_STATE_TYPE Type, + _In_ POWER_STATE State); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI PoSetSystemState( - IN EXECUTION_STATE Flags); + _In_ EXECUTION_STATE Flags); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI PoStartNextPowerIrp( - IN OUT struct _IRP *Irp); + _Inout_ struct _IRP *Irp); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI PoUnregisterSystemState( - IN OUT PVOID StateHandle); + _Inout_ PVOID StateHandle); NTKERNELAPI NTSTATUS @@ -78,43 +86,48 @@ $endif (_WDMDDK_) $if (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoQueueShutdownWorkItem( - IN OUT PWORK_QUEUE_ITEM WorkItem); + _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem); #endif $endif (_NTIFS_) $if (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI PoSetSystemWake( - IN OUT struct _IRP *Irp); + _Inout_ struct _IRP *Irp); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI PoGetSystemWake( - IN struct _IRP *Irp); + _In_ struct _IRP *Irp); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoRegisterPowerSettingCallback( - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN LPCGUID SettingGuid, - IN PPOWER_SETTING_CALLBACK Callback, - IN PVOID Context OPTIONAL, - OUT PVOID *Handle OPTIONAL); + _In_opt_ PDEVICE_OBJECT DeviceObject, + _In_ LPCGUID SettingGuid, + _In_ PPOWER_SETTING_CALLBACK Callback, + _In_opt_ PVOID Context, + _Outptr_opt_ PVOID *Handle); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoUnregisterPowerSettingCallback( - IN OUT PVOID Handle); + _Inout_ PVOID Handle); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -123,7 +136,7 @@ NTKERNELAPI VOID NTAPI PoSetDeviceBusyEx( - IN OUT PULONG IdlePointer); + _Inout_ PULONG IdlePointer); #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */ #if (NTDDI_VERSION >= NTDDI_WIN7) @@ -132,48 +145,53 @@ NTKERNELAPI VOID NTAPI PoStartDeviceBusy( - IN OUT PULONG IdlePointer); + _Inout_ PULONG IdlePointer); NTKERNELAPI VOID NTAPI PoEndDeviceBusy( - IN OUT PULONG IdlePointer); + _Inout_ PULONG IdlePointer); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI PoQueryWatchdogTime( - IN PDEVICE_OBJECT Pdo, - OUT PULONG SecondsRemaining); + _In_ PDEVICE_OBJECT Pdo, + _Out_ PULONG SecondsRemaining); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI PoDeletePowerRequest( - IN OUT PVOID PowerRequest); + _Inout_ PVOID PowerRequest); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoSetPowerRequest( - IN OUT PVOID PowerRequest, - IN POWER_REQUEST_TYPE Type); + _Inout_ PVOID PowerRequest, + _In_ POWER_REQUEST_TYPE Type); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoClearPowerRequest( - IN OUT PVOID PowerRequest, - IN POWER_REQUEST_TYPE Type); + _Inout_ PVOID PowerRequest, + _In_ POWER_REQUEST_TYPE Type); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoCreatePowerRequest( - OUT PVOID *PowerRequest, - IN PDEVICE_OBJECT DeviceObject, - IN PCOUNTED_REASON_CONTEXT Context); + _Outptr_ PVOID *PowerRequest, + _In_ PDEVICE_OBJECT DeviceObject, + _In_opt_ PCOUNTED_REASON_CONTEXT Context); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ diff --git a/reactos/include/xdk/potypes.h b/reactos/include/xdk/potypes.h index 3344aafd880..c720d260d87 100644 --- a/reactos/include/xdk/potypes.h +++ b/reactos/include/xdk/potypes.h @@ -392,22 +392,25 @@ DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82 #define POWER_DEVICE_IDLE_POLICY_PERFORMANCE 0 #define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE 1 +_Function_class_(REQUEST_POWER_COMPLETE) +_IRQL_requires_same_ typedef VOID (NTAPI REQUEST_POWER_COMPLETE)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN UCHAR MinorFunction, - IN POWER_STATE PowerState, - IN PVOID Context, - IN struct _IO_STATUS_BLOCK *IoStatus); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ UCHAR MinorFunction, + _In_ POWER_STATE PowerState, + _In_opt_ PVOID Context, + _In_ struct _IO_STATUS_BLOCK *IoStatus); typedef REQUEST_POWER_COMPLETE *PREQUEST_POWER_COMPLETE; -typedef -NTSTATUS +_Function_class_(POWER_SETTING_CALLBACK) +_IRQL_requires_same_ +typedef NTSTATUS (NTAPI POWER_SETTING_CALLBACK)( - IN LPCGUID SettingGuid, - IN PVOID Value, - IN ULONG ValueLength, - IN OUT PVOID Context OPTIONAL); + _In_ LPCGUID SettingGuid, + _In_reads_bytes_(ValueLength) PVOID Value, + _In_ ULONG ValueLength, + _Inout_opt_ PVOID Context); typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK; $endif (_WDMDDK_) $if (_NTIFS_) diff --git a/reactos/include/xdk/psfuncs.h b/reactos/include/xdk/psfuncs.h index f76d96ff58c..b6d4f803133 100644 --- a/reactos/include/xdk/psfuncs.h +++ b/reactos/include/xdk/psfuncs.h @@ -7,8 +7,8 @@ NTKERNELAPI NTSTATUS NTAPI PsWrapApcWow64Thread( - IN OUT PVOID *ApcContext, - IN OUT PVOID *ApcRoutine); + _Inout_ PVOID *ApcContext, + _Inout_ PVOID *ApcRoutine); /* * PEPROCESS @@ -18,6 +18,7 @@ PsWrapApcWow64Thread( #if !defined(_PSGETCURRENTTHREAD_) #define _PSGETCURRENTTHREAD_ +_IRQL_requires_max_(DISPATCH_LEVEL) FORCEINLINE PETHREAD NTAPI @@ -30,14 +31,15 @@ PsGetCurrentThread(VOID) $endif (_WDMDDK_) $if (_NTDDK_) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenProcess( - OUT PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN PCLIENT_ID ClientId OPTIONAL); + _Out_ PHANDLE ProcessHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PCLIENT_ID ClientId); NTSYSCALLAPI NTSTATUS @@ -51,69 +53,81 @@ NtQueryInformationProcess( $endif (_NTDDK_) $if (_NTIFS_) +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsLookupProcessByProcessId( - IN HANDLE ProcessId, - OUT PEPROCESS *Process); + _In_ HANDLE ProcessId, + _Outptr_ PEPROCESS *Process); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsLookupThreadByThreadId( - IN HANDLE UniqueThreadId, - OUT PETHREAD *Thread); + _In_ HANDLE UniqueThreadId, + _Outptr_ PETHREAD *Thread); $endif (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WIN2K) $if (_WDMDDK_) +_IRQL_requires_max_(APC_LEVEL) +_Post_satisfies_(return <= 0) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI PsCreateSystemThread( - OUT PHANDLE ThreadHandle, - IN ULONG DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN HANDLE ProcessHandle OPTIONAL, - OUT PCLIENT_ID ClientId OPTIONAL, - IN PKSTART_ROUTINE StartRoutine, - IN PVOID StartContext OPTIONAL); + _Out_ PHANDLE ThreadHandle, + _In_ ULONG DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ HANDLE ProcessHandle, + _Out_opt_ PCLIENT_ID ClientId, + _In_ PKSTART_ROUTINE StartRoutine, + _In_opt_ _When_(return==0, __drv_aliasesMem) PVOID StartContext); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsTerminateSystemThread( - IN NTSTATUS ExitStatus); + _In_ NTSTATUS ExitStatus); $endif (_WDMDDK_) $if (_NTDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsSetCreateProcessNotifyRoutine( - IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, - IN BOOLEAN Remove); + _In_ PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, + _In_ BOOLEAN Remove); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsSetCreateThreadNotifyRoutine( - IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); + _In_ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsSetLoadImageNotifyRoutine( - IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); + _In_ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); NTKERNELAPI HANDLE NTAPI PsGetCurrentProcessId(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI HANDLE NTAPI @@ -130,83 +144,95 @@ PsGetVersion( $endif (_NTDDK_) $if (_NTIFS_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PACCESS_TOKEN NTAPI PsReferenceImpersonationToken( - IN OUT PETHREAD Thread, - OUT PBOOLEAN CopyOnOpen, - OUT PBOOLEAN EffectiveOnly, - OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel); + _Inout_ PETHREAD Thread, + _Out_ PBOOLEAN CopyOnOpen, + _Out_ PBOOLEAN EffectiveOnly, + _Out_ PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI LARGE_INTEGER NTAPI PsGetProcessExitTime(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI PsIsThreadTerminating( - IN PETHREAD Thread); + _In_ PETHREAD Thread); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsImpersonateClient( - IN OUT PETHREAD Thread, - IN PACCESS_TOKEN Token, - IN BOOLEAN CopyOnOpen, - IN BOOLEAN EffectiveOnly, - IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel); + _Inout_ PETHREAD Thread, + _In_opt_ PACCESS_TOKEN Token, + _In_ BOOLEAN CopyOnOpen, + _In_ BOOLEAN EffectiveOnly, + _In_ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI PsDisableImpersonation( - IN OUT PETHREAD Thread, - IN OUT PSE_IMPERSONATION_STATE ImpersonationState); + _Inout_ PETHREAD Thread, + _Inout_ PSE_IMPERSONATION_STATE ImpersonationState); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI PsRestoreImpersonation( - IN PETHREAD Thread, - IN PSE_IMPERSONATION_STATE ImpersonationState); + _Inout_ PETHREAD Thread, + _In_ PSE_IMPERSONATION_STATE ImpersonationState); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI PsRevertToSelf(VOID); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI PsChargePoolQuota( - IN PEPROCESS Process, - IN POOL_TYPE PoolType, - IN ULONG_PTR Amount); + _In_ PEPROCESS Process, + _In_ POOL_TYPE PoolType, + _In_ ULONG_PTR Amount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI PsReturnPoolQuota( - IN PEPROCESS Process, - IN POOL_TYPE PoolType, - IN ULONG_PTR Amount); + _In_ PEPROCESS Process, + _In_ POOL_TYPE PoolType, + _In_ ULONG_PTR Amount); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsAssignImpersonationToken( - IN PETHREAD Thread, - IN HANDLE Token OPTIONAL); + _In_ PETHREAD Thread, + _In_opt_ HANDLE Token); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI HANDLE NTAPI PsReferencePrimaryToken( - IN OUT PEPROCESS Process); + _Inout_ PEPROCESS Process); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ $if (_NTDDK_ || _NTIFS_) @@ -214,63 +240,71 @@ $if (_NTDDK_ || _NTIFS_) $endif (_NTDDK_ || _NTIFS_) $if (_NTDDK_) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI HANDLE NTAPI PsGetProcessId( - IN PEPROCESS Process); + _In_ PEPROCESS Process); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI HANDLE NTAPI PsGetThreadId( - IN PETHREAD Thread); + _In_ PETHREAD Thread); NTKERNELAPI NTSTATUS NTAPI PsRemoveCreateThreadNotifyRoutine( - IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); + _In_ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsRemoveLoadImageNotifyRoutine( - IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); + _In_ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONGLONG NTAPI PsGetProcessCreateTimeQuadPart( - IN PEPROCESS Process); + _In_ PEPROCESS Process); $endif (_NTDDK_) $if (_NTIFS_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI PsDereferencePrimaryToken( - IN PACCESS_TOKEN PrimaryToken); + _In_ PACCESS_TOKEN PrimaryToken); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI PsDereferenceImpersonationToken( - IN PACCESS_TOKEN ImpersonationToken); + _In_ PACCESS_TOKEN ImpersonationToken); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsChargeProcessPoolQuota( - IN PEPROCESS Process, - IN POOL_TYPE PoolType, - IN ULONG_PTR Amount); + _In_ PEPROCESS Process, + _In_ POOL_TYPE PoolType, + _In_ ULONG_PTR Amount); NTKERNELAPI BOOLEAN NTAPI PsIsSystemThread( - IN PETHREAD Thread); + _In_ PETHREAD Thread); $endif (_NTIFS_) $if (_NTDDK_ || _NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ diff --git a/reactos/include/xdk/pstypes.h b/reactos/include/xdk/pstypes.h index c3f630ca7c9..3786b0ca228 100644 --- a/reactos/include/xdk/pstypes.h +++ b/reactos/include/xdk/pstypes.h @@ -152,44 +152,44 @@ typedef struct _PROCESS_ACCESS_TOKEN { #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; + _In_ HANDLE ExceptionPortHandle; + _Inout_ ULONG StateFlags; } PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT; typedef VOID (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)( - IN HANDLE ParentId, - IN HANDLE ProcessId, - IN BOOLEAN Create); + _In_ HANDLE ParentId, + _In_ HANDLE ProcessId, + _In_ BOOLEAN Create); typedef struct _PS_CREATE_NOTIFY_INFO { - IN SIZE_T Size; + _In_ SIZE_T Size; _ANONYMOUS_UNION union { - IN ULONG Flags; + _In_ ULONG Flags; _ANONYMOUS_STRUCT struct { - IN ULONG FileOpenNameAvailable:1; - IN ULONG Reserved:31; + _In_ ULONG FileOpenNameAvailable:1; + _In_ ULONG Reserved:31; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; - 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; + _In_ HANDLE ParentProcessId; + _In_ CLIENT_ID CreatingThreadId; + _Inout_ struct _FILE_OBJECT *FileObject; + _In_ PCUNICODE_STRING ImageFileName; + _In_opt_ PCUNICODE_STRING CommandLine; + _Inout_ 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); + _Inout_ PEPROCESS Process, + _In_ HANDLE ProcessId, + _Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo); typedef VOID (NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)( - IN HANDLE ProcessId, - IN HANDLE ThreadId, - IN BOOLEAN Create); + _In_ HANDLE ProcessId, + _In_ HANDLE ThreadId, + _In_ BOOLEAN Create); #define IMAGE_ADDRESSING_MODE_32BIT 3 @@ -218,9 +218,9 @@ typedef struct _IMAGE_INFO_EX { typedef VOID (NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)( - IN PUNICODE_STRING FullImageName, - IN HANDLE ProcessId, - IN PIMAGE_INFO ImageInfo); + _In_ PUNICODE_STRING FullImageName, + _In_ HANDLE ProcessId, + _In_ PIMAGE_INFO ImageInfo); #define THREAD_CSWITCH_PMU_DISABLE FALSE #define THREAD_CSWITCH_PMU_ENABLE TRUE diff --git a/reactos/include/xdk/rtlfuncs.h b/reactos/include/xdk/rtlfuncs.h index fa37ab7d2e0..187efdec8b9 100644 --- a/reactos/include/xdk/rtlfuncs.h +++ b/reactos/include/xdk/rtlfuncs.h @@ -11,15 +11,16 @@ $if (_WDMDDK_) FORCEINLINE VOID InitializeListHead( - OUT PLIST_ENTRY ListHead) + _Out_ PLIST_ENTRY ListHead) { ListHead->Flink = ListHead->Blink = ListHead; } +_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty( - IN CONST LIST_ENTRY * ListHead) + _In_ const LIST_ENTRY * ListHead) { return (BOOLEAN)(ListHead->Flink == ListHead); } @@ -27,7 +28,7 @@ IsListEmpty( FORCEINLINE BOOLEAN RemoveEntryList( - IN PLIST_ENTRY Entry) + _In_ PLIST_ENTRY Entry) { PLIST_ENTRY OldFlink; PLIST_ENTRY OldBlink; @@ -42,7 +43,7 @@ RemoveEntryList( FORCEINLINE PLIST_ENTRY RemoveHeadList( - IN OUT PLIST_ENTRY ListHead) + _Inout_ PLIST_ENTRY ListHead) { PLIST_ENTRY Flink; PLIST_ENTRY Entry; @@ -57,7 +58,7 @@ RemoveHeadList( FORCEINLINE PLIST_ENTRY RemoveTailList( - IN OUT PLIST_ENTRY ListHead) + _Inout_ PLIST_ENTRY ListHead) { PLIST_ENTRY Blink; PLIST_ENTRY Entry; @@ -72,8 +73,8 @@ RemoveTailList( FORCEINLINE VOID InsertTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) + _Inout_ PLIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PLIST_ENTRY Entry) { PLIST_ENTRY OldBlink; OldBlink = ListHead->Blink; @@ -86,8 +87,8 @@ InsertTailList( FORCEINLINE VOID InsertHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) + _Inout_ PLIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PLIST_ENTRY Entry) { PLIST_ENTRY OldFlink; OldFlink = ListHead->Flink; @@ -100,8 +101,8 @@ InsertHeadList( FORCEINLINE VOID AppendTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY ListToAppend) + _Inout_ PLIST_ENTRY ListHead, + _Inout_ PLIST_ENTRY ListToAppend) { PLIST_ENTRY ListEnd = ListHead->Blink; @@ -114,7 +115,7 @@ AppendTailList( FORCEINLINE PSINGLE_LIST_ENTRY PopEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead) + _Inout_ PSINGLE_LIST_ENTRY ListHead) { PSINGLE_LIST_ENTRY FirstEntry; FirstEntry = ListHead->Next; @@ -127,8 +128,8 @@ PopEntryList( FORCEINLINE VOID PushEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PSINGLE_LIST_ENTRY Entry) + _Inout_ PSINGLE_LIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY Entry) { Entry->Next = ListHead->Next; ListHead->Next = Entry; @@ -136,14 +137,15 @@ PushEntryList( #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */ +__analysis_noreturn NTSYSAPI VOID NTAPI RtlAssert( - IN PVOID FailedAssertion, - IN PVOID FileName, - IN ULONG LineNumber, - IN PSTR Message); + _In_ PVOID FailedAssertion, + _In_ PVOID FileName, + _In_ ULONG LineNumber, + _In_opt_ PSTR Message); /* VOID * RtlCopyMemory( @@ -161,9 +163,9 @@ NTSYSAPI VOID NTAPI RtlCopyMemoryNonTemporal( - VOID UNALIGNED *Destination, - CONST VOID UNALIGNED *Source, - SIZE_T Length); + _Out_writes_bytes_all_(Length) VOID UNALIGNED *Destination, + _In_reads_bytes_(Length) const VOID UNALIGNED *Source, + _In_ SIZE_T Length); #else #define RtlCopyMemoryNonTemporal RtlCopyMemory #endif @@ -196,25 +198,33 @@ RtlCopyMemoryNonTemporal( #define RtlFillBytes RtlFillMemory +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlFreeUnicodeString( - IN OUT PUNICODE_STRING UnicodeString); + _Inout_ _At_(UnicodeString->Buffer, __drv_freesMem(Mem)) + PUNICODE_STRING UnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlGUIDFromString( - IN PUNICODE_STRING GuidString, - OUT GUID *Guid); + _In_ PUNICODE_STRING GuidString, + _Out_ GUID *Guid); +_IRQL_requires_max_(DISPATCH_LEVEL) +_At_(DestinationString->Buffer, _Post_equal_to_(SourceString)) +//_At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR))) +_At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(WCHAR))) NTSYSAPI VOID NTAPI RtlInitUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCWSTR SourceString OPTIONAL); + _Out_ PUNICODE_STRING DestinationString, + _In_opt_z_ __drv_aliasesMem PCWSTR SourceString); /* VOID * RtlMoveMemory( @@ -225,12 +235,15 @@ RtlInitUnicodeString( #define RtlMoveMemory(Destination, Source, Length) \ memmove(Destination, Source, Length) +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlStringFromGUID( - IN REFGUID Guid, - OUT PUNICODE_STRING GuidString); + _In_ REFGUID Guid, + _Out_ _At_(GuidString->Buffer, __drv_allocatesMem(Mem)) + PUNICODE_STRING GuidString); /* VOID * RtlZeroMemory( @@ -246,35 +259,42 @@ $endif (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WIN2K) $if (_WDMDDK_) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlAreBitsClear( - IN PRTL_BITMAP BitMapHeader, - IN ULONG StartingIndex, - IN ULONG Length); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG StartingIndex, + _In_ ULONG Length); +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlAreBitsSet( - IN PRTL_BITMAP BitMapHeader, - IN ULONG StartingIndex, - IN ULONG Length); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG StartingIndex, + _In_ ULONG Length); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PANSI_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PUNICODE_STRING DestinationString, + _In_ PANSI_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI ULONG NTAPI RtlxAnsiStringToUnicodeSize( - IN PCANSI_STRING AnsiString); + _In_ PCANSI_STRING AnsiString); #define RtlAnsiStringToUnicodeSize(String) ( \ NLS_MB_CODE_PAGE_TAG ? \ @@ -282,119 +302,156 @@ RtlxAnsiStringToUnicodeSize( ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \ ) +_Success_(1) +_Unchanged_(Destination->MaximumLength) +_Unchanged_(Destination->Buffer) +_When_(_Old_(Destination->Length) + Source->Length <= Destination->MaximumLength, + _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + Source->Length)) + _At_(return, _Out_range_(==, 0))) +_When_(_Old_(Destination->Length) + Source->Length > Destination->MaximumLength, + _Unchanged_(Destination->Length) + _At_(return, _Out_range_(<, 0))) NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString( - IN OUT PUNICODE_STRING Destination, - IN PCUNICODE_STRING Source); + _Inout_ PUNICODE_STRING Destination, + _In_ PCUNICODE_STRING Source); +_Success_(1) +_Unchanged_(Destination->MaximumLength) +_Unchanged_(Destination->Buffer) +/* _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) <= Destination->MaximumLength, + _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR))) + _At_(return, _Out_range_(==, 0))) +_When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) > Destination->MaximumLength, + _Unchanged_(Destination->Length) + _At_(return, _Out_range_(<, 0))) */ NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeToString( - IN OUT PUNICODE_STRING Destination, - IN PCWSTR Source); + _Inout_ PUNICODE_STRING Destination, + _In_opt_z_ PCWSTR Source); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlCheckRegistryKey( - IN ULONG RelativeTo, - IN PWSTR Path); + _In_ ULONG RelativeTo, + _In_ PWSTR Path); NTSYSAPI VOID NTAPI RtlClearAllBits( - IN PRTL_BITMAP BitMapHeader); + _In_ PRTL_BITMAP BitMapHeader); NTSYSAPI VOID NTAPI RtlClearBits( - IN PRTL_BITMAP BitMapHeader, - IN ULONG StartingIndex, - IN ULONG NumberToClear); + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex, + _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear); +_Must_inspect_result_ NTSYSAPI SIZE_T NTAPI RtlCompareMemory( - IN CONST VOID *Source1, - IN CONST VOID *Source2, - IN SIZE_T Length); + _In_ const VOID *Source1, + _In_ const VOID *Source2, + _In_ SIZE_T Length); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI LONG NTAPI RtlCompareUnicodeString( - IN PCUNICODE_STRING String1, - IN PCUNICODE_STRING String2, - IN BOOLEAN CaseInSensitive); + _In_ PCUNICODE_STRING String1, + _In_ PCUNICODE_STRING String2, + _In_ BOOLEAN CaseInSensitive); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI LONG NTAPI RtlCompareUnicodeStrings( - IN PCWCH String1, - IN SIZE_T String1Length, - IN PCWCH String2, - IN SIZE_T String2Length, - IN BOOLEAN CaseInSensitive); + _In_reads_(String1Length) PCWCH String1, + _In_ SIZE_T String1Length, + _In_reads_(String2Length) PCWCH String2, + _In_ SIZE_T String2Length, + _In_ BOOLEAN CaseInSensitive); +_Unchanged_(DestinationString->Buffer) +_Unchanged_(DestinationString->MaximumLength) +_At_(DestinationString->Length, + _When_(SourceString->Length > DestinationString->MaximumLength, + _Post_equal_to_(DestinationString->MaximumLength)) + _When_(SourceString->Length <= DestinationString->MaximumLength, + _Post_equal_to_(SourceString->Length))) NTSYSAPI VOID NTAPI RtlCopyUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCUNICODE_STRING SourceString OPTIONAL); + _Inout_ PUNICODE_STRING DestinationString, + _In_opt_ PCUNICODE_STRING SourceString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCreateRegistryKey( - IN ULONG RelativeTo, - IN PWSTR Path); + _In_ ULONG RelativeTo, + _In_ PWSTR Path); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCreateSecurityDescriptor( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Revision); + _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ ULONG Revision); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDeleteRegistryValue( - IN ULONG RelativeTo, - IN PCWSTR Path, - IN PCWSTR ValueName); + _In_ ULONG RelativeTo, + _In_ PCWSTR Path, + _In_z_ PCWSTR ValueName); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString( - IN CONST UNICODE_STRING *String1, - IN CONST UNICODE_STRING *String2, - IN BOOLEAN CaseInSensitive); + _In_ CONST UNICODE_STRING *String1, + _In_ CONST UNICODE_STRING *String2, + _In_ BOOLEAN CaseInSensitive); #if !defined(_AMD64_) && !defined(_IA64_) NTSYSAPI LARGE_INTEGER NTAPI RtlExtendedIntegerMultiply( - IN LARGE_INTEGER Multiplicand, - IN LONG Multiplier); + _In_ LARGE_INTEGER Multiplicand, + _In_ LONG Multiplier); NTSYSAPI LARGE_INTEGER NTAPI RtlExtendedLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN ULONG Divisor, - OUT PULONG Remainder OPTIONAL); + _In_ LARGE_INTEGER Dividend, + _In_ ULONG Divisor, + _Out_opt_ PULONG Remainder); #endif #if defined(_X86_) || defined(_IA64_) @@ -402,137 +459,155 @@ NTSYSAPI LARGE_INTEGER NTAPI RtlExtendedMagicDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER MagicDivisor, - IN CCHAR ShiftCount); + _In_ LARGE_INTEGER Dividend, + _In_ LARGE_INTEGER MagicDivisor, + _In_ CCHAR ShiftCount); #endif +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlFreeAnsiString( - IN PANSI_STRING AnsiString); + _Inout_ _At_(AnsiString->Buffer, __drv_freesMem(Mem)) + PANSI_STRING AnsiString); +_Success_(return != -1) +_Must_inspect_result_ NTSYSAPI ULONG NTAPI RtlFindClearBits( - IN PRTL_BITMAP BitMapHeader, - IN ULONG NumberToFind, - IN ULONG HintIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG NumberToFind, + _In_ ULONG HintIndex); +_Success_(return != -1) NTSYSAPI ULONG NTAPI RtlFindClearBitsAndSet( - IN PRTL_BITMAP BitMapHeader, - IN ULONG NumberToFind, - IN ULONG HintIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG NumberToFind, + _In_ ULONG HintIndex); NTSYSAPI ULONG NTAPI RtlFindFirstRunClear( - IN PRTL_BITMAP BitMapHeader, - OUT PULONG StartingIndex); + _In_ PRTL_BITMAP BitMapHeader, + _Out_ PULONG StartingIndex); NTSYSAPI ULONG NTAPI RtlFindClearRuns( - IN PRTL_BITMAP BitMapHeader, - OUT PRTL_BITMAP_RUN RunArray, - IN ULONG SizeOfRunArray, - IN BOOLEAN LocateLongestRuns); + _In_ PRTL_BITMAP BitMapHeader, + _Out_writes_to_(SizeOfRunArray, return) PRTL_BITMAP_RUN RunArray, + _In_range_(>, 0) ULONG SizeOfRunArray, + _In_ BOOLEAN LocateLongestRuns); NTSYSAPI ULONG NTAPI RtlFindLastBackwardRunClear( - IN PRTL_BITMAP BitMapHeader, - IN ULONG FromIndex, - OUT PULONG StartingRunIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG FromIndex, + _Out_ PULONG StartingRunIndex); +_Success_(return != -1) +_Must_inspect_result_ NTSYSAPI CCHAR NTAPI RtlFindLeastSignificantBit( - IN ULONGLONG Set); + _In_ ULONGLONG Set); NTSYSAPI ULONG NTAPI RtlFindLongestRunClear( - IN PRTL_BITMAP BitMapHeader, - OUT PULONG StartingIndex); + _In_ PRTL_BITMAP BitMapHeader, + _Out_ PULONG StartingIndex); +_Success_(return != -1) +_Must_inspect_result_ NTSYSAPI CCHAR NTAPI RtlFindMostSignificantBit( - IN ULONGLONG Set); + _In_ ULONGLONG Set); NTSYSAPI ULONG NTAPI RtlFindNextForwardRunClear( - IN PRTL_BITMAP BitMapHeader, - IN ULONG FromIndex, - OUT PULONG StartingRunIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG FromIndex, + _Out_ PULONG StartingRunIndex); +_Success_(return != -1) +_Must_inspect_result_ NTSYSAPI ULONG NTAPI RtlFindSetBits( - IN PRTL_BITMAP BitMapHeader, - IN ULONG NumberToFind, - IN ULONG HintIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG NumberToFind, + _In_ ULONG HintIndex); +_Success_(return != -1) NTSYSAPI ULONG NTAPI RtlFindSetBitsAndClear( - IN PRTL_BITMAP BitMapHeader, - IN ULONG NumberToFind, - IN ULONG HintIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG NumberToFind, + _In_ ULONG HintIndex); +_IRQL_requires_max_(DISPATCH_LEVEL) NTSYSAPI VOID NTAPI RtlInitAnsiString( - IN OUT PANSI_STRING DestinationString, - IN PCSZ SourceString); + _Out_ PANSI_STRING DestinationString, + _In_opt_z_ __drv_aliasesMem PCSZ SourceString); NTSYSAPI VOID NTAPI RtlInitializeBitMap( - IN PRTL_BITMAP BitMapHeader, - IN PULONG BitMapBuffer, - IN ULONG SizeOfBitMap); + _Out_ PRTL_BITMAP BitMapHeader, + _In_ __drv_aliasesMem PULONG BitMapBuffer, + _In_ ULONG SizeOfBitMap); +_IRQL_requires_max_(DISPATCH_LEVEL) NTSYSAPI VOID NTAPI RtlInitString( - IN OUT PSTRING DestinationString, - IN PCSZ SourceString); + _Out_ PSTRING DestinationString, + _In_opt_z_ __drv_aliasesMem PCSZ SourceString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_At_(String->MaximumLength, _Const_) NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString( - IN ULONG Value, - IN ULONG Base OPTIONAL, - IN OUT PUNICODE_STRING String); + _In_ ULONG Value, + _In_opt_ ULONG Base, + _Inout_ PUNICODE_STRING String); +_IRQL_requires_max_(PASSIVE_LEVEL) +_At_(String->MaximumLength, _Const_) NTSYSAPI NTSTATUS NTAPI RtlInt64ToUnicodeString( - IN ULONGLONG Value, - IN ULONG Base OPTIONAL, - IN OUT PUNICODE_STRING String); + _In_ ULONGLONG Value, + _In_opt_ ULONG Base, + _Inout_ PUNICODE_STRING String); #ifdef _WIN64 #define RtlIntPtrToUnicodeString(Value, Base, String) \ @@ -549,33 +624,36 @@ RtlInt64ToUnicodeString( #define RtlIsZeroLuid(_L1) \ ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart))) +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI ULONG NTAPI RtlLengthSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); NTSYSAPI ULONG NTAPI RtlNumberOfClearBits( - IN PRTL_BITMAP BitMapHeader); + _In_ PRTL_BITMAP BitMapHeader); NTSYSAPI ULONG NTAPI RtlNumberOfSetBits( - IN PRTL_BITMAP BitMapHeader); + _In_ PRTL_BITMAP BitMapHeader); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlQueryRegistryValues( - IN ULONG RelativeTo, - IN PCWSTR Path, - IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable, - IN PVOID Context OPTIONAL, - IN PVOID Environment OPTIONAL); + _In_ ULONG RelativeTo, + _In_ PCWSTR Path, + _Inout_ _At_(*(*QueryTable).EntryContext, _Post_valid_) + PRTL_QUERY_REGISTRY_TABLE QueryTable, + _In_opt_ PVOID Context, + _In_opt_ PVOID Environment); #define SHORT_SIZE (sizeof(USHORT)) #define SHORT_MASK (SHORT_SIZE - 1) @@ -594,24 +672,25 @@ NTSYSAPI VOID NTAPI RtlSetAllBits( - IN PRTL_BITMAP BitMapHeader); + _In_ PRTL_BITMAP BitMapHeader); NTSYSAPI VOID NTAPI RtlSetBits( - IN PRTL_BITMAP BitMapHeader, - IN ULONG StartingIndex, - IN ULONG NumberToSet); + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex, + _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlSetDaclSecurityDescriptor( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN BOOLEAN DaclPresent, - IN PACL Dacl OPTIONAL, - IN BOOLEAN DaclDefaulted OPTIONAL); + _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ BOOLEAN DaclPresent, + _In_opt_ PACL Dacl, + _In_opt_ BOOLEAN DaclDefaulted); #if defined(_AMD64_) @@ -724,45 +803,57 @@ RtlSetDaclSecurityDescriptor( #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value) #endif /* _WIN64 */ +_Success_(return != 0) NTSYSAPI BOOLEAN NTAPI RtlTimeFieldsToTime( - IN PTIME_FIELDS TimeFields, - IN PLARGE_INTEGER Time); + _In_ PTIME_FIELDS TimeFields, + _Out_ PLARGE_INTEGER Time); NTSYSAPI VOID NTAPI RtlTimeToTimeFields( - IN PLARGE_INTEGER Time, - IN PTIME_FIELDS TimeFields); + _In_ PLARGE_INTEGER Time, + _Out_ PTIME_FIELDS TimeFields); NTSYSAPI ULONG FASTCALL RtlUlongByteSwap( - IN ULONG Source); + _In_ ULONG Source); NTSYSAPI ULONGLONG FASTCALL RtlUlonglongByteSwap( - IN ULONGLONG Source); + _In_ ULONGLONG Source); +_When_(AllocateDestinationString, + _At_(DestinationString->MaximumLength, + _Out_range_(<=, (SourceString->MaximumLength / sizeof(WCHAR))))) +_When_(!AllocateDestinationString, + _At_(DestinationString->Buffer, _Const_) + _At_(DestinationString->MaximumLength, _Const_)) +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(AllocateDestinationString, _Must_inspect_result_) NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString( - IN OUT PANSI_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PANSI_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI ULONG NTAPI RtlxUnicodeStringToAnsiSize( - IN PCUNICODE_STRING UnicodeString); + _In_ PCUNICODE_STRING UnicodeString); #define RtlUnicodeStringToAnsiSize(String) ( \ NLS_MB_CODE_PAGE_TAG ? \ @@ -770,50 +861,57 @@ RtlxUnicodeStringToAnsiSize( ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \ ) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger( - IN PCUNICODE_STRING String, - IN ULONG Base OPTIONAL, - OUT PULONG Value); + _In_ PCUNICODE_STRING String, + _In_opt_ ULONG Base, + _Out_ PULONG Value); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI WCHAR NTAPI RtlUpcaseUnicodeChar( - IN WCHAR SourceCharacter); + _In_ WCHAR SourceCharacter); NTSYSAPI USHORT FASTCALL RtlUshortByteSwap( - IN USHORT Source); + _In_ USHORT Source); +_IRQL_requires_max_(APC_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlValidRelativeSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptorInput, - IN ULONG SecurityDescriptorLength, - IN SECURITY_INFORMATION RequiredInformation); + _In_reads_bytes_(SecurityDescriptorLength) PSECURITY_DESCRIPTOR SecurityDescriptorInput, + _In_ ULONG SecurityDescriptorLength, + _In_ SECURITY_INFORMATION RequiredInformation); +_IRQL_requires_max_(APC_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlValidSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlWriteRegistryValue( - IN ULONG RelativeTo, - IN PCWSTR Path, - IN PCWSTR ValueName, - IN ULONG ValueType, - IN PVOID ValueData, - IN ULONG ValueLength); + _In_ ULONG RelativeTo, + _In_ PCWSTR Path, + _In_z_ PCWSTR ValueName, + _In_ ULONG ValueType, + _In_reads_bytes_opt_(ValueLength) PVOID ValueData, + _In_ ULONG ValueLength); $endif (_WDMDDK_) $if (_NTDDK_) @@ -824,87 +922,92 @@ 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); + _Out_ PRTL_GENERIC_TABLE Table, + _In_ PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine, + _In_ PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine, + _In_ PRTL_GENERIC_FREE_ROUTINE FreeRoutine, + _In_opt_ PVOID TableContext); NTSYSAPI PVOID NTAPI RtlInsertElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL); + _In_ PRTL_GENERIC_TABLE Table, + _In_reads_bytes_(BufferSize) PVOID Buffer, + _In_ CLONG BufferSize, + _Out_opt_ PBOOLEAN NewElement); 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); + _In_ PRTL_GENERIC_TABLE Table, + _In_reads_bytes_(BufferSize) PVOID Buffer, + _In_ CLONG BufferSize, + _Out_opt_ PBOOLEAN NewElement, + _In_ PVOID NodeOrParent, + _In_ TABLE_SEARCH_RESULT SearchResult); NTSYSAPI BOOLEAN NTAPI RtlDeleteElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer); + _In_ PRTL_GENERIC_TABLE Table, + _In_ PVOID Buffer); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlLookupElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer); + _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); + _In_ PRTL_GENERIC_TABLE Table, + _In_ PVOID Buffer, + _Out_ PVOID *NodeOrParent, + _Out_ TABLE_SEARCH_RESULT *SearchResult); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlEnumerateGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN BOOLEAN Restart); + _In_ PRTL_GENERIC_TABLE Table, + _In_ BOOLEAN Restart); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlEnumerateGenericTableWithoutSplaying( - IN PRTL_GENERIC_TABLE Table, - IN OUT PVOID *RestartKey); + _In_ PRTL_GENERIC_TABLE Table, + _Inout_ PVOID *RestartKey); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlGetElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN ULONG I); + _In_ PRTL_GENERIC_TABLE Table, + _In_ ULONG I); NTSYSAPI ULONG NTAPI RtlNumberGenericTableElements( - IN PRTL_GENERIC_TABLE Table); + _In_ PRTL_GENERIC_TABLE Table); +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlIsGenericTableEmpty( - IN PRTL_GENERIC_TABLE Table); + _In_ PRTL_GENERIC_TABLE Table); #endif /* !RTL_USE_AVL_TABLES */ @@ -914,81 +1017,94 @@ NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlSplay( - IN OUT PRTL_SPLAY_LINKS Links); + _Inout_ PRTL_SPLAY_LINKS Links); NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlDelete( - IN PRTL_SPLAY_LINKS Links); + _In_ PRTL_SPLAY_LINKS Links); NTSYSAPI VOID NTAPI RtlDeleteNoSplay( - IN PRTL_SPLAY_LINKS Links, - IN OUT PRTL_SPLAY_LINKS *Root); + _In_ PRTL_SPLAY_LINKS Links, + _Inout_ PRTL_SPLAY_LINKS *Root); +_Must_inspect_result_ NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlSubtreeSuccessor( - IN PRTL_SPLAY_LINKS Links); + _In_ PRTL_SPLAY_LINKS Links); +_Must_inspect_result_ NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlSubtreePredecessor( - IN PRTL_SPLAY_LINKS Links); + _In_ PRTL_SPLAY_LINKS Links); +_Must_inspect_result_ NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlRealSuccessor( - IN PRTL_SPLAY_LINKS Links); + _In_ PRTL_SPLAY_LINKS Links); +_Must_inspect_result_ NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlRealPredecessor( - IN PRTL_SPLAY_LINKS Links); + _In_ PRTL_SPLAY_LINKS Links); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString( - IN PCUNICODE_STRING String1, - IN PCUNICODE_STRING String2, - IN BOOLEAN CaseInSensitive); + _In_ PCUNICODE_STRING String1, + _In_ PCUNICODE_STRING String2, + _In_ BOOLEAN CaseInSensitive); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlUpperString( - IN OUT PSTRING DestinationString, - IN const PSTRING SourceString); + _Inout_ PSTRING DestinationString, + _In_ const PSTRING SourceString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(AllocateDestinationString, _Must_inspect_result_) NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PUNICODE_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI VOID NTAPI RtlMapGenericMask( - IN OUT PACCESS_MASK AccessMask, - IN PGENERIC_MAPPING GenericMapping); + _Inout_ PACCESS_MASK AccessMask, + _In_ PGENERIC_MAPPING GenericMapping); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlVolumeDeviceToDosName( - IN PVOID VolumeDeviceObject, - OUT PUNICODE_STRING DosName); + _In_ PVOID VolumeDeviceObject, + _Out_ PUNICODE_STRING DosName); NTSYSAPI NTSTATUS @@ -1004,603 +1120,707 @@ RtlVerifyVersionInfo( IN ULONG TypeMask, IN ULONGLONG ConditionMask); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI LONG NTAPI RtlCompareString( - IN const PSTRING String1, - IN const PSTRING String2, - IN BOOLEAN CaseInSensitive); + _In_ const PSTRING String1, + _In_ const PSTRING String2, + _In_ BOOLEAN CaseInSensitive); NTSYSAPI VOID NTAPI RtlCopyString( - OUT PSTRING DestinationString, - IN const PSTRING SourceString OPTIONAL); + _Out_ PSTRING DestinationString, + _In_opt_ const PSTRING SourceString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlEqualString( - IN const PSTRING String1, - IN const PSTRING String2, - IN BOOLEAN CaseInSensitive); + _In_ const PSTRING String1, + _In_ const PSTRING String2, + _In_ BOOLEAN CaseInSensitive); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCharToInteger( - IN PCSZ String, - IN ULONG Base OPTIONAL, - OUT PULONG Value); + _In_z_ PCSZ String, + _In_opt_ ULONG Base, + _Out_ PULONG Value); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI CHAR NTAPI RtlUpperChar( - IN CHAR Character); + _In_ CHAR Character); NTSYSAPI ULONG NTAPI RtlWalkFrameChain( - OUT PVOID *Callers, - IN ULONG Count, - IN ULONG Flags); + _Out_writes_(Count - (Flags >> RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT)) + PVOID *Callers, + _In_ ULONG Count, + _In_ ULONG Flags); $endif (_NTDDK_) $if (_NTIFS_) +_Must_inspect_result_ +_Ret_maybenull_ +_Post_writable_byte_size_(Size) NTSYSAPI PVOID NTAPI RtlAllocateHeap( - IN HANDLE HeapHandle, - IN ULONG Flags OPTIONAL, - IN SIZE_T Size); + _In_ HANDLE HeapHandle, + _In_opt_ ULONG Flags, + _In_ SIZE_T Size); +_Success_(return != 0) NTSYSAPI BOOLEAN NTAPI RtlFreeHeap( - IN PVOID HeapHandle, - IN ULONG Flags OPTIONAL, - IN PVOID BaseAddress); + _In_ PVOID HeapHandle, + _In_opt_ ULONG Flags, + _In_ _Post_invalid_ PVOID BaseAddress); NTSYSAPI VOID NTAPI RtlCaptureContext( - OUT PCONTEXT ContextRecord); + _Out_ PCONTEXT ContextRecord); +_Ret_range_(<, MAXLONG) NTSYSAPI ULONG NTAPI RtlRandom( - IN OUT PULONG Seed); + _Inout_ PULONG Seed); +_IRQL_requires_max_(APC_LEVEL) +_Success_(return != 0) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString( - OUT PUNICODE_STRING DestinationString, - IN PCWSTR SourceString); + _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)) + PUNICODE_STRING DestinationString, + _In_z_ PCWSTR SourceString); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlAppendStringToString( - IN OUT PSTRING Destination, - IN const STRING *Source); + _Inout_ PSTRING Destination, + _In_ const STRING *Source); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlOemStringToUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCOEM_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PUNICODE_STRING DestinationString, + _In_ PCOEM_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToOemString( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + POEM_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeStringToOemString( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + POEM_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlOemStringToCountedUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCOEM_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PUNICODE_STRING DestinationString, + _In_ PCOEM_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToCountedOemString( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + POEM_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeStringToCountedOemString( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + POEM_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(AllocateDestinationString, _Must_inspect_result_) NTSYSAPI NTSTATUS NTAPI RtlDowncaseUnicodeString( - IN OUT PUNICODE_STRING UniDest, - IN PCUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(UniDest->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PUNICODE_STRING UniDest, + _In_ PCUNICODE_STRING UniSource, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI -RtlFreeOemString ( - IN OUT POEM_STRING OemString); +RtlFreeOemString( + _Inout_ _At_(OemString->Buffer, __drv_freesMem(Mem)) POEM_STRING OemString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI ULONG NTAPI RtlxUnicodeStringToOemSize( - IN PCUNICODE_STRING UnicodeString); + _In_ PCUNICODE_STRING UnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI ULONG NTAPI RtlxOemStringToUnicodeSize( - IN PCOEM_STRING OemString); + _In_ PCOEM_STRING OemString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlMultiByteToUnicodeN( - OUT PWCH UnicodeString, - IN ULONG MaxBytesInUnicodeString, - OUT PULONG BytesInUnicodeString OPTIONAL, - IN const CHAR *MultiByteString, - IN ULONG BytesInMultiByteString); + _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString, + _In_ ULONG MaxBytesInUnicodeString, + _Out_opt_ PULONG BytesInUnicodeString, + _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString, + _In_ ULONG BytesInMultiByteString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlMultiByteToUnicodeSize( - OUT PULONG BytesInUnicodeString, - IN const CHAR *MultiByteString, - IN ULONG BytesInMultiByteString); + _Out_ PULONG BytesInUnicodeString, + _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString, + _In_ ULONG BytesInMultiByteString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUnicodeToMultiByteSize( - OUT PULONG BytesInMultiByteString, - IN PCWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _Out_ PULONG BytesInMultiByteString, + _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUnicodeToMultiByteN( - OUT PCHAR MultiByteString, - IN ULONG MaxBytesInMultiByteString, - OUT PULONG BytesInMultiByteString OPTIONAL, - IN PWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _Out_writes_bytes_to_(MaxBytesInMultiByteString, *BytesInMultiByteString) PCHAR MultiByteString, + _In_ ULONG MaxBytesInMultiByteString, + _Out_opt_ PULONG BytesInMultiByteString, + _In_reads_bytes_(BytesInUnicodeString) PWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeToMultiByteN( - OUT PCHAR MultiByteString, - IN ULONG MaxBytesInMultiByteString, - OUT PULONG BytesInMultiByteString OPTIONAL, - IN PCWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _Out_writes_bytes_to_(MaxBytesInMultiByteString, *BytesInMultiByteString) PCHAR MultiByteString, + _In_ ULONG MaxBytesInMultiByteString, + _Out_opt_ PULONG BytesInMultiByteString, + _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlOemToUnicodeN( - OUT PWSTR UnicodeString, - IN ULONG MaxBytesInUnicodeString, - OUT PULONG BytesInUnicodeString OPTIONAL, - IN PCCH OemString, - IN ULONG BytesInOemString); + _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWSTR UnicodeString, + _In_ ULONG MaxBytesInUnicodeString, + _Out_opt_ PULONG BytesInUnicodeString, + _In_reads_bytes_(BytesInOemString) PCCH OemString, + _In_ ULONG BytesInOemString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUnicodeToOemN( - OUT PCHAR OemString, - IN ULONG MaxBytesInOemString, - OUT PULONG BytesInOemString OPTIONAL, - IN PCWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _Out_writes_bytes_to_(MaxBytesInOemString, *BytesInOemString) PCHAR OemString, + _In_ ULONG MaxBytesInOemString, + _Out_opt_ PULONG BytesInOemString, + _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeToOemN( - OUT PCHAR OemString, - IN ULONG MaxBytesInOemString, - OUT PULONG BytesInOemString OPTIONAL, - IN PCWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _Out_writes_bytes_to_(MaxBytesInOemString, *BytesInOemString) PCHAR OemString, + _In_ ULONG MaxBytesInOemString, + _Out_opt_ PULONG BytesInOemString, + _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); #if (NTDDI_VERSION >= NTDDI_VISTASP1) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlGenerate8dot3Name( - IN PCUNICODE_STRING Name, - IN BOOLEAN AllowExtendedCharacters, - IN OUT PGENERATE_NAME_CONTEXT Context, - IN OUT PUNICODE_STRING Name8dot3); + _In_ PCUNICODE_STRING Name, + _In_ BOOLEAN AllowExtendedCharacters, + _Inout_ PGENERATE_NAME_CONTEXT Context, + _Inout_ PUNICODE_STRING Name8dot3); #else +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlGenerate8dot3Name( - IN PCUNICODE_STRING Name, - IN BOOLEAN AllowExtendedCharacters, - IN OUT PGENERATE_NAME_CONTEXT Context, - IN OUT PUNICODE_STRING Name8dot3); + _In_ PCUNICODE_STRING Name, + _In_ BOOLEAN AllowExtendedCharacters, + _Inout_ PGENERATE_NAME_CONTEXT Context, + _Inout_ PUNICODE_STRING Name8dot3); #endif +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlIsNameLegalDOS8Dot3( - IN PCUNICODE_STRING Name, - IN OUT POEM_STRING OemName OPTIONAL, - IN OUT PBOOLEAN NameContainsSpaces OPTIONAL); + _In_ PCUNICODE_STRING Name, + _Inout_opt_ POEM_STRING OemName, + _Out_opt_ PBOOLEAN NameContainsSpaces); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlIsValidOemCharacter( - IN OUT PWCHAR Char); + _Inout_ PWCHAR Char); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI PfxInitialize( - OUT PPREFIX_TABLE PrefixTable); + _Out_ PPREFIX_TABLE PrefixTable); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI BOOLEAN NTAPI PfxInsertPrefix( - IN PPREFIX_TABLE PrefixTable, - IN PSTRING Prefix, - OUT PPREFIX_TABLE_ENTRY PrefixTableEntry); + _In_ PPREFIX_TABLE PrefixTable, + _In_ __drv_aliasesMem PSTRING Prefix, + _Out_ PPREFIX_TABLE_ENTRY PrefixTableEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI PfxRemovePrefix( - IN PPREFIX_TABLE PrefixTable, - IN PPREFIX_TABLE_ENTRY PrefixTableEntry); + _In_ PPREFIX_TABLE PrefixTable, + _In_ PPREFIX_TABLE_ENTRY PrefixTableEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI PPREFIX_TABLE_ENTRY NTAPI PfxFindPrefix( - IN PPREFIX_TABLE PrefixTable, - IN PSTRING FullName); + _In_ PPREFIX_TABLE PrefixTable, + _In_ PSTRING FullName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlInitializeUnicodePrefix( - OUT PUNICODE_PREFIX_TABLE PrefixTable); + _Out_ PUNICODE_PREFIX_TABLE PrefixTable); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI BOOLEAN NTAPI RtlInsertUnicodePrefix( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN PUNICODE_STRING Prefix, - OUT PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry); + _In_ PUNICODE_PREFIX_TABLE PrefixTable, + _In_ __drv_aliasesMem PUNICODE_STRING Prefix, + _Out_ PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlRemoveUnicodePrefix( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry); + _In_ PUNICODE_PREFIX_TABLE PrefixTable, + _In_ PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI PUNICODE_PREFIX_TABLE_ENTRY NTAPI RtlFindUnicodePrefix( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN PUNICODE_STRING FullName, - IN ULONG CaseInsensitiveIndex); + _In_ PUNICODE_PREFIX_TABLE PrefixTable, + _In_ PUNICODE_STRING FullName, + _In_ ULONG CaseInsensitiveIndex); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI PUNICODE_PREFIX_TABLE_ENTRY NTAPI RtlNextUnicodePrefix( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN BOOLEAN Restart); + _In_ PUNICODE_PREFIX_TABLE PrefixTable, + _In_ BOOLEAN Restart); +_Must_inspect_result_ NTSYSAPI SIZE_T NTAPI RtlCompareMemoryUlong( - IN PVOID Source, - IN SIZE_T Length, - IN ULONG Pattern); + _In_reads_bytes_(Length) PVOID Source, + _In_ SIZE_T Length, + _In_ ULONG Pattern); +_Success_(return != 0) NTSYSAPI BOOLEAN NTAPI RtlTimeToSecondsSince1980( - IN PLARGE_INTEGER Time, - OUT PULONG ElapsedSeconds); + _In_ PLARGE_INTEGER Time, + _Out_ PULONG ElapsedSeconds); NTSYSAPI VOID NTAPI RtlSecondsSince1980ToTime( - IN ULONG ElapsedSeconds, - OUT PLARGE_INTEGER Time); + _In_ ULONG ElapsedSeconds, + _Out_ PLARGE_INTEGER Time); +_Success_(return != 0) NTSYSAPI BOOLEAN NTAPI RtlTimeToSecondsSince1970( - IN PLARGE_INTEGER Time, - OUT PULONG ElapsedSeconds); + _In_ PLARGE_INTEGER Time, + _Out_ PULONG ElapsedSeconds); NTSYSAPI VOID NTAPI RtlSecondsSince1970ToTime( - IN ULONG ElapsedSeconds, - OUT PLARGE_INTEGER Time); + _In_ ULONG ElapsedSeconds, + _Out_ PLARGE_INTEGER Time); +_IRQL_requires_max_(APC_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlValidSid( - IN PSID Sid); + _In_ PSID Sid); +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlEqualSid( - IN PSID Sid1, - IN PSID Sid2); + _In_ PSID Sid1, + _In_ PSID Sid2); +_IRQL_requires_max_(APC_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlEqualPrefixSid( - IN PSID Sid1, - IN PSID Sid2); + _In_ PSID Sid1, + _In_ PSID Sid2); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI ULONG NTAPI RtlLengthRequiredSid( - IN ULONG SubAuthorityCount); + _In_ ULONG SubAuthorityCount); NTSYSAPI PVOID NTAPI RtlFreeSid( - IN PSID Sid); + _In_ _Post_invalid_ PSID Sid); +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlAllocateAndInitializeSid( - IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, - IN UCHAR SubAuthorityCount, - IN ULONG SubAuthority0, - IN ULONG SubAuthority1, - IN ULONG SubAuthority2, - IN ULONG SubAuthority3, - IN ULONG SubAuthority4, - IN ULONG SubAuthority5, - IN ULONG SubAuthority6, - IN ULONG SubAuthority7, - OUT PSID *Sid); + _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, + _In_ UCHAR SubAuthorityCount, + _In_ ULONG SubAuthority0, + _In_ ULONG SubAuthority1, + _In_ ULONG SubAuthority2, + _In_ ULONG SubAuthority3, + _In_ ULONG SubAuthority4, + _In_ ULONG SubAuthority5, + _In_ ULONG SubAuthority6, + _In_ ULONG SubAuthority7, + _Outptr_ PSID *Sid); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlInitializeSid( - OUT PSID Sid, - IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, - IN UCHAR SubAuthorityCount); + _Out_ PSID Sid, + _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, + _In_ UCHAR SubAuthorityCount); NTSYSAPI PULONG NTAPI RtlSubAuthoritySid( - IN PSID Sid, - IN ULONG SubAuthority); + _In_ PSID Sid, + _In_ ULONG SubAuthority); +_Post_satisfies_(return >= 8 && return <= SECURITY_MAX_SID_SIZE) NTSYSAPI ULONG NTAPI RtlLengthSid( - IN PSID Sid); + _In_ PSID Sid); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCopySid( - IN ULONG Length, - IN PSID Destination, - IN PSID Source); + _In_ ULONG Length, + _Out_writes_bytes_(Length) PSID Destination, + _In_ PSID Source); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlConvertSidToUnicodeString( - IN OUT PUNICODE_STRING UnicodeString, - IN PSID Sid, - IN BOOLEAN AllocateDestinationString); + _Inout_ PUNICODE_STRING UnicodeString, + _In_ PSID Sid, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI VOID NTAPI RtlCopyLuid( - OUT PLUID DestinationLuid, - IN PLUID SourceLuid); + _Out_ PLUID DestinationLuid, + _In_ PLUID SourceLuid); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCreateAcl( - OUT PACL Acl, - IN ULONG AclLength, - IN ULONG AclRevision); + _Out_writes_bytes_(AclLength) PACL Acl, + _In_ ULONG AclLength, + _In_ ULONG AclRevision); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlAddAce( - IN OUT PACL Acl, - IN ULONG AceRevision, - IN ULONG StartingAceIndex, - IN PVOID AceList, - IN ULONG AceListLength); + _Inout_ PACL Acl, + _In_ ULONG AceRevision, + _In_ ULONG StartingAceIndex, + _In_reads_bytes_(AceListLength) PVOID AceList, + _In_ ULONG AceListLength); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDeleteAce( - IN OUT PACL Acl, - IN ULONG AceIndex); + _Inout_ PACL Acl, + _In_ ULONG AceIndex); NTSYSAPI NTSTATUS NTAPI RtlGetAce( - IN PACL Acl, - IN ULONG AceIndex, - OUT PVOID *Ace); + _In_ PACL Acl, + _In_ ULONG AceIndex, + _Outptr_ PVOID *Ace); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlAddAccessAllowedAce( - IN OUT PACL Acl, - IN ULONG AceRevision, - IN ACCESS_MASK AccessMask, - IN PSID Sid); + _Inout_ PACL Acl, + _In_ ULONG AceRevision, + _In_ ACCESS_MASK AccessMask, + _In_ PSID Sid); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlAddAccessAllowedAceEx( - IN OUT PACL Acl, - IN ULONG AceRevision, - IN ULONG AceFlags, - IN ACCESS_MASK AccessMask, - IN PSID Sid); + _Inout_ PACL Acl, + _In_ ULONG AceRevision, + _In_ ULONG AceFlags, + _In_ ACCESS_MASK AccessMask, + _In_ PSID Sid); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCreateSecurityDescriptorRelative( - OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor, - IN ULONG Revision); + _Out_ PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor, + _In_ ULONG Revision); NTSYSAPI NTSTATUS NTAPI RtlGetDaclSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PBOOLEAN DaclPresent, - OUT PACL *Dacl, - OUT PBOOLEAN DaclDefaulted); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Out_ PBOOLEAN DaclPresent, + _Out_ PACL *Dacl, + _Out_ PBOOLEAN DaclDefaulted); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlSetOwnerSecurityDescriptor( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID Owner OPTIONAL, - IN BOOLEAN OwnerDefaulted); + _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSID Owner, + _In_opt_ BOOLEAN OwnerDefaulted); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlGetOwnerSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PSID *Owner, - OUT PBOOLEAN OwnerDefaulted); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Out_ PSID *Owner, + _Out_ PBOOLEAN OwnerDefaulted); +_IRQL_requires_max_(APC_LEVEL) +_When_(Status < 0, _Out_range_(>, 0)) +_When_(Status >= 0, _Out_range_(==, 0)) NTSYSAPI ULONG NTAPI RtlNtStatusToDosError( - IN NTSTATUS Status); + _In_ NTSTATUS Status); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCustomCPToUnicodeN( - IN PCPTABLEINFO CustomCP, - OUT PWCH UnicodeString, - IN ULONG MaxBytesInUnicodeString, - OUT PULONG BytesInUnicodeString OPTIONAL, - IN PCH CustomCPString, - IN ULONG BytesInCustomCPString); + _In_ PCPTABLEINFO CustomCP, + _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString, + _In_ ULONG MaxBytesInUnicodeString, + _Out_opt_ PULONG BytesInUnicodeString, + _In_reads_bytes_(BytesInCustomCPString) PCH CustomCPString, + _In_ ULONG BytesInCustomCPString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUnicodeToCustomCPN( - IN PCPTABLEINFO CustomCP, - OUT PCH CustomCPString, - IN ULONG MaxBytesInCustomCPString, - OUT PULONG BytesInCustomCPString OPTIONAL, - IN PWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _In_ PCPTABLEINFO CustomCP, + _Out_writes_bytes_to_(MaxBytesInCustomCPString, *BytesInCustomCPString) PCH CustomCPString, + _In_ ULONG MaxBytesInCustomCPString, + _Out_opt_ PULONG BytesInCustomCPString, + _In_reads_bytes_(BytesInUnicodeString) PWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeToCustomCPN( - IN PCPTABLEINFO CustomCP, - OUT PCH CustomCPString, - IN ULONG MaxBytesInCustomCPString, - OUT PULONG BytesInCustomCPString OPTIONAL, - IN PWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _In_ PCPTABLEINFO CustomCP, + _Out_writes_bytes_to_(MaxBytesInCustomCPString, *BytesInCustomCPString) PCH CustomCPString, + _In_ ULONG MaxBytesInCustomCPString, + _Out_opt_ PULONG BytesInCustomCPString, + _In_reads_bytes_(BytesInUnicodeString) PWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlInitCodePageTable( - IN PUSHORT TableBase, - IN OUT PCPTABLEINFO CodePageTable); + _In_ PUSHORT TableBase, + _Inout_ PCPTABLEINFO CodePageTable); -$endif +$endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -1611,11 +1831,11 @@ NTSYSAPI VOID FASTCALL RtlPrefetchMemoryNonTemporal( - IN PVOID Source, - IN SIZE_T Length); + _In_ PVOID Source, + _In_ SIZE_T Length); #endif -$endif +$endif (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -1625,37 +1845,40 @@ NTSYSAPI VOID NTAPI RtlClearBit( - PRTL_BITMAP BitMapHeader, - ULONG BitNumber); + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI WCHAR NTAPI RtlDowncaseUnicodeChar( - IN WCHAR SourceCharacter); + _In_ WCHAR SourceCharacter); NTSYSAPI VOID NTAPI RtlSetBit( - PRTL_BITMAP BitMapHeader, - ULONG BitNumber); + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber); +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlTestBit( - IN PRTL_BITMAP BitMapHeader, - IN ULONG BitNumber); + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlHashUnicodeString( - IN CONST UNICODE_STRING *String, - IN BOOLEAN CaseInSensitive, - IN ULONG HashAlgorithm, - OUT PULONG HashValue); + _In_ CONST UNICODE_STRING *String, + _In_ BOOLEAN CaseInSensitive, + _In_ ULONG HashAlgorithm, + _Out_ PULONG HashValue); $endif (_WDMDDK_) @@ -1665,286 +1888,309 @@ 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); + _Out_ PRTL_AVL_TABLE Table, + _In_ PRTL_AVL_COMPARE_ROUTINE CompareRoutine, + _In_opt_ PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, + _In_opt_ PRTL_AVL_FREE_ROUTINE FreeRoutine, + _In_opt_ PVOID TableContext); NTSYSAPI PVOID NTAPI RtlInsertElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL); + _In_ PRTL_AVL_TABLE Table, + _In_reads_bytes_(BufferSize) PVOID Buffer, + _In_ CLONG BufferSize, + _Out_opt_ PBOOLEAN NewElement); 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); + _In_ PRTL_AVL_TABLE Table, + _In_reads_bytes_(BufferSize) PVOID Buffer, + _In_ CLONG BufferSize, + _Out_opt_ PBOOLEAN NewElement, + _In_ PVOID NodeOrParent, + _In_ TABLE_SEARCH_RESULT SearchResult); NTSYSAPI BOOLEAN NTAPI RtlDeleteElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer); + _In_ PRTL_AVL_TABLE Table, + _In_ PVOID Buffer); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlLookupElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer); + _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); + _In_ PRTL_AVL_TABLE Table, + _In_ PVOID Buffer, + _Out_ PVOID *NodeOrParent, + _Out_ TABLE_SEARCH_RESULT *SearchResult); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlEnumerateGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN BOOLEAN Restart); + _In_ PRTL_AVL_TABLE Table, + _In_ BOOLEAN Restart); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlEnumerateGenericTableWithoutSplayingAvl( - IN PRTL_AVL_TABLE Table, - IN OUT PVOID *RestartKey); + _In_ PRTL_AVL_TABLE Table, + _Inout_ PVOID *RestartKey); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlLookupFirstMatchingElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - OUT PVOID *RestartKey); + _In_ PRTL_AVL_TABLE Table, + _In_ PVOID Buffer, + _Out_ PVOID *RestartKey); +_Must_inspect_result_ 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); + _In_ PRTL_AVL_TABLE Table, + _In_opt_ PRTL_AVL_MATCH_FUNCTION MatchFunction, + _In_opt_ PVOID MatchData, + _In_ ULONG NextFlag, + _Inout_ PVOID *RestartKey, + _Inout_ PULONG DeleteCount, + _In_ PVOID Buffer); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlGetElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN ULONG I); + _In_ PRTL_AVL_TABLE Table, + _In_ ULONG I); NTSYSAPI ULONG NTAPI RtlNumberGenericTableElementsAvl( - IN PRTL_AVL_TABLE Table); + _In_ PRTL_AVL_TABLE Table); +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlIsGenericTableEmptyAvl( - IN PRTL_AVL_TABLE Table); + _In_ PRTL_AVL_TABLE Table); $endif (_NTDDK_) $if (_NTIFS_) +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlCreateHeap( - IN ULONG Flags, - IN PVOID HeapBase OPTIONAL, - IN SIZE_T ReserveSize OPTIONAL, - IN SIZE_T CommitSize OPTIONAL, - IN PVOID Lock OPTIONAL, - IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL); + _In_ ULONG Flags, + _In_opt_ PVOID HeapBase, + _In_opt_ SIZE_T ReserveSize, + _In_opt_ SIZE_T CommitSize, + _In_opt_ PVOID Lock, + _In_opt_ PRTL_HEAP_PARAMETERS Parameters); NTSYSAPI PVOID NTAPI RtlDestroyHeap( - IN PVOID HeapHandle); + _In_ _Post_invalid_ PVOID HeapHandle); NTSYSAPI USHORT NTAPI RtlCaptureStackBackTrace( - IN ULONG FramesToSkip, - IN ULONG FramesToCapture, - OUT PVOID *BackTrace, - OUT PULONG BackTraceHash OPTIONAL); + _In_ ULONG FramesToSkip, + _In_ ULONG FramesToCapture, + _Out_writes_to_(FramesToCapture, return) PVOID *BackTrace, + _Out_opt_ PULONG BackTraceHash); +_Ret_range_(<, MAXLONG) NTSYSAPI ULONG NTAPI RtlRandomEx( - IN OUT PULONG Seed); + _Inout_ PULONG Seed); +_IRQL_requires_max_(DISPATCH_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlInitUnicodeStringEx( - OUT PUNICODE_STRING DestinationString, - IN PCWSTR SourceString OPTIONAL); + _Out_ PUNICODE_STRING DestinationString, + _In_opt_z_ __drv_aliasesMem PCWSTR SourceString); +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlValidateUnicodeString( - IN ULONG Flags, - IN PCUNICODE_STRING String); + _In_ ULONG Flags, + _In_ PCUNICODE_STRING String); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlDuplicateUnicodeString( - IN ULONG Flags, - IN PCUNICODE_STRING SourceString, - OUT PUNICODE_STRING DestinationString); + _In_ ULONG Flags, + _In_ PCUNICODE_STRING SourceString, + _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)) PUNICODE_STRING DestinationString); NTSYSAPI NTSTATUS NTAPI RtlGetCompressionWorkSpaceSize( - IN USHORT CompressionFormatAndEngine, - OUT PULONG CompressBufferWorkSpaceSize, - OUT PULONG CompressFragmentWorkSpaceSize); + _In_ USHORT CompressionFormatAndEngine, + _Out_ PULONG CompressBufferWorkSpaceSize, + _Out_ PULONG CompressFragmentWorkSpaceSize); NTSYSAPI NTSTATUS NTAPI RtlCompressBuffer( - IN USHORT CompressionFormatAndEngine, - IN PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - OUT PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN ULONG UncompressedChunkSize, - OUT PULONG FinalCompressedSize, - IN PVOID WorkSpace); + _In_ USHORT CompressionFormatAndEngine, + _In_reads_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer, + _In_ ULONG UncompressedBufferSize, + _Out_writes_bytes_to_(CompressedBufferSize, *FinalCompressedSize) PUCHAR CompressedBuffer, + _In_ ULONG CompressedBufferSize, + _In_ ULONG UncompressedChunkSize, + _Out_ PULONG FinalCompressedSize, + _In_ PVOID WorkSpace); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDecompressBuffer( - IN USHORT CompressionFormat, - OUT PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - OUT PULONG FinalUncompressedSize); + _In_ USHORT CompressionFormat, + _Out_writes_bytes_to_(UncompressedBufferSize, *FinalUncompressedSize) PUCHAR UncompressedBuffer, + _In_ ULONG UncompressedBufferSize, + _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer, + _In_ ULONG CompressedBufferSize, + _Out_ PULONG FinalUncompressedSize); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDecompressFragment( - IN USHORT CompressionFormat, - OUT PUCHAR UncompressedFragment, - IN ULONG UncompressedFragmentSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN ULONG FragmentOffset, - OUT PULONG FinalUncompressedSize, - IN PVOID WorkSpace); + _In_ USHORT CompressionFormat, + _Out_writes_bytes_to_(UncompressedFragmentSize, *FinalUncompressedSize) PUCHAR UncompressedFragment, + _In_ ULONG UncompressedFragmentSize, + _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer, + _In_ ULONG CompressedBufferSize, + _In_range_(<, CompressedBufferSize) ULONG FragmentOffset, + _Out_ PULONG FinalUncompressedSize, + _In_ PVOID WorkSpace); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDescribeChunk( - IN USHORT CompressionFormat, - IN OUT PUCHAR *CompressedBuffer, - IN PUCHAR EndOfCompressedBufferPlus1, - OUT PUCHAR *ChunkBuffer, - OUT PULONG ChunkSize); + _In_ USHORT CompressionFormat, + _Inout_ PUCHAR *CompressedBuffer, + _In_ PUCHAR EndOfCompressedBufferPlus1, + _Out_ PUCHAR *ChunkBuffer, + _Out_ PULONG ChunkSize); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlReserveChunk( - IN USHORT CompressionFormat, - IN OUT PUCHAR *CompressedBuffer, - IN PUCHAR EndOfCompressedBufferPlus1, - OUT PUCHAR *ChunkBuffer, - IN ULONG ChunkSize); + _In_ USHORT CompressionFormat, + _Inout_ PUCHAR *CompressedBuffer, + _In_ PUCHAR EndOfCompressedBufferPlus1, + _Out_ PUCHAR *ChunkBuffer, + _In_ ULONG ChunkSize); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDecompressChunks( - OUT PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN PUCHAR CompressedTail, - IN ULONG CompressedTailSize, - IN PCOMPRESSED_DATA_INFO CompressedDataInfo); + _Out_writes_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer, + _In_ ULONG UncompressedBufferSize, + _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer, + _In_ ULONG CompressedBufferSize, + _In_reads_bytes_(CompressedTailSize) PUCHAR CompressedTail, + _In_ ULONG CompressedTailSize, + _In_ PCOMPRESSED_DATA_INFO CompressedDataInfo); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCompressChunks( - IN PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - OUT PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN PVOID WorkSpace); + _In_reads_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer, + _In_ ULONG UncompressedBufferSize, + _Out_writes_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer, + _In_range_(>=, (UncompressedBufferSize - (UncompressedBufferSize / 16))) ULONG CompressedBufferSize, + _Inout_updates_bytes_(CompressedDataInfoLength) PCOMPRESSED_DATA_INFO CompressedDataInfo, + _In_range_(>, sizeof(COMPRESSED_DATA_INFO)) ULONG CompressedDataInfoLength, + _In_ PVOID WorkSpace); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI PSID_IDENTIFIER_AUTHORITY NTAPI RtlIdentifierAuthoritySid( - IN PSID Sid); + _In_ PSID Sid); NTSYSAPI PUCHAR NTAPI RtlSubAuthorityCountSid( - IN PSID Sid); + _In_ PSID Sid); +_When_(Status < 0, _Out_range_(>, 0)) +_When_(Status >= 0, _Out_range_(==, 0)) NTSYSAPI ULONG NTAPI RtlNtStatusToDosErrorNoTeb( - IN NTSTATUS Status); + _In_ NTSTATUS Status); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCreateSystemVolumeInformationFolder( - IN PCUNICODE_STRING VolumeRootPath); + _In_ PCUNICODE_STRING VolumeRootPath); #if defined(_M_AMD64) FORCEINLINE VOID -RtlFillMemoryUlong ( - OUT PVOID Destination, - IN SIZE_T Length, - IN ULONG Pattern) +RtlFillMemoryUlong( + _Out_writes_bytes_all_(Length) PVOID Destination, + _In_ SIZE_T Length, + _In_ ULONG Pattern) { PULONG Address = (PULONG)Destination; if ((Length /= 4) != 0) { @@ -1978,9 +2224,9 @@ NTSYSAPI VOID NTAPI RtlFillMemoryUlonglong( - OUT PVOID Destination, - IN SIZE_T Length, - IN ULONGLONG Pattern); + _Out_writes_bytes_all_(Length) PVOID Destination, + _In_ SIZE_T Length, + _In_ ULONGLONG Pattern); #endif /* defined(_M_AMD64) */ $endif (_NTIFS_) @@ -1989,64 +2235,70 @@ $endif (_NTIFS_) $if (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WS03) +_IRQL_requires_max_(DISPATCH_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlInitAnsiStringEx( - OUT PANSI_STRING DestinationString, - IN PCSZ SourceString OPTIONAL); + _Out_ PANSI_STRING DestinationString, + _In_opt_z_ __drv_aliasesMem PCSZ SourceString); #endif #if (NTDDI_VERSION >= NTDDI_WS03SP1) +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlGetSaclSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PBOOLEAN SaclPresent, - OUT PACL *Sacl, - OUT PBOOLEAN SaclDefaulted); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Out_ PBOOLEAN SaclPresent, + _Out_ PACL *Sacl, + _Out_ PBOOLEAN SaclDefaulted); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlSetGroupSecurityDescriptor( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID Group OPTIONAL, - IN BOOLEAN GroupDefaulted OPTIONAL); + _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSID Group, + _In_opt_ BOOLEAN GroupDefaulted); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlGetGroupSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PSID *Group, - OUT PBOOLEAN GroupDefaulted); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Out_ PSID *Group, + _Out_ PBOOLEAN GroupDefaulted); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlAbsoluteToSelfRelativeSD( - IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor, - OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor OPTIONAL, - IN OUT PULONG BufferLength); + _In_ PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor, + _Out_writes_bytes_to_opt_(*BufferLength, *BufferLength) PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor, + _Inout_ PULONG BufferLength); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlSelfRelativeToAbsoluteSD( - IN PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor, - OUT PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor OPTIONAL, - IN OUT PULONG AbsoluteSecurityDescriptorSize, - OUT PACL Dacl OPTIONAL, - IN OUT PULONG DaclSize, - OUT PACL Sacl OPTIONAL, - IN OUT PULONG SaclSize, - OUT PSID Owner OPTIONAL, - IN OUT PULONG OwnerSize, - OUT PSID PrimaryGroup OPTIONAL, - IN OUT PULONG PrimaryGroupSize); + _In_ PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor, + _Out_writes_bytes_to_opt_(*AbsoluteSecurityDescriptorSize, *AbsoluteSecurityDescriptorSize) PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor, + _Inout_ PULONG AbsoluteSecurityDescriptorSize, + _Out_writes_bytes_to_opt_(*DaclSize, *DaclSize) PACL Dacl, + _Inout_ PULONG DaclSize, + _Out_writes_bytes_to_opt_(*SaclSize, *SaclSize) PACL Sacl, + _Inout_ PULONG SaclSize, + _Out_writes_bytes_to_opt_(*OwnerSize, *OwnerSize) PSID Owner, + _Inout_ PULONG OwnerSize, + _Out_writes_bytes_to_opt_(*PrimaryGroupSize, *PrimaryGroupSize) PSID PrimaryGroup, + _Inout_ PULONG PrimaryGroupSize); #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ $endif (_NTIFS_) @@ -2058,94 +2310,100 @@ NTSYSAPI ULONG NTAPI RtlNumberOfSetBitsUlongPtr( - IN ULONG_PTR Target); + _In_ ULONG_PTR Target); NTSYSAPI ULONGLONG NTAPI RtlIoDecodeMemIoResource( - IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor, - OUT PULONGLONG Alignment OPTIONAL, - OUT PULONGLONG MinimumAddress OPTIONAL, - OUT PULONGLONG MaximumAddress OPTIONAL); + _In_ struct _IO_RESOURCE_DESCRIPTOR *Descriptor, + _Out_opt_ PULONGLONG Alignment, + _Out_opt_ PULONGLONG MinimumAddress, + _Out_opt_ PULONGLONG MaximumAddress); NTSYSAPI NTSTATUS NTAPI RtlIoEncodeMemIoResource( - IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor, - IN UCHAR Type, - IN ULONGLONG Length, - IN ULONGLONG Alignment, - IN ULONGLONG MinimumAddress, - IN ULONGLONG MaximumAddress); + _In_ struct _IO_RESOURCE_DESCRIPTOR *Descriptor, + _In_ UCHAR Type, + _In_ ULONGLONG Length, + _In_ ULONGLONG Alignment, + _In_ ULONGLONG MinimumAddress, + _In_ ULONGLONG MaximumAddress); NTSYSAPI ULONGLONG NTAPI RtlCmDecodeMemIoResource( - IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor, - OUT PULONGLONG Start OPTIONAL); + _In_ struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor, + _Out_opt_ PULONGLONG Start); NTSYSAPI NTSTATUS NTAPI RtlFindClosestEncodableLength( - IN ULONGLONG SourceLength, - OUT PULONGLONG TargetLength); + _In_ ULONGLONG SourceLength, + _Out_ PULONGLONG TargetLength); NTSYSAPI NTSTATUS NTAPI RtlCmEncodeMemIoResource( - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, - IN UCHAR Type, - IN ULONGLONG Length, - IN ULONGLONG Start); + _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, + _In_ UCHAR Type, + _In_ ULONGLONG Length, + _In_ ULONGLONG Start); $endif (_WDMDDK_) $if (_NTDDK_) +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI VOID NTAPI RtlRunOnceInitialize( - OUT PRTL_RUN_ONCE RunOnce); + _Out_ PRTL_RUN_ONCE RunOnce); +_IRQL_requires_max_(APC_LEVEL) +_Maybe_raises_SEH_exception_ 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); + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ __inner_callback PRTL_RUN_ONCE_INIT_FN InitFn, + _Inout_opt_ PVOID Parameter, + _Outptr_opt_result_maybenull_ PVOID *Context); +_IRQL_requires_max_(APC_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlRunOnceBeginInitialize( - IN OUT PRTL_RUN_ONCE RunOnce, - IN ULONG Flags, - OUT PVOID *Context OPTIONAL); + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ ULONG Flags, + _Outptr_opt_result_maybenull_ PVOID *Context); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlRunOnceComplete( - IN OUT PRTL_RUN_ONCE RunOnce, - IN ULONG Flags, - IN PVOID Context OPTIONAL); + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ ULONG Flags, + _In_opt_ PVOID Context); NTSYSAPI BOOLEAN NTAPI RtlGetProductInfo( - IN ULONG OSMajorVersion, - IN ULONG OSMinorVersion, - IN ULONG SpMajorVersion, - IN ULONG SpMinorVersion, - OUT PULONG ReturnedProductType); + _In_ ULONG OSMajorVersion, + _In_ ULONG OSMinorVersion, + _In_ ULONG SpMajorVersion, + _In_ ULONG SpMinorVersion, + _Out_ PULONG ReturnedProductType); $endif (_NTDDK_) $if (_NTIFS_) @@ -2153,30 +2411,30 @@ NTSYSAPI NTSTATUS NTAPI RtlNormalizeString( - IN ULONG NormForm, - IN PCWSTR SourceString, - IN LONG SourceStringLength, - OUT PWSTR DestinationString, - IN OUT PLONG DestinationStringLength); + _In_ ULONG NormForm, + _In_ PCWSTR SourceString, + _In_ LONG SourceStringLength, + _Out_writes_to_(*DestinationStringLength, *DestinationStringLength) PWSTR DestinationString, + _Inout_ PLONG DestinationStringLength); NTSYSAPI NTSTATUS NTAPI RtlIsNormalizedString( - IN ULONG NormForm, - IN PCWSTR SourceString, - IN LONG SourceStringLength, - OUT PBOOLEAN Normalized); + _In_ ULONG NormForm, + _In_ PCWSTR SourceString, + _In_ LONG SourceStringLength, + _Out_ PBOOLEAN Normalized); NTSYSAPI NTSTATUS NTAPI RtlIdnToAscii( - IN ULONG Flags, - IN PCWSTR SourceString, - IN LONG SourceStringLength, - OUT PWSTR DestinationString, - IN OUT PLONG DestinationStringLength); + _In_ ULONG Flags, + _In_ PCWSTR SourceString, + _In_ LONG SourceStringLength, + _Out_writes_to_(*DestinationStringLength, *DestinationStringLength) PWSTR DestinationString, + _Inout_ PLONG DestinationStringLength); NTSYSAPI NTSTATUS @@ -2192,26 +2450,26 @@ NTSYSAPI NTSTATUS NTAPI RtlIdnToNameprepUnicode( - IN ULONG Flags, - IN PCWSTR SourceString, - IN LONG SourceStringLength, - OUT PWSTR DestinationString, - IN OUT PLONG DestinationStringLength); + _In_ ULONG Flags, + _In_ PCWSTR SourceString, + _In_ LONG SourceStringLength, + _Out_writes_to_(*DestinationStringLength, *DestinationStringLength) PWSTR DestinationString, + _Inout_ PLONG DestinationStringLength); NTSYSAPI NTSTATUS NTAPI RtlCreateServiceSid( - IN PUNICODE_STRING ServiceName, - OUT PSID ServiceSid, - IN OUT PULONG ServiceSidLength); + _In_ PUNICODE_STRING ServiceName, + _Out_writes_bytes_opt_(*ServiceSidLength) PSID ServiceSid, + _Inout_ PULONG ServiceSidLength); NTSYSAPI LONG NTAPI RtlCompareAltitudes( - IN PCUNICODE_STRING Altitude1, - IN PCUNICODE_STRING Altitude2); + _In_ PCUNICODE_STRING Altitude1, + _In_ PCUNICODE_STRING Altitude2); $endif (_NTIFS_) @@ -2220,25 +2478,31 @@ $endif (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WIN7) $if (_WDMDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUnicodeToUTF8N( - OUT PCHAR UTF8StringDestination, - IN ULONG UTF8StringMaxByteCount, - OUT PULONG UTF8StringActualByteCount, - IN PCWCH UnicodeStringSource, - IN ULONG UnicodeStringByteCount); + _Out_writes_bytes_to_(UTF8StringMaxByteCount, *UTF8StringActualByteCount) + PCHAR UTF8StringDestination, + _In_ ULONG UTF8StringMaxByteCount, + _Out_ PULONG UTF8StringActualByteCount, + _In_reads_bytes_(UnicodeStringByteCount) PCWCH UnicodeStringSource, + _In_ ULONG UnicodeStringByteCount); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUTF8ToUnicodeN( - OUT PWSTR UnicodeStringDestination, - IN ULONG UnicodeStringMaxByteCount, - OUT PULONG UnicodeStringActualByteCount, - IN PCCH UTF8StringSource, - IN ULONG UTF8StringByteCount); + _Out_writes_bytes_to_(UnicodeStringMaxByteCount, *UnicodeStringActualByteCount) + PWSTR UnicodeStringDestination, + _In_ ULONG UnicodeStringMaxByteCount, + _Out_ PULONG UnicodeStringActualByteCount, + _In_reads_bytes_(UTF8StringByteCount) PCCH UTF8StringSource, + _In_ ULONG UTF8StringByteCount); NTSYSAPI ULONG64 @@ -2249,145 +2513,157 @@ RtlGetEnabledExtendedFeatures( $endif (_WDMDDK_) $if (_NTDDK_) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlCreateHashTable( - IN OUT PRTL_DYNAMIC_HASH_TABLE *HashTable OPTIONAL, - IN ULONG Shift, - IN ULONG Flags); + _Inout_ _When_(NULL == *HashTable, __drv_allocatesMem(Mem)) + PRTL_DYNAMIC_HASH_TABLE *HashTable, + _In_ ULONG Shift, + _In_ _Reserved_ ULONG Flags); NTSYSAPI VOID NTAPI RtlDeleteHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); + _In_ _When_((HashTable->Flags & RTL_HASH_ALLOCATED_HEADER), __drv_freesMem(Mem) _Post_invalid_) + 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); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _In_ __drv_aliasesMem PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry, + _In_ ULONG_PTR Signature, + _Inout_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); 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); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _In_ PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry, + _Inout_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); +_Must_inspect_result_ 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); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _In_ ULONG_PTR Signature, + _Out_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); +_Must_inspect_result_ NTSYSAPI PRTL_DYNAMIC_HASH_TABLE_ENTRY NTAPI RtlGetNextEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); + _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); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Out_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); +_Must_inspect_result_ NTSYSAPI PRTL_DYNAMIC_HASH_TABLE_ENTRY NTAPI RtlEnumerateEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); NTSYSAPI VOID NTAPI RtlEndEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); NTSYSAPI BOOLEAN NTAPI RtlInitWeakEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Out_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); +_Must_inspect_result_ NTSYSAPI PRTL_DYNAMIC_HASH_TABLE_ENTRY NTAPI RtlWeaklyEnumerateEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); NTSYSAPI VOID NTAPI RtlEndWeakEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); NTSYSAPI BOOLEAN NTAPI RtlExpandHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable); NTSYSAPI BOOLEAN NTAPI RtlContractHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable); $endif (_NTDDK_) $if (_NTIFS_) +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUnicodeToUTF8N( - OUT PCHAR UTF8StringDestination, - IN ULONG UTF8StringMaxByteCount, - OUT PULONG UTF8StringActualByteCount, - IN PCWCH UnicodeStringSource, - IN ULONG UnicodeStringByteCount); + _Out_writes_bytes_to_(UTF8StringMaxByteCount, *UTF8StringActualByteCount) PCHAR UTF8StringDestination, + _In_ ULONG UTF8StringMaxByteCount, + _Out_ PULONG UTF8StringActualByteCount, + _In_reads_bytes_(UnicodeStringByteCount) PCWCH UnicodeStringSource, + _In_ ULONG UnicodeStringByteCount); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUTF8ToUnicodeN( - OUT PWSTR UnicodeStringDestination, - IN ULONG UnicodeStringMaxByteCount, - OUT PULONG UnicodeStringActualByteCount, - IN PCCH UTF8StringSource, - IN ULONG UTF8StringByteCount); + _Out_writes_bytes_to_(UnicodeStringMaxByteCount, *UnicodeStringActualByteCount) PWSTR UnicodeStringDestination, + _In_ ULONG UnicodeStringMaxByteCount, + _Out_ PULONG UnicodeStringActualByteCount, + _In_reads_bytes_(UTF8StringByteCount) PCCH UTF8StringSource, + _In_ ULONG UTF8StringByteCount); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlReplaceSidInSd( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID OldSid, - IN PSID NewSid, - OUT ULONG *NumChanges); + _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PSID OldSid, + _In_ PSID NewSid, + _Out_ ULONG *NumChanges); NTSYSAPI NTSTATUS NTAPI RtlCreateVirtualAccountSid( - IN PCUNICODE_STRING Name, - IN ULONG BaseSubAuthority, - OUT PSID Sid, - IN OUT PULONG SidLength); + _In_ PCUNICODE_STRING Name, + _In_ ULONG BaseSubAuthority, + _Out_writes_bytes_(*SidLength) PSID Sid, + _Inout_ PULONG SidLength); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -2401,7 +2677,7 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlConvertLongToLargeInteger( - IN LONG SignedInteger) + _In_ LONG SignedInteger) { LARGE_INTEGER ret; ret.QuadPart = SignedInteger; @@ -2413,7 +2689,7 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlConvertUlongToLargeInteger( - IN ULONG UnsignedInteger) + _In_ ULONG UnsignedInteger) { LARGE_INTEGER ret; ret.QuadPart = UnsignedInteger; @@ -2425,8 +2701,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerShiftLeft( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount) + _In_ LARGE_INTEGER LargeInteger, + _In_ CCHAR ShiftCount) { LARGE_INTEGER Result; @@ -2439,8 +2715,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerShiftRight( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount) + _In_ LARGE_INTEGER LargeInteger, + _In_ CCHAR ShiftCount) { LARGE_INTEGER Result; @@ -2453,9 +2729,9 @@ static __inline ULONG NTAPI_INLINE RtlEnlargedUnsignedDivide( - IN ULARGE_INTEGER Dividend, - IN ULONG Divisor, - IN OUT PULONG Remainder) + _In_ ULARGE_INTEGER Dividend, + _In_ ULONG Divisor, + _Out_opt_ PULONG Remainder) { if (Remainder) *Remainder = (ULONG)(Dividend.QuadPart % Divisor); @@ -2467,7 +2743,7 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerNegate( - IN LARGE_INTEGER Subtrahend) + _In_ LARGE_INTEGER Subtrahend) { LARGE_INTEGER Difference; @@ -2480,8 +2756,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerSubtract( - IN LARGE_INTEGER Minuend, - IN LARGE_INTEGER Subtrahend) + _In_ LARGE_INTEGER Minuend, + _In_ LARGE_INTEGER Subtrahend) { LARGE_INTEGER Difference; @@ -2494,8 +2770,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlEnlargedUnsignedMultiply( - IN ULONG Multiplicand, - IN ULONG Multiplier) + _In_ ULONG Multiplicand, + _In_ ULONG Multiplier) { LARGE_INTEGER ret; ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier; @@ -2507,36 +2783,44 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlEnlargedIntegerMultiply( - IN LONG Multiplicand, - IN LONG Multiplier) + _In_ LONG Multiplicand, + _In_ LONG Multiplier) { LARGE_INTEGER ret; ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier; return ret; } +_At_(AnsiString->Buffer, _Post_equal_to_(Buffer)) +_At_(AnsiString->Length, _Post_equal_to_(0)) +_At_(AnsiString->MaximumLength, _Post_equal_to_(BufferSize)) FORCEINLINE VOID RtlInitEmptyAnsiString( - OUT PANSI_STRING AnsiString, - IN PCHAR Buffer, - IN USHORT BufferSize) + _Out_ PANSI_STRING AnsiString, + _Pre_maybenull_ _Pre_readable_size_(BufferSize) __drv_aliasesMem PCHAR Buffer, + _In_ USHORT BufferSize) { AnsiString->Length = 0; AnsiString->MaximumLength = BufferSize; AnsiString->Buffer = Buffer; } +_At_(UnicodeString->Buffer, _Post_equal_to_(Buffer)) +_At_(UnicodeString->Length, _Post_equal_to_(0)) +_At_(UnicodeString->MaximumLength, _Post_equal_to_(BufferSize)) FORCEINLINE VOID RtlInitEmptyUnicodeString( - OUT PUNICODE_STRING UnicodeString, - IN PWSTR Buffer, - IN USHORT BufferSize) + _Out_ PUNICODE_STRING UnicodeString, + _Writable_bytes_(BufferSize) + _When_(BufferSize != 0, _Notnull_) + __drv_aliasesMem PWSTR Buffer, + _In_ USHORT BufferSize) { - UnicodeString->Length = 0; - UnicodeString->MaximumLength = BufferSize; - UnicodeString->Buffer = Buffer; + UnicodeString->Length = 0; + UnicodeString->MaximumLength = BufferSize; + UnicodeString->Buffer = Buffer; } $endif (_WDMDDK_) @@ -2548,8 +2832,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlExtendedIntegerMultiply( - IN LARGE_INTEGER Multiplicand, - IN LONG Multiplier) + _In_ LARGE_INTEGER Multiplicand, + _In_ LONG Multiplier) { LARGE_INTEGER ret; ret.QuadPart = Multiplicand.QuadPart * Multiplier; @@ -2560,9 +2844,9 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlExtendedLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN ULONG Divisor, - OUT PULONG Remainder OPTIONAL) + _In_ LARGE_INTEGER Dividend, + _In_ ULONG Divisor, + _Out_opt_ PULONG Remainder) { LARGE_INTEGER ret; ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor; @@ -2580,9 +2864,9 @@ FORCEINLINE LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - OUT PLARGE_INTEGER Remainder OPTIONAL) + _In_ LARGE_INTEGER Dividend, + _In_ LARGE_INTEGER Divisor, + _Out_opt_ PLARGE_INTEGER Remainder) { LARGE_INTEGER ret; ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart; @@ -2598,9 +2882,9 @@ NTSYSAPI LARGE_INTEGER NTAPI RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - OUT PLARGE_INTEGER Remainder OPTIONAL); + _In_ LARGE_INTEGER Dividend, + _In_ LARGE_INTEGER Divisor, + _Out_opt_ PLARGE_INTEGER Remainder); #endif $endif (_NTDDK_) @@ -2619,9 +2903,9 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlExtendedMagicDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER MagicDivisor, - IN CCHAR ShiftCount) + _In_ LARGE_INTEGER Dividend, + _In_ LARGE_INTEGER MagicDivisor, + _In_ CCHAR ShiftCount) { LARGE_INTEGER ret; ULONG64 ret64; @@ -2640,8 +2924,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerAdd( - IN LARGE_INTEGER Addend1, - IN LARGE_INTEGER Addend2) + _In_ LARGE_INTEGER Addend1, + _In_ LARGE_INTEGER Addend2) { LARGE_INTEGER ret; ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart; @@ -2662,8 +2946,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerArithmeticShift( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount) + _In_ LARGE_INTEGER LargeInteger, + _In_ CCHAR ShiftCount) { LARGE_INTEGER ret; ret.QuadPart = LargeInteger.QuadPart >> ShiftCount; @@ -2681,8 +2965,8 @@ RtlLargeIntegerArithmeticShift( FORCEINLINE PVOID RtlSecureZeroMemory( - OUT PVOID Pointer, - IN SIZE_T Size) + _Out_writes_bytes_all_(Size) PVOID Pointer, + _In_ SIZE_T Size) { volatile char* vptr = (volatile char*)Pointer; #if defined(_M_AMD64) @@ -2697,11 +2981,12 @@ RtlSecureZeroMemory( } #if defined(_M_AMD64) +_Must_inspect_result_ FORCEINLINE BOOLEAN RtlCheckBit( - IN PRTL_BITMAP BitMapHeader, - IN ULONG BitPosition) + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitPosition) { return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition); } @@ -2851,14 +3136,14 @@ RtlCheckBit( NTKERNELAPI VOID InitializeSListHead( - OUT PSLIST_HEADER SListHead); + _Out_ PSLIST_HEADER SListHead); #else FORCEINLINE VOID InitializeSListHead( - OUT PSLIST_HEADER SListHead) + _Out_ PSLIST_HEADER SListHead) { #if defined(_IA64_) ULONG64 FeatureBits; @@ -2901,14 +3186,14 @@ NTKERNELAPI PSLIST_ENTRY FASTCALL InterlockedPopEntrySList( - IN PSLIST_HEADER ListHead); + _Inout_ PSLIST_HEADER ListHead); NTKERNELAPI PSLIST_ENTRY FASTCALL InterlockedPushEntrySList( - IN PSLIST_HEADER ListHead, - IN PSLIST_ENTRY ListEntry); + _Inout_ PSLIST_HEADER ListHead, + _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry); #define InterlockedFlushSList(ListHead) \ ExInterlockedFlushSList(ListHead) @@ -2935,11 +3220,11 @@ InterlockedPushEntrySList( BOOLEAN RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)( - IN ULONG Version); + _In_ ULONG Version); BOOLEAN RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)( - IN ULONG Version); + _In_ ULONG Version); #ifndef RtlIsNtDdiVersionAvailable #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable @@ -3042,7 +3327,7 @@ FORCEINLINE LUID NTAPI_INLINE RtlConvertLongToLuid( - IN LONG Val) + _In_ LONG Val) { LUID Luid; LARGE_INTEGER Temp; @@ -3057,7 +3342,7 @@ FORCEINLINE LUID NTAPI_INLINE RtlConvertUlongToLuid( - IN ULONG Val) + _In_ ULONG Val) { LUID Luid; @@ -3078,8 +3363,8 @@ NTSYSAPI VOID NTAPI RtlGetCallersAddress( - OUT PVOID *CallersAddress, - OUT PVOID *CallersCaller); + _Out_ PVOID *CallersAddress, + _Out_ PVOID *CallersCaller); #endif #endif @@ -3091,7 +3376,7 @@ FORCEINLINE VOID NTAPI RtlInitHashTableContext( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) + _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) { Context->ChainHead = NULL; Context->PrevLinkage = NULL; @@ -3101,8 +3386,8 @@ FORCEINLINE VOID NTAPI RtlInitHashTableContextFromEnumerator( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context, - IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator) + _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context, + _In_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator) { Context->ChainHead = Enumerator->ChainHead; Context->PrevLinkage = Enumerator->HashEntry.Linkage.Blink; @@ -3112,7 +3397,7 @@ FORCEINLINE VOID NTAPI RtlReleaseHashTableContext( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) + _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) { UNREFERENCED_PARAMETER(Context); return; @@ -3122,7 +3407,7 @@ FORCEINLINE ULONG NTAPI RtlTotalBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable) { return HashTable->TableSize; } @@ -3131,7 +3416,7 @@ FORCEINLINE ULONG NTAPI RtlNonEmptyBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable) { return HashTable->NonEmptyBuckets; } @@ -3140,7 +3425,7 @@ FORCEINLINE ULONG NTAPI RtlEmptyBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable) { return HashTable->TableSize - HashTable->NonEmptyBuckets; } @@ -3149,7 +3434,7 @@ FORCEINLINE ULONG NTAPI RtlTotalEntriesHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable) { return HashTable->NumEntries; } @@ -3158,7 +3443,7 @@ FORCEINLINE ULONG NTAPI RtlActiveEnumeratorsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable) { return HashTable->NumEnumerators; } diff --git a/reactos/include/xdk/rtltypes.h b/reactos/include/xdk/rtltypes.h index 24f829ad929..9891684dd2b 100644 --- a/reactos/include/xdk/rtltypes.h +++ b/reactos/include/xdk/rtltypes.h @@ -36,14 +36,17 @@ typedef struct _RTL_BITMAP_RUN { ULONG NumberOfBits; } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN; +_Function_class_(RTL_QUERY_REGISTRY_ROUTINE) +_IRQL_requires_max_(PASSIVE_LEVEL) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI *PRTL_QUERY_REGISTRY_ROUTINE)( - IN PWSTR ValueName, - IN ULONG ValueType, - IN PVOID ValueData, - IN ULONG ValueLength, - IN PVOID Context, - IN PVOID EntryContext); + _In_z_ PWSTR ValueName, + _In_ ULONG ValueType, + _In_reads_bytes_opt_(ValueLength) PVOID ValueData, + _In_ ULONG ValueLength, + _In_opt_ PVOID Context, + _In_opt_ PVOID EntryContext); typedef struct _RTL_QUERY_REGISTRY_TABLE { PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine; @@ -161,11 +164,11 @@ extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag; typedef BOOLEAN (*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)( - IN ULONG Version); + _In_ ULONG Version); typedef BOOLEAN (*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)( - IN ULONG Version); + _In_ ULONG Version); $endif (_WDMDDK_) $if (_NTDDK_) @@ -221,11 +224,13 @@ typedef union _RTL_RUN_ONCE { PVOID Ptr; } RTL_RUN_ONCE, *PRTL_RUN_ONCE; +_Function_class_(RTL_RUN_ONCE_INIT_FN) +_IRQL_requires_same_ 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); + _Inout_ PRTL_RUN_ONCE RunOnce, + _Inout_opt_ PVOID Parameter, + _Inout_opt_ PVOID *Context); #endif /* _RTL_RUN_ONCE_DEF */ @@ -245,30 +250,39 @@ typedef enum _RTL_GENERIC_COMPARE_RESULTS { // Forwarder struct _RTL_AVL_TABLE; +_IRQL_requires_same_ +_Function_class_(RTL_AVL_COMPARE_ROUTINE) typedef RTL_GENERIC_COMPARE_RESULTS (NTAPI RTL_AVL_COMPARE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID FirstStruct, - IN PVOID SecondStruct); + _In_ struct _RTL_AVL_TABLE *Table, + _In_ PVOID FirstStruct, + _In_ PVOID SecondStruct); typedef RTL_AVL_COMPARE_ROUTINE *PRTL_AVL_COMPARE_ROUTINE; +_IRQL_requires_same_ +_Function_class_(RTL_AVL_ALLOCATE_ROUTINE) +__drv_allocatesMem(Mem) typedef PVOID (NTAPI RTL_AVL_ALLOCATE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN CLONG ByteSize); + _In_ struct _RTL_AVL_TABLE *Table, + _In_ CLONG ByteSize); typedef RTL_AVL_ALLOCATE_ROUTINE *PRTL_AVL_ALLOCATE_ROUTINE; +_IRQL_requires_same_ +_Function_class_(RTL_AVL_FREE_ROUTINE) typedef VOID (NTAPI RTL_AVL_FREE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID Buffer); + _In_ struct _RTL_AVL_TABLE *Table, + _In_ __drv_freesMem(Mem) _Post_invalid_ PVOID Buffer); typedef RTL_AVL_FREE_ROUTINE *PRTL_AVL_FREE_ROUTINE; +_IRQL_requires_same_ +_Function_class_(RTL_AVL_MATCH_FUNCTION) typedef NTSTATUS (NTAPI RTL_AVL_MATCH_FUNCTION) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID UserData, - IN PVOID MatchData); + _In_ struct _RTL_AVL_TABLE *Table, + _In_ PVOID UserData, + _In_ PVOID MatchData); typedef RTL_AVL_MATCH_FUNCTION *PRTL_AVL_MATCH_FUNCTION; typedef struct _RTL_BALANCED_LINKS { @@ -303,23 +317,30 @@ typedef struct _RTL_SPLAY_LINKS { struct _RTL_GENERIC_TABLE; +_IRQL_requires_same_ +_Function_class_(RTL_GENERIC_COMPARE_ROUTINE) typedef RTL_GENERIC_COMPARE_RESULTS (NTAPI RTL_GENERIC_COMPARE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN PVOID FirstStruct, - IN PVOID SecondStruct); + _In_ struct _RTL_GENERIC_TABLE *Table, + _In_ PVOID FirstStruct, + _In_ PVOID SecondStruct); typedef RTL_GENERIC_COMPARE_ROUTINE *PRTL_GENERIC_COMPARE_ROUTINE; +_IRQL_requires_same_ +_Function_class_(RTL_GENERIC_ALLOCATE_ROUTINE) +__drv_allocatesMem(Mem) typedef PVOID (NTAPI RTL_GENERIC_ALLOCATE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN CLONG ByteSize); + _In_ struct _RTL_GENERIC_TABLE *Table, + _In_ CLONG ByteSize); typedef RTL_GENERIC_ALLOCATE_ROUTINE *PRTL_GENERIC_ALLOCATE_ROUTINE; +_IRQL_requires_same_ +_Function_class_(RTL_GENERIC_FREE_ROUTINE) typedef VOID (NTAPI RTL_GENERIC_FREE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN PVOID Buffer); + _In_ struct _RTL_GENERIC_TABLE *Table, + _In_ __drv_freesMem(Mem) _Post_invalid_ PVOID Buffer); typedef RTL_GENERIC_FREE_ROUTINE *PRTL_GENERIC_FREE_ROUTINE; typedef struct _RTL_GENERIC_TABLE { @@ -358,6 +379,8 @@ typedef struct _RTL_GENERIC_TABLE { #endif /* RTL_USE_AVL_TABLES */ +#define RTL_HASH_ALLOCATED_HEADER 0x00000001 + typedef struct _RTL_DYNAMIC_HASH_TABLE_ENTRY { LIST_ENTRY Linkage; ULONG_PTR Signature; @@ -456,20 +479,26 @@ $if (_NTIFS_) #define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information" +_Function_class_(RTL_ALLOCATE_STRING_ROUTINE) +_IRQL_requires_max_(PASSIVE_LEVEL) +__drv_allocatesMem(Mem) typedef PVOID (NTAPI *PRTL_ALLOCATE_STRING_ROUTINE)( - IN SIZE_T NumberOfBytes); + _In_ SIZE_T NumberOfBytes); #if _WIN32_WINNT >= 0x0600 +_Function_class_(RTL_REALLOCATE_STRING_ROUTINE) +_IRQL_requires_max_(PASSIVE_LEVEL) +__drv_allocatesMem(Mem) typedef PVOID (NTAPI *PRTL_REALLOCATE_STRING_ROUTINE)( - IN SIZE_T NumberOfBytes, + _In_ SIZE_T NumberOfBytes, IN PVOID Buffer); #endif typedef VOID (NTAPI *PRTL_FREE_STRING_ROUTINE)( - IN PVOID Buffer); + _In_ __drv_freesMem(Mem) _Post_invalid_ PVOID Buffer); extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine; extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine; @@ -478,11 +507,13 @@ extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine; extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine; #endif +_Function_class_(RTL_HEAP_COMMIT_ROUTINE) +_IRQL_requires_same_ typedef NTSTATUS -(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) ( - IN PVOID Base, - IN OUT PVOID *CommitAddress, - IN OUT PSIZE_T CommitSize); +(NTAPI *PRTL_HEAP_COMMIT_ROUTINE) ( + _In_ PVOID Base, + _Inout_ PVOID *CommitAddress, + _Inout_ PSIZE_T CommitSize); typedef struct _RTL_HEAP_PARAMETERS { ULONG Length; @@ -503,9 +534,9 @@ typedef struct _RTL_HEAP_PARAMETERS { typedef struct _GENERATE_NAME_CONTEXT { USHORT Checksum; BOOLEAN CheckSumInserted; - UCHAR NameLength; + _Field_range_(<=, 8) UCHAR NameLength; WCHAR NameBuffer[8]; - ULONG ExtensionLength; + _Field_range_(<=, 4) ULONG ExtensionLength; WCHAR ExtensionBuffer[4]; ULONG LastIndexValue; } GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT; diff --git a/reactos/include/xdk/sefuncs.h b/reactos/include/xdk/sefuncs.h index ffb4facf0b4..44e5fedfa9e 100644 --- a/reactos/include/xdk/sefuncs.h +++ b/reactos/include/xdk/sefuncs.h @@ -4,98 +4,103 @@ #if (NTDDI_VERSION >= NTDDI_WIN2K) $if (_WDMDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI SeAccessCheck( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, - IN BOOLEAN SubjectContextLocked, - IN ACCESS_MASK DesiredAccess, - IN ACCESS_MASK PreviouslyGrantedAccess, - OUT PPRIVILEGE_SET *Privileges OPTIONAL, - IN PGENERIC_MAPPING GenericMapping, - IN KPROCESSOR_MODE AccessMode, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, + _In_ BOOLEAN SubjectContextLocked, + _In_ ACCESS_MASK DesiredAccess, + _In_ ACCESS_MASK PreviouslyGrantedAccess, + _Outptr_opt_ PPRIVILEGE_SET *Privileges, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PACCESS_MASK GrantedAccess, + _Out_ PNTSTATUS AccessStatus); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI SeAssignSecurity( - IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, - IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL, - OUT PSECURITY_DESCRIPTOR *NewDescriptor, - IN BOOLEAN IsDirectoryObject, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN PGENERIC_MAPPING GenericMapping, - IN POOL_TYPE PoolType); + _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor, + _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor, + _Out_ PSECURITY_DESCRIPTOR *NewDescriptor, + _In_ BOOLEAN IsDirectoryObject, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ POOL_TYPE PoolType); NTKERNELAPI NTSTATUS NTAPI SeAssignSecurityEx( - IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, - IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL, - OUT PSECURITY_DESCRIPTOR *NewDescriptor, - IN GUID *ObjectType OPTIONAL, - IN BOOLEAN IsDirectoryObject, - IN ULONG AutoInheritFlags, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN PGENERIC_MAPPING GenericMapping, - IN POOL_TYPE PoolType); + _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor, + _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor, + _Out_ PSECURITY_DESCRIPTOR *NewDescriptor, + _In_opt_ GUID *ObjectType, + _In_ BOOLEAN IsDirectoryObject, + _In_ ULONG AutoInheritFlags, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ POOL_TYPE PoolType); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI SeDeassignSecurity( - IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor); + _Inout_ PSECURITY_DESCRIPTOR *SecurityDescriptor); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI SeValidSecurityDescriptor( - IN ULONG Length, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ ULONG Length, + _In_reads_bytes_(Length) PSECURITY_DESCRIPTOR SecurityDescriptor); NTKERNELAPI ULONG NTAPI SeObjectCreateSaclAccessBits( - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); NTKERNELAPI VOID NTAPI SeReleaseSubjectContext( - IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); + _Inout_ PSECURITY_SUBJECT_CONTEXT SubjectContext); NTKERNELAPI VOID NTAPI SeUnlockSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext); NTKERNELAPI VOID NTAPI SeCaptureSubjectContext( - OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); + _Out_ PSECURITY_SUBJECT_CONTEXT SubjectContext); NTKERNELAPI VOID NTAPI SeLockSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext); $endif (_WDMDDK_) $if (_NTDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI SeSinglePrivilegeCheck( - IN LUID PrivilegeValue, - IN KPROCESSOR_MODE PreviousMode); + _In_ LUID PrivilegeValue, + _In_ KPROCESSOR_MODE PreviousMode); $endif (_NTDDK_) $if (_NTIFS_) @@ -103,200 +108,200 @@ NTKERNELAPI VOID NTAPI SeReleaseSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + _Inout_ PSECURITY_SUBJECT_CONTEXT SubjectContext); NTKERNELAPI BOOLEAN NTAPI SePrivilegeCheck( - IN OUT PPRIVILEGE_SET RequiredPrivileges, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN KPROCESSOR_MODE AccessMode); + _Inout_ PPRIVILEGE_SET RequiredPrivileges, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, + _In_ KPROCESSOR_MODE AccessMode); NTKERNELAPI VOID NTAPI SeOpenObjectAuditAlarm( - IN PUNICODE_STRING ObjectTypeName, - IN PVOID Object OPTIONAL, - IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PACCESS_STATE AccessState, - IN BOOLEAN ObjectCreated, - IN BOOLEAN AccessGranted, - IN KPROCESSOR_MODE AccessMode, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING ObjectTypeName, + _In_opt_ PVOID Object, + _In_opt_ PUNICODE_STRING AbsoluteObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PACCESS_STATE AccessState, + _In_ BOOLEAN ObjectCreated, + _In_ BOOLEAN AccessGranted, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PBOOLEAN GenerateOnClose); NTKERNELAPI VOID NTAPI SeOpenObjectForDeleteAuditAlarm( - IN PUNICODE_STRING ObjectTypeName, - IN PVOID Object OPTIONAL, - IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PACCESS_STATE AccessState, - IN BOOLEAN ObjectCreated, - IN BOOLEAN AccessGranted, - IN KPROCESSOR_MODE AccessMode, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING ObjectTypeName, + _In_opt_ PVOID Object, + _In_opt_ PUNICODE_STRING AbsoluteObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PACCESS_STATE AccessState, + _In_ BOOLEAN ObjectCreated, + _In_ BOOLEAN AccessGranted, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PBOOLEAN GenerateOnClose); NTKERNELAPI VOID NTAPI SeDeleteObjectAuditAlarm( - IN PVOID Object, - IN HANDLE Handle); + _In_ PVOID Object, + _In_ HANDLE Handle); NTKERNELAPI TOKEN_TYPE NTAPI SeTokenType( - IN PACCESS_TOKEN Token); + _In_ PACCESS_TOKEN Token); NTKERNELAPI BOOLEAN NTAPI SeTokenIsAdmin( - IN PACCESS_TOKEN Token); + _In_ PACCESS_TOKEN Token); NTKERNELAPI BOOLEAN NTAPI SeTokenIsRestricted( - IN PACCESS_TOKEN Token); + _In_ PACCESS_TOKEN Token); NTKERNELAPI NTSTATUS NTAPI SeQueryAuthenticationIdToken( - IN PACCESS_TOKEN Token, - OUT PLUID AuthenticationId); + _In_ PACCESS_TOKEN Token, + _Out_ PLUID AuthenticationId); NTKERNELAPI NTSTATUS NTAPI SeQuerySessionIdToken( - IN PACCESS_TOKEN Token, - OUT PULONG SessionId); + _In_ PACCESS_TOKEN Token, + _Out_ PULONG SessionId); NTKERNELAPI NTSTATUS NTAPI SeCreateClientSecurity( - IN PETHREAD ClientThread, - IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos, - IN BOOLEAN RemoteSession, - OUT PSECURITY_CLIENT_CONTEXT ClientContext); + _In_ PETHREAD ClientThread, + _In_ PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos, + _In_ BOOLEAN RemoteSession, + _Out_ PSECURITY_CLIENT_CONTEXT ClientContext); NTKERNELAPI VOID NTAPI SeImpersonateClient( - IN PSECURITY_CLIENT_CONTEXT ClientContext, - IN PETHREAD ServerThread OPTIONAL); + _In_ PSECURITY_CLIENT_CONTEXT ClientContext, + _In_opt_ PETHREAD ServerThread); NTKERNELAPI NTSTATUS NTAPI SeImpersonateClientEx( - IN PSECURITY_CLIENT_CONTEXT ClientContext, - IN PETHREAD ServerThread OPTIONAL); + _In_ PSECURITY_CLIENT_CONTEXT ClientContext, + _In_opt_ PETHREAD ServerThread); NTKERNELAPI NTSTATUS NTAPI SeCreateClientSecurityFromSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos, - IN BOOLEAN ServerIsRemote, - OUT PSECURITY_CLIENT_CONTEXT ClientContext); + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, + _In_ PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos, + _In_ BOOLEAN ServerIsRemote, + _Out_ PSECURITY_CLIENT_CONTEXT ClientContext); NTKERNELAPI NTSTATUS NTAPI SeQuerySecurityDescriptorInfo( - IN PSECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN OUT PULONG Length, - IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor); + _In_ PSECURITY_INFORMATION SecurityInformation, + _Out_writes_bytes_(*Length) PSECURITY_DESCRIPTOR SecurityDescriptor, + _Inout_ PULONG Length, + _Inout_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor); NTKERNELAPI NTSTATUS NTAPI SeSetSecurityDescriptorInfo( - IN PVOID Object OPTIONAL, - IN PSECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, - IN POOL_TYPE PoolType, - IN PGENERIC_MAPPING GenericMapping); + _In_opt_ PVOID Object, + _In_ PSECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Inout_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, + _In_ POOL_TYPE PoolType, + _In_ PGENERIC_MAPPING GenericMapping); NTKERNELAPI NTSTATUS NTAPI SeSetSecurityDescriptorInfoEx( - IN PVOID Object OPTIONAL, - IN PSECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR ModificationDescriptor, - IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, - IN ULONG AutoInheritFlags, - IN POOL_TYPE PoolType, - IN PGENERIC_MAPPING GenericMapping); + _In_opt_ PVOID Object, + _In_ PSECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR ModificationDescriptor, + _Inout_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, + _In_ ULONG AutoInheritFlags, + _In_ POOL_TYPE PoolType, + _In_ PGENERIC_MAPPING GenericMapping); NTKERNELAPI NTSTATUS NTAPI SeAppendPrivileges( - IN OUT PACCESS_STATE AccessState, - IN PPRIVILEGE_SET Privileges); + _Inout_ PACCESS_STATE AccessState, + _In_ PPRIVILEGE_SET Privileges); NTKERNELAPI BOOLEAN NTAPI SeAuditingFileEvents( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ BOOLEAN AccessGranted, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); NTKERNELAPI BOOLEAN NTAPI SeAuditingFileOrGlobalEvents( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext); + _In_ BOOLEAN AccessGranted, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext); VOID NTAPI SeSetAccessStateGenericMapping( - IN OUT PACCESS_STATE AccessState, - IN PGENERIC_MAPPING GenericMapping); + _Inout_ PACCESS_STATE AccessState, + _In_ PGENERIC_MAPPING GenericMapping); NTKERNELAPI NTSTATUS NTAPI SeRegisterLogonSessionTerminatedRoutine( - IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine); + _In_ PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine); NTKERNELAPI NTSTATUS NTAPI SeUnregisterLogonSessionTerminatedRoutine( - IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine); + _In_ PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine); NTKERNELAPI NTSTATUS NTAPI SeMarkLogonSessionForTerminationNotification( - IN PLUID LogonId); + _In_ PLUID LogonId); NTKERNELAPI NTSTATUS NTAPI SeQueryInformationToken( - IN PACCESS_TOKEN Token, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID *TokenInformation); + _In_ PACCESS_TOKEN Token, + _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, + _Outptr_result_buffer_(_Inexpressible_(token-dependent)) PVOID *TokenInformation); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -306,8 +311,8 @@ NTKERNELAPI BOOLEAN NTAPI SeAuditingHardLinkEvents( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ BOOLEAN AccessGranted, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); #endif #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -316,20 +321,20 @@ NTKERNELAPI NTSTATUS NTAPI SeFilterToken( - IN PACCESS_TOKEN ExistingToken, - IN ULONG Flags, - IN PTOKEN_GROUPS SidsToDisable OPTIONAL, - IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL, - IN PTOKEN_GROUPS RestrictedSids OPTIONAL, - OUT PACCESS_TOKEN *FilteredToken); + _In_ PACCESS_TOKEN ExistingToken, + _In_ ULONG Flags, + _In_opt_ PTOKEN_GROUPS SidsToDisable, + _In_opt_ PTOKEN_PRIVILEGES PrivilegesToDelete, + _In_opt_ PTOKEN_GROUPS RestrictedSids, + _Outptr_ PACCESS_TOKEN *FilteredToken); NTKERNELAPI VOID NTAPI SeAuditHardLinkCreation( - IN PUNICODE_STRING FileName, - IN PUNICODE_STRING LinkName, - IN BOOLEAN bSuccess); + _In_ PUNICODE_STRING FileName, + _In_ PUNICODE_STRING LinkName, + _In_ BOOLEAN bSuccess); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -339,17 +344,17 @@ NTKERNELAPI BOOLEAN NTAPI SeAuditingFileEventsWithContext( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL); + _In_ BOOLEAN AccessGranted, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext); NTKERNELAPI BOOLEAN NTAPI SeAuditingHardLinkEventsWithContext( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL); + _In_ BOOLEAN AccessGranted, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext); #endif $endif (_NTIFS_) @@ -357,21 +362,23 @@ $endif (_NTIFS_) $if (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WS03SP1) +_At_(AuditParameters->ParameterCount, _Const_) NTSTATUS NTAPI SeSetAuditParameter( - IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters, - IN SE_ADT_PARAMETER_TYPE Type, - IN ULONG Index, - IN PVOID Data); + _Inout_ PSE_ADT_PARAMETER_ARRAY AuditParameters, + _In_ SE_ADT_PARAMETER_TYPE Type, + _In_range_(<,SE_MAX_AUDIT_PARAMETERS) ULONG Index, + _In_reads_(_Inexpressible_("depends on SE_ADT_PARAMETER_TYPE")) + PVOID Data); NTSTATUS NTAPI SeReportSecurityEvent( - IN ULONG Flags, - IN PUNICODE_STRING SourceName, - IN PSID UserSid OPTIONAL, - IN PSE_ADT_PARAMETER_ARRAY AuditParameters); + _In_ ULONG Flags, + _In_ PUNICODE_STRING SourceName, + _In_opt_ PSID UserSid, + _In_ PSE_ADT_PARAMETER_ARRAY AuditParameters); #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ $endif (_WDMDDK_) @@ -384,17 +391,17 @@ NTKERNELAPI ULONG NTAPI SeComputeAutoInheritByObjectType( - IN PVOID ObjectType, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, - IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL); + _In_ PVOID ObjectType, + _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSECURITY_DESCRIPTOR ParentSecurityDescriptor); #ifdef SE_NTFS_WORLD_CACHE VOID NTAPI SeGetWorldRights( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PGENERIC_MAPPING GenericMapping, - OUT PACCESS_MASK GrantedAccess); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PGENERIC_MAPPING GenericMapping, + _Out_ PACCESS_MASK GrantedAccess); #endif /* SE_NTFS_WORLD_CACHE */ $endif (_WDMDDK_) $if (_NTIFS_) @@ -403,81 +410,81 @@ NTKERNELAPI VOID NTAPI SeOpenObjectAuditAlarmWithTransaction( - IN PUNICODE_STRING ObjectTypeName, - IN PVOID Object OPTIONAL, - IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PACCESS_STATE AccessState, - IN BOOLEAN ObjectCreated, - IN BOOLEAN AccessGranted, - IN KPROCESSOR_MODE AccessMode, - IN GUID *TransactionId OPTIONAL, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING ObjectTypeName, + _In_opt_ PVOID Object, + _In_opt_ PUNICODE_STRING AbsoluteObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PACCESS_STATE AccessState, + _In_ BOOLEAN ObjectCreated, + _In_ BOOLEAN AccessGranted, + _In_ KPROCESSOR_MODE AccessMode, + _In_opt_ GUID *TransactionId, + _Out_ PBOOLEAN GenerateOnClose); NTKERNELAPI VOID NTAPI SeOpenObjectForDeleteAuditAlarmWithTransaction( - IN PUNICODE_STRING ObjectTypeName, - IN PVOID Object OPTIONAL, - IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PACCESS_STATE AccessState, - IN BOOLEAN ObjectCreated, - IN BOOLEAN AccessGranted, - IN KPROCESSOR_MODE AccessMode, - IN GUID *TransactionId OPTIONAL, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING ObjectTypeName, + _In_opt_ PVOID Object, + _In_opt_ PUNICODE_STRING AbsoluteObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PACCESS_STATE AccessState, + _In_ BOOLEAN ObjectCreated, + _In_ BOOLEAN AccessGranted, + _In_ KPROCESSOR_MODE AccessMode, + _In_opt_ GUID *TransactionId, + _Out_ PBOOLEAN GenerateOnClose); NTKERNELAPI VOID NTAPI SeExamineSacl( - IN PACL Sacl, - IN PACCESS_TOKEN Token, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN AccessGranted, - OUT PBOOLEAN GenerateAudit, - OUT PBOOLEAN GenerateAlarm); + _In_ PACL Sacl, + _In_ PACCESS_TOKEN Token, + _In_ ACCESS_MASK DesiredAccess, + _In_ BOOLEAN AccessGranted, + _Out_ PBOOLEAN GenerateAudit, + _Out_ PBOOLEAN GenerateAlarm); NTKERNELAPI VOID NTAPI SeDeleteObjectAuditAlarmWithTransaction( - IN PVOID Object, - IN HANDLE Handle, - IN GUID *TransactionId OPTIONAL); + _In_ PVOID Object, + _In_ HANDLE Handle, + _In_opt_ GUID *TransactionId); NTKERNELAPI VOID NTAPI SeQueryTokenIntegrity( - IN PACCESS_TOKEN Token, - IN OUT PSID_AND_ATTRIBUTES IntegritySA); + _In_ PACCESS_TOKEN Token, + _Inout_ PSID_AND_ATTRIBUTES IntegritySA); NTKERNELAPI NTSTATUS NTAPI SeSetSessionIdToken( - IN PACCESS_TOKEN Token, - IN ULONG SessionId); + _In_ PACCESS_TOKEN Token, + _In_ ULONG SessionId); NTKERNELAPI VOID NTAPI SeAuditHardLinkCreationWithTransaction( - IN PUNICODE_STRING FileName, - IN PUNICODE_STRING LinkName, - IN BOOLEAN bSuccess, - IN GUID *TransactionId OPTIONAL); + _In_ PUNICODE_STRING FileName, + _In_ PUNICODE_STRING LinkName, + _In_ BOOLEAN bSuccess, + _In_opt_ GUID *TransactionId); NTKERNELAPI VOID NTAPI SeAuditTransactionStateChange( - IN GUID *TransactionId, - IN GUID *ResourceManagerId, - IN ULONG NewTransactionState); + _In_ GUID *TransactionId, + _In_ GUID *ResourceManagerId, + _In_ ULONG NewTransactionState); $endif (_NTIFS_) $if (_WDMDDK_ || _NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -489,7 +496,7 @@ NTKERNELAPI BOOLEAN NTAPI SeTokenIsWriteRestricted( - IN PACCESS_TOKEN Token); + _In_ PACCESS_TOKEN Token); #endif #if (NTDDI_VERSION >= NTDDI_WIN7) @@ -498,65 +505,67 @@ NTKERNELAPI BOOLEAN NTAPI SeAuditingAnyFileEventsWithContext( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, + _Out_opt_ PBOOLEAN StagingEnabled); NTKERNELAPI VOID NTAPI SeExamineGlobalSacl( - IN PUNICODE_STRING ObjectType, - IN PACCESS_TOKEN Token, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN AccessGranted, - IN OUT PBOOLEAN GenerateAudit, - IN OUT PBOOLEAN GenerateAlarm OPTIONAL); + _In_ PUNICODE_STRING ObjectType, + _In_ PACL ResourceSacl, + _In_ PACCESS_TOKEN Token, + _In_ ACCESS_MASK DesiredAccess, + _In_ BOOLEAN AccessGranted, + _Inout_ PBOOLEAN GenerateAudit, + _Inout_opt_ PBOOLEAN GenerateAlarm); NTKERNELAPI VOID NTAPI SeMaximumAuditMaskFromGlobalSacl( - IN PUNICODE_STRING ObjectTypeName OPTIONAL, - IN ACCESS_MASK GrantedAccess, - IN PACCESS_TOKEN Token, - IN OUT PACCESS_MASK AuditMask); + _In_opt_ PUNICODE_STRING ObjectTypeName, + _In_ ACCESS_MASK GrantedAccess, + _In_ PACCESS_TOKEN Token, + _Inout_ PACCESS_MASK AuditMask); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ NTSTATUS NTAPI SeReportSecurityEventWithSubCategory( - IN ULONG Flags, - IN PUNICODE_STRING SourceName, - IN PSID UserSid OPTIONAL, - IN PSE_ADT_PARAMETER_ARRAY AuditParameters, - IN ULONG AuditSubcategoryId); + _In_ ULONG Flags, + _In_ PUNICODE_STRING SourceName, + _In_opt_ PSID UserSid, + _In_ PSE_ADT_PARAMETER_ARRAY AuditParameters, + _In_ ULONG AuditSubcategoryId); BOOLEAN NTAPI SeAccessCheckFromState( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PTOKEN_ACCESS_INFORMATION PrimaryTokenInformation, - IN PTOKEN_ACCESS_INFORMATION ClientTokenInformation OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN ACCESS_MASK PreviouslyGrantedAccess, - OUT PPRIVILEGE_SET *Privileges OPTIONAL, - IN PGENERIC_MAPPING GenericMapping, - IN KPROCESSOR_MODE AccessMode, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PTOKEN_ACCESS_INFORMATION PrimaryTokenInformation, + _In_opt_ PTOKEN_ACCESS_INFORMATION ClientTokenInformation, + _In_ ACCESS_MASK DesiredAccess, + _In_ ACCESS_MASK PreviouslyGrantedAccess, + _Outptr_opt_result_maybenull_ PPRIVILEGE_SET *Privileges, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PACCESS_MASK GrantedAccess, + _Out_ PNTSTATUS AccessStatus); NTKERNELAPI VOID NTAPI SeFreePrivileges( - IN PPRIVILEGE_SET Privileges); + _In_ PPRIVILEGE_SET Privileges); NTSTATUS NTAPI SeLocateProcessImageName( - IN OUT PEPROCESS Process, - OUT PUNICODE_STRING *pImageFileName); + _Inout_ PEPROCESS Process, + _Outptr_ PUNICODE_STRING *pImageFileName); #define SeLengthSid( Sid ) \ (8 + (4 * ((SID *)Sid)->SubAuthorityCount)) diff --git a/reactos/include/xdk/setypes.h b/reactos/include/xdk/setypes.h index 2cf1ccfccd6..3eef24d0958 100644 --- a/reactos/include/xdk/setypes.h +++ b/reactos/include/xdk/setypes.h @@ -212,8 +212,8 @@ typedef struct _ACCESS_STATE { typedef VOID (NTAPI *PNTFS_DEREF_EXPORTED_SECURITY_DESCRIPTOR)( - IN PVOID Vcb, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ PVOID Vcb, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); #ifndef _NTLSA_IFS_ @@ -407,7 +407,11 @@ typedef struct _SID { UCHAR Revision; UCHAR SubAuthorityCount; SID_IDENTIFIER_AUTHORITY IdentifierAuthority; +#ifdef MIDL_PASS + [size_is(SubAuthorityCount)] ULONG SubAuthority[*]; +#else ULONG SubAuthority[ANYSIZE_ARRAY]; +#endif } SID, *PISID; #endif @@ -415,6 +419,10 @@ typedef struct _SID { #define SID_MAX_SUB_AUTHORITIES 15 #define SID_RECOMMENDED_SUB_AUTHORITIES 1 +#ifndef MIDL_PASS +#define SECURITY_MAX_SID_SIZE (sizeof(SID) - sizeof(ULONG) + (SID_MAX_SUB_AUTHORITIES * sizeof(ULONG))) +#endif + typedef enum _SID_NAME_USE { SidTypeUser = 1, SidTypeGroup, @@ -429,7 +437,11 @@ typedef enum _SID_NAME_USE { } SID_NAME_USE, *PSID_NAME_USE; typedef struct _SID_AND_ATTRIBUTES { +#ifdef MIDL_PASS + PISID Sid; +#else PSID Sid; +#endif ULONG Attributes; } SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES; typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY]; @@ -931,7 +943,11 @@ typedef struct _TOKEN_USER { typedef struct _TOKEN_GROUPS { ULONG GroupCount; +#ifdef MIDL_PASS + [size_is(GroupCount)] SID_AND_ATTRIBUTES Groups[*]; +#else SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; +#endif } TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS; typedef struct _TOKEN_PRIVILEGES { diff --git a/reactos/include/xdk/wdm.template.h b/reactos/include/xdk/wdm.template.h index 94e21e6c96d..e134333c837 100644 --- a/reactos/include/xdk/wdm.template.h +++ b/reactos/include/xdk/wdm.template.h @@ -6,7 +6,7 @@ * This file is part of the ReactOS DDK package. * * Contributors: - * Amine Khaldi + * Amine Khaldi (amine.khaldi@reactos.org) * Timo Kreuzer (timo.kreuzer@reactos.org) * * THIS SOFTWARE IS NOT COPYRIGHTED @@ -67,6 +67,9 @@ typedef GUID *PGUID; #include "intrin.h" +__internal_kernel_driver +__drv_Mode_impl(WDM_INCLUDED) + #ifdef __cplusplus extern "C" { #endif @@ -206,15 +209,6 @@ $define (_WDMDDK_) $include (interlocked.h) $include (rtltypes.h) $include (ketypes.h) -$include (mmtypes.h) -$include (extypes.h) -$include (setypes.h) -$include (potypes.h) -$include (cmtypes.h) -$include (iotypes.h) -$include (obtypes.h) -$include (pstypes.h) -$include (wmitypes.h) #if defined(_M_IX86) $include(x86/ke.h) @@ -232,6 +226,16 @@ $include(arm/ke.h) #error Unknown Architecture #endif +$include (mmtypes.h) +$include (extypes.h) +$include (setypes.h) +$include (potypes.h) +$include (cmtypes.h) +$include (iotypes.h) +$include (obtypes.h) +$include (pstypes.h) +$include (wmitypes.h) + $include (rtlfuncs.h) $include (kefuncs.h) $include (mmfuncs.h) diff --git a/reactos/include/xdk/wmifuncs.h b/reactos/include/xdk/wmifuncs.h index 2c841043d5e..70f82b72946 100644 --- a/reactos/include/xdk/wmifuncs.h +++ b/reactos/include/xdk/wmifuncs.h @@ -4,41 +4,44 @@ #ifdef RUN_WPP #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(HIGH_LEVEL) NTKERNELAPI NTSTATUS __cdecl WmiTraceMessage( - IN TRACEHANDLE LoggerHandle, - IN ULONG MessageFlags, - IN LPGUID MessageGuid, - IN USHORT MessageNumber, - IN ...); + _In_ TRACEHANDLE LoggerHandle, + _In_ ULONG MessageFlags, + _In_ LPGUID MessageGuid, + _In_ USHORT MessageNumber, + ...); #endif #endif /* RUN_WPP */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI WmiQueryTraceInformation( - IN TRACE_INFORMATION_CLASS TraceInformationClass, - OUT PVOID TraceInformation, - IN ULONG TraceInformationLength, - OUT PULONG RequiredLength OPTIONAL, - IN PVOID Buffer OPTIONAL); + _In_ TRACE_INFORMATION_CLASS TraceInformationClass, + _Out_writes_bytes_(TraceInformationLength) PVOID TraceInformation, + _In_ ULONG TraceInformationLength, + _Out_opt_ PULONG RequiredLength, + _In_opt_ PVOID Buffer); #if 0 /* FIXME: Get va_list from where? */ +_IRQL_requires_max_(HIGH_LEVEL) NTKERNELAPI NTSTATUS NTAPI WmiTraceMessageVa( - IN TRACEHANDLE LoggerHandle, - IN ULONG MessageFlags, - IN LPGUID MessageGuid, - IN USHORT MessageNumber, - IN va_list MessageArgList); + _In_ TRACEHANDLE LoggerHandle, + _In_ ULONG MessageFlags, + _In_ LPGUID MessageGuid, + _In_ USHORT MessageNumber, + _In_ va_list MessageArgList); #endif #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -46,15 +49,16 @@ WmiTraceMessageVa( #ifndef TRACE_INFORMATION_CLASS_DEFINE #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI WmiQueryTraceInformation( - IN TRACE_INFORMATION_CLASS TraceInformationClass, - OUT PVOID TraceInformation, - IN ULONG TraceInformationLength, - OUT PULONG RequiredLength OPTIONAL, - IN PVOID Buffer OPTIONAL); + _In_ TRACE_INFORMATION_CLASS TraceInformationClass, + _Out_writes_bytes_(TraceInformationLength) PVOID TraceInformation, + _In_ ULONG TraceInformationLength, + _Out_opt_ PULONG RequiredLength, + _In_opt_ PVOID Buffer); #endif #define TRACE_INFORMATION_CLASS_DEFINE @@ -63,89 +67,99 @@ WmiQueryTraceInformation( #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTKERNELAPI NTAPI EtwRegister( - IN LPCGUID ProviderId, - IN PETWENABLECALLBACK EnableCallback OPTIONAL, - IN PVOID CallbackContext OPTIONAL, - OUT PREGHANDLE RegHandle); + _In_ LPCGUID ProviderId, + _In_opt_ PETWENABLECALLBACK EnableCallback, + _In_opt_ PVOID CallbackContext, + _Out_ PREGHANDLE RegHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTKERNELAPI NTAPI EtwUnregister( - IN REGHANDLE RegHandle); + _In_ REGHANDLE RegHandle); +_IRQL_requires_max_(HIGH_LEVEL) BOOLEAN NTKERNELAPI NTAPI EtwEventEnabled( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor); + _In_ REGHANDLE RegHandle, + _In_ PCEVENT_DESCRIPTOR EventDescriptor); +_IRQL_requires_max_(HIGH_LEVEL) BOOLEAN NTKERNELAPI NTAPI EtwProviderEnabled( - IN REGHANDLE RegHandle, - IN UCHAR Level, - IN ULONGLONG Keyword); + _In_ REGHANDLE RegHandle, + _In_ UCHAR Level, + _In_ ULONGLONG Keyword); +_When_(ControlCode==EVENT_ACTIVITY_CTRL_CREATE_ID, _IRQL_requires_max_(HIGH_LEVEL)) +_When_(ControlCode!=EVENT_ACTIVITY_CTRL_CREATE_ID, _IRQL_requires_max_(APC_LEVEL)) NTSTATUS NTKERNELAPI NTAPI EtwActivityIdControl( - IN ULONG ControlCode, - IN OUT LPGUID ActivityId); + _In_ ULONG ControlCode, + _Inout_updates_bytes_(sizeof(GUID)) LPGUID ActivityId); +_IRQL_requires_max_(HIGH_LEVEL) NTSTATUS NTKERNELAPI NTAPI EtwWrite( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor, - IN LPCGUID ActivityId OPTIONAL, - IN ULONG UserDataCount, - IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); + _In_ REGHANDLE RegHandle, + _In_ PCEVENT_DESCRIPTOR EventDescriptor, + _In_opt_ LPCGUID ActivityId, + _In_ ULONG UserDataCount, + _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData); +_IRQL_requires_max_(HIGH_LEVEL) 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); + _In_ REGHANDLE RegHandle, + _In_ PCEVENT_DESCRIPTOR EventDescriptor, + _In_opt_ LPCGUID ActivityId, + _In_opt_ LPCGUID RelatedActivityId, + _In_ ULONG UserDataCount, + _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData); +_IRQL_requires_max_(HIGH_LEVEL) NTSTATUS NTKERNELAPI NTAPI EtwWriteString( - IN REGHANDLE RegHandle, - IN UCHAR Level, - IN ULONGLONG Keyword, - IN LPCGUID ActivityId OPTIONAL, - IN PCWSTR String); + _In_ REGHANDLE RegHandle, + _In_ UCHAR Level, + _In_ ULONGLONG Keyword, + _In_opt_ LPCGUID ActivityId, + _In_ PCWSTR String); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(HIGH_LEVEL) 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); + _In_ REGHANDLE RegHandle, + _In_ PCEVENT_DESCRIPTOR EventDescriptor, + _In_ ULONG64 Filter, + _In_ ULONG Flags, + _In_opt_ LPCGUID ActivityId, + _In_opt_ LPCGUID RelatedActivityId, + _In_ ULONG UserDataCount, + _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData); #endif diff --git a/reactos/include/xdk/wmitypes.h b/reactos/include/xdk/wmitypes.h index c4fd0bac146..c6547a30222 100644 --- a/reactos/include/xdk/wmitypes.h +++ b/reactos/include/xdk/wmitypes.h @@ -48,15 +48,16 @@ typedef enum _TRACE_INFORMATION_CLASS { #include +_IRQL_requires_same_ 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); + _In_ LPCGUID SourceId, + _In_ ULONG ControlCode, + _In_ UCHAR Level, + _In_ ULONGLONG MatchAnyKeyword, + _In_ ULONGLONG MatchAllKeyword, + _In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData, + _Inout_opt_ PVOID CallbackContext); #define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001 diff --git a/reactos/include/xdk/x86/ke.h b/reactos/include/xdk/x86/ke.h index 87e66b32ca8..5578f7fca18 100644 --- a/reactos/include/xdk/x86/ke.h +++ b/reactos/include/xdk/x86/ke.h @@ -63,25 +63,34 @@ KeMemoryBarrier(VOID) #define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_saves_ NTHALAPI KIRQL NTAPI KeGetCurrentIrql(VOID); +_IRQL_requires_max_(HIGH_LEVEL) NTHALAPI VOID FASTCALL KfLowerIrql( - IN KIRQL NewIrql); + _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql); #define KeLowerIrql(a) KfLowerIrql(a) +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_raises_(NewIrql) +_IRQL_saves_ NTHALAPI KIRQL FASTCALL KfRaiseIrql( - IN KIRQL NewIrql); + _In_ KIRQL NewIrql); #define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) NTHALAPI KIRQL NTAPI @@ -92,33 +101,47 @@ KIRQL NTAPI KeRaiseIrqlToSynchLevel(VOID); +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) NTHALAPI KIRQL FASTCALL KfAcquireSpinLock( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_(DISPATCH_LEVEL) NTHALAPI VOID FASTCALL KfReleaseSpinLock( - IN OUT PKSPIN_LOCK SpinLock, - IN KIRQL NewIrql); + _Inout_ PKSPIN_LOCK SpinLock, + _In_ _IRQL_restores_ KIRQL NewIrql); #define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KefAcquireSpinLockAtDpcLevel( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KefReleaseSpinLockFromDpcLevel( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) NTSYSAPI @@ -126,17 +149,25 @@ PKTHREAD NTAPI KeGetCurrentThread(VOID); +_Always_(_Post_satisfies_(return<=0)) +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Kernel_float_saved_ +_At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) NTKERNELAPI NTSTATUS NTAPI KeSaveFloatingPointState( - OUT PKFLOATING_SAVE FloatSave); + _Out_ PKFLOATING_SAVE FloatSave); +_Success_(1) +_Kernel_float_restored_ +_At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) NTKERNELAPI NTSTATUS NTAPI KeRestoreFloatingPointState( - IN PKFLOATING_SAVE FloatSave); + _In_ PKFLOATING_SAVE FloatSave); /* VOID * KeFlushIoBuffers( @@ -169,7 +200,7 @@ _KeQueryTickCount( } #define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) -$endif /* _WDMDDK_ */ +$endif (_WDMDDK_) $if (_NTDDK_) #define PAUSE_PROCESSOR YieldProcessor(); @@ -291,7 +322,7 @@ KeGetCurrentProcessorNumber(VOID) return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number)); } -$endif /* _NTDDK_ */ +$endif (_NTDDK_) diff --git a/reactos/include/xdk/zwfuncs.h b/reactos/include/xdk/zwfuncs.h index 8fa911e6289..596fb399155 100644 --- a/reactos/include/xdk/zwfuncs.h +++ b/reactos/include/xdk/zwfuncs.h @@ -12,631 +12,707 @@ $if (_WDMDDK_) $endif (_WDMDDK_) $if (_NTDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwAllocateLocallyUniqueId( - OUT PLUID Luid); + _Out_ PLUID Luid); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwTerminateProcess( - IN HANDLE ProcessHandle OPTIONAL, - IN NTSTATUS ExitStatus); + _In_opt_ HANDLE ProcessHandle, + _In_ NTSTATUS ExitStatus); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenProcess( - OUT PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN PCLIENT_ID ClientId OPTIONAL); + _Out_ PHANDLE ProcessHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PCLIENT_ID ClientId); $endif (_NTDDK_) $if (_NTIFS_) +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_ BOOLEAN ReturnSingleEntry, + _In_reads_bytes_opt_(EaListLength) PVOID EaList, + _In_ ULONG EaListLength, + _In_opt_ PULONG EaIndex, + _In_ BOOLEAN RestartScan); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetEaFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE ExistingTokenHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ BOOLEAN EffectiveOnly, + _In_ TOKEN_TYPE TokenType, + _Out_ PHANDLE NewTokenHandle); $endif (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WIN2K) $if (_WDMDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwClose( - IN HANDLE Handle); + _In_ HANDLE Handle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwCreateDirectoryObject( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE DirectoryHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwCreateFile( - 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 CreateDisposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG CreateDisposition, + _In_ ULONG CreateOptions, + _In_reads_bytes_opt_(EaLength) PVOID EaBuffer, + _In_ ULONG EaLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwCreateKey( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ULONG TitleIndex, - IN PUNICODE_STRING Class OPTIONAL, - IN ULONG CreateOptions, - OUT PULONG Disposition OPTIONAL); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Reserved_ ULONG TitleIndex, + _In_opt_ PUNICODE_STRING Class, + _In_ ULONG CreateOptions, + _Out_opt_ PULONG Disposition); +_IRQL_requires_max_(APC_LEVEL) 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); + _Out_ PHANDLE SectionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PLARGE_INTEGER MaximumSize, + _In_ ULONG SectionPageProtection, + _In_ ULONG AllocationAttributes, + _In_opt_ HANDLE FileHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwDeleteKey( - IN HANDLE KeyHandle); + _In_ HANDLE KeyHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwDeleteValueKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING ValueName); + _In_ HANDLE KeyHandle, + _In_ PUNICODE_STRING ValueName); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(Length == 0, _Post_satisfies_(return < 0)) +_When_(Length > 0, _Post_satisfies_(return <= 0)) NTSYSAPI NTSTATUS NTAPI ZwEnumerateKey( - IN HANDLE KeyHandle, - IN ULONG Index, - IN KEY_INFORMATION_CLASS KeyInformationClass, - OUT PVOID KeyInformation OPTIONAL, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE KeyHandle, + _In_ ULONG Index, + _In_ KEY_INFORMATION_CLASS KeyInformationClass, + _Out_writes_bytes_opt_(Length) PVOID KeyInformation, + _In_ ULONG Length, + _Out_ PULONG ResultLength); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(Length == 0, _Post_satisfies_(return < 0)) +_When_(Length > 0, _Post_satisfies_(return <= 0)) NTSYSAPI NTSTATUS NTAPI ZwEnumerateValueKey( - IN HANDLE KeyHandle, - IN ULONG Index, - IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, - OUT PVOID KeyValueInformation OPTIONAL, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE KeyHandle, + _In_ ULONG Index, + _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation, + _In_ ULONG Length, + _Out_ PULONG ResultLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwFlushKey( - IN HANDLE KeyHandle); + _In_ HANDLE KeyHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwLoadDriver( - IN PUNICODE_STRING DriverServiceName); + _In_ PUNICODE_STRING DriverServiceName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwMakeTemporaryObject( - IN HANDLE Handle); + _In_ HANDLE Handle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwMapViewOfSection( - IN HANDLE SectionHandle, - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN SIZE_T CommitSize, - IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, - IN OUT PSIZE_T ViewSize, - IN SECTION_INHERIT InheritDisposition, - IN ULONG AllocationType, - IN ULONG Protect); + _In_ HANDLE SectionHandle, + _In_ HANDLE ProcessHandle, + _Outptr_result_bytebuffer_(*ViewSize) PVOID *BaseAddress, + _In_ ULONG_PTR ZeroBits, + _In_ SIZE_T CommitSize, + _Inout_opt_ PLARGE_INTEGER SectionOffset, + _Inout_ PSIZE_T ViewSize, + _In_ SECTION_INHERIT InheritDisposition, + _In_ ULONG AllocationType, + _In_ ULONG Protect); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenFile( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG ShareAccess, - IN ULONG OpenOptions); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG ShareAccess, + _In_ ULONG OpenOptions); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenKey( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenSection( - OUT PHANDLE SectionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE SectionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenSymbolicLinkObject( - OUT PHANDLE LinkHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE LinkHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQueryInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(Length == 0, _Post_satisfies_(return < 0)) +_When_(Length > 0, _Post_satisfies_(return <= 0)) NTSYSAPI NTSTATUS NTAPI ZwQueryKey( - IN HANDLE KeyHandle, - IN KEY_INFORMATION_CLASS KeyInformationClass, - OUT PVOID KeyInformation OPTIONAL, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE KeyHandle, + _In_ KEY_INFORMATION_CLASS KeyInformationClass, + _Out_writes_bytes_opt_(Length) PVOID KeyInformation, + _In_ ULONG Length, + _Out_ PULONG ResultLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQuerySymbolicLinkObject( - IN HANDLE LinkHandle, - IN OUT PUNICODE_STRING LinkTarget, - OUT PULONG ReturnedLength OPTIONAL); + _In_ HANDLE LinkHandle, + _Inout_ PUNICODE_STRING LinkTarget, + _Out_opt_ PULONG ReturnedLength); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(Length == 0, _Post_satisfies_(return < 0)) +_When_(Length > 0, _Post_satisfies_(return <= 0)) NTSYSAPI NTSTATUS NTAPI ZwQueryValueKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING ValueName, - IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, - OUT PVOID KeyValueInformation OPTIONAL, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE KeyHandle, + _In_ PUNICODE_STRING ValueName, + _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation, + _In_ ULONG Length, + _Out_ PULONG ResultLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwReadFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_opt_ PLARGE_INTEGER ByteOffset, + _In_opt_ PULONG Key); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetValueKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING ValueName, - IN ULONG TitleIndex OPTIONAL, - IN ULONG Type, - IN PVOID Data OPTIONAL, - IN ULONG DataSize); + _In_ HANDLE KeyHandle, + _In_ PUNICODE_STRING ValueName, + _In_opt_ ULONG TitleIndex, + _In_ ULONG Type, + _In_reads_bytes_opt_(DataSize) PVOID Data, + _In_ ULONG DataSize); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwUnloadDriver( - IN PUNICODE_STRING DriverServiceName); + _In_ PUNICODE_STRING DriverServiceName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwUnmapViewOfSection( - IN HANDLE ProcessHandle, - IN PVOID BaseAddress OPTIONAL); + _In_ HANDLE ProcessHandle, + _In_opt_ PVOID BaseAddress); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwWriteFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_opt_ PLARGE_INTEGER ByteOffset, + _In_opt_ PULONG Key); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQueryFullAttributesFile( - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation); + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PFILE_NETWORK_OPEN_INFORMATION FileInformation); $endif (_WDMDDK_) $if (_NTDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI ZwCancelTimer( - IN HANDLE TimerHandle, - OUT PBOOLEAN CurrentState OPTIONAL); + _In_ HANDLE TimerHandle, + _Out_opt_ PBOOLEAN CurrentState); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(return == 0, __drv_allocatesMem(TimerObject)) NTSTATUS NTAPI ZwCreateTimer( - OUT PHANDLE TimerHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN TIMER_TYPE TimerType); + _Out_ PHANDLE TimerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ TIMER_TYPE TimerType); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI ZwOpenTimer( - OUT PHANDLE TimerHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE TimerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetInformationThread( - IN HANDLE ThreadHandle, - IN THREADINFOCLASS ThreadInformationClass, - IN PVOID ThreadInformation, - IN ULONG ThreadInformationLength); + _In_ HANDLE ThreadHandle, + _In_ THREADINFOCLASS ThreadInformationClass, + _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation, + _In_ ULONG ThreadInformationLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI ZwSetTimer( - IN HANDLE TimerHandle, - IN PLARGE_INTEGER DueTime, - IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL, - IN PVOID TimerContext OPTIONAL, - IN BOOLEAN ResumeTimer, - IN LONG Period OPTIONAL, - OUT PBOOLEAN PreviousState OPTIONAL); + _In_ HANDLE TimerHandle, + _In_ PLARGE_INTEGER DueTime, + _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine, + _In_opt_ PVOID TimerContext, + _In_ BOOLEAN ResumeTimer, + _In_opt_ LONG Period, + _Out_opt_ PBOOLEAN PreviousState); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwDisplayString( - IN PUNICODE_STRING String); + _In_ PUNICODE_STRING String); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwPowerInformation( - IN POWER_INFORMATION_LEVEL PowerInformationLevel, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); + _In_ POWER_INFORMATION_LEVEL PowerInformationLevel, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQueryVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FsInformation, + _In_ ULONG Length, + _In_ FS_INFORMATION_CLASS FsInformationClass); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG IoControlCode, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength); $endif (_NTDDK_) $if (_NTIFS_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQueryObject( - IN HANDLE Handle OPTIONAL, - IN OBJECT_INFORMATION_CLASS ObjectInformationClass, - OUT PVOID ObjectInformation OPTIONAL, - IN ULONG ObjectInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_opt_ HANDLE Handle, + _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass, + _Out_writes_bytes_opt_(ObjectInformationLength) PVOID ObjectInformation, + _In_ ULONG ObjectInformationLength, + _Out_opt_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE KeyHandle, + _In_opt_ HANDLE EventHandle, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG NotifyFilter, + _In_ BOOLEAN WatchSubtree, + _Out_writes_bytes_opt_(BufferLength) PVOID Buffer, + _In_ ULONG BufferLength, + _In_ BOOLEAN Asynchronous); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwCreateEvent( - OUT PHANDLE EventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN EVENT_TYPE EventType, - IN BOOLEAN InitialState); + _Out_ PHANDLE EventHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ EVENT_TYPE EventType, + _In_ BOOLEAN InitialState); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwDeleteFile( - IN POBJECT_ATTRIBUTES ObjectAttributes); + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass, + _In_ BOOLEAN ReturnSingleEntry, + _In_opt_ PUNICODE_STRING FileName, + _In_ BOOLEAN RestartScan); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID FsInformation, + _In_ ULONG Length, + _In_ FS_INFORMATION_CLASS FsInformationClass); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG FsControlCode, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE SourceProcessHandle, + _In_ HANDLE SourceHandle, + _In_opt_ HANDLE TargetProcessHandle, + _Out_opt_ PHANDLE TargetHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG HandleAttributes, + _In_ ULONG Options); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenDirectoryObject( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE DirectoryHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(return==0, __drv_allocatesMem(Region)) 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); + _In_ HANDLE ProcessHandle, + _Inout_ PVOID *BaseAddress, + _In_ ULONG_PTR ZeroBits, + _Inout_ PSIZE_T RegionSize, + _In_ ULONG AllocationType, + _In_ ULONG Protect); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(return==0, __drv_freesMem(Region)) NTSYSAPI NTSTATUS NTAPI ZwFreeVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - IN ULONG FreeType); + _In_ HANDLE ProcessHandle, + _Inout_ PVOID *BaseAddress, + _Inout_ PSIZE_T RegionSize, + _In_ ULONG FreeType); +_When_(Timeout == NULL, _IRQL_requires_max_(APC_LEVEL)) +_When_(Timeout->QuadPart != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_(Timeout->QuadPart == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) NTSYSAPI NTSTATUS NTAPI ZwWaitForSingleObject( - IN HANDLE Handle, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); + _In_ HANDLE Handle, + _In_ BOOLEAN Alertable, + _In_opt_ PLARGE_INTEGER Timeout); +_IRQL_requires_max_(DISPATCH_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetEvent( - IN HANDLE EventHandle, - OUT PLONG PreviousState OPTIONAL); + _In_ HANDLE EventHandle, + _Out_opt_ PLONG PreviousState); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwFlushVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ HANDLE ProcessHandle, + _Inout_ PVOID *BaseAddress, + _Inout_ PSIZE_T RegionSize, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQueryInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE TokenHandle, + _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, + _Out_writes_bytes_to_opt_(Length,*ResultLength) PVOID TokenInformation, + _In_ ULONG Length, + _Out_ PULONG ResultLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetSecurityObject( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ HANDLE Handle, + _In_ SECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQuerySecurityObject( - IN HANDLE FileHandle, - IN SECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE FileHandle, + _In_ SECURITY_INFORMATION SecurityInformation, + _Out_writes_bytes_to_(Length,*ResultLength) PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ ULONG Length, + _Out_ PULONG ResultLength); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ $if (_NTIFS_) #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenProcessTokenEx( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); + _In_ HANDLE ProcessHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG HandleAttributes, + _Out_ PHANDLE TokenHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenThreadTokenEx( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); + _In_ HANDLE ThreadHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ BOOLEAN OpenAsSelf, + _In_ ULONG HandleAttributes, + _Out_ PHANDLE TokenHandle); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ $endif (_NTIFS_) $if (_WDMDDK_) #if (NTDDI_VERSION >= NTDDI_WS03) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwOpenEvent( - OUT PHANDLE EventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE EventHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); #endif $endif (_WDMDDK_) @@ -645,312 +721,346 @@ $if (_WDMDDK_ || _NTIFS_) $endif (_WDMDDK_ || _NTIFS_) $if (_WDMDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS ZwCreateKeyTransacted( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ULONG TitleIndex, - IN PUNICODE_STRING Class OPTIONAL, - IN ULONG CreateOptions, - IN HANDLE TransactionHandle, - OUT PULONG Disposition OPTIONAL); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Reserved_ ULONG TitleIndex, + _In_opt_ PUNICODE_STRING Class, + _In_ ULONG CreateOptions, + _In_ HANDLE TransactionHandle, + _Out_opt_ PULONG Disposition); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenKeyTransacted( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN HANDLE TransactionHandle); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ HANDLE TransactionHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCreateTransactionManager( - 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); + _Out_ PHANDLE TmHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PUNICODE_STRING LogFileName, + _In_opt_ ULONG CreateOptions, + _In_opt_ ULONG CommitStrength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwOpenTransactionManager( - 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); + _Out_ PHANDLE TmHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PUNICODE_STRING LogFileName, + _In_opt_ LPGUID TmIdentity, + _In_opt_ ULONG OpenOptions); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRollforwardTransactionManager( - IN HANDLE TransactionManagerHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE TransactionManagerHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRecoverTransactionManager( - IN HANDLE TransactionManagerHandle); + _In_ HANDLE TransactionManagerHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwQueryInformationTransactionManager( - IN HANDLE TransactionManagerHandle, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - OUT PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_ HANDLE TransactionManagerHandle, + _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation, + _In_ ULONG TransactionManagerInformationLength, + _Out_opt_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwSetInformationTransactionManager( - IN HANDLE TmHandle, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - IN PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength); + _In_ HANDLE TmHandle, + _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + _In_ PVOID TransactionManagerInformation, + _In_ ULONG TransactionManagerInformationLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwEnumerateTransactionObject( - IN HANDLE RootObjectHandle OPTIONAL, - IN KTMOBJECT_TYPE QueryType, - IN OUT PKTMOBJECT_CURSOR ObjectCursor, - IN ULONG ObjectCursorLength, - OUT PULONG ReturnLength); + _In_opt_ HANDLE RootObjectHandle, + _In_ KTMOBJECT_TYPE QueryType, + _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor, + _In_ ULONG ObjectCursorLength, + _Out_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCreateTransaction( - 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); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ LPGUID Uow, + _In_opt_ HANDLE TmHandle, + _In_opt_ ULONG CreateOptions, + _In_opt_ ULONG IsolationLevel, + _In_opt_ ULONG IsolationFlags, + _In_opt_ PLARGE_INTEGER Timeout, + _In_opt_ PUNICODE_STRING Description); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwOpenTransaction( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN LPGUID Uow, - IN HANDLE TmHandle OPTIONAL); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ LPGUID Uow, + _In_opt_ HANDLE TmHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwQueryInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - OUT PVOID TransactionInformation, - IN ULONG TransactionInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_ HANDLE TransactionHandle, + _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation, + _In_ ULONG TransactionInformationLength, + _Out_opt_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwSetInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - IN PVOID TransactionInformation, - IN ULONG TransactionInformationLength); + _In_ HANDLE TransactionHandle, + _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + _In_ PVOID TransactionInformation, + _In_ ULONG TransactionInformationLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCommitTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRollbackTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCreateResourceManager( - OUT PHANDLE ResourceManagerHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE TmHandle, - IN LPGUID ResourceManagerGuid OPTIONAL, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN PUNICODE_STRING Description OPTIONAL); + _Out_ PHANDLE ResourceManagerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE TmHandle, + _In_opt_ LPGUID ResourceManagerGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ ULONG CreateOptions, + _In_opt_ PUNICODE_STRING Description); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwOpenResourceManager( - OUT PHANDLE ResourceManagerHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE TmHandle, - IN LPGUID ResourceManagerGuid, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + _Out_ PHANDLE ResourceManagerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE TmHandle, + _In_ LPGUID ResourceManagerGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRecoverResourceManager( - IN HANDLE ResourceManagerHandle); + _In_ HANDLE ResourceManagerHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwGetNotificationResourceManager( - IN HANDLE ResourceManagerHandle, - OUT PTRANSACTION_NOTIFICATION TransactionNotification, - IN ULONG NotificationLength, - IN PLARGE_INTEGER Timeout, - IN PULONG ReturnLength OPTIONAL, - IN ULONG Asynchronous, - IN ULONG_PTR AsynchronousContext OPTIONAL); + _In_ HANDLE ResourceManagerHandle, + _Out_ PTRANSACTION_NOTIFICATION TransactionNotification, + _In_ ULONG NotificationLength, + _In_ PLARGE_INTEGER Timeout, + _Out_opt_ PULONG ReturnLength, + _In_ ULONG Asynchronous, + _In_opt_ ULONG_PTR AsynchronousContext); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwQueryInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - OUT PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength, - IN PULONG ReturnLength OPTIONAL); + _In_ HANDLE ResourceManagerHandle, + _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation, + _In_ ULONG ResourceManagerInformationLength, + _Out_opt_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwSetInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - IN PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength); + _In_ HANDLE ResourceManagerHandle, + _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation, + _In_ ULONG ResourceManagerInformationLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCreateEnlistment( - 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); + _Out_ PHANDLE EnlistmentHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE ResourceManagerHandle, + _In_ HANDLE TransactionHandle, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ ULONG CreateOptions, + _In_ NOTIFICATION_MASK NotificationMask, + _In_opt_ PVOID EnlistmentKey); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwOpenEnlistment( - OUT PHANDLE EnlistmentHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE RmHandle, - IN LPGUID EnlistmentGuid, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + _Out_ PHANDLE EnlistmentHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE RmHandle, + _In_ LPGUID EnlistmentGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwQueryInformationEnlistment( - IN HANDLE EnlistmentHandle, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - OUT PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength, - IN PULONG ReturnLength OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation, + _In_ ULONG EnlistmentInformationLength, + _Out_opt_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwSetInformationEnlistment( - IN HANDLE EnlistmentHandle, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - IN PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength); + _In_ HANDLE EnlistmentHandle, + _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation, + _In_ ULONG EnlistmentInformationLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRecoverEnlistment( - IN HANDLE EnlistmentHandle, - IN PVOID EnlistmentKey OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PVOID EnlistmentKey); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwPrePrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwPrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCommitEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRollbackEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwPrePrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwPrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCommitComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwReadOnlyEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); NTSYSCALLAPI NTSTATUS @@ -963,65 +1073,70 @@ NTSYSCALLAPI NTSTATUS NTAPI ZwSinglePhaseReject( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); $endif (_WDMDDK_) $if (_NTIFS_) +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ PLARGE_INTEGER ByteOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key, + _In_ BOOLEAN FailImmediately, + _In_ BOOLEAN ExclusiveLock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwUnlockFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER ByteOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ PLARGE_INTEGER ByteOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_ BOOLEAN ReturnSingleEntry, + _In_reads_bytes_opt_(SidListLength) PVOID SidList, + _In_ ULONG SidListLength, + _In_opt_ PSID StartSid, + _In_ BOOLEAN RestartScan); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwFlushBuffersFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); $endif (_NTIFS_) $if (_WDMDDK_ || _NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -1029,24 +1144,26 @@ $endif (_WDMDDK_ || _NTIFS_) #if (NTDDI_VERSION >= NTDDI_WIN7) $if (_WDMDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenKeyEx( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ULONG OpenOptions); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ ULONG OpenOptions); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenKeyTransactedEx( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ULONG OpenOptions, - IN HANDLE TransactionHandle); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ ULONG OpenOptions, + _In_ HANDLE TransactionHandle); NTSYSAPI NTSTATUS @@ -1076,43 +1193,47 @@ ZwQueryMultipleValueKey( IN OUT PULONG BufferLength, OUT PULONG RequiredBufferLength OPTIONAL); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwRenameKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING NewName); + _In_ HANDLE KeyHandle, + _In_ PUNICODE_STRING NewName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetInformationKey( - IN HANDLE KeyHandle, - IN KEY_SET_INFORMATION_CLASS KeySetInformationClass, - IN PVOID KeySetInformation, - IN ULONG KeySetInformationLength); + _In_ HANDLE KeyHandle, + _In_ __drv_strictTypeMatch(__drv_typeConst) KEY_SET_INFORMATION_CLASS KeySetInformationClass, + _In_reads_bytes_(KeySetInformationLength) PVOID KeySetInformation, + _In_ ULONG KeySetInformationLength); $endif (_WDMDDK_) $if (_NTDDK_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI ZwSetTimerEx( - IN HANDLE TimerHandle, - IN TIMER_SET_INFORMATION_CLASS TimerSetInformationClass, - IN OUT PVOID TimerSetInformation, - IN ULONG TimerSetInformationLength); + _In_ HANDLE TimerHandle, + _In_ TIMER_SET_INFORMATION_CLASS TimerSetInformationClass, + _Inout_updates_bytes_opt_(TimerSetInformationLength) PVOID TimerSetInformation, + _In_ ULONG TimerSetInformationLength); $endif (_NTDDK_) $if (_NTIFS_) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - IN PVOID TokenInformation, - IN ULONG TokenInformationLength); + _In_ HANDLE TokenHandle, + _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, + _In_reads_bytes_(TokenInformationLength) PVOID TokenInformation, + _In_ ULONG TokenInformationLength); $endif (_NTIFS_) #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ From e313bf569b732669e8a46359046cee76f6ff38e9 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 22 Jan 2012 14:47:46 +0000 Subject: [PATCH 025/289] [PSDK] * Add __out_data_source annotation. svn path=/trunk/; revision=55068 --- reactos/include/psdk/specstrings.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/reactos/include/psdk/specstrings.h b/reactos/include/psdk/specstrings.h index 462b7858d0e..a8207257743 100644 --- a/reactos/include/psdk/specstrings.h +++ b/reactos/include/psdk/specstrings.h @@ -48,3 +48,13 @@ #define __analysis_noreturn #define __kernel_entry +#if (_MSC_VER >= 1000) && !defined(__midl) && defined(_PREFAST_) + +#define __inner_data_source(src_raw) _SA_annotes1(SAL_untrusted_data_source,src_raw) +#define __out_data_source(src_sym) _Post_ __inner_data_source(#src_sym) + +#else + +#define __out_data_source(src_sym) + +#endif From b8cd14e65a94d4c188f7c46ee4eec607a14682b9 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 22 Jan 2012 14:51:10 +0000 Subject: [PATCH 026/289] [DDK] * Update wdm.h, ntifs.h and ntddk.h to reflect the recent XDK changes. svn path=/trunk/; revision=55069 --- reactos/include/ddk/ntddk.h | 1959 +++++----- reactos/include/ddk/ntifs.h | 4413 ++++++++++++---------- reactos/include/ddk/wdm.h | 7044 ++++++++++++++++++++--------------- 3 files changed, 7655 insertions(+), 5761 deletions(-) diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 22067536dcc..74d2987aa78 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/include/ddk/ntddk.h @@ -211,17 +211,17 @@ typedef enum _CONFIGURATION_TYPE { 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); + _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 enum _IO_QUERY_DEVICE_DATA_FORMAT { IoQueryDeviceIdentifier = 0, @@ -232,9 +232,9 @@ typedef enum _IO_QUERY_DEVICE_DATA_FORMAT { typedef VOID (NTAPI *PDRIVER_REINITIALIZE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN PVOID Context OPTIONAL, - IN ULONG Count); + _In_ struct _DRIVER_OBJECT *DriverObject, + _In_opt_ PVOID Context, + _In_ ULONG Count); typedef struct _CONTROLLER_OBJECT { CSHORT Type; @@ -303,10 +303,15 @@ typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD { UCHAR CapabilityID; } AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD; +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGET_LOCATION_STRING)( - IN OUT PVOID Context OPTIONAL, - OUT PWCHAR *LocationStrings); + _Inout_opt_ PVOID Context, + _Outptr_ + _At_(*LocationStrings, + _When_(return == 0, __drv_allocatesMem(Mem))) + PZZWSTR *LocationStrings); typedef struct _PNP_LOCATION_INTERFACE { USHORT Size; @@ -337,38 +342,38 @@ typedef struct _ARBITER_CONFLICT_INFO { } ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO; typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS { - IN OUT PLIST_ENTRY ArbitrationList; - IN ULONG AllocateFromCount; - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; + _Inout_ 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 { - IN OUT PLIST_ENTRY ArbitrationList; - IN ULONG AllocateFromCount; - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom; + _Inout_ 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 { - IN OUT PLIST_ENTRY ArbitrationList; + _Inout_ PLIST_ENTRY ArbitrationList; } ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS; typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS { - OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources; + _Out_ PCM_PARTIAL_RESOURCE_LIST *AllocatedResources; } ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS; typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS { - IN PDEVICE_OBJECT PhysicalDeviceObject; - IN PIO_RESOURCE_DESCRIPTOR ConflictingResource; - OUT PULONG ConflictCount; - OUT PARBITER_CONFLICT_INFO *Conflicts; + _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 { - IN PLIST_ENTRY ArbitrationList; + _In_ PLIST_ENTRY ArbitrationList; } ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS; typedef struct _ARBITER_ADD_RESERVED_PARAMETERS { - IN PDEVICE_OBJECT ReserveDevice; + _In_ PDEVICE_OBJECT ReserveDevice; } ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS; typedef struct _ARBITER_PARAMETERS { @@ -419,9 +424,9 @@ typedef struct _ARBITER_LIST_ENTRY { typedef NTSTATUS (NTAPI *PARBITER_HANDLER)( - IN OUT PVOID Context, - IN ARBITER_ACTION Action, - IN OUT PARBITER_PARAMETERS Parameters); + _Inout_opt_ PVOID Context, + _In_ ARBITER_ACTION Action, + _Inout_ PARBITER_PARAMETERS Parameters); #define ARBITER_PARTIAL 0x00000001 @@ -442,21 +447,21 @@ typedef enum _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); + _Inout_opt_ PVOID Context, + _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Source, + _In_ RESOURCE_TRANSLATION_DIRECTION Direction, + _In_opt_ ULONG AlternativesCount, + _In_reads_opt_(AlternativesCount) 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); + _Inout_opt_ PVOID Context, + _In_ PIO_RESOURCE_DESCRIPTOR Source, + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _Out_ PULONG TargetCount, + _Out_writes_(*TargetCount) PIO_RESOURCE_DESCRIPTOR *Target); typedef struct _TRANSLATOR_INTERFACE { USHORT Size; @@ -1025,26 +1030,26 @@ typedef struct _PHYSICAL_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); + _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); + _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); + _In_ struct _BUS_HANDLER *BusHandler, + _In_ PCI_SLOT_NUMBER Slot, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Offset, + _In_ ULONG Length); #define PCI_DATA_TAG ' ICP' #define PCI_DATA_VERSION 1 @@ -1065,33 +1070,33 @@ typedef struct _PCIBUSDATA { 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); + _In_ PVOID Context, + _In_ ULONG BusOffset, + _In_ ULONG Slot, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Offset, + _In_ ULONG Length); typedef VOID (NTAPI *PCI_PIN_TO_LINE)( - IN PVOID Context, - IN PPCI_COMMON_CONFIG PciData); + _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); + _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); + _In_ PVOID Context, + _Out_ PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability); typedef VOID (NTAPI *PCI_EXPRESS_WAKE_CONTROL)( - IN PVOID Context, - IN BOOLEAN EnableWake); + _In_ PVOID Context, + _In_ BOOLEAN EnableWake); typedef struct _PCI_BUS_INTERFACE_STANDARD { USHORT Size; @@ -1353,17 +1358,17 @@ typedef struct _PCI_PME_INTERFACE { typedef BOOLEAN (NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)( - IN ULONG Columns, - IN ULONG Rows); + _In_ ULONG Columns, + _In_ ULONG Rows); typedef PBUS_HANDLER (FASTCALL *pHalHandlerForBus)( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber); + _In_ INTERFACE_TYPE InterfaceType, + _In_ ULONG BusNumber); typedef VOID (FASTCALL *pHalReferenceBusHandler)( - IN PBUS_HANDLER BusHandler); + _In_ PBUS_HANDLER BusHandler); typedef enum _HAL_QUERY_INFORMATION_CLASS { HalInstalledBusInformation, @@ -1413,56 +1418,55 @@ typedef enum _HAL_SET_INFORMATION_CLASS { typedef NTSTATUS (NTAPI *pHalQuerySystemInformation)( - IN HAL_QUERY_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN OUT PVOID Buffer, - OUT PULONG ReturnedLength); + _In_ HAL_QUERY_INFORMATION_CLASS InformationClass, + _In_ ULONG BufferSize, + _Inout_updates_bytes_to_(BufferSize, *ReturnedLength) PVOID Buffer, + _Out_ PULONG ReturnedLength); typedef NTSTATUS (NTAPI *pHalSetSystemInformation)( - IN HAL_SET_INFORMATION_CLASS InformationClass, - IN ULONG BufferSize, - IN PVOID Buffer); + _In_ HAL_SET_INFORMATION_CLASS InformationClass, + _In_ ULONG BufferSize, + _In_ PVOID Buffer); typedef VOID (FASTCALL *pHalExamineMBR)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG MBRTypeIdentifier, - OUT PVOID *Buffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG MBRTypeIdentifier, + _Out_ PVOID *Buffer); typedef NTSTATUS (FASTCALL *pHalIoReadPartitionTable)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ BOOLEAN ReturnRecognizedPartitions, + _Out_ struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); typedef NTSTATUS (FASTCALL *pHalIoSetPartitionInformation)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG PartitionNumber, + _In_ ULONG PartitionType); typedef NTSTATUS (FASTCALL *pHalIoWritePartitionTable)( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG SectorsPerTrack, + _In_ ULONG NumberOfHeads, + _In_ struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); typedef NTSTATUS (NTAPI *pHalQueryBusSlots)( - IN PBUS_HANDLER BusHandler, - IN ULONG BufferSize, - OUT PULONG SlotNumbers, - OUT PULONG ReturnedLength); + _In_ PBUS_HANDLER BusHandler, + _In_ ULONG BufferSize, + _Out_ PULONG SlotNumbers, + _Out_ PULONG ReturnedLength); typedef NTSTATUS -(NTAPI *pHalInitPnpDriver)( - VOID); +(NTAPI *pHalInitPnpDriver)(VOID); typedef struct _PM_DISPATCH_TABLE { ULONG Signature; @@ -1472,69 +1476,66 @@ typedef struct _PM_DISPATCH_TABLE { typedef NTSTATUS (NTAPI *pHalInitPowerManagement)( - IN PPM_DISPATCH_TABLE PmDriverDispatchTable, - OUT PPM_DISPATCH_TABLE *PmHalDispatchTable); + _In_ PPM_DISPATCH_TABLE PmDriverDispatchTable, + _Out_ PPM_DISPATCH_TABLE *PmHalDispatchTable); typedef struct _DMA_ADAPTER* (NTAPI *pHalGetDmaAdapter)( - IN PVOID Context, - IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, - OUT PULONG NumberOfMapRegisters); + _In_ PVOID Context, + _In_ struct _DEVICE_DESCRIPTION *DeviceDescriptor, + _Out_ PULONG NumberOfMapRegisters); typedef NTSTATUS (NTAPI *pHalGetInterruptTranslator)( - IN INTERFACE_TYPE ParentInterfaceType, - IN ULONG ParentBusNumber, - IN INTERFACE_TYPE BridgeInterfaceType, - IN USHORT Size, - IN USHORT Version, - OUT PTRANSLATOR_INTERFACE Translator, - OUT PULONG BridgeBusNumber); + _In_ INTERFACE_TYPE ParentInterfaceType, + _In_ ULONG ParentBusNumber, + _In_ INTERFACE_TYPE BridgeInterfaceType, + _In_ USHORT Size, + _In_ USHORT Version, + _Out_ PTRANSLATOR_INTERFACE Translator, + _Out_ PULONG BridgeBusNumber); typedef NTSTATUS -(NTAPI *pHalStartMirroring)( - VOID); +(NTAPI *pHalStartMirroring)(VOID); typedef NTSTATUS (NTAPI *pHalEndMirroring)( - IN ULONG PassNumber); + _In_ ULONG PassNumber); typedef NTSTATUS (NTAPI *pHalMirrorPhysicalMemory)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN LARGE_INTEGER NumberOfBytes); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ LARGE_INTEGER NumberOfBytes); typedef NTSTATUS (NTAPI *pHalMirrorVerify)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN LARGE_INTEGER NumberOfBytes); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ LARGE_INTEGER NumberOfBytes); typedef BOOLEAN (NTAPI *pHalTranslateBusAddress)( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); + _In_ INTERFACE_TYPE InterfaceType, + _In_ ULONG BusNumber, + _In_ PHYSICAL_ADDRESS BusAddress, + _Inout_ PULONG AddressSpace, + _Out_ PPHYSICAL_ADDRESS TranslatedAddress); typedef NTSTATUS (NTAPI *pHalAssignSlotResources)( - IN PUNICODE_STRING RegistryPath, - IN PUNICODE_STRING DriverClassName OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT DeviceObject, - IN INTERFACE_TYPE BusType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN OUT PCM_RESOURCE_LIST *AllocatedResources); + _In_ PUNICODE_STRING RegistryPath, + _In_opt_ PUNICODE_STRING DriverClassName, + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ INTERFACE_TYPE BusType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _Inout_ PCM_RESOURCE_LIST *AllocatedResources); typedef VOID -(NTAPI *pHalHaltSystem)( - VOID); +(NTAPI *pHalHaltSystem)(VOID); typedef BOOLEAN -(NTAPI *pHalResetDisplay)( - VOID); +(NTAPI *pHalResetDisplay)(VOID); typedef struct _MAP_REGISTER_ENTRY { PVOID MapRegister; @@ -1547,49 +1548,47 @@ typedef UCHAR typedef BOOLEAN (NTAPI *pHalFindBusAddressTranslation)( - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress, - IN OUT PULONG_PTR Context, - IN BOOLEAN NextBus); + _In_ PHYSICAL_ADDRESS BusAddress, + _Inout_ PULONG AddressSpace, + _Out_ PPHYSICAL_ADDRESS TranslatedAddress, + _Inout_ PULONG_PTR Context, + _In_ BOOLEAN NextBus); typedef VOID -(NTAPI *pHalEndOfBoot)( - VOID); +(NTAPI *pHalEndOfBoot)(VOID); typedef PVOID (NTAPI *pHalGetAcpiTable)( - IN ULONG Signature, - IN PCSTR OemId OPTIONAL, - IN PCSTR OemTableId OPTIONAL); + _In_ ULONG Signature, + _In_opt_ PCSTR OemId, + _In_opt_ PCSTR OemTableId); #if defined(_IA64_) typedef NTSTATUS (*pHalGetErrorCapList)( - IN OUT PULONG CapsListLength, - IN OUT PUCHAR ErrorCapList); + _Inout_ PULONG CapsListLength, + _Inout_updates_bytes_(*CapsListLength) PUCHAR ErrorCapList); typedef NTSTATUS (*pHalInjectError)( - IN ULONG BufferLength, - IN PUCHAR Buffer); + _In_ ULONG BufferLength, + _In_reads_bytes_(BufferLength) PUCHAR Buffer); #endif typedef VOID -(NTAPI *PCI_ERROR_HANDLER_CALLBACK)( - VOID); +(NTAPI *PCI_ERROR_HANDLER_CALLBACK)(VOID); typedef VOID (NTAPI *pHalSetPciErrorHandlerCallback)( - IN PCI_ERROR_HANDLER_CALLBACK Callback); + _In_ PCI_ERROR_HANDLER_CALLBACK Callback); #if 1 /* Not present in WDK 7600 */ typedef VOID (FASTCALL *pHalIoAssignDriveLetters)( - IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN PSTRING NtDeviceName, - OUT PUCHAR NtSystemPath, - OUT PSTRING NtSystemPathString); + _In_ struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + _In_ PSTRING NtDeviceName, + _Out_ PUCHAR NtSystemPath, + _Out_ PSTRING NtSystemPathString); #endif typedef struct { @@ -1717,10 +1716,10 @@ typedef struct _HAL_PROCESSOR_FEATURE { typedef NTSTATUS (NTAPI *PHALIOREADWRITEHANDLER)( - IN BOOLEAN fRead, - IN ULONG dwAddr, - IN ULONG dwSize, - IN OUT PULONG pdwData); + _In_ BOOLEAN fRead, + _In_ ULONG dwAddr, + _In_ ULONG dwSize, + _Inout_ PULONG pdwData); typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST { ULONG BadAddrBegin; @@ -1732,17 +1731,15 @@ typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST { #if defined(_X86_) || defined(_IA64_) || defined(_AMD64_) typedef VOID -(NTAPI *PHALMCAINTERFACELOCK)( - VOID); +(NTAPI *PHALMCAINTERFACELOCK)(VOID); typedef VOID -(NTAPI *PHALMCAINTERFACEUNLOCK)( - VOID); +(NTAPI *PHALMCAINTERFACEUNLOCK)(VOID); typedef NTSTATUS (NTAPI *PHALMCAINTERFACEREADREGISTER)( - IN UCHAR BankNumber, - IN OUT PVOID Exception); + _In_ UCHAR BankNumber, + _Inout_ PVOID Exception); typedef struct _HAL_MCA_INTERFACE { PHALMCAINTERFACELOCK Lock; @@ -1764,10 +1761,10 @@ 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); + _In_ PVOID Context, + _In_ struct _KTRAP_FRAME *TrapFrame, + _In_ struct _KEXCEPTION_FRAME *ExceptionFrame, + _In_ PMCA_EXCEPTION Exception); #endif @@ -1779,8 +1776,8 @@ ERROR_SEVERITY VOID #endif (NTAPI *PDRIVER_EXCPTN_CALLBACK)( - IN PVOID Context, - IN PMCA_EXCEPTION BankLog); + _In_ PVOID Context, + _In_ PMCA_EXCEPTION BankLog); #endif typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK; @@ -1835,13 +1832,13 @@ typedef struct _HAL_ERROR_INFO { typedef VOID (NTAPI *PDRIVER_CMC_EXCEPTION_CALLBACK)( - IN PVOID Context, - IN PCMC_EXCEPTION CmcLog); + _In_ PVOID Context, + _In_ PCMC_EXCEPTION CmcLog); typedef VOID (NTAPI *PDRIVER_CPE_EXCEPTION_CALLBACK)( - IN PVOID Context, - IN PCPE_EXCEPTION CmcLog); + _In_ PVOID Context, + _In_ PCPE_EXCEPTION CmcLog); typedef struct _CMC_DRIVER_INFO { PDRIVER_CMC_EXCEPTION_CALLBACK ExceptionCallback; @@ -1861,20 +1858,20 @@ typedef struct _CPE_DRIVER_INFO { typedef NTSTATUS (*HALSENDCROSSPARTITIONIPI)( - IN USHORT ProcessorID, - IN UCHAR HardwareVector); + _In_ USHORT ProcessorID, + _In_ UCHAR HardwareVector); typedef NTSTATUS (*HALRESERVECROSSPARTITIONINTERRUPTVECTOR)( - OUT PULONG Vector, - OUT PKIRQL Irql, - IN OUT PGROUP_AFFINITY Affinity, - OUT PUCHAR HardwareVector); + _Out_ PULONG Vector, + _Out_ PKIRQL Irql, + _Inout_ PGROUP_AFFINITY Affinity, + _Out_ PUCHAR HardwareVector); typedef VOID (*HALFREECROSSPARTITIONINTERRUPTVECTOR)( - IN ULONG Vector, - IN PGROUP_AFFINITY Affinity); + _In_ ULONG Vector, + _In_ PGROUP_AFFINITY Affinity); typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE { HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi; @@ -1903,20 +1900,22 @@ typedef struct _HAL_PLATFORM_INFORMATION { ******************************************************************************/ #define NX_SUPPORT_POLICY_ALWAYSOFF 0 -#define NX_SUPPORT_POLICY_ALWAYSON 1 -#define NX_SUPPORT_POLICY_OPTIN 2 -#define NX_SUPPORT_POLICY_OPTOUT 3 +#define NX_SUPPORT_POLICY_ALWAYSON 1 +#define NX_SUPPORT_POLICY_OPTIN 2 +#define NX_SUPPORT_POLICY_OPTOUT 3 +_IRQL_requires_same_ +_Function_class_(EXPAND_STACK_CALLOUT) typedef VOID (NTAPI EXPAND_STACK_CALLOUT)( - IN PVOID Parameter OPTIONAL); + _In_opt_ PVOID Parameter); typedef EXPAND_STACK_CALLOUT *PEXPAND_STACK_CALLOUT; typedef VOID (NTAPI *PTIMER_APC_ROUTINE)( - IN PVOID TimerContext, - IN ULONG TimerLowValue, - IN LONG TimerHighValue); + _In_ PVOID TimerContext, + _In_ ULONG TimerLowValue, + _In_ LONG TimerHighValue); typedef enum _TIMER_SET_INFORMATION_CLASS { TimerSetCoalescableTimer, @@ -1925,13 +1924,13 @@ typedef enum _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; + _In_ LARGE_INTEGER DueTime; + _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine; + _In_opt_ PVOID TimerContext; + _In_opt_ struct _COUNTED_REASON_CONTEXT *WakeContext; + _In_opt_ ULONG Period; + _In_ ULONG TolerableDelay; + _Out_opt_ PBOOLEAN PreviousState; } TIMER_SET_COALESCABLE_TIMER_INFO, *PTIMER_SET_COALESCABLE_TIMER_INFO; #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -2120,61 +2119,60 @@ typedef struct _DEBUG_DEVICE_DESCRIPTOR { typedef NTSTATUS (NTAPI *pKdSetupPciDeviceForDebugging)( - IN PVOID LoaderBlock OPTIONAL, - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); + _In_opt_ PVOID LoaderBlock, + _Inout_ PDEBUG_DEVICE_DESCRIPTOR PciDevice); typedef NTSTATUS (NTAPI *pKdReleasePciDeviceForDebugging)( - IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice); + _Inout_ PDEBUG_DEVICE_DESCRIPTOR PciDevice); typedef PVOID (NTAPI *pKdGetAcpiTablePhase0)( - IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, - IN ULONG Signature); + _In_ struct _LOADER_PARAMETER_BLOCK *LoaderBlock, + _In_ ULONG Signature); typedef VOID -(NTAPI *pKdCheckPowerButton)( - VOID); +(NTAPI *pKdCheckPowerButton)(VOID); #if (NTDDI_VERSION >= NTDDI_VISTA) typedef PVOID (NTAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages, - IN BOOLEAN FlushCurrentTLB); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ ULONG NumberPages, + _In_ BOOLEAN FlushCurrentTLB); typedef VOID (NTAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages, - IN BOOLEAN FlushCurrentTLB); + _In_ PVOID VirtualAddress, + _In_ ULONG NumberPages, + _In_ BOOLEAN FlushCurrentTLB); #else typedef PVOID (NTAPI *pKdMapPhysicalMemory64)( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG NumberPages); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ ULONG NumberPages); typedef VOID (NTAPI *pKdUnmapVirtualAddress)( - IN PVOID VirtualAddress, - IN ULONG NumberPages); + _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); + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _Out_writes_bytes_(Length) 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); + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Offset, + _In_ ULONG Length); /****************************************************************************** * Memory manager Types * ******************************************************************************/ @@ -2186,9 +2184,9 @@ typedef struct _PHYSICAL_MEMORY_RANGE { typedef NTSTATUS (NTAPI *PMM_ROTATE_COPY_CALLBACK_FUNCTION)( - IN PMDL DestinationMdl, - IN PMDL SourceMdl, - IN PVOID Context); + _In_ PMDL DestinationMdl, + _In_ PMDL SourceMdl, + _In_ PVOID Context); typedef enum _MM_ROTATE_DIRECTION { MmToFrameBuffer, @@ -2314,44 +2312,44 @@ typedef struct _PROCESS_ACCESS_TOKEN { #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; + _In_ HANDLE ExceptionPortHandle; + _Inout_ ULONG StateFlags; } PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT; typedef VOID (NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)( - IN HANDLE ParentId, - IN HANDLE ProcessId, - IN BOOLEAN Create); + _In_ HANDLE ParentId, + _In_ HANDLE ProcessId, + _In_ BOOLEAN Create); typedef struct _PS_CREATE_NOTIFY_INFO { - IN SIZE_T Size; + _In_ SIZE_T Size; _ANONYMOUS_UNION union { - IN ULONG Flags; + _In_ ULONG Flags; _ANONYMOUS_STRUCT struct { - IN ULONG FileOpenNameAvailable:1; - IN ULONG Reserved:31; + _In_ ULONG FileOpenNameAvailable:1; + _In_ ULONG Reserved:31; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; - 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; + _In_ HANDLE ParentProcessId; + _In_ CLIENT_ID CreatingThreadId; + _Inout_ struct _FILE_OBJECT *FileObject; + _In_ PCUNICODE_STRING ImageFileName; + _In_opt_ PCUNICODE_STRING CommandLine; + _Inout_ 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); + _Inout_ PEPROCESS Process, + _In_ HANDLE ProcessId, + _Inout_opt_ PPS_CREATE_NOTIFY_INFO CreateInfo); typedef VOID (NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)( - IN HANDLE ProcessId, - IN HANDLE ThreadId, - IN BOOLEAN Create); + _In_ HANDLE ProcessId, + _In_ HANDLE ThreadId, + _In_ BOOLEAN Create); #define IMAGE_ADDRESSING_MODE_32BIT 3 @@ -2380,9 +2378,9 @@ typedef struct _IMAGE_INFO_EX { typedef VOID (NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)( - IN PUNICODE_STRING FullImageName, - IN HANDLE ProcessId, - IN PIMAGE_INFO ImageInfo); + _In_ PUNICODE_STRING FullImageName, + _In_ HANDLE ProcessId, + _In_ PIMAGE_INFO ImageInfo); #define THREAD_CSWITCH_PMU_DISABLE FALSE #define THREAD_CSWITCH_PMU_ENABLE TRUE @@ -2666,11 +2664,13 @@ typedef union _RTL_RUN_ONCE { PVOID Ptr; } RTL_RUN_ONCE, *PRTL_RUN_ONCE; +_Function_class_(RTL_RUN_ONCE_INIT_FN) +_IRQL_requires_same_ 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); + _Inout_ PRTL_RUN_ONCE RunOnce, + _Inout_opt_ PVOID Parameter, + _Inout_opt_ PVOID *Context); #endif /* _RTL_RUN_ONCE_DEF */ @@ -2690,30 +2690,39 @@ typedef enum _RTL_GENERIC_COMPARE_RESULTS { // Forwarder struct _RTL_AVL_TABLE; +_IRQL_requires_same_ +_Function_class_(RTL_AVL_COMPARE_ROUTINE) typedef RTL_GENERIC_COMPARE_RESULTS (NTAPI RTL_AVL_COMPARE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID FirstStruct, - IN PVOID SecondStruct); + _In_ struct _RTL_AVL_TABLE *Table, + _In_ PVOID FirstStruct, + _In_ PVOID SecondStruct); typedef RTL_AVL_COMPARE_ROUTINE *PRTL_AVL_COMPARE_ROUTINE; +_IRQL_requires_same_ +_Function_class_(RTL_AVL_ALLOCATE_ROUTINE) +__drv_allocatesMem(Mem) typedef PVOID (NTAPI RTL_AVL_ALLOCATE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN CLONG ByteSize); + _In_ struct _RTL_AVL_TABLE *Table, + _In_ CLONG ByteSize); typedef RTL_AVL_ALLOCATE_ROUTINE *PRTL_AVL_ALLOCATE_ROUTINE; +_IRQL_requires_same_ +_Function_class_(RTL_AVL_FREE_ROUTINE) typedef VOID (NTAPI RTL_AVL_FREE_ROUTINE) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID Buffer); + _In_ struct _RTL_AVL_TABLE *Table, + _In_ __drv_freesMem(Mem) _Post_invalid_ PVOID Buffer); typedef RTL_AVL_FREE_ROUTINE *PRTL_AVL_FREE_ROUTINE; +_IRQL_requires_same_ +_Function_class_(RTL_AVL_MATCH_FUNCTION) typedef NTSTATUS (NTAPI RTL_AVL_MATCH_FUNCTION) ( - IN struct _RTL_AVL_TABLE *Table, - IN PVOID UserData, - IN PVOID MatchData); + _In_ struct _RTL_AVL_TABLE *Table, + _In_ PVOID UserData, + _In_ PVOID MatchData); typedef RTL_AVL_MATCH_FUNCTION *PRTL_AVL_MATCH_FUNCTION; typedef struct _RTL_BALANCED_LINKS { @@ -2748,23 +2757,30 @@ typedef struct _RTL_SPLAY_LINKS { struct _RTL_GENERIC_TABLE; +_IRQL_requires_same_ +_Function_class_(RTL_GENERIC_COMPARE_ROUTINE) typedef RTL_GENERIC_COMPARE_RESULTS (NTAPI RTL_GENERIC_COMPARE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN PVOID FirstStruct, - IN PVOID SecondStruct); + _In_ struct _RTL_GENERIC_TABLE *Table, + _In_ PVOID FirstStruct, + _In_ PVOID SecondStruct); typedef RTL_GENERIC_COMPARE_ROUTINE *PRTL_GENERIC_COMPARE_ROUTINE; +_IRQL_requires_same_ +_Function_class_(RTL_GENERIC_ALLOCATE_ROUTINE) +__drv_allocatesMem(Mem) typedef PVOID (NTAPI RTL_GENERIC_ALLOCATE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN CLONG ByteSize); + _In_ struct _RTL_GENERIC_TABLE *Table, + _In_ CLONG ByteSize); typedef RTL_GENERIC_ALLOCATE_ROUTINE *PRTL_GENERIC_ALLOCATE_ROUTINE; +_IRQL_requires_same_ +_Function_class_(RTL_GENERIC_FREE_ROUTINE) typedef VOID (NTAPI RTL_GENERIC_FREE_ROUTINE) ( - IN struct _RTL_GENERIC_TABLE *Table, - IN PVOID Buffer); + _In_ struct _RTL_GENERIC_TABLE *Table, + _In_ __drv_freesMem(Mem) _Post_invalid_ PVOID Buffer); typedef RTL_GENERIC_FREE_ROUTINE *PRTL_GENERIC_FREE_ROUTINE; typedef struct _RTL_GENERIC_TABLE { @@ -2803,6 +2819,8 @@ typedef struct _RTL_GENERIC_TABLE { #endif /* RTL_USE_AVL_TABLES */ +#define RTL_HASH_ALLOCATED_HEADER 0x00000001 + typedef struct _RTL_DYNAMIC_HASH_TABLE_ENTRY { LIST_ENTRY Linkage; ULONG_PTR Signature; @@ -3431,20 +3449,20 @@ NTKERNELAPI INTERLOCKED_RESULT FASTCALL Exfi386InterlockedIncrementLong( - IN OUT LONG volatile *Addend); + _Inout_ _Interlocked_operand_ LONG volatile *Addend); NTKERNELAPI INTERLOCKED_RESULT FASTCALL Exfi386InterlockedDecrementLong( - IN PLONG Addend); + _Inout_ _Interlocked_operand_ PLONG Addend); NTKERNELAPI ULONG FASTCALL Exfi386InterlockedExchangeUlong( - IN PULONG Target, - IN ULONG Value); + _Inout_ _Interlocked_operand_ PULONG Target, + _In_ ULONG Value); #endif @@ -3454,40 +3472,44 @@ NTKERNELAPI NTSTATUS NTAPI ExExtendZone( - IN OUT PZONE_HEADER Zone, - IN OUT PVOID Segment, - IN ULONG SegmentSize); + _Inout_ PZONE_HEADER Zone, + _Inout_ PVOID Segment, + _In_ ULONG SegmentSize); NTKERNELAPI NTSTATUS NTAPI ExInitializeZone( - OUT PZONE_HEADER Zone, - IN ULONG BlockSize, - IN OUT PVOID InitialSegment, - IN ULONG InitialSegmentSize); + _Out_ PZONE_HEADER Zone, + _In_ ULONG BlockSize, + _Inout_ PVOID InitialSegment, + _In_ ULONG InitialSegmentSize); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExInterlockedExtendZone( - IN OUT PZONE_HEADER Zone, - IN OUT PVOID Segment, - IN ULONG SegmentSize, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PZONE_HEADER Zone, + _Inout_ PVOID Segment, + _In_ ULONG SegmentSize, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExUuidCreate( - OUT UUID *Uuid); + _Out_ UUID *Uuid); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI DECLSPEC_NORETURN VOID NTAPI ExRaiseAccessViolation(VOID); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI DECLSPEC_NORETURN VOID @@ -3512,65 +3534,65 @@ NTHALAPI VOID NTAPI IoFreeAdapterChannel( - IN PADAPTER_OBJECT AdapterObject); + _In_ PADAPTER_OBJECT AdapterObject); //DECLSPEC_DEPRECATED_DDK NTHALAPI BOOLEAN NTAPI IoFlushAdapterBuffers( - IN PADAPTER_OBJECT AdapterObject, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN ULONG Length, - IN BOOLEAN WriteToDevice); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _In_ ULONG Length, + _In_ BOOLEAN WriteToDevice); //DECLSPEC_DEPRECATED_DDK NTHALAPI VOID NTAPI IoFreeMapRegisters( - IN PADAPTER_OBJECT AdapterObject, - IN PVOID MapRegisterBase, - IN ULONG NumberOfMapRegisters); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ PVOID MapRegisterBase, + _In_ ULONG NumberOfMapRegisters); //DECLSPEC_DEPRECATED_DDK NTHALAPI PVOID NTAPI HalAllocateCommonBuffer( - IN PADAPTER_OBJECT AdapterObject, - IN ULONG Length, - OUT PPHYSICAL_ADDRESS LogicalAddress, - IN BOOLEAN CacheEnabled); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ ULONG Length, + _Out_ PPHYSICAL_ADDRESS LogicalAddress, + _In_ BOOLEAN CacheEnabled); //DECLSPEC_DEPRECATED_DDK NTHALAPI VOID NTAPI HalFreeCommonBuffer( - IN PADAPTER_OBJECT AdapterObject, - IN ULONG Length, - IN PHYSICAL_ADDRESS LogicalAddress, - IN PVOID VirtualAddress, - IN BOOLEAN CacheEnabled); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ ULONG Length, + _In_ PHYSICAL_ADDRESS LogicalAddress, + _In_ PVOID VirtualAddress, + _In_ BOOLEAN CacheEnabled); //DECLSPEC_DEPRECATED_DDK NTHALAPI ULONG NTAPI HalReadDmaCounter( - IN PADAPTER_OBJECT AdapterObject); + _In_ PADAPTER_OBJECT AdapterObject); NTHALAPI NTSTATUS NTAPI HalAllocateAdapterChannel( - IN PADAPTER_OBJECT AdapterObject, - IN PWAIT_CONTEXT_BLOCK Wcb, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ PWAIT_CONTEXT_BLOCK Wcb, + _In_ ULONG NumberOfMapRegisters, + _In_ PDRIVER_CONTROL ExecutionRoutine); #endif /* USE_DMA_MACROS ... */ @@ -3579,140 +3601,143 @@ 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); + _In_ PUNICODE_STRING RegistryPath, + _In_opt_ PUNICODE_STRING DriverClassName, + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ INTERFACE_TYPE BusType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _Inout_ PCM_RESOURCE_LIST *AllocatedResources); +_IRQL_requires_max_(PASSIVE_LEVEL) NTHALAPI ULONG NTAPI HalGetInterruptVector( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN ULONG BusInterruptLevel, - IN ULONG BusInterruptVector, - OUT PKIRQL Irql, - OUT PKAFFINITY Affinity); + _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); + _In_ BUS_DATA_TYPE BusDataType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _In_reads_bytes_(Length) 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); + _In_ BUS_DATA_TYPE BusDataType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); NTHALAPI BOOLEAN NTAPI HalMakeBeep( - IN ULONG Frequency); + _In_ ULONG Frequency); #endif /* !defined(NO_LEGACY_DRIVERS) */ +_IRQL_requires_max_(PASSIVE_LEVEL) NTHALAPI PADAPTER_OBJECT NTAPI HalGetAdapter( - IN PDEVICE_DESCRIPTION DeviceDescription, - OUT PULONG NumberOfMapRegisters); + _In_ PDEVICE_DESCRIPTION DeviceDescription, + _Out_ PULONG NumberOfMapRegisters); VOID NTAPI HalPutDmaAdapter( - IN PADAPTER_OBJECT DmaAdapter); + _In_ PADAPTER_OBJECT DmaAdapter); NTHALAPI VOID NTAPI HalAcquireDisplayOwnership( - IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters); + _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); + _In_ BUS_DATA_TYPE BusDataType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _Out_writes_bytes_(Length) 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); + _In_ BUS_DATA_TYPE BusDataType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _In_reads_bytes_(Length) 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); + _In_ INTERFACE_TYPE InterfaceType, + _In_ ULONG BusNumber, + _In_ PHYSICAL_ADDRESS BusAddress, + _Inout_ PULONG AddressSpace, + _Out_ PPHYSICAL_ADDRESS TranslatedAddress); NTHALAPI PVOID NTAPI HalAllocateCrashDumpRegisters( - IN PADAPTER_OBJECT AdapterObject, - IN OUT PULONG NumberOfMapRegisters); + _In_ PADAPTER_OBJECT AdapterObject, + _Inout_ 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); + _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); + _In_ PADAPTER_OBJECT DmaAdapter, + _In_ PSCATTER_GATHER_LIST ScatterGather, + _In_ BOOLEAN WriteToDevice); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID FASTCALL HalExamineMBR( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG MBRTypeIdentifier, - OUT PVOID *Buffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG MBRTypeIdentifier, + _Out_ PVOID *Buffer); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_WIN7) @@ -3720,15 +3745,15 @@ HalExamineMBR( NTSTATUS NTAPI HalAllocateHardwareCounters( - IN PGROUP_AFFINITY GroupAffinty, - IN ULONG GroupCount, - IN PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList, - OUT PHANDLE CounterSetHandle); + _In_reads_(GroupCount) PGROUP_AFFINITY GroupAffinty, + _In_ ULONG GroupCount, + _In_ PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList, + _Out_ PHANDLE CounterSetHandle); NTSTATUS NTAPI HalFreeHardwareCounters( - IN HANDLE CounterSetHandle); + _In_ HANDLE CounterSetHandle); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -3754,8 +3779,8 @@ NTHALAPI VOID NTAPI HalBugCheckSystem( - IN PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource, - IN PWHEA_ERROR_RECORD ErrorRecord); + _In_ PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource, + _In_ PWHEA_ERROR_RECORD ErrorRecord); #else @@ -3765,11 +3790,10 @@ NTHALAPI VOID NTAPI HalBugCheckSystem( - IN PWHEA_ERROR_RECORD ErrorRecord); + _In_ PWHEA_ERROR_RECORD ErrorRecord); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - /****************************************************************************** * I/O Manager Functions * ******************************************************************************/ @@ -3802,15 +3826,17 @@ IoInitializeDriverCreateContext( #if (NTDDI_VERSION >= NTDDI_WIN2K) #if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoAllocateAdapterChannel( - IN PADAPTER_OBJECT AdapterObject, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG NumberOfMapRegisters, + _In_ PDRIVER_CONTROL ExecutionRoutine, + _In_ PVOID Context); #endif #if !defined(DMA_MACROS_DEFINED) @@ -3819,185 +3845,203 @@ NTHALAPI PHYSICAL_ADDRESS NTAPI IoMapTransfer( - IN PADAPTER_OBJECT AdapterObject, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN OUT PULONG Length, - IN BOOLEAN WriteToDevice); + _In_ PADAPTER_OBJECT AdapterObject, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _Inout_ PULONG Length, + _In_ BOOLEAN WriteToDevice); #endif +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoAllocateController( - IN PCONTROLLER_OBJECT ControllerObject, - IN PDEVICE_OBJECT DeviceObject, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context OPTIONAL); + _In_ PCONTROLLER_OBJECT ControllerObject, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PDRIVER_CONTROL ExecutionRoutine, + _In_opt_ PVOID Context); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PCONTROLLER_OBJECT NTAPI IoCreateController( - IN ULONG Size); + _In_ ULONG Size); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoDeleteController( - IN PCONTROLLER_OBJECT ControllerObject); + _In_ PCONTROLLER_OBJECT ControllerObject); +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoFreeController( - IN PCONTROLLER_OBJECT ControllerObject); + _In_ PCONTROLLER_OBJECT ControllerObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetDeviceToVerify( - IN PETHREAD Thread); + _In_ PETHREAD Thread); NTKERNELAPI VOID NTAPI IoCancelFileOpen( - IN PDEVICE_OBJECT DeviceObject, - IN PFILE_OBJECT FileObject); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PFILE_OBJECT FileObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PGENERIC_MAPPING NTAPI IoGetFileObjectGenericMapping(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PIRP NTAPI IoMakeAssociatedIrp( - IN PIRP Irp, - IN CCHAR StackSize); + _In_ PIRP Irp, + _In_ CCHAR StackSize); NTKERNELAPI NTSTATUS NTAPI IoQueryDeviceDescription( - IN PINTERFACE_TYPE BusType OPTIONAL, - IN PULONG BusNumber OPTIONAL, - IN PCONFIGURATION_TYPE ControllerType OPTIONAL, - IN PULONG ControllerNumber OPTIONAL, - IN PCONFIGURATION_TYPE PeripheralType OPTIONAL, - IN PULONG PeripheralNumber OPTIONAL, - IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, - IN OUT PVOID Context OPTIONAL); + _In_opt_ PINTERFACE_TYPE BusType, + _In_opt_ PULONG BusNumber, + _In_opt_ PCONFIGURATION_TYPE ControllerType, + _In_opt_ PULONG ControllerNumber, + _In_opt_ PCONFIGURATION_TYPE PeripheralType, + _In_opt_ PULONG PeripheralNumber, + _In_ PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, + _Inout_opt_ PVOID Context); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI IoRaiseHardError( - IN PIRP Irp, - IN PVPB Vpb OPTIONAL, - IN PDEVICE_OBJECT RealDeviceObject); + _In_ PIRP Irp, + _In_opt_ PVPB Vpb, + _In_ PDEVICE_OBJECT RealDeviceObject); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI IoRaiseInformationalHardError( - IN NTSTATUS ErrorStatus, - IN PUNICODE_STRING String OPTIONAL, - IN PKTHREAD Thread OPTIONAL); + _In_ NTSTATUS ErrorStatus, + _In_opt_ PUNICODE_STRING String, + _In_opt_ PKTHREAD Thread); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoRegisterBootDriverReinitialization( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, - IN PVOID Context OPTIONAL); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_REINITIALIZE DriverReinitializationRoutine, + _In_opt_ PVOID Context); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoRegisterDriverReinitialization( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_REINITIALIZE DriverReinitializationRoutine, - IN PVOID Context OPTIONAL); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_REINITIALIZE DriverReinitializationRoutine, + _In_opt_ PVOID Context); NTKERNELAPI NTSTATUS NTAPI IoAttachDeviceByPointer( - IN PDEVICE_OBJECT SourceDevice, - IN PDEVICE_OBJECT TargetDevice); + _In_ PDEVICE_OBJECT SourceDevice, + _In_ PDEVICE_OBJECT TargetDevice); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoReportDetectedDevice( - IN PDRIVER_OBJECT DriverObject, - IN INTERFACE_TYPE LegacyBusType, - IN ULONG BusNumber, - IN ULONG SlotNumber, - IN PCM_RESOURCE_LIST ResourceList OPTIONAL, - IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL, - IN BOOLEAN ResourceAssigned, - IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL); + _In_ PDRIVER_OBJECT DriverObject, + _In_ INTERFACE_TYPE LegacyBusType, + _In_ ULONG BusNumber, + _In_ ULONG SlotNumber, + _In_opt_ PCM_RESOURCE_LIST ResourceList, + _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements, + _In_ BOOLEAN ResourceAssigned, + _Inout_ PDEVICE_OBJECT *DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoReportResourceForDetection( - IN PDRIVER_OBJECT DriverObject, - IN PCM_RESOURCE_LIST DriverList OPTIONAL, - IN ULONG DriverListSize OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN PCM_RESOURCE_LIST DeviceList OPTIONAL, - IN ULONG DeviceListSize OPTIONAL, - OUT PBOOLEAN ConflictDetected); + _In_ PDRIVER_OBJECT DriverObject, + _In_reads_bytes_opt_(DriverListSize) PCM_RESOURCE_LIST DriverList, + _In_opt_ ULONG DriverListSize, + _In_opt_ PDEVICE_OBJECT DeviceObject, + _In_reads_bytes_opt_(DeviceListSize) PCM_RESOURCE_LIST DeviceList, + _In_opt_ ULONG DeviceListSize, + _Out_ PBOOLEAN ConflictDetected); NTKERNELAPI NTSTATUS NTAPI IoReportResourceUsage( - IN PUNICODE_STRING DriverClassName OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PCM_RESOURCE_LIST DriverList OPTIONAL, - IN ULONG DriverListSize OPTIONAL, - IN PDEVICE_OBJECT DeviceObject, - IN PCM_RESOURCE_LIST DeviceList OPTIONAL, - IN ULONG DeviceListSize OPTIONAL, - IN BOOLEAN OverrideConflict, - OUT PBOOLEAN ConflictDetected); + _In_opt_ PUNICODE_STRING DriverClassName, + _In_ PDRIVER_OBJECT DriverObject, + _In_reads_bytes_opt_(DriverListSize) PCM_RESOURCE_LIST DriverList, + _In_opt_ ULONG DriverListSize, + _In_opt_ PDEVICE_OBJECT DeviceObject, + _In_reads_bytes_opt_(DeviceListSize) PCM_RESOURCE_LIST DeviceList, + _In_opt_ ULONG DeviceListSize, + _In_ BOOLEAN OverrideConflict, + _Out_ PBOOLEAN ConflictDetected); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoSetHardErrorOrVerifyDevice( - IN PIRP Irp, - IN PDEVICE_OBJECT DeviceObject); + _In_ PIRP Irp, + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoAssignResources( - IN PUNICODE_STRING RegistryPath, - IN PUNICODE_STRING DriverClassName OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL, - IN OUT PCM_RESOURCE_LIST *AllocatedResources); + _In_ PUNICODE_STRING RegistryPath, + _In_opt_ PUNICODE_STRING DriverClassName, + _In_ PDRIVER_OBJECT DriverObject, + _In_opt_ PDEVICE_OBJECT DeviceObject, + _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources, + _Inout_ PCM_RESOURCE_LIST *AllocatedResources); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI IoSetThreadHardErrorMode( - IN BOOLEAN EnableHardErrors); + _In_ BOOLEAN EnableHardErrors); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -4008,131 +4052,140 @@ NTKERNELAPI BOOLEAN NTAPI IoIsFileOriginRemote( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); NTKERNELAPI NTSTATUS NTAPI IoSetFileOrigin( - IN PFILE_OBJECT FileObject, - IN BOOLEAN Remote); + _In_ PFILE_OBJECT FileObject, + _In_ BOOLEAN Remote); #endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS FASTCALL IoReadPartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN BOOLEAN ReturnRecognizedPartitions, - OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ BOOLEAN ReturnRecognizedPartitions, + _Out_ struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS FASTCALL IoSetPartitionInformation( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG PartitionNumber, - IN ULONG PartitionType); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG PartitionNumber, + _In_ ULONG PartitionType); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS FASTCALL IoWritePartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG SectorSize, - IN ULONG SectorsPerTrack, - IN ULONG NumberOfHeads, - IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG SectorSize, + _In_ ULONG SectorsPerTrack, + _In_ ULONG NumberOfHeads, + _In_ struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); NTKERNELAPI NTSTATUS NTAPI IoCreateDisk( - IN PDEVICE_OBJECT DeviceObject, - IN struct _CREATE_DISK* Disk OPTIONAL); + _In_ PDEVICE_OBJECT DeviceObject, + _In_opt_ struct _CREATE_DISK* Disk); NTKERNELAPI NTSTATUS NTAPI IoReadDiskSignature( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG BytesPerSector, - OUT PDISK_SIGNATURE Signature); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG BytesPerSector, + _Out_ PDISK_SIGNATURE Signature); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoReadPartitionTableEx( - IN PDEVICE_OBJECT DeviceObject, - OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); + _In_ PDEVICE_OBJECT DeviceObject, + _Out_ struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoSetPartitionInformationEx( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG PartitionNumber, - IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG PartitionNumber, + _In_ struct _SET_PARTITION_INFORMATION_EX *PartitionInfo); NTKERNELAPI NTSTATUS NTAPI IoSetSystemPartition( - IN PUNICODE_STRING VolumeNameString); + _In_ PUNICODE_STRING VolumeNameString); NTKERNELAPI NTSTATUS NTAPI IoVerifyPartitionTable( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN FixErrors); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN FixErrors); NTKERNELAPI NTSTATUS NTAPI IoVolumeDeviceToDosName( - IN PVOID VolumeDeviceObject, - OUT PUNICODE_STRING DosName); + _In_ PVOID VolumeDeviceObject, + _Out_ _When_(return==0, + _At_(DosName->Buffer, __drv_allocatesMem(Mem))) + PUNICODE_STRING DosName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoWritePartitionTableEx( - IN PDEVICE_OBJECT DeviceObject, - IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout); + _In_ PDEVICE_OBJECT DeviceObject, + _In_reads_(_Inexpressible_(FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, PartitionEntry[0]))) + struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout); 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); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG Disposition, + _In_ ULONG CreateOptions, + _In_opt_ PVOID EaBuffer, + _In_ ULONG EaLength, + _In_ CREATE_FILE_TYPE CreateFileType, + _In_opt_ PVOID InternalParameters, + _In_ ULONG Options, + _In_opt_ PVOID DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoAttachDeviceToDeviceStackSafe( - IN PDEVICE_OBJECT SourceDevice, - IN PDEVICE_OBJECT TargetDevice, - OUT PDEVICE_OBJECT *AttachedToDeviceObject); + _In_ PDEVICE_OBJECT SourceDevice, + _In_ PDEVICE_OBJECT TargetDevice, + _Outptr_ PDEVICE_OBJECT *AttachedToDeviceObject); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -4142,7 +4195,7 @@ NTKERNELAPI IO_PAGING_PRIORITY FASTCALL IoGetPagingIoPriority( - IN PIRP Irp); + _In_ PIRP Irp); #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ #if (NTDDI_VERSION >= NTDDI_WS03SP1) @@ -4150,11 +4203,11 @@ IoGetPagingIoPriority( BOOLEAN NTAPI IoTranslateBusAddress( - IN INTERFACE_TYPE InterfaceType, - IN ULONG BusNumber, - IN PHYSICAL_ADDRESS BusAddress, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); + _In_ INTERFACE_TYPE InterfaceType, + _In_ ULONG BusNumber, + _In_ PHYSICAL_ADDRESS BusAddress, + _Inout_ PULONG AddressSpace, + _Out_ PPHYSICAL_ADDRESS TranslatedAddress); #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ #if (NTDDI_VERSION >= NTDDI_VISTA) @@ -4162,56 +4215,56 @@ NTKERNELAPI NTSTATUS NTAPI IoUpdateDiskGeometry( - IN PDEVICE_OBJECT DeviceObject, - IN struct _DISK_GEOMETRY_EX* OldDiskGeometry, - IN struct _DISK_GEOMETRY_EX* NewDiskGeometry); + _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); + _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); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG Disposition, + _In_ ULONG CreateOptions, + _In_opt_ PVOID EaBuffer, + _In_ ULONG EaLength, + _In_ CREATE_FILE_TYPE CreateFileType, + _In_opt_ PVOID InternalParameters, + _In_ ULONG Options, + _In_opt_ PIO_DRIVER_CREATE_CONTEXT DriverContext); NTSTATUS NTAPI IoSetIrpExtraCreateParameter( - IN OUT PIRP Irp, - IN struct _ECP_LIST *ExtraCreateParameter); + _Inout_ PIRP Irp, + _In_ struct _ECP_LIST *ExtraCreateParameter); VOID NTAPI IoClearIrpExtraCreateParameter( - IN OUT PIRP Irp); + _Inout_ PIRP Irp); NTSTATUS NTAPI IoGetIrpExtraCreateParameter( - IN PIRP Irp, - OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL); + _In_ PIRP Irp, + _Outptr_result_maybenull_ struct _ECP_LIST **ExtraCreateParameter); BOOLEAN NTAPI IoIsFileObjectIgnoringSharing( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -4220,7 +4273,7 @@ IoIsFileObjectIgnoringSharing( NTSTATUS NTAPI IoSetFileObjectIgnoreSharing( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -4231,20 +4284,22 @@ NTSYSAPI ULONG NTAPI DbgPrompt( - IN PCCH Prompt, - OUT PCH Response, - IN ULONG MaximumResponseLength); + _In_z_ PCCH Prompt, + _Out_writes_bytes_(MaximumResponseLength) PCH Response, + _In_ ULONG MaximumResponseLength); /****************************************************************************** * Kernel Functions * ******************************************************************************/ +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KeInvalidateRangeAllCaches( - IN PVOID BaseAddress, - IN ULONG Length); + _In_ PVOID BaseAddress, + _In_ ULONG Length); #if (NTDDI_VERSION >= NTDDI_WIN2K) @@ -4252,29 +4307,36 @@ NTKERNELAPI VOID NTAPI KeSetImportanceDpc( - IN OUT PRKDPC Dpc, - IN KDPC_IMPORTANCE Importance); + _Inout_ PRKDPC Dpc, + _In_ KDPC_IMPORTANCE Importance); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KePulseEvent( - IN OUT PRKEVENT Event, - IN KPRIORITY Increment, - IN BOOLEAN Wait); + _Inout_ PRKEVENT Event, + _In_ KPRIORITY Increment, + _In_ BOOLEAN Wait); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeSetBasePriorityThread( - IN OUT PRKTHREAD Thread, - IN LONG Increment); + _Inout_ PRKTHREAD Thread, + _In_ LONG Increment); +_Acquires_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeEnterCriticalRegion(VOID); +_Releases_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI @@ -4285,7 +4347,7 @@ DECLSPEC_NORETURN VOID NTAPI KeBugCheck( - IN ULONG BugCheckCode); + _In_ ULONG BugCheckCode); #if defined(SINGLE_GROUP_LEGACY_API) @@ -4293,8 +4355,8 @@ NTKERNELAPI VOID NTAPI KeSetTargetProcessorDpc( - IN OUT PRKDPC Dpc, - IN CCHAR Number); + _Inout_ PRKDPC Dpc, + _In_ CCHAR Number); NTKERNELAPI KAFFINITY @@ -4307,6 +4369,8 @@ KeQueryActiveProcessors(VOID); #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI @@ -4324,19 +4388,25 @@ KeInvalidateAllCaches(VOID); #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ #if (NTDDI_VERSION >= NTDDI_WS03SP1) +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeExpandKernelStackAndCallout( - IN PEXPAND_STACK_CALLOUT Callout, - IN PVOID Parameter OPTIONAL, - IN SIZE_T Size); + _In_ PEXPAND_STACK_CALLOUT Callout, + _In_opt_ PVOID Parameter, + _In_ SIZE_T Size); +_Acquires_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeEnterGuardedRegion(VOID); +_Releases_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI @@ -4350,7 +4420,7 @@ NTKERNELAPI ULONG NTAPI KeQueryActiveProcessorCount( - OUT PKAFFINITY ActiveProcessors OPTIONAL); + _Out_opt_ PKAFFINITY ActiveProcessors); NTKERNELAPI ULONG @@ -4366,13 +4436,13 @@ NTKERNELAPI ULONG NTAPI KeQueryActiveProcessorCountEx( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI ULONG NTAPI KeQueryMaximumProcessorCountEx( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI USHORT @@ -4388,27 +4458,27 @@ NTKERNELAPI KAFFINITY NTAPI KeQueryGroupAffinity( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI ULONG NTAPI KeGetCurrentProcessorNumberEx( - OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL); + _Out_opt_ PPROCESSOR_NUMBER ProcNumber); NTKERNELAPI VOID NTAPI KeQueryNodeActiveAffinity( - IN USHORT NodeNumber, - OUT PGROUP_AFFINITY Affinity OPTIONAL, - OUT PUSHORT Count OPTIONAL); + _In_ USHORT NodeNumber, + _Out_opt_ PGROUP_AFFINITY Affinity, + _Out_opt_ PUSHORT Count); NTKERNELAPI USHORT NTAPI KeQueryNodeMaximumProcessorCount( - IN USHORT NodeNumber); + _In_ USHORT NodeNumber); NTKERNELAPI USHORT @@ -4420,37 +4490,40 @@ USHORT NTAPI KeGetCurrentNodeNumber(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) 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); + _In_opt_ PPROCESSOR_NUMBER ProcessorNumber, + _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, + _Out_writes_bytes_opt_(*Length) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information, + _Inout_ PULONG Length); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeSetHardwareCounterConfiguration( - IN PHARDWARE_COUNTER CounterArray, - IN ULONG Count); + _In_reads_(Count) PHARDWARE_COUNTER CounterArray, + _In_ ULONG Count); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeQueryHardwareCounterConfiguration( - OUT PHARDWARE_COUNTER CounterArray, - IN ULONG MaximumCount, - OUT PULONG Count); + _Out_writes_to_(MaximumCount, *Count) PHARDWARE_COUNTER CounterArray, + _In_ ULONG MaximumCount, + _Out_ PULONG Count); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ - /****************************************************************************** * Memory manager Functions * ******************************************************************************/ #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_ (PASSIVE_LEVEL) NTKERNELAPI PPHYSICAL_MEMORY_RANGE NTAPI @@ -4460,170 +4533,204 @@ NTKERNELAPI PHYSICAL_ADDRESS NTAPI MmGetPhysicalAddress( - IN PVOID BaseAddress); + _In_ PVOID BaseAddress); NTKERNELAPI BOOLEAN NTAPI MmIsNonPagedSystemAddressValid( - IN PVOID VirtualAddress); + _In_ PVOID VirtualAddress); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) +_Out_writes_bytes_opt_(NumberOfBytes) NTKERNELAPI PVOID NTAPI MmAllocateNonCachedMemory( - IN SIZE_T NumberOfBytes); + _In_ SIZE_T NumberOfBytes); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmFreeNonCachedMemory( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes); + _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes); NTKERNELAPI PVOID NTAPI MmGetVirtualForPhysical( - IN PHYSICAL_ADDRESS PhysicalAddress); + _In_ PHYSICAL_ADDRESS PhysicalAddress); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmMapUserAddressesToPage( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN PVOID PageAddress); + _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes, + _In_ PVOID PageAddress); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) +_Out_writes_bytes_opt_(NumberOfBytes) NTKERNELAPI PVOID NTAPI MmMapVideoDisplay( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ SIZE_T NumberOfBytes, + _In_ MEMORY_CACHING_TYPE CacheType); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmMapViewInSessionSpace( - IN PVOID Section, - OUT PVOID *MappedBase, - IN OUT PSIZE_T ViewSize); + _In_ PVOID Section, + _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase, + _Inout_ PSIZE_T ViewSize); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmMapViewInSystemSpace( - IN PVOID Section, - OUT PVOID *MappedBase, - IN OUT PSIZE_T ViewSize); + _In_ PVOID Section, + _Outptr_result_bytebuffer_(*ViewSize) PVOID *MappedBase, + _Inout_ PSIZE_T ViewSize); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI MmIsAddressValid( - IN PVOID VirtualAddress); + _In_ PVOID VirtualAddress); NTKERNELAPI BOOLEAN NTAPI MmIsThisAnNtAsSystem(VOID); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmLockPagableSectionByHandle( - IN PVOID ImageSectionHandle); + _In_ PVOID ImageSectionHandle); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmUnmapViewInSessionSpace( - IN PVOID MappedBase); + _In_ PVOID MappedBase); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmUnmapViewInSystemSpace( - IN PVOID MappedBase); + _In_ PVOID MappedBase); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmUnsecureVirtualMemory( - IN HANDLE SecureHandle); + _In_ HANDLE SecureHandle); +_IRQL_requires_max_ (PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmRemovePhysicalMemory( - IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes); + _In_ PPHYSICAL_ADDRESS StartAddress, + _Inout_ PLARGE_INTEGER NumberOfBytes); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI HANDLE NTAPI MmSecureVirtualMemory( - IN PVOID Address, - IN SIZE_T Size, - IN ULONG ProbeMode); + __in_data_source(USER_MODE) _In_reads_bytes_ (Size) PVOID Address, + _In_ __in_data_source(USER_MODE) SIZE_T Size, + _In_ ULONG ProbeMode); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmUnmapVideoDisplay( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes); + _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes); +_IRQL_requires_max_ (PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmAddPhysicalMemory( - IN PPHYSICAL_ADDRESS StartAddress, - IN OUT PLARGE_INTEGER NumberOfBytes); + _In_ PPHYSICAL_ADDRESS StartAddress, + _Inout_ PLARGE_INTEGER NumberOfBytes); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_(return != NULL, _Post_writable_byte_size_(NumberOfBytes)) NTKERNELAPI PVOID NTAPI MmAllocateContiguousMemory( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS HighestAcceptableAddress); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_(return != NULL, _Post_writable_byte_size_(NumberOfBytes)) 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); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, + _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, + _In_ MEMORY_CACHING_TYPE CacheType); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_(return != NULL, _Post_writable_byte_size_(NumberOfBytes)) 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); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, + _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, + _In_ MEMORY_CACHING_TYPE CacheType, + _In_ NODE_REQUIREMENT PreferredNode); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmFreeContiguousMemory( - IN PVOID BaseAddress); + _In_ PVOID BaseAddress); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmFreeContiguousMemorySpecifyCache( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType); + _In_reads_bytes_(NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes, + _In_ MEMORY_CACHING_TYPE CacheType); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -4631,6 +4738,8 @@ MmFreeContiguousMemorySpecifyCache( #if (NTDDI_VERSION >= NTDDI_WS03) +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI @@ -4638,29 +4747,32 @@ MmCreateMirror(VOID); #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ #if (NTDDI_VERSION >= NTDDI_VISTA) +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ PVOID VirtualAddress, + _Inout_ PSIZE_T NumberOfBytes, + _In_opt_ PMDLX NewMdl, + _In_ MM_ROTATE_DIRECTION Direction, + _In_ PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction, + _In_opt_ PVOID Context); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ /****************************************************************************** * Process Manager Functions * ******************************************************************************/ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenProcess( - OUT PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN PCLIENT_ID ClientId OPTIONAL); + _Out_ PHANDLE ProcessHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PCLIENT_ID ClientId); NTSYSCALLAPI NTSTATUS @@ -4675,30 +4787,34 @@ NtQueryInformationProcess( #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsSetCreateProcessNotifyRoutine( - IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, - IN BOOLEAN Remove); + _In_ PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine, + _In_ BOOLEAN Remove); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsSetCreateThreadNotifyRoutine( - IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); + _In_ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsSetLoadImageNotifyRoutine( - IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); + _In_ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); NTKERNELAPI HANDLE NTAPI PsGetCurrentProcessId(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI HANDLE NTAPI @@ -4715,35 +4831,39 @@ PsGetVersion( #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI HANDLE NTAPI PsGetProcessId( - IN PEPROCESS Process); + _In_ PEPROCESS Process); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI HANDLE NTAPI PsGetThreadId( - IN PETHREAD Thread); + _In_ PETHREAD Thread); NTKERNELAPI NTSTATUS NTAPI PsRemoveCreateThreadNotifyRoutine( - IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); + _In_ PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsRemoveLoadImageNotifyRoutine( - IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); + _In_ PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONGLONG NTAPI PsGetProcessCreateTimeQuadPart( - IN PEPROCESS Process); + _In_ PEPROCESS Process); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_WS03) @@ -4791,87 +4911,92 @@ 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); + _Out_ PRTL_GENERIC_TABLE Table, + _In_ PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine, + _In_ PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine, + _In_ PRTL_GENERIC_FREE_ROUTINE FreeRoutine, + _In_opt_ PVOID TableContext); NTSYSAPI PVOID NTAPI RtlInsertElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL); + _In_ PRTL_GENERIC_TABLE Table, + _In_reads_bytes_(BufferSize) PVOID Buffer, + _In_ CLONG BufferSize, + _Out_opt_ PBOOLEAN NewElement); 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); + _In_ PRTL_GENERIC_TABLE Table, + _In_reads_bytes_(BufferSize) PVOID Buffer, + _In_ CLONG BufferSize, + _Out_opt_ PBOOLEAN NewElement, + _In_ PVOID NodeOrParent, + _In_ TABLE_SEARCH_RESULT SearchResult); NTSYSAPI BOOLEAN NTAPI RtlDeleteElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer); + _In_ PRTL_GENERIC_TABLE Table, + _In_ PVOID Buffer); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlLookupElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN PVOID Buffer); + _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); + _In_ PRTL_GENERIC_TABLE Table, + _In_ PVOID Buffer, + _Out_ PVOID *NodeOrParent, + _Out_ TABLE_SEARCH_RESULT *SearchResult); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlEnumerateGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN BOOLEAN Restart); + _In_ PRTL_GENERIC_TABLE Table, + _In_ BOOLEAN Restart); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlEnumerateGenericTableWithoutSplaying( - IN PRTL_GENERIC_TABLE Table, - IN OUT PVOID *RestartKey); + _In_ PRTL_GENERIC_TABLE Table, + _Inout_ PVOID *RestartKey); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlGetElementGenericTable( - IN PRTL_GENERIC_TABLE Table, - IN ULONG I); + _In_ PRTL_GENERIC_TABLE Table, + _In_ ULONG I); NTSYSAPI ULONG NTAPI RtlNumberGenericTableElements( - IN PRTL_GENERIC_TABLE Table); + _In_ PRTL_GENERIC_TABLE Table); +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlIsGenericTableEmpty( - IN PRTL_GENERIC_TABLE Table); + _In_ PRTL_GENERIC_TABLE Table); #endif /* !RTL_USE_AVL_TABLES */ @@ -4881,81 +5006,94 @@ NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlSplay( - IN OUT PRTL_SPLAY_LINKS Links); + _Inout_ PRTL_SPLAY_LINKS Links); NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlDelete( - IN PRTL_SPLAY_LINKS Links); + _In_ PRTL_SPLAY_LINKS Links); NTSYSAPI VOID NTAPI RtlDeleteNoSplay( - IN PRTL_SPLAY_LINKS Links, - IN OUT PRTL_SPLAY_LINKS *Root); + _In_ PRTL_SPLAY_LINKS Links, + _Inout_ PRTL_SPLAY_LINKS *Root); +_Must_inspect_result_ NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlSubtreeSuccessor( - IN PRTL_SPLAY_LINKS Links); + _In_ PRTL_SPLAY_LINKS Links); +_Must_inspect_result_ NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlSubtreePredecessor( - IN PRTL_SPLAY_LINKS Links); + _In_ PRTL_SPLAY_LINKS Links); +_Must_inspect_result_ NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlRealSuccessor( - IN PRTL_SPLAY_LINKS Links); + _In_ PRTL_SPLAY_LINKS Links); +_Must_inspect_result_ NTSYSAPI PRTL_SPLAY_LINKS NTAPI RtlRealPredecessor( - IN PRTL_SPLAY_LINKS Links); + _In_ PRTL_SPLAY_LINKS Links); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString( - IN PCUNICODE_STRING String1, - IN PCUNICODE_STRING String2, - IN BOOLEAN CaseInSensitive); + _In_ PCUNICODE_STRING String1, + _In_ PCUNICODE_STRING String2, + _In_ BOOLEAN CaseInSensitive); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlUpperString( - IN OUT PSTRING DestinationString, - IN const PSTRING SourceString); + _Inout_ PSTRING DestinationString, + _In_ const PSTRING SourceString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(AllocateDestinationString, _Must_inspect_result_) NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PUNICODE_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI VOID NTAPI RtlMapGenericMask( - IN OUT PACCESS_MASK AccessMask, - IN PGENERIC_MAPPING GenericMapping); + _Inout_ PACCESS_MASK AccessMask, + _In_ PGENERIC_MAPPING GenericMapping); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlVolumeDeviceToDosName( - IN PVOID VolumeDeviceObject, - OUT PUNICODE_STRING DosName); + _In_ PVOID VolumeDeviceObject, + _Out_ PUNICODE_STRING DosName); NTSYSAPI NTSTATUS @@ -4971,50 +5109,57 @@ RtlVerifyVersionInfo( IN ULONG TypeMask, IN ULONGLONG ConditionMask); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI LONG NTAPI RtlCompareString( - IN const PSTRING String1, - IN const PSTRING String2, - IN BOOLEAN CaseInSensitive); + _In_ const PSTRING String1, + _In_ const PSTRING String2, + _In_ BOOLEAN CaseInSensitive); NTSYSAPI VOID NTAPI RtlCopyString( - OUT PSTRING DestinationString, - IN const PSTRING SourceString OPTIONAL); + _Out_ PSTRING DestinationString, + _In_opt_ const PSTRING SourceString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlEqualString( - IN const PSTRING String1, - IN const PSTRING String2, - IN BOOLEAN CaseInSensitive); + _In_ const PSTRING String1, + _In_ const PSTRING String2, + _In_ BOOLEAN CaseInSensitive); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCharToInteger( - IN PCSZ String, - IN ULONG Base OPTIONAL, - OUT PULONG Value); + _In_z_ PCSZ String, + _In_opt_ ULONG Base, + _Out_ PULONG Value); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI CHAR NTAPI RtlUpperChar( - IN CHAR Character); + _In_ CHAR Character); NTSYSAPI ULONG NTAPI RtlWalkFrameChain( - OUT PVOID *Callers, - IN ULONG Count, - IN ULONG Flags); + _Out_writes_(Count - (Flags >> RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT)) + PVOID *Callers, + _In_ ULONG Count, + _In_ ULONG Flags); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -5028,107 +5173,114 @@ 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); + _Out_ PRTL_AVL_TABLE Table, + _In_ PRTL_AVL_COMPARE_ROUTINE CompareRoutine, + _In_opt_ PRTL_AVL_ALLOCATE_ROUTINE AllocateRoutine, + _In_opt_ PRTL_AVL_FREE_ROUTINE FreeRoutine, + _In_opt_ PVOID TableContext); NTSYSAPI PVOID NTAPI RtlInsertElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - IN CLONG BufferSize, - OUT PBOOLEAN NewElement OPTIONAL); + _In_ PRTL_AVL_TABLE Table, + _In_reads_bytes_(BufferSize) PVOID Buffer, + _In_ CLONG BufferSize, + _Out_opt_ PBOOLEAN NewElement); 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); + _In_ PRTL_AVL_TABLE Table, + _In_reads_bytes_(BufferSize) PVOID Buffer, + _In_ CLONG BufferSize, + _Out_opt_ PBOOLEAN NewElement, + _In_ PVOID NodeOrParent, + _In_ TABLE_SEARCH_RESULT SearchResult); NTSYSAPI BOOLEAN NTAPI RtlDeleteElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer); + _In_ PRTL_AVL_TABLE Table, + _In_ PVOID Buffer); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlLookupElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer); + _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); + _In_ PRTL_AVL_TABLE Table, + _In_ PVOID Buffer, + _Out_ PVOID *NodeOrParent, + _Out_ TABLE_SEARCH_RESULT *SearchResult); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlEnumerateGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN BOOLEAN Restart); + _In_ PRTL_AVL_TABLE Table, + _In_ BOOLEAN Restart); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlEnumerateGenericTableWithoutSplayingAvl( - IN PRTL_AVL_TABLE Table, - IN OUT PVOID *RestartKey); + _In_ PRTL_AVL_TABLE Table, + _Inout_ PVOID *RestartKey); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlLookupFirstMatchingElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN PVOID Buffer, - OUT PVOID *RestartKey); + _In_ PRTL_AVL_TABLE Table, + _In_ PVOID Buffer, + _Out_ PVOID *RestartKey); +_Must_inspect_result_ 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); + _In_ PRTL_AVL_TABLE Table, + _In_opt_ PRTL_AVL_MATCH_FUNCTION MatchFunction, + _In_opt_ PVOID MatchData, + _In_ ULONG NextFlag, + _Inout_ PVOID *RestartKey, + _Inout_ PULONG DeleteCount, + _In_ PVOID Buffer); +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlGetElementGenericTableAvl( - IN PRTL_AVL_TABLE Table, - IN ULONG I); + _In_ PRTL_AVL_TABLE Table, + _In_ ULONG I); NTSYSAPI ULONG NTAPI RtlNumberGenericTableElementsAvl( - IN PRTL_AVL_TABLE Table); + _In_ PRTL_AVL_TABLE Table); +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlIsGenericTableEmptyAvl( - IN PRTL_AVL_TABLE Table); + _In_ PRTL_AVL_TABLE Table); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -5137,46 +5289,52 @@ RtlIsGenericTableEmptyAvl( #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI VOID NTAPI RtlRunOnceInitialize( - OUT PRTL_RUN_ONCE RunOnce); + _Out_ PRTL_RUN_ONCE RunOnce); +_IRQL_requires_max_(APC_LEVEL) +_Maybe_raises_SEH_exception_ 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); + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ __inner_callback PRTL_RUN_ONCE_INIT_FN InitFn, + _Inout_opt_ PVOID Parameter, + _Outptr_opt_result_maybenull_ PVOID *Context); +_IRQL_requires_max_(APC_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlRunOnceBeginInitialize( - IN OUT PRTL_RUN_ONCE RunOnce, - IN ULONG Flags, - OUT PVOID *Context OPTIONAL); + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ ULONG Flags, + _Outptr_opt_result_maybenull_ PVOID *Context); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlRunOnceComplete( - IN OUT PRTL_RUN_ONCE RunOnce, - IN ULONG Flags, - IN PVOID Context OPTIONAL); + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ ULONG Flags, + _In_opt_ PVOID Context); NTSYSAPI BOOLEAN NTAPI RtlGetProductInfo( - IN ULONG OSMajorVersion, - IN ULONG OSMinorVersion, - IN ULONG SpMajorVersion, - IN ULONG SpMinorVersion, - OUT PULONG ReturnedProductType); + _In_ ULONG OSMajorVersion, + _In_ ULONG OSMinorVersion, + _In_ ULONG SpMajorVersion, + _In_ ULONG SpMinorVersion, + _Out_ PULONG ReturnedProductType); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -5184,105 +5342,112 @@ RtlGetProductInfo( #if (NTDDI_VERSION >= NTDDI_WIN7) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlCreateHashTable( - IN OUT PRTL_DYNAMIC_HASH_TABLE *HashTable OPTIONAL, - IN ULONG Shift, - IN ULONG Flags); + _Inout_ _When_(NULL == *HashTable, __drv_allocatesMem(Mem)) + PRTL_DYNAMIC_HASH_TABLE *HashTable, + _In_ ULONG Shift, + _In_ _Reserved_ ULONG Flags); NTSYSAPI VOID NTAPI RtlDeleteHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); + _In_ _When_((HashTable->Flags & RTL_HASH_ALLOCATED_HEADER), __drv_freesMem(Mem) _Post_invalid_) + 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); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _In_ __drv_aliasesMem PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry, + _In_ ULONG_PTR Signature, + _Inout_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); 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); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _In_ PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry, + _Inout_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); +_Must_inspect_result_ 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); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _In_ ULONG_PTR Signature, + _Out_opt_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); +_Must_inspect_result_ NTSYSAPI PRTL_DYNAMIC_HASH_TABLE_ENTRY NTAPI RtlGetNextEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context); + _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); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Out_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); +_Must_inspect_result_ NTSYSAPI PRTL_DYNAMIC_HASH_TABLE_ENTRY NTAPI RtlEnumerateEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); NTSYSAPI VOID NTAPI RtlEndEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); NTSYSAPI BOOLEAN NTAPI RtlInitWeakEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Out_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); +_Must_inspect_result_ NTSYSAPI PRTL_DYNAMIC_HASH_TABLE_ENTRY NTAPI RtlWeaklyEnumerateEntryHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); NTSYSAPI VOID NTAPI RtlEndWeakEnumerationHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable, - IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable, + _Inout_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator); NTSYSAPI BOOLEAN NTAPI RtlExpandHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable); NTSYSAPI BOOLEAN NTAPI RtlContractHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable); + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -5297,9 +5462,9 @@ FORCEINLINE LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - OUT PLARGE_INTEGER Remainder OPTIONAL) + _In_ LARGE_INTEGER Dividend, + _In_ LARGE_INTEGER Divisor, + _Out_opt_ PLARGE_INTEGER Remainder) { LARGE_INTEGER ret; ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart; @@ -5315,9 +5480,9 @@ NTSYSAPI LARGE_INTEGER NTAPI RtlLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER Divisor, - OUT PLARGE_INTEGER Remainder OPTIONAL); + _In_ LARGE_INTEGER Dividend, + _In_ LARGE_INTEGER Divisor, + _Out_opt_ PLARGE_INTEGER Remainder); #endif @@ -5393,7 +5558,7 @@ FORCEINLINE LUID NTAPI_INLINE RtlConvertLongToLuid( - IN LONG Val) + _In_ LONG Val) { LUID Luid; LARGE_INTEGER Temp; @@ -5408,7 +5573,7 @@ FORCEINLINE LUID NTAPI_INLINE RtlConvertUlongToLuid( - IN ULONG Val) + _In_ ULONG Val) { LUID Luid; @@ -5429,8 +5594,8 @@ NTSYSAPI VOID NTAPI RtlGetCallersAddress( - OUT PVOID *CallersAddress, - OUT PVOID *CallersCaller); + _Out_ PVOID *CallersAddress, + _Out_ PVOID *CallersCaller); #endif #endif @@ -5442,7 +5607,7 @@ FORCEINLINE VOID NTAPI RtlInitHashTableContext( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) + _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) { Context->ChainHead = NULL; Context->PrevLinkage = NULL; @@ -5452,8 +5617,8 @@ FORCEINLINE VOID NTAPI RtlInitHashTableContextFromEnumerator( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context, - IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator) + _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context, + _In_ PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator) { Context->ChainHead = Enumerator->ChainHead; Context->PrevLinkage = Enumerator->HashEntry.Linkage.Blink; @@ -5463,7 +5628,7 @@ FORCEINLINE VOID NTAPI RtlReleaseHashTableContext( - IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) + _Inout_ PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context) { UNREFERENCED_PARAMETER(Context); return; @@ -5473,7 +5638,7 @@ FORCEINLINE ULONG NTAPI RtlTotalBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable) { return HashTable->TableSize; } @@ -5482,7 +5647,7 @@ FORCEINLINE ULONG NTAPI RtlNonEmptyBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable) { return HashTable->NonEmptyBuckets; } @@ -5491,7 +5656,7 @@ FORCEINLINE ULONG NTAPI RtlEmptyBucketsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable) { return HashTable->TableSize - HashTable->NonEmptyBuckets; } @@ -5500,7 +5665,7 @@ FORCEINLINE ULONG NTAPI RtlTotalEntriesHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable) { return HashTable->NumEntries; } @@ -5509,7 +5674,7 @@ FORCEINLINE ULONG NTAPI RtlActiveEnumeratorsHashTable( - IN PRTL_DYNAMIC_HASH_TABLE HashTable) + _In_ PRTL_DYNAMIC_HASH_TABLE HashTable) { return HashTable->NumEnumerators; } @@ -5524,12 +5689,13 @@ RtlActiveEnumeratorsHashTable( #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI SeSinglePrivilegeCheck( - IN LUID PrivilegeValue, - IN KPROCESSOR_MODE PreviousMode); + _In_ LUID PrivilegeValue, + _In_ KPROCESSOR_MODE PreviousMode); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -5539,124 +5705,138 @@ SeSinglePrivilegeCheck( ******************************************************************************/ +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwAllocateLocallyUniqueId( - OUT PLUID Luid); + _Out_ PLUID Luid); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwTerminateProcess( - IN HANDLE ProcessHandle OPTIONAL, - IN NTSTATUS ExitStatus); + _In_opt_ HANDLE ProcessHandle, + _In_ NTSTATUS ExitStatus); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenProcess( - OUT PHANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN PCLIENT_ID ClientId OPTIONAL); + _Out_ PHANDLE ProcessHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PCLIENT_ID ClientId); #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI ZwCancelTimer( - IN HANDLE TimerHandle, - OUT PBOOLEAN CurrentState OPTIONAL); + _In_ HANDLE TimerHandle, + _Out_opt_ PBOOLEAN CurrentState); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(return == 0, __drv_allocatesMem(TimerObject)) NTSTATUS NTAPI ZwCreateTimer( - OUT PHANDLE TimerHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN TIMER_TYPE TimerType); + _Out_ PHANDLE TimerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ TIMER_TYPE TimerType); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI ZwOpenTimer( - OUT PHANDLE TimerHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE TimerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetInformationThread( - IN HANDLE ThreadHandle, - IN THREADINFOCLASS ThreadInformationClass, - IN PVOID ThreadInformation, - IN ULONG ThreadInformationLength); + _In_ HANDLE ThreadHandle, + _In_ THREADINFOCLASS ThreadInformationClass, + _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation, + _In_ ULONG ThreadInformationLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI ZwSetTimer( - IN HANDLE TimerHandle, - IN PLARGE_INTEGER DueTime, - IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL, - IN PVOID TimerContext OPTIONAL, - IN BOOLEAN ResumeTimer, - IN LONG Period OPTIONAL, - OUT PBOOLEAN PreviousState OPTIONAL); + _In_ HANDLE TimerHandle, + _In_ PLARGE_INTEGER DueTime, + _In_opt_ PTIMER_APC_ROUTINE TimerApcRoutine, + _In_opt_ PVOID TimerContext, + _In_ BOOLEAN ResumeTimer, + _In_opt_ LONG Period, + _Out_opt_ PBOOLEAN PreviousState); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwDisplayString( - IN PUNICODE_STRING String); + _In_ PUNICODE_STRING String); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwPowerInformation( - IN POWER_INFORMATION_LEVEL PowerInformationLevel, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength); + _In_ POWER_INFORMATION_LEVEL PowerInformationLevel, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQueryVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FsInformation, + _In_ ULONG Length, + _In_ FS_INFORMATION_CLASS FsInformationClass); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG IoControlCode, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI ZwSetTimerEx( - IN HANDLE TimerHandle, - IN TIMER_SET_INFORMATION_CLASS TimerSetInformationClass, - IN OUT PVOID TimerSetInformation, - IN ULONG TimerSetInformationLength); + _In_ HANDLE TimerHandle, + _In_ TIMER_SET_INFORMATION_CLASS TimerSetInformationClass, + _Inout_updates_bytes_opt_(TimerSetInformationLength) PVOID TimerSetInformation, + _In_ ULONG TimerSetInformationLength); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -5701,7 +5881,7 @@ typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION { typedef NTSTATUS (__cdecl *PFNFTH)( - IN OUT PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo); + _Inout_ PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo); typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER { ULONG ProviderSignature; @@ -5712,7 +5892,7 @@ typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER { typedef ULONG_PTR (NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)( - IN PVOID Context); + _In_ PVOID Context); typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine; @@ -5775,11 +5955,12 @@ typedef struct _DRIVER_VERIFIER_THUNK_PAIRS { /* Filesystem runtime library routines */ #if (NTDDI_VERSION >= NTDDI_WIN2K) +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI FsRtlIsTotalDeviceFailure( - IN NTSTATUS Status); + _In_ NTSTATUS Status); #endif #ifdef __cplusplus diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 010c5931b32..259b93c4476 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -76,7 +76,11 @@ typedef struct _SID { UCHAR Revision; UCHAR SubAuthorityCount; SID_IDENTIFIER_AUTHORITY IdentifierAuthority; +#ifdef MIDL_PASS + [size_is(SubAuthorityCount)] ULONG SubAuthority[*]; +#else ULONG SubAuthority[ANYSIZE_ARRAY]; +#endif } SID, *PISID; #endif @@ -84,6 +88,10 @@ typedef struct _SID { #define SID_MAX_SUB_AUTHORITIES 15 #define SID_RECOMMENDED_SUB_AUTHORITIES 1 +#ifndef MIDL_PASS +#define SECURITY_MAX_SID_SIZE (sizeof(SID) - sizeof(ULONG) + (SID_MAX_SUB_AUTHORITIES * sizeof(ULONG))) +#endif + typedef enum _SID_NAME_USE { SidTypeUser = 1, SidTypeGroup, @@ -98,7 +106,11 @@ typedef enum _SID_NAME_USE { } SID_NAME_USE, *PSID_NAME_USE; typedef struct _SID_AND_ATTRIBUTES { +#ifdef MIDL_PASS + PISID Sid; +#else PSID Sid; +#endif ULONG Attributes; } SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES; typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY]; @@ -600,7 +612,11 @@ typedef struct _TOKEN_USER { typedef struct _TOKEN_GROUPS { ULONG GroupCount; +#ifdef MIDL_PASS + [size_is(GroupCount)] SID_AND_ATTRIBUTES Groups[*]; +#else SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY]; +#endif } TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS; typedef struct _TOKEN_PRIVILEGES { @@ -833,20 +849,26 @@ typedef enum _OBJECT_INFORMATION_CLASS { #define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information" +_Function_class_(RTL_ALLOCATE_STRING_ROUTINE) +_IRQL_requires_max_(PASSIVE_LEVEL) +__drv_allocatesMem(Mem) typedef PVOID (NTAPI *PRTL_ALLOCATE_STRING_ROUTINE)( - IN SIZE_T NumberOfBytes); + _In_ SIZE_T NumberOfBytes); #if _WIN32_WINNT >= 0x0600 +_Function_class_(RTL_REALLOCATE_STRING_ROUTINE) +_IRQL_requires_max_(PASSIVE_LEVEL) +__drv_allocatesMem(Mem) typedef PVOID (NTAPI *PRTL_REALLOCATE_STRING_ROUTINE)( - IN SIZE_T NumberOfBytes, + _In_ SIZE_T NumberOfBytes, IN PVOID Buffer); #endif typedef VOID (NTAPI *PRTL_FREE_STRING_ROUTINE)( - IN PVOID Buffer); + _In_ __drv_freesMem(Mem) _Post_invalid_ PVOID Buffer); extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine; extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine; @@ -855,11 +877,13 @@ extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine; extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine; #endif +_Function_class_(RTL_HEAP_COMMIT_ROUTINE) +_IRQL_requires_same_ typedef NTSTATUS -(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) ( - IN PVOID Base, - IN OUT PVOID *CommitAddress, - IN OUT PSIZE_T CommitSize); +(NTAPI *PRTL_HEAP_COMMIT_ROUTINE) ( + _In_ PVOID Base, + _Inout_ PVOID *CommitAddress, + _Inout_ PSIZE_T CommitSize); typedef struct _RTL_HEAP_PARAMETERS { ULONG Length; @@ -880,9 +904,9 @@ typedef struct _RTL_HEAP_PARAMETERS { typedef struct _GENERATE_NAME_CONTEXT { USHORT Checksum; BOOLEAN CheckSumInserted; - UCHAR NameLength; + _Field_range_(<=, 8) UCHAR NameLength; WCHAR NameBuffer[8]; - ULONG ExtensionLength; + _Field_range_(<=, 4) ULONG ExtensionLength; WCHAR ExtensionBuffer[4]; ULONG LastIndexValue; } GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT; @@ -938,553 +962,650 @@ typedef struct _COMPRESSED_DATA_INFO { #if (NTDDI_VERSION >= NTDDI_WIN2K) +_Must_inspect_result_ +_Ret_maybenull_ +_Post_writable_byte_size_(Size) NTSYSAPI PVOID NTAPI RtlAllocateHeap( - IN HANDLE HeapHandle, - IN ULONG Flags OPTIONAL, - IN SIZE_T Size); + _In_ HANDLE HeapHandle, + _In_opt_ ULONG Flags, + _In_ SIZE_T Size); +_Success_(return != 0) NTSYSAPI BOOLEAN NTAPI RtlFreeHeap( - IN PVOID HeapHandle, - IN ULONG Flags OPTIONAL, - IN PVOID BaseAddress); + _In_ PVOID HeapHandle, + _In_opt_ ULONG Flags, + _In_ _Post_invalid_ PVOID BaseAddress); NTSYSAPI VOID NTAPI RtlCaptureContext( - OUT PCONTEXT ContextRecord); + _Out_ PCONTEXT ContextRecord); +_Ret_range_(<, MAXLONG) NTSYSAPI ULONG NTAPI RtlRandom( - IN OUT PULONG Seed); + _Inout_ PULONG Seed); +_IRQL_requires_max_(APC_LEVEL) +_Success_(return != 0) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString( - OUT PUNICODE_STRING DestinationString, - IN PCWSTR SourceString); + _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)) + PUNICODE_STRING DestinationString, + _In_z_ PCWSTR SourceString); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlAppendStringToString( - IN OUT PSTRING Destination, - IN const STRING *Source); + _Inout_ PSTRING Destination, + _In_ const STRING *Source); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlOemStringToUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCOEM_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PUNICODE_STRING DestinationString, + _In_ PCOEM_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToOemString( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + POEM_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeStringToOemString( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + POEM_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlOemStringToCountedUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCOEM_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PUNICODE_STRING DestinationString, + _In_ PCOEM_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToCountedOemString( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + POEM_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeStringToCountedOemString( - IN OUT POEM_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + POEM_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(AllocateDestinationString, _Must_inspect_result_) NTSYSAPI NTSTATUS NTAPI RtlDowncaseUnicodeString( - IN OUT PUNICODE_STRING UniDest, - IN PCUNICODE_STRING UniSource, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(UniDest->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PUNICODE_STRING UniDest, + _In_ PCUNICODE_STRING UniSource, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI -RtlFreeOemString ( - IN OUT POEM_STRING OemString); +RtlFreeOemString( + _Inout_ _At_(OemString->Buffer, __drv_freesMem(Mem)) POEM_STRING OemString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI ULONG NTAPI RtlxUnicodeStringToOemSize( - IN PCUNICODE_STRING UnicodeString); + _In_ PCUNICODE_STRING UnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI ULONG NTAPI RtlxOemStringToUnicodeSize( - IN PCOEM_STRING OemString); + _In_ PCOEM_STRING OemString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlMultiByteToUnicodeN( - OUT PWCH UnicodeString, - IN ULONG MaxBytesInUnicodeString, - OUT PULONG BytesInUnicodeString OPTIONAL, - IN const CHAR *MultiByteString, - IN ULONG BytesInMultiByteString); + _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString, + _In_ ULONG MaxBytesInUnicodeString, + _Out_opt_ PULONG BytesInUnicodeString, + _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString, + _In_ ULONG BytesInMultiByteString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlMultiByteToUnicodeSize( - OUT PULONG BytesInUnicodeString, - IN const CHAR *MultiByteString, - IN ULONG BytesInMultiByteString); + _Out_ PULONG BytesInUnicodeString, + _In_reads_bytes_(BytesInMultiByteString) const CHAR *MultiByteString, + _In_ ULONG BytesInMultiByteString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUnicodeToMultiByteSize( - OUT PULONG BytesInMultiByteString, - IN PCWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _Out_ PULONG BytesInMultiByteString, + _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUnicodeToMultiByteN( - OUT PCHAR MultiByteString, - IN ULONG MaxBytesInMultiByteString, - OUT PULONG BytesInMultiByteString OPTIONAL, - IN PWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _Out_writes_bytes_to_(MaxBytesInMultiByteString, *BytesInMultiByteString) PCHAR MultiByteString, + _In_ ULONG MaxBytesInMultiByteString, + _Out_opt_ PULONG BytesInMultiByteString, + _In_reads_bytes_(BytesInUnicodeString) PWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeToMultiByteN( - OUT PCHAR MultiByteString, - IN ULONG MaxBytesInMultiByteString, - OUT PULONG BytesInMultiByteString OPTIONAL, - IN PCWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _Out_writes_bytes_to_(MaxBytesInMultiByteString, *BytesInMultiByteString) PCHAR MultiByteString, + _In_ ULONG MaxBytesInMultiByteString, + _Out_opt_ PULONG BytesInMultiByteString, + _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlOemToUnicodeN( - OUT PWSTR UnicodeString, - IN ULONG MaxBytesInUnicodeString, - OUT PULONG BytesInUnicodeString OPTIONAL, - IN PCCH OemString, - IN ULONG BytesInOemString); + _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWSTR UnicodeString, + _In_ ULONG MaxBytesInUnicodeString, + _Out_opt_ PULONG BytesInUnicodeString, + _In_reads_bytes_(BytesInOemString) PCCH OemString, + _In_ ULONG BytesInOemString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUnicodeToOemN( - OUT PCHAR OemString, - IN ULONG MaxBytesInOemString, - OUT PULONG BytesInOemString OPTIONAL, - IN PCWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _Out_writes_bytes_to_(MaxBytesInOemString, *BytesInOemString) PCHAR OemString, + _In_ ULONG MaxBytesInOemString, + _Out_opt_ PULONG BytesInOemString, + _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeToOemN( - OUT PCHAR OemString, - IN ULONG MaxBytesInOemString, - OUT PULONG BytesInOemString OPTIONAL, - IN PCWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _Out_writes_bytes_to_(MaxBytesInOemString, *BytesInOemString) PCHAR OemString, + _In_ ULONG MaxBytesInOemString, + _Out_opt_ PULONG BytesInOemString, + _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); #if (NTDDI_VERSION >= NTDDI_VISTASP1) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlGenerate8dot3Name( - IN PCUNICODE_STRING Name, - IN BOOLEAN AllowExtendedCharacters, - IN OUT PGENERATE_NAME_CONTEXT Context, - IN OUT PUNICODE_STRING Name8dot3); + _In_ PCUNICODE_STRING Name, + _In_ BOOLEAN AllowExtendedCharacters, + _Inout_ PGENERATE_NAME_CONTEXT Context, + _Inout_ PUNICODE_STRING Name8dot3); #else +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlGenerate8dot3Name( - IN PCUNICODE_STRING Name, - IN BOOLEAN AllowExtendedCharacters, - IN OUT PGENERATE_NAME_CONTEXT Context, - IN OUT PUNICODE_STRING Name8dot3); + _In_ PCUNICODE_STRING Name, + _In_ BOOLEAN AllowExtendedCharacters, + _Inout_ PGENERATE_NAME_CONTEXT Context, + _Inout_ PUNICODE_STRING Name8dot3); #endif +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlIsNameLegalDOS8Dot3( - IN PCUNICODE_STRING Name, - IN OUT POEM_STRING OemName OPTIONAL, - IN OUT PBOOLEAN NameContainsSpaces OPTIONAL); + _In_ PCUNICODE_STRING Name, + _Inout_opt_ POEM_STRING OemName, + _Out_opt_ PBOOLEAN NameContainsSpaces); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlIsValidOemCharacter( - IN OUT PWCHAR Char); + _Inout_ PWCHAR Char); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI PfxInitialize( - OUT PPREFIX_TABLE PrefixTable); + _Out_ PPREFIX_TABLE PrefixTable); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI BOOLEAN NTAPI PfxInsertPrefix( - IN PPREFIX_TABLE PrefixTable, - IN PSTRING Prefix, - OUT PPREFIX_TABLE_ENTRY PrefixTableEntry); + _In_ PPREFIX_TABLE PrefixTable, + _In_ __drv_aliasesMem PSTRING Prefix, + _Out_ PPREFIX_TABLE_ENTRY PrefixTableEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI PfxRemovePrefix( - IN PPREFIX_TABLE PrefixTable, - IN PPREFIX_TABLE_ENTRY PrefixTableEntry); + _In_ PPREFIX_TABLE PrefixTable, + _In_ PPREFIX_TABLE_ENTRY PrefixTableEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI PPREFIX_TABLE_ENTRY NTAPI PfxFindPrefix( - IN PPREFIX_TABLE PrefixTable, - IN PSTRING FullName); + _In_ PPREFIX_TABLE PrefixTable, + _In_ PSTRING FullName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlInitializeUnicodePrefix( - OUT PUNICODE_PREFIX_TABLE PrefixTable); + _Out_ PUNICODE_PREFIX_TABLE PrefixTable); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI BOOLEAN NTAPI RtlInsertUnicodePrefix( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN PUNICODE_STRING Prefix, - OUT PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry); + _In_ PUNICODE_PREFIX_TABLE PrefixTable, + _In_ __drv_aliasesMem PUNICODE_STRING Prefix, + _Out_ PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlRemoveUnicodePrefix( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry); + _In_ PUNICODE_PREFIX_TABLE PrefixTable, + _In_ PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI PUNICODE_PREFIX_TABLE_ENTRY NTAPI RtlFindUnicodePrefix( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN PUNICODE_STRING FullName, - IN ULONG CaseInsensitiveIndex); + _In_ PUNICODE_PREFIX_TABLE PrefixTable, + _In_ PUNICODE_STRING FullName, + _In_ ULONG CaseInsensitiveIndex); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI PUNICODE_PREFIX_TABLE_ENTRY NTAPI RtlNextUnicodePrefix( - IN PUNICODE_PREFIX_TABLE PrefixTable, - IN BOOLEAN Restart); + _In_ PUNICODE_PREFIX_TABLE PrefixTable, + _In_ BOOLEAN Restart); +_Must_inspect_result_ NTSYSAPI SIZE_T NTAPI RtlCompareMemoryUlong( - IN PVOID Source, - IN SIZE_T Length, - IN ULONG Pattern); + _In_reads_bytes_(Length) PVOID Source, + _In_ SIZE_T Length, + _In_ ULONG Pattern); +_Success_(return != 0) NTSYSAPI BOOLEAN NTAPI RtlTimeToSecondsSince1980( - IN PLARGE_INTEGER Time, - OUT PULONG ElapsedSeconds); + _In_ PLARGE_INTEGER Time, + _Out_ PULONG ElapsedSeconds); NTSYSAPI VOID NTAPI RtlSecondsSince1980ToTime( - IN ULONG ElapsedSeconds, - OUT PLARGE_INTEGER Time); + _In_ ULONG ElapsedSeconds, + _Out_ PLARGE_INTEGER Time); +_Success_(return != 0) NTSYSAPI BOOLEAN NTAPI RtlTimeToSecondsSince1970( - IN PLARGE_INTEGER Time, - OUT PULONG ElapsedSeconds); + _In_ PLARGE_INTEGER Time, + _Out_ PULONG ElapsedSeconds); NTSYSAPI VOID NTAPI RtlSecondsSince1970ToTime( - IN ULONG ElapsedSeconds, - OUT PLARGE_INTEGER Time); + _In_ ULONG ElapsedSeconds, + _Out_ PLARGE_INTEGER Time); +_IRQL_requires_max_(APC_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlValidSid( - IN PSID Sid); + _In_ PSID Sid); +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlEqualSid( - IN PSID Sid1, - IN PSID Sid2); + _In_ PSID Sid1, + _In_ PSID Sid2); +_IRQL_requires_max_(APC_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlEqualPrefixSid( - IN PSID Sid1, - IN PSID Sid2); + _In_ PSID Sid1, + _In_ PSID Sid2); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI ULONG NTAPI RtlLengthRequiredSid( - IN ULONG SubAuthorityCount); + _In_ ULONG SubAuthorityCount); NTSYSAPI PVOID NTAPI RtlFreeSid( - IN PSID Sid); + _In_ _Post_invalid_ PSID Sid); +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlAllocateAndInitializeSid( - IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, - IN UCHAR SubAuthorityCount, - IN ULONG SubAuthority0, - IN ULONG SubAuthority1, - IN ULONG SubAuthority2, - IN ULONG SubAuthority3, - IN ULONG SubAuthority4, - IN ULONG SubAuthority5, - IN ULONG SubAuthority6, - IN ULONG SubAuthority7, - OUT PSID *Sid); + _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, + _In_ UCHAR SubAuthorityCount, + _In_ ULONG SubAuthority0, + _In_ ULONG SubAuthority1, + _In_ ULONG SubAuthority2, + _In_ ULONG SubAuthority3, + _In_ ULONG SubAuthority4, + _In_ ULONG SubAuthority5, + _In_ ULONG SubAuthority6, + _In_ ULONG SubAuthority7, + _Outptr_ PSID *Sid); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlInitializeSid( - OUT PSID Sid, - IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, - IN UCHAR SubAuthorityCount); + _Out_ PSID Sid, + _In_ PSID_IDENTIFIER_AUTHORITY IdentifierAuthority, + _In_ UCHAR SubAuthorityCount); NTSYSAPI PULONG NTAPI RtlSubAuthoritySid( - IN PSID Sid, - IN ULONG SubAuthority); + _In_ PSID Sid, + _In_ ULONG SubAuthority); +_Post_satisfies_(return >= 8 && return <= SECURITY_MAX_SID_SIZE) NTSYSAPI ULONG NTAPI RtlLengthSid( - IN PSID Sid); + _In_ PSID Sid); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCopySid( - IN ULONG Length, - IN PSID Destination, - IN PSID Source); + _In_ ULONG Length, + _Out_writes_bytes_(Length) PSID Destination, + _In_ PSID Source); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlConvertSidToUnicodeString( - IN OUT PUNICODE_STRING UnicodeString, - IN PSID Sid, - IN BOOLEAN AllocateDestinationString); + _Inout_ PUNICODE_STRING UnicodeString, + _In_ PSID Sid, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI VOID NTAPI RtlCopyLuid( - OUT PLUID DestinationLuid, - IN PLUID SourceLuid); + _Out_ PLUID DestinationLuid, + _In_ PLUID SourceLuid); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCreateAcl( - OUT PACL Acl, - IN ULONG AclLength, - IN ULONG AclRevision); + _Out_writes_bytes_(AclLength) PACL Acl, + _In_ ULONG AclLength, + _In_ ULONG AclRevision); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlAddAce( - IN OUT PACL Acl, - IN ULONG AceRevision, - IN ULONG StartingAceIndex, - IN PVOID AceList, - IN ULONG AceListLength); + _Inout_ PACL Acl, + _In_ ULONG AceRevision, + _In_ ULONG StartingAceIndex, + _In_reads_bytes_(AceListLength) PVOID AceList, + _In_ ULONG AceListLength); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDeleteAce( - IN OUT PACL Acl, - IN ULONG AceIndex); + _Inout_ PACL Acl, + _In_ ULONG AceIndex); NTSYSAPI NTSTATUS NTAPI RtlGetAce( - IN PACL Acl, - IN ULONG AceIndex, - OUT PVOID *Ace); + _In_ PACL Acl, + _In_ ULONG AceIndex, + _Outptr_ PVOID *Ace); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlAddAccessAllowedAce( - IN OUT PACL Acl, - IN ULONG AceRevision, - IN ACCESS_MASK AccessMask, - IN PSID Sid); + _Inout_ PACL Acl, + _In_ ULONG AceRevision, + _In_ ACCESS_MASK AccessMask, + _In_ PSID Sid); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlAddAccessAllowedAceEx( - IN OUT PACL Acl, - IN ULONG AceRevision, - IN ULONG AceFlags, - IN ACCESS_MASK AccessMask, - IN PSID Sid); + _Inout_ PACL Acl, + _In_ ULONG AceRevision, + _In_ ULONG AceFlags, + _In_ ACCESS_MASK AccessMask, + _In_ PSID Sid); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCreateSecurityDescriptorRelative( - OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor, - IN ULONG Revision); + _Out_ PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor, + _In_ ULONG Revision); NTSYSAPI NTSTATUS NTAPI RtlGetDaclSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PBOOLEAN DaclPresent, - OUT PACL *Dacl, - OUT PBOOLEAN DaclDefaulted); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Out_ PBOOLEAN DaclPresent, + _Out_ PACL *Dacl, + _Out_ PBOOLEAN DaclDefaulted); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlSetOwnerSecurityDescriptor( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID Owner OPTIONAL, - IN BOOLEAN OwnerDefaulted); + _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSID Owner, + _In_opt_ BOOLEAN OwnerDefaulted); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlGetOwnerSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PSID *Owner, - OUT PBOOLEAN OwnerDefaulted); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Out_ PSID *Owner, + _Out_ PBOOLEAN OwnerDefaulted); +_IRQL_requires_max_(APC_LEVEL) +_When_(Status < 0, _Out_range_(>, 0)) +_When_(Status >= 0, _Out_range_(==, 0)) NTSYSAPI ULONG NTAPI RtlNtStatusToDosError( - IN NTSTATUS Status); + _In_ NTSTATUS Status); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCustomCPToUnicodeN( - IN PCPTABLEINFO CustomCP, - OUT PWCH UnicodeString, - IN ULONG MaxBytesInUnicodeString, - OUT PULONG BytesInUnicodeString OPTIONAL, - IN PCH CustomCPString, - IN ULONG BytesInCustomCPString); + _In_ PCPTABLEINFO CustomCP, + _Out_writes_bytes_to_(MaxBytesInUnicodeString, *BytesInUnicodeString) PWCH UnicodeString, + _In_ ULONG MaxBytesInUnicodeString, + _Out_opt_ PULONG BytesInUnicodeString, + _In_reads_bytes_(BytesInCustomCPString) PCH CustomCPString, + _In_ ULONG BytesInCustomCPString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUnicodeToCustomCPN( - IN PCPTABLEINFO CustomCP, - OUT PCH CustomCPString, - IN ULONG MaxBytesInCustomCPString, - OUT PULONG BytesInCustomCPString OPTIONAL, - IN PWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _In_ PCPTABLEINFO CustomCP, + _Out_writes_bytes_to_(MaxBytesInCustomCPString, *BytesInCustomCPString) PCH CustomCPString, + _In_ ULONG MaxBytesInCustomCPString, + _Out_opt_ PULONG BytesInCustomCPString, + _In_reads_bytes_(BytesInUnicodeString) PWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUpcaseUnicodeToCustomCPN( - IN PCPTABLEINFO CustomCP, - OUT PCH CustomCPString, - IN ULONG MaxBytesInCustomCPString, - OUT PULONG BytesInCustomCPString OPTIONAL, - IN PWCH UnicodeString, - IN ULONG BytesInUnicodeString); + _In_ PCPTABLEINFO CustomCP, + _Out_writes_bytes_to_(MaxBytesInCustomCPString, *BytesInCustomCPString) PCH CustomCPString, + _In_ ULONG MaxBytesInCustomCPString, + _Out_opt_ PULONG BytesInCustomCPString, + _In_reads_bytes_(BytesInUnicodeString) PWCH UnicodeString, + _In_ ULONG BytesInUnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlInitCodePageTable( - IN PUSHORT TableBase, - IN OUT PCPTABLEINFO CodePageTable); + _In_ PUSHORT TableBase, + _Inout_ PCPTABLEINFO CodePageTable); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -1494,181 +1615,197 @@ RtlInitCodePageTable( +_Must_inspect_result_ NTSYSAPI PVOID NTAPI RtlCreateHeap( - IN ULONG Flags, - IN PVOID HeapBase OPTIONAL, - IN SIZE_T ReserveSize OPTIONAL, - IN SIZE_T CommitSize OPTIONAL, - IN PVOID Lock OPTIONAL, - IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL); + _In_ ULONG Flags, + _In_opt_ PVOID HeapBase, + _In_opt_ SIZE_T ReserveSize, + _In_opt_ SIZE_T CommitSize, + _In_opt_ PVOID Lock, + _In_opt_ PRTL_HEAP_PARAMETERS Parameters); NTSYSAPI PVOID NTAPI RtlDestroyHeap( - IN PVOID HeapHandle); + _In_ _Post_invalid_ PVOID HeapHandle); NTSYSAPI USHORT NTAPI RtlCaptureStackBackTrace( - IN ULONG FramesToSkip, - IN ULONG FramesToCapture, - OUT PVOID *BackTrace, - OUT PULONG BackTraceHash OPTIONAL); + _In_ ULONG FramesToSkip, + _In_ ULONG FramesToCapture, + _Out_writes_to_(FramesToCapture, return) PVOID *BackTrace, + _Out_opt_ PULONG BackTraceHash); +_Ret_range_(<, MAXLONG) NTSYSAPI ULONG NTAPI RtlRandomEx( - IN OUT PULONG Seed); + _Inout_ PULONG Seed); +_IRQL_requires_max_(DISPATCH_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlInitUnicodeStringEx( - OUT PUNICODE_STRING DestinationString, - IN PCWSTR SourceString OPTIONAL); + _Out_ PUNICODE_STRING DestinationString, + _In_opt_z_ __drv_aliasesMem PCWSTR SourceString); +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlValidateUnicodeString( - IN ULONG Flags, - IN PCUNICODE_STRING String); + _In_ ULONG Flags, + _In_ PCUNICODE_STRING String); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlDuplicateUnicodeString( - IN ULONG Flags, - IN PCUNICODE_STRING SourceString, - OUT PUNICODE_STRING DestinationString); + _In_ ULONG Flags, + _In_ PCUNICODE_STRING SourceString, + _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem)) PUNICODE_STRING DestinationString); NTSYSAPI NTSTATUS NTAPI RtlGetCompressionWorkSpaceSize( - IN USHORT CompressionFormatAndEngine, - OUT PULONG CompressBufferWorkSpaceSize, - OUT PULONG CompressFragmentWorkSpaceSize); + _In_ USHORT CompressionFormatAndEngine, + _Out_ PULONG CompressBufferWorkSpaceSize, + _Out_ PULONG CompressFragmentWorkSpaceSize); NTSYSAPI NTSTATUS NTAPI RtlCompressBuffer( - IN USHORT CompressionFormatAndEngine, - IN PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - OUT PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN ULONG UncompressedChunkSize, - OUT PULONG FinalCompressedSize, - IN PVOID WorkSpace); + _In_ USHORT CompressionFormatAndEngine, + _In_reads_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer, + _In_ ULONG UncompressedBufferSize, + _Out_writes_bytes_to_(CompressedBufferSize, *FinalCompressedSize) PUCHAR CompressedBuffer, + _In_ ULONG CompressedBufferSize, + _In_ ULONG UncompressedChunkSize, + _Out_ PULONG FinalCompressedSize, + _In_ PVOID WorkSpace); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDecompressBuffer( - IN USHORT CompressionFormat, - OUT PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - OUT PULONG FinalUncompressedSize); + _In_ USHORT CompressionFormat, + _Out_writes_bytes_to_(UncompressedBufferSize, *FinalUncompressedSize) PUCHAR UncompressedBuffer, + _In_ ULONG UncompressedBufferSize, + _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer, + _In_ ULONG CompressedBufferSize, + _Out_ PULONG FinalUncompressedSize); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDecompressFragment( - IN USHORT CompressionFormat, - OUT PUCHAR UncompressedFragment, - IN ULONG UncompressedFragmentSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN ULONG FragmentOffset, - OUT PULONG FinalUncompressedSize, - IN PVOID WorkSpace); + _In_ USHORT CompressionFormat, + _Out_writes_bytes_to_(UncompressedFragmentSize, *FinalUncompressedSize) PUCHAR UncompressedFragment, + _In_ ULONG UncompressedFragmentSize, + _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer, + _In_ ULONG CompressedBufferSize, + _In_range_(<, CompressedBufferSize) ULONG FragmentOffset, + _Out_ PULONG FinalUncompressedSize, + _In_ PVOID WorkSpace); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDescribeChunk( - IN USHORT CompressionFormat, - IN OUT PUCHAR *CompressedBuffer, - IN PUCHAR EndOfCompressedBufferPlus1, - OUT PUCHAR *ChunkBuffer, - OUT PULONG ChunkSize); + _In_ USHORT CompressionFormat, + _Inout_ PUCHAR *CompressedBuffer, + _In_ PUCHAR EndOfCompressedBufferPlus1, + _Out_ PUCHAR *ChunkBuffer, + _Out_ PULONG ChunkSize); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlReserveChunk( - IN USHORT CompressionFormat, - IN OUT PUCHAR *CompressedBuffer, - IN PUCHAR EndOfCompressedBufferPlus1, - OUT PUCHAR *ChunkBuffer, - IN ULONG ChunkSize); + _In_ USHORT CompressionFormat, + _Inout_ PUCHAR *CompressedBuffer, + _In_ PUCHAR EndOfCompressedBufferPlus1, + _Out_ PUCHAR *ChunkBuffer, + _In_ ULONG ChunkSize); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDecompressChunks( - OUT PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - IN PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN PUCHAR CompressedTail, - IN ULONG CompressedTailSize, - IN PCOMPRESSED_DATA_INFO CompressedDataInfo); + _Out_writes_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer, + _In_ ULONG UncompressedBufferSize, + _In_reads_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer, + _In_ ULONG CompressedBufferSize, + _In_reads_bytes_(CompressedTailSize) PUCHAR CompressedTail, + _In_ ULONG CompressedTailSize, + _In_ PCOMPRESSED_DATA_INFO CompressedDataInfo); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCompressChunks( - IN PUCHAR UncompressedBuffer, - IN ULONG UncompressedBufferSize, - OUT PUCHAR CompressedBuffer, - IN ULONG CompressedBufferSize, - IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN PVOID WorkSpace); + _In_reads_bytes_(UncompressedBufferSize) PUCHAR UncompressedBuffer, + _In_ ULONG UncompressedBufferSize, + _Out_writes_bytes_(CompressedBufferSize) PUCHAR CompressedBuffer, + _In_range_(>=, (UncompressedBufferSize - (UncompressedBufferSize / 16))) ULONG CompressedBufferSize, + _Inout_updates_bytes_(CompressedDataInfoLength) PCOMPRESSED_DATA_INFO CompressedDataInfo, + _In_range_(>, sizeof(COMPRESSED_DATA_INFO)) ULONG CompressedDataInfoLength, + _In_ PVOID WorkSpace); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI PSID_IDENTIFIER_AUTHORITY NTAPI RtlIdentifierAuthoritySid( - IN PSID Sid); + _In_ PSID Sid); NTSYSAPI PUCHAR NTAPI RtlSubAuthorityCountSid( - IN PSID Sid); + _In_ PSID Sid); +_When_(Status < 0, _Out_range_(>, 0)) +_When_(Status >= 0, _Out_range_(==, 0)) NTSYSAPI ULONG NTAPI RtlNtStatusToDosErrorNoTeb( - IN NTSTATUS Status); + _In_ NTSTATUS Status); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCreateSystemVolumeInformationFolder( - IN PCUNICODE_STRING VolumeRootPath); + _In_ PCUNICODE_STRING VolumeRootPath); #if defined(_M_AMD64) FORCEINLINE VOID -RtlFillMemoryUlong ( - OUT PVOID Destination, - IN SIZE_T Length, - IN ULONG Pattern) +RtlFillMemoryUlong( + _Out_writes_bytes_all_(Length) PVOID Destination, + _In_ SIZE_T Length, + _In_ ULONG Pattern) { PULONG Address = (PULONG)Destination; if ((Length /= 4) != 0) { @@ -1702,73 +1839,79 @@ NTSYSAPI VOID NTAPI RtlFillMemoryUlonglong( - OUT PVOID Destination, - IN SIZE_T Length, - IN ULONGLONG Pattern); + _Out_writes_bytes_all_(Length) PVOID Destination, + _In_ SIZE_T Length, + _In_ ULONGLONG Pattern); #endif /* defined(_M_AMD64) */ #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_WS03) +_IRQL_requires_max_(DISPATCH_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlInitAnsiStringEx( - OUT PANSI_STRING DestinationString, - IN PCSZ SourceString OPTIONAL); + _Out_ PANSI_STRING DestinationString, + _In_opt_z_ __drv_aliasesMem PCSZ SourceString); #endif #if (NTDDI_VERSION >= NTDDI_WS03SP1) +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlGetSaclSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PBOOLEAN SaclPresent, - OUT PACL *Sacl, - OUT PBOOLEAN SaclDefaulted); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Out_ PBOOLEAN SaclPresent, + _Out_ PACL *Sacl, + _Out_ PBOOLEAN SaclDefaulted); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlSetGroupSecurityDescriptor( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID Group OPTIONAL, - IN BOOLEAN GroupDefaulted OPTIONAL); + _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSID Group, + _In_opt_ BOOLEAN GroupDefaulted); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlGetGroupSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - OUT PSID *Group, - OUT PBOOLEAN GroupDefaulted); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Out_ PSID *Group, + _Out_ PBOOLEAN GroupDefaulted); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlAbsoluteToSelfRelativeSD( - IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor, - OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor OPTIONAL, - IN OUT PULONG BufferLength); + _In_ PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor, + _Out_writes_bytes_to_opt_(*BufferLength, *BufferLength) PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor, + _Inout_ PULONG BufferLength); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlSelfRelativeToAbsoluteSD( - IN PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor, - OUT PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor OPTIONAL, - IN OUT PULONG AbsoluteSecurityDescriptorSize, - OUT PACL Dacl OPTIONAL, - IN OUT PULONG DaclSize, - OUT PACL Sacl OPTIONAL, - IN OUT PULONG SaclSize, - OUT PSID Owner OPTIONAL, - IN OUT PULONG OwnerSize, - OUT PSID PrimaryGroup OPTIONAL, - IN OUT PULONG PrimaryGroupSize); + _In_ PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor, + _Out_writes_bytes_to_opt_(*AbsoluteSecurityDescriptorSize, *AbsoluteSecurityDescriptorSize) PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor, + _Inout_ PULONG AbsoluteSecurityDescriptorSize, + _Out_writes_bytes_to_opt_(*DaclSize, *DaclSize) PACL Dacl, + _Inout_ PULONG DaclSize, + _Out_writes_bytes_to_opt_(*SaclSize, *SaclSize) PACL Sacl, + _Inout_ PULONG SaclSize, + _Out_writes_bytes_to_opt_(*OwnerSize, *OwnerSize) PSID Owner, + _Inout_ PULONG OwnerSize, + _Out_writes_bytes_to_opt_(*PrimaryGroupSize, *PrimaryGroupSize) PSID PrimaryGroup, + _Inout_ PULONG PrimaryGroupSize); #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ @@ -1778,30 +1921,30 @@ NTSYSAPI NTSTATUS NTAPI RtlNormalizeString( - IN ULONG NormForm, - IN PCWSTR SourceString, - IN LONG SourceStringLength, - OUT PWSTR DestinationString, - IN OUT PLONG DestinationStringLength); + _In_ ULONG NormForm, + _In_ PCWSTR SourceString, + _In_ LONG SourceStringLength, + _Out_writes_to_(*DestinationStringLength, *DestinationStringLength) PWSTR DestinationString, + _Inout_ PLONG DestinationStringLength); NTSYSAPI NTSTATUS NTAPI RtlIsNormalizedString( - IN ULONG NormForm, - IN PCWSTR SourceString, - IN LONG SourceStringLength, - OUT PBOOLEAN Normalized); + _In_ ULONG NormForm, + _In_ PCWSTR SourceString, + _In_ LONG SourceStringLength, + _Out_ PBOOLEAN Normalized); NTSYSAPI NTSTATUS NTAPI RtlIdnToAscii( - IN ULONG Flags, - IN PCWSTR SourceString, - IN LONG SourceStringLength, - OUT PWSTR DestinationString, - IN OUT PLONG DestinationStringLength); + _In_ ULONG Flags, + _In_ PCWSTR SourceString, + _In_ LONG SourceStringLength, + _Out_writes_to_(*DestinationStringLength, *DestinationStringLength) PWSTR DestinationString, + _Inout_ PLONG DestinationStringLength); NTSYSAPI NTSTATUS @@ -1817,69 +1960,74 @@ NTSYSAPI NTSTATUS NTAPI RtlIdnToNameprepUnicode( - IN ULONG Flags, - IN PCWSTR SourceString, - IN LONG SourceStringLength, - OUT PWSTR DestinationString, - IN OUT PLONG DestinationStringLength); + _In_ ULONG Flags, + _In_ PCWSTR SourceString, + _In_ LONG SourceStringLength, + _Out_writes_to_(*DestinationStringLength, *DestinationStringLength) PWSTR DestinationString, + _Inout_ PLONG DestinationStringLength); NTSYSAPI NTSTATUS NTAPI RtlCreateServiceSid( - IN PUNICODE_STRING ServiceName, - OUT PSID ServiceSid, - IN OUT PULONG ServiceSidLength); + _In_ PUNICODE_STRING ServiceName, + _Out_writes_bytes_opt_(*ServiceSidLength) PSID ServiceSid, + _Inout_ PULONG ServiceSidLength); NTSYSAPI LONG NTAPI RtlCompareAltitudes( - IN PCUNICODE_STRING Altitude1, - IN PCUNICODE_STRING Altitude2); + _In_ PCUNICODE_STRING Altitude1, + _In_ PCUNICODE_STRING Altitude2); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUnicodeToUTF8N( - OUT PCHAR UTF8StringDestination, - IN ULONG UTF8StringMaxByteCount, - OUT PULONG UTF8StringActualByteCount, - IN PCWCH UnicodeStringSource, - IN ULONG UnicodeStringByteCount); + _Out_writes_bytes_to_(UTF8StringMaxByteCount, *UTF8StringActualByteCount) PCHAR UTF8StringDestination, + _In_ ULONG UTF8StringMaxByteCount, + _Out_ PULONG UTF8StringActualByteCount, + _In_reads_bytes_(UnicodeStringByteCount) PCWCH UnicodeStringSource, + _In_ ULONG UnicodeStringByteCount); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUTF8ToUnicodeN( - OUT PWSTR UnicodeStringDestination, - IN ULONG UnicodeStringMaxByteCount, - OUT PULONG UnicodeStringActualByteCount, - IN PCCH UTF8StringSource, - IN ULONG UTF8StringByteCount); + _Out_writes_bytes_to_(UnicodeStringMaxByteCount, *UnicodeStringActualByteCount) PWSTR UnicodeStringDestination, + _In_ ULONG UnicodeStringMaxByteCount, + _Out_ PULONG UnicodeStringActualByteCount, + _In_reads_bytes_(UTF8StringByteCount) PCCH UTF8StringSource, + _In_ ULONG UTF8StringByteCount); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlReplaceSidInSd( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID OldSid, - IN PSID NewSid, - OUT ULONG *NumChanges); + _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PSID OldSid, + _In_ PSID NewSid, + _Out_ ULONG *NumChanges); NTSYSAPI NTSTATUS NTAPI RtlCreateVirtualAccountSid( - IN PCUNICODE_STRING Name, - IN ULONG BaseSubAuthority, - OUT PSID Sid, - IN OUT PULONG SidLength); + _In_ PCUNICODE_STRING Name, + _In_ ULONG BaseSubAuthority, + _Out_writes_bytes_(*SidLength) PSID Sid, + _Inout_ PULONG SidLength); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -1913,529 +2061,601 @@ RtlCreateVirtualAccountSid( #define RtlOffsetToPointer(B,O) ((PCHAR)(((PCHAR)(B)) + ((ULONG_PTR)(O)))) #define RtlPointerToOffset(B,P) ((ULONG)(((PCHAR)(P)) - ((PCHAR)(B)))) +_IRQL_requires_max_(PASSIVE_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryObject( - IN HANDLE Handle OPTIONAL, - IN OBJECT_INFORMATION_CLASS ObjectInformationClass, - OUT PVOID ObjectInformation OPTIONAL, - IN ULONG ObjectInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_opt_ HANDLE Handle, + _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass, + _Out_writes_bytes_opt_(ObjectInformationLength) PVOID ObjectInformation, + _In_ ULONG ObjectInformationLength, + _Out_opt_ PULONG ReturnLength); #if (NTDDI_VERSION >= NTDDI_WIN2K) +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenThreadToken( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - OUT PHANDLE TokenHandle); + _In_ HANDLE ThreadHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ BOOLEAN OpenAsSelf, + _Out_ PHANDLE TokenHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenProcessToken( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE TokenHandle); + _In_ HANDLE ProcessHandle, + _In_ ACCESS_MASK DesiredAccess, + _Out_ PHANDLE TokenHandle); +_When_(TokenInformationClass == TokenAccessInformation, + _At_(TokenInformationLength, + _In_range_(>=, sizeof(TOKEN_ACCESS_INFORMATION)))) +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation OPTIONAL, - IN ULONG TokenInformationLength, - OUT PULONG ReturnLength); + _In_ HANDLE TokenHandle, + _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, + _Out_writes_bytes_to_opt_(TokenInformationLength, *ReturnLength) PVOID TokenInformation, + _In_ ULONG TokenInformationLength, + _Out_ PULONG ReturnLength); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAdjustPrivilegesToken( - IN HANDLE TokenHandle, - IN BOOLEAN DisableAllPrivileges, - IN PTOKEN_PRIVILEGES NewState OPTIONAL, - IN ULONG BufferLength, - OUT PTOKEN_PRIVILEGES PreviousState, - OUT PULONG ReturnLength OPTIONAL); + _In_ HANDLE TokenHandle, + _In_ BOOLEAN DisableAllPrivileges, + _In_opt_ PTOKEN_PRIVILEGES NewState, + _In_ ULONG BufferLength, + _Out_writes_bytes_to_opt_(BufferLength, *ReturnLength) PTOKEN_PRIVILEGES PreviousState, + _Out_ _When_(PreviousState == NULL, _Out_opt_) PULONG ReturnLength); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCreateFile( - 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 CreateDisposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer, - IN ULONG EaLength); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG CreateDisposition, + _In_ ULONG CreateOptions, + _In_reads_bytes_opt_(EaLength) PVOID EaBuffer, + _In_ ULONG EaLength); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtDeviceIoControlFile( - 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG IoControlCode, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtFsControlFile( - 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG FsControlCode, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtLockFile( - 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ PLARGE_INTEGER ByteOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key, + _In_ BOOLEAN FailImmediately, + _In_ BOOLEAN ExclusiveLock); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenFile( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG ShareAccess, - IN ULONG OpenOptions); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG ShareAccess, + _In_ ULONG OpenOptions); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryDirectoryFile( - 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass, + _In_ BOOLEAN ReturnSingleEntry, + _In_opt_ PUNICODE_STRING FileName, + _In_ BOOLEAN RestartScan); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryQuotaInformationFile( - 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); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_ BOOLEAN ReturnSingleEntry, + _In_reads_bytes_opt_(SidListLength) PVOID SidList, + _In_ ULONG SidListLength, + _In_reads_bytes_opt_((8 + (4 * ((SID *)StartSid)->SubAuthorityCount))) PSID StartSid, + _In_ BOOLEAN RestartScan); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FsInformation, + _In_ ULONG Length, + _In_ FS_INFORMATION_CLASS FsInformationClass); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtReadFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_opt_ PLARGE_INTEGER ByteOffset, + _In_opt_ PULONG Key); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID FsInformation, + _In_ ULONG Length, + _In_ FS_INFORMATION_CLASS FsInformationClass); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtWriteFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_opt_ PLARGE_INTEGER ByteOffset, + _In_opt_ PULONG Key); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtUnlockFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER ByteOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ PLARGE_INTEGER ByteOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key); +_IRQL_requires_max_(PASSIVE_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetSecurityObject( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ HANDLE Handle, + _In_ SECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); +_IRQL_requires_max_(PASSIVE_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQuerySecurityObject( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Length, - OUT PULONG LengthNeeded); + _In_ HANDLE Handle, + _In_ SECURITY_INFORMATION SecurityInformation, + _Out_writes_bytes_opt_(Length) PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ ULONG Length, + _Out_ PULONG LengthNeeded); +_IRQL_requires_max_(PASSIVE_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtClose( - IN HANDLE Handle); + _In_ HANDLE Handle); +_Must_inspect_result_ +__drv_allocatesMem(Mem) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAllocateVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN OUT PSIZE_T RegionSize, - IN ULONG AllocationType, - IN ULONG Protect); + _In_ HANDLE ProcessHandle, + _Outptr_result_bytebuffer_(*RegionSize) PVOID *BaseAddress, + _In_ ULONG_PTR ZeroBits, + _Inout_ PSIZE_T RegionSize, + _In_ ULONG AllocationType, + _In_ ULONG Protect); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtFreeVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - IN ULONG FreeType); + _In_ HANDLE ProcessHandle, + _Inout_ __drv_freesMem(Mem) PVOID *BaseAddress, + _Inout_ PSIZE_T RegionSize, + _In_ ULONG FreeType); #endif #if (NTDDI_VERSION >= NTDDI_WINXP) +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenThreadTokenEx( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); + _In_ HANDLE ThreadHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ BOOLEAN OpenAsSelf, + _In_ ULONG HandleAttributes, + _Out_ PHANDLE TokenHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenProcessTokenEx( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); + _In_ HANDLE ProcessHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG HandleAttributes, + _Out_ PHANDLE TokenHandle); +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI NtOpenJobObjectToken( - IN HANDLE JobHandle, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE TokenHandle); + _In_ HANDLE JobHandle, + _In_ ACCESS_MASK DesiredAccess, + _Out_ PHANDLE TokenHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtDuplicateToken( - IN HANDLE ExistingTokenHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN EffectiveOnly, - IN TOKEN_TYPE TokenType, - OUT PHANDLE NewTokenHandle); + _In_ HANDLE ExistingTokenHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ BOOLEAN EffectiveOnly, + _In_ TOKEN_TYPE TokenType, + _Out_ PHANDLE NewTokenHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtFilterToken( - IN HANDLE ExistingTokenHandle, - IN ULONG Flags, - IN PTOKEN_GROUPS SidsToDisable OPTIONAL, - IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL, - IN PTOKEN_GROUPS RestrictedSids OPTIONAL, - OUT PHANDLE NewTokenHandle); + _In_ HANDLE ExistingTokenHandle, + _In_ ULONG Flags, + _In_opt_ PTOKEN_GROUPS SidsToDisable, + _In_opt_ PTOKEN_PRIVILEGES PrivilegesToDelete, + _In_opt_ PTOKEN_GROUPS RestrictedSids, + _Out_ PHANDLE NewTokenHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtImpersonateAnonymousToken( - IN HANDLE ThreadHandle); + _In_ HANDLE ThreadHandle); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - IN PVOID TokenInformation, - IN ULONG TokenInformationLength); + _In_ HANDLE TokenHandle, + _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, + _In_reads_bytes_(TokenInformationLength) PVOID TokenInformation, + _In_ ULONG TokenInformationLength); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAdjustGroupsToken( - IN HANDLE TokenHandle, - IN BOOLEAN ResetToDefault, - IN PTOKEN_GROUPS NewState OPTIONAL, - IN ULONG BufferLength OPTIONAL, - OUT PTOKEN_GROUPS PreviousState, - OUT PULONG ReturnLength); + _In_ HANDLE TokenHandle, + _In_ BOOLEAN ResetToDefault, + _In_opt_ PTOKEN_GROUPS NewState, + _In_opt_ ULONG BufferLength, + _Out_writes_bytes_to_opt_(BufferLength, *ReturnLength) PTOKEN_GROUPS PreviousState, + _Out_ PULONG ReturnLength); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrivilegeCheck( - IN HANDLE ClientToken, - IN OUT PPRIVILEGE_SET RequiredPrivileges, - OUT PBOOLEAN Result); + _In_ HANDLE ClientToken, + _Inout_ PPRIVILEGE_SET RequiredPrivileges, + _Out_ PBOOLEAN Result); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAccessCheckAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ACCESS_MASK DesiredAccess, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ PUNICODE_STRING ObjectTypeName, + _In_ PUNICODE_STRING ObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ ACCESS_MASK DesiredAccess, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ BOOLEAN ObjectCreation, + _Out_ PACCESS_MASK GrantedAccess, + _Out_ PNTSTATUS AccessStatus, + _Out_ PBOOLEAN GenerateOnClose); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAccessCheckByTypeAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL, - IN ULONG ObjectTypeLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ PUNICODE_STRING ObjectTypeName, + _In_ PUNICODE_STRING ObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSID PrincipalSelfSid, + _In_ ACCESS_MASK DesiredAccess, + _In_ AUDIT_EVENT_TYPE AuditType, + _In_ ULONG Flags, + _In_reads_opt_(ObjectTypeLength) POBJECT_TYPE_LIST ObjectTypeList, + _In_ ULONG ObjectTypeLength, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ BOOLEAN ObjectCreation, + _Out_ PACCESS_MASK GrantedAccess, + _Out_ PNTSTATUS AccessStatus, + _Out_ PBOOLEAN GenerateOnClose); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtAccessCheckByTypeResultListAndAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL, - IN ULONG ObjectTypeLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ PUNICODE_STRING ObjectTypeName, + _In_ PUNICODE_STRING ObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSID PrincipalSelfSid, + _In_ ACCESS_MASK DesiredAccess, + _In_ AUDIT_EVENT_TYPE AuditType, + _In_ ULONG Flags, + _In_reads_opt_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList, + _In_ ULONG ObjectTypeListLength, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ BOOLEAN ObjectCreation, + _Out_writes_(ObjectTypeListLength) PACCESS_MASK GrantedAccess, + _Out_writes_(ObjectTypeListLength) PNTSTATUS AccessStatus, + _Out_ PBOOLEAN GenerateOnClose); +_Must_inspect_result_ +__kernel_entry +NTSYSCALLAPI NTSTATUS NTAPI NtAccessCheckByTypeResultListAndAuditAlarmByHandle( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN HANDLE ClientToken, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSID PrincipalSelfSid OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN AUDIT_EVENT_TYPE AuditType, - IN ULONG Flags, - IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL, - IN ULONG ObjectTypeLength, - IN PGENERIC_MAPPING GenericMapping, - IN BOOLEAN ObjectCreation, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ HANDLE ClientToken, + _In_ PUNICODE_STRING ObjectTypeName, + _In_ PUNICODE_STRING ObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSID PrincipalSelfSid, + _In_ ACCESS_MASK DesiredAccess, + _In_ AUDIT_EVENT_TYPE AuditType, + _In_ ULONG Flags, + _In_reads_opt_(ObjectTypeListLength) POBJECT_TYPE_LIST ObjectTypeList, + _In_ ULONG ObjectTypeListLength, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ BOOLEAN ObjectCreation, + _Out_writes_(ObjectTypeListLength) PACCESS_MASK GrantedAccess, + _Out_writes_(ObjectTypeListLength) PNTSTATUS AccessStatus, + _Out_ PBOOLEAN GenerateOnClose); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenObjectAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN PUNICODE_STRING ObjectTypeName, - IN PUNICODE_STRING ObjectName, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, - IN HANDLE ClientToken, - IN ACCESS_MASK DesiredAccess, - IN ACCESS_MASK GrantedAccess, - IN PPRIVILEGE_SET Privileges OPTIONAL, - IN BOOLEAN ObjectCreation, - IN BOOLEAN AccessGranted, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ PUNICODE_STRING ObjectTypeName, + _In_ PUNICODE_STRING ObjectName, + _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ HANDLE ClientToken, + _In_ ACCESS_MASK DesiredAccess, + _In_ ACCESS_MASK GrantedAccess, + _In_opt_ PPRIVILEGE_SET Privileges, + _In_ BOOLEAN ObjectCreation, + _In_ BOOLEAN AccessGranted, + _Out_ PBOOLEAN GenerateOnClose); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrivilegeObjectAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN HANDLE ClientToken, - IN ACCESS_MASK DesiredAccess, - IN PPRIVILEGE_SET Privileges, - IN BOOLEAN AccessGranted); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ HANDLE ClientToken, + _In_ ACCESS_MASK DesiredAccess, + _In_ PPRIVILEGE_SET Privileges, + _In_ BOOLEAN AccessGranted); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCloseObjectAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN BOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ BOOLEAN GenerateOnClose); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtDeleteObjectAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PVOID HandleId OPTIONAL, - IN BOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING SubsystemName, + _In_opt_ PVOID HandleId, + _In_ BOOLEAN GenerateOnClose); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrivilegedServiceAuditAlarm( - IN PUNICODE_STRING SubsystemName, - IN PUNICODE_STRING ServiceName, - IN HANDLE ClientToken, - IN PPRIVILEGE_SET Privileges, - IN BOOLEAN AccessGranted); + _In_ PUNICODE_STRING SubsystemName, + _In_ PUNICODE_STRING ServiceName, + _In_ HANDLE ClientToken, + _In_ PPRIVILEGE_SET Privileges, + _In_ BOOLEAN AccessGranted); +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationThread( - IN HANDLE ThreadHandle, - IN THREADINFOCLASS ThreadInformationClass, - IN PVOID ThreadInformation, - IN ULONG ThreadInformationLength); + _In_ HANDLE ThreadHandle, + _In_ THREADINFOCLASS ThreadInformationClass, + _In_reads_bytes_(ThreadInformationLength) PVOID ThreadInformation, + _In_ ULONG ThreadInformationLength); +_Must_inspect_result_ +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCreateSection( - 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); + _Out_ PHANDLE SectionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PLARGE_INTEGER MaximumSize, + _In_ ULONG SectionPageProtection, + _In_ ULONG AllocationAttributes, + _In_opt_ HANDLE FileHandle); #endif @@ -2484,35 +2704,40 @@ typedef enum _SECURITY_LOGON_TYPE { #endif /* _NTLSA_AUDIT_ */ +_IRQL_requires_same_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI LsaRegisterLogonProcess( - IN PLSA_STRING LogonProcessName, - OUT PHANDLE LsaHandle, - OUT PLSA_OPERATIONAL_MODE SecurityMode); + _In_ PLSA_STRING LogonProcessName, + _Out_ PHANDLE LsaHandle, + _Out_ PLSA_OPERATIONAL_MODE SecurityMode); +_IRQL_requires_same_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI LsaLogonUser( - IN HANDLE LsaHandle, - IN PLSA_STRING OriginName, - IN SECURITY_LOGON_TYPE LogonType, - IN ULONG AuthenticationPackage, - IN PVOID AuthenticationInformation, - IN ULONG AuthenticationInformationLength, - IN PTOKEN_GROUPS LocalGroups OPTIONAL, - IN PTOKEN_SOURCE SourceContext, - OUT PVOID *ProfileBuffer, - OUT PULONG ProfileBufferLength, - OUT PLUID LogonId, - OUT PHANDLE Token, - OUT PQUOTA_LIMITS Quotas, - OUT PNTSTATUS SubStatus); + _In_ HANDLE LsaHandle, + _In_ PLSA_STRING OriginName, + _In_ SECURITY_LOGON_TYPE LogonType, + _In_ ULONG AuthenticationPackage, + _In_reads_bytes_(AuthenticationInformationLength) PVOID AuthenticationInformation, + _In_ ULONG AuthenticationInformationLength, + _In_opt_ PTOKEN_GROUPS LocalGroups, + _In_ PTOKEN_SOURCE SourceContext, + _Out_ PVOID *ProfileBuffer, + _Out_ PULONG ProfileBufferLength, + _Inout_ PLUID LogonId, + _Out_ PHANDLE Token, + _Out_ PQUOTA_LIMITS Quotas, + _Out_ PNTSTATUS SubStatus); +_IRQL_requires_same_ NTSTATUS NTAPI LsaFreeReturnBuffer( - IN PVOID Buffer); + _In_ PVOID Buffer); #ifndef _NTLSA_IFS_ #define _NTLSA_IFS_ @@ -4596,8 +4821,8 @@ typedef struct _REMOTE_LINK_TRACKING_INFORMATION { typedef VOID (NTAPI *PDRIVER_FS_NOTIFICATION) ( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN FsActive); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN FsActive); typedef enum _FS_FILTER_SECTION_SYNC_TYPE { SyncTypeOther = 0, @@ -4652,14 +4877,14 @@ typedef struct _FS_FILTER_CALLBACK_DATA { typedef NTSTATUS (NTAPI *PFS_FILTER_CALLBACK) ( - IN PFS_FILTER_CALLBACK_DATA Data, - OUT PVOID *CompletionContext); + _In_ PFS_FILTER_CALLBACK_DATA Data, + _Out_ PVOID *CompletionContext); typedef VOID (NTAPI *PFS_FILTER_COMPLETION_CALLBACK) ( - IN PFS_FILTER_CALLBACK_DATA Data, - IN NTSTATUS OperationStatus, - IN PVOID CompletionContext); + _In_ PFS_FILTER_CALLBACK_DATA Data, + _In_ NTSTATUS OperationStatus, + _In_ PVOID CompletionContext); typedef struct _FS_FILTER_CALLBACKS { ULONG SizeOfFsFilterCallbacks; @@ -4683,8 +4908,8 @@ NTKERNELAPI NTSTATUS NTAPI FsRtlRegisterFileSystemFilterCallbacks( - IN struct _DRIVER_OBJECT *FilterDriverObject, - IN PFS_FILTER_CALLBACKS Callbacks); + _In_ struct _DRIVER_OBJECT *FilterDriverObject, + _In_ PFS_FILTER_CALLBACKS Callbacks); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_VISTA) @@ -4692,10 +4917,10 @@ NTKERNELAPI NTSTATUS NTAPI FsRtlNotifyStreamFileObject( - IN struct _FILE_OBJECT * StreamFileObject, - IN struct _DEVICE_OBJECT *DeviceObjectHint OPTIONAL, - IN FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType, - IN BOOLEAN SafeToRecurse); + _In_ struct _FILE_OBJECT * StreamFileObject, + _In_opt_ struct _DEVICE_OBJECT *DeviceObjectHint, + _In_ FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType, + _In_ BOOLEAN SafeToRecurse); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #define DO_VERIFY_VOLUME 0x00000002 @@ -4787,13 +5012,13 @@ typedef struct _KQUEUE { NTSTATUS NTAPI KeGetProcessorNumberFromIndex( - IN ULONG ProcIndex, - OUT PPROCESSOR_NUMBER ProcNumber); + _In_ ULONG ProcIndex, + _Out_ PPROCESSOR_NUMBER ProcNumber); ULONG NTAPI KeGetProcessorIndexFromNumber( - IN PPROCESSOR_NUMBER ProcNumber); + _In_ PPROCESSOR_NUMBER ProcNumber); #if (NTDDI_VERSION >= NTDDI_WIN2K) @@ -4804,114 +5029,140 @@ NTKERNELAPI VOID NTAPI KeInitializeMutant( - OUT PRKMUTANT Mutant, - IN BOOLEAN InitialOwner); + _Out_ PRKMUTANT Mutant, + _In_ BOOLEAN InitialOwner); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeReadStateMutant( - IN PRKMUTANT Mutant); + _In_ PRKMUTANT Mutant); +_When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(Wait==1, _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI LONG NTAPI KeReleaseMutant( - IN OUT PRKMUTANT Mutant, - IN KPRIORITY Increment, - IN BOOLEAN Abandoned, - IN BOOLEAN Wait); + _Inout_ PRKMUTANT Mutant, + _In_ KPRIORITY Increment, + _In_ BOOLEAN Abandoned, + _In_ BOOLEAN Wait); NTKERNELAPI VOID NTAPI KeInitializeQueue( - OUT PRKQUEUE Queue, - IN ULONG Count); + _Out_ PRKQUEUE Queue, + _In_ ULONG Count); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeReadStateQueue( - IN PRKQUEUE Queue); + _In_ PRKQUEUE Queue); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeInsertQueue( - IN OUT PRKQUEUE Queue, - IN OUT PLIST_ENTRY Entry); + _Inout_ PRKQUEUE Queue, + _Inout_ PLIST_ENTRY Entry); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeInsertHeadQueue( - IN OUT PRKQUEUE Queue, - IN OUT PLIST_ENTRY Entry); + _Inout_ PRKQUEUE Queue, + _Inout_ PLIST_ENTRY Entry); +_IRQL_requires_min_(PASSIVE_LEVEL) +_When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL)) +_When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL)) NTKERNELAPI PLIST_ENTRY NTAPI KeRemoveQueue( - IN OUT PRKQUEUE Queue, - IN KPROCESSOR_MODE WaitMode, - IN PLARGE_INTEGER Timeout OPTIONAL); + _Inout_ PRKQUEUE Queue, + _In_ KPROCESSOR_MODE WaitMode, + _In_opt_ PLARGE_INTEGER Timeout); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeAttachProcess( - IN OUT PKPROCESS Process); + _Inout_ PKPROCESS Process); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI -KeDetachProcess( - VOID); +KeDetachProcess(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PLIST_ENTRY NTAPI KeRundownQueue( - IN OUT PRKQUEUE Queue); + _Inout_ PRKQUEUE Queue); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeStackAttachProcess( - IN OUT PKPROCESS Process, - OUT PKAPC_STATE ApcState); + _Inout_ PKPROCESS Process, + _Out_ PKAPC_STATE ApcState); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeUnstackDetachProcess( - IN PKAPC_STATE ApcState); + _In_ PKAPC_STATE ApcState); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI UCHAR NTAPI KeSetIdealProcessorThread( - IN OUT PKTHREAD Thread, - IN UCHAR Processor); + _Inout_ PKTHREAD Thread, + _In_ UCHAR Processor); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeSetKernelStackSwapEnable( - IN BOOLEAN Enable); + _In_ BOOLEAN Enable); #if defined(_X86_) +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_raises_(SYNCH_LEVEL) +_IRQL_saves_ NTHALAPI KIRQL FASTCALL KeAcquireSpinLockRaiseToSynch( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #else +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_raises_(SYNCH_LEVEL) +_IRQL_saves_ NTKERNELAPI KIRQL KeAcquireSpinLockRaiseToSynch( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #endif #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -4919,25 +5170,32 @@ KeAcquireSpinLockRaiseToSynch( #if (NTDDI_VERSION >= NTDDI_WINXP) +_Requires_lock_not_held_(Number) +_Acquires_lock_(Number) +_IRQL_raises_(DISPATCH_LEVEL) _DECL_HAL_KE_IMPORT KIRQL FASTCALL KeAcquireQueuedSpinLock( - IN OUT KSPIN_LOCK_QUEUE_NUMBER Number); + _In_ KSPIN_LOCK_QUEUE_NUMBER Number); +_Requires_lock_held_(Number) +_Releases_lock_(Number) _DECL_HAL_KE_IMPORT VOID FASTCALL KeReleaseQueuedSpinLock( - IN OUT KSPIN_LOCK_QUEUE_NUMBER Number, - IN KIRQL OldIrql); + _In_ KSPIN_LOCK_QUEUE_NUMBER Number, + _In_ KIRQL OldIrql); +_Must_inspect_result_ +_Post_satisfies_(return == 1 || return == 0) _DECL_HAL_KE_IMPORT LOGICAL FASTCALL KeTryToAcquireQueuedSpinLock( - IN KSPIN_LOCK_QUEUE_NUMBER Number, - OUT PKIRQL OldIrql); + _In_ KSPIN_LOCK_QUEUE_NUMBER Number, + _Out_ _At_(*OldIrql, _IRQL_saves_) PKIRQL OldIrql); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -4947,27 +5205,30 @@ KeTryToAcquireQueuedSpinLock( #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID KeQueryOwnerMutant( - IN PKMUTANT Mutant, - OUT PCLIENT_ID ClientId); + _In_ PKMUTANT Mutant, + _Out_ PCLIENT_ID ClientId); +_IRQL_requires_min_(PASSIVE_LEVEL) +_When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL)) +_When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL)) NTKERNELAPI ULONG NTAPI KeRemoveQueueEx( - IN OUT PKQUEUE Queue, - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL, - OUT PLIST_ENTRY *EntryArray, - IN ULONG Count); + _Inout_ PKQUEUE Queue, + _In_ KPROCESSOR_MODE WaitMode, + _In_ BOOLEAN Alertable, + _In_opt_ PLARGE_INTEGER Timeout, + _Out_writes_to_(Count, return) PLIST_ENTRY *EntryArray, + _In_ ULONG Count); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ - #define INVALID_PROCESSOR_INDEX 0xffffffff #define EX_PUSH_LOCK ULONG_PTR @@ -4980,27 +5241,29 @@ KeRemoveQueueEx( #define ExDisableResourceBoost ExDisableResourceBoostLite VOID -ExInitializePushLock ( - OUT PEX_PUSH_LOCK PushLock); +ExInitializePushLock( + _Out_ PEX_PUSH_LOCK PushLock); #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI SIZE_T NTAPI ExQueryPoolBlockSize( - IN PVOID PoolBlock, - OUT PBOOLEAN QuotaCharged); + _In_ PVOID PoolBlock, + _Out_ PBOOLEAN QuotaCharged); +_IRQL_requires_max_(DISPATCH_LEVEL) VOID -ExAdjustLookasideDepth( - VOID); +ExAdjustLookasideDepth(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExDisableResourceBoostLite( - IN PERESOURCE Resource); + _In_ PERESOURCE Resource); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -5008,10 +5271,10 @@ ExDisableResourceBoostLite( PSLIST_ENTRY FASTCALL InterlockedPushListSList( - IN OUT PSLIST_HEADER ListHead, - IN OUT PSLIST_ENTRY List, - IN OUT PSLIST_ENTRY ListEnd, - IN ULONG Count); + _Inout_ PSLIST_HEADER ListHead, + _Inout_ __drv_aliasesMem PSLIST_ENTRY List, + _Inout_ PSLIST_ENTRY ListEnd, + _In_ ULONG Count); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ /****************************************************************************** @@ -5025,200 +5288,200 @@ NTKERNELAPI VOID NTAPI SeReleaseSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + _Inout_ PSECURITY_SUBJECT_CONTEXT SubjectContext); NTKERNELAPI BOOLEAN NTAPI SePrivilegeCheck( - IN OUT PPRIVILEGE_SET RequiredPrivileges, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN KPROCESSOR_MODE AccessMode); + _Inout_ PPRIVILEGE_SET RequiredPrivileges, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, + _In_ KPROCESSOR_MODE AccessMode); NTKERNELAPI VOID NTAPI SeOpenObjectAuditAlarm( - IN PUNICODE_STRING ObjectTypeName, - IN PVOID Object OPTIONAL, - IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PACCESS_STATE AccessState, - IN BOOLEAN ObjectCreated, - IN BOOLEAN AccessGranted, - IN KPROCESSOR_MODE AccessMode, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING ObjectTypeName, + _In_opt_ PVOID Object, + _In_opt_ PUNICODE_STRING AbsoluteObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PACCESS_STATE AccessState, + _In_ BOOLEAN ObjectCreated, + _In_ BOOLEAN AccessGranted, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PBOOLEAN GenerateOnClose); NTKERNELAPI VOID NTAPI SeOpenObjectForDeleteAuditAlarm( - IN PUNICODE_STRING ObjectTypeName, - IN PVOID Object OPTIONAL, - IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PACCESS_STATE AccessState, - IN BOOLEAN ObjectCreated, - IN BOOLEAN AccessGranted, - IN KPROCESSOR_MODE AccessMode, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING ObjectTypeName, + _In_opt_ PVOID Object, + _In_opt_ PUNICODE_STRING AbsoluteObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PACCESS_STATE AccessState, + _In_ BOOLEAN ObjectCreated, + _In_ BOOLEAN AccessGranted, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PBOOLEAN GenerateOnClose); NTKERNELAPI VOID NTAPI SeDeleteObjectAuditAlarm( - IN PVOID Object, - IN HANDLE Handle); + _In_ PVOID Object, + _In_ HANDLE Handle); NTKERNELAPI TOKEN_TYPE NTAPI SeTokenType( - IN PACCESS_TOKEN Token); + _In_ PACCESS_TOKEN Token); NTKERNELAPI BOOLEAN NTAPI SeTokenIsAdmin( - IN PACCESS_TOKEN Token); + _In_ PACCESS_TOKEN Token); NTKERNELAPI BOOLEAN NTAPI SeTokenIsRestricted( - IN PACCESS_TOKEN Token); + _In_ PACCESS_TOKEN Token); NTKERNELAPI NTSTATUS NTAPI SeQueryAuthenticationIdToken( - IN PACCESS_TOKEN Token, - OUT PLUID AuthenticationId); + _In_ PACCESS_TOKEN Token, + _Out_ PLUID AuthenticationId); NTKERNELAPI NTSTATUS NTAPI SeQuerySessionIdToken( - IN PACCESS_TOKEN Token, - OUT PULONG SessionId); + _In_ PACCESS_TOKEN Token, + _Out_ PULONG SessionId); NTKERNELAPI NTSTATUS NTAPI SeCreateClientSecurity( - IN PETHREAD ClientThread, - IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos, - IN BOOLEAN RemoteSession, - OUT PSECURITY_CLIENT_CONTEXT ClientContext); + _In_ PETHREAD ClientThread, + _In_ PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos, + _In_ BOOLEAN RemoteSession, + _Out_ PSECURITY_CLIENT_CONTEXT ClientContext); NTKERNELAPI VOID NTAPI SeImpersonateClient( - IN PSECURITY_CLIENT_CONTEXT ClientContext, - IN PETHREAD ServerThread OPTIONAL); + _In_ PSECURITY_CLIENT_CONTEXT ClientContext, + _In_opt_ PETHREAD ServerThread); NTKERNELAPI NTSTATUS NTAPI SeImpersonateClientEx( - IN PSECURITY_CLIENT_CONTEXT ClientContext, - IN PETHREAD ServerThread OPTIONAL); + _In_ PSECURITY_CLIENT_CONTEXT ClientContext, + _In_opt_ PETHREAD ServerThread); NTKERNELAPI NTSTATUS NTAPI SeCreateClientSecurityFromSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos, - IN BOOLEAN ServerIsRemote, - OUT PSECURITY_CLIENT_CONTEXT ClientContext); + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, + _In_ PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos, + _In_ BOOLEAN ServerIsRemote, + _Out_ PSECURITY_CLIENT_CONTEXT ClientContext); NTKERNELAPI NTSTATUS NTAPI SeQuerySecurityDescriptorInfo( - IN PSECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN OUT PULONG Length, - IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor); + _In_ PSECURITY_INFORMATION SecurityInformation, + _Out_writes_bytes_(*Length) PSECURITY_DESCRIPTOR SecurityDescriptor, + _Inout_ PULONG Length, + _Inout_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor); NTKERNELAPI NTSTATUS NTAPI SeSetSecurityDescriptorInfo( - IN PVOID Object OPTIONAL, - IN PSECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, - IN POOL_TYPE PoolType, - IN PGENERIC_MAPPING GenericMapping); + _In_opt_ PVOID Object, + _In_ PSECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _Inout_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, + _In_ POOL_TYPE PoolType, + _In_ PGENERIC_MAPPING GenericMapping); NTKERNELAPI NTSTATUS NTAPI SeSetSecurityDescriptorInfoEx( - IN PVOID Object OPTIONAL, - IN PSECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR ModificationDescriptor, - IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, - IN ULONG AutoInheritFlags, - IN POOL_TYPE PoolType, - IN PGENERIC_MAPPING GenericMapping); + _In_opt_ PVOID Object, + _In_ PSECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR ModificationDescriptor, + _Inout_ PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor, + _In_ ULONG AutoInheritFlags, + _In_ POOL_TYPE PoolType, + _In_ PGENERIC_MAPPING GenericMapping); NTKERNELAPI NTSTATUS NTAPI SeAppendPrivileges( - IN OUT PACCESS_STATE AccessState, - IN PPRIVILEGE_SET Privileges); + _Inout_ PACCESS_STATE AccessState, + _In_ PPRIVILEGE_SET Privileges); NTKERNELAPI BOOLEAN NTAPI SeAuditingFileEvents( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ BOOLEAN AccessGranted, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); NTKERNELAPI BOOLEAN NTAPI SeAuditingFileOrGlobalEvents( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext); + _In_ BOOLEAN AccessGranted, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext); VOID NTAPI SeSetAccessStateGenericMapping( - IN OUT PACCESS_STATE AccessState, - IN PGENERIC_MAPPING GenericMapping); + _Inout_ PACCESS_STATE AccessState, + _In_ PGENERIC_MAPPING GenericMapping); NTKERNELAPI NTSTATUS NTAPI SeRegisterLogonSessionTerminatedRoutine( - IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine); + _In_ PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine); NTKERNELAPI NTSTATUS NTAPI SeUnregisterLogonSessionTerminatedRoutine( - IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine); + _In_ PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine); NTKERNELAPI NTSTATUS NTAPI SeMarkLogonSessionForTerminationNotification( - IN PLUID LogonId); + _In_ PLUID LogonId); NTKERNELAPI NTSTATUS NTAPI SeQueryInformationToken( - IN PACCESS_TOKEN Token, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID *TokenInformation); + _In_ PACCESS_TOKEN Token, + _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, + _Outptr_result_buffer_(_Inexpressible_(token-dependent)) PVOID *TokenInformation); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WIN2KSP3) @@ -5226,8 +5489,8 @@ NTKERNELAPI BOOLEAN NTAPI SeAuditingHardLinkEvents( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ BOOLEAN AccessGranted, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); #endif #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -5236,20 +5499,20 @@ NTKERNELAPI NTSTATUS NTAPI SeFilterToken( - IN PACCESS_TOKEN ExistingToken, - IN ULONG Flags, - IN PTOKEN_GROUPS SidsToDisable OPTIONAL, - IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL, - IN PTOKEN_GROUPS RestrictedSids OPTIONAL, - OUT PACCESS_TOKEN *FilteredToken); + _In_ PACCESS_TOKEN ExistingToken, + _In_ ULONG Flags, + _In_opt_ PTOKEN_GROUPS SidsToDisable, + _In_opt_ PTOKEN_PRIVILEGES PrivilegesToDelete, + _In_opt_ PTOKEN_GROUPS RestrictedSids, + _Outptr_ PACCESS_TOKEN *FilteredToken); NTKERNELAPI VOID NTAPI SeAuditHardLinkCreation( - IN PUNICODE_STRING FileName, - IN PUNICODE_STRING LinkName, - IN BOOLEAN bSuccess); + _In_ PUNICODE_STRING FileName, + _In_ PUNICODE_STRING LinkName, + _In_ BOOLEAN bSuccess); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -5259,17 +5522,17 @@ NTKERNELAPI BOOLEAN NTAPI SeAuditingFileEventsWithContext( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL); + _In_ BOOLEAN AccessGranted, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext); NTKERNELAPI BOOLEAN NTAPI SeAuditingHardLinkEventsWithContext( - IN BOOLEAN AccessGranted, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL); + _In_ BOOLEAN AccessGranted, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext); #endif @@ -5280,81 +5543,81 @@ NTKERNELAPI VOID NTAPI SeOpenObjectAuditAlarmWithTransaction( - IN PUNICODE_STRING ObjectTypeName, - IN PVOID Object OPTIONAL, - IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PACCESS_STATE AccessState, - IN BOOLEAN ObjectCreated, - IN BOOLEAN AccessGranted, - IN KPROCESSOR_MODE AccessMode, - IN GUID *TransactionId OPTIONAL, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING ObjectTypeName, + _In_opt_ PVOID Object, + _In_opt_ PUNICODE_STRING AbsoluteObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PACCESS_STATE AccessState, + _In_ BOOLEAN ObjectCreated, + _In_ BOOLEAN AccessGranted, + _In_ KPROCESSOR_MODE AccessMode, + _In_opt_ GUID *TransactionId, + _Out_ PBOOLEAN GenerateOnClose); NTKERNELAPI VOID NTAPI SeOpenObjectForDeleteAuditAlarmWithTransaction( - IN PUNICODE_STRING ObjectTypeName, - IN PVOID Object OPTIONAL, - IN PUNICODE_STRING AbsoluteObjectName OPTIONAL, - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PACCESS_STATE AccessState, - IN BOOLEAN ObjectCreated, - IN BOOLEAN AccessGranted, - IN KPROCESSOR_MODE AccessMode, - IN GUID *TransactionId OPTIONAL, - OUT PBOOLEAN GenerateOnClose); + _In_ PUNICODE_STRING ObjectTypeName, + _In_opt_ PVOID Object, + _In_opt_ PUNICODE_STRING AbsoluteObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PACCESS_STATE AccessState, + _In_ BOOLEAN ObjectCreated, + _In_ BOOLEAN AccessGranted, + _In_ KPROCESSOR_MODE AccessMode, + _In_opt_ GUID *TransactionId, + _Out_ PBOOLEAN GenerateOnClose); NTKERNELAPI VOID NTAPI SeExamineSacl( - IN PACL Sacl, - IN PACCESS_TOKEN Token, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN AccessGranted, - OUT PBOOLEAN GenerateAudit, - OUT PBOOLEAN GenerateAlarm); + _In_ PACL Sacl, + _In_ PACCESS_TOKEN Token, + _In_ ACCESS_MASK DesiredAccess, + _In_ BOOLEAN AccessGranted, + _Out_ PBOOLEAN GenerateAudit, + _Out_ PBOOLEAN GenerateAlarm); NTKERNELAPI VOID NTAPI SeDeleteObjectAuditAlarmWithTransaction( - IN PVOID Object, - IN HANDLE Handle, - IN GUID *TransactionId OPTIONAL); + _In_ PVOID Object, + _In_ HANDLE Handle, + _In_opt_ GUID *TransactionId); NTKERNELAPI VOID NTAPI SeQueryTokenIntegrity( - IN PACCESS_TOKEN Token, - IN OUT PSID_AND_ATTRIBUTES IntegritySA); + _In_ PACCESS_TOKEN Token, + _Inout_ PSID_AND_ATTRIBUTES IntegritySA); NTKERNELAPI NTSTATUS NTAPI SeSetSessionIdToken( - IN PACCESS_TOKEN Token, - IN ULONG SessionId); + _In_ PACCESS_TOKEN Token, + _In_ ULONG SessionId); NTKERNELAPI VOID NTAPI SeAuditHardLinkCreationWithTransaction( - IN PUNICODE_STRING FileName, - IN PUNICODE_STRING LinkName, - IN BOOLEAN bSuccess, - IN GUID *TransactionId OPTIONAL); + _In_ PUNICODE_STRING FileName, + _In_ PUNICODE_STRING LinkName, + _In_ BOOLEAN bSuccess, + _In_opt_ GUID *TransactionId); NTKERNELAPI VOID NTAPI SeAuditTransactionStateChange( - IN GUID *TransactionId, - IN GUID *ResourceManagerId, - IN ULONG NewTransactionState); + _In_ GUID *TransactionId, + _In_ GUID *ResourceManagerId, + _In_ ULONG NewTransactionState); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #if (NTDDI_VERSION >= NTDDI_VISTA || (NTDDI_VERSION >= NTDDI_WINXPSP2 && NTDDI_VERSION < NTDDI_WS03)) @@ -5362,7 +5625,7 @@ NTKERNELAPI BOOLEAN NTAPI SeTokenIsWriteRestricted( - IN PACCESS_TOKEN Token); + _In_ PACCESS_TOKEN Token); #endif #if (NTDDI_VERSION >= NTDDI_WIN7) @@ -5371,65 +5634,67 @@ NTKERNELAPI BOOLEAN NTAPI SeAuditingAnyFileEventsWithContext( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, + _Out_opt_ PBOOLEAN StagingEnabled); NTKERNELAPI VOID NTAPI SeExamineGlobalSacl( - IN PUNICODE_STRING ObjectType, - IN PACCESS_TOKEN Token, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN AccessGranted, - IN OUT PBOOLEAN GenerateAudit, - IN OUT PBOOLEAN GenerateAlarm OPTIONAL); + _In_ PUNICODE_STRING ObjectType, + _In_ PACL ResourceSacl, + _In_ PACCESS_TOKEN Token, + _In_ ACCESS_MASK DesiredAccess, + _In_ BOOLEAN AccessGranted, + _Inout_ PBOOLEAN GenerateAudit, + _Inout_opt_ PBOOLEAN GenerateAlarm); NTKERNELAPI VOID NTAPI SeMaximumAuditMaskFromGlobalSacl( - IN PUNICODE_STRING ObjectTypeName OPTIONAL, - IN ACCESS_MASK GrantedAccess, - IN PACCESS_TOKEN Token, - IN OUT PACCESS_MASK AuditMask); + _In_opt_ PUNICODE_STRING ObjectTypeName, + _In_ ACCESS_MASK GrantedAccess, + _In_ PACCESS_TOKEN Token, + _Inout_ PACCESS_MASK AuditMask); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ NTSTATUS NTAPI SeReportSecurityEventWithSubCategory( - IN ULONG Flags, - IN PUNICODE_STRING SourceName, - IN PSID UserSid OPTIONAL, - IN PSE_ADT_PARAMETER_ARRAY AuditParameters, - IN ULONG AuditSubcategoryId); + _In_ ULONG Flags, + _In_ PUNICODE_STRING SourceName, + _In_opt_ PSID UserSid, + _In_ PSE_ADT_PARAMETER_ARRAY AuditParameters, + _In_ ULONG AuditSubcategoryId); BOOLEAN NTAPI SeAccessCheckFromState( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PTOKEN_ACCESS_INFORMATION PrimaryTokenInformation, - IN PTOKEN_ACCESS_INFORMATION ClientTokenInformation OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN ACCESS_MASK PreviouslyGrantedAccess, - OUT PPRIVILEGE_SET *Privileges OPTIONAL, - IN PGENERIC_MAPPING GenericMapping, - IN KPROCESSOR_MODE AccessMode, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PTOKEN_ACCESS_INFORMATION PrimaryTokenInformation, + _In_opt_ PTOKEN_ACCESS_INFORMATION ClientTokenInformation, + _In_ ACCESS_MASK DesiredAccess, + _In_ ACCESS_MASK PreviouslyGrantedAccess, + _Outptr_opt_result_maybenull_ PPRIVILEGE_SET *Privileges, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PACCESS_MASK GrantedAccess, + _Out_ PNTSTATUS AccessStatus); NTKERNELAPI VOID NTAPI SeFreePrivileges( - IN PPRIVILEGE_SET Privileges); + _In_ PPRIVILEGE_SET Privileges); NTSTATUS NTAPI SeLocateProcessImageName( - IN OUT PEPROCESS Process, - OUT PUNICODE_STRING *pImageFileName); + _Inout_ PEPROCESS Process, + _Outptr_ PUNICODE_STRING *pImageFileName); #define SeLengthSid( Sid ) \ (8 + (4 * ((SID *)Sid)->SubAuthorityCount)) @@ -5456,129 +5721,149 @@ extern NTKERNELAPI PSE_EXPORTS SeExports; * Process Manager Functions * ******************************************************************************/ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsLookupProcessByProcessId( - IN HANDLE ProcessId, - OUT PEPROCESS *Process); + _In_ HANDLE ProcessId, + _Outptr_ PEPROCESS *Process); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsLookupThreadByThreadId( - IN HANDLE UniqueThreadId, - OUT PETHREAD *Thread); + _In_ HANDLE UniqueThreadId, + _Outptr_ PETHREAD *Thread); #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PACCESS_TOKEN NTAPI PsReferenceImpersonationToken( - IN OUT PETHREAD Thread, - OUT PBOOLEAN CopyOnOpen, - OUT PBOOLEAN EffectiveOnly, - OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel); + _Inout_ PETHREAD Thread, + _Out_ PBOOLEAN CopyOnOpen, + _Out_ PBOOLEAN EffectiveOnly, + _Out_ PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI LARGE_INTEGER NTAPI PsGetProcessExitTime(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI PsIsThreadTerminating( - IN PETHREAD Thread); + _In_ PETHREAD Thread); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsImpersonateClient( - IN OUT PETHREAD Thread, - IN PACCESS_TOKEN Token, - IN BOOLEAN CopyOnOpen, - IN BOOLEAN EffectiveOnly, - IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel); + _Inout_ PETHREAD Thread, + _In_opt_ PACCESS_TOKEN Token, + _In_ BOOLEAN CopyOnOpen, + _In_ BOOLEAN EffectiveOnly, + _In_ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI PsDisableImpersonation( - IN OUT PETHREAD Thread, - IN OUT PSE_IMPERSONATION_STATE ImpersonationState); + _Inout_ PETHREAD Thread, + _Inout_ PSE_IMPERSONATION_STATE ImpersonationState); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI PsRestoreImpersonation( - IN PETHREAD Thread, - IN PSE_IMPERSONATION_STATE ImpersonationState); + _Inout_ PETHREAD Thread, + _In_ PSE_IMPERSONATION_STATE ImpersonationState); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI PsRevertToSelf(VOID); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI PsChargePoolQuota( - IN PEPROCESS Process, - IN POOL_TYPE PoolType, - IN ULONG_PTR Amount); + _In_ PEPROCESS Process, + _In_ POOL_TYPE PoolType, + _In_ ULONG_PTR Amount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI PsReturnPoolQuota( - IN PEPROCESS Process, - IN POOL_TYPE PoolType, - IN ULONG_PTR Amount); + _In_ PEPROCESS Process, + _In_ POOL_TYPE PoolType, + _In_ ULONG_PTR Amount); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsAssignImpersonationToken( - IN PETHREAD Thread, - IN HANDLE Token OPTIONAL); + _In_ PETHREAD Thread, + _In_opt_ HANDLE Token); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI HANDLE NTAPI PsReferencePrimaryToken( - IN OUT PEPROCESS Process); + _Inout_ PEPROCESS Process); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI PsDereferencePrimaryToken( - IN PACCESS_TOKEN PrimaryToken); + _In_ PACCESS_TOKEN PrimaryToken); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI PsDereferenceImpersonationToken( - IN PACCESS_TOKEN ImpersonationToken); + _In_ PACCESS_TOKEN ImpersonationToken); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsChargeProcessPoolQuota( - IN PEPROCESS Process, - IN POOL_TYPE PoolType, - IN ULONG_PTR Amount); + _In_ PEPROCESS Process, + _In_ POOL_TYPE PoolType, + _In_ ULONG_PTR Amount); NTKERNELAPI BOOLEAN NTAPI PsIsSystemThread( - IN PETHREAD Thread); + _In_ PETHREAD Thread); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ /****************************************************************************** @@ -5598,8 +5883,8 @@ NTKERNELAPI NTSTATUS NTAPI IoRegisterFsRegistrationChangeEx( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); #endif #if (NTDDI_VERSION >= NTDDI_WIN2K) @@ -5608,98 +5893,99 @@ NTKERNELAPI VOID NTAPI IoAcquireVpbSpinLock( - OUT PKIRQL Irql); + _Out_ PKIRQL Irql); NTKERNELAPI NTSTATUS NTAPI IoCheckDesiredAccess( - IN OUT PACCESS_MASK DesiredAccess, - IN ACCESS_MASK GrantedAccess); + _Inout_ PACCESS_MASK DesiredAccess, + _In_ ACCESS_MASK GrantedAccess); NTKERNELAPI NTSTATUS NTAPI IoCheckEaBufferValidity( - IN PFILE_FULL_EA_INFORMATION EaBuffer, - IN ULONG EaLength, - OUT PULONG ErrorOffset); + _In_ PFILE_FULL_EA_INFORMATION EaBuffer, + _In_ ULONG EaLength, + _Out_ PULONG ErrorOffset); NTKERNELAPI NTSTATUS NTAPI IoCheckFunctionAccess( - IN ACCESS_MASK GrantedAccess, - IN UCHAR MajorFunction, - IN UCHAR MinorFunction, - IN ULONG IoControlCode, - IN PVOID Argument1 OPTIONAL, - IN PVOID Argument2 OPTIONAL); + _In_ ACCESS_MASK GrantedAccess, + _In_ UCHAR MajorFunction, + _In_ UCHAR MinorFunction, + _In_ ULONG IoControlCode, + _In_opt_ PVOID Argument1, + _In_opt_ PVOID Argument2); NTKERNELAPI NTSTATUS NTAPI IoCheckQuerySetFileInformation( - IN FILE_INFORMATION_CLASS FileInformationClass, - IN ULONG Length, - IN BOOLEAN SetOperation); + _In_ FILE_INFORMATION_CLASS FileInformationClass, + _In_ ULONG Length, + _In_ BOOLEAN SetOperation); NTKERNELAPI NTSTATUS NTAPI IoCheckQuerySetVolumeInformation( - IN FS_INFORMATION_CLASS FsInformationClass, - IN ULONG Length, - IN BOOLEAN SetOperation); + _In_ FS_INFORMATION_CLASS FsInformationClass, + _In_ ULONG Length, + _In_ BOOLEAN SetOperation); NTKERNELAPI NTSTATUS NTAPI IoCheckQuotaBufferValidity( - IN PFILE_QUOTA_INFORMATION QuotaBuffer, - IN ULONG QuotaLength, - OUT PULONG ErrorOffset); + _In_ PFILE_QUOTA_INFORMATION QuotaBuffer, + _In_ ULONG QuotaLength, + _Out_ PULONG ErrorOffset); NTKERNELAPI PFILE_OBJECT NTAPI IoCreateStreamFileObject( - IN PFILE_OBJECT FileObject OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL); + _In_opt_ PFILE_OBJECT FileObject, + _In_opt_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI PFILE_OBJECT NTAPI IoCreateStreamFileObjectLite( - IN PFILE_OBJECT FileObject OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL); + _In_opt_ PFILE_OBJECT FileObject, + _In_opt_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI BOOLEAN NTAPI IoFastQueryNetworkAttributes( - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ACCESS_MASK DesiredAccess, - IN ULONG OpenOptions, - OUT PIO_STATUS_BLOCK IoStatus, - OUT PFILE_NETWORK_OPEN_INFORMATION Buffer); + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG OpenOptions, + _Out_ PIO_STATUS_BLOCK IoStatus, + _Out_ PFILE_NETWORK_OPEN_INFORMATION Buffer); NTKERNELAPI NTSTATUS NTAPI IoPageRead( - IN PFILE_OBJECT FileObject, - IN PMDL Mdl, - IN PLARGE_INTEGER Offset, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ PFILE_OBJECT FileObject, + _In_ PMDL Mdl, + _In_ PLARGE_INTEGER Offset, + _In_ PKEVENT Event, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetBaseFileSystemDeviceObject( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PCONFIGURATION_INFORMATION NTAPI @@ -5709,13 +5995,13 @@ NTKERNELAPI ULONG NTAPI IoGetRequestorProcessId( - IN PIRP Irp); + _In_ PIRP Irp); NTKERNELAPI PEPROCESS NTAPI IoGetRequestorProcess( - IN PIRP Irp); + _In_ PIRP Irp); NTKERNELAPI PIRP @@ -5726,130 +6012,130 @@ NTKERNELAPI BOOLEAN NTAPI IoIsOperationSynchronous( - IN PIRP Irp); + _In_ PIRP Irp); NTKERNELAPI BOOLEAN NTAPI IoIsSystemThread( - IN PETHREAD Thread); + _In_ PETHREAD Thread); NTKERNELAPI BOOLEAN NTAPI IoIsValidNameGraftingBuffer( - IN PIRP Irp, - IN PREPARSE_DATA_BUFFER ReparseBuffer); + _In_ PIRP Irp, + _In_ PREPARSE_DATA_BUFFER ReparseBuffer); NTKERNELAPI NTSTATUS NTAPI IoQueryFileInformation( - IN PFILE_OBJECT FileObject, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN ULONG Length, - OUT PVOID FileInformation, - OUT PULONG ReturnedLength); + _In_ PFILE_OBJECT FileObject, + _In_ FILE_INFORMATION_CLASS FileInformationClass, + _In_ ULONG Length, + _Out_ PVOID FileInformation, + _Out_ PULONG ReturnedLength); NTKERNELAPI NTSTATUS NTAPI IoQueryVolumeInformation( - IN PFILE_OBJECT FileObject, - IN FS_INFORMATION_CLASS FsInformationClass, - IN ULONG Length, - OUT PVOID FsInformation, - OUT PULONG ReturnedLength); + _In_ PFILE_OBJECT FileObject, + _In_ FS_INFORMATION_CLASS FsInformationClass, + _In_ ULONG Length, + _Out_ PVOID FsInformation, + _Out_ PULONG ReturnedLength); NTKERNELAPI VOID NTAPI IoQueueThreadIrp( - IN PIRP Irp); + _In_ PIRP Irp); NTKERNELAPI VOID NTAPI IoRegisterFileSystem( - IN PDEVICE_OBJECT DeviceObject); + _In_ __drv_aliasesMem PDEVICE_OBJECT DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoRegisterFsRegistrationChange( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); NTKERNELAPI VOID NTAPI IoReleaseVpbSpinLock( - IN KIRQL Irql); + _In_ KIRQL Irql); NTKERNELAPI VOID NTAPI IoSetDeviceToVerify( - IN PETHREAD Thread, - IN PDEVICE_OBJECT DeviceObject OPTIONAL); + _In_ PETHREAD Thread, + _In_opt_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoSetInformation( - IN PFILE_OBJECT FileObject, - IN FILE_INFORMATION_CLASS FileInformationClass, - IN ULONG Length, - IN PVOID FileInformation); + _In_ PFILE_OBJECT FileObject, + _In_ FILE_INFORMATION_CLASS FileInformationClass, + _In_ ULONG Length, + _In_ PVOID FileInformation); NTKERNELAPI VOID NTAPI IoSetTopLevelIrp( - IN PIRP Irp OPTIONAL); + _In_opt_ PIRP Irp); NTKERNELAPI NTSTATUS NTAPI IoSynchronousPageWrite( - IN PFILE_OBJECT FileObject, - IN PMDL Mdl, - IN PLARGE_INTEGER FileOffset, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ PFILE_OBJECT FileObject, + _In_ PMDL Mdl, + _In_ PLARGE_INTEGER FileOffset, + _In_ PKEVENT Event, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); NTKERNELAPI PEPROCESS NTAPI IoThreadToProcess( - IN PETHREAD Thread); + _In_ PETHREAD Thread); NTKERNELAPI VOID NTAPI IoUnregisterFileSystem( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI VOID NTAPI IoUnregisterFsRegistrationChange( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine); NTKERNELAPI NTSTATUS NTAPI IoVerifyVolume( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN AllowRawMount); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN AllowRawMount); NTKERNELAPI NTSTATUS NTAPI IoGetRequestorSessionId( - IN PIRP Irp, - OUT PULONG pSessionId); + _In_ PIRP Irp, + _Out_ PULONG pSessionId); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -5861,44 +6147,45 @@ NTKERNELAPI PFILE_OBJECT NTAPI IoCreateStreamFileObjectEx( - IN PFILE_OBJECT FileObject OPTIONAL, - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - OUT PHANDLE FileObjectHandle OPTIONAL); + _In_opt_ PFILE_OBJECT FileObject, + _In_opt_ PDEVICE_OBJECT DeviceObject, + _Out_opt_ PHANDLE FileObjectHandle); NTKERNELAPI NTSTATUS NTAPI IoQueryFileDosDeviceName( - IN PFILE_OBJECT FileObject, - OUT POBJECT_NAME_INFORMATION *ObjectNameInformation); + _In_ PFILE_OBJECT FileObject, + _Out_ POBJECT_NAME_INFORMATION *ObjectNameInformation); NTKERNELAPI NTSTATUS NTAPI IoEnumerateDeviceObjectList( - IN PDRIVER_OBJECT DriverObject, - OUT PDEVICE_OBJECT *DeviceObjectList, - IN ULONG DeviceObjectListSize, - OUT PULONG ActualNumberDeviceObjects); + _In_ PDRIVER_OBJECT DriverObject, + _Out_writes_bytes_to_opt_(DeviceObjectListSize,(*ActualNumberDeviceObjects)*sizeof(PDEVICE_OBJECT)) + PDEVICE_OBJECT *DeviceObjectList, + _In_ ULONG DeviceObjectListSize, + _Out_ PULONG ActualNumberDeviceObjects); NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetLowerDeviceObject( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetDeviceAttachmentBaseRef( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoGetDiskDeviceObject( - IN PDEVICE_OBJECT FileSystemDeviceObject, - OUT PDEVICE_OBJECT *DiskDeviceObject); + _In_ PDEVICE_OBJECT FileSystemDeviceObject, + _Out_ PDEVICE_OBJECT *DiskDeviceObject); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -5909,9 +6196,10 @@ NTKERNELAPI NTSTATUS NTAPI IoEnumerateRegisteredFiltersList( - OUT PDRIVER_OBJECT *DriverObjectList, - IN ULONG DriverObjectListSize, - OUT PULONG ActualNumberDriverObjects); + _Out_writes_bytes_to_opt_(DriverObjectListSize,(*ActualNumberDriverObjects)*sizeof(PDRIVER_OBJECT)) + PDRIVER_OBJECT *DriverObjectList, + _In_ ULONG DriverObjectListSize, + _Out_ PULONG ActualNumberDriverObjects); #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ #if (NTDDI_VERSION >= NTDDI_VISTA) @@ -5920,12 +6208,12 @@ FORCEINLINE VOID NTAPI IoInitializePriorityInfo( - IN PIO_PRIORITY_INFO PriorityInfo) + _In_ PIO_PRIORITY_INFO PriorityInfo) { - PriorityInfo->Size = sizeof(IO_PRIORITY_INFO); - PriorityInfo->ThreadPriority = 0xffff; - PriorityInfo->IoPriority = IoPriorityNormal; - PriorityInfo->PagePriority = 0; + PriorityInfo->Size = sizeof(IO_PRIORITY_INFO); + PriorityInfo->ThreadPriority = 0xffff; + PriorityInfo->IoPriority = IoPriorityNormal; + PriorityInfo->PagePriority = 0; } #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -5936,17 +6224,17 @@ NTKERNELAPI NTSTATUS NTAPI IoRegisterFsRegistrationChangeMountAware( - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine, - IN BOOLEAN SynchronizeWithMounts); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_FS_NOTIFICATION DriverNotificationRoutine, + _In_ BOOLEAN SynchronizeWithMounts); NTKERNELAPI NTSTATUS NTAPI IoReplaceFileObjectName( - IN PFILE_OBJECT FileObject, - IN PWSTR NewFileName, - IN USHORT FileNameLength); + _In_ PFILE_OBJECT FileObject, + _In_reads_bytes_(FileNameLength) PWSTR NewFileName, + _In_ USHORT FileNameLength); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -5959,11 +6247,12 @@ IoReplaceFileObjectName( #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoQueueShutdownWorkItem( - IN OUT PWORK_QUEUE_ITEM WorkItem); + _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem); #endif /****************************************************************************** * Memory manager Types * @@ -6050,8 +6339,8 @@ typedef union _MM_PREFETCH_FLAGS { FORCEINLINE ULONG HEAP_MAKE_TAG_FLAGS( - IN ULONG TagBase, - IN ULONG Tag) + _In_ ULONG TagBase, + _In_ ULONG Tag) { //__assume_bound(TagBase); // FIXME return ((ULONG)((TagBase) + ((Tag) << HEAP_TAG_SHIFT))); @@ -6062,59 +6351,64 @@ HEAP_MAKE_TAG_FLAGS( NTKERNELAPI BOOLEAN NTAPI -MmIsRecursiveIoFault( - VOID); +MmIsRecursiveIoFault(VOID); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI MmForceSectionClosed( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN DelayClose); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_ BOOLEAN DelayClose); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI MmFlushImageSection( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN MMFLUSH_TYPE FlushType); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_ MMFLUSH_TYPE FlushType); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI MmCanFileBeTruncated( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER NewFileSize OPTIONAL); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_opt_ PLARGE_INTEGER NewFileSize); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI MmSetAddressRangeModified( - IN PVOID Address, - IN SIZE_T Length); + _In_reads_bytes_ (Length) PVOID Address, + _In_ SIZE_T Length); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_ (PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmPrefetchPages( - IN ULONG NumberOfLists, - IN PREAD_LIST *ReadLists); + _In_ ULONG NumberOfLists, + _In_reads_ (NumberOfLists) PREAD_LIST *ReadLists); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI ULONG NTAPI MmDoesFileHaveUserWritableReferences( - IN PSECTION_OBJECT_POINTERS SectionPointer); + _In_ PSECTION_OBJECT_POINTERS SectionPointer); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -6124,46 +6418,46 @@ NTKERNELAPI NTSTATUS NTAPI ObInsertObject( - IN PVOID Object, - IN OUT PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess OPTIONAL, - IN ULONG ObjectPointerBias, - OUT PVOID *NewObject OPTIONAL, - OUT PHANDLE Handle OPTIONAL); + _In_ PVOID Object, + _Inout_opt_ PACCESS_STATE PassedAccessState, + _In_opt_ ACCESS_MASK DesiredAccess, + _In_ ULONG ObjectPointerBias, + _Out_opt_ PVOID *NewObject, + _Out_opt_ PHANDLE Handle); NTKERNELAPI NTSTATUS NTAPI ObOpenObjectByPointer( - IN PVOID Object, - IN ULONG HandleAttributes, - IN PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess OPTIONAL, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - OUT PHANDLE Handle); + _In_ PVOID Object, + _In_ ULONG HandleAttributes, + _In_opt_ PACCESS_STATE PassedAccessState, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PHANDLE Handle); NTKERNELAPI VOID NTAPI ObMakeTemporaryObject( - IN PVOID Object); + _In_ PVOID Object); NTKERNELAPI NTSTATUS NTAPI ObQueryNameString( - IN PVOID Object, - OUT POBJECT_NAME_INFORMATION ObjectNameInfo OPTIONAL, - IN ULONG Length, - OUT PULONG ReturnLength); + _In_ PVOID Object, + _Out_writes_bytes_opt_(Length) POBJECT_NAME_INFORMATION ObjectNameInfo, + _In_ ULONG Length, + _Out_ PULONG ReturnLength); NTKERNELAPI NTSTATUS NTAPI ObQueryObjectAuditingByHandle( - IN HANDLE Handle, - OUT PBOOLEAN GenerateOnClose); + _In_ HANDLE Handle, + _Out_ PBOOLEAN GenerateOnClose); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_VISTA) @@ -6172,7 +6466,7 @@ NTKERNELAPI BOOLEAN NTAPI ObIsKernelHandle( - IN HANDLE Handle); + _In_ HANDLE Handle); #endif @@ -6182,14 +6476,14 @@ NTKERNELAPI NTSTATUS NTAPI ObOpenObjectByPointerWithTag( - IN PVOID Object, - IN ULONG HandleAttributes, - IN PACCESS_STATE PassedAccessState OPTIONAL, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - IN ULONG Tag, - OUT PHANDLE Handle); + _In_ PVOID Object, + _In_ ULONG HandleAttributes, + _In_opt_ PACCESS_STATE PassedAccessState, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode, + _In_ ULONG Tag, + _Out_ PHANDLE Handle); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ /* FSRTL Types */ @@ -6295,9 +6589,9 @@ typedef enum _FSRTL_COMPARISON_RESULT { #define FSRTL_VOLUME_BACKGROUND_FORMAT 14 typedef VOID -(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) ( - IN PVOID Context, - IN PKEVENT Event); +(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE)( + _In_ PVOID Context, + _In_ PKEVENT Event); #if (NTDDI_VERSION >= NTDDI_VISTA) @@ -6305,12 +6599,12 @@ typedef VOID #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_ECPLIST_FLAG_CHARGE_QUOTA 0x00000001 -#define FSRTL_ALLOCATE_ECP_FLAG_CHARGE_QUOTA 0x00000001 -#define FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL 0x00000002 +#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_ECP_LOOKASIDE_FLAG_NONPAGED_POOL 0x00000002 #define FSRTL_VIRTDISK_FULLY_ALLOCATED 0x00000001 #define FSRTL_VIRTDISK_NO_DRIVE_LETTER 0x00000002 @@ -6326,8 +6620,8 @@ typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_2 { typedef VOID (*PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK) ( - IN OUT PVOID EcpContext, - IN LPCGUID EcpType); + _Inout_ PVOID EcpContext, + _In_ LPCGUID EcpType); typedef struct _ECP_LIST ECP_LIST, *PECP_LIST; @@ -6360,7 +6654,7 @@ typedef struct _FSRTL_PER_STREAM_CONTEXT { #if (NTDDI_VERSION >= NTDDI_WIN2K) typedef VOID (*PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS) ( - IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); + _In_ PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); #endif typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT { @@ -6374,8 +6668,8 @@ typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT { typedef NTSTATUS (NTAPI *PCOMPLETE_LOCK_IRP_ROUTINE) ( - IN PVOID Context, - IN PIRP Irp); + _In_ PVOID Context, + _In_ PIRP Irp); typedef struct _FILE_LOCK_INFO { LARGE_INTEGER StartingByte; @@ -6389,8 +6683,8 @@ typedef struct _FILE_LOCK_INFO { typedef VOID (NTAPI *PUNLOCK_ROUTINE) ( - IN PVOID Context, - IN PFILE_LOCK_INFO FileLockInfo); + _In_ PVOID Context, + _In_ PFILE_LOCK_INFO FileLockInfo); typedef struct _FILE_LOCK { PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine; @@ -6444,13 +6738,13 @@ typedef PVOID OPLOCK, *POPLOCK; typedef VOID (NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) ( - IN PVOID Context, - IN PIRP Irp); + _In_ PVOID Context, + _In_ PIRP Irp); typedef VOID (NTAPI *POPLOCK_FS_PREPOST_IRP) ( - IN PVOID Context, - IN PIRP Irp); + _In_ PVOID Context, + _In_ PIRP Irp); #if (NTDDI_VERSION >= NTDDI_VISTASP1) #define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED 0x00000001 @@ -6482,14 +6776,14 @@ typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER; typedef BOOLEAN (NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) ( - IN PVOID NotifyContext, - IN PVOID TargetContext OPTIONAL, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + _In_ PVOID NotifyContext, + _In_opt_ PVOID TargetContext, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext); typedef BOOLEAN (NTAPI *PFILTER_REPORT_CHANGE) ( - IN PVOID NotifyContext, - IN PVOID FilterContext); + _In_ PVOID NotifyContext, + _In_ PVOID FilterContext); /* FSRTL Functions */ #define FsRtlEnterFileSystem KeEnterCriticalRegion @@ -6497,124 +6791,145 @@ typedef BOOLEAN #if (NTDDI_VERSION >= NTDDI_WIN2K) +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCopyRead( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_ ULONG LockKey, + _Out_writes_bytes_(Length) PVOID Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ PDEVICE_OBJECT DeviceObject); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCopyWrite( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - IN PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_ ULONG LockKey, + _In_reads_bytes_(Length) PVOID Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ PDEVICE_OBJECT DeviceObject); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlMdlReadDev( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject OPTIONAL); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _Outptr_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_opt_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlMdlReadCompleteDev( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain, - IN PDEVICE_OBJECT DeviceObject OPTIONAL); + _In_ PFILE_OBJECT FileObject, + _In_ PMDL MdlChain, + _In_opt_ PDEVICE_OBJECT DeviceObject); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlPrepareMdlWriteDev( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN PDEVICE_OBJECT DeviceObject); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _Outptr_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ PDEVICE_OBJECT DeviceObject); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlMdlWriteCompleteDev( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain, - IN PDEVICE_OBJECT DeviceObject); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PMDL MdlChain, + _In_opt_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI FsRtlAcquireFileExclusive( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlReleaseFile( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlGetFileSize( - IN PFILE_OBJECT FileObject, - OUT PLARGE_INTEGER FileSize); + _In_ PFILE_OBJECT FileObject, + _Out_ PLARGE_INTEGER FileSize); +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI FsRtlIsTotalDeviceFailure( - IN NTSTATUS Status); + _In_ NTSTATUS Status); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFILE_LOCK NTAPI FsRtlAllocateFileLock( - IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, - IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL); + _In_opt_ PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine, + _In_opt_ PUNLOCK_ROUTINE UnlockRoutine); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlFreeFileLock( - IN PFILE_LOCK FileLock); + _In_ PFILE_LOCK FileLock); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlInitializeFileLock( - IN PFILE_LOCK FileLock, - IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL, - IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL); + _Out_ PFILE_LOCK FileLock, + _In_opt_ PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine, + _In_opt_ PUNLOCK_ROUTINE UnlockRoutine); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlUninitializeFileLock( - IN PFILE_LOCK FileLock); + _Inout_ PFILE_LOCK FileLock); /* FsRtlProcessFileLock: @@ -6637,13 +6952,15 @@ FsRtlUninitializeFileLock( -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines. -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock. */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlProcessFileLock( - IN PFILE_LOCK FileLock, - IN PIRP Irp, - IN PVOID Context OPTIONAL); + _In_ PFILE_LOCK FileLock, + _In_ PIRP Irp, + _In_opt_ PVOID Context); /* FsRtlCheckLockForReadAccess: @@ -6652,12 +6969,14 @@ FsRtlProcessFileLock( location?), get IoGetRequestorProcess, and pass values on to FsRtlFastCheckLockForRead. */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCheckLockForReadAccess( - IN PFILE_LOCK FileLock, - IN PIRP Irp); + _In_ PFILE_LOCK FileLock, + _In_ PIRP Irp); /* FsRtlCheckLockForWriteAccess: @@ -6666,34 +6985,40 @@ FsRtlCheckLockForReadAccess( location?), get IoGetRequestorProcess, and pass values on to FsRtlFastCheckLockForWrite. */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCheckLockForWriteAccess( - IN PFILE_LOCK FileLock, - IN PIRP Irp); + _In_ PFILE_LOCK FileLock, + _In_ PIRP Irp); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlFastCheckLockForRead( - IN PFILE_LOCK FileLock, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key, - IN PFILE_OBJECT FileObject, - IN PVOID Process); + _In_ PFILE_LOCK FileLock, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key, + _In_ PFILE_OBJECT FileObject, + _In_ PVOID Process); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlFastCheckLockForWrite( - IN PFILE_LOCK FileLock, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key, - IN PFILE_OBJECT FileObject, - IN PVOID Process); + _In_ PFILE_LOCK FileLock, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key, + _In_ PFILE_OBJECT FileObject, + _In_ PVOID Process); /* FsRtlGetNextFileLock: @@ -6707,44 +7032,49 @@ FsRtlFastCheckLockForWrite( list, and FsRtlGetNextFileLock needs this to get next lock on subsequent calls with Restart = FALSE. */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFILE_LOCK_INFO NTAPI FsRtlGetNextFileLock( - IN PFILE_LOCK FileLock, - IN BOOLEAN Restart); + _In_ PFILE_LOCK FileLock, + _In_ BOOLEAN Restart); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlFastUnlockSingle( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN PEPROCESS Process, - IN ULONG Key, - IN PVOID Context OPTIONAL, - IN BOOLEAN AlreadySynchronized); + _In_ PFILE_LOCK FileLock, + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ PEPROCESS Process, + _In_ ULONG Key, + _In_opt_ PVOID Context, + _In_ BOOLEAN AlreadySynchronized); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlFastUnlockAll( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PEPROCESS Process, - IN PVOID Context OPTIONAL); + _In_ PFILE_LOCK FileLock, + _In_ PFILE_OBJECT FileObject, + _In_ PEPROCESS Process, + _In_opt_ PVOID Context); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlFastUnlockAllByKey( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PEPROCESS Process, - IN ULONG Key, - IN PVOID Context OPTIONAL); + _In_ PFILE_LOCK FileLock, + _In_ PFILE_OBJECT FileObject, + _In_ PEPROCESS Process, + _In_ ULONG Key, + _In_opt_ PVOID Context); /* FsRtlPrivateLock: @@ -6755,536 +7085,622 @@ FsRtlFastUnlockAllByKey( -Calls IoCompleteRequest if Irp -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) +__drv_preferredFunction(FsRtlFastLock, "Obsolete") NTKERNELAPI BOOLEAN NTAPI FsRtlPrivateLock( - IN PFILE_LOCK FileLock, - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - IN PEPROCESS Process, - IN ULONG Key, - IN BOOLEAN FailImmediately, - IN BOOLEAN ExclusiveLock, - OUT PIO_STATUS_BLOCK IoStatus, - IN PIRP Irp OPTIONAL, - IN PVOID Context, - IN BOOLEAN AlreadySynchronized); + _In_ PFILE_LOCK FileLock, + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ PEPROCESS Process, + _In_ ULONG Key, + _In_ BOOLEAN FailImmediately, + _In_ BOOLEAN ExclusiveLock, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_opt_ PIRP Irp, + _In_opt_ __drv_aliasesMem PVOID Context, + _In_ BOOLEAN AlreadySynchronized); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlInitializeTunnelCache( - IN PTUNNEL Cache); + _In_ PTUNNEL Cache); +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ PTUNNEL Cache, + _In_ ULONGLONG DirectoryKey, + _In_ PUNICODE_STRING ShortName, + _In_ PUNICODE_STRING LongName, + _In_ BOOLEAN KeyByShortName, + _In_ ULONG DataLength, + _In_reads_bytes_(DataLength) PVOID Data); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ PTUNNEL Cache, + _In_ ULONGLONG DirectoryKey, + _In_ PUNICODE_STRING Name, + _Out_ PUNICODE_STRING ShortName, + _Out_ PUNICODE_STRING LongName, + _Inout_ PULONG DataLength, + _Out_writes_bytes_to_(*DataLength, *DataLength) PVOID Data); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlDeleteKeyFromTunnelCache( - IN PTUNNEL Cache, - IN ULONGLONG DirectoryKey); + _In_ PTUNNEL Cache, + _In_ ULONGLONG DirectoryKey); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlDeleteTunnelCache( - IN PTUNNEL Cache); + _In_ PTUNNEL Cache); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlDissectDbcs( - IN ANSI_STRING Name, - OUT PANSI_STRING FirstPart, - OUT PANSI_STRING RemainingPart); + _In_ ANSI_STRING Name, + _Out_ PANSI_STRING FirstPart, + _Out_ PANSI_STRING RemainingPart); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlDoesDbcsContainWildCards( - IN PANSI_STRING Name); + _In_ PANSI_STRING Name); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsDbcsInExpression( - IN PANSI_STRING Expression, - IN PANSI_STRING Name); + _In_ PANSI_STRING Expression, + _In_ PANSI_STRING Name); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsFatDbcsLegal( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible); + _In_ ANSI_STRING DbcsName, + _In_ BOOLEAN WildCardsPermissible, + _In_ BOOLEAN PathNamePermissible, + _In_ BOOLEAN LeadingBackslashPermissible); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsHpfsDbcsLegal( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible); + _In_ ANSI_STRING DbcsName, + _In_ BOOLEAN WildCardsPermissible, + _In_ BOOLEAN PathNamePermissible, + _In_ BOOLEAN LeadingBackslashPermissible); NTKERNELAPI NTSTATUS NTAPI FsRtlNormalizeNtstatus( - IN NTSTATUS Exception, - IN NTSTATUS GenericException); + _In_ NTSTATUS Exception, + _In_ NTSTATUS GenericException); +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI FsRtlIsNtstatusExpected( - IN NTSTATUS Ntstatus); + _In_ NTSTATUS Ntstatus); +_IRQL_requires_max_(APC_LEVEL) +__drv_preferredFunction(ExAllocateFromNPagedLookasideList, "The FsRtlAllocateResource routine is obsolete, but is exported to support existing driver binaries. Use ExAllocateFromNPagedLookasideList and ExInitializeResourceLite instead.") NTKERNELAPI PERESOURCE NTAPI -FsRtlAllocateResource( - VOID); +FsRtlAllocateResource(VOID); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlInitializeLargeMcb( - IN PLARGE_MCB Mcb, - IN POOL_TYPE PoolType); + _Out_ PLARGE_MCB Mcb, + _In_ POOL_TYPE PoolType); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlUninitializeLargeMcb( - IN PLARGE_MCB Mcb); + _Inout_ PLARGE_MCB Mcb); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlResetLargeMcb( - IN PLARGE_MCB Mcb, - IN BOOLEAN SelfSynchronized); + _Inout_ PLARGE_MCB Mcb, + _In_ BOOLEAN SelfSynchronized); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlTruncateLargeMcb( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn); + _Inout_ PLARGE_MCB Mcb, + _In_ LONGLONG Vbn); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlAddLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); + _Inout_ PLARGE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG Lbn, + _In_ LONGLONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlRemoveLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount); + _Inout_ PLARGE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ PLARGE_MCB Mcb, + _In_ LONGLONG Vbn, + _Out_opt_ PLONGLONG Lbn, + _Out_opt_ PLONGLONG SectorCountFromLbn, + _Out_opt_ PLONGLONG StartingLbn, + _Out_opt_ PLONGLONG SectorCountFromStartingLbn, + _Out_opt_ PULONG Index); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupLastLargeMcbEntry( - IN PLARGE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn); + _In_ PLARGE_MCB Mcb, + _Out_ PLONGLONG Vbn, + _Out_ PLONGLONG Lbn); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupLastLargeMcbEntryAndIndex( - IN PLARGE_MCB OpaqueMcb, - OUT PLONGLONG LargeVbn, - OUT PLONGLONG LargeLbn, - OUT PULONG Index); + _In_ PLARGE_MCB OpaqueMcb, + _Out_ PLONGLONG LargeVbn, + _Out_ PLONGLONG LargeLbn, + _Out_ PULONG Index); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI ULONG NTAPI FsRtlNumberOfRunsInLargeMcb( - IN PLARGE_MCB Mcb); + _In_ PLARGE_MCB Mcb); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlGetNextLargeMcbEntry( - IN PLARGE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount); + _In_ PLARGE_MCB Mcb, + _In_ ULONG RunIndex, + _Out_ PLONGLONG Vbn, + _Out_ PLONGLONG Lbn, + _Out_ PLONGLONG SectorCount); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlSplitLargeMcb( - IN PLARGE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount); + _Inout_ PLARGE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG Amount); +_IRQL_requires_max_(APC_LEVEL) +__drv_preferredFunction(FsRtlInitializeLargeMcb, "Obsolete") NTKERNELAPI VOID NTAPI FsRtlInitializeMcb( - IN PMCB Mcb, - IN POOL_TYPE PoolType); + _Out_ PMCB Mcb, + _In_ POOL_TYPE PoolType); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlUninitializeMcb( - IN PMCB Mcb); + _Inout_ PMCB Mcb); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlTruncateMcb( - IN PMCB Mcb, - IN VBN Vbn); + _Inout_ PMCB Mcb, + _In_ VBN Vbn); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlAddMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - IN LBN Lbn, - IN ULONG SectorCount); + _Inout_ PMCB Mcb, + _In_ VBN Vbn, + _In_ LBN Lbn, + _In_ ULONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlRemoveMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - IN ULONG SectorCount); + _Inout_ PMCB Mcb, + _In_ VBN Vbn, + _In_ ULONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupMcbEntry( - IN PMCB Mcb, - IN VBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount OPTIONAL, - OUT PULONG Index); + _In_ PMCB Mcb, + _In_ VBN Vbn, + _Out_ PLBN Lbn, + _Out_opt_ PULONG SectorCount, + _Out_ PULONG Index); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupLastMcbEntry( - IN PMCB Mcb, - OUT PVBN Vbn, - OUT PLBN Lbn); + _In_ PMCB Mcb, + _Out_ PVBN Vbn, + _Out_ PLBN Lbn); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI ULONG NTAPI FsRtlNumberOfRunsInMcb( - IN PMCB Mcb); + _In_ PMCB Mcb); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlGetNextMcbEntry( - IN PMCB Mcb, - IN ULONG RunIndex, - OUT PVBN Vbn, - OUT PLBN Lbn, - OUT PULONG SectorCount); + _In_ PMCB Mcb, + _In_ ULONG RunIndex, + _Out_ PVBN Vbn, + _Out_ PLBN Lbn, + _Out_ PULONG SectorCount); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlBalanceReads( - IN PDEVICE_OBJECT TargetDevice); + _In_ PDEVICE_OBJECT TargetDevice); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlInitializeOplock( - IN OUT POPLOCK Oplock); + _Inout_ POPLOCK Oplock); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlUninitializeOplock( - IN OUT POPLOCK Oplock); + _Inout_ POPLOCK Oplock); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlOplockFsctrl( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount); + _In_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_ ULONG OpenCount); +_When_(CompletionRoutine != NULL, _Must_inspect_result_) +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_opt_ PVOID Context, + _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, + _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlOplockIsFastIoPossible( - IN POPLOCK Oplock); + _In_ POPLOCK Oplock); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCurrentBatchOplock( - IN POPLOCK Oplock); + _In_ POPLOCK Oplock); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlNotifyVolumeEvent( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode); + _In_ PFILE_OBJECT FileObject, + _In_ ULONG EventCode); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlNotifyInitializeSync( - IN PNOTIFY_SYNC *NotifySync); + _In_ PNOTIFY_SYNC *NotifySync); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlNotifyUninitializeSync( - IN PNOTIFY_SYNC *NotifySync); + _In_ PNOTIFY_SYNC *NotifySync); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList, + _In_ PVOID FsContext, + _In_ PSTRING FullDirectoryName, + _In_ BOOLEAN WatchTree, + _In_ BOOLEAN IgnoreBuffer, + _In_ ULONG CompletionFilter, + _In_opt_ PIRP NotifyIrp, + _In_opt_ PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback, + _In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectContext); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList, + _In_ PSTRING FullTargetName, + _In_ USHORT TargetNameOffset, + _In_opt_ PSTRING StreamName, + _In_opt_ PSTRING NormalizedParentName, + _In_ ULONG FilterMatch, + _In_ ULONG Action, + _In_opt_ PVOID TargetContext, + _In_opt_ PVOID FilterContext); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList, + _In_ PSTRING FullTargetName, + _In_ USHORT TargetNameOffset, + _In_opt_ PSTRING StreamName, + _In_opt_ PSTRING NormalizedParentName, + _In_ ULONG FilterMatch, + _In_ ULONG Action, + _In_opt_ PVOID TargetContext); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlNotifyCleanup( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList, - IN PVOID FsContext); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList, + _In_ PVOID FsContext); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI FsRtlDissectName( - IN UNICODE_STRING Name, - OUT PUNICODE_STRING FirstPart, - OUT PUNICODE_STRING RemainingPart); + _In_ UNICODE_STRING Name, + _Out_ PUNICODE_STRING FirstPart, + _Out_ PUNICODE_STRING RemainingPart); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlDoesNameContainWildCards( - IN PUNICODE_STRING Name); + _In_ PUNICODE_STRING Name); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlAreNamesEqual( - IN PCUNICODE_STRING Name1, - IN PCUNICODE_STRING Name2, - IN BOOLEAN IgnoreCase, - IN PCWCH UpcaseTable OPTIONAL); + _In_ PCUNICODE_STRING Name1, + _In_ PCUNICODE_STRING Name2, + _In_ BOOLEAN IgnoreCase, + _In_reads_opt_(0x10000) PCWCH UpcaseTable); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsNameInExpression( - IN PUNICODE_STRING Expression, - IN PUNICODE_STRING Name, - IN BOOLEAN IgnoreCase, - IN PWCHAR UpcaseTable OPTIONAL); + _In_ PUNICODE_STRING Expression, + _In_ PUNICODE_STRING Name, + _In_ BOOLEAN IgnoreCase, + _In_opt_ PWCHAR UpcaseTable); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI FsRtlPostPagingFileStackOverflow( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); + _In_ PVOID Context, + _In_ PKEVENT Event, + _In_ PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI FsRtlPostStackOverflow ( - IN PVOID Context, - IN PKEVENT Event, - IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); + _In_ PVOID Context, + _In_ PKEVENT Event, + _In_ PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlRegisterUncProvider( - OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirectorDeviceName, - IN BOOLEAN MailslotsSupported); + _Out_ PHANDLE MupHandle, + _In_ PUNICODE_STRING RedirectorDeviceName, + _In_ BOOLEAN MailslotsSupported); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI FsRtlDeregisterUncProvider( - IN HANDLE Handle); + _In_ HANDLE Handle); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlTeardownPerStreamContexts( - IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); + _In_ PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _Out_ PHANDLE SectionHandle, + _Outptr_ PVOID *SectionObject, + _Out_opt_ PLARGE_INTEGER SectionFileSize, + _In_ PFILE_OBJECT FileObject, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PLARGE_INTEGER MaximumSize, + _In_ ULONG SectionPageProtection, + _In_ ULONG AllocationAttributes, + _In_ ULONG Flags); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList, + _In_ PVOID FsContext, + _In_ PSTRING FullDirectoryName, + _In_ BOOLEAN WatchTree, + _In_ BOOLEAN IgnoreBuffer, + _In_ ULONG CompletionFilter, + _In_opt_ PIRP NotifyIrp, + _In_opt_ PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback, + _In_opt_ PSECURITY_SUBJECT_CONTEXT SubjectContext, + _In_opt_ PFILTER_REPORT_CHANGE FilterCallback); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlInsertPerStreamContext( - IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, - IN PFSRTL_PER_STREAM_CONTEXT Ptr); + _In_ PFSRTL_ADVANCED_FCB_HEADER PerStreamContext, + _In_ PFSRTL_PER_STREAM_CONTEXT Ptr); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_STREAM_CONTEXT NTAPI FsRtlLookupPerStreamContextInternal( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PFSRTL_ADVANCED_FCB_HEADER StreamContext, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_STREAM_CONTEXT NTAPI FsRtlRemovePerStreamContext( - IN PFSRTL_ADVANCED_FCB_HEADER StreamContext, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PFSRTL_ADVANCED_FCB_HEADER StreamContext, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); NTKERNELAPI VOID @@ -7295,548 +7711,639 @@ FsRtlIncrementCcFastReadNotPossible( NTKERNELAPI VOID NTAPI -FsRtlIncrementCcFastReadWait( - VOID); +FsRtlIncrementCcFastReadWait(VOID); NTKERNELAPI VOID NTAPI -FsRtlIncrementCcFastReadNoWait( - VOID); +FsRtlIncrementCcFastReadNoWait(VOID); NTKERNELAPI VOID NTAPI -FsRtlIncrementCcFastReadResourceMiss( - VOID); +FsRtlIncrementCcFastReadResourceMiss(VOID); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI LOGICAL NTAPI FsRtlIsPagingFile( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_WS03) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlInitializeBaseMcb( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType); + _Out_ PBASE_MCB Mcb, + _In_ POOL_TYPE PoolType); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlUninitializeBaseMcb( - IN PBASE_MCB Mcb); + _In_ PBASE_MCB Mcb); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlResetBaseMcb( - IN PBASE_MCB Mcb); + _Out_ PBASE_MCB Mcb); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlTruncateBaseMcb( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn); + _Inout_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlAddBaseMcbEntry( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); + _Inout_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG Lbn, + _In_ LONGLONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlRemoveBaseMcbEntry( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG SectorCount); + _Inout_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn, + _Out_opt_ PLONGLONG Lbn, + _Out_opt_ PLONGLONG SectorCountFromLbn, + _Out_opt_ PLONGLONG StartingLbn, + _Out_opt_ PLONGLONG SectorCountFromStartingLbn, + _Out_opt_ PULONG Index); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupLastBaseMcbEntry( - IN PBASE_MCB Mcb, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn); + _In_ PBASE_MCB Mcb, + _Out_ PLONGLONG Vbn, + _Out_ PLONGLONG Lbn); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlLookupLastBaseMcbEntryAndIndex( - IN PBASE_MCB OpaqueMcb, - IN OUT PLONGLONG LargeVbn, - IN OUT PLONGLONG LargeLbn, - IN OUT PULONG Index); + _In_ PBASE_MCB OpaqueMcb, + _Inout_ PLONGLONG LargeVbn, + _Inout_ PLONGLONG LargeLbn, + _Inout_ PULONG Index); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI ULONG NTAPI FsRtlNumberOfRunsInBaseMcb( - IN PBASE_MCB Mcb); + _In_ PBASE_MCB Mcb); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlGetNextBaseMcbEntry( - IN PBASE_MCB Mcb, - IN ULONG RunIndex, - OUT PLONGLONG Vbn, - OUT PLONGLONG Lbn, - OUT PLONGLONG SectorCount); + _In_ PBASE_MCB Mcb, + _In_ ULONG RunIndex, + _Out_ PLONGLONG Vbn, + _Out_ PLONGLONG Lbn, + _Out_ PLONGLONG SectorCount); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlSplitBaseMcb( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Amount); + _Inout_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG Amount); #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ #if (NTDDI_VERSION >= NTDDI_VISTA) +_When_(!Flags & MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE, _Must_inspect_result_) +_IRQL_requires_max_(APC_LEVEL) BOOLEAN NTAPI FsRtlInitializeBaseMcbEx( - IN PBASE_MCB Mcb, - IN POOL_TYPE PoolType, - IN USHORT Flags); + _Out_ PBASE_MCB Mcb, + _In_ POOL_TYPE PoolType, + _In_ USHORT Flags); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTSTATUS NTAPI FsRtlAddBaseMcbEntryEx( - IN PBASE_MCB Mcb, - IN LONGLONG Vbn, - IN LONGLONG Lbn, - IN LONGLONG SectorCount); + _Inout_ PBASE_MCB Mcb, + _In_ LONGLONG Vbn, + _In_ LONGLONG Lbn, + _In_ LONGLONG SectorCount); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCurrentOplock( - IN POPLOCK Oplock); + _In_ POPLOCK Oplock); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _Inout_ POPLOCK Oplock, + _In_opt_ PIO_STACK_LOCATION IrpSp, + _In_ PIRP Irp, + _In_opt_ PVOID Context, + _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, + _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlNotifyVolumeEventEx( - IN PFILE_OBJECT FileObject, - IN ULONG EventCode, - IN PTARGET_DEVICE_CUSTOM_NOTIFICATION Event); + _In_ PFILE_OBJECT FileObject, + _In_ ULONG EventCode, + _In_ PTARGET_DEVICE_CUSTOM_NOTIFICATION Event); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlNotifyCleanupAll( - IN PNOTIFY_SYNC NotifySync, - IN PLIST_ENTRY NotifyList); + _In_ PNOTIFY_SYNC NotifySync, + _In_ PLIST_ENTRY NotifyList); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI FsRtlRegisterUncProviderEx( - OUT PHANDLE MupHandle, - IN PUNICODE_STRING RedirDevName, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG Flags); + _Out_ PHANDLE MupHandle, + _In_ PUNICODE_STRING RedirDevName, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG Flags); +_Must_inspect_result_ +_When_(Irp!=NULL, _IRQL_requires_max_(PASSIVE_LEVEL)) +_When_(Irp==NULL, _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI NTSTATUS NTAPI FsRtlCancellableWaitForSingleObject( - IN PVOID Object, - IN PLARGE_INTEGER Timeout OPTIONAL, - IN PIRP Irp OPTIONAL); + _In_ PVOID Object, + _In_opt_ PLARGE_INTEGER Timeout, + _In_opt_ PIRP Irp); +_Must_inspect_result_ +_When_(Irp != NULL, _IRQL_requires_max_(PASSIVE_LEVEL)) +_When_(Irp == NULL, _IRQL_requires_max_(APC_LEVEL)) 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); + _In_ ULONG Count, + _In_reads_(Count) PVOID ObjectArray[], + _In_ WAIT_TYPE WaitType, + _In_opt_ PLARGE_INTEGER Timeout, + _In_opt_ PKWAIT_BLOCK WaitBlockArray, + _In_opt_ PIRP Irp); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlMupGetProviderInfoFromFileObject( - IN PFILE_OBJECT pFileObject, - IN ULONG Level, - OUT PVOID pBuffer, - IN OUT PULONG pBufferSize); + _In_ PFILE_OBJECT pFileObject, + _In_ ULONG Level, + _Out_writes_bytes_(*pBufferSize) PVOID pBuffer, + _Inout_ PULONG pBufferSize); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlMupGetProviderIdFromName( - IN PUNICODE_STRING pProviderName, - OUT PULONG32 pProviderId); + _In_ PUNICODE_STRING pProviderName, + _Out_ PULONG32 pProviderId); NTKERNELAPI VOID NTAPI -FsRtlIncrementCcFastMdlReadWait( - VOID); +FsRtlIncrementCcFastMdlReadWait(VOID); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlValidateReparsePointBuffer( - IN ULONG BufferLength, - IN PREPARSE_DATA_BUFFER ReparseBuffer); + _In_ ULONG BufferLength, + _In_reads_bytes_(BufferLength) PREPARSE_DATA_BUFFER ReparseBuffer); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlRemoveDotsFromPath( - IN OUT PWSTR OriginalString, - IN USHORT PathLength, - OUT USHORT *NewLength); + _Inout_updates_bytes_(PathLength) PWSTR OriginalString, + _In_ USHORT PathLength, + _Out_ USHORT *NewLength); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlAllocateExtraCreateParameterList( - IN FSRTL_ALLOCATE_ECPLIST_FLAGS Flags, - OUT PECP_LIST *EcpList); + _In_ FSRTL_ALLOCATE_ECPLIST_FLAGS Flags, + _Outptr_ PECP_LIST *EcpList); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlFreeExtraCreateParameterList( - IN PECP_LIST EcpList); + _In_ PECP_LIST EcpList); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ LPCGUID EcpType, + _In_ ULONG SizeOfContext, + _In_ FSRTL_ALLOCATE_ECP_FLAGS Flags, + _In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback, + _In_ ULONG PoolTag, + _Outptr_result_bytebuffer_(SizeOfContext) PVOID *EcpContext); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlFreeExtraCreateParameter( - IN PVOID EcpContext); + _In_ PVOID EcpContext); +_When_(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(!(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL), _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI VOID NTAPI FsRtlInitExtraCreateParameterLookasideList( - IN OUT PVOID Lookaside, - IN FSRTL_ECP_LOOKASIDE_FLAGS Flags, - IN SIZE_T Size, - IN ULONG Tag); + _Inout_ PVOID Lookaside, + _In_ FSRTL_ECP_LOOKASIDE_FLAGS Flags, + _In_ SIZE_T Size, + _In_ ULONG Tag); +_When_(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(!(Flags|FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL), _IRQL_requires_max_(APC_LEVEL)) VOID NTAPI FsRtlDeleteExtraCreateParameterLookasideList( - IN OUT PVOID Lookaside, - IN FSRTL_ECP_LOOKASIDE_FLAGS Flags); + _Inout_ PVOID Lookaside, + _In_ FSRTL_ECP_LOOKASIDE_FLAGS Flags); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ LPCGUID EcpType, + ULONG SizeOfContext, + _In_ FSRTL_ALLOCATE_ECP_FLAGS Flags, + _In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback, + _Inout_ PVOID LookasideList, + _Outptr_ PVOID *EcpContext); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlInsertExtraCreateParameter( - IN OUT PECP_LIST EcpList, - IN OUT PVOID EcpContext); + _Inout_ PECP_LIST EcpList, + _Inout_ PVOID EcpContext); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlFindExtraCreateParameter( - IN PECP_LIST EcpList, - IN LPCGUID EcpType, - OUT PVOID *EcpContext OPTIONAL, - OUT ULONG *EcpContextSize OPTIONAL); + _In_ PECP_LIST EcpList, + _In_ LPCGUID EcpType, + _Outptr_opt_ PVOID *EcpContext, + _Out_opt_ ULONG *EcpContextSize); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlRemoveExtraCreateParameter( - IN OUT PECP_LIST EcpList, - IN LPCGUID EcpType, - OUT PVOID *EcpContext, - OUT ULONG *EcpContextSize OPTIONAL); + _Inout_ PECP_LIST EcpList, + _In_ LPCGUID EcpType, + _Outptr_ PVOID *EcpContext, + _Out_opt_ ULONG *EcpContextSize); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlGetEcpListFromIrp( - IN PIRP Irp, - OUT PECP_LIST *EcpList OPTIONAL); + _In_ PIRP Irp, + _Outptr_result_maybenull_ PECP_LIST *EcpList); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlSetEcpListIntoIrp( - IN OUT PIRP Irp, - IN PECP_LIST EcpList); + _Inout_ PIRP Irp, + _In_ PECP_LIST EcpList); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlGetNextExtraCreateParameter( - IN PECP_LIST EcpList, - IN PVOID CurrentEcpContext OPTIONAL, - OUT LPGUID NextEcpType OPTIONAL, - OUT PVOID *NextEcpContext OPTIONAL, - OUT ULONG *NextEcpContextSize OPTIONAL); + _In_ PECP_LIST EcpList, + _In_opt_ PVOID CurrentEcpContext, + _Out_opt_ LPGUID NextEcpType, + _Outptr_opt_ PVOID *NextEcpContext, + _Out_opt_ ULONG *NextEcpContextSize); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlAcknowledgeEcp( - IN PVOID EcpContext); + _In_ PVOID EcpContext); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsEcpAcknowledged( - IN PVOID EcpContext); + _In_ PVOID EcpContext); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlIsEcpFromUserMode( - IN PVOID EcpContext); + _In_ PVOID EcpContext); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlChangeBackingFileObject( - IN PFILE_OBJECT CurrentFileObject OPTIONAL, - IN PFILE_OBJECT NewFileObject, - IN FSRTL_CHANGE_BACKING_TYPE ChangeBackingType, - IN ULONG Flags); + _In_opt_ PFILE_OBJECT CurrentFileObject, + _In_ PFILE_OBJECT NewFileObject, + _In_ FSRTL_CHANGE_BACKING_TYPE ChangeBackingType, + _In_ ULONG Flags); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlLogCcFlushError( - IN PUNICODE_STRING FileName, - IN PDEVICE_OBJECT DeviceObject, - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN NTSTATUS FlushError, - IN ULONG Flags); + _In_ PUNICODE_STRING FileName, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_ NTSTATUS FlushError, + _In_ ULONG Flags); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI -FsRtlAreVolumeStartupApplicationsComplete( - VOID); +FsRtlAreVolumeStartupApplicationsComplete(VOID); NTKERNELAPI ULONG NTAPI -FsRtlQueryMaximumVirtualDiskNestingLevel( - VOID); +FsRtlQueryMaximumVirtualDiskNestingLevel(VOID); NTKERNELAPI NTSTATUS NTAPI FsRtlGetVirtualDiskNestingLevel( - IN PDEVICE_OBJECT DeviceObject, - OUT PULONG NestingLevel, - OUT PULONG NestingFlags OPTIONAL); + _In_ PDEVICE_OBJECT DeviceObject, + _Out_ PULONG NestingLevel, + _Out_opt_ PULONG NestingFlags); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #if (NTDDI_VERSION >= NTDDI_VISTASP1) +_When_(Flags | OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK, _Must_inspect_result_) +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_ ULONG Flags, + _In_opt_ PVOID Context, + _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, + _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine); #endif #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlAreThereCurrentOrInProgressFileLocks( - IN PFILE_LOCK FileLock); + _In_ PFILE_LOCK FileLock); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlOplockIsSharedRequest( - IN PIRP Irp); + _In_ PIRP Irp); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _In_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_ ULONG Flags, + _In_opt_ PVOID Context, + _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, + _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlCurrentOplockH( - IN POPLOCK Oplock); + _In_ POPLOCK Oplock); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) 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); + _Inout_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_ ULONG Flags, + _In_opt_ PVOID Context, + _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, + _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlOplockFsctrlEx( - IN POPLOCK Oplock, - IN PIRP Irp, - IN ULONG OpenCount, - IN ULONG Flags); + _In_ POPLOCK Oplock, + _In_ PIRP Irp, + _In_ ULONG OpenCount, + _In_ ULONG Flags); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI BOOLEAN NTAPI FsRtlOplockKeysEqual( - IN PFILE_OBJECT Fo1 OPTIONAL, - IN PFILE_OBJECT Fo2 OPTIONAL); + _In_opt_ PFILE_OBJECT Fo1, + _In_opt_ PFILE_OBJECT Fo2); NTKERNELAPI NTSTATUS NTAPI FsRtlInitializeExtraCreateParameterList( - IN OUT PECP_LIST EcpList); + _Inout_ 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); + _Out_ PECP_HEADER Ecp, + _In_ ULONG EcpFlags, + _In_opt_ PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback, + _In_ ULONG TotalSize, + _In_ LPCGUID EcpType, + _In_opt_ PVOID ListAllocatedFrom); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlInsertPerFileContext( - IN PVOID* PerFileContextPointer, - IN PFSRTL_PER_FILE_CONTEXT Ptr); + _In_ PVOID* PerFileContextPointer, + _In_ PFSRTL_PER_FILE_CONTEXT Ptr); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_FILE_CONTEXT NTAPI FsRtlLookupPerFileContext( - IN PVOID* PerFileContextPointer, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PVOID* PerFileContextPointer, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_FILE_CONTEXT NTAPI FsRtlRemovePerFileContext( - IN PVOID* PerFileContextPointer, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PVOID* PerFileContextPointer, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI FsRtlTeardownPerFileContexts( - IN PVOID* PerFileContextPointer); + _In_ PVOID* PerFileContextPointer); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI FsRtlInsertPerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr); + _In_ PFILE_OBJECT FileObject, + _In_ PFSRTL_PER_FILEOBJECT_CONTEXT Ptr); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_FILEOBJECT_CONTEXT NTAPI FsRtlLookupPerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PFILE_OBJECT FileObject, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PFSRTL_PER_FILEOBJECT_CONTEXT NTAPI FsRtlRemovePerFileObjectContext( - IN PFILE_OBJECT FileObject, - IN PVOID OwnerId OPTIONAL, - IN PVOID InstanceId OPTIONAL); + _In_ PFILE_OBJECT FileObject, + _In_opt_ PVOID OwnerId, + _In_opt_ PVOID InstanceId); #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) \ @@ -7954,12 +8461,13 @@ extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray; FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \ NULL) +_IRQL_requires_max_(APC_LEVEL) FORCEINLINE VOID NTAPI FsRtlSetupAdvancedHeader( - IN PVOID AdvHdr, - IN PFAST_MUTEX FMutex ) + _In_ PVOID AdvHdr, + _In_ PFAST_MUTEX FMutex ) { PFSRTL_ADVANCED_FCB_HEADER localAdvHdr = (PFSRTL_ADVANCED_FCB_HEADER)AdvHdr; @@ -8007,21 +8515,21 @@ typedef struct _CC_FILE_SIZES { typedef BOOLEAN (NTAPI *PACQUIRE_FOR_LAZY_WRITE) ( - IN PVOID Context, - IN BOOLEAN Wait); + _In_ PVOID Context, + _In_ BOOLEAN Wait); typedef VOID (NTAPI *PRELEASE_FROM_LAZY_WRITE) ( - IN PVOID Context); + _In_ PVOID Context); typedef BOOLEAN (NTAPI *PACQUIRE_FOR_READ_AHEAD) ( - IN PVOID Context, - IN BOOLEAN Wait); + _In_ PVOID Context, + _In_ BOOLEAN Wait); typedef VOID (NTAPI *PRELEASE_FROM_READ_AHEAD) ( - IN PVOID Context); + _In_ PVOID Context); typedef struct _CACHE_MANAGER_CALLBACKS { PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite; @@ -8037,23 +8545,23 @@ typedef struct _CACHE_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); + _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); + _In_ PVOID LogHandle, + _In_ LARGE_INTEGER Lsn); typedef VOID (NTAPI *PCC_POST_DEFERRED_WRITE) ( - IN PVOID Context1, - IN PVOID Context2); + _In_ PVOID Context1, + _In_ PVOID Context2); #define UNINITIALIZE_CACHE_MAPS (1) #define DO_NOT_RETRY_PURGE (2) @@ -8075,19 +8583,19 @@ NTKERNELAPI VOID NTAPI CcInitializeCacheMap( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes, - IN BOOLEAN PinAccess, - IN PCACHE_MANAGER_CALLBACKS Callbacks, - IN PVOID LazyWriteContext); + _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); + _In_ PFILE_OBJECT FileObject, + _In_opt_ PLARGE_INTEGER TruncateSize, + _In_opt_ PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent); NTKERNELAPI VOID @@ -8100,256 +8608,255 @@ NTKERNELAPI VOID NTAPI CcSetDirtyPageThreshold( - IN PFILE_OBJECT FileObject, - IN ULONG DirtyPageThreshold); + _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); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_opt_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _Out_opt_ PIO_STATUS_BLOCK IoStatus); NTKERNELAPI LARGE_INTEGER NTAPI CcGetFlushedValidData( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN BOOLEAN BcbListHeld); + _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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER StartOffset, + _In_ PLARGE_INTEGER EndOffset, + _In_ BOOLEAN Wait); NTKERNELAPI PVOID NTAPI CcRemapBcb( - IN PVOID Bcb); + _In_ PVOID Bcb); NTKERNELAPI VOID NTAPI CcRepinBcb( - IN PVOID Bcb); + _In_ PVOID Bcb); NTKERNELAPI VOID NTAPI CcUnpinRepinnedBcb( - IN PVOID Bcb, - IN BOOLEAN WriteThrough, - OUT PIO_STATUS_BLOCK IoStatus); + _In_ PVOID Bcb, + _In_ BOOLEAN WriteThrough, + _Out_ PIO_STATUS_BLOCK IoStatus); NTKERNELAPI PFILE_OBJECT NTAPI CcGetFileObjectFromSectionPtrs( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer); NTKERNELAPI PFILE_OBJECT NTAPI CcGetFileObjectFromBcb( - IN PVOID Bcb); + _In_ PVOID Bcb); NTKERNELAPI BOOLEAN NTAPI CcCanIWrite( - IN PFILE_OBJECT FileObject, - IN ULONG BytesToWrite, - IN BOOLEAN Wait, - IN BOOLEAN Retrying); + _In_opt_ 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); + _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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _Out_writes_bytes_(Length) 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); + _In_ PFILE_OBJECT FileObject, + _In_ ULONG FileOffset, + _In_ ULONG Length, + _In_ ULONG PageCount, + _Out_writes_bytes_(Length) 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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_reads_bytes_(Length) PVOID Buffer); NTKERNELAPI VOID NTAPI CcFastCopyWrite( - IN PFILE_OBJECT FileObject, - IN ULONG FileOffset, - IN ULONG Length, - IN PVOID Buffer); + _In_ PFILE_OBJECT FileObject, + _In_ ULONG FileOffset, + _In_ ULONG Length, + _In_reads_bytes_(Length) 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); + _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); + _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); + _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); + _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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length); NTKERNELAPI NTSTATUS NTAPI -CcWaitForCurrentLazyWriterActivity( - VOID); +CcWaitForCurrentLazyWriterActivity(VOID); NTKERNELAPI VOID NTAPI CcSetReadAheadGranularity( - IN PFILE_OBJECT FileObject, - IN ULONG Granularity); + _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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG Flags, + _Outptr_ PVOID *Bcb, + _Outptr_result_bytebuffer_(Length) PVOID *Buffer); NTKERNELAPI BOOLEAN NTAPI CcPinMappedData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - IN OUT PVOID *Bcb); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG Flags, + _Inout_ 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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Zero, + _In_ ULONG Flags, + _Outptr_ PVOID *Bcb, + _Outptr_result_bytebuffer_(Length) PVOID *Buffer); NTKERNELAPI VOID NTAPI CcSetDirtyPinnedData( - IN PVOID BcbVoid, - IN PLARGE_INTEGER Lsn OPTIONAL); + _In_ PVOID BcbVoid, + _In_opt_ PLARGE_INTEGER Lsn); NTKERNELAPI VOID NTAPI CcUnpinData( - IN PVOID Bcb); + _In_ PVOID Bcb); NTKERNELAPI VOID NTAPI CcSetBcbOwnerPointer( - IN PVOID Bcb, - IN PVOID OwnerPointer); + _In_ PVOID Bcb, + _In_ PVOID OwnerPointer); NTKERNELAPI VOID NTAPI CcUnpinDataForThread( - IN PVOID Bcb, - IN ERESOURCE_THREAD ResourceThreadId); + _In_ PVOID Bcb, + _In_ ERESOURCE_THREAD ResourceThreadId); NTKERNELAPI VOID NTAPI CcSetAdditionalCacheAttributes( - IN PFILE_OBJECT FileObject, - IN BOOLEAN DisableReadAhead, - IN BOOLEAN DisableWriteBehind); + _In_ PFILE_OBJECT FileObject, + _In_ BOOLEAN DisableReadAhead, + _In_ BOOLEAN DisableWriteBehind); NTKERNELAPI BOOLEAN NTAPI CcIsThereDirtyData( - IN PVPB Vpb); + _In_ PVPB Vpb); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -8359,25 +8866,25 @@ NTKERNELAPI VOID NTAPI CcMdlWriteAbort( - IN PFILE_OBJECT FileObject, - IN PMDL MdlChain); + _In_ PFILE_OBJECT FileObject, + _In_ PMDL MdlChain); NTKERNELAPI VOID NTAPI CcSetLogHandleForFile( - IN PFILE_OBJECT FileObject, - IN PVOID LogHandle, - IN PFLUSH_TO_LSN FlushToLsnRoutine); + _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); + _In_ PVOID LogHandle, + _In_ PDIRTY_PAGE_ROUTINE DirtyPageRoutine, + _In_ PVOID Context1, + _In_ PVOID Context2); #endif @@ -8386,23 +8893,23 @@ NTKERNELAPI BOOLEAN NTAPI CcMapData( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG Flags, - OUT PVOID *Bcb, - OUT PVOID *Buffer); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG Flags, + _Outptr_ PVOID *Bcb, + _Outptr_result_bytebuffer_(Length) 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); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _Outptr_ PVOID *Bcb, + _Outptr_result_bytebuffer_(Length) PVOID *Buffer); #endif #if (NTDDI_VERSION >= NTDDI_VISTA) @@ -8411,27 +8918,27 @@ NTKERNELAPI NTSTATUS NTAPI CcSetFileSizesEx( - IN PFILE_OBJECT FileObject, - IN PCC_FILE_SIZES FileSizes); + _In_ PFILE_OBJECT FileObject, + _In_ PCC_FILE_SIZES FileSizes); NTKERNELAPI PFILE_OBJECT NTAPI CcGetFileObjectFromSectionPtrsRef( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer); NTKERNELAPI VOID NTAPI CcSetParallelFlushFile( - IN PFILE_OBJECT FileObject, - IN BOOLEAN EnableParallelFlush); + _In_ PFILE_OBJECT FileObject, + _In_ BOOLEAN EnableParallelFlush); NTKERNELAPI BOOLEAN CcIsThereDirtyDataEx( - IN PVPB Vpb, - IN PULONG NumberOfDirtyPages OPTIONAL); + _In_ PVPB Vpb, + _In_opt_ PULONG NumberOfDirtyPages); #endif @@ -8440,11 +8947,11 @@ 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); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_opt_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_opt_ ULONG Flags); #endif #define CcGetFileSizePointer(FO) ( \ @@ -8456,19 +8963,19 @@ NTKERNELAPI BOOLEAN NTAPI CcPurgeCacheSection( - IN PSECTION_OBJECT_POINTERS SectionObjectPointer, - IN PLARGE_INTEGER FileOffset OPTIONAL, - IN ULONG Length, - IN ULONG Flags); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_opt_ PLARGE_INTEGER FileOffset, + _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); + _In_ PSECTION_OBJECT_POINTERS SectionObjectPointer, + _In_opt_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN UninitializeCacheMaps); #endif #if (NTDDI_VERSION >= NTDDI_WIN7) @@ -8476,9 +8983,9 @@ NTKERNELAPI BOOLEAN NTAPI CcCopyWriteWontFlush( - IN PFILE_OBJECT FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length); + _In_ PFILE_OBJECT FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length); #else #define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000) #endif @@ -8494,307 +9001,339 @@ CcCopyWriteWontFlush( +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_ BOOLEAN ReturnSingleEntry, + _In_reads_bytes_opt_(EaListLength) PVOID EaList, + _In_ ULONG EaListLength, + _In_opt_ PULONG EaIndex, + _In_ BOOLEAN RestartScan); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetEaFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE ExistingTokenHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ BOOLEAN EffectiveOnly, + _In_ TOKEN_TYPE TokenType, + _Out_ PHANDLE NewTokenHandle); #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQueryObject( - IN HANDLE Handle OPTIONAL, - IN OBJECT_INFORMATION_CLASS ObjectInformationClass, - OUT PVOID ObjectInformation OPTIONAL, - IN ULONG ObjectInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_opt_ HANDLE Handle, + _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass, + _Out_writes_bytes_opt_(ObjectInformationLength) PVOID ObjectInformation, + _In_ ULONG ObjectInformationLength, + _Out_opt_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE KeyHandle, + _In_opt_ HANDLE EventHandle, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG NotifyFilter, + _In_ BOOLEAN WatchSubtree, + _Out_writes_bytes_opt_(BufferLength) PVOID Buffer, + _In_ ULONG BufferLength, + _In_ BOOLEAN Asynchronous); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwCreateEvent( - OUT PHANDLE EventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN EVENT_TYPE EventType, - IN BOOLEAN InitialState); + _Out_ PHANDLE EventHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ EVENT_TYPE EventType, + _In_ BOOLEAN InitialState); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwDeleteFile( - IN POBJECT_ATTRIBUTES ObjectAttributes); + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass, + _In_ BOOLEAN ReturnSingleEntry, + _In_opt_ PUNICODE_STRING FileName, + _In_ BOOLEAN RestartScan); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetVolumeInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FsInformation, - IN ULONG Length, - IN FS_INFORMATION_CLASS FsInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID FsInformation, + _In_ ULONG Length, + _In_ FS_INFORMATION_CLASS FsInformationClass); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG FsControlCode, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE SourceProcessHandle, + _In_ HANDLE SourceHandle, + _In_opt_ HANDLE TargetProcessHandle, + _Out_opt_ PHANDLE TargetHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG HandleAttributes, + _In_ ULONG Options); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenDirectoryObject( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE DirectoryHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(return==0, __drv_allocatesMem(Region)) 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); + _In_ HANDLE ProcessHandle, + _Inout_ PVOID *BaseAddress, + _In_ ULONG_PTR ZeroBits, + _Inout_ PSIZE_T RegionSize, + _In_ ULONG AllocationType, + _In_ ULONG Protect); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(return==0, __drv_freesMem(Region)) NTSYSAPI NTSTATUS NTAPI ZwFreeVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - IN ULONG FreeType); + _In_ HANDLE ProcessHandle, + _Inout_ PVOID *BaseAddress, + _Inout_ PSIZE_T RegionSize, + _In_ ULONG FreeType); +_When_(Timeout == NULL, _IRQL_requires_max_(APC_LEVEL)) +_When_(Timeout->QuadPart != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_(Timeout->QuadPart == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) NTSYSAPI NTSTATUS NTAPI ZwWaitForSingleObject( - IN HANDLE Handle, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); + _In_ HANDLE Handle, + _In_ BOOLEAN Alertable, + _In_opt_ PLARGE_INTEGER Timeout); +_IRQL_requires_max_(DISPATCH_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetEvent( - IN HANDLE EventHandle, - OUT PLONG PreviousState OPTIONAL); + _In_ HANDLE EventHandle, + _Out_opt_ PLONG PreviousState); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwFlushVirtualMemory( - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T RegionSize, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ HANDLE ProcessHandle, + _Inout_ PVOID *BaseAddress, + _Inout_ PSIZE_T RegionSize, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQueryInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - OUT PVOID TokenInformation, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE TokenHandle, + _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, + _Out_writes_bytes_to_opt_(Length,*ResultLength) PVOID TokenInformation, + _In_ ULONG Length, + _Out_ PULONG ResultLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetSecurityObject( - IN HANDLE Handle, - IN SECURITY_INFORMATION SecurityInformation, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ HANDLE Handle, + _In_ SECURITY_INFORMATION SecurityInformation, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQuerySecurityObject( - IN HANDLE FileHandle, - IN SECURITY_INFORMATION SecurityInformation, - OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE FileHandle, + _In_ SECURITY_INFORMATION SecurityInformation, + _Out_writes_bytes_to_(Length,*ResultLength) PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ ULONG Length, + _Out_ PULONG ResultLength); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenProcessTokenEx( - IN HANDLE ProcessHandle, - IN ACCESS_MASK DesiredAccess, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); + _In_ HANDLE ProcessHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG HandleAttributes, + _Out_ PHANDLE TokenHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenThreadTokenEx( - IN HANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN BOOLEAN OpenAsSelf, - IN ULONG HandleAttributes, - OUT PHANDLE TokenHandle); + _In_ HANDLE ThreadHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ BOOLEAN OpenAsSelf, + _In_ ULONG HandleAttributes, + _Out_ PHANDLE TokenHandle); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ PLARGE_INTEGER ByteOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key, + _In_ BOOLEAN FailImmediately, + _In_ BOOLEAN ExclusiveLock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwUnlockFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PLARGE_INTEGER ByteOffset, - IN PLARGE_INTEGER Length, - IN ULONG Key); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ PLARGE_INTEGER ByteOffset, + _In_ PLARGE_INTEGER Length, + _In_ ULONG Key); +_IRQL_requires_max_(PASSIVE_LEVEL) 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); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_ BOOLEAN ReturnSingleEntry, + _In_reads_bytes_opt_(SidListLength) PVOID SidList, + _In_ ULONG SidListLength, + _In_opt_ PSID StartSid, + _In_ BOOLEAN RestartScan); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetQuotaInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwFlushBuffersFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetInformationToken( - IN HANDLE TokenHandle, - IN TOKEN_INFORMATION_CLASS TokenInformationClass, - IN PVOID TokenInformation, - IN ULONG TokenInformationLength); + _In_ HANDLE TokenHandle, + _In_ TOKEN_INFORMATION_CLASS TokenInformationClass, + _In_reads_bytes_(TokenInformationLength) PVOID TokenInformation, + _In_ ULONG TokenInformationLength); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ #ifndef __SSPI_H__ @@ -10730,16 +11269,6 @@ FsRtlAllocatePoolWithTag ( IN ULONG Tag ); -NTKERNELAPI -BOOLEAN -NTAPI -FsRtlIsFatDbcsLegal ( - IN ANSI_STRING DbcsName, - IN BOOLEAN WildCardsPermissible, - IN BOOLEAN PathNamePermissible, - IN BOOLEAN LeadingBackslashPermissible -); - NTKERNELAPI BOOLEAN NTAPI diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 2948402116a..2cc168b29b1 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -6,7 +6,7 @@ * This file is part of the ReactOS DDK package. * * Contributors: - * Amine Khaldi + * Amine Khaldi (amine.khaldi@reactos.org) * Timo Kreuzer (timo.kreuzer@reactos.org) * * THIS SOFTWARE IS NOT COPYRIGHTED @@ -67,6 +67,9 @@ typedef GUID *PGUID; #include "intrin.h" +__internal_kernel_driver +__drv_Mode_impl(WDM_INCLUDED) + #ifdef __cplusplus extern "C" { #endif @@ -213,8 +216,8 @@ inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2) static __inline__ BOOLEAN InterlockedBitTestAndSet( - IN LONG volatile *Base, - IN LONG Bit) + _Inout_updates_bytes_((Bit+7)/8) _Interlocked_operand_ LONG volatile *Base, + _In_ LONG Bit) { #if defined(_M_IX86) LONG OldBit; @@ -232,8 +235,8 @@ InterlockedBitTestAndSet( static __inline__ BOOLEAN InterlockedBitTestAndReset( - IN LONG volatile *Base, - IN LONG Bit) + _Inout_updates_bytes_((Bit+7)/8) _Interlocked_operand_ LONG volatile *Base, + _In_ LONG Bit) { #if defined(_M_IX86) LONG OldBit; @@ -278,35 +281,35 @@ NTKERNELAPI LONG FASTCALL InterlockedIncrement( - IN OUT LONG volatile *Addend); + _Inout_ _Interlocked_operand_ LONG volatile *Addend); NTKERNELAPI LONG FASTCALL InterlockedDecrement( - IN OUT LONG volatile *Addend); + _Inout_ _Interlocked_operand_ LONG volatile *Addend); NTKERNELAPI LONG FASTCALL InterlockedCompareExchange( - IN OUT LONG volatile *Destination, - IN LONG Exchange, - IN LONG Comparand); + _Inout_ _Interlocked_operand_ LONG volatile *Destination, + _In_ LONG Exchange, + _In_ LONG Comparand); NTKERNELAPI LONG FASTCALL InterlockedExchange( - IN OUT LONG volatile *Destination, - IN LONG Value); + _Inout_ _Interlocked_operand_ LONG volatile *Destination, + _In_ LONG Value); NTKERNELAPI LONG FASTCALL InterlockedExchangeAdd( - IN OUT LONG volatile *Addend, - IN LONG Value); + _Inout_ _Interlocked_operand_ LONG volatile *Addend, + _In_ LONG Value); #else /* !defined(NO_INTERLOCKED_INTRINSICS) */ @@ -384,8 +387,8 @@ InterlockedExchangeAdd( FORCEINLINE LONG64 InterlockedAdd64( - IN OUT LONG64 volatile *Addend, - IN LONG64 Value) + _Inout_ _Interlocked_operand_ LONG64 volatile *Addend, + _In_ LONG64 Value) { return InterlockedExchangeAdd64(Addend, Value) + Value; } @@ -432,14 +435,17 @@ typedef struct _RTL_BITMAP_RUN { ULONG NumberOfBits; } RTL_BITMAP_RUN, *PRTL_BITMAP_RUN; +_Function_class_(RTL_QUERY_REGISTRY_ROUTINE) +_IRQL_requires_max_(PASSIVE_LEVEL) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI *PRTL_QUERY_REGISTRY_ROUTINE)( - IN PWSTR ValueName, - IN ULONG ValueType, - IN PVOID ValueData, - IN ULONG ValueLength, - IN PVOID Context, - IN PVOID EntryContext); + _In_z_ PWSTR ValueName, + _In_ ULONG ValueType, + _In_reads_bytes_opt_(ValueLength) PVOID ValueData, + _In_ ULONG ValueLength, + _In_opt_ PVOID Context, + _In_opt_ PVOID EntryContext); typedef struct _RTL_QUERY_REGISTRY_TABLE { PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine; @@ -557,11 +563,11 @@ extern BOOLEAN NTSYSAPI NlsMbOemCodePageTag; typedef BOOLEAN (*PFN_RTL_IS_NTDDI_VERSION_AVAILABLE)( - IN ULONG Version); + _In_ ULONG Version); typedef BOOLEAN (*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)( - IN ULONG Version); + _In_ ULONG Version); /****************************************************************************** * Kernel Types * @@ -637,7 +643,7 @@ typedef struct _PROCESSOR_RELATIONSHIP { UCHAR Flags; UCHAR Reserved[21]; USHORT GroupCount; - GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; + _Field_size_(GroupCount) GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY]; } PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP; typedef struct _NUMA_NODE_RELATIONSHIP { @@ -828,29 +834,31 @@ typedef enum _KBUGCHECK_CALLBACK_REASON { struct _KBUGCHECK_REASON_CALLBACK_RECORD; +_Function_class_(KBUGCHECK_REASON_CALLBACK_ROUTINE) +_IRQL_requires_same_ typedef VOID (NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE)( - IN KBUGCHECK_CALLBACK_REASON Reason, - IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record, - IN OUT PVOID ReasonSpecificData, - IN ULONG ReasonSpecificDataLength); + _In_ KBUGCHECK_CALLBACK_REASON Reason, + _In_ struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record, + _Inout_ PVOID ReasonSpecificData, + _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; + _Inout_ PVOID Context; + _Inout_ 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; + _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 { @@ -862,10 +870,10 @@ typedef enum _KBUGCHECK_DUMP_IO_TYPE { } KBUGCHECK_DUMP_IO_TYPE; typedef struct _KBUGCHECK_DUMP_IO { - IN ULONG64 Offset; - IN PVOID Buffer; - IN ULONG BufferLength; - IN KBUGCHECK_DUMP_IO_TYPE Type; + _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 @@ -889,6 +897,8 @@ typedef enum _KBUGCHECK_BUFFER_DUMP_STATE { BufferIncomplete } KBUGCHECK_BUFFER_DUMP_STATE; +_Function_class_(KBUGCHECK_CALLBACK_ROUTINE) +_IRQL_requires_same_ typedef VOID (NTAPI KBUGCHECK_CALLBACK_ROUTINE)( IN PVOID Buffer, @@ -898,17 +908,19 @@ typedef KBUGCHECK_CALLBACK_ROUTINE *PKBUGCHECK_CALLBACK_ROUTINE; typedef struct _KBUGCHECK_CALLBACK_RECORD { LIST_ENTRY Entry; PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine; - PVOID Buffer; + _Field_size_bytes_opt_(Length) PVOID Buffer; ULONG Length; PUCHAR Component; ULONG_PTR Checksum; UCHAR State; } KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD; +_Function_class_(NMI_CALLBACK) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI NMI_CALLBACK)( - IN PVOID Context, - IN BOOLEAN Handled); + _In_opt_ PVOID Context, + _In_ BOOLEAN Handled); typedef NMI_CALLBACK *PNMI_CALLBACK; typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE { @@ -926,11 +938,13 @@ typedef struct _KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT { #endif } KE_PROCESSOR_CHANGE_NOTIFY_CONTEXT, *PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT; +_IRQL_requires_same_ +_Function_class_(PROCESSOR_CALLBACK_FUNCTION) typedef VOID (NTAPI PROCESSOR_CALLBACK_FUNCTION)( - IN PVOID CallbackContext, - IN PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext, - IN OUT PNTSTATUS OperationStatus); + _In_ PVOID CallbackContext, + _In_ PKE_PROCESSOR_CHANGE_NOTIFY_CONTEXT ChangeContext, + _Inout_ PNTSTATUS OperationStatus); typedef PROCESSOR_CALLBACK_FUNCTION *PPROCESSOR_CALLBACK_FUNCTION; #define KE_PROCESSOR_CHANGE_ADD_EXISTING 1 @@ -1032,26 +1046,33 @@ typedef enum _KINTERRUPT_MODE { #define THREAD_WAIT_OBJECTS 3 +_IRQL_requires_same_ +_Function_class_(KSTART_ROUTINE) typedef VOID (NTAPI KSTART_ROUTINE)( - IN PVOID StartContext); + _In_ PVOID StartContext); typedef KSTART_ROUTINE *PKSTART_ROUTINE; typedef VOID (NTAPI *PKINTERRUPT_ROUTINE)( VOID); +_Function_class_(KSERVICE_ROUTINE) +_IRQL_requires_(HIGH_LEVEL) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI KSERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext); + _In_ struct _KINTERRUPT *Interrupt, + _In_ PVOID ServiceContext); typedef KSERVICE_ROUTINE *PKSERVICE_ROUTINE; +_Function_class_(KMESSAGE_SERVICE_ROUTINE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI KMESSAGE_SERVICE_ROUTINE)( - IN struct _KINTERRUPT *Interrupt, - IN PVOID ServiceContext, - IN ULONG MessageID); + _In_ struct _KINTERRUPT *Interrupt, + _In_ PVOID ServiceContext, + _In_ ULONG MessageID); typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE; typedef enum _KD_OPTION { @@ -1136,9 +1157,12 @@ typedef struct _KIPI_COUNTS { ULONG GratuitousDPC; } KIPI_COUNTS, *PKIPI_COUNTS; +_IRQL_requires_same_ +_Function_class_(KIPI_BROADCAST_WORKER) +_IRQL_requires_(IPI_LEVEL) typedef ULONG_PTR (NTAPI KIPI_BROADCAST_WORKER)( - IN ULONG_PTR Argument); + _In_ ULONG_PTR Argument); typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER; typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; @@ -1203,12 +1227,15 @@ typedef enum _KSPIN_LOCK_QUEUE_NUMBER { #endif /* defined(_AMD64_) */ +_Function_class_(KDEFERRED_ROUTINE) +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_requires_same_ typedef VOID (NTAPI KDEFERRED_ROUTINE)( - IN struct _KDPC *Dpc, - IN PVOID DeferredContext OPTIONAL, - IN PVOID SystemArgument1 OPTIONAL, - IN PVOID SystemArgument2 OPTIONAL); + _In_ struct _KDPC *Dpc, + _In_opt_ PVOID DeferredContext, + _In_opt_ PVOID SystemArgument1, + _In_opt_ PVOID SystemArgument2); typedef KDEFERRED_ROUTINE *PKDEFERRED_ROUTINE; typedef enum _KDPC_IMPORTANCE { @@ -1389,9 +1416,11 @@ typedef enum _LOCK_OPERATION { #define KTIMER_ACTUAL_LENGTH (FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)) +_Function_class_(KSYNCHRONIZE_ROUTINE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI KSYNCHRONIZE_ROUTINE)( - IN PVOID SynchronizeContext); + _In_ PVOID SynchronizeContext); typedef KSYNCHRONIZE_ROUTINE *PKSYNCHRONIZE_ROUTINE; typedef enum _POOL_TYPE { @@ -1489,7 +1518,7 @@ typedef struct _XSTATE_CONTEXT { ULONG64 Mask; ULONG Length; ULONG Reserved1; - PXSAVE_AREA Area; + _Field_size_bytes_opt_(Length) PXSAVE_AREA Area; #if defined(_X86_) ULONG Reserved2; #endif @@ -1564,6 +1593,567 @@ extern PCCHAR KeNumberProcessors; #endif + +#if defined(_M_IX86) +/** Kernel definitions for x86 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMCI_LEVEL 5 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 +#define CLOCK_LEVEL CLOCK2_LEVEL + +#define KIP0PCRADDRESS 0xffdff000 +#define KI_USER_SHARED_DATA 0xffdf0000 +#define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA) + +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L +#define KeGetDcacheFillSize() 1L + +#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 ControlWord; + ULONG StatusWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + ULONG Cr0NpxState; + ULONG Spare1; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount; + +#define YieldProcessor _mm_pause + +FORCEINLINE +VOID +KeMemoryBarrier(VOID) +{ + LONG Barrier, *Dummy = &Barrier; + UNREFERENCED_LOCAL_VARIABLE(Dummy); + +#if defined(__GNUC__) + __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax"); +#elif defined(_MSC_VER) + __asm xchg [Barrier], eax +#endif +} + +#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() + +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_saves_ +NTHALAPI +KIRQL +NTAPI +KeGetCurrentIrql(VOID); + +_IRQL_requires_max_(HIGH_LEVEL) +NTHALAPI +VOID +FASTCALL +KfLowerIrql( + _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql); +#define KeLowerIrql(a) KfLowerIrql(a) + +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_raises_(NewIrql) +_IRQL_saves_ +NTHALAPI +KIRQL +FASTCALL +KfRaiseIrql( + _In_ KIRQL NewIrql); +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) +NTHALAPI +KIRQL +FASTCALL +KfAcquireSpinLock( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) + +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_(DISPATCH_LEVEL) +NTHALAPI +VOID +FASTCALL +KfReleaseSpinLock( + _Inout_ PKSPIN_LOCK SpinLock, + _In_ _IRQL_restores_ KIRQL NewIrql); +#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) + +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) +NTKERNELAPI +VOID +FASTCALL +KefAcquireSpinLockAtDpcLevel( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) + +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) +NTKERNELAPI +VOID +FASTCALL +KefReleaseSpinLockFromDpcLevel( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) + +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread(VOID); + +_Always_(_Post_satisfies_(return<=0)) +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Kernel_float_saved_ +_At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) +NTKERNELAPI +NTSTATUS +NTAPI +KeSaveFloatingPointState( + _Out_ PKFLOATING_SAVE FloatSave); + +_Success_(1) +_Kernel_float_restored_ +_At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) +NTKERNELAPI +NTSTATUS +NTAPI +KeRestoreFloatingPointState( + _In_ PKFLOATING_SAVE FloatSave); + +/* 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 + +FORCEINLINE +VOID +_KeQueryTickCount( + OUT PLARGE_INTEGER CurrentCount) +{ + for (;;) { +#ifdef NONAMELESSUNION + CurrentCount->s.HighPart = KeTickCount.High1Time; + CurrentCount->s.LowPart = KeTickCount.LowPart; + if (CurrentCount->s.HighPart == KeTickCount.High2Time) break; +#else + CurrentCount->HighPart = KeTickCount.High1Time; + CurrentCount->LowPart = KeTickCount.LowPart; + if (CurrentCount->HighPart == KeTickCount.High2Time) break; +#endif + YieldProcessor(); + } +} +#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) + + + + + +#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) + +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 +#define FastFence __faststorefence +#define LoadFence _mm_lfence +#define MemoryFence _mm_mfence +#define StoreFence _mm_sfence +#define LFENCE_ACQUIRE() LoadFence() + +FORCEINLINE +VOID +KeMemoryBarrier(VOID) +{ + // FIXME: Do we really need lfence after the __faststorefence ? + FastFence(); + LFENCE_ACQUIRE(); +} + +#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() + +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 = (KIRQL)__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); +} + +FORCEINLINE +NTSTATUS +KeSaveFloatingPointState(PVOID FloatingState) +{ + UNREFERENCED_PARAMETER(FloatingState); + return STATUS_SUCCESS; +} + +FORCEINLINE +NTSTATUS +KeRestoreFloatingPointState(PVOID FloatingState) +{ + UNREFERENCED_PARAMETER(FloatingState); + return STATUS_SUCCESS; +} + +/* 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 + /****************************************************************************** * Memory manager Types * ******************************************************************************/ @@ -1668,6 +2258,8 @@ typedef ULONG PFN_COUNT; typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER; typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER; +_Struct_size_bytes_(_Inexpressible_(sizeof(struct _MDL) + + (ByteOffset + ByteCount + PAGE_SIZE-1) / PAGE_SIZE * sizeof(PFN_NUMBER))) typedef struct _MDL { struct _MDL *Next; CSHORT Size; @@ -1678,7 +2270,11 @@ typedef struct _MDL { ULONG ByteCount; ULONG ByteOffset; } MDL, *PMDL; +#if (_MSC_VER >= 1600) +typedef _Readable_bytes_(_Inexpressible_(polymorphism)) MDL *PMDLX; +#else typedef MDL *PMDLX; +#endif typedef enum _MEMORY_CACHING_TYPE_ORIG { MmFrameBufferCached = 2 @@ -1765,33 +2361,43 @@ typedef enum _EX_POOL_PRIORITY { typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX; +_IRQL_requires_same_ +_Function_class_(ALLOCATE_FUNCTION) typedef PVOID (NTAPI *PALLOCATE_FUNCTION)( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag); + _In_ POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes, + _In_ ULONG Tag); +_IRQL_requires_same_ +_Function_class_(ALLOCATE_FUNCTION_EX) typedef PVOID (NTAPI *PALLOCATE_FUNCTION_EX)( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag, - IN OUT PLOOKASIDE_LIST_EX Lookaside); + _In_ POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes, + _In_ ULONG Tag, + _Inout_ PLOOKASIDE_LIST_EX Lookaside); +_IRQL_requires_same_ +_Function_class_(FREE_FUNCTION) typedef VOID (NTAPI *PFREE_FUNCTION)( - IN PVOID Buffer); + _In_ PVOID Buffer); +_IRQL_requires_same_ +_Function_class_(FREE_FUNCTION_EX) typedef VOID (NTAPI *PFREE_FUNCTION_EX)( - IN PVOID Buffer, - IN OUT PLOOKASIDE_LIST_EX Lookaside); + _In_ PVOID Buffer, + _Inout_ PLOOKASIDE_LIST_EX Lookaside); +_IRQL_requires_same_ +_Function_class_(CALLBACK_FUNCTION) typedef VOID (NTAPI CALLBACK_FUNCTION)( - IN PVOID CallbackContext OPTIONAL, - IN PVOID Argument1 OPTIONAL, - IN PVOID Argument2 OPTIONAL); + _In_opt_ PVOID CallbackContext, + _In_opt_ PVOID Argument1, + _In_opt_ PVOID Argument2); typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION; #define GENERAL_LOOKASIDE_LAYOUT \ @@ -1845,7 +2451,7 @@ LOOKASIDE_CHECK(TotalFrees); LOOKASIDE_CHECK(Tag); LOOKASIDE_CHECK(Future); -typedef struct _PAGED_LOOKASIDE_LIST { +typedef struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST { GENERAL_LOOKASIDE L; #if !defined(_AMD64_) && !defined(_IA64_) FAST_MUTEX Lock__ObsoleteButDoNotDelete; @@ -1891,9 +2497,11 @@ typedef enum _WORK_QUEUE_TYPE { MaximumWorkQueue } WORK_QUEUE_TYPE; +_IRQL_requires_same_ +_Function_class_(WORKER_THREAD_ROUTINE) typedef VOID (NTAPI WORKER_THREAD_ROUTINE)( - IN PVOID Parameter); + _In_ PVOID Parameter); typedef WORKER_THREAD_ROUTINE *PWORKER_THREAD_ROUTINE; typedef struct _WORK_QUEUE_ITEM { @@ -2187,8 +2795,8 @@ typedef struct _ACCESS_STATE { typedef VOID (NTAPI *PNTFS_DEREF_EXPORTED_SECURITY_DESCRIPTOR)( - IN PVOID Vcb, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ PVOID Vcb, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); #ifndef _NTLSA_IFS_ @@ -2671,22 +3279,25 @@ DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82 #define POWER_DEVICE_IDLE_POLICY_PERFORMANCE 0 #define POWER_DEVICE_IDLE_POLICY_CONSERVATIVE 1 +_Function_class_(REQUEST_POWER_COMPLETE) +_IRQL_requires_same_ typedef VOID (NTAPI REQUEST_POWER_COMPLETE)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN UCHAR MinorFunction, - IN POWER_STATE PowerState, - IN PVOID Context, - IN struct _IO_STATUS_BLOCK *IoStatus); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ UCHAR MinorFunction, + _In_ POWER_STATE PowerState, + _In_opt_ PVOID Context, + _In_ struct _IO_STATUS_BLOCK *IoStatus); typedef REQUEST_POWER_COMPLETE *PREQUEST_POWER_COMPLETE; -typedef -NTSTATUS +_Function_class_(POWER_SETTING_CALLBACK) +_IRQL_requires_same_ +typedef NTSTATUS (NTAPI POWER_SETTING_CALLBACK)( - IN LPCGUID SettingGuid, - IN PVOID Value, - IN ULONG ValueLength, - IN OUT PVOID Context OPTIONAL); + _In_ LPCGUID SettingGuid, + _In_reads_bytes_(ValueLength) PVOID Value, + _In_ ULONG ValueLength, + _Inout_opt_ PVOID Context); typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK; /****************************************************************************** @@ -3276,13 +3887,13 @@ typedef struct _KEY_VALUE_PARTIAL_INFORMATION { ULONG TitleIndex; ULONG Type; ULONG DataLength; - UCHAR Data[1]; + _Field_size_bytes_(DataLength) UCHAR Data[1]; } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 { ULONG Type; ULONG DataLength; - UCHAR Data[1]; + _Field_size_bytes_(DataLength) UCHAR Data[1]; } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64; typedef struct _KEY_VALUE_ENTRY { @@ -3370,11 +3981,13 @@ typedef enum _REG_NOTIFY_CLASS { MaxRegNtNotifyClass } REG_NOTIFY_CLASS, *PREG_NOTIFY_CLASS; +_IRQL_requires_same_ +_Function_class_(EX_CALLBACK_FUNCTION) typedef NTSTATUS (NTAPI EX_CALLBACK_FUNCTION)( - IN PVOID CallbackContext, - IN PVOID Argument1, - IN PVOID Argument2); + _In_ PVOID CallbackContext, + _In_opt_ PVOID Argument1, + _In_opt_ PVOID Argument2); typedef EX_CALLBACK_FUNCTION *PEX_CALLBACK_FUNCTION; typedef struct _REG_DELETE_KEY_INFORMATION { @@ -3871,12 +4484,14 @@ typedef enum _IO_ALLOCATION_ACTION { DeallocateObjectKeepRegisters } IO_ALLOCATION_ACTION, *PIO_ALLOCATION_ACTION; +_Function_class_(DRIVER_CONTROL) +_IRQL_requires_same_ typedef IO_ALLOCATION_ACTION (NTAPI DRIVER_CONTROL)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN PVOID MapRegisterBase, - IN PVOID Context); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ struct _IRP *Irp, + _In_ PVOID MapRegisterBase, + _In_ PVOID Context); typedef DRIVER_CONTROL *PDRIVER_CONTROL; typedef struct _WAIT_CONTEXT_BLOCK { @@ -3930,7 +4545,7 @@ typedef struct _WAIT_CONTEXT_BLOCK { /* DEVICE_OBJECT.DeviceType */ #define DEVICE_TYPE ULONG -typedef struct _DEVICE_OBJECT { +typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _DEVICE_OBJECT { CSHORT Type; USHORT Size; LONG ReferenceCount; @@ -3996,48 +4611,48 @@ typedef struct _IO_INTERRUPT_MESSAGE_INFO { } 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; + _In_ PDEVICE_OBJECT PhysicalDeviceObject; + _Out_ PKINTERRUPT *InterruptObject; + _In_ PKSERVICE_ROUTINE ServiceRoutine; + _In_ PVOID ServiceContext; + _In_opt_ PKSPIN_LOCK SpinLock; + _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; + _In_ PDEVICE_OBJECT PhysicalDeviceObject; + _Out_ PKINTERRUPT *InterruptObject; + _In_ PKSERVICE_ROUTINE ServiceRoutine; + _In_ PVOID ServiceContext; + _In_opt_ PKSPIN_LOCK SpinLock; + _In_opt_ KIRQL SynchronizeIrql; + _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; + _In_ PDEVICE_OBJECT PhysicalDeviceObject; union { - OUT PVOID *Generic; - OUT PIO_INTERRUPT_MESSAGE_INFO *InterruptMessageTable; - OUT PKINTERRUPT *InterruptObject; + _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; + _In_ PKMESSAGE_SERVICE_ROUTINE MessageServiceRoutine; + _In_ PVOID ServiceContext; + _In_opt_ PKSPIN_LOCK SpinLock; + _In_opt_ KIRQL SynchronizeIrql; + _In_ BOOLEAN FloatingSave; + _In_opt_ PKSERVICE_ROUTINE FallBackServiceRoutine; } IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS, *PIO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS; typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS { - IN OUT ULONG Version; + _Inout_ ULONG Version; _ANONYMOUS_UNION union { IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified; IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased; @@ -4046,11 +4661,11 @@ typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS { } IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS; typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS { - IN ULONG Version; + _In_ ULONG Version; union { - IN PVOID Generic; - IN PKINTERRUPT InterruptObject; - IN PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable; + _In_ PVOID Generic; + _In_ PKINTERRUPT InterruptObject; + _In_ PIO_INTERRUPT_MESSAGE_INFO InterruptMessageTable; } ConnectionContext; } IO_DISCONNECT_INTERRUPT_PARAMETERS, *PIO_DISCONNECT_INTERRUPT_PARAMETERS; @@ -4097,12 +4712,12 @@ typedef NTSTATUS 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); + _In_ PVOID SessionObject, + _In_ PVOID IoObject, + _In_ ULONG Event, + _In_ PVOID Context, + _In_reads_bytes_opt_(PayloadLength) PVOID NotificationPayload, + _In_ ULONG PayloadLength); typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION; @@ -4139,17 +4754,20 @@ typedef struct _IO_REMOVE_LOCK { typedef struct _IO_WORKITEM *PIO_WORKITEM; +_Function_class_(IO_WORKITEM_ROUTINE) +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ typedef VOID (NTAPI IO_WORKITEM_ROUTINE)( - IN PDEVICE_OBJECT DeviceObject, - IN PVOID Context); + _In_ PDEVICE_OBJECT DeviceObject, + _In_opt_ PVOID Context); typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE; typedef VOID (NTAPI IO_WORKITEM_ROUTINE_EX)( - IN PVOID IoObject, - IN PVOID Context OPTIONAL, - IN PIO_WORKITEM IoWorkItem); + _In_ PVOID IoObject, + _In_opt_ PVOID Context, + _In_ PIO_WORKITEM IoWorkItem); typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX; typedef struct _SHARE_ACCESS { @@ -4265,9 +4883,9 @@ typedef struct _IO_STATUS_BLOCK32 { typedef VOID (NTAPI *PIO_APC_ROUTINE)( - IN PVOID ApcContext, - IN PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG Reserved); + _In_ PVOID ApcContext, + _In_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG Reserved); #define PIO_APC_ROUTINE_DEFINED @@ -4497,29 +5115,35 @@ typedef VOID (NTAPI *PINTERFACE_DEREFERENCE)( PVOID Context); +_Function_class_(TRANSLATE_BUS_ADDRESS) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI TRANSLATE_BUS_ADDRESS)( - IN PVOID Context, - IN PHYSICAL_ADDRESS BusAddress, - IN ULONG Length, - IN OUT PULONG AddressSpace, - OUT PPHYSICAL_ADDRESS TranslatedAddress); + _Inout_opt_ PVOID Context, + _In_ PHYSICAL_ADDRESS BusAddress, + _In_ ULONG Length, + _Out_ PULONG AddressSpace, + _Out_ PPHYSICAL_ADDRESS TranslatedAddress); typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS; +_Function_class_(GET_DMA_ADAPTER) +_IRQL_requires_same_ typedef struct _DMA_ADAPTER* (NTAPI GET_DMA_ADAPTER)( - IN PVOID Context, - IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, - OUT PULONG NumberOfMapRegisters); + _Inout_opt_ PVOID Context, + _In_ struct _DEVICE_DESCRIPTION *DeviceDescriptor, + _Out_ PULONG NumberOfMapRegisters); typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER; +_Function_class_(GET_SET_DEVICE_DATA) +_IRQL_requires_same_ typedef ULONG (NTAPI GET_SET_DEVICE_DATA)( - IN PVOID Context, - IN ULONG DataType, - IN PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); + _Inout_opt_ PVOID Context, + _In_ ULONG DataType, + _Inout_updates_bytes_(Length) PVOID Buffer, + _In_ ULONG Offset, + _In_ ULONG Length); typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA; typedef enum _DEVICE_INSTALL_STATE { @@ -4542,8 +5166,8 @@ typedef enum _DEVICE_REMOVAL_POLICY { } DEVICE_REMOVAL_POLICY, *PDEVICE_REMOVAL_POLICY; typedef VOID -(NTAPI*PREENUMERATE_SELF)( - IN PVOID Context); +(NTAPI *PREENUMERATE_SELF)( + _In_ PVOID Context); typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD { USHORT Size; @@ -4556,8 +5180,8 @@ typedef struct _REENUMERATE_SELF_INTERFACE_STANDARD { typedef VOID (NTAPI *PIO_DEVICE_EJECT_CALLBACK)( - IN NTSTATUS Status, - IN OUT PVOID Context OPTIONAL); + _In_ NTSTATUS Status, + _Inout_opt_ PVOID Context); #define PCI_DEVICE_PRESENT_INTERFACE_VERSION 1 @@ -4583,20 +5207,24 @@ typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS { UCHAR ProgIf; } PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS; +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ typedef BOOLEAN (NTAPI PCI_IS_DEVICE_PRESENT)( - IN USHORT VendorID, - IN USHORT DeviceID, - IN UCHAR RevisionID, - IN USHORT SubVendorID, - IN USHORT SubSystemID, - IN ULONG Flags); + _In_ USHORT VendorID, + _In_ USHORT DeviceID, + _In_ UCHAR RevisionID, + _In_ USHORT SubVendorID, + _In_ USHORT SubSystemID, + _In_ ULONG Flags); typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT; +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ typedef BOOLEAN (NTAPI PCI_IS_DEVICE_PRESENT_EX)( - IN PVOID Context, - IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters); + _In_ PVOID Context, + _In_ PPCI_DEVICE_PRESENCE_PARAMETERS Parameters); typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX; typedef struct _BUS_INTERFACE_STANDARD { @@ -4621,8 +5249,9 @@ typedef struct _PCI_DEVICE_PRESENT_INTERFACE { PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx; } PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE; +_Struct_size_bytes_(Size) typedef struct _DEVICE_CAPABILITIES { - USHORT Size; + _Field_range_(==, sizeof(struct _DEVICE_CAPABILITIES)) USHORT Size; USHORT Version; ULONG DeviceD1:1; ULONG DeviceD2:1; @@ -4717,13 +5346,14 @@ typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION { #define PNP_REPLACE_NO_MAP MAXLONGLONG +_Must_inspect_result_ 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); + _In_ PHYSICAL_ADDRESS TargetPhysicalAddress, + _In_ PHYSICAL_ADDRESS SparePhysicalAddress, + _Inout_ PLARGE_INTEGER NumberOfBytes, + _Outptr_ PVOID *TargetAddress, + _Outptr_ PVOID *SpareAddress); typedef struct _PNP_REPLACE_MEMORY_LIST { ULONG AllocatedCount; @@ -4737,7 +5367,7 @@ typedef struct _PNP_REPLACE_MEMORY_LIST { typedef struct _PNP_REPLACE_PROCESSOR_LIST { PKAFFINITY Affinity; - ULONG GroupCount; + _Field_range_(<=, MAXIMUM_GROUPS) ULONG GroupCount; ULONG AllocatedCount; ULONG Count; ULONG ApicIds[ANYSIZE_ARRAY]; @@ -4768,49 +5398,58 @@ typedef VOID (NTAPI *PREPLACE_UNLOAD)( VOID); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_BEGIN)( - IN PPNP_REPLACE_PARAMETERS Parameters, - OUT PVOID *Context); + _In_ PPNP_REPLACE_PARAMETERS Parameters, + _Outptr_ PVOID *Context); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_END)( - IN PVOID Context); + _In_ PVOID Context); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_MIRROR_PHYSICAL_MEMORY)( - IN PVOID Context, - IN PHYSICAL_ADDRESS PhysicalAddress, - IN LARGE_INTEGER ByteCount); + _In_ PVOID Context, + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ LARGE_INTEGER ByteCount); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_SET_PROCESSOR_ID)( - IN PVOID Context, - IN ULONG ApicId, - IN BOOLEAN Target); + _In_ PVOID Context, + _In_ ULONG ApicId, + _In_ BOOLEAN Target); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_SWAP)( - IN PVOID Context); + _In_ PVOID Context); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_INITIATE_HARDWARE_MIRROR)( - IN PVOID Context); + _In_ PVOID Context); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_MIRROR_PLATFORM_MEMORY)( - IN PVOID Context); + _In_ PVOID Context); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_GET_MEMORY_DESTINATION)( - IN PVOID Context, - IN PHYSICAL_ADDRESS SourceAddress, - OUT PPHYSICAL_ADDRESS DestinationAddress); + _In_ PVOID Context, + _In_ PHYSICAL_ADDRESS SourceAddress, + _Out_ PPHYSICAL_ADDRESS DestinationAddress); +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE)( - IN PVOID Context, - IN BOOLEAN Enable); + _In_ PVOID Context, + _In_ BOOLEAN Enable); #define PNP_REPLACE_DRIVER_INTERFACE_VERSION 1 #define PNP_REPLACE_DRIVER_INTERFACE_MINIMUM_SIZE \ @@ -4838,10 +5477,11 @@ typedef struct _PNP_REPLACE_DRIVER_INTERFACE { PREPLACE_ENABLE_DISABLE_HARDWARE_QUIESCE EnableDisableHardwareQuiesce; } PNP_REPLACE_DRIVER_INTERFACE, *PPNP_REPLACE_DRIVER_INTERFACE; +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREPLACE_DRIVER_INIT)( - IN OUT PPNP_REPLACE_DRIVER_INTERFACE Interface, - IN PVOID Unused); + _Inout_ PPNP_REPLACE_DRIVER_INTERFACE Interface, + _In_ PVOID Unused); typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE { DeviceUsageTypeUndefined, @@ -4856,30 +5496,40 @@ typedef struct _POWER_SEQUENCE { ULONG SequenceD3; } POWER_SEQUENCE, *PPOWER_SEQUENCE; +#ifdef _PREFAST_ +#define __string_type 0x1000 +#define __guid_type 0x2000 +#define __multiString_type 0x4000 +#else +#define __string_type 0 +#define __guid_type 0 +#define __multiString_type 0 +#endif + typedef enum { - DevicePropertyDeviceDescription = 0x0, - DevicePropertyHardwareID = 0x1, - DevicePropertyCompatibleIDs = 0x2, + DevicePropertyDeviceDescription = 0x0 | __string_type, + DevicePropertyHardwareID = 0x1 | __multiString_type, + DevicePropertyCompatibleIDs = 0x2 | __multiString_type, DevicePropertyBootConfiguration = 0x3, DevicePropertyBootConfigurationTranslated = 0x4, - DevicePropertyClassName = 0x5, - DevicePropertyClassGuid = 0x6, - DevicePropertyDriverKeyName = 0x7, - DevicePropertyManufacturer = 0x8, - DevicePropertyFriendlyName = 0x9, - DevicePropertyLocationInformation = 0xa, - DevicePropertyPhysicalDeviceObjectName = 0xb, - DevicePropertyBusTypeGuid = 0xc, + DevicePropertyClassName = 0x5 | __string_type, + DevicePropertyClassGuid = 0x6 | __string_type, + DevicePropertyDriverKeyName = 0x7 | __string_type, + DevicePropertyManufacturer = 0x8 | __string_type, + DevicePropertyFriendlyName = 0x9 | __string_type, + DevicePropertyLocationInformation = 0xa | __string_type, + DevicePropertyPhysicalDeviceObjectName = 0xb | __string_type, + DevicePropertyBusTypeGuid = 0xc | __guid_type, DevicePropertyLegacyBusType = 0xd, DevicePropertyBusNumber = 0xe, - DevicePropertyEnumeratorName = 0xf, + DevicePropertyEnumeratorName = 0xf | __string_type, DevicePropertyAddress = 0x10, DevicePropertyUINumber = 0x11, DevicePropertyInstallState = 0x12, DevicePropertyRemovalPolicy = 0x13, DevicePropertyResourceRequirements = 0x14, DevicePropertyAllocatedResources = 0x15, - DevicePropertyContainerID = 0x16 + DevicePropertyContainerID = 0x16 | __string_type } DEVICE_REGISTRY_PROPERTY; typedef enum _IO_NOTIFICATION_EVENT_CATEGORY { @@ -4900,15 +5550,19 @@ typedef enum _IO_PRIORITY_HINT { #define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001 +_Function_class_(DRIVER_NOTIFICATION_CALLBACK_ROUTINE) +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI DRIVER_NOTIFICATION_CALLBACK_ROUTINE)( - IN PVOID NotificationStructure, - IN PVOID Context); + _In_ PVOID NotificationStructure, + _Inout_opt_ PVOID Context); typedef DRIVER_NOTIFICATION_CALLBACK_ROUTINE *PDRIVER_NOTIFICATION_CALLBACK_ROUTINE; +_Function_class_(DEVICE_CHANGE_COMPLETE_CALLBACK) +_IRQL_requires_same_ typedef VOID (NTAPI DEVICE_CHANGE_COMPLETE_CALLBACK)( - IN PVOID Context); + _Inout_opt_ PVOID Context); typedef DEVICE_CHANGE_COMPLETE_CALLBACK *PDEVICE_CHANGE_COMPLETE_CALLBACK; typedef enum _FILE_INFORMATION_CLASS { @@ -5081,251 +5735,305 @@ typedef struct _FILE_SFIO_VOLUME_INFORMATION { #define FM_LOCK_WAITER_WOKEN (0x2) #define FM_LOCK_WAITER_INC (0x4) +_Function_class_(FAST_IO_CHECK_IF_POSSIBLE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_CHECK_IF_POSSIBLE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - IN BOOLEAN CheckForReadOperation, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_ ULONG LockKey, + _In_ BOOLEAN CheckForReadOperation, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE; +_Function_class_(FAST_IO_READ) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_READ)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_ ULONG LockKey, + _Out_ PVOID Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_READ *PFAST_IO_READ; +_Function_class_(FAST_IO_WRITE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN BOOLEAN Wait, - IN ULONG LockKey, - IN PVOID Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ BOOLEAN Wait, + _In_ ULONG LockKey, + _In_ PVOID Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_WRITE *PFAST_IO_WRITE; +_Function_class_(FAST_IO_QUERY_BASIC_INFO) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_QUERY_BASIC_INFO)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - OUT PFILE_BASIC_INFORMATION Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ BOOLEAN Wait, + _Out_ PFILE_BASIC_INFORMATION Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO; +_Function_class_(FAST_IO_QUERY_STANDARD_INFO) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_QUERY_STANDARD_INFO)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - OUT PFILE_STANDARD_INFORMATION Buffer, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ BOOLEAN Wait, + _Out_ PFILE_STANDARD_INFORMATION Buffer, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO; +_Function_class_(FAST_IO_LOCK) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_LOCK)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - PEPROCESS ProcessId, - ULONG Key, - BOOLEAN FailImmediately, - BOOLEAN ExclusiveLock, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ PEPROCESS ProcessId, + _In_ ULONG Key, + _In_ BOOLEAN FailImmediately, + _In_ BOOLEAN ExclusiveLock, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_LOCK *PFAST_IO_LOCK; +_Function_class_(FAST_IO_UNLOCK_SINGLE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_UNLOCK_SINGLE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PLARGE_INTEGER Length, - PEPROCESS ProcessId, - ULONG Key, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PLARGE_INTEGER Length, + _In_ PEPROCESS ProcessId, + _In_ ULONG Key, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE; +_Function_class_(FAST_IO_UNLOCK_ALL) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_UNLOCK_ALL)( - IN struct _FILE_OBJECT *FileObject, - PEPROCESS ProcessId, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PEPROCESS ProcessId, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL; +_Function_class_(FAST_IO_UNLOCK_ALL_BY_KEY) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)( - IN struct _FILE_OBJECT *FileObject, - PVOID ProcessId, - ULONG Key, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PVOID ProcessId, + _In_ ULONG Key, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY; +_Function_class_(FAST_IO_DEVICE_CONTROL) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_DEVICE_CONTROL)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength, - IN ULONG IoControlCode, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ BOOLEAN Wait, + _In_opt_ PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_opt_ PVOID OutputBuffer, + _In_ ULONG OutputBufferLength, + _In_ ULONG IoControlCode, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL; +_Function_class_(FAST_IO_ACQUIRE_FILE) +_IRQL_requires_same_ typedef VOID (NTAPI FAST_IO_ACQUIRE_FILE)( - IN struct _FILE_OBJECT *FileObject); + _In_ struct _FILE_OBJECT *FileObject); typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE; +_Function_class_(FAST_IO_RELEASE_FILE) +_IRQL_requires_same_ typedef VOID (NTAPI FAST_IO_RELEASE_FILE)( - IN struct _FILE_OBJECT *FileObject); + _In_ struct _FILE_OBJECT *FileObject); typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE; +_Function_class_(FAST_IO_DETACH_DEVICE) +_IRQL_requires_same_ typedef VOID (NTAPI FAST_IO_DETACH_DEVICE)( - IN struct _DEVICE_OBJECT *SourceDevice, - IN struct _DEVICE_OBJECT *TargetDevice); + _In_ struct _DEVICE_OBJECT *SourceDevice, + _In_ struct _DEVICE_OBJECT *TargetDevice); typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE; +_Function_class_(FAST_IO_QUERY_NETWORK_OPEN_INFO) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)( - IN struct _FILE_OBJECT *FileObject, - IN BOOLEAN Wait, - OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer, - OUT struct _IO_STATUS_BLOCK *IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ BOOLEAN Wait, + _Out_ struct _FILE_NETWORK_OPEN_INFORMATION *Buffer, + _Out_ struct _IO_STATUS_BLOCK *IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO; +_Function_class_(FAST_IO_ACQUIRE_FOR_MOD_WRITE) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER EndingOffset, - OUT struct _ERESOURCE **ResourceToRelease, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER EndingOffset, + _Out_ struct _ERESOURCE **ResourceToRelease, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE; +_Function_class_(FAST_IO_MDL_READ) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_MDL_READ)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _Out_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ; +_Function_class_(FAST_IO_MDL_READ_COMPLETE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_MDL_READ_COMPLETE)( - IN struct _FILE_OBJECT *FileObject, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PMDL MdlChain, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE; +_Function_class_(FAST_IO_PREPARE_MDL_WRITE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_PREPARE_MDL_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _Out_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE; +_Function_class_(FAST_IO_MDL_WRITE_COMPLETE) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_MDL_WRITE_COMPLETE)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PMDL MdlChain, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE; +_Function_class_(FAST_IO_READ_COMPRESSED) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_READ_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - OUT PVOID Buffer, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _Out_ PVOID Buffer, + _Out_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _Out_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo, + _In_ ULONG CompressedDataInfoLength, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED; +_Function_class_(FAST_IO_WRITE_COMPRESSED) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_WRITE_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN ULONG Length, - IN ULONG LockKey, - IN PVOID Buffer, - OUT PMDL *MdlChain, - OUT PIO_STATUS_BLOCK IoStatus, - IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo, - IN ULONG CompressedDataInfoLength, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ ULONG Length, + _In_ ULONG LockKey, + _In_ PVOID Buffer, + _Out_ PMDL *MdlChain, + _Out_ PIO_STATUS_BLOCK IoStatus, + _In_ struct _COMPRESSED_DATA_INFO *CompressedDataInfo, + _In_ ULONG CompressedDataInfoLength, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED; +_Function_class_(FAST_IO_MDL_READ_COMPLETE_COMPRESSED) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PMDL MdlChain, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED; +_Function_class_(FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)( - IN struct _FILE_OBJECT *FileObject, - IN PLARGE_INTEGER FileOffset, - IN PMDL MdlChain, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ PLARGE_INTEGER FileOffset, + _In_ PMDL MdlChain, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED; +_Function_class_(FAST_IO_QUERY_OPEN) +_IRQL_requires_same_ typedef BOOLEAN (NTAPI FAST_IO_QUERY_OPEN)( - IN struct _IRP *Irp, - OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation, - IN struct _DEVICE_OBJECT *DeviceObject); + _Inout_ struct _IRP *Irp, + _Out_ PFILE_NETWORK_OPEN_INFORMATION NetworkInformation, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN; +_Function_class_(FAST_IO_RELEASE_FOR_MOD_WRITE) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)( - IN struct _FILE_OBJECT *FileObject, - IN struct _ERESOURCE *ResourceToRelease, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ struct _ERESOURCE *ResourceToRelease, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE; +_Function_class_(FAST_IO_ACQUIRE_FOR_CCFLUSH) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)( - IN struct _FILE_OBJECT *FileObject, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH; +_Function_class_(FAST_IO_RELEASE_FOR_CCFLUSH) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)( - IN struct _FILE_OBJECT *FileObject, - IN struct _DEVICE_OBJECT *DeviceObject); + _In_ struct _FILE_OBJECT *FileObject, + _In_ struct _DEVICE_OBJECT *DeviceObject); typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH; typedef struct _FAST_IO_DISPATCH { @@ -5731,10 +6439,14 @@ typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST; #endif /* defined(_MSC_EXTENSIONS) || defined(__GNUC__) */ +_Function_class_(DRIVER_ADD_DEVICE) +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ +_When_(return>=0, _Kernel_clear_do_init_(__yes)) typedef NTSTATUS (NTAPI DRIVER_ADD_DEVICE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN struct _DEVICE_OBJECT *PhysicalDeviceObject); + _In_ struct _DRIVER_OBJECT *DriverObject, + _In_ struct _DEVICE_OBJECT *PhysicalDeviceObject); typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE; typedef struct _DRIVER_EXTENSION { @@ -5748,27 +6460,39 @@ typedef struct _DRIVER_EXTENSION { #define DRVO_LEGACY_DRIVER 0x00000002 #define DRVO_BUILTIN_DRIVER 0x00000004 +_Function_class_(DRIVER_INITIALIZE) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI DRIVER_INITIALIZE)( - IN struct _DRIVER_OBJECT *DriverObject, - IN PUNICODE_STRING RegistryPath); + _In_ struct _DRIVER_OBJECT *DriverObject, + _In_ PUNICODE_STRING RegistryPath); typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE; +_Function_class_(DRIVER_STARTIO) +_IRQL_always_function_min_(DISPATCH_LEVEL) +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_requires_same_ typedef VOID (NTAPI DRIVER_STARTIO)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp); + _Inout_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ struct _IRP *Irp); typedef DRIVER_STARTIO *PDRIVER_STARTIO; +_Function_class_(DRIVER_UNLOAD) +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ typedef VOID (NTAPI DRIVER_UNLOAD)( - IN struct _DRIVER_OBJECT *DriverObject); + _In_ struct _DRIVER_OBJECT *DriverObject); typedef DRIVER_UNLOAD *PDRIVER_UNLOAD; +_Function_class_(DRIVER_DISPATCH) +_IRQL_requires_(PASSIVE_LEVEL) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI DRIVER_DISPATCH)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ struct _IRP *Irp); typedef DRIVER_DISPATCH *PDRIVER_DISPATCH; typedef struct _DRIVER_OBJECT { @@ -5797,120 +6521,122 @@ typedef struct _DMA_ADAPTER { typedef VOID (NTAPI *PPUT_DMA_ADAPTER)( - IN PDMA_ADAPTER DmaAdapter); + PDMA_ADAPTER DmaAdapter); typedef PVOID (NTAPI *PALLOCATE_COMMON_BUFFER)( - IN PDMA_ADAPTER DmaAdapter, - IN ULONG Length, - OUT PPHYSICAL_ADDRESS LogicalAddress, - IN BOOLEAN CacheEnabled); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ ULONG Length, + _Out_ PPHYSICAL_ADDRESS LogicalAddress, + _In_ BOOLEAN CacheEnabled); typedef VOID (NTAPI *PFREE_COMMON_BUFFER)( - IN PDMA_ADAPTER DmaAdapter, - IN ULONG Length, - IN PHYSICAL_ADDRESS LogicalAddress, - IN PVOID VirtualAddress, - IN BOOLEAN CacheEnabled); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ ULONG Length, + _In_ PHYSICAL_ADDRESS LogicalAddress, + _In_ PVOID VirtualAddress, + _In_ BOOLEAN CacheEnabled); typedef NTSTATUS (NTAPI *PALLOCATE_ADAPTER_CHANNEL)( - IN PDMA_ADAPTER DmaAdapter, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG NumberOfMapRegisters, + _In_ PDRIVER_CONTROL ExecutionRoutine, + _In_ PVOID Context); typedef BOOLEAN (NTAPI *PFLUSH_ADAPTER_BUFFERS)( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN ULONG Length, - IN BOOLEAN WriteToDevice); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _In_ ULONG Length, + _In_ BOOLEAN WriteToDevice); typedef VOID (NTAPI *PFREE_ADAPTER_CHANNEL)( - IN PDMA_ADAPTER DmaAdapter); + _In_ PDMA_ADAPTER DmaAdapter); typedef VOID (NTAPI *PFREE_MAP_REGISTERS)( - IN PDMA_ADAPTER DmaAdapter, + _In_ PDMA_ADAPTER DmaAdapter, PVOID MapRegisterBase, ULONG NumberOfMapRegisters); typedef PHYSICAL_ADDRESS (NTAPI *PMAP_TRANSFER)( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN OUT PULONG Length, - IN BOOLEAN WriteToDevice); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _Inout_ PULONG Length, + _In_ BOOLEAN WriteToDevice); typedef ULONG (NTAPI *PGET_DMA_ALIGNMENT)( - IN PDMA_ADAPTER DmaAdapter); + _In_ PDMA_ADAPTER DmaAdapter); typedef ULONG (NTAPI *PREAD_DMA_COUNTER)( - IN PDMA_ADAPTER DmaAdapter); + _In_ PDMA_ADAPTER DmaAdapter); +_Function_class_(DRIVER_LIST_CONTROL) +_IRQL_requires_same_ typedef VOID (NTAPI DRIVER_LIST_CONTROL)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN struct _SCATTER_GATHER_LIST *ScatterGather, - IN PVOID Context); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ struct _IRP *Irp, + _In_ struct _SCATTER_GATHER_LIST *ScatterGather, + _In_ PVOID Context); typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL; typedef NTSTATUS (NTAPI *PGET_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER 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); + _In_ PDMA_ADAPTER 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); typedef VOID (NTAPI *PPUT_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER DmaAdapter, - IN PSCATTER_GATHER_LIST ScatterGather, - IN BOOLEAN WriteToDevice); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PSCATTER_GATHER_LIST ScatterGather, + _In_ BOOLEAN WriteToDevice); typedef NTSTATUS (NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl OPTIONAL, - IN PVOID CurrentVa, - IN ULONG Length, - OUT PULONG ScatterGatherListSize, - OUT PULONG pNumberOfMapRegisters OPTIONAL); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PMDL Mdl OPTIONAL, + _In_ PVOID CurrentVa, + _In_ ULONG Length, + _Out_ PULONG ScatterGatherListSize, + _Out_ OPTIONAL PULONG pNumberOfMapRegisters); typedef NTSTATUS (NTAPI *PBUILD_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER 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, - IN PVOID ScatterGatherBuffer, - IN ULONG ScatterGatherLength); + _In_ PDMA_ADAPTER 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, + _In_ PVOID ScatterGatherBuffer, + _In_ ULONG ScatterGatherLength); typedef NTSTATUS (NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)( - IN PDMA_ADAPTER DmaAdapter, - IN PSCATTER_GATHER_LIST ScatterGather, - IN PMDL OriginalMdl, - OUT PMDL *TargetMdl); + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PSCATTER_GATHER_LIST ScatterGather, + _In_ PMDL OriginalMdl, + _Out_ PMDL *TargetMdl); typedef struct _DMA_OPERATIONS { ULONG Size; @@ -5999,13 +6725,18 @@ typedef struct _IO_RESOURCE_REQUIREMENTS_LIST { IO_RESOURCE_LIST List[1]; } IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST; +_Function_class_(DRIVER_CANCEL) +_Requires_lock_held_(_Global_cancel_spin_lock_) +_Releases_lock_(_Global_cancel_spin_lock_) +_IRQL_requires_min_(DISPATCH_LEVEL) +_IRQL_requires_(DISPATCH_LEVEL) typedef VOID (NTAPI DRIVER_CANCEL)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp); + _Inout_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ _IRQL_uses_cancel_ struct _IRP *Irp); typedef DRIVER_CANCEL *PDRIVER_CANCEL; -typedef struct _IRP { +typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP { CSHORT Type; USHORT Size; struct _MDL *MdlAddress; @@ -6071,33 +6802,41 @@ typedef enum _IO_PAGING_PRIORITY { IoPagingPriorityReserved2 } IO_PAGING_PRIORITY; +_Function_class_(IO_COMPLETION_ROUTINE) +_IRQL_requires_same_ typedef NTSTATUS (NTAPI IO_COMPLETION_ROUTINE)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN PVOID Context); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ struct _IRP *Irp, + _In_opt_ PVOID Context); typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE; +_Function_class_(IO_DPC_ROUTINE) +_IRQL_always_function_min_(DISPATCH_LEVEL) +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_requires_same_ typedef VOID (NTAPI IO_DPC_ROUTINE)( - IN struct _KDPC *Dpc, - IN struct _DEVICE_OBJECT *DeviceObject, - IN struct _IRP *Irp, - IN PVOID Context); + _In_ struct _KDPC *Dpc, + _In_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ struct _IRP *Irp, + _In_opt_ PVOID Context); typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE; typedef NTSTATUS (NTAPI *PMM_DLL_INITIALIZE)( - IN PUNICODE_STRING RegistryPath); + _In_ PUNICODE_STRING RegistryPath); typedef NTSTATUS (NTAPI *PMM_DLL_UNLOAD)( VOID); +_Function_class_(IO_TIMER_ROUTINE) +_IRQL_requires_same_ typedef VOID (NTAPI IO_TIMER_ROUTINE)( - IN struct _DEVICE_OBJECT *DeviceObject, - IN PVOID Context); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_opt_ PVOID Context); typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE; typedef struct _IO_SECURITY_CONTEXT { @@ -6117,41 +6856,41 @@ typedef struct _IO_CSQ_IRP_CONTEXT { typedef VOID (NTAPI *PIO_CSQ_INSERT_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp); typedef NTSTATUS (NTAPI IO_CSQ_INSERT_IRP_EX)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp, - IN PVOID InsertContext); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp, + _In_ PVOID InsertContext); typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX; typedef VOID (NTAPI *PIO_CSQ_REMOVE_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp); typedef PIRP (NTAPI *PIO_CSQ_PEEK_NEXT_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp, - IN PVOID PeekContext); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp, + _In_ PVOID PeekContext); typedef VOID (NTAPI *PIO_CSQ_ACQUIRE_LOCK)( - IN struct _IO_CSQ *Csq, - OUT PKIRQL Irql); + _In_ struct _IO_CSQ *Csq, + _Out_ PKIRQL Irql); typedef VOID (NTAPI *PIO_CSQ_RELEASE_LOCK)( - IN struct _IO_CSQ *Csq, - IN KIRQL Irql); + _In_ struct _IO_CSQ *Csq, + _In_ KIRQL Irql); typedef VOID (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp); typedef struct _IO_CSQ { ULONG Type; @@ -6182,6 +6921,8 @@ typedef BOOLEAN PVOID, PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_CONNECT_VECTOR)( PDEVICE_OBJECT, @@ -6192,20 +6933,28 @@ typedef NTSTATUS PVOID, PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_DISCONNECT_VECTOR)( PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_ENABLE_EVENT)( PDEVICE_OBJECT, PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_DISABLE_EVENT)( PDEVICE_OBJECT, PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_CLEAR_STATUS)( PDEVICE_OBJECT, @@ -6216,12 +6965,15 @@ typedef VOID PVOID, ULONG); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS)( PDEVICE_OBJECT, PDEVICE_NOTIFY_CALLBACK, PVOID); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef VOID (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS)( PDEVICE_OBJECT, @@ -6247,6 +6999,8 @@ typedef BOOLEAN PVOID ObjectContext, PVOID ServiceContext); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_CONNECT_VECTOR2)( PVOID Context, @@ -6257,37 +7011,49 @@ typedef NTSTATUS PVOID ServiceContext, PVOID *ObjectContext); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_DISCONNECT_VECTOR2)( PVOID Context, PVOID ObjectContext); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_ENABLE_EVENT2)( PVOID Context, PVOID ObjectContext); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_DISABLE_EVENT2)( PVOID Context, PVOID ObjectContext); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PGPE_CLEAR_STATUS2)( PVOID Context, PVOID ObjectContext); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef VOID (NTAPI *PDEVICE_NOTIFY_CALLBACK2)( PVOID NotificationContext, ULONG NotifyCode); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI *PREGISTER_FOR_DEVICE_NOTIFICATIONS2)( PVOID Context, PDEVICE_NOTIFY_CALLBACK2 NotificationHandler, PVOID NotificationContext); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef VOID (NTAPI *PUNREGISTER_FOR_DEVICE_NOTIFICATIONS2)( PVOID Context); @@ -6643,6 +7409,8 @@ typedef struct _IO_STACK_LOCATION { #define WMIREGISTER 0 #define WMIUPDATE 1 +_Function_class_(WMI_NOTIFICATION_CALLBACK) +_IRQL_requires_same_ typedef VOID (NTAPI FWMI_NOTIFICATION_CALLBACK)( PVOID Wnode, @@ -7336,14 +8104,18 @@ typedef struct _PCI_EXPRESS_SRIOV_CAPABILITY { #define PCI_EXPRESS_LINK_QUIESCENT_INTERFACE_VERSION 1 +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE)( - IN OUT PVOID Context); + _Inout_ PVOID Context); typedef PCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE *PPCI_EXPRESS_ENTER_LINK_QUIESCENT_MODE; +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE)( - IN OUT PVOID Context); + _Inout_ PVOID Context); typedef PCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE *PPCI_EXPRESS_EXIT_LINK_QUIESCENT_MODE; typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE { @@ -7360,17 +8132,17 @@ typedef struct _PCI_EXPRESS_LINK_QUIESCENT_INTERFACE { typedef ULONG (NTAPI *PPCI_EXPRESS_ROOT_PORT_READ_CONFIG_SPACE)( - IN PVOID Context, - OUT PVOID Buffer, - IN ULONG Offset, - IN ULONG Length); + _In_ PVOID Context, + _Out_writes_bytes_(Length) 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); + _In_ PVOID Context, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Offset, + _In_ ULONG Length); typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE { USHORT Size; @@ -7384,31 +8156,35 @@ typedef struct _PCI_EXPRESS_ROOT_PORT_INTERFACE { #define PCI_MSIX_TABLE_CONFIG_INTERFACE_VERSION 1 +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_MSIX_SET_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry, - IN ULONG MessageNumber); + _In_ PVOID Context, + _In_ ULONG TableEntry, + _In_ ULONG MessageNumber); typedef PCI_MSIX_SET_ENTRY *PPCI_MSIX_SET_ENTRY; +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_MSIX_MASKUNMASK_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry); + _In_ PVOID Context, + _In_ ULONG TableEntry); typedef PCI_MSIX_MASKUNMASK_ENTRY *PPCI_MSIX_MASKUNMASK_ENTRY; +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_MSIX_GET_ENTRY)( - IN PVOID Context, - IN ULONG TableEntry, - OUT PULONG MessageNumber, - OUT PBOOLEAN Masked); + _In_ PVOID Context, + _In_ ULONG TableEntry, + _Out_ PULONG MessageNumber, + _Out_ PBOOLEAN Masked); typedef PCI_MSIX_GET_ENTRY *PPCI_MSIX_GET_ENTRY; +_Must_inspect_result_ typedef NTSTATUS (NTAPI PCI_MSIX_GET_TABLE_SIZE)( - IN PVOID Context, - OUT PULONG TableSize); + _In_ PVOID Context, + _Out_ PULONG TableSize); typedef PCI_MSIX_GET_TABLE_SIZE *PPCI_MSIX_GET_TABLE_SIZE; typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE { @@ -7459,64 +8235,64 @@ typedef ULONG OB_OPERATION; #define OB_OPERATION_HANDLE_DUPLICATE 0x00000002 typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION { - IN OUT ACCESS_MASK DesiredAccess; - IN ACCESS_MASK OriginalDesiredAccess; + _Inout_ 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; + _Inout_ 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; + _Inout_ OB_PRE_CREATE_HANDLE_INFORMATION CreateHandleInformation; + _Inout_ OB_PRE_DUPLICATE_HANDLE_INFORMATION DuplicateHandleInformation; } OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS; typedef struct _OB_PRE_OPERATION_INFORMATION { - IN OB_OPERATION Operation; + _In_ OB_OPERATION Operation; _ANONYMOUS_UNION union { - IN ULONG Flags; + _In_ ULONG Flags; _ANONYMOUS_STRUCT struct { - IN ULONG KernelHandle:1; - IN ULONG Reserved:31; + _In_ ULONG KernelHandle:1; + _In_ ULONG Reserved:31; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; - IN PVOID Object; - IN POBJECT_TYPE ObjectType; - OUT PVOID CallContext; - IN POB_PRE_OPERATION_PARAMETERS Parameters; + _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; + _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; + _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; + _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; + _In_ OB_OPERATION Operation; _ANONYMOUS_UNION union { - IN ULONG Flags; + _In_ ULONG Flags; _ANONYMOUS_STRUCT struct { - IN ULONG KernelHandle:1; - IN ULONG Reserved:31; + _In_ ULONG KernelHandle:1; + _In_ ULONG Reserved:31; } DUMMYSTRUCTNAME; } DUMMYUNIONNAME; - IN PVOID Object; - IN POBJECT_TYPE ObjectType; - IN PVOID CallContext; - IN NTSTATUS ReturnStatus; - IN POB_POST_OPERATION_PARAMETERS Parameters; + _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 { @@ -7525,27 +8301,27 @@ typedef enum _OB_PREOP_CALLBACK_STATUS { typedef OB_PREOP_CALLBACK_STATUS (NTAPI *POB_PRE_OPERATION_CALLBACK)( - IN PVOID RegistrationContext, - IN OUT POB_PRE_OPERATION_INFORMATION OperationInformation); + _In_ PVOID RegistrationContext, + _Inout_ POB_PRE_OPERATION_INFORMATION OperationInformation); typedef VOID (NTAPI *POB_POST_OPERATION_CALLBACK)( - IN PVOID RegistrationContext, - IN POB_POST_OPERATION_INFORMATION OperationInformation); + _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; + _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; + _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 { @@ -7652,548 +8428,20 @@ typedef enum _TRACE_INFORMATION_CLASS { #include +_IRQL_requires_same_ 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); + _In_ LPCGUID SourceId, + _In_ ULONG ControlCode, + _In_ UCHAR Level, + _In_ ULONGLONG MatchAnyKeyword, + _In_ ULONGLONG MatchAllKeyword, + _In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData, + _Inout_opt_ PVOID CallbackContext); #define EVENT_WRITE_FLAG_NO_FAULTING 0x00000001 -#if defined(_M_IX86) -/** Kernel definitions for x86 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMCI_LEVEL 5 -#define PROFILE_LEVEL 27 -#define CLOCK1_LEVEL 28 -#define CLOCK2_LEVEL 28 -#define IPI_LEVEL 29 -#define POWER_LEVEL 30 -#define HIGH_LEVEL 31 -#define CLOCK_LEVEL CLOCK2_LEVEL - -#define KIP0PCRADDRESS 0xffdff000 -#define KI_USER_SHARED_DATA 0xffdf0000 -#define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA) - -#define PAGE_SIZE 0x1000 -#define PAGE_SHIFT 12L -#define KeGetDcacheFillSize() 1L - -#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 ControlWord; - ULONG StatusWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - ULONG Cr0NpxState; - ULONG Spare1; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount; - -#define YieldProcessor _mm_pause - -FORCEINLINE -VOID -KeMemoryBarrier(VOID) -{ - LONG Barrier, *Dummy = &Barrier; - UNREFERENCED_LOCAL_VARIABLE(Dummy); - -#if defined(__GNUC__) - __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax"); -#elif defined(_MSC_VER) - __asm xchg [Barrier], eax -#endif -} - -#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() - -NTHALAPI -KIRQL -NTAPI -KeGetCurrentIrql(VOID); - -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); - -NTHALAPI -KIRQL -FASTCALL -KfAcquireSpinLock( - IN OUT PKSPIN_LOCK SpinLock); -#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) - -NTHALAPI -VOID -FASTCALL -KfReleaseSpinLock( - IN OUT PKSPIN_LOCK SpinLock, - IN KIRQL NewIrql); -#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) - -NTKERNELAPI -VOID -FASTCALL -KefAcquireSpinLockAtDpcLevel( - IN OUT PKSPIN_LOCK SpinLock); -#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) - -NTKERNELAPI -VOID -FASTCALL -KefReleaseSpinLockFromDpcLevel( - IN OUT PKSPIN_LOCK SpinLock); -#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) - -NTSYSAPI -PKTHREAD -NTAPI -KeGetCurrentThread(VOID); - -NTKERNELAPI -NTSTATUS -NTAPI -KeSaveFloatingPointState( - OUT PKFLOATING_SAVE FloatSave); - -NTKERNELAPI -NTSTATUS -NTAPI -KeRestoreFloatingPointState( - IN PKFLOATING_SAVE FloatSave); - -/* 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 - -FORCEINLINE -VOID -_KeQueryTickCount( - OUT PLARGE_INTEGER CurrentCount) -{ - for (;;) { -#ifdef NONAMELESSUNION - CurrentCount->s.HighPart = KeTickCount.High1Time; - CurrentCount->s.LowPart = KeTickCount.LowPart; - if (CurrentCount->s.HighPart == KeTickCount.High2Time) break; -#else - CurrentCount->HighPart = KeTickCount.High1Time; - CurrentCount->LowPart = KeTickCount.LowPart; - if (CurrentCount->HighPart == KeTickCount.High2Time) break; -#endif - YieldProcessor(); - } -} -#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) - - - - - -#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) - -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 -#define FastFence __faststorefence -#define LoadFence _mm_lfence -#define MemoryFence _mm_mfence -#define StoreFence _mm_sfence -#define LFENCE_ACQUIRE() LoadFence() - -FORCEINLINE -VOID -KeMemoryBarrier(VOID) -{ - // FIXME: Do we really need lfence after the __faststorefence ? - FastFence(); - LFENCE_ACQUIRE(); -} - -#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() - -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 = (KIRQL)__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); -} - -FORCEINLINE -NTSTATUS -KeSaveFloatingPointState(PVOID FloatingState) -{ - UNREFERENCED_PARAMETER(FloatingState); - return STATUS_SUCCESS; -} - -FORCEINLINE -NTSTATUS -KeRestoreFloatingPointState(PVOID FloatingState) -{ - UNREFERENCED_PARAMETER(FloatingState); - return STATUS_SUCCESS; -} - -/* 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 * ******************************************************************************/ @@ -8206,15 +8454,16 @@ KeRaiseIrqlToSynchLevel(VOID); FORCEINLINE VOID InitializeListHead( - OUT PLIST_ENTRY ListHead) + _Out_ PLIST_ENTRY ListHead) { ListHead->Flink = ListHead->Blink = ListHead; } +_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty( - IN CONST LIST_ENTRY * ListHead) + _In_ const LIST_ENTRY * ListHead) { return (BOOLEAN)(ListHead->Flink == ListHead); } @@ -8222,7 +8471,7 @@ IsListEmpty( FORCEINLINE BOOLEAN RemoveEntryList( - IN PLIST_ENTRY Entry) + _In_ PLIST_ENTRY Entry) { PLIST_ENTRY OldFlink; PLIST_ENTRY OldBlink; @@ -8237,7 +8486,7 @@ RemoveEntryList( FORCEINLINE PLIST_ENTRY RemoveHeadList( - IN OUT PLIST_ENTRY ListHead) + _Inout_ PLIST_ENTRY ListHead) { PLIST_ENTRY Flink; PLIST_ENTRY Entry; @@ -8252,7 +8501,7 @@ RemoveHeadList( FORCEINLINE PLIST_ENTRY RemoveTailList( - IN OUT PLIST_ENTRY ListHead) + _Inout_ PLIST_ENTRY ListHead) { PLIST_ENTRY Blink; PLIST_ENTRY Entry; @@ -8267,8 +8516,8 @@ RemoveTailList( FORCEINLINE VOID InsertTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) + _Inout_ PLIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PLIST_ENTRY Entry) { PLIST_ENTRY OldBlink; OldBlink = ListHead->Blink; @@ -8281,8 +8530,8 @@ InsertTailList( FORCEINLINE VOID InsertHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY Entry) + _Inout_ PLIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PLIST_ENTRY Entry) { PLIST_ENTRY OldFlink; OldFlink = ListHead->Flink; @@ -8295,8 +8544,8 @@ InsertHeadList( FORCEINLINE VOID AppendTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY ListToAppend) + _Inout_ PLIST_ENTRY ListHead, + _Inout_ PLIST_ENTRY ListToAppend) { PLIST_ENTRY ListEnd = ListHead->Blink; @@ -8309,7 +8558,7 @@ AppendTailList( FORCEINLINE PSINGLE_LIST_ENTRY PopEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead) + _Inout_ PSINGLE_LIST_ENTRY ListHead) { PSINGLE_LIST_ENTRY FirstEntry; FirstEntry = ListHead->Next; @@ -8322,8 +8571,8 @@ PopEntryList( FORCEINLINE VOID PushEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PSINGLE_LIST_ENTRY Entry) + _Inout_ PSINGLE_LIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY Entry) { Entry->Next = ListHead->Next; ListHead->Next = Entry; @@ -8331,14 +8580,15 @@ PushEntryList( #endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */ +__analysis_noreturn NTSYSAPI VOID NTAPI RtlAssert( - IN PVOID FailedAssertion, - IN PVOID FileName, - IN ULONG LineNumber, - IN PSTR Message); + _In_ PVOID FailedAssertion, + _In_ PVOID FileName, + _In_ ULONG LineNumber, + _In_opt_ PSTR Message); /* VOID * RtlCopyMemory( @@ -8356,9 +8606,9 @@ NTSYSAPI VOID NTAPI RtlCopyMemoryNonTemporal( - VOID UNALIGNED *Destination, - CONST VOID UNALIGNED *Source, - SIZE_T Length); + _Out_writes_bytes_all_(Length) VOID UNALIGNED *Destination, + _In_reads_bytes_(Length) const VOID UNALIGNED *Source, + _In_ SIZE_T Length); #else #define RtlCopyMemoryNonTemporal RtlCopyMemory #endif @@ -8391,25 +8641,33 @@ RtlCopyMemoryNonTemporal( #define RtlFillBytes RtlFillMemory +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlFreeUnicodeString( - IN OUT PUNICODE_STRING UnicodeString); + _Inout_ _At_(UnicodeString->Buffer, __drv_freesMem(Mem)) + PUNICODE_STRING UnicodeString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlGUIDFromString( - IN PUNICODE_STRING GuidString, - OUT GUID *Guid); + _In_ PUNICODE_STRING GuidString, + _Out_ GUID *Guid); +_IRQL_requires_max_(DISPATCH_LEVEL) +_At_(DestinationString->Buffer, _Post_equal_to_(SourceString)) +//_At_(DestinationString->Length, _Post_equal_to_(_String_length_(SourceString) * sizeof(WCHAR))) +_At_(DestinationString->MaximumLength, _Post_equal_to_(DestinationString->Length + sizeof(WCHAR))) NTSYSAPI VOID NTAPI RtlInitUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCWSTR SourceString OPTIONAL); + _Out_ PUNICODE_STRING DestinationString, + _In_opt_z_ __drv_aliasesMem PCWSTR SourceString); /* VOID * RtlMoveMemory( @@ -8420,12 +8678,15 @@ RtlInitUnicodeString( #define RtlMoveMemory(Destination, Source, Length) \ memmove(Destination, Source, Length) +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlStringFromGUID( - IN REFGUID Guid, - OUT PUNICODE_STRING GuidString); + _In_ REFGUID Guid, + _Out_ _At_(GuidString->Buffer, __drv_allocatesMem(Mem)) + PUNICODE_STRING GuidString); /* VOID * RtlZeroMemory( @@ -8439,35 +8700,42 @@ RtlStringFromGUID( #if (NTDDI_VERSION >= NTDDI_WIN2K) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlAreBitsClear( - IN PRTL_BITMAP BitMapHeader, - IN ULONG StartingIndex, - IN ULONG Length); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG StartingIndex, + _In_ ULONG Length); +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlAreBitsSet( - IN PRTL_BITMAP BitMapHeader, - IN ULONG StartingIndex, - IN ULONG Length); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG StartingIndex, + _In_ ULONG Length); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PANSI_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PUNICODE_STRING DestinationString, + _In_ PANSI_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI ULONG NTAPI RtlxAnsiStringToUnicodeSize( - IN PCANSI_STRING AnsiString); + _In_ PCANSI_STRING AnsiString); #define RtlAnsiStringToUnicodeSize(String) ( \ NLS_MB_CODE_PAGE_TAG ? \ @@ -8475,119 +8743,156 @@ RtlxAnsiStringToUnicodeSize( ((String)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \ ) +_Success_(1) +_Unchanged_(Destination->MaximumLength) +_Unchanged_(Destination->Buffer) +_When_(_Old_(Destination->Length) + Source->Length <= Destination->MaximumLength, + _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + Source->Length)) + _At_(return, _Out_range_(==, 0))) +_When_(_Old_(Destination->Length) + Source->Length > Destination->MaximumLength, + _Unchanged_(Destination->Length) + _At_(return, _Out_range_(<, 0))) NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString( - IN OUT PUNICODE_STRING Destination, - IN PCUNICODE_STRING Source); + _Inout_ PUNICODE_STRING Destination, + _In_ PCUNICODE_STRING Source); +_Success_(1) +_Unchanged_(Destination->MaximumLength) +_Unchanged_(Destination->Buffer) +/* _When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) <= Destination->MaximumLength, + _At_(Destination->Length, _Post_equal_to_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR))) + _At_(return, _Out_range_(==, 0))) +_When_(_Old_(Destination->Length) + _String_length_(Source) * sizeof(WCHAR) > Destination->MaximumLength, + _Unchanged_(Destination->Length) + _At_(return, _Out_range_(<, 0))) */ NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeToString( - IN OUT PUNICODE_STRING Destination, - IN PCWSTR Source); + _Inout_ PUNICODE_STRING Destination, + _In_opt_z_ PCWSTR Source); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlCheckRegistryKey( - IN ULONG RelativeTo, - IN PWSTR Path); + _In_ ULONG RelativeTo, + _In_ PWSTR Path); NTSYSAPI VOID NTAPI RtlClearAllBits( - IN PRTL_BITMAP BitMapHeader); + _In_ PRTL_BITMAP BitMapHeader); NTSYSAPI VOID NTAPI RtlClearBits( - IN PRTL_BITMAP BitMapHeader, - IN ULONG StartingIndex, - IN ULONG NumberToClear); + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToClear) ULONG StartingIndex, + _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToClear); +_Must_inspect_result_ NTSYSAPI SIZE_T NTAPI RtlCompareMemory( - IN CONST VOID *Source1, - IN CONST VOID *Source2, - IN SIZE_T Length); + _In_ const VOID *Source1, + _In_ const VOID *Source2, + _In_ SIZE_T Length); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI LONG NTAPI RtlCompareUnicodeString( - IN PCUNICODE_STRING String1, - IN PCUNICODE_STRING String2, - IN BOOLEAN CaseInSensitive); + _In_ PCUNICODE_STRING String1, + _In_ PCUNICODE_STRING String2, + _In_ BOOLEAN CaseInSensitive); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI LONG NTAPI RtlCompareUnicodeStrings( - IN PCWCH String1, - IN SIZE_T String1Length, - IN PCWCH String2, - IN SIZE_T String2Length, - IN BOOLEAN CaseInSensitive); + _In_reads_(String1Length) PCWCH String1, + _In_ SIZE_T String1Length, + _In_reads_(String2Length) PCWCH String2, + _In_ SIZE_T String2Length, + _In_ BOOLEAN CaseInSensitive); +_Unchanged_(DestinationString->Buffer) +_Unchanged_(DestinationString->MaximumLength) +_At_(DestinationString->Length, + _When_(SourceString->Length > DestinationString->MaximumLength, + _Post_equal_to_(DestinationString->MaximumLength)) + _When_(SourceString->Length <= DestinationString->MaximumLength, + _Post_equal_to_(SourceString->Length))) NTSYSAPI VOID NTAPI RtlCopyUnicodeString( - IN OUT PUNICODE_STRING DestinationString, - IN PCUNICODE_STRING SourceString OPTIONAL); + _Inout_ PUNICODE_STRING DestinationString, + _In_opt_ PCUNICODE_STRING SourceString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCreateRegistryKey( - IN ULONG RelativeTo, - IN PWSTR Path); + _In_ ULONG RelativeTo, + _In_ PWSTR Path); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlCreateSecurityDescriptor( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN ULONG Revision); + _Out_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ ULONG Revision); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlDeleteRegistryValue( - IN ULONG RelativeTo, - IN PCWSTR Path, - IN PCWSTR ValueName); + _In_ ULONG RelativeTo, + _In_ PCWSTR Path, + _In_z_ PCWSTR ValueName); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString( - IN CONST UNICODE_STRING *String1, - IN CONST UNICODE_STRING *String2, - IN BOOLEAN CaseInSensitive); + _In_ CONST UNICODE_STRING *String1, + _In_ CONST UNICODE_STRING *String2, + _In_ BOOLEAN CaseInSensitive); #if !defined(_AMD64_) && !defined(_IA64_) NTSYSAPI LARGE_INTEGER NTAPI RtlExtendedIntegerMultiply( - IN LARGE_INTEGER Multiplicand, - IN LONG Multiplier); + _In_ LARGE_INTEGER Multiplicand, + _In_ LONG Multiplier); NTSYSAPI LARGE_INTEGER NTAPI RtlExtendedLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN ULONG Divisor, - OUT PULONG Remainder OPTIONAL); + _In_ LARGE_INTEGER Dividend, + _In_ ULONG Divisor, + _Out_opt_ PULONG Remainder); #endif #if defined(_X86_) || defined(_IA64_) @@ -8595,137 +8900,155 @@ NTSYSAPI LARGE_INTEGER NTAPI RtlExtendedMagicDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER MagicDivisor, - IN CCHAR ShiftCount); + _In_ LARGE_INTEGER Dividend, + _In_ LARGE_INTEGER MagicDivisor, + _In_ CCHAR ShiftCount); #endif +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI VOID NTAPI RtlFreeAnsiString( - IN PANSI_STRING AnsiString); + _Inout_ _At_(AnsiString->Buffer, __drv_freesMem(Mem)) + PANSI_STRING AnsiString); +_Success_(return != -1) +_Must_inspect_result_ NTSYSAPI ULONG NTAPI RtlFindClearBits( - IN PRTL_BITMAP BitMapHeader, - IN ULONG NumberToFind, - IN ULONG HintIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG NumberToFind, + _In_ ULONG HintIndex); +_Success_(return != -1) NTSYSAPI ULONG NTAPI RtlFindClearBitsAndSet( - IN PRTL_BITMAP BitMapHeader, - IN ULONG NumberToFind, - IN ULONG HintIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG NumberToFind, + _In_ ULONG HintIndex); NTSYSAPI ULONG NTAPI RtlFindFirstRunClear( - IN PRTL_BITMAP BitMapHeader, - OUT PULONG StartingIndex); + _In_ PRTL_BITMAP BitMapHeader, + _Out_ PULONG StartingIndex); NTSYSAPI ULONG NTAPI RtlFindClearRuns( - IN PRTL_BITMAP BitMapHeader, - OUT PRTL_BITMAP_RUN RunArray, - IN ULONG SizeOfRunArray, - IN BOOLEAN LocateLongestRuns); + _In_ PRTL_BITMAP BitMapHeader, + _Out_writes_to_(SizeOfRunArray, return) PRTL_BITMAP_RUN RunArray, + _In_range_(>, 0) ULONG SizeOfRunArray, + _In_ BOOLEAN LocateLongestRuns); NTSYSAPI ULONG NTAPI RtlFindLastBackwardRunClear( - IN PRTL_BITMAP BitMapHeader, - IN ULONG FromIndex, - OUT PULONG StartingRunIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG FromIndex, + _Out_ PULONG StartingRunIndex); +_Success_(return != -1) +_Must_inspect_result_ NTSYSAPI CCHAR NTAPI RtlFindLeastSignificantBit( - IN ULONGLONG Set); + _In_ ULONGLONG Set); NTSYSAPI ULONG NTAPI RtlFindLongestRunClear( - IN PRTL_BITMAP BitMapHeader, - OUT PULONG StartingIndex); + _In_ PRTL_BITMAP BitMapHeader, + _Out_ PULONG StartingIndex); +_Success_(return != -1) +_Must_inspect_result_ NTSYSAPI CCHAR NTAPI RtlFindMostSignificantBit( - IN ULONGLONG Set); + _In_ ULONGLONG Set); NTSYSAPI ULONG NTAPI RtlFindNextForwardRunClear( - IN PRTL_BITMAP BitMapHeader, - IN ULONG FromIndex, - OUT PULONG StartingRunIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG FromIndex, + _Out_ PULONG StartingRunIndex); +_Success_(return != -1) +_Must_inspect_result_ NTSYSAPI ULONG NTAPI RtlFindSetBits( - IN PRTL_BITMAP BitMapHeader, - IN ULONG NumberToFind, - IN ULONG HintIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG NumberToFind, + _In_ ULONG HintIndex); +_Success_(return != -1) NTSYSAPI ULONG NTAPI RtlFindSetBitsAndClear( - IN PRTL_BITMAP BitMapHeader, - IN ULONG NumberToFind, - IN ULONG HintIndex); + _In_ PRTL_BITMAP BitMapHeader, + _In_ ULONG NumberToFind, + _In_ ULONG HintIndex); +_IRQL_requires_max_(DISPATCH_LEVEL) NTSYSAPI VOID NTAPI RtlInitAnsiString( - IN OUT PANSI_STRING DestinationString, - IN PCSZ SourceString); + _Out_ PANSI_STRING DestinationString, + _In_opt_z_ __drv_aliasesMem PCSZ SourceString); NTSYSAPI VOID NTAPI RtlInitializeBitMap( - IN PRTL_BITMAP BitMapHeader, - IN PULONG BitMapBuffer, - IN ULONG SizeOfBitMap); + _Out_ PRTL_BITMAP BitMapHeader, + _In_ __drv_aliasesMem PULONG BitMapBuffer, + _In_ ULONG SizeOfBitMap); +_IRQL_requires_max_(DISPATCH_LEVEL) NTSYSAPI VOID NTAPI RtlInitString( - IN OUT PSTRING DestinationString, - IN PCSZ SourceString); + _Out_ PSTRING DestinationString, + _In_opt_z_ __drv_aliasesMem PCSZ SourceString); +_IRQL_requires_max_(PASSIVE_LEVEL) +_At_(String->MaximumLength, _Const_) NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString( - IN ULONG Value, - IN ULONG Base OPTIONAL, - IN OUT PUNICODE_STRING String); + _In_ ULONG Value, + _In_opt_ ULONG Base, + _Inout_ PUNICODE_STRING String); +_IRQL_requires_max_(PASSIVE_LEVEL) +_At_(String->MaximumLength, _Const_) NTSYSAPI NTSTATUS NTAPI RtlInt64ToUnicodeString( - IN ULONGLONG Value, - IN ULONG Base OPTIONAL, - IN OUT PUNICODE_STRING String); + _In_ ULONGLONG Value, + _In_opt_ ULONG Base, + _Inout_ PUNICODE_STRING String); #ifdef _WIN64 #define RtlIntPtrToUnicodeString(Value, Base, String) \ @@ -8742,33 +9065,36 @@ RtlInt64ToUnicodeString( #define RtlIsZeroLuid(_L1) \ ((BOOLEAN) ((!(_L1)->LowPart) && (!(_L1)->HighPart))) +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI ULONG NTAPI RtlLengthSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); NTSYSAPI ULONG NTAPI RtlNumberOfClearBits( - IN PRTL_BITMAP BitMapHeader); + _In_ PRTL_BITMAP BitMapHeader); NTSYSAPI ULONG NTAPI RtlNumberOfSetBits( - IN PRTL_BITMAP BitMapHeader); + _In_ PRTL_BITMAP BitMapHeader); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlQueryRegistryValues( - IN ULONG RelativeTo, - IN PCWSTR Path, - IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable, - IN PVOID Context OPTIONAL, - IN PVOID Environment OPTIONAL); + _In_ ULONG RelativeTo, + _In_ PCWSTR Path, + _Inout_ _At_(*(*QueryTable).EntryContext, _Post_valid_) + PRTL_QUERY_REGISTRY_TABLE QueryTable, + _In_opt_ PVOID Context, + _In_opt_ PVOID Environment); #define SHORT_SIZE (sizeof(USHORT)) #define SHORT_MASK (SHORT_SIZE - 1) @@ -8787,24 +9113,25 @@ NTSYSAPI VOID NTAPI RtlSetAllBits( - IN PRTL_BITMAP BitMapHeader); + _In_ PRTL_BITMAP BitMapHeader); NTSYSAPI VOID NTAPI RtlSetBits( - IN PRTL_BITMAP BitMapHeader, - IN ULONG StartingIndex, - IN ULONG NumberToSet); + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(0, BitMapHeader->SizeOfBitMap - NumberToSet) ULONG StartingIndex, + _In_range_(0, BitMapHeader->SizeOfBitMap - StartingIndex) ULONG NumberToSet); +_IRQL_requires_max_(APC_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlSetDaclSecurityDescriptor( - IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, - IN BOOLEAN DaclPresent, - IN PACL Dacl OPTIONAL, - IN BOOLEAN DaclDefaulted OPTIONAL); + _Inout_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ BOOLEAN DaclPresent, + _In_opt_ PACL Dacl, + _In_opt_ BOOLEAN DaclDefaulted); #if defined(_AMD64_) @@ -8917,45 +9244,57 @@ RtlSetDaclSecurityDescriptor( #define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value) #endif /* _WIN64 */ +_Success_(return != 0) NTSYSAPI BOOLEAN NTAPI RtlTimeFieldsToTime( - IN PTIME_FIELDS TimeFields, - IN PLARGE_INTEGER Time); + _In_ PTIME_FIELDS TimeFields, + _Out_ PLARGE_INTEGER Time); NTSYSAPI VOID NTAPI RtlTimeToTimeFields( - IN PLARGE_INTEGER Time, - IN PTIME_FIELDS TimeFields); + _In_ PLARGE_INTEGER Time, + _Out_ PTIME_FIELDS TimeFields); NTSYSAPI ULONG FASTCALL RtlUlongByteSwap( - IN ULONG Source); + _In_ ULONG Source); NTSYSAPI ULONGLONG FASTCALL RtlUlonglongByteSwap( - IN ULONGLONG Source); + _In_ ULONGLONG Source); +_When_(AllocateDestinationString, + _At_(DestinationString->MaximumLength, + _Out_range_(<=, (SourceString->MaximumLength / sizeof(WCHAR))))) +_When_(!AllocateDestinationString, + _At_(DestinationString->Buffer, _Const_) + _At_(DestinationString->MaximumLength, _Const_)) +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(AllocateDestinationString, _Must_inspect_result_) NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString( - IN OUT PANSI_STRING DestinationString, - IN PCUNICODE_STRING SourceString, - IN BOOLEAN AllocateDestinationString); + _When_(AllocateDestinationString, _Out_ _At_(DestinationString->Buffer, __drv_allocatesMem(Mem))) + _When_(!AllocateDestinationString, _Inout_) + PANSI_STRING DestinationString, + _In_ PCUNICODE_STRING SourceString, + _In_ BOOLEAN AllocateDestinationString); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI ULONG NTAPI RtlxUnicodeStringToAnsiSize( - IN PCUNICODE_STRING UnicodeString); + _In_ PCUNICODE_STRING UnicodeString); #define RtlUnicodeStringToAnsiSize(String) ( \ NLS_MB_CODE_PAGE_TAG ? \ @@ -8963,50 +9302,57 @@ RtlxUnicodeStringToAnsiSize( ((String)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \ ) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger( - IN PCUNICODE_STRING String, - IN ULONG Base OPTIONAL, - OUT PULONG Value); + _In_ PCUNICODE_STRING String, + _In_opt_ ULONG Base, + _Out_ PULONG Value); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI WCHAR NTAPI RtlUpcaseUnicodeChar( - IN WCHAR SourceCharacter); + _In_ WCHAR SourceCharacter); NTSYSAPI USHORT FASTCALL RtlUshortByteSwap( - IN USHORT Source); + _In_ USHORT Source); +_IRQL_requires_max_(APC_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlValidRelativeSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptorInput, - IN ULONG SecurityDescriptorLength, - IN SECURITY_INFORMATION RequiredInformation); + _In_reads_bytes_(SecurityDescriptorLength) PSECURITY_DESCRIPTOR SecurityDescriptorInput, + _In_ ULONG SecurityDescriptorLength, + _In_ SECURITY_INFORMATION RequiredInformation); +_IRQL_requires_max_(APC_LEVEL) +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlValidSecurityDescriptor( - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlWriteRegistryValue( - IN ULONG RelativeTo, - IN PCWSTR Path, - IN PCWSTR ValueName, - IN ULONG ValueType, - IN PVOID ValueData, - IN ULONG ValueLength); + _In_ ULONG RelativeTo, + _In_ PCWSTR Path, + _In_z_ PCWSTR ValueName, + _In_ ULONG ValueType, + _In_reads_bytes_opt_(ValueLength) PVOID ValueData, + _In_ ULONG ValueLength); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -9017,8 +9363,8 @@ NTSYSAPI VOID FASTCALL RtlPrefetchMemoryNonTemporal( - IN PVOID Source, - IN SIZE_T Length); + _In_ PVOID Source, + _In_ SIZE_T Length); #endif @@ -9029,37 +9375,40 @@ NTSYSAPI VOID NTAPI RtlClearBit( - PRTL_BITMAP BitMapHeader, - ULONG BitNumber); + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI WCHAR NTAPI RtlDowncaseUnicodeChar( - IN WCHAR SourceCharacter); + _In_ WCHAR SourceCharacter); NTSYSAPI VOID NTAPI RtlSetBit( - PRTL_BITMAP BitMapHeader, - ULONG BitNumber); + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber); +_Must_inspect_result_ NTSYSAPI BOOLEAN NTAPI RtlTestBit( - IN PRTL_BITMAP BitMapHeader, - IN ULONG BitNumber); + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitNumber); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI RtlHashUnicodeString( - IN CONST UNICODE_STRING *String, - IN BOOLEAN CaseInSensitive, - IN ULONG HashAlgorithm, - OUT PULONG HashValue); + _In_ CONST UNICODE_STRING *String, + _In_ BOOLEAN CaseInSensitive, + _In_ ULONG HashAlgorithm, + _Out_ PULONG HashValue); @@ -9072,75 +9421,81 @@ NTSYSAPI ULONG NTAPI RtlNumberOfSetBitsUlongPtr( - IN ULONG_PTR Target); + _In_ ULONG_PTR Target); NTSYSAPI ULONGLONG NTAPI RtlIoDecodeMemIoResource( - IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor, - OUT PULONGLONG Alignment OPTIONAL, - OUT PULONGLONG MinimumAddress OPTIONAL, - OUT PULONGLONG MaximumAddress OPTIONAL); + _In_ struct _IO_RESOURCE_DESCRIPTOR *Descriptor, + _Out_opt_ PULONGLONG Alignment, + _Out_opt_ PULONGLONG MinimumAddress, + _Out_opt_ PULONGLONG MaximumAddress); NTSYSAPI NTSTATUS NTAPI RtlIoEncodeMemIoResource( - IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor, - IN UCHAR Type, - IN ULONGLONG Length, - IN ULONGLONG Alignment, - IN ULONGLONG MinimumAddress, - IN ULONGLONG MaximumAddress); + _In_ struct _IO_RESOURCE_DESCRIPTOR *Descriptor, + _In_ UCHAR Type, + _In_ ULONGLONG Length, + _In_ ULONGLONG Alignment, + _In_ ULONGLONG MinimumAddress, + _In_ ULONGLONG MaximumAddress); NTSYSAPI ULONGLONG NTAPI RtlCmDecodeMemIoResource( - IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor, - OUT PULONGLONG Start OPTIONAL); + _In_ struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor, + _Out_opt_ PULONGLONG Start); NTSYSAPI NTSTATUS NTAPI RtlFindClosestEncodableLength( - IN ULONGLONG SourceLength, - OUT PULONGLONG TargetLength); + _In_ ULONGLONG SourceLength, + _Out_ PULONGLONG TargetLength); NTSYSAPI NTSTATUS NTAPI RtlCmEncodeMemIoResource( - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, - IN UCHAR Type, - IN ULONGLONG Length, - IN ULONGLONG Start); + _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, + _In_ UCHAR Type, + _In_ ULONGLONG Length, + _In_ ULONGLONG Start); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUnicodeToUTF8N( - OUT PCHAR UTF8StringDestination, - IN ULONG UTF8StringMaxByteCount, - OUT PULONG UTF8StringActualByteCount, - IN PCWCH UnicodeStringSource, - IN ULONG UnicodeStringByteCount); + _Out_writes_bytes_to_(UTF8StringMaxByteCount, *UTF8StringActualByteCount) + PCHAR UTF8StringDestination, + _In_ ULONG UTF8StringMaxByteCount, + _Out_ PULONG UTF8StringActualByteCount, + _In_reads_bytes_(UnicodeStringByteCount) PCWCH UnicodeStringSource, + _In_ ULONG UnicodeStringByteCount); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTSYSAPI NTSTATUS NTAPI RtlUTF8ToUnicodeN( - OUT PWSTR UnicodeStringDestination, - IN ULONG UnicodeStringMaxByteCount, - OUT PULONG UnicodeStringActualByteCount, - IN PCCH UTF8StringSource, - IN ULONG UTF8StringByteCount); + _Out_writes_bytes_to_(UnicodeStringMaxByteCount, *UnicodeStringActualByteCount) + PWSTR UnicodeStringDestination, + _In_ ULONG UnicodeStringMaxByteCount, + _Out_ PULONG UnicodeStringActualByteCount, + _In_reads_bytes_(UTF8StringByteCount) PCCH UTF8StringSource, + _In_ ULONG UTF8StringByteCount); NTSYSAPI ULONG64 @@ -9159,7 +9514,7 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlConvertLongToLargeInteger( - IN LONG SignedInteger) + _In_ LONG SignedInteger) { LARGE_INTEGER ret; ret.QuadPart = SignedInteger; @@ -9171,7 +9526,7 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlConvertUlongToLargeInteger( - IN ULONG UnsignedInteger) + _In_ ULONG UnsignedInteger) { LARGE_INTEGER ret; ret.QuadPart = UnsignedInteger; @@ -9183,8 +9538,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerShiftLeft( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount) + _In_ LARGE_INTEGER LargeInteger, + _In_ CCHAR ShiftCount) { LARGE_INTEGER Result; @@ -9197,8 +9552,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerShiftRight( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount) + _In_ LARGE_INTEGER LargeInteger, + _In_ CCHAR ShiftCount) { LARGE_INTEGER Result; @@ -9211,9 +9566,9 @@ static __inline ULONG NTAPI_INLINE RtlEnlargedUnsignedDivide( - IN ULARGE_INTEGER Dividend, - IN ULONG Divisor, - IN OUT PULONG Remainder) + _In_ ULARGE_INTEGER Dividend, + _In_ ULONG Divisor, + _Out_opt_ PULONG Remainder) { if (Remainder) *Remainder = (ULONG)(Dividend.QuadPart % Divisor); @@ -9225,7 +9580,7 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerNegate( - IN LARGE_INTEGER Subtrahend) + _In_ LARGE_INTEGER Subtrahend) { LARGE_INTEGER Difference; @@ -9238,8 +9593,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerSubtract( - IN LARGE_INTEGER Minuend, - IN LARGE_INTEGER Subtrahend) + _In_ LARGE_INTEGER Minuend, + _In_ LARGE_INTEGER Subtrahend) { LARGE_INTEGER Difference; @@ -9252,8 +9607,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlEnlargedUnsignedMultiply( - IN ULONG Multiplicand, - IN ULONG Multiplier) + _In_ ULONG Multiplicand, + _In_ ULONG Multiplier) { LARGE_INTEGER ret; ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier; @@ -9265,36 +9620,44 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlEnlargedIntegerMultiply( - IN LONG Multiplicand, - IN LONG Multiplier) + _In_ LONG Multiplicand, + _In_ LONG Multiplier) { LARGE_INTEGER ret; ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier; return ret; } +_At_(AnsiString->Buffer, _Post_equal_to_(Buffer)) +_At_(AnsiString->Length, _Post_equal_to_(0)) +_At_(AnsiString->MaximumLength, _Post_equal_to_(BufferSize)) FORCEINLINE VOID RtlInitEmptyAnsiString( - OUT PANSI_STRING AnsiString, - IN PCHAR Buffer, - IN USHORT BufferSize) + _Out_ PANSI_STRING AnsiString, + _Pre_maybenull_ _Pre_readable_size_(BufferSize) __drv_aliasesMem PCHAR Buffer, + _In_ USHORT BufferSize) { AnsiString->Length = 0; AnsiString->MaximumLength = BufferSize; AnsiString->Buffer = Buffer; } +_At_(UnicodeString->Buffer, _Post_equal_to_(Buffer)) +_At_(UnicodeString->Length, _Post_equal_to_(0)) +_At_(UnicodeString->MaximumLength, _Post_equal_to_(BufferSize)) FORCEINLINE VOID RtlInitEmptyUnicodeString( - OUT PUNICODE_STRING UnicodeString, - IN PWSTR Buffer, - IN USHORT BufferSize) + _Out_ PUNICODE_STRING UnicodeString, + _Writable_bytes_(BufferSize) + _When_(BufferSize != 0, _Notnull_) + __drv_aliasesMem PWSTR Buffer, + _In_ USHORT BufferSize) { - UnicodeString->Length = 0; - UnicodeString->MaximumLength = BufferSize; - UnicodeString->Buffer = Buffer; + UnicodeString->Length = 0; + UnicodeString->MaximumLength = BufferSize; + UnicodeString->Buffer = Buffer; } #if defined(_AMD64_) || defined(_IA64_) @@ -9304,8 +9667,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlExtendedIntegerMultiply( - IN LARGE_INTEGER Multiplicand, - IN LONG Multiplier) + _In_ LARGE_INTEGER Multiplicand, + _In_ LONG Multiplier) { LARGE_INTEGER ret; ret.QuadPart = Multiplicand.QuadPart * Multiplier; @@ -9316,9 +9679,9 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlExtendedLargeIntegerDivide( - IN LARGE_INTEGER Dividend, - IN ULONG Divisor, - OUT PULONG Remainder OPTIONAL) + _In_ LARGE_INTEGER Dividend, + _In_ ULONG Divisor, + _Out_opt_ PULONG Remainder) { LARGE_INTEGER ret; ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor; @@ -9342,9 +9705,9 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlExtendedMagicDivide( - IN LARGE_INTEGER Dividend, - IN LARGE_INTEGER MagicDivisor, - IN CCHAR ShiftCount) + _In_ LARGE_INTEGER Dividend, + _In_ LARGE_INTEGER MagicDivisor, + _In_ CCHAR ShiftCount) { LARGE_INTEGER ret; ULONG64 ret64; @@ -9363,8 +9726,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerAdd( - IN LARGE_INTEGER Addend1, - IN LARGE_INTEGER Addend2) + _In_ LARGE_INTEGER Addend1, + _In_ LARGE_INTEGER Addend2) { LARGE_INTEGER ret; ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart; @@ -9385,8 +9748,8 @@ static __inline LARGE_INTEGER NTAPI_INLINE RtlLargeIntegerArithmeticShift( - IN LARGE_INTEGER LargeInteger, - IN CCHAR ShiftCount) + _In_ LARGE_INTEGER LargeInteger, + _In_ CCHAR ShiftCount) { LARGE_INTEGER ret; ret.QuadPart = LargeInteger.QuadPart >> ShiftCount; @@ -9404,8 +9767,8 @@ RtlLargeIntegerArithmeticShift( FORCEINLINE PVOID RtlSecureZeroMemory( - OUT PVOID Pointer, - IN SIZE_T Size) + _Out_writes_bytes_all_(Size) PVOID Pointer, + _In_ SIZE_T Size) { volatile char* vptr = (volatile char*)Pointer; #if defined(_M_AMD64) @@ -9420,11 +9783,12 @@ RtlSecureZeroMemory( } #if defined(_M_AMD64) +_Must_inspect_result_ FORCEINLINE BOOLEAN RtlCheckBit( - IN PRTL_BITMAP BitMapHeader, - IN ULONG BitPosition) + _In_ PRTL_BITMAP BitMapHeader, + _In_range_(<, BitMapHeader->SizeOfBitMap) ULONG BitPosition) { return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition); } @@ -9574,14 +9938,14 @@ RtlCheckBit( NTKERNELAPI VOID InitializeSListHead( - OUT PSLIST_HEADER SListHead); + _Out_ PSLIST_HEADER SListHead); #else FORCEINLINE VOID InitializeSListHead( - OUT PSLIST_HEADER SListHead) + _Out_ PSLIST_HEADER SListHead) { #if defined(_IA64_) ULONG64 FeatureBits; @@ -9624,14 +9988,14 @@ NTKERNELAPI PSLIST_ENTRY FASTCALL InterlockedPopEntrySList( - IN PSLIST_HEADER ListHead); + _Inout_ PSLIST_HEADER ListHead); NTKERNELAPI PSLIST_ENTRY FASTCALL InterlockedPushEntrySList( - IN PSLIST_HEADER ListHead, - IN PSLIST_ENTRY ListEntry); + _Inout_ PSLIST_HEADER ListHead, + _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry); #define InterlockedFlushSList(ListHead) \ ExInterlockedFlushSList(ListHead) @@ -9658,11 +10022,11 @@ InterlockedPushEntrySList( BOOLEAN RTLVERLIB_DDI(RtlIsNtDdiVersionAvailable)( - IN ULONG Version); + _In_ ULONG Version); BOOLEAN RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)( - IN ULONG Version); + _In_ ULONG Version); #ifndef RtlIsNtDdiVersionAvailable #define RtlIsNtDdiVersionAvailable WdmlibRtlIsNtDdiVersionAvailable @@ -9701,55 +10065,64 @@ NTKERNELAPI VOID NTAPI KeInitializeEvent( - OUT PRKEVENT Event, - IN EVENT_TYPE Type, - IN BOOLEAN State); + _Out_ PRKEVENT Event, + _In_ EVENT_TYPE Type, + _In_ BOOLEAN State); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeClearEvent( - IN OUT PRKEVENT Event); + _Inout_ PRKEVENT Event); #if (NTDDI_VERSION >= NTDDI_WIN2K) #if defined(_NTDDK_) || defined(_NTIFS_) +_Maybe_raises_SEH_exception_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ProbeForRead( - IN CONST VOID *Address, /* CONST is added */ - IN SIZE_T Length, - IN ULONG Alignment); + __in_data_source(USER_MODE) _In_reads_bytes_(Length) CONST VOID *Address, /* CONST is added */ + _In_ SIZE_T Length, + _In_ ULONG Alignment); #endif /* defined(_NTDDK_) || defined(_NTIFS_) */ +_Maybe_raises_SEH_exception_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ProbeForWrite( - IN PVOID Address, - IN SIZE_T Length, - IN ULONG Alignment); + __in_data_source(USER_MODE) _Inout_updates_bytes_(Length) PVOID Address, + _In_ SIZE_T Length, + _In_ ULONG Alignment); #if defined(SINGLE_GROUP_LEGACY_API) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeRevertToUserAffinityThread(VOID); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeSetSystemAffinityThread( - IN KAFFINITY Affinity); + _In_ KAFFINITY Affinity); NTKERNELAPI VOID NTAPI KeSetTargetProcessorDpc( - IN OUT PRKDPC Dpc, - IN CCHAR Number); + _Inout_ PRKDPC Dpc, + _In_ CCHAR Number); NTKERNELAPI KAFFINITY @@ -9767,37 +10140,51 @@ NTKERNELAPI VOID NTAPI KeQuerySystemTime( - OUT PLARGE_INTEGER CurrentTime); + _Out_ PLARGE_INTEGER CurrentTime); #endif /* !_M_AMD64 */ #if !defined(_X86_) && !defined(_M_ARM) +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) NTKERNELAPI KIRQL NTAPI KeAcquireSpinLockRaiseToDpc( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #define KeAcquireSpinLock(SpinLock, OldIrql) \ *(OldIrql) = KeAcquireSpinLockRaiseToDpc(SpinLock) +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeAcquireSpinLockAtDpcLevel( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeReleaseSpinLock( - IN OUT PKSPIN_LOCK SpinLock, - IN KIRQL NewIrql); + _Inout_ PKSPIN_LOCK SpinLock, + _In_ _IRQL_restores_ KIRQL NewIrql); +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeReleaseSpinLockFromDpcLevel( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); #endif /* !_X86_ */ #if defined(_X86_) && (defined(_WDM_INCLUDED_) || defined(WIN9X_COMPAT_SPINLOCK)) @@ -9805,11 +10192,11 @@ NTKERNELAPI VOID NTAPI KeInitializeSpinLock( - IN PKSPIN_LOCK SpinLock); + _Out_ PKSPIN_LOCK SpinLock); #else FORCEINLINE VOID -KeInitializeSpinLock(IN PKSPIN_LOCK SpinLock) +KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock) { /* Clear the lock */ *SpinLock = 0; @@ -9821,102 +10208,116 @@ NTKERNELAPI VOID NTAPI KeBugCheckEx( - IN ULONG BugCheckCode, - IN ULONG_PTR BugCheckParameter1, - IN ULONG_PTR BugCheckParameter2, - IN ULONG_PTR BugCheckParameter3, - IN ULONG_PTR BugCheckParameter4); + _In_ ULONG BugCheckCode, + _In_ ULONG_PTR BugCheckParameter1, + _In_ ULONG_PTR BugCheckParameter2, + _In_ ULONG_PTR BugCheckParameter3, + _In_ ULONG_PTR BugCheckParameter4); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeCancelTimer( - IN OUT PKTIMER); + _Inout_ PKTIMER); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeDelayExecutionThread( - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Interval); + _In_ KPROCESSOR_MODE WaitMode, + _In_ BOOLEAN Alertable, + _In_ PLARGE_INTEGER Interval); +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI KeDeregisterBugCheckCallback( - IN OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord); + _Inout_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord); +_Acquires_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeEnterCriticalRegion(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeInitializeDeviceQueue( - OUT PKDEVICE_QUEUE DeviceQueue); + _Out_ PKDEVICE_QUEUE DeviceQueue); NTKERNELAPI VOID NTAPI KeInitializeDpc( - OUT PRKDPC Dpc, - IN PKDEFERRED_ROUTINE DeferredRoutine, - IN PVOID DeferredContext OPTIONAL); + _Out_ __drv_aliasesMem PRKDPC Dpc, + _In_ PKDEFERRED_ROUTINE DeferredRoutine, + _In_opt_ __drv_aliasesMem PVOID DeferredContext); NTKERNELAPI VOID NTAPI KeInitializeMutex( - OUT PRKMUTEX Mutex, - IN ULONG Level); + _Out_ PRKMUTEX Mutex, + _In_ ULONG Level); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI KeInitializeSemaphore( - OUT PRKSEMAPHORE Semaphore, - IN LONG Count, - IN LONG Limit); + _Out_ PRKSEMAPHORE Semaphore, + _In_ LONG Count, + _In_ LONG Limit); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeInitializeTimer( - OUT PKTIMER Timer); + _Out_ PKTIMER Timer); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI KeInitializeTimerEx( - OUT PKTIMER Timer, - IN TIMER_TYPE Type); + _Out_ PKTIMER Timer, + _In_ TIMER_TYPE Type); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeInsertByKeyDeviceQueue( - IN OUT PKDEVICE_QUEUE DeviceQueue, - IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, - IN ULONG SortKey); + _Inout_ PKDEVICE_QUEUE DeviceQueue, + _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry, + _In_ ULONG SortKey); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeInsertDeviceQueue( - IN OUT PKDEVICE_QUEUE DeviceQueue, - IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); + _Inout_ PKDEVICE_QUEUE DeviceQueue, + _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); NTKERNELAPI BOOLEAN NTAPI KeInsertQueueDpc( - IN OUT PRKDPC Dpc, - IN PVOID SystemArgument1 OPTIONAL, - IN PVOID SystemArgument2 OPTIONAL); + _Inout_ PRKDPC Dpc, + _In_opt_ PVOID SystemArgument1, + _In_opt_ PVOID SystemArgument2); +_Releases_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI @@ -9926,203 +10327,248 @@ NTHALAPI LARGE_INTEGER NTAPI KeQueryPerformanceCounter( - OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL); + _Out_opt_ PLARGE_INTEGER PerformanceFrequency); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI KPRIORITY NTAPI KeQueryPriorityThread( - IN PRKTHREAD Thread); + _In_ PRKTHREAD Thread); NTKERNELAPI ULONG NTAPI KeQueryTimeIncrement(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeReadStateEvent( - IN PRKEVENT Event); + _In_ PRKEVENT Event); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeReadStateMutex( - IN PRKMUTEX Mutex); + _In_ PRKMUTEX Mutex); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeReadStateSemaphore( - IN PRKSEMAPHORE Semaphore); + _In_ PRKSEMAPHORE Semaphore); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeReadStateTimer( - IN PKTIMER Timer); + _In_ PKTIMER Timer); +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI KeRegisterBugCheckCallback( - OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord, - IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, - IN PVOID Buffer, - IN ULONG Length, - IN PUCHAR Component); + _Out_ PKBUGCHECK_CALLBACK_RECORD CallbackRecord, + _In_ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine, + _In_reads_bytes_opt_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_ PUCHAR Component); +_When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(Wait==1, _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI LONG NTAPI KeReleaseMutex( - IN OUT PRKMUTEX Mutex, - IN BOOLEAN Wait); + _Inout_ PRKMUTEX Mutex, + _In_ BOOLEAN Wait); +_When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(Wait==1, _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI LONG NTAPI KeReleaseSemaphore( - IN OUT PRKSEMAPHORE Semaphore, - IN KPRIORITY Increment, - IN LONG Adjustment, - IN BOOLEAN Wait); + _Inout_ PRKSEMAPHORE Semaphore, + _In_ KPRIORITY Increment, + _In_ LONG Adjustment, + _In_ _Literal_ BOOLEAN Wait); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI PKDEVICE_QUEUE_ENTRY NTAPI KeRemoveByKeyDeviceQueue( - IN OUT PKDEVICE_QUEUE DeviceQueue, - IN ULONG SortKey); + _Inout_ PKDEVICE_QUEUE DeviceQueue, + _In_ ULONG SortKey); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI PKDEVICE_QUEUE_ENTRY NTAPI KeRemoveDeviceQueue( - IN OUT PKDEVICE_QUEUE DeviceQueue); + _Inout_ PKDEVICE_QUEUE DeviceQueue); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeRemoveEntryDeviceQueue( - IN OUT PKDEVICE_QUEUE DeviceQueue, - IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); + _Inout_ PKDEVICE_QUEUE DeviceQueue, + _Inout_ PKDEVICE_QUEUE_ENTRY DeviceQueueEntry); +_IRQL_requires_max_(HIGH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeRemoveQueueDpc( - IN OUT PRKDPC Dpc); + _Inout_ PRKDPC Dpc); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG NTAPI KeResetEvent( - IN OUT PRKEVENT Event); + _Inout_ PRKEVENT Event); +_When_(Wait==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(Wait==1, _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI LONG NTAPI KeSetEvent( - IN OUT PRKEVENT Event, - IN KPRIORITY Increment, - IN BOOLEAN Wait); + _Inout_ PRKEVENT Event, + _In_ KPRIORITY Increment, + _In_ _Literal_ BOOLEAN Wait); NTKERNELAPI VOID NTAPI KeSetImportanceDpc( - IN OUT PRKDPC Dpc, - IN KDPC_IMPORTANCE Importance); + _Inout_ PRKDPC Dpc, + _In_ KDPC_IMPORTANCE Importance); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI KPRIORITY NTAPI KeSetPriorityThread( - IN OUT PKTHREAD Thread, - IN KPRIORITY Priority); + _Inout_ PKTHREAD Thread, + _In_ KPRIORITY Priority); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeSetTimer( - IN OUT PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN PKDPC Dpc OPTIONAL); + _Inout_ PKTIMER Timer, + _In_ LARGE_INTEGER DueTime, + _In_opt_ PKDPC Dpc); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeSetTimerEx( - IN OUT PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN LONG Period OPTIONAL, - IN PKDPC Dpc OPTIONAL); + _Inout_ PKTIMER Timer, + _In_ LARGE_INTEGER DueTime, + _In_ LONG Period OPTIONAL, + _In_opt_ PKDPC Dpc); NTHALAPI VOID NTAPI KeStallExecutionProcessor( - IN ULONG MicroSeconds); + _In_ ULONG MicroSeconds); +_IRQL_requires_max_(HIGH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeSynchronizeExecution( - IN OUT PKINTERRUPT Interrupt, - IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, - IN PVOID SynchronizeContext OPTIONAL); + _Inout_ PKINTERRUPT Interrupt, + _In_ PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, + _In_opt_ __drv_aliasesMem PVOID SynchronizeContext); +_IRQL_requires_min_(PASSIVE_LEVEL) +_When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL)) +_When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL)) NTKERNELAPI NTSTATUS NTAPI KeWaitForMultipleObjects( - IN ULONG Count, - IN PVOID Object[], - IN WAIT_TYPE WaitType, - IN KWAIT_REASON WaitReason, - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL, - OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL); + _In_ ULONG Count, + _In_reads_(Count) PVOID Object[], + _In_ __drv_strictTypeMatch(__drv_typeConst) WAIT_TYPE WaitType, + _In_ __drv_strictTypeMatch(__drv_typeCond) KWAIT_REASON WaitReason, + _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE WaitMode, + _In_ BOOLEAN Alertable, + _In_opt_ PLARGE_INTEGER Timeout, + _Out_opt_ PKWAIT_BLOCK WaitBlockArray); #define KeWaitForMutexObject KeWaitForSingleObject +_IRQL_requires_min_(PASSIVE_LEVEL) +_When_((Timeout==NULL || *Timeout!=0), _IRQL_requires_max_(APC_LEVEL)) +_When_((Timeout!=NULL && *Timeout==0), _IRQL_requires_max_(DISPATCH_LEVEL)) NTKERNELAPI NTSTATUS NTAPI KeWaitForSingleObject( - IN PVOID Object, - IN KWAIT_REASON WaitReason, - IN KPROCESSOR_MODE WaitMode, - IN BOOLEAN Alertable, - IN PLARGE_INTEGER Timeout OPTIONAL); + _In_ _Points_to_data_ PVOID Object, + _In_ __drv_strictTypeMatch(__drv_typeCond) KWAIT_REASON WaitReason, + _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) KPROCESSOR_MODE WaitMode, + _In_ BOOLEAN Alertable, + _In_opt_ PLARGE_INTEGER Timeout); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_Requires_lock_not_held_(*LockHandle) +_Acquires_lock_(*LockHandle) +_Post_same_lock_(*SpinLock, *LockHandle) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_global_(QueuedSpinLock,LockHandle) +_IRQL_raises_(DISPATCH_LEVEL) _DECL_HAL_KE_IMPORT VOID FASTCALL KeAcquireInStackQueuedSpinLock( - IN OUT PKSPIN_LOCK SpinLock, - OUT PKLOCK_QUEUE_HANDLE LockHandle); + _Inout_ PKSPIN_LOCK SpinLock, + _Out_ PKLOCK_QUEUE_HANDLE LockHandle); +_Requires_lock_not_held_(*LockHandle) +_Acquires_lock_(*LockHandle) +_Post_same_lock_(*SpinLock, *LockHandle) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KeAcquireInStackQueuedSpinLockAtDpcLevel( - IN OUT PKSPIN_LOCK SpinLock, - OUT PKLOCK_QUEUE_HANDLE LockHandle); + _Inout_ PKSPIN_LOCK SpinLock, + _Out_ PKLOCK_QUEUE_HANDLE LockHandle); +_Requires_lock_not_held_(*Interrupt->ActualLock) +_Acquires_lock_(*Interrupt->ActualLock) +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(HIGH_LEVEL) NTKERNELAPI KIRQL NTAPI KeAcquireInterruptSpinLock( - IN OUT PKINTERRUPT Interrupt); + _Inout_ PKINTERRUPT Interrupt); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI @@ -10133,61 +10579,76 @@ ULONG NTAPI KeGetRecommendedSharedDataAlignment(VOID); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI ULONG NTAPI KeQueryRuntimeThread( - IN PKTHREAD Thread, - OUT PULONG UserTime); + _In_ PKTHREAD Thread, + _Out_ PULONG UserTime); +_Requires_lock_held_(*LockHandle) +_Releases_lock_(*LockHandle) +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KeReleaseInStackQueuedSpinLockFromDpcLevel( - IN PKLOCK_QUEUE_HANDLE LockHandle); + _In_ PKLOCK_QUEUE_HANDLE LockHandle); +_Requires_lock_held_(*Interrupt->ActualLock) +_Releases_lock_(*Interrupt->ActualLock) +_IRQL_requires_(HIGH_LEVEL) NTKERNELAPI VOID NTAPI KeReleaseInterruptSpinLock( - IN OUT PKINTERRUPT Interrupt, - IN KIRQL OldIrql); + _Inout_ PKINTERRUPT Interrupt, + _In_ _IRQL_restores_ KIRQL OldIrql); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI PKDEVICE_QUEUE_ENTRY NTAPI KeRemoveByKeyDeviceQueueIfBusy( - IN OUT PKDEVICE_QUEUE DeviceQueue, - IN ULONG SortKey); + _Inout_ PKDEVICE_QUEUE DeviceQueue, + _In_ ULONG SortKey); +_Requires_lock_held_(*LockHandle) +_Releases_lock_(*LockHandle) +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_restores_global_(QueuedSpinLock,LockHandle) _DECL_HAL_KE_IMPORT VOID FASTCALL KeReleaseInStackQueuedSpinLock( - IN PKLOCK_QUEUE_HANDLE LockHandle); + _In_ PKLOCK_QUEUE_HANDLE LockHandle); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_WINXPSP1) +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI KeDeregisterBugCheckReasonCallback( - IN OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord); + _Inout_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord); +_Must_inspect_result_ NTKERNELAPI BOOLEAN NTAPI KeRegisterBugCheckReasonCallback( - OUT PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, - IN PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, - IN KBUGCHECK_CALLBACK_REASON Reason, - IN PUCHAR Component); + _Out_ PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord, + _In_ PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine, + _In_ KBUGCHECK_CALLBACK_REASON Reason, + _In_ PUCHAR Component); #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP1) */ #if (NTDDI_VERSION >= NTDDI_WINXPSP2) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI @@ -10195,152 +10656,212 @@ KeFlushQueuedDpcs(VOID); #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */ #if (NTDDI_VERSION >= NTDDI_WS03) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI KeRegisterNmiCallback( - IN PNMI_CALLBACK CallbackRoutine, - IN PVOID Context OPTIONAL); + _In_ PNMI_CALLBACK CallbackRoutine, + _In_opt_ PVOID Context); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeDeregisterNmiCallback( - IN PVOID Handle); + _In_ PVOID Handle); NTKERNELAPI VOID NTAPI KeInitializeThreadedDpc( - OUT PRKDPC Dpc, - IN PKDEFERRED_ROUTINE DeferredRoutine, - IN PVOID DeferredContext OPTIONAL); + _Out_ PRKDPC Dpc, + _In_ PKDEFERRED_ROUTINE DeferredRoutine, + _In_opt_ PVOID DeferredContext); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(IPI_LEVEL-1) NTKERNELAPI ULONG_PTR NTAPI KeIpiGenericCall( - IN PKIPI_BROADCAST_WORKER BroadcastFunction, - IN ULONG_PTR Context); + _In_ PKIPI_BROADCAST_WORKER BroadcastFunction, + _In_ ULONG_PTR Context); +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ NTKERNELAPI KIRQL FASTCALL KeAcquireSpinLockForDpc( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ PKSPIN_LOCK SpinLock); +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL KeReleaseSpinLockForDpc( - IN OUT PKSPIN_LOCK SpinLock, - IN KIRQL OldIrql); + _Inout_ PKSPIN_LOCK SpinLock, + _In_ _IRQL_restores_ KIRQL OldIrql); +_Must_inspect_result_ NTKERNELAPI BOOLEAN FASTCALL KeTestSpinLock( - IN PKSPIN_LOCK SpinLock); + _In_ PKSPIN_LOCK SpinLock); #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ #if (NTDDI_VERSION >= NTDDI_WS03SP1) +_Must_inspect_result_ +_IRQL_requires_min_(DISPATCH_LEVEL) +_Post_satisfies_(return == 1 || return == 0) NTKERNELAPI BOOLEAN FASTCALL KeTryToAcquireSpinLockAtDpcLevel( - IN OUT PKSPIN_LOCK SpinLock); + _Inout_ _Requires_lock_not_held_(*_Curr_) + _When_(return!=0, _Acquires_lock_(*_Curr_)) + PKSPIN_LOCK SpinLock); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeAreAllApcsDisabled(VOID); +_Acquires_lock_(_Global_critical_region_) +_Requires_lock_not_held_(*Mutex) +_Acquires_lock_(*Mutex) +_IRQL_requires_max_(APC_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) NTKERNELAPI VOID FASTCALL KeAcquireGuardedMutex( - IN OUT PKGUARDED_MUTEX GuardedMutex); + _Inout_ PKGUARDED_MUTEX GuardedMutex); +_Requires_lock_not_held_(*FastMutex) +_Acquires_lock_(*FastMutex) +_IRQL_requires_max_(APC_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) NTKERNELAPI VOID FASTCALL KeAcquireGuardedMutexUnsafe( - IN OUT PKGUARDED_MUTEX GuardedMutex); + _Inout_ PKGUARDED_MUTEX GuardedMutex); +_Acquires_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeEnterGuardedRegion(VOID); +_Releases_lock_(_Global_critical_region_) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeLeaveGuardedRegion(VOID); +_IRQL_requires_max_(APC_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) NTKERNELAPI VOID FASTCALL KeInitializeGuardedMutex( - OUT PKGUARDED_MUTEX GuardedMutex); + _Out_ PKGUARDED_MUTEX GuardedMutex); +_Requires_lock_held_(*FastMutex) +_Releases_lock_(*FastMutex) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID FASTCALL KeReleaseGuardedMutexUnsafe( - IN OUT PKGUARDED_MUTEX GuardedMutex); + _Inout_ PKGUARDED_MUTEX GuardedMutex); +_Releases_lock_(_Global_critical_region_) +_Requires_lock_held_(*Mutex) +_Releases_lock_(*Mutex) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID FASTCALL KeReleaseGuardedMutex( - IN OUT PKGUARDED_MUTEX GuardedMutex); + _Inout_ PKGUARDED_MUTEX GuardedMutex); +_Must_inspect_result_ +_Success_(return != FALSE) +_IRQL_requires_max_(APC_LEVEL) +_Post_satisfies_(return == 1 || return == 0) NTKERNELAPI BOOLEAN FASTCALL KeTryToAcquireGuardedMutex( - IN OUT PKGUARDED_MUTEX GuardedMutex); + _When_ (return, _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_)) _Acquires_lock_(_Global_critical_region_) + _Inout_ PKGUARDED_MUTEX GuardedMutex); #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ #if (NTDDI_VERSION >= NTDDI_VISTA) +_Requires_lock_not_held_(*LockHandle) +_Acquires_lock_(*LockHandle) +_Post_same_lock_(*SpinLock, *LockHandle) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_global_(QueuedSpinLock,LockHandle) NTKERNELAPI VOID FASTCALL KeAcquireInStackQueuedSpinLockForDpc( - IN OUT PKSPIN_LOCK SpinLock, - OUT PKLOCK_QUEUE_HANDLE LockHandle); + _Inout_ PKSPIN_LOCK SpinLock, + _Out_ PKLOCK_QUEUE_HANDLE LockHandle); +_Requires_lock_held_(*LockHandle) +_Releases_lock_(*LockHandle) +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_restores_global_(QueuedSpinLock,LockHandle) NTKERNELAPI VOID FASTCALL KeReleaseInStackQueuedSpinLockForDpc( - IN PKLOCK_QUEUE_HANDLE LockHandle); + _In_ PKLOCK_QUEUE_HANDLE LockHandle); +_IRQL_requires_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI KeQueryDpcWatchdogInformation( - OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation); + _Out_ PKDPC_WATCHDOG_INFORMATION WatchdogInformation); #if defined(SINGLE_GROUP_LEGACY_API) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI KAFFINITY NTAPI KeSetSystemAffinityThreadEx( - IN KAFFINITY Affinity); + _In_ KAFFINITY Affinity); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeRevertToUserAffinityThreadEx( - IN KAFFINITY Affinity); + _In_ KAFFINITY Affinity); NTKERNELAPI ULONG NTAPI KeQueryActiveProcessorCount( - OUT PKAFFINITY ActiveProcessors OPTIONAL); + _Out_opt_ PKAFFINITY ActiveProcessors); NTKERNELAPI ULONG @@ -10352,62 +10873,76 @@ KeQueryMaximumProcessorCount(VOID); #if (NTDDI_VERSION >= NTDDI_WS08) +_IRQL_requires_max_(APC_LEVEL) PVOID NTAPI KeRegisterProcessorChangeCallback( - IN PPROCESSOR_CALLBACK_FUNCTION CallbackFunction, - IN PVOID CallbackContext OPTIONAL, - IN ULONG Flags); + _In_ PPROCESSOR_CALLBACK_FUNCTION CallbackFunction, + _In_opt_ PVOID CallbackContext, + _In_ ULONG Flags); +_IRQL_requires_max_(APC_LEVEL) VOID NTAPI KeDeregisterProcessorChangeCallback( - IN PVOID CallbackHandle); + _In_ PVOID CallbackHandle); #endif /* (NTDDI_VERSION >= NTDDI_WS08) */ #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_same_ ULONG64 NTAPI KeQueryTotalCycleTimeProcess( - IN OUT PKPROCESS Process, - OUT PULONG64 CycleTimeStamp); + _Inout_ PKPROCESS Process, + _Out_ PULONG64 CycleTimeStamp); +_IRQL_requires_max_(APC_LEVEL) +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_same_ ULONG64 NTAPI KeQueryTotalCycleTimeThread( - IN OUT PKTHREAD Thread, - OUT PULONG64 CycleTimeStamp); + _Inout_ PKTHREAD Thread, + _Out_ PULONG64 CycleTimeStamp); +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI KeSetTargetProcessorDpcEx( - IN OUT PKDPC Dpc, - IN PPROCESSOR_NUMBER ProcNumber); + _Inout_ PKDPC Dpc, + _In_ PPROCESSOR_NUMBER ProcNumber); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeSetSystemGroupAffinityThread( - IN PGROUP_AFFINITY Affinity, - OUT PGROUP_AFFINITY PreviousAffinity OPTIONAL); + _In_ PGROUP_AFFINITY Affinity, + _Out_opt_ PGROUP_AFFINITY PreviousAffinity); +_IRQL_requires_min_(PASSIVE_LEVEL) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI KeRevertToUserGroupAffinityThread( - IN PGROUP_AFFINITY PreviousAffinity); + _In_ PGROUP_AFFINITY PreviousAffinity); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI KeSetCoalescableTimer( - IN OUT PKTIMER Timer, - IN LARGE_INTEGER DueTime, - IN ULONG Period, - IN ULONG TolerableDelay, - IN PKDPC Dpc OPTIONAL); + _Inout_ PKTIMER Timer, + _In_ LARGE_INTEGER DueTime, + _In_ ULONG Period, + _In_ ULONG TolerableDelay, + _In_opt_ PKDPC Dpc); NTKERNELAPI ULONGLONG @@ -10418,13 +10953,13 @@ NTKERNELAPI ULONG NTAPI KeQueryActiveProcessorCountEx( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI ULONG NTAPI KeQueryMaximumProcessorCountEx( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI USHORT @@ -10440,27 +10975,27 @@ NTKERNELAPI KAFFINITY NTAPI KeQueryGroupAffinity( - IN USHORT GroupNumber); + _In_ USHORT GroupNumber); NTKERNELAPI ULONG NTAPI KeGetCurrentProcessorNumberEx( - OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL); + _Out_opt_ PPROCESSOR_NUMBER ProcNumber); NTKERNELAPI VOID NTAPI KeQueryNodeActiveAffinity( - IN USHORT NodeNumber, - OUT PGROUP_AFFINITY Affinity OPTIONAL, - OUT PUSHORT Count OPTIONAL); + _In_ USHORT NodeNumber, + _Out_opt_ PGROUP_AFFINITY Affinity, + _Out_opt_ PUSHORT Count); NTKERNELAPI USHORT NTAPI KeQueryNodeMaximumProcessorCount( - IN USHORT NodeNumber); + _In_ USHORT NodeNumber); NTKERNELAPI USHORT @@ -10472,38 +11007,47 @@ USHORT NTAPI KeGetCurrentNodeNumber(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) 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); + _In_opt_ PPROCESSOR_NUMBER ProcessorNumber OPTIONAL, + _In_ LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType, + _Out_writes_bytes_opt_(*Length) PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information, + _Inout_ PULONG Length); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Ret_range_(<=, 0) +_When_(return==0, _Kernel_float_saved_) NTKERNELAPI NTSTATUS NTAPI KeSaveExtendedProcessorState( - IN ULONG64 Mask, - OUT PXSTATE_SAVE XStateSave); + _In_ ULONG64 Mask, + _Out_ _Requires_lock_not_held_(*_Curr_) + _When_(return==0, _Acquires_lock_(*_Curr_)) + PXSTATE_SAVE XStateSave); +_Kernel_float_restored_ NTKERNELAPI VOID NTAPI KeRestoreExtendedProcessorState( - IN PXSTATE_SAVE XStateSave); + _In_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) + PXSTATE_SAVE XStateSave); NTSTATUS NTAPI KeGetProcessorNumberFromIndex( - IN ULONG ProcIndex, - OUT PPROCESSOR_NUMBER ProcNumber); + _In_ ULONG ProcIndex, + _Out_ PPROCESSOR_NUMBER ProcNumber); ULONG NTAPI KeGetProcessorIndexFromNumber( - IN PPROCESSOR_NUMBER ProcNumber); + _In_ PPROCESSOR_NUMBER ProcNumber); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ #if !defined(_IA64_) NTHALAPI @@ -10519,7 +11063,14 @@ KeFlushWriteBuffer(VOID); #define KeInitializeCallbackRecord(CallbackRecord) \ CallbackRecord->State = BufferEmpty; -#if DBG +#if defined(_PREFAST_) + +void __PREfastPagedCode(void); +void __PREfastPagedCodeLocked(void); +#define PAGED_CODE() __PREfastPagedCode(); +#define PAGED_CODE_LOCKED() __PREfastPagedCodeLocked(); + +#elif DBG #if (NTDDI_VERSION >= NTDDI_VISTA) #define PAGED_ASSERT( exp ) NT_ASSERT( exp ) @@ -10534,14 +11085,15 @@ KeFlushWriteBuffer(VOID); } \ } +#define PAGED_CODE_LOCKED() NOP_FUNCTION; + #else -#define PAGED_CODE() +#define PAGED_CODE() NOP_FUNCTION; +#define PAGED_CODE_LOCKED() NOP_FUNCTION; #endif /* DBG */ -#define PAGED_CODE_LOCKED() NOP_FUNCTION; - /****************************************************************************** * Memory manager Functions * ******************************************************************************/ @@ -10720,280 +11272,344 @@ KeFlushWriteBuffer(VOID); } #if (NTDDI_VERSION >= NTDDI_WIN2K) +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) NTKERNELAPI PVOID NTAPI MmAllocateContiguousMemory( - IN SIZE_T NumberOfBytes, - IN PHYSICAL_ADDRESS HighestAcceptableAddress); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) 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); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, + _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, + _In_ MEMORY_CACHING_TYPE CacheType); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PMDL NTAPI MmAllocatePagesForMdl( - IN PHYSICAL_ADDRESS LowAddress, - IN PHYSICAL_ADDRESS HighAddress, - IN PHYSICAL_ADDRESS SkipBytes, - IN SIZE_T TotalBytes); + _In_ PHYSICAL_ADDRESS LowAddress, + _In_ PHYSICAL_ADDRESS HighAddress, + _In_ PHYSICAL_ADDRESS SkipBytes, + _In_ SIZE_T TotalBytes); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmBuildMdlForNonPagedPool( - IN OUT PMDLX MemoryDescriptorList); + _Inout_ PMDLX MemoryDescriptorList); //DECLSPEC_DEPRECATED_DDK NTKERNELAPI PMDL NTAPI MmCreateMdl( - IN PMDL MemoryDescriptorList OPTIONAL, - IN PVOID Base, - IN SIZE_T Length); + _Out_writes_bytes_opt_ (sizeof (MDL) + (sizeof (PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES (Base, Length))) + PMDL MemoryDescriptorList, + _In_reads_bytes_opt_ (Length) PVOID Base, + _In_ SIZE_T Length); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmFreeContiguousMemory( - IN PVOID BaseAddress); + _In_ PVOID BaseAddress); +_IRQL_requires_max_ (DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmFreeContiguousMemorySpecifyCache( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheType); + _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes, + _In_ MEMORY_CACHING_TYPE CacheType); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmFreePagesFromMdl( - IN PMDLX MemoryDescriptorList); + _Inout_ PMDLX MemoryDescriptorList); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PVOID NTAPI MmGetSystemRoutineAddress( - IN PUNICODE_STRING SystemRoutineName); + _In_ PUNICODE_STRING SystemRoutineName); NTKERNELAPI LOGICAL NTAPI MmIsDriverVerifying( - IN struct _DRIVER_OBJECT *DriverObject); + _In_ struct _DRIVER_OBJECT *DriverObject); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI MmLockPagableDataSection( - IN PVOID AddressWithinSection); + _In_ PVOID AddressWithinSection); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Out_writes_bytes_opt_ (NumberOfBytes) NTKERNELAPI PVOID NTAPI MmMapIoSpace( - IN PHYSICAL_ADDRESS PhysicalAddress, - IN SIZE_T NumberOfBytes, - IN MEMORY_CACHING_TYPE CacheEnable); + _In_ PHYSICAL_ADDRESS PhysicalAddress, + _In_ SIZE_T NumberOfBytes, + _In_ MEMORY_CACHING_TYPE CacheType); +_Must_inspect_result_ +_When_(AccessMode==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(AccessMode==1, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL)) NTKERNELAPI PVOID NTAPI MmMapLockedPages( - IN PMDL MemoryDescriptorList, - IN KPROCESSOR_MODE AccessMode); + _Inout_ PMDL MemoryDescriptorList, + _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) + KPROCESSOR_MODE AccessMode); +_Post_writable_byte_size_(MemoryDescriptorList->ByteCount) +_When_(AccessMode==KernelMode, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(AccessMode==UserMode, _Maybe_raises_SEH_exception_ _IRQL_requires_max_(APC_LEVEL) _Post_notnull_) +_At_(MemoryDescriptorList->MappedSystemVa, _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)) +_Must_inspect_result_ +_Success_(return != NULL) NTKERNELAPI PVOID NTAPI MmMapLockedPagesSpecifyCache( - IN PMDLX MemoryDescriptorList, - IN KPROCESSOR_MODE AccessMode, - IN MEMORY_CACHING_TYPE CacheType, - IN PVOID BaseAddress OPTIONAL, - IN ULONG BugCheckOnFailure, - IN MM_PAGE_PRIORITY Priority); + _Inout_ PMDLX MemoryDescriptorList, + _In_ __drv_strictType(KPROCESSOR_MODE/enum _MODE,__drv_typeConst) + KPROCESSOR_MODE AccessMode, + _In_ __drv_strictTypeMatch(__drv_typeCond) MEMORY_CACHING_TYPE CacheType, + _In_opt_ PVOID BaseAddress, + _In_ ULONG BugCheckOnFailure, + _In_ MM_PAGE_PRIORITY Priority); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI MmPageEntireDriver( - IN PVOID AddressWithinSection); + _In_ PVOID AddressWithinSection); +_IRQL_requires_max_(DISPATCH_LEVEL) +_At_(MemoryDescriptorList->StartVa + MemoryDescriptorList->ByteOffset, + _Field_size_bytes_opt_(MemoryDescriptorList->ByteCount)) NTKERNELAPI VOID NTAPI MmProbeAndLockPages( - IN OUT PMDL MemoryDescriptorList, - IN KPROCESSOR_MODE AccessMode, - IN LOCK_OPERATION Operation); + _Inout_ PMDLX MemoryDescriptorList, + _In_ KPROCESSOR_MODE AccessMode, + _In_ LOCK_OPERATION Operation); NTKERNELAPI MM_SYSTEMSIZE NTAPI MmQuerySystemSize(VOID); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmResetDriverPaging( - IN PVOID AddressWithinSection); + _In_ PVOID AddressWithinSection); NTKERNELAPI SIZE_T NTAPI MmSizeOfMdl( - IN PVOID Base, - IN SIZE_T Length); + _In_reads_bytes_opt_ (Length) PVOID Base, + _In_ SIZE_T Length); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmUnlockPagableImageSection( - IN PVOID ImageSectionHandle); + _In_ PVOID ImageSectionHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmUnlockPages( - IN OUT PMDL MemoryDescriptorList); + _Inout_ PMDLX MemoryDescriptorList); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmUnmapIoSpace( - IN PVOID BaseAddress, - IN SIZE_T NumberOfBytes); + _In_reads_bytes_ (NumberOfBytes) PVOID BaseAddress, + _In_ SIZE_T NumberOfBytes); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI VOID NTAPI MmProbeAndLockProcessPages( - IN OUT PMDL MemoryDescriptorList, - IN PEPROCESS Process, - IN KPROCESSOR_MODE AccessMode, - IN LOCK_OPERATION Operation); + _Inout_ PMDL MemoryDescriptorList, + _In_ PEPROCESS Process, + _In_ KPROCESSOR_MODE AccessMode, + _In_ LOCK_OPERATION Operation); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmUnmapLockedPages( - IN PVOID BaseAddress, - IN PMDL MemoryDescriptorList); + _In_ PVOID BaseAddress, + _Inout_ PMDL MemoryDescriptorList); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_When_ (return != NULL, _Post_writable_byte_size_ (NumberOfBytes)) 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); + _In_ SIZE_T NumberOfBytes, + _In_ PHYSICAL_ADDRESS LowestAcceptableAddress, + _In_ PHYSICAL_ADDRESS HighestAcceptableAddress, + _In_opt_ PHYSICAL_ADDRESS BoundaryAddressMultiple, + _In_ MEMORY_CACHING_TYPE CacheType, + _In_ NODE_REQUIREMENT PreferredNode); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmAdvanceMdl( - IN OUT PMDL Mdl, - IN ULONG NumberOfBytes); + _Inout_ PMDLX Mdl, + _In_ ULONG NumberOfBytes); +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) +_When_ (return != NULL, _Out_writes_bytes_opt_ (NumberOfBytes)) NTKERNELAPI PVOID NTAPI MmAllocateMappingAddress( - IN SIZE_T NumberOfBytes, - IN ULONG PoolTag); + _In_ SIZE_T NumberOfBytes, + _In_ ULONG PoolTag); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI MmFreeMappingAddress( - IN PVOID BaseAddress, - IN ULONG PoolTag); + _In_ PVOID BaseAddress, + _In_ ULONG PoolTag); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmIsVerifierEnabled( - OUT PULONG VerifierFlags); + _Out_ PULONG VerifierFlags); +_Post_writable_byte_size_(MemoryDescriptorList->ByteCount) +_IRQL_requires_max_(DISPATCH_LEVEL) +_At_(MemoryDescriptorList->MappedSystemVa + MemoryDescriptorList->ByteOffset, + _Post_writable_byte_size_(MemoryDescriptorList->ByteCount)) +_Must_inspect_result_ +_Success_(return != NULL) NTKERNELAPI PVOID NTAPI MmMapLockedPagesWithReservedMapping( - IN PVOID MappingAddress, - IN ULONG PoolTag, - IN PMDL MemoryDescriptorList, - IN MEMORY_CACHING_TYPE CacheType); + _In_ PVOID MappingAddress, + _In_ ULONG PoolTag, + _Inout_ PMDLX MemoryDescriptorList, + _In_ __drv_strictTypeMatch(__drv_typeCond) + MEMORY_CACHING_TYPE CacheType); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmProtectMdlSystemAddress( - IN PMDL MemoryDescriptorList, - IN ULONG NewProtect); + _In_ PMDLX MemoryDescriptorList, + _In_ ULONG NewProtect); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI MmUnmapReservedMapping( - IN PVOID BaseAddress, - IN ULONG PoolTag, - IN PMDL MemoryDescriptorList); + _In_ PVOID BaseAddress, + _In_ ULONG PoolTag, + _Inout_ PMDLX MemoryDescriptorList); +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI MmAddVerifierThunks( - IN PVOID ThunkBuffer, - IN ULONG ThunkBufferSize); + _In_reads_bytes_ (ThunkBufferSize) PVOID ThunkBuffer, + _In_ ULONG ThunkBufferSize); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_WS03) +_IRQL_requires_max_ (DISPATCH_LEVEL) NTKERNELAPI LOGICAL NTAPI MmIsIoSpaceActive( - IN PHYSICAL_ADDRESS StartAddress, - IN SIZE_T NumberOfBytes); + _In_ PHYSICAL_ADDRESS StartAddress, + _In_ SIZE_T NumberOfBytes); #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ #if (NTDDI_VERSION >= NTDDI_WS03SP1) +_Must_inspect_result_ +_IRQL_requires_max_ (DISPATCH_LEVEL) NTKERNELAPI PMDL NTAPI MmAllocatePagesForMdlEx( - IN PHYSICAL_ADDRESS LowAddress, - IN PHYSICAL_ADDRESS HighAddress, - IN PHYSICAL_ADDRESS SkipBytes, - IN SIZE_T TotalBytes, - IN MEMORY_CACHING_TYPE CacheType, - IN ULONG Flags); + _In_ PHYSICAL_ADDRESS LowAddress, + _In_ PHYSICAL_ADDRESS HighAddress, + _In_ PHYSICAL_ADDRESS SkipBytes, + _In_ SIZE_T TotalBytes, + _In_ MEMORY_CACHING_TYPE CacheType, + _In_ ULONG Flags); #endif #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_ (APC_LEVEL) NTKERNELAPI LOGICAL NTAPI MmIsDriverVerifyingByAddress( - IN PVOID AddressWithinSection); + _In_ PVOID AddressWithinSection); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ /****************************************************************************** @@ -11001,110 +11617,116 @@ MmIsDriverVerifyingByAddress( ******************************************************************************/ #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI SeAccessCheck( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, - IN BOOLEAN SubjectContextLocked, - IN ACCESS_MASK DesiredAccess, - IN ACCESS_MASK PreviouslyGrantedAccess, - OUT PPRIVILEGE_SET *Privileges OPTIONAL, - IN PGENERIC_MAPPING GenericMapping, - IN KPROCESSOR_MODE AccessMode, - OUT PACCESS_MASK GrantedAccess, - OUT PNTSTATUS AccessStatus); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, + _In_ BOOLEAN SubjectContextLocked, + _In_ ACCESS_MASK DesiredAccess, + _In_ ACCESS_MASK PreviouslyGrantedAccess, + _Outptr_opt_ PPRIVILEGE_SET *Privileges, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PACCESS_MASK GrantedAccess, + _Out_ PNTSTATUS AccessStatus); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI SeAssignSecurity( - IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, - IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL, - OUT PSECURITY_DESCRIPTOR *NewDescriptor, - IN BOOLEAN IsDirectoryObject, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN PGENERIC_MAPPING GenericMapping, - IN POOL_TYPE PoolType); + _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor, + _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor, + _Out_ PSECURITY_DESCRIPTOR *NewDescriptor, + _In_ BOOLEAN IsDirectoryObject, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ POOL_TYPE PoolType); NTKERNELAPI NTSTATUS NTAPI SeAssignSecurityEx( - IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL, - IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL, - OUT PSECURITY_DESCRIPTOR *NewDescriptor, - IN GUID *ObjectType OPTIONAL, - IN BOOLEAN IsDirectoryObject, - IN ULONG AutoInheritFlags, - IN PSECURITY_SUBJECT_CONTEXT SubjectContext, - IN PGENERIC_MAPPING GenericMapping, - IN POOL_TYPE PoolType); + _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor, + _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor, + _Out_ PSECURITY_DESCRIPTOR *NewDescriptor, + _In_opt_ GUID *ObjectType, + _In_ BOOLEAN IsDirectoryObject, + _In_ ULONG AutoInheritFlags, + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ POOL_TYPE PoolType); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI SeDeassignSecurity( - IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor); + _Inout_ PSECURITY_DESCRIPTOR *SecurityDescriptor); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI SeValidSecurityDescriptor( - IN ULONG Length, - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ ULONG Length, + _In_reads_bytes_(Length) PSECURITY_DESCRIPTOR SecurityDescriptor); NTKERNELAPI ULONG NTAPI SeObjectCreateSaclAccessBits( - IN PSECURITY_DESCRIPTOR SecurityDescriptor); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor); NTKERNELAPI VOID NTAPI SeReleaseSubjectContext( - IN OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); + _Inout_ PSECURITY_SUBJECT_CONTEXT SubjectContext); NTKERNELAPI VOID NTAPI SeUnlockSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext); NTKERNELAPI VOID NTAPI SeCaptureSubjectContext( - OUT PSECURITY_SUBJECT_CONTEXT SubjectContext); + _Out_ PSECURITY_SUBJECT_CONTEXT SubjectContext); NTKERNELAPI VOID NTAPI SeLockSubjectContext( - IN PSECURITY_SUBJECT_CONTEXT SubjectContext); + _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WS03SP1) +_At_(AuditParameters->ParameterCount, _Const_) NTSTATUS NTAPI SeSetAuditParameter( - IN OUT PSE_ADT_PARAMETER_ARRAY AuditParameters, - IN SE_ADT_PARAMETER_TYPE Type, - IN ULONG Index, - IN PVOID Data); + _Inout_ PSE_ADT_PARAMETER_ARRAY AuditParameters, + _In_ SE_ADT_PARAMETER_TYPE Type, + _In_range_(<,SE_MAX_AUDIT_PARAMETERS) ULONG Index, + _In_reads_(_Inexpressible_("depends on SE_ADT_PARAMETER_TYPE")) + PVOID Data); NTSTATUS NTAPI SeReportSecurityEvent( - IN ULONG Flags, - IN PUNICODE_STRING SourceName, - IN PSID UserSid OPTIONAL, - IN PSE_ADT_PARAMETER_ARRAY AuditParameters); + _In_ ULONG Flags, + _In_ PUNICODE_STRING SourceName, + _In_opt_ PSID UserSid, + _In_ PSE_ADT_PARAMETER_ARRAY AuditParameters); #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ @@ -11113,17 +11735,17 @@ NTKERNELAPI ULONG NTAPI SeComputeAutoInheritByObjectType( - IN PVOID ObjectType, - IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, - IN PSECURITY_DESCRIPTOR ParentSecurityDescriptor OPTIONAL); + _In_ PVOID ObjectType, + _In_opt_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_opt_ PSECURITY_DESCRIPTOR ParentSecurityDescriptor); #ifdef SE_NTFS_WORLD_CACHE VOID NTAPI SeGetWorldRights( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN PGENERIC_MAPPING GenericMapping, - OUT PACCESS_MASK GrantedAccess); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ PGENERIC_MAPPING GenericMapping, + _Out_ PACCESS_MASK GrantedAccess); #endif /* SE_NTFS_WORLD_CACHE */ #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ /****************************************************************************** @@ -11131,65 +11753,72 @@ SeGetWorldRights( ******************************************************************************/ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI CmRegisterCallback( - IN PEX_CALLBACK_FUNCTION Function, - IN PVOID Context OPTIONAL, - OUT PLARGE_INTEGER Cookie); + _In_ PEX_CALLBACK_FUNCTION Function, + _In_opt_ PVOID Context, + _Out_ PLARGE_INTEGER Cookie); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI CmUnRegisterCallback( - IN LARGE_INTEGER Cookie); + _In_ LARGE_INTEGER Cookie); #endif #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI CmRegisterCallbackEx( - PEX_CALLBACK_FUNCTION Function, - PCUNICODE_STRING Altitude, - PVOID Driver, - PVOID Context, - PLARGE_INTEGER Cookie, - PVOID Reserved); + _In_ PEX_CALLBACK_FUNCTION Function, + _In_ PCUNICODE_STRING Altitude, + _In_ PVOID Driver, + _In_opt_ PVOID Context, + _Out_ PLARGE_INTEGER Cookie, + _Reserved_ PVOID Reserved); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI CmGetCallbackVersion( - OUT PULONG Major OPTIONAL, - OUT PULONG Minor OPTIONAL); + _Out_opt_ PULONG Major, + _Out_opt_ PULONG Minor); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI CmSetCallbackObjectContext( - IN OUT PVOID Object, - IN PLARGE_INTEGER Cookie, - IN PVOID NewContext, - OUT PVOID *OldContext OPTIONAL); + _Inout_ PVOID Object, + _In_ PLARGE_INTEGER Cookie, + _In_ PVOID NewContext, + _Out_opt_ PVOID *OldContext); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI CmCallbackGetKeyObjectID( - IN PLARGE_INTEGER Cookie, - IN PVOID Object, - OUT PULONG_PTR ObjectID OPTIONAL, - OUT PCUNICODE_STRING *ObjectName OPTIONAL); + _In_ PLARGE_INTEGER Cookie, + _In_ PVOID Object, + _Out_opt_ PULONG_PTR ObjectID, + _Outptr_opt_ PCUNICODE_STRING *ObjectName); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI CmGetBoundTransaction( - IN PLARGE_INTEGER Cookie, - IN PVOID Object); + _In_ PLARGE_INTEGER Cookie, + _In_ PVOID Object); #endif // NTDDI_VERSION >= NTDDI_VISTA @@ -11648,14 +12277,16 @@ WRITE_REGISTER_USHORT( #define DMA_MACROS_DEFINED +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) FORCEINLINE NTSTATUS IoAllocateAdapterChannel( - IN PDMA_ADAPTER DmaAdapter, - IN PDEVICE_OBJECT DeviceObject, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine, - IN PVOID Context) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG NumberOfMapRegisters, + _In_ PDRIVER_CONTROL ExecutionRoutine, + _In_ PVOID Context) { PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel; AllocateAdapterChannel = @@ -11665,19 +12296,19 @@ IoAllocateAdapterChannel( DeviceObject, NumberOfMapRegisters, ExecutionRoutine, - Context ); + Context); } FORCEINLINE BOOLEAN NTAPI IoFlushAdapterBuffers( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN ULONG Length, - IN BOOLEAN WriteToDevice) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _In_ ULONG Length, + _In_ BOOLEAN WriteToDevice) { PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers; FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers; @@ -11694,7 +12325,7 @@ FORCEINLINE VOID NTAPI IoFreeAdapterChannel( - IN PDMA_ADAPTER DmaAdapter) + _In_ PDMA_ADAPTER DmaAdapter) { PFREE_ADAPTER_CHANNEL FreeAdapterChannel; FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel; @@ -11706,9 +12337,9 @@ FORCEINLINE VOID NTAPI IoFreeMapRegisters( - IN PDMA_ADAPTER DmaAdapter, - IN PVOID MapRegisterBase, - IN ULONG NumberOfMapRegisters) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PVOID MapRegisterBase, + _In_ ULONG NumberOfMapRegisters) { PFREE_MAP_REGISTERS FreeMapRegisters; FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters; @@ -11720,12 +12351,12 @@ FORCEINLINE PHYSICAL_ADDRESS NTAPI IoMapTransfer( - IN PDMA_ADAPTER DmaAdapter, - IN PMDL Mdl, - IN PVOID MapRegisterBase, - IN PVOID CurrentVa, - IN OUT PULONG Length, - IN BOOLEAN WriteToDevice) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ PMDL Mdl, + _In_ PVOID MapRegisterBase, + _In_ PVOID CurrentVa, + _Inout_ PULONG Length, + _In_ BOOLEAN WriteToDevice) { PMAP_TRANSFER MapTransfer; @@ -11742,276 +12373,339 @@ IoMapTransfer( #if (NTDDI_VERSION >= NTDDI_WIN2K) +_Acquires_lock_(_Global_cancel_spin_lock_) +_Requires_lock_not_held_(_Global_cancel_spin_lock_) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_raises_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoAcquireCancelSpinLock( - OUT PKIRQL Irql); + _Out_ _At_(*Irql, _IRQL_saves_) PKIRQL Irql); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoAcquireRemoveLockEx( - IN PIO_REMOVE_LOCK RemoveLock, - IN PVOID Tag OPTIONAL, - IN PCSTR File, - IN ULONG Line, - IN ULONG RemlockSize); + _Inout_ PIO_REMOVE_LOCK RemoveLock, + _In_opt_ PVOID Tag, + _In_ PCSTR File, + _In_ ULONG Line, + _In_ ULONG RemlockSize); + +_IRQL_requires_max_(DISPATCH_LEVEL) +_Ret_range_(<=, 0) NTKERNELAPI NTSTATUS NTAPI IoAllocateDriverObjectExtension( - IN PDRIVER_OBJECT DriverObject, - IN PVOID ClientIdentificationAddress, - IN ULONG DriverObjectExtensionSize, - OUT PVOID *DriverObjectExtension); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PVOID ClientIdentificationAddress, + _In_ ULONG DriverObjectExtensionSize, + _Post_ _At_(*DriverObjectExtension, _When_(return==0, + __drv_aliasesMem __drv_allocatesMem(Mem) _Post_notnull_)) + _When_(return == 0, _Outptr_result_bytebuffer_(DriverObjectExtensionSize)) + PVOID *DriverObjectExtension); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PVOID NTAPI IoAllocateErrorLogEntry( - IN PVOID IoObject, - IN UCHAR EntrySize); + _In_ PVOID IoObject, + _In_ UCHAR EntrySize); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PIRP NTAPI IoAllocateIrp( - IN CCHAR StackSize, - IN BOOLEAN ChargeQuota); + _In_ CCHAR StackSize, + _In_ BOOLEAN ChargeQuota); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PMDL NTAPI IoAllocateMdl( - IN PVOID VirtualAddress OPTIONAL, - IN ULONG Length, - IN BOOLEAN SecondaryBuffer, - IN BOOLEAN ChargeQuota, - IN OUT PIRP Irp OPTIONAL); + _In_opt_ __drv_aliasesMem PVOID VirtualAddress, + _In_ ULONG Length, + _In_ BOOLEAN SecondaryBuffer, + _In_ BOOLEAN ChargeQuota, + _Inout_opt_ PIRP Irp); +__drv_allocatesMem(Mem) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PIO_WORKITEM NTAPI IoAllocateWorkItem( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(APC_LEVEL) +_Ret_range_(<=, 0) NTKERNELAPI NTSTATUS NTAPI IoAttachDevice( - IN PDEVICE_OBJECT SourceDevice, - IN PUNICODE_STRING TargetDevice, - OUT PDEVICE_OBJECT *AttachedDevice); + _In_ _Kernel_requires_resource_held_(Memory) _When_(return==0, __drv_aliasesMem) + PDEVICE_OBJECT SourceDevice, + _In_ PUNICODE_STRING TargetDevice, + _Out_ PDEVICE_OBJECT *AttachedDevice); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack( - IN PDEVICE_OBJECT SourceDevice, - IN PDEVICE_OBJECT TargetDevice); + _In_ _Kernel_requires_resource_held_(Memory) _When_(return!=0, __drv_aliasesMem) + PDEVICE_OBJECT SourceDevice, + _In_ PDEVICE_OBJECT TargetDevice); +_Must_inspect_result_ +__drv_aliasesMem +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PIRP NTAPI IoBuildAsynchronousFsdRequest( - IN ULONG MajorFunction, - IN PDEVICE_OBJECT DeviceObject, - IN OUT PVOID Buffer OPTIONAL, - IN ULONG Length OPTIONAL, - IN PLARGE_INTEGER StartingOffset OPTIONAL, - IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL); + _In_ ULONG MajorFunction, + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_opt_ PVOID Buffer, + _In_opt_ ULONG Length, + _In_opt_ PLARGE_INTEGER StartingOffset, + _In_opt_ PIO_STATUS_BLOCK IoStatusBlock); +_Must_inspect_result_ +__drv_aliasesMem +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PIRP NTAPI IoBuildDeviceIoControlRequest( - IN ULONG IoControlCode, - IN PDEVICE_OBJECT DeviceObject, - IN PVOID InputBuffer OPTIONAL, - IN ULONG InputBufferLength, - OUT PVOID OutputBuffer OPTIONAL, - IN ULONG OutputBufferLength, - IN BOOLEAN InternalDeviceIoControl, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ ULONG IoControlCode, + _In_ PDEVICE_OBJECT DeviceObject, + _In_opt_ PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_opt_ PVOID OutputBuffer, + _In_ ULONG OutputBufferLength, + _In_ BOOLEAN InternalDeviceIoControl, + _In_ PKEVENT Event, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoBuildPartialMdl( - IN PMDL SourceMdl, - IN OUT PMDL TargetMdl, - IN PVOID VirtualAddress, - IN ULONG Length); + _In_ PMDL SourceMdl, + _Inout_ PMDL TargetMdl, + _In_ PVOID VirtualAddress, + _In_ ULONG Length); +_Must_inspect_result_ +__drv_aliasesMem +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PIRP NTAPI IoBuildSynchronousFsdRequest( - IN ULONG MajorFunction, - IN PDEVICE_OBJECT DeviceObject, - IN OUT PVOID Buffer OPTIONAL, - IN ULONG Length OPTIONAL, - IN PLARGE_INTEGER StartingOffset OPTIONAL, - IN PKEVENT Event, - OUT PIO_STATUS_BLOCK IoStatusBlock); + _In_ ULONG MajorFunction, + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_opt_ PVOID Buffer, + _In_opt_ ULONG Length, + _In_opt_ PLARGE_INTEGER StartingOffset, + _In_ PKEVENT Event, + _Out_ PIO_STATUS_BLOCK IoStatusBlock); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Success_(TRUE) NTKERNELAPI NTSTATUS FASTCALL IofCallDriver( - IN PDEVICE_OBJECT DeviceObject, - IN OUT PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ __drv_aliasesMem PIRP Irp); #define IoCallDriver IofCallDriver +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL IofCompleteRequest( - IN PIRP Irp, - IN CCHAR PriorityBoost); + _In_ PIRP Irp, + _In_ CCHAR PriorityBoost); #define IoCompleteRequest IofCompleteRequest +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI IoCancelIrp( - IN PIRP Irp); + _In_ PIRP Irp); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoCheckShareAccess( - IN ACCESS_MASK DesiredAccess, - IN ULONG DesiredShareAccess, - IN OUT PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess, - IN BOOLEAN Update); + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG DesiredShareAccess, + _Inout_ PFILE_OBJECT FileObject, + _Inout_ PSHARE_ACCESS ShareAccess, + _In_ BOOLEAN Update); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL IofCompleteRequest( - IN PIRP Irp, - IN CCHAR PriorityBoost); + _In_ PIRP Irp, + _In_ CCHAR PriorityBoost); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoConnectInterrupt( - OUT PKINTERRUPT *InterruptObject, - IN PKSERVICE_ROUTINE ServiceRoutine, - IN PVOID ServiceContext OPTIONAL, - IN PKSPIN_LOCK SpinLock OPTIONAL, - IN ULONG Vector, - IN KIRQL Irql, - IN KIRQL SynchronizeIrql, - IN KINTERRUPT_MODE InterruptMode, - IN BOOLEAN ShareVector, - IN KAFFINITY ProcessorEnableMask, - IN BOOLEAN FloatingSave); + _Out_ PKINTERRUPT *InterruptObject, + _In_ PKSERVICE_ROUTINE ServiceRoutine, + _In_opt_ PVOID ServiceContext, + _In_opt_ PKSPIN_LOCK SpinLock, + _In_ ULONG Vector, + _In_ KIRQL Irql, + _In_ KIRQL SynchronizeIrql, + _In_ KINTERRUPT_MODE InterruptMode, + _In_ BOOLEAN ShareVector, + _In_ KAFFINITY ProcessorEnableMask, + _In_ BOOLEAN FloatingSave); +_IRQL_requires_max_(APC_LEVEL) +_Ret_range_(<=, 0) NTKERNELAPI NTSTATUS NTAPI IoCreateDevice( - IN PDRIVER_OBJECT DriverObject, - IN ULONG DeviceExtensionSize, - IN PUNICODE_STRING DeviceName OPTIONAL, - IN DEVICE_TYPE DeviceType, - IN ULONG DeviceCharacteristics, - IN BOOLEAN Exclusive, - OUT PDEVICE_OBJECT *DeviceObject); + _In_ PDRIVER_OBJECT DriverObject, + _In_ ULONG DeviceExtensionSize, + _In_opt_ PUNICODE_STRING DeviceName, + _In_ DEVICE_TYPE DeviceType, + _In_ ULONG DeviceCharacteristics, + _In_ BOOLEAN Exclusive, + _Outptr_result_nullonfailure_ + _At_(*DeviceObject, + __drv_allocatesMem(Mem) + _When_((((_In_function_class_(DRIVER_INITIALIZE)) + ||(_In_function_class_(DRIVER_DISPATCH)))), + __drv_aliasesMem)) + PDEVICE_OBJECT *DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoCreateFile( - 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); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG Disposition, + _In_ ULONG CreateOptions, + _In_opt_ PVOID EaBuffer, + _In_ ULONG EaLength, + _In_ CREATE_FILE_TYPE CreateFileType, + _In_opt_ PVOID InternalParameters, + _In_ ULONG Options); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PKEVENT NTAPI IoCreateNotificationEvent( - IN PUNICODE_STRING EventName, - OUT PHANDLE EventHandle); + _In_ PUNICODE_STRING EventName, + _Out_ PHANDLE EventHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoCreateSymbolicLink( - IN PUNICODE_STRING SymbolicLinkName, - IN PUNICODE_STRING DeviceName); + _In_ PUNICODE_STRING SymbolicLinkName, + _In_ PUNICODE_STRING DeviceName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PKEVENT NTAPI IoCreateSynchronizationEvent( - IN PUNICODE_STRING EventName, - OUT PHANDLE EventHandle); + _In_ PUNICODE_STRING EventName, + _Out_ PHANDLE EventHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoCreateUnprotectedSymbolicLink( - IN PUNICODE_STRING SymbolicLinkName, - IN PUNICODE_STRING DeviceName); + _In_ PUNICODE_STRING SymbolicLinkName, + _In_ PUNICODE_STRING DeviceName); +_IRQL_requires_max_(APC_LEVEL) +_Kernel_clear_do_init_(__yes) NTKERNELAPI VOID NTAPI IoDeleteDevice( - IN PDEVICE_OBJECT DeviceObject); + _In_ _Kernel_requires_resource_held_(Memory) __drv_freesMem(Mem) + PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoDeleteSymbolicLink( - IN PUNICODE_STRING SymbolicLinkName); + _In_ PUNICODE_STRING SymbolicLinkName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoDetachDevice( - IN OUT PDEVICE_OBJECT TargetDevice); + _Inout_ PDEVICE_OBJECT TargetDevice); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoDisconnectInterrupt( - IN PKINTERRUPT InterruptObject); + _In_ PKINTERRUPT InterruptObject); +__drv_freesMem(Mem) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoFreeIrp( - IN PIRP Irp); + _In_ PIRP Irp); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoFreeMdl( - IN PMDL Mdl); + PMDL Mdl); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoFreeWorkItem( - IN PIO_WORKITEM IoWorkItem); + _In_ __drv_freesMem(Mem) PIO_WORKITEM IoWorkItem); NTKERNELAPI PDEVICE_OBJECT @@ -12019,75 +12713,96 @@ NTAPI IoGetAttachedDevice( IN PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI NTSTATUS NTAPI IoGetBootDiskInformation( - IN OUT PBOOTDISK_INFORMATION BootDiskInformation, - IN ULONG Size); + _Inout_ PBOOTDISK_INFORMATION BootDiskInformation, + _In_ ULONG Size); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoGetDeviceInterfaceAlias( - IN PUNICODE_STRING SymbolicLinkName, - IN CONST GUID *AliasInterfaceClassGuid, - OUT PUNICODE_STRING AliasSymbolicLinkName); + _In_ PUNICODE_STRING SymbolicLinkName, + _In_ CONST GUID *AliasInterfaceClassGuid, + _Out_ + _When_(return==0, _At_(AliasSymbolicLinkName->Buffer, __drv_allocatesMem(Mem))) + PUNICODE_STRING AliasSymbolicLinkName); NTKERNELAPI PEPROCESS NTAPI IoGetCurrentProcess(VOID); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoGetDeviceInterfaces( - IN CONST GUID *InterfaceClassGuid, - IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, - IN ULONG Flags, - OUT PWSTR *SymbolicLinkList); + _In_ CONST GUID *InterfaceClassGuid, + _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ ULONG Flags, + _Outptr_result_nullonfailure_ + _At_(*SymbolicLinkList, _When_(return==0, __drv_allocatesMem(Mem))) + PZZWSTR *SymbolicLinkList); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoGetDeviceObjectPointer( - IN PUNICODE_STRING ObjectName, - IN ACCESS_MASK DesiredAccess, - OUT PFILE_OBJECT *FileObject, - OUT PDEVICE_OBJECT *DeviceObject); + _In_ PUNICODE_STRING ObjectName, + _In_ ACCESS_MASK DesiredAccess, + _Out_ PFILE_OBJECT *FileObject, + _Out_ PDEVICE_OBJECT *DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_((DeviceProperty & __string_type), + _At_(PropertyBuffer, _Post_z_)) +_When_((DeviceProperty & __multiString_type), + _At_(PropertyBuffer, _Post_ _NullNull_terminated_)) NTKERNELAPI NTSTATUS NTAPI IoGetDeviceProperty( - IN PDEVICE_OBJECT DeviceObject, - IN DEVICE_REGISTRY_PROPERTY DeviceProperty, - IN ULONG BufferLength, - OUT PVOID PropertyBuffer, - OUT PULONG ResultLength); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ DEVICE_REGISTRY_PROPERTY DeviceProperty, + _In_ ULONG BufferLength, + _Out_writes_bytes_opt_(BufferLength) PVOID PropertyBuffer, + _Deref_out_range_(<=, BufferLength) PULONG ResultLength); +_Must_inspect_result_ +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI PDMA_ADAPTER NTAPI IoGetDmaAdapter( - IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, - IN PDEVICE_DESCRIPTION DeviceDescription, - IN OUT PULONG NumberOfMapRegisters); + _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ PDEVICE_DESCRIPTION DeviceDescription, + _Out_ _When_(return!=0, _Kernel_IoGetDmaAdapter_ _At_(*NumberOfMapRegisters, _Must_inspect_result_)) + PULONG NumberOfMapRegisters); +__drv_aliasesMem +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI PVOID NTAPI IoGetDriverObjectExtension( - IN PDRIVER_OBJECT DriverObject, - IN PVOID ClientIdentificationAddress); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PVOID ClientIdentificationAddress); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI @@ -12097,298 +12812,350 @@ NTKERNELAPI PDEVICE_OBJECT NTAPI IoGetRelatedDeviceObject( - IN PFILE_OBJECT FileObject); + _In_ PFILE_OBJECT FileObject); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoQueueWorkItem( - IN PIO_WORKITEM IoWorkItem, - IN PIO_WORKITEM_ROUTINE WorkerRoutine, - IN WORK_QUEUE_TYPE QueueType, - IN PVOID Context OPTIONAL); + _Inout_ PIO_WORKITEM IoWorkItem, + _In_ PIO_WORKITEM_ROUTINE WorkerRoutine, + _In_ WORK_QUEUE_TYPE QueueType, + _In_opt_ __drv_aliasesMem PVOID Context); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoInitializeIrp( - IN OUT PIRP Irp, - IN USHORT PacketSize, - IN CCHAR StackSize); + _Inout_ PIRP Irp, + _In_ USHORT PacketSize, + _In_ CCHAR StackSize); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoInitializeRemoveLockEx( - IN PIO_REMOVE_LOCK Lock, - IN ULONG AllocateTag, - IN ULONG MaxLockedMinutes, - IN ULONG HighWatermark, - IN ULONG RemlockSize); + _Out_ PIO_REMOVE_LOCK Lock, + _In_ ULONG AllocateTag, + _In_ ULONG MaxLockedMinutes, + _In_ ULONG HighWatermark, + _In_ ULONG RemlockSize); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoInitializeTimer( - IN PDEVICE_OBJECT DeviceObject, - IN PIO_TIMER_ROUTINE TimerRoutine, - IN PVOID Context OPTIONAL); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIO_TIMER_ROUTINE TimerRoutine, + _In_opt_ __drv_aliasesMem PVOID Context); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoInvalidateDeviceRelations( - IN PDEVICE_OBJECT DeviceObject, - IN DEVICE_RELATION_TYPE Type); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ DEVICE_RELATION_TYPE Type); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoInvalidateDeviceState( - IN PDEVICE_OBJECT PhysicalDeviceObject); + _In_ PDEVICE_OBJECT PhysicalDeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI IoIsWdmVersionAvailable( - IN UCHAR MajorVersion, - IN UCHAR MinorVersion); + _When_(MajorVersion!=1&&MajorVersion!=6, _In_ __drv_reportError("MajorVersion must be 1 or 6")) + UCHAR MajorVersion, + _In_ _When_(MinorVersion!=0 && MinorVersion!=5 && + MinorVersion!=16 && MinorVersion!=32 && + MinorVersion!=48, __drv_reportError("MinorVersion must be 0, 0x5, 0x10, 0x20, or 0x30")) + UCHAR MinorVersion); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoOpenDeviceInterfaceRegistryKey( - IN PUNICODE_STRING SymbolicLinkName, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE DeviceInterfaceKey); + _In_ PUNICODE_STRING SymbolicLinkName, + _In_ ACCESS_MASK DesiredAccess, + _Out_ PHANDLE DeviceInterfaceKey); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoOpenDeviceRegistryKey( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG DevInstKeyType, - IN ACCESS_MASK DesiredAccess, - OUT PHANDLE DevInstRegKey); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG DevInstKeyType, + _In_ ACCESS_MASK DesiredAccess, + _Out_ PHANDLE DevInstRegKey); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoRegisterDeviceInterface( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN CONST GUID *InterfaceClassGuid, - IN PUNICODE_STRING ReferenceString OPTIONAL, - OUT PUNICODE_STRING SymbolicLinkName); + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ CONST GUID *InterfaceClassGuid, + _In_opt_ PUNICODE_STRING ReferenceString, + _Out_ _When_(return==0, _At_(SymbolicLinkName->Buffer, __drv_allocatesMem(Mem))) + PUNICODE_STRING SymbolicLinkName); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoRegisterPlugPlayNotification( - IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory, - IN ULONG EventCategoryFlags, - IN PVOID EventCategoryData OPTIONAL, - IN PDRIVER_OBJECT DriverObject, - IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, - IN OUT PVOID Context OPTIONAL, - OUT PVOID *NotificationEntry); + _In_ IO_NOTIFICATION_EVENT_CATEGORY EventCategory, + _In_ ULONG EventCategoryFlags, + _In_opt_ PVOID EventCategoryData, + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine, + _Inout_opt_ __drv_aliasesMem PVOID Context, + _Outptr_result_nullonfailure_ + _At_(*NotificationEntry, _When_(return==0, __drv_allocatesMem(Mem))) + PVOID *NotificationEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoRegisterShutdownNotification( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_Requires_lock_held_(_Global_cancel_spin_lock_) +_Releases_lock_(_Global_cancel_spin_lock_) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoReleaseCancelSpinLock( - IN KIRQL Irql); + _In_ _IRQL_restores_ _IRQL_uses_cancel_ KIRQL Irql); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoReleaseRemoveLockAndWaitEx( - IN PIO_REMOVE_LOCK RemoveLock, - IN PVOID Tag OPTIONAL, - IN ULONG RemlockSize); + _Inout_ PIO_REMOVE_LOCK RemoveLock, + _In_opt_ PVOID Tag, + _In_ ULONG RemlockSize); NTKERNELAPI VOID NTAPI IoReleaseRemoveLockEx( - IN PIO_REMOVE_LOCK RemoveLock, - IN PVOID Tag OPTIONAL, - IN ULONG RemlockSize); + _Inout_ PIO_REMOVE_LOCK RemoveLock, + _In_opt_ PVOID Tag, + _In_ ULONG RemlockSize); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoRemoveShareAccess( - IN PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess); + _In_ PFILE_OBJECT FileObject, + _Inout_ PSHARE_ACCESS ShareAccess); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoReportTargetDeviceChange( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PVOID NotificationStructure); + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ PVOID NotificationStructure); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoReportTargetDeviceChangeAsynchronous( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PVOID NotificationStructure, - IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL, - IN PVOID Context OPTIONAL); + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ PVOID NotificationStructure, + _In_opt_ PDEVICE_CHANGE_COMPLETE_CALLBACK Callback, + _In_opt_ PVOID Context); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoRequestDeviceEject( - IN PDEVICE_OBJECT PhysicalDeviceObject); + _In_ PDEVICE_OBJECT PhysicalDeviceObject); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoReuseIrp( - IN OUT PIRP Irp, - IN NTSTATUS Status); + _Inout_ PIRP Irp, + _In_ NTSTATUS Status); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoSetDeviceInterfaceState( - IN PUNICODE_STRING SymbolicLinkName, - IN BOOLEAN Enable); + _In_ PUNICODE_STRING SymbolicLinkName, + _In_ BOOLEAN Enable); NTKERNELAPI VOID NTAPI IoSetShareAccess( - IN ACCESS_MASK DesiredAccess, - IN ULONG DesiredShareAccess, - IN OUT PFILE_OBJECT FileObject, - OUT PSHARE_ACCESS ShareAccess); + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG DesiredShareAccess, + _Inout_ PFILE_OBJECT FileObject, + _Out_ PSHARE_ACCESS ShareAccess); +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_requires_min_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoStartNextPacket( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN Cancelable); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoStartNextPacketByKey( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN Cancelable, - IN ULONG Key); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN Cancelable, + _In_ ULONG Key); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoStartPacket( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PULONG Key OPTIONAL, - IN PDRIVER_CANCEL CancelFunction OPTIONAL); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_opt_ PULONG Key, + _In_opt_ PDRIVER_CANCEL CancelFunction); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoStartTimer( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoStopTimer( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) +__drv_freesMem(Pool) NTKERNELAPI NTSTATUS NTAPI IoUnregisterPlugPlayNotification( - IN PVOID NotificationEntry); + _In_ PVOID NotificationEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoUnregisterShutdownNotification( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI VOID NTAPI IoUpdateShareAccess( - IN PFILE_OBJECT FileObject, - IN OUT PSHARE_ACCESS ShareAccess); + _In_ PFILE_OBJECT FileObject, + _Inout_ PSHARE_ACCESS ShareAccess); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoWMIAllocateInstanceIds( - IN GUID *Guid, - IN ULONG InstanceCount, - OUT ULONG *FirstInstanceId); + _In_ GUID *Guid, + _In_ ULONG InstanceCount, + _Out_ ULONG *FirstInstanceId); NTKERNELAPI NTSTATUS NTAPI IoWMIQuerySingleInstanceMultiple( - IN PVOID *DataBlockObjectList, - IN PUNICODE_STRING InstanceNames, - IN ULONG ObjectCount, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); + _In_reads_(ObjectCount) PVOID *DataBlockObjectList, + _In_reads_(ObjectCount) PUNICODE_STRING InstanceNames, + _In_ ULONG ObjectCount, + _Inout_ ULONG *InOutBufferSize, + _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoWMIRegistrationControl( - IN PDEVICE_OBJECT DeviceObject, - IN ULONG Action); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ ULONG Action); NTKERNELAPI NTSTATUS NTAPI IoWMISuggestInstanceName( - IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, - IN PUNICODE_STRING SymbolicLinkName OPTIONAL, - IN BOOLEAN CombineNames, - OUT PUNICODE_STRING SuggestedInstanceName); + _In_opt_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_opt_ PUNICODE_STRING SymbolicLinkName, + _In_ BOOLEAN CombineNames, + _Out_ PUNICODE_STRING SuggestedInstanceName); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Ret_range_(<=, 0) NTKERNELAPI NTSTATUS NTAPI IoWMIWriteEvent( - IN OUT PVOID WnodeEventItem); + _Inout_ _When_(return==0, __drv_aliasesMem) PVOID WnodeEventItem); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI IoWriteErrorLogEntry( - IN PVOID ElEntry); + _In_ PVOID ElEntry); NTKERNELAPI PIRP NTAPI IoGetTopLevelIrp(VOID); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI IoRegisterLastChanceShutdownNotification( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); NTKERNELAPI VOID NTAPI IoSetTopLevelIrp( - IN PIRP Irp OPTIONAL); + _In_opt_ PIRP Irp); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -12400,42 +13167,42 @@ NTKERNELAPI NTSTATUS NTAPI IoCsqInitialize( - IN PIO_CSQ Csq, - IN PIO_CSQ_INSERT_IRP 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); + _Out_ PIO_CSQ Csq, + _In_ PIO_CSQ_INSERT_IRP 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 VOID NTAPI IoCsqInsertIrp( - IN PIO_CSQ Csq, - IN PIRP Irp, - IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL); + _Inout_ PIO_CSQ Csq, + _Inout_ PIRP Irp, + _Out_opt_ PIO_CSQ_IRP_CONTEXT Context); NTKERNELAPI PIRP NTAPI IoCsqRemoveIrp( - IN PIO_CSQ Csq, - IN PIO_CSQ_IRP_CONTEXT Context); + _Inout_ PIO_CSQ Csq, + _Inout_ PIO_CSQ_IRP_CONTEXT Context); NTKERNELAPI PIRP NTAPI IoCsqRemoveNextIrp( - IN PIO_CSQ Csq, - IN PVOID PeekContext OPTIONAL); + _Inout_ PIO_CSQ Csq, + _In_opt_ PVOID PeekContext); NTKERNELAPI BOOLEAN NTAPI IoForwardIrpSynchronously( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp); #define IoForwardAndCatchIrp IoForwardIrpSynchronously @@ -12443,116 +13210,118 @@ NTKERNELAPI VOID NTAPI IoFreeErrorLogEntry( - PVOID ElEntry); + _In_ PVOID ElEntry); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoSetCompletionRoutineEx( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PIO_COMPLETION_ROUTINE CompletionRoutine, - IN PVOID Context, - IN BOOLEAN InvokeOnSuccess, - IN BOOLEAN InvokeOnError, - IN BOOLEAN InvokeOnCancel); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ PIO_COMPLETION_ROUTINE CompletionRoutine, + _In_opt_ PVOID Context, + _In_ BOOLEAN InvokeOnSuccess, + _In_ BOOLEAN InvokeOnError, + _In_ BOOLEAN InvokeOnCancel); VOID NTAPI IoSetStartIoAttributes( - IN PDEVICE_OBJECT DeviceObject, - IN BOOLEAN DeferredStartIo, - IN BOOLEAN NonCancelable); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BOOLEAN DeferredStartIo, + _In_ BOOLEAN NonCancelable); NTKERNELAPI NTSTATUS NTAPI IoWMIDeviceObjectToInstanceName( - IN PVOID DataBlockObject, - IN PDEVICE_OBJECT DeviceObject, - OUT PUNICODE_STRING InstanceName); + _In_ PVOID DataBlockObject, + _In_ PDEVICE_OBJECT DeviceObject, + _Out_ PUNICODE_STRING InstanceName); NTKERNELAPI NTSTATUS NTAPI IoWMIExecuteMethod( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN ULONG MethodId, - IN ULONG InBufferSize, - IN OUT PULONG OutBufferSize, - IN OUT PUCHAR InOutBuffer); + _In_ PVOID DataBlockObject, + _In_ PUNICODE_STRING InstanceName, + _In_ ULONG MethodId, + _In_ ULONG InBufferSize, + _Inout_ PULONG OutBufferSize, + _Inout_updates_bytes_to_opt_(*OutBufferSize, InBufferSize) PUCHAR InOutBuffer); NTKERNELAPI NTSTATUS NTAPI IoWMIHandleToInstanceName( - IN PVOID DataBlockObject, - IN HANDLE FileHandle, - OUT PUNICODE_STRING InstanceName); + _In_ PVOID DataBlockObject, + _In_ HANDLE FileHandle, + _Out_ PUNICODE_STRING InstanceName); NTKERNELAPI NTSTATUS NTAPI IoWMIOpenBlock( - IN GUID *DataBlockGuid, - IN ULONG DesiredAccess, - OUT PVOID *DataBlockObject); + _In_ GUID *DataBlockGuid, + _In_ ULONG DesiredAccess, + _Out_ PVOID *DataBlockObject); NTKERNELAPI NTSTATUS NTAPI IoWMIQueryAllData( - IN PVOID DataBlockObject, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); + _In_ PVOID DataBlockObject, + _Inout_ ULONG *InOutBufferSize, + _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer); NTKERNELAPI NTSTATUS NTAPI IoWMIQueryAllDataMultiple( - IN PVOID *DataBlockObjectList, - IN ULONG ObjectCount, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); + _In_reads_(ObjectCount) PVOID *DataBlockObjectList, + _In_ ULONG ObjectCount, + _Inout_ ULONG *InOutBufferSize, + _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer); NTKERNELAPI NTSTATUS NTAPI IoWMIQuerySingleInstance( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN OUT ULONG *InOutBufferSize, - OUT PVOID OutBuffer); + _In_ PVOID DataBlockObject, + _In_ PUNICODE_STRING InstanceName, + _Inout_ ULONG *InOutBufferSize, + _Out_writes_bytes_opt_(*InOutBufferSize) PVOID OutBuffer); NTKERNELAPI NTSTATUS NTAPI IoWMISetNotificationCallback( - IN OUT PVOID Object, - IN WMI_NOTIFICATION_CALLBACK Callback, - IN PVOID Context OPTIONAL); + _Inout_ PVOID Object, + _In_ WMI_NOTIFICATION_CALLBACK Callback, + _In_opt_ PVOID Context); NTKERNELAPI NTSTATUS NTAPI IoWMISetSingleInstance( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN ULONG Version, - IN ULONG ValueBufferSize, - IN PVOID ValueBuffer); + _In_ PVOID DataBlockObject, + _In_ PUNICODE_STRING InstanceName, + _In_ ULONG Version, + _In_ ULONG ValueBufferSize, + _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer); NTKERNELAPI NTSTATUS NTAPI IoWMISetSingleItem( - IN PVOID DataBlockObject, - IN PUNICODE_STRING InstanceName, - IN ULONG DataItemId, - IN ULONG Version, - IN ULONG ValueBufferSize, - IN PVOID ValueBuffer); + _In_ PVOID DataBlockObject, + _In_ PUNICODE_STRING InstanceName, + _In_ ULONG DataItemId, + _In_ ULONG Version, + _In_ ULONG ValueBufferSize, + _In_reads_bytes_(ValueBufferSize) PVOID ValueBuffer); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -12561,8 +13330,8 @@ NTKERNELAPI NTSTATUS NTAPI IoValidateDeviceIoControlAccess( - IN PIRP Irp, - IN ULONG RequiredAccess); + _In_ PIRP Irp, + _In_ ULONG RequiredAccess); #endif #if (NTDDI_VERSION >= NTDDI_WS03) @@ -12570,22 +13339,22 @@ 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); + _Out_ 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); + _Inout_ PIO_CSQ Csq, + _Inout_ PIRP Irp, + _Out_opt_ PIO_CSQ_IRP_CONTEXT Context, + _In_opt_ PVOID InsertContext); #endif /* (NTDDI_VERSION >= NTDDI_WS03) */ @@ -12594,46 +13363,46 @@ NTKERNELAPI NTSTATUS NTAPI IoGetBootDiskInformationLite( - OUT PBOOTDISK_INFORMATION_LITE *BootDiskInformation); + _Outptr_ 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); + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG DesiredShareAccess, + _Inout_ PFILE_OBJECT FileObject, + _Inout_ PSHARE_ACCESS ShareAccess, + _In_ BOOLEAN Update, + _In_ PBOOLEAN WritePermission); NTKERNELAPI NTSTATUS NTAPI IoConnectInterruptEx( - IN OUT PIO_CONNECT_INTERRUPT_PARAMETERS Parameters); + _Inout_ PIO_CONNECT_INTERRUPT_PARAMETERS Parameters); NTKERNELAPI VOID NTAPI IoDisconnectInterruptEx( - IN PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters); + _In_ PIO_DISCONNECT_INTERRUPT_PARAMETERS Parameters); LOGICAL NTAPI IoWithinStackLimits( - IN ULONG_PTR RegionStart, - IN SIZE_T RegionSize); + _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); + _In_ ACCESS_MASK DesiredAccess, + _In_ ULONG DesiredShareAccess, + _Inout_ PFILE_OBJECT FileObject, + _Out_ PSHARE_ACCESS ShareAccess, + _In_ PBOOLEAN WritePermission); ULONG NTAPI @@ -12642,99 +13411,108 @@ IoSizeofWorkItem(VOID); VOID NTAPI IoInitializeWorkItem( - IN PVOID IoObject, - IN PIO_WORKITEM IoWorkItem); + _In_ PVOID IoObject, + _Out_ PIO_WORKITEM IoWorkItem); VOID NTAPI IoUninitializeWorkItem( - IN PIO_WORKITEM IoWorkItem); + _Inout_ PIO_WORKITEM IoWorkItem); +_IRQL_requires_max_(DISPATCH_LEVEL) VOID NTAPI IoQueueWorkItemEx( - IN PIO_WORKITEM IoWorkItem, - IN PIO_WORKITEM_ROUTINE_EX WorkerRoutine, - IN WORK_QUEUE_TYPE QueueType, - IN PVOID Context OPTIONAL); + _Inout_ PIO_WORKITEM IoWorkItem, + _In_ PIO_WORKITEM_ROUTINE_EX WorkerRoutine, + _In_ WORK_QUEUE_TYPE QueueType, + _In_opt_ __drv_aliasesMem PVOID Context); IO_PRIORITY_HINT NTAPI IoGetIoPriorityHint( - IN PIRP Irp); + _In_ PIRP Irp); NTSTATUS NTAPI IoSetIoPriorityHint( - IN PIRP Irp, - IN IO_PRIORITY_HINT PriorityHint); + _In_ PIRP Irp, + _In_ IO_PRIORITY_HINT PriorityHint); NTSTATUS NTAPI IoAllocateSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN ULONG Length, - IN PVOID Signature, - OUT PVOID *StreamIdentifier); + _In_ PFILE_OBJECT FileObject, + _In_ ULONG Length, + _In_ PVOID Signature, + _Out_ PVOID *StreamIdentifier); PVOID NTAPI IoGetSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN PVOID Signature); + _In_ PFILE_OBJECT FileObject, + _In_ PVOID Signature); NTSTATUS NTAPI IoFreeSfioStreamIdentifier( - IN PFILE_OBJECT FileObject, - IN PVOID Signature); + _In_ PFILE_OBJECT FileObject, + _In_ PVOID Signature); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoRequestDeviceEjectEx( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN PIO_DEVICE_EJECT_CALLBACK Callback OPTIONAL, - IN PVOID Context OPTIONAL, - IN PDRIVER_OBJECT DriverObject OPTIONAL); + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_opt_ PIO_DEVICE_EJECT_CALLBACK Callback, + _In_opt_ PVOID Context, + _In_opt_ PDRIVER_OBJECT DriverObject); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ 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); + _In_ PDEVICE_OBJECT Pdo, + _In_ CONST DEVPROPKEY *PropertyKey, + _In_ LCID Lcid, + _In_ ULONG Flags, + _In_ DEVPROPTYPE Type, + _In_ ULONG Size, + _In_opt_ PVOID Data); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoGetDevicePropertyData( - PDEVICE_OBJECT Pdo, - CONST DEVPROPKEY *PropertyKey, - LCID Lcid, - ULONG Flags, - ULONG Size, - PVOID Data, - PULONG RequiredSize, - PDEVPROPTYPE Type); + _In_ PDEVICE_OBJECT Pdo, + _In_ CONST DEVPROPKEY *PropertyKey, + _In_ LCID Lcid, + _Reserved_ ULONG Flags, + _In_ ULONG Size, + _Out_ PVOID Data, + _Out_ PULONG RequiredSize, + _Out_ PDEVPROPTYPE Type); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #define IoCallDriverStackSafeDefault(a, b) IoCallDriver(a, b) #if (NTDDI_VERSION >= NTDDI_WS08) +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoReplacePartitionUnit( - IN PDEVICE_OBJECT TargetPdo, - IN PDEVICE_OBJECT SparePdo, - IN ULONG Flags); + _In_ PDEVICE_OBJECT TargetPdo, + _In_ PDEVICE_OBJECT SparePdo, + _In_ ULONG Flags); #endif #if (NTDDI_VERSION >= NTDDI_WIN7) @@ -12743,43 +13521,47 @@ NTKERNELAPI NTSTATUS NTAPI IoGetAffinityInterrupt( - IN PKINTERRUPT InterruptObject, - OUT PGROUP_AFFINITY GroupAffinity); + _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); + _In_ IO_CONTAINER_INFORMATION_CLASS InformationClass, + _In_opt_ PVOID ContainerObject, + _Inout_updates_bytes_opt_(BufferLength) PVOID Buffer, + _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); + _In_ IO_CONTAINER_NOTIFICATION_CLASS NotificationClass, + _In_ PIO_CONTAINER_NOTIFICATION_FUNCTION CallbackFunction, + _In_reads_bytes_opt_(NotificationInformationLength) PVOID NotificationInformation, + _In_ ULONG NotificationInformationLength, + _Out_ PVOID CallbackRegistration); VOID NTAPI IoUnregisterContainerNotification( - IN PVOID CallbackRegistration); + _In_ PVOID CallbackRegistration); +_IRQL_requires_max_(PASSIVE_LEVEL) +__drv_freesMem(Pool) NTKERNELAPI NTSTATUS NTAPI IoUnregisterPlugPlayNotificationEx( - IN PVOID NotificationEntry); + _In_ PVOID NotificationEntry); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI IoGetDeviceNumaNode( - IN PDEVICE_OBJECT Pdo, - OUT PUSHORT NodeNumber); + _In_ PDEVICE_OBJECT Pdo, + _Out_ PUSHORT NodeNumber); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -12788,7 +13570,7 @@ NTKERNELAPI ULONG NTAPI IoWMIDeviceObjectToProviderId( - IN PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); #else #define IoWMIDeviceObjectToProviderId(DeviceObject) ((ULONG)(DeviceObject)) #endif @@ -12804,7 +13586,7 @@ IoWMIDeviceObjectToProviderId( FORCEINLINE VOID IoSkipCurrentIrpStackLocation( - IN OUT PIRP Irp) + _Inout_ PIRP Irp) { ASSERT(Irp->CurrentLocation <= Irp->StackCount); Irp->CurrentLocation++; @@ -12818,7 +13600,7 @@ IoSkipCurrentIrpStackLocation( FORCEINLINE VOID IoSetNextIrpStackLocation( - IN OUT PIRP Irp) + _Inout_ PIRP Irp) { ASSERT(Irp->CurrentLocation > 0); Irp->CurrentLocation--; @@ -12829,10 +13611,11 @@ IoSetNextIrpStackLocation( #endif } +__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation( - IN PIRP Irp) + _In_ PIRP Irp) { ASSERT(Irp->CurrentLocation > 0); #ifdef NONAMELESSUNION @@ -12842,15 +13625,16 @@ IoGetNextIrpStackLocation( #endif } +_IRQL_requires_max_(DISPATCH_LEVEL) FORCEINLINE VOID IoSetCompletionRoutine( - IN PIRP Irp, - IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL, - IN PVOID Context OPTIONAL, - IN BOOLEAN InvokeOnSuccess, - IN BOOLEAN InvokeOnError, - IN BOOLEAN InvokeOnCancel) + _In_ PIRP Irp, + _In_opt_ PIO_COMPLETION_ROUTINE CompletionRoutine, + _In_opt_ __drv_aliasesMem PVOID Context, + _In_ BOOLEAN InvokeOnSuccess, + _In_ BOOLEAN InvokeOnError, + _In_ BOOLEAN InvokeOnCancel) { PIO_STACK_LOCATION irpSp; ASSERT( (InvokeOnSuccess || InvokeOnError || InvokeOnCancel) ? (CompletionRoutine != NULL) : TRUE ); @@ -12872,26 +13656,26 @@ IoSetCompletionRoutine( } } -/* - * PDRIVER_CANCEL - * IoSetCancelRoutine( - * IN PIRP Irp, - * IN PDRIVER_CANCEL CancelRoutine) - */ -#define IoSetCancelRoutine(_Irp, \ - _CancelRoutine) \ - ((PDRIVER_CANCEL) (ULONG_PTR) InterlockedExchangePointer( \ - (PVOID *) &(_Irp)->CancelRoutine, (PVOID) (ULONG_PTR) (_CancelRoutine))) +_IRQL_requires_max_(DISPATCH_LEVEL) +_Ret_maybenull_ +FORCEINLINE +PDRIVER_CANCEL +IoSetCancelRoutine( + _Inout_ PIRP Irp, + _In_opt_ PDRIVER_CANCEL CancelRoutine) +{ + return (PDRIVER_CANCEL)(ULONG_PTR) InterlockedExchangePointer((PVOID *)&(Irp)->CancelRoutine, (PVOID)(ULONG_PTR)(CancelRoutine)); +} -/* - * VOID - * IoRequestDpc( - * IN PDEVICE_OBJECT DeviceObject, - * IN PIRP Irp, - * IN PVOID Context); - */ -#define IoRequestDpc(DeviceObject, Irp, Context)( \ - KeInsertQueueDpc(&(DeviceObject)->Dpc, (Irp), (Context))) +FORCEINLINE +VOID +IoRequestDpc( + _Inout_ PDEVICE_OBJECT DeviceObject, + _In_opt_ PIRP Irp, + _In_opt_ __drv_aliasesMem PVOID Context) +{ + KeInsertQueueDpc(&DeviceObject->Dpc, Irp, Context); +} /* * VOID @@ -12914,20 +13698,22 @@ IoSetCompletionRoutine( IoReleaseRemoveLockAndWaitEx(_RemoveLock, _Tag, sizeof(IO_REMOVE_LOCK)) #if defined(_WIN64) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN IoIs32bitProcess( - IN PIRP Irp OPTIONAL); + _In_opt_ PIRP Irp); #endif #define PLUGPLAY_REGKEY_DEVICE 1 #define PLUGPLAY_REGKEY_DRIVER 2 #define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4 +__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation( - IN PIRP Irp) + _In_ PIRP Irp) { ASSERT(Irp->CurrentLocation <= Irp->StackCount + 1); #ifdef NONAMELESSUNION @@ -12940,9 +13726,9 @@ IoGetCurrentIrpStackLocation( FORCEINLINE VOID IoMarkIrpPending( - IN OUT PIRP Irp) + _Inout_ PIRP Irp) { - IoGetCurrentIrpStackLocation( (Irp) )->Control |= SL_PENDING_RETURNED; + IoGetCurrentIrpStackLocation((Irp))->Control |= SL_PENDING_RETURNED; } /* @@ -12974,12 +13760,12 @@ IoMarkIrpPending( FORCEINLINE VOID IoInitializeDpcRequest( - IN PDEVICE_OBJECT DeviceObject, - IN PIO_DPC_ROUTINE DpcRoutine) + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIO_DPC_ROUTINE DpcRoutine) { - KeInitializeDpc( &DeviceObject->Dpc, - (PKDEFERRED_ROUTINE) DpcRoutine, - DeviceObject ); + KeInitializeDpc(&DeviceObject->Dpc, + (PKDEFERRED_ROUTINE) DpcRoutine, + DeviceObject); } #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001 @@ -12995,49 +13781,51 @@ IoInitializeDpcRequest( FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext( - IN OUT PIRP Irp) + _Inout_ PIRP Irp) { - PIO_STACK_LOCATION irpSp; - PIO_STACK_LOCATION nextIrpSp; - irpSp = IoGetCurrentIrpStackLocation(Irp); - nextIrpSp = IoGetNextIrpStackLocation(Irp); - RtlCopyMemory( nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); - nextIrpSp->Control = 0; + PIO_STACK_LOCATION irpSp; + PIO_STACK_LOCATION nextIrpSp; + irpSp = IoGetCurrentIrpStackLocation(Irp); + nextIrpSp = IoGetNextIrpStackLocation(Irp); + RtlCopyMemory(nextIrpSp, irpSp, FIELD_OFFSET(IO_STACK_LOCATION, CompletionRoutine)); + nextIrpSp->Control = 0; } +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI IoGetStackLimits( - OUT PULONG_PTR LowLimit, - OUT PULONG_PTR HighLimit); + _Out_ PULONG_PTR LowLimit, + _Out_ PULONG_PTR HighLimit); +_IRQL_requires_max_(APC_LEVEL) FORCEINLINE ULONG_PTR IoGetRemainingStackSize(VOID) { - ULONG_PTR End, Begin; - ULONG_PTR Result; + ULONG_PTR End, Begin; + ULONG_PTR Result; - IoGetStackLimits(&Begin, &End); - Result = (ULONG_PTR)(&End) - Begin; - return Result; + IoGetStackLimits(&Begin, &End); + Result = (ULONG_PTR)(&End) - Begin; + return Result; } #if (NTDDI_VERSION >= NTDDI_WS03) FORCEINLINE VOID IoInitializeThreadedDpcRequest( - IN PDEVICE_OBJECT DeviceObject, - IN PIO_DPC_ROUTINE DpcRoutine) + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIO_DPC_ROUTINE DpcRoutine) { #ifdef _MSC_VER #pragma warning(push) #pragma warning(disable:28128) #endif - KeInitializeThreadedDpc(&DeviceObject->Dpc, - (PKDEFERRED_ROUTINE) DpcRoutine, - DeviceObject ); + KeInitializeThreadedDpc(&DeviceObject->Dpc, + (PKDEFERRED_ROUTINE) DpcRoutine, + DeviceObject ); #ifdef _MSC_VER #pragma warning(pop) #endif @@ -13052,65 +13840,73 @@ IoInitializeThreadedDpcRequest( #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoCallDriver( - IN struct _DEVICE_OBJECT *DeviceObject, - IN OUT struct _IRP *Irp); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _Inout_ __drv_aliasesMem struct _IRP *Irp); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PULONG NTAPI PoRegisterDeviceForIdleDetection( - IN struct _DEVICE_OBJECT *DeviceObject, - IN ULONG ConservationIdleTime, - IN ULONG PerformanceIdleTime, - IN DEVICE_POWER_STATE State); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ ULONG ConservationIdleTime, + _In_ ULONG PerformanceIdleTime, + _In_ DEVICE_POWER_STATE State); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI PoRegisterSystemState( - IN OUT PVOID StateHandle OPTIONAL, - IN EXECUTION_STATE Flags); + _Inout_opt_ PVOID StateHandle, + _In_ EXECUTION_STATE Flags); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoRequestPowerIrp( - IN struct _DEVICE_OBJECT *DeviceObject, - IN UCHAR MinorFunction, - IN POWER_STATE PowerState, - IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL, - IN PVOID Context OPTIONAL, - OUT struct _IRP **Irp OPTIONAL); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ UCHAR MinorFunction, + _In_ POWER_STATE PowerState, + _In_opt_ PREQUEST_POWER_COMPLETE CompletionFunction, + _In_opt_ __drv_aliasesMem PVOID Context, + _Outptr_opt_ struct _IRP **Irp); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI POWER_STATE NTAPI PoSetPowerState( - IN struct _DEVICE_OBJECT *DeviceObject, - IN POWER_STATE_TYPE Type, - IN POWER_STATE State); + _In_ struct _DEVICE_OBJECT *DeviceObject, + _In_ POWER_STATE_TYPE Type, + _In_ POWER_STATE State); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI PoSetSystemState( - IN EXECUTION_STATE Flags); + _In_ EXECUTION_STATE Flags); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI PoStartNextPowerIrp( - IN OUT struct _IRP *Irp); + _Inout_ struct _IRP *Irp); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI PoUnregisterSystemState( - IN OUT PVOID StateHandle); + _Inout_ PVOID StateHandle); NTKERNELAPI NTSTATUS @@ -13122,33 +13918,37 @@ PoRequestShutdownEvent( #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI PoSetSystemWake( - IN OUT struct _IRP *Irp); + _Inout_ struct _IRP *Irp); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI PoGetSystemWake( - IN struct _IRP *Irp); + _In_ struct _IRP *Irp); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoRegisterPowerSettingCallback( - IN PDEVICE_OBJECT DeviceObject OPTIONAL, - IN LPCGUID SettingGuid, - IN PPOWER_SETTING_CALLBACK Callback, - IN PVOID Context OPTIONAL, - OUT PVOID *Handle OPTIONAL); + _In_opt_ PDEVICE_OBJECT DeviceObject, + _In_ LPCGUID SettingGuid, + _In_ PPOWER_SETTING_CALLBACK Callback, + _In_opt_ PVOID Context, + _Outptr_opt_ PVOID *Handle); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoUnregisterPowerSettingCallback( - IN OUT PVOID Handle); + _Inout_ PVOID Handle); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -13157,7 +13957,7 @@ NTKERNELAPI VOID NTAPI PoSetDeviceBusyEx( - IN OUT PULONG IdlePointer); + _Inout_ PULONG IdlePointer); #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */ #if (NTDDI_VERSION >= NTDDI_WIN7) @@ -13166,48 +13966,53 @@ NTKERNELAPI VOID NTAPI PoStartDeviceBusy( - IN OUT PULONG IdlePointer); + _Inout_ PULONG IdlePointer); NTKERNELAPI VOID NTAPI PoEndDeviceBusy( - IN OUT PULONG IdlePointer); + _Inout_ PULONG IdlePointer); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI PoQueryWatchdogTime( - IN PDEVICE_OBJECT Pdo, - OUT PULONG SecondsRemaining); + _In_ PDEVICE_OBJECT Pdo, + _Out_ PULONG SecondsRemaining); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI PoDeletePowerRequest( - IN OUT PVOID PowerRequest); + _Inout_ PVOID PowerRequest); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoSetPowerRequest( - IN OUT PVOID PowerRequest, - IN POWER_REQUEST_TYPE Type); + _Inout_ PVOID PowerRequest, + _In_ POWER_REQUEST_TYPE Type); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoClearPowerRequest( - IN OUT PVOID PowerRequest, - IN POWER_REQUEST_TYPE Type); + _Inout_ PVOID PowerRequest, + _In_ POWER_REQUEST_TYPE Type); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI PoCreatePowerRequest( - OUT PVOID *PowerRequest, - IN PDEVICE_OBJECT DeviceObject, - IN PCOUNTED_REASON_CONTEXT Context); + _Outptr_ PVOID *PowerRequest, + _In_ PDEVICE_OBJECT DeviceObject, + _In_opt_ PCOUNTED_REASON_CONTEXT Context); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ @@ -13254,23 +14059,34 @@ ExiTryToAcquireFastMutex( #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_raises_(APC_LEVEL) +_IRQL_saves_global_(OldIrql, FastMutex) NTKERNELAPI VOID FASTCALL ExAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) + PFAST_MUTEX FastMutex); +_IRQL_requires_(APC_LEVEL) +_IRQL_restores_global_(OldIrql, FastMutex) NTKERNELAPI VOID FASTCALL ExReleaseFastMutex( - IN OUT PFAST_MUTEX FastMutex); + _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) + PFAST_MUTEX FastMutex); +_Must_inspect_result_ +_Success_(return!=FALSE) +_IRQL_raises_(APC_LEVEL) +_IRQL_saves_global_(OldIrql, FastMutex) NTKERNELAPI BOOLEAN FASTCALL ExTryToAcquireFastMutex( - IN OUT PFAST_MUTEX FastMutex); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) + PFAST_MUTEX FastMutex); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -13291,11 +14107,11 @@ ExTryToAcquireFastMutex( defined(_NTHAL_) || defined(_NTOSP_) NTKERNELAPI USHORT -ExQueryDepthSList(IN PSLIST_HEADER ListHead); +ExQueryDepthSList(_In_ PSLIST_HEADER ListHead); #else FORCEINLINE USHORT -ExQueryDepthSList(IN PSLIST_HEADER ListHead) +ExQueryDepthSList(_In_ PSLIST_HEADER ListHead) { return (USHORT)(ListHead->Alignment & 0xffff); } @@ -13309,13 +14125,13 @@ ExpInterlockedFlushSList( NTKERNELAPI PSLIST_ENTRY ExpInterlockedPopEntrySList( - PSLIST_HEADER ListHead); + _Inout_ PSLIST_HEADER ListHead); NTKERNELAPI PSLIST_ENTRY ExpInterlockedPushEntrySList( - PSLIST_HEADER ListHead, - PSLIST_ENTRY ListEntry); + _Inout_ PSLIST_HEADER ListHead, + _Inout_ __drv_aliasesMem PSLIST_ENTRY ListEntry); #define ExInterlockedFlushSList(Head) \ ExpInterlockedFlushSList(Head) @@ -13336,7 +14152,7 @@ NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedFlushSList( - IN OUT PSLIST_HEADER ListHead); + _Inout_ PSLIST_HEADER ListHead); #endif /* !defined(_WIN64) */ @@ -13346,29 +14162,31 @@ NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedPopEntrySList( - IN PSLIST_HEADER ListHead, - IN PKSPIN_LOCK Lock); + _Inout_ PSLIST_HEADER ListHead, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedPushEntrySList( - IN PSLIST_HEADER ListHead, - IN PSINGLE_LIST_ENTRY ListEntry, - IN PKSPIN_LOCK Lock); + _Inout_ PSLIST_HEADER ListHead, + _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI ExAllocateFromPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside); + _Inout_ PPAGED_LOOKASIDE_LIST Lookaside); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExFreeToPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry); + _Inout_ PPAGED_LOOKASIDE_LIST Lookaside, + _In_ PVOID Entry); #else /* !_WIN2K_COMPAT_SLIST_USAGE */ @@ -13379,10 +14197,11 @@ ExFreeToPagedLookasideList( InterlockedPushEntrySList(_ListHead, _ListEntry) #endif +_IRQL_requires_max_(APC_LEVEL) static __inline PVOID ExAllocateFromPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside) + _Inout_ PPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; @@ -13407,11 +14226,12 @@ ExAllocateFromPagedLookasideList( return Entry; } +_IRQL_requires_max_(APC_LEVEL) static __inline VOID ExFreeToPagedLookasideList( - IN OUT PPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry) + _Inout_ PPAGED_LOOKASIDE_LIST Lookaside, + _In_ PVOID Entry) { Lookaside->L.TotalFrees++; #ifdef NONAMELESSUNION @@ -13458,7 +14278,7 @@ ExFreeToPagedLookasideList( FORCEINLINE VOID ExInitializeFastMutex( - OUT PFAST_MUTEX FastMutex) + _Out_ PFAST_MUTEX FastMutex) { FastMutex->Count = FM_LOCK_BIT; FastMutex->Owner = NULL; @@ -13469,193 +14289,294 @@ ExInitializeFastMutex( #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(APC_LEVEL) +_Requires_lock_held_(_Global_critical_region_) NTKERNELAPI VOID FASTCALL ExAcquireFastMutexUnsafe( - IN OUT PFAST_MUTEX FastMutex); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) + PFAST_MUTEX FastMutex); +_IRQL_requires_max_(APC_LEVEL) +_Requires_lock_held_(_Global_critical_region_) NTKERNELAPI VOID FASTCALL ExReleaseFastMutexUnsafe( - IN OUT PFAST_MUTEX FastMutex); + _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) + PFAST_MUTEX FastMutex); +_Requires_lock_held_(_Global_critical_region_) +_Requires_lock_not_held_(*Resource) +_When_(Wait!=0, _Acquires_exclusive_lock_(*Resource)) +_IRQL_requires_max_(APC_LEVEL) +_When_(Wait!=0, _Post_satisfies_(return == 1)) +_When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) NTKERNELAPI BOOLEAN NTAPI ExAcquireResourceExclusiveLite( - IN OUT PERESOURCE Resource, - IN BOOLEAN Wait); + _Inout_ PERESOURCE Resource, + _In_ _Literal_ BOOLEAN Wait); +_IRQL_requires_max_(APC_LEVEL) +_Requires_lock_held_(_Global_critical_region_) +_When_(Wait!=0, _Post_satisfies_(return == 1)) +_When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) NTKERNELAPI BOOLEAN NTAPI ExAcquireResourceSharedLite( - IN OUT PERESOURCE Resource, - IN BOOLEAN Wait); + _Inout_ _Requires_lock_not_held_(*_Curr_) + _When_(return!=0, _Acquires_shared_lock_(*_Curr_)) + PERESOURCE Resource, + _In_ BOOLEAN Wait); +_IRQL_requires_max_(APC_LEVEL) +_Requires_lock_held_(_Global_critical_region_) +_When_(Wait!=0, _Post_satisfies_(return == 1)) +_When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) NTKERNELAPI BOOLEAN NTAPI ExAcquireSharedStarveExclusive( - IN OUT PERESOURCE Resource, - IN BOOLEAN Wait); + _Inout_ _Requires_lock_not_held_(*_Curr_) + _When_(return!=0, _Acquires_shared_lock_(*_Curr_)) + PERESOURCE Resource, + _In_ BOOLEAN Wait); +_IRQL_requires_max_(APC_LEVEL) +_Requires_lock_held_(_Global_critical_region_) +_When_(Wait!=0, _Post_satisfies_(return == 1)) +_When_(Wait==0, _Post_satisfies_(return == 0 || return == 1) _Must_inspect_result_) NTKERNELAPI BOOLEAN NTAPI ExAcquireSharedWaitForExclusive( - IN OUT PERESOURCE Resource, - IN BOOLEAN Wait); + _Inout_ _Requires_lock_not_held_(*_Curr_) + _When_(return!=0, _Acquires_lock_(*_Curr_)) + PERESOURCE Resource, + _In_ BOOLEAN Wait); +__drv_preferredFunction("ExAllocatePoolWithTag", + "No tag interferes with debugging.") +__drv_allocatesMem(Mem) +_When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_((PoolType & NonPagedPoolMustSucceed) != 0, + __drv_reportError("Must succeed pool allocations are forbidden. " + "Allocation failures cause a system crash")) +_When_((PoolType & (NonPagedPoolMustSucceed | + POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0, + _Post_maybenull_ _Must_inspect_result_) +_When_((PoolType & (NonPagedPoolMustSucceed | + POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0, + _Post_notnull_) +_Post_writable_byte_size_(NumberOfBytes) NTKERNELAPI PVOID NTAPI ExAllocatePool( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes); + __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes); +__drv_preferredFunction("ExAllocatePoolWithQuotaTag", + "No tag interferes with debugging.") +__drv_allocatesMem(Mem) +_When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_((PoolType & NonPagedPoolMustSucceed) != 0, + __drv_reportError("Must succeed pool allocations are forbidden. " + "Allocation failures cause a system crash")) +_When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0, + _Post_maybenull_ _Must_inspect_result_) +_When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_) +_Post_writable_byte_size_(NumberOfBytes) NTKERNELAPI PVOID NTAPI ExAllocatePoolWithQuota( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes); + __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes); +__drv_allocatesMem(Mem) +_When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_((PoolType & NonPagedPoolMustSucceed) != 0, + __drv_reportError("Must succeed pool allocations are forbidden. " + "Allocation failures cause a system crash")) +_When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) != 0, + _Post_maybenull_ _Must_inspect_result_) +_When_((PoolType & POOL_QUOTA_FAIL_INSTEAD_OF_RAISE) == 0, _Post_notnull_) +_Post_writable_byte_size_(NumberOfBytes) NTKERNELAPI PVOID NTAPI ExAllocatePoolWithQuotaTag( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag); + _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes, + _In_ ULONG Tag); #ifndef POOL_TAGGING #define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b) #endif +__drv_allocatesMem(Mem) +_When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_((PoolType & NonPagedPoolMustSucceed) != 0, + __drv_reportError("Must succeed pool allocations are forbidden. " + "Allocation failures cause a system crash")) +_When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0, + _Post_maybenull_ _Must_inspect_result_) +_When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0, + _Post_notnull_) +_Post_writable_byte_size_(NumberOfBytes) NTKERNELAPI PVOID NTAPI ExAllocatePoolWithTag( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag); + _In_ __drv_strictTypeMatch(__drv_typeExpr) POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes, + _In_ ULONG Tag); #ifndef POOL_TAGGING #define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b) #endif +__drv_allocatesMem(Mem) +_When_((PoolType & PagedPool) != 0, _IRQL_requires_max_(APC_LEVEL)) +_When_((PoolType & PagedPool) == 0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_((PoolType & NonPagedPoolMustSucceed) != 0, + __drv_reportError("Must succeed pool allocations are forbidden. " + "Allocation failures cause a system crash")) +_When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) == 0, + _Post_maybenull_ _Must_inspect_result_) +_When_((PoolType & (NonPagedPoolMustSucceed | POOL_RAISE_IF_ALLOCATION_FAILURE)) != 0, + _Post_notnull_) +_Post_writable_byte_size_(NumberOfBytes) NTKERNELAPI PVOID NTAPI ExAllocatePoolWithTagPriority( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag, - IN EX_POOL_PRIORITY Priority); + _In_ __drv_strictTypeMatch(__drv_typeCond) POOL_TYPE PoolType, + _In_ SIZE_T NumberOfBytes, + _In_ ULONG Tag, + _In_ __drv_strictTypeMatch(__drv_typeExpr) EX_POOL_PRIORITY Priority); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExConvertExclusiveToSharedLite( - IN OUT PERESOURCE Resource); + _Inout_ _Requires_lock_held_(*_Curr_) PERESOURCE Resource); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExCreateCallback( - OUT PCALLBACK_OBJECT *CallbackObject, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN BOOLEAN Create, - IN BOOLEAN AllowMultipleCallbacks); + _Outptr_ PCALLBACK_OBJECT *CallbackObject, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ BOOLEAN Create, + _In_ BOOLEAN AllowMultipleCallbacks); NTKERNELAPI VOID NTAPI ExDeleteNPagedLookasideList( - IN OUT PNPAGED_LOOKASIDE_LIST Lookaside); + _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExDeletePagedLookasideList( - IN PPAGED_LOOKASIDE_LIST Lookaside); + _Inout_ PPAGED_LOOKASIDE_LIST Lookaside); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExDeleteResourceLite( - IN OUT PERESOURCE Resource); + _Inout_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExFreePool( - IN PVOID P); + _In_ __drv_freesMem(Mem) PVOID P); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExFreePoolWithTag( - IN PVOID P, - IN ULONG Tag); + _In_ __drv_freesMem(Mem) PVOID P, + _In_ ULONG Tag); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI ULONG NTAPI ExGetExclusiveWaiterCount( - IN PERESOURCE Resource); + _In_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI KPROCESSOR_MODE NTAPI ExGetPreviousMode(VOID); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI ULONG NTAPI ExGetSharedWaiterCount( - IN PERESOURCE Resource); + _In_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExInitializeNPagedLookasideList( - IN PNPAGED_LOOKASIDE_LIST Lookaside, - IN PALLOCATE_FUNCTION Allocate OPTIONAL, - IN PFREE_FUNCTION Free OPTIONAL, - IN ULONG Flags, - IN SIZE_T Size, - IN ULONG Tag, - IN USHORT Depth); + _Out_ PNPAGED_LOOKASIDE_LIST Lookaside, + _In_opt_ PALLOCATE_FUNCTION Allocate, + _In_opt_ PFREE_FUNCTION Free, + _In_ ULONG Flags, + _In_ SIZE_T Size, + _In_ ULONG Tag, + _In_ USHORT Depth); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExInitializePagedLookasideList( - IN PPAGED_LOOKASIDE_LIST Lookaside, - IN PALLOCATE_FUNCTION Allocate OPTIONAL, - IN PFREE_FUNCTION Free OPTIONAL, - IN ULONG Flags, - IN SIZE_T Size, - IN ULONG Tag, - IN USHORT Depth); + _Out_ PPAGED_LOOKASIDE_LIST Lookaside, + _In_opt_ PALLOCATE_FUNCTION Allocate, + _In_opt_ PFREE_FUNCTION Free, + _In_ ULONG Flags, + _In_ SIZE_T Size, + _In_ ULONG Tag, + _In_ USHORT Depth); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExInitializeResourceLite( - OUT PERESOURCE Resource); + _Out_ PERESOURCE Resource); NTKERNELAPI LARGE_INTEGER NTAPI ExInterlockedAddLargeInteger( - IN PLARGE_INTEGER Addend, - IN LARGE_INTEGER Increment, - IN PKSPIN_LOCK Lock); + _Inout_ PLARGE_INTEGER Addend, + _In_ LARGE_INTEGER Increment, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); #if defined(_WIN64) #define ExInterlockedAddLargeStatistic(Addend, Increment) \ @@ -13669,9 +14590,9 @@ NTKERNELAPI ULONG FASTCALL ExInterlockedAddUlong( - IN PULONG Addend, - IN ULONG Increment, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PULONG Addend, + _In_ ULONG Increment, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); #if defined(_AMD64_) || defined(_IA64_) @@ -13684,9 +14605,9 @@ NTKERNELAPI LONGLONG FASTCALL ExfInterlockedCompareExchange64( - IN OUT LONGLONG volatile *Destination, - IN PLONGLONG Exchange, - IN PLONGLONG Comperand); + _Inout_ _Interlocked_operand_ LONGLONG volatile *Destination, + _In_ PLONGLONG Exchange, + _In_ PLONGLONG Comperand); #define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \ ExfInterlockedCompareExchange64(Destination, Exchange, Comperand) @@ -13708,57 +14629,60 @@ NTKERNELAPI PLIST_ENTRY FASTCALL ExInterlockedInsertHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY ListEntry, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PLIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); NTKERNELAPI PLIST_ENTRY FASTCALL ExInterlockedInsertTailList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PLIST_ENTRY ListEntry, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PLIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PLIST_ENTRY ListEntry, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedPopEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PSINGLE_LIST_ENTRY ListHead, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); NTKERNELAPI PSINGLE_LIST_ENTRY FASTCALL ExInterlockedPushEntryList( - IN OUT PSINGLE_LIST_ENTRY ListHead, - IN OUT PSINGLE_LIST_ENTRY ListEntry, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PSINGLE_LIST_ENTRY ListHead, + _Inout_ __drv_aliasesMem PSINGLE_LIST_ENTRY ListEntry, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); NTKERNELAPI PLIST_ENTRY FASTCALL ExInterlockedRemoveHeadList( - IN OUT PLIST_ENTRY ListHead, - IN OUT PKSPIN_LOCK Lock); + _Inout_ PLIST_ENTRY ListHead, + _Inout_ _Requires_lock_not_held_(*_Curr_) PKSPIN_LOCK Lock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI BOOLEAN NTAPI ExIsProcessorFeaturePresent( - IN ULONG ProcessorFeature); + _In_ ULONG ProcessorFeature); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI BOOLEAN NTAPI ExIsResourceAcquiredExclusiveLite( - IN PERESOURCE Resource); + _In_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI ULONG NTAPI ExIsResourceAcquiredSharedLite( - IN PERESOURCE Resource); + _In_ PERESOURCE Resource); #define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite @@ -13766,226 +14690,266 @@ NTKERNELAPI VOID NTAPI ExLocalTimeToSystemTime( - IN PLARGE_INTEGER LocalTime, - OUT PLARGE_INTEGER SystemTime); + _In_ PLARGE_INTEGER LocalTime, + _Out_ PLARGE_INTEGER SystemTime); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExNotifyCallback( - IN PCALLBACK_OBJECT CallbackObject, - IN PVOID Argument1 OPTIONAL, - IN PVOID Argument2 OPTIONAL); + _In_ PCALLBACK_OBJECT CallbackObject, + _In_opt_ PVOID Argument1, + _In_opt_ PVOID Argument2); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExQueueWorkItem( - IN OUT PWORK_QUEUE_ITEM WorkItem, - IN WORK_QUEUE_TYPE QueueType); + _Inout_ __drv_aliasesMem PWORK_QUEUE_ITEM WorkItem, + __drv_strictTypeMatch(__drv_typeExpr) _In_ WORK_QUEUE_TYPE QueueType); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI DECLSPEC_NORETURN VOID NTAPI ExRaiseStatus( - IN NTSTATUS Status); + _In_ NTSTATUS Status); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PVOID NTAPI ExRegisterCallback( - IN PCALLBACK_OBJECT CallbackObject, - IN PCALLBACK_FUNCTION CallbackFunction, - IN PVOID CallbackContext OPTIONAL); + _Inout_ PCALLBACK_OBJECT CallbackObject, + _In_ PCALLBACK_FUNCTION CallbackFunction, + _In_opt_ PVOID CallbackContext); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExReinitializeResourceLite( - IN OUT PERESOURCE Resource); + _Inout_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Requires_lock_held_(_Global_critical_region_) NTKERNELAPI VOID NTAPI ExReleaseResourceForThreadLite( - IN OUT PERESOURCE Resource, - IN ERESOURCE_THREAD ResourceThreadId); + _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) + PERESOURCE Resource, + _In_ ERESOURCE_THREAD ResourceThreadId); +_Requires_lock_held_(_Global_critical_region_) +_Requires_lock_held_(*Resource) +_Releases_lock_(*Resource) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID FASTCALL ExReleaseResourceLite( - IN OUT PERESOURCE Resource); + _Inout_ PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExSetResourceOwnerPointer( - IN OUT PERESOURCE Resource, - IN PVOID OwnerPointer); + _Inout_ PERESOURCE Resource, + _In_ PVOID OwnerPointer); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI ULONG NTAPI ExSetTimerResolution( - IN ULONG DesiredTime, - IN BOOLEAN SetResolution); + _In_ ULONG DesiredTime, + _In_ BOOLEAN SetResolution); NTKERNELAPI VOID NTAPI ExSystemTimeToLocalTime( - IN PLARGE_INTEGER SystemTime, - OUT PLARGE_INTEGER LocalTime); + _In_ PLARGE_INTEGER SystemTime, + _Out_ PLARGE_INTEGER LocalTime); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExUnregisterCallback( - IN OUT PVOID CbRegistration); + _Inout_ PVOID CbRegistration); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_Must_inspect_result_ +_Post_satisfies_(return == 0 || return == 1) NTKERNELAPI BOOLEAN FASTCALL ExAcquireRundownProtection( - IN OUT PEX_RUNDOWN_REF RunRef); + _Inout_ PEX_RUNDOWN_REF RunRef); NTKERNELAPI VOID FASTCALL ExInitializeRundownProtection( - OUT PEX_RUNDOWN_REF RunRef); + _Out_ PEX_RUNDOWN_REF RunRef); NTKERNELAPI VOID FASTCALL ExReInitializeRundownProtection( - IN OUT PEX_RUNDOWN_REF RunRef); + _Inout_ PEX_RUNDOWN_REF RunRef); NTKERNELAPI VOID FASTCALL ExReleaseRundownProtection( - IN OUT PEX_RUNDOWN_REF RunRef); + _Inout_ PEX_RUNDOWN_REF RunRef); NTKERNELAPI VOID FASTCALL ExRundownCompleted( - OUT PEX_RUNDOWN_REF RunRef); + _Out_ PEX_RUNDOWN_REF RunRef); NTKERNELAPI BOOLEAN NTAPI ExVerifySuite( - IN SUITE_TYPE SuiteType); + __drv_strictTypeMatch(__drv_typeExpr) _In_ SUITE_TYPE SuiteType); NTKERNELAPI VOID FASTCALL ExWaitForRundownProtectionRelease( - IN OUT PEX_RUNDOWN_REF RunRef); + _Inout_ PEX_RUNDOWN_REF RunRef); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ #if (NTDDI_VERSION >= NTDDI_WINXPSP2) +_Must_inspect_result_ +_Post_satisfies_(return == 0 || return == 1) NTKERNELAPI BOOLEAN FASTCALL ExAcquireRundownProtectionEx( - IN OUT PEX_RUNDOWN_REF RunRef, - IN ULONG Count); + _Inout_ PEX_RUNDOWN_REF RunRef, + _In_ ULONG Count); NTKERNELAPI VOID FASTCALL ExReleaseRundownProtectionEx( - IN OUT PEX_RUNDOWN_REF RunRef, - IN ULONG Count); + _Inout_ PEX_RUNDOWN_REF RunRef, + _In_ ULONG Count); #endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */ #if (NTDDI_VERSION >= NTDDI_WS03SP1) +_Must_inspect_result_ +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI PEX_RUNDOWN_REF_CACHE_AWARE NTAPI ExAllocateCacheAwareRundownProtection( - IN POOL_TYPE PoolType, - IN ULONG PoolTag); + __drv_strictTypeMatch(__drv_typeExpr) _In_ POOL_TYPE PoolType, + _In_ ULONG PoolTag); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI SIZE_T NTAPI ExSizeOfRundownProtectionCacheAware(VOID); +_IRQL_requires_max_(APC_LEVEL) +_Acquires_lock_(_Global_critical_region_) NTKERNELAPI PVOID NTAPI ExEnterCriticalRegionAndAcquireResourceShared( - IN OUT PERESOURCE Resource); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_shared_lock_(*_Curr_) + PERESOURCE Resource); +_IRQL_requires_max_(APC_LEVEL) +_Acquires_lock_(_Global_critical_region_) NTKERNELAPI PVOID NTAPI ExEnterCriticalRegionAndAcquireResourceExclusive( - IN OUT PERESOURCE Resource); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_) + PERESOURCE Resource); +_IRQL_requires_max_(APC_LEVEL) +_Acquires_lock_(_Global_critical_region_) NTKERNELAPI PVOID NTAPI ExEnterCriticalRegionAndAcquireSharedWaitForExclusive( - IN OUT PERESOURCE Resource); + _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_lock_(*_Curr_) + PERESOURCE Resource); +_IRQL_requires_max_(DISPATCH_LEVEL) +_Releases_lock_(_Global_critical_region_) NTKERNELAPI VOID FASTCALL ExReleaseResourceAndLeaveCriticalRegion( - IN OUT PERESOURCE Resource); + _Inout_ _Requires_lock_held_(*_Curr_) _Releases_lock_(*_Curr_) + PERESOURCE Resource); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExInitializeRundownProtectionCacheAware( - OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, - IN SIZE_T RunRefSize); + _Out_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, + _In_ SIZE_T RunRefSize); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ExFreeCacheAwareRundownProtection( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); +_Must_inspect_result_ +_Post_satisfies_(return == 0 || return == 1) NTKERNELAPI BOOLEAN FASTCALL ExAcquireRundownProtectionCacheAware( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); NTKERNELAPI VOID FASTCALL ExReleaseRundownProtectionCacheAware( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); +_Must_inspect_result_ +_Post_satisfies_(return == 0 || return == 1) NTKERNELAPI BOOLEAN FASTCALL ExAcquireRundownProtectionCacheAwareEx( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, - IN ULONG Count); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware, + _In_ ULONG Count); NTKERNELAPI VOID FASTCALL ExReleaseRundownProtectionCacheAwareEx( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRef, - IN ULONG Count); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRef, + _In_ ULONG Count); NTKERNELAPI VOID @@ -13997,47 +14961,52 @@ NTKERNELAPI VOID FASTCALL ExReInitializeRundownProtectionCacheAware( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); NTKERNELAPI VOID FASTCALL ExRundownCompletedCacheAware( - IN OUT PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); + _Inout_ PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware); #endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */ #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ExInitializeLookasideListEx( - OUT PLOOKASIDE_LIST_EX Lookaside, - IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL, - IN PFREE_FUNCTION_EX Free OPTIONAL, - IN POOL_TYPE PoolType, - IN ULONG Flags, - IN SIZE_T Size, - IN ULONG Tag, - IN USHORT Depth); + _Out_ PLOOKASIDE_LIST_EX Lookaside, + _In_opt_ PALLOCATE_FUNCTION_EX Allocate, + _In_opt_ PFREE_FUNCTION_EX Free, + _In_ POOL_TYPE PoolType, + _In_ ULONG Flags, + _In_ SIZE_T Size, + _In_ ULONG Tag, + _In_ USHORT Depth); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExDeleteLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside); + _Inout_ PLOOKASIDE_LIST_EX Lookaside); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExFlushLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside); + _Inout_ PLOOKASIDE_LIST_EX Lookaside); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) FORCEINLINE PVOID ExAllocateFromLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside) + _Inout_ PLOOKASIDE_LIST_EX Lookaside) { PVOID Entry; @@ -14064,11 +15033,12 @@ ExAllocateFromLookasideListEx( return Entry; } +_IRQL_requires_max_(DISPATCH_LEVEL) FORCEINLINE VOID ExFreeToLookasideListEx( - IN OUT PLOOKASIDE_LIST_EX Lookaside, - IN PVOID Entry) + _Inout_ PLOOKASIDE_LIST_EX Lookaside, + _In_ PVOID Entry) { Lookaside->L.TotalFrees += 1; if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) { @@ -14084,21 +15054,23 @@ ExFreeToLookasideListEx( #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI VOID NTAPI ExSetResourceOwnerPointerEx( - IN OUT PERESOURCE Resource, - IN PVOID OwnerPointer, - IN ULONG Flags); + _Inout_ PERESOURCE Resource, + _In_ PVOID OwnerPointer, + _In_ ULONG Flags); #define FLAG_OWNER_POINTER_IS_THREAD 0x1 #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ +_IRQL_requires_max_(DISPATCH_LEVEL) static __inline PVOID ExAllocateFromNPagedLookasideList( - IN OUT PNPAGED_LOOKASIDE_LIST Lookaside) + _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside) { PVOID Entry; @@ -14133,10 +15105,11 @@ ExAllocateFromNPagedLookasideList( return Entry; } +_IRQL_requires_max_(DISPATCH_LEVEL) static __inline VOID ExFreeToNPagedLookasideList( - IN OUT PNPAGED_LOOKASIDE_LIST Lookaside, - IN PVOID Entry) + _Inout_ PNPAGED_LOOKASIDE_LIST Lookaside, + _In_ PVOID Entry) { Lookaside->L.TotalFrees++; #ifdef NONAMELESSUNION @@ -14173,54 +15146,60 @@ ExFreeToNPagedLookasideList( ******************************************************************************/ #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG_PTR FASTCALL ObfDereferenceObject( - IN PVOID Object); + _In_ PVOID Object); #define ObDereferenceObject ObfDereferenceObject +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI ObGetObjectSecurity( - IN PVOID Object, - OUT PSECURITY_DESCRIPTOR *SecurityDescriptor, - OUT PBOOLEAN MemoryAllocated); + _In_ PVOID Object, + _Out_ PSECURITY_DESCRIPTOR *SecurityDescriptor, + _Out_ PBOOLEAN MemoryAllocated); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG_PTR FASTCALL ObfReferenceObject( - IN PVOID Object); + _In_ PVOID Object); #define ObReferenceObject ObfReferenceObject +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI ObReferenceObjectByHandle( - IN HANDLE Handle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - OUT PVOID *Object, - OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL); + _In_ HANDLE Handle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode, + _Out_ PVOID *Object, + _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ObReferenceObjectByPointer( - IN PVOID Object, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode); + _In_ PVOID Object, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode); +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI VOID NTAPI ObReleaseObjectSecurity( - IN PSECURITY_DESCRIPTOR SecurityDescriptor, - IN BOOLEAN MemoryAllocated); + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ BOOLEAN MemoryAllocated); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_VISTA) @@ -14228,7 +15207,7 @@ NTKERNELAPI VOID NTAPI ObDereferenceObjectDeferDelete( - IN PVOID Object); + _In_ PVOID Object); #endif #if (NTDDI_VERSION >= NTDDI_VISTASP1) @@ -14236,14 +15215,14 @@ NTKERNELAPI NTSTATUS NTAPI ObRegisterCallbacks( - IN POB_CALLBACK_REGISTRATION CallbackRegistration, - OUT PVOID *RegistrationHandle); + _In_ POB_CALLBACK_REGISTRATION CallbackRegistration, + _Outptr_ PVOID *RegistrationHandle); NTKERNELAPI VOID NTAPI ObUnRegisterCallbacks( - IN PVOID RegistrationHandle); + _In_ PVOID RegistrationHandle); NTKERNELAPI USHORT @@ -14253,48 +15232,52 @@ ObGetFilterVersion(VOID); #endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */ #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI ObReferenceObjectByHandleWithTag( - IN HANDLE Handle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - IN ULONG Tag, - OUT PVOID *Object, - OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL); + _In_ HANDLE Handle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode, + _In_ ULONG Tag, + _Out_ PVOID *Object, + _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG_PTR FASTCALL ObfReferenceObjectWithTag( - IN PVOID Object, - IN ULONG Tag); + _In_ PVOID Object, + _In_ ULONG Tag); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI NTSTATUS NTAPI ObReferenceObjectByPointerWithTag( - IN PVOID Object, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_TYPE ObjectType OPTIONAL, - IN KPROCESSOR_MODE AccessMode, - IN ULONG Tag); + _In_ PVOID Object, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_TYPE ObjectType, + _In_ KPROCESSOR_MODE AccessMode, + _In_ ULONG Tag); +_IRQL_requires_max_(DISPATCH_LEVEL) NTKERNELAPI LONG_PTR FASTCALL ObfDereferenceObjectWithTag( - IN PVOID Object, - IN ULONG Tag); + _In_ PVOID Object, + _In_ ULONG Tag); NTKERNELAPI VOID NTAPI ObDereferenceObjectDeferDeleteWithTag( - IN PVOID Object, - IN ULONG Tag); + _In_ PVOID Object, + _In_ ULONG Tag); #define ObDereferenceObject ObfDereferenceObject #define ObReferenceObject ObfReferenceObject @@ -14310,8 +15293,8 @@ NTKERNELAPI NTSTATUS NTAPI PsWrapApcWow64Thread( - IN OUT PVOID *ApcContext, - IN OUT PVOID *ApcRoutine); + _Inout_ PVOID *ApcContext, + _Inout_ PVOID *ApcRoutine); /* * PEPROCESS @@ -14321,6 +15304,7 @@ PsWrapApcWow64Thread( #if !defined(_PSGETCURRENTTHREAD_) #define _PSGETCURRENTTHREAD_ +_IRQL_requires_max_(DISPATCH_LEVEL) FORCEINLINE PETHREAD NTAPI @@ -14333,23 +15317,27 @@ PsGetCurrentThread(VOID) #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(APC_LEVEL) +_Post_satisfies_(return <= 0) +_Must_inspect_result_ NTKERNELAPI NTSTATUS NTAPI PsCreateSystemThread( - OUT PHANDLE ThreadHandle, - IN ULONG DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN HANDLE ProcessHandle OPTIONAL, - OUT PCLIENT_ID ClientId OPTIONAL, - IN PKSTART_ROUTINE StartRoutine, - IN PVOID StartContext OPTIONAL); + _Out_ PHANDLE ThreadHandle, + _In_ ULONG DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ HANDLE ProcessHandle, + _Out_opt_ PCLIENT_ID ClientId, + _In_ PKSTART_ROUTINE StartRoutine, + _In_opt_ _When_(return==0, __drv_aliasesMem) PVOID StartContext); +_IRQL_requires_max_(PASSIVE_LEVEL) NTKERNELAPI NTSTATUS NTAPI PsTerminateSystemThread( - IN NTSTATUS ExitStatus); + _In_ NTSTATUS ExitStatus); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ @@ -14360,41 +15348,44 @@ PsTerminateSystemThread( #ifdef RUN_WPP #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(HIGH_LEVEL) NTKERNELAPI NTSTATUS __cdecl WmiTraceMessage( - IN TRACEHANDLE LoggerHandle, - IN ULONG MessageFlags, - IN LPGUID MessageGuid, - IN USHORT MessageNumber, - IN ...); + _In_ TRACEHANDLE LoggerHandle, + _In_ ULONG MessageFlags, + _In_ LPGUID MessageGuid, + _In_ USHORT MessageNumber, + ...); #endif #endif /* RUN_WPP */ #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI WmiQueryTraceInformation( - IN TRACE_INFORMATION_CLASS TraceInformationClass, - OUT PVOID TraceInformation, - IN ULONG TraceInformationLength, - OUT PULONG RequiredLength OPTIONAL, - IN PVOID Buffer OPTIONAL); + _In_ TRACE_INFORMATION_CLASS TraceInformationClass, + _Out_writes_bytes_(TraceInformationLength) PVOID TraceInformation, + _In_ ULONG TraceInformationLength, + _Out_opt_ PULONG RequiredLength, + _In_opt_ PVOID Buffer); #if 0 /* FIXME: Get va_list from where? */ +_IRQL_requires_max_(HIGH_LEVEL) NTKERNELAPI NTSTATUS NTAPI WmiTraceMessageVa( - IN TRACEHANDLE LoggerHandle, - IN ULONG MessageFlags, - IN LPGUID MessageGuid, - IN USHORT MessageNumber, - IN va_list MessageArgList); + _In_ TRACEHANDLE LoggerHandle, + _In_ ULONG MessageFlags, + _In_ LPGUID MessageGuid, + _In_ USHORT MessageNumber, + _In_ va_list MessageArgList); #endif #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -14402,15 +15393,16 @@ WmiTraceMessageVa( #ifndef TRACE_INFORMATION_CLASS_DEFINE #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(APC_LEVEL) NTKERNELAPI NTSTATUS NTAPI WmiQueryTraceInformation( - IN TRACE_INFORMATION_CLASS TraceInformationClass, - OUT PVOID TraceInformation, - IN ULONG TraceInformationLength, - OUT PULONG RequiredLength OPTIONAL, - IN PVOID Buffer OPTIONAL); + _In_ TRACE_INFORMATION_CLASS TraceInformationClass, + _Out_writes_bytes_(TraceInformationLength) PVOID TraceInformation, + _In_ ULONG TraceInformationLength, + _Out_opt_ PULONG RequiredLength, + _In_opt_ PVOID Buffer); #endif #define TRACE_INFORMATION_CLASS_DEFINE @@ -14419,89 +15411,99 @@ WmiQueryTraceInformation( #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTKERNELAPI NTAPI EtwRegister( - IN LPCGUID ProviderId, - IN PETWENABLECALLBACK EnableCallback OPTIONAL, - IN PVOID CallbackContext OPTIONAL, - OUT PREGHANDLE RegHandle); + _In_ LPCGUID ProviderId, + _In_opt_ PETWENABLECALLBACK EnableCallback, + _In_opt_ PVOID CallbackContext, + _Out_ PREGHANDLE RegHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTKERNELAPI NTAPI EtwUnregister( - IN REGHANDLE RegHandle); + _In_ REGHANDLE RegHandle); +_IRQL_requires_max_(HIGH_LEVEL) BOOLEAN NTKERNELAPI NTAPI EtwEventEnabled( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor); + _In_ REGHANDLE RegHandle, + _In_ PCEVENT_DESCRIPTOR EventDescriptor); +_IRQL_requires_max_(HIGH_LEVEL) BOOLEAN NTKERNELAPI NTAPI EtwProviderEnabled( - IN REGHANDLE RegHandle, - IN UCHAR Level, - IN ULONGLONG Keyword); + _In_ REGHANDLE RegHandle, + _In_ UCHAR Level, + _In_ ULONGLONG Keyword); +_When_(ControlCode==EVENT_ACTIVITY_CTRL_CREATE_ID, _IRQL_requires_max_(HIGH_LEVEL)) +_When_(ControlCode!=EVENT_ACTIVITY_CTRL_CREATE_ID, _IRQL_requires_max_(APC_LEVEL)) NTSTATUS NTKERNELAPI NTAPI EtwActivityIdControl( - IN ULONG ControlCode, - IN OUT LPGUID ActivityId); + _In_ ULONG ControlCode, + _Inout_updates_bytes_(sizeof(GUID)) LPGUID ActivityId); +_IRQL_requires_max_(HIGH_LEVEL) NTSTATUS NTKERNELAPI NTAPI EtwWrite( - IN REGHANDLE RegHandle, - IN PCEVENT_DESCRIPTOR EventDescriptor, - IN LPCGUID ActivityId OPTIONAL, - IN ULONG UserDataCount, - IN PEVENT_DATA_DESCRIPTOR UserData OPTIONAL); + _In_ REGHANDLE RegHandle, + _In_ PCEVENT_DESCRIPTOR EventDescriptor, + _In_opt_ LPCGUID ActivityId, + _In_ ULONG UserDataCount, + _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData); +_IRQL_requires_max_(HIGH_LEVEL) 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); + _In_ REGHANDLE RegHandle, + _In_ PCEVENT_DESCRIPTOR EventDescriptor, + _In_opt_ LPCGUID ActivityId, + _In_opt_ LPCGUID RelatedActivityId, + _In_ ULONG UserDataCount, + _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData); +_IRQL_requires_max_(HIGH_LEVEL) NTSTATUS NTKERNELAPI NTAPI EtwWriteString( - IN REGHANDLE RegHandle, - IN UCHAR Level, - IN ULONGLONG Keyword, - IN LPCGUID ActivityId OPTIONAL, - IN PCWSTR String); + _In_ REGHANDLE RegHandle, + _In_ UCHAR Level, + _In_ ULONGLONG Keyword, + _In_opt_ LPCGUID ActivityId, + _In_ PCWSTR String); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(HIGH_LEVEL) 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); + _In_ REGHANDLE RegHandle, + _In_ PCEVENT_DESCRIPTOR EventDescriptor, + _In_ ULONG64 Filter, + _In_ ULONG Flags, + _In_opt_ LPCGUID ActivityId, + _In_opt_ LPCGUID RelatedActivityId, + _In_ ULONG UserDataCount, + _In_reads_opt_(UserDataCount) PEVENT_DATA_DESCRIPTOR UserData); #endif @@ -14515,16 +15517,16 @@ EtwWriteEx( ULONG __cdecl DbgPrint( - IN PCSTR Format, - IN ...); + _In_z_ _Printf_format_string_ PCSTR Format, + ...); #if (NTDDI_VERSION >= NTDDI_WIN2K) NTSYSAPI ULONG __cdecl DbgPrintReturnControlC( - IN PCCH Format, - IN ...); + _In_z_ _Printf_format_string_ PCCH Format, + ...); #endif #if (NTDDI_VERSION >= NTDDI_WINXP) @@ -14533,10 +15535,10 @@ NTSYSAPI ULONG __cdecl DbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCSTR Format, - IN ...); + _In_ ULONG ComponentId, + _In_ ULONG Level, + _In_z_ _Printf_format_string_ PCSTR Format, + ...); #ifdef _VA_LIST_DEFINED @@ -14544,20 +15546,20 @@ NTSYSAPI ULONG NTAPI vDbgPrintEx( - IN ULONG ComponentId, - IN ULONG Level, - IN PCCH Format, - IN va_list ap); + _In_ ULONG ComponentId, + _In_ ULONG Level, + _In_z_ 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); + _In_z_ PCCH Prefix, + _In_ ULONG ComponentId, + _In_ ULONG Level, + _In_z_ PCCH Format, + _In_ va_list ap); #endif /* _VA_LIST_DEFINED */ @@ -14565,16 +15567,16 @@ NTSYSAPI NTSTATUS NTAPI DbgQueryDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level); + _In_ ULONG ComponentId, + _In_ ULONG Level); NTSYSAPI NTSTATUS NTAPI DbgSetDebugFilterState( - IN ULONG ComponentId, - IN ULONG Level, - IN BOOLEAN State); + _In_ ULONG ComponentId, + _In_ ULONG Level, + _In_ BOOLEAN State); #endif /* (NTDDI_VERSION >= NTDDI_WINXP) */ @@ -14582,16 +15584,16 @@ DbgSetDebugFilterState( typedef VOID (*PDEBUG_PRINT_CALLBACK)( - IN PSTRING Output, - IN ULONG ComponentId, - IN ULONG Level); + _In_ PSTRING Output, + _In_ ULONG ComponentId, + _In_ ULONG Level); NTSYSAPI NTSTATUS NTAPI DbgSetDebugPrintCallback( - IN PDEBUG_PRINT_CALLBACK DebugPrintCallback, - IN BOOLEAN Enable); + _In_ PDEBUG_PRINT_CALLBACK DebugPrintCallback, + _In_ BOOLEAN Enable); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ @@ -14655,11 +15657,13 @@ KdEnableDebugger(VOID); #if (_MSC_FULL_VER >= 150030729) && !defined(IMPORT_NATIVE_DBG_BREAK) #define DbgBreakPoint __debugbreak #else +__analysis_noreturn VOID NTAPI DbgBreakPoint(VOID); #endif +__analysis_noreturn NTSYSAPI VOID NTAPI @@ -14680,12 +15684,12 @@ NTKERNELAPI NTSTATUS NTAPI KdChangeOption( - IN KD_OPTION Option, - IN ULONG InBufferBytes OPTIONAL, - IN PVOID InBuffer, - IN ULONG OutBufferBytes OPTIONAL, - OUT PVOID OutBuffer, - OUT PULONG OutBufferNeeded OPTIONAL); + _In_ KD_OPTION Option, + _In_opt_ ULONG InBufferBytes, + _In_ PVOID InBuffer, + _In_opt_ ULONG OutBufferBytes, + _Out_ PVOID OutBuffer, + _Out_opt_ PULONG OutBufferNeeded); #endif /* Hardware Abstraction Layer Functions */ @@ -14693,14 +15697,15 @@ KdChangeOption( #if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) +__drv_preferredFunction("AllocateCommonBuffer","Obsolete") FORCEINLINE PVOID NTAPI HalAllocateCommonBuffer( - IN PDMA_ADAPTER DmaAdapter, - IN ULONG Length, - OUT PPHYSICAL_ADDRESS LogicalAddress, - IN BOOLEAN CacheEnabled) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ ULONG Length, + _Out_ PPHYSICAL_ADDRESS LogicalAddress, + _In_ BOOLEAN CacheEnabled) { PALLOCATE_COMMON_BUFFER allocateCommonBuffer; PVOID commonBuffer; @@ -14711,15 +15716,16 @@ HalAllocateCommonBuffer( return commonBuffer; } +__drv_preferredFunction("FreeCommonBuffer","Obsolete") FORCEINLINE VOID NTAPI HalFreeCommonBuffer( - IN PDMA_ADAPTER DmaAdapter, - IN ULONG Length, - IN PHYSICAL_ADDRESS LogicalAddress, - IN PVOID VirtualAddress, - IN BOOLEAN CacheEnabled) + _In_ PDMA_ADAPTER DmaAdapter, + _In_ ULONG Length, + _In_ PHYSICAL_ADDRESS LogicalAddress, + _In_ PVOID VirtualAddress, + _In_ BOOLEAN CacheEnabled) { PFREE_COMMON_BUFFER freeCommonBuffer; @@ -14728,11 +15734,12 @@ HalFreeCommonBuffer( freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled ); } +__drv_preferredFunction("ReadDmaCounter","Obsolete") FORCEINLINE ULONG NTAPI HalReadDmaCounter( - IN PDMA_ADAPTER DmaAdapter) + _In_ PDMA_ADAPTER DmaAdapter) { PREAD_DMA_COUNTER readDmaCounter; ULONG counter; @@ -14746,7 +15753,7 @@ HalReadDmaCounter( FORCEINLINE ULONG HalGetDmaAlignment( - IN PDMA_ADAPTER DmaAdapter) + _In_ PDMA_ADAPTER DmaAdapter) { PGET_DMA_ALIGNMENT getDmaAlignment; ULONG alignment; @@ -14761,7 +15768,6 @@ HalGetDmaAlignment( #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ - #ifndef _NTTMAPI_ #define _NTTMAPI_ @@ -14918,7 +15924,7 @@ typedef struct _TRANSACTIONMANAGER_LOG_INFORMATION { typedef struct _TRANSACTIONMANAGER_LOGPATH_INFORMATION { ULONG LogPathLength; - WCHAR LogPath[1]; + _Field_size_(LogPathLength) WCHAR LogPath[1]; } TRANSACTIONMANAGER_LOGPATH_INFORMATION, *PTRANSACTIONMANAGER_LOGPATH_INFORMATION; typedef struct _TRANSACTIONMANAGER_RECOVERY_INFORMATION { @@ -15029,385 +16035,488 @@ typedef struct _TRANSACTION_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); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ LPGUID Uow, + _In_opt_ HANDLE TmHandle, + _In_opt_ ULONG CreateOptions, + _In_opt_ ULONG IsolationLevel, + _In_opt_ ULONG IsolationFlags, + _In_opt_ PLARGE_INTEGER Timeout, + _In_opt_ PUNICODE_STRING Description); 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); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ LPGUID Uow, + _In_opt_ HANDLE TmHandle); 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); + _In_ HANDLE TransactionHandle, + _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation, + _In_ ULONG TransactionInformationLength, + _Out_opt_ PULONG ReturnLength); typedef NTSTATUS (NTAPI *PFN_NT_SET_INFORMATION_TRANSACTION)( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - IN PVOID TransactionInformation, - IN ULONG TransactionInformationLength); + _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); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); typedef NTSTATUS (NTAPI *PFN_NT_ROLLBACK_TRANSACTION)( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); #if (NTDDI_VERSION >= NTDDI_VISTA) +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _Out_ PHANDLE TmHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PUNICODE_STRING LogFileName, + _In_opt_ ULONG CreateOptions, + _In_opt_ ULONG CommitStrength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _Out_ PHANDLE TmHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PUNICODE_STRING LogFileName, + _In_opt_ LPGUID TmIdentity, + _In_opt_ ULONG OpenOptions); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRenameTransactionManager( - IN PUNICODE_STRING LogFileName, - IN LPGUID ExistingTransactionManagerGuid); + _In_ PUNICODE_STRING LogFileName, + _In_ LPGUID ExistingTransactionManagerGuid); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRollforwardTransactionManager( - IN HANDLE TransactionManagerHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE TransactionManagerHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRecoverTransactionManager( - IN HANDLE TransactionManagerHandle); + _In_ HANDLE TransactionManagerHandle); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationTransactionManager( - IN HANDLE TransactionManagerHandle, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - OUT PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength, - OUT PULONG ReturnLength); + _In_ HANDLE TransactionManagerHandle, + _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation, + _In_ ULONG TransactionManagerInformationLength, + _Out_ PULONG ReturnLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationTransactionManager( - IN HANDLE TmHandle OPTIONAL, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - IN PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength); + _In_opt_ HANDLE TmHandle, + _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + _In_reads_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation, + _In_ ULONG TransactionManagerInformationLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtEnumerateTransactionObject( - IN HANDLE RootObjectHandle OPTIONAL, - IN KTMOBJECT_TYPE QueryType, - IN OUT PKTMOBJECT_CURSOR ObjectCursor, - IN ULONG ObjectCursorLength, - OUT PULONG ReturnLength); + _In_opt_ HANDLE RootObjectHandle, + _In_ KTMOBJECT_TYPE QueryType, + _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor, + _In_ ULONG ObjectCursorLength, + _Out_ PULONG ReturnLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ LPGUID Uow, + _In_opt_ HANDLE TmHandle, + _In_opt_ ULONG CreateOptions, + _In_opt_ ULONG IsolationLevel, + _In_opt_ ULONG IsolationFlags, + _In_opt_ PLARGE_INTEGER Timeout, + _In_opt_ PUNICODE_STRING Description); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenTransaction( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN LPGUID Uow, - IN HANDLE TmHandle OPTIONAL); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ LPGUID Uow, + _In_opt_ HANDLE TmHandle); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - OUT PVOID TransactionInformation, - IN ULONG TransactionInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_ HANDLE TransactionHandle, + _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation, + _In_ ULONG TransactionInformationLength, + _Out_opt_ PULONG ReturnLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - IN PVOID TransactionInformation, - IN ULONG TransactionInformationLength); + _In_ HANDLE TransactionHandle, + _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + _In_reads_bytes_(TransactionInformationLength) PVOID TransactionInformation, + _In_ ULONG TransactionInformationLength); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCommitTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRollbackTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _Out_ PHANDLE EnlistmentHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE ResourceManagerHandle, + _In_ HANDLE TransactionHandle, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ ULONG CreateOptions, + _In_ NOTIFICATION_MASK NotificationMask, + _In_opt_ PVOID EnlistmentKey); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenEnlistment( - OUT PHANDLE EnlistmentHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE ResourceManagerHandle, - IN LPGUID EnlistmentGuid, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + _Out_ PHANDLE EnlistmentHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE ResourceManagerHandle, + _In_ LPGUID EnlistmentGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationEnlistment( - IN HANDLE EnlistmentHandle, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - OUT PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength, - OUT PULONG ReturnLength); + _In_ HANDLE EnlistmentHandle, + _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation, + _In_ ULONG EnlistmentInformationLength, + _Out_ PULONG ReturnLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationEnlistment( - IN HANDLE EnlistmentHandle OPTIONAL, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - IN PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength); + _In_opt_ HANDLE EnlistmentHandle, + _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation, + _In_ ULONG EnlistmentInformationLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRecoverEnlistment( - IN HANDLE EnlistmentHandle, - IN PVOID EnlistmentKey OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PVOID EnlistmentKey); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrePrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCommitEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRollbackEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrePrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtCommitComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtReadOnlyEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRollbackComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSinglePhaseReject( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _Out_ PHANDLE ResourceManagerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE TmHandle, + _In_ LPGUID RmGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ ULONG CreateOptions, + _In_opt_ PUNICODE_STRING Description); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtOpenResourceManager( - OUT PHANDLE ResourceManagerHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE TmHandle, - IN LPGUID ResourceManagerGuid OPTIONAL, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + _Out_ PHANDLE ResourceManagerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE TmHandle, + _In_opt_ LPGUID ResourceManagerGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRecoverResourceManager( - IN HANDLE ResourceManagerHandle); + _In_ HANDLE ResourceManagerHandle); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry 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); + _In_ HANDLE ResourceManagerHandle, + _Out_ PTRANSACTION_NOTIFICATION TransactionNotification, + _In_ ULONG NotificationLength, + _In_opt_ PLARGE_INTEGER Timeout, + _Out_opt_ PULONG ReturnLength, + _In_ ULONG Asynchronous, + _In_opt_ ULONG_PTR AsynchronousContext); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtQueryInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - OUT PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_ HANDLE ResourceManagerHandle, + _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation, + _In_ ULONG ResourceManagerInformationLength, + _Out_opt_ PULONG ReturnLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtSetInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - IN PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength); + _In_ HANDLE ResourceManagerHandle, + _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation, + _In_ ULONG ResourceManagerInformationLength); +_Must_inspect_result_ +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtRegisterProtocolAddressInformation( - IN HANDLE ResourceManager, - IN PCRM_PROTOCOL_ID ProtocolId, - IN ULONG ProtocolInformationSize, - IN PVOID ProtocolInformation, - IN ULONG CreateOptions OPTIONAL); + _In_ HANDLE ResourceManager, + _In_ PCRM_PROTOCOL_ID ProtocolId, + _In_ ULONG ProtocolInformationSize, + _In_ PVOID ProtocolInformation, + _In_opt_ ULONG CreateOptions); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPropagationComplete( - IN HANDLE ResourceManagerHandle, - IN ULONG RequestCookie, - IN ULONG BufferLength, - IN PVOID Buffer); + _In_ HANDLE ResourceManagerHandle, + _In_ ULONG RequestCookie, + _In_ ULONG BufferLength, + _In_ PVOID Buffer); +_IRQL_requires_max_ (APC_LEVEL) +__kernel_entry NTSYSCALLAPI NTSTATUS NTAPI NtPropagationFailed( - IN HANDLE ResourceManagerHandle, - IN ULONG RequestCookie, - IN NTSTATUS PropStatus); + _In_ HANDLE ResourceManagerHandle, + _In_ ULONG RequestCookie, + _In_ NTSTATUS PropStatus); #endif /* NTDDI_VERSION >= NTDDI_VISTA */ @@ -15426,592 +16535,663 @@ NtPropagationFailed( #if (NTDDI_VERSION >= NTDDI_WIN2K) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwClose( - IN HANDLE Handle); + _In_ HANDLE Handle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwCreateDirectoryObject( - OUT PHANDLE DirectoryHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE DirectoryHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwCreateFile( - 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 CreateDisposition, - IN ULONG CreateOptions, - IN PVOID EaBuffer OPTIONAL, - IN ULONG EaLength); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_opt_ PLARGE_INTEGER AllocationSize, + _In_ ULONG FileAttributes, + _In_ ULONG ShareAccess, + _In_ ULONG CreateDisposition, + _In_ ULONG CreateOptions, + _In_reads_bytes_opt_(EaLength) PVOID EaBuffer, + _In_ ULONG EaLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwCreateKey( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ULONG TitleIndex, - IN PUNICODE_STRING Class OPTIONAL, - IN ULONG CreateOptions, - OUT PULONG Disposition OPTIONAL); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Reserved_ ULONG TitleIndex, + _In_opt_ PUNICODE_STRING Class, + _In_ ULONG CreateOptions, + _Out_opt_ PULONG Disposition); +_IRQL_requires_max_(APC_LEVEL) 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); + _Out_ PHANDLE SectionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PLARGE_INTEGER MaximumSize, + _In_ ULONG SectionPageProtection, + _In_ ULONG AllocationAttributes, + _In_opt_ HANDLE FileHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwDeleteKey( - IN HANDLE KeyHandle); + _In_ HANDLE KeyHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwDeleteValueKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING ValueName); + _In_ HANDLE KeyHandle, + _In_ PUNICODE_STRING ValueName); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(Length == 0, _Post_satisfies_(return < 0)) +_When_(Length > 0, _Post_satisfies_(return <= 0)) NTSYSAPI NTSTATUS NTAPI ZwEnumerateKey( - IN HANDLE KeyHandle, - IN ULONG Index, - IN KEY_INFORMATION_CLASS KeyInformationClass, - OUT PVOID KeyInformation OPTIONAL, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE KeyHandle, + _In_ ULONG Index, + _In_ KEY_INFORMATION_CLASS KeyInformationClass, + _Out_writes_bytes_opt_(Length) PVOID KeyInformation, + _In_ ULONG Length, + _Out_ PULONG ResultLength); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(Length == 0, _Post_satisfies_(return < 0)) +_When_(Length > 0, _Post_satisfies_(return <= 0)) NTSYSAPI NTSTATUS NTAPI ZwEnumerateValueKey( - IN HANDLE KeyHandle, - IN ULONG Index, - IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, - OUT PVOID KeyValueInformation OPTIONAL, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE KeyHandle, + _In_ ULONG Index, + _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation, + _In_ ULONG Length, + _Out_ PULONG ResultLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwFlushKey( - IN HANDLE KeyHandle); + _In_ HANDLE KeyHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwLoadDriver( - IN PUNICODE_STRING DriverServiceName); + _In_ PUNICODE_STRING DriverServiceName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwMakeTemporaryObject( - IN HANDLE Handle); + _In_ HANDLE Handle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwMapViewOfSection( - IN HANDLE SectionHandle, - IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN ULONG_PTR ZeroBits, - IN SIZE_T CommitSize, - IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, - IN OUT PSIZE_T ViewSize, - IN SECTION_INHERIT InheritDisposition, - IN ULONG AllocationType, - IN ULONG Protect); + _In_ HANDLE SectionHandle, + _In_ HANDLE ProcessHandle, + _Outptr_result_bytebuffer_(*ViewSize) PVOID *BaseAddress, + _In_ ULONG_PTR ZeroBits, + _In_ SIZE_T CommitSize, + _Inout_opt_ PLARGE_INTEGER SectionOffset, + _Inout_ PSIZE_T ViewSize, + _In_ SECTION_INHERIT InheritDisposition, + _In_ ULONG AllocationType, + _In_ ULONG Protect); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenFile( - OUT PHANDLE FileHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG ShareAccess, - IN ULONG OpenOptions); + _Out_ PHANDLE FileHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_ ULONG ShareAccess, + _In_ ULONG OpenOptions); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenKey( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenSection( - OUT PHANDLE SectionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE SectionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenSymbolicLinkObject( - OUT PHANDLE LinkHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE LinkHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQueryInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(Length == 0, _Post_satisfies_(return < 0)) +_When_(Length > 0, _Post_satisfies_(return <= 0)) NTSYSAPI NTSTATUS NTAPI ZwQueryKey( - IN HANDLE KeyHandle, - IN KEY_INFORMATION_CLASS KeyInformationClass, - OUT PVOID KeyInformation OPTIONAL, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE KeyHandle, + _In_ KEY_INFORMATION_CLASS KeyInformationClass, + _Out_writes_bytes_opt_(Length) PVOID KeyInformation, + _In_ ULONG Length, + _Out_ PULONG ResultLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQuerySymbolicLinkObject( - IN HANDLE LinkHandle, - IN OUT PUNICODE_STRING LinkTarget, - OUT PULONG ReturnedLength OPTIONAL); + _In_ HANDLE LinkHandle, + _Inout_ PUNICODE_STRING LinkTarget, + _Out_opt_ PULONG ReturnedLength); +_IRQL_requires_max_(PASSIVE_LEVEL) +_When_(Length == 0, _Post_satisfies_(return < 0)) +_When_(Length > 0, _Post_satisfies_(return <= 0)) NTSYSAPI NTSTATUS NTAPI ZwQueryValueKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING ValueName, - IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, - OUT PVOID KeyValueInformation OPTIONAL, - IN ULONG Length, - OUT PULONG ResultLength); + _In_ HANDLE KeyHandle, + _In_ PUNICODE_STRING ValueName, + _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, + _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation, + _In_ ULONG Length, + _Out_ PULONG ResultLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwReadFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - OUT PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_opt_ PLARGE_INTEGER ByteOffset, + _In_opt_ PULONG Key); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetInformationFile( - IN HANDLE FileHandle, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID FileInformation, - IN ULONG Length, - IN FILE_INFORMATION_CLASS FileInformationClass); + _In_ HANDLE FileHandle, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID FileInformation, + _In_ ULONG Length, + _In_ FILE_INFORMATION_CLASS FileInformationClass); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetValueKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING ValueName, - IN ULONG TitleIndex OPTIONAL, - IN ULONG Type, - IN PVOID Data OPTIONAL, - IN ULONG DataSize); + _In_ HANDLE KeyHandle, + _In_ PUNICODE_STRING ValueName, + _In_opt_ ULONG TitleIndex, + _In_ ULONG Type, + _In_reads_bytes_opt_(DataSize) PVOID Data, + _In_ ULONG DataSize); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwUnloadDriver( - IN PUNICODE_STRING DriverServiceName); + _In_ PUNICODE_STRING DriverServiceName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwUnmapViewOfSection( - IN HANDLE ProcessHandle, - IN PVOID BaseAddress OPTIONAL); + _In_ HANDLE ProcessHandle, + _In_opt_ PVOID BaseAddress); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwWriteFile( - IN HANDLE FileHandle, - IN HANDLE Event OPTIONAL, - IN PIO_APC_ROUTINE ApcRoutine OPTIONAL, - IN PVOID ApcContext OPTIONAL, - OUT PIO_STATUS_BLOCK IoStatusBlock, - IN PVOID Buffer, - IN ULONG Length, - IN PLARGE_INTEGER ByteOffset OPTIONAL, - IN PULONG Key OPTIONAL); + _In_ HANDLE FileHandle, + _In_opt_ HANDLE Event, + _In_opt_ PIO_APC_ROUTINE ApcRoutine, + _In_opt_ PVOID ApcContext, + _Out_ PIO_STATUS_BLOCK IoStatusBlock, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length, + _In_opt_ PLARGE_INTEGER ByteOffset, + _In_opt_ PULONG Key); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwQueryFullAttributesFile( - IN POBJECT_ATTRIBUTES ObjectAttributes, - OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation); + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Out_ PFILE_NETWORK_OPEN_INFORMATION FileInformation); #endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */ #if (NTDDI_VERSION >= NTDDI_WS03) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwOpenEvent( - OUT PHANDLE EventHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes); + _Out_ PHANDLE EventHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes); #endif #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS ZwCreateKeyTransacted( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ULONG TitleIndex, - IN PUNICODE_STRING Class OPTIONAL, - IN ULONG CreateOptions, - IN HANDLE TransactionHandle, - OUT PULONG Disposition OPTIONAL); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _Reserved_ ULONG TitleIndex, + _In_opt_ PUNICODE_STRING Class, + _In_ ULONG CreateOptions, + _In_ HANDLE TransactionHandle, + _Out_opt_ PULONG Disposition); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenKeyTransacted( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN HANDLE TransactionHandle); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ HANDLE TransactionHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCreateTransactionManager( - 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); + _Out_ PHANDLE TmHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PUNICODE_STRING LogFileName, + _In_opt_ ULONG CreateOptions, + _In_opt_ ULONG CommitStrength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwOpenTransactionManager( - 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); + _Out_ PHANDLE TmHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ PUNICODE_STRING LogFileName, + _In_opt_ LPGUID TmIdentity, + _In_opt_ ULONG OpenOptions); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRollforwardTransactionManager( - IN HANDLE TransactionManagerHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE TransactionManagerHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRecoverTransactionManager( - IN HANDLE TransactionManagerHandle); + _In_ HANDLE TransactionManagerHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwQueryInformationTransactionManager( - IN HANDLE TransactionManagerHandle, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - OUT PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_ HANDLE TransactionManagerHandle, + _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation, + _In_ ULONG TransactionManagerInformationLength, + _Out_opt_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwSetInformationTransactionManager( - IN HANDLE TmHandle, - IN TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, - IN PVOID TransactionManagerInformation, - IN ULONG TransactionManagerInformationLength); + _In_ HANDLE TmHandle, + _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, + _In_ PVOID TransactionManagerInformation, + _In_ ULONG TransactionManagerInformationLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwEnumerateTransactionObject( - IN HANDLE RootObjectHandle OPTIONAL, - IN KTMOBJECT_TYPE QueryType, - IN OUT PKTMOBJECT_CURSOR ObjectCursor, - IN ULONG ObjectCursorLength, - OUT PULONG ReturnLength); + _In_opt_ HANDLE RootObjectHandle, + _In_ KTMOBJECT_TYPE QueryType, + _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor, + _In_ ULONG ObjectCursorLength, + _Out_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCreateTransaction( - 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); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ LPGUID Uow, + _In_opt_ HANDLE TmHandle, + _In_opt_ ULONG CreateOptions, + _In_opt_ ULONG IsolationLevel, + _In_opt_ ULONG IsolationFlags, + _In_opt_ PLARGE_INTEGER Timeout, + _In_opt_ PUNICODE_STRING Description); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwOpenTransaction( - OUT PHANDLE TransactionHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN LPGUID Uow, - IN HANDLE TmHandle OPTIONAL); + _Out_ PHANDLE TransactionHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ LPGUID Uow, + _In_opt_ HANDLE TmHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwQueryInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - OUT PVOID TransactionInformation, - IN ULONG TransactionInformationLength, - OUT PULONG ReturnLength OPTIONAL); + _In_ HANDLE TransactionHandle, + _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation, + _In_ ULONG TransactionInformationLength, + _Out_opt_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwSetInformationTransaction( - IN HANDLE TransactionHandle, - IN TRANSACTION_INFORMATION_CLASS TransactionInformationClass, - IN PVOID TransactionInformation, - IN ULONG TransactionInformationLength); + _In_ HANDLE TransactionHandle, + _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, + _In_ PVOID TransactionInformation, + _In_ ULONG TransactionInformationLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCommitTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRollbackTransaction( - IN HANDLE TransactionHandle, - IN BOOLEAN Wait); + _In_ HANDLE TransactionHandle, + _In_ BOOLEAN Wait); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCreateResourceManager( - OUT PHANDLE ResourceManagerHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE TmHandle, - IN LPGUID ResourceManagerGuid OPTIONAL, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN ULONG CreateOptions OPTIONAL, - IN PUNICODE_STRING Description OPTIONAL); + _Out_ PHANDLE ResourceManagerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE TmHandle, + _In_opt_ LPGUID ResourceManagerGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ ULONG CreateOptions, + _In_opt_ PUNICODE_STRING Description); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwOpenResourceManager( - OUT PHANDLE ResourceManagerHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE TmHandle, - IN LPGUID ResourceManagerGuid, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + _Out_ PHANDLE ResourceManagerHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE TmHandle, + _In_ LPGUID ResourceManagerGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRecoverResourceManager( - IN HANDLE ResourceManagerHandle); + _In_ HANDLE ResourceManagerHandle); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwGetNotificationResourceManager( - IN HANDLE ResourceManagerHandle, - OUT PTRANSACTION_NOTIFICATION TransactionNotification, - IN ULONG NotificationLength, - IN PLARGE_INTEGER Timeout, - IN PULONG ReturnLength OPTIONAL, - IN ULONG Asynchronous, - IN ULONG_PTR AsynchronousContext OPTIONAL); + _In_ HANDLE ResourceManagerHandle, + _Out_ PTRANSACTION_NOTIFICATION TransactionNotification, + _In_ ULONG NotificationLength, + _In_ PLARGE_INTEGER Timeout, + _Out_opt_ PULONG ReturnLength, + _In_ ULONG Asynchronous, + _In_opt_ ULONG_PTR AsynchronousContext); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwQueryInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - OUT PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength, - IN PULONG ReturnLength OPTIONAL); + _In_ HANDLE ResourceManagerHandle, + _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation, + _In_ ULONG ResourceManagerInformationLength, + _Out_opt_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwSetInformationResourceManager( - IN HANDLE ResourceManagerHandle, - IN RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, - IN PVOID ResourceManagerInformation, - IN ULONG ResourceManagerInformationLength); + _In_ HANDLE ResourceManagerHandle, + _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, + _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation, + _In_ ULONG ResourceManagerInformationLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCreateEnlistment( - 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); + _Out_ PHANDLE EnlistmentHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE ResourceManagerHandle, + _In_ HANDLE TransactionHandle, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_opt_ ULONG CreateOptions, + _In_ NOTIFICATION_MASK NotificationMask, + _In_opt_ PVOID EnlistmentKey); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwOpenEnlistment( - OUT PHANDLE EnlistmentHandle, - IN ACCESS_MASK DesiredAccess, - IN HANDLE RmHandle, - IN LPGUID EnlistmentGuid, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL); + _Out_ PHANDLE EnlistmentHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ HANDLE RmHandle, + _In_ LPGUID EnlistmentGuid, + _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwQueryInformationEnlistment( - IN HANDLE EnlistmentHandle, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - OUT PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength, - IN PULONG ReturnLength OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation, + _In_ ULONG EnlistmentInformationLength, + _Out_opt_ PULONG ReturnLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwSetInformationEnlistment( - IN HANDLE EnlistmentHandle, - IN ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, - IN PVOID EnlistmentInformation, - IN ULONG EnlistmentInformationLength); + _In_ HANDLE EnlistmentHandle, + _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, + _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation, + _In_ ULONG EnlistmentInformationLength); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRecoverEnlistment( - IN HANDLE EnlistmentHandle, - IN PVOID EnlistmentKey OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PVOID EnlistmentKey); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwPrePrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwPrepareEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCommitEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwRollbackEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwPrePrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwPrepareComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwCommitComplete( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSCALLAPI NTSTATUS NTAPI ZwReadOnlyEnlistment( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); NTSYSCALLAPI NTSTATUS @@ -16024,29 +17204,31 @@ NTSYSCALLAPI NTSTATUS NTAPI ZwSinglePhaseReject( - IN HANDLE EnlistmentHandle, - IN PLARGE_INTEGER TmVirtualClock OPTIONAL); + _In_ HANDLE EnlistmentHandle, + _In_opt_ PLARGE_INTEGER TmVirtualClock); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ #if (NTDDI_VERSION >= NTDDI_WIN7) +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenKeyEx( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ULONG OpenOptions); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ ULONG OpenOptions); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwOpenKeyTransactedEx( - OUT PHANDLE KeyHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN ULONG OpenOptions, - IN HANDLE TransactionHandle); + _Out_ PHANDLE KeyHandle, + _In_ ACCESS_MASK DesiredAccess, + _In_ POBJECT_ATTRIBUTES ObjectAttributes, + _In_ ULONG OpenOptions, + _In_ HANDLE TransactionHandle); NTSYSAPI NTSTATUS @@ -16076,21 +17258,23 @@ ZwQueryMultipleValueKey( IN OUT PULONG BufferLength, OUT PULONG RequiredBufferLength OPTIONAL); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwRenameKey( - IN HANDLE KeyHandle, - IN PUNICODE_STRING NewName); + _In_ HANDLE KeyHandle, + _In_ PUNICODE_STRING NewName); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSYSAPI NTSTATUS NTAPI ZwSetInformationKey( - IN HANDLE KeyHandle, - IN KEY_SET_INFORMATION_CLASS KeySetInformationClass, - IN PVOID KeySetInformation, - IN ULONG KeySetInformationLength); + _In_ HANDLE KeyHandle, + _In_ __drv_strictTypeMatch(__drv_typeConst) KEY_SET_INFORMATION_CLASS KeySetInformationClass, + _In_reads_bytes_(KeySetInformationLength) PVOID KeySetInformation, + _In_ ULONG KeySetInformationLength); #endif /* (NTDDI_VERSION >= NTDDI_WIN7) */ From 1cda28b92a2bb950c5b7b7be820c933240de1ff6 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 22 Jan 2012 15:17:55 +0000 Subject: [PATCH 027/289] [PSDK] * Missed this one. svn path=/trunk/; revision=55072 --- reactos/include/psdk/ntdef.h | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/reactos/include/psdk/ntdef.h b/reactos/include/psdk/ntdef.h index 9d99ccbe203..d301bdb18bc 100644 --- a/reactos/include/psdk/ntdef.h +++ b/reactos/include/psdk/ntdef.h @@ -353,7 +353,7 @@ typedef ULONG *PLOGICAL; /* Signed Types */ typedef SHORT *PSHORT; typedef LONG *PLONG; -typedef LONG NTSTATUS; +typedef _Return_type_success_(return >= 0) LONG NTSTATUS; typedef NTSTATUS *PNTSTATUS; typedef signed char SCHAR; typedef SCHAR *PSCHAR; @@ -381,8 +381,8 @@ typedef _Null_terminated_ CONST CHAR *LPCSTR, *PCSTR; typedef _Null_terminated_ PCSTR *PZPCSTR; /* Pointer to an Asciiz string */ -typedef CHAR *PSZ; -typedef CONST char *PCSZ; +typedef _Null_terminated_ CHAR *PSZ; +typedef _Null_terminated_ CONST char *PCSZ; /* UNICODE (Wide Character) types */ typedef wchar_t WCHAR; @@ -395,6 +395,7 @@ typedef _Null_terminated_ WCHAR UNALIGNED *LPUWSTR, *PUWSTR; typedef _Null_terminated_ CONST WCHAR *LPCWSTR, *PCWSTR; typedef _Null_terminated_ PCWSTR *PZPCWSTR; typedef _Null_terminated_ CONST WCHAR UNALIGNED *LPCUWSTR, *PCUWSTR; +typedef _NullNull_terminated_ WCHAR *PZZWSTR; /* Cardinal Data Types */ typedef char CCHAR, *PCCHAR; @@ -489,7 +490,10 @@ typedef struct _CSTRING { typedef struct _STRING { USHORT Length; USHORT MaximumLength; - PCHAR Buffer; +#ifdef MIDL_PASS + [size_is(MaximumLength), length_is(Length) ] +#endif + _Field_size_bytes_part_opt_(MaximumLength, Length) PCHAR Buffer; } STRING, *PSTRING; typedef STRING ANSI_STRING; @@ -617,12 +621,14 @@ typedef struct _PROCESSOR_NUMBER { struct _CONTEXT; struct _EXCEPTION_RECORD; +_IRQL_requires_same_ +_Function_class_(EXCEPTION_ROUTINE) typedef EXCEPTION_DISPOSITION (NTAPI *PEXCEPTION_ROUTINE)( - struct _EXCEPTION_RECORD *ExceptionRecord, - PVOID EstablisherFrame, - struct _CONTEXT *ContextRecord, - PVOID DispatcherContext); + _Inout_ struct _EXCEPTION_RECORD *ExceptionRecord, + _In_ PVOID EstablisherFrame, + _Inout_ struct _CONTEXT *ContextRecord, + _In_ PVOID DispatcherContext); typedef struct _GROUP_AFFINITY { KAFFINITY Mask; From 51772abf7495e6c2040285b5583b4e3e51c04980 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 22 Jan 2012 21:49:13 +0000 Subject: [PATCH 028/289] [PSDK} Add missing BYTE GAMMA_TABLES declaration svn path=/trunk/; revision=55078 --- reactos/include/psdk/winddi.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/include/psdk/winddi.h b/reactos/include/psdk/winddi.h index 36ca3c3217b..5c9f04bdecd 100644 --- a/reactos/include/psdk/winddi.h +++ b/reactos/include/psdk/winddi.h @@ -846,6 +846,8 @@ typedef struct _PATHOBJ { ULONG cCurves; } PATHOBJ; +typedef BYTE GAMMA_TABLES[2][256]; + typedef struct _GLYPHBITS { POINTL ptlOrigin; SIZEL sizlBitmap; From 51a64982dd171d1c9522454f1745171e89e6dc2a Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 22 Jan 2012 22:27:08 +0000 Subject: [PATCH 029/289] [kernel32] - Fix IntReadConsoleOutputCharacter to copy the correct count of characters. Its 3rd parameter is a character count and not buffer size. - Should fix infinite loop when kernel32:console test runs svn path=/trunk/; revision=55081 --- reactos/dll/win32/kernel32/client/file/console.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/reactos/dll/win32/kernel32/client/file/console.c b/reactos/dll/win32/kernel32/client/file/console.c index 040634345fe..d084cb9b1a4 100644 --- a/reactos/dll/win32/kernel32/client/file/console.c +++ b/reactos/dll/win32/kernel32/client/file/console.c @@ -2634,18 +2634,17 @@ IntReadConsoleOutputCharacter(HANDLE hConsoleOutput, PCSR_API_MESSAGE Request; ULONG CsrRequest; NTSTATUS Status; - ULONG nChars, SizeBytes, CharSize; + ULONG SizeBytes, CharSize; DWORD CharsRead = 0; CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); - nChars = min(nLength, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR) / CharSize; - SizeBytes = nChars * CharSize; + nLength = min(nLength, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR / CharSize); + SizeBytes = nLength * CharSize; Request = RtlAllocateHeap(RtlGetProcessHeap(), 0, max(sizeof(CSR_API_MESSAGE), - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) - + min (nChars, CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR / CharSize) * CharSize)); + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) + SizeBytes)); if (Request == NULL) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); @@ -2661,7 +2660,7 @@ IntReadConsoleOutputCharacter(HANDLE hConsoleOutput, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle = hConsoleOutput; Request->Data.ReadConsoleOutputCharRequest.Unicode = bUnicode; - Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead = min(nLength, nChars); + Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead = nLength; SizeBytes = Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead * CharSize; Status = CsrClientCallServer(Request, From 08b2762e84db975a69abf307b81bbcdca281f5df Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 23 Jan 2012 04:57:12 +0000 Subject: [PATCH 030/289] [KERNEL32]: Changes to proc.c: - ReadProcessMemory/WriteProcessMemory only write to *lpNumberOfBytesRead/Written if user-mode passed in the parameter, as its an optional argument in Win32, but not in NT. Instead, use a local variable. This means that anyone calling ReadProcessMemory/WriteProcessMemory in ReactOS before with a NULL output argument (totally valid) was getting an error before! - WriteProcessMemory actually returns STATUS_ACCESS_VIOLATION in a few cases, even if it's defined as a BOOL function. Code on Google shows major applications depending on this, which we weren't doing. - Rewrite InitCommandLines to be much simpler. No normalization or copying or ANSi/OEM logic is needed. - GetProcessAffinityMask should use the BaseStaticServerData from CSRSS instead of querying system information each time. - GetProcessShutdownParameters and SetProcessShutdownParameters should use the LPC status code from CSRSS, not the LPC API status code. - GetProcessWorkingSetSize now calls GetProcessWorkingSetSizeEx. - Implement GetProcessWorkingSetSizeEx. - SetProcessWorkingSetSize now calls SetProcessWorkingSetSizeEx. - Implement SetProcessWorkingSetSizeEx. - Acquire the required privilege in SetProcessWorkingSetSize(Ex). - Fail with correct status code in SetProcessWorkingSetSize(Ex). - GetExitCodeProcess should check if this is a VDM process and get the exit code that way. - GetStartupInfoW should not fail if the input is NULL. It should crash. - GetStartupInfoW was not filling out the lpReserved field, which should contain the ShellInfo buffer. - GetStartupInfoW was always setting standard handles -- it should not do so if those are console handles. - GetStartupInfoA was not thread-safe. - GetStartupInfoA was assuming all Unicode->ANSI conversions will be successful. - GetStartupInfoA was not filling out lpReserved either. - ExitProcess was not using SEH and was not using the PEB lock. - TerminateProcess was not setting ERROR_INVALID_HANDLE last error code. - FatalAppExitA was not using static TEB buffer, and was always assuming success. - FatalAppExitW was doing some sort of bizarre hack. It now raises as a hard error as it should. - FatalExit now displays a debugger input interface on checked builds, just like Windows. - SetPriorityClass now tries to acquire the real time privilege when needed, and handles failure to do so. - GetProcessVersion rewritten to be cleaner and simpler. - Annotate and reformat functions where needed. - Rename lpfnGlobalRegisterWaitForInputIdle to UserWaitForInputIdleRoutine - GetProcessPriorityBoost is now BOOL-safe. - IsWow64Process now sets NT error code using only one API. - CommandLineStringA/W -> BaseAnsiCommandLine/BaseUnicodeCommandLine. svn path=/trunk/; revision=55092 --- reactos/dll/win32/kernel32/client/loader.c | 4 +- reactos/dll/win32/kernel32/client/proc.c | 1120 +++++++++-------- reactos/dll/win32/kernel32/include/kernel32.h | 9 +- reactos/include/ndk/extypes.h | 3 +- 4 files changed, 636 insertions(+), 500 deletions(-) diff --git a/reactos/dll/win32/kernel32/client/loader.c b/reactos/dll/win32/kernel32/client/loader.c index 66d0041e7c4..0244f9eec63 100644 --- a/reactos/dll/win32/kernel32/client/loader.c +++ b/reactos/dll/win32/kernel32/client/loader.c @@ -1026,9 +1026,9 @@ LoadModule(LPCSTR lpModuleName, } /* Wait up to 30 seconds for the process to become idle */ - if (lpfnGlobalRegisterWaitForInputIdle) + if (UserWaitForInputIdleRoutine) { - lpfnGlobalRegisterWaitForInputIdle(ProcessInformation.hProcess, 30000); + UserWaitForInputIdleRoutine(ProcessInformation.hProcess, 30000); } /* Close handles */ diff --git a/reactos/dll/win32/kernel32/client/proc.c b/reactos/dll/win32/kernel32/client/proc.c index 0438eb15dc9..a50330c453c 100644 --- a/reactos/dll/win32/kernel32/client/proc.c +++ b/reactos/dll/win32/kernel32/client/proc.c @@ -16,39 +16,20 @@ #define NDEBUG #include -typedef INT (WINAPI *MessageBoxW_Proc) (HWND, LPCWSTR, LPCWSTR, UINT); - /* GLOBALS *******************************************************************/ -static UNICODE_STRING CommandLineStringW; -static ANSI_STRING CommandLineStringA; +WaitForInputIdleType UserWaitForInputIdleRoutine; +UNICODE_STRING BaseUnicodeCommandLine; +ANSI_STRING BaseAnsiCommandLine; UNICODE_STRING BasePathVariableName = RTL_CONSTANT_STRING(L"PATH"); - -static BOOL bCommandLineInitialized = FALSE; - -WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle; - -LPSTARTUPINFOA lpLocalStartupInfo = NULL; - -VOID WINAPI -RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle); - +LPSTARTUPINFOA BaseAnsiStartupInfo = NULL; PLDR_DATA_TABLE_ENTRY BasepExeLdrEntry; - -#define CMD_STRING L"cmd /c " - -extern __declspec(noreturn) -VOID -CALLBACK -ConsoleControlDispatcher(DWORD CodeAndFlag); - BOOLEAN g_AppCertInitialized; BOOLEAN g_HaveAppCerts; LIST_ENTRY BasepAppCertDllsList; RTL_CRITICAL_SECTION gcsAppCert; PBASEP_APPCERT_EMBEDDED_FUNC fEmbeddedCertFunc; NTSTATUS g_AppCertStatus; - RTL_QUERY_REGISTRY_TABLE BasepAppCertTable[2] = { { @@ -65,6 +46,11 @@ RTL_QUERY_REGISTRY_TABLE BasepAppCertTable[2] = PSAFER_REPLACE_PROCESS_THREAD_TOKENS g_SaferReplaceProcessThreadTokens; HMODULE gSaferHandle = (HMODULE)-1; +VOID WINAPI +RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle); + +#define CMD_STRING L"cmd /c " + /* FUNCTIONS ****************************************************************/ VOID @@ -1128,68 +1114,33 @@ VOID WINAPI InitCommandLines(VOID) { - PRTL_USER_PROCESS_PARAMETERS Params; + NTSTATUS Status; - /* get command line */ - Params = NtCurrentPeb()->ProcessParameters; - RtlNormalizeProcessParams (Params); + /* Read the UNICODE_STRING from the PEB */ + BaseUnicodeCommandLine = NtCurrentPeb()->ProcessParameters->CommandLine; - /* initialize command line buffers */ - CommandLineStringW.Length = Params->CommandLine.Length; - CommandLineStringW.MaximumLength = CommandLineStringW.Length + sizeof(WCHAR); - CommandLineStringW.Buffer = RtlAllocateHeap(GetProcessHeap(), - HEAP_GENERATE_EXCEPTIONS | HEAP_ZERO_MEMORY, - CommandLineStringW.MaximumLength); - if (CommandLineStringW.Buffer == NULL) - { - return; - } - - RtlInitAnsiString(&CommandLineStringA, NULL); - - /* Copy command line */ - RtlCopyUnicodeString(&CommandLineStringW, - &(Params->CommandLine)); - CommandLineStringW.Buffer[CommandLineStringW.Length / sizeof(WCHAR)] = 0; - - /* convert unicode string to ansi (or oem) */ - if (bIsFileApiAnsi) - RtlUnicodeStringToAnsiString(&CommandLineStringA, - &CommandLineStringW, - TRUE); - else - RtlUnicodeStringToOemString(&CommandLineStringA, - &CommandLineStringW, - TRUE); - - CommandLineStringA.Buffer[CommandLineStringA.Length] = 0; - - bCommandLineInitialized = TRUE; + /* Convert to ANSI_STRING for the *A callers */ + Status = RtlUnicodeStringToAnsiString(&BaseAnsiCommandLine, + &BaseUnicodeCommandLine, + TRUE); + if (!NT_SUCCESS(Status)) RtlInitEmptyAnsiString(&BaseAnsiCommandLine, 0, 0); } +/* PUBLIC FUNCTIONS ***********************************************************/ + /* * @implemented */ BOOL WINAPI -GetProcessAffinityMask(HANDLE hProcess, - PDWORD_PTR lpProcessAffinityMask, - PDWORD_PTR lpSystemAffinityMask) +GetProcessAffinityMask(IN HANDLE hProcess, + OUT PDWORD_PTR lpProcessAffinityMask, + OUT PDWORD_PTR lpSystemAffinityMask) { PROCESS_BASIC_INFORMATION ProcessInfo; - SYSTEM_BASIC_INFORMATION SystemInfo; NTSTATUS Status; - Status = NtQuerySystemInformation(SystemBasicInformation, - &SystemInfo, - sizeof(SystemInfo), - NULL); - if (!NT_SUCCESS(Status)) - { - BaseSetLastNTError(Status); - return FALSE; - } - + /* Query information on the process from the kernel */ Status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, (PVOID)&ProcessInfo, @@ -1197,174 +1148,237 @@ GetProcessAffinityMask(HANDLE hProcess, NULL); if (!NT_SUCCESS(Status)) { + /* Fail */ BaseSetLastNTError(Status); return FALSE; } + /* Copy the affinity mask, and get the system one from our shared data */ *lpProcessAffinityMask = (DWORD)ProcessInfo.AffinityMask; - *lpSystemAffinityMask = (DWORD)SystemInfo.ActiveProcessorsAffinityMask; - + *lpSystemAffinityMask = (DWORD)BaseStaticServerData->SysInfo.ActiveProcessorsAffinityMask; return TRUE; } - /* * @implemented */ BOOL WINAPI -SetProcessAffinityMask(HANDLE hProcess, - DWORD_PTR dwProcessAffinityMask) +SetProcessAffinityMask(IN HANDLE hProcess, + IN DWORD_PTR dwProcessAffinityMask) { NTSTATUS Status; + /* Directly set the affinity mask */ Status = NtSetInformationProcess(hProcess, ProcessAffinityMask, (PVOID)&dwProcessAffinityMask, sizeof(DWORD)); if (!NT_SUCCESS(Status)) { + /* Handle failure */ BaseSetLastNTError(Status); return FALSE; } + /* Everything was ok */ return TRUE; } - /* * @implemented */ BOOL WINAPI -GetProcessShutdownParameters(LPDWORD lpdwLevel, - LPDWORD lpdwFlags) +GetProcessShutdownParameters(OUT LPDWORD lpdwLevel, + OUT LPDWORD lpdwFlags) { CSR_API_MESSAGE CsrRequest; - ULONG Request; NTSTATUS Status; - Request = GET_SHUTDOWN_PARAMETERS; + /* Ask CSRSS for shutdown information */ Status = CsrClientCallServer(&CsrRequest, NULL, - MAKE_CSR_API(Request, CSR_NATIVE), + MAKE_CSR_API(GET_SHUTDOWN_PARAMETERS, CSR_NATIVE), sizeof(CSR_API_MESSAGE)); - if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status)) + if (!(NT_SUCCESS(Status)) || !(NT_SUCCESS(CsrRequest.Status))) { - BaseSetLastNTError(Status); + /* Return the failure from CSRSS */ + BaseSetLastNTError(CsrRequest.Status); return FALSE; } + /* Get the data out of the LCP reply */ *lpdwLevel = CsrRequest.Data.GetShutdownParametersRequest.Level; *lpdwFlags = CsrRequest.Data.GetShutdownParametersRequest.Flags; - return TRUE; } - /* * @implemented */ BOOL WINAPI -SetProcessShutdownParameters(DWORD dwLevel, - DWORD dwFlags) +SetProcessShutdownParameters(IN DWORD dwLevel, + IN DWORD dwFlags) { CSR_API_MESSAGE CsrRequest; - ULONG Request; NTSTATUS Status; + /* Write the data into the CSRSS request and send it */ CsrRequest.Data.SetShutdownParametersRequest.Level = dwLevel; CsrRequest.Data.SetShutdownParametersRequest.Flags = dwFlags; - - Request = SET_SHUTDOWN_PARAMETERS; Status = CsrClientCallServer(&CsrRequest, NULL, - MAKE_CSR_API(Request, CSR_NATIVE), + MAKE_CSR_API(SET_SHUTDOWN_PARAMETERS, CSR_NATIVE), sizeof(CSR_API_MESSAGE)); if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status)) { - BaseSetLastNTError(Status); + /* Return the failure from CSRSS */ + BaseSetLastNTError(CsrRequest.Status); return FALSE; } + /* All went well */ return TRUE; } - /* * @implemented */ BOOL WINAPI -GetProcessWorkingSetSize(HANDLE hProcess, - PSIZE_T lpMinimumWorkingSetSize, - PSIZE_T lpMaximumWorkingSetSize) +GetProcessWorkingSetSizeEx(IN HANDLE hProcess, + OUT PSIZE_T lpMinimumWorkingSetSize, + OUT PSIZE_T lpMaximumWorkingSetSize, + OUT PDWORD Flags) { - QUOTA_LIMITS QuotaLimits; + QUOTA_LIMITS_EX QuotaLimits; NTSTATUS Status; + /* Query the kernel about this */ Status = NtQueryInformationProcess(hProcess, ProcessQuotaLimits, &QuotaLimits, - sizeof(QUOTA_LIMITS), + sizeof(QUOTA_LIMITS_EX), NULL); if (!NT_SUCCESS(Status)) { + /* Return error */ BaseSetLastNTError(Status); return FALSE; } + /* Copy the quota information out */ *lpMinimumWorkingSetSize = QuotaLimits.MinimumWorkingSetSize; *lpMaximumWorkingSetSize = QuotaLimits.MaximumWorkingSetSize; - + *Flags = QuotaLimits.Flags; return TRUE; } - /* * @implemented */ BOOL WINAPI -SetProcessWorkingSetSize(HANDLE hProcess, - SIZE_T dwMinimumWorkingSetSize, - SIZE_T dwMaximumWorkingSetSize) +GetProcessWorkingSetSize(IN HANDLE hProcess, + OUT PSIZE_T lpMinimumWorkingSetSize, + OUT PSIZE_T lpMaximumWorkingSetSize) { - QUOTA_LIMITS QuotaLimits; - NTSTATUS Status; + DWORD Dummy; + return GetProcessWorkingSetSizeEx(hProcess, + lpMinimumWorkingSetSize, + lpMaximumWorkingSetSize, + &Dummy); +} - QuotaLimits.MinimumWorkingSetSize = dwMinimumWorkingSetSize; - QuotaLimits.MaximumWorkingSetSize = dwMaximumWorkingSetSize; +/* + * @implemented + */ +BOOL +WINAPI +SetProcessWorkingSetSizeEx(IN HANDLE hProcess, + IN SIZE_T dwMinimumWorkingSetSize, + IN SIZE_T dwMaximumWorkingSetSize, + IN DWORD Flags) +{ + QUOTA_LIMITS_EX QuotaLimits; + NTSTATUS Status, ReturnStatus; + BOOL Result; + PVOID State; + ULONG Privilege = SE_INC_BASE_PRIORITY_PRIVILEGE; - Status = NtSetInformationProcess(hProcess, - ProcessQuotaLimits, - &QuotaLimits, - sizeof(QUOTA_LIMITS)); - if (!NT_SUCCESS(Status)) + /* Zero out the input structure */ + RtlZeroMemory(&QuotaLimits, sizeof(QuotaLimits)); + + /* Check if the caller sent any limits */ + if ((dwMinimumWorkingSetSize) && (dwMaximumWorkingSetSize)) { - BaseSetLastNTError(Status); - return FALSE; + /* Write the quota information */ + QuotaLimits.MinimumWorkingSetSize = dwMinimumWorkingSetSize; + QuotaLimits.MaximumWorkingSetSize = dwMaximumWorkingSetSize; + QuotaLimits.Flags = Flags; + + /* Acquire the required privilege */ + Status = RtlAcquirePrivilege(&Privilege, 1, 0, &State); + + /* Request the new quotas */ + ReturnStatus = NtSetInformationProcess(hProcess, + ProcessQuotaLimits, + &QuotaLimits, + sizeof(QuotaLimits)); + Result = NT_SUCCESS(ReturnStatus); + if (NT_SUCCESS(Status)) + { + /* Release the privilege and set succes code */ + ASSERT(State != NULL); + RtlReleasePrivilege(State); + State = NULL; + } + } + else + { + /* No limits, fail the call */ + ReturnStatus = STATUS_INVALID_PARAMETER; + Result = FALSE; } - return TRUE; + /* Return result code, set error code if this was a failure */ + if (!Result) BaseSetLastNTError(ReturnStatus); + return Result; } - /* * @implemented */ BOOL WINAPI -GetProcessTimes(HANDLE hProcess, - LPFILETIME lpCreationTime, - LPFILETIME lpExitTime, - LPFILETIME lpKernelTime, - LPFILETIME lpUserTime) +SetProcessWorkingSetSize(IN HANDLE hProcess, + IN SIZE_T dwMinimumWorkingSetSize, + IN SIZE_T dwMaximumWorkingSetSize) +{ + /* Call the newer API */ + return SetProcessWorkingSetSizeEx(hProcess, + dwMinimumWorkingSetSize, + dwMaximumWorkingSetSize, + 0); +} + +/* + * @implemented + */ +BOOL +WINAPI +GetProcessTimes(IN HANDLE hProcess, + IN LPFILETIME lpCreationTime, + IN LPFILETIME lpExitTime, + IN LPFILETIME lpKernelTime, + IN LPFILETIME lpUserTime) { KERNEL_USER_TIMES Kut; NTSTATUS Status; + /* Query the times */ Status = NtQueryInformationProcess(hProcess, ProcessTimes, &Kut, @@ -1372,26 +1386,23 @@ GetProcessTimes(HANDLE hProcess, NULL); if (!NT_SUCCESS(Status)) { + /* Handle failure */ BaseSetLastNTError(Status); return FALSE; } + /* Copy all the times and return success */ lpCreationTime->dwLowDateTime = Kut.CreateTime.u.LowPart; lpCreationTime->dwHighDateTime = Kut.CreateTime.u.HighPart; - lpExitTime->dwLowDateTime = Kut.ExitTime.u.LowPart; lpExitTime->dwHighDateTime = Kut.ExitTime.u.HighPart; - lpKernelTime->dwLowDateTime = Kut.KernelTime.u.LowPart; lpKernelTime->dwHighDateTime = Kut.KernelTime.u.HighPart; - lpUserTime->dwLowDateTime = Kut.UserTime.u.LowPart; lpUserTime->dwHighDateTime = Kut.UserTime.u.HighPart; - return TRUE; } - /* * @implemented */ @@ -1402,7 +1413,6 @@ GetCurrentProcess(VOID) return (HANDLE)NtCurrentProcess(); } - /* * @implemented */ @@ -1413,7 +1423,6 @@ GetCurrentThread(VOID) return (HANDLE)NtCurrentThread(); } - /* * @implemented */ @@ -1421,21 +1430,21 @@ DWORD WINAPI GetCurrentProcessId(VOID) { - return HandleToUlong(GetTeb()->ClientId.UniqueProcess); + return HandleToUlong(NtCurrentTeb()->ClientId.UniqueProcess); } - /* * @implemented */ BOOL WINAPI -GetExitCodeProcess(HANDLE hProcess, - LPDWORD lpExitCode) +GetExitCodeProcess(IN HANDLE hProcess, + IN LPDWORD lpExitCode) { PROCESS_BASIC_INFORMATION ProcessBasic; NTSTATUS Status; + /* Ask the kernel */ Status = NtQueryInformationProcess(hProcess, ProcessBasicInformation, &ProcessBasic, @@ -1443,26 +1452,30 @@ GetExitCodeProcess(HANDLE hProcess, NULL); if (!NT_SUCCESS(Status)) { + /* We failed, was this because this is a VDM process? */ + if (BaseCheckForVDM(hProcess, lpExitCode) == TRUE) return TRUE; + + /* Not a VDM process, fail the call */ BaseSetLastNTError(Status); return FALSE; } + /* Succes case, return the exit code */ *lpExitCode = (DWORD)ProcessBasic.ExitStatus; - return TRUE; } - /* * @implemented */ DWORD WINAPI -GetProcessId(HANDLE Process) +GetProcessId(IN HANDLE Process) { PROCESS_BASIC_INFORMATION ProcessBasic; NTSTATUS Status; + /* Query the kernel */ Status = NtQueryInformationProcess(Process, ProcessBasicInformation, &ProcessBasic, @@ -1470,105 +1483,65 @@ GetProcessId(HANDLE Process) NULL); if (!NT_SUCCESS(Status)) { + /* Handle failure */ BaseSetLastNTError(Status); return 0; } + /* Return the PID */ return (DWORD)ProcessBasic.UniqueProcessId; } - /* * @implemented */ HANDLE WINAPI -OpenProcess(DWORD dwDesiredAccess, - BOOL bInheritHandle, - DWORD dwProcessId) +OpenProcess(IN DWORD dwDesiredAccess, + IN BOOL bInheritHandle, + IN DWORD dwProcessId) { - NTSTATUS errCode; + NTSTATUS Status; HANDLE ProcessHandle; OBJECT_ATTRIBUTES ObjectAttributes; CLIENT_ID ClientId; + /* Setup the input client ID structure */ ClientId.UniqueProcess = UlongToHandle(dwProcessId); ClientId.UniqueThread = 0; + /* This is needed just to define the inheritance flags */ InitializeObjectAttributes(&ObjectAttributes, NULL, (bInheritHandle ? OBJ_INHERIT : 0), NULL, NULL); - errCode = NtOpenProcess(&ProcessHandle, - dwDesiredAccess, - &ObjectAttributes, - &ClientId); - if (!NT_SUCCESS(errCode)) + /* Now try to open the process */ + Status = NtOpenProcess(&ProcessHandle, + dwDesiredAccess, + &ObjectAttributes, + &ClientId); + if (!NT_SUCCESS(Status)) { - BaseSetLastNTError(errCode); + /* Handle failure */ + BaseSetLastNTError(Status); return NULL; } + /* Otherwise return a handle to the process */ return ProcessHandle; } - -/* - * @implemented - */ -UINT -WINAPI -WinExec(LPCSTR lpCmdLine, - UINT uCmdShow) -{ - STARTUPINFOA StartupInfo; - PROCESS_INFORMATION ProcessInformation; - DWORD dosErr; - - RtlZeroMemory(&StartupInfo, sizeof(StartupInfo)); - StartupInfo.cb = sizeof(STARTUPINFOA); - StartupInfo.wShowWindow = (WORD)uCmdShow; - StartupInfo.dwFlags = 0; - - if (!CreateProcessA(NULL, - (PVOID)lpCmdLine, - NULL, - NULL, - FALSE, - 0, - NULL, - NULL, - &StartupInfo, - &ProcessInformation)) - { - dosErr = GetLastError(); - return dosErr < 32 ? dosErr : ERROR_BAD_FORMAT; - } - - if (NULL != lpfnGlobalRegisterWaitForInputIdle) - { - lpfnGlobalRegisterWaitForInputIdle(ProcessInformation.hProcess, - 10000); - } - - NtClose(ProcessInformation.hProcess); - NtClose(ProcessInformation.hThread); - - return 33; /* Something bigger than 31 means success. */ -} - - /* * @implemented */ VOID WINAPI -RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle) +RegisterWaitForInputIdle(IN WaitForInputIdleType lpfnRegisterWaitForInputIdle) { - lpfnGlobalRegisterWaitForInputIdle = lpfnRegisterWaitForInputIdle; - return; + /* Write the global function pointer */ + UserWaitForInputIdleRoutine = lpfnRegisterWaitForInputIdle; } /* @@ -1576,19 +1549,16 @@ RegisterWaitForInputIdle(WaitForInputIdleType lpfnRegisterWaitForInputIdle) */ VOID WINAPI -GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo) +GetStartupInfoW(IN LPSTARTUPINFOW lpStartupInfo) { PRTL_USER_PROCESS_PARAMETERS Params; - if (lpStartupInfo == NULL) - { - SetLastError(ERROR_INVALID_PARAMETER); - return; - } - + /* Get the process parameters */ Params = NtCurrentPeb()->ProcessParameters; + /* Copy the data out of there */ lpStartupInfo->cb = sizeof(STARTUPINFOW); + lpStartupInfo->lpReserved = Params->ShellInfo.Buffer; lpStartupInfo->lpDesktop = Params->DesktopInfo.Buffer; lpStartupInfo->lpTitle = Params->WindowTitle.Buffer; lpStartupInfo->dwX = Params->StartingX; @@ -1603,298 +1573,393 @@ GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo) lpStartupInfo->cbReserved2 = Params->RuntimeData.Length; lpStartupInfo->lpReserved2 = (LPBYTE)Params->RuntimeData.Buffer; - lpStartupInfo->hStdInput = Params->StandardInput; - lpStartupInfo->hStdOutput = Params->StandardOutput; - lpStartupInfo->hStdError = Params->StandardError; + /* Check if the standard handles are being used for other features */ + if (lpStartupInfo->dwFlags & (STARTF_USESTDHANDLES | + STARTF_USEHOTKEY | + STARTF_SHELLPRIVATE)) + { + /* These are, so copy the standard handles too */ + lpStartupInfo->hStdInput = Params->StandardInput; + lpStartupInfo->hStdOutput = Params->StandardOutput; + lpStartupInfo->hStdError = Params->StandardError; + } } - /* * @implemented */ VOID WINAPI -GetStartupInfoA(LPSTARTUPINFOA lpStartupInfo) +GetStartupInfoA(IN LPSTARTUPINFOA lpStartupInfo) { PRTL_USER_PROCESS_PARAMETERS Params; - ANSI_STRING AnsiString; + ANSI_STRING TitleString, ShellString, DesktopString; + LPSTARTUPINFOA StartupInfo; + NTSTATUS Status; - if (lpStartupInfo == NULL) + /* Get the cached information as well as the PEB parameters */ + StartupInfo = BaseAnsiStartupInfo; + Params = NtCurrentPeb()->ProcessParameters; + + /* Check if this is the first time we have to get the cached version */ + while (!StartupInfo) { - SetLastError(ERROR_INVALID_PARAMETER); - return; - } - - Params = NtCurrentPeb ()->ProcessParameters; - - RtlAcquirePebLock (); - - /* FIXME - not thread-safe */ - if (lpLocalStartupInfo == NULL) - { - /* create new local startup info (ansi) */ - lpLocalStartupInfo = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - sizeof(STARTUPINFOA)); - if (lpLocalStartupInfo == NULL) + /* Create new ANSI startup info */ + StartupInfo = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + sizeof(*StartupInfo)); + if (StartupInfo) { - RtlReleasePebLock(); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return; + /* Zero out string pointers in case we fail to create them */ + StartupInfo->lpReserved = 0; + StartupInfo->lpDesktop = 0; + StartupInfo->lpTitle = 0; + + /* Set the size */ + StartupInfo->cb = sizeof(*StartupInfo); + + /* Copy what's already stored in the PEB */ + StartupInfo->dwX = Params->StartingX; + StartupInfo->dwY = Params->StartingY; + StartupInfo->dwXSize = Params->CountX; + StartupInfo->dwYSize = Params->CountY; + StartupInfo->dwXCountChars = Params->CountCharsX; + StartupInfo->dwYCountChars = Params->CountCharsY; + StartupInfo->dwFillAttribute = Params->FillAttribute; + StartupInfo->dwFlags = Params->WindowFlags; + StartupInfo->wShowWindow = (WORD)Params->ShowWindowFlags; + StartupInfo->cbReserved2 = Params->RuntimeData.Length; + StartupInfo->lpReserved2 = (LPBYTE)Params->RuntimeData.Buffer; + StartupInfo->hStdInput = Params->StandardInput; + StartupInfo->hStdOutput = Params->StandardOutput; + StartupInfo->hStdError = Params->StandardError; + + /* Copy shell info string */ + Status = RtlUnicodeStringToAnsiString(&ShellString, + &Params->ShellInfo, + TRUE); + if (NT_SUCCESS(Status)) + { + /* Save it */ + StartupInfo->lpReserved = ShellString.Buffer; + + /* Copy desktop info string */ + Status = RtlUnicodeStringToAnsiString(&DesktopString, + &Params->DesktopInfo, + TRUE); + if (NT_SUCCESS(Status)) + { + /* Save it */ + StartupInfo->lpDesktop = DesktopString.Buffer; + + /* Copy window title string */ + Status = RtlUnicodeStringToAnsiString(&TitleString, + &Params->WindowTitle, + TRUE); + if (NT_SUCCESS(Status)) + { + /* Save it */ + StartupInfo->lpReserved = TitleString.Buffer; + + /* We finished with the ANSI version, try to cache it */ + if (!InterlockedCompareExchangePointer(&BaseAnsiStartupInfo, + StartupInfo, + NULL)) + { + /* We were the first thread through, use the data */ + break; + } + + /* Someone beat us to it, use their data instead */ + StartupInfo = BaseAnsiStartupInfo; + Status = STATUS_SUCCESS; + + /* We're going to free our own stuff, but not raise */ + RtlFreeAnsiString(&TitleString); + } + RtlFreeAnsiString(&DesktopString); + } + RtlFreeAnsiString(&ShellString); + } + RtlFreeHeap(RtlGetProcessHeap(), 0, StartupInfo); + } + else + { + /* No memory, fail */ + Status = STATUS_NO_MEMORY; } - lpLocalStartupInfo->cb = sizeof(STARTUPINFOA); - - /* copy window title string */ - RtlUnicodeStringToAnsiString(&AnsiString, - &Params->WindowTitle, - TRUE); - lpLocalStartupInfo->lpTitle = AnsiString.Buffer; - - /* copy desktop info string */ - RtlUnicodeStringToAnsiString(&AnsiString, - &Params->DesktopInfo, - TRUE); - lpLocalStartupInfo->lpDesktop = AnsiString.Buffer; - - /* copy shell info string */ - RtlUnicodeStringToAnsiString(&AnsiString, - &Params->ShellInfo, - TRUE); - lpLocalStartupInfo->lpReserved = AnsiString.Buffer; - - lpLocalStartupInfo->dwX = Params->StartingX; - lpLocalStartupInfo->dwY = Params->StartingY; - lpLocalStartupInfo->dwXSize = Params->CountX; - lpLocalStartupInfo->dwYSize = Params->CountY; - lpLocalStartupInfo->dwXCountChars = Params->CountCharsX; - lpLocalStartupInfo->dwYCountChars = Params->CountCharsY; - lpLocalStartupInfo->dwFillAttribute = Params->FillAttribute; - lpLocalStartupInfo->dwFlags = Params->WindowFlags; - lpLocalStartupInfo->wShowWindow = (WORD)Params->ShowWindowFlags; - lpLocalStartupInfo->cbReserved2 = Params->RuntimeData.Length; - lpLocalStartupInfo->lpReserved2 = (LPBYTE)Params->RuntimeData.Buffer; - - lpLocalStartupInfo->hStdInput = Params->StandardInput; - lpLocalStartupInfo->hStdOutput = Params->StandardOutput; - lpLocalStartupInfo->hStdError = Params->StandardError; + /* Raise an error unless we got here due to the race condition */ + if (!NT_SUCCESS(Status)) RtlRaiseStatus(Status); } - RtlReleasePebLock(); + /* Now copy from the cached ANSI version */ + lpStartupInfo->cb = StartupInfo->cb; + lpStartupInfo->lpReserved = StartupInfo->lpReserved; + lpStartupInfo->lpDesktop = StartupInfo->lpDesktop; + lpStartupInfo->lpTitle = StartupInfo->lpTitle; + lpStartupInfo->dwX = StartupInfo->dwX; + lpStartupInfo->dwY = StartupInfo->dwY; + lpStartupInfo->dwXSize = StartupInfo->dwXSize; + lpStartupInfo->dwYSize = StartupInfo->dwYSize; + lpStartupInfo->dwXCountChars = StartupInfo->dwXCountChars; + lpStartupInfo->dwYCountChars = StartupInfo->dwYCountChars; + lpStartupInfo->dwFillAttribute = StartupInfo->dwFillAttribute; + lpStartupInfo->dwFlags = StartupInfo->dwFlags; + lpStartupInfo->wShowWindow = StartupInfo->wShowWindow; + lpStartupInfo->cbReserved2 = StartupInfo->cbReserved2; + lpStartupInfo->lpReserved2 = StartupInfo->lpReserved2; - /* copy local startup info data to external startup info */ - memcpy(lpStartupInfo, - lpLocalStartupInfo, - sizeof(STARTUPINFOA)); + /* Check if the shell is hijacking the handles for other features */ + if (lpStartupInfo->dwFlags & + (STARTF_USESTDHANDLES | STARTF_USEHOTKEY | STARTF_SHELLPRIVATE)) + { + /* It isn't, so we can return the raw values */ + lpStartupInfo->hStdInput = StartupInfo->hStdInput; + lpStartupInfo->hStdOutput = StartupInfo->hStdOutput; + lpStartupInfo->hStdError = StartupInfo->hStdError; + } + else + { + /* It is, so make sure nobody uses these as console handles */ + lpStartupInfo->hStdInput = INVALID_HANDLE_VALUE; + lpStartupInfo->hStdOutput = INVALID_HANDLE_VALUE; + lpStartupInfo->hStdError = INVALID_HANDLE_VALUE; + } } - /* * @implemented */ BOOL WINAPI -FlushInstructionCache(HANDLE hProcess, - LPCVOID lpBaseAddress, - SIZE_T dwSize) +FlushInstructionCache(IN HANDLE hProcess, + IN LPCVOID lpBaseAddress, + IN SIZE_T dwSize) { NTSTATUS Status; - Status = NtFlushInstructionCache(hProcess, - (PVOID)lpBaseAddress, - dwSize); + /* Call the native function */ + Status = NtFlushInstructionCache(hProcess, (PVOID)lpBaseAddress, dwSize); if (!NT_SUCCESS(Status)) { + /* Handle failure case */ BaseSetLastNTError(Status); return FALSE; } + /* All good */ return TRUE; } - /* * @implemented */ VOID WINAPI -ExitProcess(UINT uExitCode) +ExitProcess(IN UINT uExitCode) { CSR_API_MESSAGE CsrRequest; - ULONG Request; - NTSTATUS Status; + ASSERT(!BaseRunningInServerProcess); - /* kill sibling threads ... we want to be alone at this point */ - NtTerminateProcess(NULL, 0); - - /* unload all dll's */ - LdrShutdownProcess(); - - /* notify csrss of process termination */ - Request = TERMINATE_PROCESS; - Status = CsrClientCallServer(&CsrRequest, - NULL, - MAKE_CSR_API(Request, CSR_NATIVE), - sizeof(CSR_API_MESSAGE)); - if (!NT_SUCCESS(Status) || !NT_SUCCESS(CsrRequest.Status)) + _SEH2_TRY { - DPRINT("Failed to tell csrss about terminating process\n"); - } + /* Acquire the PEB lock */ + RtlAcquirePebLock(); - NtTerminateProcess(NtCurrentProcess (), - uExitCode); + /* Kill all the threads */ + NtTerminateProcess(NULL, 0); + + /* Unload all DLLs */ + LdrShutdownProcess(); + + /* Notify Base Server of process termination */ + CsrClientCallServer(&CsrRequest, + NULL, + MAKE_CSR_API(TERMINATE_PROCESS, CSR_NATIVE), + sizeof(CSR_API_MESSAGE)); + + /* Now do it again */ + NtTerminateProcess(NtCurrentProcess(), uExitCode); + } + _SEH2_FINALLY + { + /* Release the PEB lock */ + RtlReleasePebLock(); + } + _SEH2_END; /* should never get here */ ASSERT(0); while(1); } - /* * @implemented */ BOOL WINAPI -TerminateProcess(HANDLE hProcess, - UINT uExitCode) +TerminateProcess(IN HANDLE hProcess, + IN UINT uExitCode) { NTSTATUS Status; - if (hProcess == NULL) + /* Check if no handle was passed in */ + if (!hProcess) { - return FALSE; + /* Set error code */ + SetLastError(ERROR_INVALID_HANDLE); + } + else + { + /* Otherwise, try to terminate the process */ + Status = NtTerminateProcess(hProcess, uExitCode); + if (NT_SUCCESS(Status)) return TRUE; + + /* It failed, convert error code */ + BaseSetLastNTError(Status); } - Status = NtTerminateProcess(hProcess, uExitCode); - if (NT_SUCCESS(Status)) - { - return TRUE; - } - - BaseSetLastNTError(Status); + /* This is the failure path */ return FALSE; } - /* - * @unimplemented + * @implemented */ VOID WINAPI FatalAppExitA(UINT uAction, LPCSTR lpMessageText) { - UNICODE_STRING MessageTextU; + PUNICODE_STRING MessageTextU; ANSI_STRING MessageText; + NTSTATUS Status; + /* Initialize the string using the static TEB pointer */ + MessageTextU = &NtCurrentTeb()->StaticUnicodeString; RtlInitAnsiString(&MessageText, (LPSTR)lpMessageText); - RtlAnsiStringToUnicodeString(&MessageTextU, - &MessageText, - TRUE); + /* Convert to unicode and just exit normally if this failed */ + Status = RtlAnsiStringToUnicodeString(MessageTextU, &MessageText, FALSE); + if (!NT_SUCCESS(Status)) ExitProcess(0); - FatalAppExitW(uAction, MessageTextU.Buffer); - - RtlFreeUnicodeString(&MessageTextU); + /* Call the Wide function */ + FatalAppExitW(uAction, MessageTextU->Buffer); } - -/* - * @unimplemented - */ -VOID -WINAPI -FatalAppExitW(UINT uAction, - LPCWSTR lpMessageText) -{ - static const WCHAR szUser32[] = L"user32.dll\0"; - - HMODULE hModule = GetModuleHandleW(szUser32); - MessageBoxW_Proc pMessageBoxW = NULL; - - DPRINT1("AppExit\n"); - - if (hModule) - pMessageBoxW = (MessageBoxW_Proc)GetProcAddress(hModule, "MessageBoxW"); - - if (pMessageBoxW) - pMessageBoxW(0, lpMessageText, NULL, MB_SYSTEMMODAL | MB_OK); - else - DPRINT1("%s\n", lpMessageText); - - ExitProcess(0); -} - - /* * @implemented */ VOID WINAPI -FatalExit(int ExitCode) +FatalAppExitW(IN UINT uAction, + IN LPCWSTR lpMessageText) { - ExitProcess(ExitCode); + UNICODE_STRING UnicodeString; + ULONG Response; + NTSTATUS Status; + + /* Setup the stirng to print out */ + RtlInitUnicodeString(&UnicodeString, lpMessageText); + + /* Display the hard error no matter what */ + Status = NtRaiseHardError(STATUS_FATAL_APP_EXIT | HARDERROR_OVERRIDE_ERRORMODE, + 1, + 1, + (PULONG_PTR)&UnicodeString, + OptionOkCancel, + &Response); + + /* Give the user a chance to abort */ + if ((NT_SUCCESS(Status)) && (Response == ResponseCancel)) return; + + /* Otherwise kill the process */ + ExitProcess(0); } +/* + * @implemented + */ +VOID +WINAPI +FatalExit(IN int ExitCode) +{ +#if DBG + /* On Checked builds, Windows gives you a nice little debugger UI */ + CHAR ch[2]; + DbgPrint("FatalExit...\n"); + DbgPrint("\n"); + + while (TRUE) + { + DbgPrompt( "A (Abort), B (Break), I (Ignore)? ", ch, sizeof(ch)); + switch (ch[0]) + { + case 'B': case 'b': + DbgBreakPoint(); + break; + + case 'A': case 'a': + ExitProcess(ExitCode); + + case 'I': case 'i': + return; + } + } +#endif + /* On other builds, just kill the process */ + ExitProcess(ExitCode); +} /* * @implemented */ DWORD WINAPI -GetPriorityClass(HANDLE hProcess) +GetPriorityClass(IN HANDLE hProcess) { - NTSTATUS Status; - PROCESS_PRIORITY_CLASS PriorityClass; + NTSTATUS Status; + PROCESS_PRIORITY_CLASS PriorityClass; - Status = NtQueryInformationProcess(hProcess, - ProcessPriorityClass, - &PriorityClass, - sizeof(PROCESS_PRIORITY_CLASS), - NULL); - if(NT_SUCCESS(Status)) - { - switch(PriorityClass.PriorityClass) + /* Query the kernel */ + Status = NtQueryInformationProcess(hProcess, + ProcessPriorityClass, + &PriorityClass, + sizeof(PROCESS_PRIORITY_CLASS), + NULL); + if (NT_SUCCESS(Status)) { - case PROCESS_PRIORITY_CLASS_IDLE: - return IDLE_PRIORITY_CLASS; - - case PROCESS_PRIORITY_CLASS_BELOW_NORMAL: - return BELOW_NORMAL_PRIORITY_CLASS; - - case PROCESS_PRIORITY_CLASS_NORMAL: - return NORMAL_PRIORITY_CLASS; - - case PROCESS_PRIORITY_CLASS_ABOVE_NORMAL: - return ABOVE_NORMAL_PRIORITY_CLASS; - - case PROCESS_PRIORITY_CLASS_HIGH: - return HIGH_PRIORITY_CLASS; - - case PROCESS_PRIORITY_CLASS_REALTIME: - return REALTIME_PRIORITY_CLASS; - - default: - return NORMAL_PRIORITY_CLASS; + /* Handle the conversion from NT to Win32 classes */ + switch (PriorityClass.PriorityClass) + { + case PROCESS_PRIORITY_CLASS_IDLE: return IDLE_PRIORITY_CLASS; + case PROCESS_PRIORITY_CLASS_BELOW_NORMAL: return BELOW_NORMAL_PRIORITY_CLASS; + case PROCESS_PRIORITY_CLASS_ABOVE_NORMAL: return ABOVE_NORMAL_PRIORITY_CLASS; + case PROCESS_PRIORITY_CLASS_HIGH: return HIGH_PRIORITY_CLASS; + case PROCESS_PRIORITY_CLASS_REALTIME: return REALTIME_PRIORITY_CLASS; + case PROCESS_PRIORITY_CLASS_NORMAL: default: return NORMAL_PRIORITY_CLASS; + } } - } - BaseSetLastNTError(Status); - return FALSE; + /* Failure path */ + BaseSetLastNTError(Status); + return FALSE; } - /* * @implemented */ BOOL WINAPI -SetPriorityClass(HANDLE hProcess, - DWORD dwPriorityClass) +SetPriorityClass(IN HANDLE hProcess, + IN DWORD dwPriorityClass) { NTSTATUS Status; + PVOID State = NULL; PROCESS_PRIORITY_CLASS PriorityClass; + /* Handle conversion from Win32 to NT priority classes */ switch (dwPriorityClass) { case IDLE_PRIORITY_CLASS: @@ -1918,68 +1983,85 @@ SetPriorityClass(HANDLE hProcess, break; case REALTIME_PRIORITY_CLASS: - PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_REALTIME; + /* Try to acquire the privilege. If it fails, just use HIGH */ + State = BasepIsRealtimeAllowed(TRUE); + PriorityClass.PriorityClass = PROCESS_PRIORITY_CLASS_HIGH; + PriorityClass.PriorityClass += (State != NULL); break; default: + /* Unrecognized priority classes don't make it to the kernel */ SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } + /* Send the request to the kernel, and don't touch the foreground flag */ PriorityClass.Foreground = FALSE; - Status = NtSetInformationProcess(hProcess, ProcessPriorityClass, &PriorityClass, sizeof(PROCESS_PRIORITY_CLASS)); + + /* Release the privilege if we had it */ + if (State) RtlReleasePrivilege(State); if (!NT_SUCCESS(Status)) { + /* Handle error path */ BaseSetLastNTError(Status); return FALSE; } + /* All done */ return TRUE; } - /* * @implemented */ DWORD WINAPI -GetProcessVersion(DWORD ProcessId) +GetProcessVersion(IN DWORD ProcessId) { DWORD Version = 0; - PIMAGE_NT_HEADERS NtHeader = NULL; - IMAGE_NT_HEADERS NtHeaders; - IMAGE_DOS_HEADER DosHeader; + PIMAGE_NT_HEADERS NtHeader; + PIMAGE_DOS_HEADER DosHeader; + PPEB Peb; PROCESS_BASIC_INFORMATION ProcessBasicInfo; - PVOID BaseAddress = NULL; + PVOID BaseAddress; + ULONG e_lfanew; HANDLE ProcessHandle = NULL; NTSTATUS Status; - SIZE_T Count; - PEB Peb; + USHORT VersionData[2]; + BOOLEAN Result; + /* We'll be accessing stuff that can fault, so protect everything with SEH */ _SEH2_TRY { - if (0 == ProcessId || GetCurrentProcessId() == ProcessId) + /* It this an in-process or out-of-process request? */ + if (!(ProcessId) || (GetCurrentProcessId() == ProcessId)) { - /* Caller's */ - BaseAddress = (PVOID) NtCurrentPeb()->ImageBaseAddress; - NtHeader = RtlImageNtHeader(BaseAddress); + /* It's in-process, so just read our own header */ + NtHeader = RtlImageNtHeader(NtCurrentPeb()->ImageBaseAddress); + if (!NtHeader) + { + /* Unable to read the NT header, something is wrong here... */ + Status = STATUS_INVALID_IMAGE_FORMAT; + goto Error; + } - Version = (NtHeader->OptionalHeader.MajorOperatingSystemVersion << 16) | - (NtHeader->OptionalHeader.MinorOperatingSystemVersion); + /* Get the version straight out of the NT header */ + Version = MAKELONG(NtHeader->OptionalHeader.MinorSubsystemVersion, + NtHeader->OptionalHeader.MajorSubsystemVersion); } else { - /* Other process */ + /* Out-of-process, so open it */ ProcessHandle = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, ProcessId); - if (!ProcessHandle) return 0; + /* Try to find out where its PEB lives */ Status = NtQueryInformationProcess(ProcessHandle, ProcessBasicInformation, &ProcessBasicInfo, @@ -1987,65 +2069,64 @@ GetProcessVersion(DWORD ProcessId) NULL); if (!NT_SUCCESS(Status)) goto Error; + Peb = ProcessBasicInfo.PebBaseAddress; - Status = NtReadVirtualMemory(ProcessHandle, - ProcessBasicInfo.PebBaseAddress, - &Peb, - sizeof(Peb), - &Count); + /* Now that we have the PEB, read the image base address out of it */ + Result = ReadProcessMemory(ProcessHandle, + &Peb->ImageBaseAddress, + &BaseAddress, + sizeof(BaseAddress), + NULL); + if (!Result) goto Error; - if (!NT_SUCCESS(Status) || Count != sizeof(Peb)) goto Error; + /* Now read the e_lfanew (offset to NT header) from the base */ + DosHeader = BaseAddress; + Result = ReadProcessMemory(ProcessHandle, + &DosHeader->e_lfanew, + &e_lfanew, + sizeof(e_lfanew), + NULL); + if (!Result) goto Error; - memset(&DosHeader, 0, sizeof(DosHeader)); - Status = NtReadVirtualMemory(ProcessHandle, - Peb.ImageBaseAddress, - &DosHeader, - sizeof(DosHeader), - &Count); + /* And finally, read the NT header itself by adding the offset */ + NtHeader = (PVOID)((ULONG_PTR)BaseAddress + e_lfanew); + Result = ReadProcessMemory(ProcessHandle, + &NtHeader->OptionalHeader.MajorSubsystemVersion, + &VersionData, + sizeof(VersionData), + NULL); + if (!Result) goto Error; - if (!NT_SUCCESS(Status) || Count != sizeof(DosHeader)) goto Error; - if (DosHeader.e_magic != IMAGE_DOS_SIGNATURE) goto Error; - - memset(&NtHeaders, 0, sizeof(NtHeaders)); - Status = NtReadVirtualMemory(ProcessHandle, - (char *)Peb.ImageBaseAddress + DosHeader.e_lfanew, - &NtHeaders, - sizeof(NtHeaders), - &Count); - - if (!NT_SUCCESS(Status) || Count != sizeof(NtHeaders)) goto Error; - if (NtHeaders.Signature != IMAGE_NT_SIGNATURE) goto Error; - - Version = MAKELONG(NtHeaders.OptionalHeader.MinorSubsystemVersion, - NtHeaders.OptionalHeader.MajorSubsystemVersion); + /* Get the version straight out of the NT header */ + Version = MAKELONG(VersionData[0], VersionData[1]); Error: - if (!NT_SUCCESS(Status)) - { - BaseSetLastNTError(Status); - } + /* If there was an error anywhere, set the last error */ + if (!NT_SUCCESS(Status)) BaseSetLastNTError(Status); } } _SEH2_FINALLY { + /* Close the process handle */ if (ProcessHandle) CloseHandle(ProcessHandle); } _SEH2_END; + /* And return the version data */ return Version; } - /* * @implemented */ BOOL WINAPI -GetProcessIoCounters(HANDLE hProcess, - PIO_COUNTERS lpIoCounters) +GetProcessIoCounters(IN HANDLE hProcess, + OUT PIO_COUNTERS lpIoCounters) { NTSTATUS Status; + /* Query the kernel. Structures are identical, so let it do the copy too. */ Status = NtQueryInformationProcess(hProcess, ProcessIoCounters, lpIoCounters, @@ -2053,25 +2134,27 @@ GetProcessIoCounters(HANDLE hProcess, NULL); if (!NT_SUCCESS(Status)) { + /* Handle error path */ BaseSetLastNTError(Status); return FALSE; } + /* All done */ return TRUE; } - /* * @implemented */ BOOL WINAPI -GetProcessPriorityBoost(HANDLE hProcess, - PBOOL pDisablePriorityBoost) +GetProcessPriorityBoost(IN HANDLE hProcess, + OUT PBOOL pDisablePriorityBoost) { NTSTATUS Status; ULONG PriorityBoost; + /* Query the kernel */ Status = NtQueryInformationProcess(hProcess, ProcessPriorityBoost, &PriorityBoost, @@ -2079,78 +2162,85 @@ GetProcessPriorityBoost(HANDLE hProcess, NULL); if (NT_SUCCESS(Status)) { - *pDisablePriorityBoost = PriorityBoost; + /* Convert from ULONG to a BOOL */ + *pDisablePriorityBoost = PriorityBoost ? TRUE : FALSE; return TRUE; } + /* Handle error path */ BaseSetLastNTError(Status); return FALSE; } - /* * @implemented */ BOOL WINAPI -SetProcessPriorityBoost(HANDLE hProcess, - BOOL bDisablePriorityBoost) +SetProcessPriorityBoost(IN HANDLE hProcess, + IN BOOL bDisablePriorityBoost) { NTSTATUS Status; - ULONG PriorityBoost = (bDisablePriorityBoost ? TRUE : FALSE); /* prevent setting values other than 1 and 0 */ + ULONG PriorityBoost; + /* Enforce that this is a BOOL, and send it to the kernel as a ULONG */ + PriorityBoost = (bDisablePriorityBoost ? TRUE : FALSE); Status = NtSetInformationProcess(hProcess, ProcessPriorityBoost, &PriorityBoost, sizeof(ULONG)); if (!NT_SUCCESS(Status)) { + /* Handle error path */ BaseSetLastNTError(Status); return FALSE; } + /* All done */ return TRUE; } - /* * @implemented */ BOOL WINAPI -GetProcessHandleCount(HANDLE hProcess, - PDWORD pdwHandleCount) +GetProcessHandleCount(IN HANDLE hProcess, + OUT PDWORD pdwHandleCount) { ULONG phc; NTSTATUS Status; + /* Query the kernel */ Status = NtQueryInformationProcess(hProcess, ProcessHandleCount, &phc, sizeof(ULONG), NULL); - if(NT_SUCCESS(Status)) + if (NT_SUCCESS(Status)) { - *pdwHandleCount = phc; - return TRUE; + /* Copy the count and return sucecss */ + *pdwHandleCount = phc; + return TRUE; } + /* Handle error path */ BaseSetLastNTError(Status); return FALSE; } - /* * @implemented */ BOOL WINAPI -IsWow64Process(HANDLE hProcess, - PBOOL Wow64Process) +IsWow64Process(IN HANDLE hProcess, + OUT PBOOL Wow64Process) { ULONG_PTR pbi; NTSTATUS Status; + /* Query the kernel */ Status = NtQueryInformationProcess(hProcess, ProcessWow64Information, &pbi, @@ -2158,12 +2248,13 @@ IsWow64Process(HANDLE hProcess, NULL); if (!NT_SUCCESS(Status)) { - SetLastError(RtlNtStatusToDosError(Status)); + /* Handle error path */ + BaseSetLastNTError(Status); return FALSE; } + /* Enforce this is a BOOL, and return success */ *Wow64Process = (pbi != 0); - return TRUE; } @@ -2174,11 +2265,9 @@ LPSTR WINAPI GetCommandLineA(VOID) { - DPRINT("CommandLine \'%s\'\n", CommandLineStringA.Buffer); - return CommandLineStringA.Buffer; + return BaseAnsiCommandLine.Buffer; } - /* * @implemented */ @@ -2186,8 +2275,7 @@ LPWSTR WINAPI GetCommandLineW(VOID) { - DPRINT("CommandLine \'%S\'\n", CommandLineStringW.Buffer); - return CommandLineStringW.Buffer; + return BaseUnicodeCommandLine.Buffer; } /* @@ -2208,11 +2296,14 @@ ReadProcessMemory(IN HANDLE hProcess, (PVOID)lpBaseAddress, lpBuffer, nSize, - lpNumberOfBytesRead); + &nSize); + + /* In user-mode, this parameter is optional */ + if (lpNumberOfBytesRead) *lpNumberOfBytesRead = nSize; if (!NT_SUCCESS(Status)) { /* We failed */ - BaseSetLastNTError (Status); + BaseSetLastNTError(Status); return FALSE; } @@ -2268,7 +2359,11 @@ WriteProcessMemory(IN HANDLE hProcess, lpBaseAddress, (LPVOID)lpBuffer, nSize, - lpNumberOfBytesWritten); + &nSize); + + /* In Win32, the parameter is optional, so handle this case */ + if (lpNumberOfBytesWritten) *lpNumberOfBytesWritten = nSize; + if (!NT_SUCCESS(Status)) { /* We failed */ @@ -2283,7 +2378,7 @@ WriteProcessMemory(IN HANDLE hProcess, else { /* Check if we were read only */ - if ((OldValue & PAGE_NOACCESS) || (OldValue & PAGE_READONLY)) + if (OldValue & (PAGE_NOACCESS | PAGE_READONLY)) { /* Restore protection and fail */ NtProtectVirtualMemory(hProcess, @@ -2292,7 +2387,9 @@ WriteProcessMemory(IN HANDLE hProcess, OldValue, &OldValue); BaseSetLastNTError(STATUS_ACCESS_VIOLATION); - return FALSE; + + /* Note: This is what Windows returns and code depends on it */ + return STATUS_ACCESS_VIOLATION; } /* Otherwise, do the write */ @@ -2300,7 +2397,10 @@ WriteProcessMemory(IN HANDLE hProcess, lpBaseAddress, (LPVOID)lpBuffer, nSize, - lpNumberOfBytesWritten); + &nSize); + + /* In Win32, the parameter is optional, so handle this case */ + if (lpNumberOfBytesWritten) *lpNumberOfBytesWritten = nSize; /* And restore the protection */ NtProtectVirtualMemory(hProcess, @@ -2312,7 +2412,9 @@ WriteProcessMemory(IN HANDLE hProcess, { /* We failed */ BaseSetLastNTError(STATUS_ACCESS_VIOLATION); - return FALSE; + + /* Note: This is what Windows returns and code depends on it */ + return STATUS_ACCESS_VIOLATION; } /* Flush the ITLB */ @@ -2334,7 +2436,7 @@ WriteProcessMemory(IN HANDLE hProcess, BOOL WINAPI ProcessIdToSessionId(IN DWORD dwProcessId, - OUT DWORD *pSessionId) + OUT PDWORD pSessionId) { PROCESS_SESSION_INFORMATION SessionInformation; OBJECT_ATTRIBUTES ObjectAttributes; @@ -2342,64 +2444,46 @@ ProcessIdToSessionId(IN DWORD dwProcessId, HANDLE ProcessHandle; NTSTATUS Status; + /* Do a quick check if the pointer is not writable */ if (IsBadWritePtr(pSessionId, sizeof(DWORD))) { + /* Fail fast */ SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } + /* Open the process passed in by ID */ ClientId.UniqueProcess = UlongToHandle(dwProcessId); ClientId.UniqueThread = 0; - InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); - Status = NtOpenProcess(&ProcessHandle, PROCESS_QUERY_INFORMATION, &ObjectAttributes, &ClientId); if (NT_SUCCESS(Status)) { + /* Query the session ID from the kernel */ Status = NtQueryInformationProcess(ProcessHandle, ProcessSessionInformation, &SessionInformation, sizeof(SessionInformation), NULL); - NtClose(ProcessHandle); + /* Close the handle and check if we suceeded */ + NtClose(ProcessHandle); if (NT_SUCCESS(Status)) { + /* Return the session ID */ *pSessionId = SessionInformation.SessionId; return TRUE; } } + /* Set error code and fail */ BaseSetLastNTError(Status); return FALSE; } -BOOL -WINAPI -SetProcessWorkingSetSizeEx(IN HANDLE hProcess, - IN SIZE_T dwMinimumWorkingSetSize, - IN SIZE_T dwMaximumWorkingSetSize, - IN DWORD Flags) -{ - STUB; - return FALSE; -} - - -BOOL -WINAPI -GetProcessWorkingSetSizeEx(IN HANDLE hProcess, - OUT PSIZE_T lpMinimumWorkingSetSize, - OUT PSIZE_T lpMaximumWorkingSetSize, - OUT PDWORD Flags) -{ - STUB; - return FALSE; -} - /* * @implemented */ @@ -3419,4 +3503,48 @@ CreateProcessA(LPCSTR lpApplicationName, NULL); } +/* + * @implemented + */ +UINT +WINAPI +WinExec(LPCSTR lpCmdLine, + UINT uCmdShow) +{ + STARTUPINFOA StartupInfo; + PROCESS_INFORMATION ProcessInformation; + DWORD dosErr; + + RtlZeroMemory(&StartupInfo, sizeof(StartupInfo)); + StartupInfo.cb = sizeof(STARTUPINFOA); + StartupInfo.wShowWindow = (WORD)uCmdShow; + StartupInfo.dwFlags = 0; + + if (!CreateProcessA(NULL, + (PVOID)lpCmdLine, + NULL, + NULL, + FALSE, + 0, + NULL, + NULL, + &StartupInfo, + &ProcessInformation)) + { + dosErr = GetLastError(); + return dosErr < 32 ? dosErr : ERROR_BAD_FORMAT; + } + + if (NULL != UserWaitForInputIdleRoutine) + { + UserWaitForInputIdleRoutine(ProcessInformation.hProcess, + 10000); + } + + NtClose(ProcessInformation.hProcess); + NtClose(ProcessInformation.hThread); + + return 33; /* Something bigger than 31 means success. */ +} + /* EOF */ diff --git a/reactos/dll/win32/kernel32/include/kernel32.h b/reactos/dll/win32/kernel32/include/kernel32.h index e343e92ccc6..659f239627b 100644 --- a/reactos/dll/win32/kernel32/include/kernel32.h +++ b/reactos/dll/win32/kernel32/include/kernel32.h @@ -158,7 +158,7 @@ DWORD extern BOOLEAN InWindows; -extern WaitForInputIdleType lpfnGlobalRegisterWaitForInputIdle; +extern WaitForInputIdleType UserWaitForInputIdleRoutine; /* GLOBAL VARIABLES **********************************************************/ @@ -493,6 +493,13 @@ BaseMarkFileForDelete( IN ULONG FileAttributes ); +BOOL +WINAPI +BaseCheckForVDM( + IN HANDLE ProcessHandle, + OUT LPDWORD ExitCode +); + /* FIXME: This is EXPORTED! It should go in an external kernel32.h header */ VOID WINAPI diff --git a/reactos/include/ndk/extypes.h b/reactos/include/ndk/extypes.h index 1cc2888f00c..6915d751c7a 100644 --- a/reactos/include/ndk/extypes.h +++ b/reactos/include/ndk/extypes.h @@ -127,9 +127,10 @@ extern ULONG NTSYSAPI NtBuildNumber; #define PROFILE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | PROFILE_CONTROL) // -// Maximum Parameters for NtRaiseHardError +// NtRaiseHardError-related parameters // #define MAXIMUM_HARDERROR_PARAMETERS 4 +#define HARDERROR_OVERRIDE_ERRORMODE 0x10000000 // // Pushlock bits From 9d0af37bb862a95fa2cd8c34c2280e6f6c7c3166 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 23 Jan 2012 05:32:11 +0000 Subject: [PATCH 031/289] [KERNEL32]: Fix a copy-pasta (and a regression). Thanks vicmarcal/testbot. svn path=/trunk/; revision=55093 --- reactos/dll/win32/kernel32/client/proc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/kernel32/client/proc.c b/reactos/dll/win32/kernel32/client/proc.c index a50330c453c..f4f54b4eff4 100644 --- a/reactos/dll/win32/kernel32/client/proc.c +++ b/reactos/dll/win32/kernel32/client/proc.c @@ -1558,7 +1558,7 @@ GetStartupInfoW(IN LPSTARTUPINFOW lpStartupInfo) /* Copy the data out of there */ lpStartupInfo->cb = sizeof(STARTUPINFOW); - lpStartupInfo->lpReserved = Params->ShellInfo.Buffer; + lpStartupInfo->lpReserved = Params->ShellInfo.Buffer; lpStartupInfo->lpDesktop = Params->DesktopInfo.Buffer; lpStartupInfo->lpTitle = Params->WindowTitle.Buffer; lpStartupInfo->dwX = Params->StartingX; @@ -1659,7 +1659,7 @@ GetStartupInfoA(IN LPSTARTUPINFOA lpStartupInfo) if (NT_SUCCESS(Status)) { /* Save it */ - StartupInfo->lpReserved = TitleString.Buffer; + StartupInfo->lpTitle = TitleString.Buffer; /* We finished with the ANSI version, try to cache it */ if (!InterlockedCompareExchangePointer(&BaseAnsiStartupInfo, From 9fe3f47e1220f0b1a7d501896e81a8b2b1a04d91 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 12:01:07 +0000 Subject: [PATCH 032/289] [DDK] * Update ndis.h annotations. svn path=/trunk/; revision=55095 --- reactos/include/ddk/ndis.h | 1549 ++++++++++++++++++++---------------- 1 file changed, 883 insertions(+), 666 deletions(-) diff --git a/reactos/include/ddk/ndis.h b/reactos/include/ddk/ndis.h index d9d82e4cfc4..9eb6e2d3176 100644 --- a/reactos/include/ddk/ndis.h +++ b/reactos/include/ddk/ndis.h @@ -42,7 +42,7 @@ #include "netevent.h" #include -typedef int NDIS_STATUS, *PNDIS_STATUS; +typedef _Return_type_success_(return >= 0) int NDIS_STATUS, *PNDIS_STATUS; #include "ntddndis.h" @@ -54,6 +54,8 @@ typedef unsigned int UINT, *PUINT; extern "C" { #endif +__drv_Mode_impl(NDIS_INCLUDED) + #ifndef __NET_PNP__ #define __NET_PNP__ @@ -625,12 +627,15 @@ typedef struct _LOCK_STATE { /* Timer */ +_IRQL_requires_(DISPATCH_LEVEL) +_IRQL_requires_same_ +_Function_class_(NDIS_TIMER_FUNCTION) typedef VOID (NTAPI NDIS_TIMER_FUNCTION)( - IN PVOID SystemSpecific1, - IN PVOID FunctionContext, - IN PVOID SystemSpecific2, - IN PVOID SystemSpecific3); + _In_ PVOID SystemSpecific1, + _In_ PVOID FunctionContext, + _In_ PVOID SystemSpecific2, + _In_ PVOID SystemSpecific3); typedef NDIS_TIMER_FUNCTION *PNDIS_TIMER_FUNCTION; typedef struct _NDIS_TIMER { @@ -926,7 +931,7 @@ typedef enum _NDIS_PARAMETER_TYPE { typedef struct _BINARY_DATA { USHORT Length; - PVOID Buffer; + _Field_size_bytes_(Length) PVOID Buffer; } BINARY_DATA; typedef struct _NDIS_CONFIGURATION_PARAMETER { @@ -965,17 +970,17 @@ typedef struct _NDIS_WAN_LINE_UP { typedef NTSTATUS (NTAPI *TDI_REGISTER_CALLBACK)( - IN PUNICODE_STRING DeviceName, - OUT HANDLE *TdiHandle); + _In_ PUNICODE_STRING DeviceName, + _Out_ HANDLE *TdiHandle); typedef NTSTATUS (NTAPI *TDI_PNP_HANDLER)( - IN PUNICODE_STRING UpperComponent, - IN PUNICODE_STRING LowerComponent, - IN PUNICODE_STRING BindList, - IN PVOID ReconfigBuffer, - IN UINT ReconfigBufferSize, - IN UINT Operation); + _In_ PUNICODE_STRING UpperComponent, + _In_ PUNICODE_STRING LowerComponent, + _In_ PUNICODE_STRING BindList, + _In_ PVOID ReconfigBuffer, + _In_ UINT ReconfigBufferSize, + _In_ UINT Operation); typedef struct _OID_LIST OID_LIST, *POID_LIST; @@ -1517,40 +1522,45 @@ typedef NDIS_STATUS /* Prototypes for NDIS 5.0 protocol characteristics */ +_IRQL_requires_(PASSIVE_LEVEL) typedef VOID (NTAPI *CO_SEND_COMPLETE_HANDLER)( - IN NDIS_STATUS Status, - IN NDIS_HANDLE ProtocolVcContext, - IN PNDIS_PACKET Packet); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE ProtocolVcContext, + _In_ PNDIS_PACKET Packet); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef VOID (NTAPI *CO_STATUS_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_HANDLE ProtocolVcContext OPTIONAL, - IN NDIS_STATUS GeneralStatus, - IN PVOID StatusBuffer, - IN UINT StatusBufferSize); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_opt_ NDIS_HANDLE ProtocolVcContext, + _In_ NDIS_STATUS GeneralStatus, + _In_ PVOID StatusBuffer, + _In_ UINT StatusBufferSize); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef UINT (NTAPI *CO_RECEIVE_PACKET_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_HANDLE ProtocolVcContext, - IN PNDIS_PACKET Packet); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ NDIS_HANDLE ProtocolVcContext, + _In_ PNDIS_PACKET Packet); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef NDIS_STATUS (NTAPI *CO_REQUEST_HANDLER)( - IN NDIS_HANDLE ProtocolAfContext, - IN NDIS_HANDLE ProtocolVcContext OPTIONAL, - IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, - IN OUT PNDIS_REQUEST NdisRequest); + _In_ NDIS_HANDLE ProtocolAfContext, + _In_opt_ NDIS_HANDLE ProtocolVcContext, + _In_opt_ NDIS_HANDLE ProtocolPartyContext, + _Inout_ PNDIS_REQUEST NdisRequest); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef VOID (NTAPI *CO_REQUEST_COMPLETE_HANDLER)( - IN NDIS_STATUS Status, - IN NDIS_HANDLE ProtocolAfContext OPTIONAL, - IN NDIS_HANDLE ProtocolVcContext OPTIONAL, - IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, - IN PNDIS_REQUEST NdisRequest); + _In_ NDIS_STATUS Status, + _In_opt_ NDIS_HANDLE ProtocolAfContext, + _In_opt_ NDIS_HANDLE ProtocolVcContext, + _In_opt_ NDIS_HANDLE ProtocolPartyContext, + _In_ PNDIS_REQUEST NdisRequest); typedef struct _NDIS_CALL_MANAGER_CHARACTERISTICS { UCHAR MajorVersion; @@ -1694,55 +1704,55 @@ typedef struct _NDIS_CLIENT_CHARACTERISTICS { typedef VOID (NTAPI *OPEN_ADAPTER_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_STATUS Status, - IN NDIS_STATUS OpenErrorStatus); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ NDIS_STATUS Status, + _In_ NDIS_STATUS OpenErrorStatus); typedef VOID (NTAPI *CLOSE_ADAPTER_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_STATUS Status); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ NDIS_STATUS Status); typedef VOID (NTAPI *RESET_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_STATUS Status); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ NDIS_STATUS Status); typedef VOID (NTAPI *REQUEST_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_REQUEST NdisRequest, - IN NDIS_STATUS Status); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ PNDIS_REQUEST NdisRequest, + _In_ NDIS_STATUS Status); typedef VOID (NTAPI *STATUS_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_STATUS GeneralStatus, - IN PVOID StatusBuffer, - IN UINT StatusBufferSize); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ NDIS_STATUS GeneralStatus, + _In_ PVOID StatusBuffer, + _In_ UINT StatusBufferSize); typedef VOID (NTAPI *STATUS_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext); + _In_ NDIS_HANDLE ProtocolBindingContext); typedef VOID (NTAPI *SEND_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_PACKET Packet, - IN NDIS_STATUS Status); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ PNDIS_PACKET Packet, + _In_ NDIS_STATUS Status); typedef VOID (NTAPI *WAN_SEND_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_WAN_PACKET Packet, - IN NDIS_STATUS Status); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ PNDIS_WAN_PACKET Packet, + _In_ NDIS_STATUS Status); typedef VOID (NTAPI *TRANSFER_DATA_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_PACKET Packet, - IN NDIS_STATUS Status, - IN UINT BytesTransferred); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ PNDIS_PACKET Packet, + _In_ NDIS_STATUS Status, + _In_ UINT BytesTransferred); typedef VOID (NTAPI *WAN_TRANSFER_DATA_COMPLETE_HANDLER)( @@ -1750,23 +1760,23 @@ typedef VOID typedef NDIS_STATUS (NTAPI *RECEIVE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext, - IN NDIS_HANDLE MacReceiveContext, - IN PVOID HeaderBuffer, - IN UINT HeaderBufferSize, - IN PVOID LookAheadBuffer, - IN UINT LookaheadBufferSize, - IN UINT PacketSize); + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ NDIS_HANDLE MacReceiveContext, + _In_ PVOID HeaderBuffer, + _In_ UINT HeaderBufferSize, + _In_ PVOID LookAheadBuffer, + _In_ UINT LookaheadBufferSize, + _In_ UINT PacketSize); typedef NDIS_STATUS (NTAPI *WAN_RECEIVE_HANDLER)( - IN NDIS_HANDLE NdisLinkHandle, - IN PUCHAR Packet, - IN ULONG PacketSize); + _In_ NDIS_HANDLE NdisLinkHandle, + _In_ PUCHAR Packet, + _In_ ULONG PacketSize); typedef VOID (NTAPI *RECEIVE_COMPLETE_HANDLER)( - IN NDIS_HANDLE ProtocolBindingContext); + _In_ NDIS_HANDLE ProtocolBindingContext); /* Protocol characteristics for NDIS 3.0 protocols */ @@ -1906,115 +1916,114 @@ typedef NDIS_PROTOCOL_CHARACTERISTICS *PNDIS_PROTOCOL_CHARACTERISTICS; typedef BOOLEAN (NTAPI *W_CHECK_FOR_HANG_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext); + _In_ NDIS_HANDLE MiniportAdapterContext); typedef VOID (NTAPI *W_DISABLE_INTERRUPT_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext); + _In_ NDIS_HANDLE MiniportAdapterContext); typedef VOID (NTAPI *W_ENABLE_INTERRUPT_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext); + _In_ NDIS_HANDLE MiniportAdapterContext); typedef VOID (NTAPI *W_HALT_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext); + _In_ NDIS_HANDLE MiniportAdapterContext); typedef VOID (NTAPI *W_HANDLE_INTERRUPT_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext); + _In_ NDIS_HANDLE MiniportAdapterContext); typedef NDIS_STATUS (NTAPI *W_INITIALIZE_HANDLER)( - OUT PNDIS_STATUS OpenErrorStatus, - OUT PUINT SelectedMediumIndex, - IN PNDIS_MEDIUM MediumArray, - IN UINT MediumArraySize, - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE WrapperConfigurationContext); + _Out_ PNDIS_STATUS OpenErrorStatus, + _Out_ PUINT SelectedMediumIndex, + _In_ PNDIS_MEDIUM MediumArray, + _In_ UINT MediumArraySize, + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ NDIS_HANDLE WrapperConfigurationContext); typedef VOID (NTAPI *W_ISR_HANDLER)( - OUT PBOOLEAN InterruptRecognized, - OUT PBOOLEAN QueueMiniportHandleInterrupt, - IN NDIS_HANDLE MiniportAdapterContext); + _Out_ PBOOLEAN InterruptRecognized, + _Out_ PBOOLEAN QueueMiniportHandleInterrupt, + _In_ NDIS_HANDLE MiniportAdapterContext); typedef NDIS_STATUS (NTAPI *W_QUERY_INFORMATION_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_OID Oid, - IN PVOID InformationBuffer, - IN ULONG InformationBufferLength, - OUT PULONG BytesWritten, - OUT PULONG BytesNeeded); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ NDIS_OID Oid, + _In_ PVOID InformationBuffer, + _In_ ULONG InformationBufferLength, + _Out_ PULONG BytesWritten, + _Out_ PULONG BytesNeeded); typedef NDIS_STATUS (NTAPI *W_RECONFIGURE_HANDLER)( - OUT PNDIS_STATUS OpenErrorStatus, - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE WrapperConfigurationContext); + _Out_ PNDIS_STATUS OpenErrorStatus, + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ NDIS_HANDLE WrapperConfigurationContext); typedef NDIS_STATUS (NTAPI *W_RESET_HANDLER)( - OUT PBOOLEAN AddressingReset, - IN NDIS_HANDLE MiniportAdapterContext); + _Out_ PBOOLEAN AddressingReset, + _In_ NDIS_HANDLE MiniportAdapterContext); typedef NDIS_STATUS (NTAPI *W_SEND_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PNDIS_PACKET Packet, - IN UINT Flags); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ PNDIS_PACKET Packet, + _In_ UINT Flags); typedef NDIS_STATUS (NTAPI *WM_SEND_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE NdisLinkHandle, - IN PNDIS_WAN_PACKET Packet); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ NDIS_HANDLE NdisLinkHandle, + _In_ PNDIS_WAN_PACKET Packet); typedef NDIS_STATUS (NTAPI *W_SET_INFORMATION_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_OID Oid, - IN PVOID InformationBuffer, - IN ULONG InformationBufferLength, - OUT PULONG BytesRead, - OUT PULONG BytesNeeded); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ NDIS_OID Oid, + _In_ PVOID InformationBuffer, + _In_ ULONG InformationBufferLength, + _Out_ PULONG BytesRead, + _Out_ PULONG BytesNeeded); typedef NDIS_STATUS (NTAPI *W_TRANSFER_DATA_HANDLER)( - OUT PNDIS_PACKET Packet, - OUT PUINT BytesTransferred, - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE MiniportReceiveContext, - IN UINT ByteOffset, - IN UINT BytesToTransfer); + _Out_ PNDIS_PACKET Packet, + _Out_ PUINT BytesTransferred, + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ NDIS_HANDLE MiniportReceiveContext, + _In_ UINT ByteOffset, + _In_ UINT BytesToTransfer); typedef NDIS_STATUS -(NTAPI *WM_TRANSFER_DATA_HANDLER)( - VOID); +(NTAPI *WM_TRANSFER_DATA_HANDLER)(VOID); typedef VOID (NTAPI *ADAPTER_SHUTDOWN_HANDLER)( - IN PVOID ShutdownContext); + _In_ PVOID ShutdownContext); typedef VOID (NTAPI *W_RETURN_PACKET_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PNDIS_PACKET Packet); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ PNDIS_PACKET Packet); typedef VOID (NTAPI *W_SEND_PACKETS_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ PPNDIS_PACKET PacketArray, + _In_ UINT NumberOfPackets); typedef VOID (NTAPI *W_ALLOCATE_COMPLETE_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PVOID VirtualAddress, - IN PNDIS_PHYSICAL_ADDRESS PhysicalAddress, - IN ULONG Length, - IN PVOID Context); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ PVOID VirtualAddress, + _In_ PNDIS_PHYSICAL_ADDRESS PhysicalAddress, + _In_ ULONG Length, + _In_ PVOID Context); /* NDIS structures available only to miniport drivers */ @@ -2064,40 +2073,48 @@ typedef struct _NDIS40_MINIPORT_CHARACTERISTICS { /* Extensions for NDIS 5.0 miniports */ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Function_class_(MINIPORT_CO_CREATE_VC) typedef NDIS_STATUS (NTAPI MINIPORT_CO_CREATE_VC)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE NdisVcHandle, - OUT PNDIS_HANDLE MiniportVcContext); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ NDIS_HANDLE NdisVcHandle, + _Out_ PNDIS_HANDLE MiniportVcContext); typedef MINIPORT_CO_CREATE_VC *W_CO_CREATE_VC_HANDLER; +_IRQL_requires_max_(DISPATCH_LEVEL) +_Function_class_(MINIPORT_CO_DELETE_VC) typedef NDIS_STATUS (NTAPI MINIPORT_CO_DELETE_VC)( - IN NDIS_HANDLE MiniportVcContext); + _In_ NDIS_HANDLE MiniportVcContext); typedef MINIPORT_CO_DELETE_VC *W_CO_DELETE_VC_HANDLER; +_IRQL_requires_max_(DISPATCH_LEVEL) +_Function_class_(MINIPORT_CO_ACTIVATE_VC) typedef NDIS_STATUS (NTAPI MINIPORT_CO_ACTIVATE_VC)( - IN NDIS_HANDLE MiniportVcContext, - IN OUT PCO_CALL_PARAMETERS CallParameters); + _In_ NDIS_HANDLE MiniportVcContext, + _Inout_ PCO_CALL_PARAMETERS CallParameters); typedef MINIPORT_CO_ACTIVATE_VC *W_CO_ACTIVATE_VC_HANDLER; +_IRQL_requires_max_(DISPATCH_LEVEL) +_Function_class_(MINIPORT_CO_DEACTIVATE_VC) typedef NDIS_STATUS (NTAPI MINIPORT_CO_DEACTIVATE_VC)( - IN NDIS_HANDLE MiniportVcContext); + _In_ NDIS_HANDLE MiniportVcContext); typedef MINIPORT_CO_DEACTIVATE_VC *W_CO_DEACTIVATE_VC_HANDLER; typedef VOID (NTAPI *W_CO_SEND_PACKETS_HANDLER)( - IN NDIS_HANDLE MiniportVcContext, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); + _In_ NDIS_HANDLE MiniportVcContext, + _In_ PPNDIS_PACKET PacketArray, + _In_ UINT NumberOfPackets); typedef NDIS_STATUS (NTAPI *W_CO_REQUEST_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_HANDLE MiniportVcContext OPTIONAL, - IN OUT PNDIS_REQUEST NdisRequest); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_opt_ NDIS_HANDLE MiniportVcContext, + _Inout_ PNDIS_REQUEST NdisRequest); #ifdef __cplusplus @@ -2131,19 +2148,19 @@ typedef struct _NDIS50_MINIPORT_CHARACTERISTICS { typedef VOID (NTAPI *W_CANCEL_SEND_PACKETS_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PVOID CancelId); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ PVOID CancelId); typedef VOID (NTAPI *W_PNP_EVENT_NOTIFY_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN NDIS_DEVICE_PNP_EVENT PnPEvent, - IN PVOID InformationBuffer, - IN ULONG InformationBufferLength); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ NDIS_DEVICE_PNP_EVENT PnPEvent, + _In_ PVOID InformationBuffer, + _In_ ULONG InformationBufferLength); typedef VOID (NTAPI *W_MINIPORT_SHUTDOWN_HANDLER)( - IN PVOID ShutdownContext); + _In_ PVOID ShutdownContext); #ifdef __cplusplus @@ -2284,18 +2301,18 @@ typedef struct _NDIS_BIND_PATHS { typedef VOID (NTAPI *ETH_RCV_COMPLETE_HANDLER)( - IN PETH_FILTER Filter); + _In_ PETH_FILTER Filter); typedef VOID (NTAPI *ETH_RCV_INDICATE_HANDLER)( - IN PETH_FILTER Filter, - IN NDIS_HANDLE MacReceiveContext, - IN PCHAR Address, - IN PVOID HeaderBuffer, - IN UINT HeaderBufferSize, - IN PVOID LookaheadBuffer, - IN UINT LookaheadBufferSize, - IN UINT PacketSize); + _In_ PETH_FILTER Filter, + _In_ NDIS_HANDLE MacReceiveContext, + _In_ PCHAR Address, + _In_ PVOID HeaderBuffer, + _In_ UINT HeaderBufferSize, + _In_ PVOID LookaheadBuffer, + _In_ UINT LookaheadBufferSize, + _In_ UINT PacketSize); typedef VOID (NTAPI *FDDI_RCV_COMPLETE_HANDLER)( @@ -2315,36 +2332,36 @@ typedef VOID typedef VOID (NTAPI *FILTER_PACKET_INDICATION_HANDLER)( - IN NDIS_HANDLE Miniport, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); + _In_ NDIS_HANDLE Miniport, + _In_ PPNDIS_PACKET PacketArray, + _In_ UINT NumberOfPackets); typedef VOID (NTAPI *TR_RCV_COMPLETE_HANDLER)( - IN PTR_FILTER Filter); + _In_ PTR_FILTER Filter); typedef VOID (NTAPI *TR_RCV_INDICATE_HANDLER)( - IN PTR_FILTER Filter, - IN NDIS_HANDLE MacReceiveContext, - IN PVOID HeaderBuffer, - IN UINT HeaderBufferSize, - IN PVOID LookaheadBuffer, - IN UINT LookaheadBufferSize, - IN UINT PacketSize); + _In_ PTR_FILTER Filter, + _In_ NDIS_HANDLE MacReceiveContext, + _In_ PVOID HeaderBuffer, + _In_ UINT HeaderBufferSize, + _In_ PVOID LookaheadBuffer, + _In_ UINT LookaheadBufferSize, + _In_ UINT PacketSize); typedef VOID (NTAPI *WAN_RCV_COMPLETE_HANDLER)( - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_HANDLE NdisLinkContext); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ NDIS_HANDLE NdisLinkContext); typedef VOID (NTAPI *WAN_RCV_HANDLER)( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_HANDLE NdisLinkContext, - IN PUCHAR Packet, - IN ULONG PacketSize); + _Out_ PNDIS_STATUS Status, + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ NDIS_HANDLE NdisLinkContext, + _In_ PUCHAR Packet, + _In_ ULONG PacketSize); typedef VOID (FASTCALL *NDIS_M_DEQUEUE_WORK_ITEM)( @@ -2366,51 +2383,51 @@ typedef NDIS_STATUS typedef VOID (NTAPI *NDIS_M_REQ_COMPLETE_HANDLER)( - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_STATUS Status); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ NDIS_STATUS Status); typedef VOID (NTAPI *NDIS_M_RESET_COMPLETE_HANDLER)( - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_STATUS Status, - IN BOOLEAN AddressingReset); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ NDIS_STATUS Status, + _In_ BOOLEAN AddressingReset); typedef VOID (NTAPI *NDIS_M_SEND_COMPLETE_HANDLER)( - IN NDIS_HANDLE MiniportAdapterHandle, - IN PNDIS_PACKET Packet, - IN NDIS_STATUS Status); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ PNDIS_PACKET Packet, + _In_ NDIS_STATUS Status); typedef VOID (NTAPI *NDIS_M_SEND_RESOURCES_HANDLER)( - IN NDIS_HANDLE MiniportAdapterHandle); + _In_ NDIS_HANDLE MiniportAdapterHandle); typedef BOOLEAN (FASTCALL *NDIS_M_START_SENDS)( - IN PNDIS_MINIPORT_BLOCK Miniport); + _In_ PNDIS_MINIPORT_BLOCK Miniport); typedef VOID (NTAPI *NDIS_M_STATUS_HANDLER)( - IN NDIS_HANDLE MiniportHandle, - IN NDIS_STATUS GeneralStatus, - IN PVOID StatusBuffer, - IN UINT StatusBufferSize); + _In_ NDIS_HANDLE MiniportHandle, + _In_ NDIS_STATUS GeneralStatus, + _In_ PVOID StatusBuffer, + _In_ UINT StatusBufferSize); typedef VOID (NTAPI *NDIS_M_STS_COMPLETE_HANDLER)( - IN NDIS_HANDLE MiniportAdapterHandle); + _In_ NDIS_HANDLE MiniportAdapterHandle); typedef VOID (NTAPI *NDIS_M_TD_COMPLETE_HANDLER)( - IN NDIS_HANDLE MiniportAdapterHandle, - IN PNDIS_PACKET Packet, - IN NDIS_STATUS Status, - IN UINT BytesTransferred); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ PNDIS_PACKET Packet, + _In_ NDIS_STATUS Status, + _In_ UINT BytesTransferred); typedef VOID (NTAPI *NDIS_WM_SEND_COMPLETE_HANDLER)( - IN NDIS_HANDLE MiniportAdapterHandle, - IN PVOID Packet, - IN NDIS_STATUS Status); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ PVOID Packet, + _In_ NDIS_STATUS Status); #if ARCNET @@ -2647,38 +2664,38 @@ struct _NDIS_MINIPORT_BLOCK { typedef NDIS_STATUS (NTAPI *WAN_SEND_HANDLER)( - IN NDIS_HANDLE MacBindingHandle, - IN NDIS_HANDLE LinkHandle, - IN PVOID Packet); + _In_ NDIS_HANDLE MacBindingHandle, + _In_ NDIS_HANDLE LinkHandle, + _In_ PVOID Packet); typedef VOID (NTAPI *SEND_PACKETS_HANDLER)( - IN NDIS_HANDLE MiniportAdapterContext, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); + _In_ NDIS_HANDLE MiniportAdapterContext, + _In_ PPNDIS_PACKET PacketArray, + _In_ UINT NumberOfPackets); typedef NDIS_STATUS (NTAPI *SEND_HANDLER)( - IN NDIS_HANDLE NdisBindingHandle, - IN PNDIS_PACKET Packet); + _In_ NDIS_HANDLE NdisBindingHandle, + _In_ PNDIS_PACKET Packet); typedef NDIS_STATUS (NTAPI *TRANSFER_DATA_HANDLER)( - IN NDIS_HANDLE NdisBindingHandle, - IN NDIS_HANDLE MacReceiveContext, - IN UINT ByteOffset, - IN UINT BytesToTransfer, - OUT PNDIS_PACKET Packet, - OUT PUINT BytesTransferred); + _In_ NDIS_HANDLE NdisBindingHandle, + _In_ NDIS_HANDLE MacReceiveContext, + _In_ UINT ByteOffset, + _In_ UINT BytesToTransfer, + _Out_ PNDIS_PACKET Packet, + _Out_ PUINT BytesTransferred); typedef NDIS_STATUS (NTAPI *RESET_HANDLER)( - IN NDIS_HANDLE NdisBindingHandle); + _In_ NDIS_HANDLE NdisBindingHandle); typedef NDIS_STATUS (NTAPI *REQUEST_HANDLER)( - IN NDIS_HANDLE NdisBindingHandle, - IN PNDIS_REQUEST NdisRequest); + _In_ NDIS_HANDLE NdisBindingHandle, + _In_ PNDIS_REQUEST NdisRequest); #endif /* NDIS_LEGACY_DRIVER */ @@ -2758,49 +2775,55 @@ struct _NDIS_OPEN_BLOCK #define NDIS_M_MAX_LOOKAHEAD 526 +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisInitializeTimer( - PNDIS_TIMER Timer, - PNDIS_TIMER_FUNCTION TimerFunction, - PVOID FunctionContext); + _Inout_ PNDIS_TIMER Timer, + _In_ PNDIS_TIMER_FUNCTION TimerFunction, + _In_opt_ _Points_to_data_ PVOID FunctionContext); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCancelTimer( - PNDIS_TIMER Timer, - PBOOLEAN TimerCancelled); + _In_ PNDIS_TIMER Timer, + _Out_ _At_(*TimerCancelled, _Must_inspect_result_) PBOOLEAN TimerCancelled); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisSetTimer( - PNDIS_TIMER Timer, - UINT MillisecondsToDelay); + _In_ PNDIS_TIMER Timer, + _In_ UINT MillisecondsToDelay); NDISAPI VOID NTAPI NdisSetPeriodicTimer( - PNDIS_TIMER NdisTimer, - UINT MillisecondsPeriod); + _In_ PNDIS_TIMER NdisTimer, + _In_ UINT MillisecondsPeriod); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisSetTimerEx( - PNDIS_TIMER NdisTimer, - UINT MillisecondsToDelay, - PVOID FunctionContext); + _In_ PNDIS_TIMER NdisTimer, + _In_ UINT MillisecondsToDelay, + _In_ PVOID FunctionContext); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI PVOID NTAPI NdisGetRoutineAddress( - PNDIS_STRING NdisRoutineName); + _In_ PNDIS_STRING NdisRoutineName); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI UINT NTAPI @@ -2808,29 +2831,32 @@ NdisGetVersion(VOID); #if NDIS_LEGACY_DRIVER +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisAllocateBuffer( - OUT PNDIS_STATUS Status, - OUT PNDIS_BUFFER *Buffer, - IN NDIS_HANDLE PoolHandle OPTIONAL, - IN PVOID VirtualAddress, - IN UINT Length); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_BUFFER *Buffer, + _In_opt_ NDIS_HANDLE PoolHandle, + _In_reads_bytes_(Length) PVOID VirtualAddress, + _In_ UINT Length); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisAllocateBufferPool( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE PoolHandle, - IN UINT NumberOfDescriptors); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_HANDLE PoolHandle, + _In_ UINT NumberOfDescriptors); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisFreeBufferPool( - IN NDIS_HANDLE PoolHandle); + _In_ NDIS_HANDLE PoolHandle); /* NDISAPI @@ -2841,104 +2867,118 @@ NdisFreeBuffer( */ #define NdisFreeBuffer IoFreeMdl +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisAllocatePacketPool( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE PoolHandle, - IN UINT NumberOfDescriptors, - IN UINT ProtocolReservedLength); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_HANDLE PoolHandle, + _In_ UINT NumberOfDescriptors, + _In_ UINT ProtocolReservedLength); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisAllocatePacketPoolEx( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE PoolHandle, - IN UINT NumberOfDescriptors, - IN UINT NumberOfOverflowDescriptors, - IN UINT ProtocolReservedLength); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_HANDLE PoolHandle, + _In_ UINT NumberOfDescriptors, + _In_ UINT NumberOfOverflowDescriptors, + _In_ UINT ProtocolReservedLength); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisSetPacketPoolProtocolId( - IN NDIS_HANDLE PacketPoolHandle, - IN UINT ProtocolId); + _In_ NDIS_HANDLE PacketPoolHandle, + _In_ UINT ProtocolId); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI UINT NTAPI NdisPacketPoolUsage( - IN NDIS_HANDLE PoolHandle); + _In_ NDIS_HANDLE PoolHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI UINT NTAPI NdisPacketSize( - IN UINT ProtocolReservedSize); + _In_ UINT ProtocolReservedSize); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_HANDLE NTAPI NdisGetPoolFromPacket( - IN PNDIS_PACKET Packet); + _In_ PNDIS_PACKET Packet); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI PNDIS_PACKET_STACK NTAPI NdisIMGetCurrentPacketStack( - IN PNDIS_PACKET Packet, - OUT BOOLEAN * StacksRemaining); + _In_ PNDIS_PACKET Packet, + _Out_ BOOLEAN *StacksRemaining); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisFreePacketPool( - IN NDIS_HANDLE PoolHandle); + _In_ NDIS_HANDLE PoolHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisFreePacket( - IN PNDIS_PACKET Packet); + _In_ PNDIS_PACKET Packet); +_IRQL_requires_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisDprFreePacket( - IN PNDIS_PACKET Packet); + _In_ PNDIS_PACKET Packet); +_IRQL_requires_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisDprFreePacketNonInterlocked( - IN PNDIS_PACKET Packet); + _In_ PNDIS_PACKET Packet); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisAllocatePacket( - OUT PNDIS_STATUS Status, - OUT PNDIS_PACKET *Packet, - IN NDIS_HANDLE PoolHandle); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_PACKET *Packet, + _In_ NDIS_HANDLE PoolHandle); +_IRQL_requires_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisDprAllocatePacket( - OUT PNDIS_STATUS Status, - OUT PNDIS_PACKET *Packet, - IN NDIS_HANDLE PoolHandle); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_PACKET *Packet, + _In_ NDIS_HANDLE PoolHandle); +_IRQL_requires_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisDprAllocatePacketNonInterlocked( - OUT PNDIS_STATUS Status, - OUT PNDIS_PACKET *Packet, - IN NDIS_HANDLE PoolHandle); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_PACKET *Packet, + _In_ NDIS_HANDLE PoolHandle); /* * VOID @@ -3091,16 +3131,17 @@ NdisUnchainBufferAtBack( IN OUT PNDIS_PACKET Packet, OUT PNDIS_BUFFER *Buffer); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCopyFromPacketToPacket( - IN PNDIS_PACKET Destination, - IN UINT DestinationOffset, - IN UINT BytesToCopy, - IN PNDIS_PACKET Source, - IN UINT SourceOffset, - OUT PUINT BytesCopied); + _In_ PNDIS_PACKET Destination, + _In_ UINT DestinationOffset, + _In_ UINT BytesToCopy, + _In_ PNDIS_PACKET Source, + _In_ UINT SourceOffset, + _Out_ PUINT BytesCopied); NDISAPI VOID @@ -3114,67 +3155,77 @@ NdisCopyFromPacketToPacketSafe( OUT PUINT BytesCopied, IN MM_PAGE_PRIORITY Priority); +_IRQL_requires_max_(DISPATCH_LEVEL) +__drv_preferredFunction("NdisAllocateMemoryWithTag", "Obsolete") NDISAPI NDIS_STATUS NTAPI NdisAllocateMemory( - OUT PVOID *VirtualAddress, - IN UINT Length, - IN UINT MemoryFlags, - IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress); + _At_(*VirtualAddress, __drv_allocatesMem(Mem)) _Outptr_result_bytebuffer_(Length) + PVOID *VirtualAddress, + _In_ UINT Length, + _In_ UINT MemoryFlags, + _In_ NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress); #define NdisInitializeWorkItem(_WI_, _R_, _C_) { \ (_WI_)->Context = _C_; \ (_WI_)->Routine = _R_; \ } +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisScheduleWorkItem( - IN PNDIS_WORK_ITEM WorkItem); + _In_ __drv_aliasesMem PNDIS_WORK_ITEM WorkItem); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisSetPacketStatus( - IN PNDIS_PACKET Packet, - IN NDIS_STATUS Status, - IN NDIS_HANDLE Handle, - IN ULONG Code); + _In_ PNDIS_PACKET Packet, + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE Handle, + _In_ ULONG Code); #endif /* NDIS_LEGACY_DRIVER */ +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisOpenFile( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE FileHandle, - OUT PUINT FileLength, - IN PNDIS_STRING FileName, - IN NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_HANDLE FileHandle, + _Out_ PUINT FileLength, + _In_ PNDIS_STRING FileName, + _In_ NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisCloseFile( - IN NDIS_HANDLE FileHandle); + _In_ NDIS_HANDLE FileHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMapFile( - OUT PNDIS_STATUS Status, - OUT PVOID *MappedBuffer, - IN NDIS_HANDLE FileHandle); + _Out_ PNDIS_STATUS Status, + _Out_ PVOID *MappedBuffer, + _In_ NDIS_HANDLE FileHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisUnmapFile( - IN NDIS_HANDLE FileHandle); + _In_ NDIS_HANDLE FileHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI ULONG NTAPI @@ -3183,16 +3234,17 @@ NdisGetSharedDataAlignment(VOID); #define NdisFlushBuffer(Buffer,WriteToDevice) \ KeFlushIoBuffers((Buffer),!(WriteToDevice), TRUE) +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCopyBuffer( - OUT PNDIS_STATUS Status, - OUT PNDIS_BUFFER *Buffer, - IN NDIS_HANDLE PoolHandle, - IN PVOID MemoryDescriptor, - IN UINT Offset, - IN UINT Length); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_BUFFER *Buffer, + _In_ NDIS_HANDLE PoolHandle, + _In_ PVOID MemoryDescriptor, + _In_ UINT Offset, + _In_ UINT Length); /* * VOID @@ -3663,13 +3715,17 @@ NdisDestroyLookaheadBufferFromSharedMemory( #define NdisMUpdateSharedMemory(_H, _L, _V, _P) \ NdisUpdateSharedMemory(_H, _L, _V, _P) +_When_(MemoryFlags==0, _IRQL_requires_max_(DISPATCH_LEVEL)) +_When_(MemoryFlags==NDIS_MEMORY_CONTIGUOUS, _IRQL_requires_(PASSIVE_LEVEL)) +_When_(MemoryFlags==NDIS_MEMORY_NONCACHED, _IRQL_requires_max_(APC_LEVEL)) NDISAPI VOID NTAPI NdisFreeMemory( - IN PVOID VirtualAddress, - IN UINT Length, - IN UINT MemoryFlags); + _In_reads_bytes_(Length) __drv_freesMem(Mem) PVOID VirtualAddress, + _In_ UINT Length, + _In_ _Pre_satisfies_(MemoryFlags == 0 || MemoryFlags == NDIS_MEMORY_NONCACHED || MemoryFlags == NDIS_MEMORY_CONTIGUOUS) + UINT MemoryFlags); NDISAPI VOID @@ -3696,24 +3752,28 @@ NdisImmediateWriteSharedMemory( IN PUCHAR Buffer, IN ULONG Length); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisMAllocateSharedMemory( - IN NDIS_HANDLE MiniportAdapterHandle, - IN ULONG Length, - IN BOOLEAN Cached, - OUT PVOID *VirtualAddress, - OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ ULONG Length, + _In_ BOOLEAN Cached, + _Outptr_result_bytebuffer_(Length) _At_(*VirtualAddress, _Must_inspect_result_) + PVOID *VirtualAddress, + _Out_ _At_(*PhysicalAddress, _Must_inspect_result_) + PNDIS_PHYSICAL_ADDRESS PhysicalAddress); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMAllocateSharedMemoryAsync( - IN NDIS_HANDLE MiniportAdapterHandle, - IN ULONG Length, - IN BOOLEAN Cached, - IN PVOID Context); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ ULONG Length, + _In_ BOOLEAN Cached, + _In_ PVOID Context); #if defined(NDIS50) @@ -3848,23 +3908,28 @@ typedef VOID /* Configuration routines */ #if NDIS_LEGACY_DRIVER +_IRQL_requires_(PASSIVE_LEVEL) +_Success_(*Status >= 0) NDISAPI VOID NTAPI NdisOpenConfiguration( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE ConfigurationHandle, - IN NDIS_HANDLE WrapperConfigurationContext); + _At_(*Status, _Must_inspect_result_) _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_HANDLE ConfigurationHandle, + _In_ NDIS_HANDLE WrapperConfigurationContext); #endif +_IRQL_requires_(PASSIVE_LEVEL) +_Success_(*Status >= 0) NDISAPI VOID NTAPI NdisReadNetworkAddress( - OUT PNDIS_STATUS Status, - OUT PVOID *NetworkAddress, - OUT PUINT NetworkAddressLength, - IN NDIS_HANDLE ConfigurationHandle); + _At_(*Status, _Must_inspect_result_) _Out_ PNDIS_STATUS Status, + _Outptr_result_bytebuffer_to_(*NetworkAddressLength, *NetworkAddressLength) + PVOID *NetworkAddress, + _Out_ PUINT NetworkAddressLength, + _In_ NDIS_HANDLE ConfigurationHandle); NDISAPI VOID @@ -3887,43 +3952,47 @@ NdisReadEisaSlotInformationEx( #if NDIS_LEGACY_MINIPORT +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI ULONG NTAPI NdisReadPciSlotInformation( - IN NDIS_HANDLE NdisAdapterHandle, - IN ULONG SlotNumber, - IN ULONG Offset, - OUT PVOID Buffer, - IN ULONG Length); + _In_ NDIS_HANDLE NdisAdapterHandle, + _In_ ULONG SlotNumber, + _In_ ULONG Offset, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI ULONG NTAPI NdisWritePciSlotInformation( - IN NDIS_HANDLE NdisAdapterHandle, - IN ULONG SlotNumber, - IN ULONG Offset, - IN PVOID Buffer, - IN ULONG Length); + _In_ NDIS_HANDLE NdisAdapterHandle, + _In_ ULONG SlotNumber, + _In_ ULONG Offset, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI ULONG NTAPI NdisReadPcmciaAttributeMemory( - IN NDIS_HANDLE NdisAdapterHandle, - IN ULONG Offset, - OUT PVOID Buffer, - IN ULONG Length); + _In_ NDIS_HANDLE NdisAdapterHandle, + _In_ ULONG Offset, + _Out_writes_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI ULONG NTAPI NdisWritePcmciaAttributeMemory( - IN NDIS_HANDLE NdisAdapterHandle, - IN ULONG Offset, - IN PVOID Buffer, - IN ULONG Length); + _In_ NDIS_HANDLE NdisAdapterHandle, + _In_ ULONG Offset, + _In_reads_bytes_(Length) PVOID Buffer, + _In_ ULONG Length); #endif /* NDIS_LEGACY_MINIPORT */ @@ -4301,46 +4370,53 @@ NdisDprReleaseSpinLock( /* Miscellaneous routines */ +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisCloseConfiguration( - IN NDIS_HANDLE ConfigurationHandle); + _In_ __drv_freesMem(mem) NDIS_HANDLE ConfigurationHandle); +_IRQL_requires_(PASSIVE_LEVEL) +_Success_(*Status >= 0) NDISAPI VOID NTAPI NdisReadConfiguration( - OUT PNDIS_STATUS Status, - OUT PNDIS_CONFIGURATION_PARAMETER *ParameterValue, - IN NDIS_HANDLE ConfigurationHandle, - IN PNDIS_STRING Keyword, - IN NDIS_PARAMETER_TYPE ParameterType); + _At_(*Status, _Must_inspect_result_) _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_CONFIGURATION_PARAMETER *ParameterValue, + _In_ NDIS_HANDLE ConfigurationHandle, + _In_ PNDIS_STRING Keyword, + _In_ NDIS_PARAMETER_TYPE ParameterType); +_IRQL_requires_(PASSIVE_LEVEL) +_Success_(*Status >= 0) NDISAPI VOID NTAPI NdisWriteConfiguration( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE WrapperConfigurationContext, - IN PNDIS_STRING Keyword, - IN PNDIS_CONFIGURATION_PARAMETER ParameterValue); + _At_(*Status, _Must_inspect_result_) _Out_ PNDIS_STATUS Status, + _In_ NDIS_HANDLE WrapperConfigurationContext, + _In_ PNDIS_STRING Keyword, + _In_ PNDIS_CONFIGURATION_PARAMETER ParameterValue); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID __cdecl NdisWriteErrorLogEntry( - IN NDIS_HANDLE NdisAdapterHandle, - IN NDIS_ERROR_CODE ErrorCode, - IN ULONG NumberOfErrorValues, - IN ...); + _In_ NDIS_HANDLE NdisAdapterHandle, + _In_ NDIS_ERROR_CODE ErrorCode, + _In_ ULONG NumberOfErrorValues, + ...); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisInitializeString( - OUT PNDIS_STRING Destination, - IN PUCHAR Source); + _Out_ _At_(Destination->Buffer, __drv_allocatesMem(Mem)) PNDIS_STRING Destination, + _In_opt_z_ PUCHAR Source); /* * VOID @@ -4359,6 +4435,7 @@ NdisGetCurrentSystemTime( #define NdisGetCurrentSystemTime KeQuerySystemTime #if NDIS_SUPPORT_60_COMPATIBLE_API +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI CCHAR NTAPI @@ -4392,15 +4469,16 @@ NdisGetCurrentProcessorCpuUsage( /* NDIS 4.0 extensions */ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMFreeSharedMemory( - IN NDIS_HANDLE MiniportAdapterHandle, - IN ULONG Length, - IN BOOLEAN Cached, - IN PVOID VirtualAddress, - IN NDIS_PHYSICAL_ADDRESS PhysicalAddress); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ ULONG Length, + _In_ BOOLEAN Cached, + _In_reads_bytes_(Length) PVOID VirtualAddress, + _In_ NDIS_PHYSICAL_ADDRESS PhysicalAddress); NDISAPI VOID @@ -4440,21 +4518,24 @@ NdisPciAssignResources( /* NDIS 5.0 extensions */ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisAllocateMemoryWithTag( - OUT PVOID *VirtualAddress, - IN UINT Length, - IN ULONG Tag); + _At_(*VirtualAddress, __drv_allocatesMem(Mem)) _Outptr_result_bytebuffer_(Length) + PVOID *VirtualAddress, + _In_ UINT Length, + _In_ ULONG Tag); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisGetCurrentProcessorCounts( - OUT PULONG pIdleCount, - OUT PULONG pKernelAndUser, - OUT PULONG pIndex); + _Out_ PULONG pIdleCount, + _Out_ PULONG pKernelAndUser, + _Out_ PULONG pIndex); #if NDIS_LEGACY_DRIVER NDISAPI @@ -4466,26 +4547,34 @@ NdisGetSystemUpTime( #if NDIS_SUPPORT_60_COMPATIBLE_API +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_raises_(DISPATCH_LEVEL) +_When_(fWrite, _Acquires_exclusive_lock_(*Lock)) +_When_(!fWrite, _Acquires_shared_lock_(*Lock)) NDISAPI VOID NTAPI NdisAcquireReadWriteLock( - IN OUT PNDIS_RW_LOCK Lock, - IN BOOLEAN fWrite, - OUT PLOCK_STATE LockState); + _Inout_ PNDIS_RW_LOCK Lock, + _In_ BOOLEAN fWrite, + _Out_ _IRQL_saves_ PLOCK_STATE LockState); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisInitializeReadWriteLock( - OUT PNDIS_RW_LOCK Lock); + _Out_ PNDIS_RW_LOCK Lock); +_IRQL_requires_(DISPATCH_LEVEL) +_Requires_lock_held_(*Lock) +_Releases_lock_(*Lock) NDISAPI VOID NTAPI NdisReleaseReadWriteLock( - IN OUT PNDIS_RW_LOCK Lock, - IN PLOCK_STATE LockState); + _Inout_ PNDIS_RW_LOCK Lock, + _In_ _IRQL_restores_ PLOCK_STATE LockState); #if NDIS_SUPPORT_NDIS6 @@ -4508,369 +4597,428 @@ NdisDprReleaseReadWriteLock( #endif /* NDIS_SUPPORT_60_COMPATIBLE_API */ +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMDeregisterDevice( - IN NDIS_HANDLE NdisDeviceHandle); + _In_ NDIS_HANDLE NdisDeviceHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisMGetDeviceProperty( - IN NDIS_HANDLE MiniportAdapterHandle, - IN OUT PDEVICE_OBJECT *PhysicalDeviceObject OPTIONAL, - IN OUT PDEVICE_OBJECT *FunctionalDeviceObject OPTIONAL, - IN OUT PDEVICE_OBJECT *NextDeviceObject OPTIONAL, - IN OUT PCM_RESOURCE_LIST *AllocatedResources OPTIONAL, - IN OUT PCM_RESOURCE_LIST *AllocatedResourcesTranslated OPTIONAL); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _Inout_opt_ PDEVICE_OBJECT *PhysicalDeviceObject, + _Inout_opt_ PDEVICE_OBJECT *FunctionalDeviceObject, + _Inout_opt_ PDEVICE_OBJECT *NextDeviceObject, + _Inout_opt_ PCM_RESOURCE_LIST *AllocatedResources, + _Inout_opt_ PCM_RESOURCE_LIST *AllocatedResourcesTranslated); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMInitializeScatterGatherDma( - IN NDIS_HANDLE MiniportAdapterHandle, - IN BOOLEAN Dma64BitAddresses, - IN ULONG MaximumPhysicalMapping); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ BOOLEAN Dma64BitAddresses, + _In_ ULONG MaximumPhysicalMapping); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMPromoteMiniport( - IN NDIS_HANDLE MiniportAdapterHandle); + _In_ NDIS_HANDLE MiniportAdapterHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMQueryAdapterInstanceName( - OUT PNDIS_STRING AdapterInstanceName, - IN NDIS_HANDLE MiniportAdapterHandle); + _Out_ PNDIS_STRING AdapterInstanceName, + _In_ NDIS_HANDLE MiniportAdapterHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMRegisterDevice( - IN NDIS_HANDLE NdisWrapperHandle, - IN PNDIS_STRING DeviceName, - IN PNDIS_STRING SymbolicName, - IN PDRIVER_DISPATCH MajorFunctions[], - OUT PDEVICE_OBJECT *pDeviceObject, - OUT NDIS_HANDLE *NdisDeviceHandle); + _In_ NDIS_HANDLE NdisWrapperHandle, + _In_ PNDIS_STRING DeviceName, + _In_ PNDIS_STRING SymbolicName, + _In_reads_(IRP_MJ_PNP) PDRIVER_DISPATCH *MajorFunctions, + _Out_ PDEVICE_OBJECT *pDeviceObject, + _Out_ NDIS_HANDLE *NdisDeviceHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisMRegisterUnloadHandler( - IN NDIS_HANDLE NdisWrapperHandle, - IN PDRIVER_UNLOAD UnloadHandler); + _In_ NDIS_HANDLE NdisWrapperHandle, + _In_ PDRIVER_UNLOAD UnloadHandler); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMRemoveMiniport( - IN NDIS_HANDLE MiniportAdapterHandle); + _In_ NDIS_HANDLE MiniportAdapterHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMSetMiniportSecondary( - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_HANDLE PrimaryMiniportAdapterHandle); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ NDIS_HANDLE PrimaryMiniportAdapterHandle); +_IRQL_requires_max_(APC_LEVEL) +_Success_(*Status >= 0) NDISAPI VOID NTAPI NdisOpenConfigurationKeyByIndex( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE ConfigurationHandle, - IN ULONG Index, - OUT PNDIS_STRING KeyName, - OUT PNDIS_HANDLE KeyHandle); + _At_(*Status, _Must_inspect_result_) _Out_ PNDIS_STATUS Status, + _In_ NDIS_HANDLE ConfigurationHandle, + _In_ ULONG Index, + _Out_ PNDIS_STRING KeyName, + _Out_ PNDIS_HANDLE KeyHandle); +_IRQL_requires_max_(APC_LEVEL) +_Success_(*Status >= 0) NDISAPI VOID NTAPI NdisOpenConfigurationKeyByName( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE ConfigurationHandle, - IN PNDIS_STRING SubKeyName, - OUT PNDIS_HANDLE SubKeyHandle); + _At_(*Status, _Must_inspect_result_) _Out_ PNDIS_STATUS Status, + _In_ NDIS_HANDLE ConfigurationHandle, + _In_ PNDIS_STRING SubKeyName, + _Out_ PNDIS_HANDLE SubKeyHandle); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisQueryAdapterInstanceName( - OUT PNDIS_STRING AdapterInstanceName, - IN NDIS_HANDLE NdisBindingHandle); + _Out_ PNDIS_STRING AdapterInstanceName, + _In_ NDIS_HANDLE NdisBindingHandle); +_Must_inspect_result_ NDISAPI NDIS_STATUS NTAPI NdisQueryBindInstanceName( - OUT PNDIS_STRING pAdapterInstanceName, - IN NDIS_HANDLE BindingContext); + _Out_ PNDIS_STRING pAdapterInstanceName, + _In_ NDIS_HANDLE BindingContext); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisWriteEventLogEntry( - IN PVOID LogHandle, - IN NDIS_STATUS EventCode, - IN ULONG UniqueEventValue, - IN USHORT NumStrings, - IN PVOID StringsList OPTIONAL, - IN ULONG DataSize, - IN PVOID Data OPTIONAL); + _In_ _Points_to_data_ PVOID LogHandle, + _In_ NDIS_STATUS EventCode, + _In_ ULONG UniqueEventValue, + _In_ USHORT NumStrings, + _In_opt_ PVOID StringsList, + _In_ ULONG DataSize, + _In_reads_bytes_opt_(DataSize) PVOID Data); /* Connectionless services */ +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisClAddParty( - IN NDIS_HANDLE NdisVcHandle, - IN NDIS_HANDLE ProtocolPartyContext, - IN OUT PCO_CALL_PARAMETERS CallParameters, - OUT PNDIS_HANDLE NdisPartyHandle); + _In_ NDIS_HANDLE NdisVcHandle, + _In_ NDIS_HANDLE ProtocolPartyContext, + _In_ PCO_CALL_PARAMETERS CallParameters, + _Out_ PNDIS_HANDLE NdisPartyHandle); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisClCloseAddressFamily( - IN NDIS_HANDLE NdisAfHandle); + _In_ NDIS_HANDLE NdisAfHandle); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisClCloseCall( - IN NDIS_HANDLE NdisVcHandle, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL, - IN PVOID Buffer OPTIONAL, - IN UINT Size); + _In_ NDIS_HANDLE NdisVcHandle, + _In_opt_ NDIS_HANDLE NdisPartyHandle, + _In_reads_bytes_opt_(Size) PVOID Buffer, + _In_ UINT Size); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisClDeregisterSap( - IN NDIS_HANDLE NdisSapHandle); + _In_ NDIS_HANDLE NdisSapHandle); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisClDropParty( - IN NDIS_HANDLE NdisPartyHandle, - IN PVOID Buffer OPTIONAL, - IN UINT Size); + _In_ NDIS_HANDLE NdisPartyHandle, + _In_reads_bytes_opt_(Size) PVOID Buffer, + _In_opt_ UINT Size); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisClIncomingCallComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisVcHandle, + _In_ PCO_CALL_PARAMETERS CallParameters); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisClMakeCall( - IN NDIS_HANDLE NdisVcHandle, - IN OUT PCO_CALL_PARAMETERS CallParameters, - IN NDIS_HANDLE ProtocolPartyContext OPTIONAL, - OUT PNDIS_HANDLE NdisPartyHandle OPTIONAL); + _In_ NDIS_HANDLE NdisVcHandle, + _Inout_ PCO_CALL_PARAMETERS CallParameters, + _In_opt_ NDIS_HANDLE ProtocolPartyContext, + _Out_opt_ PNDIS_HANDLE NdisPartyHandle); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisClModifyCallQoS( - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); - + _In_ NDIS_HANDLE NdisVcHandle, + _In_ PCO_CALL_PARAMETERS CallParameters); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisClOpenAddressFamily( - IN NDIS_HANDLE NdisBindingHandle, - IN PCO_ADDRESS_FAMILY AddressFamily, - IN NDIS_HANDLE ProtocolAfContext, - IN PNDIS_CLIENT_CHARACTERISTICS ClCharacteristics, - IN UINT SizeOfClCharacteristics, - OUT PNDIS_HANDLE NdisAfHandle); + _In_ NDIS_HANDLE NdisBindingHandle, + _In_ PCO_ADDRESS_FAMILY AddressFamily, + _In_ NDIS_HANDLE ProtocolAfContext, + _In_ PNDIS_CLIENT_CHARACTERISTICS ClCharacteristics, + _In_ UINT SizeOfClCharacteristics, + _Out_ PNDIS_HANDLE NdisAfHandle); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisClRegisterSap( - IN NDIS_HANDLE NdisAfHandle, - IN NDIS_HANDLE ProtocolSapContext, - IN PCO_SAP Sap, - OUT PNDIS_HANDLE NdisSapHandle); + _In_ NDIS_HANDLE NdisAfHandle, + _In_ NDIS_HANDLE ProtocolSapContext, + _In_ PCO_SAP Sap, + _Out_ PNDIS_HANDLE NdisSapHandle); /* Call Manager services */ +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisCmActivateVc( - IN NDIS_HANDLE NdisVcHandle, - IN OUT PCO_CALL_PARAMETERS CallParameters); + _In_ NDIS_HANDLE NdisVcHandle, + _Inout_ PCO_CALL_PARAMETERS CallParameters); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmAddPartyComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisPartyHandle, - IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, - IN PCO_CALL_PARAMETERS CallParameters); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisPartyHandle, + _In_opt_ NDIS_HANDLE CallMgrPartyContext, + _In_ PCO_CALL_PARAMETERS CallParameters); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmCloseAddressFamilyComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisAfHandle); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisAfHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmCloseCallComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisVcHandle, + _In_opt_ NDIS_HANDLE NdisPartyHandle); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisCmDeactivateVc( - IN NDIS_HANDLE NdisVcHandle); + _In_ NDIS_HANDLE NdisVcHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmDeregisterSapComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisSapHandle); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisSapHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmDispatchCallConnected( - IN NDIS_HANDLE NdisVcHandle); + _In_ NDIS_HANDLE NdisVcHandle); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisCmDispatchIncomingCall( - IN NDIS_HANDLE NdisSapHandle, - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); + _In_ NDIS_HANDLE NdisSapHandle, + _In_ NDIS_HANDLE NdisVcHandle, + _In_ PCO_CALL_PARAMETERS CallParameters); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmDispatchIncomingCallQoSChange( - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); + _In_ NDIS_HANDLE NdisVcHandle, + _In_ PCO_CALL_PARAMETERS CallParameters); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmDispatchIncomingCloseCall( - IN NDIS_STATUS CloseStatus, - IN NDIS_HANDLE NdisVcHandle, - IN PVOID Buffer OPTIONAL, - IN UINT Size); + _In_ NDIS_STATUS CloseStatus, + _In_ NDIS_HANDLE NdisVcHandle, + _In_reads_bytes_opt_(Size) PVOID Buffer, + _In_ UINT Size); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmDispatchIncomingDropParty( - IN NDIS_STATUS DropStatus, - IN NDIS_HANDLE NdisPartyHandle, - IN PVOID Buffer OPTIONAL, - IN UINT Size); + _In_ NDIS_STATUS DropStatus, + _In_ NDIS_HANDLE NdisPartyHandle, + _In_reads_bytes_opt_(Size) PVOID Buffer, + _In_ UINT Size); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmDropPartyComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisPartyHandle); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisPartyHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmMakeCallComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL, - IN NDIS_HANDLE CallMgrPartyContext OPTIONAL, - IN PCO_CALL_PARAMETERS CallParameters); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisVcHandle, + _In_opt_ NDIS_HANDLE NdisPartyHandle, + _In_opt_ NDIS_HANDLE CallMgrPartyContext, + _In_ PCO_CALL_PARAMETERS CallParameters); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmModifyCallQoSComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisVcHandle, + _In_ PCO_CALL_PARAMETERS CallParameters); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmOpenAddressFamilyComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisAfHandle, - IN NDIS_HANDLE CallMgrAfContext); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisAfHandle, + _In_ NDIS_HANDLE CallMgrAfContext); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisCmRegisterAddressFamily( - IN NDIS_HANDLE NdisBindingHandle, - IN PCO_ADDRESS_FAMILY AddressFamily, - IN PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics, - IN UINT SizeOfCmCharacteristics); + _In_ NDIS_HANDLE NdisBindingHandle, + _In_ PCO_ADDRESS_FAMILY AddressFamily, + _In_ PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics, + _In_ UINT SizeOfCmCharacteristics); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCmRegisterSapComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisSapHandle, - IN NDIS_HANDLE CallMgrSapContext); - + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisSapHandle, + _In_ NDIS_HANDLE CallMgrSapContext); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMCmActivateVc( - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); + _In_ NDIS_HANDLE NdisVcHandle, + _In_ PCO_CALL_PARAMETERS CallParameters); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMCmCreateVc( - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_HANDLE NdisAfHandle, - IN NDIS_HANDLE MiniportVcContext, - OUT PNDIS_HANDLE NdisVcHandle); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ NDIS_HANDLE NdisAfHandle, + _In_ NDIS_HANDLE MiniportVcContext, + _Out_ PNDIS_HANDLE NdisVcHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMCmDeactivateVc( - IN NDIS_HANDLE NdisVcHandle); + _In_ NDIS_HANDLE NdisVcHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMCmDeleteVc( - IN NDIS_HANDLE NdisVcHandle); + _In_ NDIS_HANDLE NdisVcHandle); NDISAPI NDIS_STATUS @@ -4881,132 +5029,150 @@ NdisMCmRegisterAddressFamily( IN PNDIS_CALL_MANAGER_CHARACTERISTICS CmCharacteristics, IN UINT SizeOfCmCharacteristics); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMCmRequest( - IN NDIS_HANDLE NdisAfHandle, - IN NDIS_HANDLE NdisVcHandle OPTIONAL, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL, - IN OUT PNDIS_REQUEST NdisRequest); + _In_ NDIS_HANDLE NdisAfHandle, + _In_opt_ NDIS_HANDLE NdisVcHandle, + _In_opt_ NDIS_HANDLE NdisPartyHandle, + _Inout_ PNDIS_REQUEST NdisRequest); /* Connection-oriented services */ +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisCoCreateVc( - IN NDIS_HANDLE NdisBindingHandle, - IN NDIS_HANDLE NdisAfHandle OPTIONAL, - IN NDIS_HANDLE ProtocolVcContext, - IN OUT PNDIS_HANDLE NdisVcHandle); + _In_ NDIS_HANDLE NdisBindingHandle, + _In_opt_ NDIS_HANDLE NdisAfHandle , + _In_ NDIS_HANDLE ProtocolVcContext, + _Inout_ PNDIS_HANDLE NdisVcHandle); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisCoDeleteVc( - IN NDIS_HANDLE NdisVcHandle); + _In_ NDIS_HANDLE NdisVcHandle); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisCoRequest( - IN NDIS_HANDLE NdisBindingHandle, - IN NDIS_HANDLE NdisAfHandle OPTIONAL, - IN NDIS_HANDLE NdisVcHandle OPTIONAL, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL, - IN OUT PNDIS_REQUEST NdisRequest); + _In_ NDIS_HANDLE NdisBindingHandle, + _In_opt_ NDIS_HANDLE NdisAfHandle, + _In_opt_ NDIS_HANDLE NdisVcHandle, + _In_opt_ NDIS_HANDLE NdisPartyHandle, + _Inout_ PNDIS_REQUEST NdisRequest); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCoRequestComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisAfHandle, - IN NDIS_HANDLE NdisVcHandle OPTIONAL, - IN NDIS_HANDLE NdisPartyHandle OPTIONAL, - IN PNDIS_REQUEST NdisRequest); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisAfHandle, + _In_opt_ NDIS_HANDLE NdisVcHandle, + _In_opt_ NDIS_HANDLE NdisPartyHandle, + _In_ PNDIS_REQUEST NdisRequest); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCoSendPackets( - IN NDIS_HANDLE NdisVcHandle, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); + _In_ NDIS_HANDLE NdisVcHandle, + _In_ PPNDIS_PACKET PacketArray, + _In_ UINT NumberOfPackets); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMCoActivateVcComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN PCO_CALL_PARAMETERS CallParameters); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisVcHandle, + _In_ PCO_CALL_PARAMETERS CallParameters); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMCoDeactivateVcComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisVcHandle); +_IRQL_requires_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMCoIndicateReceivePacket( - IN NDIS_HANDLE NdisVcHandle, - IN PPNDIS_PACKET PacketArray, - IN UINT NumberOfPackets); + _In_ NDIS_HANDLE NdisVcHandle, + _In_ PPNDIS_PACKET PacketArray, + _In_ UINT NumberOfPackets); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMCoIndicateStatus( - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_HANDLE NdisVcHandle OPTIONAL, - IN NDIS_STATUS GeneralStatus, - IN PVOID StatusBuffer OPTIONAL, - IN ULONG StatusBufferSize); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_opt_ NDIS_HANDLE NdisVcHandle, + _In_ NDIS_STATUS GeneralStatus, + _In_reads_bytes_opt_(StatusBufferSize) PVOID StatusBuffer, + _In_ ULONG StatusBufferSize); +_IRQL_requires_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMCoReceiveComplete( - IN NDIS_HANDLE MiniportAdapterHandle); + _In_ NDIS_HANDLE MiniportAdapterHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMCoRequestComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE MiniportAdapterHandle, - IN PNDIS_REQUEST Request); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ PNDIS_REQUEST Request); +_IRQL_requires_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMCoSendComplete( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisVcHandle, - IN PNDIS_PACKET Packet); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisVcHandle, + _In_ PNDIS_PACKET Packet); /* NDIS 5.0 extensions for intermediate drivers */ +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisIMAssociateMiniport( - IN NDIS_HANDLE DriverHandle, - IN NDIS_HANDLE ProtocolHandle); + _In_ NDIS_HANDLE DriverHandle, + _In_ NDIS_HANDLE ProtocolHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisIMCancelInitializeDeviceInstance( - IN NDIS_HANDLE DriverHandle, - IN PNDIS_STRING DeviceInstance); + _In_ NDIS_HANDLE DriverHandle, + _In_ PNDIS_STRING DeviceInstance); NDISAPI VOID @@ -5022,31 +5188,35 @@ NdisIMCopySendPerPacketInfo( IN PNDIS_PACKET DstPacket, IN PNDIS_PACKET SrcPacket); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisIMDeregisterLayeredMiniport( - IN NDIS_HANDLE DriverHandle); + _In_ NDIS_HANDLE DriverHandle); +_IRQL_requires_max_(APC_LEVEL) NDISAPI NDIS_HANDLE NTAPI NdisIMGetBindingContext( - IN NDIS_HANDLE NdisBindingHandle); + _In_ NDIS_HANDLE NdisBindingHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_HANDLE NTAPI NdisIMGetDeviceContext( - IN NDIS_HANDLE MiniportAdapterHandle); + _In_ NDIS_HANDLE MiniportAdapterHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisIMInitializeDeviceInstanceEx( - IN NDIS_HANDLE DriverHandle, - IN PNDIS_STRING DriverInstance, - IN NDIS_HANDLE DeviceContext OPTIONAL); + _In_ NDIS_HANDLE DriverHandle, + _In_ PNDIS_STRING DriverInstance, + _In_opt_ NDIS_HANDLE DeviceContext); /* NDISAPI @@ -5119,15 +5289,18 @@ NdisInitializeWrapper( IN PVOID SystemSpecific2, IN PVOID SystemSpecific3); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) +__drv_preferredFunction("NdisMInitializeScatterGatherDma", "See details in NdisMAllocateMapRegisters documentation") NDISAPI NDIS_STATUS NTAPI NdisMAllocateMapRegisters( - IN NDIS_HANDLE MiniportAdapterHandle, - IN UINT DmaChannel, - IN NDIS_DMA_SIZE DmaSize, - IN ULONG PhysicalMapRegistersNeeded, - IN ULONG MaximumPhysicalMapping); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ UINT DmaChannel, + _In_ NDIS_DMA_SIZE DmaSize, + _In_ ULONG PhysicalMapRegistersNeeded, + _In_ ULONG MaximumPhysicalMapping); /* * VOID @@ -5165,41 +5338,45 @@ NdisMAllocateMapRegisters( ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->ArcDB); \ } +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisMCloseLog( - IN NDIS_HANDLE LogHandle); + _In_ NDIS_HANDLE LogHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMCreateLog( - IN NDIS_HANDLE MiniportAdapterHandle, - IN UINT Size, - OUT PNDIS_HANDLE LogHandle); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ UINT Size, + _Out_ PNDIS_HANDLE LogHandle); NDISAPI VOID NTAPI NdisMDeregisterAdapterShutdownHandler( - IN NDIS_HANDLE MiniportHandle); + _In_ NDIS_HANDLE MiniportHandle); #if NDIS_LEGACY_MINIPORT +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisMDeregisterInterrupt( - IN PNDIS_MINIPORT_INTERRUPT Interrupt); + _In_ PNDIS_MINIPORT_INTERRUPT Interrupt); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisMRegisterAdapterShutdownHandler( - IN NDIS_HANDLE MiniportHandle, - IN PVOID ShutdownContext, - IN ADAPTER_SHUTDOWN_HANDLER ShutdownHandler); + _In_ NDIS_HANDLE MiniportHandle, + _In_ PVOID ShutdownContext, + _In_ ADAPTER_SHUTDOWN_HANDLER ShutdownHandler); NDISAPI NDIS_STATUS @@ -5230,14 +5407,15 @@ NdisMSynchronizeWithInterrupt( IN PVOID SynchronizeContext); #endif /* NDIS_LEGACY_MINIPORT */ +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisMDeregisterIoPortRange( - IN NDIS_HANDLE MiniportAdapterHandle, - IN UINT InitialPort, - IN UINT NumberOfPorts, - IN PVOID PortOffset); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ UINT InitialPort, + _In_ UINT NumberOfPorts, + _In_ PVOID PortOffset); /* * VOID @@ -5326,17 +5504,19 @@ NdisMDeregisterIoPortRange( ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->FddiDB); \ } +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMFlushLog( - IN NDIS_HANDLE LogHandle); + _In_ NDIS_HANDLE LogHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisMFreeMapRegisters( - IN NDIS_HANDLE MiniportAdapterHandle); + _In_ NDIS_HANDLE MiniportAdapterHandle); /* * VOID @@ -5391,14 +5571,16 @@ NdisMFreeMapRegisters( (SystemSpecific2), \ (SystemSpecific3)) +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMMapIoSpace( - OUT PVOID *VirtualAddress, - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_PHYSICAL_ADDRESS PhysicalAddress, - IN UINT Length); + _Outptr_result_bytebuffer_(Length) PVOID *VirtualAddress, + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ NDIS_PHYSICAL_ADDRESS PhysicalAddress, + _In_ UINT Length); /* * VOID @@ -5409,14 +5591,16 @@ NdisMMapIoSpace( #define NdisMQueryInformationComplete(MiniportAdapterHandle, Status) \ (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->QueryCompleteHandler)(MiniportAdapterHandle, Status) +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMRegisterIoPortRange( - OUT PVOID *PortOffset, - IN NDIS_HANDLE MiniportAdapterHandle, - IN UINT InitialPort, - IN UINT NumberOfPorts); + _Out_ PVOID *PortOffset, + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ UINT InitialPort, + _In_ UINT NumberOfPorts); NDISAPI VOID @@ -5425,28 +5609,31 @@ NdisMSetTimer( IN PNDIS_MINIPORT_TIMER Timer, IN UINT MillisecondsToDelay); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMInitializeTimer( - IN OUT PNDIS_MINIPORT_TIMER Timer, - IN NDIS_HANDLE MiniportAdapterHandle, - IN PNDIS_TIMER_FUNCTION TimerFunction, - IN PVOID FunctionContext); + _Inout_ PNDIS_MINIPORT_TIMER Timer, + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_ PNDIS_TIMER_FUNCTION TimerFunction, + _In_ PVOID FunctionContext); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMSetPeriodicTimer( - IN PNDIS_MINIPORT_TIMER Timer, - IN UINT MillisecondPeriod); + _In_ PNDIS_MINIPORT_TIMER Timer, + _In_ UINT MillisecondPeriod); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisMCancelTimer( - IN PNDIS_MINIPORT_TIMER Timer, - OUT PBOOLEAN TimerCancelled); + _In_ PNDIS_MINIPORT_TIMER Timer, + _Out_ _At_(*TimerCancelled, _Must_inspect_result_) PBOOLEAN TimerCancelled); #if !defined(NDIS_WRAPPER) @@ -5457,7 +5644,7 @@ NdisMCancelTimer( * IN NDIS_STATUS Status, * IN BOOLEAN AddressingReset); */ -#define NdisMResetComplete(MiniportAdapterHandle, \ +#define NdisMResetComplete(MiniportAdapterHandle, \ Status, \ AddressingReset) \ { \ @@ -5550,11 +5737,12 @@ NdisMSetAttributesEx( (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->SetCompleteHandler)( \ MiniportAdapterHandle, Status) +_IRQL_requires_max_(APC_LEVEL) NDISAPI VOID NTAPI NdisMSleep( - IN ULONG MicrosecondsToSleep); + _In_ ULONG MicrosecondsToSleep); /* * VOID @@ -5597,64 +5785,73 @@ NdisMSleep( ((PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle)->TrDB); \ } +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisMWriteLogData( - IN NDIS_HANDLE LogHandle, - IN PVOID LogBuffer, - IN UINT LogBufferSize); + _In_ NDIS_HANDLE LogHandle, + _In_reads_bytes_(LogBufferSize) PVOID LogBuffer, + _In_ UINT LogBufferSize); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisMQueryAdapterResources( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE WrapperConfigurationContext, - OUT PNDIS_RESOURCE_LIST ResourceList, - IN OUT PUINT BufferSize); + _Out_ PNDIS_STATUS Status, + _In_ NDIS_HANDLE WrapperConfigurationContext, + _Out_ PNDIS_RESOURCE_LIST ResourceList, + _Inout_ PUINT BufferSize); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisTerminateWrapper( - IN NDIS_HANDLE NdisWrapperHandle, - IN PVOID SystemSpecific); + _In_ NDIS_HANDLE NdisWrapperHandle, + _In_opt_ PVOID SystemSpecific); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisMUnmapIoSpace( - IN NDIS_HANDLE MiniportAdapterHandle, - IN PVOID VirtualAddress, - IN UINT Length); + _In_ NDIS_HANDLE MiniportAdapterHandle, + _In_reads_bytes_(Length) PVOID VirtualAddress, + _In_ UINT Length); /* Event functions */ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisInitializeEvent( - OUT PNDIS_EVENT Event); + _Out_ PNDIS_EVENT Event); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisSetEvent( - IN PNDIS_EVENT Event); + _In_ PNDIS_EVENT Event); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisResetEvent( - IN PNDIS_EVENT Event); + _In_ PNDIS_EVENT Event); +_When_(MsToWait != 0, _Check_return_) +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI BOOLEAN NTAPI NdisWaitEvent( - IN PNDIS_EVENT Event, - IN UINT Timeout); + _In_ PNDIS_EVENT Event, + _In_ UINT Timeout); /* NDIS intermediate miniport structures */ @@ -5664,11 +5861,12 @@ typedef VOID (NTAPI *W_MINIPORT_CALLBACK)( /* Routines for intermediate miniport drivers */ +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisIMDeInitializeDeviceInstance( - IN NDIS_HANDLE NdisMiniportHandle); + _In_ NDIS_HANDLE NdisMiniportHandle); /* * NDIS_STATUS @@ -5717,10 +5915,10 @@ NDISAPI NDIS_STATUS NTAPI NdisIMRegisterLayeredMiniport( - IN NDIS_HANDLE NdisWrapperHandle, - IN PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, - IN UINT CharacteristicsLength, - OUT PNDIS_HANDLE DriverHandle); + _In_ NDIS_HANDLE NdisWrapperHandle, + _In_ PNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, + _In_ UINT CharacteristicsLength, + _Out_ PNDIS_HANDLE DriverHandle); NDISAPI VOID @@ -5750,101 +5948,111 @@ NdisSendPackets( IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisRequest( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle, - IN PNDIS_REQUEST NdisRequest); + _Out_ PNDIS_STATUS Status, + _In_ NDIS_HANDLE NdisBindingHandle, + _In_ PNDIS_REQUEST NdisRequest); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisReset( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle); + _Out_ PNDIS_STATUS Status, + _In_ NDIS_HANDLE NdisBindingHandle); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisDeregisterProtocol( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisProtocolHandle); + _Out_ PNDIS_STATUS Status, + _In_ NDIS_HANDLE NdisProtocolHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisOpenAdapter( - OUT PNDIS_STATUS Status, - OUT PNDIS_STATUS OpenErrorStatus, - OUT PNDIS_HANDLE NdisBindingHandle, - OUT PUINT SelectedMediumIndex, - IN PNDIS_MEDIUM MediumArray, - IN UINT MediumArraySize, - IN NDIS_HANDLE NdisProtocolHandle, - IN NDIS_HANDLE ProtocolBindingContext, - IN PNDIS_STRING AdapterName, - IN UINT OpenOptions, - IN PSTRING AddressingInformation OPTIONAL); + _At_(*Status, _Must_inspect_result_) _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_STATUS OpenErrorStatus, + _Out_ PNDIS_HANDLE NdisBindingHandle, + _Out_ PUINT SelectedMediumIndex, + _In_reads_(MediumArraySize) PNDIS_MEDIUM MediumArray, + _In_ UINT MediumArraySize, + _In_ NDIS_HANDLE NdisProtocolHandle, + _In_ NDIS_HANDLE ProtocolBindingContext, + _In_ PNDIS_STRING AdapterName, + _In_ UINT OpenOptions, + _In_opt_ PSTRING AddressingInformation); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisCloseAdapter( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle); + _Out_ PNDIS_STATUS Status, + _In_ NDIS_HANDLE NdisBindingHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisCompleteBindAdapter( - IN NDIS_HANDLE BindAdapterContext, - IN NDIS_STATUS Status, - IN NDIS_STATUS OpenStatus); + _In_ NDIS_HANDLE BindAdapterContext, + _In_ NDIS_STATUS Status, + _In_ NDIS_STATUS OpenStatus); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisCompleteUnbindAdapter( - IN NDIS_HANDLE UnbindAdapterContext, - IN NDIS_STATUS Status); + _In_ NDIS_HANDLE UnbindAdapterContext, + _In_ NDIS_STATUS Status); NDISAPI VOID NTAPI NdisSetProtocolFilter( - OUT PNDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle, - IN RECEIVE_HANDLER ReceiveHandler, - IN RECEIVE_PACKET_HANDLER ReceivePacketHandler, - IN NDIS_MEDIUM Medium, - IN UINT Offset, - IN UINT Size, - IN PUCHAR Pattern); + _At_(*Status, _Must_inspect_result_) _Out_ PNDIS_STATUS Status, + _In_ NDIS_HANDLE NdisBindingHandle, + _In_ RECEIVE_HANDLER ReceiveHandler, + _In_ RECEIVE_PACKET_HANDLER ReceivePacketHandler, + _In_ NDIS_MEDIUM Medium, + _In_ UINT Offset, + _In_ UINT Size, + _In_ PUCHAR Pattern); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisGetDriverHandle( - IN PNDIS_HANDLE NdisBindingHandle, - OUT PNDIS_HANDLE NdisDriverHandle); + _In_ PNDIS_HANDLE NdisBindingHandle, + _Out_ PNDIS_HANDLE NdisDriverHandle); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisOpenProtocolConfiguration( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE ConfigurationHandle, - IN PNDIS_STRING ProtocolSection); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_HANDLE ConfigurationHandle, + _In_ PNDIS_STRING ProtocolSection); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisCompletePnPEvent( - IN NDIS_STATUS Status, - IN NDIS_HANDLE NdisBindingHandle, - IN PNET_PNP_EVENT NetPnPEvent); + _In_ NDIS_STATUS Status, + _In_ NDIS_HANDLE NdisBindingHandle, + _In_ PNET_PNP_EVENT NetPnPEvent); /* * VOID @@ -5856,62 +6064,71 @@ NdisCompletePnPEvent( #define NdisQuerySendFlags(_Packet,_Flags) *(_Flags) = (_Packet)->Private.Flags +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisReturnPackets( - IN PNDIS_PACKET *PacketsToReturn, - IN UINT NumberOfPackets); + _In_reads_(NumberOfPackets) PNDIS_PACKET *PacketsToReturn, + _In_ UINT NumberOfPackets); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI PNDIS_PACKET NTAPI NdisGetReceivedPacket( - IN PNDIS_HANDLE NdisBindingHandle, - IN PNDIS_HANDLE MacContext); + _In_ PNDIS_HANDLE NdisBindingHandle, + _In_ PNDIS_HANDLE MacContext); +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI VOID NTAPI NdisCancelSendPackets( - IN NDIS_HANDLE NdisBindingHandle, - IN PVOID CancelId); + _In_ NDIS_HANDLE NdisBindingHandle, + _In_ _Points_to_data_ PVOID CancelId); +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI NDIS_STATUS NTAPI NdisQueryPendingIOCount( - IN PVOID NdisBindingHandle, - OUT PULONG IoCount); + _In_ _Points_to_data_ PVOID NdisBindingHandle, + _Out_ PULONG IoCount); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisRegisterProtocol( - OUT PNDIS_STATUS Status, - OUT PNDIS_HANDLE NdisProtocolHandle, - IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, - IN UINT CharacteristicsLength); + _Out_ PNDIS_STATUS Status, + _Out_ PNDIS_HANDLE NdisProtocolHandle, + _In_ PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, + _In_ UINT CharacteristicsLength); #endif /* NDIS_LEGACY_PROTOCOL */ +_IRQL_requires_max_(DISPATCH_LEVEL) NDISAPI UCHAR NTAPI NdisGeneratePartialCancelId(VOID); +_IRQL_requires_(PASSIVE_LEVEL) NDISAPI VOID NTAPI NdisReEnumerateProtocolBindings( - IN NDIS_HANDLE NdisProtocolHandle); + _In_ NDIS_HANDLE NdisProtocolHandle); NDISAPI VOID NTAPI NdisRegisterTdiCallBack( - IN TDI_REGISTER_CALLBACK RegisterCallback, - IN TDI_PNP_HANDLER PnPHandler); + _In_ TDI_REGISTER_CALLBACK RegisterCallback, + _In_ TDI_PNP_HANDLER PnPHandler); NDISAPI VOID From d15876f77595e662ba941184ddabb8b8167b9b73 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 12:03:23 +0000 Subject: [PATCH 033/289] [TOOLS/UNICODE] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55096 --- reactos/media/doc/README.WINE | 2 +- reactos/tools/unicode/string.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index f4eb2ed9546..63dac4c5798 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -21,7 +21,7 @@ When porting a new DLL from Wine to ReactOS, please do the following steps The following build tools are shared with Wine. -reactos/tools/unicode # Synced to Wine-1.3.29 +reactos/tools/unicode # Synced to Wine-1.3.37 reactos/tools/widl # Synced to Wine-1.3.26 reactos/tools/winebuild # Synced to Wine-1_1_13 reactos/tools/wmc # Synced to Wine-20081105 (~Wine-1.1.7) diff --git a/reactos/tools/unicode/string.c b/reactos/tools/unicode/string.c index 8f85c632062..0b42ea8a8cc 100644 --- a/reactos/tools/unicode/string.c +++ b/reactos/tools/unicode/string.c @@ -351,7 +351,7 @@ int vsnprintfW(WCHAR *str, size_t len, const WCHAR *format, va_list valist) { unsigned int written = 0; const WCHAR *iter = format; - char bufa[256], fmtbufa[64], *fmta; + char bufa[512], fmtbufa[64], *fmta; while (*iter) { From 7b65a2d418fb214730d53c43b164bf92bf946a5c Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 12:26:32 +0000 Subject: [PATCH 034/289] [ADVPACK] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55097 --- reactos/dll/win32/advpack/advpack.c | 4 ++-- reactos/dll/win32/advpack/advpack_private.h | 8 ++++---- reactos/dll/win32/advpack/install.c | 2 +- reactos/media/doc/README.WINE | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/dll/win32/advpack/advpack.c b/reactos/dll/win32/advpack/advpack.c index 112d38ab438..919c0bce52d 100644 --- a/reactos/dll/win32/advpack/advpack.c +++ b/reactos/dll/win32/advpack/advpack.c @@ -452,7 +452,7 @@ HRESULT WINAPI RebootCheckOnInstallW(HWND hWnd, LPCWSTR pszINF, } /* registers the OCX if do_reg is TRUE, unregisters it otherwise */ -HRESULT do_ocx_reg(HMODULE hocx, BOOL do_reg) +HRESULT do_ocx_reg(HMODULE hocx, BOOL do_reg, const WCHAR *flags, const WCHAR *param) { DLLREGISTER reg_func; @@ -519,7 +519,7 @@ HRESULT WINAPI RegisterOCX(HWND hWnd, HINSTANCE hInst, LPCSTR cmdline, INT show) if (!hm) goto done; - hr = do_ocx_reg(hm, TRUE); + hr = do_ocx_reg(hm, TRUE, str_flags, param); done: FreeLibrary(hm); diff --git a/reactos/dll/win32/advpack/advpack_private.h b/reactos/dll/win32/advpack/advpack_private.h index 3f81bba45dd..cbbbf4819af 100644 --- a/reactos/dll/win32/advpack/advpack_private.h +++ b/reactos/dll/win32/advpack/advpack_private.h @@ -21,10 +21,10 @@ #ifndef __ADVPACK_PRIVATE_H #define __ADVPACK_PRIVATE_H -HRESULT do_ocx_reg(HMODULE hocx, BOOL do_reg); -LPWSTR get_parameter(LPWSTR *params, WCHAR separator); -void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir); +HRESULT do_ocx_reg(HMODULE hocx, BOOL do_reg, const WCHAR *flags, const WCHAR *param) DECLSPEC_HIDDEN; +LPWSTR get_parameter(LPWSTR *params, WCHAR separator) DECLSPEC_HIDDEN; +void set_ldids(HINF hInf, LPCWSTR pszInstallSection, LPCWSTR pszWorkingDir) DECLSPEC_HIDDEN; -HRESULT launch_exe(LPCWSTR cmd, LPCWSTR dir, HANDLE *phEXE); +HRESULT launch_exe(LPCWSTR cmd, LPCWSTR dir, HANDLE *phEXE) DECLSPEC_HIDDEN; #endif /* __ADVPACK_PRIVATE_H */ diff --git a/reactos/dll/win32/advpack/install.c b/reactos/dll/win32/advpack/install.c index 129ea828146..6079625a04f 100644 --- a/reactos/dll/win32/advpack/install.c +++ b/reactos/dll/win32/advpack/install.c @@ -161,7 +161,7 @@ static HRESULT register_ocxs_callback(HINF hinf, PCWSTR field, const void *arg) hm = LoadLibraryExW(buffer, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (hm) { - if (do_ocx_reg(hm, TRUE) != S_OK) + if (do_ocx_reg(hm, TRUE, NULL, NULL) != S_OK) hr = E_FAIL; FreeLibrary(hm); diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 63dac4c5798..97d84fe2ab2 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -40,7 +40,7 @@ reactos/dll/directx/dxdiagn # Synced to Wine-0_9_5 reactos/dll/directx/msdmo # Autosync reactos/dll/directx/qedit # Autosync reactos/dll/directx/quartz # Autosync -reactos/dll/win32/advpack # Autosync +reactos/dll/win32/advpack # Synced to Wine-1.3.37 reactos/dll/win32/atl # Autosync reactos/dll/win32/avifil32 # Autosync reactos/dll/win32/bcrypt # Autosync From 0a0e94904854a77e9e0363ca86e1fa9a7ed837fc Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 12:26:48 +0000 Subject: [PATCH 035/289] [ADVPACK_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55098 --- rostests/winetests/advpack/advpack.c | 10 ++++----- rostests/winetests/advpack/files.c | 4 ++-- rostests/winetests/advpack/install.c | 32 ++++++++-------------------- 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/rostests/winetests/advpack/advpack.c b/rostests/winetests/advpack/advpack.c index 3ead0f25c4b..1345d72f6a4 100644 --- a/rostests/winetests/advpack/advpack.c +++ b/rostests/winetests/advpack/advpack.c @@ -130,7 +130,7 @@ static void delnode_test(void) HRESULT hr; HANDLE hn; CHAR currDir[MAX_PATH]; - int currDirLen; + UINT currDirLen; /* Native DelNode apparently does not support relative paths, so we use absolute paths for testing */ @@ -446,7 +446,7 @@ static void translateinfstringex_test(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!lstrcmpi(buffer, PROG_FILES_ROOT), "Expected %s, got %s\n", PROG_FILES_ROOT, buffer); - ok(size == lstrlenA(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", + ok(size == strlen(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", lstrlenA(PROG_FILES_ROOT)+1, size); memset(buffer, 'a', APP_PATH_LEN); @@ -457,7 +457,7 @@ static void translateinfstringex_test(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!lstrcmpi(buffer, PROG_FILES_ROOT), "Expected %s, got %s\n", PROG_FILES_ROOT, buffer); - ok(size == lstrlenA(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", + ok(size == strlen(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", lstrlenA(PROG_FILES_ROOT)+1, size); { @@ -473,7 +473,7 @@ static void translateinfstringex_test(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!lstrcmpi(buffer, drive), "Expected %s, got %s\n", drive, buffer); - ok(size == lstrlenA(drive)+1, "Expected size %d, got %d\n", + ok(size == strlen(drive)+1, "Expected size %d, got %d\n", lstrlenA(drive)+1, size); } @@ -531,7 +531,7 @@ static void translateinfstringex_test(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); ok(!lstrcmpi(buffer, PROG_FILES_ROOT), "Expected %s, got %s\n", PROG_FILES_ROOT, buffer); - ok(size == lstrlenA(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", + ok(size == strlen(PROG_FILES_ROOT)+1, "Expected size %d, got %d\n", lstrlenA(PROG_FILES_ROOT)+1, size); /* close the INF again */ diff --git a/rostests/winetests/advpack/files.c b/rostests/winetests/advpack/files.c index 5c6ea8de1f2..b29168a2cab 100644 --- a/rostests/winetests/advpack/files.c +++ b/rostests/winetests/advpack/files.c @@ -29,12 +29,12 @@ #define FOLDER_THRESHOLD 900000 /* function pointers */ -HMODULE hAdvPack; +static HMODULE hAdvPack; static HRESULT (WINAPI *pAddDelBackupEntry)(LPCSTR, LPCSTR, LPCSTR, DWORD); static HRESULT (WINAPI *pExtractFiles)(LPCSTR, LPCSTR, DWORD, LPCSTR, LPVOID, DWORD); static HRESULT (WINAPI *pAdvInstallFile)(HWND,LPCSTR,LPCSTR,LPCSTR,LPCSTR,DWORD,DWORD); -CHAR CURR_DIR[MAX_PATH]; +static CHAR CURR_DIR[MAX_PATH]; static void init_function_pointers(void) { diff --git a/rostests/winetests/advpack/install.c b/rostests/winetests/advpack/install.c index 3b0954fcf23..6a4d8d617a9 100644 --- a/rostests/winetests/advpack/install.c +++ b/rostests/winetests/advpack/install.c @@ -95,7 +95,7 @@ static void test_RunSetupCommand(void) hr = pRunSetupCommand(NULL, "idontexist.exe", "Install", systemdir, "Title", &hexe, 0, NULL); ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %d\n", hr); - ok(hexe == NULL, "Expcted hexe to be NULL\n"); + ok(hexe == NULL, "Expected hexe to be NULL\n"); ok(!TerminateProcess(hexe, 0), "Expected TerminateProcess to fail\n"); /* try a bad directory */ @@ -103,15 +103,13 @@ static void test_RunSetupCommand(void) hr = pRunSetupCommand(NULL, "winver.exe", "Install", "non\\existent\\directory", "Title", &hexe, 0, NULL); ok(hr == HRESULT_FROM_WIN32(ERROR_DIRECTORY), "Expected HRESULT_FROM_WIN32(ERROR_DIRECTORY), got %d\n", hr); - ok(hexe == NULL, "Expcted hexe to be NULL\n"); + ok(hexe == NULL, "Expected hexe to be NULL\n"); ok(!TerminateProcess(hexe, 0), "Expected TerminateProcess to fail\n"); /* try to run an exe with the RSC_FLAG_INF flag */ hexe = (HANDLE)0xdeadbeef; hr = pRunSetupCommand(NULL, "winver.exe", "Install", systemdir, "Title", &hexe, RSC_FLAG_INF | RSC_FLAG_QUIET, NULL); - ok(is_spapi_err(hr) || - hr == E_FAIL, /* win9x */ - "Expected a setupapi error or E_FAIL, got %d\n", hr); + ok(is_spapi_err(hr), "Expected a setupapi error, got %d\n", hr); ok(hexe == (HANDLE)0xdeadbeef, "Expected hexe to be 0xdeadbeef\n"); ok(!TerminateProcess(hexe, 0), "Expected TerminateProcess to fail\n"); @@ -144,9 +142,7 @@ static void test_RunSetupCommand(void) /* try a relative path to the INF, with working dir provided */ hr = pRunSetupCommand(NULL, "one\\test.inf", "DefaultInstall", dir, "Title", NULL, RSC_FLAG_INF | RSC_FLAG_QUIET, NULL); - ok(hr == ERROR_SUCCESS || - hr == E_FAIL, /* win9x */ - "Expected ERROR_SUCCESS, got %d\n", hr); + ok(hr == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", hr); /* try a relative path to the INF, NULL working dir */ hr = pRunSetupCommand(NULL, "one\\test.inf", "DefaultInstall", NULL, "Title", NULL, RSC_FLAG_INF | RSC_FLAG_QUIET, NULL); @@ -155,15 +151,11 @@ static void test_RunSetupCommand(void) /* try a relative path to the INF, empty working dir */ hr = pRunSetupCommand(NULL, "one\\test.inf", "DefaultInstall", "", "Title", NULL, RSC_FLAG_INF | RSC_FLAG_QUIET, NULL); - ok(hr == ERROR_SUCCESS || - hr == E_FAIL, /* win9x */ - "Expected ERROR_SUCCESS or E_FAIL, got %d\n", hr); + ok(hr == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", hr); /* try only the INF filename, with working dir provided */ hr = pRunSetupCommand(NULL, "test.inf", "DefaultInstall", dir, "Title", NULL, RSC_FLAG_INF | RSC_FLAG_QUIET, NULL); - ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || - hr == E_FAIL, /* win9x */ - "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) or E_FAIL, got %d\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %d\n", hr); /* try only the INF filename, NULL working dir */ hr = pRunSetupCommand(NULL, "test.inf", "DefaultInstall", NULL, "Title", NULL, RSC_FLAG_INF | RSC_FLAG_QUIET, NULL); @@ -172,9 +164,7 @@ static void test_RunSetupCommand(void) /* try only the INF filename, empty working dir */ hr = pRunSetupCommand(NULL, "test.inf", "DefaultInstall", "", "Title", NULL, RSC_FLAG_INF | RSC_FLAG_QUIET, NULL); - ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || - hr == E_FAIL, /* win9x */ - "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) or E_FAIL, got %d\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %d\n", hr); DeleteFileA("one\\test.inf"); RemoveDirectoryA("one"); @@ -183,9 +173,7 @@ static void test_RunSetupCommand(void) /* try INF file in the current directory, working directory provided */ hr = pRunSetupCommand(NULL, "test.inf", "DefaultInstall", CURR_DIR, "Title", NULL, RSC_FLAG_INF | RSC_FLAG_QUIET, NULL); - ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || - hr == E_FAIL, /* win9x */ - "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) or E_FAIL, got %d\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %d\n", hr); /* try INF file in the current directory, NULL working directory */ hr = pRunSetupCommand(NULL, "test.inf", "DefaultInstall", NULL, "Title", NULL, RSC_FLAG_INF | RSC_FLAG_QUIET, NULL); @@ -194,9 +182,7 @@ static void test_RunSetupCommand(void) /* try INF file in the current directory, empty working directory */ hr = pRunSetupCommand(NULL, "test.inf", "DefaultInstall", CURR_DIR, "Title", NULL, RSC_FLAG_INF | RSC_FLAG_QUIET, NULL); - ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) || - hr == E_FAIL, /* win9x */ - "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) or E_FAIL, got %d\n", hr); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %d\n", hr); } static void test_LaunchINFSection(void) From f9f32b715ea8f8d24ec57aabda624bc75f58c768 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 13:30:23 +0000 Subject: [PATCH 036/289] [BCRYPT] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55099 --- reactos/dll/win32/bcrypt/bcrypt.spec | 2 +- reactos/dll/win32/bcrypt/bcrypt_main.c | 14 ++++++++++++++ reactos/include/psdk/bcrypt.h | 7 +++++++ reactos/media/doc/README.WINE | 2 +- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/bcrypt/bcrypt.spec b/reactos/dll/win32/bcrypt/bcrypt.spec index 7d85e124e08..e1ffb8a96d2 100644 --- a/reactos/dll/win32/bcrypt/bcrypt.spec +++ b/reactos/dll/win32/bcrypt/bcrypt.spec @@ -14,7 +14,7 @@ @ stub BCryptDuplicateHash @ stub BCryptDuplicateKey @ stub BCryptEncrypt -@ stub BCryptEnumAlgorithms +@ stdcall BCryptEnumAlgorithms(long ptr ptr long) @ stub BCryptEnumContextFunctionProviders @ stub BCryptEnumContextFunctions @ stub BCryptEnumContexts diff --git a/reactos/dll/win32/bcrypt/bcrypt_main.c b/reactos/dll/win32/bcrypt/bcrypt_main.c index abe97503045..3cd73163ddb 100644 --- a/reactos/dll/win32/bcrypt/bcrypt_main.c +++ b/reactos/dll/win32/bcrypt/bcrypt_main.c @@ -22,6 +22,9 @@ #include "wine/debug.h" #include "winbase.h" +#include "bcrypt.h" + +typedef LONG NTSTATUS; WINE_DEFAULT_DEBUG_CHANNEL(bcrypt); @@ -38,3 +41,14 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) return TRUE; } + +NTSTATUS WINAPI BCryptEnumAlgorithms(ULONG dwAlgOperations, ULONG *pAlgCount, + BCRYPT_ALGORITHM_IDENTIFIER **ppAlgList, ULONG dwFlags) +{ + FIXME("%08x, %p, %p, %08x - stub\n", dwAlgOperations, pAlgCount, ppAlgList, dwFlags); + + *ppAlgList=NULL; + *pAlgCount=0; + + return ERROR_CALL_NOT_IMPLEMENTED; +} diff --git a/reactos/include/psdk/bcrypt.h b/reactos/include/psdk/bcrypt.h index d62d7a8c60e..fd9a6a8cf29 100644 --- a/reactos/include/psdk/bcrypt.h +++ b/reactos/include/psdk/bcrypt.h @@ -35,4 +35,11 @@ #define OPTIONAL #endif +typedef struct _BCRYPT_ALGORITHM_IDENTIFIER +{ + LPWSTR pszName; + ULONG dwClass; + ULONG dwFlags; +} BCRYPT_ALGORITHM_IDENTIFIER; + #endif /* __WINE_BCRYPT_H */ diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 97d84fe2ab2..d1bd7c6a2a2 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -43,7 +43,7 @@ reactos/dll/directx/quartz # Autosync reactos/dll/win32/advpack # Synced to Wine-1.3.37 reactos/dll/win32/atl # Autosync reactos/dll/win32/avifil32 # Autosync -reactos/dll/win32/bcrypt # Autosync +reactos/dll/win32/bcrypt # Synced to Wine-1.3.37 reactos/dll/win32/browseui # Out of sync reactos/dll/win32/cabinet # Autosync reactos/dll/win32/clusapi # Autosync From a8739a79695b2292270cc029d4d075e3ba27e200 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 13:32:25 +0000 Subject: [PATCH 037/289] [PSDK] * Fix some annotations in winddi.h. svn path=/trunk/; revision=55100 --- reactos/include/psdk/winddi.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/reactos/include/psdk/winddi.h b/reactos/include/psdk/winddi.h index 5c9f04bdecd..46738b5b278 100644 --- a/reactos/include/psdk/winddi.h +++ b/reactos/include/psdk/winddi.h @@ -1480,7 +1480,7 @@ EngCreateWnd( _In_ FLONG fl, _In_ INT iPixelFormat); -//_Analysis_noreturn_ +_Analysis_noreturn_ WIN32KAPI VOID APIENTRY @@ -1530,7 +1530,7 @@ WIN32KAPI VOID APIENTRY EngDeletePath( - _Inout_ _Post_ptr_invalid_ PATHOBJ *ppo); + _In_ _Post_ptr_invalid_ PATHOBJ *ppo); WIN32KAPI VOID @@ -1542,7 +1542,7 @@ WIN32KAPI VOID APIENTRY EngDeleteSemaphore( - _Inout_ _Post_ptr_invalid_ HSEMAPHORE hsem); + _In_ _Post_ptr_invalid_ HSEMAPHORE hsem); WIN32KAPI BOOL @@ -1554,7 +1554,7 @@ WIN32KAPI VOID APIENTRY EngDeleteWnd( - _Inout_ _Post_ptr_invalid_ WNDOBJ *pwo); + _In_ _Post_ptr_invalid_ WNDOBJ *pwo); WIN32KAPI DWORD @@ -1568,6 +1568,9 @@ EngDeviceIoControl( _In_ DWORD cjOutBufferSize, _Out_ LPDWORD lpBytesReturned); +#define DM_DEFAULT 0x00000001 +#define DM_MONOCHROME 0x00000002 + WIN32KAPI ULONG APIENTRY @@ -3031,9 +3034,6 @@ typedef VOID typedef FN_DrvDisableSurface *PFN_DrvDisableSurface; extern FN_DrvDisableSurface DrvDisableSurface; -#define DM_DEFAULT 0x00000001 -#define DM_MONOCHROME 0x00000002 - typedef ULONG (APIENTRY FN_DrvDitherColor)( _In_ DHPDEV dhpdev, From 37799a6aef8028a0fb3fd6108912a2785a707d49 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 13:58:34 +0000 Subject: [PATCH 038/289] [ADVAPI32] * Missed this change in my previous commit. svn path=/trunk/; revision=55101 --- reactos/dll/win32/advapi32/crypt/crypt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/advapi32/crypt/crypt.c b/reactos/dll/win32/advapi32/crypt/crypt.c index 42b646c0ef2..429cef7be21 100644 --- a/reactos/dll/win32/advapi32/crypt/crypt.c +++ b/reactos/dll/win32/advapi32/crypt/crypt.c @@ -235,8 +235,8 @@ static PCRYPTPROV CRYPT_LoadProvider(PCWSTR pImage) * Does it need memory allocation? */ provider->pVTable->Version = 3; - provider->pVTable->pFuncVerifyImage = CRYPT_VerifyImage; - provider->pVTable->pFuncReturnhWnd = CRYPT_ReturnhWnd; + provider->pVTable->FuncVerifyImage = CRYPT_VerifyImage; + provider->pVTable->FuncReturnhWnd = CRYPT_ReturnhWnd; provider->pVTable->dwProvType = 0; provider->pVTable->pbContextInfo = NULL; provider->pVTable->cbContextInfo = 0; From e4bb3d1eb05904c9e4bdde4bbeadd3aad3e394fa Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 14:07:25 +0000 Subject: [PATCH 039/289] [PSDK] * Update wincrypt.h from Wine. svn path=/trunk/; revision=55102 --- reactos/include/psdk/wincrypt.h | 136 ++++++++++++++++++++++++++------ 1 file changed, 110 insertions(+), 26 deletions(-) diff --git a/reactos/include/psdk/wincrypt.h b/reactos/include/psdk/wincrypt.h index 540169b266d..d6850a75d99 100644 --- a/reactos/include/psdk/wincrypt.h +++ b/reactos/include/psdk/wincrypt.h @@ -21,9 +21,6 @@ #ifndef __WINE_WINCRYPT_H #define __WINE_WINCRYPT_H -#include -/* FIXME: #include */ - #ifdef __cplusplus extern "C" { #endif @@ -33,6 +30,9 @@ extern "C" { #pragma warning(disable:4201) #endif +#include +/* FIXME: #include */ + #ifdef _ADVAPI32_ # define WINADVAPI #else @@ -598,7 +598,7 @@ typedef struct _CERT_REQUEST_INFO { typedef struct _CERT_KEYGEN_REQUEST_INFO { DWORD dwVersion; - CERT_PUBLIC_KEY_INFO SubjectPubliceKeyInfo; + CERT_PUBLIC_KEY_INFO SubjectPublicKeyInfo; LPWSTR pwszChallengeString; } CERT_KEYGEN_REQUEST_INFO, *PCERT_KEYGEN_REQUEST_INFO; @@ -688,8 +688,13 @@ typedef struct _CRYPT_SMIME_CAPABILITIES { typedef struct _VTableProvStruc { DWORD Version; - FARPROC pFuncVerifyImage; - FARPROC pFuncReturnhWnd; +#ifdef WINE_STRICT_PROTOTYPES + BOOL (WINAPI *FuncVerifyImage)(LPCSTR,BYTE*); + void (WINAPI *FuncReturnhWnd)(HWND*); +#else + FARPROC FuncVerifyImage; + FARPROC FuncReturnhWnd; +#endif DWORD dwProvType; BYTE *pbContextInfo; DWORD cbContextInfo; @@ -833,6 +838,12 @@ typedef struct _CTL_VERIFY_USAGE_STATUS { #define CERT_VERIFY_ALLOW_MORE_USAGE_FLAG 0x8 #define CERT_VERIFY_UPDATED_CTL_FLAG 0x1 +typedef struct _CERT_CHAIN { + DWORD cCerts; + PCERT_BLOB certs; + CRYPT_KEY_PROV_INFO keyLocatorInfo; +} CERT_CHAIN, *PCERT_CHAIN; + typedef struct _CERT_REVOCATION_STATUS { DWORD cbSize; DWORD dwIndex; @@ -867,6 +878,8 @@ typedef struct _CERT_TRUST_LIST_INFO { #define CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT 0x00008000 #define CERT_TRUST_IS_OFFLINE_REVOCATION 0x01000000 #define CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY 0x02000000 +#define CERT_TRUST_IS_EXPLICIT_DISTRUST 0x04000000 +#define CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT 0x08000000 #define CERT_TRUST_IS_PARTIAL_CHAIN 0x00010000 #define CERT_TRUST_CTL_IS_NOT_TIME_VALID 0x00020000 @@ -881,6 +894,8 @@ typedef struct _CERT_TRUST_LIST_INFO { #define CERT_TRUST_HAS_PREFERRED_ISSUER 0x00000100 #define CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY 0x00000200 #define CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS 0x00000400 +#define CERT_TRUST_IS_PEER_TRUSTED 0x00000800 +#define CERT_TRUST_HAS_CRL_VALIDITY_EXTENDED 0x00001000 #define CERT_TRUST_IS_COMPLEX_CHAIN 0x00010000 @@ -971,9 +986,11 @@ typedef struct _CERT_CHAIN_POLICY_STATUS { CERT_CHAIN_POLICY_IGNORE_CA_REV_UNKNOWN_FLAG \ CERT_CHAIN_POLICY_IGNORE_ROOT_REV_UNKNOWN_FLAG ) -#define CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG 0x00004000 -#define CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG 0x00008000 -#define MICROSOFT_ROOT_CERT_CHAIN_POLICY_ENABLE_TEST_ROOT_FLAG 0x00010000 +#define CERT_CHAIN_POLICY_IGNORE_PEER_TRUST_FLAG 0x00001000 +#define CERT_CHAIN_POLICY_IGNORE_NOT_SUPPORTED_CRITICAL_EXT_FLAG 0x00002000 +#define CERT_CHAIN_POLICY_TRUST_TESTROOT_FLAG 0x00004000 +#define CERT_CHAIN_POLICY_ALLOW_TESTROOT_FLAG 0x00008000 +#define MICROSOFT_ROOT_CERT_CHAIN_POLICY_ENABLE_TEST_ROOT_FLAG 0x00010000 typedef struct _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA { DWORD cbSize; @@ -2273,6 +2290,9 @@ static const WCHAR CERT_TRUST_PUB_AUTHENTICODE_FLAGS_VALUE_NAME[] = "CertDllVerifyCertificateChainPolicy" #define URL_OID_GET_OBJECT_URL_FUNC "UrlDllGetObjectUrl" #define TIME_VALID_OID_GET_OBJECT_FUNC "TimeValidDllGetObject" +#define CMSG_OID_GEN_CONTENT_ENCRYPT_KEY_FUNC "CryptMsgDllGenContentEncryptKey" +#define CMSG_OID_EXPORT_KEY_TRANS_FUNC "CryptMsgDllExportKeyTrans" +#define CMSG_OID_IMPORT_KEY_TRANS_FUNC "CryptMsgDllImportKeyTrans" #define CRYPT_OID_REGPATH "Software\\Microsoft\\Cryptography\\OID" #define CRYPT_OID_REG_ENCODING_TYPE_PREFIX "EncodingType " @@ -3007,7 +3027,12 @@ typedef struct _CTL_FIND_SUBJECT_PARA #define szOID_AUTO_ENROLL_CTL_USAGE "1.3.6.1.4.1.311.20.1" #define szOID_ENROLL_CERTTYPE_EXTENSION "1.3.6.1.4.1.311.20.2" #define szOID_ENROLLMENT_AGENT "1.3.6.1.4.1.311.20.2.1" +#ifndef szOID_KP_SMARTCARD_LOGON #define szOID_KP_SMARTCARD_LOGON "1.3.6.1.4.1.311.20.2.2" +#endif +#ifndef szOID_NT_PRINCIPAL_NAME +#define szOID_NT_PRINCIPAL_NAME "1.3.6.1.4.1.311.20.2.3" +#endif #define szOID_CERT_MANIFOLD "1.3.6.1.4.1.311.20.3" #ifndef szOID_CERTSRV_CA_VERSION #define szOID_CERTSRV_CA_VERSION "1.3.6.1.4.1.311.21.1" @@ -3079,21 +3104,6 @@ typedef struct _CTL_FIND_SUBJECT_PARA #define szOID_SERIALIZED "1.3.6.1.4.1.311.10.3.3.1" #endif -#define szOID_AUTO_ENROLL_CTL_USAGE "1.3.6.1.4.1.311.20.1" -#define szOID_ENROLL_CERTTYPE_EXTENSION "1.3.6.1.4.1.311.20.2" -#define szOID_ENROLLMENT_AGENT "1.3.6.1.4.1.311.20.2.1" -#ifndef szOID_KP_SMARTCARD_LOGON -#define szOID_KP_SMARTCARD_LOGON "1.3.6.1.4.1.311.20.2.2" -#endif -#ifndef szOID_NT_PRINCIPAL_NAME -#define szOID_NT_PRINCIPAL_NAME "1.3.6.1.4.1.311.20.2.3" -#endif -#define szOID_CERT_MANIFOLD "1.3.6.1.4.1.311.20.3" - -#ifndef szOID_CERTSRV_CA_VERSION -#define szOID_CERTSRV_CA_VERSION "1.3.6.1.4.1.311.21.1" -#endif - #ifndef szOID_PRODUCT_UPDATE #define szOID_PRODUCT_UPDATE "1.3.6.1.4.1.311.31.1" #endif @@ -3427,6 +3437,7 @@ typedef struct _CERT_ID #define CERT_ID_KEY_IDENTIFIER 2 #define CERT_ID_SHA1_HASH 3 +#ifndef USE_WC_PREFIX #undef CMSG_DATA /* may be defined by sys/socket.h */ #define CMSG_DATA 1 #define CMSG_SIGNED 2 @@ -3441,6 +3452,21 @@ typedef struct _CERT_ID #define CMSG_ENVELOPED_FLAG (1 << CMSG_ENVELOPED) #define CMSG_SIGNED_AND_ENVELOPED_FLAG (1 << CMSG_SIGNED_AND_ENVELOPED) #define CMSG_ENCRYPTED_FLAG (1 << CMSG_ENCRYPTED) +#else +#define WC_CMSG_DATA 1 +#define WC_CMSG_SIGNED 2 +#define WC_CMSG_ENVELOPED 3 +#define WC_CMSG_SIGNED_AND_ENVELOPED 4 +#define WC_CMSG_HASHED 5 +#define WC_CMSG_ENCRYPTED 6 + +#define WC_CMSG_ALL_FLAGS ~0U +#define WC_CMSG_DATA_FLAG (1 << WC_CMSG_DATA) +#define WC_CMSG_SIGNED_FLAG (1 << WC_CMSG_SIGNED) +#define WC_CMSG_ENVELOPED_FLAG (1 << WC_CMSG_ENVELOPED) +#define WC_CMSG_SIGNED_AND_ENVELOPED_FLAG (1 << WC_CMSG_SIGNED_AND_ENVELOPED) +#define WC_CMSG_ENCRYPTED_FLAG (1 << WC_CMSG_ENCRYPTED) +#endif typedef struct _CMSG_SIGNER_ENCODE_INFO { @@ -3782,6 +3808,54 @@ typedef struct _CMSG_CMS_RECIPIENT_INFO { #define CMSG_KEY_AGREE_VERSION CMSG_ENVELOPED_RECIPIENT_V3 #define CMSG_MAIL_LIST_VERSION CMSG_ENVELOPED_RECIPIENT_V4 +typedef void * (WINAPI *PFN_CMSG_ALLOC)(size_t cb); +typedef void (WINAPI *PFN_CMSG_FREE)(void *pv); + +typedef struct _CMSG_CONTENT_ENCRYPT_INFO { + DWORD cbSize; + HCRYPTPROV hCryptProv; + CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm; + void *pvEncryptionAuxInfo; + DWORD cRecipients; + PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients; + PFN_CMSG_ALLOC pfnAlloc; + PFN_CMSG_FREE pfnFree; + DWORD dwEncryptFlags; + HCRYPTKEY hContentEncryptKey; + DWORD dwFlags; +} CMSG_CONTENT_ENCRYPT_INFO, *PCMSG_CONTENT_ENCRYPT_INFO; + +typedef struct _CMSG_KEY_TRANS_ENCRYPT_INFO { + DWORD cbSize; + DWORD dwRecipientIndex; + CRYPT_ALGORITHM_IDENTIFIER KeyEncryptionAlgorithm; + CRYPT_DATA_BLOB EncryptedKey; + DWORD dwFlags; +} CMSG_KEY_TRANS_ENCRYPT_INFO, *PCMSG_KEY_TRANS_ENCRYPT_INFO; + +typedef struct _CMSG_CTRL_KEY_TRANS_DECRYPT_PARA { + DWORD cbSize; + HCRYPTPROV hCryptProv; + DWORD dwKeySpec; + PCMSG_KEY_TRANS_RECIPIENT_INFO pKeyTrans; + DWORD dwRecipientIndex; +} CMSG_CTRL_KEY_TRANS_DECRYPT_PARA, *PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA; + +typedef BOOL (WINAPI *PFN_CMSG_GEN_CONTENT_ENCRYPT_KEY)( + PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, DWORD dwFlags, + void *pvReserved); + +typedef BOOL (WINAPI *PFN_CMSG_EXPORT_KEY_TRANS)( + PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, + PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO pKeyTransEncodeInfo, + PCMSG_KEY_TRANS_ENCRYPT_INFO pKeyTransEncryptInfo, + DWORD dwFlags, void *pvReserved); + +typedef BOOL (WINAPI *PFN_CMSG_IMPORT_KEY_TRANS)( + PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm, + PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara, DWORD dwFlags, + void *pvReserved, HCRYPTKEY *phContentEncryptKey); + /* CryptMsgGetAndVerifySigner flags */ #define CMSG_TRUSTED_SIGNER_FLAG 0x1 #define CMSG_SIGNER_ONLY_FLAG 0x2 @@ -3956,6 +4030,9 @@ BOOL WINAPI CertEnumSystemStore(DWORD dwFlags, void *pvSystemStoreLocationPara, BOOL WINAPI CertEnumPhysicalStore(const void *pvSystemStore, DWORD dwFlags, void *pvArg, PFN_CERT_ENUM_PHYSICAL_STORE pfnEnum); +BOOL WINAPI CertRegisterPhysicalStore(const void *pvSystemStore, DWORD dwFlags, + LPCWSTR pwszStoreName, PCERT_PHYSICAL_STORE_INFO pStoreInfo, void *pvReserved); + BOOL WINAPI CertSaveStore(HCERTSTORE hCertStore, DWORD dwMsgAndCertEncodingType, DWORD dwSaveAs, DWORD dwSaveTo, void* pvSaveToPara, DWORD dwFlags); @@ -4169,9 +4246,9 @@ BOOL WINAPI CertGetEnhancedKeyUsage(PCCERT_CONTEXT pCertContext, DWORD dwFlags, BOOL WINAPI CertSetEnhancedKeyUsage(PCCERT_CONTEXT pCertContext, PCERT_ENHKEY_USAGE pUsage); BOOL WINAPI CertAddEnhancedKeyUsageIdentifier(PCCERT_CONTEXT pCertContext, - LPCSTR pszUsageIdentifer); + LPCSTR pszUsageIdentifier); BOOL WINAPI CertRemoveEnhancedKeyUsageIdentifier(PCCERT_CONTEXT pCertContext, - LPCSTR pszUsageIdentifer); + LPCSTR pszUsageIdentifier); BOOL WINAPI CertGetValidUsages(DWORD cCerts, PCCERT_CONTEXT *rghCerts, int *cNumOIDs, LPSTR *rghOIDs, DWORD *pcbOIDs); @@ -4450,6 +4527,8 @@ BOOL WINAPI PFXExportCertStoreEx(HCERTSTORE hStore, CRYPT_DATA_BLOB *pPFX, LPCWSTR szPassword, void *pvReserved, DWORD dwFlags); BOOL WINAPI PFXExportCertStore(HCERTSTORE hStore, CRYPT_DATA_BLOB *pPFX, LPCWSTR szPassword, DWORD dwFlags); +BOOL WINAPI PFXVerifyPassword(CRYPT_DATA_BLOB *pPFX, LPCWSTR szPassword, + DWORD dwFlags); /* cryptnet.dll functions */ BOOL WINAPI CryptCancelAsyncRetrieval(HCRYPTASYNC hAsyncRetrieval); @@ -4480,6 +4559,11 @@ BOOL WINAPI CryptRetrieveObjectByUrlW(LPCWSTR pszURL, LPCSTR pszObjectOid, PCRYPT_RETRIEVE_AUX_INFO pAuxInfo); #define CryptRetrieveObjectByUrl WINELIB_NAME_AW(CryptRetrieveObjectByUrl) +/* Not found in crypt32.dll but in softpub.dll */ +HRESULT WINAPI FindCertsByIssuer(PCERT_CHAIN pCertChains, DWORD *pcbCertChains, + DWORD *pcCertChains, BYTE* pbEncodedIssuerName, DWORD cbEncodedIssuerName, + LPCWSTR pwszPurpose, DWORD dwKeySpec); + #ifdef _MSC_VER #pragma warning(pop) #endif From 5cf9ee2b66f3eaa436df3cbf704ae922fdb56db3 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 15:12:50 +0000 Subject: [PATCH 040/289] [CABINET] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55103 --- reactos/dll/win32/cabinet/CMakeLists.txt | 12 +- reactos/dll/win32/cabinet/cabinet.h | 125 - reactos/dll/win32/cabinet/cabinet.rbuild | 3 + reactos/dll/win32/cabinet/cabinet_main.c | 26 +- reactos/dll/win32/cabinet/fci.c | 3171 +++++++--------------- reactos/dll/win32/cabinet/fdi.c | 499 ++-- reactos/media/doc/README.WINE | 2 +- 7 files changed, 1278 insertions(+), 2560 deletions(-) diff --git a/reactos/dll/win32/cabinet/CMakeLists.txt b/reactos/dll/win32/cabinet/CMakeLists.txt index e90ef01ac4c..a79b033fb63 100644 --- a/reactos/dll/win32/cabinet/CMakeLists.txt +++ b/reactos/dll/win32/cabinet/CMakeLists.txt @@ -1,7 +1,11 @@ -add_definitions(-D__WINESRC__) +add_definitions( + -D__WINESRC__ + -DHAVE_ZLIB) -include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +include_directories( + ${REACTOS_SOURCE_DIR}/include/reactos/wine + ${REACTOS_SOURCE_DIR}/include/reactos/libs/zlib) spec2def(cabinet.dll cabinet.spec) @@ -16,8 +20,8 @@ list(APPEND SOURCE add_library(cabinet SHARED ${SOURCE}) set_module_type(cabinet win32dll ENTRYPOINT 0) -target_link_libraries(cabinet wine) -add_importlibs(cabinet kernel32 ntdll) +target_link_libraries(cabinet wine zlib) +add_importlibs(cabinet msvcrt kernel32 ntdll) add_importlib_target(cabinet.spec) add_pch(cabinet cabinet.h) add_dependencies(cabinet psdk) diff --git a/reactos/dll/win32/cabinet/cabinet.h b/reactos/dll/win32/cabinet/cabinet.h index cd82d14da45..b84c3a7c5d7 100644 --- a/reactos/dll/win32/cabinet/cabinet.h +++ b/reactos/dll/win32/cabinet/cabinet.h @@ -306,136 +306,11 @@ typedef struct cds_forward { } methods; } cab_decomp_state; -/* _Int as in "Internal" fyi */ - -typedef struct { - unsigned int FCI_Intmagic; - PERF perf; - PFNFCIFILEPLACED pfnfiledest; - PFNFCIALLOC pfnalloc; - PFNFCIFREE pfnfree; - PFNFCIOPEN pfnopen; - PFNFCIREAD pfnread; - PFNFCIWRITE pfnwrite; - PFNFCICLOSE pfnclose; - PFNFCISEEK pfnseek; - PFNFCIDELETE pfndelete; - PFNFCIGETTEMPFILE pfnfcigtf; - PCCAB pccab; - BOOL fPrevCab; - BOOL fNextCab; - BOOL fSplitFolder; - cab_ULONG statusFolderCopied; - cab_ULONG statusFolderTotal; - BOOL fGetNextCabInVain; - void *pv; - char szPrevCab[CB_MAX_CABINET_NAME]; /* previous cabinet name */ - char szPrevDisk[CB_MAX_DISK_NAME]; /* disk name of previous cabinet */ - CCAB oldCCAB; - char* data_in; /* uncompressed data blocks */ - cab_UWORD cdata_in; - char* data_out; /* compressed data blocks */ - ULONG cCompressedBytesInFolder; - cab_UWORD cFolders; - cab_UWORD cFiles; - cab_ULONG cDataBlocks; - cab_ULONG cbFileRemainer; /* uncompressed, yet to be written data */ - /* of spanned file of a spanning folder of a spanning cabinet */ - char szFileNameCFDATA1[CB_MAX_FILENAME]; - int handleCFDATA1; - char szFileNameCFFILE1[CB_MAX_FILENAME]; - int handleCFFILE1; - char szFileNameCFDATA2[CB_MAX_FILENAME]; - int handleCFDATA2; - char szFileNameCFFILE2[CB_MAX_FILENAME]; - int handleCFFILE2; - char szFileNameCFFOLDER[CB_MAX_FILENAME]; - int handleCFFOLDER; - cab_ULONG sizeFileCFDATA1; - cab_ULONG sizeFileCFFILE1; - cab_ULONG sizeFileCFDATA2; - cab_ULONG sizeFileCFFILE2; - cab_ULONG sizeFileCFFOLDER; - BOOL fNewPrevious; - cab_ULONG estimatedCabinetSize; -} FCI_Int, *PFCI_Int; - -typedef struct { - unsigned int FDI_Intmagic; - PFNALLOC pfnalloc; - PFNFREE pfnfree; - PFNOPEN pfnopen; - PFNREAD pfnread; - PFNWRITE pfnwrite; - PFNCLOSE pfnclose; - PFNSEEK pfnseek; - PERF perf; -} FDI_Int, *PFDI_Int; - -/* cast an HFCI into a PFCI_Int */ -#define PFCI_INT(hfci) ((PFCI_Int)(hfci)) - -/* cast an HFDI into a PFDI_Int */ -#define PFDI_INT(hfdi) ((PFDI_Int)(hfdi)) - -/* quick pfci method invokers */ -#define PFCI_ALLOC(hfdi, size) ((*PFCI_INT(hfdi)->pfnalloc) (size)) -#define PFCI_FREE(hfdi, ptr) ((*PFCI_INT(hfdi)->pfnfree) (ptr)) -#define PFCI_GETTEMPFILE(hfci,name,length) ((*PFCI_INT(hfci)->pfnfcigtf)(name,length,PFCI_INT(hfci)->pv)) -#define PFCI_DELETE(hfci,name,err,pv) ((*PFCI_INT(hfci)->pfndelete)(name,err,pv)) -#define PFCI_OPEN(hfci,name,oflag,pmode,err,pv) ((*PFCI_INT(hfci)->pfnopen)(name,oflag,pmode,err,pv)) -#define PFCI_READ(hfci,hf,memory,cb,err,pv)((*PFCI_INT(hfci)->pfnread)(hf,memory,cb,err,pv)) -#define PFCI_WRITE(hfci,hf,memory,cb,err,pv) ((*PFCI_INT(hfci)->pfnwrite)(hf,memory,cb,err,pv)) -#define PFCI_CLOSE(hfci,hf,err,pv) ((*PFCI_INT(hfci)->pfnclose)(hf,err,pv)) -#define PFCI_SEEK(hfci,hf,dist,seektype,err,pv)((*PFCI_INT(hfci)->pfnseek)(hf,dist,seektype,err,pv)) -#define PFCI_FILEPLACED(hfci,pccab,name,cb,cont,pv)((*PFCI_INT(hfci)->pfnfiledest)(pccab,name,cb,cont,pv)) - -/* quickie pfdi method invokers */ -#define PFDI_ALLOC(hfdi, size) ((*PFDI_INT(hfdi)->pfnalloc) (size)) -#define PFDI_FREE(hfdi, ptr) ((*PFDI_INT(hfdi)->pfnfree) (ptr)) -#define PFDI_OPEN(hfdi, file, flag, mode) ((*PFDI_INT(hfdi)->pfnopen) (file, flag, mode)) -#define PFDI_READ(hfdi, hf, pv, cb) ((*PFDI_INT(hfdi)->pfnread) (hf, pv, cb)) -#define PFDI_WRITE(hfdi, hf, pv, cb) ((*PFDI_INT(hfdi)->pfnwrite) (hf, pv, cb)) -#define PFDI_CLOSE(hfdi, hf) ((*PFDI_INT(hfdi)->pfnclose) (hf)) -#define PFDI_SEEK(hfdi, hf, dist, type) ((*PFDI_INT(hfdi)->pfnseek) (hf, dist, type)) - -#define FCI_INT_MAGIC 0xfcfcfc05 -#define FDI_INT_MAGIC 0xfdfdfd05 - -#define REALLY_IS_FCI(hfci) ( \ - ((hfci) != NULL) && \ - (PFCI_INT(hfci)->FCI_Intmagic == FCI_INT_MAGIC) ) - -#define REALLY_IS_FDI(hfdi) ( \ - ((hfdi) != NULL) && \ - (PFDI_INT(hfdi)->FDI_Intmagic == FDI_INT_MAGIC) ) - /* * the rest of these are somewhat kludgy macros which are shared between fdi.c * and cabextract.c. */ -#define ZIPNEEDBITS(n) {while(k<(n)){cab_LONG c=*(ZIP(inpos)++);\ - b|=((cab_ULONG)c)<>=(n);k-=(n);} - -/* endian-neutral reading of little-endian data */ -#define EndGetI32(a) ((((a)[3])<<24)|(((a)[2])<<16)|(((a)[1])<<8)|((a)[0])) -#define EndGetI16(a) ((((a)[1])<<8)|((a)[0])) - -#define CAB(x) (decomp_state->x) -#define ZIP(x) (decomp_state->methods.zip.x) -#define QTM(x) (decomp_state->methods.qtm.x) -#define LZX(x) (decomp_state->methods.lzx.x) -#define DECR_OK (0) -#define DECR_DATAFORMAT (1) -#define DECR_ILLEGALDATA (2) -#define DECR_NOMEMORY (3) -#define DECR_CHECKSUM (4) -#define DECR_INPUT (5) -#define DECR_OUTPUT (6) -#define DECR_USERABORT (7) - /* Bitstream reading macros (Quantum / normal byte order) * * Q_INIT_BITSTREAM should be used first to set up the system diff --git a/reactos/dll/win32/cabinet/cabinet.rbuild b/reactos/dll/win32/cabinet/cabinet.rbuild index 22b32681fab..5314c1b3c05 100644 --- a/reactos/dll/win32/cabinet/cabinet.rbuild +++ b/reactos/dll/win32/cabinet/cabinet.rbuild @@ -5,7 +5,9 @@ . include/reactos/wine + include/reactos/libs/zlib + cabinet_main.c fci.c fdi.c @@ -13,6 +15,7 @@ cabinet.rc cabinet.h wine + zlib ntdll diff --git a/reactos/dll/win32/cabinet/cabinet_main.c b/reactos/dll/win32/cabinet/cabinet_main.c index 45454f403e6..1f0daf8b46f 100644 --- a/reactos/dll/win32/cabinet/cabinet_main.c +++ b/reactos/dll/win32/cabinet/cabinet_main.c @@ -331,7 +331,7 @@ HRESULT WINAPI Extract(SESSION *dest, LPCSTR szCabName) { HRESULT res = S_OK; HFDI hfdi; - char *str, *path, *name; + char *str, *end, *path = NULL, *name = NULL; TRACE("(%p, %s)\n", dest, szCabName); @@ -363,13 +363,22 @@ HRESULT WINAPI Extract(SESSION *dest, LPCSTR szCabName) } lstrcpyA(str, szCabName); - path = str; - name = strrchr(path, '\\'); - if (name) - *name++ = 0; + if ((end = strrchr(str, '\\'))) + { + end++; + name = HeapAlloc( GetProcessHeap(), 0, strlen(end) + 1 ); + if (!name) + { + res = E_OUTOFMEMORY; + goto end; + } + strcpy( name, end ); + *end = 0; + path = str; + } else { - name = path; + name = str; path = NULL; } @@ -379,10 +388,9 @@ HRESULT WINAPI Extract(SESSION *dest, LPCSTR szCabName) fdi_notify_extract, NULL, dest)) res = HRESULT_FROM_WIN32(GetLastError()); - HeapFree(GetProcessHeap(), 0, str); end: - + HeapFree(GetProcessHeap(), 0, path); + HeapFree(GetProcessHeap(), 0, name); FDIDestroy(hfdi); - return res; } diff --git a/reactos/dll/win32/cabinet/fci.c b/reactos/dll/win32/cabinet/fci.c index 4166598ee97..70d4f3f170f 100644 --- a/reactos/dll/win32/cabinet/fci.c +++ b/reactos/dll/win32/cabinet/fci.c @@ -3,6 +3,7 @@ * * Copyright 2002 Patrik Stridvall * Copyright 2005 Gerold Jens Wucherpfennig + * Copyright 2011 Alexandre Julliard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -23,11 +24,9 @@ There is still some work to be done: -- no real compression yet - unknown behaviour if files>=2GB or cabinet >=4GB - check if the maximum size for a cabinet is too small to store any data - call pfnfcignc on exactly the same position as MS FCIAddFile in every case -- probably check err */ @@ -35,9 +34,13 @@ There is still some work to be done: #include "config.h" +#include #include #include #include +#ifdef HAVE_ZLIB +# include +#endif #include "windef.h" #include "winbase.h" @@ -45,8 +48,10 @@ There is still some work to be done: #include "winternl.h" #include "fci.h" #include "cabinet.h" +#include "wine/list.h" #include "wine/debug.h" +WINE_DEFAULT_DEBUG_CHANNEL(cabinet); #ifdef WORDS_BIGENDIAN #define fci_endian_ulong(x) RtlUlongByteSwap(x) @@ -57,13 +62,6 @@ There is still some work to be done: #endif -#define fci_set_error(A,B,C) do { \ - p_fci_internal->perf->erfOper = A; \ - p_fci_internal->perf->erfType = B; \ - p_fci_internal->perf->fError = C; \ - if (B) SetLastError(B); } while(0) - - typedef struct { cab_UBYTE signature[4]; /* !CAB for unfinished cabinets else MSCF */ cab_ULONG reserved1; @@ -108,6 +106,849 @@ typedef struct { /* compressed data */ } CFDATA; +struct temp_file +{ + INT_PTR handle; + char name[CB_MAX_FILENAME]; +}; + +struct folder +{ + struct list entry; + struct list files_list; + struct list blocks_list; + struct temp_file data; + cab_ULONG data_start; + cab_UWORD data_count; + TCOMP compression; +}; + +struct file +{ + struct list entry; + cab_ULONG size; /* uncompressed size */ + cab_ULONG offset; /* offset in folder */ + cab_UWORD folder; /* index of folder */ + cab_UWORD date; + cab_UWORD time; + cab_UWORD attribs; + char name[1]; +}; + +struct data_block +{ + struct list entry; + cab_UWORD compressed; + cab_UWORD uncompressed; +}; + +typedef struct FCI_Int +{ + unsigned int magic; + PERF perf; + PFNFCIFILEPLACED fileplaced; + PFNFCIALLOC alloc; + PFNFCIFREE free; + PFNFCIOPEN open; + PFNFCIREAD read; + PFNFCIWRITE write; + PFNFCICLOSE close; + PFNFCISEEK seek; + PFNFCIDELETE delete; + PFNFCIGETTEMPFILE gettemp; + CCAB ccab; + PCCAB pccab; + BOOL fPrevCab; + BOOL fNextCab; + BOOL fSplitFolder; + cab_ULONG statusFolderCopied; + cab_ULONG statusFolderTotal; + BOOL fGetNextCabInVain; + void *pv; + char szPrevCab[CB_MAX_CABINET_NAME]; /* previous cabinet name */ + char szPrevDisk[CB_MAX_DISK_NAME]; /* disk name of previous cabinet */ + unsigned char data_in[CAB_BLOCKMAX]; /* uncompressed data blocks */ + unsigned char data_out[2 * CAB_BLOCKMAX]; /* compressed data blocks */ + cab_UWORD cdata_in; + ULONG cCompressedBytesInFolder; + cab_UWORD cFolders; + cab_UWORD cFiles; + cab_ULONG cDataBlocks; + cab_ULONG cbFileRemainer; /* uncompressed, yet to be written data */ + /* of spanned file of a spanning folder of a spanning cabinet */ + struct temp_file data; + BOOL fNewPrevious; + cab_ULONG estimatedCabinetSize; + struct list folders_list; + struct list files_list; + struct list blocks_list; + cab_ULONG folders_size; + cab_ULONG files_size; /* size of files not yet assigned to a folder */ + cab_ULONG placed_files_size; /* size of files already placed into a folder */ + cab_ULONG pending_data_size; /* size of data not yet assigned to a folder */ + cab_ULONG folders_data_size; /* total size of data contained in the current folders */ + TCOMP compression; + cab_UWORD (*compress)(struct FCI_Int *); +} FCI_Int; + +#define FCI_INT_MAGIC 0xfcfcfc05 + +static void set_error( FCI_Int *fci, int oper, int err ) +{ + fci->perf->erfOper = oper; + fci->perf->erfType = err; + fci->perf->fError = TRUE; + if (err) SetLastError( err ); +} + +static FCI_Int *get_fci_ptr( HFCI hfci ) +{ + FCI_Int *fci= (FCI_Int *)hfci; + + if (!fci || fci->magic != FCI_INT_MAGIC) + { + SetLastError( ERROR_INVALID_HANDLE ); + return NULL; + } + return fci; +} + +/* compute the cabinet header size */ +static cab_ULONG get_header_size( FCI_Int *fci ) +{ + cab_ULONG ret = sizeof(CFHEADER) + fci->ccab.cbReserveCFHeader; + + if (fci->ccab.cbReserveCFHeader || fci->ccab.cbReserveCFFolder || fci->ccab.cbReserveCFData) + ret += 4; + + if (fci->fPrevCab) + ret += strlen( fci->szPrevCab ) + 1 + strlen( fci->szPrevDisk ) + 1; + + if (fci->fNextCab) + ret += strlen( fci->pccab->szCab ) + 1 + strlen( fci->pccab->szDisk ) + 1; + + return ret; +} + +static BOOL create_temp_file( FCI_Int *fci, struct temp_file *file ) +{ + int err; + + if (!fci->gettemp( file->name, CB_MAX_FILENAME, fci->pv )) + { + set_error( fci, FCIERR_TEMP_FILE, ERROR_FUNCTION_FAILED ); + return FALSE; + } + if ((file->handle = fci->open( file->name, _O_RDWR | _O_CREAT | _O_EXCL | _O_BINARY, + _S_IREAD | _S_IWRITE, &err, fci->pv )) == -1) + { + set_error( fci, FCIERR_TEMP_FILE, err ); + return FALSE; + } + return TRUE; +} + +static BOOL close_temp_file( FCI_Int *fci, struct temp_file *file ) +{ + int err; + + if (file->handle == -1) return TRUE; + if (fci->close( file->handle, &err, fci->pv ) == -1) + { + set_error( fci, FCIERR_TEMP_FILE, err ); + return FALSE; + } + file->handle = -1; + if (fci->delete( file->name, &err, fci->pv ) == -1) + { + set_error( fci, FCIERR_TEMP_FILE, err ); + return FALSE; + } + return TRUE; +} + +static struct file *add_file( FCI_Int *fci, const char *filename ) +{ + unsigned int size = FIELD_OFFSET( struct file, name[strlen(filename) + 1] ); + struct file *file = fci->alloc( size ); + + if (!file) + { + set_error( fci, FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); + return NULL; + } + file->size = 0; + file->offset = fci->cDataBlocks * CAB_BLOCKMAX + fci->cdata_in; + file->folder = fci->cFolders; + file->date = 0; + file->time = 0; + file->attribs = 0; + strcpy( file->name, filename ); + list_add_tail( &fci->files_list, &file->entry ); + fci->files_size += sizeof(CFFILE) + strlen(filename) + 1; + return file; +} + +static struct file *copy_file( FCI_Int *fci, const struct file *orig ) +{ + unsigned int size = FIELD_OFFSET( struct file, name[strlen(orig->name) + 1] ); + struct file *file = fci->alloc( size ); + + if (!file) + { + set_error( fci, FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); + return NULL; + } + memcpy( file, orig, size ); + return file; +} + +static void free_file( FCI_Int *fci, struct file *file ) +{ + list_remove( &file->entry ); + fci->free( file ); +} + +/* create a new data block for the data in fci->data_in */ +static BOOL add_data_block( FCI_Int *fci, PFNFCISTATUS status_callback ) +{ + int err; + struct data_block *block; + + if (!fci->cdata_in) return TRUE; + + if (fci->data.handle == -1 && !create_temp_file( fci, &fci->data )) return FALSE; + + if (!(block = fci->alloc( sizeof(*block) ))) + { + set_error( fci, FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); + return FALSE; + } + block->uncompressed = fci->cdata_in; + block->compressed = fci->compress( fci ); + + if (fci->write( fci->data.handle, fci->data_out, + block->compressed, &err, fci->pv ) != block->compressed) + { + set_error( fci, FCIERR_TEMP_FILE, err ); + fci->free( block ); + return FALSE; + } + + fci->cdata_in = 0; + fci->pending_data_size += sizeof(CFDATA) + fci->ccab.cbReserveCFData + block->compressed; + fci->cCompressedBytesInFolder += block->compressed; + fci->cDataBlocks++; + list_add_tail( &fci->blocks_list, &block->entry ); + + if (status_callback( statusFile, block->compressed, block->uncompressed, fci->pv ) == -1) + { + set_error( fci, FCIERR_USER_ABORT, 0 ); + return FALSE; + } + return TRUE; +} + +/* add compressed blocks for all the data that can be read from the file */ +static BOOL add_file_data( FCI_Int *fci, char *sourcefile, char *filename, BOOL execute, + PFNFCIGETOPENINFO get_open_info, PFNFCISTATUS status_callback ) +{ + int err, len; + INT_PTR handle; + struct file *file; + + if (!(file = add_file( fci, filename ))) return FALSE; + + handle = get_open_info( sourcefile, &file->date, &file->time, &file->attribs, &err, fci->pv ); + if (handle == -1) + { + free_file( fci, file ); + set_error( fci, FCIERR_OPEN_SRC, err ); + return FALSE; + } + if (execute) file->attribs |= _A_EXEC; + + for (;;) + { + len = fci->read( handle, fci->data_in + fci->cdata_in, + CAB_BLOCKMAX - fci->cdata_in, &err, fci->pv ); + if (!len) break; + + if (len == -1) + { + set_error( fci, FCIERR_READ_SRC, err ); + return FALSE; + } + file->size += len; + fci->cdata_in += len; + if (fci->cdata_in == CAB_BLOCKMAX && !add_data_block( fci, status_callback )) return FALSE; + } + fci->close( handle, &err, fci->pv ); + return TRUE; +} + +static void free_data_block( FCI_Int *fci, struct data_block *block ) +{ + list_remove( &block->entry ); + fci->free( block ); +} + +static struct folder *add_folder( FCI_Int *fci ) +{ + struct folder *folder = fci->alloc( sizeof(*folder) ); + + if (!folder) + { + set_error( fci, FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); + return NULL; + } + folder->data.handle = -1; + folder->data_start = fci->folders_data_size; + folder->data_count = 0; + folder->compression = fci->compression; + list_init( &folder->files_list ); + list_init( &folder->blocks_list ); + list_add_tail( &fci->folders_list, &folder->entry ); + fci->folders_size += sizeof(CFFOLDER) + fci->ccab.cbReserveCFFolder; + fci->cFolders++; + return folder; +} + +static void free_folder( FCI_Int *fci, struct folder *folder ) +{ + struct file *file, *file_next; + struct data_block *block, *block_next; + + LIST_FOR_EACH_ENTRY_SAFE( file, file_next, &folder->files_list, struct file, entry ) + free_file( fci, file ); + LIST_FOR_EACH_ENTRY_SAFE( block, block_next, &folder->blocks_list, struct data_block, entry ) + free_data_block( fci, block ); + close_temp_file( fci, &folder->data ); + list_remove( &folder->entry ); + fci->free( folder ); +} + +/* reset state for the next cabinet file once the current one has been flushed */ +static void reset_cabinet( FCI_Int *fci ) +{ + struct folder *folder, *folder_next; + + LIST_FOR_EACH_ENTRY_SAFE( folder, folder_next, &fci->folders_list, struct folder, entry ) + free_folder( fci, folder ); + + fci->cFolders = 0; + fci->cFiles = 0; + fci->folders_size = 0; + fci->placed_files_size = 0; + fci->folders_data_size = 0; +} + +static cab_ULONG fci_get_checksum( const void *pv, UINT cb, cab_ULONG seed ) +{ + cab_ULONG csum; + cab_ULONG ul; + int cUlong; + const BYTE *pb; + + csum = seed; + cUlong = cb / 4; + pb = pv; + + while (cUlong-- > 0) { + ul = *pb++; + ul |= (((cab_ULONG)(*pb++)) << 8); + ul |= (((cab_ULONG)(*pb++)) << 16); + ul |= (((cab_ULONG)(*pb++)) << 24); + csum ^= ul; + } + + ul = 0; + switch (cb % 4) { + case 3: + ul |= (((ULONG)(*pb++)) << 16); + /* fall through */ + case 2: + ul |= (((ULONG)(*pb++)) << 8); + /* fall through */ + case 1: + ul |= *pb; + /* fall through */ + default: + break; + } + csum ^= ul; + + return csum; +} + +/* copy all remaining data block to a new temp file */ +static BOOL copy_data_blocks( FCI_Int *fci, INT_PTR handle, cab_ULONG start_pos, + struct temp_file *temp, PFNFCISTATUS status_callback ) +{ + struct data_block *block; + int err; + + if (fci->seek( handle, start_pos, SEEK_SET, &err, fci->pv ) != start_pos) + { + set_error( fci, FCIERR_TEMP_FILE, err ); + return FALSE; + } + if (!create_temp_file( fci, temp )) return FALSE; + + LIST_FOR_EACH_ENTRY( block, &fci->blocks_list, struct data_block, entry ) + { + if (fci->read( handle, fci->data_out, block->compressed, + &err, fci->pv ) != block->compressed) + { + close_temp_file( fci, temp ); + set_error( fci, FCIERR_TEMP_FILE, err ); + return FALSE; + } + if (fci->write( temp->handle, fci->data_out, block->compressed, + &err, fci->pv ) != block->compressed) + { + close_temp_file( fci, temp ); + set_error( fci, FCIERR_TEMP_FILE, err ); + return FALSE; + } + fci->pending_data_size += sizeof(CFDATA) + fci->ccab.cbReserveCFData + block->compressed; + fci->statusFolderCopied += block->compressed; + + if (status_callback( statusFolder, fci->statusFolderCopied, + fci->statusFolderTotal, fci->pv) == -1) + { + close_temp_file( fci, temp ); + set_error( fci, FCIERR_USER_ABORT, 0 ); + return FALSE; + } + } + return TRUE; +} + +/* write all folders to disk and remove them from the list */ +static BOOL write_folders( FCI_Int *fci, INT_PTR handle, cab_ULONG header_size, PFNFCISTATUS status_callback ) +{ + struct folder *folder; + int err; + CFFOLDER *cffolder = (CFFOLDER *)fci->data_out; + cab_ULONG folder_size = sizeof(CFFOLDER) + fci->ccab.cbReserveCFFolder; + + memset( cffolder, 0, folder_size ); + + /* write the folders */ + LIST_FOR_EACH_ENTRY( folder, &fci->folders_list, struct folder, entry ) + { + cffolder->coffCabStart = fci_endian_ulong( folder->data_start + header_size ); + cffolder->cCFData = fci_endian_uword( folder->data_count ); + cffolder->typeCompress = fci_endian_uword( folder->compression ); + if (fci->write( handle, cffolder, folder_size, &err, fci->pv ) != folder_size) + { + set_error( fci, FCIERR_CAB_FILE, err ); + return FALSE; + } + } + return TRUE; +} + +/* write all the files to the cabinet file */ +static BOOL write_files( FCI_Int *fci, INT_PTR handle, PFNFCISTATUS status_callback ) +{ + cab_ULONG file_size; + struct folder *folder; + struct file *file; + int err; + CFFILE *cffile = (CFFILE *)fci->data_out; + + LIST_FOR_EACH_ENTRY( folder, &fci->folders_list, struct folder, entry ) + { + LIST_FOR_EACH_ENTRY( file, &folder->files_list, struct file, entry ) + { + cffile->cbFile = fci_endian_ulong( file->size ); + cffile->uoffFolderStart = fci_endian_ulong( file->offset ); + cffile->iFolder = fci_endian_uword( file->folder ); + cffile->date = fci_endian_uword( file->date ); + cffile->time = fci_endian_uword( file->time ); + cffile->attribs = fci_endian_uword( file->attribs ); + lstrcpynA( (char *)(cffile + 1), file->name, CB_MAX_FILENAME ); + file_size = sizeof(CFFILE) + strlen( (char *)(cffile + 1) ) + 1; + if (fci->write( handle, cffile, file_size, &err, fci->pv ) != file_size) + { + set_error( fci, FCIERR_CAB_FILE, err ); + return FALSE; + } + if (!fci->fSplitFolder) + { + fci->statusFolderCopied = 0; + /* TODO TEST THIS further */ + fci->statusFolderTotal = fci->folders_data_size + fci->placed_files_size; + } + fci->statusFolderCopied += file_size; + /* report status about copied size of folder */ + if (status_callback( statusFolder, fci->statusFolderCopied, + fci->statusFolderTotal, fci->pv ) == -1) + { + set_error( fci, FCIERR_USER_ABORT, 0 ); + return FALSE; + } + } + } + return TRUE; +} + +/* write all data blocks to the cabinet file */ +static BOOL write_data_blocks( FCI_Int *fci, INT_PTR handle, PFNFCISTATUS status_callback ) +{ + struct folder *folder; + struct data_block *block; + int err, len; + CFDATA *cfdata; + void *data; + cab_UWORD header_size; + + header_size = sizeof(CFDATA) + fci->ccab.cbReserveCFData; + cfdata = (CFDATA *)fci->data_out; + memset( cfdata, 0, header_size ); + data = (char *)cfdata + header_size; + + LIST_FOR_EACH_ENTRY( folder, &fci->folders_list, struct folder, entry ) + { + if (fci->seek( folder->data.handle, 0, SEEK_SET, &err, fci->pv ) != 0) + { + set_error( fci, FCIERR_CAB_FILE, err ); + return FALSE; + } + LIST_FOR_EACH_ENTRY( block, &folder->blocks_list, struct data_block, entry ) + { + len = fci->read( folder->data.handle, data, block->compressed, &err, fci->pv ); + if (len != block->compressed) return FALSE; + + cfdata->cbData = fci_endian_uword( block->compressed ); + cfdata->cbUncomp = fci_endian_uword( block->uncompressed ); + cfdata->csum = fci_endian_ulong( fci_get_checksum( &cfdata->cbData, + header_size - FIELD_OFFSET(CFDATA, cbData), + fci_get_checksum( data, len, 0 ))); + + fci->statusFolderCopied += len; + len += header_size; + if (fci->write( handle, fci->data_out, len, &err, fci->pv ) != len) + { + set_error( fci, FCIERR_CAB_FILE, err ); + return FALSE; + } + if (status_callback( statusFolder, fci->statusFolderCopied, fci->statusFolderTotal, fci->pv) == -1) + { + set_error( fci, FCIERR_USER_ABORT, 0 ); + return FALSE; + } + } + } + return TRUE; +} + +/* write the cabinet file to disk */ +static BOOL write_cabinet( FCI_Int *fci, PFNFCISTATUS status_callback ) +{ + char filename[CB_MAX_CAB_PATH + CB_MAX_CABINET_NAME]; + int err; + char *ptr; + INT_PTR handle; + CFHEADER *cfheader = (CFHEADER *)fci->data_out; + cab_UWORD flags = 0; + cab_ULONG header_size = get_header_size( fci ); + cab_ULONG total_size = header_size + fci->folders_size + + fci->placed_files_size + fci->folders_data_size; + + assert( header_size <= sizeof(fci->data_out) ); + memset( cfheader, 0, header_size ); + + if (fci->fPrevCab) flags |= cfheadPREV_CABINET; + if (fci->fNextCab) flags |= cfheadNEXT_CABINET; + if (fci->ccab.cbReserveCFHeader || fci->ccab.cbReserveCFFolder || fci->ccab.cbReserveCFData) + flags |= cfheadRESERVE_PRESENT; + + memcpy( cfheader->signature, "!CAB", 4 ); + cfheader->cbCabinet = fci_endian_ulong( total_size ); + cfheader->coffFiles = fci_endian_ulong( header_size + fci->folders_size ); + cfheader->versionMinor = 3; + cfheader->versionMajor = 1; + cfheader->cFolders = fci_endian_uword( fci->cFolders ); + cfheader->cFiles = fci_endian_uword( fci->cFiles ); + cfheader->flags = fci_endian_uword( flags ); + cfheader->setID = fci_endian_uword( fci->ccab.setID ); + cfheader->iCabinet = fci_endian_uword( fci->ccab.iCab ); + ptr = (char *)(cfheader + 1); + + if (flags & cfheadRESERVE_PRESENT) + { + struct + { + cab_UWORD cbCFHeader; + cab_UBYTE cbCFFolder; + cab_UBYTE cbCFData; + } *reserve = (void *)ptr; + + reserve->cbCFHeader = fci_endian_uword( fci->ccab.cbReserveCFHeader ); + reserve->cbCFFolder = fci->ccab.cbReserveCFFolder; + reserve->cbCFData = fci->ccab.cbReserveCFData; + ptr = (char *)(reserve + 1); + } + ptr += fci->ccab.cbReserveCFHeader; + + if (flags & cfheadPREV_CABINET) + { + strcpy( ptr, fci->szPrevCab ); + ptr += strlen( ptr ) + 1; + strcpy( ptr, fci->szPrevDisk ); + ptr += strlen( ptr ) + 1; + } + + if (flags & cfheadNEXT_CABINET) + { + strcpy( ptr, fci->pccab->szCab ); + ptr += strlen( ptr ) + 1; + strcpy( ptr, fci->pccab->szDisk ); + ptr += strlen( ptr ) + 1; + } + + assert( ptr - (char *)cfheader == header_size ); + + strcpy( filename, fci->ccab.szCabPath ); + strcat( filename, fci->ccab.szCab ); + + if ((handle = fci->open( filename, _O_RDWR | _O_CREAT | _O_TRUNC | _O_BINARY, + _S_IREAD | _S_IWRITE, &err, fci->pv )) == -1) + { + set_error( fci, FCIERR_CAB_FILE, err ); + return FALSE; + } + + if (fci->write( handle, cfheader, header_size, &err, fci->pv ) != header_size) + { + set_error( fci, FCIERR_CAB_FILE, err ); + goto failed; + } + + /* add size of header size of all CFFOLDERs and size of all CFFILEs */ + header_size += fci->placed_files_size + fci->folders_size; + if (!write_folders( fci, handle, header_size, status_callback )) goto failed; + if (!write_files( fci, handle, status_callback )) goto failed; + if (!write_data_blocks( fci, handle, status_callback )) goto failed; + + /* update the signature */ + if (fci->seek( handle, 0, SEEK_SET, &err, fci->pv ) != 0 ) + { + set_error( fci, FCIERR_CAB_FILE, err ); + goto failed; + } + memcpy( cfheader->signature, "MSCF", 4 ); + if (fci->write( handle, cfheader->signature, 4, &err, fci->pv ) != 4) + { + set_error( fci, FCIERR_CAB_FILE, err ); + goto failed; + } + fci->close( handle, &err, fci->pv ); + + reset_cabinet( fci ); + status_callback( statusCabinet, fci->estimatedCabinetSize, total_size, fci->pv ); + return TRUE; + +failed: + fci->close( handle, &err, fci->pv ); + fci->delete( filename, &err, fci->pv ); + return FALSE; +} + +/* add all pending data blocks folder */ +static BOOL add_data_to_folder( FCI_Int *fci, struct folder *folder, cab_ULONG *payload, + PFNFCISTATUS status_callback ) +{ + struct data_block *block, *new, *next; + BOOL split_block = FALSE; + cab_ULONG current_size, start_pos = 0; + + *payload = 0; + current_size = get_header_size( fci ) + fci->folders_size + + fci->files_size + fci->placed_files_size + fci->folders_data_size; + + /* move the temp file into the folder structure */ + folder->data = fci->data; + fci->data.handle = -1; + fci->pending_data_size = 0; + + LIST_FOR_EACH_ENTRY_SAFE( block, next, &fci->blocks_list, struct data_block, entry ) + { + /* No more CFDATA fits into the cabinet under construction */ + /* So don't try to store more data into it */ + if (fci->fNextCab && (fci->ccab.cb <= sizeof(CFDATA) + fci->ccab.cbReserveCFData + + current_size + sizeof(CFFOLDER) + fci->ccab.cbReserveCFFolder)) + break; + + if (!(new = fci->alloc( sizeof(*new) ))) + { + set_error( fci, FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); + return FALSE; + } + /* Is cabinet with new CFDATA too large? Then data block has to be split */ + if( fci->fNextCab && + (fci->ccab.cb < sizeof(CFDATA) + fci->ccab.cbReserveCFData + + block->compressed + current_size + sizeof(CFFOLDER) + fci->ccab.cbReserveCFFolder)) + { + /* Modify the size of the compressed data to store only a part of the */ + /* data block into the current cabinet. This is done to prevent */ + /* that the maximum cabinet size will be exceeded. The remainder */ + /* will be stored into the next following cabinet. */ + + new->compressed = fci->ccab.cb - (sizeof(CFDATA) + fci->ccab.cbReserveCFData + current_size + + sizeof(CFFOLDER) + fci->ccab.cbReserveCFFolder ); + new->uncompressed = 0; /* on split blocks of data this is zero */ + block->compressed -= new->compressed; + split_block = TRUE; + } + else + { + new->compressed = block->compressed; + new->uncompressed = block->uncompressed; + } + + start_pos += new->compressed; + current_size += sizeof(CFDATA) + fci->ccab.cbReserveCFData + new->compressed; + fci->folders_data_size += sizeof(CFDATA) + fci->ccab.cbReserveCFData + new->compressed; + fci->statusFolderCopied += new->compressed; + (*payload) += new->uncompressed; + + list_add_tail( &folder->blocks_list, &new->entry ); + folder->data_count++; + + /* report status with pfnfcis about copied size of folder */ + if (status_callback( statusFolder, fci->statusFolderCopied, + fci->statusFolderTotal, fci->pv ) == -1) + { + set_error( fci, FCIERR_USER_ABORT, 0 ); + return FALSE; + } + if (split_block) break; + free_data_block( fci, block ); + fci->cDataBlocks--; + } + + if (list_empty( &fci->blocks_list )) return TRUE; + return copy_data_blocks( fci, folder->data.handle, start_pos, &fci->data, status_callback ); +} + +/* add all pending files to folder */ +static BOOL add_files_to_folder( FCI_Int *fci, struct folder *folder, cab_ULONG payload ) +{ + cab_ULONG sizeOfFiles = 0, sizeOfFilesPrev; + cab_ULONG cbFileRemainer = 0; + struct file *file, *next; + + LIST_FOR_EACH_ENTRY_SAFE( file, next, &fci->files_list, struct file, entry ) + { + cab_ULONG size = sizeof(CFFILE) + strlen(file->name) + 1; + + /* fnfilfnfildest: placed file on cabinet */ + fci->fileplaced( &fci->ccab, file->name, file->size, + (file->folder == cffileCONTINUED_FROM_PREV), fci->pv ); + + sizeOfFilesPrev = sizeOfFiles; + /* set complete size of all processed files */ + if (file->folder == cffileCONTINUED_FROM_PREV && fci->cbFileRemainer != 0) + { + sizeOfFiles += fci->cbFileRemainer; + fci->cbFileRemainer = 0; + } + else sizeOfFiles += file->size; + + /* check if spanned file fits into this cabinet folder */ + if (sizeOfFiles > payload) + { + if (file->folder == cffileCONTINUED_FROM_PREV) + file->folder = cffileCONTINUED_PREV_AND_NEXT; + else + file->folder = cffileCONTINUED_TO_NEXT; + } + + list_remove( &file->entry ); + list_add_tail( &folder->files_list, &file->entry ); + fci->placed_files_size += size; + fci->cFiles++; + + /* This is only true for files which will be written into the */ + /* next cabinet of the spanning folder */ + if (sizeOfFiles > payload) + { + /* add a copy back onto the list */ + if (!(file = copy_file( fci, file ))) return FALSE; + list_add_before( &next->entry, &file->entry ); + + /* Files which data will be partially written into the current cabinet */ + if (file->folder == cffileCONTINUED_PREV_AND_NEXT || file->folder == cffileCONTINUED_TO_NEXT) + { + if (sizeOfFilesPrev <= payload) + { + /* The size of the uncompressed, data of a spanning file in a */ + /* spanning data */ + cbFileRemainer = sizeOfFiles - payload; + } + file->folder = cffileCONTINUED_FROM_PREV; + } + else file->folder = 0; + } + else + { + fci->files_size -= size; + } + } + fci->cbFileRemainer = cbFileRemainer; + return TRUE; +} + +static cab_UWORD compress_NONE( FCI_Int *fci ) +{ + memcpy( fci->data_out, fci->data_in, fci->cdata_in ); + return fci->cdata_in; +} + +#ifdef HAVE_ZLIB + +static void *zalloc( void *opaque, unsigned int items, unsigned int size ) +{ + FCI_Int *fci = opaque; + return fci->alloc( items * size ); +} + +static void zfree( void *opaque, void *ptr ) +{ + FCI_Int *fci = opaque; + fci->free( ptr ); +} + +static cab_UWORD compress_MSZIP( FCI_Int *fci ) +{ + z_stream stream; + + stream.zalloc = zalloc; + stream.zfree = zfree; + stream.opaque = fci; + if (deflateInit2( &stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY ) != Z_OK) + { + set_error( fci, FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); + return 0; + } + stream.next_in = fci->data_in; + stream.avail_in = fci->cdata_in; + stream.next_out = fci->data_out + 2; + stream.avail_out = sizeof(fci->data_out) - 2; + /* insert the signature */ + fci->data_out[0] = 'C'; + fci->data_out[1] = 'K'; + deflate( &stream, Z_FINISH ); + deflateEnd( &stream ); + return stream.total_out + 2; +} + +#endif /* HAVE_ZLIB */ + /*********************************************************************** * FCICreate (CABINET.10) @@ -169,9 +1010,7 @@ HFCI __cdecl FCICreate( PCCAB pccab, void *pv) { - HFCI hfci; - int err; - PFCI_Int p_fci_internal; + FCI_Int *p_fci_internal; if (!perf) { SetLastError(ERROR_BAD_ARGUMENTS); @@ -188,7 +1027,7 @@ HFCI __cdecl FCICreate( return NULL; } - if (!((hfci = (*pfnalloc)(sizeof(FCI_Int))))) { + if (!((p_fci_internal = pfnalloc(sizeof(FCI_Int))))) { perf->erfOper = FCIERR_ALLOC_FAIL; perf->erfType = ERROR_NOT_ENOUGH_MEMORY; perf->fError = TRUE; @@ -197,980 +1036,89 @@ HFCI __cdecl FCICreate( return NULL; } - p_fci_internal=((PFCI_Int)(hfci)); - p_fci_internal->FCI_Intmagic = FCI_INT_MAGIC; + p_fci_internal->magic = FCI_INT_MAGIC; p_fci_internal->perf = perf; - p_fci_internal->pfnfiledest = pfnfiledest; - p_fci_internal->pfnalloc = pfnalloc; - p_fci_internal->pfnfree = pfnfree; - p_fci_internal->pfnopen = pfnopen; - p_fci_internal->pfnread = pfnread; - p_fci_internal->pfnwrite = pfnwrite; - p_fci_internal->pfnclose = pfnclose; - p_fci_internal->pfnseek = pfnseek; - p_fci_internal->pfndelete = pfndelete; - p_fci_internal->pfnfcigtf = pfnfcigtf; + p_fci_internal->fileplaced = pfnfiledest; + p_fci_internal->alloc = pfnalloc; + p_fci_internal->free = pfnfree; + p_fci_internal->open = pfnopen; + p_fci_internal->read = pfnread; + p_fci_internal->write = pfnwrite; + p_fci_internal->close = pfnclose; + p_fci_internal->seek = pfnseek; + p_fci_internal->delete = pfndelete; + p_fci_internal->gettemp = pfnfcigtf; + p_fci_internal->ccab = *pccab; p_fci_internal->pccab = pccab; p_fci_internal->fPrevCab = FALSE; p_fci_internal->fNextCab = FALSE; p_fci_internal->fSplitFolder = FALSE; p_fci_internal->fGetNextCabInVain = FALSE; p_fci_internal->pv = pv; - p_fci_internal->data_in = NULL; p_fci_internal->cdata_in = 0; - p_fci_internal->data_out = NULL; p_fci_internal->cCompressedBytesInFolder = 0; p_fci_internal->cFolders = 0; p_fci_internal->cFiles = 0; p_fci_internal->cDataBlocks = 0; - p_fci_internal->sizeFileCFDATA1 = 0; - p_fci_internal->sizeFileCFFILE1 = 0; - p_fci_internal->sizeFileCFDATA2 = 0; - p_fci_internal->sizeFileCFFILE2 = 0; - p_fci_internal->sizeFileCFFOLDER = 0; - p_fci_internal->sizeFileCFFOLDER = 0; + p_fci_internal->data.handle = -1; p_fci_internal->fNewPrevious = FALSE; p_fci_internal->estimatedCabinetSize = 0; p_fci_internal->statusFolderTotal = 0; + p_fci_internal->folders_size = 0; + p_fci_internal->files_size = 0; + p_fci_internal->placed_files_size = 0; + p_fci_internal->pending_data_size = 0; + p_fci_internal->folders_data_size = 0; + p_fci_internal->compression = tcompTYPE_NONE; + p_fci_internal->compress = compress_NONE; + + list_init( &p_fci_internal->folders_list ); + list_init( &p_fci_internal->files_list ); + list_init( &p_fci_internal->blocks_list ); - memset(&p_fci_internal->oldCCAB, 0, sizeof(CCAB)); memcpy(p_fci_internal->szPrevCab, pccab->szCab, CB_MAX_CABINET_NAME); memcpy(p_fci_internal->szPrevDisk, pccab->szDisk, CB_MAX_DISK_NAME); - /* CFDATA */ - if( !PFCI_GETTEMPFILE(hfci,p_fci_internal->szFileNameCFDATA1, - CB_MAX_FILENAME)) { - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); - return FALSE; - } - /* safety */ - if ( strlen(p_fci_internal->szFileNameCFDATA1) >= CB_MAX_FILENAME ) { - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } + return (HFCI)p_fci_internal; +} - p_fci_internal->handleCFDATA1 = PFCI_OPEN(hfci, - p_fci_internal->szFileNameCFDATA1, 34050, 384, &err, pv); - if(p_fci_internal->handleCFDATA1==0){ - fci_set_error( FCIERR_TEMP_FILE, ERROR_OPEN_FAILED, TRUE ); - return FALSE; - } - /* TODO error checking of err */ - /* array of all CFFILE in a folder */ - if( !PFCI_GETTEMPFILE(hfci,p_fci_internal->szFileNameCFFILE1, - CB_MAX_FILENAME)) { - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); - return FALSE; - } - /* safety */ - if ( strlen(p_fci_internal->szFileNameCFFILE1) >= CB_MAX_FILENAME ) { - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - p_fci_internal->handleCFFILE1 = PFCI_OPEN(hfci, - p_fci_internal->szFileNameCFFILE1, 34050, 384, &err, pv); - if(p_fci_internal->handleCFFILE1==0){ - fci_set_error( FCIERR_TEMP_FILE, ERROR_OPEN_FAILED, TRUE ); - return FALSE; - } - /* TODO error checking of err */ - /* CFDATA with checksum and ready to be copied into cabinet */ - if( !PFCI_GETTEMPFILE(hfci,p_fci_internal->szFileNameCFDATA2, - CB_MAX_FILENAME)) { - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE); - return FALSE; - } - /* safety */ - if ( strlen(p_fci_internal->szFileNameCFDATA2) >= CB_MAX_FILENAME ) { - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - p_fci_internal->handleCFDATA2 = PFCI_OPEN(hfci, - p_fci_internal->szFileNameCFDATA2, 34050, 384, &err, pv); - if(p_fci_internal->handleCFDATA2==0){ - fci_set_error( FCIERR_TEMP_FILE, ERROR_OPEN_FAILED, TRUE ); - return FALSE; - } - /* TODO error checking of err */ - /* array of all CFFILE in a folder, ready to be copied into cabinet */ - if( !PFCI_GETTEMPFILE(hfci,p_fci_internal->szFileNameCFFILE2, - CB_MAX_FILENAME)) { - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); - return FALSE; - } - /* safety */ - if ( strlen(p_fci_internal->szFileNameCFFILE2) >= CB_MAX_FILENAME ) { - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - p_fci_internal->handleCFFILE2 = PFCI_OPEN(hfci, - p_fci_internal->szFileNameCFFILE2, 34050, 384, &err, pv); - if(p_fci_internal->handleCFFILE2==0){ - fci_set_error( FCIERR_TEMP_FILE, ERROR_OPEN_FAILED, TRUE ); - return FALSE; - } - /* TODO error checking of err */ - - /* array of all CFFILE in a folder, ready to be copied into cabinet */ - if( !PFCI_GETTEMPFILE(hfci,p_fci_internal->szFileNameCFFOLDER, - CB_MAX_FILENAME)) { - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); - return FALSE; - } - /* safety */ - if ( strlen(p_fci_internal->szFileNameCFFOLDER) >= CB_MAX_FILENAME ) { - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - p_fci_internal->handleCFFOLDER = PFCI_OPEN(hfci, - p_fci_internal->szFileNameCFFOLDER, 34050, 384, &err, pv); - if(p_fci_internal->handleCFFOLDER==0) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_OPEN_FAILED, TRUE); - return FALSE; - } - - /* TODO close and delete new files when return FALSE */ - /* TODO error checking of err */ - - return hfci; -} /* end of FCICreate */ - - - - - - -static BOOL fci_flush_data_block (HFCI hfci, int* err, - PFNFCISTATUS pfnfcis) { - - /* attention no hfci checks!!! */ - /* attention no checks if there is data available!!! */ - CFDATA data; - CFDATA* cfdata=&data; - char* reserved; - PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); - UINT cbReserveCFData=p_fci_internal->pccab->cbReserveCFData; - UINT i; - - /* TODO compress the data of p_fci_internal->data_in */ - /* and write it to p_fci_internal->data_out */ - memcpy(p_fci_internal->data_out, p_fci_internal->data_in, - p_fci_internal->cdata_in /* number of bytes to copy */); - - cfdata->csum=0; /* checksum has to be set later */ - /* TODO set realsize of compressed data */ - cfdata->cbData = p_fci_internal->cdata_in; - cfdata->cbUncomp = p_fci_internal->cdata_in; - - /* write cfdata to p_fci_internal->handleCFDATA1 */ - if( PFCI_WRITE(hfci, p_fci_internal->handleCFDATA1, /* file handle */ - cfdata, sizeof(*cfdata), err, p_fci_internal->pv) - != sizeof(*cfdata) ) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->sizeFileCFDATA1 += sizeof(*cfdata); - - /* add optional reserved area */ - - /* This allocation and freeing at each CFData block is a bit */ - /* inefficient, but it's harder to forget about freeing the buffer :-). */ - /* Reserved areas are used seldom besides that... */ - if (cbReserveCFData!=0) { - if(!(reserved = PFCI_ALLOC(hfci, cbReserveCFData))) { - fci_set_error( FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY, TRUE ); - return FALSE; - } - for(i=0;ihandleCFDATA1, /* file handle */ - reserved, /* memory buffer */ - cbReserveCFData, /* number of bytes to copy */ - err, p_fci_internal->pv) != cbReserveCFData ) { - PFCI_FREE(hfci, reserved); - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err PFCI_FREE(hfci, reserved)*/ - - p_fci_internal->sizeFileCFDATA1 += cbReserveCFData; - PFCI_FREE(hfci, reserved); - } - - /* write p_fci_internal->data_out to p_fci_internal->handleCFDATA1 */ - if( PFCI_WRITE(hfci, p_fci_internal->handleCFDATA1, /* file handle */ - p_fci_internal->data_out, /* memory buffer */ - cfdata->cbData, /* number of bytes to copy */ - err, p_fci_internal->pv) != cfdata->cbData) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->sizeFileCFDATA1 += cfdata->cbData; - - /* reset the offset */ - p_fci_internal->cdata_in = 0; - p_fci_internal->cCompressedBytesInFolder += cfdata->cbData; - - /* report status with pfnfcis about uncompressed and compressed file data */ - if( (*pfnfcis)(statusFile, cfdata->cbData, cfdata->cbUncomp, - p_fci_internal->pv) == -1) { - fci_set_error( FCIERR_USER_ABORT, 0, TRUE ); - return FALSE; - } - - ++(p_fci_internal->cDataBlocks); - - return TRUE; -} /* end of fci_flush_data_block */ - - - - - -static cab_ULONG fci_get_checksum(const void *pv, UINT cb, CHECKSUM seed) -{ - cab_ULONG csum; - cab_ULONG ul; - int cUlong; - const BYTE *pb; - - csum = seed; - cUlong = cb / 4; - pb = pv; - - while (cUlong-- > 0) { - ul = *pb++; - ul |= (((cab_ULONG)(*pb++)) << 8); - ul |= (((cab_ULONG)(*pb++)) << 16); - ul |= (((cab_ULONG)(*pb++)) << 24); - - csum ^= ul; - } - - ul = 0; - switch (cb % 4) { - case 3: - ul |= (((ULONG)(*pb++)) << 16); - case 2: - ul |= (((ULONG)(*pb++)) << 8); - case 1: - ul |= *pb; - default: - break; - } - csum ^= ul; - - return csum; -} /* end of fci_get_checksum */ - - - -static BOOL fci_flushfolder_copy_cfdata(HFCI hfci, char* buffer, UINT cbReserveCFData, - PFNFCISTATUS pfnfcis, int* err, int handleCFDATA1new, - cab_ULONG* psizeFileCFDATA1new, cab_ULONG* payload) -{ - cab_ULONG read_result; - CFDATA* pcfdata=(CFDATA*)buffer; - BOOL split_block=FALSE; - cab_UWORD savedUncomp=0; - PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); - - *payload=0; - - /* while not all CFDATAs have been copied do */ - while(!FALSE) { - if( p_fci_internal->fNextCab ) { - if( split_block ) { - /* internal error should never happen */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - } - /* REUSE the variable read_result */ - if ( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - read_result=4; - } else { - read_result=0; - } - if (p_fci_internal->fPrevCab) { - read_result+=strlen(p_fci_internal->szPrevCab)+1 + - strlen(p_fci_internal->szPrevDisk)+1; - } - /* No more CFDATA fits into the cabinet under construction */ - /* So don't try to store more data into it */ - if( p_fci_internal->fNextCab && - (p_fci_internal->oldCCAB.cb <= sizeof(CFDATA) + cbReserveCFData + - p_fci_internal->sizeFileCFFILE1 + p_fci_internal->sizeFileCFDATA2 + - p_fci_internal->sizeFileCFFILE2 + p_fci_internal->sizeFileCFFOLDER + - sizeof(CFHEADER) + - read_result + - p_fci_internal->oldCCAB.cbReserveCFHeader + - sizeof(CFFOLDER) + - p_fci_internal->oldCCAB.cbReserveCFFolder + - strlen(p_fci_internal->pccab->szCab)+1 + - strlen(p_fci_internal->pccab->szDisk)+1 - )) { - /* This may never be run for the first time the while loop is entered. - Pray that the code that calls fci_flushfolder_copy_cfdata handles this.*/ - split_block=TRUE; /* In this case split_block is abused to store */ - /* the complete data block into the next cabinet and not into the */ - /* current one. Originally split_block is the indicator that a */ - /* data block has been split across different cabinets. */ - } else { - - /* read CFDATA from p_fci_internal->handleCFDATA1 to cfdata*/ - read_result= PFCI_READ(hfci, p_fci_internal->handleCFDATA1,/*file handle*/ - buffer, /* memory buffer */ - sizeof(CFDATA)+cbReserveCFData, /* number of bytes to copy */ - err, p_fci_internal->pv); - if (read_result!=sizeof(CFDATA)+cbReserveCFData) { - if (read_result==0) break; /* ALL DATA has been copied */ - /* read error */ - fci_set_error( FCIERR_NONE, ERROR_READ_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* REUSE buffer p_fci_internal->data_out !!! */ - /* read data from p_fci_internal->handleCFDATA1 to */ - /* p_fci_internal->data_out */ - if( PFCI_READ(hfci, p_fci_internal->handleCFDATA1 /* file handle */, - p_fci_internal->data_out /* memory buffer */, - pcfdata->cbData /* number of bytes to copy */, - err, p_fci_internal->pv) != pcfdata->cbData ) { - /* read error */ - fci_set_error( FCIERR_NONE, ERROR_READ_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* if cabinet size is too large */ - - /* REUSE the variable read_result */ - if ( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - read_result=4; - } else { - read_result=0; - } - if (p_fci_internal->fPrevCab) { - read_result+=strlen(p_fci_internal->szPrevCab)+1 + - strlen(p_fci_internal->szPrevDisk)+1; - } - - /* Is cabinet with new CFDATA too large? Then data block has to be split */ - if( p_fci_internal->fNextCab && - (p_fci_internal->oldCCAB.cb < sizeof(CFDATA) + cbReserveCFData + - pcfdata->cbData + - p_fci_internal->sizeFileCFFILE1 + p_fci_internal->sizeFileCFDATA2 + - p_fci_internal->sizeFileCFFILE2 + p_fci_internal->sizeFileCFFOLDER + - sizeof(CFHEADER) + - read_result + - p_fci_internal->oldCCAB.cbReserveCFHeader + - sizeof(CFFOLDER) + /* size of new CFFolder entry */ - p_fci_internal->oldCCAB.cbReserveCFFolder + - strlen(p_fci_internal->pccab->szCab)+1 + /* name of next cabinet */ - strlen(p_fci_internal->pccab->szDisk)+1 /* name of next disk */ - )) { - /* REUSE read_result to save the size of the compressed data */ - read_result=pcfdata->cbData; - /* Modify the size of the compressed data to store only a part of the */ - /* data block into the current cabinet. This is done to prevent */ - /* that the maximum cabinet size will be exceeded. The remainder */ - /* will be stored into the next following cabinet. */ - - /* The cabinet will be of size "p_fci_internal->oldCCAB.cb". */ - /* Substract everything except the size of the block of data */ - /* to get it's actual size */ - pcfdata->cbData = p_fci_internal->oldCCAB.cb - ( - sizeof(CFDATA) + cbReserveCFData + - p_fci_internal->sizeFileCFFILE1 + p_fci_internal->sizeFileCFDATA2 + - p_fci_internal->sizeFileCFFILE2 + p_fci_internal->sizeFileCFFOLDER + - sizeof(CFHEADER) + - p_fci_internal->oldCCAB.cbReserveCFHeader + - sizeof(CFFOLDER) + /* set size of new CFFolder entry */ - p_fci_internal->oldCCAB.cbReserveCFFolder ); - /* substract the size of special header fields */ - if ( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - pcfdata->cbData-=4; - } - if (p_fci_internal->fPrevCab) { - pcfdata->cbData-=strlen(p_fci_internal->szPrevCab)+1 + - strlen(p_fci_internal->szPrevDisk)+1; - } - pcfdata->cbData-=strlen(p_fci_internal->pccab->szCab)+1 + - strlen(p_fci_internal->pccab->szDisk)+1; - - savedUncomp = pcfdata->cbUncomp; - pcfdata->cbUncomp = 0; /* on split blocks of data this is zero */ - - /* if split_block==TRUE then the above while loop won't */ - /* be executed again */ - split_block=TRUE; /* split_block is the indicator that */ - /* a data block has been split across */ - /* different cabinets.*/ - } - - /* This should never happen !!! */ - if (pcfdata->cbData==0) { - /* set error */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - - /* set little endian */ - pcfdata->cbData=fci_endian_uword(pcfdata->cbData); - pcfdata->cbUncomp=fci_endian_uword(pcfdata->cbUncomp); - - /* get checksum and write to cfdata.csum */ - pcfdata->csum = fci_get_checksum( &(pcfdata->cbData), - sizeof(CFDATA)+cbReserveCFData - - sizeof(pcfdata->csum), fci_get_checksum( p_fci_internal->data_out, /*buffer*/ - pcfdata->cbData, 0 ) ); - - /* set little endian */ - pcfdata->csum=fci_endian_ulong(pcfdata->csum); - - /* write cfdata with checksum to p_fci_internal->handleCFDATA2 */ - if( PFCI_WRITE(hfci, p_fci_internal->handleCFDATA2, /* file handle */ - buffer, /* memory buffer */ - sizeof(CFDATA)+cbReserveCFData, /* number of bytes to copy */ - err, p_fci_internal->pv) != sizeof(CFDATA)+cbReserveCFData ) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->sizeFileCFDATA2 += sizeof(CFDATA)+cbReserveCFData; - - /* reset little endian */ - pcfdata->cbData=fci_endian_uword(pcfdata->cbData); - pcfdata->cbUncomp=fci_endian_uword(pcfdata->cbUncomp); - pcfdata->csum=fci_endian_ulong(pcfdata->csum); - - /* write compressed data into p_fci_internal->handleCFDATA2 */ - if( PFCI_WRITE(hfci, p_fci_internal->handleCFDATA2, /* file handle */ - p_fci_internal->data_out, /* memory buffer */ - pcfdata->cbData, /* number of bytes to copy */ - err, p_fci_internal->pv) != pcfdata->cbData) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->sizeFileCFDATA2 += pcfdata->cbData; - ++(p_fci_internal->cDataBlocks); - p_fci_internal->statusFolderCopied += pcfdata->cbData; - (*payload)+=pcfdata->cbUncomp; - /* if cabinet size too large and data has been split */ - /* write the remainder of the data block to the new CFDATA1 file */ - if( split_block ) { /* This does not include the */ - /* abused one (just search for "abused" )*/ - /* copy all CFDATA structures from handleCFDATA1 to handleCFDATA1new */ - if (p_fci_internal->fNextCab==FALSE ) { - /* internal error */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - - /* set cbData to the size of the remainder of the data block */ - pcfdata->cbData = read_result - pcfdata->cbData; - /*recover former value of cfdata.cbData; read_result will be the offset*/ - read_result -= pcfdata->cbData; - pcfdata->cbUncomp = savedUncomp; - - /* reset checksum, it will be computed later */ - pcfdata->csum=0; - - /* write cfdata WITHOUT checksum to handleCFDATA1new */ - if( PFCI_WRITE(hfci, handleCFDATA1new, /* file handle */ - buffer, /* memory buffer */ - sizeof(CFDATA)+cbReserveCFData, /* number of bytes to copy */ - err, p_fci_internal->pv) != sizeof(CFDATA)+cbReserveCFData ) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err don't forget PFCI_FREE(hfci, reserved) */ - - *psizeFileCFDATA1new += sizeof(CFDATA)+cbReserveCFData; - - /* write compressed data into handleCFDATA1new */ - if( PFCI_WRITE(hfci, handleCFDATA1new, /* file handle */ - p_fci_internal->data_out + read_result, /* memory buffer + offset */ - /* to last part of split data */ - pcfdata->cbData, /* number of bytes to copy */ - err, p_fci_internal->pv) != pcfdata->cbData) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->statusFolderCopied += pcfdata->cbData; - - *psizeFileCFDATA1new += pcfdata->cbData; - /* the two blocks of the split data block have been written */ - /* don't reset split_data yet, because it is still needed see below */ - } - - /* report status with pfnfcis about copied size of folder */ - if( (*pfnfcis)(statusFolder, - p_fci_internal->statusFolderCopied, /*cfdata.cbData(+previous ones)*/ - p_fci_internal->statusFolderTotal, /* total folder size */ - p_fci_internal->pv) == -1) { - fci_set_error( FCIERR_USER_ABORT, 0, TRUE ); - return FALSE; - } - } - - /* if cabinet size too large */ - /* write the remaining data blocks to the new CFDATA1 file */ - if ( split_block ) { /* This does include the */ - /* abused one (just search for "abused" )*/ - if (p_fci_internal->fNextCab==FALSE ) { - /* internal error */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - /* copy all CFDATA structures from handleCFDATA1 to handleCFDATA1new */ - while(!FALSE) { - /* read CFDATA from p_fci_internal->handleCFDATA1 to cfdata*/ - read_result= PFCI_READ(hfci, p_fci_internal->handleCFDATA1,/* handle */ - buffer, /* memory buffer */ - sizeof(CFDATA)+cbReserveCFData, /* number of bytes to copy */ - err, p_fci_internal->pv); - if (read_result!=sizeof(CFDATA)+cbReserveCFData) { - if (read_result==0) break; /* ALL DATA has been copied */ - /* read error */ - fci_set_error(FCIERR_NONE, ERROR_READ_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* REUSE buffer p_fci_internal->data_out !!! */ - /* read data from p_fci_internal->handleCFDATA1 to */ - /* p_fci_internal->data_out */ - if( PFCI_READ(hfci, p_fci_internal->handleCFDATA1 /* file handle */, - p_fci_internal->data_out /* memory buffer */, - pcfdata->cbData /* number of bytes to copy */, - err, p_fci_internal->pv) != pcfdata->cbData ) { - /* read error */ - fci_set_error( FCIERR_NONE, ERROR_READ_FAULT, TRUE); - return FALSE; - } - /* TODO error handling of err don't forget PFCI_FREE(hfci, reserved) */ - - /* write cfdata with checksum to handleCFDATA1new */ - if( PFCI_WRITE(hfci, handleCFDATA1new, /* file handle */ - buffer, /* memory buffer */ - sizeof(CFDATA)+cbReserveCFData, /* number of bytes to copy */ - err, p_fci_internal->pv) != sizeof(CFDATA)+cbReserveCFData ) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err don't forget PFCI_FREE(hfci, reserved) */ - - *psizeFileCFDATA1new += sizeof(CFDATA)+cbReserveCFData; - - /* write compressed data into handleCFDATA1new */ - if( PFCI_WRITE(hfci, handleCFDATA1new, /* file handle */ - p_fci_internal->data_out, /* memory buffer */ - pcfdata->cbData, /* number of bytes to copy */ - err, p_fci_internal->pv) != pcfdata->cbData) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - *psizeFileCFDATA1new += pcfdata->cbData; - p_fci_internal->statusFolderCopied += pcfdata->cbData; - - /* report status with pfnfcis about copied size of folder */ - if( (*pfnfcis)(statusFolder, - p_fci_internal->statusFolderCopied,/*cfdata.cbData(+previous ones)*/ - p_fci_internal->statusFolderTotal, /* total folder size */ - p_fci_internal->pv) == -1) { - fci_set_error( FCIERR_USER_ABORT, 0, TRUE ); - return FALSE; - } - - } /* end of WHILE */ - break; /* jump out of the next while loop */ - } /* end of if( split_data ) */ - } /* end of WHILE */ - return TRUE; -} /* end of fci_flushfolder_copy_cfdata */ - - - - - -static BOOL fci_flushfolder_copy_cffolder(HFCI hfci, int* err, UINT cbReserveCFFolder, - cab_ULONG sizeFileCFDATA2old) -{ - CFFOLDER cffolder; - UINT i; - char* reserved; - PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); - - /* absolute offset cannot be set yet, because the size of cabinet header, */ - /* the number of CFFOLDERs and the number of CFFILEs may change. */ - /* Instead the size of all previous data blocks will be stored and */ - /* the remainder of the offset will be added when the cabinet will be */ - /* flushed to disk. */ - /* This is exactly the way the original CABINET.DLL works!!! */ - cffolder.coffCabStart=sizeFileCFDATA2old; - - /* set the number of this folder's CFDATA sections */ - cffolder.cCFData=p_fci_internal->cDataBlocks; - /* TODO set compression type */ - cffolder.typeCompress = tcompTYPE_NONE; - - /* write cffolder to p_fci_internal->handleCFFOLDER */ - if( PFCI_WRITE(hfci, p_fci_internal->handleCFFOLDER, /* file handle */ - &cffolder, /* memory buffer */ - sizeof(cffolder), /* number of bytes to copy */ - err, p_fci_internal->pv) != sizeof(cffolder) ) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->sizeFileCFFOLDER += sizeof(cffolder); - - /* add optional reserved area */ - if (cbReserveCFFolder!=0) { - if(!(reserved = PFCI_ALLOC(hfci, cbReserveCFFolder))) { - fci_set_error( FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY, TRUE ); - return FALSE; - } - for(i=0;ihandleCFFOLDER, /* file handle */ - reserved, /* memory buffer */ - cbReserveCFFolder, /* number of bytes to copy */ - err, p_fci_internal->pv) != cbReserveCFFolder ) { - PFCI_FREE(hfci, reserved); - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->sizeFileCFFOLDER += cbReserveCFFolder; - - PFCI_FREE(hfci, reserved); - } - return TRUE; -} /* end of fci_flushfolder_copy_cffolder */ - - - - - -static BOOL fci_flushfolder_copy_cffile(HFCI hfci, int* err, int handleCFFILE1new, - cab_ULONG *psizeFileCFFILE1new, cab_ULONG payload) -{ - CFFILE cffile; - cab_ULONG read_result; - cab_ULONG seek=0; - cab_ULONG sizeOfFiles=0, sizeOfFilesPrev; - BOOL may_be_prev=TRUE; - cab_ULONG cbFileRemainer=0; - PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); - /* set seek of p_fci_internal->handleCFFILE1 to 0 */ - if( PFCI_SEEK(hfci,p_fci_internal->handleCFFILE1,0,SEEK_SET,err, - p_fci_internal->pv) !=0 ) { - /* wrong return value */ - fci_set_error( FCIERR_NONE, ERROR_SEEK, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* while not all CFFILE structures have been copied do */ - while(!FALSE) { - /* REUSE the variable read_result */ - /* read data from p_fci_internal->handleCFFILE1 to cffile */ - read_result = PFCI_READ(hfci,p_fci_internal->handleCFFILE1/* file handle */, - &cffile, /* memory buffer */ - sizeof(cffile), /* number of bytes to copy */ - err, p_fci_internal->pv); - if( read_result != sizeof(cffile) ) { - if( read_result == 0 ) break; /* ALL CFFILE structures have been copied */ - /* read error */ - fci_set_error( FCIERR_NONE, ERROR_READ_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* Microsoft's(R) CABINET.DLL would do a seek to the current! */ - /* position. I don't know why so I'll just omit it */ - - /* read the filename from p_fci_internal->handleCFFILE1 */ - /* REUSE the variable read_result AGAIN */ - /* REUSE the memory buffer PFCI(hfci)->data_out */ - if( PFCI_READ(hfci, p_fci_internal->handleCFFILE1 /*file handle*/, - p_fci_internal->data_out, /* memory buffer */ - CB_MAX_FILENAME, /* number of bytes to copy */ - err, p_fci_internal->pv) <2) { - /* read error */ - fci_set_error( FCIERR_NONE, ERROR_READ_FAULT, TRUE ); - return FALSE; - } - /* TODO maybe other checks of read_result */ - /* TODO error handling of err */ - - /* safety */ - if( strlen(p_fci_internal->data_out)>=CB_MAX_FILENAME ) { - /* set error code internal error */ - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - - seek+=sizeof(cffile) + strlen(p_fci_internal->data_out)+1; - - /* set seek of p_fci_internal->handleCFFILE1 to end of file name */ - /* i.e. seek to the next CFFILE area */ - if( PFCI_SEEK(hfci,p_fci_internal->handleCFFILE1, - seek, /* seek position*/ - SEEK_SET ,err, - p_fci_internal->pv) - != seek) { - /* wrong return value */ - fci_set_error( FCIERR_NONE, ERROR_SEEK, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* fnfilfnfildest: placed file on cabinet */ - if (p_fci_internal->fNextCab || - p_fci_internal->fGetNextCabInVain) { - PFCI_FILEPLACED( hfci, &(p_fci_internal->oldCCAB), - p_fci_internal->data_out, /* the file name*/ - cffile.cbFile, /* file size */ - (cffile.iFolder==cffileCONTINUED_FROM_PREV), - p_fci_internal->pv - ); - } else { - PFCI_FILEPLACED( hfci, p_fci_internal->pccab, - p_fci_internal->data_out, /* the file name*/ - cffile.cbFile, /* file size */ - (cffile.iFolder==cffileCONTINUED_FROM_PREV), - p_fci_internal->pv - ); - } - - /* Check special iFolder values */ - if( cffile.iFolder==cffileCONTINUED_FROM_PREV && - p_fci_internal->fPrevCab==FALSE ) { - /* THIS MAY NEVER HAPPEN */ - /* set error code */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - if( cffile.iFolder==cffileCONTINUED_PREV_AND_NEXT || - cffile.iFolder==cffileCONTINUED_TO_NEXT ) { - /* THIS MAY NEVER HAPPEN */ - /* set error code */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - if( may_be_prev && cffile.iFolder!=cffileCONTINUED_FROM_PREV ) { - may_be_prev=FALSE; - } - if( cffile.iFolder==cffileCONTINUED_FROM_PREV && may_be_prev==FALSE ) { - /* THIS MAY NEVER HAPPEN */ - /* set error code */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - if( cffile.iFolder!=cffileCONTINUED_FROM_PREV ) { - may_be_prev=FALSE; - } - - sizeOfFilesPrev=sizeOfFiles; - /* Set complete size of all processed files */ - if( cffile.iFolder==cffileCONTINUED_FROM_PREV && - p_fci_internal->cbFileRemainer!=0 - ) { - sizeOfFiles+=p_fci_internal->cbFileRemainer; - p_fci_internal->cbFileRemainer=0; - } else { - sizeOfFiles+=cffile.cbFile; - } - - /* Check if spanned file fits into this cabinet folder */ - if( cffile.iFolder==cffileCONTINUED_FROM_PREV && sizeOfFiles>payload ) { - cffile.iFolder=cffileCONTINUED_PREV_AND_NEXT; - } else - - /* Check if file doesn't fit into this cabinet folder */ - if( sizeOfFiles>payload ) { - cffile.iFolder=cffileCONTINUED_TO_NEXT; - } - - /* set little endian */ - cffile.cbFile=fci_endian_ulong(cffile.cbFile); - cffile.uoffFolderStart=fci_endian_ulong(cffile.uoffFolderStart); - cffile.iFolder=fci_endian_uword(cffile.iFolder); - cffile.date=fci_endian_uword(cffile.date); - cffile.time=fci_endian_uword(cffile.time); - cffile.attribs=fci_endian_uword(cffile.attribs); - - /* write cffile to p_fci_internal->handleCFFILE2 */ - if( PFCI_WRITE(hfci, p_fci_internal->handleCFFILE2, /* file handle */ - &cffile, /* memory buffer */ - sizeof(cffile), /* number of bytes to copy */ - err, p_fci_internal->pv) != sizeof(cffile) ) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->sizeFileCFFILE2 += sizeof(cffile); - - /* reset little endian */ - cffile.cbFile=fci_endian_ulong(cffile.cbFile); - cffile.uoffFolderStart=fci_endian_ulong(cffile.uoffFolderStart); - cffile.iFolder=fci_endian_uword(cffile.iFolder); - cffile.date=fci_endian_uword(cffile.date); - cffile.time=fci_endian_uword(cffile.time); - cffile.attribs=fci_endian_uword(cffile.attribs); - - /* write file name to p_fci_internal->handleCFFILE2 */ - if( PFCI_WRITE(hfci, p_fci_internal->handleCFFILE2, /* file handle */ - p_fci_internal->data_out, /* memory buffer */ - strlen(p_fci_internal->data_out)+1, /* number of bytes to copy */ - err, p_fci_internal->pv) != strlen(p_fci_internal->data_out)+1 ) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->sizeFileCFFILE2 += strlen(p_fci_internal->data_out)+1; - - /* cFiles is used to count all files of a cabinet */ - ++(p_fci_internal->cFiles); - - /* This is only true for files which will be written into the */ - /* next cabinet of the spanning folder */ - if( sizeOfFiles>payload ) { - - /* Files which data will be partially written into the current cabinet */ - if( cffile.iFolder==cffileCONTINUED_PREV_AND_NEXT || - cffile.iFolder==cffileCONTINUED_TO_NEXT - ) { - if( sizeOfFilesPrev<=payload ) { - /* The size of the uncompressed, data of a spanning file in a */ - /* spanning data */ - cbFileRemainer=sizeOfFiles-payload; - } - cffile.iFolder=cffileCONTINUED_FROM_PREV; - } else { - cffile.iFolder=0; - } - - /* write cffile into handleCFFILE1new */ - if( PFCI_WRITE(hfci, handleCFFILE1new, /* file handle */ - &cffile, /* memory buffer */ - sizeof(cffile), /* number of bytes to copy */ - err, p_fci_internal->pv) != sizeof(cffile) ) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - *psizeFileCFFILE1new += sizeof(cffile); - /* write name of file into handleCFFILE1new */ - if( PFCI_WRITE(hfci, handleCFFILE1new, /* file handle */ - p_fci_internal->data_out, /* memory buffer */ - strlen(p_fci_internal->data_out)+1, /* number of bytes to copy */ - err, p_fci_internal->pv) != strlen(p_fci_internal->data_out)+1 ) { - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - *psizeFileCFFILE1new += strlen(p_fci_internal->data_out)+1; - } - - } /* END OF while */ - p_fci_internal->cbFileRemainer=cbFileRemainer; - return TRUE; -} /* end of fci_flushfolder_copy_cffile */ - - - - -static BOOL fci_flush_folder( - HFCI hfci, +static BOOL fci_flush_folder( FCI_Int *p_fci_internal, BOOL fGetNextCab, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis) { - int err; - int handleCFDATA1new; /* handle for new temp file */ - char szFileNameCFDATA1new[CB_MAX_FILENAME]; /* name buffer for temp file */ - int handleCFFILE1new; /* handle for new temp file */ - char szFileNameCFFILE1new[CB_MAX_FILENAME]; /* name buffer for temp file */ - UINT cbReserveCFData, cbReserveCFFolder; - char* reserved; - cab_ULONG sizeFileCFDATA1new=0; - cab_ULONG sizeFileCFFILE1new=0; - cab_ULONG sizeFileCFDATA2old; cab_ULONG payload; cab_ULONG read_result; - PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); - - /* test hfci */ - if (!REALLY_IS_FCI(hfci)) { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } + struct folder *folder; if ((!pfnfcignc) || (!pfnfcis)) { - fci_set_error( FCIERR_NONE, ERROR_BAD_ARGUMENTS, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_BAD_ARGUMENTS ); return FALSE; } if( p_fci_internal->fGetNextCabInVain && p_fci_internal->fNextCab ){ /* internal error */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } /* If there was no FCIAddFile or FCIFlushFolder has already been called */ /* this function will return TRUE */ - if( p_fci_internal->sizeFileCFFILE1 == 0 ) { - if ( p_fci_internal->sizeFileCFDATA1 != 0 ) { + if( p_fci_internal->files_size == 0 ) { + if ( p_fci_internal->pending_data_size != 0 ) { /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } return TRUE; } - if (p_fci_internal->data_in==NULL || p_fci_internal->data_out==NULL ) { - /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - /* FCIFlushFolder has already been called... */ - if (p_fci_internal->fSplitFolder && p_fci_internal->sizeFileCFFILE2!=0) { + if (p_fci_internal->fSplitFolder && p_fci_internal->placed_files_size!=0) { return TRUE; } @@ -1178,136 +1126,34 @@ static BOOL fci_flush_folder( /* when the current function exits with return FALSE */ p_fci_internal->fSplitFolder=FALSE; - - if( p_fci_internal->fGetNextCabInVain || - p_fci_internal->fNextCab ){ - cbReserveCFData = p_fci_internal->oldCCAB.cbReserveCFData; - cbReserveCFFolder = p_fci_internal->oldCCAB.cbReserveCFFolder; - } else { - cbReserveCFData = p_fci_internal->pccab->cbReserveCFData; - cbReserveCFFolder = p_fci_internal->pccab->cbReserveCFFolder; - } - /* START of COPY */ - /* if there is data in p_fci_internal->data_in */ - if (p_fci_internal->cdata_in!=0) { + if (!add_data_block( p_fci_internal, pfnfcis )) return FALSE; - if( !fci_flush_data_block(hfci, &err, pfnfcis) ) return FALSE; - - } /* reset to get the number of data blocks of this folder which are */ /* actually in this cabinet ( at least partially ) */ p_fci_internal->cDataBlocks=0; - if ( p_fci_internal->fNextCab || - p_fci_internal->fGetNextCabInVain ) { - read_result= p_fci_internal->oldCCAB.cbReserveCFHeader+ - p_fci_internal->oldCCAB.cbReserveCFFolder; - if ( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - read_result+=4; - } - } else { - read_result= p_fci_internal->pccab->cbReserveCFHeader+ - p_fci_internal->pccab->cbReserveCFFolder; - if ( p_fci_internal->pccab->cbReserveCFHeader != 0 || - p_fci_internal->pccab->cbReserveCFFolder != 0 || - p_fci_internal->pccab->cbReserveCFData != 0 ) { - read_result+=4; - } - } - if (p_fci_internal->fPrevCab) { - read_result+=strlen(p_fci_internal->szPrevCab)+1 + - strlen(p_fci_internal->szPrevDisk)+1; - } - if (p_fci_internal->fNextCab) { - read_result+=strlen(p_fci_internal->pccab->szCab)+1 + - strlen(p_fci_internal->pccab->szDisk)+1; - } - - p_fci_internal->statusFolderTotal = sizeof(CFHEADER)+read_result+ - sizeof(CFFOLDER) + p_fci_internal->sizeFileCFFILE2+ - p_fci_internal->sizeFileCFDATA2 + p_fci_internal->sizeFileCFFILE1+ - p_fci_internal->sizeFileCFDATA1 + p_fci_internal->sizeFileCFFOLDER; + p_fci_internal->statusFolderTotal = get_header_size( p_fci_internal ) + + sizeof(CFFOLDER) + p_fci_internal->ccab.cbReserveCFFolder + + p_fci_internal->placed_files_size+ + p_fci_internal->folders_data_size + p_fci_internal->files_size+ + p_fci_internal->pending_data_size + p_fci_internal->folders_size; p_fci_internal->statusFolderCopied = 0; /* report status with pfnfcis about copied size of folder */ if( (*pfnfcis)(statusFolder, p_fci_internal->statusFolderCopied, p_fci_internal->statusFolderTotal, /* TODO total folder size */ p_fci_internal->pv) == -1) { - fci_set_error( FCIERR_USER_ABORT, 0, TRUE ); + set_error( p_fci_internal, FCIERR_USER_ABORT, 0 ); return FALSE; } - /* get a new temp file */ - if(!PFCI_GETTEMPFILE(hfci,szFileNameCFDATA1new,CB_MAX_FILENAME)) { - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); - return FALSE; - } - /* safety */ - if ( strlen(szFileNameCFDATA1new) >= CB_MAX_FILENAME ) { - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - handleCFDATA1new = PFCI_OPEN(hfci,szFileNameCFDATA1new,34050,384,&err, - p_fci_internal->pv); - if(handleCFDATA1new==0){ - fci_set_error( FCIERR_TEMP_FILE, ERROR_OPEN_FAILED, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - - - /* get a new temp file */ - if(!PFCI_GETTEMPFILE(hfci,szFileNameCFFILE1new,CB_MAX_FILENAME)) { - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); - PFCI_CLOSE(hfci,handleCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - return FALSE; - } - /* safety */ - if ( strlen(szFileNameCFFILE1new) >= CB_MAX_FILENAME ) { - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - PFCI_CLOSE(hfci,handleCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - return FALSE; - } - handleCFFILE1new = PFCI_OPEN(hfci,szFileNameCFFILE1new,34050,384,&err, - p_fci_internal->pv); - if(handleCFFILE1new==0){ - fci_set_error( FCIERR_TEMP_FILE, ERROR_OPEN_FAILED, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - /* USE the variable read_result */ - if ( p_fci_internal->fNextCab || - p_fci_internal->fGetNextCabInVain ) { - read_result= p_fci_internal->oldCCAB.cbReserveCFHeader; - if ( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - read_result+=4; - } - } else { - read_result= p_fci_internal->pccab->cbReserveCFHeader; - if ( p_fci_internal->pccab->cbReserveCFHeader != 0 || - p_fci_internal->pccab->cbReserveCFFolder != 0 || - p_fci_internal->pccab->cbReserveCFData != 0 ) { - read_result+=4; - } - } - if (p_fci_internal->fPrevCab) { - read_result+=strlen(p_fci_internal->szPrevCab)+1 + - strlen(p_fci_internal->szPrevDisk)+1; - } - read_result+= sizeof(CFHEADER) + p_fci_internal->sizeFileCFDATA2 + - p_fci_internal->sizeFileCFFILE2 + p_fci_internal->sizeFileCFFOLDER; + read_result = get_header_size( p_fci_internal ) + p_fci_internal->folders_data_size + + p_fci_internal->placed_files_size + p_fci_internal->folders_size; - if(p_fci_internal->sizeFileCFFILE1!=0) { - read_result+= sizeof(CFFOLDER)+p_fci_internal->pccab->cbReserveCFFolder; + if(p_fci_internal->files_size!=0) { + read_result+= sizeof(CFFOLDER)+p_fci_internal->ccab.cbReserveCFFolder; } /* Check if multiple cabinets have to be created. */ @@ -1322,16 +1168,14 @@ static BOOL fci_flush_folder( p_fci_internal->fNextCab==FALSE && ( ( - p_fci_internal->pccab->cb < read_result + - p_fci_internal->sizeFileCFDATA1 + - p_fci_internal->sizeFileCFFILE1 + + p_fci_internal->ccab.cb < read_result + + p_fci_internal->pending_data_size + + p_fci_internal->files_size + CB_MAX_CABINET_NAME + /* next cabinet name */ CB_MAX_DISK_NAME /* next disk name */ ) || fGetNextCab ) ) { - /* save CCAB */ - p_fci_internal->oldCCAB = *p_fci_internal->pccab; /* increment cabinet index */ ++(p_fci_internal->pccab->iCab); /* get name of next cabinet */ @@ -1339,12 +1183,7 @@ static BOOL fci_flush_folder( if (!(*pfnfcignc)(p_fci_internal->pccab, p_fci_internal->estimatedCabinetSize, /* estimated size of cab */ p_fci_internal->pv)) { - /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); - PFCI_CLOSE(hfci,handleCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE(hfci,handleCFFILE1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ + set_error( p_fci_internal, FCIERR_NONE, ERROR_FUNCTION_FAILED ); return FALSE; } @@ -1357,9 +1196,9 @@ static BOOL fci_flush_folder( p_fci_internal->fNextCab ) && ( ( - p_fci_internal->oldCCAB.cb < read_result + - p_fci_internal->sizeFileCFDATA1 + - p_fci_internal->sizeFileCFFILE1 + + p_fci_internal->ccab.cb < read_result + + p_fci_internal->pending_data_size + + p_fci_internal->files_size + strlen(p_fci_internal->pccab->szCab)+1 + /* next cabinet name */ strlen(p_fci_internal->pccab->szDisk)+1 /* next disk name */ ) || fGetNextCab @@ -1370,24 +1209,13 @@ static BOOL fci_flush_folder( /* return FALSE if there is not enough space left*/ /* this should never happen */ - if (p_fci_internal->oldCCAB.cb <= - p_fci_internal->sizeFileCFFILE1 + + if (p_fci_internal->ccab.cb <= + p_fci_internal->files_size + read_result + strlen(p_fci_internal->pccab->szCab)+1 + /* next cabinet name */ strlen(p_fci_internal->pccab->szDisk)+1 /* next disk name */ ) { - PFCI_CLOSE(hfci,handleCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci,szFileNameCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - - /* close and delete p_fci_internal->handleCFFILE1 */ - PFCI_CLOSE(hfci,handleCFFILE1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci,szFileNameCFFILE1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - return FALSE; } @@ -1398,147 +1226,41 @@ static BOOL fci_flush_folder( /* this should never happen */ if (p_fci_internal->fNextCab) { /* internal error */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } } - /* set seek of p_fci_internal->handleCFDATA1 to 0 */ - if( PFCI_SEEK(hfci,p_fci_internal->handleCFDATA1,0,SEEK_SET,&err, - p_fci_internal->pv) !=0 ) { - /* wrong return value */ - fci_set_error( FCIERR_NONE, ERROR_SEEK, TRUE ); - PFCI_CLOSE(hfci,handleCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE(hfci,handleCFFILE1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - return FALSE; - } - /* TODO error handling of err */ - - /* save size of file CFDATA2 - required for the folder's offset to data */ - sizeFileCFDATA2old = p_fci_internal->sizeFileCFDATA2; - - if(!(reserved = PFCI_ALLOC(hfci, cbReserveCFData+sizeof(CFDATA)))) { - fci_set_error( FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY, TRUE ); - PFCI_CLOSE(hfci,handleCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE(hfci,handleCFFILE1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - return FALSE; - } - - if(!fci_flushfolder_copy_cfdata(hfci, reserved, cbReserveCFData, pfnfcis, &err, - handleCFDATA1new, &sizeFileCFDATA1new, &payload - )) { - PFCI_CLOSE(hfci,handleCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci,szFileNameCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE(hfci,handleCFFILE1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_FREE(hfci,reserved); - return FALSE; - } - - PFCI_FREE(hfci,reserved); - - if(!fci_flushfolder_copy_cffolder(hfci, &err, cbReserveCFFolder, - sizeFileCFDATA2old )) { - PFCI_CLOSE(hfci,handleCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci,szFileNameCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE(hfci,handleCFFILE1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - return FALSE; - } - - if(!fci_flushfolder_copy_cffile(hfci, &err, handleCFFILE1new, - &sizeFileCFFILE1new, payload)) { - PFCI_CLOSE(hfci,handleCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci,szFileNameCFDATA1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE(hfci,handleCFFILE1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci,szFileNameCFFILE1new,&err,p_fci_internal->pv); - /* TODO error handling of err */ - return FALSE; - } - - /* close and delete p_fci_internal->handleCFDATA1 */ - PFCI_CLOSE(hfci,p_fci_internal->handleCFDATA1,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci,p_fci_internal->szFileNameCFDATA1,&err,p_fci_internal->pv); - /* TODO error handling of err */ - - /* put new CFDATA1 into hfci */ - memcpy(p_fci_internal->szFileNameCFDATA1,szFileNameCFDATA1new, - CB_MAX_FILENAME); - - /* put CFDATA1 file handle */ - PFCI_INT(hfci)->handleCFDATA1 = handleCFDATA1new; - /* set file size */ - PFCI_INT(hfci)->sizeFileCFDATA1 = sizeFileCFDATA1new; - - /* close and delete PFCI_INT(hfci)->handleCFFILE1 */ - PFCI_CLOSE(hfci,p_fci_internal->handleCFFILE1,&err,PFCI_INT(hfci)->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci,p_fci_internal->szFileNameCFFILE1,&err,p_fci_internal->pv); - /* TODO error handling of err */ - - /* put new CFFILE1 into hfci */ - memcpy(p_fci_internal->szFileNameCFFILE1,szFileNameCFFILE1new, - CB_MAX_FILENAME); - - /* put CFFILE1 file handle */ - p_fci_internal->handleCFFILE1 = handleCFFILE1new; - /* set file size */ - p_fci_internal->sizeFileCFFILE1 = sizeFileCFFILE1new; - - ++(p_fci_internal->cFolders); + if (!(folder = add_folder( p_fci_internal ))) return FALSE; + if (!add_data_to_folder( p_fci_internal, folder, &payload, pfnfcis )) return FALSE; + if (!add_files_to_folder( p_fci_internal, folder, payload )) return FALSE; /* reset CFFolder specific information */ p_fci_internal->cDataBlocks=0; p_fci_internal->cCompressedBytesInFolder=0; return TRUE; -} /* end of fci_flush_folder */ +} -static BOOL fci_flush_cabinet( - HFCI hfci, +static BOOL fci_flush_cabinet( FCI_Int *p_fci_internal, BOOL fGetNextCab, PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis) { - int err; - CFHEADER cfheader; - struct { - cab_UWORD cbCFHeader; - cab_UBYTE cbCFFolder; - cab_UBYTE cbCFData; - } cfreserved; - CFFOLDER cffolder; cab_ULONG read_result=0; - int handleCABINET; /* file handle for cabinet */ - char szFileNameCABINET[CB_MAX_CAB_PATH+CB_MAX_CABINET_NAME];/* name buffer */ - UINT cbReserveCFHeader, cbReserveCFFolder, i; - char* reserved; BOOL returntrue=FALSE; - PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); /* TODO test if fci_flush_cabinet really aborts if there was no FCIAddFile */ /* when FCIFlushCabinet was or FCIAddFile hasn't been called */ - if( p_fci_internal->sizeFileCFFILE1==0 && fGetNextCab ) { + if( p_fci_internal->files_size==0 && fGetNextCab ) { returntrue=TRUE; } - if (!fci_flush_folder(hfci,fGetNextCab,pfnfcignc,pfnfcis)){ + if (!fci_flush_folder(p_fci_internal,fGetNextCab,pfnfcignc,pfnfcis)){ /* TODO set error */ return FALSE; } @@ -1546,630 +1268,18 @@ static BOOL fci_flush_cabinet( if(returntrue) return TRUE; if ( (p_fci_internal->fSplitFolder && p_fci_internal->fNextCab==FALSE)|| - (p_fci_internal->sizeFileCFFOLDER==0 && - (p_fci_internal->sizeFileCFFILE1!=0 || - p_fci_internal->sizeFileCFFILE2!=0 ) + (p_fci_internal->folders_size==0 && + (p_fci_internal->files_size!=0 || + p_fci_internal->placed_files_size!=0 ) ) ) { /* error */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } - if( p_fci_internal->fNextCab || - p_fci_internal->fGetNextCabInVain ) { - cbReserveCFFolder=p_fci_internal->oldCCAB.cbReserveCFFolder; - cbReserveCFHeader=p_fci_internal->oldCCAB.cbReserveCFHeader; - /* safety */ - if (strlen(p_fci_internal->oldCCAB.szCabPath)>=CB_MAX_CAB_PATH || - strlen(p_fci_internal->oldCCAB.szCab)>=CB_MAX_CABINET_NAME) { - /* set error */ - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - /* get the full name of the cabinet */ - memcpy(szFileNameCABINET,p_fci_internal->oldCCAB.szCabPath, - CB_MAX_CAB_PATH); - memcpy(szFileNameCABINET+strlen(szFileNameCABINET), - p_fci_internal->oldCCAB.szCab, CB_MAX_CABINET_NAME); - } else { - cbReserveCFFolder=p_fci_internal->pccab->cbReserveCFFolder; - cbReserveCFHeader=p_fci_internal->pccab->cbReserveCFHeader; - /* safety */ - if (strlen(p_fci_internal->pccab->szCabPath)>=CB_MAX_CAB_PATH || - strlen(p_fci_internal->pccab->szCab)>=CB_MAX_CABINET_NAME) { - /* set error */ - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - /* get the full name of the cabinet */ - memcpy(szFileNameCABINET,p_fci_internal->pccab->szCabPath, - CB_MAX_CAB_PATH); - memcpy(szFileNameCABINET+strlen(szFileNameCABINET), - p_fci_internal->pccab->szCab, CB_MAX_CABINET_NAME); - } - - memcpy(cfheader.signature,"!CAB",4); - cfheader.reserved1=0; - cfheader.cbCabinet= /* size of the cabinet file in bytes */ - sizeof(CFHEADER) + - p_fci_internal->sizeFileCFFOLDER + - p_fci_internal->sizeFileCFFILE2 + - p_fci_internal->sizeFileCFDATA2; - - if (p_fci_internal->fPrevCab) { - cfheader.cbCabinet+=strlen(p_fci_internal->szPrevCab)+1 + - strlen(p_fci_internal->szPrevDisk)+1; - } - if (p_fci_internal->fNextCab) { - cfheader.cbCabinet+=strlen(p_fci_internal->pccab->szCab)+1 + - strlen(p_fci_internal->pccab->szDisk)+1; - } - if( p_fci_internal->fNextCab || - p_fci_internal->fGetNextCabInVain ) { - cfheader.cbCabinet+=p_fci_internal->oldCCAB.cbReserveCFHeader; - if ( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - cfheader.cbCabinet+=4; - } - } else { - cfheader.cbCabinet+=p_fci_internal->pccab->cbReserveCFHeader; - if ( p_fci_internal->pccab->cbReserveCFHeader != 0 || - p_fci_internal->pccab->cbReserveCFFolder != 0 || - p_fci_internal->pccab->cbReserveCFData != 0 ) { - cfheader.cbCabinet+=4; - } - } - - if( ( ( p_fci_internal->fNextCab || - p_fci_internal->fGetNextCabInVain ) && - cfheader.cbCabinet > p_fci_internal->oldCCAB.cb - ) || - ( ( p_fci_internal->fNextCab==FALSE && - p_fci_internal->fGetNextCabInVain==FALSE ) && - cfheader.cbCabinet > p_fci_internal->pccab->cb - ) - ) - { - fci_set_error( FCIERR_NONE, ERROR_MORE_DATA, TRUE ); - return FALSE; - } - - - cfheader.reserved2=0; - cfheader.coffFiles= /* offset to first CFFILE section */ - cfheader.cbCabinet - p_fci_internal->sizeFileCFFILE2 - - p_fci_internal->sizeFileCFDATA2; - - cfheader.reserved3=0; - cfheader.versionMinor=3; - cfheader.versionMajor=1; - /* number of CFFOLDER entries in the cabinet */ - cfheader.cFolders=p_fci_internal->cFolders; - /* number of CFFILE entries in the cabinet */ - cfheader.cFiles=p_fci_internal->cFiles; - cfheader.flags=0; /* 1=prev cab, 2=next cabinet, 4=reserved sections */ - - if( p_fci_internal->fPrevCab ) { - cfheader.flags = cfheadPREV_CABINET; - } - - if( p_fci_internal->fNextCab ) { - cfheader.flags |= cfheadNEXT_CABINET; - } - - if( p_fci_internal->fNextCab || - p_fci_internal->fGetNextCabInVain ) { - if( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - cfheader.flags |= cfheadRESERVE_PRESENT; - } - cfheader.setID = p_fci_internal->oldCCAB.setID; - cfheader.iCabinet = p_fci_internal->oldCCAB.iCab-1; - } else { - if( p_fci_internal->pccab->cbReserveCFHeader != 0 || - p_fci_internal->pccab->cbReserveCFFolder != 0 || - p_fci_internal->pccab->cbReserveCFData != 0 ) { - cfheader.flags |= cfheadRESERVE_PRESENT; - } - cfheader.setID = p_fci_internal->pccab->setID; - cfheader.iCabinet = p_fci_internal->pccab->iCab-1; - } - /* create the cabinet */ - handleCABINET = PFCI_OPEN(hfci, szFileNameCABINET, - 33538, 384, &err, p_fci_internal->pv ); - if(handleCABINET==0){ - fci_set_error( FCIERR_CAB_FILE, ERROR_OPEN_FAILED, TRUE ); - return FALSE; - } - /* TODO error checking of err */ - - /* set little endian */ - cfheader.reserved1=fci_endian_ulong(cfheader.reserved1); - cfheader.cbCabinet=fci_endian_ulong(cfheader.cbCabinet); - cfheader.reserved2=fci_endian_ulong(cfheader.reserved2); - cfheader.coffFiles=fci_endian_ulong(cfheader.coffFiles); - cfheader.reserved3=fci_endian_ulong(cfheader.reserved3); - cfheader.cFolders=fci_endian_uword(cfheader.cFolders); - cfheader.cFiles=fci_endian_uword(cfheader.cFiles); - cfheader.flags=fci_endian_uword(cfheader.flags); - cfheader.setID=fci_endian_uword(cfheader.setID); - cfheader.iCabinet=fci_endian_uword(cfheader.iCabinet); - - /* write CFHEADER into cabinet file */ - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - &cfheader, /* memory buffer */ - sizeof(cfheader), /* number of bytes to copy */ - &err, p_fci_internal->pv) != sizeof(cfheader) ) { - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* reset little endian */ - cfheader.reserved1=fci_endian_ulong(cfheader.reserved1); - cfheader.cbCabinet=fci_endian_ulong(cfheader.cbCabinet); - cfheader.reserved2=fci_endian_ulong(cfheader.reserved2); - cfheader.coffFiles=fci_endian_ulong(cfheader.coffFiles); - cfheader.reserved3=fci_endian_ulong(cfheader.reserved3); - cfheader.cFolders=fci_endian_uword(cfheader.cFolders); - cfheader.cFiles=fci_endian_uword(cfheader.cFiles); - cfheader.flags=fci_endian_uword(cfheader.flags); - cfheader.setID=fci_endian_uword(cfheader.setID); - cfheader.iCabinet=fci_endian_uword(cfheader.iCabinet); - - if( cfheader.flags & cfheadRESERVE_PRESENT ) { - /* NOTE: No checks for maximum value overflows as designed by MS!!! */ - cfreserved.cbCFHeader = cbReserveCFHeader; - cfreserved.cbCFFolder = cbReserveCFFolder; - if( p_fci_internal->fNextCab || - p_fci_internal->fGetNextCabInVain ) { - cfreserved.cbCFData = p_fci_internal->oldCCAB.cbReserveCFData; - } else { - cfreserved.cbCFData = p_fci_internal->pccab->cbReserveCFData; - } - - /* set little endian */ - cfreserved.cbCFHeader=fci_endian_uword(cfreserved.cbCFHeader); - - /* write reserved info into cabinet file */ - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - &cfreserved, /* memory buffer */ - sizeof(cfreserved), /* number of bytes to copy */ - &err, p_fci_internal->pv) != sizeof(cfreserved) ) { - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* reset little endian */ - cfreserved.cbCFHeader=fci_endian_uword(cfreserved.cbCFHeader); - } - - /* add optional reserved area */ - if (cbReserveCFHeader!=0) { - if(!(reserved = PFCI_ALLOC(hfci, cbReserveCFHeader))) { - fci_set_error( FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY, TRUE ); - return FALSE; - } - for(i=0;ipv) != cbReserveCFHeader ) { - PFCI_FREE(hfci, reserved); - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - PFCI_FREE(hfci, reserved); - } - - if( cfheader.flags & cfheadPREV_CABINET ) { - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - p_fci_internal->szPrevCab, /* memory buffer */ - strlen(p_fci_internal->szPrevCab)+1, /* number of bytes to copy */ - &err, p_fci_internal->pv) != strlen(p_fci_internal->szPrevCab)+1 ) { - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - p_fci_internal->szPrevDisk, /* memory buffer */ - strlen(p_fci_internal->szPrevDisk)+1, /* number of bytes to copy */ - &err, p_fci_internal->pv) != strlen(p_fci_internal->szPrevDisk)+1 ) { - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - } - - if( cfheader.flags & cfheadNEXT_CABINET ) { - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - p_fci_internal->pccab->szCab, /* memory buffer */ - strlen(p_fci_internal->pccab->szCab)+1, /* number of bytes to copy */ - &err, p_fci_internal->pv) != strlen(p_fci_internal->pccab->szCab)+1 ) { - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - p_fci_internal->pccab->szDisk, /* memory buffer */ - strlen(p_fci_internal->pccab->szDisk)+1, /* number of bytes to copy */ - &err, p_fci_internal->pv) != strlen(p_fci_internal->pccab->szDisk)+1 ) { - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - } - - /* set seek of p_fci_internal->handleCFFOLDER to 0 */ - if( PFCI_SEEK(hfci,p_fci_internal->handleCFFOLDER, - 0, SEEK_SET, &err, p_fci_internal->pv) != 0 ) { - /* wrong return value */ - fci_set_error( FCIERR_NONE, ERROR_SEEK, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* while not all CFFOLDER structures have been copied into the cabinet do */ - while(!FALSE) { - /* use the variable read_result */ - /* read cffolder of p_fci_internal->handleCFFOLDER */ - read_result = PFCI_READ(hfci, p_fci_internal->handleCFFOLDER, /* handle */ - &cffolder, /* memory buffer */ - sizeof(cffolder), /* number of bytes to copy */ - &err, p_fci_internal->pv); - if( read_result != sizeof(cffolder) ) { - if( read_result == 0 ) break;/*ALL CFFOLDER structures have been copied*/ - /* read error */ - fci_set_error( FCIERR_NONE, ERROR_READ_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* add size of header size of all CFFOLDERs and size of all CFFILEs */ - cffolder.coffCabStart += - p_fci_internal->sizeFileCFFILE2 + p_fci_internal->sizeFileCFFOLDER + - sizeof(CFHEADER); - if( p_fci_internal->fNextCab || - p_fci_internal->fGetNextCabInVain ) { - cffolder.coffCabStart+=p_fci_internal->oldCCAB.cbReserveCFHeader; - } else { - cffolder.coffCabStart+=p_fci_internal->pccab->cbReserveCFHeader; - } - - if (p_fci_internal->fPrevCab) { - cffolder.coffCabStart += strlen(p_fci_internal->szPrevCab)+1 + - strlen(p_fci_internal->szPrevDisk)+1; - } - - if (p_fci_internal->fNextCab) { - cffolder.coffCabStart += strlen(p_fci_internal->oldCCAB.szCab)+1 + - strlen(p_fci_internal->oldCCAB.szDisk)+1; - } - - if( p_fci_internal->fNextCab || - p_fci_internal->fGetNextCabInVain ) { - cffolder.coffCabStart += p_fci_internal->oldCCAB.cbReserveCFHeader; - if( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - cffolder.coffCabStart += 4; - } - } else { - cffolder.coffCabStart += p_fci_internal->pccab->cbReserveCFHeader; - if( p_fci_internal->pccab->cbReserveCFHeader != 0 || - p_fci_internal->pccab->cbReserveCFFolder != 0 || - p_fci_internal->pccab->cbReserveCFData != 0 ) { - cffolder.coffCabStart += 4; - } - } - - /* set little endian */ - cffolder.coffCabStart=fci_endian_ulong(cffolder.coffCabStart); - cffolder.cCFData=fci_endian_uword(cffolder.cCFData); - cffolder.typeCompress=fci_endian_uword(cffolder.typeCompress); - - /* write cffolder to cabinet file */ - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - &cffolder, /* memory buffer */ - sizeof(cffolder), /* number of bytes to copy */ - &err, p_fci_internal->pv) != sizeof(cffolder) ) { - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* reset little endian */ - cffolder.coffCabStart=fci_endian_ulong(cffolder.coffCabStart); - cffolder.cCFData=fci_endian_uword(cffolder.cCFData); - cffolder.typeCompress=fci_endian_uword(cffolder.typeCompress); - - /* add optional reserved area */ - - /* This allocation and freeing at each CFFolder block is a bit */ - /* inefficient, but it's harder to forget about freeing the buffer :-). */ - /* Reserved areas are used seldom besides that... */ - if (cbReserveCFFolder!=0) { - if(!(reserved = PFCI_ALLOC(hfci, cbReserveCFFolder))) { - fci_set_error( FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY, TRUE ); - return FALSE; - } - - if( PFCI_READ(hfci, p_fci_internal->handleCFFOLDER, /* file handle */ - reserved, /* memory buffer */ - cbReserveCFFolder, /* number of bytes to copy */ - &err, p_fci_internal->pv) != cbReserveCFFolder ) { - PFCI_FREE(hfci, reserved); - /* read error */ - fci_set_error( FCIERR_NONE, ERROR_READ_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - reserved, /* memory buffer */ - cbReserveCFFolder, /* number of bytes to copy */ - &err, p_fci_internal->pv) != cbReserveCFFolder ) { - PFCI_FREE(hfci, reserved); - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - PFCI_FREE(hfci, reserved); - } - - } /* END OF while */ - - /* set seek of p_fci_internal->handleCFFILE2 to 0 */ - if( PFCI_SEEK(hfci,p_fci_internal->handleCFFILE2, - 0, SEEK_SET, &err, p_fci_internal->pv) != 0 ) { - /* wrong return value */ - fci_set_error( FCIERR_NONE, ERROR_SEEK, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* while not all CFFILE structures have been copied to the cabinet do */ - if (p_fci_internal->data_out) while(!FALSE) { - /* REUSE the variable read_result */ - /* REUSE the buffer p_fci_internal->data_out AGAIN */ - /* read a block from p_fci_internal->handleCFFILE2 */ - read_result = PFCI_READ(hfci, p_fci_internal->handleCFFILE2 /* handle */, - p_fci_internal->data_out, /* memory buffer */ - CB_MAX_CHUNK, /* number of bytes to copy */ - &err, p_fci_internal->pv); - if( read_result == 0 ) break; /* ALL CFFILE structures have been copied */ - /* TODO error handling of err */ - - /* write the block to the cabinet file */ - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - p_fci_internal->data_out, /* memory buffer */ - read_result, /* number of bytes to copy */ - &err, p_fci_internal->pv) != read_result ) { - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - if (p_fci_internal->fSplitFolder==FALSE) { - p_fci_internal->statusFolderCopied = 0; - /* TODO TEST THIS further */ - p_fci_internal->statusFolderTotal = p_fci_internal->sizeFileCFDATA2+ - p_fci_internal->sizeFileCFFILE2; - } - p_fci_internal->statusFolderCopied += read_result; - - /* report status with pfnfcis about copied size of folder */ - if( (*pfnfcis)(statusFolder, - p_fci_internal->statusFolderCopied, /* length of copied blocks */ - p_fci_internal->statusFolderTotal, /* total size of folder */ - p_fci_internal->pv) == -1) { - fci_set_error( FCIERR_USER_ABORT, 0, TRUE ); - return FALSE; - } - - } /* END OF while */ - - /* set seek of p_fci_internal->handleCFDATA2 to 0 */ - if( PFCI_SEEK(hfci,p_fci_internal->handleCFDATA2, - 0, SEEK_SET, &err, p_fci_internal->pv) != 0 ) { - /* wrong return value */ - fci_set_error( FCIERR_NONE, ERROR_SEEK, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* reset the number of folders for the next cabinet */ - p_fci_internal->cFolders=0; - /* reset the number of files for the next cabinet */ - p_fci_internal->cFiles=0; - - /* while not all CFDATA structures have been copied to the cabinet do */ - if (p_fci_internal->data_out) while(!FALSE) { - /* REUSE the variable read_result AGAIN */ - /* REUSE the buffer p_fci_internal->data_out AGAIN */ - /* read a block from p_fci_internal->handleCFDATA2 */ - read_result = PFCI_READ(hfci, p_fci_internal->handleCFDATA2 /* handle */, - p_fci_internal->data_out, /* memory buffer */ - CB_MAX_CHUNK, /* number of bytes to copy */ - &err, p_fci_internal->pv); - if( read_result == 0 ) break; /* ALL CFDATA structures have been copied */ - /* TODO error handling of err */ - - /* write the block to the cabinet file */ - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - p_fci_internal->data_out, /* memory buffer */ - read_result, /* number of bytes to copy */ - &err, p_fci_internal->pv) != read_result ) { - /* write error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->statusFolderCopied += read_result; - /* report status with pfnfcis about copied size of folder */ - if( (*pfnfcis)(statusFolder, - p_fci_internal->statusFolderCopied, /* length of copied blocks */ - p_fci_internal->statusFolderTotal, /* total size of folder */ - p_fci_internal->pv) == -1) { - /* set error code and abort */ - fci_set_error( FCIERR_USER_ABORT, 0, TRUE ); - return FALSE; - } - } /* END OF while */ - - /* set seek of the cabinet file to 0 */ - if( PFCI_SEEK(hfci, handleCABINET, - 0, SEEK_SET, &err, p_fci_internal->pv) != 0 ) { - /* wrong return value */ - fci_set_error( FCIERR_NONE, ERROR_SEEK, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* write the signature "MSCF" into the cabinet file */ - memcpy( cfheader.signature, "MSCF", 4 ); - if( PFCI_WRITE(hfci, handleCABINET, /* file handle */ - &cfheader, /* memory buffer */ - 4, /* number of bytes to copy */ - &err, p_fci_internal->pv) != 4 ) { - /* wrtie error */ - fci_set_error( FCIERR_CAB_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - /* close the cabinet file */ - PFCI_CLOSE(hfci,handleCABINET,&err,p_fci_internal->pv); - /* TODO error handling of err */ - - -/* COPIED FROM FCIDestroy */ - - PFCI_CLOSE (hfci, p_fci_internal->handleCFDATA2,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci, p_fci_internal->szFileNameCFDATA2, &err, - p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE (hfci, p_fci_internal->handleCFFILE2,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci, p_fci_internal->szFileNameCFFILE2, &err, - p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE (hfci, p_fci_internal->handleCFFOLDER,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci, p_fci_internal->szFileNameCFFOLDER, &err, - p_fci_internal->pv); - /* TODO error handling of err */ - -/* END OF copied from FCIDestroy */ - - /* get 3 temporary files and open them */ - /* write names and handles to hfci */ - - - p_fci_internal->sizeFileCFDATA2 = 0; - p_fci_internal->sizeFileCFFILE2 = 0; - p_fci_internal->sizeFileCFFOLDER = 0; - -/* COPIED FROM FCICreate */ - - /* CFDATA with checksum and ready to be copied into cabinet */ - if( !PFCI_GETTEMPFILE(hfci, p_fci_internal->szFileNameCFDATA2, - CB_MAX_FILENAME)) { - /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); - return FALSE; - } - /* safety */ - if ( strlen(p_fci_internal->szFileNameCFDATA2) >= CB_MAX_FILENAME ) { - /* set error code and abort */ - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - p_fci_internal->handleCFDATA2 = PFCI_OPEN(hfci, - p_fci_internal->szFileNameCFDATA2, 34050, 384, &err, p_fci_internal->pv); - /* check handle */ - if(p_fci_internal->handleCFDATA2==0){ - fci_set_error( FCIERR_TEMP_FILE, ERROR_OPEN_FAILED, TRUE ); - return FALSE; - } - /* TODO error checking of err */ - - /* array of all CFFILE in a folder, ready to be copied into cabinet */ - if( !PFCI_GETTEMPFILE(hfci,p_fci_internal->szFileNameCFFILE2, - CB_MAX_FILENAME)) { - /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); - return FALSE; - } - /* safety */ - if ( strlen(p_fci_internal->szFileNameCFFILE2) >= CB_MAX_FILENAME ) { - /* set error code and abort */ - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - p_fci_internal->handleCFFILE2 = PFCI_OPEN(hfci, - p_fci_internal->szFileNameCFFILE2, 34050, 384, &err, p_fci_internal->pv); - /* check handle */ - if(p_fci_internal->handleCFFILE2==0){ - fci_set_error( FCIERR_TEMP_FILE, ERROR_OPEN_FAILED, TRUE); - return FALSE; - } - /* TODO error checking of err */ - - /* array of all CFFILE in a folder, ready to be copied into cabinet */ - if (!PFCI_GETTEMPFILE(hfci,p_fci_internal->szFileNameCFFOLDER,CB_MAX_FILENAME)) { - /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); - return FALSE; - } - /* safety */ - if ( strlen(p_fci_internal->szFileNameCFFOLDER) >= CB_MAX_FILENAME ) { - /* set error code and abort */ - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - p_fci_internal->handleCFFOLDER = PFCI_OPEN(hfci, - p_fci_internal->szFileNameCFFOLDER, 34050, 384, &err, p_fci_internal->pv); - /* check handle */ - if(p_fci_internal->handleCFFOLDER==0){ - fci_set_error( FCIERR_TEMP_FILE, ERROR_OPEN_FAILED, TRUE ); - return FALSE; - } - /* TODO error checking of err */ - -/* END OF copied from FCICreate */ - - - /* TODO close and delete new files when return FALSE */ - - - /* report status with pfnfcis about copied size of folder */ - (*pfnfcis)(statusCabinet, - p_fci_internal->estimatedCabinetSize, /* estimated cabinet file size */ - cfheader.cbCabinet /* real cabinet file size */, p_fci_internal->pv); + if (!write_cabinet( p_fci_internal, pfnfcis )) return FALSE; p_fci_internal->fPrevCab=TRUE; /* The sections szPrevCab and szPrevDisk are not being updated, because */ @@ -2178,59 +1288,36 @@ static BOOL fci_flush_cabinet( if (p_fci_internal->fNextCab) { p_fci_internal->fNextCab=FALSE; - if (p_fci_internal->sizeFileCFFILE1==0 && p_fci_internal->sizeFileCFDATA1!=0) { + if (p_fci_internal->files_size==0 && p_fci_internal->pending_data_size!=0) { /* THIS CAN NEVER HAPPEN */ /* set error code */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } -/* COPIED FROM FCIAddFile and modified */ - - /* REUSE the variable read_result */ - if (p_fci_internal->fGetNextCabInVain) { - read_result=p_fci_internal->oldCCAB.cbReserveCFHeader; - if(p_fci_internal->sizeFileCFFILE1!=0) { - read_result+=p_fci_internal->oldCCAB.cbReserveCFFolder; - } - if ( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - read_result+=4; - } - } else { - read_result=p_fci_internal->pccab->cbReserveCFHeader; - if(p_fci_internal->sizeFileCFFILE1!=0) { - read_result+=p_fci_internal->pccab->cbReserveCFFolder; - } - if ( p_fci_internal->pccab->cbReserveCFHeader != 0 || - p_fci_internal->pccab->cbReserveCFFolder != 0 || - p_fci_internal->pccab->cbReserveCFData != 0 ) { - read_result+=4; - } - } - if ( p_fci_internal->fPrevCab ) { - read_result+= strlen(p_fci_internal->szPrevCab)+1+ - strlen(p_fci_internal->szPrevDisk)+1; - } - read_result+= p_fci_internal->sizeFileCFDATA1 + - p_fci_internal->sizeFileCFFILE1 + p_fci_internal->sizeFileCFDATA2 + - p_fci_internal->sizeFileCFFILE2 + p_fci_internal->sizeFileCFFOLDER + - sizeof(CFHEADER) + - sizeof(CFFOLDER); /* set size of new CFFolder entry */ - if( p_fci_internal->fNewPrevious ) { - memcpy(p_fci_internal->szPrevCab, p_fci_internal->oldCCAB.szCab, + memcpy(p_fci_internal->szPrevCab, p_fci_internal->ccab.szCab, CB_MAX_CABINET_NAME); - memcpy(p_fci_internal->szPrevDisk, p_fci_internal->oldCCAB.szDisk, + memcpy(p_fci_internal->szPrevDisk, p_fci_internal->ccab.szDisk, CB_MAX_DISK_NAME); p_fci_internal->fNewPrevious=FALSE; } + p_fci_internal->ccab = *p_fci_internal->pccab; + + /* REUSE the variable read_result */ + read_result=get_header_size( p_fci_internal ); + if(p_fci_internal->files_size!=0) { + read_result+=p_fci_internal->ccab.cbReserveCFFolder; + } + read_result+= p_fci_internal->pending_data_size + + p_fci_internal->files_size + p_fci_internal->folders_data_size + + p_fci_internal->placed_files_size + p_fci_internal->folders_size + + sizeof(CFFOLDER); /* set size of new CFFolder entry */ /* too much data for the maximum size of a cabinet */ if( p_fci_internal->fGetNextCabInVain==FALSE && - p_fci_internal->pccab->cb < read_result ) { - return fci_flush_cabinet( hfci, FALSE, pfnfcignc, pfnfcis); + p_fci_internal->ccab.cb < read_result ) { + return fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis); } /* Might be too much data for the maximum size of a cabinet.*/ @@ -2240,11 +1327,9 @@ static BOOL fci_flush_cabinet( /* cabinet and name of the corresponding disk. */ /* So take care of this and get the name of the next cabinet */ if (p_fci_internal->fGetNextCabInVain==FALSE && ( - p_fci_internal->pccab->cb < read_result + + p_fci_internal->ccab.cb < read_result + CB_MAX_CABINET_NAME + CB_MAX_DISK_NAME )) { - /* save CCAB */ - p_fci_internal->oldCCAB = *p_fci_internal->pccab; /* increment cabinet index */ ++(p_fci_internal->pccab->iCab); /* get name of next cabinet */ @@ -2253,7 +1338,7 @@ static BOOL fci_flush_cabinet( p_fci_internal->estimatedCabinetSize, /* estimated size of cab */ p_fci_internal->pv)) { /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_FUNCTION_FAILED ); return FALSE; } /* Skip a few lines of code. This is caught by the next if. */ @@ -2262,40 +1347,29 @@ static BOOL fci_flush_cabinet( /* too much data for cabinet */ if (p_fci_internal->fGetNextCabInVain && ( - p_fci_internal->oldCCAB.cb < read_result + - strlen(p_fci_internal->oldCCAB.szCab)+1+ - strlen(p_fci_internal->oldCCAB.szDisk)+1 + p_fci_internal->ccab.cb < read_result + + strlen(p_fci_internal->ccab.szCab)+1+ + strlen(p_fci_internal->ccab.szDisk)+1 )) { p_fci_internal->fGetNextCabInVain=FALSE; p_fci_internal->fNextCab=TRUE; - return fci_flush_cabinet( hfci, FALSE, pfnfcignc, pfnfcis); + return fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis); } /* if the FolderThreshold has been reached flush the folder automatically */ - if( p_fci_internal->fGetNextCabInVain ) { - if( p_fci_internal->cCompressedBytesInFolder >= - p_fci_internal->oldCCAB.cbFolderThresh) { - return FCIFlushFolder(hfci, pfnfcignc, pfnfcis); - } - } else { - if( p_fci_internal->cCompressedBytesInFolder >= - p_fci_internal->pccab->cbFolderThresh) { - return FCIFlushFolder(hfci, pfnfcignc, pfnfcis); - } - } + if (p_fci_internal->cCompressedBytesInFolder >= p_fci_internal->ccab.cbFolderThresh) + return fci_flush_folder(p_fci_internal, FALSE, pfnfcignc, pfnfcis); -/* END OF COPIED FROM FCIAddFile and modified */ - - if( p_fci_internal->sizeFileCFFILE1>0 ) { - if( !FCIFlushFolder(hfci, pfnfcignc, pfnfcis) ) return FALSE; + if( p_fci_internal->files_size>0 ) { + if( !fci_flush_folder(p_fci_internal, FALSE, pfnfcignc, pfnfcis) ) return FALSE; p_fci_internal->fNewPrevious=TRUE; } } else { p_fci_internal->fNewPrevious=FALSE; - if( p_fci_internal->sizeFileCFFILE1>0 || p_fci_internal->sizeFileCFDATA1) { + if( p_fci_internal->files_size>0 || p_fci_internal->pending_data_size) { /* THIS MAY NEVER HAPPEN */ /* set error structures */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } } @@ -2347,121 +1421,58 @@ BOOL __cdecl FCIAddFile( PFNFCIGETOPENINFO pfnfcigoi, TCOMP typeCompress) { - int err; - CFFILE cffile; cab_ULONG read_result; - int file_handle; - PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); + FCI_Int *p_fci_internal = get_fci_ptr( hfci ); - /* test hfci */ - if (!REALLY_IS_FCI(hfci)) { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } + if (!p_fci_internal) return FALSE; if ((!pszSourceFile) || (!pszFileName) || (!pfnfcignc) || (!pfnfcis) || (!pfnfcigoi) || strlen(pszFileName)>=CB_MAX_FILENAME) { - fci_set_error( FCIERR_NONE, ERROR_BAD_ARGUMENTS, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_BAD_ARGUMENTS ); return FALSE; } + if (typeCompress != p_fci_internal->compression) + { + if (!FCIFlushFolder( hfci, pfnfcignc, pfnfcis )) return FALSE; + switch (typeCompress) + { + case tcompTYPE_MSZIP: +#ifdef HAVE_ZLIB + p_fci_internal->compression = tcompTYPE_MSZIP; + p_fci_internal->compress = compress_MSZIP; + break; +#endif + default: + FIXME( "compression %x not supported, defaulting to none\n", typeCompress ); + /* fall through */ + case tcompTYPE_NONE: + p_fci_internal->compression = tcompTYPE_NONE; + p_fci_internal->compress = compress_NONE; + break; + } + } + /* TODO check if pszSourceFile??? */ if(p_fci_internal->fGetNextCabInVain && p_fci_internal->fNextCab) { /* internal error */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } if(p_fci_internal->fNextCab) { /* internal error */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } - cffile.cbFile=0; /* size of the to be added file*/ - /* offset of the uncompressed file in the folder */ - cffile.uoffFolderStart=p_fci_internal->cDataBlocks*CAB_BLOCKMAX + p_fci_internal->cdata_in; - /* number of folder in the cabinet or special 0=first */ - cffile.iFolder = p_fci_internal->cFolders; - - /* allocation of memory */ - if (p_fci_internal->data_in==NULL) { - if (p_fci_internal->cdata_in!=0) { - /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - if (p_fci_internal->data_out!=NULL) { - /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - if(!(p_fci_internal->data_in = PFCI_ALLOC(hfci,CB_MAX_CHUNK))) { - fci_set_error( FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY, TRUE ); - return FALSE; - } - if (p_fci_internal->data_out==NULL) { - if(!(p_fci_internal->data_out = PFCI_ALLOC(hfci, 2 * CB_MAX_CHUNK))){ - fci_set_error( FCIERR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY, TRUE ); - return FALSE; - } - } - } - - if (p_fci_internal->data_out==NULL) { - PFCI_FREE(hfci,p_fci_internal->data_in); - /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - - /* get information about the file */ - /* set defaults in case callback doesn't set one or more fields */ - cffile.attribs=0; - cffile.date=0; - cffile.time=0; - file_handle=(*pfnfcigoi)(pszSourceFile, &(cffile.date), &(cffile.time), - &(cffile.attribs), &err, p_fci_internal->pv); - /* check file_handle */ - if(file_handle==0){ - fci_set_error( FCIERR_OPEN_SRC, ERROR_OPEN_FAILED, TRUE ); - } - /* TODO error handling of err */ - - if (fExecute) { cffile.attribs |= _A_EXEC; } - /* REUSE the variable read_result */ - if (p_fci_internal->fGetNextCabInVain) { - read_result=p_fci_internal->oldCCAB.cbReserveCFHeader + - p_fci_internal->oldCCAB.cbReserveCFFolder; - if ( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - read_result+=4; - } - } else { - read_result=p_fci_internal->pccab->cbReserveCFHeader + - p_fci_internal->pccab->cbReserveCFFolder; - if ( p_fci_internal->pccab->cbReserveCFHeader != 0 || - p_fci_internal->pccab->cbReserveCFFolder != 0 || - p_fci_internal->pccab->cbReserveCFData != 0 ) { - read_result+=4; - } - } - if ( p_fci_internal->fPrevCab ) { - read_result+= strlen(p_fci_internal->szPrevCab)+1+ - strlen(p_fci_internal->szPrevDisk)+1; - } - if ( p_fci_internal->fNextCab ) { /* this is never the case */ - read_result+= strlen(p_fci_internal->pccab->szCab)+1+ - strlen(p_fci_internal->pccab->szDisk)+1; - } + read_result=get_header_size( p_fci_internal ) + p_fci_internal->ccab.cbReserveCFFolder; read_result+= sizeof(CFFILE) + strlen(pszFileName)+1 + - p_fci_internal->sizeFileCFFILE1 + p_fci_internal->sizeFileCFDATA2 + - p_fci_internal->sizeFileCFFILE2 + p_fci_internal->sizeFileCFFOLDER + - sizeof(CFHEADER) + + p_fci_internal->files_size + p_fci_internal->folders_data_size + + p_fci_internal->placed_files_size + p_fci_internal->folders_size + sizeof(CFFOLDER); /* size of new CFFolder entry */ /* Might be too much data for the maximum size of a cabinet.*/ @@ -2472,12 +1483,10 @@ BOOL __cdecl FCIAddFile( /* So take care of this and get the name of the next cabinet */ if( p_fci_internal->fGetNextCabInVain==FALSE && p_fci_internal->fNextCab==FALSE && - ( p_fci_internal->pccab->cb < read_result + + ( p_fci_internal->ccab.cb < read_result + CB_MAX_CABINET_NAME + CB_MAX_DISK_NAME ) ) { - /* save CCAB */ - p_fci_internal->oldCCAB = *p_fci_internal->pccab; /* increment cabinet index */ ++(p_fci_internal->pccab->iCab); /* get name of next cabinet */ @@ -2486,7 +1495,7 @@ BOOL __cdecl FCIAddFile( p_fci_internal->estimatedCabinetSize, /* estimated size of cab */ p_fci_internal->pv)) { /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_FUNCTION_FAILED ); return FALSE; } /* Skip a few lines of code. This is caught by the next if. */ @@ -2498,136 +1507,45 @@ BOOL __cdecl FCIAddFile( ) { /* THIS CAN NEVER HAPPEN */ /* set error code */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } /* too much data for cabinet */ if( p_fci_internal->fGetNextCabInVain && ( - p_fci_internal->oldCCAB.cb < read_result + + p_fci_internal->ccab.cb < read_result + strlen(p_fci_internal->pccab->szCab)+1+ strlen(p_fci_internal->pccab->szDisk)+1 )) { p_fci_internal->fGetNextCabInVain=FALSE; p_fci_internal->fNextCab=TRUE; - if(!fci_flush_cabinet( hfci, FALSE, pfnfcignc, pfnfcis)) return FALSE; + if(!fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis)) return FALSE; } if( p_fci_internal->fNextCab ) { /* THIS MAY NEVER HAPPEN */ /* set error code */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } - /* read the contents of the file blockwise */ - while (!FALSE) { - if (p_fci_internal->cdata_in > CAB_BLOCKMAX) { - /* internal error */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + if (!add_file_data( p_fci_internal, pszSourceFile, pszFileName, fExecute, pfnfcigoi, pfnfcis )) return FALSE; - } - - read_result = PFCI_READ(hfci, file_handle /* file handle */, - (p_fci_internal->data_in + p_fci_internal->cdata_in) /* memory buffer */, - (CAB_BLOCKMAX - p_fci_internal->cdata_in) /* number of bytes to copy */, - &err, p_fci_internal->pv); - /* TODO error handling of err */ - - if( read_result==0 ) break; - - /* increment the block size */ - p_fci_internal->cdata_in += read_result; - - /* increment the file size */ - cffile.cbFile += read_result; - - if ( p_fci_internal->cdata_in > CAB_BLOCKMAX ) { - /* report internal error */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); - return FALSE; - } - /* write a whole block */ - if ( p_fci_internal->cdata_in == CAB_BLOCKMAX ) { - - if( !fci_flush_data_block(hfci, &err, pfnfcis) ) return FALSE; - } - } - - /* close the file from FCIAddFile */ - PFCI_CLOSE(hfci,file_handle,&err,p_fci_internal->pv); - /* TODO error handling of err */ - - /* write cffile to p_fci_internal->handleCFFILE1 */ - if( PFCI_WRITE(hfci, p_fci_internal->handleCFFILE1, /* file handle */ - &cffile, sizeof(cffile),&err, p_fci_internal->pv) != sizeof(cffile) ) { - /* write error */ - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->sizeFileCFFILE1 += sizeof(cffile); - - /* append the name of file */ - if (strlen(pszFileName)>=CB_MAX_FILENAME) { - /* IMPOSSIBLE */ - /* set error code */ - fci_set_error( FCIERR_NONE, ERROR_INVALID_DATA, TRUE ); - return FALSE; - } - if( PFCI_WRITE(hfci, p_fci_internal->handleCFFILE1, /* file handle */ - pszFileName, strlen(pszFileName)+1, &err, p_fci_internal->pv) - != strlen(pszFileName)+1 ) { - /* write error */ - fci_set_error( FCIERR_TEMP_FILE, ERROR_WRITE_FAULT, TRUE ); - return FALSE; - } - /* TODO error handling of err */ - - p_fci_internal->sizeFileCFFILE1 += strlen(pszFileName)+1; /* REUSE the variable read_result */ - if (p_fci_internal->fGetNextCabInVain || - p_fci_internal->fNextCab - ) { - read_result=p_fci_internal->oldCCAB.cbReserveCFHeader + - p_fci_internal->oldCCAB.cbReserveCFFolder; - if ( p_fci_internal->oldCCAB.cbReserveCFHeader != 0 || - p_fci_internal->oldCCAB.cbReserveCFFolder != 0 || - p_fci_internal->oldCCAB.cbReserveCFData != 0 ) { - read_result+=4; - } - } else { - read_result=p_fci_internal->pccab->cbReserveCFHeader + - p_fci_internal->pccab->cbReserveCFFolder; - if ( p_fci_internal->pccab->cbReserveCFHeader != 0 || - p_fci_internal->pccab->cbReserveCFFolder != 0 || - p_fci_internal->pccab->cbReserveCFData != 0 ) { - read_result+=4; - } - } - if ( p_fci_internal->fPrevCab ) { - read_result+= strlen(p_fci_internal->szPrevCab)+1+ - strlen(p_fci_internal->szPrevDisk)+1; - } - if ( p_fci_internal->fNextCab ) { /* this is never the case */ - read_result+= strlen(p_fci_internal->pccab->szCab)+1+ - strlen(p_fci_internal->pccab->szDisk)+1; - } - read_result+= p_fci_internal->sizeFileCFDATA1 + - p_fci_internal->sizeFileCFFILE1 + p_fci_internal->sizeFileCFDATA2 + - p_fci_internal->sizeFileCFFILE2 + p_fci_internal->sizeFileCFFOLDER + - sizeof(CFHEADER) + + read_result = get_header_size( p_fci_internal ) + p_fci_internal->ccab.cbReserveCFFolder; + read_result+= p_fci_internal->pending_data_size + + p_fci_internal->files_size + p_fci_internal->folders_data_size + + p_fci_internal->placed_files_size + p_fci_internal->folders_size + sizeof(CFFOLDER); /* set size of new CFFolder entry */ /* too much data for the maximum size of a cabinet */ /* (ignoring the unflushed data block) */ if( p_fci_internal->fGetNextCabInVain==FALSE && p_fci_internal->fNextCab==FALSE && /* this is always the case */ - p_fci_internal->pccab->cb < read_result ) { - return fci_flush_cabinet( hfci, FALSE, pfnfcignc, pfnfcis); + p_fci_internal->ccab.cb < read_result ) { + return fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis); } /* Might be too much data for the maximum size of a cabinet.*/ @@ -2639,12 +1557,10 @@ BOOL __cdecl FCIAddFile( /* (ignoring the unflushed data block) */ if( p_fci_internal->fGetNextCabInVain==FALSE && p_fci_internal->fNextCab==FALSE && - ( p_fci_internal->pccab->cb < read_result + + ( p_fci_internal->ccab.cb < read_result + CB_MAX_CABINET_NAME + CB_MAX_DISK_NAME ) ) { - /* save CCAB */ - p_fci_internal->oldCCAB = *p_fci_internal->pccab; /* increment cabinet index */ ++(p_fci_internal->pccab->iCab); /* get name of next cabinet */ @@ -2653,7 +1569,7 @@ BOOL __cdecl FCIAddFile( p_fci_internal->estimatedCabinetSize,/* estimated size of cab */ p_fci_internal->pv)) { /* error handling */ - fci_set_error( FCIERR_NONE, ERROR_FUNCTION_FAILED, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_FUNCTION_FAILED ); return FALSE; } /* Skip a few lines of code. This is caught by the next if. */ @@ -2664,42 +1580,33 @@ BOOL __cdecl FCIAddFile( p_fci_internal->fNextCab ) { /* THIS CAN NEVER HAPPEN */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } /* too much data for cabinet */ if( (p_fci_internal->fGetNextCabInVain || p_fci_internal->fNextCab) && ( - p_fci_internal->oldCCAB.cb < read_result + + p_fci_internal->ccab.cb < read_result + strlen(p_fci_internal->pccab->szCab)+1+ strlen(p_fci_internal->pccab->szDisk)+1 )) { p_fci_internal->fGetNextCabInVain=FALSE; p_fci_internal->fNextCab=TRUE; - return fci_flush_cabinet( hfci, FALSE, pfnfcignc, pfnfcis); + return fci_flush_cabinet( p_fci_internal, FALSE, pfnfcignc, pfnfcis); } if( p_fci_internal->fNextCab ) { /* THIS MAY NEVER HAPPEN */ /* set error code */ - fci_set_error( FCIERR_NONE, ERROR_GEN_FAILURE, TRUE ); + set_error( p_fci_internal, FCIERR_NONE, ERROR_GEN_FAILURE ); return FALSE; } /* if the FolderThreshold has been reached flush the folder automatically */ - if( p_fci_internal->fGetNextCabInVain ) { - if( p_fci_internal->cCompressedBytesInFolder >= - p_fci_internal->oldCCAB.cbFolderThresh) { + if (p_fci_internal->cCompressedBytesInFolder >= p_fci_internal->ccab.cbFolderThresh) return FCIFlushFolder(hfci, pfnfcignc, pfnfcis); - } - } else { - if( p_fci_internal->cCompressedBytesInFolder >= - p_fci_internal->pccab->cbFolderThresh) { - return FCIFlushFolder(hfci, pfnfcignc, pfnfcis); - } - } return TRUE; } /* end of FCIAddFile */ @@ -2743,8 +1650,11 @@ BOOL __cdecl FCIFlushFolder( PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis) { - return fci_flush_folder(hfci,FALSE,pfnfcignc,pfnfcis); -} /* end of FCIFlushFolder */ + FCI_Int *p_fci_internal = get_fci_ptr( hfci ); + + if (!p_fci_internal) return FALSE; + return fci_flush_folder(p_fci_internal,FALSE,pfnfcignc,pfnfcis); +} @@ -2785,17 +1695,19 @@ BOOL __cdecl FCIFlushCabinet( PFNFCIGETNEXTCABINET pfnfcignc, PFNFCISTATUS pfnfcis) { - PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); + FCI_Int *p_fci_internal = get_fci_ptr( hfci ); - if(!fci_flush_cabinet(hfci,fGetNextCab,pfnfcignc,pfnfcis)) return FALSE; + if (!p_fci_internal) return FALSE; - while( p_fci_internal->sizeFileCFFILE1>0 || - p_fci_internal->sizeFileCFFILE2>0 ) { - if(!fci_flush_cabinet(hfci,fGetNextCab,pfnfcignc,pfnfcis)) return FALSE; + if(!fci_flush_cabinet(p_fci_internal,fGetNextCab,pfnfcignc,pfnfcis)) return FALSE; + + while( p_fci_internal->files_size>0 || + p_fci_internal->placed_files_size>0 ) { + if(!fci_flush_cabinet(p_fci_internal,fGetNextCab,pfnfcignc,pfnfcis)) return FALSE; } return TRUE; -} /* end of FCIFlushCabinet */ +} /*********************************************************************** @@ -2813,52 +1725,33 @@ BOOL __cdecl FCIFlushCabinet( */ BOOL __cdecl FCIDestroy(HFCI hfci) { - int err; - PFCI_Int p_fci_internal=((PFCI_Int)(hfci)); - if (REALLY_IS_FCI(hfci)) { + struct folder *folder, *folder_next; + struct file *file, *file_next; + struct data_block *block, *block_next; + FCI_Int *p_fci_internal = get_fci_ptr( hfci ); + + if (!p_fci_internal) return FALSE; /* before hfci can be removed all temporary files must be closed */ /* and deleted */ - p_fci_internal->FCI_Intmagic = 0; + p_fci_internal->magic = 0; - PFCI_CLOSE (hfci, p_fci_internal->handleCFDATA1,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci, p_fci_internal->szFileNameCFDATA1, &err, - p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE (hfci, p_fci_internal->handleCFFILE1,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci, p_fci_internal->szFileNameCFFILE1, &err, - p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE (hfci, p_fci_internal->handleCFDATA2,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci, p_fci_internal->szFileNameCFDATA2, &err, - p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE (hfci, p_fci_internal->handleCFFILE2,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci, p_fci_internal->szFileNameCFFILE2, &err, - p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_CLOSE (hfci, p_fci_internal->handleCFFOLDER,&err,p_fci_internal->pv); - /* TODO error handling of err */ - PFCI_DELETE(hfci, p_fci_internal->szFileNameCFFOLDER, &err, - p_fci_internal->pv); - /* TODO error handling of err */ + LIST_FOR_EACH_ENTRY_SAFE( folder, folder_next, &p_fci_internal->folders_list, struct folder, entry ) + { + free_folder( p_fci_internal, folder ); + } + LIST_FOR_EACH_ENTRY_SAFE( file, file_next, &p_fci_internal->files_list, struct file, entry ) + { + free_file( p_fci_internal, file ); + } + LIST_FOR_EACH_ENTRY_SAFE( block, block_next, &p_fci_internal->blocks_list, struct data_block, entry ) + { + free_data_block( p_fci_internal, block ); + } - /* data in and out buffers have to be removed */ - if (p_fci_internal->data_in!=NULL) - PFCI_FREE(hfci, p_fci_internal->data_in); - if (p_fci_internal->data_out!=NULL) - PFCI_FREE(hfci, p_fci_internal->data_out); + close_temp_file( p_fci_internal, &p_fci_internal->data ); /* hfci can now be removed */ - PFCI_FREE(hfci, hfci); + p_fci_internal->free(hfci); return TRUE; - } else { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } - -} /* end of FCIDestroy */ +} diff --git a/reactos/dll/win32/cabinet/fdi.c b/reactos/dll/win32/cabinet/fdi.c index b68ab15acd8..d091dbb2128 100644 --- a/reactos/dll/win32/cabinet/fdi.c +++ b/reactos/dll/win32/cabinet/fdi.c @@ -48,7 +48,7 @@ * Test unit(s). * * The fdintNEXT_CABINET callbacks are probably not working quite as they should. - * There are several FIXME's in the source describing some of the deficiencies in + * There are several FIXMEs in the source describing some of the deficiencies in * some detail. Additionally, we do not do a very good job of returning the right * error codes to this callback. * @@ -110,6 +110,21 @@ typedef struct { cab_UBYTE block_resv; } MORE_ISCAB_INFO, *PMORE_ISCAB_INFO; +typedef struct +{ + unsigned int magic; + PFNALLOC alloc; + PFNFREE free; + PFNOPEN open; + PFNREAD read; + PFNWRITE write; + PFNCLOSE close; + PFNSEEK seek; + PERF perf; +} FDI_Int; + +#define FDI_INT_MAGIC 0xfdfdfd05 + /* * ugh, well, this ended up being pretty damn silly... * now that I've conceded to build equivalent structures to struct cab.*, @@ -120,7 +135,7 @@ typedef struct { */ typedef struct fdi_cds_fwd { - void *hfdi; /* the hfdi we are using */ + FDI_Int *fdi; /* the hfdi we are using */ INT_PTR filehf, cabhf; /* file handle we are using */ struct fdi_folder *current; /* current folder we're extracting from */ cab_ULONG offset; /* uncompressed offset within folder */ @@ -148,6 +163,47 @@ typedef struct fdi_cds_fwd { struct fdi_cds_fwd *next; } fdi_decomp_state; +#define ZIPNEEDBITS(n) {while(k<(n)){cab_LONG c=*(ZIP(inpos)++);\ + b|=((cab_ULONG)c)<>=(n);k-=(n);} + +/* endian-neutral reading of little-endian data */ +#define EndGetI32(a) ((((a)[3])<<24)|(((a)[2])<<16)|(((a)[1])<<8)|((a)[0])) +#define EndGetI16(a) ((((a)[1])<<8)|((a)[0])) + +#define CAB(x) (decomp_state->x) +#define ZIP(x) (decomp_state->methods.zip.x) +#define QTM(x) (decomp_state->methods.qtm.x) +#define LZX(x) (decomp_state->methods.lzx.x) +#define DECR_OK (0) +#define DECR_DATAFORMAT (1) +#define DECR_ILLEGALDATA (2) +#define DECR_NOMEMORY (3) +#define DECR_CHECKSUM (4) +#define DECR_INPUT (5) +#define DECR_OUTPUT (6) +#define DECR_USERABORT (7) + +static void set_error( FDI_Int *fdi, int oper, int err ) +{ + fdi->perf->erfOper = oper; + fdi->perf->erfType = err; + fdi->perf->fError = TRUE; + if (err) SetLastError( err ); +} + +static FDI_Int *get_fdi_ptr( HFDI hfdi ) +{ + FDI_Int *fdi= (FDI_Int *)hfdi; + + if (!fdi || fdi->magic != FDI_INT_MAGIC) + { + SetLastError( ERROR_INVALID_HANDLE ); + return NULL; + } + return fdi; +} + /**************************************************************** * QTMupdatemodel (internal) */ @@ -304,7 +360,9 @@ static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum switch (bytes & 3) { case 3: ul |= *data++ << 16; + /* fall through */ case 2: ul |= *data++ << 8; + /* fall through */ case 1: ul |= *data; } csum ^= ul; @@ -362,7 +420,7 @@ HFDI __cdecl FDICreate( int cpuType, PERF perf) { - HFDI rv; + FDI_Int *fdi; TRACE("(pfnalloc == ^%p, pfnfree == ^%p, pfnopen == ^%p, pfnread == ^%p, pfnwrite == ^%p, " "pfnclose == ^%p, pfnseek == ^%p, cpuType == %d, perf == ^%p)\n", @@ -378,28 +436,26 @@ HFDI __cdecl FDICreate( return NULL; } - if (!((rv = (*pfnalloc)(sizeof(FDI_Int))))) { + if (!((fdi = pfnalloc(sizeof(FDI_Int))))) { perf->erfOper = FDIERROR_ALLOC_FAIL; - perf->erfType = ERROR_NOT_ENOUGH_MEMORY; + perf->erfType = 0; perf->fError = TRUE; - - SetLastError(ERROR_NOT_ENOUGH_MEMORY); return NULL; } - - PFDI_INT(rv)->FDI_Intmagic = FDI_INT_MAGIC; - PFDI_INT(rv)->pfnalloc = pfnalloc; - PFDI_INT(rv)->pfnfree = pfnfree; - PFDI_INT(rv)->pfnopen = pfnopen; - PFDI_INT(rv)->pfnread = pfnread; - PFDI_INT(rv)->pfnwrite = pfnwrite; - PFDI_INT(rv)->pfnclose = pfnclose; - PFDI_INT(rv)->pfnseek = pfnseek; + + fdi->magic = FDI_INT_MAGIC; + fdi->alloc = pfnalloc; + fdi->free = pfnfree; + fdi->open = pfnopen; + fdi->read = pfnread; + fdi->write = pfnwrite; + fdi->close = pfnclose; + fdi->seek = pfnseek; /* no-brainer: we ignore the cpu type; this is only used for the 16-bit versions in Windows anyhow... */ - PFDI_INT(rv)->perf = perf; + fdi->perf = perf; - return rv; + return (HFDI)fdi; } /******************************************************************* @@ -407,9 +463,9 @@ HFDI __cdecl FDICreate( * * returns the file pointer position of a file handle. */ -static long FDI_getoffset(HFDI hfdi, INT_PTR hf) +static LONG FDI_getoffset(FDI_Int *fdi, INT_PTR hf) { - return PFDI_SEEK(hfdi, hf, 0L, SEEK_CUR); + return fdi->seek(hf, 0, SEEK_CUR); } /********************************************************************** @@ -417,21 +473,21 @@ static long FDI_getoffset(HFDI hfdi, INT_PTR hf) * * allocate and read an arbitrarily long string from the cabinet */ -static char *FDI_read_string(HFDI hfdi, INT_PTR hf, long cabsize) +static char *FDI_read_string(FDI_Int *fdi, INT_PTR hf, long cabsize) { size_t len=256, - base = FDI_getoffset(hfdi, hf), + base = FDI_getoffset(fdi, hf), maxlen = cabsize - base; BOOL ok = FALSE; unsigned int i; cab_UBYTE *buf = NULL; - TRACE("(hfdi == ^%p, hf == %ld, cabsize == %ld)\n", hfdi, hf, cabsize); + TRACE("(fdi == %p, hf == %ld, cabsize == %ld)\n", fdi, hf, cabsize); do { if (len > maxlen) len = maxlen; - if (!(buf = PFDI_ALLOC(hfdi, len))) break; - if (!PFDI_READ(hfdi, hf, buf, len)) break; + if (!(buf = fdi->alloc(len))) break; + if (!fdi->read(hf, buf, len)) break; /* search for a null terminator in what we've just read */ for (i=0; i < len; i++) { @@ -446,8 +502,8 @@ static char *FDI_read_string(HFDI hfdi, INT_PTR hf, long cabsize) /* The buffer is too small for the string. Reset the file to the point * were we started, free the buffer and increase the size for the next try */ - PFDI_SEEK(hfdi, hf, base, SEEK_SET); - PFDI_FREE(hfdi, buf); + fdi->seek(hf, base, SEEK_SET); + fdi->free(buf); buf = NULL; len *= 2; } @@ -455,14 +511,14 @@ static char *FDI_read_string(HFDI hfdi, INT_PTR hf, long cabsize) if (!ok) { if (buf) - PFDI_FREE(hfdi, buf); + fdi->free(buf); else ERR("out of memory!\n"); return NULL; } /* otherwise, set the stream to just after the string and return */ - PFDI_SEEK(hfdi, hf, base + strlen((char *)buf) + 1, SEEK_SET); + fdi->seek(hf, base + strlen((char *)buf) + 1, SEEK_SET); return (char *) buf; } @@ -474,7 +530,7 @@ static char *FDI_read_string(HFDI hfdi, INT_PTR hf, long cabsize) * without the sanity checks (and bug) */ static BOOL FDI_read_entries( - HFDI hfdi, + FDI_Int *fdi, INT_PTR hf, PFDICABINETINFO pfdici, PMORE_ISCAB_INFO pmii) @@ -485,7 +541,7 @@ static BOOL FDI_read_entries( cab_UBYTE buf[64], block_resv; char *prevname = NULL, *previnfo = NULL, *nextname = NULL, *nextinfo = NULL; - TRACE("(hfdi == ^%p, hf == %ld, pfdici == ^%p)\n", hfdi, hf, pfdici); + TRACE("(fdi == ^%p, hf == %ld, pfdici == ^%p)\n", fdi, hf, pfdici); /* * FIXME: I just noticed that I am memorizing the initial file pointer @@ -518,74 +574,38 @@ static BOOL FDI_read_entries( */ /* get basic offset & size info */ - base_offset = FDI_getoffset(hfdi, hf); + base_offset = FDI_getoffset(fdi, hf); - if (PFDI_SEEK(hfdi, hf, 0, SEEK_END) == -1) { - if (pmii) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NOT_A_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; - } + if (fdi->seek(hf, 0, SEEK_END) == -1) { + if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 ); return FALSE; } - cabsize = FDI_getoffset(hfdi, hf); + cabsize = FDI_getoffset(fdi, hf); if ((cabsize == -1) || (base_offset == -1) || - ( PFDI_SEEK(hfdi, hf, base_offset, SEEK_SET) == -1 )) { - if (pmii) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NOT_A_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; - } + ( fdi->seek(hf, base_offset, SEEK_SET) == -1 )) { + if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 ); return FALSE; } /* read in the CFHEADER */ - if (PFDI_READ(hfdi, hf, buf, cfhead_SIZEOF) != cfhead_SIZEOF) { - if (pmii) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NOT_A_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; - } + if (fdi->read(hf, buf, cfhead_SIZEOF) != cfhead_SIZEOF) { + if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 ); return FALSE; } /* check basic MSCF signature */ if (EndGetI32(buf+cfhead_Signature) != 0x4643534d) { - if (pmii) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NOT_A_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; - } + if (pmii) set_error( fdi, FDIERROR_NOT_A_CABINET, 0 ); return FALSE; } /* get the number of folders */ num_folders = EndGetI16(buf+cfhead_NumFolders); - if (num_folders == 0) { - /* PONDERME: is this really invalid? */ - WARN("weird cabinet detect failure: no folders in cabinet\n"); - if (pmii) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NOT_A_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; - } - return FALSE; - } /* get the number of files */ num_files = EndGetI16(buf+cfhead_NumFiles); - if (num_files == 0) { - /* PONDERME: is this really invalid? */ - WARN("weird cabinet detect failure: no files in cabinet\n"); - if (pmii) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NOT_A_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; - } - return FALSE; - } /* setid */ setid = EndGetI16(buf+cfhead_SetID); @@ -598,11 +618,7 @@ static BOOL FDI_read_entries( (buf[cfhead_MajorVersion] == 1 && buf[cfhead_MinorVersion] > 3)) { WARN("cabinet format version > 1.3\n"); - if (pmii) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_UNKNOWN_CABINET_VERSION; - PFDI_INT(hfdi)->perf->erfType = 0; /* ? */ - PFDI_INT(hfdi)->perf->fError = TRUE; - } + if (pmii) set_error( fdi, FDIERROR_UNKNOWN_CABINET_VERSION, 0 /* ? */ ); return FALSE; } @@ -611,13 +627,9 @@ static BOOL FDI_read_entries( /* read the reserved-sizes part of header, if present */ if (flags & cfheadRESERVE_PRESENT) { - if (PFDI_READ(hfdi, hf, buf, cfheadext_SIZEOF) != cfheadext_SIZEOF) { + if (fdi->read(hf, buf, cfheadext_SIZEOF) != cfheadext_SIZEOF) { ERR("bunk reserve-sizes?\n"); - if (pmii) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CORRUPT_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; /* ? */ - PFDI_INT(hfdi)->perf->fError = TRUE; - } + if (pmii) set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 /* ? */ ); return FALSE; } @@ -633,64 +645,54 @@ static BOOL FDI_read_entries( } /* skip the reserved header */ - if ((header_resv) && (PFDI_SEEK(hfdi, hf, header_resv, SEEK_CUR) == -1)) { + if ((header_resv) && (fdi->seek(hf, header_resv, SEEK_CUR) == -1)) { ERR("seek failure: header_resv\n"); - if (pmii) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CORRUPT_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; /* ? */ - PFDI_INT(hfdi)->perf->fError = TRUE; - } + if (pmii) set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 /* ? */ ); return FALSE; } } if (flags & cfheadPREV_CABINET) { - prevname = FDI_read_string(hfdi, hf, cabsize); + prevname = FDI_read_string(fdi, hf, cabsize); if (!prevname) { - if (pmii) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CORRUPT_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; /* ? */ - PFDI_INT(hfdi)->perf->fError = TRUE; - } + if (pmii) set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 /* ? */ ); return FALSE; } else if (pmii) pmii->prevname = prevname; else - PFDI_FREE(hfdi, prevname); - previnfo = FDI_read_string(hfdi, hf, cabsize); + fdi->free(prevname); + previnfo = FDI_read_string(fdi, hf, cabsize); if (previnfo) { if (pmii) pmii->previnfo = previnfo; else - PFDI_FREE(hfdi, previnfo); + fdi->free(previnfo); } } if (flags & cfheadNEXT_CABINET) { if (pmii) pmii->hasnext = TRUE; - nextname = FDI_read_string(hfdi, hf, cabsize); + nextname = FDI_read_string(fdi, hf, cabsize); if (!nextname) { if ((flags & cfheadPREV_CABINET) && pmii) { - if (pmii->prevname) PFDI_FREE(hfdi, prevname); - if (pmii->previnfo) PFDI_FREE(hfdi, previnfo); + if (pmii->prevname) fdi->free(prevname); + if (pmii->previnfo) fdi->free(previnfo); } - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CORRUPT_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; /* ? */ - PFDI_INT(hfdi)->perf->fError = TRUE; + set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 /* ? */ ); return FALSE; } else if (pmii) pmii->nextname = nextname; else - PFDI_FREE(hfdi, nextname); - nextinfo = FDI_read_string(hfdi, hf, cabsize); + fdi->free(nextname); + nextinfo = FDI_read_string(fdi, hf, cabsize); if (nextinfo) { if (pmii) pmii->nextinfo = nextinfo; else - PFDI_FREE(hfdi, nextinfo); + fdi->free(nextinfo); } } @@ -740,33 +742,24 @@ BOOL __cdecl FDIIsCabinet( PFDICABINETINFO pfdici) { BOOL rv; + FDI_Int *fdi = get_fdi_ptr( hfdi ); TRACE("(hfdi == ^%p, hf == ^%ld, pfdici == ^%p)\n", hfdi, hf, pfdici); - if (!REALLY_IS_FDI(hfdi)) { - ERR("REALLY_IS_FDI failed on ^%p\n", hfdi); - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } + if (!fdi) return FALSE; if (!hf) { ERR("(!hf)!\n"); - /* PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CABINET_NOT_FOUND; - PFDI_INT(hfdi)->perf->erfType = ERROR_INVALID_HANDLE; - PFDI_INT(hfdi)->perf->fError = TRUE; */ SetLastError(ERROR_INVALID_HANDLE); return FALSE; } if (!pfdici) { ERR("(!pfdici)!\n"); - /* PFDI_INT(hfdi)->perf->erfOper = FDIERROR_NONE; - PFDI_INT(hfdi)->perf->erfType = ERROR_BAD_ARGUMENTS; - PFDI_INT(hfdi)->perf->fError = TRUE; */ SetLastError(ERROR_BAD_ARGUMENTS); return FALSE; } - rv = FDI_read_entries(hfdi, hf, pfdici, NULL); + rv = FDI_read_entries(fdi, hf, pfdici, NULL); if (rv) pfdici->hasnext = FALSE; /* yuck. duplicate apparent cabinet.dll bug */ @@ -805,11 +798,11 @@ static int QTMfdi_init(int window, int level, fdi_decomp_state *decomp_state) { /* if a previously allocated window is big enough, keep it */ if (window < 10 || window > 21) return DECR_DATAFORMAT; if (QTM(actual_size) < wndsize) { - if (QTM(window)) PFDI_FREE(CAB(hfdi), QTM(window)); + if (QTM(window)) CAB(fdi)->free(QTM(window)); QTM(window) = NULL; } if (!QTM(window)) { - if (!(QTM(window) = PFDI_ALLOC(CAB(hfdi), wndsize))) return DECR_NOMEMORY; + if (!(QTM(window) = CAB(fdi)->alloc(wndsize))) return DECR_NOMEMORY; QTM(actual_size) = wndsize; } QTM(window_size) = wndsize; @@ -869,11 +862,11 @@ static int LZXfdi_init(int window, fdi_decomp_state *decomp_state) { /* if a previously allocated window is big enough, keep it */ if (window < 15 || window > 21) return DECR_DATAFORMAT; if (LZX(actual_size) < wndsize) { - if (LZX(window)) PFDI_FREE(CAB(hfdi), LZX(window)); + if (LZX(window)) CAB(fdi)->free(LZX(window)); LZX(window) = NULL; } if (!LZX(window)) { - if (!(LZX(window) = PFDI_ALLOC(CAB(hfdi), wndsize))) return DECR_NOMEMORY; + if (!(LZX(window) = CAB(fdi)->alloc(wndsize))) return DECR_NOMEMORY; LZX(actual_size) = wndsize; } LZX(window_size) = wndsize; @@ -920,7 +913,7 @@ static int NONEfdi_decomp(int inlen, int outlen, fdi_decomp_state *decomp_state) /******************************************************** * Ziphuft_free (internal) */ -static void fdi_Ziphuft_free(HFDI hfdi, struct Ziphuft *t) +static void fdi_Ziphuft_free(FDI_Int *fdi, struct Ziphuft *t) { register struct Ziphuft *p, *q; @@ -929,7 +922,7 @@ static void fdi_Ziphuft_free(HFDI hfdi, struct Ziphuft *t) while (p != NULL) { q = (--p)->v.t; - PFDI_FREE(hfdi, p); + fdi->free(p); p = q; } } @@ -1055,10 +1048,10 @@ struct Ziphuft **t, cab_LONG *m, fdi_decomp_state *decomp_state) l[h] = j; /* set table size in stack */ /* allocate and link in new table */ - if (!(q = PFDI_ALLOC(CAB(hfdi), (z + 1)*sizeof(struct Ziphuft)))) + if (!(q = CAB(fdi)->alloc((z + 1)*sizeof(struct Ziphuft)))) { if(h) - fdi_Ziphuft_free(CAB(hfdi), ZIP(u)[0]); + fdi_Ziphuft_free(CAB(fdi), ZIP(u)[0]); return 3; /* not enough memory */ } *t = q + 1; /* link to list for Ziphuft_free() */ @@ -1277,15 +1270,15 @@ static cab_LONG fdi_Zipinflate_fixed(fdi_decomp_state *decomp_state) fixed_bd = 5; if((i = fdi_Ziphuft_build(l, 30, 0, Zipcpdist, Zipcpdext, &fixed_td, &fixed_bd, decomp_state)) > 1) { - fdi_Ziphuft_free(CAB(hfdi), fixed_tl); + fdi_Ziphuft_free(CAB(fdi), fixed_tl); return i; } /* decompress until an end-of-block code */ i = fdi_Zipinflate_codes(fixed_tl, fixed_td, fixed_bl, fixed_bd, decomp_state); - fdi_Ziphuft_free(CAB(hfdi), fixed_td); - fdi_Ziphuft_free(CAB(hfdi), fixed_tl); + fdi_Ziphuft_free(CAB(fdi), fixed_td); + fdi_Ziphuft_free(CAB(fdi), fixed_tl); return i; } @@ -1344,7 +1337,7 @@ static cab_LONG fdi_Zipinflate_dynamic(fdi_decomp_state *decomp_state) if((i = fdi_Ziphuft_build(ll, 19, 19, NULL, NULL, &tl, &bl, decomp_state)) != 0) { if(i == 1) - fdi_Ziphuft_free(CAB(hfdi), tl); + fdi_Ziphuft_free(CAB(fdi), tl); return i; /* incomplete code set */ } @@ -1395,7 +1388,7 @@ static cab_LONG fdi_Zipinflate_dynamic(fdi_decomp_state *decomp_state) } /* free decoding table for trees */ - fdi_Ziphuft_free(CAB(hfdi), tl); + fdi_Ziphuft_free(CAB(fdi), tl); /* restore the global bit buffer */ ZIP(bb) = b; @@ -1406,7 +1399,7 @@ static cab_LONG fdi_Zipinflate_dynamic(fdi_decomp_state *decomp_state) if((i = fdi_Ziphuft_build(ll, nl, 257, Zipcplens, Zipcplext, &tl, &bl, decomp_state)) != 0) { if(i == 1) - fdi_Ziphuft_free(CAB(hfdi), tl); + fdi_Ziphuft_free(CAB(fdi), tl); return i; /* incomplete code set */ } bd = ZIPDBITS; @@ -1417,8 +1410,8 @@ static cab_LONG fdi_Zipinflate_dynamic(fdi_decomp_state *decomp_state) return 1; /* free the decoding tables, return */ - fdi_Ziphuft_free(CAB(hfdi), tl); - fdi_Ziphuft_free(CAB(hfdi), td); + fdi_Ziphuft_free(CAB(fdi), tl); + fdi_Ziphuft_free(CAB(fdi), td); return 0; } @@ -2014,7 +2007,7 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state /* if cando != 0 */ if (cando && savemode) - PFDI_WRITE(CAB(hfdi), CAB(filehf), CAB(outpos), cando); + CAB(fdi)->write(CAB(filehf), CAB(outpos), cando); CAB(outpos) += cando; CAB(outlen) -= cando; @@ -2026,10 +2019,10 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state inlen = outlen = 0; while (outlen == 0) { /* read the block header, skip the reserved part */ - if (PFDI_READ(CAB(hfdi), cab->cabhf, buf, cfdata_SIZEOF) != cfdata_SIZEOF) + if (CAB(fdi)->read(cab->cabhf, buf, cfdata_SIZEOF) != cfdata_SIZEOF) return DECR_INPUT; - if (PFDI_SEEK(CAB(hfdi), cab->cabhf, cab->mii.block_resv, SEEK_CUR) == -1) + if (CAB(fdi)->seek(cab->cabhf, cab->mii.block_resv, SEEK_CUR) == -1) return DECR_INPUT; /* we shouldn't get blocks over CAB_INPUTMAX in size */ @@ -2037,7 +2030,7 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state len = EndGetI16(buf+cfdata_CompressedSize); inlen += len; if (inlen > CAB_INPUTMAX) return DECR_INPUT; - if (PFDI_READ(CAB(hfdi), cab->cabhf, data, len) != len) + if (CAB(fdi)->read(cab->cabhf, data, len) != len) return DECR_INPUT; /* clear two bytes after read-in data */ @@ -2070,7 +2063,7 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state if (!(cab->next)) { if (!cab->mii.hasnext) return DECR_INPUT; - if (!((cab->next = PFDI_ALLOC(CAB(hfdi), sizeof(fdi_decomp_state))))) + if (!((cab->next = CAB(fdi)->alloc(sizeof(fdi_decomp_state))))) return DECR_NOMEMORY; ZeroMemory(cab->next, sizeof(fdi_decomp_state)); @@ -2118,7 +2111,7 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state TRACE("full cab path/file name: %s\n", debugstr_a(fullpath)); /* try to get a handle to the cabfile */ - cabhf = PFDI_OPEN(CAB(hfdi), fullpath, _O_RDONLY|_O_BINARY, _S_IREAD | _S_IWRITE); + cabhf = CAB(fdi)->open(fullpath, _O_RDONLY|_O_BINARY, _S_IREAD | _S_IWRITE); if (cabhf == -1) { /* no file. allow the user to try again */ fdin.fdie = FDIERROR_CABINET_NOT_FOUND; @@ -2134,9 +2127,9 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state } /* check if it's really a cabfile. Note that this doesn't implement the bug */ - if (!FDI_read_entries(CAB(hfdi), cabhf, &fdici, &(cab->next->mii))) { + if (!FDI_read_entries(CAB(fdi), cabhf, &fdici, &(cab->next->mii))) { WARN("FDIIsCabinet failed.\n"); - PFDI_CLOSE(CAB(hfdi), cabhf); + CAB(fdi)->close(cabhf); fdin.fdie = FDIERROR_NOT_A_CABINET; if (((*pfnfdin)(fdintNEXT_CABINET, &fdin))) return DECR_USERABORT; continue; @@ -2144,7 +2137,7 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state if ((fdici.setID != cab->setID) || (fdici.iCabinet != (cab->iCabinet + 1))) { WARN("Wrong Cabinet.\n"); - PFDI_CLOSE(CAB(hfdi), cabhf); + CAB(fdi)->close(cabhf); fdin.fdie = FDIERROR_WRONG_CABINET; if (((*pfnfdin)(fdintNEXT_CABINET, &fdin))) return DECR_USERABORT; continue; @@ -2167,7 +2160,7 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state cab->next->setID = fdici.setID; cab->next->iCabinet = fdici.iCabinet; - cab->next->hfdi = CAB(hfdi); + cab->next->fdi = CAB(fdi); cab->next->filehf = CAB(filehf); cab->next->cabhf = cabhf; cab->next->decompress = CAB(decompress); /* crude, but unused anyhow */ @@ -2176,13 +2169,13 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state /* read folders */ for (i = 0; i < fdici.cFolders; i++) { - if (PFDI_READ(CAB(hfdi), cab->cabhf, buf2, cffold_SIZEOF) != cffold_SIZEOF) + if (CAB(fdi)->read(cab->cabhf, buf2, cffold_SIZEOF) != cffold_SIZEOF) return DECR_INPUT; if (cab->mii.folder_resv > 0) - PFDI_SEEK(CAB(hfdi), cab->cabhf, cab->mii.folder_resv, SEEK_CUR); + CAB(fdi)->seek(cab->cabhf, cab->mii.folder_resv, SEEK_CUR); - fol = PFDI_ALLOC(CAB(hfdi), sizeof(struct fdi_folder)); + fol = CAB(fdi)->alloc(sizeof(struct fdi_folder)); if (!fol) { ERR("out of memory!\n"); return DECR_NOMEMORY; @@ -2201,10 +2194,10 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state /* read files */ for (i = 0; i < fdici.cFiles; i++) { - if (PFDI_READ(CAB(hfdi), cab->cabhf, buf2, cffile_SIZEOF) != cffile_SIZEOF) + if (CAB(fdi)->read(cab->cabhf, buf2, cffile_SIZEOF) != cffile_SIZEOF) return DECR_INPUT; - file = PFDI_ALLOC(CAB(hfdi), sizeof(struct fdi_file)); + file = CAB(fdi)->alloc(sizeof(struct fdi_file)); if (!file) { ERR("out of memory!\n"); return DECR_NOMEMORY; @@ -2218,7 +2211,7 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state file->time = EndGetI16(buf2+cffile_Time); file->date = EndGetI16(buf2+cffile_Date); file->attribs = EndGetI16(buf2+cffile_Attribs); - file->filename = FDI_read_string(CAB(hfdi), cab->cabhf, fdici.cbCabinet); + file->filename = FDI_read_string(CAB(fdi), cab->cabhf, fdici.cbCabinet); if (!file->filename) return DECR_INPUT; @@ -2238,7 +2231,7 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state /* check to ensure a real match */ if (lstrcmpiA(fi->filename, file->filename) == 0) { success = TRUE; - if (PFDI_SEEK(CAB(hfdi), cab->cabhf, cab->firstfol->offset, SEEK_SET) == -1) + if (CAB(fdi)->seek(cab->cabhf, cab->firstfol->offset, SEEK_SET) == -1) return DECR_INPUT; break; } @@ -2260,54 +2253,53 @@ static int fdi_decomp(const struct fdi_file *fi, int savemode, fdi_decomp_state return DECR_OK; } -static void free_decompression_temps(HFDI hfdi, const struct fdi_folder *fol, +static void free_decompression_temps(FDI_Int *fdi, const struct fdi_folder *fol, fdi_decomp_state *decomp_state) { switch (fol->comp_type & cffoldCOMPTYPE_MASK) { case cffoldCOMPTYPE_LZX: if (LZX(window)) { - PFDI_FREE(hfdi, LZX(window)); + fdi->free(LZX(window)); LZX(window) = NULL; } break; case cffoldCOMPTYPE_QUANTUM: if (QTM(window)) { - PFDI_FREE(hfdi, QTM(window)); + fdi->free(QTM(window)); QTM(window) = NULL; } break; } } -static void free_decompression_mem(HFDI hfdi, - fdi_decomp_state *decomp_state, struct fdi_file *file) +static void free_decompression_mem(FDI_Int *fdi, fdi_decomp_state *decomp_state) { struct fdi_folder *fol; while (decomp_state) { fdi_decomp_state *prev_fds; - PFDI_CLOSE(hfdi, CAB(cabhf)); + fdi->close(CAB(cabhf)); /* free the storage remembered by mii */ - if (CAB(mii).nextname) PFDI_FREE(hfdi, CAB(mii).nextname); - if (CAB(mii).nextinfo) PFDI_FREE(hfdi, CAB(mii).nextinfo); - if (CAB(mii).prevname) PFDI_FREE(hfdi, CAB(mii).prevname); - if (CAB(mii).previnfo) PFDI_FREE(hfdi, CAB(mii).previnfo); + if (CAB(mii).nextname) fdi->free(CAB(mii).nextname); + if (CAB(mii).nextinfo) fdi->free(CAB(mii).nextinfo); + if (CAB(mii).prevname) fdi->free(CAB(mii).prevname); + if (CAB(mii).previnfo) fdi->free(CAB(mii).previnfo); while (CAB(firstfol)) { fol = CAB(firstfol); CAB(firstfol) = CAB(firstfol)->next; - PFDI_FREE(hfdi, fol); + fdi->free(fol); } while (CAB(firstfile)) { - file = CAB(firstfile); - if (file->filename) PFDI_FREE(hfdi, file->filename); + struct fdi_file *file = CAB(firstfile); + if (file->filename) fdi->free(file->filename); CAB(firstfile) = CAB(firstfile)->next; - PFDI_FREE(hfdi, file); + fdi->free(file); } prev_fds = decomp_state; decomp_state = CAB(next); - PFDI_FREE(hfdi, prev_fds); + fdi->free(prev_fds); } } @@ -2496,17 +2488,15 @@ BOOL __cdecl FDICopy( struct fdi_folder *fol = NULL, *linkfol = NULL; struct fdi_file *file = NULL, *linkfile = NULL; fdi_decomp_state *decomp_state; + FDI_Int *fdi = get_fdi_ptr( hfdi ); TRACE("(hfdi == ^%p, pszCabinet == ^%p, pszCabPath == ^%p, flags == %0d, " "pfnfdin == ^%p, pfnfdid == ^%p, pvUser == ^%p)\n", hfdi, pszCabinet, pszCabPath, flags, pfnfdin, pfnfdid, pvUser); - if (!REALLY_IS_FDI(hfdi)) { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } + if (!fdi) return FALSE; - if (!(decomp_state = PFDI_ALLOC(hfdi, sizeof(fdi_decomp_state)))) + if (!(decomp_state = fdi->alloc(sizeof(fdi_decomp_state)))) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); return FALSE; @@ -2519,11 +2509,8 @@ BOOL __cdecl FDICopy( /* slight overestimation here to save CPU cycles in the developer's brain */ if ((pathlen + filenamelen + 3) > MAX_PATH) { ERR("MAX_PATH exceeded.\n"); - PFDI_FREE(hfdi, decomp_state); - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CABINET_NOT_FOUND; - PFDI_INT(hfdi)->perf->erfType = ERROR_FILE_NOT_FOUND; - PFDI_INT(hfdi)->perf->fError = TRUE; - SetLastError(ERROR_FILE_NOT_FOUND); + fdi->free(decomp_state); + set_error( fdi, FDIERROR_CABINET_NOT_FOUND, ERROR_FILE_NOT_FOUND ); return FALSE; } @@ -2531,7 +2518,6 @@ BOOL __cdecl FDICopy( idx = 0; if (pathlen) { for (i = 0; i < pathlen; i++) fullpath[idx++] = pszCabPath[i]; - if (fullpath[idx - 1] != '\\') fullpath[idx++] = '\\'; } if (filenamelen) for (i = 0; i < filenamelen; i++) fullpath[idx++] = pszCabinet[i]; fullpath[idx] = '\0'; @@ -2539,30 +2525,19 @@ BOOL __cdecl FDICopy( TRACE("full cab path/file name: %s\n", debugstr_a(fullpath)); /* get a handle to the cabfile */ - cabhf = PFDI_OPEN(hfdi, fullpath, _O_RDONLY|_O_BINARY, _S_IREAD | _S_IWRITE); + cabhf = fdi->open(fullpath, _O_RDONLY|_O_BINARY, _S_IREAD | _S_IWRITE); if (cabhf == -1) { - PFDI_FREE(hfdi, decomp_state); - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CABINET_NOT_FOUND; - PFDI_INT(hfdi)->perf->fError = TRUE; - SetLastError(ERROR_FILE_NOT_FOUND); - return FALSE; - } - - if (cabhf == 0) { - ERR("PFDI_OPEN returned zero for %s.\n", fullpath); - PFDI_FREE(hfdi, decomp_state); - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CABINET_NOT_FOUND; - PFDI_INT(hfdi)->perf->erfType = ERROR_FILE_NOT_FOUND; - PFDI_INT(hfdi)->perf->fError = TRUE; + fdi->free(decomp_state); + set_error( fdi, FDIERROR_CABINET_NOT_FOUND, 0 ); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } /* check if it's really a cabfile. Note that this doesn't implement the bug */ - if (!FDI_read_entries(hfdi, cabhf, &fdici, &(CAB(mii)))) { - ERR("FDIIsCabinet failed.\n"); - PFDI_FREE(hfdi, decomp_state); - PFDI_CLOSE(hfdi, cabhf); + if (!FDI_read_entries(fdi, cabhf, &fdici, &(CAB(mii)))) { + ERR("FDIIsCabinet failed: %u.\n", fdi->perf->erfOper); + fdi->free(decomp_state); + fdi->close(cabhf); return FALSE; } @@ -2576,9 +2551,7 @@ BOOL __cdecl FDICopy( fdin.psz3 = pszCabPath; if (((*pfnfdin)(fdintCABINET_INFO, &fdin))) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_USER_ABORT; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + set_error( fdi, FDIERROR_USER_ABORT, 0 ); goto bail_and_fail; } @@ -2588,23 +2561,18 @@ BOOL __cdecl FDICopy( /* read folders */ for (i = 0; i < fdici.cFolders; i++) { - if (PFDI_READ(hfdi, cabhf, buf, cffold_SIZEOF) != cffold_SIZEOF) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CORRUPT_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + if (fdi->read(cabhf, buf, cffold_SIZEOF) != cffold_SIZEOF) { + set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 ); goto bail_and_fail; } if (CAB(mii).folder_resv > 0) - PFDI_SEEK(hfdi, cabhf, CAB(mii).folder_resv, SEEK_CUR); + fdi->seek(cabhf, CAB(mii).folder_resv, SEEK_CUR); - fol = PFDI_ALLOC(hfdi, sizeof(struct fdi_folder)); + fol = fdi->alloc(sizeof(struct fdi_folder)); if (!fol) { ERR("out of memory!\n"); - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_ALLOC_FAIL; - PFDI_INT(hfdi)->perf->erfType = ERROR_NOT_ENOUGH_MEMORY; - PFDI_INT(hfdi)->perf->fError = TRUE; - SetLastError(ERROR_NOT_ENOUGH_MEMORY); + set_error( fdi, FDIERROR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); goto bail_and_fail; } ZeroMemory(fol, sizeof(struct fdi_folder)); @@ -2621,20 +2589,15 @@ BOOL __cdecl FDICopy( /* read files */ for (i = 0; i < fdici.cFiles; i++) { - if (PFDI_READ(hfdi, cabhf, buf, cffile_SIZEOF) != cffile_SIZEOF) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CORRUPT_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + if (fdi->read(cabhf, buf, cffile_SIZEOF) != cffile_SIZEOF) { + set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 ); goto bail_and_fail; } - file = PFDI_ALLOC(hfdi, sizeof(struct fdi_file)); + file = fdi->alloc(sizeof(struct fdi_file)); if (!file) { ERR("out of memory!\n"); - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_ALLOC_FAIL; - PFDI_INT(hfdi)->perf->erfType = ERROR_NOT_ENOUGH_MEMORY; - PFDI_INT(hfdi)->perf->fError = TRUE; - SetLastError(ERROR_NOT_ENOUGH_MEMORY); + set_error( fdi, FDIERROR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); goto bail_and_fail; } ZeroMemory(file, sizeof(struct fdi_file)); @@ -2646,12 +2609,10 @@ BOOL __cdecl FDICopy( file->time = EndGetI16(buf+cffile_Time); file->date = EndGetI16(buf+cffile_Date); file->attribs = EndGetI16(buf+cffile_Attribs); - file->filename = FDI_read_string(hfdi, cabhf, fdici.cbCabinet); + file->filename = FDI_read_string(fdi, cabhf, fdici.cbCabinet); if (!file->filename) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CORRUPT_CABINET; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 ); goto bail_and_fail; } @@ -2717,9 +2678,7 @@ BOOL __cdecl FDICopy( fdin.psz3 = (CAB(mii).previnfo) ? CAB(mii).previnfo : &emptystring; if (((*pfnfdin)(fdintPARTIAL_FILE, &fdin))) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_USER_ABORT; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + set_error( fdi, FDIERROR_USER_ABORT, 0 ); goto bail_and_fail; } /* I don't think we are supposed to decompress partial files. This prevents it. */ @@ -2736,9 +2695,7 @@ BOOL __cdecl FDICopy( fdin.time = file->time; fdin.attribs = file->attribs; if ((filehf = ((*pfnfdin)(fdintCOPY_FILE, &fdin))) == -1) { - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_USER_ABORT; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + set_error( fdi, FDIERROR_USER_ABORT, 0 ); filehf = 0; goto bail_and_fail; } @@ -2768,7 +2725,7 @@ BOOL __cdecl FDICopy( TRACE("Extracting file %s as requested by callee.\n", debugstr_a(file->filename)); /* set up decomp_state */ - CAB(hfdi) = hfdi; + CAB(fdi) = fdi; CAB(filehf) = filehf; /* Was there a change of folder? Compression type? Did we somehow go backwards? */ @@ -2776,28 +2733,28 @@ BOOL __cdecl FDICopy( TRACE("Resetting folder for file %s.\n", debugstr_a(file->filename)); - /* free stuff for the old decompresser */ + /* free stuff for the old decompressor */ switch (ct2) { case cffoldCOMPTYPE_LZX: if (LZX(window)) { - PFDI_FREE(hfdi, LZX(window)); + fdi->free(LZX(window)); LZX(window) = NULL; } break; case cffoldCOMPTYPE_QUANTUM: if (QTM(window)) { - PFDI_FREE(hfdi, QTM(window)); + fdi->free(QTM(window)); QTM(window) = NULL; } break; } CAB(decomp_cab) = NULL; - PFDI_SEEK(CAB(hfdi), CAB(cabhf), fol->offset, SEEK_SET); + CAB(fdi)->seek(CAB(cabhf), fol->offset, SEEK_SET); CAB(offset) = 0; CAB(outlen) = 0; - /* initialize the new decompresser */ + /* initialize the new decompressor */ switch (ct1) { case cffoldCOMPTYPE_NONE: CAB(decompress) = NONEfdi_decomp; @@ -2824,15 +2781,10 @@ BOOL __cdecl FDICopy( case DECR_OK: break; case DECR_NOMEMORY: - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_ALLOC_FAIL; - PFDI_INT(hfdi)->perf->erfType = ERROR_NOT_ENOUGH_MEMORY; - PFDI_INT(hfdi)->perf->fError = TRUE; - SetLastError(ERROR_NOT_ENOUGH_MEMORY); + set_error( fdi, FDIERROR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); goto bail_and_fail; default: - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CORRUPT_CABINET; - PFDI_INT(hfdi)->perf->erfOper = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 ); goto bail_and_fail; } @@ -2842,20 +2794,13 @@ BOOL __cdecl FDICopy( case DECR_OK: break; case DECR_USERABORT: - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_USER_ABORT; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + set_error( fdi, FDIERROR_USER_ABORT, 0 ); goto bail_and_fail; case DECR_NOMEMORY: - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_ALLOC_FAIL; - PFDI_INT(hfdi)->perf->erfType = ERROR_NOT_ENOUGH_MEMORY; - PFDI_INT(hfdi)->perf->fError = TRUE; - SetLastError(ERROR_NOT_ENOUGH_MEMORY); + set_error( fdi, FDIERROR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); goto bail_and_fail; default: - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CORRUPT_CABINET; - PFDI_INT(hfdi)->perf->erfOper = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 ); goto bail_and_fail; } CAB(offset) = file->offset; @@ -2881,37 +2826,30 @@ BOOL __cdecl FDICopy( case DECR_OK: break; case DECR_USERABORT: - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_USER_ABORT; - PFDI_INT(hfdi)->perf->erfType = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + set_error( fdi, FDIERROR_USER_ABORT, 0 ); goto bail_and_fail; case DECR_NOMEMORY: - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_ALLOC_FAIL; - PFDI_INT(hfdi)->perf->erfType = ERROR_NOT_ENOUGH_MEMORY; - PFDI_INT(hfdi)->perf->fError = TRUE; - SetLastError(ERROR_NOT_ENOUGH_MEMORY); + set_error( fdi, FDIERROR_ALLOC_FAIL, ERROR_NOT_ENOUGH_MEMORY ); goto bail_and_fail; default: - PFDI_INT(hfdi)->perf->erfOper = FDIERROR_CORRUPT_CABINET; - PFDI_INT(hfdi)->perf->erfOper = 0; - PFDI_INT(hfdi)->perf->fError = TRUE; + set_error( fdi, FDIERROR_CORRUPT_CABINET, 0 ); goto bail_and_fail; } } } - free_decompression_temps(hfdi, fol, decomp_state); - free_decompression_mem(hfdi, decomp_state, file); + if (fol) free_decompression_temps(fdi, fol, decomp_state); + free_decompression_mem(fdi, decomp_state); return TRUE; bail_and_fail: /* here we free ram before error returns */ - if (fol) free_decompression_temps(hfdi, fol, decomp_state); + if (fol) free_decompression_temps(fdi, fol, decomp_state); - if (filehf) PFDI_CLOSE(hfdi, filehf); + if (filehf) fdi->close(filehf); - free_decompression_mem(hfdi, decomp_state, file); + free_decompression_mem(fdi, decomp_state); return FALSE; } @@ -2931,15 +2869,13 @@ BOOL __cdecl FDICopy( */ BOOL __cdecl FDIDestroy(HFDI hfdi) { - TRACE("(hfdi == ^%p)\n", hfdi); - if (REALLY_IS_FDI(hfdi)) { - PFDI_INT(hfdi)->FDI_Intmagic = 0; /* paranoia */ - PFDI_FREE(hfdi, hfdi); /* confusing, but correct */ + FDI_Int *fdi = get_fdi_ptr( hfdi ); + + TRACE("(hfdi == ^%p)\n", hfdi); + if (!fdi) return FALSE; + fdi->magic = 0; /* paranoia */ + fdi->free(fdi); return TRUE; - } else { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } } /*********************************************************************** @@ -2966,13 +2902,12 @@ BOOL __cdecl FDITruncateCabinet( char *pszCabinetName, USHORT iFolderToDelete) { + FDI_Int *fdi = get_fdi_ptr( hfdi ); + FIXME("(hfdi == ^%p, pszCabinetName == %s, iFolderToDelete == %hu): stub\n", hfdi, debugstr_a(pszCabinetName), iFolderToDelete); - if (!REALLY_IS_FDI(hfdi)) { - SetLastError(ERROR_INVALID_HANDLE); - return FALSE; - } + if (!fdi) return FALSE; SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index d1bd7c6a2a2..cfc1109f016 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -45,7 +45,7 @@ reactos/dll/win32/atl # Autosync reactos/dll/win32/avifil32 # Autosync reactos/dll/win32/bcrypt # Synced to Wine-1.3.37 reactos/dll/win32/browseui # Out of sync -reactos/dll/win32/cabinet # Autosync +reactos/dll/win32/cabinet # Synced to Wine-1.3.37 reactos/dll/win32/clusapi # Autosync reactos/dll/win32/comcat # Autosync reactos/dll/win32/comctl32 # Synced to Wine 1.3.14 From 50c33aa429c1593fa5eeebd2900f09059d2c709a Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 15:12:57 +0000 Subject: [PATCH 041/289] [CABINET_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55104 --- rostests/winetests/cabinet/extract.c | 4 +- rostests/winetests/cabinet/fdi.c | 122 ++++++++++++--------------- 2 files changed, 58 insertions(+), 68 deletions(-) diff --git a/rostests/winetests/cabinet/extract.c b/rostests/winetests/cabinet/extract.c index 29fd1c7353a..aedbdd40d20 100644 --- a/rostests/winetests/cabinet/extract.c +++ b/rostests/winetests/cabinet/extract.c @@ -55,10 +55,10 @@ typedef struct { } SESSION; /* function pointers */ -HMODULE hCabinet; +static HMODULE hCabinet; static HRESULT (WINAPI *pExtract)(SESSION*, LPCSTR); -CHAR CURR_DIR[MAX_PATH]; +static CHAR CURR_DIR[MAX_PATH]; static void init_function_pointers(void) { diff --git a/rostests/winetests/cabinet/fdi.c b/rostests/winetests/cabinet/fdi.c index 5d470fade4c..4e1c9e030d3 100644 --- a/rostests/winetests/cabinet/fdi.c +++ b/rostests/winetests/cabinet/fdi.c @@ -28,7 +28,7 @@ #define MEDIA_SIZE 999999999 #define FOLDER_THRESHOLD 900000 -CHAR CURR_DIR[MAX_PATH]; +static CHAR CURR_DIR[MAX_PATH]; /* FDI callbacks */ @@ -100,106 +100,106 @@ static void test_FDICreate(void) if (0) { SetLastError(0xdeadbeef); - erf.erfOper = 0xcafefeed; - erf.erfType = 0xdeadbabe; - erf.fError = 0xdecaface; + erf.erfOper = 0x1abe11ed; + erf.erfType = 0x5eed1e55; + erf.fError = 0x1ead1e55; hfdi = FDICreate(fdi_alloc, NULL, fdi_open, fdi_read, fdi_write, fdi_close, fdi_seek, cpuUNKNOWN, &erf); ok(hfdi != NULL, "Expected non-NULL context\n"); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); - ok(erf.erfOper == 0xcafefeed, "Expected 0xcafefeed, got %d\n", erf.erfOper); - ok(erf.erfType == 0xdeadbabe, "Expected 0xdeadbabe, got %d\n", erf.erfType); - ok(erf.fError == 0xdecaface, "Expected 0xdecaface, got %d\n", erf.fError); + ok(erf.erfOper == 0x1abe11ed, "Expected 0x1abe11ed, got %d\n", erf.erfOper); + ok(erf.erfType == 0x5eed1e55, "Expected 0x5eed1e55, got %d\n", erf.erfType); + ok(erf.fError == 0x1ead1e55, "Expected 0x1ead1e55, got %d\n", erf.fError); FDIDestroy(hfdi); } SetLastError(0xdeadbeef); - erf.erfOper = 0xcafefeed; - erf.erfType = 0xdeadbabe; - erf.fError = 0xdecaface; + erf.erfOper = 0x1abe11ed; + erf.erfType = 0x5eed1e55; + erf.fError = 0x1ead1e55; hfdi = FDICreate(fdi_alloc, fdi_free, NULL, fdi_read, fdi_write, fdi_close, fdi_seek, cpuUNKNOWN, &erf); ok(hfdi != NULL, "Expected non-NULL context\n"); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); - ok((erf.erfOper == 0xcafefeed || erf.erfOper == 0 /* Vista */), "Expected 0xcafefeed or 0, got %d\n", erf.erfOper); - ok((erf.erfType == 0xdeadbabe || erf.erfType == 0 /* Vista */), "Expected 0xdeadbabe or 0, got %d\n", erf.erfType); - ok((erf.fError == 0xdecaface || erf.fError == 0 /* Vista */), "Expected 0xdecaface or 0, got %d\n", erf.fError); + ok((erf.erfOper == 0x1abe11ed || erf.erfOper == 0 /* Vista */), "Expected 0x1abe11ed or 0, got %d\n", erf.erfOper); + ok((erf.erfType == 0x5eed1e55 || erf.erfType == 0 /* Vista */), "Expected 0x5eed1e55 or 0, got %d\n", erf.erfType); + ok((erf.fError == 0x1ead1e55 || erf.fError == 0 /* Vista */), "Expected 0x1ead1e55 or 0, got %d\n", erf.fError); FDIDestroy(hfdi); SetLastError(0xdeadbeef); - erf.erfOper = 0xcafefeed; - erf.erfType = 0xdeadbabe; - erf.fError = 0xdecaface; + erf.erfOper = 0x1abe11ed; + erf.erfType = 0x5eed1e55; + erf.fError = 0x1ead1e55; hfdi = FDICreate(fdi_alloc, fdi_free, fdi_open, NULL, fdi_write, fdi_close, fdi_seek, cpuUNKNOWN, &erf); ok(hfdi != NULL, "Expected non-NULL context\n"); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); - ok((erf.erfOper == 0xcafefeed || erf.erfOper == 0 /* Vista */), "Expected 0xcafefeed or 0, got %d\n", erf.erfOper); - ok((erf.erfType == 0xdeadbabe || erf.erfType == 0 /* Vista */), "Expected 0xdeadbabe or 0, got %d\n", erf.erfType); - ok((erf.fError == 0xdecaface || erf.fError == 0 /* Vista */), "Expected 0xdecaface or 0, got %d\n", erf.fError); + ok((erf.erfOper == 0x1abe11ed || erf.erfOper == 0 /* Vista */), "Expected 0x1abe11ed or 0, got %d\n", erf.erfOper); + ok((erf.erfType == 0x5eed1e55 || erf.erfType == 0 /* Vista */), "Expected 0x5eed1e55 or 0, got %d\n", erf.erfType); + ok((erf.fError == 0x1ead1e55 || erf.fError == 0 /* Vista */), "Expected 0x1ead1e55 or 0, got %d\n", erf.fError); FDIDestroy(hfdi); SetLastError(0xdeadbeef); - erf.erfOper = 0xcafefeed; - erf.erfType = 0xdeadbabe; - erf.fError = 0xdecaface; + erf.erfOper = 0x1abe11ed; + erf.erfType = 0x5eed1e55; + erf.fError = 0x1ead1e55; hfdi = FDICreate(fdi_alloc, fdi_free, fdi_open, fdi_read, NULL, fdi_close, fdi_seek, cpuUNKNOWN, &erf); ok(hfdi != NULL, "Expected non-NULL context\n"); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); - ok((erf.erfOper == 0xcafefeed || erf.erfOper == 0 /* Vista */), "Expected 0xcafefeed or 0, got %d\n", erf.erfOper); - ok((erf.erfType == 0xdeadbabe || erf.erfType == 0 /* Vista */), "Expected 0xdeadbabe or 0, got %d\n", erf.erfType); - ok((erf.fError == 0xdecaface || erf.fError == 0 /* Vista */), "Expected 0xdecaface or 0, got %d\n", erf.fError); + ok((erf.erfOper == 0x1abe11ed || erf.erfOper == 0 /* Vista */), "Expected 0x1abe11ed or 0, got %d\n", erf.erfOper); + ok((erf.erfType == 0x5eed1e55 || erf.erfType == 0 /* Vista */), "Expected 0x5eed1e55 or 0, got %d\n", erf.erfType); + ok((erf.fError == 0x1ead1e55 || erf.fError == 0 /* Vista */), "Expected 0x1ead1e55 or 0, got %d\n", erf.fError); FDIDestroy(hfdi); SetLastError(0xdeadbeef); - erf.erfOper = 0xcafefeed; - erf.erfType = 0xdeadbabe; - erf.fError = 0xdecaface; + erf.erfOper = 0x1abe11ed; + erf.erfType = 0x5eed1e55; + erf.fError = 0x1ead1e55; hfdi = FDICreate(fdi_alloc, fdi_free, fdi_open, fdi_read, fdi_write, NULL, fdi_seek, cpuUNKNOWN, &erf); ok(hfdi != NULL, "Expected non-NULL context\n"); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); - ok((erf.erfOper == 0xcafefeed || erf.erfOper == 0 /* Vista */), "Expected 0xcafefeed or 0, got %d\n", erf.erfOper); - ok((erf.erfType == 0xdeadbabe || erf.erfType == 0 /* Vista */), "Expected 0xdeadbabe or 0, got %d\n", erf.erfType); - ok((erf.fError == 0xdecaface || erf.fError == 0 /* Vista */), "Expected 0xdecaface or 0, got %d\n", erf.fError); + ok((erf.erfOper == 0x1abe11ed || erf.erfOper == 0 /* Vista */), "Expected 0x1abe11ed or 0, got %d\n", erf.erfOper); + ok((erf.erfType == 0x5eed1e55 || erf.erfType == 0 /* Vista */), "Expected 0x5eed1e55 or 0, got %d\n", erf.erfType); + ok((erf.fError == 0x1ead1e55 || erf.fError == 0 /* Vista */), "Expected 0x1ead1e55 or 0, got %d\n", erf.fError); FDIDestroy(hfdi); SetLastError(0xdeadbeef); - erf.erfOper = 0xcafefeed; - erf.erfType = 0xdeadbabe; - erf.fError = 0xdecaface; + erf.erfOper = 0x1abe11ed; + erf.erfType = 0x5eed1e55; + erf.fError = 0x1ead1e55; hfdi = FDICreate(fdi_alloc, fdi_free, fdi_open, fdi_read, fdi_write, fdi_close, NULL, cpuUNKNOWN, &erf); ok(hfdi != NULL, "Expected non-NULL context\n"); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); - ok((erf.erfOper == 0xcafefeed || erf.erfOper == 0 /* Vista */), "Expected 0xcafefeed or 0, got %d\n", erf.erfOper); - ok((erf.erfType == 0xdeadbabe || erf.erfType == 0 /* Vista */), "Expected 0xdeadbabe or 0, got %d\n", erf.erfType); - ok((erf.fError == 0xdecaface || erf.fError == 0 /* Vista */), "Expected 0xdecaface or 0, got %d\n", erf.fError); + ok((erf.erfOper == 0x1abe11ed || erf.erfOper == 0 /* Vista */), "Expected 0x1abe11ed or 0, got %d\n", erf.erfOper); + ok((erf.erfType == 0x5eed1e55 || erf.erfType == 0 /* Vista */), "Expected 0x5eed1e55 or 0, got %d\n", erf.erfType); + ok((erf.fError == 0x1ead1e55 || erf.fError == 0 /* Vista */), "Expected 0x1ead1e55 or 0, got %d\n", erf.fError); FDIDestroy(hfdi); SetLastError(0xdeadbeef); - erf.erfOper = 0xcafefeed; - erf.erfType = 0xdeadbabe; - erf.fError = 0xdecaface; + erf.erfOper = 0x1abe11ed; + erf.erfType = 0x5eed1e55; + erf.fError = 0x1ead1e55; hfdi = FDICreate(fdi_alloc, fdi_free, fdi_open, fdi_read, fdi_write, fdi_close, fdi_seek, cpuUNKNOWN, NULL); @@ -212,26 +212,26 @@ static void test_FDICreate(void) /* bad cpu type */ SetLastError(0xdeadbeef); - erf.erfOper = 0xcafefeed; - erf.erfType = 0xdeadbabe; - erf.fError = 0xdecaface; + erf.erfOper = 0x1abe11ed; + erf.erfType = 0x5eed1e55; + erf.fError = 0x1ead1e55; hfdi = FDICreate(fdi_alloc, fdi_free, fdi_open, fdi_read, fdi_write, fdi_close, fdi_seek, 0xcafebabe, &erf); ok(hfdi != NULL, "Expected non-NULL context\n"); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); - ok((erf.erfOper == 0xcafefeed || erf.erfOper == 0 /* Vista */), "Expected 0xcafefeed or 0, got %d\n", erf.erfOper); - ok((erf.erfType == 0xdeadbabe || erf.erfType == 0 /* Vista */), "Expected 0xdeadbabe or 0, got %d\n", erf.erfType); - ok((erf.fError == 0xdecaface || erf.fError == 0 /* Vista */), "Expected 0xdecaface or 0, got %d\n", erf.fError); + ok((erf.erfOper == 0x1abe11ed || erf.erfOper == 0 /* Vista */), "Expected 0x1abe11ed or 0, got %d\n", erf.erfOper); + ok((erf.erfType == 0x5eed1e55 || erf.erfType == 0 /* Vista */), "Expected 0x5eed1e55 or 0, got %d\n", erf.erfType); + ok((erf.fError == 0x1ead1e55 || erf.fError == 0 /* Vista */), "Expected 0x1ead1e55 or 0, got %d\n", erf.fError); FDIDestroy(hfdi); /* pfnalloc fails */ SetLastError(0xdeadbeef); - erf.erfOper = 0xcafefeed; - erf.erfType = 0xdeadbabe; - erf.fError = 0xdecaface; + erf.erfOper = 0x1abe11ed; + erf.erfType = 0x5eed1e55; + erf.fError = 0x1ead1e55; hfdi = FDICreate(fdi_alloc_bad, fdi_free, fdi_open, fdi_read, fdi_write, fdi_close, fdi_seek, cpuUNKNOWN, &erf); @@ -239,12 +239,9 @@ static void test_FDICreate(void) ok(erf.erfOper == FDIERROR_ALLOC_FAIL, "Expected FDIERROR_ALLOC_FAIL, got %d\n", erf.erfOper); ok(erf.fError == TRUE, "Expected TRUE, got %d\n", erf.fError); - todo_wine - { - ok(GetLastError() == 0xdeadbeef, - "Expected 0xdeadbeef, got %d\n", GetLastError()); - ok(erf.erfType == 0, "Expected 0, got %d\n", erf.erfType); - } + ok(GetLastError() == 0xdeadbeef, + "Expected 0xdeadbeef, got %d\n", GetLastError()); + ok(erf.erfType == 0, "Expected 0, got %d\n", erf.erfType); } static void test_FDIDestroy(void) @@ -581,11 +578,8 @@ static void test_FDIIsCabinet(void) ok(cabinfo.cFiles == 4, "Expected 4, got %d\n", cabinfo.cFiles); ok(cabinfo.cFolders == 1, "Expected 1, got %d\n", cabinfo.cFolders); ok(cabinfo.setID == 0xbeef, "Expected 0xbeef, got %d\n", cabinfo.setID); - todo_wine - { - ok(cabinfo.cbCabinet == 182, "Expected 182, got %d\n", cabinfo.cbCabinet); - ok(cabinfo.iCabinet == 0, "Expected 0, got %d\n", cabinfo.iCabinet); - } + ok(cabinfo.cbCabinet == 182, "Expected 182, got %d\n", cabinfo.cbCabinet); + ok(cabinfo.iCabinet == 0, "Expected 0, got %d\n", cabinfo.iCabinet); fdi_close(fd); FDIDestroy(hfdi); @@ -631,11 +625,8 @@ static void test_FDICopy(void) SetLastError(0xdeadbeef); ret = FDICopy(hfdi, name, path, 0, CopyProgress, NULL, 0); ok(ret == FALSE, "Expected FALSE, got %d\n", ret); - todo_wine - { - ok(GetLastError() == ERROR_INVALID_HANDLE, - "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); - } + ok(GetLastError() == ERROR_INVALID_HANDLE, + "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); FDIDestroy(hfdi); } @@ -651,7 +642,6 @@ static void test_FDICopy(void) /* cabinet with no files or folders */ SetLastError(0xdeadbeef); ret = FDICopy(hfdi, name, path, 0, CopyProgress, NULL, 0); - todo_wine ok(ret == TRUE, "Expected TRUE, got %d\n", ret); ok(GetLastError() == 0, "Expected 0f, got %d\n", GetLastError()); From 3cfc88d97019acec5492e5eae2632dc8da5f4c64 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 15:19:38 +0000 Subject: [PATCH 042/289] [PSDK] * Update winuser.h annotations. svn path=/trunk/; revision=55105 --- reactos/include/psdk/winuser.h | 1901 ++++++++++++++++++++++---------- 1 file changed, 1327 insertions(+), 574 deletions(-) diff --git a/reactos/include/psdk/winuser.h b/reactos/include/psdk/winuser.h index cad65181c80..38122092a0e 100644 --- a/reactos/include/psdk/winuser.h +++ b/reactos/include/psdk/winuser.h @@ -2905,9 +2905,9 @@ typedef struct tagCOMPAREITEMSTRUCT { } COMPAREITEMSTRUCT, *PCOMPAREITEMSTRUCT,*LPCOMPAREITEMSTRUCT; typedef struct tagCOPYDATASTRUCT { - ULONG_PTR dwData; - DWORD cbData; - PVOID lpData; + ULONG_PTR dwData; + DWORD cbData; + _Field_size_bytes_(cbData) PVOID lpData; } COPYDATASTRUCT,*PCOPYDATASTRUCT; typedef struct tagCURSORSHAPE { @@ -3852,740 +3852,1493 @@ typedef struct tagRAWINPUTDEVICELIST { } #define POINTTOPOINTS(p) ((POINTS)MAKELONG((p).x,(p).y)) -HKL WINAPI ActivateKeyboardLayout(HKL,UINT); -BOOL WINAPI AdjustWindowRect(LPRECT,DWORD,BOOL); -BOOL WINAPI AdjustWindowRectEx(LPRECT,DWORD,BOOL,DWORD); +HKL WINAPI ActivateKeyboardLayout(_In_ HKL, _In_ UINT); +BOOL WINAPI AdjustWindowRect(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL); +BOOL WINAPI AdjustWindowRectEx(_Inout_ LPRECT, _In_ DWORD, _In_ BOOL, _In_ DWORD); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI AnimateWindow(HWND,DWORD,DWORD); +BOOL WINAPI AnimateWindow(_In_ HWND, _In_ DWORD, _In_ DWORD); #endif /* (_WIN32_WINNT >= 0x0500) */ BOOL WINAPI AnyPopup(void); -BOOL WINAPI AppendMenuA(HMENU,UINT,UINT_PTR,LPCSTR); -BOOL WINAPI AppendMenuW(HMENU,UINT,UINT_PTR,LPCWSTR); -UINT WINAPI ArrangeIconicWindows(HWND); -BOOL WINAPI AttachThreadInput(DWORD,DWORD,BOOL); -HDWP WINAPI BeginDeferWindowPos(int); -HDC WINAPI BeginPaint(HWND,LPPAINTSTRUCT); -BOOL WINAPI BringWindowToTop(HWND); -long WINAPI BroadcastSystemMessage(DWORD,LPDWORD,UINT,WPARAM,LPARAM); +BOOL WINAPI AppendMenuA(_In_ HMENU, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCSTR); +BOOL WINAPI AppendMenuW(_In_ HMENU, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR); +UINT WINAPI ArrangeIconicWindows(_In_ HWND); +BOOL WINAPI AttachThreadInput(_In_ DWORD, _In_ DWORD, _In_ BOOL); +HDWP WINAPI BeginDeferWindowPos(_In_ int); +HDC WINAPI BeginPaint(_In_ HWND, _Out_ LPPAINTSTRUCT); +BOOL WINAPI BringWindowToTop(_In_ HWND); +long WINAPI BroadcastSystemMessage(_In_ DWORD, _Inout_opt_ LPDWORD, _In_ UINT, _In_ WPARAM, _In_ LPARAM); + #if (_WIN32_WINNT >= 0x0400) -LONG WINAPI BroadcastSystemMessageA(DWORD,LPDWORD,UINT,WPARAM,LPARAM); -LONG WINAPI BroadcastSystemMessageW(DWORD,LPDWORD,UINT,WPARAM,LPARAM); + +LONG +WINAPI +BroadcastSystemMessageA( + _In_ DWORD flags, + _Inout_opt_ LPDWORD lpInfo, + _In_ UINT Msg, + _In_ WPARAM wParam, + _In_ LPARAM lParam); + +LONG +WINAPI +BroadcastSystemMessageW( + _In_ DWORD flags, + _Inout_opt_ LPDWORD lpInfo, + _In_ UINT Msg, + _In_ WPARAM wParam, + _In_ LPARAM lParam); + #endif /* (_WIN32_WINNT >= 0x0400) */ + #if (_WIN32_WINNT >= 0x0501) -LONG WINAPI BroadcastSystemMessageExA(DWORD,LPDWORD,UINT,WPARAM,LPARAM,PBSMINFO); -LONG WINAPI BroadcastSystemMessageExW(DWORD,LPDWORD,UINT,WPARAM,LPARAM,PBSMINFO); + +LONG +WINAPI +BroadcastSystemMessageExA( + _In_ DWORD flags, + _Inout_opt_ LPDWORD lpInfo, + _In_ UINT Msg, + _In_ WPARAM wParam, + _In_ LPARAM lParam, + _Out_opt_ PBSMINFO pbsmInfo); + +LONG +WINAPI +BroadcastSystemMessageExW( + _In_ DWORD flags, + _Inout_opt_ LPDWORD lpInfo, + _In_ UINT Msg, + _In_ WPARAM wParam, + _In_ LPARAM lParam, + _Out_opt_ PBSMINFO pbsmInfo); + #endif /* (_WIN32_WINNT >= 0x0501) */ + void WINAPI CalcChildScroll(HWND, INT); -BOOL WINAPI CallMsgFilterA(LPMSG,INT); -BOOL WINAPI CallMsgFilterW(LPMSG,INT); -LRESULT WINAPI CallNextHookEx(HHOOK,int,WPARAM,LPARAM); -LRESULT WINAPI CallWindowProcA(WNDPROC,HWND,UINT,WPARAM,LPARAM); -LRESULT WINAPI CallWindowProcW(WNDPROC,HWND,UINT,WPARAM,LPARAM); -WORD WINAPI CascadeWindows(HWND,UINT,LPCRECT,UINT,const HWND*); -BOOL WINAPI ChangeClipboardChain(HWND,HWND); +BOOL WINAPI CallMsgFilterA(_In_ LPMSG, _In_ INT); +BOOL WINAPI CallMsgFilterW(_In_ LPMSG, _In_ INT); +LRESULT WINAPI CallNextHookEx(_In_opt_ HHOOK, _In_ int, _In_ WPARAM, _In_ LPARAM); +LRESULT WINAPI CallWindowProcA(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +LRESULT WINAPI CallWindowProcW(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); + +WORD +WINAPI +CascadeWindows( + _In_opt_ HWND hwndParent, + _In_ UINT wHow, + _In_opt_ CONST RECT * lpRect, + _In_ UINT cKids, + _In_reads_opt_(cKids) const HWND FAR *lpKids); + +BOOL WINAPI ChangeClipboardChain(_In_ HWND, _In_ HWND); #if defined(_WINGDI_) && !defined(NOGDI) -LONG WINAPI ChangeDisplaySettingsA(PDEVMODEA,DWORD); -LONG WINAPI ChangeDisplaySettingsW(PDEVMODEW,DWORD); -LONG WINAPI ChangeDisplaySettingsExA(LPCSTR,LPDEVMODEA,HWND,DWORD,LPVOID); -LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID); +LONG WINAPI ChangeDisplaySettingsA(_In_opt_ PDEVMODEA, _In_ DWORD); +LONG WINAPI ChangeDisplaySettingsW(_In_opt_ PDEVMODEW, _In_ DWORD); +LONG WINAPI ChangeDisplaySettingsExA(_In_opt_ LPCSTR, _In_opt_ LPDEVMODEA, _Reserved_ HWND, _In_ DWORD, _In_opt_ LPVOID); +LONG WINAPI ChangeDisplaySettingsExW(_In_opt_ LPCWSTR, _In_opt_ LPDEVMODEW, _Reserved_ HWND, _In_ DWORD, _In_opt_ LPVOID); #endif -BOOL WINAPI ChangeMenuA(HMENU,UINT,LPCSTR,UINT,UINT); -BOOL WINAPI ChangeMenuW(HMENU,UINT,LPCWSTR,UINT,UINT); -LPSTR WINAPI CharLowerA(LPSTR); -LPWSTR WINAPI CharLowerW(LPWSTR); -DWORD WINAPI CharLowerBuffA(LPSTR,DWORD); -DWORD WINAPI CharLowerBuffW(LPWSTR,DWORD); -LPSTR WINAPI CharNextA(LPCSTR); -LPWSTR WINAPI CharNextW(LPCWSTR); -LPSTR WINAPI CharNextExA(WORD,LPCSTR,DWORD); -LPWSTR WINAPI CharNextExW(WORD,LPCWSTR,DWORD); -LPSTR WINAPI CharPrevA(LPCSTR,LPCSTR); -LPWSTR WINAPI CharPrevW(LPCWSTR,LPCWSTR); -LPSTR WINAPI CharPrevExA(WORD,LPCSTR,LPCSTR,DWORD); -LPWSTR WINAPI CharPrevExW(WORD,LPCWSTR,LPCWSTR,DWORD); -BOOL WINAPI CharToOemA(LPCSTR,LPSTR); -BOOL WINAPI CharToOemW(LPCWSTR,LPSTR); -BOOL WINAPI CharToOemBuffA(LPCSTR,LPSTR,DWORD); -BOOL WINAPI CharToOemBuffW(LPCWSTR,LPSTR,DWORD); -LPSTR WINAPI CharUpperA(LPSTR); -LPWSTR WINAPI CharUpperW(LPWSTR); -DWORD WINAPI CharUpperBuffA(LPSTR,DWORD); -DWORD WINAPI CharUpperBuffW(LPWSTR,DWORD); -BOOL WINAPI CheckDlgButton(HWND,int,UINT); -DWORD WINAPI CheckMenuItem(HMENU,UINT,UINT); -BOOL WINAPI CheckMenuRadioItem(HMENU,UINT,UINT,UINT,UINT); -BOOL WINAPI CheckRadioButton(HWND,int,int,int); -HWND WINAPI ChildWindowFromPoint(HWND,POINT); -HWND WINAPI ChildWindowFromPointEx(HWND,POINT,UINT); -BOOL WINAPI ClientToScreen(HWND,LPPOINT); -BOOL WINAPI ClipCursor(LPCRECT); +BOOL WINAPI ChangeMenuA(_In_ HMENU, _In_ UINT, _In_opt_ LPCSTR, _In_ UINT, _In_ UINT); +BOOL WINAPI ChangeMenuW(_In_ HMENU, _In_ UINT, _In_opt_ LPCWSTR, _In_ UINT, _In_ UINT); +LPSTR WINAPI CharLowerA(_Inout_ LPSTR); +LPWSTR WINAPI CharLowerW(_Inout_ LPWSTR); + +DWORD +WINAPI +CharLowerBuffA( + _Inout_updates_(cchLength) LPSTR lpsz, + _In_ DWORD cchLength); + +DWORD +WINAPI +CharLowerBuffW( + _Inout_updates_(cchLength) LPWSTR lpsz, + _In_ DWORD cchLength); + +LPSTR WINAPI CharNextA(_In_ LPCSTR); +LPWSTR WINAPI CharNextW(_In_ LPCWSTR); + +LPSTR WINAPI CharNextExA(_In_ WORD, _In_ LPCSTR, _In_ DWORD); +LPWSTR WINAPI CharNextExW(_In_ WORD, _In_ LPCWSTR, _In_ DWORD); +LPSTR WINAPI CharPrevA(_In_ LPCSTR, _In_ LPCSTR); +LPWSTR WINAPI CharPrevW(_In_ LPCWSTR, _In_ LPCWSTR); +LPSTR WINAPI CharPrevExA(_In_ WORD, _In_ LPCSTR, _In_ LPCSTR, _In_ DWORD); +LPWSTR WINAPI CharPrevExW(_In_ WORD, _In_ LPCWSTR, _In_ LPCWSTR, _In_ DWORD); + +BOOL +WINAPI +CharToOemA( + _In_ LPCSTR pSrc, + _Out_writes_(_Inexpressible_(strlen(pSrc) + 1)) LPSTR pDst); + +BOOL +WINAPI +CharToOemW( + _In_ LPCWSTR pSrc, + _Out_writes_(_Inexpressible_(strlen(pSrc) + 1)) LPSTR pDst); + +BOOL +WINAPI +CharToOemBuffA( + _In_ LPCSTR lpszSrc, + _Out_writes_(cchDstLength) LPSTR lpszDst, + _In_ DWORD cchDstLength); + +BOOL +WINAPI +CharToOemBuffW( + _In_ LPCWSTR lpszSrc, + _Out_writes_(cchDstLength) LPSTR lpszDst, + _In_ DWORD cchDstLength); + +LPSTR WINAPI CharUpperA(_Inout_ LPSTR); +LPWSTR WINAPI CharUpperW(_Inout_ LPWSTR); + +DWORD +WINAPI +CharUpperBuffA( + _Inout_updates_(cchLength) LPSTR lpsz, + _In_ DWORD cchLength); + +DWORD +WINAPI +CharUpperBuffW( + _Inout_updates_(cchLength) LPWSTR lpsz, + _In_ DWORD cchLength); + +BOOL WINAPI CheckDlgButton(_In_ HWND, _In_ int, _In_ UINT); +DWORD WINAPI CheckMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT); +BOOL WINAPI CheckMenuRadioItem(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT, _In_ UINT); +BOOL WINAPI CheckRadioButton(_In_ HWND, _In_ int, _In_ int, _In_ int); +HWND WINAPI ChildWindowFromPoint(_In_ HWND, _In_ POINT); +HWND WINAPI ChildWindowFromPointEx(_In_ HWND, _In_ POINT, _In_ UINT); +BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT); +BOOL WINAPI ClipCursor(_In_opt_ LPCRECT); BOOL WINAPI CloseClipboard(void); -BOOL WINAPI CloseDesktop(HDESK); -BOOL WINAPI CloseWindow(HWND); -BOOL WINAPI CloseWindowStation(HWINSTA); -int WINAPI CopyAcceleratorTableA(HACCEL,LPACCEL,int); -int WINAPI CopyAcceleratorTableW(HACCEL,LPACCEL,int); +BOOL WINAPI CloseDesktop(_In_ HDESK); +BOOL WINAPI CloseWindow(_In_ HWND); +BOOL WINAPI CloseWindowStation(_In_ HWINSTA); + +int +WINAPI +CopyAcceleratorTableA( + _In_ HACCEL hAccelSrc, + _Out_writes_to_opt_(cAccelEntries, return) LPACCEL lpAccelDst, + _In_ int cAccelEntries); + +int +WINAPI +CopyAcceleratorTableW( + _In_ HACCEL hAccelSrc, + _Out_writes_to_opt_(cAccelEntries, return) LPACCEL lpAccelDst, + _In_ int cAccelEntries); + #define CopyCursor(c) ((HCURSOR)CopyIcon((HICON)(c))) -HICON WINAPI CopyIcon(HICON); -HANDLE WINAPI CopyImage(HANDLE,UINT,int,int,UINT); -BOOL WINAPI CopyRect(LPRECT,LPCRECT); +HICON WINAPI CopyIcon(_In_ HICON); +HANDLE WINAPI CopyImage(_In_ HANDLE, _In_ UINT, _In_ int, _In_ int, _In_ UINT); +BOOL WINAPI CopyRect(_Out_ LPRECT, _In_ LPCRECT); int WINAPI CountClipboardFormats(void); -HACCEL WINAPI CreateAcceleratorTableA(LPACCEL,int); -HACCEL WINAPI CreateAcceleratorTableW(LPACCEL,int); -BOOL WINAPI CreateCaret(HWND,HBITMAP,int,int); -HCURSOR WINAPI CreateCursor(HINSTANCE,int,int,int,int,CONST VOID*,CONST VOID*); + +HACCEL +WINAPI +CreateAcceleratorTableA( + _In_reads_(cAccel) LPACCEL paccel, + _In_ int cAccel); + +HACCEL +WINAPI +CreateAcceleratorTableW( + _In_reads_(cAccel) LPACCEL paccel, + _In_ int cAccel); + +BOOL WINAPI CreateCaret(_In_ HWND, _In_opt_ HBITMAP, _In_ int, _In_ int); +HCURSOR WINAPI CreateCursor(_In_opt_ HINSTANCE, _In_ int, _In_ int, _In_ int, _In_ int, _In_ CONST VOID*, _In_ CONST VOID*); + #if defined(_WINGDI_) && !defined(NOGDI) -HDESK WINAPI CreateDesktopA(LPCSTR,LPCSTR,LPDEVMODEA,DWORD,ACCESS_MASK,LPSECURITY_ATTRIBUTES); -HDESK WINAPI CreateDesktopW(LPCWSTR,LPCWSTR,LPDEVMODEW,DWORD,ACCESS_MASK,LPSECURITY_ATTRIBUTES); + +HDESK +WINAPI +CreateDesktopA( + _In_ LPCSTR lpszDesktop, + _Reserved_ LPCSTR lpszDevice, + _Reserved_ DEVMODEA* pDevmode, + _In_ DWORD dwFlags, + _In_ ACCESS_MASK dwDesiredAccess, + _In_opt_ LPSECURITY_ATTRIBUTES lpsa); + +HDESK +WINAPI +CreateDesktopW( + _In_ LPCWSTR lpszDesktop, + _Reserved_ LPCWSTR lpszDevice, + _Reserved_ DEVMODEW* pDevmode, + _In_ DWORD dwFlags, + _In_ ACCESS_MASK dwDesiredAccess, + _In_opt_ LPSECURITY_ATTRIBUTES lpsa); + #endif + #define CreateDialogA(h,n,w,f) CreateDialogParamA(h,n,w,f,0) #define CreateDialogW(h,n,w,f) CreateDialogParamW(h,n,w,f,0) #define CreateDialogIndirectA(h,t,w,f) CreateDialogIndirectParamA(h,t,w,f,0) #define CreateDialogIndirectW(h,t,w,f) CreateDialogIndirectParamW(h,t,w,f,0) -HWND WINAPI CreateDialogIndirectParamA(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM); -HWND WINAPI CreateDialogIndirectParamW(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM); -HWND WINAPI CreateDialogParamA(HINSTANCE,LPCSTR,HWND,DLGPROC,LPARAM); -HWND WINAPI CreateDialogParamW(HINSTANCE,LPCWSTR,HWND,DLGPROC,LPARAM); -HICON WINAPI CreateIcon(HINSTANCE,int,int,BYTE,BYTE,const BYTE*,const BYTE*); -HICON WINAPI CreateIconFromResource(PBYTE,DWORD,BOOL,DWORD); -HICON WINAPI CreateIconFromResourceEx(PBYTE,DWORD,BOOL,DWORD,int,int,UINT); -HICON WINAPI CreateIconIndirect(PICONINFO); -HWND WINAPI CreateMDIWindowA(LPCSTR,LPCSTR,DWORD,int,int,int,int,HWND,HINSTANCE,LPARAM); -HWND WINAPI CreateMDIWindowW(LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HINSTANCE,LPARAM); +HWND WINAPI CreateDialogIndirectParamA(_In_opt_ HINSTANCE, _In_ LPCDLGTEMPLATE, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM); +HWND WINAPI CreateDialogIndirectParamW(_In_opt_ HINSTANCE, _In_ LPCDLGTEMPLATE, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM); +HWND WINAPI CreateDialogParamA(_In_opt_ HINSTANCE, _In_ LPCSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM); +HWND WINAPI CreateDialogParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM); +HICON WINAPI CreateIcon(_In_opt_ HINSTANCE, _In_ int, _In_ int, _In_ BYTE, _In_ BYTE, _In_ const BYTE*, _In_ const BYTE*); + +HICON +WINAPI +CreateIconFromResource( + _In_reads_bytes_(dwResSize) PBYTE presbits, + _In_ DWORD dwResSize, + _In_ BOOL fIcon, + _In_ DWORD dwVer); + +HICON +WINAPI +CreateIconFromResourceEx( + _In_reads_bytes_(dwResSize) PBYTE presbits, + _In_ DWORD dwResSize, + _In_ BOOL fIcon, + _In_ DWORD dwVer, + _In_ int cxDesired, + _In_ int cyDesired, + _In_ UINT Flags); + +HICON WINAPI CreateIconIndirect(_In_ PICONINFO); +HWND WINAPI CreateMDIWindowA(_In_ LPCSTR, _In_ LPCSTR, _In_ DWORD, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ HWND, _In_opt_ HINSTANCE, _In_ LPARAM); +HWND WINAPI CreateMDIWindowW(_In_ LPCWSTR, _In_ LPCWSTR, _In_ DWORD, _In_ int, _In_ int, _In_ int, _In_ int, _In_opt_ HWND, _In_opt_ HINSTANCE, _In_ LPARAM); HMENU WINAPI CreateMenu(void); HMENU WINAPI CreatePopupMenu(void); + #define CreateWindowA(a,b,c,d,e,f,g,h,i,j,k) CreateWindowExA(0,a,b,c,d,e,f,g,h,i,j,k) #define CreateWindowW(a,b,c,d,e,f,g,h,i,j,k) CreateWindowExW(0,a,b,c,d,e,f,g,h,i,j,k) -HWND WINAPI CreateWindowExA(DWORD,LPCSTR,LPCSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID); -HWND WINAPI CreateWindowExW(DWORD,LPCWSTR,LPCWSTR,DWORD,int,int,int,int,HWND,HMENU,HINSTANCE,LPVOID); + +HWND +WINAPI +CreateWindowExA( + _In_ DWORD dwExStyle, + _In_opt_ LPCSTR lpClassName, + _In_opt_ LPCSTR lpWindowName, + _In_ DWORD dwStyle, + _In_ int X, + _In_ int Y, + _In_ int nWidth, + _In_ int nHeight, + _In_opt_ HWND hWndParent, + _In_opt_ HMENU hMenu, + _In_opt_ HINSTANCE hInstance, + _In_opt_ LPVOID lpParam); + +HWND +WINAPI +CreateWindowExW( + _In_ DWORD dwExStyle, + _In_opt_ LPCWSTR lpClassName, + _In_opt_ LPCWSTR lpWindowName, + _In_ DWORD dwStyle, + _In_ int X, + _In_ int Y, + _In_ int nWidth, + _In_ int nHeight, + _In_opt_ HWND hWndParent, + _In_opt_ HMENU hMenu, + _In_opt_ HINSTANCE hInstance, + _In_opt_ LPVOID lpParam); + #ifndef NOWINDOWSTATION -HWINSTA WINAPI CreateWindowStationA(LPCSTR,DWORD,ACCESS_MASK,LPSECURITY_ATTRIBUTES); -HWINSTA WINAPI CreateWindowStationW(LPCWSTR,DWORD,ACCESS_MASK,LPSECURITY_ATTRIBUTES); + +HWINSTA +WINAPI +CreateWindowStationA( + _In_opt_ LPCSTR lpwinsta, + _In_ DWORD dwFlags, + _In_ ACCESS_MASK dwDesiredAccess, + _In_opt_ LPSECURITY_ATTRIBUTES lpsa); + +HWINSTA +WINAPI +CreateWindowStationW( + _In_opt_ LPCWSTR lpwinsta, + _In_ DWORD dwFlags, + _In_ ACCESS_MASK dwDesiredAccess, + _In_opt_ LPSECURITY_ATTRIBUTES lpsa); + #endif -LRESULT WINAPI DefDlgProcA(HWND,UINT,WPARAM,LPARAM); -LRESULT WINAPI DefDlgProcW(HWND,UINT,WPARAM,LPARAM); -HDWP WINAPI DeferWindowPos(HDWP,HWND,HWND,int,int,int,int,UINT); -LRESULT WINAPI DefFrameProcA(HWND,HWND,UINT,WPARAM,LPARAM); -LRESULT WINAPI DefFrameProcW(HWND,HWND,UINT,WPARAM,LPARAM); + +LRESULT WINAPI DefDlgProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +LRESULT WINAPI DefDlgProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +HDWP WINAPI DeferWindowPos(_In_ HDWP, _In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT); +LRESULT WINAPI DefFrameProcA(_In_ HWND, _In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +LRESULT WINAPI DefFrameProcW(_In_ HWND, _In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); #define DefHookProc(c,p,lp,h) CallNextHookEx((HHOOK)*h,c,p,lp) -LRESULT WINAPI DefMDIChildProcA(HWND,UINT,WPARAM,LPARAM); -LRESULT WINAPI DefMDIChildProcW(HWND,UINT,WPARAM,LPARAM); +LRESULT WINAPI DefMDIChildProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +LRESULT WINAPI DefMDIChildProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); + #if (_WIN32_WINNT >= 0x0501) -LRESULT WINAPI DefRawInputProc(PRAWINPUT*,INT,UINT); +LRESULT +WINAPI +DefRawInputProc( + _In_reads_(nInput) PRAWINPUT *paRawInput, + _In_ INT nInput, + _In_ UINT cbSizeHeader); #endif -LRESULT WINAPI DefWindowProcA(HWND,UINT,WPARAM,LPARAM); -LRESULT WINAPI DefWindowProcW(HWND,UINT,WPARAM,LPARAM); -BOOL WINAPI DeleteMenu(HMENU,UINT,UINT); -BOOL WINAPI DeregisterShellHookWindow(HWND); -BOOL WINAPI DestroyAcceleratorTable(HACCEL); + +LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT); +BOOL WINAPI DeregisterShellHookWindow(_In_ HWND); +BOOL WINAPI DestroyAcceleratorTable(_In_ HACCEL); BOOL WINAPI DestroyCaret(void); -BOOL WINAPI DestroyCursor(HCURSOR); -BOOL WINAPI DestroyIcon(HICON); -BOOL WINAPI DestroyMenu(HMENU); -BOOL WINAPI DestroyWindow(HWND); +BOOL WINAPI DestroyCursor(_In_ HCURSOR); +BOOL WINAPI DestroyIcon(_In_ HICON); +BOOL WINAPI DestroyMenu(_In_ HMENU); +BOOL WINAPI DestroyWindow(_In_ HWND); #define DialogBoxA(i,t,p,f) DialogBoxParamA(i,t,p,f,0) #define DialogBoxW(i,t,p,f) DialogBoxParamW(i,t,p,f,0) #define DialogBoxIndirectA(i,t,p,f) DialogBoxIndirectParamA(i,t,p,f,0) #define DialogBoxIndirectW(i,t,p,f) DialogBoxIndirectParamW(i,t,p,f,0) -INT_PTR WINAPI DialogBoxIndirectParamA(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM); -INT_PTR WINAPI DialogBoxIndirectParamW(HINSTANCE,LPCDLGTEMPLATE,HWND,DLGPROC,LPARAM); -INT_PTR WINAPI DialogBoxParamA(HINSTANCE,LPCSTR,HWND,DLGPROC,LPARAM); -INT_PTR WINAPI DialogBoxParamW(HINSTANCE,LPCWSTR,HWND,DLGPROC,LPARAM); -LRESULT WINAPI DispatchMessageA(const MSG*); -LRESULT WINAPI DispatchMessageW(const MSG*); -int WINAPI DlgDirListA(HWND,LPSTR,int,int,UINT); -int WINAPI DlgDirListW(HWND,LPWSTR,int,int,UINT); -int WINAPI DlgDirListComboBoxA(HWND,LPSTR,int,int,UINT); -int WINAPI DlgDirListComboBoxW(HWND,LPWSTR,int,int,UINT); -BOOL WINAPI DlgDirSelectComboBoxExA(HWND,LPSTR,int,int); -BOOL WINAPI DlgDirSelectComboBoxExW(HWND,LPWSTR,int,int); -BOOL WINAPI DlgDirSelectExA(HWND,LPSTR,int,int); -BOOL WINAPI DlgDirSelectExW(HWND,LPWSTR,int,int); -BOOL WINAPI DragDetect(HWND,POINT); -DWORD WINAPI DragObject(HWND,HWND,UINT,ULONG_PTR,HCURSOR); -BOOL WINAPI DrawAnimatedRects(HWND,int,LPCRECT,LPCRECT); -BOOL WINAPI DrawCaption(HWND,HDC,LPCRECT,UINT); +INT_PTR WINAPI DialogBoxIndirectParamA(_In_opt_ HINSTANCE, _In_ LPCDLGTEMPLATE, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM); +INT_PTR WINAPI DialogBoxIndirectParamW(_In_opt_ HINSTANCE, _In_ LPCDLGTEMPLATE, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM); +INT_PTR WINAPI DialogBoxParamA(_In_opt_ HINSTANCE, _In_ LPCSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM); +INT_PTR WINAPI DialogBoxParamW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM); +LRESULT WINAPI DispatchMessageA(_In_ const MSG*); +LRESULT WINAPI DispatchMessageW(_In_ const MSG*); +int WINAPI DlgDirListA(_In_ HWND, _Inout_ LPSTR, _In_ int, _In_ int, _In_ UINT); +int WINAPI DlgDirListW(_In_ HWND, _Inout_ LPWSTR, _In_ int, _In_ int, _In_ UINT); +int WINAPI DlgDirListComboBoxA(_In_ HWND, _Inout_ LPSTR, _In_ int, _In_ int, _In_ UINT); +int WINAPI DlgDirListComboBoxW(_In_ HWND, _Inout_ LPWSTR, _In_ int, _In_ int, _In_ UINT); + +BOOL +WINAPI +DlgDirSelectComboBoxExA( + _In_ HWND hwndDlg, + _Out_writes_(cchOut) LPSTR lpString, + _In_ int cchOut, + _In_ int idComboBox); + +BOOL +WINAPI +DlgDirSelectComboBoxExW( + _In_ HWND hwndDlg, + _Out_writes_(cchOut) LPWSTR lpString, + _In_ int cchOut, + _In_ int idComboBox); + +BOOL +WINAPI +DlgDirSelectExA( + _In_ HWND hwndDlg, + _Out_writes_(chCount) LPSTR lpString, + _In_ int chCount, + _In_ int idListBox); + +BOOL +WINAPI +DlgDirSelectExW( + _In_ HWND hwndDlg, + _Out_writes_(chCount) LPWSTR lpString, + _In_ int chCount, + _In_ int idListBox); + +BOOL WINAPI DragDetect(_In_ HWND, _In_ POINT); +DWORD WINAPI DragObject(_In_ HWND, _In_ HWND, _In_ UINT, _In_ ULONG_PTR, _In_opt_ HCURSOR); +BOOL WINAPI DrawAnimatedRects(_In_opt_ HWND, _In_ int, _In_ LPCRECT, _In_ LPCRECT); +BOOL WINAPI DrawCaption(_In_ HWND, _In_ HDC, _In_ LPCRECT, _In_ UINT); BOOL WINAPI DrawCaptionTempA(HWND,HDC,const RECT*,HFONT,HICON,LPCSTR,UINT); BOOL WINAPI DrawCaptionTempW(HWND,HDC,const RECT*,HFONT,HICON,LPCWSTR,UINT); -BOOL WINAPI DrawEdge(HDC,LPRECT,UINT,UINT); -BOOL WINAPI DrawFocusRect(HDC,LPCRECT); -BOOL WINAPI DrawFrameControl(HDC,LPRECT,UINT,UINT); -BOOL WINAPI DrawIcon(HDC,int,int,HICON); -BOOL WINAPI DrawIconEx(HDC,int,int,HICON,int,int,UINT,HBRUSH,UINT); -BOOL WINAPI DrawMenuBar(HWND); +BOOL WINAPI DrawEdge(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT); +BOOL WINAPI DrawFocusRect(_In_ HDC, _In_ LPCRECT); +BOOL WINAPI DrawFrameControl(_In_ HDC, _Inout_ LPRECT, _In_ UINT, _In_ UINT); +BOOL WINAPI DrawIcon(_In_ HDC, _In_ int, _In_ int, _In_ HICON); +BOOL WINAPI DrawIconEx(_In_ HDC, _In_ int, _In_ int, _In_ HICON, _In_ int, _In_ int, _In_ UINT, _In_opt_ HBRUSH, _In_ UINT); +BOOL WINAPI DrawMenuBar(_In_ HWND); DWORD WINAPI DrawMenuBarTemp(HWND,HDC,LPRECT,HMENU,HFONT); -BOOL WINAPI DrawStateA(HDC,HBRUSH,DRAWSTATEPROC,LPARAM,WPARAM,int,int,int,int,UINT); -BOOL WINAPI DrawStateW(HDC,HBRUSH,DRAWSTATEPROC,LPARAM,WPARAM,int,int,int,int,UINT); -int WINAPI DrawTextA(HDC,LPCSTR,int,LPRECT,UINT); -int WINAPI DrawTextW(HDC,LPCWSTR,int,LPRECT,UINT); -int WINAPI DrawTextExA(HDC,LPSTR,int,LPRECT,UINT,LPDRAWTEXTPARAMS); -int WINAPI DrawTextExW(HDC,LPWSTR,int,LPRECT,UINT,LPDRAWTEXTPARAMS); +BOOL WINAPI DrawStateA(_In_ HDC, _In_opt_ HBRUSH, _In_opt_ DRAWSTATEPROC, _In_ LPARAM, _In_ WPARAM, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT); +BOOL WINAPI DrawStateW(_In_ HDC, _In_opt_ HBRUSH, _In_opt_ DRAWSTATEPROC, _In_ LPARAM, _In_ WPARAM, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT); + +int +WINAPI +DrawTextA( + _In_ HDC hdc, + _Inout_updates_opt_(cchText) LPCSTR lpchText, + _In_ int cchText, + _Inout_ LPRECT lprc, + _In_ UINT format); + +int +WINAPI +DrawTextW( + _In_ HDC hdc, + _Inout_updates_opt_(cchText) LPCWSTR lpchText, + _In_ int cchText, + _Inout_ LPRECT lprc, + _In_ UINT format); + +int +WINAPI +DrawTextExA( + _In_ HDC hdc, + _Inout_updates_opt_(cchText) LPSTR lpchText, + _In_ int cchText, + _Inout_ LPRECT lprc, + _In_ UINT format, + _In_opt_ LPDRAWTEXTPARAMS lpdtp); + +int +WINAPI +DrawTextExW( + _In_ HDC hdc, + _Inout_updates_opt_(cchText) LPWSTR lpchText, + _In_ int cchText, + _Inout_ LPRECT lprc, + _In_ UINT format, + _In_opt_ LPDRAWTEXTPARAMS lpdtp); + BOOL WINAPI EmptyClipboard(void); -BOOL WINAPI EnableMenuItem(HMENU,UINT,UINT); -BOOL WINAPI EnableScrollBar(HWND,UINT,UINT); -BOOL WINAPI EnableWindow(HWND,BOOL); -BOOL WINAPI EndDeferWindowPos(HDWP); -BOOL WINAPI EndDialog(HWND,INT_PTR); +BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT); +BOOL WINAPI EnableScrollBar(_In_ HWND, _In_ UINT, _In_ UINT); +BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL); +BOOL WINAPI EndDeferWindowPos(_In_ HDWP); +BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR); BOOL WINAPI EndMenu(void); -BOOL WINAPI EndPaint(HWND,const PAINTSTRUCT*); +BOOL WINAPI EndPaint(_In_ HWND, _In_ const PAINTSTRUCT*); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI EndTask(HWND,BOOL,BOOL); +BOOL WINAPI EndTask(_In_ HWND, _In_ BOOL, _In_ BOOL); #endif -BOOL WINAPI EnumChildWindows(HWND,WNDENUMPROC,LPARAM); -UINT WINAPI EnumClipboardFormats(UINT); -BOOL WINAPI EnumDesktopsA(HWINSTA,DESKTOPENUMPROCA,LPARAM); -BOOL WINAPI EnumDesktopsW(HWINSTA,DESKTOPENUMPROCW,LPARAM); -BOOL WINAPI EnumDesktopWindows(HDESK,WNDENUMPROC,LPARAM); -BOOL WINAPI EnumDisplayMonitors(HDC,LPCRECT,MONITORENUMPROC,LPARAM); +BOOL WINAPI EnumChildWindows(_In_opt_ HWND, _In_ WNDENUMPROC, _In_ LPARAM); +UINT WINAPI EnumClipboardFormats(_In_ UINT); +BOOL WINAPI EnumDesktopsA(_In_opt_ HWINSTA, _In_ DESKTOPENUMPROCA, _In_ LPARAM); +BOOL WINAPI EnumDesktopsW(_In_opt_ HWINSTA, _In_ DESKTOPENUMPROCW, _In_ LPARAM); +BOOL WINAPI EnumDesktopWindows(_In_opt_ HDESK, _In_ WNDENUMPROC, _In_ LPARAM); +BOOL WINAPI EnumDisplayMonitors(_In_opt_ HDC, _In_opt_ LPCRECT, _In_ MONITORENUMPROC, _In_ LPARAM); #if defined(_WINGDI_) && !defined(NOGDI) -BOOL WINAPI EnumDisplaySettingsA(LPCSTR,DWORD,PDEVMODEA); -BOOL WINAPI EnumDisplaySettingsW(LPCWSTR,DWORD,PDEVMODEW); +BOOL WINAPI EnumDisplaySettingsA(_In_opt_ LPCSTR, _In_ DWORD, _Inout_ PDEVMODEA); +BOOL WINAPI EnumDisplaySettingsW(_In_opt_ LPCWSTR, _In_ DWORD, _Inout_ PDEVMODEW); #if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) -BOOL WINAPI EnumDisplaySettingsExA(LPCSTR,DWORD,LPDEVMODEA,DWORD); -BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR,DWORD,LPDEVMODEW,DWORD); +BOOL WINAPI EnumDisplaySettingsExA(_In_opt_ LPCSTR, _In_ DWORD, _Inout_ LPDEVMODEA, _In_ DWORD); +BOOL WINAPI EnumDisplaySettingsExW(_In_opt_ LPCWSTR, _In_ DWORD, _Inout_ LPDEVMODEW, _In_ DWORD); #endif -BOOL WINAPI EnumDisplayDevicesA(LPCSTR,DWORD,PDISPLAY_DEVICEA,DWORD); -BOOL WINAPI EnumDisplayDevicesW(LPCWSTR,DWORD,PDISPLAY_DEVICEW,DWORD); +BOOL WINAPI EnumDisplayDevicesA(_In_opt_ LPCSTR, _In_ DWORD, _Inout_ PDISPLAY_DEVICEA, _In_ DWORD); +BOOL WINAPI EnumDisplayDevicesW(_In_opt_ LPCWSTR, _In_ DWORD, _Inout_ PDISPLAY_DEVICEW, _In_ DWORD); #endif -int WINAPI EnumPropsA(HWND,PROPENUMPROCA); -int WINAPI EnumPropsW(HWND,PROPENUMPROCW); -int WINAPI EnumPropsExA(HWND,PROPENUMPROCEXA,LPARAM); -int WINAPI EnumPropsExW(HWND,PROPENUMPROCEXW,LPARAM); +int WINAPI EnumPropsA(_In_ HWND, _In_ PROPENUMPROCA); +int WINAPI EnumPropsW(_In_ HWND, _In_ PROPENUMPROCW); +int WINAPI EnumPropsExA(_In_ HWND, _In_ PROPENUMPROCEXA, _In_ LPARAM); +int WINAPI EnumPropsExW(_In_ HWND, _In_ PROPENUMPROCEXW, _In_ LPARAM); #define EnumTaskWindows(h,f,p) EnumThreadWindows((DWORD)h,f,p) -BOOL WINAPI EnumThreadWindows(DWORD,WNDENUMPROC,LPARAM); -BOOL WINAPI EnumWindows(WNDENUMPROC,LPARAM); -BOOL WINAPI EnumWindowStationsA(WINSTAENUMPROCA,LPARAM); -BOOL WINAPI EnumWindowStationsW(WINSTAENUMPROCW,LPARAM); -BOOL WINAPI EqualRect(LPCRECT,LPCRECT); +BOOL WINAPI EnumThreadWindows(_In_ DWORD, _In_ WNDENUMPROC, _In_ LPARAM); +BOOL WINAPI EnumWindows(_In_ WNDENUMPROC, _In_ LPARAM); +BOOL WINAPI EnumWindowStationsA(_In_ WINSTAENUMPROCA, _In_ LPARAM); +BOOL WINAPI EnumWindowStationsW(_In_ WINSTAENUMPROCW, _In_ LPARAM); +BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT); #define ExitWindows(r,c) ExitWindowsEx(EWX_LOGOFF,0) -BOOL WINAPI ExitWindowsEx(UINT,DWORD); -HWND WINAPI FindWindowA(LPCSTR,LPCSTR); -HWND WINAPI FindWindowExA(HWND,HWND,LPCSTR,LPCSTR); -HWND WINAPI FindWindowExW(HWND,HWND,LPCWSTR,LPCWSTR); -HWND WINAPI FindWindowW(LPCWSTR,LPCWSTR); -BOOL WINAPI FlashWindow(HWND,BOOL); +BOOL WINAPI ExitWindowsEx(_In_ UINT, _In_ DWORD); +HWND WINAPI FindWindowA(_In_opt_ LPCSTR, _In_opt_ LPCSTR); +HWND WINAPI FindWindowW(_In_opt_ LPCWSTR, _In_opt_ LPCWSTR); +HWND WINAPI FindWindowExA(_In_opt_ HWND, _In_opt_ HWND, _In_opt_ LPCSTR, _In_opt_ LPCSTR); +HWND WINAPI FindWindowExW(_In_opt_ HWND, _In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR); +BOOL WINAPI FlashWindow(_In_ HWND, _In_ BOOL); #if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) -BOOL WINAPI FlashWindowEx(PFLASHWINFO); +BOOL WINAPI FlashWindowEx(_In_ PFLASHWINFO); #endif -int WINAPI FrameRect(HDC,LPCRECT,HBRUSH); +int WINAPI FrameRect(_In_ HDC, _In_ LPCRECT, _In_ HBRUSH); BOOL WINAPI FrameRgn(HDC,HRGN,HBRUSH,int,int); HWND WINAPI GetActiveWindow(void); -HWND WINAPI GetAncestor(HWND,UINT); -SHORT WINAPI GetAsyncKeyState(int); +HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT); +SHORT WINAPI GetAsyncKeyState(_In_ int); HWND WINAPI GetCapture(void); UINT WINAPI GetCaretBlinkTime(void); -BOOL WINAPI GetCaretPos(LPPOINT); -BOOL WINAPI GetClassInfoA(HINSTANCE,LPCSTR,LPWNDCLASSA); -BOOL WINAPI GetClassInfoExA(HINSTANCE,LPCSTR,LPWNDCLASSEXA); -BOOL WINAPI GetClassInfoW(HINSTANCE,LPCWSTR,LPWNDCLASSW); -BOOL WINAPI GetClassInfoExW(HINSTANCE,LPCWSTR,LPWNDCLASSEXW); -DWORD WINAPI GetClassLongA(HWND,int); -DWORD WINAPI GetClassLongW(HWND,int); +BOOL WINAPI GetCaretPos(_Out_ LPPOINT); +BOOL WINAPI GetClassInfoA(_In_opt_ HINSTANCE, _In_ LPCSTR, _Out_ LPWNDCLASSA); +BOOL WINAPI GetClassInfoExA(_In_opt_ HINSTANCE, _In_ LPCSTR, _Out_ LPWNDCLASSEXA); +BOOL WINAPI GetClassInfoW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSW); +BOOL WINAPI GetClassInfoExW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSEXW); +DWORD WINAPI GetClassLongA(_In_ HWND, _In_ int); +DWORD WINAPI GetClassLongW(_In_ HWND, _In_ int); #ifdef _WIN64 -ULONG_PTR WINAPI GetClassLongPtrA(HWND,int); -ULONG_PTR WINAPI GetClassLongPtrW(HWND,int); +ULONG_PTR WINAPI GetClassLongPtrA(_In_ HWND, _In_ int); +ULONG_PTR WINAPI GetClassLongPtrW(_In_ HWND, _In_ int); #else #define GetClassLongPtrA GetClassLongA #define GetClassLongPtrW GetClassLongW #endif -int WINAPI GetClassNameA(HWND,LPSTR,int); -int WINAPI GetClassNameW(HWND,LPWSTR,int); -WORD WINAPI GetClassWord(HWND,int); -BOOL WINAPI GetClientRect(HWND,LPRECT); -HANDLE WINAPI GetClipboardData(UINT); -int WINAPI GetClipboardFormatNameA(UINT,LPSTR,int); -int WINAPI GetClipboardFormatNameW(UINT,LPWSTR,int); + +int +WINAPI +GetClassNameA( + _In_ HWND hWnd, + _Out_writes_to_(nMaxCount, return) LPSTR lpClassName, + _In_ int nMaxCount); + +int +WINAPI +GetClassNameW( + _In_ HWND hWnd, + _Out_writes_to_(nMaxCount, return) LPWSTR lpClassName, + _In_ int nMaxCount); + +WORD WINAPI GetClassWord(_In_ HWND, _In_ int); +BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT); +HANDLE WINAPI GetClipboardData(_In_ UINT); + +int +WINAPI +GetClipboardFormatNameA( + _In_ UINT format, + _Out_writes_(cchMaxCount) LPSTR lpszFormatName, + _In_ int cchMaxCount); + +int +WINAPI +GetClipboardFormatNameW( + _In_ UINT format, + _Out_writes_(cchMaxCount) LPWSTR lpszFormatName, + _In_ int cchMaxCount); + HWND WINAPI GetClipboardOwner(void); #if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) DWORD WINAPI GetClipboardSequenceNumber(void); #endif HWND WINAPI GetClipboardViewer(void); -BOOL WINAPI GetClipCursor(LPRECT); -BOOL WINAPI GetCursorPos(LPPOINT); -HDC WINAPI GetDC(HWND); -HDC WINAPI GetDCEx(HWND,HRGN,DWORD); +BOOL WINAPI GetClipCursor(_Out_ LPRECT); +BOOL WINAPI GetCursorPos(_Out_ LPPOINT); +HDC WINAPI GetDC(_In_opt_ HWND); +HDC WINAPI GetDCEx(_In_opt_ HWND, _In_opt_ HRGN, _In_ DWORD); HWND WINAPI GetDesktopWindow(void); LONG WINAPI GetDialogBaseUnits(void); -int WINAPI GetDlgCtrlID(HWND); -HWND WINAPI GetDlgItem(HWND,int); -UINT WINAPI GetDlgItemInt(HWND,int,PBOOL,BOOL); -UINT WINAPI GetDlgItemTextA(HWND,int,LPSTR,int); -UINT WINAPI GetDlgItemTextW(HWND,int,LPWSTR,int); +int WINAPI GetDlgCtrlID(_In_ HWND); +HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int); +UINT WINAPI GetDlgItemInt(_In_ HWND, _In_ int, _Out_opt_ PBOOL, _In_ BOOL); + +_Ret_range_(0, cchMax) +UINT +WINAPI +GetDlgItemTextA( + _In_ HWND hDlg, + _In_ int nIDDlgItem, + _Out_writes_(cchMax) LPSTR lpString, + _In_ int cchMax); + +_Ret_range_(0, cchMax) +UINT +WINAPI +GetDlgItemTextW( + _In_ HWND hDlg, + _In_ int nIDDlgItem, + _Out_writes_(cchMax) LPWSTR lpString, + _In_ int cchMax); + UINT WINAPI GetDoubleClickTime(void); HWND WINAPI GetFocus(void); HWND WINAPI GetForegroundWindow(void); #if (_WIN32_WINNT >= 0x0500) -DWORD WINAPI GetGuiResources(HANDLE,DWORD); +DWORD WINAPI GetGuiResources(_In_ HANDLE, _In_ DWORD); #endif -BOOL WINAPI GetIconInfo(HICON,PICONINFO); -BOOL WINAPI GetIconInfoExA(HICON,ICONINFOEXA*); -BOOL WINAPI GetIconInfoExW(HICON,ICONINFOEXW*); +BOOL WINAPI GetIconInfo(_In_ HICON, _Out_ PICONINFO); +BOOL WINAPI GetIconInfoExA(_In_ HICON, _Inout_ ICONINFOEXA*); +BOOL WINAPI GetIconInfoExW(_In_ HICON, _Inout_ ICONINFOEXW*); BOOL WINAPI GetInputState(void); UINT WINAPI GetKBCodePage(void); -HKL WINAPI GetKeyboardLayout(DWORD); -UINT WINAPI GetKeyboardLayoutList(int,HKL*); -BOOL WINAPI GetKeyboardLayoutNameA(LPSTR); -BOOL WINAPI GetKeyboardLayoutNameW(LPWSTR); -BOOL WINAPI GetKeyboardState(PBYTE); -int WINAPI GetKeyboardType(int); -int WINAPI GetKeyNameTextA(LONG,LPSTR,int); -int WINAPI GetKeyNameTextW(LONG,LPWSTR,int); -SHORT WINAPI GetKeyState(int); -HWND WINAPI GetLastActivePopup(HWND); -HMENU WINAPI GetMenu(HWND); +HKL WINAPI GetKeyboardLayout(_In_ DWORD); + +UINT +WINAPI +GetKeyboardLayoutList( + _In_ int nBuff, + _Out_writes_to_opt_(nBuff, return) HKL FAR *lpList); + +BOOL WINAPI GetKeyboardLayoutNameA(_Out_writes_(KL_NAMELENGTH) LPSTR); +BOOL WINAPI GetKeyboardLayoutNameW(_Out_writes_(KL_NAMELENGTH) LPWSTR); + +_Check_return_ +BOOL +WINAPI +GetKeyboardState( + _Out_writes_(256) PBYTE lpKeyState); + +int WINAPI GetKeyboardType(_In_ int); + +int +WINAPI +GetKeyNameTextA( + _In_ LONG lParam, + _Out_writes_(cchSize) LPSTR lpString, + _In_ int cchSize); + +int +WINAPI +GetKeyNameTextW( + _In_ LONG lParam, + _Out_writes_(cchSize) LPWSTR lpString, + _In_ int cchSize); + +SHORT WINAPI GetKeyState(_In_ int); +HWND WINAPI GetLastActivePopup(_In_ HWND); +HMENU WINAPI GetMenu(_In_ HWND); LONG WINAPI GetMenuCheckMarkDimensions(void); -DWORD WINAPI GetMenuContextHelpId(HMENU); -UINT WINAPI GetMenuDefaultItem(HMENU,UINT,UINT); -int WINAPI GetMenuItemCount(HMENU); -UINT WINAPI GetMenuItemID(HMENU,int); -BOOL WINAPI GetMenuItemInfoA(HMENU,UINT,BOOL,LPMENUITEMINFOA); -BOOL WINAPI GetMenuItemInfoW(HMENU,UINT,BOOL,LPMENUITEMINFOW); -BOOL WINAPI GetMenuItemRect(HWND,HMENU,UINT,LPRECT); -UINT WINAPI GetMenuState(HMENU,UINT,UINT); -int WINAPI GetMenuStringA(HMENU,UINT,LPSTR,int,UINT); -int WINAPI GetMenuStringW(HMENU,UINT,LPWSTR,int,UINT); -BOOL WINAPI GetMessageA(LPMSG,HWND,UINT,UINT); -BOOL WINAPI GetMessageW(LPMSG,HWND,UINT,UINT); +DWORD WINAPI GetMenuContextHelpId(_In_ HMENU); +UINT WINAPI GetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT); +int WINAPI GetMenuItemCount(_In_opt_ HMENU); +UINT WINAPI GetMenuItemID(_In_ HMENU, _In_ int); +BOOL WINAPI GetMenuItemInfoA(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOA); +BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW); +BOOL WINAPI GetMenuItemRect(_In_opt_ HWND, _In_ HMENU, _In_ UINT, _Out_ LPRECT); +UINT WINAPI GetMenuState(_In_ HMENU, _In_ UINT, _In_ UINT); + +int +WINAPI +GetMenuStringA( + _In_ HMENU hMenu, + _In_ UINT uIDItem, + _Out_writes_opt_(cchMax) LPSTR lpString, + _In_ int cchMax, + _In_ UINT flags); + +int +WINAPI +GetMenuStringW( + _In_ HMENU hMenu, + _In_ UINT uIDItem, + _Out_writes_opt_(cchMax) LPWSTR lpString, + _In_ int cchMax, + _In_ UINT flags); + +BOOL WINAPI GetMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT); +BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT); + LPARAM WINAPI GetMessageExtraInfo(void); DWORD WINAPI GetMessagePos(void); LONG WINAPI GetMessageTime(void); + #if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0490) -int WINAPI GetMouseMovePointsEx(UINT,LPMOUSEMOVEPOINT,LPMOUSEMOVEPOINT,int,DWORD); +int +WINAPI +GetMouseMovePointsEx( + _In_ UINT cbSize, + _In_ LPMOUSEMOVEPOINT lppt, + _Out_writes_(nBufPoints) LPMOUSEMOVEPOINT lpptBuf, + _In_ int nBufPoints, + _In_ DWORD resolution); #endif -HWND WINAPI GetNextDlgGroupItem(HWND,HWND,BOOL); -HWND WINAPI GetNextDlgTabItem(HWND,HWND,BOOL); + +HWND WINAPI GetNextDlgGroupItem(_In_ HWND, _In_opt_ HWND, _In_ BOOL); +HWND WINAPI GetNextDlgTabItem(_In_ HWND, _In_opt_ HWND, _In_ BOOL); #define GetNextWindow(h,c) GetWindow(h,c) HWND WINAPI GetOpenClipboardWindow(void); -HWND WINAPI GetParent(HWND); -int WINAPI GetPriorityClipboardFormat(UINT*,int); -HANDLE WINAPI GetPropA(HWND,LPCSTR); -HANDLE WINAPI GetPropW(HWND,LPCWSTR); +HWND WINAPI GetParent(_In_ HWND); + +int +WINAPI +GetPriorityClipboardFormat( + _In_reads_(cFormats) UINT *paFormatPriorityList, + _In_ int cFormats); + +HANDLE WINAPI GetPropA(_In_ HWND, _In_ LPCSTR); +HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR); + #if (_WIN32_WINNT >= 0x0501) -UINT WINAPI GetRawInputBuffer(PRAWINPUT,PUINT,UINT); -UINT WINAPI GetRawInputData(HRAWINPUT,UINT,LPVOID,PUINT,UINT); -UINT WINAPI GetRawInputDeviceInfoA(HANDLE,UINT,LPVOID,PUINT); -UINT WINAPI GetRawInputDeviceInfoW(HANDLE,UINT,LPVOID,PUINT); -UINT WINAPI GetRawInputDeviceList(PRAWINPUTDEVICELIST,PUINT,UINT); -UINT WINAPI GetRegisteredRawInputDevices(PRAWINPUTDEVICE,PUINT,UINT); -#endif -DWORD WINAPI GetQueueStatus(UINT); -BOOL WINAPI GetScrollInfo(HWND,int,LPSCROLLINFO); -int WINAPI GetScrollPos(HWND,int); -BOOL WINAPI GetScrollRange(HWND,int,LPINT,LPINT); + +UINT +WINAPI +GetRawInputBuffer( + _Out_writes_bytes_opt_(*pcbSize) PRAWINPUT pData, + _Inout_ PUINT pcbSize, + _In_ UINT cbSizeHeader); + +UINT +WINAPI +GetRawInputData( + _In_ HRAWINPUT hRawInput, + _In_ UINT uiCommand, + _Out_writes_bytes_to_opt_(*pcbSize, return) LPVOID pData, + _Inout_ PUINT pcbSize, + _In_ UINT cbSizeHeader); + +UINT +WINAPI +GetRawInputDeviceInfoA( + _In_opt_ HANDLE hDevice, + _In_ UINT uiCommand, + _Inout_updates_bytes_to_opt_(*pcbSize, *pcbSize) LPVOID pData, + _Inout_ PUINT pcbSize); + +UINT +WINAPI +GetRawInputDeviceInfoW( + _In_opt_ HANDLE hDevice, + _In_ UINT uiCommand, + _Inout_updates_bytes_to_opt_(*pcbSize, *pcbSize) LPVOID pData, + _Inout_ PUINT pcbSize); + +UINT +WINAPI +GetRawInputDeviceList( + _Out_writes_opt_(*puiNumDevices) PRAWINPUTDEVICELIST pRawInputDeviceList, + _Inout_ PUINT puiNumDevices, + _In_ UINT cbSize); + +UINT +WINAPI +GetRegisteredRawInputDevices( + _Out_writes_opt_(*puiNumDevices) PRAWINPUTDEVICE pRawInputDevices, + _Inout_ PUINT puiNumDevices, + _In_ UINT cbSize); + +#endif /* (_WIN32_WINNT >= 0x0501) */ + +DWORD WINAPI GetQueueStatus(_In_ UINT); +BOOL WINAPI GetScrollInfo(_In_ HWND, _In_ int, _Inout_ LPSCROLLINFO); +int WINAPI GetScrollPos(_In_ HWND, _In_ int); +BOOL WINAPI GetScrollRange(_In_ HWND, _In_ int, _Out_ LPINT, _Out_ LPINT); #if (_WIN32_WINNT >= 0x0500) HWND WINAPI GetShellWindow(void); #endif -HMENU WINAPI GetSubMenu(HMENU,int); -DWORD WINAPI GetSysColor(int); -HBRUSH WINAPI GetSysColorBrush(int); +HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int); +DWORD WINAPI GetSysColor(_In_ int); +HBRUSH WINAPI GetSysColorBrush(_In_ int); #define GetSysModalWindow() (NULL) -HMENU WINAPI GetSystemMenu(HWND,BOOL); -int WINAPI GetSystemMetrics(int); -DWORD WINAPI GetTabbedTextExtentA(HDC,LPCSTR,int,int,CONST INT*); -DWORD WINAPI GetTabbedTextExtentW(HDC,LPCWSTR,int,int,CONST INT*); -LONG WINAPI GetWindowLongA(HWND,int); -LONG WINAPI GetWindowLongW(HWND,int); +HMENU WINAPI GetSystemMenu(_In_ HWND, _In_ BOOL); +int WINAPI GetSystemMetrics(_In_ int); + +DWORD +WINAPI +GetTabbedTextExtentA( + _In_ HDC hdc, + _In_reads_(chCount) LPCSTR lpString, + _In_ int chCount, + _In_ int nTabPositions, + _In_reads_opt_(nTabPositions) CONST INT *lpnTabStopPositions); + +DWORD +WINAPI +GetTabbedTextExtentW( + _In_ HDC hdc, + _In_reads_(chCount) LPCWSTR lpString, + _In_ int chCount, + _In_ int nTabPositions, + _In_reads_opt_(nTabPositions) CONST INT *lpnTabStopPositions); + +LONG WINAPI GetWindowLongA(_In_ HWND, _In_ int); +LONG WINAPI GetWindowLongW(_In_ HWND, _In_ int); #ifdef _WIN64 -LONG_PTR WINAPI GetWindowLongPtrA(HWND,int); -LONG_PTR WINAPI GetWindowLongPtrW(HWND,int); +LONG_PTR WINAPI GetWindowLongPtrA(_In_ HWND, _In_ int); +LONG_PTR WINAPI GetWindowLongPtrW(_In_ HWND, _In_ int); #else #define GetWindowLongPtrA GetWindowLongA #define GetWindowLongPtrW GetWindowLongW #endif -HDESK WINAPI GetThreadDesktop(DWORD); -HWND WINAPI GetTopWindow(HWND); -BOOL WINAPI GetUpdateRect(HWND,LPRECT,BOOL); -int WINAPI GetUpdateRgn(HWND,HRGN,BOOL); -BOOL WINAPI GetUserObjectInformationA(HANDLE,int,PVOID,DWORD,PDWORD); -BOOL WINAPI GetUserObjectInformationW(HANDLE,int,PVOID,DWORD,PDWORD); -BOOL WINAPI GetUserObjectSecurity(HANDLE,PSECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); -HWND WINAPI GetWindow(HWND,UINT); -DWORD WINAPI GetWindowContextHelpId(HWND); -HDC WINAPI GetWindowDC(HWND); +HDESK WINAPI GetThreadDesktop(_In_ DWORD); +HWND WINAPI GetTopWindow(_In_opt_ HWND); +BOOL WINAPI GetUpdateRect(_In_ HWND, _Out_opt_ LPRECT, _In_ BOOL); +int WINAPI GetUpdateRgn(_In_ HWND, _In_ HRGN, _In_ BOOL); + +BOOL +WINAPI +GetUserObjectInformationA( + _In_ HANDLE hObj, + _In_ int nIndex, + _Out_writes_bytes_opt_(nLength) PVOID pvInfo, + _In_ DWORD nLength, + _Out_opt_ LPDWORD lpnLengthNeeded); + +BOOL +WINAPI +GetUserObjectInformationW( + _In_ HANDLE hObj, + _In_ int nIndex, + _Out_writes_bytes_opt_(nLength) PVOID pvInfo, + _In_ DWORD nLength, + _Out_opt_ LPDWORD lpnLengthNeeded); + +BOOL +WINAPI +GetUserObjectSecurity( + _In_ HANDLE hObj, + _In_ PSECURITY_INFORMATION pSIRequested, + _Out_writes_bytes_opt_(nLength) PSECURITY_DESCRIPTOR pSID, + _In_ DWORD nLength, + _Out_ LPDWORD lpnLengthNeeded); + +HWND WINAPI GetWindow(_In_ HWND, _In_ UINT); +DWORD WINAPI GetWindowContextHelpId(_In_ HWND); +HDC WINAPI GetWindowDC(_In_opt_ HWND); BOOL WINAPI GetWindowExtEx(HDC,LPSIZE); -BOOL WINAPI GetWindowPlacement(HWND,WINDOWPLACEMENT*); -BOOL WINAPI GetWindowRect(HWND,LPRECT); -int WINAPI GetWindowRgn(HWND,HRGN); +BOOL WINAPI GetWindowPlacement(_In_ HWND, _Inout_ WINDOWPLACEMENT*); +BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT); +int WINAPI GetWindowRgn(_In_ HWND, _In_ HRGN); #define GetWindowTask(hWnd) ((HANDLE)GetWindowThreadProcessId(hWnd, NULL)) -int WINAPI GetWindowTextA(HWND,LPSTR,int); -int WINAPI GetWindowTextLengthA(HWND); -int WINAPI GetWindowTextLengthW(HWND); -int WINAPI GetWindowTextW(HWND,LPWSTR,int); -WORD WINAPI GetWindowWord(HWND,int); -BOOL WINAPI GetAltTabInfoA(HWND,int,PALTTABINFO,LPSTR,UINT); -BOOL WINAPI GetAltTabInfoW(HWND,int,PALTTABINFO,LPWSTR,UINT); -BOOL WINAPI GetComboBoxInfo(HWND,PCOMBOBOXINFO); -BOOL WINAPI GetCursorInfo(PCURSORINFO); + +_Ret_range_(0, nMaxCount) +int +WINAPI +GetWindowTextA( + _In_ HWND hWnd, + _Out_writes_(nMaxCount) LPSTR lpString, + _In_ int nMaxCount); + +_Ret_range_(0, nMaxCount) +int +WINAPI +GetWindowTextW( + _In_ HWND hWnd, + _Out_writes_(nMaxCount) LPWSTR lpString, + _In_ int nMaxCount); + +int WINAPI GetWindowTextLengthA(_In_ HWND); +int WINAPI GetWindowTextLengthW(_In_ HWND); +WORD WINAPI GetWindowWord(_In_ HWND, _In_ int); + +BOOL +WINAPI +GetAltTabInfoA( + _In_opt_ HWND hwnd, + _In_ int iItem, + _Inout_ PALTTABINFO pati, + _Out_writes_opt_(cchItemText) LPSTR pszItemText, + _In_ UINT cchItemText); + +BOOL +WINAPI +GetAltTabInfoW( + _In_opt_ HWND hwnd, + _In_ int iItem, + _Inout_ PALTTABINFO pati, + _Out_writes_opt_(cchItemText) LPWSTR pszItemText, + _In_ UINT cchItemText); + +BOOL WINAPI GetComboBoxInfo(_In_ HWND, _Inout_ PCOMBOBOXINFO); +BOOL WINAPI GetCursorInfo(_Inout_ PCURSORINFO); #if (WINVER >= 0x0500) -BOOL WINAPI GetGUIThreadInfo(DWORD,LPGUITHREADINFO); +BOOL WINAPI GetGUIThreadInfo(_In_ DWORD, _Inout_ LPGUITHREADINFO); #endif -BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO); -DWORD WINAPI GetListBoxInfo(HWND); -BOOL WINAPI GetMenuBarInfo(HWND,LONG,LONG,PMENUBARINFO); -BOOL WINAPI GetMenuInfo(HMENU,LPMENUINFO); +BOOL WINAPI GetLastInputInfo(_Out_ PLASTINPUTINFO); +DWORD WINAPI GetListBoxInfo(_In_ HWND); +BOOL WINAPI GetMenuBarInfo(_In_ HWND, _In_ LONG, _In_ LONG, _Inout_ PMENUBARINFO); +BOOL WINAPI GetMenuInfo(_In_ HMENU, _Inout_ LPMENUINFO); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI GetProcessDefaultLayout(DWORD*); +BOOL WINAPI GetProcessDefaultLayout(_Out_ DWORD*); #endif -BOOL WINAPI GetScrollBarInfo(HWND,LONG,PSCROLLBARINFO); -BOOL WINAPI GetTitleBarInfo(HWND,PTITLEBARINFO); -BOOL WINAPI GetWindowInfo(HWND,PWINDOWINFO); -BOOL WINAPI GetMonitorInfoA(HMONITOR,LPMONITORINFO); -BOOL WINAPI GetMonitorInfoW(HMONITOR,LPMONITORINFO); -UINT WINAPI GetWindowModuleFileNameA(HWND,LPSTR,UINT); -UINT WINAPI GetWindowModuleFileNameW(HWND,LPWSTR,UINT); -BOOL WINAPI GrayStringA(HDC,HBRUSH,GRAYSTRINGPROC,LPARAM,int,int,int,int,int); -BOOL WINAPI GrayStringW(HDC,HBRUSH,GRAYSTRINGPROC,LPARAM,int,int,int,int,int); -BOOL WINAPI HideCaret(HWND); -BOOL WINAPI HiliteMenuItem(HWND,HMENU,UINT,UINT); -BOOL WINAPI InflateRect(LPRECT,int,int); +BOOL WINAPI GetScrollBarInfo(_In_ HWND, _In_ LONG, _Inout_ PSCROLLBARINFO); +BOOL WINAPI GetTitleBarInfo(_In_ HWND, _Inout_ PTITLEBARINFO); +BOOL WINAPI GetWindowInfo(_In_ HWND, _Inout_ PWINDOWINFO); +BOOL WINAPI GetMonitorInfoA(_In_ HMONITOR, _Inout_ LPMONITORINFO); +BOOL WINAPI GetMonitorInfoW(_In_ HMONITOR, _Inout_ LPMONITORINFO); + +UINT +WINAPI +GetWindowModuleFileNameA( + _In_ HWND hwnd, + _Out_writes_to_(cchFileNameMax, return) LPSTR pszFileName, + _In_ UINT cchFileNameMax); + +UINT +WINAPI +GetWindowModuleFileNameW( + _In_ HWND hwnd, + _Out_writes_to_(cchFileNameMax, return) LPWSTR pszFileName, + _In_ UINT cchFileNameMax); + +BOOL WINAPI GrayStringA(_In_ HDC, _In_opt_ HBRUSH, _In_opt_ GRAYSTRINGPROC, _In_ LPARAM, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int); +BOOL WINAPI GrayStringW(_In_ HDC, _In_opt_ HBRUSH, _In_opt_ GRAYSTRINGPROC, _In_ LPARAM, _In_ int, _In_ int, _In_ int, _In_ int, _In_ int); +BOOL WINAPI HideCaret(_In_opt_ HWND); +BOOL WINAPI HiliteMenuItem(_In_ HWND, _In_ HMENU, _In_ UINT, _In_ UINT); +BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int); BOOL WINAPI InSendMessage(void); #if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) -DWORD WINAPI InSendMessageEx(LPVOID); +DWORD WINAPI InSendMessageEx(_Reserved_ LPVOID); #endif -BOOL WINAPI InsertMenuA(HMENU,UINT,UINT,UINT_PTR,LPCSTR); -BOOL WINAPI InsertMenuW(HMENU,UINT,UINT,UINT_PTR,LPCWSTR); -BOOL WINAPI InsertMenuItemA(HMENU,UINT,BOOL,LPCMENUITEMINFOA); -BOOL WINAPI InsertMenuItemW(HMENU,UINT,BOOL,LPCMENUITEMINFOW); -INT WINAPI InternalGetWindowText(HWND,LPWSTR,INT); -BOOL WINAPI IntersectRect(LPRECT,LPCRECT,LPCRECT); -BOOL WINAPI InvalidateRect(HWND,LPCRECT,BOOL); -BOOL WINAPI InvalidateRgn(HWND,HRGN,BOOL); -BOOL WINAPI InvertRect(HDC,LPCRECT); -BOOL WINAPI IsCharAlphaA(CHAR ch); -BOOL WINAPI IsCharAlphaNumericA(CHAR); -BOOL WINAPI IsCharAlphaNumericW(WCHAR); -BOOL WINAPI IsCharAlphaW(WCHAR); -BOOL WINAPI IsCharLowerA(CHAR); -BOOL WINAPI IsCharLowerW(WCHAR); -BOOL WINAPI IsCharUpperA(CHAR); -BOOL WINAPI IsCharUpperW(WCHAR); -BOOL WINAPI IsChild(HWND,HWND); -BOOL WINAPI IsClipboardFormatAvailable(UINT); -BOOL WINAPI IsDialogMessageA(HWND,LPMSG); -BOOL WINAPI IsDialogMessageW(HWND,LPMSG); -UINT WINAPI IsDlgButtonChecked(HWND,int); +BOOL WINAPI InsertMenuA(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCSTR); +BOOL WINAPI InsertMenuW(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR); +BOOL WINAPI InsertMenuItemA(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOA); +BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW); + +INT +WINAPI +InternalGetWindowText( + _In_ HWND hWnd, + _Out_writes_to_(cchMaxCount, return + 1) LPWSTR pString, + _In_ int cchMaxCount); + +BOOL WINAPI IntersectRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT); +BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL); +BOOL WINAPI InvalidateRgn(_In_ HWND, _In_opt_ HRGN, _In_ BOOL); +BOOL WINAPI InvertRect(_In_ HDC, _In_ LPCRECT); +BOOL WINAPI IsCharAlphaA(_In_ CHAR ch); +BOOL WINAPI IsCharAlphaNumericA(_In_ CHAR); +BOOL WINAPI IsCharAlphaNumericW(_In_ WCHAR); +BOOL WINAPI IsCharAlphaW( _In_ WCHAR); +BOOL WINAPI IsCharLowerA(_In_ CHAR); +BOOL WINAPI IsCharLowerW(_In_ WCHAR); +BOOL WINAPI IsCharUpperA(_In_ CHAR); +BOOL WINAPI IsCharUpperW(_In_ WCHAR); +BOOL WINAPI IsChild(_In_ HWND, _In_ HWND); +BOOL WINAPI IsClipboardFormatAvailable(_In_ UINT); +BOOL WINAPI IsDialogMessageA(_In_ HWND, _In_ LPMSG); +BOOL WINAPI IsDialogMessageW(_In_ HWND, _In_ LPMSG); +UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int); #if(_WIN32_WINNT >= 0x0501) -BOOL WINAPI IsGUIThread(BOOL); +BOOL WINAPI IsGUIThread(_In_ BOOL); #endif #if(_WIN32_WINNT >= 0x0500) -BOOL WINAPI IsHungAppWindow(HWND); +BOOL WINAPI IsHungAppWindow(_In_ HWND); #endif -BOOL WINAPI IsIconic(HWND); -BOOL WINAPI IsMenu(HMENU); -BOOL WINAPI IsRectEmpty(LPCRECT); -BOOL WINAPI IsWindow(HWND); -BOOL WINAPI IsWindowEnabled(HWND); -BOOL WINAPI IsWindowUnicode(HWND); -BOOL WINAPI IsWindowVisible(HWND); +BOOL WINAPI IsIconic(_In_ HWND); +BOOL WINAPI IsMenu(_In_ HMENU); +BOOL WINAPI IsRectEmpty(_In_ LPCRECT); +BOOL WINAPI IsWindow(_In_opt_ HWND); +BOOL WINAPI IsWindowEnabled(_In_ HWND); +BOOL WINAPI IsWindowUnicode(_In_ HWND); +BOOL WINAPI IsWindowVisible(_In_ HWND); #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI IsWinEventHookInstalled(DWORD); +BOOL WINAPI IsWinEventHookInstalled(_In_ DWORD); #endif -BOOL WINAPI IsZoomed(HWND); -VOID WINAPI keybd_event(BYTE,BYTE,DWORD,ULONG_PTR); -BOOL WINAPI KillTimer(HWND,UINT_PTR); +BOOL WINAPI IsZoomed(_In_ HWND); +VOID WINAPI keybd_event(_In_ BYTE, _In_ BYTE, _In_ DWORD, _In_ ULONG_PTR); +BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR); BOOL WINAPI KillSystemTimer(HWND,UINT_PTR); -HACCEL WINAPI LoadAcceleratorsA(HINSTANCE,LPCSTR); -HACCEL WINAPI LoadAcceleratorsW(HINSTANCE,LPCWSTR); -HBITMAP WINAPI LoadBitmapA(HINSTANCE,LPCSTR); -HBITMAP WINAPI LoadBitmapW(HINSTANCE,LPCWSTR); -HCURSOR WINAPI LoadCursorA(HINSTANCE,LPCSTR); -HCURSOR WINAPI LoadCursorFromFileA(LPCSTR); -HCURSOR WINAPI LoadCursorFromFileW(LPCWSTR); -HCURSOR WINAPI LoadCursorW(HINSTANCE,LPCWSTR); -HICON WINAPI LoadIconA(HINSTANCE,LPCSTR); -HICON WINAPI LoadIconW(HINSTANCE,LPCWSTR); -HANDLE WINAPI LoadImageA(HINSTANCE,LPCSTR,UINT,int,int,UINT); -HANDLE WINAPI LoadImageW(HINSTANCE,LPCWSTR,UINT,int,int,UINT); -HKL WINAPI LoadKeyboardLayoutA(LPCSTR,UINT); -HKL WINAPI LoadKeyboardLayoutW(LPCWSTR,UINT); -HMENU WINAPI LoadMenuA(HINSTANCE,LPCSTR); -HMENU WINAPI LoadMenuIndirectA(const MENUTEMPLATE*); -HMENU WINAPI LoadMenuIndirectW(const MENUTEMPLATE*); -HMENU WINAPI LoadMenuW(HINSTANCE,LPCWSTR); -int WINAPI LoadStringA(HINSTANCE,UINT,LPSTR,int); -int WINAPI LoadStringW(HINSTANCE,UINT,LPWSTR,int); -BOOL WINAPI LockWindowUpdate(HWND); +HACCEL WINAPI LoadAcceleratorsA(_In_opt_ HINSTANCE, _In_ LPCSTR); +HACCEL WINAPI LoadAcceleratorsW(_In_opt_ HINSTANCE, _In_ LPCWSTR); +HBITMAP WINAPI LoadBitmapA(_In_opt_ HINSTANCE, _In_ LPCSTR); +HBITMAP WINAPI LoadBitmapW(_In_opt_ HINSTANCE, _In_ LPCWSTR); +HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR); +HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR); +HCURSOR WINAPI LoadCursorFromFileA(_In_ LPCSTR); +HCURSOR WINAPI LoadCursorFromFileW(_In_ LPCWSTR); +HICON WINAPI LoadIconA(_In_opt_ HINSTANCE, _In_ LPCSTR); +HICON WINAPI LoadIconW(_In_opt_ HINSTANCE, _In_ LPCWSTR); +HANDLE WINAPI LoadImageA(_In_opt_ HINSTANCE, _In_ LPCSTR, _In_ UINT, _In_ int, _In_ int, _In_ UINT); +HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_ UINT, _In_ int, _In_ int, _In_ UINT); +HKL WINAPI LoadKeyboardLayoutA(_In_ LPCSTR, _In_ UINT); +HKL WINAPI LoadKeyboardLayoutW(_In_ LPCWSTR, _In_ UINT); +HMENU WINAPI LoadMenuA(_In_opt_ HINSTANCE, _In_ LPCSTR); +HMENU WINAPI LoadMenuIndirectA(_In_ const MENUTEMPLATE*); +HMENU WINAPI LoadMenuIndirectW(_In_ const MENUTEMPLATE*); +HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR); + +int +WINAPI +LoadStringA( + _In_opt_ HINSTANCE hInstance, + _In_ UINT uID, + _Out_writes_to_(cchBufferMax, return + 1) LPSTR lpBuffer, + _In_ int cchBufferMax); + +int +WINAPI +LoadStringW( + _In_opt_ HINSTANCE hInstance, + _In_ UINT uID, + _Out_writes_to_(cchBufferMax, return + 1) LPWSTR lpBuffer, + _In_ int cchBufferMax); + +BOOL WINAPI LockWindowUpdate(_In_opt_ HWND); #if (_WIN32_WINNT >= 0x0500) BOOL WINAPI LockWorkStation(void); #endif -int WINAPI LookupIconIdFromDirectory(PBYTE,BOOL); -int WINAPI LookupIconIdFromDirectoryEx(PBYTE,BOOL,int,int,UINT); -BOOL WINAPI MapDialogRect(HWND,LPRECT); -UINT WINAPI MapVirtualKeyA(UINT,UINT); -UINT WINAPI MapVirtualKeyExA(UINT,UINT,HKL); -UINT WINAPI MapVirtualKeyExW(UINT,UINT,HKL); -UINT WINAPI MapVirtualKeyW(UINT,UINT); -int WINAPI MapWindowPoints(HWND,HWND,LPPOINT,UINT); -int WINAPI MenuItemFromPoint(HWND,HMENU,POINT); -BOOL WINAPI MessageBeep(UINT); -int WINAPI MessageBoxA(HWND,LPCSTR,LPCSTR,UINT); -int WINAPI MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT); -int WINAPI MessageBoxExA(HWND,LPCSTR,LPCSTR,UINT,WORD); -int WINAPI MessageBoxExW(HWND,LPCWSTR,LPCWSTR,UINT,WORD); -int WINAPI MessageBoxIndirectA(CONST MSGBOXPARAMSA*); -int WINAPI MessageBoxIndirectW(CONST MSGBOXPARAMSW*); -BOOL WINAPI ModifyMenuA(HMENU,UINT,UINT,UINT_PTR,LPCSTR); -BOOL WINAPI ModifyMenuW(HMENU,UINT,UINT,UINT_PTR,LPCWSTR); -HMONITOR WINAPI MonitorFromPoint(POINT,DWORD); -HMONITOR WINAPI MonitorFromRect(LPCRECT,DWORD); -HMONITOR WINAPI MonitorFromWindow(HWND,DWORD); -void WINAPI mouse_event(DWORD,DWORD,DWORD,DWORD,ULONG_PTR); -BOOL WINAPI MoveWindow(HWND,int,int,int,int,BOOL); -DWORD WINAPI MsgWaitForMultipleObjects(DWORD,CONST HANDLE*,BOOL,DWORD,DWORD); -DWORD WINAPI MsgWaitForMultipleObjectsEx(DWORD,CONST HANDLE*,DWORD,DWORD,DWORD); + +typedef struct { + WORD Reserved; + WORD ResType; + WORD ResCount; +} NEWHEADER; + +int WINAPI LookupIconIdFromDirectory(_In_reads_bytes_(sizeof(NEWHEADER)) PBYTE, _In_ BOOL); +int WINAPI LookupIconIdFromDirectoryEx(_In_reads_bytes_(sizeof(NEWHEADER)) PBYTE, _In_ BOOL, _In_ int, _In_ int, _In_ UINT); +BOOL WINAPI MapDialogRect(_In_ HWND, _Inout_ LPRECT); +UINT WINAPI MapVirtualKeyA(_In_ UINT, _In_ UINT); +UINT WINAPI MapVirtualKeyExA(_In_ UINT, _In_ UINT, _In_opt_ HKL); +UINT WINAPI MapVirtualKeyExW(_In_ UINT, _In_ UINT, _In_opt_ HKL); +UINT WINAPI MapVirtualKeyW(_In_ UINT, _In_ UINT); + +int +WINAPI +MapWindowPoints( + _In_opt_ HWND hWndFrom, + _In_opt_ HWND hWndTo, + _Inout_updates_(cPoints) LPPOINT lpPoints, + _In_ UINT cPoints); + +int WINAPI MenuItemFromPoint(_In_opt_ HWND, _In_ HMENU, _In_ POINT); +BOOL WINAPI MessageBeep(_In_ UINT); +int WINAPI MessageBoxA(_In_opt_ HWND, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_ UINT); +int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT); +int WINAPI MessageBoxExA(_In_opt_ HWND, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_ UINT, _In_ WORD); +int WINAPI MessageBoxExW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT, _In_ WORD); +int WINAPI MessageBoxIndirectA(_In_ CONST MSGBOXPARAMSA*); +int WINAPI MessageBoxIndirectW(_In_ CONST MSGBOXPARAMSW*); +BOOL WINAPI ModifyMenuA(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCSTR); +BOOL WINAPI ModifyMenuW(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR); +HMONITOR WINAPI MonitorFromPoint(_In_ POINT, _In_ DWORD); +HMONITOR WINAPI MonitorFromRect(_In_ LPCRECT, _In_ DWORD); +HMONITOR WINAPI MonitorFromWindow(_In_ HWND, _In_ DWORD); +void WINAPI mouse_event(_In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ ULONG_PTR); +BOOL WINAPI MoveWindow(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ BOOL); + +DWORD +WINAPI +MsgWaitForMultipleObjects( + _In_ DWORD nCount, + _In_reads_opt_(nCount) CONST HANDLE *pHandles, + _In_ BOOL fWaitAll, + _In_ DWORD dwMilliseconds, + _In_ DWORD dwWakeMask); + +DWORD +WINAPI +MsgWaitForMultipleObjectsEx( + _In_ DWORD nCount, + _In_reads_opt_(nCount) CONST HANDLE *pHandles, + _In_ DWORD dwMilliseconds, + _In_ DWORD dwWakeMask, + _In_ DWORD dwFlags); + #if (WINVER >= 0x0500) -void WINAPI NotifyWinEvent(DWORD,HWND,LONG,LONG); +void WINAPI NotifyWinEvent(_In_ DWORD, _In_ HWND, _In_ LONG, _In_ LONG); #endif -DWORD WINAPI OemKeyScan(WORD); -BOOL WINAPI OemToCharA(LPCSTR,LPSTR); -BOOL WINAPI OemToCharBuffA(LPCSTR,LPSTR,DWORD); -BOOL WINAPI OemToCharBuffW(LPCSTR,LPWSTR,DWORD); -BOOL WINAPI OemToCharW(LPCSTR,LPWSTR); -BOOL WINAPI OffsetRect(LPRECT,int,int); -BOOL WINAPI OpenClipboard(HWND); -HDESK WINAPI OpenDesktopA(LPCSTR,DWORD,BOOL,DWORD); -HDESK WINAPI OpenDesktopW(LPCWSTR,DWORD,BOOL,DWORD); -BOOL WINAPI OpenIcon(HWND); -HDESK WINAPI OpenInputDesktop(DWORD,BOOL,DWORD); -HWINSTA WINAPI OpenWindowStationA(LPCSTR,BOOL,DWORD); -HWINSTA WINAPI OpenWindowStationW(LPCWSTR,BOOL,DWORD); -BOOL WINAPI PaintDesktop(HDC); -BOOL WINAPI PeekMessageA(LPMSG,HWND,UINT,UINT,UINT); -BOOL WINAPI PeekMessageW(LPMSG,HWND,UINT,UINT,UINT); +DWORD WINAPI OemKeyScan(_In_ WORD); + +BOOL +WINAPI +OemToCharA( + _In_ LPCSTR pSrc, + _Out_writes_(_Inexpressible_(strlen(pSrc) + 1)) LPSTR pDst); + +BOOL +WINAPI +OemToCharBuffA( + _In_ LPCSTR lpszSrc, + _Out_writes_(cchDstLength) LPSTR lpszDst, + _In_ DWORD cchDstLength); + +BOOL +WINAPI +OemToCharBuffW( + _In_ LPCSTR lpszSrc, + _Out_writes_(cchDstLength) LPWSTR lpszDst, + _In_ DWORD cchDstLength); + +BOOL +WINAPI +OemToCharW( + _In_ LPCSTR pSrc, + _Out_writes_(_Inexpressible_(strlen(pSrc) + 1)) LPWSTR pDst); + +BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int); +BOOL WINAPI OpenClipboard(_In_opt_ HWND); +HDESK WINAPI OpenDesktopA(_In_ LPCSTR, _In_ DWORD, _In_ BOOL, _In_ DWORD); +HDESK WINAPI OpenDesktopW(_In_ LPCWSTR, _In_ DWORD, _In_ BOOL, _In_ DWORD); +BOOL WINAPI OpenIcon(_In_ HWND); +HDESK WINAPI OpenInputDesktop(_In_ DWORD, _In_ BOOL, _In_ DWORD); +HWINSTA WINAPI OpenWindowStationA(_In_ LPCSTR, _In_ BOOL, _In_ DWORD); +HWINSTA WINAPI OpenWindowStationW(_In_ LPCWSTR, _In_ BOOL, _In_ DWORD); +BOOL WINAPI PaintDesktop(_In_ HDC); +BOOL WINAPI PeekMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT); +BOOL WINAPI PeekMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT); #define PostAppMessageA(t,m,w,l) PostThreadMessageA((DWORD)t,m,w,l) #define PostAppMessageW(t,m,w,l) PostThreadMessageW((DWORD)t,m,w,l) -BOOL WINAPI PostMessageA(HWND,UINT,WPARAM,LPARAM); -BOOL WINAPI PostMessageW(HWND,UINT,WPARAM,LPARAM); -void WINAPI PostQuitMessage(int); -BOOL WINAPI PostThreadMessageA(DWORD,UINT,WPARAM,LPARAM); -BOOL WINAPI PostThreadMessageW(DWORD,UINT,WPARAM,LPARAM); +BOOL WINAPI PostMessageA(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); + +__analysis_noreturn +void WINAPI PostQuitMessage(_In_ int); + +BOOL WINAPI PostThreadMessageA(_In_ DWORD, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +BOOL WINAPI PostThreadMessageW(_In_ DWORD, _In_ UINT, _In_ WPARAM, _In_ LPARAM); #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI PrintWindow(HWND,HDC,UINT); +BOOL WINAPI PrintWindow(_In_ HWND, _In_ HDC, _In_ UINT); #endif -UINT WINAPI PrivateExtractIconsA(LPCSTR,int,int,int,HICON*,UINT*,UINT,UINT); -UINT WINAPI PrivateExtractIconsW(LPCWSTR,int,int,int,HICON*,UINT*,UINT,UINT); + +UINT +WINAPI +PrivateExtractIconsA( + _In_reads_(MAX_PATH) LPCSTR szFileName, + _In_ int nIconIndex, + _In_ int cxIcon, + _In_ int cyIcon, + _Out_writes_opt_(nIcons) HICON *phicon, + _Out_writes_opt_(nIcons) UINT *piconid, + _In_ UINT nIcons, + _In_ UINT flags); + +UINT +WINAPI +PrivateExtractIconsW( + _In_reads_(MAX_PATH) LPCWSTR szFileName, + _In_ int nIconIndex, + _In_ int cxIcon, + _In_ int cyIcon, + _Out_writes_opt_(nIcons) HICON *phicon, + _Out_writes_opt_(nIcons) UINT *piconid, + _In_ UINT nIcons, + _In_ UINT flags); + UINT WINAPI WINAPI PrivateExtractIconExA(LPCSTR,int,HICON*,HICON*,UINT); UINT WINAPI WINAPI PrivateExtractIconExW(LPCWSTR,int,HICON*,HICON*,UINT); -BOOL WINAPI PtInRect(LPCRECT,POINT); -HWND WINAPI RealChildWindowFromPoint(HWND,POINT); -UINT WINAPI RealGetWindowClassA(HWND,LPSTR,UINT); -UINT WINAPI RealGetWindowClassW(HWND,LPWSTR,UINT); -BOOL WINAPI RedrawWindow(HWND,LPCRECT,HRGN,UINT); -ATOM WINAPI RegisterClassA(CONST WNDCLASSA*); -ATOM WINAPI RegisterClassW(CONST WNDCLASSW*); -ATOM WINAPI RegisterClassExA(CONST WNDCLASSEXA*); -ATOM WINAPI RegisterClassExW(CONST WNDCLASSEXW*); +BOOL WINAPI PtInRect(_In_ LPCRECT, _In_ POINT); +HWND WINAPI RealChildWindowFromPoint(_In_ HWND, _In_ POINT); + +UINT +WINAPI +RealGetWindowClassA( + _In_ HWND hwnd, + _Out_writes_to_(cchClassNameMax, return) LPSTR ptszClassName, + _In_ UINT cchClassNameMax); + +UINT +WINAPI +RealGetWindowClassW( + _In_ HWND hwnd, + _Out_writes_to_(cchClassNameMax, return) LPWSTR ptszClassName, + _In_ UINT cchClassNameMax); + +BOOL WINAPI RedrawWindow(_In_opt_ HWND, _In_opt_ LPCRECT, _In_opt_ HRGN, _In_ UINT); +ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA*); +ATOM WINAPI RegisterClassW(_In_ CONST WNDCLASSW*); +ATOM WINAPI RegisterClassExA(_In_ CONST WNDCLASSEXA*); +ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW*); #if(_WIN32_WINNT >= 0x0501) typedef BOOLEAN (WINAPI * PREGISTERCLASSNAMEW)(LPCWSTR); #endif -UINT WINAPI RegisterClipboardFormatA(LPCSTR); -UINT WINAPI RegisterClipboardFormatW(LPCWSTR); +UINT WINAPI RegisterClipboardFormatA(_In_ LPCSTR); +UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR); #if (WINVER >= 0x0500) -HDEVNOTIFY WINAPI RegisterDeviceNotificationA(HANDLE,LPVOID,DWORD); -HDEVNOTIFY WINAPI RegisterDeviceNotificationW(HANDLE,LPVOID,DWORD); +HDEVNOTIFY WINAPI RegisterDeviceNotificationA(_In_ HANDLE, _In_ LPVOID, _In_ DWORD); +HDEVNOTIFY WINAPI RegisterDeviceNotificationW(_In_ HANDLE, _In_ LPVOID, _In_ DWORD); #endif -BOOL WINAPI RegisterHotKey(HWND,int,UINT,UINT); +BOOL WINAPI RegisterHotKey(_In_opt_ HWND, _In_ int, _In_ UINT, _In_ UINT); BOOL WINAPI RegisterLogonProcess(DWORD,BOOL); + #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI RegisterRawInputDevices(PCRAWINPUTDEVICE,UINT,UINT); +BOOL +WINAPI +RegisterRawInputDevices( + _In_reads_(uiNumDevices) PCRAWINPUTDEVICE pRawInputDevices, + _In_ UINT uiNumDevices, + _In_ UINT cbSize); #endif -BOOL WINAPI RegisterShellHookWindow(HWND); -UINT WINAPI RegisterWindowMessageA(LPCSTR); -UINT WINAPI RegisterWindowMessageW(LPCWSTR); + +BOOL WINAPI RegisterShellHookWindow(_In_ HWND); +UINT WINAPI RegisterWindowMessageA(_In_ LPCSTR); +UINT WINAPI RegisterWindowMessageW(_In_ LPCWSTR); BOOL WINAPI ReleaseCapture(void); -int WINAPI ReleaseDC(HWND,HDC); -BOOL WINAPI RemoveMenu(HMENU,UINT,UINT); -HANDLE WINAPI RemovePropA(HWND,LPCSTR); -HANDLE WINAPI RemovePropW(HWND,LPCWSTR); -BOOL WINAPI ReplyMessage(LRESULT); -BOOL WINAPI ScreenToClient(HWND,LPPOINT); +int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC); +BOOL WINAPI RemoveMenu(_In_ HMENU, _In_ UINT, _In_ UINT); +HANDLE WINAPI RemovePropA(_In_ HWND, _In_ LPCSTR); +HANDLE WINAPI RemovePropW(_In_ HWND, _In_ LPCWSTR); +BOOL WINAPI ReplyMessage(_In_ LRESULT); +BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT); VOID WINAPI ScrollChildren(HWND,UINT,WPARAM,LPARAM); -BOOL WINAPI ScrollDC(HDC,int,int,LPCRECT,LPCRECT,HRGN,LPRECT); -BOOL WINAPI ScrollWindow(HWND,int,int,LPCRECT,LPCRECT); -int WINAPI ScrollWindowEx(HWND,int,int,LPCRECT,LPCRECT,HRGN,LPRECT,UINT); -LRESULT WINAPI SendDlgItemMessageA(HWND,int,UINT,WPARAM,LPARAM); -LRESULT WINAPI SendDlgItemMessageW(HWND,int,UINT,WPARAM,LPARAM); +BOOL WINAPI ScrollDC(_In_ HDC, _In_ int, _In_ int, _In_opt_ LPCRECT, _In_opt_ LPCRECT, _In_opt_ HRGN, _Out_opt_ LPRECT); +BOOL WINAPI ScrollWindow(_In_ HWND, _In_ int, _In_ int, _In_opt_ LPCRECT, _In_opt_ LPCRECT); +int WINAPI ScrollWindowEx(_In_ HWND, _In_ int, _In_ int, _In_opt_ LPCRECT, _In_opt_ LPCRECT, _In_opt_ HRGN, _Out_opt_ LPRECT, _In_ UINT); +LRESULT WINAPI SendDlgItemMessageA(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +LRESULT WINAPI SendDlgItemMessageW(_In_ HWND, _In_ int, _In_ UINT, _In_ WPARAM, _In_ LPARAM); + #if (_WIN32_WINNT >= 0x0403) -UINT WINAPI SendInput(UINT,LPINPUT,int); +UINT +WINAPI +SendInput( + _In_ UINT cInputs, + _In_reads_(cInputs) LPINPUT pInputs, + _In_ int cbSize); #endif -LRESULT WINAPI SendMessageA(HWND,UINT,WPARAM,LPARAM); -BOOL WINAPI SendMessageCallbackA(HWND,UINT,WPARAM,LPARAM,SENDASYNCPROC,ULONG_PTR); -BOOL WINAPI SendMessageCallbackW(HWND,UINT,WPARAM,LPARAM,SENDASYNCPROC,ULONG_PTR); -LRESULT WINAPI SendMessageTimeoutA(HWND,UINT,WPARAM,LPARAM,UINT,UINT,PDWORD_PTR); -LRESULT WINAPI SendMessageTimeoutW(HWND,UINT,WPARAM,LPARAM,UINT,UINT,PDWORD_PTR); -LRESULT WINAPI SendMessageW(HWND,UINT,WPARAM,LPARAM); -BOOL WINAPI SendNotifyMessageA(HWND,UINT,WPARAM,LPARAM); -BOOL WINAPI SendNotifyMessageW(HWND,UINT,WPARAM,LPARAM); -HWND WINAPI SetActiveWindow(HWND); -HWND WINAPI SetCapture(HWND hWnd); -BOOL WINAPI SetCaretBlinkTime(UINT); -BOOL WINAPI SetCaretPos(int,int); -DWORD WINAPI SetClassLongA(HWND,int,LONG); -DWORD WINAPI SetClassLongW(HWND,int,LONG); + +LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +BOOL WINAPI SendMessageCallbackA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM, _In_ SENDASYNCPROC, _In_ ULONG_PTR); +BOOL WINAPI SendMessageCallbackW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM, _In_ SENDASYNCPROC, _In_ ULONG_PTR); +LRESULT WINAPI SendMessageTimeoutA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM, _In_ UINT, _In_ UINT, _Out_opt_ PDWORD_PTR); +LRESULT WINAPI SendMessageTimeoutW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM, _In_ UINT, _In_ UINT, _Out_opt_ PDWORD_PTR); +LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +BOOL WINAPI SendNotifyMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +BOOL WINAPI SendNotifyMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM); +HWND WINAPI SetActiveWindow(_In_ HWND); +HWND WINAPI SetCapture(_In_ HWND hWnd); +BOOL WINAPI SetCaretBlinkTime(_In_ UINT); +BOOL WINAPI SetCaretPos(_In_ int, _In_ int); +DWORD WINAPI SetClassLongA(_In_ HWND, _In_ int, _In_ LONG); +DWORD WINAPI SetClassLongW(_In_ HWND, _In_ int, _In_ LONG); #ifdef _WIN64 -ULONG_PTR WINAPI SetClassLongPtrA(HWND,INT,LONG_PTR); -ULONG_PTR WINAPI SetClassLongPtrW(HWND,INT,LONG_PTR); +ULONG_PTR WINAPI SetClassLongPtrA(_In_ HWND, _In_ INT, _In_ LONG_PTR); +ULONG_PTR WINAPI SetClassLongPtrW(_In_ HWND, _In_ INT, _In_ LONG_PTR); #else #define SetClassLongPtrA SetClassLongA #define SetClassLongPtrW SetClassLongW #endif -WORD WINAPI SetClassWord(HWND,int,WORD); -HANDLE WINAPI SetClipboardData(UINT,HANDLE); -HWND WINAPI SetClipboardViewer(HWND); -HCURSOR WINAPI SetCursor(HCURSOR); -BOOL WINAPI SetCursorPos(int,int); -VOID WINAPI SetDebugErrorLevel(DWORD); +WORD WINAPI SetClassWord(_In_ HWND, _In_ int, _In_ WORD); +HANDLE WINAPI SetClipboardData(_In_ UINT, _In_opt_ HANDLE); +HWND WINAPI SetClipboardViewer(_In_ HWND); +HCURSOR WINAPI SetCursor(_In_opt_ HCURSOR); +BOOL WINAPI SetCursorPos(_In_ int, _In_ int); +VOID WINAPI SetDebugErrorLevel(_In_ DWORD); BOOL WINAPI SetDeskWallPaper(LPCSTR); -BOOL WINAPI SetDlgItemInt(HWND,int,UINT,BOOL); -BOOL WINAPI SetDlgItemTextA(HWND,int,LPCSTR); -BOOL WINAPI SetDlgItemTextW(HWND,int,LPCWSTR); -BOOL WINAPI SetDoubleClickTime(UINT); -HWND WINAPI SetFocus(HWND); -BOOL WINAPI SetForegroundWindow(HWND); -BOOL WINAPI SetKeyboardState(PBYTE); -BOOL WINAPI SetMenu(HWND,HMENU); -BOOL WINAPI SetMenuContextHelpId(HMENU,DWORD); -BOOL WINAPI SetMenuDefaultItem(HMENU,UINT,UINT); -BOOL WINAPI SetMenuInfo(HMENU,LPCMENUINFO); -BOOL WINAPI SetMenuItemBitmaps(HMENU,UINT,UINT,HBITMAP,HBITMAP); -BOOL WINAPI SetMenuItemInfoA(HMENU,UINT,BOOL,LPCMENUITEMINFOA); -BOOL WINAPI SetMenuItemInfoW( HMENU,UINT,BOOL,LPCMENUITEMINFOW); -LPARAM WINAPI SetMessageExtraInfo(LPARAM); -BOOL WINAPI SetMessageQueue(int); -HWND WINAPI SetParent(HWND,HWND); +BOOL WINAPI SetDlgItemInt(_In_ HWND, _In_ int, _In_ UINT, _In_ BOOL); +BOOL WINAPI SetDlgItemTextA(_In_ HWND, _In_ int, _In_ LPCSTR); +BOOL WINAPI SetDlgItemTextW(_In_ HWND, _In_ int, _In_ LPCWSTR); +BOOL WINAPI SetDoubleClickTime(_In_ UINT); +HWND WINAPI SetFocus(_In_opt_ HWND); +BOOL WINAPI SetForegroundWindow(_In_ HWND); +BOOL WINAPI SetKeyboardState(_In_reads_(256) LPBYTE); +BOOL WINAPI SetMenu(_In_ HWND, _In_opt_ HMENU); +BOOL WINAPI SetMenuContextHelpId(_In_ HMENU, _In_ DWORD); +BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT); +BOOL WINAPI SetMenuInfo(_In_ HMENU, _In_ LPCMENUINFO); +BOOL WINAPI SetMenuItemBitmaps(_In_ HMENU, _In_ UINT, _In_ UINT, _In_opt_ HBITMAP, _In_opt_ HBITMAP); +BOOL WINAPI SetMenuItemInfoA(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOA); +BOOL WINAPI SetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW); +LPARAM WINAPI SetMessageExtraInfo(_In_ LPARAM); +BOOL WINAPI SetMessageQueue(_In_ int); +HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI SetProcessDefaultLayout(DWORD); +BOOL WINAPI SetProcessDefaultLayout(_In_ DWORD); #endif /* (_WIN32_WINNT >= 0x0500) */ -BOOL WINAPI SetProcessWindowStation(HWINSTA); -BOOL WINAPI SetPropA(HWND,LPCSTR,HANDLE); -BOOL WINAPI SetPropW(HWND,LPCWSTR,HANDLE); -BOOL WINAPI SetRect(LPRECT,int,int,int,int); -BOOL WINAPI SetRectEmpty(LPRECT); -int WINAPI SetScrollInfo(HWND,int,LPCSCROLLINFO,BOOL); -int WINAPI SetScrollPos(HWND,int,int,BOOL); -BOOL WINAPI SetScrollRange(HWND,int,int,int,BOOL); -BOOL WINAPI SetSysColors(int,const INT *,const COLORREF *); +BOOL WINAPI SetProcessWindowStation(_In_ HWINSTA); +BOOL WINAPI SetPropA(_In_ HWND, _In_ LPCSTR, _In_opt_ HANDLE); +BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE); +BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int); +BOOL WINAPI SetRectEmpty(_Out_ LPRECT); +int WINAPI SetScrollInfo(_In_ HWND, _In_ int, _In_ LPCSCROLLINFO, _In_ BOOL); +int WINAPI SetScrollPos(_In_ HWND, _In_ int, _In_ int, _In_ BOOL); +BOOL WINAPI SetScrollRange(_In_ HWND, _In_ int, _In_ int, _In_ int, _In_ BOOL); + +BOOL +WINAPI +SetSysColors( + _In_ int cElements, + _In_reads_(cElements) CONST INT * lpaElements, + _In_reads_(cElements) CONST COLORREF * lpaRgbValues); + DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD_PTR); #define SetSysModalWindow(h) (NULL) -BOOL WINAPI SetSystemCursor(HCURSOR,DWORD); +BOOL WINAPI SetSystemCursor(_In_ HCURSOR, _In_ DWORD); BOOL WINAPI SetSystemMenu(HWND,HMENU); -BOOL WINAPI SetThreadDesktop(HDESK); -UINT_PTR WINAPI SetTimer(HWND,UINT_PTR,UINT,TIMERPROC); +BOOL WINAPI SetThreadDesktop(_In_ HDESK); +UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC); UINT_PTR WINAPI SetSystemTimer(HWND,UINT_PTR,UINT,TIMERPROC); -BOOL WINAPI SetUserObjectInformationA(HANDLE,int,PVOID,DWORD); -BOOL WINAPI SetUserObjectInformationW(HANDLE,int,PVOID,DWORD); -BOOL WINAPI SetUserObjectSecurity(HANDLE,PSECURITY_INFORMATION,PSECURITY_DESCRIPTOR); + +BOOL +WINAPI +SetUserObjectInformationA( + _In_ HANDLE hObj, + _In_ int nIndex, + _In_reads_bytes_(nLength) PVOID pvInfo, + _In_ DWORD nLength); + +BOOL +WINAPI +SetUserObjectInformationW( + _In_ HANDLE hObj, + _In_ int nIndex, + _In_reads_bytes_(nLength) PVOID pvInfo, + _In_ DWORD nLength); + +BOOL WINAPI SetUserObjectSecurity(_In_ HANDLE, _In_ PSECURITY_INFORMATION, _In_ PSECURITY_DESCRIPTOR); #if (WINVER >= 0x0500) -HWINEVENTHOOK WINAPI SetWinEventHook(UINT,UINT,HMODULE,WINEVENTPROC,DWORD,DWORD,UINT); +HWINEVENTHOOK WINAPI SetWinEventHook(_In_ UINT, _In_ UINT, _In_opt_ HMODULE, _In_ WINEVENTPROC, _In_ DWORD, _In_ DWORD, _In_ UINT); #endif -BOOL WINAPI SetWindowContextHelpId(HWND,DWORD); -LONG WINAPI SetWindowLongA(HWND,int,LONG); -LONG WINAPI SetWindowLongW(HWND,int,LONG); +BOOL WINAPI SetWindowContextHelpId(_In_ HWND, _In_ DWORD); +LONG WINAPI SetWindowLongA(_In_ HWND, _In_ int, _In_ LONG); +LONG WINAPI SetWindowLongW(_In_ HWND, _In_ int, _In_ LONG); #ifdef _WIN64 -LONG_PTR WINAPI SetWindowLongPtrA(HWND,int,LONG_PTR); -LONG_PTR WINAPI SetWindowLongPtrW(HWND,int,LONG_PTR); +LONG_PTR WINAPI SetWindowLongPtrA(_In_ HWND, _In_ int, _In_ LONG_PTR); +LONG_PTR WINAPI SetWindowLongPtrW(_In_ HWND, _In_ int, _In_ LONG_PTR); #else #define SetWindowLongPtrA SetWindowLongA #define SetWindowLongPtrW SetWindowLongW #endif -BOOL WINAPI SetWindowPlacement(HWND hWnd,const WINDOWPLACEMENT*); -BOOL WINAPI SetWindowPos(HWND,HWND,int,int,int,int,UINT); -int WINAPI SetWindowRgn(HWND,HRGN,BOOL); -HHOOK WINAPI SetWindowsHookA(int,HOOKPROC); -HHOOK WINAPI SetWindowsHookExA(int,HOOKPROC,HINSTANCE,DWORD); -HHOOK WINAPI SetWindowsHookExW(int,HOOKPROC,HINSTANCE,DWORD); -HHOOK WINAPI SetWindowsHookW(int,HOOKPROC); -BOOL WINAPI SetWindowTextA(HWND,LPCSTR); -BOOL WINAPI SetWindowTextW(HWND,LPCWSTR); -WORD WINAPI SetWindowWord(HWND,int,WORD); -BOOL WINAPI ShowCaret(HWND); -int WINAPI ShowCursor(BOOL); -BOOL WINAPI ShowOwnedPopups(HWND,BOOL); -BOOL WINAPI ShowScrollBar(HWND,int,BOOL); -BOOL WINAPI ShowWindow(HWND,int); -BOOL WINAPI ShowWindowAsync(HWND,int); -BOOL WINAPI SubtractRect(LPRECT,LPCRECT,LPCRECT); -BOOL WINAPI SwapMouseButton(BOOL); -BOOL WINAPI SwitchDesktop(HDESK); +BOOL WINAPI SetWindowPlacement(_In_ HWND hWnd, _In_ const WINDOWPLACEMENT*); +BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT); +int WINAPI SetWindowRgn(_In_ HWND, _In_opt_ HRGN, _In_ BOOL); +HHOOK WINAPI SetWindowsHookA(_In_ int, _In_ HOOKPROC); +HHOOK WINAPI SetWindowsHookW(_In_ int, _In_ HOOKPROC); +HHOOK WINAPI SetWindowsHookExA(_In_ int, _In_ HOOKPROC, _In_opt_ HINSTANCE, _In_ DWORD); +HHOOK WINAPI SetWindowsHookExW(_In_ int, _In_ HOOKPROC, _In_opt_ HINSTANCE, _In_ DWORD); +BOOL WINAPI SetWindowTextA(_In_ HWND, _In_opt_ LPCSTR); +BOOL WINAPI SetWindowTextW(_In_ HWND, _In_opt_ LPCWSTR); +WORD WINAPI SetWindowWord(_In_ HWND, _In_ int, _In_ WORD); +BOOL WINAPI ShowCaret(_In_opt_ HWND); +int WINAPI ShowCursor(_In_ BOOL); +BOOL WINAPI ShowOwnedPopups(_In_ HWND, _In_ BOOL); +BOOL WINAPI ShowScrollBar(_In_ HWND, _In_ int, _In_ BOOL); +BOOL WINAPI ShowWindow(_In_ HWND, _In_ int); +BOOL WINAPI ShowWindowAsync(_In_ HWND, _In_ int); +BOOL WINAPI SubtractRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT); +BOOL WINAPI SwapMouseButton(_In_ BOOL); +BOOL WINAPI SwitchDesktop(_In_ HDESK); #if(_WIN32_WINNT >= 0x0500) -VOID WINAPI SwitchToThisWindow(HWND,BOOL); +VOID WINAPI SwitchToThisWindow(_In_ HWND, _In_ BOOL); #endif /* (_WIN32_WINNT >= 0x0500) */ -BOOL WINAPI SystemParametersInfoA(UINT,UINT,PVOID,UINT); -BOOL WINAPI SystemParametersInfoW(UINT,UINT,PVOID,UINT); -LONG WINAPI TabbedTextOutA(HDC,int,int,LPCSTR,int,int,CONST INT*,int); -LONG WINAPI TabbedTextOutW(HDC,int,int,LPCWSTR,int,int,CONST INT*,int); -WORD WINAPI TileWindows(HWND,UINT,LPCRECT,UINT,const HWND *); -int WINAPI ToAscii(UINT,UINT,CONST BYTE*,LPWORD,UINT); -int WINAPI ToAsciiEx(UINT,UINT,CONST BYTE*,LPWORD,UINT,HKL); -int WINAPI ToUnicode(UINT,UINT,CONST BYTE*,LPWSTR,int,UINT); -int WINAPI ToUnicodeEx(UINT,UINT,CONST BYTE*,LPWSTR,int,UINT,HKL); -BOOL WINAPI TrackMouseEvent(LPTRACKMOUSEEVENT); -BOOL WINAPI TrackPopupMenu(HMENU,UINT,int,int,int,HWND,LPCRECT); -BOOL WINAPI TrackPopupMenuEx(HMENU,UINT,int,int,HWND,LPTPMPARAMS); -int WINAPI TranslateAcceleratorA(HWND,HACCEL,LPMSG); -int WINAPI TranslateAcceleratorW(HWND,HACCEL,LPMSG); -BOOL WINAPI TranslateMDISysAccel(HWND,LPMSG); -BOOL WINAPI TranslateMessage(const MSG*); -BOOL WINAPI UnhookWindowsHook(int,HOOKPROC); -BOOL WINAPI UnhookWindowsHookEx(HHOOK); +BOOL WINAPI SystemParametersInfoA(_In_ UINT, _In_ UINT, _Inout_opt_ PVOID, _In_ UINT); +BOOL WINAPI SystemParametersInfoW(_In_ UINT, _In_ UINT, _Inout_opt_ PVOID, _In_ UINT); + +LONG +WINAPI +TabbedTextOutA( + _In_ HDC hdc, + _In_ int x, + _In_ int y, + _In_reads_(chCount) LPCSTR lpString, + _In_ int chCount, + _In_ int nTabPositions, + _In_reads_opt_(nTabPositions) CONST INT *lpnTabStopPositions, + _In_ int nTabOrigin); + +LONG +WINAPI +TabbedTextOutW( + _In_ HDC hdc, + _In_ int x, + _In_ int y, + _In_reads_(chCount) LPCWSTR lpString, + _In_ int chCount, + _In_ int nTabPositions, + _In_reads_opt_(nTabPositions) CONST INT *lpnTabStopPositions, + _In_ int nTabOrigin); + +WORD +WINAPI +TileWindows( + _In_opt_ HWND hwndParent, + _In_ UINT wHow, + _In_opt_ CONST RECT * lpRect, + _In_ UINT cKids, + _In_reads_opt_(cKids) const HWND FAR *lpKids); + +int WINAPI ToAscii(_In_ UINT, _In_ UINT, _In_reads_opt_(256) CONST BYTE*, _Out_ LPWORD, _In_ UINT); +int WINAPI ToAsciiEx(_In_ UINT, _In_ UINT, _In_reads_opt_(256) CONST BYTE*, _Out_ LPWORD, _In_ UINT, _In_opt_ HKL); + +int +WINAPI +ToUnicode( + _In_ UINT wVirtKey, + _In_ UINT wScanCode, + _In_reads_bytes_opt_(256) CONST BYTE *lpKeyState, + _Out_writes_(cchBuff) LPWSTR pwszBuff, + _In_ int cchBuff, + _In_ UINT wFlags); + +int +WINAPI +ToUnicodeEx( + _In_ UINT wVirtKey, + _In_ UINT wScanCode, + _In_reads_bytes_(256) CONST BYTE *lpKeyState, + _Out_writes_(cchBuff) LPWSTR pwszBuff, + _In_ int cchBuff, + _In_ UINT wFlags, + _In_opt_ HKL dwhkl); + +BOOL WINAPI TrackMouseEvent(_Inout_ LPTRACKMOUSEEVENT); +BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT); +BOOL WINAPI TrackPopupMenuEx(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _In_ HWND, _In_opt_ LPTPMPARAMS); +int WINAPI TranslateAcceleratorA(_In_ HWND, _In_ HACCEL, _In_ LPMSG); +int WINAPI TranslateAcceleratorW(_In_ HWND, _In_ HACCEL, _In_ LPMSG); +BOOL WINAPI TranslateMDISysAccel(_In_ HWND, _In_ LPMSG); +BOOL WINAPI TranslateMessage(_In_ const MSG*); +BOOL WINAPI UnhookWindowsHook(_In_ int, _In_ HOOKPROC); +BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK); #if (WINVER >= 0x0500) -BOOL WINAPI UnhookWinEvent(HWINEVENTHOOK); +BOOL WINAPI UnhookWinEvent(_In_ HWINEVENTHOOK); #endif -BOOL WINAPI UnionRect(LPRECT,LPCRECT,LPCRECT); -BOOL WINAPI UnloadKeyboardLayout(HKL); -BOOL WINAPI UnregisterClassA(LPCSTR,HINSTANCE); -BOOL WINAPI UnregisterClassW(LPCWSTR,HINSTANCE); -BOOL WINAPI UnregisterHotKey(HWND,int); -BOOL WINAPI UpdateWindow(HWND); +BOOL WINAPI UnionRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT); +BOOL WINAPI UnloadKeyboardLayout(_In_ HKL); +BOOL WINAPI UnregisterClassA(_In_ LPCSTR,HINSTANCE); +BOOL WINAPI UnregisterClassW(_In_ LPCWSTR,HINSTANCE); +BOOL WINAPI UnregisterHotKey(_In_opt_ HWND, _In_ int); +BOOL WINAPI UpdateWindow(_In_ HWND); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI UserHandleGrantAccess(HANDLE,HANDLE,BOOL); +BOOL WINAPI UserHandleGrantAccess(_In_ HANDLE, _In_ HANDLE, _In_ BOOL); #endif -BOOL WINAPI ValidateRect(HWND,LPCRECT); -BOOL WINAPI ValidateRgn(HWND,HRGN); -SHORT WINAPI VkKeyScanA(CHAR); -SHORT WINAPI VkKeyScanExA(CHAR,HKL); -SHORT WINAPI VkKeyScanExW(WCHAR,HKL); -SHORT WINAPI VkKeyScanW(WCHAR); -DWORD WINAPI WaitForInputIdle(HANDLE,DWORD); +BOOL WINAPI ValidateRect(_In_opt_ HWND, _In_opt_ LPCRECT); +BOOL WINAPI ValidateRgn(_In_ HWND, _In_opt_ HRGN); +SHORT WINAPI VkKeyScanA(_In_ CHAR); +SHORT WINAPI VkKeyScanExA(_In_ CHAR, _In_ HKL); +SHORT WINAPI VkKeyScanExW(_In_ WCHAR, _In_ HKL); +SHORT WINAPI VkKeyScanW(_In_ WCHAR); +DWORD WINAPI WaitForInputIdle(_In_ HANDLE, _In_ DWORD); BOOL WINAPI WaitMessage(void); -HWND WINAPI WindowFromDC(HDC hDC); +HWND WINAPI WindowFromDC(_In_ HDC hDC); #if (_WIN32_WINNT >= 0x0600) -HWND WINAPI WindowFromPhysicalPoint(POINT); +HWND WINAPI WindowFromPhysicalPoint(_In_ POINT); #endif -HWND WINAPI WindowFromPoint(POINT); +HWND WINAPI WindowFromPoint(_In_ POINT); UINT WINAPI WinExec(LPCSTR,UINT); -BOOL WINAPI WinHelpA(HWND,LPCSTR,UINT,ULONG_PTR); -BOOL WINAPI WinHelpW(HWND,LPCWSTR,UINT,ULONG_PTR); -int WINAPIV wsprintfA(LPSTR,LPCSTR,...); -int WINAPIV wsprintfW(LPWSTR,LPCWSTR,...); -int WINAPI wvsprintfA(LPSTR,LPCSTR,va_list arglist); -int WINAPI wvsprintfW(LPWSTR,LPCWSTR,va_list arglist); +BOOL WINAPI WinHelpA(_In_opt_ HWND, _In_opt_ LPCSTR, _In_ UINT, _In_ ULONG_PTR); +BOOL WINAPI WinHelpW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_ UINT, _In_ ULONG_PTR); + +int +WINAPIV +wsprintfA( + _Out_ LPSTR, + _In_ _Printf_format_string_ LPCSTR, + ...); + +int +WINAPIV +wsprintfW( + _Out_ LPWSTR, + _In_ _Printf_format_string_ LPCWSTR, + ...); + +int +WINAPI +wvsprintfA( + _Out_ LPSTR, + _In_ _Printf_format_string_ LPCSTR, + _In_ va_list arglist); + +int +WINAPI +wvsprintfW( + _Out_ LPWSTR, + _In_ _Printf_format_string_ LPCWSTR, + _In_ va_list arglist); + #if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0490) -BOOL WINAPI AllowSetForegroundWindow(DWORD); -BOOL WINAPI LockSetForegroundWindow(UINT); +BOOL WINAPI AllowSetForegroundWindow(_In_ DWORD); +BOOL WINAPI LockSetForegroundWindow(_In_ UINT); #endif #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI SetLayeredWindowAttributes(HWND,COLORREF,BYTE,DWORD); + +BOOL WINAPI SetLayeredWindowAttributes(_In_ HWND, _In_ COLORREF, _In_ BYTE, _In_ DWORD); + #if defined(_WINGDI_) && !defined(NOGDI) -BOOL WINAPI UpdateLayeredWindow(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD); -typedef struct tagUPDATELAYEREDWINDOWINFO -{ - DWORD cbSize; - HDC hdcDst; - POINT CONST* pptDst; - SIZE CONST* psize; - HDC hdcSrc; - POINT CONST* pptSrc; - COLORREF crKey; - BLENDFUNCTION CONST* pblend; - DWORD dwFlags; - RECT CONST* prcDirty; + +BOOL +WINAPI +UpdateLayeredWindow( + _In_ HWND hWnd, + _In_opt_ HDC hdcDst, + _In_opt_ POINT* pptDst, + _In_opt_ SIZE* psize, + _In_opt_ HDC hdcSrc, + _In_opt_ POINT* pptSrc, + _In_ COLORREF crKey, + _In_opt_ BLENDFUNCTION* pblend, + _In_ DWORD dwFlags); + +typedef struct tagUPDATELAYEREDWINDOWINFO { + DWORD cbSize; + HDC hdcDst; + POINT CONST* pptDst; + SIZE CONST* psize; + HDC hdcSrc; + POINT CONST* pptSrc; + COLORREF crKey; + BLENDFUNCTION CONST* pblend; + DWORD dwFlags; + RECT CONST* prcDirty; } UPDATELAYEREDWINDOWINFO, *PUPDATELAYEREDWINDOWINFO; -BOOL WINAPI UpdateLayeredWindowIndirect(HWND,UPDATELAYEREDWINDOWINFO CONST*); -#endif -#endif + +BOOL WINAPI UpdateLayeredWindowIndirect(_In_ HWND, _In_ const UPDATELAYEREDWINDOWINFO*); + +#endif /* defined(_WINGDI_) && !defined(NOGDI) */ + +#endif /* (_WIN32_WINNT >= 0x0500) */ + #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI GetLayeredWindowAttributes(HWND,COLORREF*,BYTE*,DWORD*); +BOOL WINAPI GetLayeredWindowAttributes(_In_ HWND, _Out_opt_ COLORREF*, _Out_opt_ BYTE*, _Out_opt_ DWORD*); #endif #ifdef UNICODE #define EDITWORDBREAKPROC EDITWORDBREAKPROCW From 533493eb7f7e53624f42370192e3de747f254f35 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 15:42:58 +0000 Subject: [PATCH 043/289] [CREDUI] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55106 --- reactos/dll/win32/credui/credui_main.c | 20 ++++++++++++-------- reactos/media/doc/README.WINE | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/reactos/dll/win32/credui/credui_main.c b/reactos/dll/win32/credui/credui_main.c index a6bbde62eb8..9d09b03cf5c 100644 --- a/reactos/dll/win32/credui/credui_main.c +++ b/reactos/dll/win32/credui/credui_main.c @@ -65,19 +65,21 @@ static CRITICAL_SECTION csPendingCredentials = { &critsect_debug, -1, 0, 0, 0, 0 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { + struct pending_credentials *entry, *cursor2; TRACE("(0x%p, %d, %p)\n",hinstDLL,fdwReason,lpvReserved); - if (fdwReason == DLL_WINE_PREATTACH) return FALSE; /* prefer native version */ - - if (fdwReason == DLL_PROCESS_ATTACH) + switch (fdwReason) { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + + case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hinstDLL); hinstCredUI = hinstDLL; InitCommonControls(); - } - else if (fdwReason == DLL_PROCESS_DETACH) - { - struct pending_credentials *entry, *cursor2; + break; + + case DLL_PROCESS_DETACH: LIST_FOR_EACH_ENTRY_SAFE(entry, cursor2, &pending_credentials_list, struct pending_credentials, entry) { list_remove(&entry->entry); @@ -88,6 +90,8 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) HeapFree(GetProcessHeap(), 0, entry->pszPassword); HeapFree(GetProcessHeap(), 0, entry); } + DeleteCriticalSection(&csPendingCredentials); + break; } return TRUE; @@ -260,7 +264,7 @@ static void CredDialogShowIncorrectPasswordBalloon(HWND hwndDlg, struct cred_dia SendMessageW(params->hwndBalloonTip, TTM_SETTITLEW, TTI_ERROR, (LPARAM)wszTitle); GetWindowRect(GetDlgItem(hwndDlg, IDC_PASSWORD), &rcPassword); - /* centred vertically and in the right side of the password edit control */ + /* centered vertically and in the right side of the password edit control */ x = rcPassword.right - 12; y = (rcPassword.top + rcPassword.bottom) / 2; SendMessageW(params->hwndBalloonTip, TTM_TRACKPOSITION, 0, MAKELONG(x, y)); diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index cfc1109f016..9196d1b5906 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -51,7 +51,7 @@ reactos/dll/win32/comcat # Autosync reactos/dll/win32/comctl32 # Synced to Wine 1.3.14 reactos/dll/win32/comdlg32 # Autosync reactos/dll/win32/compstui # Autosync -reactos/dll/win32/credui # Autosync +reactos/dll/win32/credui # Synced to Wine-1.3.37 reactos/dll/win32/crypt32 # Autosync reactos/dll/win32/cryptdlg # Autosync reactos/dll/win32/cryptdll # Autosync From 9c46bd0dddcd521869d97ac6a435ae22d71e2e3d Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 15:43:10 +0000 Subject: [PATCH 044/289] [CREDUI_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55107 --- rostests/winetests/credui/credui.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/rostests/winetests/credui/credui.c b/rostests/winetests/credui/credui.c index 969b096a766..18fc5bc616f 100644 --- a/rostests/winetests/credui/credui.c +++ b/rostests/winetests/credui/credui.c @@ -83,7 +83,10 @@ static void test_CredUIPromptForCredentials(void) &save, CREDUI_FLAGS_EXPECT_CONFIRMATION); ok(ret == ERROR_SUCCESS || ret == ERROR_CANCELLED, "CredUIPromptForCredentials failed with error %d\n", ret); if (ret == ERROR_SUCCESS) + { ret = CredUIConfirmCredentialsW(wszServerName, FALSE); + ok(ret == ERROR_SUCCESS, "CredUIConfirmCredentials failed with error %d\n", ret); + } credui_info.pszCaptionText = wszCaption1; ret = CredUIPromptForCredentialsW(&credui_info, wszServerName, NULL, @@ -93,7 +96,10 @@ static void test_CredUIPromptForCredentials(void) &save, CREDUI_FLAGS_EXPECT_CONFIRMATION); ok(ret == ERROR_SUCCESS || ret == ERROR_CANCELLED, "CredUIPromptForCredentials failed with error %d\n", ret); if (ret == ERROR_SUCCESS) + { ret = CredUIConfirmCredentialsW(wszServerName, FALSE); + ok(ret == ERROR_SUCCESS, "CredUIConfirmCredentials failed with error %d\n", ret); + } credui_info.pszCaptionText = wszCaption2; ret = CredUIPromptForCredentialsW(&credui_info, wszServerName, NULL, 0, @@ -102,7 +108,11 @@ static void test_CredUIPromptForCredentials(void) NULL, CREDUI_FLAGS_INCORRECT_PASSWORD|CREDUI_FLAGS_EXPECT_CONFIRMATION); ok(ret == ERROR_SUCCESS || ret == ERROR_CANCELLED, "CredUIPromptForCredentials failed with error %d\n", ret); if (ret == ERROR_SUCCESS) + { ret = CredUIConfirmCredentialsW(wszServerName, FALSE); + ok(ret == ERROR_SUCCESS, "CredUIConfirmCredentials failed with error %d\n", ret); + } + save = TRUE; credui_info.pszCaptionText = wszCaption3; @@ -122,7 +132,11 @@ static void test_CredUIPromptForCredentials(void) ok(ret == ERROR_SUCCESS || ret == ERROR_CANCELLED, "CredUIPromptForCredentials failed with error %d\n", ret); ok(!save, "save flag should have been untouched\n"); if (ret == ERROR_SUCCESS) + { ret = CredUIConfirmCredentialsW(wszServerName, FALSE); + ok(ret == ERROR_SUCCESS, "CredUIConfirmCredentials failed with error %d\n", ret); + } + } } From 7f7460e8c460fe025429d98b259f6f3b0521b01b Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 15:45:15 +0000 Subject: [PATCH 045/289] [CRYPT32] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55108 --- reactos/dll/win32/crypt32/CMakeLists.txt | 2 + reactos/dll/win32/crypt32/base64.c | 212 +++-- reactos/dll/win32/crypt32/cert.c | 44 +- reactos/dll/win32/crypt32/chain.c | 403 ++++++--- reactos/dll/win32/crypt32/collectionstore.c | 4 +- reactos/dll/win32/crypt32/crl.c | 6 +- reactos/dll/win32/crypt32/crypt32.spec | 7 +- reactos/dll/win32/crypt32/crypt32_private.h | 142 ++-- reactos/dll/win32/crypt32/ctl.c | 6 +- reactos/dll/win32/crypt32/decode.c | 223 ++++- reactos/dll/win32/crypt32/encode.c | 408 +++++++--- reactos/dll/win32/crypt32/message.c | 202 ++++- reactos/dll/win32/crypt32/msg.c | 860 +++++++++++++++++++- reactos/dll/win32/crypt32/object.c | 11 +- reactos/dll/win32/crypt32/oid.c | 34 +- reactos/dll/win32/crypt32/protectdata.c | 4 +- reactos/dll/win32/crypt32/rootstore.c | 59 +- reactos/dll/win32/crypt32/serialize.c | 2 +- reactos/dll/win32/crypt32/sip.c | 6 + reactos/dll/win32/crypt32/store.c | 12 + reactos/dll/win32/crypt32/str.c | 389 +++++++-- reactos/media/doc/README.WINE | 2 +- 22 files changed, 2477 insertions(+), 561 deletions(-) diff --git a/reactos/dll/win32/crypt32/CMakeLists.txt b/reactos/dll/win32/crypt32/CMakeLists.txt index 22e772dd876..3c1342307f3 100644 --- a/reactos/dll/win32/crypt32/CMakeLists.txt +++ b/reactos/dll/win32/crypt32/CMakeLists.txt @@ -43,6 +43,8 @@ list(APPEND SOURCE add_library(crypt32 SHARED ${SOURCE}) +allow_warnings(crypt32) + set_module_type(crypt32 win32dll) target_link_libraries(crypt32 diff --git a/reactos/dll/win32/crypt32/base64.c b/reactos/dll/win32/crypt32/base64.c index 7a23dd9a111..a01a7b6459c 100644 --- a/reactos/dll/win32/crypt32/base64.c +++ b/reactos/dll/win32/crypt32/base64.c @@ -30,7 +30,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(crypt); #define CERT_HEADER "-----BEGIN CERTIFICATE-----" +#define CERT_HEADER_START "-----BEGIN" +#define CERT_DELIMITER "-----" #define CERT_TRAILER "-----END CERTIFICATE-----" +#define CERT_TRAILER_START "-----END" #define CERT_REQUEST_HEADER "-----BEGIN NEW CERTIFICATE REQUEST-----" #define CERT_REQUEST_TRAILER "-----END NEW CERTIFICATE REQUEST-----" #define X509_HEADER "-----BEGIN X509 CRL-----" @@ -39,7 +42,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(crypt); static const WCHAR CERT_HEADER_W[] = { '-','-','-','-','-','B','E','G','I','N',' ','C','E','R','T','I','F','I','C', 'A','T','E','-','-','-','-','-',0 }; +static const WCHAR CERT_HEADER_START_W[] = { +'-','-','-','-','-','B','E','G','I','N',0 }; +static const WCHAR CERT_DELIMITER_W[] = { +'-','-','-','-','-',0 }; static const WCHAR CERT_TRAILER_W[] = { +'-','-','-','-','-','E','N','D',0 }; +static const WCHAR CERT_TRAILER_START_W[] = { '-','-','-','-','-','E','N','D',' ','C','E','R','T','I','F','I','C','A','T', 'E','-','-','-','-','-',0 }; static const WCHAR CERT_REQUEST_HEADER_W[] = { @@ -225,7 +234,6 @@ static BOOL BinaryToBase64A(const BYTE *pbBinary, strcpy(ptr, trailer); ptr += strlen(ptr); strcpy(ptr, sep); - ptr += strlen(sep); } *pcchString = charsNeeded - 1; } @@ -420,7 +428,6 @@ static BOOL BinaryToBase64W(const BYTE *pbBinary, strcpyW(ptr, trailer); ptr += strlenW(ptr); strcpyW(ptr, sep); - ptr += strlenW(sep); } *pcchString = charsNeeded - 1; } @@ -498,14 +505,13 @@ static inline BYTE decodeBase64Byte(int c) static LONG decodeBase64Block(const char *in_buf, int in_len, const char **nextBlock, PBYTE out_buf, DWORD *out_len) { - int len = in_len, i; + int len = in_len; const char *d = in_buf; int ip0, ip1, ip2, ip3; if (len < 4) return ERROR_INVALID_DATA; - i = 0; if (d[2] == '=') { if ((ip0 = decodeBase64Byte(d[0])) > 63) @@ -514,8 +520,8 @@ static LONG decodeBase64Block(const char *in_buf, int in_len, return ERROR_INVALID_DATA; if (out_buf) - out_buf[i] = (ip0 << 2) | (ip1 >> 4); - i++; + out_buf[0] = (ip0 << 2) | (ip1 >> 4); + *out_len = 1; } else if (d[3] == '=') { @@ -528,10 +534,10 @@ static LONG decodeBase64Block(const char *in_buf, int in_len, if (out_buf) { - out_buf[i + 0] = (ip0 << 2) | (ip1 >> 4); - out_buf[i + 1] = (ip1 << 4) | (ip2 >> 2); + out_buf[0] = (ip0 << 2) | (ip1 >> 4); + out_buf[1] = (ip1 << 4) | (ip2 >> 2); } - i += 2; + *out_len = 2; } else { @@ -546,11 +552,11 @@ static LONG decodeBase64Block(const char *in_buf, int in_len, if (out_buf) { - out_buf[i + 0] = (ip0 << 2) | (ip1 >> 4); - out_buf[i + 1] = (ip1 << 4) | (ip2 >> 2); - out_buf[i + 2] = (ip2 << 6) | ip3; + out_buf[0] = (ip0 << 2) | (ip1 >> 4); + out_buf[1] = (ip1 << 4) | (ip2 >> 2); + out_buf[2] = (ip2 << 6) | ip3; } - i += 3; + *out_len = 3; } if (len >= 6 && d[4] == '\r' && d[5] == '\n') *nextBlock = d + 6; @@ -560,7 +566,6 @@ static LONG decodeBase64Block(const char *in_buf, int in_len, *nextBlock = d + 4; else *nextBlock = NULL; - *out_len = i; return ERROR_SUCCESS; } @@ -607,42 +612,73 @@ static LONG Base64ToBinaryA(LPCSTR pszString, DWORD cchString, static LONG Base64WithHeaderAndTrailerToBinaryA(LPCSTR pszString, DWORD cchString, LPCSTR header, LPCSTR trailer, BYTE *pbBinary, - DWORD *pcbBinary, DWORD *pdwSkip) + DWORD *pcbBinary, DWORD *pdwSkip, BOOL exactHeaderAndTrailerMatch) { LONG ret; - LPCSTR ptr; - if (cchString > strlen(header) + strlen(trailer) - && (ptr = strstr(pszString, header)) != NULL) + LPCSTR headerBegins; + LPCSTR dataBegins; + LPCSTR trailerBegins; + size_t dataLength; + + if ((strlen(header) + strlen(trailer)) > cchString) { - LPCSTR trailerSpot = pszString + cchString - strlen(trailer); + return ERROR_INVALID_DATA; + } - if (pszString[cchString - 1] == '\n') + if (!(headerBegins = strstr(pszString, header))) + { + TRACE("Can't find %s in %s.\n", header, pszString); + return ERROR_INVALID_DATA; + } + + dataBegins = headerBegins + strlen(header); + if (!exactHeaderAndTrailerMatch) + { + if ((dataBegins = strstr(dataBegins, CERT_DELIMITER))) { - cchString--; - trailerSpot--; - } - if (pszString[cchString - 1] == '\r') - { - cchString--; - trailerSpot--; - } - if (!strncmp(trailerSpot, trailer, strlen(trailer))) - { - if (pdwSkip) - *pdwSkip = ptr - pszString; - ptr += strlen(header); - if (*ptr == '\r') ptr++; - if (*ptr == '\n') ptr++; - cchString -= ptr - pszString + strlen(trailer); - ret = Base64ToBinaryA(ptr, cchString, pbBinary, pcbBinary, NULL, - NULL); + dataBegins += strlen(CERT_DELIMITER); } else - ret = ERROR_INVALID_DATA; + { + return ERROR_INVALID_DATA; + } + } + if (*dataBegins == '\r') dataBegins++; + if (*dataBegins == '\n') dataBegins++; + + if (exactHeaderAndTrailerMatch) + { + trailerBegins = pszString + cchString - strlen(trailer); + if (pszString[cchString - 1] == '\n') trailerBegins--; + if (pszString[cchString - 2] == '\r') trailerBegins--; + + if (*(trailerBegins-1) == '\n') trailerBegins--; + if (*(trailerBegins-1) == '\r') trailerBegins--; + + if (!strncmp(trailerBegins, trailer, strlen(trailer))) + { + return ERROR_INVALID_DATA; + } } else - ret = ERROR_INVALID_DATA; + { + if (!(trailerBegins = strstr(dataBegins, trailer))) + { + return ERROR_INVALID_DATA; + } + if (*(trailerBegins-1) == '\n') trailerBegins--; + if (*(trailerBegins-1) == '\r') trailerBegins--; + } + + if (pdwSkip) + *pdwSkip = headerBegins - pszString; + + dataLength = trailerBegins - dataBegins; + + ret = Base64ToBinaryA(dataBegins, dataLength, pbBinary, pcbBinary, NULL, + NULL); + return ret; } @@ -650,7 +686,7 @@ static LONG Base64HeaderToBinaryA(LPCSTR pszString, DWORD cchString, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags) { LONG ret = Base64WithHeaderAndTrailerToBinaryA(pszString, cchString, - CERT_HEADER, CERT_TRAILER, pbBinary, pcbBinary, pdwSkip); + CERT_HEADER_START, CERT_TRAILER_START, pbBinary, pcbBinary, pdwSkip, FALSE); if (!ret && pdwFlags) *pdwFlags = CRYPT_STRING_BASE64HEADER; @@ -661,7 +697,7 @@ static LONG Base64RequestHeaderToBinaryA(LPCSTR pszString, DWORD cchString, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags) { LONG ret = Base64WithHeaderAndTrailerToBinaryA(pszString, cchString, - CERT_REQUEST_HEADER, CERT_REQUEST_TRAILER, pbBinary, pcbBinary, pdwSkip); + CERT_REQUEST_HEADER, CERT_REQUEST_TRAILER, pbBinary, pcbBinary, pdwSkip, TRUE); if (!ret && pdwFlags) *pdwFlags = CRYPT_STRING_BASE64REQUESTHEADER; @@ -672,7 +708,7 @@ static LONG Base64X509HeaderToBinaryA(LPCSTR pszString, DWORD cchString, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags) { LONG ret = Base64WithHeaderAndTrailerToBinaryA(pszString, cchString, - X509_HEADER, X509_TRAILER, pbBinary, pcbBinary, pdwSkip); + X509_HEADER, X509_TRAILER, pbBinary, pcbBinary, pdwSkip, TRUE); if (!ret && pdwFlags) *pdwFlags = CRYPT_STRING_BASE64X509CRLHEADER; @@ -906,42 +942,73 @@ static LONG Base64ToBinaryW(LPCWSTR pszString, DWORD cchString, static LONG Base64WithHeaderAndTrailerToBinaryW(LPCWSTR pszString, DWORD cchString, LPCWSTR header, LPCWSTR trailer, BYTE *pbBinary, - DWORD *pcbBinary, DWORD *pdwSkip) + DWORD *pcbBinary, DWORD *pdwSkip, BOOL exactHeaderAndTrailerMatch) { LONG ret; - LPCWSTR ptr; - if (cchString > strlenW(header) + strlenW(trailer) - && (ptr = strstrW(pszString, header)) != NULL) + LPCWSTR headerBegins; + LPCWSTR dataBegins; + LPCWSTR trailerBegins; + size_t dataLength; + + if ((strlenW(header) + strlenW(trailer)) > cchString) { - LPCWSTR trailerSpot = pszString + cchString - strlenW(trailer); + return ERROR_INVALID_DATA; + } - if (pszString[cchString - 1] == '\n') + if (!(headerBegins = strstrW(pszString, header))) + { + TRACE("Can't find %s in %s.\n", debugstr_w(header), debugstr_w(pszString)); + return ERROR_INVALID_DATA; + } + + dataBegins = headerBegins + strlenW(header); + if (!exactHeaderAndTrailerMatch) + { + if ((dataBegins = strstrW(dataBegins, CERT_DELIMITER_W))) { - cchString--; - trailerSpot--; - } - if (pszString[cchString - 1] == '\r') - { - cchString--; - trailerSpot--; - } - if (!strncmpW(trailerSpot, trailer, strlenW(trailer))) - { - if (pdwSkip) - *pdwSkip = ptr - pszString; - ptr += strlenW(header); - if (*ptr == '\r') ptr++; - if (*ptr == '\n') ptr++; - cchString -= ptr - pszString + strlenW(trailer); - ret = Base64ToBinaryW(ptr, cchString, pbBinary, pcbBinary, NULL, - NULL); + dataBegins += strlenW(CERT_DELIMITER_W); } else - ret = ERROR_INVALID_DATA; + { + return ERROR_INVALID_DATA; + } + } + if (*dataBegins == '\r') dataBegins++; + if (*dataBegins == '\n') dataBegins++; + + if (exactHeaderAndTrailerMatch) + { + trailerBegins = pszString + cchString - strlenW(trailer); + if (pszString[cchString - 1] == '\n') trailerBegins--; + if (pszString[cchString - 2] == '\r') trailerBegins--; + + if (*(trailerBegins-1) == '\n') trailerBegins--; + if (*(trailerBegins-1) == '\r') trailerBegins--; + + if (!strncmpW(trailerBegins, trailer, strlenW(trailer))) + { + return ERROR_INVALID_DATA; + } } else - ret = ERROR_INVALID_DATA; + { + if (!(trailerBegins = strstrW(dataBegins, trailer))) + { + return ERROR_INVALID_DATA; + } + if (*(trailerBegins-1) == '\n') trailerBegins--; + if (*(trailerBegins-1) == '\r') trailerBegins--; + } + + if (pdwSkip) + *pdwSkip = headerBegins - pszString; + + dataLength = trailerBegins - dataBegins; + + ret = Base64ToBinaryW(dataBegins, dataLength, pbBinary, pcbBinary, NULL, + NULL); + return ret; } @@ -949,7 +1016,8 @@ static LONG Base64HeaderToBinaryW(LPCWSTR pszString, DWORD cchString, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags) { LONG ret = Base64WithHeaderAndTrailerToBinaryW(pszString, cchString, - CERT_HEADER_W, CERT_TRAILER_W, pbBinary, pcbBinary, pdwSkip); + CERT_HEADER_START_W, CERT_TRAILER_START_W, pbBinary, pcbBinary, + pdwSkip, FALSE); if (!ret && pdwFlags) *pdwFlags = CRYPT_STRING_BASE64HEADER; @@ -961,7 +1029,7 @@ static LONG Base64RequestHeaderToBinaryW(LPCWSTR pszString, DWORD cchString, { LONG ret = Base64WithHeaderAndTrailerToBinaryW(pszString, cchString, CERT_REQUEST_HEADER_W, CERT_REQUEST_TRAILER_W, pbBinary, pcbBinary, - pdwSkip); + pdwSkip, TRUE); if (!ret && pdwFlags) *pdwFlags = CRYPT_STRING_BASE64REQUESTHEADER; @@ -972,7 +1040,7 @@ static LONG Base64X509HeaderToBinaryW(LPCWSTR pszString, DWORD cchString, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags) { LONG ret = Base64WithHeaderAndTrailerToBinaryW(pszString, cchString, - X509_HEADER_W, X509_TRAILER_W, pbBinary, pcbBinary, pdwSkip); + X509_HEADER_W, X509_TRAILER_W, pbBinary, pcbBinary, pdwSkip, TRUE); if (!ret && pdwFlags) *pdwFlags = CRYPT_STRING_BASE64X509CRLHEADER; diff --git a/reactos/dll/win32/crypt32/cert.c b/reactos/dll/win32/crypt32/cert.c index 12c013e7a4a..63107e18f28 100644 --- a/reactos/dll/win32/crypt32/cert.c +++ b/reactos/dll/win32/crypt32/cert.c @@ -141,6 +141,12 @@ PCCERT_CONTEXT WINAPI CertCreateCertificateContext(DWORD dwCertEncodingType, TRACE("(%08x, %p, %d)\n", dwCertEncodingType, pbCertEncoded, cbCertEncoded); + if ((dwCertEncodingType & CERT_ENCODING_TYPE_MASK) != X509_ASN_ENCODING) + { + SetLastError(E_INVALIDARG); + return NULL; + } + ret = CryptDecodeObjectEx(dwCertEncodingType, X509_CERT_TO_BE_SIGNED, pbCertEncoded, cbCertEncoded, CRYPT_DECODE_ALLOC_FLAG, NULL, &certInfo, &size); @@ -154,7 +160,7 @@ PCCERT_CONTEXT WINAPI CertCreateCertificateContext(DWORD dwCertEncodingType, data = CryptMemAlloc(cbCertEncoded); if (!data) { - CryptMemFree(cert); + CertFreeCertificateContext(cert); cert = NULL; goto end; } @@ -1516,7 +1522,36 @@ static BOOL compare_cert_by_name_str(PCCERT_CONTEXT pCertContext, return ret; } -static PCCERT_CONTEXT find_cert_by_name_str(HCERTSTORE store, DWORD dwType, +static PCCERT_CONTEXT find_cert_by_name_str_a(HCERTSTORE store, DWORD dwType, + DWORD dwFlags, const void *pvPara, PCCERT_CONTEXT prev) +{ + PCCERT_CONTEXT found = NULL; + + TRACE("%s\n", debugstr_a(pvPara)); + + if (pvPara) + { + int len = MultiByteToWideChar(CP_ACP, 0, pvPara, -1, NULL, 0); + LPWSTR str = CryptMemAlloc(len * sizeof(WCHAR)); + + if (str) + { + LPWSTR ptr; + + MultiByteToWideChar(CP_ACP, 0, pvPara, -1, str, len); + for (ptr = str; *ptr; ptr++) + *ptr = tolowerW(*ptr); + found = cert_compare_certs_in_store(store, prev, + compare_cert_by_name_str, dwType, dwFlags, str); + CryptMemFree(str); + } + } + else + found = find_cert_any(store, dwType, dwFlags, NULL, prev); + return found; +} + +static PCCERT_CONTEXT find_cert_by_name_str_w(HCERTSTORE store, DWORD dwType, DWORD dwFlags, const void *pvPara, PCCERT_CONTEXT prev) { PCCERT_CONTEXT found = NULL; @@ -1574,8 +1609,11 @@ PCCERT_CONTEXT WINAPI CertFindCertificateInStore(HCERTSTORE hCertStore, case CERT_COMPARE_PUBLIC_KEY: compare = compare_cert_by_public_key; break; + case CERT_COMPARE_NAME_STR_A: + find = find_cert_by_name_str_a; + break; case CERT_COMPARE_NAME_STR_W: - find = find_cert_by_name_str; + find = find_cert_by_name_str_w; break; case CERT_COMPARE_SUBJECT_CERT: compare = compare_cert_by_subject_cert; diff --git a/reactos/dll/win32/crypt32/chain.c b/reactos/dll/win32/crypt32/chain.c index e951ef8e9c5..c5f6742e06f 100644 --- a/reactos/dll/win32/crypt32/chain.c +++ b/reactos/dll/win32/crypt32/chain.c @@ -23,6 +23,7 @@ #define CERT_CHAIN_PARA_HAS_EXTRA_FIELDS #define CERT_REVOCATION_PARA_HAS_EXTRA_FIELDS #include "wincrypt.h" +#include "wininet.h" #include "wine/debug.h" #include "wine/unicode.h" #include "crypt32_private.h" @@ -1343,7 +1344,7 @@ static CERT_POLICIES_INFO *CRYPT_GetPolicies(PCCERT_CONTEXT cert) return policies; } -static void CRYPT_CheckPolicies(CERT_POLICIES_INFO *policies, CERT_INFO *cert, +static void CRYPT_CheckPolicies(const CERT_POLICIES_INFO *policies, CERT_INFO *cert, DWORD *errorStatus) { DWORD i; @@ -1661,20 +1662,20 @@ static void dump_extension(const CERT_EXTENSION *ext) dump_netscape_cert_type(ext); } -static LPCWSTR filetime_to_str(const FILETIME *time) +static LPCSTR filetime_to_str(const FILETIME *time) { - static WCHAR date[80]; - WCHAR dateFmt[80]; /* sufficient for all versions of LOCALE_SSHORTDATE */ + char date[80]; + char dateFmt[80]; /* sufficient for all versions of LOCALE_SSHORTDATE */ SYSTEMTIME sysTime; - if (!time) return NULL; + if (!time) return "(null)"; - GetLocaleInfoW(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, dateFmt, + GetLocaleInfoA(LOCALE_SYSTEM_DEFAULT, LOCALE_SSHORTDATE, dateFmt, sizeof(dateFmt) / sizeof(dateFmt[0])); FileTimeToSystemTime(time, &sysTime); - GetDateFormatW(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, date, + GetDateFormatA(LOCALE_SYSTEM_DEFAULT, 0, &sysTime, dateFmt, date, sizeof(date) / sizeof(date[0])); - return date; + return wine_dbg_sprintf("%s", date); } static void dump_element(PCCERT_CONTEXT cert) @@ -1704,8 +1705,8 @@ static void dump_element(PCCERT_CONTEXT cert) CryptMemFree(name); } TRACE_(chain)("valid from %s to %s\n", - debugstr_w(filetime_to_str(&cert->pCertInfo->NotBefore)), - debugstr_w(filetime_to_str(&cert->pCertInfo->NotAfter))); + filetime_to_str(&cert->pCertInfo->NotBefore), + filetime_to_str(&cert->pCertInfo->NotAfter)); TRACE_(chain)("%d extensions\n", cert->pCertInfo->cExtension); for (i = 0; i < cert->pCertInfo->cExtension; i++) dump_extension(&cert->pCertInfo->rgExtension[i]); @@ -1759,28 +1760,12 @@ static BOOL CRYPT_KeyUsageValid(PCertificateChainEngine engine, * extensions as CA certs. V1 and V2 certificates did not have * extensions, and many root certificates are V1 certificates, so * perhaps this is prudent. On the other hand, MS also accepts V3 - * certs without key usage extensions. We are more restrictive: - * we accept locally installed V1 or V2 certs as CA certs. - * We also accept a lack of key usage extension on root certs, - * which is implied in RFC 5280, section 6.1: the trust anchor's - * only requirement is that it was used to issue the next - * certificate in the chain. + * certs without key usage extensions. Because some CAs, e.g. + * Certum, also do not include key usage extensions in their + * intermediate certificates, we are forced to accept V3 + * certificates without key usage extensions as well. */ - if (isRoot) - ret = TRUE; - else if (cert->pCertInfo->dwVersion == CERT_V1 || - cert->pCertInfo->dwVersion == CERT_V2) - { - PCCERT_CONTEXT localCert = CRYPT_FindCertInStore( - engine->hWorld, cert); - - ret = localCert != NULL; - CertFreeCertificateContext(localCert); - } - else - ret = FALSE; - if (!ret) - WARN_(chain)("no key usage extension on a CA cert\n"); + ret = TRUE; } else { @@ -1892,7 +1877,7 @@ static void CRYPT_CheckSimpleChain(PCertificateChainEngine engine, CERT_BASIC_CONSTRAINTS2_INFO constraints = { FALSE, FALSE, 0 }; TRACE_(chain)("checking chain with %d elements for time %s\n", - chain->cElement, debugstr_w(filetime_to_str(time))); + chain->cElement, filetime_to_str(time)); for (i = chain->cElement - 1; i >= 0; i--) { BOOL isRoot; @@ -1970,7 +1955,8 @@ static void CRYPT_CheckSimpleChain(PCertificateChainEngine engine, if (!CRYPT_CriticalExtensionsSupported( chain->rgpElement[i]->pCertContext)) chain->rgpElement[i]->TrustStatus.dwErrorStatus |= - CERT_TRUST_INVALID_EXTENSION; + CERT_TRUST_INVALID_EXTENSION | + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT; CRYPT_CombineTrustStatus(&chain->TrustStatus, &chain->rgpElement[i]->TrustStatus); } @@ -2147,6 +2133,13 @@ static BOOL CRYPT_BuildSimpleChain(const CertificateChainEngine *engine, return ret; } +static LPCSTR debugstr_filetime(LPFILETIME pTime) +{ + if (!pTime) + return "(nil)"; + return wine_dbg_sprintf("%p (%s)", pTime, filetime_to_str(pTime)); +} + static BOOL CRYPT_GetSimpleChainForCert(PCertificateChainEngine engine, HCERTSTORE world, PCCERT_CONTEXT cert, LPFILETIME pTime, PCERT_SIMPLE_CHAIN *ppChain) @@ -2154,7 +2147,7 @@ static BOOL CRYPT_GetSimpleChainForCert(PCertificateChainEngine engine, BOOL ret = FALSE; PCERT_SIMPLE_CHAIN chain; - TRACE("(%p, %p, %p, %p)\n", engine, world, cert, pTime); + TRACE("(%p, %p, %p, %s)\n", engine, world, cert, debugstr_filetime(pTime)); chain = CryptMemAlloc(sizeof(CERT_SIMPLE_CHAIN)); if (chain) @@ -2375,7 +2368,8 @@ static PCertificateChain CRYPT_BuildAlternateContextFromChain( PCertificateChainEngine engine = (PCertificateChainEngine)hChainEngine; PCertificateChain alternate; - TRACE("(%p, %p, %p, %p)\n", hChainEngine, pTime, hAdditionalStore, chain); + TRACE("(%p, %s, %p, %p)\n", hChainEngine, debugstr_filetime(pTime), + hAdditionalStore, chain); /* Always start with the last "lower quality" chain to ensure a consistent * order of alternate creation: @@ -2559,7 +2553,8 @@ typedef struct _CERT_CHAIN_PARA_NO_EXTRA_FIELDS { } CERT_CHAIN_PARA_NO_EXTRA_FIELDS, *PCERT_CHAIN_PARA_NO_EXTRA_FIELDS; static void CRYPT_VerifyChainRevocation(PCERT_CHAIN_CONTEXT chain, - LPFILETIME pTime, const CERT_CHAIN_PARA *pChainPara, DWORD chainFlags) + LPFILETIME pTime, HCERTSTORE hAdditionalStore, + const CERT_CHAIN_PARA *pChainPara, DWORD chainFlags) { DWORD cContext; @@ -2583,78 +2578,84 @@ static void CRYPT_VerifyChainRevocation(PCERT_CHAIN_CONTEXT chain, cContext = 0; if (cContext) { - PCCERT_CONTEXT *contexts = - CryptMemAlloc(cContext * sizeof(PCCERT_CONTEXT)); + DWORD i, j, iContext, revocationFlags; + CERT_REVOCATION_PARA revocationPara = { sizeof(revocationPara), 0 }; + CERT_REVOCATION_STATUS revocationStatus = + { sizeof(revocationStatus), 0 }; + BOOL ret; - if (contexts) + revocationFlags = CERT_VERIFY_REV_CHAIN_FLAG; + if (chainFlags & CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY) + revocationFlags |= CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION; + if (chainFlags & CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT) + revocationFlags |= CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG; + revocationPara.pftTimeToUse = pTime; + if (hAdditionalStore) { - DWORD i, j, iContext, revocationFlags; - CERT_REVOCATION_PARA revocationPara = { sizeof(revocationPara), 0 }; - CERT_REVOCATION_STATUS revocationStatus = - { sizeof(revocationStatus), 0 }; - BOOL ret; + revocationPara.cCertStore = 1; + revocationPara.rgCertStore = &hAdditionalStore; + revocationPara.hCrlStore = hAdditionalStore; + } + if (pChainPara->cbSize == sizeof(CERT_CHAIN_PARA)) + { + revocationPara.dwUrlRetrievalTimeout = + pChainPara->dwUrlRetrievalTimeout; + revocationPara.fCheckFreshnessTime = + pChainPara->fCheckRevocationFreshnessTime; + revocationPara.dwFreshnessTime = + pChainPara->dwRevocationFreshnessTime; + } + for (i = 0, iContext = 0; iContext < cContext && i < chain->cChain; i++) + { + for (j = 0; iContext < cContext && + j < chain->rgpChain[i]->cElement; j++, iContext++) + { + PCCERT_CONTEXT certToCheck = + chain->rgpChain[i]->rgpElement[j]->pCertContext; - for (i = 0, iContext = 0; iContext < cContext && i < chain->cChain; - i++) - { - for (j = 0; iContext < cContext && - j < chain->rgpChain[i]->cElement; j++) - contexts[iContext++] = - chain->rgpChain[i]->rgpElement[j]->pCertContext; - } - revocationFlags = CERT_VERIFY_REV_CHAIN_FLAG; - if (chainFlags & CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY) - revocationFlags |= CERT_VERIFY_CACHE_ONLY_BASED_REVOCATION; - if (chainFlags & CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT) - revocationFlags |= CERT_VERIFY_REV_ACCUMULATIVE_TIMEOUT_FLAG; - revocationPara.pftTimeToUse = pTime; - if (pChainPara->cbSize == sizeof(CERT_CHAIN_PARA)) - { - revocationPara.dwUrlRetrievalTimeout = - pChainPara->dwUrlRetrievalTimeout; - revocationPara.fCheckFreshnessTime = - pChainPara->fCheckRevocationFreshnessTime; - revocationPara.dwFreshnessTime = - pChainPara->dwRevocationFreshnessTime; - } - ret = CertVerifyRevocation(X509_ASN_ENCODING, - CERT_CONTEXT_REVOCATION_TYPE, cContext, (void **)contexts, - revocationFlags, &revocationPara, &revocationStatus); - if (!ret) - { - PCERT_CHAIN_ELEMENT element = - CRYPT_FindIthElementInChain(chain, revocationStatus.dwIndex); - DWORD error; + if (j < chain->rgpChain[i]->cElement - 1) + revocationPara.pIssuerCert = + chain->rgpChain[i]->rgpElement[j + 1]->pCertContext; + else + revocationPara.pIssuerCert = NULL; + ret = CertVerifyRevocation(X509_ASN_ENCODING, + CERT_CONTEXT_REVOCATION_TYPE, 1, (void **)&certToCheck, + revocationFlags, &revocationPara, &revocationStatus); + if (!ret) + { + PCERT_CHAIN_ELEMENT element = CRYPT_FindIthElementInChain( + chain, iContext); + DWORD error; - switch (revocationStatus.dwError) - { - case CRYPT_E_NO_REVOCATION_CHECK: - case CRYPT_E_NO_REVOCATION_DLL: - case CRYPT_E_NOT_IN_REVOCATION_DATABASE: - /* If the revocation status is unknown, it's assumed to be - * offline too. - */ - error = CERT_TRUST_REVOCATION_STATUS_UNKNOWN | - CERT_TRUST_IS_OFFLINE_REVOCATION; - break; - case CRYPT_E_REVOCATION_OFFLINE: - error = CERT_TRUST_IS_OFFLINE_REVOCATION; - break; - case CRYPT_E_REVOKED: - error = CERT_TRUST_IS_REVOKED; - break; - default: - WARN("unmapped error %08x\n", revocationStatus.dwError); - error = 0; + switch (revocationStatus.dwError) + { + case CRYPT_E_NO_REVOCATION_CHECK: + case CRYPT_E_NO_REVOCATION_DLL: + case CRYPT_E_NOT_IN_REVOCATION_DATABASE: + /* If the revocation status is unknown, it's assumed + * to be offline too. + */ + error = CERT_TRUST_REVOCATION_STATUS_UNKNOWN | + CERT_TRUST_IS_OFFLINE_REVOCATION; + break; + case CRYPT_E_REVOCATION_OFFLINE: + error = CERT_TRUST_IS_OFFLINE_REVOCATION; + break; + case CRYPT_E_REVOKED: + error = CERT_TRUST_IS_REVOKED; + break; + default: + WARN("unmapped error %08x\n", revocationStatus.dwError); + error = 0; + } + if (element) + { + /* FIXME: set element's pRevocationInfo member */ + element->TrustStatus.dwErrorStatus |= error; + } + chain->TrustStatus.dwErrorStatus |= error; } - if (element) - { - /* FIXME: set element's pRevocationInfo member */ - element->TrustStatus.dwErrorStatus |= error; - } - chain->TrustStatus.dwErrorStatus |= error; } - CryptMemFree(contexts); } } } @@ -2801,8 +2802,9 @@ BOOL WINAPI CertGetCertificateChain(HCERTCHAINENGINE hChainEngine, BOOL ret; PCertificateChain chain = NULL; - TRACE("(%p, %p, %p, %p, %p, %08x, %p, %p)\n", hChainEngine, pCertContext, - pTime, hAdditionalStore, pChainPara, dwFlags, pvReserved, ppChainContext); + TRACE("(%p, %p, %s, %p, %p, %08x, %p, %p)\n", hChainEngine, pCertContext, + debugstr_filetime(pTime), hAdditionalStore, pChainPara, dwFlags, + pvReserved, ppChainContext); if (ppChainContext) *ppChainContext = NULL; @@ -2844,8 +2846,8 @@ BOOL WINAPI CertGetCertificateChain(HCERTCHAINENGINE hChainEngine, if (!(dwFlags & CERT_CHAIN_RETURN_LOWER_QUALITY_CONTEXTS)) CRYPT_FreeLowerQualityChains(chain); pChain = (PCERT_CHAIN_CONTEXT)chain; - if (!pChain->TrustStatus.dwErrorStatus) - CRYPT_VerifyChainRevocation(pChain, pTime, pChainPara, dwFlags); + CRYPT_VerifyChainRevocation(pChain, pTime, hAdditionalStore, + pChainPara, dwFlags); CRYPT_CheckUsages(pChain, pChainPara); TRACE_(chain)("error status: %08x\n", pChain->TrustStatus.dwErrorStatus); @@ -2883,6 +2885,15 @@ VOID WINAPI CertFreeCertificateChain(PCCERT_CHAIN_CONTEXT pChainContext) } } +PCCERT_CHAIN_CONTEXT WINAPI CertFindChainInStore(HCERTSTORE store, + DWORD certEncodingType, DWORD findFlags, DWORD findType, + const void *findPara, PCCERT_CHAIN_CONTEXT prevChainContext) +{ + FIXME("(%p, %08x, %08x, %d, %p, %p): stub\n", store, certEncodingType, + findFlags, findType, findPara, prevChainContext); + return NULL; +} + static void find_element_with_error(PCCERT_CHAIN_CONTEXT chain, DWORD error, LONG *iChain, LONG *iElement) { @@ -2903,7 +2914,12 @@ static BOOL WINAPI verify_base_policy(LPCSTR szPolicyOID, PCCERT_CHAIN_CONTEXT pChainContext, PCERT_CHAIN_POLICY_PARA pPolicyPara, PCERT_CHAIN_POLICY_STATUS pPolicyStatus) { + DWORD checks = 0; + + if (pPolicyPara) + checks = pPolicyPara->dwFlags; pPolicyStatus->lChainIndex = pPolicyStatus->lElementIndex = -1; + pPolicyStatus->dwError = NO_ERROR; if (pChainContext->TrustStatus.dwErrorStatus & CERT_TRUST_IS_NOT_SIGNATURE_VALID) { @@ -2912,14 +2928,6 @@ static BOOL WINAPI verify_base_policy(LPCSTR szPolicyOID, CERT_TRUST_IS_NOT_SIGNATURE_VALID, &pPolicyStatus->lChainIndex, &pPolicyStatus->lElementIndex); } - else if (pChainContext->TrustStatus.dwErrorStatus & - CERT_TRUST_IS_UNTRUSTED_ROOT) - { - pPolicyStatus->dwError = CERT_E_UNTRUSTEDROOT; - find_element_with_error(pChainContext, - CERT_TRUST_IS_UNTRUSTED_ROOT, &pPolicyStatus->lChainIndex, - &pPolicyStatus->lElementIndex); - } else if (pChainContext->TrustStatus.dwErrorStatus & CERT_TRUST_IS_CYCLIC) { pPolicyStatus->dwError = CERT_E_CHAINING; @@ -2928,8 +2936,43 @@ static BOOL WINAPI verify_base_policy(LPCSTR szPolicyOID, /* For a cyclic chain, which element is a cycle isn't meaningful */ pPolicyStatus->lElementIndex = -1; } - else - pPolicyStatus->dwError = NO_ERROR; + if (!pPolicyStatus->dwError && + pChainContext->TrustStatus.dwErrorStatus & CERT_TRUST_IS_UNTRUSTED_ROOT && + !(checks & CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG)) + { + pPolicyStatus->dwError = CERT_E_UNTRUSTEDROOT; + find_element_with_error(pChainContext, + CERT_TRUST_IS_UNTRUSTED_ROOT, &pPolicyStatus->lChainIndex, + &pPolicyStatus->lElementIndex); + } + if (!pPolicyStatus->dwError && + pChainContext->TrustStatus.dwErrorStatus & CERT_TRUST_IS_NOT_TIME_VALID) + { + pPolicyStatus->dwError = CERT_E_EXPIRED; + find_element_with_error(pChainContext, + CERT_TRUST_IS_NOT_TIME_VALID, &pPolicyStatus->lChainIndex, + &pPolicyStatus->lElementIndex); + } + if (!pPolicyStatus->dwError && + pChainContext->TrustStatus.dwErrorStatus & + CERT_TRUST_IS_NOT_VALID_FOR_USAGE && + !(checks & CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG)) + { + pPolicyStatus->dwError = CERT_E_WRONG_USAGE; + find_element_with_error(pChainContext, + CERT_TRUST_IS_NOT_VALID_FOR_USAGE, &pPolicyStatus->lChainIndex, + &pPolicyStatus->lElementIndex); + } + if (!pPolicyStatus->dwError && + pChainContext->TrustStatus.dwErrorStatus & + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT && + !(checks & CERT_CHAIN_POLICY_IGNORE_NOT_SUPPORTED_CRITICAL_EXT_FLAG)) + { + pPolicyStatus->dwError = CERT_E_CRITICAL; + find_element_with_error(pChainContext, + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT, &pPolicyStatus->lChainIndex, + &pPolicyStatus->lElementIndex); + } return TRUE; } @@ -2946,13 +2989,30 @@ static BYTE msTestPubKey2[] = { 0x71,0x9e,0x06,0xd9,0xbf,0xbb,0x31,0x69,0xa3,0xf6,0x30,0xa0,0x78,0x7b,0x18, 0xdd,0x50,0x4d,0x79,0x1e,0xeb,0x61,0xc1,0x02,0x03,0x01,0x00,0x01 }; +static void dump_authenticode_extra_chain_policy_para( + AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA *extraPara) +{ + if (extraPara) + { + TRACE_(chain)("cbSize = %d\n", extraPara->cbSize); + TRACE_(chain)("dwRegPolicySettings = %08x\n", + extraPara->dwRegPolicySettings); + TRACE_(chain)("pSignerInfo = %p\n", extraPara->pSignerInfo); + } +} + static BOOL WINAPI verify_authenticode_policy(LPCSTR szPolicyOID, PCCERT_CHAIN_CONTEXT pChainContext, PCERT_CHAIN_POLICY_PARA pPolicyPara, PCERT_CHAIN_POLICY_STATUS pPolicyStatus) { BOOL ret = verify_base_policy(szPolicyOID, pChainContext, pPolicyPara, pPolicyStatus); + AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA *extraPara = NULL; + if (pPolicyPara) + extraPara = pPolicyPara->pvExtraPolicyPara; + if (TRACE_ON(chain)) + dump_authenticode_extra_chain_policy_para(extraPara); if (ret && pPolicyStatus->dwError == CERT_E_UNTRUSTEDROOT) { CERT_PUBLIC_KEY_INFO msPubKey = { { 0 } }; @@ -3001,7 +3061,7 @@ static BOOL WINAPI verify_basic_constraints_policy(LPCSTR szPolicyOID, return TRUE; } -static BOOL match_dns_to_subject_alt_name(PCERT_EXTENSION ext, +static BOOL match_dns_to_subject_alt_name(const CERT_EXTENSION *ext, LPCWSTR server_name) { BOOL matches = FALSE; @@ -3069,7 +3129,7 @@ static BOOL match_dns_to_subject_alt_name(PCERT_EXTENSION ext, return matches; } -static BOOL find_matching_domain_component(CERT_NAME_INFO *name, +static BOOL find_matching_domain_component(const CERT_NAME_INFO *name, LPCWSTR component) { BOOL matches = FALSE; @@ -3080,7 +3140,7 @@ static BOOL find_matching_domain_component(CERT_NAME_INFO *name, if (!strcmp(szOID_DOMAIN_COMPONENT, name->rgRDN[i].rgRDNAttr[j].pszObjId)) { - PCERT_RDN_ATTR attr; + const CERT_RDN_ATTR *attr; attr = &name->rgRDN[i].rgRDNAttr[j]; /* Compare with memicmpW rather than strcmpiW in order to avoid @@ -3088,7 +3148,7 @@ static BOOL find_matching_domain_component(CERT_NAME_INFO *name, * must match one domain component attribute's entire string * value with a case-insensitive match. */ - matches = !memicmpW(component, (LPWSTR)attr->Value.pbData, + matches = !memicmpW(component, (LPCWSTR)attr->Value.pbData, attr->Value.cbData / sizeof(WCHAR)); } return matches; @@ -3137,7 +3197,8 @@ static BOOL match_domain_component(LPCWSTR allowed_component, DWORD allowed_len, break; } } - matches = tolowerW(*allowed_ptr) == tolowerW(*server_ptr); + if (matches) + matches = tolowerW(*allowed_ptr) == tolowerW(*server_ptr); } if (matches && server_ptr - server_component < server_len) { @@ -3149,7 +3210,7 @@ static BOOL match_domain_component(LPCWSTR allowed_component, DWORD allowed_len, return matches; } -static BOOL match_common_name(LPCWSTR server_name, PCERT_RDN_ATTR nameAttr) +static BOOL match_common_name(LPCWSTR server_name, const CERT_RDN_ATTR *nameAttr) { LPCWSTR allowed = (LPCWSTR)nameAttr->Value.pbData; LPCWSTR allowed_component = allowed; @@ -3241,7 +3302,6 @@ static BOOL match_dns_to_subject_dn(PCCERT_CONTEXT cert, LPCWSTR server_name) { LPCWSTR ptr = server_name; - matches = TRUE; do { LPCWSTR dot = strchrW(ptr, '.'), end; /* 254 is the maximum DNS label length, see RFC 1035 */ @@ -3267,23 +3327,55 @@ static BOOL match_dns_to_subject_dn(PCCERT_CONTEXT cert, LPCWSTR server_name) } else { - PCERT_RDN_ATTR attr; + DWORD i, j; /* If the certificate isn't using a DN attribute in the name, make - * make sure the common name matches. + * make sure at least one common name matches. From RFC 2818, + * section 3.1: + * "If more than one identity of a given type is present in the + * certificate (e.g., more than one dNSName name, a match in any + * one of the set is considered acceptable.)" */ - if ((attr = CertFindRDNAttr(szOID_COMMON_NAME, name))) - matches = match_common_name(server_name, attr); + for (i = 0; !matches && i < name->cRDN; i++) + for (j = 0; !matches && j < name->rgRDN[i].cRDNAttr; j++) + { + PCERT_RDN_ATTR attr = &name->rgRDN[i].rgRDNAttr[j]; + + if (attr->pszObjId && !strcmp(szOID_COMMON_NAME, + attr->pszObjId)) + matches = match_common_name(server_name, attr); + } } LocalFree(name); } return matches; } +static void dump_ssl_extra_chain_policy_para(HTTPSPolicyCallbackData *sslPara) +{ + if (sslPara) + { + TRACE_(chain)("cbSize = %d\n", sslPara->u.cbSize); + TRACE_(chain)("dwAuthType = %d\n", sslPara->dwAuthType); + TRACE_(chain)("fdwChecks = %08x\n", sslPara->fdwChecks); + TRACE_(chain)("pwszServerName = %s\n", + debugstr_w(sslPara->pwszServerName)); + } +} + static BOOL WINAPI verify_ssl_policy(LPCSTR szPolicyOID, PCCERT_CHAIN_CONTEXT pChainContext, PCERT_CHAIN_POLICY_PARA pPolicyPara, PCERT_CHAIN_POLICY_STATUS pPolicyStatus) { + HTTPSPolicyCallbackData *sslPara = NULL; + DWORD checks = 0; + + if (pPolicyPara) + sslPara = pPolicyPara->pvExtraPolicyPara; + if (TRACE_ON(chain)) + dump_ssl_extra_chain_policy_para(sslPara); + if (sslPara && sslPara->u.cbSize >= sizeof(HTTPSPolicyCallbackData)) + checks = sslPara->fdwChecks; pPolicyStatus->lChainIndex = pPolicyStatus->lElementIndex = -1; if (pChainContext->TrustStatus.dwErrorStatus & CERT_TRUST_IS_NOT_SIGNATURE_VALID) @@ -3294,7 +3386,8 @@ static BOOL WINAPI verify_ssl_policy(LPCSTR szPolicyOID, &pPolicyStatus->lElementIndex); } else if (pChainContext->TrustStatus.dwErrorStatus & - CERT_TRUST_IS_UNTRUSTED_ROOT) + CERT_TRUST_IS_UNTRUSTED_ROOT && + !(checks & SECURITY_FLAG_IGNORE_UNKNOWN_CA)) { pPolicyStatus->dwError = CERT_E_UNTRUSTEDROOT; find_element_with_error(pChainContext, @@ -3311,13 +3404,48 @@ static BOOL WINAPI verify_ssl_policy(LPCSTR szPolicyOID, pPolicyStatus->lElementIndex = -1; } else if (pChainContext->TrustStatus.dwErrorStatus & - CERT_TRUST_IS_NOT_TIME_VALID) + CERT_TRUST_IS_NOT_TIME_VALID && + !(checks & SECURITY_FLAG_IGNORE_CERT_DATE_INVALID)) { pPolicyStatus->dwError = CERT_E_EXPIRED; find_element_with_error(pChainContext, CERT_TRUST_IS_NOT_TIME_VALID, &pPolicyStatus->lChainIndex, &pPolicyStatus->lElementIndex); } + else if (pChainContext->TrustStatus.dwErrorStatus & + CERT_TRUST_IS_NOT_VALID_FOR_USAGE && + !(checks & SECURITY_FLAG_IGNORE_WRONG_USAGE)) + { + pPolicyStatus->dwError = CERT_E_WRONG_USAGE; + find_element_with_error(pChainContext, + CERT_TRUST_IS_NOT_VALID_FOR_USAGE, &pPolicyStatus->lChainIndex, + &pPolicyStatus->lElementIndex); + } + else if (pChainContext->TrustStatus.dwErrorStatus & + CERT_TRUST_IS_REVOKED && !(checks & SECURITY_FLAG_IGNORE_REVOCATION)) + { + pPolicyStatus->dwError = CERT_E_REVOKED; + find_element_with_error(pChainContext, + CERT_TRUST_IS_REVOKED, &pPolicyStatus->lChainIndex, + &pPolicyStatus->lElementIndex); + } + else if (pChainContext->TrustStatus.dwErrorStatus & + CERT_TRUST_IS_OFFLINE_REVOCATION && + !(checks & SECURITY_FLAG_IGNORE_REVOCATION)) + { + pPolicyStatus->dwError = CERT_E_REVOCATION_FAILURE; + find_element_with_error(pChainContext, + CERT_TRUST_IS_OFFLINE_REVOCATION, &pPolicyStatus->lChainIndex, + &pPolicyStatus->lElementIndex); + } + else if (pChainContext->TrustStatus.dwErrorStatus & + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT) + { + pPolicyStatus->dwError = CERT_E_CRITICAL; + find_element_with_error(pChainContext, + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT, &pPolicyStatus->lChainIndex, + &pPolicyStatus->lElementIndex); + } else pPolicyStatus->dwError = NO_ERROR; /* We only need bother checking whether the name in the end certificate @@ -3326,12 +3454,11 @@ static BOOL WINAPI verify_ssl_policy(LPCSTR szPolicyOID, if (!pPolicyStatus->dwError && pPolicyPara && pPolicyPara->cbSize >= sizeof(CERT_CHAIN_POLICY_PARA)) { - HTTPSPolicyCallbackData *sslPara = pPolicyPara->pvExtraPolicyPara; - if (sslPara && sslPara->u.cbSize >= sizeof(HTTPSPolicyCallbackData)) { if (sslPara->dwAuthType == AUTHTYPE_SERVER && - sslPara->pwszServerName) + sslPara->pwszServerName && + !(checks & SECURITY_FLAG_IGNORE_CERT_CN_INVALID)) { PCCERT_CONTEXT cert; PCERT_EXTENSION altNameExt; @@ -3485,6 +3612,16 @@ typedef BOOL (WINAPI *CertVerifyCertificateChainPolicyFunc)(LPCSTR szPolicyOID, PCCERT_CHAIN_CONTEXT pChainContext, PCERT_CHAIN_POLICY_PARA pPolicyPara, PCERT_CHAIN_POLICY_STATUS pPolicyStatus); +static void dump_policy_para(PCERT_CHAIN_POLICY_PARA para) +{ + if (para) + { + TRACE_(chain)("cbSize = %d\n", para->cbSize); + TRACE_(chain)("dwFlags = %08x\n", para->dwFlags); + TRACE_(chain)("pvExtraPolicyPara = %p\n", para->pvExtraPolicyPara); + } +} + BOOL WINAPI CertVerifyCertificateChainPolicy(LPCSTR szPolicyOID, PCCERT_CHAIN_CONTEXT pChainContext, PCERT_CHAIN_POLICY_PARA pPolicyPara, PCERT_CHAIN_POLICY_STATUS pPolicyStatus) @@ -3496,6 +3633,8 @@ BOOL WINAPI CertVerifyCertificateChainPolicy(LPCSTR szPolicyOID, TRACE("(%s, %p, %p, %p)\n", debugstr_a(szPolicyOID), pChainContext, pPolicyPara, pPolicyStatus); + if (TRACE_ON(chain)) + dump_policy_para(pPolicyPara); if (IS_INTOID(szPolicyOID)) { diff --git a/reactos/dll/win32/crypt32/collectionstore.c b/reactos/dll/win32/crypt32/collectionstore.c index 35941dd7317..6fe380c8e38 100644 --- a/reactos/dll/win32/crypt32/collectionstore.c +++ b/reactos/dll/win32/crypt32/collectionstore.c @@ -134,7 +134,7 @@ static BOOL CRYPT_CollectionAddContext(PWINE_COLLECTIONSTORE store, * Assumes the collection store's lock is held. */ static void *CRYPT_CollectionAdvanceEnum(PWINE_COLLECTIONSTORE store, - PWINE_STORE_LIST_ENTRY storeEntry, PCONTEXT_FUNCS contextFuncs, + PWINE_STORE_LIST_ENTRY storeEntry, const CONTEXT_FUNCS *contextFuncs, PCWINE_CONTEXT_INTERFACE contextInterface, void *pPrev, size_t contextSize) { void *ret, *child; @@ -165,7 +165,7 @@ static void *CRYPT_CollectionAdvanceEnum(PWINE_COLLECTIONSTORE store, /* We always want the same function pointers (from certs, crls) * in the next store, so use the same offset into the next store. */ - size_t offset = (LPBYTE)contextFuncs - (LPBYTE)storeEntry->store; + size_t offset = (const BYTE *)contextFuncs - (LPBYTE)storeEntry->store; PWINE_STORE_LIST_ENTRY storeNextEntry = LIST_ENTRY(storeNext, WINE_STORE_LIST_ENTRY, entry); PCONTEXT_FUNCS storeNextContexts = diff --git a/reactos/dll/win32/crypt32/crl.c b/reactos/dll/win32/crypt32/crl.c index 72180c52473..5b5a455909a 100644 --- a/reactos/dll/win32/crypt32/crl.c +++ b/reactos/dll/win32/crypt32/crl.c @@ -58,7 +58,7 @@ PCCRL_CONTEXT WINAPI CertCreateCRLContext(DWORD dwCertEncodingType, data = CryptMemAlloc(cbCrlEncoded); if (!data) { - CryptMemFree(crl); + CertFreeCRLContext(crl); crl = NULL; goto end; } @@ -472,8 +472,10 @@ BOOL WINAPI CertGetCRLContextProperty(PCCRL_CONTEXT pCRLContext, ret = CertGetStoreProperty(pCRLContext->hCertStore, dwPropId, pvData, pcbData); else + { *(DWORD *)pvData = 0; - ret = TRUE; + ret = TRUE; + } } break; default: diff --git a/reactos/dll/win32/crypt32/crypt32.spec b/reactos/dll/win32/crypt32/crypt32.spec index 61e4d3d5db7..66d831b2e77 100644 --- a/reactos/dll/win32/crypt32/crypt32.spec +++ b/reactos/dll/win32/crypt32/crypt32.spec @@ -40,6 +40,7 @@ @ stdcall CertEnumPhysicalStore(ptr long ptr ptr) @ stdcall CertEnumSystemStore(long ptr ptr ptr) @ stdcall CertFindAttribute(str long ptr) +@ stdcall CertFindChainInStore(ptr long long long ptr ptr) @ stdcall CertFindCRLInStore(ptr long long long ptr ptr) @ stdcall CertFindCTLInStore(ptr long long long ptr ptr) @ stdcall CertFindCertificateInStore(ptr long long long ptr ptr) @@ -76,6 +77,7 @@ @ stdcall CertOpenSystemStoreW(long wstr) @ stdcall CertRDNValueToStrA(long ptr ptr long) @ stdcall CertRDNValueToStrW(long ptr ptr long) +@ stdcall CertRegisterPhysicalStore(ptr long wstr ptr ptr) @ stdcall CertRemoveEnhancedKeyUsageIdentifier(ptr str) @ stdcall CertRemoveStoreFromCollection(ptr ptr) @ stdcall CertSaveStore(ptr long long long ptr long) @@ -113,7 +115,7 @@ @ stub CryptDecryptMessage @ stdcall CryptEncodeObject(long str ptr ptr ptr) @ stdcall CryptEncodeObjectEx(long str ptr long ptr ptr ptr) -@ stub CryptEncryptMessage +@ stdcall CryptEncryptMessage(ptr long ptr ptr long ptr ptr) @ stub CryptEnumOIDFunction @ stdcall CryptEnumOIDInfo(long long ptr ptr) @ stub CryptEnumProvidersU @@ -181,7 +183,7 @@ @ stub CryptSignAndEncryptMessage @ stdcall CryptSignCertificate(long long long ptr long ptr ptr ptr ptr) @ stub CryptSignHashU -@ stub CryptSignMessage +@ stdcall CryptSignMessage(ptr long long ptr ptr ptr ptr) @ stub CryptSignMessageWithKey @ stdcall CryptUnprotectData(ptr ptr ptr ptr ptr long ptr) @ stdcall CryptUnregisterDefaultOIDFunction(long str wstr) @@ -223,6 +225,7 @@ @ stdcall PFXExportCertStoreEx(ptr ptr ptr ptr long) @ stdcall PFXImportCertStore(ptr ptr long) @ stdcall PFXIsPFXBlob(ptr) +@ stdcall PFXVerifyPassword(ptr wstr long) @ stub RegCreateHKCUKeyExU @ stub RegCreateKeyExU @ stub RegDeleteValueU diff --git a/reactos/dll/win32/crypt32/crypt32_private.h b/reactos/dll/win32/crypt32/crypt32_private.h index 8385bf50713..ea85cbc7e28 100644 --- a/reactos/dll/win32/crypt32/crypt32_private.h +++ b/reactos/dll/win32/crypt32/crypt32_private.h @@ -38,7 +38,7 @@ #define ASN_UNIVERSALSTRING (ASN_UNIVERSAL | ASN_PRIMITIVE | 0x1c) #define ASN_BMPSTRING (ASN_UNIVERSAL | ASN_PRIMITIVE | 0x1e) -BOOL CRYPT_EncodeLen(DWORD len, BYTE *pbEncoded, DWORD *pcbEncoded); +BOOL CRYPT_EncodeLen(DWORD len, BYTE *pbEncoded, DWORD *pcbEncoded) DECLSPEC_HIDDEN; typedef BOOL (WINAPI *CryptEncodeObjectExFunc)(DWORD, LPCSTR, const void *, DWORD, PCRYPT_ENCODE_PARA, BYTE *, DWORD *); @@ -52,7 +52,7 @@ struct AsnEncodeSequenceItem BOOL WINAPI CRYPT_AsnEncodeSequence(DWORD dwCertEncodingType, struct AsnEncodeSequenceItem items[], DWORD cItem, DWORD dwFlags, - PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded); + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) DECLSPEC_HIDDEN; struct AsnConstructedItem { @@ -63,13 +63,13 @@ struct AsnConstructedItem BOOL WINAPI CRYPT_AsnEncodeConstructed(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, - PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded); + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) DECLSPEC_HIDDEN; BOOL WINAPI CRYPT_AsnEncodeOid(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, - PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded); + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) DECLSPEC_HIDDEN; BOOL WINAPI CRYPT_AsnEncodeOctets(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, - PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded); + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) DECLSPEC_HIDDEN; typedef struct _CRYPT_DIGESTED_DATA { @@ -80,7 +80,29 @@ typedef struct _CRYPT_DIGESTED_DATA } CRYPT_DIGESTED_DATA; BOOL CRYPT_AsnEncodePKCSDigestedData(const CRYPT_DIGESTED_DATA *digestedData, - void *pvData, DWORD *pcbData); + void *pvData, DWORD *pcbData) DECLSPEC_HIDDEN; + +typedef struct _CRYPT_ENCRYPTED_CONTENT_INFO +{ + LPSTR contentType; + CRYPT_ALGORITHM_IDENTIFIER contentEncryptionAlgorithm; + CRYPT_DATA_BLOB encryptedContent; +} CRYPT_ENCRYPTED_CONTENT_INFO; + +typedef struct _CRYPT_ENVELOPED_DATA +{ + DWORD version; + DWORD cRecipientInfo; + PCMSG_KEY_TRANS_RECIPIENT_INFO rgRecipientInfo; + CRYPT_ENCRYPTED_CONTENT_INFO encryptedContentInfo; +} CRYPT_ENVELOPED_DATA; + +BOOL CRYPT_AsnEncodePKCSEnvelopedData(const CRYPT_ENVELOPED_DATA *envelopedData, + void *pvData, DWORD *pcbData) DECLSPEC_HIDDEN; + +BOOL CRYPT_AsnDecodePKCSEnvelopedData(const BYTE *pbEncoded, DWORD cbEncoded, + DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, + CRYPT_ENVELOPED_DATA *envelopedData, DWORD *pcbEnvelopedData) DECLSPEC_HIDDEN; typedef struct _CRYPT_SIGNED_INFO { @@ -95,27 +117,27 @@ typedef struct _CRYPT_SIGNED_INFO } CRYPT_SIGNED_INFO; BOOL CRYPT_AsnEncodeCMSSignedInfo(CRYPT_SIGNED_INFO *, void *pvData, - DWORD *pcbData); + DWORD *pcbData) DECLSPEC_HIDDEN; BOOL CRYPT_AsnDecodeCMSSignedInfo(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, - CRYPT_SIGNED_INFO *signedInfo, DWORD *pcbSignedInfo); + CRYPT_SIGNED_INFO *signedInfo, DWORD *pcbSignedInfo) DECLSPEC_HIDDEN; /* Helper function to check *pcbEncoded, set it to the required size, and * optionally to allocate memory. Assumes pbEncoded is not NULL. * If CRYPT_ENCODE_ALLOC_FLAG is set in dwFlags, *pbEncoded will be set to a * pointer to the newly allocated memory. */ -BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, - BYTE *pbEncoded, DWORD *pcbEncoded, DWORD bytesNeeded); +BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, + BYTE *pbEncoded, DWORD *pcbEncoded, DWORD bytesNeeded) DECLSPEC_HIDDEN; BOOL CRYPT_AsnDecodePKCSDigestedData(const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, - CRYPT_DIGESTED_DATA *digestedData, DWORD *pcbDigestedData); + CRYPT_DIGESTED_DATA *digestedData, DWORD *pcbDigestedData) DECLSPEC_HIDDEN; BOOL WINAPI CRYPT_AsnEncodePubKeyInfoNoNull(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, - PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded); + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) DECLSPEC_HIDDEN; /* The following aren't defined in wincrypt.h, as they're "reserved" */ #define CERT_CERT_PROP_ID 32 @@ -125,15 +147,15 @@ BOOL WINAPI CRYPT_AsnEncodePubKeyInfoNoNull(DWORD dwCertEncodingType, /* Returns a handle to the default crypto provider; loads it if necessary. * Returns NULL on failure. */ -HCRYPTPROV CRYPT_GetDefaultProvider(void); +HCRYPTPROV CRYPT_GetDefaultProvider(void) DECLSPEC_HIDDEN; -HINSTANCE hInstance; +HINSTANCE hInstance DECLSPEC_HIDDEN; -void crypt_oid_init(void); -void crypt_oid_free(void); -void crypt_sip_free(void); -void root_store_free(void); -void default_chain_engine_free(void); +void crypt_oid_init(void) DECLSPEC_HIDDEN; +void crypt_oid_free(void) DECLSPEC_HIDDEN; +void crypt_sip_free(void) DECLSPEC_HIDDEN; +void root_store_free(void) DECLSPEC_HIDDEN; +void default_chain_engine_free(void) DECLSPEC_HIDDEN; /* Some typedefs that make it easier to abstract which type of context we're * working with. @@ -156,7 +178,7 @@ typedef BOOL (WINAPI *SetContextPropertyFunc)(const void *context, typedef BOOL (WINAPI *SerializeElementFunc)(const void *context, DWORD dwFlags, BYTE *pbElement, DWORD *pcbElement); typedef BOOL (WINAPI *FreeContextFunc)(const void *context); -typedef BOOL (WINAPI *DeleteContextFunc)(const void *context); +typedef BOOL (WINAPI *DeleteContextFunc)(const void *contex); /* An abstract context (certificate, CRL, or CTL) interface */ typedef struct _WINE_CONTEXT_INTERFACE @@ -175,9 +197,9 @@ typedef struct _WINE_CONTEXT_INTERFACE } WINE_CONTEXT_INTERFACE, *PWINE_CONTEXT_INTERFACE; typedef const WINE_CONTEXT_INTERFACE *PCWINE_CONTEXT_INTERFACE; -extern PCWINE_CONTEXT_INTERFACE pCertInterface; -extern PCWINE_CONTEXT_INTERFACE pCRLInterface; -extern PCWINE_CONTEXT_INTERFACE pCTLInterface; +extern PCWINE_CONTEXT_INTERFACE pCertInterface DECLSPEC_HIDDEN; +extern PCWINE_CONTEXT_INTERFACE pCRLInterface DECLSPEC_HIDDEN; +extern PCWINE_CONTEXT_INTERFACE pCTLInterface DECLSPEC_HIDDEN; /* (Internal) certificate store types and functions */ struct WINE_CRYPTCERTSTORE; @@ -239,34 +261,34 @@ typedef struct WINE_CRYPTCERTSTORE } WINECRYPT_CERTSTORE, *PWINECRYPT_CERTSTORE; void CRYPT_InitStore(WINECRYPT_CERTSTORE *store, DWORD dwFlags, - CertStoreType type); -void CRYPT_FreeStore(PWINECRYPT_CERTSTORE store); + CertStoreType type) DECLSPEC_HIDDEN; +void CRYPT_FreeStore(PWINECRYPT_CERTSTORE store) DECLSPEC_HIDDEN; BOOL WINAPI I_CertUpdateStore(HCERTSTORE store1, HCERTSTORE store2, DWORD unk0, - DWORD unk1); + DWORD unk1) DECLSPEC_HIDDEN; PWINECRYPT_CERTSTORE CRYPT_CollectionOpenStore(HCRYPTPROV hCryptProv, - DWORD dwFlags, const void *pvPara); + DWORD dwFlags, const void *pvPara) DECLSPEC_HIDDEN; PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags, - PWINECRYPT_CERTSTORE memStore, const CERT_STORE_PROV_INFO *pProvInfo); + PWINECRYPT_CERTSTORE memStore, const CERT_STORE_PROV_INFO *pProvInfo) DECLSPEC_HIDDEN; PWINECRYPT_CERTSTORE CRYPT_ProvOpenStore(LPCSTR lpszStoreProvider, DWORD dwEncodingType, HCRYPTPROV hCryptProv, DWORD dwFlags, - const void *pvPara); + const void *pvPara) DECLSPEC_HIDDEN; PWINECRYPT_CERTSTORE CRYPT_RegOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags, - const void *pvPara); + const void *pvPara) DECLSPEC_HIDDEN; PWINECRYPT_CERTSTORE CRYPT_FileOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags, - const void *pvPara); + const void *pvPara) DECLSPEC_HIDDEN; PWINECRYPT_CERTSTORE CRYPT_FileNameOpenStoreA(HCRYPTPROV hCryptProv, - DWORD dwFlags, const void *pvPara); + DWORD dwFlags, const void *pvPara) DECLSPEC_HIDDEN; PWINECRYPT_CERTSTORE CRYPT_FileNameOpenStoreW(HCRYPTPROV hCryptProv, - DWORD dwFlags, const void *pvPara); -PWINECRYPT_CERTSTORE CRYPT_RootOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags); + DWORD dwFlags, const void *pvPara) DECLSPEC_HIDDEN; +PWINECRYPT_CERTSTORE CRYPT_RootOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags) DECLSPEC_HIDDEN; /* Allocates and initializes a certificate chain engine, but without creating * the root store. Instead, it uses root, and assumes the caller has done any * checking necessary. */ HCERTCHAINENGINE CRYPT_CreateChainEngine(HCERTSTORE root, - PCERT_CHAIN_ENGINE_CONFIG pConfig); + PCERT_CHAIN_ENGINE_CONFIG pConfig) DECLSPEC_HIDDEN; /* Helper function for store reading functions and * CertAddSerializedElementToStore. Returns a context of the appropriate type @@ -275,18 +297,18 @@ HCERTCHAINENGINE CRYPT_CreateChainEngine(HCERTSTORE root, * *pdwContentType is set to the type of the returned context. */ const void *CRYPT_ReadSerializedElement(const BYTE *pbElement, - DWORD cbElement, DWORD dwContextTypeFlags, DWORD *pdwContentType); + DWORD cbElement, DWORD dwContextTypeFlags, DWORD *pdwContentType) DECLSPEC_HIDDEN; /* Reads contexts serialized in the file into the memory store. Returns FALSE * if the file is not of the expected format. */ -BOOL CRYPT_ReadSerializedStoreFromFile(HANDLE file, HCERTSTORE store); +BOOL CRYPT_ReadSerializedStoreFromFile(HANDLE file, HCERTSTORE store) DECLSPEC_HIDDEN; /* Reads contexts serialized in the blob into the memory store. Returns FALSE * if the file is not of the expected format. */ BOOL CRYPT_ReadSerializedStoreFromBlob(const CRYPT_DATA_BLOB *blob, - HCERTSTORE store); + HCERTSTORE store) DECLSPEC_HIDDEN; /* Fixes up the pointers in info, where info is assumed to be a * CRYPT_KEY_PROV_INFO, followed by its container name, provider name, and any @@ -294,14 +316,14 @@ BOOL CRYPT_ReadSerializedStoreFromBlob(const CRYPT_DATA_BLOB *blob, * assumed to be invalid. Upon return, info's pointers point to the * appropriate memory locations. */ -void CRYPT_FixKeyProvInfoPointers(PCRYPT_KEY_PROV_INFO info); +void CRYPT_FixKeyProvInfoPointers(PCRYPT_KEY_PROV_INFO info) DECLSPEC_HIDDEN; /** * String functions */ DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indent, - const CERT_NAME_BLOB *pName, DWORD dwStrType, LPWSTR psz, DWORD csz); + const CERT_NAME_BLOB *pName, DWORD dwStrType, LPWSTR psz, DWORD csz) DECLSPEC_HIDDEN; /** * Context functions @@ -312,7 +334,7 @@ DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indent, * which should be one of CERT_CONTEXT, CRL_CONTEXT, or CTL_CONTEXT. * Free with Context_Release. */ -void *Context_CreateDataContext(size_t contextSize); +void *Context_CreateDataContext(size_t contextSize) DECLSPEC_HIDDEN; /* Creates a new link context with extra bytes. The context refers to linked * rather than owning its own properties. If addRef is TRUE (which ordinarily @@ -320,26 +342,26 @@ void *Context_CreateDataContext(size_t contextSize); * Free with Context_Release. */ void *Context_CreateLinkContext(unsigned int contextSize, void *linked, unsigned int extra, - BOOL addRef); + BOOL addRef) DECLSPEC_HIDDEN; /* Returns a pointer to the extra bytes allocated with context, which must be * a link context. */ -void *Context_GetExtra(const void *context, size_t contextSize); +void *Context_GetExtra(const void *context, size_t contextSize) DECLSPEC_HIDDEN; /* Gets the context linked to by context, which must be a link context. */ -void *Context_GetLinkedContext(void *context, size_t contextSize); +void *Context_GetLinkedContext(void *context, size_t contextSize) DECLSPEC_HIDDEN; /* Copies properties from fromContext to toContext. */ void Context_CopyProperties(const void *to, const void *from, - size_t contextSize); + size_t contextSize) DECLSPEC_HIDDEN; /* Returns context's properties, or the linked context's properties if context * is a link context. */ -PCONTEXT_PROPERTY_LIST Context_GetProperties(const void *context, size_t contextSize); +PCONTEXT_PROPERTY_LIST Context_GetProperties(const void *context, size_t contextSize) DECLSPEC_HIDDEN; -void Context_AddRef(void *context, size_t contextSize); +void Context_AddRef(void *context, size_t contextSize) DECLSPEC_HIDDEN; typedef void (*ContextFreeFunc)(void *context); @@ -349,32 +371,32 @@ typedef void (*ContextFreeFunc)(void *context); * Returns FALSE if the reference count is <= 0 when called. */ BOOL Context_Release(void *context, size_t contextSize, - ContextFreeFunc dataContextFree); + ContextFreeFunc dataContextFree) DECLSPEC_HIDDEN; /** * Context property list functions */ -PCONTEXT_PROPERTY_LIST ContextPropertyList_Create(void); +PCONTEXT_PROPERTY_LIST ContextPropertyList_Create(void) DECLSPEC_HIDDEN; /* Searches for the property with ID id in the context. Returns TRUE if found, * and copies the property's length and a pointer to its data to blob. * Otherwise returns FALSE. */ BOOL ContextPropertyList_FindProperty(PCONTEXT_PROPERTY_LIST list, DWORD id, - PCRYPT_DATA_BLOB blob); + PCRYPT_DATA_BLOB blob) DECLSPEC_HIDDEN; BOOL ContextPropertyList_SetProperty(PCONTEXT_PROPERTY_LIST list, DWORD id, - const BYTE *pbData, size_t cbData); + const BYTE *pbData, size_t cbData) DECLSPEC_HIDDEN; -void ContextPropertyList_RemoveProperty(PCONTEXT_PROPERTY_LIST list, DWORD id); +void ContextPropertyList_RemoveProperty(PCONTEXT_PROPERTY_LIST list, DWORD id) DECLSPEC_HIDDEN; -DWORD ContextPropertyList_EnumPropIDs(PCONTEXT_PROPERTY_LIST list, DWORD id); +DWORD ContextPropertyList_EnumPropIDs(PCONTEXT_PROPERTY_LIST list, DWORD id) DECLSPEC_HIDDEN; void ContextPropertyList_Copy(PCONTEXT_PROPERTY_LIST to, - PCONTEXT_PROPERTY_LIST from); + PCONTEXT_PROPERTY_LIST from) DECLSPEC_HIDDEN; -void ContextPropertyList_Free(PCONTEXT_PROPERTY_LIST list); +void ContextPropertyList_Free(PCONTEXT_PROPERTY_LIST list) DECLSPEC_HIDDEN; /** * Context list functions. A context list is a simple list of link contexts. @@ -382,19 +404,19 @@ void ContextPropertyList_Free(PCONTEXT_PROPERTY_LIST list); struct ContextList; struct ContextList *ContextList_Create( - PCWINE_CONTEXT_INTERFACE contextInterface, size_t contextSize); + PCWINE_CONTEXT_INTERFACE contextInterface, size_t contextSize) DECLSPEC_HIDDEN; -void *ContextList_Add(struct ContextList *list, void *toLink, void *toReplace); +void *ContextList_Add(struct ContextList *list, void *toLink, void *toReplace) DECLSPEC_HIDDEN; -void *ContextList_Enum(struct ContextList *list, void *pPrev); +void *ContextList_Enum(struct ContextList *list, void *pPrev) DECLSPEC_HIDDEN; /* Removes a context from the list. Returns TRUE if the context was removed, * or FALSE if not. (The context may have been duplicated, so subsequent * removes have no effect.) */ -BOOL ContextList_Remove(struct ContextList *list, void *context); +BOOL ContextList_Remove(struct ContextList *list, void *context) DECLSPEC_HIDDEN; -void ContextList_Free(struct ContextList *list); +void ContextList_Free(struct ContextList *list) DECLSPEC_HIDDEN; /** * Utilities. diff --git a/reactos/dll/win32/crypt32/ctl.c b/reactos/dll/win32/crypt32/ctl.c index 40895fa1bdb..9a8f1765b5a 100644 --- a/reactos/dll/win32/crypt32/ctl.c +++ b/reactos/dll/win32/crypt32/ctl.c @@ -447,7 +447,7 @@ PCCTL_CONTEXT WINAPI CertCreateCTLContext(DWORD dwMsgAndCertEncodingType, end: if (!ret) { - CryptMemFree(ctl); + CertFreeCTLContext(ctl); ctl = NULL; LocalFree(ctlInfo); CryptMemFree(content); @@ -605,8 +605,10 @@ BOOL WINAPI CertGetCTLContextProperty(PCCTL_CONTEXT pCTLContext, ret = CertGetStoreProperty(pCTLContext->hCertStore, dwPropId, pvData, pcbData); else + { *(DWORD *)pvData = 0; - ret = TRUE; + ret = TRUE; + } } break; default: diff --git a/reactos/dll/win32/crypt32/decode.c b/reactos/dll/win32/crypt32/decode.c index 655a5b2c5d6..4a225331d6d 100644 --- a/reactos/dll/win32/crypt32/decode.c +++ b/reactos/dll/win32/crypt32/decode.c @@ -205,7 +205,7 @@ static BOOL CRYPT_GetLen(const BYTE *pbEncoded, DWORD cbEncoded, DWORD *len) * pointer to the newly allocated memory. */ static BOOL CRYPT_DecodeEnsureSpace(DWORD dwFlags, - PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo, + const CRYPT_DECODE_PARA *pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo, DWORD bytesNeeded) { BOOL ret = TRUE; @@ -232,7 +232,7 @@ static BOOL CRYPT_DecodeEnsureSpace(DWORD dwFlags, return ret; } -static void CRYPT_FreeSpace(PCRYPT_DECODE_PARA pDecodePara, LPVOID pv) +static void CRYPT_FreeSpace(const CRYPT_DECODE_PARA *pDecodePara, LPVOID pv) { if (pDecodePara && pDecodePara->pfnFree) pDecodePara->pfnFree(pv); @@ -611,7 +611,7 @@ struct AsnArrayItemSize */ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc, const BYTE *pbEncoded, DWORD cbEncoded, DWORD dwFlags, - PCRYPT_DECODE_PARA pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo, + const CRYPT_DECODE_PARA *pDecodePara, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) { BOOL ret = TRUE; @@ -759,6 +759,8 @@ static BOOL CRYPT_AsnDecodeArray(const struct AsnArrayDescriptor *arrayDesc, ptr += itemDecoded; } } + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, pvStructInfo); } } if (itemSizes != &itemSize) @@ -1463,7 +1465,10 @@ static BOOL WINAPI CRYPT_AsnDecodeExtensions(DWORD dwCertEncodingType, sizeof(CERT_EXTENSIONS), CRYPT_AsnDecodeExtension, sizeof(CERT_EXTENSION), TRUE, offsetof(CERT_EXTENSION, pszObjId) }; + CERT_EXTENSIONS *exts = pvStructInfo; + if (pvStructInfo && !(dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + exts->rgExtension = (CERT_EXTENSION *)(exts + 1); ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, NULL); } @@ -1655,6 +1660,8 @@ static BOOL WINAPI CRYPT_AsnDecodeNameValue(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeNameValueInternal( pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, pcbStructInfo, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, value); } } } @@ -1836,6 +1843,8 @@ static BOOL WINAPI CRYPT_AsnDecodeUnicodeNameValue(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeUnicodeNameValueInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, pcbStructInfo, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, value); } } } @@ -1930,6 +1939,8 @@ static BOOL WINAPI CRYPT_AsnDecodeName(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, info); } } } @@ -2025,6 +2036,8 @@ static BOOL WINAPI CRYPT_AsnDecodeUnicodeName(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, NULL, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, info); } } } @@ -2346,7 +2359,10 @@ static BOOL WINAPI CRYPT_AsnDecodeSMIMECapabilities(DWORD dwCertEncodingType, sizeof(CRYPT_SMIME_CAPABILITIES), CRYPT_AsnDecodeSMIMECapability, sizeof(CRYPT_SMIME_CAPABILITY), TRUE, offsetof(CRYPT_SMIME_CAPABILITY, pszObjId) }; + CRYPT_SMIME_CAPABILITIES *capabilities = pvStructInfo; + if (pvStructInfo && !(dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + capabilities->rgCapability = (CRYPT_SMIME_CAPABILITY *)(capabilities + 1); ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, NULL); } @@ -2685,6 +2701,8 @@ static BOOL WINAPI CRYPT_AsnDecodePolicyQualifierUserNotice( ret = CRYPT_AsnDecodePolicyQualifierUserNoticeInternal( pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, notice); } } } @@ -2774,6 +2792,8 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSAttribute(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodePKCSAttributeInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, attr); } } } @@ -2818,7 +2838,10 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSAttributes(DWORD dwCertEncodingType, sizeof(CRYPT_ATTRIBUTES), CRYPT_AsnDecodePKCSAttributeInternal, sizeof(CRYPT_ATTRIBUTE), TRUE, offsetof(CRYPT_ATTRIBUTE, pszObjId) }; + CRYPT_ATTRIBUTES *attrs = pvStructInfo; + if (pvStructInfo && !(dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + attrs->rgAttr = (CRYPT_ATTRIBUTE *)(attrs + 1); ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, NULL); } @@ -2909,6 +2932,8 @@ static BOOL WINAPI CRYPT_AsnDecodePubKeyInfo(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodePubKeyInfoInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, info); } } } @@ -3216,7 +3241,10 @@ static BOOL WINAPI CRYPT_AsnDecodeAuthorityInfoAccess(DWORD dwCertEncodingType, sizeof(CERT_AUTHORITY_INFO_ACCESS), CRYPT_AsnDecodeAccessDescription, sizeof(CERT_ACCESS_DESCRIPTION), TRUE, offsetof(CERT_ACCESS_DESCRIPTION, pszAccessMethod) }; + CERT_AUTHORITY_INFO_ACCESS *info = pvStructInfo; + if (pvStructInfo && !(dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + info->rgAccDescr = (CERT_ACCESS_DESCRIPTION *)(info + 1); ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, NULL); } @@ -3335,6 +3363,8 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSContentInfo(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodePKCSContentInfoInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, pcbStructInfo, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, info); } } } @@ -3404,6 +3434,8 @@ static BOOL WINAPI CRYPT_AsnDecodeAltName(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeAltNameInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, name); } } } @@ -3633,6 +3665,10 @@ static BOOL WINAPI CRYPT_AsnDecodeCertPolicies(DWORD dwCertEncodingType, sizeof(CERT_POLICIES_INFO), CRYPT_AsnDecodeCertPolicy, sizeof(CERT_POLICY_INFO), TRUE, offsetof(CERT_POLICY_INFO, pszPolicyIdentifier) }; + CERT_POLICIES_INFO *info = pvStructInfo; + + if (pvStructInfo && !(dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + info->rgPolicyInfo = (CERT_POLICY_INFO *)(info + 1); ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, NULL); @@ -3686,7 +3722,10 @@ static BOOL WINAPI CRYPT_AsnDecodeCertPolicyMappings(DWORD dwCertEncodingType, sizeof(CERT_POLICY_MAPPING), CRYPT_AsnDecodeCertPolicyMapping, sizeof(CERT_POLICY_MAPPING), TRUE, offsetof(CERT_POLICY_MAPPING, pszIssuerDomainPolicy) }; + CERT_POLICY_MAPPINGS_INFO *info = pvStructInfo; + if (pvStructInfo && !(dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + info->rgPolicyMapping = (CERT_POLICY_MAPPING *)(info + 1); ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, NULL); } @@ -3731,9 +3770,8 @@ static BOOL CRYPT_AsnDecodeRequireExplicit(const BYTE *pbEncoded, } else { - CERT_POLICY_CONSTRAINTS_INFO *info = - (CERT_POLICY_CONSTRAINTS_INFO *)((BYTE *)pvStructInfo - - offsetof(CERT_POLICY_CONSTRAINTS_INFO, fRequireExplicitPolicy)); + CERT_POLICY_CONSTRAINTS_INFO *info = CONTAINING_RECORD(pvStructInfo, + CERT_POLICY_CONSTRAINTS_INFO, fRequireExplicitPolicy); *pcbStructInfo = bytesNeeded; /* The BOOL is implicit: if the integer is present, then it's @@ -3779,9 +3817,8 @@ static BOOL CRYPT_AsnDecodeInhibitMapping(const BYTE *pbEncoded, } else { - CERT_POLICY_CONSTRAINTS_INFO *info = - (CERT_POLICY_CONSTRAINTS_INFO *)((BYTE *)pvStructInfo - - offsetof(CERT_POLICY_CONSTRAINTS_INFO, fInhibitPolicyMapping)); + CERT_POLICY_CONSTRAINTS_INFO *info = CONTAINING_RECORD(pvStructInfo, + CERT_POLICY_CONSTRAINTS_INFO, fInhibitPolicyMapping); *pcbStructInfo = bytesNeeded; /* The BOOL is implicit: if the integer is present, then it's @@ -3994,6 +4031,8 @@ static BOOL WINAPI CRYPT_AsnDecodeOctets(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeOctetsInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, blob); } } } @@ -4101,6 +4140,8 @@ static BOOL WINAPI CRYPT_AsnDecodeBits(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeBitsInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, blob); } } } @@ -4191,6 +4232,8 @@ static BOOL WINAPI CRYPT_AsnDecodeInt(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeIntInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, pvStructInfo); } } } @@ -4282,6 +4325,8 @@ static BOOL WINAPI CRYPT_AsnDecodeInteger(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeIntegerInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, blob); } } } @@ -4381,6 +4426,8 @@ static BOOL WINAPI CRYPT_AsnDecodeUnsignedInteger(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeUnsignedIntegerInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, blob); } } } @@ -4631,6 +4678,8 @@ static BOOL WINAPI CRYPT_AsnDecodeUtcTime(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeUtcTimeInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, pvStructInfo); } } } @@ -4760,6 +4809,8 @@ static BOOL WINAPI CRYPT_AsnDecodeChoiceOfTime(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeChoiceOfTimeInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, &bytesNeeded, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, pvStructInfo); } } } @@ -4858,6 +4909,8 @@ static BOOL WINAPI CRYPT_AsnDecodeSequenceOfAny(DWORD dwCertEncodingType, i++; } } + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, seq); } } } @@ -4986,7 +5039,10 @@ static BOOL WINAPI CRYPT_AsnDecodeCRLDistPoints(DWORD dwCertEncodingType, sizeof(CRL_DIST_POINTS_INFO), CRYPT_AsnDecodeDistPoint, sizeof(CRL_DIST_POINT), TRUE, offsetof(CRL_DIST_POINT, DistPointName.u.FullName.rgAltEntry) }; + CRL_DIST_POINTS_INFO *info = pvStructInfo; + if (pvStructInfo && !(dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + info->rgDistPoint = (CRL_DIST_POINT *)(info + 1); ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, NULL); } @@ -5015,7 +5071,10 @@ static BOOL WINAPI CRYPT_AsnDecodeEnhancedKeyUsage(DWORD dwCertEncodingType, offsetof(CERT_ENHKEY_USAGE, rgpszUsageIdentifier), sizeof(CERT_ENHKEY_USAGE), CRYPT_AsnDecodeOidInternal, sizeof(LPSTR), TRUE, 0 }; + CERT_ENHKEY_USAGE *usage = pvStructInfo; + if (pvStructInfo && !(dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + usage->rgpszUsageIdentifier = (LPSTR *)(usage + 1); ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, NULL); } @@ -5107,8 +5166,8 @@ static BOOL CRYPT_AsnDecodeMaximum(const BYTE *pbEncoded, } else { - CERT_GENERAL_SUBTREE *subtree = (CERT_GENERAL_SUBTREE *) - ((BYTE *)pvStructInfo - offsetof(CERT_GENERAL_SUBTREE, fMaximum)); + CERT_GENERAL_SUBTREE *subtree = CONTAINING_RECORD(pvStructInfo, + CERT_GENERAL_SUBTREE, fMaximum); *pcbStructInfo = bytesNeeded; /* The BOOL is implicit: if the integer is present, then it's @@ -5335,6 +5394,8 @@ static BOOL WINAPI CRYPT_AsnDecodePKCSSignerInfo(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodePKCSSignerInfoInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, pcbStructInfo, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, info); } } } @@ -5499,6 +5560,8 @@ static BOOL WINAPI CRYPT_AsnDecodeCMSSignerInfo(DWORD dwCertEncodingType, ret = CRYPT_AsnDecodeCMSSignerInfoInternal(pbEncoded, cbEncoded, dwFlags & ~CRYPT_DECODE_ALLOC_FLAG, pvStructInfo, pcbStructInfo, NULL); + if (!ret && (dwFlags & CRYPT_DECODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pDecodePara, info); } } } @@ -5569,6 +5632,124 @@ BOOL CRYPT_AsnDecodeCMSSignedInfo(const BYTE *pbEncoded, DWORD cbEncoded, return ret; } +static BOOL CRYPT_AsnDecodeRecipientInfo(const BYTE *pbEncoded, DWORD cbEncoded, + DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, DWORD *pcbDecoded) +{ + BOOL ret; + CMSG_KEY_TRANS_RECIPIENT_INFO *info = pvStructInfo; + struct AsnDecodeSequenceItem items[] = { + { ASN_INTEGER, offsetof(CMSG_KEY_TRANS_RECIPIENT_INFO, dwVersion), + CRYPT_AsnDecodeIntInternal, sizeof(DWORD), FALSE, FALSE, 0, 0 }, + { ASN_SEQUENCEOF, offsetof(CMSG_KEY_TRANS_RECIPIENT_INFO, + RecipientId.u.IssuerSerialNumber), CRYPT_AsnDecodeIssuerSerialNumber, + sizeof(CERT_ISSUER_SERIAL_NUMBER), FALSE, TRUE, + offsetof(CMSG_KEY_TRANS_RECIPIENT_INFO, + RecipientId.u.IssuerSerialNumber.Issuer.pbData), 0 }, + { ASN_SEQUENCEOF, offsetof(CMSG_KEY_TRANS_RECIPIENT_INFO, + KeyEncryptionAlgorithm), CRYPT_AsnDecodeAlgorithmId, + sizeof(CRYPT_ALGORITHM_IDENTIFIER), FALSE, TRUE, + offsetof(CMSG_KEY_TRANS_RECIPIENT_INFO, + KeyEncryptionAlgorithm.pszObjId), 0 }, + { ASN_OCTETSTRING, offsetof(CMSG_KEY_TRANS_RECIPIENT_INFO, EncryptedKey), + CRYPT_AsnDecodeOctetsInternal, sizeof(CRYPT_DATA_BLOB), FALSE, TRUE, + offsetof(CMSG_KEY_TRANS_RECIPIENT_INFO, EncryptedKey.pbData), 0 }, + }; + + TRACE("%p, %d, %08x, %p, %d, %p\n", pbEncoded, cbEncoded, dwFlags, + pvStructInfo, *pcbStructInfo, pcbDecoded); + + ret = CRYPT_AsnDecodeSequence(items, sizeof(items) / sizeof(items[0]), + pbEncoded, cbEncoded, dwFlags, NULL, pvStructInfo, pcbStructInfo, + pcbDecoded, info ? info->RecipientId.u.IssuerSerialNumber.Issuer.pbData : + NULL); + if (info) + info->RecipientId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; + TRACE("returning %d\n", ret); + return ret; +} + +static BOOL CRYPT_DecodeRecipientInfoArray(const BYTE *pbEncoded, + DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, + DWORD *pcbDecoded) +{ + BOOL ret; + struct AsnArrayDescriptor arrayDesc = { ASN_CONSTRUCTOR | ASN_SETOF, + offsetof(CRYPT_ENVELOPED_DATA, cRecipientInfo), + offsetof(CRYPT_ENVELOPED_DATA, rgRecipientInfo), + MEMBERSIZE(CRYPT_ENVELOPED_DATA, cRecipientInfo, encryptedContentInfo), + CRYPT_AsnDecodeRecipientInfo, sizeof(CMSG_KEY_TRANS_RECIPIENT_INFO), TRUE, + offsetof(CMSG_KEY_TRANS_RECIPIENT_INFO, + RecipientId.u.IssuerSerialNumber.Issuer.pbData) }; + + TRACE("%p, %d, %08x, %p, %d, %p\n", pbEncoded, cbEncoded, dwFlags, + pvStructInfo, *pcbStructInfo, pcbDecoded); + + ret = CRYPT_AsnDecodeArray(&arrayDesc, pbEncoded, cbEncoded, + dwFlags, NULL, pvStructInfo, pcbStructInfo, pcbDecoded); + TRACE("returning %d\n", ret); + return ret; +} + +static BOOL CRYPT_AsnDecodeEncryptedContentInfo(const BYTE *pbEncoded, + DWORD cbEncoded, DWORD dwFlags, void *pvStructInfo, DWORD *pcbStructInfo, + DWORD *pcbDecoded) +{ + BOOL ret; + CRYPT_ENCRYPTED_CONTENT_INFO *info = pvStructInfo; + struct AsnDecodeSequenceItem items[] = { + { ASN_OBJECTIDENTIFIER, offsetof(CRYPT_ENCRYPTED_CONTENT_INFO, + contentType), CRYPT_AsnDecodeOidInternal, sizeof(LPSTR), + FALSE, TRUE, offsetof(CRYPT_ENCRYPTED_CONTENT_INFO, + contentType), 0 }, + { ASN_SEQUENCEOF, offsetof(CRYPT_ENCRYPTED_CONTENT_INFO, + contentEncryptionAlgorithm), CRYPT_AsnDecodeAlgorithmId, + sizeof(CRYPT_ALGORITHM_IDENTIFIER), FALSE, TRUE, + offsetof(CRYPT_ENCRYPTED_CONTENT_INFO, + contentEncryptionAlgorithm.pszObjId), 0 }, + { ASN_CONTEXT | 0, offsetof(CRYPT_ENCRYPTED_CONTENT_INFO, + encryptedContent), CRYPT_AsnDecodeOctetsInternal, + sizeof(CRYPT_DATA_BLOB), TRUE, TRUE, + offsetof(CRYPT_ENCRYPTED_CONTENT_INFO, encryptedContent.pbData) }, + }; + + TRACE("%p, %d, %08x, %p, %d, %p\n", pbEncoded, cbEncoded, dwFlags, + pvStructInfo, *pcbStructInfo, pcbDecoded); + + ret = CRYPT_AsnDecodeSequence(items, sizeof(items) / sizeof(items[0]), + pbEncoded, cbEncoded, dwFlags, NULL, pvStructInfo, pcbStructInfo, + pcbDecoded, info ? info->contentType : NULL); + TRACE("returning %d\n", ret); + return ret; +} + +BOOL CRYPT_AsnDecodePKCSEnvelopedData(const BYTE *pbEncoded, DWORD cbEncoded, + DWORD dwFlags, PCRYPT_DECODE_PARA pDecodePara, + CRYPT_ENVELOPED_DATA *envelopedData, DWORD *pcbEnvelopedData) +{ + BOOL ret; + struct AsnDecodeSequenceItem items[] = { + { ASN_INTEGER, offsetof(CRYPT_ENVELOPED_DATA, version), + CRYPT_AsnDecodeIntInternal, sizeof(DWORD), FALSE, FALSE, 0, 0 }, + { ASN_CONSTRUCTOR | ASN_SETOF, offsetof(CRYPT_ENVELOPED_DATA, + cRecipientInfo), CRYPT_DecodeRecipientInfoArray, + MEMBERSIZE(CRYPT_ENVELOPED_DATA, cRecipientInfo, encryptedContentInfo), + FALSE, TRUE, offsetof(CRYPT_ENVELOPED_DATA, rgRecipientInfo), 0 }, + { ASN_SEQUENCEOF, offsetof(CRYPT_ENVELOPED_DATA, encryptedContentInfo), + CRYPT_AsnDecodeEncryptedContentInfo, + sizeof(CRYPT_ENCRYPTED_CONTENT_INFO), FALSE, TRUE, + offsetof(CRYPT_ENVELOPED_DATA, encryptedContentInfo.contentType), 0 }, + }; + + TRACE("%p, %d, %08x, %p, %p, %d\n", pbEncoded, cbEncoded, dwFlags, + pDecodePara, envelopedData, *pcbEnvelopedData); + + ret = CRYPT_AsnDecodeSequence(items, sizeof(items) / sizeof(items[0]), + pbEncoded, cbEncoded, dwFlags, pDecodePara, envelopedData, + pcbEnvelopedData, NULL, NULL); + TRACE("returning %d\n", ret); + return ret; +} + static CryptDecodeObjectExFunc CRYPT_GetBuiltinDecoder(DWORD dwCertEncodingType, LPCSTR lpszStructType) { @@ -5860,8 +6041,15 @@ BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType, } SetLastError(NOERROR); - if (dwFlags & CRYPT_DECODE_ALLOC_FLAG && pvStructInfo) + if (dwFlags & CRYPT_DECODE_ALLOC_FLAG) + { + if (!pvStructInfo) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } *(BYTE **)pvStructInfo = NULL; + } decodeFunc = CRYPT_GetBuiltinDecoder(dwCertEncodingType, lpszStructType); if (!decodeFunc) { @@ -5889,9 +6077,13 @@ BOOL WINAPI CryptDecodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType, pbEncoded, cbEncoded, dwFlags, NULL, pcbStructInfo); if (ret && (ret = CRYPT_DecodeEnsureSpace(dwFlags, pDecodePara, pvStructInfo, pcbStructInfo, *pcbStructInfo))) + { ret = pCryptDecodeObject(dwCertEncodingType, lpszStructType, pbEncoded, cbEncoded, dwFlags, *(BYTE **)pvStructInfo, pcbStructInfo); + if (!ret) + CRYPT_FreeSpace(pDecodePara, *(BYTE **)pvStructInfo); + } } else ret = pCryptDecodeObject(dwCertEncodingType, lpszStructType, @@ -5945,3 +6137,10 @@ HCERTSTORE WINAPI PFXImportCertStore(CRYPT_DATA_BLOB *pPFX, LPCWSTR szPassword, FIXME_(crypt)("(%p, %p, %08x): stub\n", pPFX, szPassword, dwFlags); return NULL; } + +BOOL WINAPI PFXVerifyPassword(CRYPT_DATA_BLOB *pPFX, LPCWSTR szPassword, + DWORD dwFlags) +{ + FIXME_(crypt)("(%p, %p, %08x): stub\n", pPFX, szPassword, dwFlags); + return FALSE; +} diff --git a/reactos/dll/win32/crypt32/encode.c b/reactos/dll/win32/crypt32/encode.c index c58b0e638e9..75900124601 100644 --- a/reactos/dll/win32/crypt32/encode.c +++ b/reactos/dll/win32/crypt32/encode.c @@ -100,7 +100,7 @@ static BOOL WINAPI CRYPT_AsnEncodePKCSAttributes(DWORD dwCertEncodingType, LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded); -BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, +BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded, DWORD bytesNeeded) { BOOL ret = TRUE; @@ -127,6 +127,14 @@ BOOL CRYPT_EncodeEnsureSpace(DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, return ret; } +static void CRYPT_FreeSpace(const CRYPT_ENCODE_PARA *pEncodePara, LPVOID pv) +{ + if (pEncodePara && pEncodePara->pfnFree) + pEncodePara->pfnFree(pv); + else + LocalFree(pv); +} + BOOL CRYPT_EncodeLen(DWORD len, BYTE *pbEncoded, DWORD *pcbEncoded) { DWORD bytesNeeded, significantBytes = 0; @@ -177,7 +185,7 @@ BOOL WINAPI CRYPT_AsnEncodeSequence(DWORD dwCertEncodingType, DWORD i, dataLen = 0; TRACE("%p, %d, %08x, %p, %p, %d\n", items, cItem, dwFlags, pEncodePara, - pbEncoded, *pcbEncoded); + pbEncoded, pbEncoded ? *pcbEncoded : 0); for (i = 0, ret = TRUE; ret && i < cItem; i++) { ret = items[i].encodeFunc(dwCertEncodingType, NULL, @@ -201,21 +209,26 @@ BOOL WINAPI CRYPT_AsnEncodeSequence(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCE; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCE; + CRYPT_EncodeLen(dataLen, out, &lenBytes); + out += lenBytes; for (i = 0; ret && i < cItem; i++) { ret = items[i].encodeFunc(dwCertEncodingType, NULL, items[i].pvStructInfo, dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, - NULL, pbEncoded, &items[i].size); + NULL, out, &items[i].size); /* Some functions propagate their errors through the size */ if (!ret) *pcbEncoded = items[i].size; - pbEncoded += items[i].size; + out += items[i].size; } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -243,18 +256,23 @@ BOOL WINAPI CRYPT_AsnEncodeConstructed(DWORD dwCertEncodingType, else if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_CONTEXT | ASN_CONSTRUCTOR | item->tag; - CRYPT_EncodeLen(len, pbEncoded, &dataLen); - pbEncoded += dataLen; + out = pbEncoded; + *out++ = ASN_CONTEXT | ASN_CONSTRUCTOR | item->tag; + CRYPT_EncodeLen(len, out, &dataLen); + out += dataLen; ret = item->encodeFunc(dwCertEncodingType, lpszStructType, item->pvStructInfo, dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, NULL, - pbEncoded, &len); + out, &len); if (!ret) { /* Some functions propagate their errors through the size */ *pcbEncoded = len; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -336,7 +354,6 @@ static BOOL WINAPI CRYPT_CopyEncodedBlob(DWORD dwCertEncodingType, if (blob->cbData) memcpy(pbEncoded, blob->pbData, blob->cbData); *pcbEncoded = blob->cbData; - ret = TRUE; } } return ret; @@ -563,7 +580,7 @@ static BOOL CRYPT_AsnEncodeCRLEntry(const CRL_ENTRY *entry, DWORD cItem = 2; BOOL ret; - TRACE("%p, %p, %p\n", entry, pbEncoded, pcbEncoded); + TRACE("%p, %p, %d\n", entry, pbEncoded, pbEncoded ? *pcbEncoded : 0); if (entry->cExtension) { @@ -607,20 +624,24 @@ static BOOL WINAPI CRYPT_AsnEncodeCRLEntries(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, out, &lenBytes); + out += lenBytes; for (i = 0; i < info->cCRLEntry; i++) { DWORD size = dataLen; - ret = CRYPT_AsnEncodeCRLEntry(&rgCRLEntry[i], pbEncoded, - &size); - pbEncoded += size; + ret = CRYPT_AsnEncodeCRLEntry(&rgCRLEntry[i], out, &size); + out += size; dataLen -= size; } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -715,7 +736,7 @@ static BOOL CRYPT_AsnEncodeExtension(CERT_EXTENSION *ext, BYTE *pbEncoded, }; DWORD cItem = 1; - TRACE("%p, %p, %d\n", ext, pbEncoded, *pcbEncoded); + TRACE("%p, %p, %d\n", ext, pbEncoded, pbEncoded ? *pcbEncoded : 0); if (ext->fCritical) { @@ -764,20 +785,25 @@ static BOOL WINAPI CRYPT_AsnEncodeExtensions(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, out, &lenBytes); + out += lenBytes; for (i = 0; i < exts->cExtension; i++) { DWORD size = dataLen; ret = CRYPT_AsnEncodeExtension(&exts->rgExtension[i], - pbEncoded, &size); - pbEncoded += size; + out, &size); + out += size; dataLen -= size; } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -910,7 +936,7 @@ BOOL WINAPI CRYPT_AsnEncodeOid(DWORD dwCertEncodingType, } static BOOL CRYPT_AsnEncodeStringCoerce(const CERT_NAME_VALUE *value, - BYTE tag, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + BYTE tag, DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; @@ -939,7 +965,7 @@ static BOOL CRYPT_AsnEncodeStringCoerce(const CERT_NAME_VALUE *value, } static BOOL CRYPT_AsnEncodeBMPString(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; @@ -979,15 +1005,19 @@ static BOOL CRYPT_AsnEncodeBMPString(const CERT_NAME_VALUE *value, } static BOOL CRYPT_AsnEncodeUTF8String(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; LPCWSTR str = (LPCWSTR)value->Value.pbData; DWORD bytesNeeded, lenBytes, encodedLen, strLen; - strLen = value->Value.cbData ? value->Value.cbData / sizeof(WCHAR) : - strlenW(str); + if (value->Value.cbData) + strLen = value->Value.cbData / sizeof(WCHAR); + else if (str) + strLen = strlenW(str); + else + strLen = 0; encodedLen = WideCharToMultiByte(CP_UTF8, 0, str, strLen, NULL, 0, NULL, NULL); CRYPT_EncodeLen(encodedLen, NULL, &lenBytes); @@ -1194,7 +1224,7 @@ static BOOL WINAPI CRYPT_DEREncodeSet(DWORD dwCertEncodingType, *pbEncoded++ = ASN_CONSTRUCTOR | ASN_SETOF; CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, pbEncoded, &lenBytes); pbEncoded += lenBytes; - for (i = 0; ret && i < set->cBlob; i++) + for (i = 0; i < set->cBlob; i++) { memcpy(pbEncoded, set->rgBlob[i].pbData, set->rgBlob[i].cbData); pbEncoded += set->rgBlob[i].cbData; @@ -1300,13 +1330,15 @@ static BOOL CRYPT_AsnEncodeRdn(DWORD dwCertEncodingType, const CERT_RDN *rdn, ret = TRUE; if (rdn->cRDNAttr) { - setOf.cBlob = rdn->cRDNAttr; setOf.rgBlob = CryptMemAlloc(rdn->cRDNAttr * sizeof(CRYPT_DER_BLOB)); if (!setOf.rgBlob) ret = FALSE; else + { + setOf.cBlob = rdn->cRDNAttr; memset(setOf.rgBlob, 0, setOf.cBlob * sizeof(CRYPT_DER_BLOB)); + } } for (i = 0; ret && i < rdn->cRDNAttr; i++) { @@ -1399,26 +1431,30 @@ static BOOL WINAPI CRYPT_AsnEncodeUnicodeName(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, pbEncoded, - &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, out, &lenBytes); + out += lenBytes; for (i = 0; ret && i < info->cRDN; i++) { size = bytesNeeded; ret = CRYPT_AsnEncodeRdn(dwCertEncodingType, &info->rgRDN[i], CRYPT_AsnEncodeOrCopyUnicodeNameValue, - pbEncoded, &size); + out, &size); if (ret) { - pbEncoded += size; + out += size; bytesNeeded -= size; } else *pcbEncoded = size; } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -1532,20 +1568,25 @@ static BOOL WINAPI CRYPT_AsnEncodeCTLEntries(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, out, &lenBytes); + out += lenBytes; for (i = 0; ret && i < entries->cEntry; i++) { DWORD size = dataLen; ret = CRYPT_AsnEncodeCTLEntry(&entries->rgEntry[i], - pbEncoded, &size); - pbEncoded += size; + out, &size); + out += size; dataLen -= size; } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -1682,21 +1723,26 @@ static BOOL WINAPI CRYPT_AsnEncodeSMIMECapabilities(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, out, &lenBytes); + out += lenBytes; for (i = 0; i < capabilities->cCapability; i++) { DWORD size = dataLen; ret = CRYPT_AsnEncodeSMIMECapability(dwCertEncodingType, NULL, &capabilities->rgCapability[i], 0, NULL, - pbEncoded, &size); - pbEncoded += size; + out, &size); + out += size; dataLen -= size; } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -1737,20 +1783,25 @@ static BOOL WINAPI CRYPT_AsnEncodeNoticeNumbers(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCE; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCE; + CRYPT_EncodeLen(dataLen, out, &lenBytes); + out += lenBytes; for (i = 0; i < noticeRef->cNoticeNumbers; i++) { DWORD size = dataLen; ret = CRYPT_AsnEncodeInt(dwCertEncodingType, X509_INTEGER, - ¬iceRef->rgNoticeNumbers[i], 0, NULL, pbEncoded, &size); - pbEncoded += size; + ¬iceRef->rgNoticeNumbers[i], 0, NULL, out, &size); + out += size; dataLen -= size; } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -1790,7 +1841,6 @@ static BOOL WINAPI CRYPT_AsnEncodePolicyQualifierUserNotice( CERT_NAME_VALUE displayTextValue; DWORD cItem = 0; - ret = TRUE; if (notice->pNoticeReference) { items[cItem].encodeFunc = CRYPT_AsnEncodeNoticeReference; @@ -1940,15 +1990,19 @@ static BOOL WINAPI CRYPT_AsnEncodePKCSContentInfo(DWORD dwCertEncodingType, } static BOOL CRYPT_AsnEncodeUnicodeStringCoerce(const CERT_NAME_VALUE *value, - BYTE tag, DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + BYTE tag, DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; LPCWSTR str = (LPCWSTR)value->Value.pbData; DWORD bytesNeeded, lenBytes, encodedLen; - encodedLen = value->Value.cbData ? value->Value.cbData / sizeof(WCHAR) : - strlenW(str); + if (value->Value.cbData) + encodedLen = value->Value.cbData / sizeof(WCHAR); + else if (str) + encodedLen = strlenW(str); + else + encodedLen = 0; CRYPT_EncodeLen(encodedLen, NULL, &lenBytes); bytesNeeded = 1 + lenBytes + encodedLen; if (!pbEncoded) @@ -1972,24 +2026,20 @@ static BOOL CRYPT_AsnEncodeUnicodeStringCoerce(const CERT_NAME_VALUE *value, return ret; } -static void CRYPT_FreeSpace(PCRYPT_ENCODE_PARA pEncodePara, LPVOID pv) -{ - if (pEncodePara && pEncodePara->pfnFree) - pEncodePara->pfnFree(pv); - else - LocalFree(pv); -} - static BOOL CRYPT_AsnEncodeNumericString(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; LPCWSTR str = (LPCWSTR)value->Value.pbData; DWORD bytesNeeded, lenBytes, encodedLen; - encodedLen = value->Value.cbData ? value->Value.cbData / sizeof(WCHAR) : - strlenW(str); + if (value->Value.cbData) + encodedLen = value->Value.cbData / sizeof(WCHAR); + else if (str) + encodedLen = strlenW(str); + else + encodedLen = 0; CRYPT_EncodeLen(encodedLen, NULL, &lenBytes); bytesNeeded = 1 + lenBytes + encodedLen; if (!pbEncoded) @@ -2035,15 +2085,19 @@ static inline int isprintableW(WCHAR wc) } static BOOL CRYPT_AsnEncodePrintableString(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; LPCWSTR str = (LPCWSTR)value->Value.pbData; DWORD bytesNeeded, lenBytes, encodedLen; - encodedLen = value->Value.cbData ? value->Value.cbData / sizeof(WCHAR) : - strlenW(str); + if (value->Value.cbData) + encodedLen = value->Value.cbData / sizeof(WCHAR); + else if (str) + encodedLen = strlenW(str); + else + encodedLen = 0; CRYPT_EncodeLen(encodedLen, NULL, &lenBytes); bytesNeeded = 1 + lenBytes + encodedLen; if (!pbEncoded) @@ -2082,15 +2136,19 @@ static BOOL CRYPT_AsnEncodePrintableString(const CERT_NAME_VALUE *value, } static BOOL CRYPT_AsnEncodeIA5String(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; LPCWSTR str = (LPCWSTR)value->Value.pbData; DWORD bytesNeeded, lenBytes, encodedLen; - encodedLen = value->Value.cbData ? value->Value.cbData / sizeof(WCHAR) : - strlenW(str); + if (value->Value.cbData) + encodedLen = value->Value.cbData / sizeof(WCHAR); + else if (str) + encodedLen = strlenW(str); + else + encodedLen = 0; CRYPT_EncodeLen(encodedLen, NULL, &lenBytes); bytesNeeded = 1 + lenBytes + encodedLen; if (!pbEncoded) @@ -2129,7 +2187,7 @@ static BOOL CRYPT_AsnEncodeIA5String(const CERT_NAME_VALUE *value, } static BOOL CRYPT_AsnEncodeUniversalString(const CERT_NAME_VALUE *value, - DWORD dwFlags, PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, + DWORD dwFlags, const CRYPT_ENCODE_PARA *pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) { BOOL ret = TRUE; @@ -2137,8 +2195,12 @@ static BOOL CRYPT_AsnEncodeUniversalString(const CERT_NAME_VALUE *value, DWORD bytesNeeded, lenBytes, strLen; /* FIXME: doesn't handle composite characters */ - strLen = value->Value.cbData ? value->Value.cbData / sizeof(WCHAR) : - strlenW(str); + if (value->Value.cbData) + strLen = value->Value.cbData / sizeof(WCHAR); + else if (str) + strLen = strlenW(str); + else + strLen = 0; CRYPT_EncodeLen(strLen * 4, NULL, &lenBytes); bytesNeeded = 1 + lenBytes + strLen * 4; if (!pbEncoded) @@ -2271,24 +2333,27 @@ static BOOL WINAPI CRYPT_AsnEncodeName(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, pbEncoded, - &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, out, &lenBytes); + out += lenBytes; for (i = 0; ret && i < info->cRDN; i++) { size = bytesNeeded; ret = CRYPT_AsnEncodeRdn(dwCertEncodingType, - &info->rgRDN[i], CRYPT_AsnEncodeNameValue, pbEncoded, - &size); + &info->rgRDN[i], CRYPT_AsnEncodeNameValue, out, &size); if (ret) { - pbEncoded += size; + out += size; bytesNeeded -= size; } } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -2540,23 +2605,28 @@ static BOOL WINAPI CRYPT_AsnEncodeAltName(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, out, &lenBytes); + out += lenBytes; for (i = 0; ret && i < info->cAltEntry; i++) { DWORD len = dataLen; ret = CRYPT_AsnEncodeAltNameEntry(dwCertEncodingType, - NULL, &info->rgAltEntry[i], 0, NULL, pbEncoded, &len); + NULL, &info->rgAltEntry[i], 0, NULL, out, &len); if (ret) { - pbEncoded += len; + out += len; dataLen -= len; } } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -2674,20 +2744,25 @@ static BOOL WINAPI CRYPT_AsnEncodeAuthorityInfoAccess(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, out, &lenBytes); + out += lenBytes; for (i = 0; i < info->cAccDescr; i++) { DWORD size = dataLen; ret = CRYPT_AsnEncodeAccessDescription( - &info->rgAccDescr[i], pbEncoded, &size); - pbEncoded += size; + &info->rgAccDescr[i], out, &size); + out += size; dataLen -= size; } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -2819,12 +2894,14 @@ static BOOL WINAPI CRYPT_AsnEncodeCertPolicyQualifiers(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, pbEncoded, - &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, out, &lenBytes); + out += lenBytes; for (i = 0; ret && i < info->cPolicyQualifier; i++) { items[0].pvStructInfo = @@ -2834,14 +2911,15 @@ static BOOL WINAPI CRYPT_AsnEncodeCertPolicyQualifiers(DWORD dwCertEncodingType, size = bytesNeeded; ret = CRYPT_AsnEncodeSequence(dwCertEncodingType, items, sizeof(items) / sizeof(items[0]), - dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, NULL, pbEncoded, - &size); + dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, NULL, out, &size); if (ret) { - pbEncoded += size; + out += size; bytesNeeded -= size; } } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -2900,24 +2978,28 @@ static BOOL WINAPI CRYPT_AsnEncodeCertPolicies(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, pbEncoded, - &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, out, &lenBytes); + out += lenBytes; for (i = 0; ret && i < info->cPolicyInfo; i++) { size = bytesNeeded; ret = CRYPT_AsnEncodeCertPolicy(dwCertEncodingType, &info->rgPolicyInfo[i], - dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, pbEncoded, &size); + dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, out, &size); if (ret) { - pbEncoded += size; + out += size; bytesNeeded -= size; } } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -2979,24 +3061,28 @@ static BOOL WINAPI CRYPT_AsnEncodeCertPolicyMappings(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, pbEncoded, - &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, out, &lenBytes); + out += lenBytes; for (i = 0; ret && i < info->cPolicyMapping; i++) { size = bytesNeeded; ret = CRYPT_AsnEncodeCertPolicyMapping( dwCertEncodingType, &info->rgPolicyMapping[i], - dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, pbEncoded, &size); + dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, out, &size); if (ret) { - pbEncoded += size; + out += size; bytesNeeded -= size; } } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -3108,7 +3194,7 @@ BOOL WINAPI CRYPT_AsnEncodeOctets(DWORD dwCertEncodingType, DWORD bytesNeeded, lenBytes; TRACE("(%d, %p), %08x, %p, %p, %d\n", blob->cbData, blob->pbData, - dwFlags, pEncodePara, pbEncoded, *pcbEncoded); + dwFlags, pEncodePara, pbEncoded, pbEncoded ? *pcbEncoded : 0); CRYPT_EncodeLen(blob->cbData, NULL, &lenBytes); bytesNeeded = 1 + lenBytes + blob->cbData; @@ -3729,23 +3815,28 @@ static BOOL WINAPI CRYPT_AsnEncodeCRLDistPoints(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(dataLen, pbEncoded, &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(dataLen, out, &lenBytes); + out += lenBytes; for (i = 0; ret && i < info->cDistPoint; i++) { DWORD len = dataLen; ret = CRYPT_AsnEncodeDistPoint( - &info->rgDistPoint[i], pbEncoded, &len); + &info->rgDistPoint[i], out, &len); if (ret) { - pbEncoded += len; + out += len; dataLen -= len; } } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -3791,25 +3882,28 @@ static BOOL WINAPI CRYPT_AsnEncodeEnhancedKeyUsage(DWORD dwCertEncodingType, if ((ret = CRYPT_EncodeEnsureSpace(dwFlags, pEncodePara, pbEncoded, pcbEncoded, bytesNeeded))) { + BYTE *out; + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) pbEncoded = *(BYTE **)pbEncoded; - *pbEncoded++ = ASN_SEQUENCEOF; - CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, pbEncoded, - &lenBytes); - pbEncoded += lenBytes; + out = pbEncoded; + *out++ = ASN_SEQUENCEOF; + CRYPT_EncodeLen(bytesNeeded - lenBytes - 1, out, &lenBytes); + out += lenBytes; for (i = 0; ret && i < usage->cUsageIdentifier; i++) { size = bytesNeeded; ret = CRYPT_AsnEncodeOid(dwCertEncodingType, NULL, usage->rgpszUsageIdentifier[i], - dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, NULL, pbEncoded, - &size); + dwFlags & ~CRYPT_ENCODE_ALLOC_FLAG, NULL, out, &size); if (ret) { - pbEncoded += size; + out += size; bytesNeeded -= size; } } + if (!ret && (dwFlags & CRYPT_ENCODE_ALLOC_FLAG)) + CRYPT_FreeSpace(pEncodePara, pbEncoded); } } } @@ -4293,6 +4387,61 @@ BOOL CRYPT_AsnEncodeCMSSignedInfo(CRYPT_SIGNED_INFO *signedInfo, void *pvData, return ret; } +static BOOL WINAPI CRYPT_AsnEncodeRecipientInfo(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + const CMSG_KEY_TRANS_RECIPIENT_INFO *info = pvStructInfo; + struct AsnEncodeSequenceItem items[] = { + { &info->dwVersion, CRYPT_AsnEncodeInt, 0 }, + { &info->RecipientId.u.IssuerSerialNumber, + CRYPT_AsnEncodeIssuerSerialNumber, 0 }, + { &info->KeyEncryptionAlgorithm, + CRYPT_AsnEncodeAlgorithmIdWithNullParams, 0 }, + { &info->EncryptedKey, CRYPT_AsnEncodeOctets, 0 }, + }; + + return CRYPT_AsnEncodeSequence(dwCertEncodingType, items, + sizeof(items) / sizeof(items[0]), dwFlags, pEncodePara, pbEncoded, + pcbEncoded); +} + +static BOOL WINAPI CRYPT_AsnEncodeEncryptedContentInfo(DWORD dwCertEncodingType, + LPCSTR lpszStructType, const void *pvStructInfo, DWORD dwFlags, + PCRYPT_ENCODE_PARA pEncodePara, BYTE *pbEncoded, DWORD *pcbEncoded) +{ + const CRYPT_ENCRYPTED_CONTENT_INFO *info = pvStructInfo; + struct AsnEncodeTagSwappedItem swapped = { ASN_CONTEXT | 0, + &info->encryptedContent, CRYPT_AsnEncodeOctets }; + struct AsnEncodeSequenceItem items[] = { + { info->contentType, CRYPT_AsnEncodeOid, 0 }, + { &info->contentEncryptionAlgorithm, + CRYPT_AsnEncodeAlgorithmIdWithNullParams, 0 }, + { &swapped, CRYPT_AsnEncodeSwapTag, 0 }, + }; + + return CRYPT_AsnEncodeSequence(dwCertEncodingType, items, + sizeof(items) / sizeof(items[0]), dwFlags, pEncodePara, pbEncoded, + pcbEncoded); +} + +BOOL CRYPT_AsnEncodePKCSEnvelopedData(const CRYPT_ENVELOPED_DATA *envelopedData, + void *pvData, DWORD *pcbData) +{ + struct DERSetDescriptor recipientInfosSet = { envelopedData->cRecipientInfo, + envelopedData->rgRecipientInfo, sizeof(CMSG_KEY_TRANS_RECIPIENT_INFO), 0, + CRYPT_AsnEncodeRecipientInfo }; + struct AsnEncodeSequenceItem items[] = { + { &envelopedData->version, CRYPT_AsnEncodeInt, 0 }, + { &recipientInfosSet, CRYPT_DEREncodeItemsAsSet, 0 }, + { &envelopedData->encryptedContentInfo, + CRYPT_AsnEncodeEncryptedContentInfo, 0 }, + }; + + return CRYPT_AsnEncodeSequence(X509_ASN_ENCODING, items, + sizeof(items) / sizeof(items[0]), 0, NULL, pvData, pcbData); +} + static CryptEncodeObjectExFunc CRYPT_GetBuiltinEncoder(DWORD dwCertEncodingType, LPCSTR lpszStructType) { @@ -4573,8 +4722,13 @@ BOOL WINAPI CryptEncodeObjectEx(DWORD dwCertEncodingType, LPCSTR lpszStructType, } SetLastError(NOERROR); - if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG && pvEncoded) + if (dwFlags & CRYPT_ENCODE_ALLOC_FLAG) { + if (!pvEncoded) { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } *(BYTE **)pvEncoded = NULL; + } encodeFunc = CRYPT_GetBuiltinEncoder(dwCertEncodingType, lpszStructType); if (!encodeFunc) { diff --git a/reactos/dll/win32/crypt32/message.c b/reactos/dll/win32/crypt32/message.c index 7551cceeac1..e5b6f2a6bfb 100644 --- a/reactos/dll/win32/crypt32/message.c +++ b/reactos/dll/win32/crypt32/message.c @@ -194,13 +194,13 @@ BOOL WINAPI CryptVerifyMessageSignature(PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara, if (ppSignerCert) *ppSignerCert = NULL; - if (pcbDecoded) - *pcbDecoded = 0; if (!pVerifyPara || pVerifyPara->cbSize != sizeof(CRYPT_VERIFY_MESSAGE_PARA) || GET_CMSG_ENCODING_TYPE(pVerifyPara->dwMsgAndCertEncodingType) != PKCS_7_ASN_ENCODING) { + if(pcbDecoded) + *pcbDecoded = 0; SetLastError(E_INVALIDARG); return FALSE; } @@ -210,9 +210,6 @@ BOOL WINAPI CryptVerifyMessageSignature(PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara, if (msg) { ret = CryptMsgUpdate(msg, pbSignedBlob, cbSignedBlob, TRUE); - if (ret && pcbDecoded) - ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, pbDecoded, - pcbDecoded); if (ret) { CERT_INFO *certInfo = CRYPT_GetSignerCertInfoFromMsg(msg, @@ -244,8 +241,24 @@ BOOL WINAPI CryptVerifyMessageSignature(PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara, } CryptMemFree(certInfo); } + if (ret) + { + /* The caller is expected to pass a valid pointer to pcbDecoded + * when the message verifies successfully. + */ + if (pcbDecoded) + ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, pbDecoded, + pcbDecoded); + else + { + SetLastError(CRYPT_E_NOT_FOUND); + ret = FALSE; + } + } CryptMsgClose(msg); } + if(!ret && pcbDecoded) + *pcbDecoded = 0; TRACE("returning %d\n", ret); return ret; } @@ -402,3 +415,182 @@ BOOL WINAPI CryptVerifyMessageHash(PCRYPT_HASH_MESSAGE_PARA pHashPara, } return ret; } + +BOOL WINAPI CryptSignMessage(PCRYPT_SIGN_MESSAGE_PARA pSignPara, + BOOL fDetachedSignature, DWORD cToBeSigned, const BYTE *rgpbToBeSigned[], + DWORD rgcbToBeSigned[], BYTE *pbSignedBlob, DWORD *pcbSignedBlob) +{ + HCRYPTPROV hCryptProv; + BOOL ret, freeProv = FALSE; + DWORD i, keySpec; + PCERT_BLOB certBlob = NULL; + PCRL_BLOB crlBlob = NULL; + CMSG_SIGNED_ENCODE_INFO signInfo; + CMSG_SIGNER_ENCODE_INFO signer; + HCRYPTMSG msg = 0; + + TRACE("(%p, %d, %d, %p, %p, %p, %p)\n", pSignPara, fDetachedSignature, + cToBeSigned, rgpbToBeSigned, rgcbToBeSigned, pbSignedBlob, pcbSignedBlob); + + if (pSignPara->cbSize != sizeof(CRYPT_SIGN_MESSAGE_PARA) || + GET_CMSG_ENCODING_TYPE(pSignPara->dwMsgEncodingType) != + PKCS_7_ASN_ENCODING) + { + *pcbSignedBlob = 0; + SetLastError(E_INVALIDARG); + return FALSE; + } + if (!pSignPara->pSigningCert) + return TRUE; + + ret = CryptAcquireCertificatePrivateKey(pSignPara->pSigningCert, + CRYPT_ACQUIRE_CACHE_FLAG, NULL, &hCryptProv, &keySpec, &freeProv); + if (!ret) + return FALSE; + + memset(&signer, 0, sizeof(signer)); + signer.cbSize = sizeof(signer); + signer.pCertInfo = pSignPara->pSigningCert->pCertInfo; + signer.hCryptProv = hCryptProv; + signer.dwKeySpec = keySpec; + signer.HashAlgorithm = pSignPara->HashAlgorithm; + signer.pvHashAuxInfo = pSignPara->pvHashAuxInfo; + signer.cAuthAttr = pSignPara->cAuthAttr; + signer.rgAuthAttr = pSignPara->rgAuthAttr; + signer.cUnauthAttr = pSignPara->cUnauthAttr; + signer.rgUnauthAttr = pSignPara->rgUnauthAttr; + + memset(&signInfo, 0, sizeof(signInfo)); + signInfo.cbSize = sizeof(signInfo); + signInfo.cSigners = 1; + signInfo.rgSigners = &signer; + + if (pSignPara->cMsgCert) + { + certBlob = CryptMemAlloc(sizeof(CERT_BLOB) * pSignPara->cMsgCert); + if (certBlob) + { + for (i = 0; i < pSignPara->cMsgCert; ++i) + { + certBlob[i].cbData = pSignPara->rgpMsgCert[i]->cbCertEncoded; + certBlob[i].pbData = pSignPara->rgpMsgCert[i]->pbCertEncoded; + } + signInfo.cCertEncoded = pSignPara->cMsgCert; + signInfo.rgCertEncoded = certBlob; + } + else + ret = FALSE; + } + if (pSignPara->cMsgCrl) + { + crlBlob = CryptMemAlloc(sizeof(CRL_BLOB) * pSignPara->cMsgCrl); + if (crlBlob) + { + for (i = 0; i < pSignPara->cMsgCrl; ++i) + { + crlBlob[i].cbData = pSignPara->rgpMsgCrl[i]->cbCrlEncoded; + crlBlob[i].pbData = pSignPara->rgpMsgCrl[i]->pbCrlEncoded; + } + signInfo.cCrlEncoded = pSignPara->cMsgCrl; + signInfo.rgCrlEncoded = crlBlob; + } + else + ret = FALSE; + } + if (pSignPara->dwFlags || pSignPara->dwInnerContentType) + FIXME("unimplemented feature\n"); + + if (ret) + msg = CryptMsgOpenToEncode(pSignPara->dwMsgEncodingType, + fDetachedSignature ? CMSG_DETACHED_FLAG : 0, CMSG_SIGNED, &signInfo, + NULL, NULL); + if (msg) + { + if (cToBeSigned) + { + for (i = 0; ret && i < cToBeSigned; ++i) + { + ret = CryptMsgUpdate(msg, rgpbToBeSigned[i], rgcbToBeSigned[i], + i == cToBeSigned - 1 ? TRUE : FALSE); + } + } + else + ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + if (ret) + ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, pbSignedBlob, + pcbSignedBlob); + CryptMsgClose(msg); + } + else + ret = FALSE; + + CryptMemFree(crlBlob); + CryptMemFree(certBlob); + if (freeProv) + CryptReleaseContext(hCryptProv, 0); + return ret; +} + +BOOL WINAPI CryptEncryptMessage(PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara, + DWORD cRecipientCert, PCCERT_CONTEXT rgpRecipientCert[], + const BYTE *pbToBeEncrypted, DWORD cbToBeEncrypted, BYTE *pbEncryptedBlob, + DWORD *pcbEncryptedBlob) +{ + BOOL ret = TRUE; + DWORD i; + PCERT_INFO *certInfo = NULL; + CMSG_ENVELOPED_ENCODE_INFO envelopedInfo; + HCRYPTMSG msg = 0; + + TRACE("(%p, %d, %p, %p, %d, %p, %p)\n", pEncryptPara, cRecipientCert, + rgpRecipientCert, pbToBeEncrypted, cbToBeEncrypted, pbEncryptedBlob, + pcbEncryptedBlob); + + if (pEncryptPara->cbSize != sizeof(CRYPT_ENCRYPT_MESSAGE_PARA) || + GET_CMSG_ENCODING_TYPE(pEncryptPara->dwMsgEncodingType) != + PKCS_7_ASN_ENCODING) + { + *pcbEncryptedBlob = 0; + SetLastError(E_INVALIDARG); + return FALSE; + } + + memset(&envelopedInfo, 0, sizeof(envelopedInfo)); + envelopedInfo.cbSize = sizeof(envelopedInfo); + envelopedInfo.hCryptProv = pEncryptPara->hCryptProv; + envelopedInfo.ContentEncryptionAlgorithm = + pEncryptPara->ContentEncryptionAlgorithm; + envelopedInfo.pvEncryptionAuxInfo = pEncryptPara->pvEncryptionAuxInfo; + + if (cRecipientCert) + { + certInfo = CryptMemAlloc(sizeof(PCERT_INFO) * cRecipientCert); + if (certInfo) + { + for (i = 0; i < cRecipientCert; ++i) + certInfo[i] = rgpRecipientCert[i]->pCertInfo; + envelopedInfo.cRecipients = cRecipientCert; + envelopedInfo.rgpRecipientCert = certInfo; + } + else + ret = FALSE; + } + + if (ret) + msg = CryptMsgOpenToEncode(pEncryptPara->dwMsgEncodingType, 0, + CMSG_ENVELOPED, &envelopedInfo, NULL, NULL); + if (msg) + { + ret = CryptMsgUpdate(msg, pbToBeEncrypted, cbToBeEncrypted, TRUE); + if (ret) + ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, pbEncryptedBlob, + pcbEncryptedBlob); + CryptMsgClose(msg); + } + else + ret = FALSE; + + CryptMemFree(certInfo); + if (!ret) *pcbEncryptedBlob = 0; + return ret; +} diff --git a/reactos/dll/win32/crypt32/msg.c b/reactos/dll/win32/crypt32/msg.c index 825b6da96ff..50c1bee9dd7 100644 --- a/reactos/dll/win32/crypt32/msg.c +++ b/reactos/dll/win32/crypt32/msg.c @@ -145,7 +145,7 @@ static BOOL WINAPI CRYPT_EncodeContentLength(DWORD dwCertEncodingType, return ret; } -static BOOL CRYPT_EncodeDataContentInfoHeader(CDataEncodeMsg *msg, +static BOOL CRYPT_EncodeDataContentInfoHeader(const CDataEncodeMsg *msg, CRYPT_DATA_BLOB *header) { BOOL ret; @@ -277,20 +277,15 @@ static BOOL CDataEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, } else { - msg->base.state = MsgStateFinalized; - if (!cbData) - SetLastError(E_INVALIDARG); - else - { - CRYPT_DATA_BLOB blob = { cbData, (LPBYTE)pbData }; + CRYPT_DATA_BLOB blob = { cbData, (LPBYTE)pbData }; - /* non-streamed data messages don't allow non-final updates, - * don't bother checking whether data already exist, they can't. - */ - ret = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_OCTET_STRING, - &blob, CRYPT_ENCODE_ALLOC_FLAG, NULL, &msg->bare_content, - &msg->bare_content_len); - } + msg->base.state = MsgStateFinalized; + /* non-streamed data messages don't allow non-final updates, + * don't bother checking whether data already exist, they can't. + */ + ret = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_OCTET_STRING, + &blob, CRYPT_ENCODE_ALLOC_FLAG, NULL, &msg->bare_content, + &msg->bare_content_len); } } return ret; @@ -623,7 +618,7 @@ typedef struct _CMSG_SIGNED_ENCODE_INFO_WITH_CMS PCERT_BLOB rgAttrCertEncoded; } CMSG_SIGNED_ENCODE_INFO_WITH_CMS, *PCMSG_SIGNED_ENCODE_INFO_WITH_CMS; -static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer) +static BOOL CRYPT_IsValidSigner(const CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer) { if (signer->cbSize != sizeof(CMSG_SIGNER_ENCODE_INFO) && signer->cbSize != sizeof(CMSG_SIGNER_ENCODE_INFO_WITH_CMS)) @@ -720,7 +715,7 @@ static BOOL CRYPT_ConstructBlob(CRYPT_DATA_BLOB *out, const CRYPT_DATA_BLOB *in) } static BOOL CRYPT_ConstructBlobArray(DWORD *outCBlobs, - PCRYPT_DATA_BLOB *outPBlobs, DWORD cBlobs, const PCRYPT_DATA_BLOB pBlobs) + PCRYPT_DATA_BLOB *outPBlobs, DWORD cBlobs, const CRYPT_DATA_BLOB *pBlobs) { BOOL ret = TRUE; @@ -809,9 +804,16 @@ static BOOL CSignerInfo_Construct(CMSG_CMS_SIGNER_INFO *info, &info->SignerId.u.IssuerSerialNumber.SerialNumber, &in->pCertInfo->SerialNumber); info->SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; + info->HashEncryptionAlgorithm.pszObjId = + in->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId; + if (ret) + ret = CRYPT_ConstructBlob(&info->HashEncryptionAlgorithm.Parameters, + &in->pCertInfo->SubjectPublicKeyInfo.Algorithm.Parameters); } else { + const CRYPT_ALGORITHM_IDENTIFIER *pEncrAlg; + /* Implicitly in->cbSize == sizeof(CMSG_SIGNER_ENCODE_INFO_WITH_CMS). * See CRYPT_IsValidSigner. */ @@ -845,6 +847,13 @@ static BOOL CSignerInfo_Construct(CMSG_CMS_SIGNER_INFO *info, ret = CRYPT_ConstructBlob(&info->SignerId.u.KeyId, &in->SignerId.u.KeyId); } + pEncrAlg = in->HashEncryptionAlgorithm.pszObjId ? + &in->HashEncryptionAlgorithm : + &in->pCertInfo->SubjectPublicKeyInfo.Algorithm; + info->HashEncryptionAlgorithm.pszObjId = pEncrAlg->pszObjId; + if (ret) + ret = CRYPT_ConstructBlob(&info->HashEncryptionAlgorithm.Parameters, + &pEncrAlg->Parameters); } /* Assumption: algorithm IDs will point to static strings, not * stack-based ones, so copying the pointer values is safe. @@ -853,8 +862,6 @@ static BOOL CSignerInfo_Construct(CMSG_CMS_SIGNER_INFO *info, if (ret) ret = CRYPT_ConstructBlob(&info->HashAlgorithm.Parameters, &in->HashAlgorithm.Parameters); - memset(&info->HashEncryptionAlgorithm, 0, - sizeof(info->HashEncryptionAlgorithm)); if (ret) ret = CRYPT_ConstructAttributes(&info->AuthAttrs, (CRYPT_ATTRIBUTES *)&in->cAuthAttr); @@ -876,6 +883,7 @@ static void CSignerInfo_Free(CMSG_CMS_SIGNER_INFO *info) else CryptMemFree(info->SignerId.u.KeyId.pbData); CryptMemFree(info->HashAlgorithm.Parameters.pbData); + CryptMemFree(info->HashEncryptionAlgorithm.Parameters.pbData); CryptMemFree(info->EncryptedHash.pbData); for (i = 0; i < info->AuthAttrs.cAttr; i++) { @@ -1448,6 +1456,554 @@ static HCRYPTMSG CSignedEncodeMsg_Open(DWORD dwFlags, return msg; } +typedef struct _CMSG_ENVELOPED_ENCODE_INFO_WITH_CMS +{ + DWORD cbSize; + HCRYPTPROV_LEGACY hCryptProv; + CRYPT_ALGORITHM_IDENTIFIER ContentEncryptionAlgorithm; + void *pvEncryptionAuxInfo; + DWORD cRecipients; + PCERT_INFO *rgpRecipientCert; + PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients; + DWORD cCertEncoded; + PCERT_BLOB rgCertEncoded; + DWORD cCrlEncoded; + PCRL_BLOB rgCrlEncoded; + DWORD cAttrCertEncoded; + PCERT_BLOB rgAttrCertEncoded; + DWORD cUnprotectedAttr; + PCRYPT_ATTRIBUTE rgUnprotectedAttr; +} CMSG_ENVELOPED_ENCODE_INFO_WITH_CMS, *PCMSG_ENVELOPED_ENCODE_INFO_WITH_CMS; + +typedef struct _CEnvelopedEncodeMsg +{ + CryptMsgBase base; + CRYPT_ALGORITHM_IDENTIFIER algo; + HCRYPTPROV prov; + HCRYPTKEY key; + DWORD cRecipientInfo; + CMSG_KEY_TRANS_RECIPIENT_INFO *recipientInfo; + CRYPT_DATA_BLOB data; +} CEnvelopedEncodeMsg; + +static BOOL CRYPT_ConstructAlgorithmId(CRYPT_ALGORITHM_IDENTIFIER *out, + const CRYPT_ALGORITHM_IDENTIFIER *in) +{ + out->pszObjId = CryptMemAlloc(strlen(in->pszObjId) + 1); + if (out->pszObjId) + { + strcpy(out->pszObjId, in->pszObjId); + return CRYPT_ConstructBlob(&out->Parameters, &in->Parameters); + } + else + return FALSE; +} + +static BOOL CRYPT_ConstructBitBlob(CRYPT_BIT_BLOB *out, const CRYPT_BIT_BLOB *in) +{ + out->cbData = in->cbData; + out->cUnusedBits = in->cUnusedBits; + if (out->cbData) + { + out->pbData = CryptMemAlloc(out->cbData); + if (out->pbData) + memcpy(out->pbData, in->pbData, out->cbData); + else + return FALSE; + } + else + out->pbData = NULL; + return TRUE; +} + +static BOOL CRYPT_GenKey(CMSG_CONTENT_ENCRYPT_INFO *info, ALG_ID algID) +{ + static HCRYPTOIDFUNCSET set = NULL; + PFN_CMSG_GEN_CONTENT_ENCRYPT_KEY genKeyFunc = NULL; + HCRYPTOIDFUNCADDR hFunc; + BOOL ret; + + if (!set) + set = CryptInitOIDFunctionSet(CMSG_OID_GEN_CONTENT_ENCRYPT_KEY_FUNC, 0); + CryptGetOIDFunctionAddress(set, X509_ASN_ENCODING, + info->ContentEncryptionAlgorithm.pszObjId, 0, (void **)&genKeyFunc, &hFunc); + if (genKeyFunc) + { + ret = genKeyFunc(info, 0, NULL); + CryptFreeOIDFunctionAddress(hFunc, 0); + } + else + ret = CryptGenKey(info->hCryptProv, algID, CRYPT_EXPORTABLE, + &info->hContentEncryptKey); + return ret; +} + +static BOOL WINAPI CRYPT_ExportKeyTrans( + PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo, + PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO pKeyTransEncodeInfo, + PCMSG_KEY_TRANS_ENCRYPT_INFO pKeyTransEncryptInfo, + DWORD dwFlags, void *pvReserved) +{ + CERT_PUBLIC_KEY_INFO keyInfo; + HCRYPTKEY expKey; + BOOL ret; + + ret = CRYPT_ConstructAlgorithmId(&keyInfo.Algorithm, + &pKeyTransEncodeInfo->KeyEncryptionAlgorithm); + if (ret) + CRYPT_ConstructBitBlob(&keyInfo.PublicKey, + &pKeyTransEncodeInfo->RecipientPublicKey); + + if (ret) + ret = CryptImportPublicKeyInfo(pKeyTransEncodeInfo->hCryptProv, + X509_ASN_ENCODING, &keyInfo, &expKey); + if (ret) + { + DWORD size; + + ret = CryptExportKey(pContentEncryptInfo->hContentEncryptKey, expKey, + SIMPLEBLOB, 0, NULL, &size); + if (ret) + { + BYTE *keyBlob; + + keyBlob = CryptMemAlloc(size); + if (keyBlob) + { + ret = CryptExportKey(pContentEncryptInfo->hContentEncryptKey, + expKey, SIMPLEBLOB, 0, keyBlob, &size); + if (ret) + { + DWORD head = sizeof(BLOBHEADER) + sizeof(ALG_ID); + + pKeyTransEncryptInfo->EncryptedKey.pbData = + CryptMemAlloc(size - head); + if (pKeyTransEncryptInfo->EncryptedKey.pbData) + { + DWORD i, k = 0; + + pKeyTransEncryptInfo->EncryptedKey.cbData = size - head; + for (i = size - 1; i >= head; --i, ++k) + pKeyTransEncryptInfo->EncryptedKey.pbData[k] = + keyBlob[i]; + } + else + ret = FALSE; + } + CryptMemFree(keyBlob); + } + else + ret = FALSE; + } + CryptDestroyKey(expKey); + } + + CryptMemFree(keyInfo.PublicKey.pbData); + CryptMemFree(keyInfo.Algorithm.pszObjId); + CryptMemFree(keyInfo.Algorithm.Parameters.pbData); + return ret; +} + +static BOOL CRYPT_ExportEncryptedKey(CMSG_CONTENT_ENCRYPT_INFO *info, DWORD i, + CRYPT_DATA_BLOB *key) +{ + static HCRYPTOIDFUNCSET set = NULL; + PFN_CMSG_EXPORT_KEY_TRANS exportKeyFunc = NULL; + HCRYPTOIDFUNCADDR hFunc = NULL; + CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO *encodeInfo = + info->rgCmsRecipients[i].u.pKeyTrans; + CMSG_KEY_TRANS_ENCRYPT_INFO encryptInfo; + BOOL ret; + + memset(&encryptInfo, 0, sizeof(encryptInfo)); + encryptInfo.cbSize = sizeof(encryptInfo); + encryptInfo.dwRecipientIndex = i; + ret = CRYPT_ConstructAlgorithmId(&encryptInfo.KeyEncryptionAlgorithm, + &encodeInfo->KeyEncryptionAlgorithm); + + if (!set) + set = CryptInitOIDFunctionSet(CMSG_OID_EXPORT_KEY_TRANS_FUNC, 0); + CryptGetOIDFunctionAddress(set, X509_ASN_ENCODING, + encryptInfo.KeyEncryptionAlgorithm.pszObjId, 0, (void **)&exportKeyFunc, + &hFunc); + if (!exportKeyFunc) + exportKeyFunc = CRYPT_ExportKeyTrans; + if (ret) + { + ret = exportKeyFunc(info, encodeInfo, &encryptInfo, 0, NULL); + if (ret) + { + key->cbData = encryptInfo.EncryptedKey.cbData; + key->pbData = encryptInfo.EncryptedKey.pbData; + } + } + if (hFunc) + CryptFreeOIDFunctionAddress(hFunc, 0); + + CryptMemFree(encryptInfo.KeyEncryptionAlgorithm.pszObjId); + CryptMemFree(encryptInfo.KeyEncryptionAlgorithm.Parameters.pbData); + return ret; +} + +static LPVOID WINAPI mem_alloc(size_t size) +{ + return HeapAlloc(GetProcessHeap(), 0, size); +} + +static VOID WINAPI mem_free(LPVOID pv) +{ + HeapFree(GetProcessHeap(), 0, pv); +} + + +static BOOL CContentEncryptInfo_Construct(CMSG_CONTENT_ENCRYPT_INFO *info, + const CMSG_ENVELOPED_ENCODE_INFO_WITH_CMS *in, HCRYPTPROV prov) +{ + BOOL ret; + + info->cbSize = sizeof(CMSG_CONTENT_ENCRYPT_INFO); + info->hCryptProv = prov; + ret = CRYPT_ConstructAlgorithmId(&info->ContentEncryptionAlgorithm, + &in->ContentEncryptionAlgorithm); + info->pvEncryptionAuxInfo = in->pvEncryptionAuxInfo; + info->cRecipients = in->cRecipients; + if (ret) + { + info->rgCmsRecipients = CryptMemAlloc(in->cRecipients * + sizeof(CMSG_RECIPIENT_ENCODE_INFO)); + if (info->rgCmsRecipients) + { + DWORD i; + + for (i = 0; ret && i < in->cRecipients; ++i) + { + CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO *encodeInfo; + CERT_INFO *cert = in->rgpRecipientCert[i]; + + info->rgCmsRecipients[i].dwRecipientChoice = + CMSG_KEY_TRANS_RECIPIENT; + encodeInfo = CryptMemAlloc(sizeof(*encodeInfo)); + info->rgCmsRecipients[i].u.pKeyTrans = encodeInfo; + if (encodeInfo) + { + encodeInfo->cbSize = sizeof(*encodeInfo); + ret = CRYPT_ConstructAlgorithmId( + &encodeInfo->KeyEncryptionAlgorithm, + &cert->SubjectPublicKeyInfo.Algorithm); + encodeInfo->pvKeyEncryptionAuxInfo = NULL; + encodeInfo->hCryptProv = prov; + if (ret) + ret = CRYPT_ConstructBitBlob( + &encodeInfo->RecipientPublicKey, + &cert->SubjectPublicKeyInfo.PublicKey); + if (ret) + ret = CRYPT_ConstructBlob( + &encodeInfo->RecipientId.u.IssuerSerialNumber.Issuer, + &cert->Issuer); + if (ret) + ret = CRYPT_ConstructBlob( + &encodeInfo->RecipientId.u.IssuerSerialNumber.SerialNumber, + &cert->SerialNumber); + } + else + ret = FALSE; + } + } + else + ret = FALSE; + } + info->pfnAlloc = mem_alloc; + info->pfnFree = mem_free; + return ret; +} + +static void CContentEncryptInfo_Free(CMSG_CONTENT_ENCRYPT_INFO *info) +{ + CryptMemFree(info->ContentEncryptionAlgorithm.pszObjId); + CryptMemFree(info->ContentEncryptionAlgorithm.Parameters.pbData); + if (info->rgCmsRecipients) + { + DWORD i; + + for (i = 0; i < info->cRecipients; ++i) + { + CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO *encodeInfo = + info->rgCmsRecipients[i].u.pKeyTrans; + + CryptMemFree(encodeInfo->KeyEncryptionAlgorithm.pszObjId); + CryptMemFree(encodeInfo->KeyEncryptionAlgorithm.Parameters.pbData); + CryptMemFree(encodeInfo->RecipientPublicKey.pbData); + CryptMemFree( + encodeInfo->RecipientId.u.IssuerSerialNumber.Issuer.pbData); + CryptMemFree( + encodeInfo->RecipientId.u.IssuerSerialNumber.SerialNumber.pbData); + CryptMemFree(encodeInfo); + } + CryptMemFree(info->rgCmsRecipients); + } +} + +static BOOL CRecipientInfo_Construct(CMSG_KEY_TRANS_RECIPIENT_INFO *info, + const CERT_INFO *cert, CRYPT_DATA_BLOB *key) +{ + BOOL ret; + + info->dwVersion = CMSG_KEY_TRANS_PKCS_1_5_VERSION; + info->RecipientId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; + ret = CRYPT_ConstructBlob(&info->RecipientId.u.IssuerSerialNumber.Issuer, + &cert->Issuer); + if (ret) + ret = CRYPT_ConstructBlob( + &info->RecipientId.u.IssuerSerialNumber.SerialNumber, + &cert->SerialNumber); + if (ret) + ret = CRYPT_ConstructAlgorithmId(&info->KeyEncryptionAlgorithm, + &cert->SubjectPublicKeyInfo.Algorithm); + info->EncryptedKey.cbData = key->cbData; + info->EncryptedKey.pbData = key->pbData; + return ret; +} + +static void CRecipientInfo_Free(CMSG_KEY_TRANS_RECIPIENT_INFO *info) +{ + CryptMemFree(info->RecipientId.u.IssuerSerialNumber.Issuer.pbData); + CryptMemFree(info->RecipientId.u.IssuerSerialNumber.SerialNumber.pbData); + CryptMemFree(info->KeyEncryptionAlgorithm.pszObjId); + CryptMemFree(info->KeyEncryptionAlgorithm.Parameters.pbData); + CryptMemFree(info->EncryptedKey.pbData); +} + +static void CEnvelopedEncodeMsg_Close(HCRYPTMSG hCryptMsg) +{ + CEnvelopedEncodeMsg *msg = hCryptMsg; + + CryptMemFree(msg->algo.pszObjId); + CryptMemFree(msg->algo.Parameters.pbData); + if (msg->base.open_flags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG) + CryptReleaseContext(msg->prov, 0); + CryptDestroyKey(msg->key); + if (msg->recipientInfo) + { + DWORD i; + + for (i = 0; i < msg->cRecipientInfo; ++i) + CRecipientInfo_Free(&msg->recipientInfo[i]); + CryptMemFree(msg->recipientInfo); + } + CryptMemFree(msg->data.pbData); +} + +static BOOL CEnvelopedEncodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType, + DWORD dwIndex, void *pvData, DWORD *pcbData) +{ + CEnvelopedEncodeMsg *msg = hCryptMsg; + BOOL ret = FALSE; + + switch (dwParamType) + { + case CMSG_BARE_CONTENT_PARAM: + if (msg->base.streamed) + SetLastError(E_INVALIDARG); + else + { + char oid_rsa_data[] = szOID_RSA_data; + CRYPT_ENVELOPED_DATA envelopedData = { + CMSG_ENVELOPED_DATA_PKCS_1_5_VERSION, msg->cRecipientInfo, + msg->recipientInfo, { oid_rsa_data, msg->algo, msg->data } + }; + + ret = CRYPT_AsnEncodePKCSEnvelopedData(&envelopedData, pvData, + pcbData); + } + break; + case CMSG_CONTENT_PARAM: + { + CRYPT_CONTENT_INFO info; + + ret = CryptMsgGetParam(hCryptMsg, CMSG_BARE_CONTENT_PARAM, 0, NULL, + &info.Content.cbData); + if (ret) + { + info.Content.pbData = CryptMemAlloc(info.Content.cbData); + if (info.Content.pbData) + { + ret = CryptMsgGetParam(hCryptMsg, CMSG_BARE_CONTENT_PARAM, 0, + info.Content.pbData, &info.Content.cbData); + if (ret) + { + char oid_rsa_enveloped[] = szOID_RSA_envelopedData; + + info.pszObjId = oid_rsa_enveloped; + ret = CryptEncodeObjectEx(X509_ASN_ENCODING, + PKCS_CONTENT_INFO, &info, 0, NULL, pvData, pcbData); + } + CryptMemFree(info.Content.pbData); + } + else + ret = FALSE; + } + break; + } + default: + SetLastError(CRYPT_E_INVALID_MSG_TYPE); + } + return ret; +} + +static BOOL CEnvelopedEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, + DWORD cbData, BOOL fFinal) +{ + CEnvelopedEncodeMsg *msg = hCryptMsg; + BOOL ret = FALSE; + + if (msg->base.state == MsgStateFinalized) + SetLastError(CRYPT_E_MSG_ERROR); + else if (msg->base.streamed) + { + FIXME("streamed stub\n"); + msg->base.state = fFinal ? MsgStateFinalized : MsgStateUpdated; + ret = TRUE; + } + else + { + if (!fFinal) + { + if (msg->base.open_flags & CMSG_DETACHED_FLAG) + SetLastError(E_INVALIDARG); + else + SetLastError(CRYPT_E_MSG_ERROR); + } + else + { + if (cbData) + { + DWORD dataLen = cbData; + + msg->data.cbData = cbData; + msg->data.pbData = CryptMemAlloc(cbData); + if (msg->data.pbData) + { + memcpy(msg->data.pbData, pbData, cbData); + ret = CryptEncrypt(msg->key, 0, TRUE, 0, msg->data.pbData, + &dataLen, msg->data.cbData); + msg->data.cbData = dataLen; + if (dataLen > cbData) + { + msg->data.pbData = CryptMemRealloc(msg->data.pbData, + dataLen); + if (msg->data.pbData) + { + dataLen = cbData; + ret = CryptEncrypt(msg->key, 0, TRUE, 0, + msg->data.pbData, &dataLen, msg->data.cbData); + } + else + ret = FALSE; + } + if (!ret) + CryptMemFree(msg->data.pbData); + } + else + ret = FALSE; + if (!ret) + { + msg->data.cbData = 0; + msg->data.pbData = NULL; + } + } + else + ret = TRUE; + msg->base.state = MsgStateFinalized; + } + } + return ret; +} + +static HCRYPTMSG CEnvelopedEncodeMsg_Open(DWORD dwFlags, + const void *pvMsgEncodeInfo, LPCSTR pszInnerContentObjID, + PCMSG_STREAM_INFO pStreamInfo) +{ + CEnvelopedEncodeMsg *msg; + const CMSG_ENVELOPED_ENCODE_INFO_WITH_CMS *info = pvMsgEncodeInfo; + HCRYPTPROV prov; + ALG_ID algID; + + if (info->cbSize != sizeof(CMSG_ENVELOPED_ENCODE_INFO) && + info->cbSize != sizeof(CMSG_ENVELOPED_ENCODE_INFO_WITH_CMS)) + { + SetLastError(E_INVALIDARG); + return NULL; + } + if (info->cbSize == sizeof(CMSG_ENVELOPED_ENCODE_INFO_WITH_CMS)) + FIXME("CMS fields unsupported\n"); + if (!(algID = CertOIDToAlgId(info->ContentEncryptionAlgorithm.pszObjId))) + { + SetLastError(CRYPT_E_UNKNOWN_ALGO); + return NULL; + } + if (info->cRecipients && !info->rgpRecipientCert) + { + SetLastError(E_INVALIDARG); + return NULL; + } + if (info->hCryptProv) + prov = info->hCryptProv; + else + { + prov = CRYPT_GetDefaultProvider(); + dwFlags &= ~CMSG_CRYPT_RELEASE_CONTEXT_FLAG; + } + msg = CryptMemAlloc(sizeof(CEnvelopedEncodeMsg)); + if (msg) + { + CRYPT_DATA_BLOB encryptedKey = { 0, NULL }; + CMSG_CONTENT_ENCRYPT_INFO encryptInfo; + BOOL ret; + DWORD i; + + CryptMsgBase_Init((CryptMsgBase *)msg, dwFlags, pStreamInfo, + CEnvelopedEncodeMsg_Close, CEnvelopedEncodeMsg_GetParam, + CEnvelopedEncodeMsg_Update, CRYPT_DefaultMsgControl); + ret = CRYPT_ConstructAlgorithmId(&msg->algo, + &info->ContentEncryptionAlgorithm); + msg->prov = prov; + msg->data.cbData = 0; + msg->data.pbData = NULL; + msg->cRecipientInfo = info->cRecipients; + msg->recipientInfo = CryptMemAlloc(info->cRecipients * + sizeof(CMSG_KEY_TRANS_RECIPIENT_INFO)); + if (!msg->recipientInfo) + ret = FALSE; + memset(&encryptInfo, 0, sizeof(encryptInfo)); + if (ret) + { + ret = CContentEncryptInfo_Construct(&encryptInfo, info, prov); + if (ret) + { + ret = CRYPT_GenKey(&encryptInfo, algID); + if (ret) + msg->key = encryptInfo.hContentEncryptKey; + } + } + for (i = 0; ret && i < msg->cRecipientInfo; ++i) + { + ret = CRYPT_ExportEncryptedKey(&encryptInfo, i, &encryptedKey); + if (ret) + ret = CRecipientInfo_Construct(&msg->recipientInfo[i], + info->rgpRecipientCert[i], &encryptedKey); + } + CContentEncryptInfo_Free(&encryptInfo); + if (!ret) + { + CryptMsgClose(msg); + msg = NULL; + } + } + if (!msg && (dwFlags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG)) + CryptReleaseContext(prov, 0); + return msg; +} + HCRYPTMSG WINAPI CryptMsgOpenToEncode(DWORD dwMsgEncodingType, DWORD dwFlags, DWORD dwMsgType, const void *pvMsgEncodeInfo, LPSTR pszInnerContentObjID, PCMSG_STREAM_INFO pStreamInfo) @@ -1477,7 +2033,8 @@ HCRYPTMSG WINAPI CryptMsgOpenToEncode(DWORD dwMsgEncodingType, DWORD dwFlags, pszInnerContentObjID, pStreamInfo); break; case CMSG_ENVELOPED: - FIXME("unimplemented for type CMSG_ENVELOPED\n"); + msg = CEnvelopedEncodeMsg_Open(dwFlags, pvMsgEncodeInfo, + pszInnerContentObjID, pStreamInfo); break; case CMSG_SIGNED_AND_ENVELOPED: case CMSG_ENCRYPTED: @@ -1488,14 +2045,23 @@ HCRYPTMSG WINAPI CryptMsgOpenToEncode(DWORD dwMsgEncodingType, DWORD dwFlags, return msg; } +typedef struct _CEnvelopedDecodeMsg +{ + CRYPT_ENVELOPED_DATA *data; + HCRYPTPROV crypt_prov; + CRYPT_DATA_BLOB content; + BOOL decrypted; +} CEnvelopedDecodeMsg; + typedef struct _CDecodeMsg { CryptMsgBase base; DWORD type; HCRYPTPROV crypt_prov; union { - HCRYPTHASH hash; - CSignedMsgData signed_data; + HCRYPTHASH hash; + CSignedMsgData signed_data; + CEnvelopedDecodeMsg enveloped_data; } u; CRYPT_DATA_BLOB msg_data; CRYPT_DATA_BLOB detached_data; @@ -1514,6 +2080,12 @@ static void CDecodeMsg_Close(HCRYPTMSG hCryptMsg) if (msg->u.hash) CryptDestroyHash(msg->u.hash); break; + case CMSG_ENVELOPED: + if (msg->u.enveloped_data.crypt_prov) + CryptReleaseContext(msg->u.enveloped_data.crypt_prov, 0); + LocalFree(msg->u.enveloped_data.data); + CryptMemFree(msg->u.enveloped_data.content.pbData); + break; case CMSG_SIGNED: if (msg->u.signed_data.info) { @@ -1646,8 +2218,23 @@ static BOOL CDecodeMsg_DecodeHashedContent(CDecodeMsg *msg, return ret; } +static BOOL CDecodeMsg_DecodeEnvelopedContent(CDecodeMsg *msg, + const CRYPT_DER_BLOB *blob) +{ + BOOL ret; + CRYPT_ENVELOPED_DATA *envelopedData; + DWORD size; + + ret = CRYPT_AsnDecodePKCSEnvelopedData(blob->pbData, blob->cbData, + CRYPT_DECODE_ALLOC_FLAG, NULL, (CRYPT_ENVELOPED_DATA *)&envelopedData, + &size); + if (ret) + msg->u.enveloped_data.data = envelopedData; + return ret; +} + static BOOL CDecodeMsg_DecodeSignedContent(CDecodeMsg *msg, - CRYPT_DER_BLOB *blob) + const CRYPT_DER_BLOB *blob) { BOOL ret; CRYPT_SIGNED_INFO *signedInfo; @@ -1666,7 +2253,7 @@ static BOOL CDecodeMsg_DecodeSignedContent(CDecodeMsg *msg, * It doesn't just use msg's type, to allow a recursive call from an implicitly * typed message once the outer content info has been decoded. */ -static BOOL CDecodeMsg_DecodeContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob, +static BOOL CDecodeMsg_DecodeContent(CDecodeMsg *msg, const CRYPT_DER_BLOB *blob, DWORD type) { BOOL ret; @@ -1682,8 +2269,8 @@ static BOOL CDecodeMsg_DecodeContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob, msg->type = CMSG_HASHED; break; case CMSG_ENVELOPED: - FIXME("unimplemented for type CMSG_ENVELOPED\n"); - ret = TRUE; + if ((ret = CDecodeMsg_DecodeEnvelopedContent(msg, blob))) + msg->type = CMSG_ENVELOPED; break; case CMSG_SIGNED: if ((ret = CDecodeMsg_DecodeSignedContent(msg, blob))) @@ -1759,6 +2346,20 @@ static BOOL CDecodeMsg_FinalizeHashedContent(CDecodeMsg *msg, return ret; } +static BOOL CDecodeMsg_FinalizeEnvelopedContent(CDecodeMsg *msg, + CRYPT_DER_BLOB *blob) +{ + CRYPT_DATA_BLOB *content; + + if (msg->base.open_flags & CMSG_DETACHED_FLAG) + content = &msg->detached_data; + else + content = + &msg->u.enveloped_data.data->encryptedContentInfo.encryptedContent; + + return CRYPT_ConstructBlob(&msg->u.enveloped_data.content, content); +} + static BOOL CDecodeMsg_FinalizeSignedContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob) { @@ -1820,6 +2421,9 @@ static BOOL CDecodeMsg_FinalizeContent(CDecodeMsg *msg, CRYPT_DER_BLOB *blob) case CMSG_HASHED: ret = CDecodeMsg_FinalizeHashedContent(msg, blob); break; + case CMSG_ENVELOPED: + ret = CDecodeMsg_FinalizeEnvelopedContent(msg, blob); + break; case CMSG_SIGNED: ret = CDecodeMsg_FinalizeSignedContent(msg, blob); break; @@ -2277,6 +2881,89 @@ static BOOL CRYPT_CopySignerCertInfo(void *pvData, DWORD *pcbData, return ret; } +static BOOL CRYPT_CopyRecipientInfo(void *pvData, DWORD *pcbData, + const CERT_ISSUER_SERIAL_NUMBER *in) +{ + DWORD size = sizeof(CERT_INFO); + BOOL ret; + + TRACE("(%p, %d, %p)\n", pvData, pvData ? *pcbData : 0, in); + + size += in->SerialNumber.cbData; + size += in->Issuer.cbData; + if (!pvData) + { + *pcbData = size; + ret = TRUE; + } + else if (*pcbData < size) + { + *pcbData = size; + SetLastError(ERROR_MORE_DATA); + ret = FALSE; + } + else + { + LPBYTE nextData = (BYTE *)pvData + sizeof(CERT_INFO); + CERT_INFO *out = pvData; + + CRYPT_CopyBlob(&out->SerialNumber, &in->SerialNumber, &nextData); + CRYPT_CopyBlob(&out->Issuer, &in->Issuer, &nextData); + ret = TRUE; + } + TRACE("returning %d\n", ret); + return ret; +} + +static BOOL CDecodeEnvelopedMsg_GetParam(CDecodeMsg *msg, DWORD dwParamType, + DWORD dwIndex, void *pvData, DWORD *pcbData) +{ + BOOL ret = FALSE; + + switch (dwParamType) + { + case CMSG_TYPE_PARAM: + ret = CRYPT_CopyParam(pvData, pcbData, &msg->type, sizeof(msg->type)); + break; + case CMSG_CONTENT_PARAM: + if (msg->u.enveloped_data.data) + ret = CRYPT_CopyParam(pvData, pcbData, + msg->u.enveloped_data.content.pbData, + msg->u.enveloped_data.content.cbData); + else + SetLastError(CRYPT_E_INVALID_MSG_TYPE); + break; + case CMSG_RECIPIENT_COUNT_PARAM: + if (msg->u.enveloped_data.data) + ret = CRYPT_CopyParam(pvData, pcbData, + &msg->u.enveloped_data.data->cRecipientInfo, sizeof(DWORD)); + else + SetLastError(CRYPT_E_INVALID_MSG_TYPE); + break; + case CMSG_RECIPIENT_INFO_PARAM: + if (msg->u.enveloped_data.data) + { + if (dwIndex < msg->u.enveloped_data.data->cRecipientInfo) + { + PCMSG_KEY_TRANS_RECIPIENT_INFO recipientInfo = + &msg->u.enveloped_data.data->rgRecipientInfo[dwIndex]; + + ret = CRYPT_CopyRecipientInfo(pvData, pcbData, + &recipientInfo->RecipientId.u.IssuerSerialNumber); + } + else + SetLastError(CRYPT_E_INVALID_INDEX); + } + else + SetLastError(CRYPT_E_INVALID_MSG_TYPE); + break; + default: + FIXME("unimplemented for %d\n", dwParamType); + SetLastError(CRYPT_E_INVALID_MSG_TYPE); + } + return ret; +} + static BOOL CDecodeSignedMsg_GetParam(CDecodeMsg *msg, DWORD dwParamType, DWORD dwIndex, void *pvData, DWORD *pcbData) { @@ -2469,6 +3156,10 @@ static BOOL CDecodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType, ret = CDecodeHashMsg_GetParam(msg, dwParamType, dwIndex, pvData, pcbData); break; + case CMSG_ENVELOPED: + ret = CDecodeEnvelopedMsg_GetParam(msg, dwParamType, dwIndex, pvData, + pcbData); + break; case CMSG_SIGNED: ret = CDecodeSignedMsg_GetParam(msg, dwParamType, dwIndex, pvData, pcbData); @@ -2653,6 +3344,118 @@ static BOOL CDecodeSignedMsg_VerifySignatureEx(CDecodeMsg *msg, return ret; } +static BOOL WINAPI CRYPT_ImportKeyTrans( + PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm, + PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara, DWORD dwFlags, + void *pvReserved, HCRYPTKEY *phContentEncryptKey) +{ + BOOL ret; + HCRYPTKEY key; + + ret = CryptGetUserKey(pKeyTransDecryptPara->hCryptProv, + pKeyTransDecryptPara->dwKeySpec ? pKeyTransDecryptPara->dwKeySpec : + AT_KEYEXCHANGE, &key); + if (ret) + { + CMSG_KEY_TRANS_RECIPIENT_INFO *info = + &pKeyTransDecryptPara->pKeyTrans[pKeyTransDecryptPara->dwRecipientIndex]; + CRYPT_DATA_BLOB *encryptedKey = &info->EncryptedKey; + DWORD size = encryptedKey->cbData + sizeof(BLOBHEADER) + sizeof(ALG_ID); + BYTE *keyBlob = CryptMemAlloc(size); + + if (keyBlob) + { + DWORD i, k = size - 1; + BLOBHEADER *blobHeader = (BLOBHEADER *)keyBlob; + ALG_ID *algID = (ALG_ID *)(keyBlob + sizeof(BLOBHEADER)); + + blobHeader->bType = SIMPLEBLOB; + blobHeader->bVersion = CUR_BLOB_VERSION; + blobHeader->reserved = 0; + blobHeader->aiKeyAlg = CertOIDToAlgId( + pContentEncryptionAlgorithm->pszObjId); + *algID = CertOIDToAlgId(info->KeyEncryptionAlgorithm.pszObjId); + for (i = 0; i < encryptedKey->cbData; ++i, --k) + keyBlob[k] = encryptedKey->pbData[i]; + + ret = CryptImportKey(pKeyTransDecryptPara->hCryptProv, keyBlob, + size, key, 0, phContentEncryptKey); + CryptMemFree(keyBlob); + } + else + ret = FALSE; + CryptDestroyKey(key); + } + return ret; +} + +static BOOL CRYPT_ImportEncryptedKey(PCRYPT_ALGORITHM_IDENTIFIER contEncrAlg, + PCMSG_CTRL_DECRYPT_PARA para, PCMSG_KEY_TRANS_RECIPIENT_INFO info, + HCRYPTKEY *key) +{ + static HCRYPTOIDFUNCSET set = NULL; + PFN_CMSG_IMPORT_KEY_TRANS importKeyFunc = NULL; + HCRYPTOIDFUNCADDR hFunc = NULL; + CMSG_CTRL_KEY_TRANS_DECRYPT_PARA decryptPara; + BOOL ret; + + memset(&decryptPara, 0, sizeof(decryptPara)); + decryptPara.cbSize = sizeof(decryptPara); + decryptPara.hCryptProv = para->hCryptProv; + decryptPara.dwKeySpec = para->dwKeySpec; + decryptPara.pKeyTrans = info; + decryptPara.dwRecipientIndex = para->dwRecipientIndex; + + if (!set) + set = CryptInitOIDFunctionSet(CMSG_OID_IMPORT_KEY_TRANS_FUNC, 0); + CryptGetOIDFunctionAddress(set, X509_ASN_ENCODING, contEncrAlg->pszObjId, 0, + (void **)&importKeyFunc, &hFunc); + if (!importKeyFunc) + importKeyFunc = CRYPT_ImportKeyTrans; + ret = importKeyFunc(contEncrAlg, &decryptPara, 0, NULL, key); + if (hFunc) + CryptFreeOIDFunctionAddress(hFunc, 0); + return ret; +} + +static BOOL CDecodeEnvelopedMsg_CrtlDecrypt(CDecodeMsg *msg, + PCMSG_CTRL_DECRYPT_PARA para) +{ + BOOL ret = FALSE; + CEnvelopedDecodeMsg *enveloped_data = &msg->u.enveloped_data; + CRYPT_ENVELOPED_DATA *data = enveloped_data->data; + + if (para->cbSize != sizeof(CMSG_CTRL_DECRYPT_PARA)) + SetLastError(E_INVALIDARG); + else if (!data) + SetLastError(CRYPT_E_INVALID_MSG_TYPE); + else if (para->dwRecipientIndex >= data->cRecipientInfo) + SetLastError(CRYPT_E_INVALID_INDEX); + else if (enveloped_data->decrypted) + SetLastError(CRYPT_E_ALREADY_DECRYPTED); + else if (!para->hCryptProv) + SetLastError(ERROR_INVALID_PARAMETER); + else if (enveloped_data->content.cbData) + { + HCRYPTKEY key; + + ret = CRYPT_ImportEncryptedKey( + &data->encryptedContentInfo.contentEncryptionAlgorithm, para, + data->rgRecipientInfo, &key); + if (ret) + { + ret = CryptDecrypt(key, 0, TRUE, 0, enveloped_data->content.pbData, + &enveloped_data->content.cbData); + CryptDestroyKey(key); + } + } + else + ret = TRUE; + if (ret) + enveloped_data->decrypted = TRUE; + return ret; +} + static BOOL CDecodeMsg_Control(HCRYPTMSG hCryptMsg, DWORD dwFlags, DWORD dwCtrlType, const void *pvCtrlPara) { @@ -2674,6 +3477,13 @@ static BOOL CDecodeMsg_Control(HCRYPTMSG hCryptMsg, DWORD dwFlags, case CMSG_CTRL_DECRYPT: switch (msg->type) { + case CMSG_ENVELOPED: + ret = CDecodeEnvelopedMsg_CrtlDecrypt(msg, + (PCMSG_CTRL_DECRYPT_PARA)pvCtrlPara); + if (ret && (dwFlags & CMSG_CRYPT_RELEASE_CONTEXT_FLAG)) + msg->u.enveloped_data.crypt_prov = + ((PCMSG_CTRL_DECRYPT_PARA)pvCtrlPara)->hCryptProv; + break; default: SetLastError(CRYPT_E_INVALID_MSG_TYPE); } diff --git a/reactos/dll/win32/crypt32/object.c b/reactos/dll/win32/crypt32/object.c index b3f82936172..cff96f9c0da 100644 --- a/reactos/dll/win32/crypt32/object.c +++ b/reactos/dll/win32/crypt32/object.c @@ -672,8 +672,7 @@ static BOOL CRYPT_QueryEmbeddedMessageObject(DWORD dwObjectType, pdwMsgAndCertEncodingType, NULL, NULL, phCertStore, phMsg); if (ret && pdwContentType) - *pdwContentType = - CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED; + *pdwContentType = CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED; } CryptMemFree(blob.pbData); } @@ -1112,7 +1111,6 @@ static BOOL WINAPI CRYPT_FormatBasicConstraints2(DWORD dwCertEncodingType, strcpyW(str, pathLengthHeader); str += strlenW(pathLengthHeader); strcpyW(str, pathLength); - str += strlenW(pathLength); } LocalFree(info); } @@ -1170,7 +1168,7 @@ static const WCHAR indent[] = { ' ',' ',' ',' ',' ',0 }; static const WCHAR colonCrlf[] = { ':','\r','\n',0 }; static BOOL CRYPT_FormatAltNameEntry(DWORD dwFormatStrType, DWORD indentLevel, - CERT_ALT_NAME_ENTRY *entry, LPWSTR str, DWORD *pcbStr) + const CERT_ALT_NAME_ENTRY *entry, LPWSTR str, DWORD *pcbStr) { BOOL ret; WCHAR buf[MAX_STRING_RESOURCE_LEN]; @@ -1354,7 +1352,7 @@ static BOOL CRYPT_FormatAltNameEntry(DWORD dwFormatStrType, DWORD indentLevel, } static BOOL CRYPT_FormatAltNameInfo(DWORD dwFormatStrType, DWORD indentLevel, - CERT_ALT_NAME_INFO *name, LPWSTR str, DWORD *pcbStr) + const CERT_ALT_NAME_INFO *name, LPWSTR str, DWORD *pcbStr) { DWORD i, size, bytesNeeded = 0; BOOL ret = TRUE; @@ -1437,7 +1435,7 @@ static BOOL WINAPI CRYPT_FormatAltName(DWORD dwCertEncodingType, } static BOOL CRYPT_FormatCertIssuer(DWORD dwFormatStrType, - CERT_ALT_NAME_INFO *issuer, LPWSTR str, DWORD *pcbStr) + const CERT_ALT_NAME_INFO *issuer, LPWSTR str, DWORD *pcbStr) { WCHAR buf[MAX_STRING_RESOURCE_LEN]; DWORD bytesNeeded, sepLen; @@ -2469,7 +2467,6 @@ static BOOL WINAPI CRYPT_FormatSpcFinancialCriteria(DWORD dwCertEncodingType, else { strcpyW(str, notAvailable); - str += strlenW(notAvailable); } } } diff --git a/reactos/dll/win32/crypt32/oid.c b/reactos/dll/win32/crypt32/oid.c index ea7b539208b..932bba290b2 100644 --- a/reactos/dll/win32/crypt32/oid.c +++ b/reactos/dll/win32/crypt32/oid.c @@ -37,21 +37,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(crypt); static const WCHAR DllW[] = { 'D','l','l',0 }; -static void init_oid_info(void); -static void free_function_sets(void); -static void free_oid_info(void); - -void crypt_oid_init(void) -{ - init_oid_info(); -} - -void crypt_oid_free(void) -{ - free_function_sets(); - free_oid_info(); -} - static CRITICAL_SECTION funcSetCS; static CRITICAL_SECTION_DEBUG funcSetCSDebug = { @@ -107,6 +92,7 @@ static void free_function_sets(void) DeleteCriticalSection(&setCursor->cs); CryptMemFree(setCursor); } + DeleteCriticalSection(&funcSetCS); } /* There is no free function associated with this; therefore, the sets are @@ -591,7 +577,7 @@ BOOL WINAPI CryptGetDefaultOIDFunctionAddress(HCRYPTOIDFUNCSET hFuncSet, * CryptRegisterOIDFunction (CRYPT32.@) * * Register the DLL and the functions it uses to cover the combination - * of encoding type, functionname and OID. + * of encoding type, function name and OID. * * PARAMS * dwEncodingType [I] Encoding type to be used. @@ -614,8 +600,8 @@ BOOL WINAPI CryptRegisterOIDFunction(DWORD dwEncodingType, LPCSTR pszFuncName, HKEY hKey; LPSTR szKey; - TRACE("(%x, %s, %s, %s, %s)\n", dwEncodingType, pszFuncName, - debugstr_a(pszOID), debugstr_w(pwszDll), pszOverrideFuncName); + TRACE("(%x, %s, %s, %s, %s)\n", dwEncodingType, debugstr_a(pszFuncName), + debugstr_a(pszOID), debugstr_w(pwszDll), debugstr_a(pszOverrideFuncName)); /* Native does nothing pwszDll is NULL */ if (!pwszDll) @@ -1476,6 +1462,7 @@ static void free_oid_info(void) list_remove(&info->entry); CryptMemFree(info); } + DeleteCriticalSection(&oidInfoCS); } /*********************************************************************** @@ -1618,3 +1605,14 @@ DWORD WINAPI CertOIDToAlgId(LPCSTR pszObjId) ret = 0; return ret; } + +void crypt_oid_init(void) +{ + init_oid_info(); +} + +void crypt_oid_free(void) +{ + free_function_sets(); + free_oid_info(); +} diff --git a/reactos/dll/win32/crypt32/protectdata.c b/reactos/dll/win32/crypt32/protectdata.c index a7351bb1b29..20e11f457c8 100644 --- a/reactos/dll/win32/crypt32/protectdata.c +++ b/reactos/dll/win32/crypt32/protectdata.c @@ -722,8 +722,8 @@ BOOL load_encryption_key(HCRYPTPROV hProv, DWORD key_len, const DATA_BLOB *salt, /* This should be the "logon credentials" instead of username */ dwError=GetLastError(); dwUsernameLen = 0; - if (!GetUserNameA(NULL,&dwUsernameLen) && - GetLastError()==ERROR_MORE_DATA && dwUsernameLen && + if (!GetUserNameA(NULL, &dwUsernameLen) && + GetLastError() == ERROR_INSUFFICIENT_BUFFER && dwUsernameLen && (szUsername = CryptMemAlloc(dwUsernameLen))) { szUsername[0]='\0'; diff --git a/reactos/dll/win32/crypt32/rootstore.c b/reactos/dll/win32/crypt32/rootstore.c index 70b5ef80a3a..386bc9bb99b 100644 --- a/reactos/dll/win32/crypt32/rootstore.c +++ b/reactos/dll/win32/crypt32/rootstore.c @@ -31,6 +31,9 @@ #endif #include #include +#ifdef HAVE_SECURITY_SECURITY_H +#include +#endif #include "ntstatus.h" #define WIN32_NO_STATUS #include "windef.h" @@ -40,9 +43,6 @@ #include "winternl.h" #include "wine/debug.h" #include "crypt32_private.h" -#ifdef __APPLE__ -#include -#endif WINE_DEFAULT_DEBUG_CHANNEL(crypt); @@ -326,6 +326,32 @@ static BOOL import_certs_from_file(int fd, HCERTSTORE store) static BOOL import_certs_from_path(LPCSTR path, HCERTSTORE store, BOOL allow_dir); +static BOOL check_buffer_resize(char **ptr_buf, size_t *buf_size, size_t check_size) +{ + if (check_size > *buf_size) + { + *buf_size = check_size; + + if (*ptr_buf) + { + char *realloc_buf = CryptMemRealloc(*ptr_buf, *buf_size); + + if (!realloc_buf) + return FALSE; + + *ptr_buf = realloc_buf; + } + else + { + *ptr_buf = CryptMemAlloc(*buf_size); + if (!*ptr_buf) + return FALSE; + } + } + + return TRUE; +} + /* Opens path, which must be a directory, and imports certificates from every * file in the directory into store. * Returns TRUE if any certificates were successfully imported. @@ -341,23 +367,27 @@ static BOOL import_certs_from_dir(LPCSTR path, HCERTSTORE store) dir = opendir(path); if (dir) { - size_t bufsize = strlen(path) + 1 + PATH_MAX + 1; - char *filebuf = CryptMemAlloc(bufsize); + size_t path_len = strlen(path), bufsize = 0; + char *filebuf = NULL; - if (filebuf) + struct dirent *entry; + while ((entry = readdir(dir))) { - struct dirent *entry; - while ((entry = readdir(dir))) + if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) { - if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) + size_t name_len = strlen(entry->d_name); + + if (!check_buffer_resize(&filebuf, &bufsize, path_len + 1 + name_len + 1)) { - snprintf(filebuf, bufsize, "%s/%s", path, entry->d_name); - if (import_certs_from_path(filebuf, store, FALSE) && !ret) - ret = TRUE; + ERR("Path buffer (re)allocation failed with out of memory condition\n"); + break; } + snprintf(filebuf, bufsize, "%s/%s", path, entry->d_name); + if (import_certs_from_path(filebuf, store, FALSE) && !ret) + ret = TRUE; } - CryptMemFree(filebuf); } + CryptMemFree(filebuf); closedir(dir); } return ret; @@ -456,6 +486,7 @@ static const char * const CRYPT_knownLocations[] = { "/etc/ssl/certs", "/etc/pki/tls/certs/ca-bundle.crt", "/usr/local/share/certs/", + "/etc/sfw/openssl/certs", }; static const BYTE authenticode[] = { @@ -716,7 +747,7 @@ static void read_trusted_roots_from_known_locations(HCERTSTORE store) DWORD i; BOOL ret = FALSE; -#ifdef __APPLE__ +#ifdef HAVE_SECURITY_SECURITY_H OSStatus status; CFArrayRef rootCerts; diff --git a/reactos/dll/win32/crypt32/serialize.c b/reactos/dll/win32/crypt32/serialize.c index ab4c48abdc4..5b6b7940862 100644 --- a/reactos/dll/win32/crypt32/serialize.c +++ b/reactos/dll/win32/crypt32/serialize.c @@ -167,7 +167,7 @@ BOOL WINAPI CertSerializeCTLStoreElement(PCCTL_CONTEXT pCtlContext, /* Looks for the property with ID propID in the buffer buf. Returns a pointer * to its header if a valid header is found, NULL if not. Valid means the - * length of thte property won't overrun buf, and the unknown field is 1. + * length of the property won't overrun buf, and the unknown field is 1. */ static const WINE_CERT_PROP_HEADER *CRYPT_findPropID(const BYTE *buf, DWORD size, DWORD propID) diff --git a/reactos/dll/win32/crypt32/sip.c b/reactos/dll/win32/crypt32/sip.c index e207457a7b7..e43ebc7a74c 100644 --- a/reactos/dll/win32/crypt32/sip.c +++ b/reactos/dll/win32/crypt32/sip.c @@ -616,6 +616,7 @@ void crypt_sip_free(void) FreeLibrary(prov->info.hSIP); CryptMemFree(prov); } + DeleteCriticalSection(&providers_cs); } /* Loads the SIP for pgSubject into the global cache. Returns FALSE if the @@ -715,6 +716,11 @@ BOOL WINAPI CryptSIPCreateIndirectData(SIP_SUBJECTINFO* pSubjectInfo, DWORD* pcb TRACE("(%p %p %p)\n", pSubjectInfo, pcbIndirectData, pIndirectData); + if (!pSubjectInfo || !pSubjectInfo->pgSubjectType || !pcbIndirectData) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } if ((sip = CRYPT_GetCachedSIP(pSubjectInfo->pgSubjectType))) ret = sip->info.pfCreate(pSubjectInfo, pcbIndirectData, pIndirectData); TRACE("returning %d\n", ret); diff --git a/reactos/dll/win32/crypt32/store.c b/reactos/dll/win32/crypt32/store.c index df12e3e8ad3..b540e6189f5 100644 --- a/reactos/dll/win32/crypt32/store.c +++ b/reactos/dll/win32/crypt32/store.c @@ -1465,3 +1465,15 @@ BOOL WINAPI CertEnumPhysicalStore(const void *pvSystemStore, DWORD dwFlags, pfnEnum); return FALSE; } + +BOOL WINAPI CertRegisterPhysicalStore(const void *pvSystemStore, DWORD dwFlags, + LPCWSTR pwszStoreName, PCERT_PHYSICAL_STORE_INFO pStoreInfo, void *pvReserved) +{ + if (dwFlags & CERT_SYSTEM_STORE_RELOCATE_FLAG) + FIXME("(%p, %08x, %s, %p, %p): stub\n", pvSystemStore, dwFlags, + debugstr_w(pwszStoreName), pStoreInfo, pvReserved); + else + FIXME("(%s, %08x, %s, %p, %p): stub\n", debugstr_w(pvSystemStore), + dwFlags, debugstr_w(pwszStoreName), pStoreInfo, pvReserved); + return FALSE; +} diff --git a/reactos/dll/win32/crypt32/str.c b/reactos/dll/win32/crypt32/str.c index 758abc9c072..6d406d2753a 100644 --- a/reactos/dll/win32/crypt32/str.c +++ b/reactos/dll/win32/crypt32/str.c @@ -32,7 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(crypt); DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, LPSTR psz, DWORD csz) { - DWORD ret = 0; + DWORD ret = 0, len; TRACE("(%d, %p, %p, %d)\n", dwValueType, pValue, psz, csz); @@ -48,11 +48,12 @@ DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, case CERT_RDN_GRAPHIC_STRING: case CERT_RDN_VISIBLE_STRING: case CERT_RDN_GENERAL_STRING: + len = pValue->cbData; if (!psz || !csz) - ret = pValue->cbData; + ret = len; else { - DWORD chars = min(pValue->cbData, csz - 1); + DWORD chars = min(len, csz - 1); if (chars) { @@ -62,15 +63,22 @@ DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, } } break; + case CERT_RDN_BMP_STRING: case CERT_RDN_UTF8_STRING: + len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pValue->pbData, + pValue->cbData / sizeof(WCHAR), NULL, 0, NULL, NULL); if (!psz || !csz) - ret = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)pValue->pbData, - pValue->cbData / sizeof(WCHAR) + 1, NULL, 0, NULL, NULL); + ret = len; else { - ret = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)pValue->pbData, - pValue->cbData / sizeof(WCHAR) + 1, psz, csz - 1, NULL, NULL); - csz -= ret; + DWORD chars = min(pValue->cbData / sizeof(WCHAR), csz - 1); + + if (chars) + { + ret = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pValue->pbData, + chars, psz, csz - 1, NULL, NULL); + csz -= ret; + } } break; default: @@ -91,7 +99,7 @@ DWORD WINAPI CertRDNValueToStrA(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, LPWSTR psz, DWORD csz) { - DWORD ret = 0; + DWORD ret = 0, len, i, strLen; TRACE("(%d, %p, %p, %d)\n", dwValueType, pValue, psz, csz); @@ -107,39 +115,261 @@ DWORD WINAPI CertRDNValueToStrW(DWORD dwValueType, PCERT_RDN_VALUE_BLOB pValue, case CERT_RDN_GRAPHIC_STRING: case CERT_RDN_VISIBLE_STRING: case CERT_RDN_GENERAL_STRING: + len = pValue->cbData; if (!psz || !csz) - ret = pValue->cbData; + ret = len; else { - DWORD chars = min(pValue->cbData, csz - 1); + WCHAR *ptr = psz; - if (chars) - { - DWORD i; - - for (i = 0; i < chars; i++) - psz[i] = pValue->pbData[i]; - ret += chars; - csz -= chars; - } + for (i = 0; i < pValue->cbData && ptr - psz < csz; ptr++, i++) + *ptr = pValue->pbData[i]; + ret = ptr - psz; } break; + case CERT_RDN_BMP_STRING: case CERT_RDN_UTF8_STRING: + strLen = len = pValue->cbData / sizeof(WCHAR); if (!psz || !csz) - ret = pValue->cbData / sizeof(WCHAR); + ret = len; else { - DWORD chars = min(pValue->cbData / sizeof(WCHAR), csz - 1); + WCHAR *ptr = psz; - if (chars) + for (i = 0; i < strLen && ptr - psz < csz; ptr++, i++) + *ptr = ((LPCWSTR)pValue->pbData)[i]; + ret = ptr - psz; + } + break; + default: + FIXME("string type %d unimplemented\n", dwValueType); + } + if (psz && csz) + { + *(psz + ret) = '\0'; + csz--; + ret++; + } + else + ret++; + TRACE("returning %d (%s)\n", ret, debugstr_w(psz)); + return ret; +} + +static inline BOOL is_quotable_char(char c) +{ + switch(c) + { + case '+': + case ',': + case '"': + case '=': + case '<': + case '>': + case ';': + case '#': + case '\n': + return TRUE; + default: + return FALSE; + } +} + +static DWORD quote_rdn_value_to_str_a(DWORD dwValueType, + PCERT_RDN_VALUE_BLOB pValue, LPSTR psz, DWORD csz) +{ + DWORD ret = 0, len, i; + BOOL needsQuotes = FALSE; + + TRACE("(%d, %p, %p, %d)\n", dwValueType, pValue, psz, csz); + + switch (dwValueType) + { + case CERT_RDN_ANY_TYPE: + break; + case CERT_RDN_NUMERIC_STRING: + case CERT_RDN_PRINTABLE_STRING: + case CERT_RDN_TELETEX_STRING: + case CERT_RDN_VIDEOTEX_STRING: + case CERT_RDN_IA5_STRING: + case CERT_RDN_GRAPHIC_STRING: + case CERT_RDN_VISIBLE_STRING: + case CERT_RDN_GENERAL_STRING: + len = pValue->cbData; + if (pValue->cbData && isspace(pValue->pbData[0])) + needsQuotes = TRUE; + if (pValue->cbData && isspace(pValue->pbData[pValue->cbData - 1])) + needsQuotes = TRUE; + for (i = 0; i < pValue->cbData; i++) + { + if (is_quotable_char(pValue->pbData[i])) + needsQuotes = TRUE; + if (pValue->pbData[i] == '"') + len += 1; + } + if (needsQuotes) + len += 2; + if (!psz || !csz) + ret = len; + else + { + char *ptr = psz; + + if (needsQuotes) + *ptr++ = '"'; + for (i = 0; i < pValue->cbData && ptr - psz < csz; ptr++, i++) { - DWORD i; - - for (i = 0; i < chars; i++) - psz[i] = *((LPWSTR)pValue->pbData + i); - ret += chars; - csz -= chars; + *ptr = pValue->pbData[i]; + if (pValue->pbData[i] == '"' && ptr - psz < csz - 1) + *(++ptr) = '"'; } + if (needsQuotes && ptr - psz < csz) + *ptr++ = '"'; + ret = ptr - psz; + } + break; + case CERT_RDN_BMP_STRING: + case CERT_RDN_UTF8_STRING: + len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pValue->pbData, + pValue->cbData / sizeof(WCHAR), NULL, 0, NULL, NULL); + if (pValue->cbData && isspaceW(((LPCWSTR)pValue->pbData)[0])) + needsQuotes = TRUE; + if (pValue->cbData && + isspaceW(((LPCWSTR)pValue->pbData)[pValue->cbData / sizeof(WCHAR)-1])) + needsQuotes = TRUE; + for (i = 0; i < pValue->cbData / sizeof(WCHAR); i++) + { + if (is_quotable_char(((LPCWSTR)pValue->pbData)[i])) + needsQuotes = TRUE; + if (((LPCWSTR)pValue->pbData)[i] == '"') + len += 1; + } + if (needsQuotes) + len += 2; + if (!psz || !csz) + ret = len; + else + { + char *dst = psz; + + if (needsQuotes) + *dst++ = '"'; + for (i = 0; i < pValue->cbData / sizeof(WCHAR) && + dst - psz < csz; dst++, i++) + { + LPCWSTR src = (LPCWSTR)pValue->pbData + i; + + WideCharToMultiByte(CP_ACP, 0, src, 1, dst, + csz - (dst - psz) - 1, NULL, NULL); + if (*src == '"' && dst - psz < csz - 1) + *(++dst) = '"'; + } + if (needsQuotes && dst - psz < csz) + *dst++ = '"'; + ret = dst - psz; + } + break; + default: + FIXME("string type %d unimplemented\n", dwValueType); + } + if (psz && csz) + { + *(psz + ret) = '\0'; + csz--; + ret++; + } + else + ret++; + TRACE("returning %d (%s)\n", ret, debugstr_a(psz)); + return ret; +} + +static DWORD quote_rdn_value_to_str_w(DWORD dwValueType, + PCERT_RDN_VALUE_BLOB pValue, LPWSTR psz, DWORD csz) +{ + DWORD ret = 0, len, i, strLen; + BOOL needsQuotes = FALSE; + + TRACE("(%d, %p, %p, %d)\n", dwValueType, pValue, psz, csz); + + switch (dwValueType) + { + case CERT_RDN_ANY_TYPE: + break; + case CERT_RDN_NUMERIC_STRING: + case CERT_RDN_PRINTABLE_STRING: + case CERT_RDN_TELETEX_STRING: + case CERT_RDN_VIDEOTEX_STRING: + case CERT_RDN_IA5_STRING: + case CERT_RDN_GRAPHIC_STRING: + case CERT_RDN_VISIBLE_STRING: + case CERT_RDN_GENERAL_STRING: + len = pValue->cbData; + if (pValue->cbData && isspace(pValue->pbData[0])) + needsQuotes = TRUE; + if (pValue->cbData && isspace(pValue->pbData[pValue->cbData - 1])) + needsQuotes = TRUE; + for (i = 0; i < pValue->cbData; i++) + { + if (is_quotable_char(pValue->pbData[i])) + needsQuotes = TRUE; + if (pValue->pbData[i] == '"') + len += 1; + } + if (needsQuotes) + len += 2; + if (!psz || !csz) + ret = len; + else + { + WCHAR *ptr = psz; + + if (needsQuotes) + *ptr++ = '"'; + for (i = 0; i < pValue->cbData && ptr - psz < csz; ptr++, i++) + { + *ptr = pValue->pbData[i]; + if (pValue->pbData[i] == '"' && ptr - psz < csz - 1) + *(++ptr) = '"'; + } + if (needsQuotes && ptr - psz < csz) + *ptr++ = '"'; + ret = ptr - psz; + } + break; + case CERT_RDN_BMP_STRING: + case CERT_RDN_UTF8_STRING: + strLen = len = pValue->cbData / sizeof(WCHAR); + if (pValue->cbData && isspace(pValue->pbData[0])) + needsQuotes = TRUE; + if (pValue->cbData && isspace(pValue->pbData[strLen - 1])) + needsQuotes = TRUE; + for (i = 0; i < strLen; i++) + { + if (is_quotable_char(((LPCWSTR)pValue->pbData)[i])) + needsQuotes = TRUE; + if (((LPCWSTR)pValue->pbData)[i] == '"') + len += 1; + } + if (needsQuotes) + len += 2; + if (!psz || !csz) + ret = len; + else + { + WCHAR *ptr = psz; + + if (needsQuotes) + *ptr++ = '"'; + for (i = 0; i < strLen && ptr - psz < csz; ptr++, i++) + { + *ptr = ((LPCWSTR)pValue->pbData)[i]; + if (((LPCWSTR)pValue->pbData)[i] == '"' && ptr - psz < csz - 1) + *(++ptr) = '"'; + } + if (needsQuotes && ptr - psz < csz) + *ptr++ = '"'; + ret = ptr - psz; } break; default: @@ -255,8 +485,7 @@ DWORD WINAPI CertNameToStrA(DWORD dwCertEncodingType, PCERT_NAME_BLOB pName, psz ? psz + ret : NULL, psz ? csz - ret - 1 : 0); ret += chars; } - /* FIXME: handle quoting */ - chars = CertRDNValueToStrA( + chars = quote_rdn_value_to_str_a( rdn->rgRDNAttr[j].dwValueType, &rdn->rgRDNAttr[j].Value, psz ? psz + ret : NULL, psz ? csz - ret : 0); @@ -435,8 +664,7 @@ DWORD cert_name_to_str_with_indent(DWORD dwCertEncodingType, DWORD indentLevel, psz ? psz + ret : NULL, psz ? csz - ret - 1 : 0); ret += chars; } - /* FIXME: handle quoting */ - chars = CertRDNValueToStrW( + chars = quote_rdn_value_to_str_w( rdn->rgRDNAttr[j].dwValueType, &rdn->rgRDNAttr[j].Value, psz ? psz + ret : NULL, psz ? csz - ret : 0); @@ -685,46 +913,46 @@ static BOOL CRYPT_EncodeValueWithType(DWORD dwCertEncodingType, if (value->end > value->start) { - nameValue.Value.pbData = CryptMemAlloc((value->end - value->start) * + LONG i; + LPWSTR ptr; + + nameValue.Value.pbData = CryptMemAlloc((value->end - value->start + 1) * sizeof(WCHAR)); if (!nameValue.Value.pbData) { SetLastError(ERROR_OUTOFMEMORY); - ret = FALSE; + return FALSE; } + ptr = (LPWSTR)nameValue.Value.pbData; + for (i = 0; i < value->end - value->start; i++) + { + *ptr++ = value->start[i]; + if (value->start[i] == '"') + i++; + } + /* The string is NULL terminated because of a quirk in encoding + * unicode names values: if the length is given as 0, the value is + * assumed to be a NULL-terminated string. + */ + *ptr = 0; + nameValue.Value.cbData = (LPBYTE)ptr - nameValue.Value.pbData; } - if (ret) + ret = CryptEncodeObjectEx(dwCertEncodingType, X509_UNICODE_NAME_VALUE, + &nameValue, CRYPT_ENCODE_ALLOC_FLAG, NULL, &output->pbData, + &output->cbData); + if (!ret && ppszError) { - if (value->end > value->start) - { - LONG i; - LPWSTR ptr = (LPWSTR)nameValue.Value.pbData; - - for (i = 0; i < value->end - value->start; i++) - { - *ptr++ = value->start[i]; - if (value->start[i] == '"') - i++; - } - nameValue.Value.cbData = (LPBYTE)ptr - nameValue.Value.pbData; - } - ret = CryptEncodeObjectEx(dwCertEncodingType, X509_UNICODE_NAME_VALUE, - &nameValue, CRYPT_ENCODE_ALLOC_FLAG, NULL, &output->pbData, - &output->cbData); - if (!ret && ppszError) - { - if (type == CERT_RDN_NUMERIC_STRING && - GetLastError() == CRYPT_E_INVALID_NUMERIC_STRING) - *ppszError = value->start + output->cbData; - else if (type == CERT_RDN_PRINTABLE_STRING && - GetLastError() == CRYPT_E_INVALID_PRINTABLE_STRING) - *ppszError = value->start + output->cbData; - else if (type == CERT_RDN_IA5_STRING && - GetLastError() == CRYPT_E_INVALID_IA5_STRING) - *ppszError = value->start + output->cbData; - } - CryptMemFree(nameValue.Value.pbData); + if (type == CERT_RDN_NUMERIC_STRING && + GetLastError() == CRYPT_E_INVALID_NUMERIC_STRING) + *ppszError = value->start + output->cbData; + else if (type == CERT_RDN_PRINTABLE_STRING && + GetLastError() == CRYPT_E_INVALID_PRINTABLE_STRING) + *ppszError = value->start + output->cbData; + else if (type == CERT_RDN_IA5_STRING && + GetLastError() == CRYPT_E_INVALID_IA5_STRING) + *ppszError = value->start + output->cbData; } + CryptMemFree(nameValue.Value.pbData); return ret; } @@ -743,7 +971,7 @@ static BOOL CRYPT_EncodeValue(DWORD dwCertEncodingType, } static BOOL CRYPT_ValueToRDN(DWORD dwCertEncodingType, PCERT_NAME_INFO info, - PCCRYPT_OID_INFO keyOID, struct X500TokenW *value, LPCWSTR *ppszError) + PCCRYPT_OID_INFO keyOID, struct X500TokenW *value, DWORD dwStrType, LPCWSTR *ppszError) { BOOL ret = FALSE; @@ -777,7 +1005,7 @@ static BOOL CRYPT_ValueToRDN(DWORD dwCertEncodingType, PCERT_NAME_INFO info, types = defaultTypes; /* Remove surrounding quotes */ - if (value->start[0] == '"') + if (value->start[0] == '"' && !(dwStrType & CERT_NAME_STR_NO_QUOTING_FLAG)) { value->start++; value->end--; @@ -846,7 +1074,8 @@ BOOL WINAPI CertStrToNameW(DWORD dwCertEncodingType, LPCWSTR pszX500, static const WCHAR commaSep[] = { ',',0 }; static const WCHAR semiSep[] = { ';',0 }; static const WCHAR crlfSep[] = { '\r','\n',0 }; - static const WCHAR allSeps[] = { ',',';','\r','\n',0 }; + static const WCHAR allSepsWithoutPlus[] = { ',',';','\r','\n',0 }; + static const WCHAR allSeps[] = { '+',',',';','\r','\n',0 }; LPCWSTR sep; str++; @@ -856,6 +1085,8 @@ BOOL WINAPI CertStrToNameW(DWORD dwCertEncodingType, LPCWSTR pszX500, sep = semiSep; else if (dwStrType & CERT_NAME_STR_CRLF_FLAG) sep = crlfSep; + else if (dwStrType & CERT_NAME_STR_NO_PLUS_FLAG) + sep = allSepsWithoutPlus; else sep = allSeps; ret = CRYPT_GetNextValueW(str, dwStrType, sep, &token, @@ -864,7 +1095,7 @@ BOOL WINAPI CertStrToNameW(DWORD dwCertEncodingType, LPCWSTR pszX500, { str = token.end; ret = CRYPT_ValueToRDN(dwCertEncodingType, &info, - keyOID, &token, ppszError); + keyOID, &token, dwStrType, ppszError); } } } @@ -970,7 +1201,7 @@ static PCERT_ALT_NAME_ENTRY cert_find_alt_name_entry(PCCERT_CONTEXT cert, } static DWORD cert_get_name_from_rdn_attr(DWORD encodingType, - PCERT_NAME_BLOB name, LPCSTR oid, LPWSTR pszNameString, DWORD cchNameString) + const CERT_NAME_BLOB *name, LPCSTR oid, LPWSTR pszNameString, DWORD cchNameString) { CERT_NAME_INFO *nameInfo; DWORD bytes = 0, ret = 0; @@ -978,8 +1209,11 @@ static DWORD cert_get_name_from_rdn_attr(DWORD encodingType, if (CryptDecodeObjectEx(encodingType, X509_NAME, name->pbData, name->cbData, CRYPT_DECODE_ALLOC_FLAG, NULL, &nameInfo, &bytes)) { - PCERT_RDN_ATTR nameAttr = CertFindRDNAttr(oid, nameInfo); + PCERT_RDN_ATTR nameAttr; + if (!oid) + oid = szOID_RSA_emailAddr; + nameAttr = CertFindRDNAttr(oid, nameInfo); if (nameAttr) ret = CertRDNValueToStrW(nameAttr->dwValueType, &nameAttr->Value, pszNameString, cchNameString); @@ -998,6 +1232,9 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType, TRACE("(%p, %d, %08x, %p, %p, %d)\n", pCertContext, dwType, dwFlags, pvTypePara, pszNameString, cchNameString); + if (!pCertContext) + goto done; + if (dwFlags & CERT_NAME_ISSUER_FLAG) { name = &pCertContext->pCertInfo->Issuer; @@ -1037,9 +1274,12 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType, break; } case CERT_NAME_RDN_TYPE: + { + DWORD type = pvTypePara ? *(DWORD *)pvTypePara : 0; + if (name->cbData) ret = CertNameToStrW(pCertContext->dwCertEncodingType, name, - *(DWORD *)pvTypePara, pszNameString, cchNameString); + type, pszNameString, cchNameString); else { CERT_ALT_NAME_INFO *info; @@ -1048,12 +1288,12 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType, if (entry) ret = CertNameToStrW(pCertContext->dwCertEncodingType, - &entry->u.DirectoryName, *(DWORD *)pvTypePara, pszNameString, - cchNameString); + &entry->u.DirectoryName, type, pszNameString, cchNameString); if (info) LocalFree(info); } break; + } case CERT_NAME_ATTR_TYPE: ret = cert_get_name_from_rdn_attr(pCertContext->dwCertEncodingType, name, pvTypePara, pszNameString, cchNameString); @@ -1182,6 +1422,7 @@ DWORD WINAPI CertGetNameStringW(PCCERT_CONTEXT pCertContext, DWORD dwType, FIXME("unimplemented for type %d\n", dwType); ret = 0; } +done: if (!ret) { if (!pszNameString) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 9196d1b5906..d531dacea0d 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -52,7 +52,7 @@ reactos/dll/win32/comctl32 # Synced to Wine 1.3.14 reactos/dll/win32/comdlg32 # Autosync reactos/dll/win32/compstui # Autosync reactos/dll/win32/credui # Synced to Wine-1.3.37 -reactos/dll/win32/crypt32 # Autosync +reactos/dll/win32/crypt32 # Synced to Wine-1.3.37 reactos/dll/win32/cryptdlg # Autosync reactos/dll/win32/cryptdll # Autosync reactos/dll/win32/cryptnet # Autosync From 2b23e89568873468cdd9e3da099bc40c2e52af3c Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 15:45:22 +0000 Subject: [PATCH 046/289] [CRYPT32_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55109 --- rostests/winetests/crypt32/base64.c | 30 +- rostests/winetests/crypt32/cert.c | 80 ++- rostests/winetests/crypt32/chain.c | 840 +++++++++++++---------- rostests/winetests/crypt32/crl.c | 33 +- rostests/winetests/crypt32/ctl.c | 3 +- rostests/winetests/crypt32/encode.c | 494 +++++++------ rostests/winetests/crypt32/main.c | 11 +- rostests/winetests/crypt32/message.c | 660 +++++++++++++++++- rostests/winetests/crypt32/msg.c | 623 ++++++++++++++++- rostests/winetests/crypt32/oid.c | 1 + rostests/winetests/crypt32/protectdata.c | 1 - rostests/winetests/crypt32/store.c | 54 +- rostests/winetests/crypt32/str.c | 627 ++++++++++++++--- 13 files changed, 2735 insertions(+), 722 deletions(-) diff --git a/rostests/winetests/crypt32/base64.c b/rostests/winetests/crypt32/base64.c index 5a260edfd6e..8f19515e531 100644 --- a/rostests/winetests/crypt32/base64.c +++ b/rostests/winetests/crypt32/base64.c @@ -28,7 +28,9 @@ #include "wine/test.h" #define CERT_HEADER "-----BEGIN CERTIFICATE-----\r\n" +#define ALT_CERT_HEADER "-----BEGIN This is some arbitrary text that goes on and on-----\r\n" #define CERT_TRAILER "-----END CERTIFICATE-----\r\n" +#define ALT_CERT_TRAILER "-----END More arbitrary text------\r\n" #define CERT_REQUEST_HEADER "-----BEGIN NEW CERTIFICATE REQUEST-----\r\n" #define CERT_REQUEST_TRAILER "-----END NEW CERTIFICATE REQUEST-----\r\n" #define X509_HEADER "-----BEGIN X509 CRL-----\r\n" @@ -40,15 +42,12 @@ #define X509_HEADER_NOCR "-----BEGIN X509 CRL-----\n" #define X509_TRAILER_NOCR "-----END X509 CRL-----\n" -typedef BOOL (WINAPI *CryptBinaryToStringAFunc)(const BYTE *pbBinary, +static BOOL (WINAPI *pCryptBinaryToStringA)(const BYTE *pbBinary, DWORD cbBinary, DWORD dwFlags, LPSTR pszString, DWORD *pcchString); -typedef BOOL (WINAPI *CryptStringToBinaryAFunc)(LPCSTR pszString, +static BOOL (WINAPI *pCryptStringToBinaryA)(LPCSTR pszString, DWORD cchString, DWORD dwFlags, BYTE *pbBinary, DWORD *pcbBinary, DWORD *pdwSkip, DWORD *pdwFlags); -CryptBinaryToStringAFunc pCryptBinaryToStringA; -CryptStringToBinaryAFunc pCryptStringToBinaryA; - struct BinTests { const BYTE *toEncode; @@ -64,7 +63,7 @@ static const BYTE toEncode4[] = "abcdefghijlkmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890" "abcdefghijlkmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890"; -struct BinTests tests[] = { +static const struct BinTests tests[] = { { toEncode1, sizeof(toEncode1), "AA==\r\n", }, { toEncode2, sizeof(toEncode2), "AQI=\r\n", }, /* { toEncode3, sizeof(toEncode3), "AQID\r\n", }, This test fails on Vista. */ @@ -76,7 +75,7 @@ struct BinTests tests[] = { "SElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkwAA==\r\n" }, }; -struct BinTests testsNoCR[] = { +static const struct BinTests testsNoCR[] = { { toEncode1, sizeof(toEncode1), "AA==\n", }, { toEncode2, sizeof(toEncode2), "AQI=\n", }, /* { toEncode3, sizeof(toEncode3), "AQID\n", }, This test fails on Vista. */ @@ -118,11 +117,8 @@ static void encodeAndCompareBase64_A(const BYTE *toEncode, DWORD toEncodeLen, "Expected %s, got %s\n", expected, ptr); ptr += strlen(expected); if (trailer) - { ok(!strncmp(trailer, ptr, strlen(trailer)), "Expected trailer %s, got %s\n", trailer, ptr); - ptr += strlen(trailer); - } HeapFree(GetProcessHeap(), 0, str); } } @@ -154,6 +150,7 @@ static void testBinaryToStringA(void) ret = pCryptBinaryToStringA(tests[i].toEncode, tests[i].toEncodeLen, CRYPT_STRING_BINARY, str, &strLen2); + ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError()); ok(strLen == strLen2, "Expected length %d, got %d\n", strLen, strLen2); ok(!memcmp(str, tests[i].toEncode, tests[i].toEncodeLen), @@ -190,6 +187,7 @@ static void testBinaryToStringA(void) ret = pCryptBinaryToStringA(testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen, CRYPT_STRING_BINARY | CRYPT_STRING_NOCR, str, &strLen2); + ok(ret, "CryptBinaryToStringA failed: %d\n", GetLastError()); ok(strLen == strLen2, "Expected length %d, got %d\n", strLen, strLen2); ok(!memcmp(str, testsNoCR[i].toEncode, testsNoCR[i].toEncodeLen), @@ -290,6 +288,7 @@ static void decodeAndCompareBase64_A(LPCSTR toDecode, LPCSTR header, ret = pCryptStringToBinaryA(str, 0, useFormat, buf, &bufLen, &skipped, &usedFormat); + ok(ret, "CryptStringToBinaryA failed: %d\n", GetLastError()); ok(skipped == strlen(garbage), "Expected %d characters of \"%s\" skipped when trying format %08x, got %d (used format is %08x)\n", lstrlenA(garbage), str, useFormat, skipped, usedFormat); @@ -306,7 +305,7 @@ struct BadString DWORD format; }; -struct BadString badStrings[] = { +static const struct BadString badStrings[] = { { "A\r\nA\r\n=\r\n=\r\n", CRYPT_STRING_BASE64 }, { "AA\r\n=\r\n=\r\n", CRYPT_STRING_BASE64 }, { "AA=\r\n=\r\n", CRYPT_STRING_BASE64 }, @@ -360,6 +359,9 @@ static void testStringToBinaryA(void) decodeAndCompareBase64_A(tests[i].base64, CERT_HEADER, CERT_TRAILER, CRYPT_STRING_BASE64HEADER, CRYPT_STRING_BASE64HEADER, tests[i].toEncode, tests[i].toEncodeLen); + decodeAndCompareBase64_A(tests[i].base64, ALT_CERT_HEADER, ALT_CERT_TRAILER, + CRYPT_STRING_BASE64HEADER, CRYPT_STRING_BASE64HEADER, + tests[i].toEncode, tests[i].toEncodeLen); decodeAndCompareBase64_A(tests[i].base64, CERT_REQUEST_HEADER, CERT_REQUEST_TRAILER, CRYPT_STRING_BASE64REQUESTHEADER, CRYPT_STRING_BASE64REQUESTHEADER, tests[i].toEncode, @@ -441,10 +443,8 @@ START_TEST(base64) { HMODULE lib = GetModuleHandleA("crypt32"); - pCryptBinaryToStringA = (CryptBinaryToStringAFunc)GetProcAddress(lib, - "CryptBinaryToStringA"); - pCryptStringToBinaryA = (CryptStringToBinaryAFunc)GetProcAddress(lib, - "CryptStringToBinaryA"); + pCryptBinaryToStringA = (void *)GetProcAddress(lib, "CryptBinaryToStringA"); + pCryptStringToBinaryA = (void *)GetProcAddress(lib, "CryptStringToBinaryA"); if (pCryptBinaryToStringA) testBinaryToStringA(); diff --git a/rostests/winetests/crypt32/cert.c b/rostests/winetests/crypt32/cert.c index d3b362c8a34..8239af8aea9 100644 --- a/rostests/winetests/crypt32/cert.c +++ b/rostests/winetests/crypt32/cert.c @@ -18,9 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include #include #include + #include #include #include @@ -487,6 +487,8 @@ static void testCertProperties(void) size = sizeof(hashProperty); ret = CertGetCertificateContextProperty(context, CERT_HASH_PROP_ID, hashProperty, &size); + ok(ret, "CertGetCertificateContextProperty failed: %08x\n", + GetLastError()); ok(!memcmp(hashProperty, hash, sizeof(hash)), "Unexpected hash\n"); /* Delete the (bogus) hash, and get the real one */ ret = CertSetCertificateContextProperty(context, CERT_HASH_PROP_ID, 0, @@ -632,6 +634,51 @@ static void testCertProperties(void) CertFreeCertificateContext(context); } +static void testCreateCert(void) +{ + PCCERT_CONTEXT cert, enumCert; + DWORD count, size; + BOOL ret; + + SetLastError(0xdeadbeef); + cert = CertCreateCertificateContext(0, NULL, 0); + ok(!cert && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + cert = CertCreateCertificateContext(0, selfSignedCert, + sizeof(selfSignedCert)); + ok(!cert && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + cert = CertCreateCertificateContext(X509_ASN_ENCODING, NULL, 0); + ok(!cert && + (GetLastError() == CRYPT_E_ASN1_EOD || + broken(GetLastError() == OSS_MORE_INPUT /* NT4 */)), + "expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); + + cert = CertCreateCertificateContext(X509_ASN_ENCODING, + selfSignedCert, sizeof(selfSignedCert)); + ok(cert != NULL, "creating cert failed: %08x\n", GetLastError()); + /* Even in-memory certs are expected to have a store associated with them */ + todo_wine + ok(cert->hCertStore != NULL, "expected created cert to have a store\n"); + /* The cert doesn't have the archived property set (which would imply it + * doesn't show up in enumerations.) + */ + size = 0; + ret = CertGetCertificateContextProperty(cert, CERT_ARCHIVED_PROP_ID, + NULL, &size); + ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND, + "expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); + /* Strangely, enumerating the certs in the store finds none. */ + enumCert = NULL; + count = 0; + while ((enumCert = CertEnumCertificatesInStore(cert->hCertStore, enumCert))) + count++; + ok(!count, "expected 0, got %d\n", count); + CertFreeCertificateContext(cert); +} + static void testDupCert(void) { HCERTSTORE store; @@ -1514,11 +1561,13 @@ static void testGetIssuerCert(void) /* With only the child certificate, no issuer will be found */ ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, chain7_1, sizeof(chain7_1), CERT_STORE_ADD_ALWAYS, &child); + ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); parent = CertGetIssuerCertificateFromStore(store, child, NULL, &flags); ok(parent == NULL, "Expected no issuer\n"); /* Adding an issuer allows one (and only one) issuer to be found */ ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, chain10_1, sizeof(chain10_1), CERT_STORE_ADD_ALWAYS, &cert1); + ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); parent = CertGetIssuerCertificateFromStore(store, child, NULL, &flags); ok(parent == cert1, "Expected cert1 to be the issuer\n"); parent = CertGetIssuerCertificateFromStore(store, child, parent, &flags); @@ -1529,6 +1578,7 @@ static void testGetIssuerCert(void) */ ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, chain10_0, sizeof(chain10_0), CERT_STORE_ADD_ALWAYS, &cert2); + ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); parent = CertGetIssuerCertificateFromStore(store, child, NULL, &flags); ok(parent == cert2, "Expected cert2 to be the first issuer\n"); parent = CertGetIssuerCertificateFromStore(store, child, parent, &flags); @@ -1548,11 +1598,13 @@ static void testGetIssuerCert(void) /* With only the child certificate, no issuer will be found */ ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, chain7_1, sizeof(chain7_1), CERT_STORE_ADD_ALWAYS, &child); + ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); parent = CertGetIssuerCertificateFromStore(store, child, NULL, &flags); ok(parent == NULL, "Expected no issuer\n"); /* Adding an issuer allows one (and only one) issuer to be found */ ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, chain10_0, sizeof(chain10_0), CERT_STORE_ADD_ALWAYS, &cert1); + ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); parent = CertGetIssuerCertificateFromStore(store, child, NULL, &flags); ok(parent == cert1, "Expected cert1 to be the issuer\n"); parent = CertGetIssuerCertificateFromStore(store, child, parent, &flags); @@ -1563,6 +1615,7 @@ static void testGetIssuerCert(void) */ ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, chain10_1, sizeof(chain10_1), CERT_STORE_ADD_ALWAYS, &cert2); + ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); parent = CertGetIssuerCertificateFromStore(store, child, NULL, &flags); ok(parent == cert2, "Expected cert2 to be the first issuer\n"); parent = CertGetIssuerCertificateFromStore(store, child, parent, &flags); @@ -1826,6 +1879,7 @@ static void testCertSigs(void) CryptReleaseContext(csp, 0); ret = pCryptAcquireContextA(&csp, cspNameA, MS_DEF_PROV_A, PROV_RSA_FULL, CRYPT_DELETEKEYSET); + ok(ret, "CryptAcquireContext failed: %08x\n", GetLastError()); } static const BYTE md5SignedEmptyCert[] = { @@ -2014,6 +2068,8 @@ static void testCreateSelfSignCert(void) CryptReleaseContext(csp, 0); ret = pCryptAcquireContextA(&csp, cspNameA, MS_DEF_PROV_A, PROV_RSA_FULL, CRYPT_DELETEKEYSET); + ok(ret, "CryptAcquireContext failed: %08x\n", GetLastError()); + /* do the same test with AT_KEYEXCHANGE and key info*/ memset(&info,0,sizeof(info)); @@ -2082,7 +2138,7 @@ static void testIntendedKeyUsage(void) if (0) { /* Crash */ - ret = CertGetIntendedKeyUsage(0, NULL, NULL, 0); + CertGetIntendedKeyUsage(0, NULL, NULL, 0); } ret = CertGetIntendedKeyUsage(0, &info, NULL, 0); ok(!ret, "expected failure\n"); @@ -2092,6 +2148,7 @@ static void testIntendedKeyUsage(void) ok(!ret, "expected failure\n"); ret = CertGetIntendedKeyUsage(X509_ASN_ENCODING, &info, usage_bytes, sizeof(usage_bytes)); + ok(!ret, "expected failure\n"); info.cExtension = 1; info.rgExtension = &ext; ret = CertGetIntendedKeyUsage(X509_ASN_ENCODING, &info, NULL, 0); @@ -2250,6 +2307,8 @@ static void testKeyUsage(void) SetLastError(0xbaadcafe); size = sizeof(buf); ret = CertGetEnhancedKeyUsage(context, 0, pUsage, &size); + ok(ret || broken(!ret && GetLastError() == CRYPT_E_NOT_FOUND /* NT4 */), + "CertGetEnhancedKeyUsage failed: %08x\n", GetLastError()); ok(GetLastError() == CRYPT_E_NOT_FOUND, "Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); @@ -2655,9 +2714,8 @@ static void testIsRDNAttrsInCertificateName(void) if (0) { /* Crash */ - ret = CertIsRDNAttrsInCertificateName(0, 0, NULL, NULL); - ret = CertIsRDNAttrsInCertificateName(X509_ASN_ENCODING, 0, &name, - NULL); + CertIsRDNAttrsInCertificateName(0, 0, NULL, NULL); + CertIsRDNAttrsInCertificateName(X509_ASN_ENCODING, 0, &name, NULL); } SetLastError(0xdeadbeef); ret = CertIsRDNAttrsInCertificateName(0, 0, &name, NULL); @@ -2931,7 +2989,7 @@ static void testHashToBeSigned(void) /* Crash */ if (0) { - ret = CryptHashToBeSigned(0, 0, NULL, 0, NULL, NULL); + CryptHashToBeSigned(0, 0, NULL, 0, NULL, NULL); } SetLastError(0xdeadbeef); ret = CryptHashToBeSigned(0, 0, NULL, 0, NULL, &size); @@ -2972,6 +3030,9 @@ static void testHashToBeSigned(void) ret = CryptHashToBeSigned(0, X509_ASN_ENCODING, md5SignedEmptyCert, sizeof(md5SignedEmptyCert), hash, &size); + ok(ret || broken(!ret && GetLastError() == NTE_BAD_ALGID) /* NT4 */, + "CryptHashToBeSigned failed: %08x\n", GetLastError()); + ok(!memcmp(hash, md5SignedEmptyCertHash, size), "unexpected value\n"); } @@ -2980,9 +3041,9 @@ static void testCompareCert(void) CERT_INFO info1 = { 0 }, info2 = { 0 }; BOOL ret; - /* Crashes - ret = CertCompareCertificate(X509_ASN_ENCODING, NULL, NULL); - */ + /* Crashes */ + if (0) + CertCompareCertificate(X509_ASN_ENCODING, NULL, NULL); /* Certs with the same issuer and serial number are equal, even if they * differ in other respects (like subject). @@ -3618,6 +3679,7 @@ START_TEST(cert) testAddCert(); testCertProperties(); + testCreateCert(); testDupCert(); testFindCert(); testGetSubjectCert(); diff --git a/rostests/winetests/crypt32/chain.c b/rostests/winetests/crypt32/chain.c index a59a95a0bb1..669871b3298 100644 --- a/rostests/winetests/crypt32/chain.c +++ b/rostests/winetests/crypt32/chain.c @@ -17,13 +17,15 @@ * 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 #include #include #include +#include #include "wine/test.h" @@ -139,175 +141,6 @@ static const BYTE bigCert[] = { 0x30, 0x7a, 0x02, 0x01, 0x01, 0x30, 0x02, 0x06, 0x4c, 0x61, 0x6e, 0x67, 0x00, 0x30, 0x07, 0x30, 0x02, 0x06, 0x00, 0x03, 0x01, 0x00, 0xa3, 0x16, 0x30, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x01 }; -static const BYTE iTunesCert0[] = { -0x30,0x82,0x04,0xbf,0x30,0x82,0x04,0x28,0xa0,0x03,0x02,0x01,0x02,0x02,0x10, -0x41,0x91,0xa1,0x5a,0x39,0x78,0xdf,0xcf,0x49,0x65,0x66,0x38,0x1d,0x4c,0x75, -0xc2,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05, -0x00,0x30,0x5f,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55, -0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72, -0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x37,0x30,0x35, -0x06,0x03,0x55,0x04,0x0b,0x13,0x2e,0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20, -0x50,0x75,0x62,0x6c,0x69,0x63,0x20,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20, -0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41, -0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x30,0x1e,0x17,0x0d,0x30,0x34,0x30, -0x37,0x31,0x36,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x31,0x34,0x30, -0x37,0x31,0x35,0x32,0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x81,0xb4,0x31,0x0b, -0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15, -0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e, -0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x1f,0x30,0x1d,0x06,0x03,0x55,0x04,0x0b, -0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20,0x54,0x72,0x75,0x73, -0x74,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b,0x31,0x3b,0x30,0x39,0x06,0x03, -0x55,0x04,0x0b,0x13,0x32,0x54,0x65,0x72,0x6d,0x73,0x20,0x6f,0x66,0x20,0x75, -0x73,0x65,0x20,0x61,0x74,0x20,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77, -0x77,0x77,0x2e,0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d, -0x2f,0x72,0x70,0x61,0x20,0x28,0x63,0x29,0x30,0x34,0x31,0x2e,0x30,0x2c,0x06, -0x03,0x55,0x04,0x03,0x13,0x25,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6e,0x20, -0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20,0x43,0x6f,0x64,0x65,0x20,0x53,0x69, -0x67,0x6e,0x69,0x6e,0x67,0x20,0x32,0x30,0x30,0x34,0x20,0x43,0x41,0x30,0x82, -0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01, -0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01, -0x00,0xbe,0xbc,0xee,0xbc,0x7e,0xef,0x83,0xeb,0xe0,0x37,0x4f,0xfb,0x03,0x10, -0x38,0xbe,0x08,0xd2,0x8c,0x7d,0x9d,0xfa,0x92,0x7f,0x19,0x0c,0xc2,0x6b,0xee, -0x42,0x52,0x8c,0xde,0xd3,0x1c,0x48,0x13,0x25,0xea,0xc1,0x63,0x7a,0xf9,0x51, -0x65,0xee,0xd3,0xaa,0x3b,0xf5,0xf0,0x94,0x9c,0x2b,0xfb,0xf2,0x66,0xd4,0x24, -0xda,0xf7,0xf5,0x9f,0x6e,0x19,0x39,0x36,0xbc,0xd0,0xa3,0x76,0x08,0x1e,0x22, -0x27,0x24,0x6c,0x38,0x91,0x27,0xe2,0x84,0x49,0xae,0x1b,0x8a,0xa1,0xfd,0x25, -0x82,0x2c,0x10,0x30,0xe8,0x71,0xab,0x28,0xe8,0x77,0x4a,0x51,0xf1,0xec,0xcd, -0xf8,0xf0,0x54,0xd4,0x6f,0xc0,0xe3,0x6d,0x0a,0x8f,0xd9,0xd8,0x64,0x8d,0x63, -0xb2,0x2d,0x4e,0x27,0xf6,0x85,0x0e,0xfe,0x6d,0xe3,0x29,0x99,0xe2,0x85,0x47, -0x7c,0x2d,0x86,0x7f,0xe8,0x57,0x8f,0xad,0x67,0xc2,0x33,0x32,0x91,0x13,0x20, -0xfc,0xa9,0x23,0x14,0x9a,0x6d,0xc2,0x84,0x4b,0x76,0x68,0x04,0xd5,0x71,0x2c, -0x5d,0x21,0xfa,0x88,0x0d,0x26,0xfd,0x1f,0x2d,0x91,0x2b,0xe7,0x01,0x55,0x4d, -0xf2,0x6d,0x35,0x28,0x82,0xdf,0xd9,0x6b,0x5c,0xb6,0xd6,0xd9,0xaa,0x81,0xfd, -0x5f,0xcd,0x83,0xba,0x63,0x9d,0xd0,0x22,0xfc,0xa9,0x3b,0x42,0x69,0xb2,0x8e, -0x3a,0xb5,0xbc,0xb4,0x9e,0x0f,0x5e,0xc4,0xea,0x2c,0x82,0x8b,0x28,0xfd,0x53, -0x08,0x96,0xdd,0xb5,0x01,0x20,0xd1,0xf9,0xa5,0x18,0xe7,0xc0,0xee,0x51,0x70, -0x37,0xe1,0xb6,0x05,0x48,0x52,0x48,0x6f,0x38,0xea,0xc3,0xe8,0x6c,0x7b,0x44, -0x84,0xbb,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0xa0,0x30,0x82,0x01,0x9c, -0x30,0x12,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x08,0x30,0x06,0x01, -0x01,0xff,0x02,0x01,0x00,0x30,0x44,0x06,0x03,0x55,0x1d,0x20,0x04,0x3d,0x30, -0x3b,0x30,0x39,0x06,0x0b,0x60,0x86,0x48,0x01,0x86,0xf8,0x45,0x01,0x07,0x17, -0x03,0x30,0x2a,0x30,0x28,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01, -0x16,0x1c,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x76, -0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f,0x72,0x70,0x61, -0x30,0x31,0x06,0x03,0x55,0x1d,0x1f,0x04,0x2a,0x30,0x28,0x30,0x26,0xa0,0x24, -0xa0,0x22,0x86,0x20,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e, -0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x63, -0x61,0x33,0x2e,0x63,0x72,0x6c,0x30,0x1d,0x06,0x03,0x55,0x1d,0x25,0x04,0x16, -0x30,0x14,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x02,0x06,0x08,0x2b, -0x06,0x01,0x05,0x05,0x07,0x03,0x03,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01, -0x01,0xff,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x11,0x06,0x09,0x60,0x86,0x48, -0x01,0x86,0xf8,0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x00,0x01,0x30,0x29,0x06, -0x03,0x55,0x1d,0x11,0x04,0x22,0x30,0x20,0xa4,0x1e,0x30,0x1c,0x31,0x1a,0x30, -0x18,0x06,0x03,0x55,0x04,0x03,0x13,0x11,0x43,0x6c,0x61,0x73,0x73,0x33,0x43, -0x41,0x32,0x30,0x34,0x38,0x2d,0x31,0x2d,0x34,0x33,0x30,0x1d,0x06,0x03,0x55, -0x1d,0x0e,0x04,0x16,0x04,0x14,0x08,0xf5,0x51,0xe8,0xfb,0xfe,0x3d,0x3d,0x64, -0x36,0x7c,0x68,0xcf,0x5b,0x78,0xa8,0xdf,0xb9,0xc5,0x37,0x30,0x81,0x80,0x06, -0x03,0x55,0x1d,0x23,0x04,0x79,0x30,0x77,0xa1,0x63,0xa4,0x61,0x30,0x5f,0x31, -0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30, -0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65,0x72,0x69,0x53,0x69,0x67, -0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x37,0x30,0x35,0x06,0x03,0x55,0x04, -0x0b,0x13,0x2e,0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6c, -0x69,0x63,0x20,0x50,0x72,0x69,0x6d,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74, -0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x20,0x41,0x75,0x74,0x68,0x6f, -0x72,0x69,0x74,0x79,0x82,0x10,0x70,0xba,0xe4,0x1d,0x10,0xd9,0x29,0x34,0xb6, -0x38,0xca,0x7b,0x03,0xcc,0xba,0xbf,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86, -0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x81,0x81,0x00,0xae,0x3a,0x17,0xb8, -0x4a,0x7b,0x55,0xfa,0x64,0x55,0xec,0x40,0xa4,0xed,0x49,0x41,0x90,0x99,0x9c, -0x89,0xbc,0xaf,0x2e,0x1d,0xca,0x78,0x23,0xf9,0x1c,0x19,0x0f,0x7f,0xeb,0x68, -0xbc,0x32,0xd9,0x88,0x38,0xde,0xdc,0x3f,0xd3,0x89,0xb4,0x3f,0xb1,0x82,0x96, -0xf1,0xa4,0x5a,0xba,0xed,0x2e,0x26,0xd3,0xde,0x7c,0x01,0x6e,0x00,0x0a,0x00, -0xa4,0x06,0x92,0x11,0x48,0x09,0x40,0xf9,0x1c,0x18,0x79,0x67,0x23,0x24,0xe0, -0xbb,0xd5,0xe1,0x50,0xae,0x1b,0xf5,0x0e,0xdd,0xe0,0x2e,0x81,0xcd,0x80,0xa3, -0x6c,0x52,0x4f,0x91,0x75,0x55,0x8a,0xba,0x22,0xf2,0xd2,0xea,0x41,0x75,0x88, -0x2f,0x63,0x55,0x7d,0x1e,0x54,0x5a,0x95,0x59,0xca,0xd9,0x34,0x81,0xc0,0x5f, -0x5e,0xf6,0x7a,0xb5 }; -static const BYTE iTunesCert1[] = { -0x30,0x82,0x04,0xf1,0x30,0x82,0x03,0xd9,0xa0,0x03,0x02,0x01,0x02,0x02,0x10, -0x0f,0x1a,0xa0,0xe0,0x9b,0x9b,0x61,0xa6,0xb6,0xfe,0x40,0xd2,0xdf,0x6a,0xf6, -0x8d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05, -0x00,0x30,0x81,0xb4,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02, -0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0a,0x13,0x0e,0x56,0x65, -0x72,0x69,0x53,0x69,0x67,0x6e,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x31,0x1f,0x30, -0x1d,0x06,0x03,0x55,0x04,0x0b,0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69,0x67, -0x6e,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4e,0x65,0x74,0x77,0x6f,0x72,0x6b, -0x31,0x3b,0x30,0x39,0x06,0x03,0x55,0x04,0x0b,0x13,0x32,0x54,0x65,0x72,0x6d, -0x73,0x20,0x6f,0x66,0x20,0x75,0x73,0x65,0x20,0x61,0x74,0x20,0x68,0x74,0x74, -0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x76,0x65,0x72,0x69,0x73,0x69, -0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f,0x72,0x70,0x61,0x20,0x28,0x63,0x29,0x30, -0x34,0x31,0x2e,0x30,0x2c,0x06,0x03,0x55,0x04,0x03,0x13,0x25,0x56,0x65,0x72, -0x69,0x53,0x69,0x67,0x6e,0x20,0x43,0x6c,0x61,0x73,0x73,0x20,0x33,0x20,0x43, -0x6f,0x64,0x65,0x20,0x53,0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x32,0x30,0x30, -0x34,0x20,0x43,0x41,0x30,0x1e,0x17,0x0d,0x30,0x36,0x30,0x31,0x31,0x37,0x30, -0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x30,0x38,0x30,0x31,0x32,0x32,0x32, -0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x81,0xb4,0x31,0x0b,0x30,0x09,0x06,0x03, -0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04, -0x08,0x13,0x0a,0x43,0x61,0x6c,0x69,0x66,0x6f,0x72,0x6e,0x69,0x61,0x31,0x12, -0x30,0x10,0x06,0x03,0x55,0x04,0x07,0x13,0x09,0x43,0x75,0x70,0x65,0x72,0x74, -0x69,0x6e,0x6f,0x31,0x1d,0x30,0x1b,0x06,0x03,0x55,0x04,0x0a,0x14,0x14,0x41, -0x70,0x70,0x6c,0x65,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x2c,0x20, -0x49,0x6e,0x63,0x2e,0x31,0x3e,0x30,0x3c,0x06,0x03,0x55,0x04,0x0b,0x13,0x35, -0x44,0x69,0x67,0x69,0x74,0x61,0x6c,0x20,0x49,0x44,0x20,0x43,0x6c,0x61,0x73, -0x73,0x20,0x33,0x20,0x2d,0x20,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74, -0x20,0x53,0x6f,0x66,0x74,0x77,0x61,0x72,0x65,0x20,0x56,0x61,0x6c,0x69,0x64, -0x61,0x74,0x69,0x6f,0x6e,0x20,0x76,0x32,0x31,0x1d,0x30,0x1b,0x06,0x03,0x55, -0x04,0x03,0x14,0x14,0x41,0x70,0x70,0x6c,0x65,0x20,0x43,0x6f,0x6d,0x70,0x75, -0x74,0x65,0x72,0x2c,0x20,0x49,0x6e,0x63,0x2e,0x30,0x81,0x9f,0x30,0x0d,0x06, -0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8d, -0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xd3,0xab,0x3b,0x7f,0xec,0x48,0x84, -0xce,0xa8,0x1a,0x12,0xf3,0x3c,0x87,0xcb,0x24,0x58,0x96,0x02,0x87,0x66,0x49, -0xeb,0x89,0xee,0x79,0x44,0x70,0x8d,0xe7,0xd4,0x1f,0x30,0x92,0xc0,0x9c,0x35, -0x78,0xc0,0xaf,0x1c,0xb6,0x28,0xd3,0xe0,0xe0,0x9d,0xd3,0x49,0x76,0x73,0x57, -0x19,0x4d,0x8d,0x70,0x85,0x64,0x4d,0x1d,0xc6,0x02,0x3e,0xe5,0x2c,0x66,0x07, -0xd2,0x27,0x4b,0xd6,0xc8,0x3c,0x93,0xb6,0x15,0x0c,0xde,0x5b,0xd7,0x93,0xdd, -0xbe,0x85,0x62,0x34,0x17,0x8a,0x05,0x60,0xf0,0x8a,0x1c,0x5a,0x40,0x21,0x8d, -0x51,0x6c,0xb0,0x62,0xd8,0xb5,0xd4,0xf9,0xb1,0xd0,0x58,0x7a,0x7a,0x82,0x55, -0xb3,0xf9,0x53,0x71,0xde,0xd2,0xc9,0x37,0x8c,0xf6,0x5a,0x1f,0x2d,0xcd,0x7c, -0x67,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x7f,0x30,0x82,0x01,0x7b,0x30, -0x09,0x06,0x03,0x55,0x1d,0x13,0x04,0x02,0x30,0x00,0x30,0x0e,0x06,0x03,0x55, -0x1d,0x0f,0x01,0x01,0xff,0x04,0x04,0x03,0x02,0x07,0x80,0x30,0x40,0x06,0x03, -0x55,0x1d,0x1f,0x04,0x39,0x30,0x37,0x30,0x35,0xa0,0x33,0xa0,0x31,0x86,0x2f, -0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x43,0x53,0x43,0x33,0x2d,0x32,0x30,0x30, -0x34,0x2d,0x63,0x72,0x6c,0x2e,0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e, -0x63,0x6f,0x6d,0x2f,0x43,0x53,0x43,0x33,0x2d,0x32,0x30,0x30,0x34,0x2e,0x63, -0x72,0x6c,0x30,0x44,0x06,0x03,0x55,0x1d,0x20,0x04,0x3d,0x30,0x3b,0x30,0x39, -0x06,0x0b,0x60,0x86,0x48,0x01,0x86,0xf8,0x45,0x01,0x07,0x17,0x03,0x30,0x2a, -0x30,0x28,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16,0x1c,0x68, -0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x76,0x65,0x72,0x69, -0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f,0x72,0x70,0x61,0x30,0x13,0x06, -0x03,0x55,0x1d,0x25,0x04,0x0c,0x30,0x0a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05, -0x07,0x03,0x03,0x30,0x75,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01, -0x04,0x69,0x30,0x67,0x30,0x24,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30, -0x01,0x86,0x18,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6f,0x63,0x73,0x70,0x2e, -0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x30,0x3f,0x06, -0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x33,0x68,0x74,0x74,0x70, -0x3a,0x2f,0x2f,0x43,0x53,0x43,0x33,0x2d,0x32,0x30,0x30,0x34,0x2d,0x61,0x69, -0x61,0x2e,0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6e,0x2e,0x63,0x6f,0x6d,0x2f, -0x43,0x53,0x43,0x33,0x2d,0x32,0x30,0x30,0x34,0x2d,0x61,0x69,0x61,0x2e,0x63, -0x65,0x72,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14, -0x08,0xf5,0x51,0xe8,0xfb,0xfe,0x3d,0x3d,0x64,0x36,0x7c,0x68,0xcf,0x5b,0x78, -0xa8,0xdf,0xb9,0xc5,0x37,0x30,0x11,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xf8, -0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x04,0x10,0x30,0x16,0x06,0x0a,0x2b,0x06, -0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x1b,0x04,0x08,0x30,0x06,0x01,0x01,0x00, -0x01,0x01,0xff,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01, -0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x6a,0xa6,0x06,0xd0,0x33,0x18,0x64, -0xe2,0x69,0x82,0xee,0x6e,0x36,0x9e,0x9d,0x9a,0x0e,0x18,0xa8,0xac,0x9d,0x10, -0xed,0x01,0x3c,0xb9,0x61,0x04,0x62,0xf3,0x85,0x8f,0xcc,0x4f,0x2c,0x66,0x35, -0x54,0x25,0x45,0x8d,0x95,0x1c,0xd2,0x33,0xbe,0x2e,0xdd,0x7f,0x74,0xaf,0x03, -0x7b,0x86,0x63,0xb0,0xc9,0xe6,0xbd,0xc7,0x8e,0xde,0x03,0x18,0x98,0x82,0xc3, -0xbb,0xf8,0x15,0x99,0x1a,0xa9,0xdd,0xb9,0x5d,0xb9,0xbd,0x53,0x95,0x25,0x76, -0xfb,0x5c,0x53,0x90,0xea,0x01,0x0a,0xa0,0xb1,0xbf,0x09,0x1b,0x97,0x8f,0x40, -0xfa,0x85,0x12,0x74,0x01,0xdb,0xf6,0xdb,0x09,0xd6,0x5f,0x4f,0xd7,0x17,0xb4, -0xbf,0x9e,0x2f,0x86,0x52,0x5d,0x70,0x24,0x52,0x32,0x1e,0xa5,0x1d,0x39,0x8b, -0x66,0xf6,0xba,0x9b,0x69,0x8e,0x12,0x60,0xdb,0xb6,0xcf,0xe6,0x0d,0xd6,0x1c, -0x8f,0xd4,0x5b,0x4b,0x00,0xde,0x21,0x93,0xfb,0x6e,0xc7,0x3d,0xb4,0x66,0x0d, -0x29,0x0c,0x4e,0xe9,0x3f,0x94,0xd6,0xd6,0xdc,0xec,0xf8,0x53,0x3b,0x62,0xd5, -0x97,0x50,0x53,0x84,0x17,0xfe,0xe2,0xed,0x4c,0x23,0x0a,0x49,0xce,0x5b,0xe9, -0x70,0x31,0xc1,0x04,0x02,0x02,0x6c,0xb8,0x52,0xcd,0xc7,0x4e,0x70,0xb4,0x13, -0xd7,0xe0,0x92,0xba,0x44,0x1a,0x10,0x4c,0x6e,0x45,0xc6,0x86,0x04,0xc6,0x64, -0xd3,0x9c,0x6e,0xc1,0x9c,0xac,0x74,0x3d,0x77,0x06,0x5e,0x28,0x28,0x5c,0xf5, -0xe0,0x9c,0x19,0xd8,0xba,0x74,0x81,0x2d,0x67,0x77,0x93,0x8d,0xbf,0xd2,0x52, -0x00,0xe6,0xa5,0x38,0x4e,0x2e,0x73,0x66,0x7a }; static const BYTE verisignCA[] = { 0x30,0x82,0x02,0x3c,0x30,0x82,0x01,0xa5,0x02,0x10,0x70,0xba,0xe4,0x1d,0x10, 0xd9,0x29,0x34,0xb6,0x38,0xca,0x7b,0x03,0xcc,0xba,0xbf,0x30,0x0d,0x06,0x09, @@ -1273,7 +1106,7 @@ static const BYTE chain5_1[] = { * A chain whose end certificate is a CA. */ /* chain0_0 -> chain 7_1: - * A chain with a bad critical extension. + * A chain whose end cert has a bad critical extension. */ static const BYTE chain7_1[] = { 0x30,0x82,0x01,0x93,0x30,0x81,0xfd,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01, @@ -2503,6 +2336,103 @@ static const BYTE chain29_1[] = { 0x3a,0xe9,0x27,0xa4,0x57,0x27,0x34,0xa7,0x42,0xde,0x78,0x1a,0x71,0x80,0x23, 0xd6,0xd7,0x22,0xf0,0x24,0x0d,0x71,0xf1,0x2b,0xd0,0xd8,0x76,0x3d,0xef,0x4c, 0xce,0x1c,0x3b,0x83,0x1b,0x63,0x10,0x6c,0x63,0xe5,0x69 }; +/* chain0_0 -> chain30_1 -> chain30_2 + * A chain whose intermediate certificate has an unsupported critical + * extension. + */ +static const BYTE chain30_1[] = { +0x30,0x82,0x01,0xc0,0x30,0x82,0x01,0x2b,0xa0,0x03,0x02,0x01,0x02,0x02,0x01, +0x01,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x30, +0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x43,0x65,0x72, +0x74,0x31,0x30,0x1e,0x17,0x0d,0x30,0x37,0x30,0x35,0x30,0x31,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x17,0x0d,0x30,0x37,0x31,0x30,0x30,0x31,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x30,0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03, +0x13,0x05,0x43,0x65,0x72,0x74,0x32,0x30,0x81,0x9d,0x30,0x0b,0x06,0x09,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x03,0x81,0x8d,0x00,0x30,0x81,0x89, +0x02,0x81,0x81,0x00,0xb8,0x52,0xda,0xc5,0x4b,0x3f,0xe5,0x33,0x0e,0x67,0x5f, +0x48,0x21,0xdc,0x7e,0xef,0x37,0x33,0xba,0xff,0xb4,0xc6,0xdc,0xb6,0x17,0x8e, +0x20,0x55,0x07,0x12,0xd2,0x7b,0x3c,0xce,0x30,0xc5,0xa7,0x48,0x9f,0x6e,0xfe, +0xb8,0xbe,0xdb,0x9f,0x9b,0x17,0x60,0x16,0xde,0xc6,0x8b,0x47,0xd1,0x57,0x71, +0x3c,0x93,0xfc,0xbd,0xec,0x44,0x32,0x3b,0xb9,0xcf,0x6b,0x05,0x72,0xa7,0x87, +0x8e,0x7e,0xd4,0x9a,0x87,0x1c,0x2f,0xb7,0x82,0x40,0xfc,0x6a,0x80,0x83,0x68, +0x28,0xce,0x84,0xf4,0x0b,0x2e,0x44,0xcb,0x53,0xac,0x85,0x85,0xb5,0x46,0x36, +0x98,0x3c,0x10,0x02,0xaa,0x02,0xbc,0x8b,0xa2,0x23,0xb2,0xd3,0x51,0x9a,0x22, +0x4a,0xe3,0xaa,0x4e,0x7c,0xda,0x38,0xcf,0x49,0x98,0x72,0xa3,0x02,0x03,0x01, +0x00,0x01,0xa3,0x30,0x30,0x2e,0x30,0x0e,0x06,0x03,0x55,0x1d,0x0f,0x01,0x01, +0xff,0x04,0x04,0x03,0x02,0x00,0x04,0x30,0x0f,0x06,0x03,0x55,0x1d,0x13,0x01, +0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x0b,0x06,0x02,0x2a,0x03, +0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86, +0xf7,0x0d,0x01,0x01,0x05,0x03,0x81,0x81,0x00,0x51,0x3e,0x35,0x1b,0x66,0x3c, +0xca,0x5e,0xf3,0xf9,0x1b,0xd5,0x03,0x13,0xf8,0xcf,0x87,0xdf,0xed,0x75,0xa6, +0xcd,0x4b,0x1c,0x15,0xd3,0xd8,0x58,0x85,0x85,0x2c,0x64,0x31,0xbd,0xbb,0xad, +0xff,0x38,0x64,0xc5,0x16,0x43,0x14,0x0e,0x71,0x35,0xf3,0xe9,0xca,0xf9,0xf4, +0x69,0xa7,0x67,0xa8,0x0f,0xc9,0xcf,0x6f,0x22,0xe5,0x39,0xb8,0xfc,0xe7,0x50, +0x82,0xf7,0xa4,0xaa,0x29,0xe1,0xa9,0xb5,0x03,0x5e,0x0b,0x5f,0x9c,0x8e,0x29, +0x64,0xe5,0xb6,0xed,0xde,0x04,0x0e,0xdb,0xad,0xa3,0xc6,0x2a,0xb0,0x12,0x86, +0x60,0xd4,0xff,0xd8,0xea,0x85,0x54,0x34,0xca,0xc1,0x85,0x4e,0xb5,0x15,0x96, +0xb7,0xa5,0x64,0x7b,0xc7,0x76,0xcb,0x04,0x75,0x9e,0x1e,0xbd,0x62,0x79,0xc5, +0x1f,0x32 }; +static const BYTE chain30_2[] = { +0x30,0x82,0x01,0x8d,0x30,0x81,0xf9,0xa0,0x03,0x02,0x01,0x02,0x02,0x01,0x01, +0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x30,0x10, +0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x43,0x65,0x72,0x74, +0x32,0x30,0x1e,0x17,0x0d,0x30,0x37,0x30,0x39,0x30,0x31,0x30,0x30,0x30,0x30, +0x30,0x30,0x5a,0x17,0x0d,0x30,0x37,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39, +0x35,0x39,0x5a,0x30,0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13, +0x05,0x43,0x65,0x72,0x74,0x33,0x30,0x81,0x9d,0x30,0x0b,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x03,0x81,0x8d,0x00,0x30,0x81,0x89,0x02, +0x81,0x81,0x00,0xc3,0x31,0x35,0xc3,0x9d,0x8a,0x87,0x20,0xc6,0x32,0xe9,0xb1, +0xf6,0x8f,0xf9,0x05,0x73,0x1d,0xa7,0xde,0xab,0x15,0x8a,0x9c,0x7f,0x11,0x7e, +0x77,0xa0,0x42,0x80,0xf4,0x79,0xda,0x98,0x7b,0x00,0xfa,0x8f,0x0c,0xd0,0xeb, +0x8a,0x80,0xed,0x07,0xfc,0x64,0x71,0x03,0xc1,0xd6,0x2f,0x9b,0xde,0x42,0x63, +0xd9,0x79,0xea,0xdd,0x10,0xe8,0x68,0xc8,0x69,0x4f,0x4a,0x39,0x23,0x87,0xca, +0xd1,0xc9,0x77,0x14,0x30,0x85,0x9e,0xf7,0x79,0xf9,0x07,0xb7,0x7c,0x55,0xcb, +0xa7,0xd5,0xb8,0x44,0xb5,0x20,0xb5,0x01,0x5c,0xa2,0xd1,0xd5,0xad,0x0f,0x87, +0xaf,0x37,0xd1,0x39,0x0c,0x0d,0xd5,0xde,0x26,0x7a,0xed,0xf9,0x2a,0xb1,0x60, +0x65,0x2d,0x08,0x24,0x51,0x1d,0xb0,0x0a,0xb5,0x13,0xc7,0x02,0x03,0x01,0x00, +0x01,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x03, +0x81,0x81,0x00,0x14,0x75,0x85,0xcc,0x68,0xfe,0x98,0x6f,0xf6,0x67,0x00,0x5b, +0x0c,0xfc,0x36,0x18,0xf4,0x56,0x46,0x7c,0xb9,0xfa,0x6c,0xe6,0x37,0xaf,0x69, +0x37,0x93,0x8c,0x35,0x3a,0x1b,0x58,0x2f,0xe2,0x06,0x39,0x85,0x3f,0x73,0xcf, +0xe1,0x3f,0x27,0x19,0x60,0xc3,0x1b,0xf6,0x69,0x3b,0x8e,0x57,0x7b,0xd8,0xb9, +0xc6,0x9f,0x13,0x72,0x22,0x04,0x8f,0x5c,0x54,0x13,0x8c,0x63,0xe3,0x6b,0x70, +0x98,0xec,0xcc,0xe1,0x93,0xb1,0x4b,0x30,0x4c,0xde,0xe8,0x3c,0x68,0x38,0x44, +0x5e,0xe2,0x2b,0xf5,0xa1,0xee,0x02,0x7e,0x09,0x15,0xff,0xc9,0xf6,0xaf,0xf5, +0xcc,0xeb,0xfc,0xe7,0x3c,0x92,0xdb,0x31,0xab,0x1e,0xb8,0x9e,0xf0,0x5e,0xa3, +0x93,0xfe,0xab,0x26,0x7b,0x01,0xa8,0x98,0x88,0xbb,0xee }; +/* chain0_0 -> chain31_1: a chain whose end certificate has two CNs, a + * wildcard name "*.foo.com" and a non-wildcard name "foo.com". + */ +static const BYTE chain31_1[] = { +0x30,0x82,0x01,0xa2,0x30,0x82,0x01,0x0d,0xa0,0x03,0x02,0x01,0x02,0x02,0x01, +0x01,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x30, +0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x43,0x65,0x72, +0x74,0x31,0x30,0x1e,0x17,0x0d,0x30,0x37,0x30,0x35,0x30,0x31,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x17,0x0d,0x30,0x37,0x31,0x30,0x30,0x31,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x30,0x24,0x31,0x22,0x30,0x0e,0x06,0x03,0x55,0x04,0x03, +0x13,0x07,0x66,0x6f,0x6f,0x2e,0x63,0x6f,0x6d,0x30,0x10,0x06,0x03,0x55,0x04, +0x03,0x13,0x09,0x2a,0x2e,0x66,0x6f,0x6f,0x2e,0x63,0x6f,0x6d,0x30,0x81,0x9d, +0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x03,0x81, +0x8d,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xb8,0x52,0xda,0xc5,0x4b,0x3f, +0xe5,0x33,0x0e,0x67,0x5f,0x48,0x21,0xdc,0x7e,0xef,0x37,0x33,0xba,0xff,0xb4, +0xc6,0xdc,0xb6,0x17,0x8e,0x20,0x55,0x07,0x12,0xd2,0x7b,0x3c,0xce,0x30,0xc5, +0xa7,0x48,0x9f,0x6e,0xfe,0xb8,0xbe,0xdb,0x9f,0x9b,0x17,0x60,0x16,0xde,0xc6, +0x8b,0x47,0xd1,0x57,0x71,0x3c,0x93,0xfc,0xbd,0xec,0x44,0x32,0x3b,0xb9,0xcf, +0x6b,0x05,0x72,0xa7,0x87,0x8e,0x7e,0xd4,0x9a,0x87,0x1c,0x2f,0xb7,0x82,0x40, +0xfc,0x6a,0x80,0x83,0x68,0x28,0xce,0x84,0xf4,0x0b,0x2e,0x44,0xcb,0x53,0xac, +0x85,0x85,0xb5,0x46,0x36,0x98,0x3c,0x10,0x02,0xaa,0x02,0xbc,0x8b,0xa2,0x23, +0xb2,0xd3,0x51,0x9a,0x22,0x4a,0xe3,0xaa,0x4e,0x7c,0xda,0x38,0xcf,0x49,0x98, +0x72,0xa3,0x02,0x03,0x01,0x00,0x01,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86, +0xf7,0x0d,0x01,0x01,0x05,0x03,0x81,0x81,0x00,0xa0,0x93,0x52,0x87,0x81,0xe2, +0xff,0x2a,0xc7,0xef,0x5f,0x3c,0xbc,0x88,0x99,0xc0,0x47,0x3e,0x13,0xe9,0x87, +0xfa,0x36,0xd7,0xb5,0xe8,0xdf,0x70,0xcc,0x36,0xe4,0x70,0x3c,0xcd,0xa2,0x0b, +0x31,0x6e,0x0a,0xb9,0x00,0xf0,0x4f,0xb6,0xc2,0xce,0xf4,0x33,0x1e,0xc0,0x29, +0xc0,0x73,0x0c,0xcf,0x28,0xa5,0x26,0x9d,0xc2,0xaf,0x85,0x30,0x81,0xbf,0xd1, +0x70,0x3f,0x69,0x15,0xc5,0x41,0x1d,0x8e,0xd4,0xfa,0x02,0xcd,0xba,0xf1,0xf2, +0x67,0xb5,0x45,0x29,0xad,0xe8,0x54,0x9a,0x0f,0x1a,0x8f,0xdf,0x16,0xf4,0xcb, +0x43,0x08,0xe5,0x78,0x2b,0x95,0xf3,0x75,0xb6,0x88,0xf0,0x6b,0x5c,0x5b,0x50, +0x04,0x91,0x3b,0x89,0x5a,0x60,0x1f,0xfc,0x36,0x53,0x32,0x36,0x0a,0x4d,0x03, +0x2c,0xd7 }; typedef struct _CONST_DATA_BLOB { @@ -2566,7 +2496,9 @@ static PCCERT_CHAIN_CONTEXT getChain(HCERTCHAINENGINE engine, CERT_CHAIN_PARA chainPara = { sizeof(chainPara), { 0 } }; FILETIME fileTime; - SystemTimeToFileTime(checkTime, &fileTime); + ok(SystemTimeToFileTime(checkTime, &fileTime), + "SystemTimeToFileTime failed for day %d, month %d, year %d\n", + checkTime->wDay, checkTime->wMonth, checkTime->wYear); ret = pCertGetCertificateChain(engine, endCert, &fileTime, includeStore ? store : NULL, &chainPara, flags, NULL, &chain); if (todo & TODO_CHAIN) @@ -2590,62 +2522,64 @@ typedef struct _SimpleChainStatusCheck static void checkElementStatus(const CERT_TRUST_STATUS *expected, const CERT_TRUST_STATUS *got, const CERT_TRUST_STATUS *ignore, - DWORD todo, DWORD testIndex, DWORD chainIndex, DWORD elementIndex) + DWORD todo, LPCSTR testName, DWORD testIndex, DWORD chainIndex, + DWORD elementIndex) { if (got->dwErrorStatus == expected->dwErrorStatus) ok(got->dwErrorStatus == expected->dwErrorStatus, - "Chain %d, element [%d,%d]: expected error %08x, got %08x\n", - testIndex, chainIndex, elementIndex, expected->dwErrorStatus, + "%s[%d], element [%d,%d]: expected error %08x, got %08x\n", + testName, testIndex, chainIndex, elementIndex, expected->dwErrorStatus, got->dwErrorStatus); else if (todo & TODO_ERROR) todo_wine ok(got->dwErrorStatus == expected->dwErrorStatus || broken((got->dwErrorStatus & ~ignore->dwErrorStatus) == (expected->dwErrorStatus & ~ignore->dwErrorStatus)), - "Chain %d, element [%d,%d]: expected error %08x, got %08x\n", - testIndex, chainIndex, elementIndex, expected->dwErrorStatus, + "%s[%d], element [%d,%d]: expected error %08x, got %08x\n", + testName, testIndex, chainIndex, elementIndex, expected->dwErrorStatus, got->dwErrorStatus); else ok(got->dwErrorStatus == expected->dwErrorStatus || broken((got->dwErrorStatus & ~ignore->dwErrorStatus) == (expected->dwErrorStatus & ~ignore->dwErrorStatus)), - "Chain %d, element [%d,%d]: expected error %08x, got %08x. %08x is " + "%s[%d], element [%d,%d]: expected error %08x, got %08x. %08x is " "expected if no valid Verisign root certificate is available.\n", - testIndex, chainIndex, elementIndex, expected->dwErrorStatus, + testName, testIndex, chainIndex, elementIndex, expected->dwErrorStatus, got->dwErrorStatus, CERT_TRUST_IS_UNTRUSTED_ROOT); if (got->dwInfoStatus == expected->dwInfoStatus) ok(got->dwInfoStatus == expected->dwInfoStatus, - "Chain %d, element [%d,%d]: expected info %08x, got %08x\n", - testIndex, chainIndex, elementIndex, expected->dwInfoStatus, + "%s[%d], element [%d,%d]: expected info %08x, got %08x\n", + testName, testIndex, chainIndex, elementIndex, expected->dwInfoStatus, got->dwInfoStatus); else if (todo & TODO_INFO) todo_wine ok(got->dwInfoStatus == expected->dwInfoStatus || broken((got->dwInfoStatus & ~ignore->dwInfoStatus) == (expected->dwInfoStatus & ~ignore->dwInfoStatus)), - "Chain %d, element [%d,%d]: expected info %08x, got %08x\n", - testIndex, chainIndex, elementIndex, expected->dwInfoStatus, + "%s[%d], element [%d,%d]: expected info %08x, got %08x\n", + testName, testIndex, chainIndex, elementIndex, expected->dwInfoStatus, got->dwInfoStatus); else ok(got->dwInfoStatus == expected->dwInfoStatus || broken((got->dwInfoStatus & ~ignore->dwInfoStatus) == (expected->dwInfoStatus & ~ignore->dwInfoStatus)), - "Chain %d, element [%d,%d]: expected info %08x, got %08x\n", - testIndex, chainIndex, elementIndex, expected->dwInfoStatus, + "%s[%d], element [%d,%d]: expected info %08x, got %08x\n", + testName, testIndex, chainIndex, elementIndex, expected->dwInfoStatus, got->dwInfoStatus); } static void checkSimpleChainStatus(const CERT_SIMPLE_CHAIN *simpleChain, const SimpleChainStatusCheck *simpleChainStatus, - const CERT_TRUST_STATUS *ignore, DWORD todo, DWORD testIndex, DWORD chainIndex) + const CERT_TRUST_STATUS *ignore, DWORD todo, LPCSTR testName, DWORD testIndex, + DWORD chainIndex) { if (todo & TODO_ELEMENTS) todo_wine ok(simpleChain->cElement == simpleChainStatus->cElement, - "Chain %d: expected %d elements, got %d\n", testIndex, + "%s[%d]: expected %d elements, got %d\n", testName, testIndex, simpleChainStatus->cElement, simpleChain->cElement); else ok(simpleChain->cElement == simpleChainStatus->cElement, - "Chain %d: expected %d elements, got %d\n", testIndex, + "%s[%d]: expected %d elements, got %d\n", testName, testIndex, simpleChainStatus->cElement, simpleChain->cElement); if (simpleChain->cElement == simpleChainStatus->cElement) { @@ -2653,8 +2587,8 @@ static void checkSimpleChainStatus(const CERT_SIMPLE_CHAIN *simpleChain, for (i = 0; i < simpleChain->cElement; i++) checkElementStatus(&simpleChainStatus->rgElementStatus[i], - &simpleChain->rgpElement[i]->TrustStatus, ignore, todo, testIndex, - chainIndex, i); + &simpleChain->rgpElement[i]->TrustStatus, ignore, todo, testName, + testIndex, chainIndex, i); } } @@ -2667,10 +2601,11 @@ typedef struct _ChainStatusCheck } ChainStatusCheck; static void checkChainStatus(PCCERT_CHAIN_CONTEXT chain, - const ChainStatusCheck *chainStatus, DWORD todo, DWORD testIndex) + const ChainStatusCheck *chainStatus, DWORD todo, LPCSTR testName, + DWORD testIndex) { ok(chain->cChain == chainStatus->cChain, - "Chain %d: expected %d simple chains, got %d\n", testIndex, + "%s[%d]: expected %d simple chains, got %d\n", testName, testIndex, chainStatus->cChain, chain->cChain); if (todo & TODO_ERROR && chain->TrustStatus.dwErrorStatus != chainStatus->status.dwErrorStatus) @@ -2680,8 +2615,8 @@ static void checkChainStatus(PCCERT_CHAIN_CONTEXT chain, ~chainStatus->statusToIgnore.dwErrorStatus) == (chainStatus->status.dwErrorStatus & ~chainStatus->statusToIgnore.dwErrorStatus)), - "Chain %d: expected error %08x, got %08x\n", - testIndex, chainStatus->status.dwErrorStatus, + "%s[%d]: expected error %08x, got %08x\n", + testName, testIndex, chainStatus->status.dwErrorStatus, chain->TrustStatus.dwErrorStatus); else ok(chain->TrustStatus.dwErrorStatus == @@ -2690,9 +2625,9 @@ static void checkChainStatus(PCCERT_CHAIN_CONTEXT chain, ~chainStatus->statusToIgnore.dwErrorStatus) == (chainStatus->status.dwErrorStatus & ~chainStatus->statusToIgnore.dwErrorStatus)), - "Chain %d: expected error %08x, got %08x. %08x is expected if no valid " + "%s[%d]: expected error %08x, got %08x. %08x is expected if no valid " "Verisign root certificate is available.\n", - testIndex, chainStatus->status.dwErrorStatus, + testName, testIndex, chainStatus->status.dwErrorStatus, chain->TrustStatus.dwErrorStatus, CERT_TRUST_IS_UNTRUSTED_ROOT); if (todo & TODO_INFO && chain->TrustStatus.dwInfoStatus != chainStatus->status.dwInfoStatus) @@ -2702,8 +2637,8 @@ static void checkChainStatus(PCCERT_CHAIN_CONTEXT chain, ~chainStatus->statusToIgnore.dwInfoStatus) == (chainStatus->status.dwInfoStatus & ~chainStatus->statusToIgnore.dwInfoStatus)), - "Chain %d: expected info %08x, got %08x\n", - testIndex, chainStatus->status.dwInfoStatus, + "%s[%d]: expected info %08x, got %08x\n", + testName, testIndex, chainStatus->status.dwInfoStatus, chain->TrustStatus.dwInfoStatus); else ok(chain->TrustStatus.dwInfoStatus == @@ -2712,8 +2647,8 @@ static void checkChainStatus(PCCERT_CHAIN_CONTEXT chain, ~chainStatus->statusToIgnore.dwInfoStatus) == (chainStatus->status.dwInfoStatus & ~chainStatus->statusToIgnore.dwInfoStatus)), - "Chain %d: expected info %08x, got %08x\n", - testIndex, chainStatus->status.dwInfoStatus, + "%s[%d]: expected info %08x, got %08x\n", + testName, testIndex, chainStatus->status.dwInfoStatus, chain->TrustStatus.dwInfoStatus); if (chain->cChain == chainStatus->cChain) { @@ -2722,7 +2657,7 @@ static void checkChainStatus(PCCERT_CHAIN_CONTEXT chain, for (i = 0; i < chain->cChain; i++) checkSimpleChainStatus(chain->rgpChain[i], &chainStatus->rgChainStatus[i], &chainStatus->statusToIgnore, - todo, testIndex, i); + todo, testName, testIndex, i); } } @@ -3112,6 +3047,25 @@ static const CERT_TRUST_STATUS elementStatus29[] = { static const SimpleChainStatusCheck simpleStatus29[] = { { sizeof(elementStatus29) / sizeof(elementStatus29[0]), elementStatus29 }, }; +static CONST_DATA_BLOB chain30[] = { + { sizeof(chain0_0), chain0_0 }, + { sizeof(chain30_1), chain30_1 }, + { sizeof(chain30_2), chain30_2 }, +}; +static const CERT_TRUST_STATUS elementStatus30[] = { + { CERT_TRUST_NO_ERROR, CERT_TRUST_HAS_NAME_MATCH_ISSUER }, + { CERT_TRUST_INVALID_EXTENSION | CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT, + CERT_TRUST_HAS_NAME_MATCH_ISSUER }, + { CERT_TRUST_IS_UNTRUSTED_ROOT, + CERT_TRUST_IS_SELF_SIGNED | CERT_TRUST_HAS_NAME_MATCH_ISSUER }, +}; +static const SimpleChainStatusCheck simpleStatus30[] = { + { sizeof(elementStatus30) / sizeof(elementStatus30[0]), elementStatus30 }, +}; +static CONST_DATA_BLOB chain31[] = { + { sizeof(chain0_0), chain0_0 }, + { sizeof(chain31_1), chain31_1 }, +}; static CONST_DATA_BLOB selfSignedChain[] = { { sizeof(selfSignedCert), selfSignedCert } }; @@ -3123,21 +3077,6 @@ static const SimpleChainStatusCheck selfSignedSimpleStatus[] = { { sizeof(selfSignedElementStatus) / sizeof(selfSignedElementStatus[0]), selfSignedElementStatus }, }; -static CONST_DATA_BLOB iTunesChain[] = { - { sizeof(verisignCA), verisignCA }, - { sizeof(iTunesCert0), iTunesCert0 }, - { sizeof(iTunesCert1), iTunesCert1 }, -}; -static const CERT_TRUST_STATUS iTunesElementStatus[] = { - { CERT_TRUST_NO_ERROR, CERT_TRUST_HAS_KEY_MATCH_ISSUER }, - { CERT_TRUST_NO_ERROR, CERT_TRUST_HAS_EXACT_MATCH_ISSUER }, - { CERT_TRUST_NO_ERROR, - CERT_TRUST_HAS_NAME_MATCH_ISSUER | CERT_TRUST_IS_SELF_SIGNED}, -}; -static const SimpleChainStatusCheck iTunesSimpleStatus[] = { - { sizeof(iTunesElementStatus) / sizeof(iTunesElementStatus[0]), - iTunesElementStatus }, -}; static CONST_DATA_BLOB googleChain[] = { { sizeof(verisignCA), verisignCA }, { sizeof(thawte_sgc_ca), thawte_sgc_ca }, @@ -3174,6 +3113,21 @@ static const SimpleChainStatusCheck opensslSimpleStatus[] = { { sizeof(opensslElementStatus) / sizeof(opensslElementStatus[0]), opensslElementStatus }, }; +/* The OpenSSL chain may not have its root trusted, in which case the chain + * is truncated (on Win98). + */ +static CONST_DATA_BLOB incompleteOpensslChain[] = { + { sizeof(global_sign_ca), global_sign_ca }, + { sizeof(openssl_org), openssl_org }, +}; +static const CERT_TRUST_STATUS incompleteOpensslElementStatus[] = { + { CERT_TRUST_IS_NOT_TIME_VALID, CERT_TRUST_HAS_KEY_MATCH_ISSUER }, + { CERT_TRUST_NO_ERROR, CERT_TRUST_HAS_KEY_MATCH_ISSUER }, +}; +static const SimpleChainStatusCheck incompleteOpensslSimpleStatus[] = { + { sizeof(incompleteOpensslElementStatus) / sizeof(incompleteOpensslElementStatus[0]), + incompleteOpensslElementStatus }, +}; /* entrust_ca -> aaa_certificate_services -> cs_stanford_edu */ /* cs.stanford.edu's cert is only valid from 7/16/2009 to 7/16/2012, so with * the date tested (October 2007) it's not time valid. @@ -3398,29 +3352,33 @@ static ChainCheck chainCheck[] = { 1, simpleStatus28 }, 0 }, /* chain29 is handled separately elsewhere */ + /* Microsoft incorrectly ignores unknown/unsupported critical extensions on + * older Windows versions, so ignore the error on Windows. + */ + { { sizeof(chain30) / sizeof(chain30[0]), chain30 }, + { { CERT_TRUST_IS_NOT_TIME_NESTED | CERT_TRUST_IS_NOT_VALID_FOR_USAGE | + CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT | + CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT | + CERT_TRUST_INVALID_EXTENSION | + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT, + CERT_TRUST_HAS_PREFERRED_ISSUER }, + { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_INVALID_EXTENSION | + CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT, 0 }, + 1, simpleStatus30 }, + 0 }, { { sizeof(selfSignedChain) / sizeof(selfSignedChain[0]), selfSignedChain }, { { 0, CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_IS_NOT_TIME_VALID | CERT_TRUST_IS_UNTRUSTED_ROOT, 0 }, 1, selfSignedSimpleStatus }, 0 }, - /* The iTunes chain may or may not have its root trusted, so ignore the - * error - */ - { { sizeof(iTunesChain) / sizeof(iTunesChain[0]), iTunesChain }, - { { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_PREFERRED_ISSUER }, - { 0, 0 }, - 1, iTunesSimpleStatus }, 0 }, - /* The google chain may or may not have its root trusted, so ignore the error + /* The google chain may or may not have its root trusted, so ignore the error. + * The chain is also considered not time nested on Win98, so ignore that + * error too. */ { { sizeof(googleChain) / sizeof(googleChain[0]), googleChain }, - { { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_PREFERRED_ISSUER }, + { { CERT_TRUST_IS_UNTRUSTED_ROOT | CERT_TRUST_IS_NOT_TIME_NESTED, + CERT_TRUST_HAS_PREFERRED_ISSUER }, { CERT_TRUST_IS_NOT_TIME_VALID, 0 }, 1, googleSimpleStatus }, 0 }, - /* The openssl chain may or may not have its root trusted, so ignore the error - */ - { { sizeof(opensslChain) / sizeof(opensslChain[0]), opensslChain }, - { { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_PREFERRED_ISSUER }, - { CERT_TRUST_IS_NOT_TIME_VALID, 0 }, - 1, opensslSimpleStatus }, 0 }, /* The stanford chain may or may not have its root trusted, so ignore the error */ { { sizeof(stanfordChain) / sizeof(stanfordChain[0]), stanfordChain }, @@ -3449,6 +3407,20 @@ static ChainCheck chainCheckNoStore[] = { 0 }, }; + /* The openssl chain may or may not have its root trusted, so ignore the error + */ +static ChainCheck opensslChainCheck = + { { sizeof(opensslChain) / sizeof(opensslChain[0]), opensslChain }, + { { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_PREFERRED_ISSUER }, + { CERT_TRUST_IS_NOT_TIME_VALID, 0 }, + 1, opensslSimpleStatus }, 0 }; +static ChainCheck incompleteOpensslChainCheck = + { { sizeof(incompleteOpensslChain) / sizeof(incompleteOpensslChain[0]), + incompleteOpensslChain }, + { { CERT_TRUST_IS_UNTRUSTED_ROOT, CERT_TRUST_HAS_PREFERRED_ISSUER }, + { CERT_TRUST_IS_NOT_TIME_VALID | CERT_TRUST_IS_PARTIAL_CHAIN, 0 }, + 1, incompleteOpensslSimpleStatus }, 0 }; + /* Chain27 checks a certificate with a subject alternate name containing an * embedded NULL. Newer crypt32 versions fail to decode such alternate names, * correctly prohibiting them. Older crypt32 versions do not. Rather than @@ -3572,7 +3544,7 @@ static void testGetCertChain(void) { ok(chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_NOT_VALID_FOR_USAGE, "expected CERT_TRUST_IS_NOT_VALID_FOR_USAGE\n"); - CertFreeCertificateChain(chain); + pCertFreeCertificateChain(chain); } oids[0] = oid_server_auth; ret = pCertGetCertificateChain(NULL, cert, &fileTime, store, ¶, @@ -3583,7 +3555,7 @@ static void testGetCertChain(void) ok(!(chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_NOT_VALID_FOR_USAGE), "didn't expect CERT_TRUST_IS_NOT_VALID_FOR_USAGE\n"); - CertFreeCertificateChain(chain); + pCertFreeCertificateChain(chain); } oids[1] = one_two_three; para.RequestedUsage.Usage.cUsageIdentifier = 2; @@ -3595,7 +3567,7 @@ static void testGetCertChain(void) { ok(chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_NOT_VALID_FOR_USAGE, "expected CERT_TRUST_IS_NOT_VALID_FOR_USAGE\n"); - CertFreeCertificateChain(chain); + pCertFreeCertificateChain(chain); } para.RequestedUsage.dwType = USAGE_MATCH_TYPE_OR; ret = pCertGetCertificateChain(NULL, cert, &fileTime, store, ¶, @@ -3606,7 +3578,7 @@ static void testGetCertChain(void) ok(!(chain->TrustStatus.dwErrorStatus & CERT_TRUST_IS_NOT_VALID_FOR_USAGE), "didn't expect CERT_TRUST_IS_NOT_VALID_FOR_USAGE\n"); - CertFreeCertificateChain(chain); + pCertFreeCertificateChain(chain); } CertCloseStore(store, 0); CertFreeCertificateContext(cert); @@ -3618,10 +3590,32 @@ static void testGetCertChain(void) if (chain) { checkChainStatus(chain, &chainCheck[i].status, chainCheck[i].todo, - i); + "chainCheck", i); pCertFreeCertificateChain(chain); } } + chain = getChain(NULL, &opensslChainCheck.certs, 0, TRUE, &oct2007, + opensslChainCheck.todo, 0); + if (chain) + { + ok(chain->TrustStatus.dwErrorStatus == + opensslChainCheck.status.status.dwErrorStatus || + broken((chain->TrustStatus.dwErrorStatus & + ~incompleteOpensslChainCheck.status.statusToIgnore.dwErrorStatus) == + (incompleteOpensslChainCheck.status.status.dwErrorStatus & + ~incompleteOpensslChainCheck.status.statusToIgnore.dwErrorStatus)), + "unexpected chain error status %08x\n", + chain->TrustStatus.dwErrorStatus); + if (opensslChainCheck.status.status.dwErrorStatus == + chain->TrustStatus.dwErrorStatus) + checkChainStatus(chain, &opensslChainCheck.status, + opensslChainCheck.todo, "opensslChainCheck", 0); + else + checkChainStatus(chain, &incompleteOpensslChainCheck.status, + incompleteOpensslChainCheck.todo, "incompleteOpensslChainCheck", + 0); + pCertFreeCertificateChain(chain); + } for (i = 0; i < sizeof(chainCheckNoStore) / sizeof(chainCheckNoStore[0]); i++) { @@ -3630,7 +3624,7 @@ static void testGetCertChain(void) if (chain) { checkChainStatus(chain, &chainCheckNoStore[i].status, - chainCheckNoStore[i].todo, i); + chainCheckNoStore[i].todo, "chainCheckNoStore", i); pCertFreeCertificateChain(chain); } } @@ -3649,10 +3643,11 @@ static void testGetCertChain(void) if (chainCheckEmbeddedNull.status.status.dwErrorStatus == chain->TrustStatus.dwErrorStatus) checkChainStatus(chain, &chainCheckEmbeddedNull.status, - chainCheckEmbeddedNull.todo, 0); + chainCheckEmbeddedNull.todo, "chainCheckEmbeddedNull", 0); else checkChainStatus(chain, &chainCheckEmbeddedNullBroken.status, - chainCheckEmbeddedNullBroken.todo, 0); + chainCheckEmbeddedNullBroken.todo, "chainCheckEmbeddedNullBroken", + 0); pCertFreeCertificateChain(chain); } } @@ -3672,9 +3667,11 @@ static void test_CERT_CHAIN_PARA_cbSize(void) ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, chain0_0, sizeof(chain0_0), CERT_STORE_ADD_ALWAYS, NULL); + ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); ret = CertAddEncodedCertificateToStore(store, X509_ASN_ENCODING, chain0_1, sizeof(chain0_1), CERT_STORE_ADD_ALWAYS, &cert); + ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); for (i = 0; i < sizeof(CERT_CHAIN_PARA) + 2; i++) { @@ -3744,6 +3741,33 @@ static const ChainPolicyCheck basePolicyCheck[] = { { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }, NULL, 0 }, }; +/* Windows NT 4 has a different error code when the validity period doesn't + * nest. (It's arguably more correct than other Windows versions, but since + * others do not emulate its behavior, we mark its behavior broken.) + */ +static const CERT_CHAIN_POLICY_STATUS badDateNestingStatus = + { 0, CERT_E_VALIDITYPERIODNESTING, 0, 0, NULL }; + +static const ChainPolicyCheck ignoredBadDateNestingBasePolicyCheck = { + { sizeof(chain2) / sizeof(chain2[0]), chain2 }, + { 0, CERT_E_EXPIRED, 0, 1, NULL}, &badDateNestingStatus, TODO_ELEMENTS +}; + +static const ChainPolicyCheck ignoredInvalidDateBasePolicyCheck = { + { sizeof(googleChain) / sizeof(googleChain[0]), googleChain }, + { 0, CERT_E_EXPIRED, 0, 1, NULL}, &badDateNestingStatus, TODO_ELEMENTS +}; + +static const ChainPolicyCheck ignoredInvalidUsageBasePolicyCheck = { + { sizeof(chain15) / sizeof(chain15[0]), chain15 }, + { 0, CERT_E_EXPIRED, 0, 1, NULL}, NULL, TODO_ERROR +}; + +static const ChainPolicyCheck invalidUsageBasePolicyCheck = { + { sizeof(chain15) / sizeof(chain15[0]), chain15 }, + { 0, CERT_E_WRONG_USAGE, 0, 1, NULL}, NULL, 0 +}; + static const ChainPolicyCheck sslPolicyCheck[] = { { { sizeof(chain0) / sizeof(chain0[0]), chain0 }, { 0, CERT_E_UNTRUSTEDROOT, 0, 1, NULL }, NULL, 0 }, @@ -3787,33 +3811,41 @@ static const ChainPolicyCheck sslPolicyCheck[] = { { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }, NULL, 0 }, }; +static const ChainPolicyCheck ignoredUnknownCAPolicyCheck = { + { sizeof(chain0) / sizeof(chain0[0]), chain0 }, + { 0, CERT_E_EXPIRED, 0, 0, NULL }, NULL, 0 +}; + static const ChainPolicyCheck googlePolicyCheckWithMatchingNameExpired = { { sizeof(googleChain) / sizeof(googleChain[0]), googleChain }, { 0, CERT_E_EXPIRED, 0, 0, NULL}, NULL, 0 }; +/* Win98 sees the chain as expired, even though it isn't for the date tested */ +static const CERT_CHAIN_POLICY_STATUS expiredStatus = + { 0, CERT_E_EXPIRED, 0, 0, NULL }; + static const ChainPolicyCheck googlePolicyCheckWithMatchingName = { { sizeof(googleChain) / sizeof(googleChain[0]), googleChain }, - { 0, 0, -1, -1, NULL}, NULL, 0 + { 0, 0, -1, -1, NULL}, &expiredStatus, 0 }; /* Windows NT 4 has a different error code when the name doesn't match. */ static const CERT_CHAIN_POLICY_STATUS noMatchingNameBrokenStatus = { 0, CERT_E_ROLE, 0, 0, NULL }; -static const ChainPolicyCheck iTunesPolicyCheckWithoutMatchingName = { - { sizeof(iTunesChain) / sizeof(iTunesChain[0]), iTunesChain }, - { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, &noMatchingNameBrokenStatus, 0 -}; +/* Win98 does not trust the root of the OpenSSL chain or the Stanford chain */ +static const CERT_CHAIN_POLICY_STATUS untrustedRootStatus = + { 0, CERT_E_UNTRUSTEDROOT, 0, 0, NULL }; static const ChainPolicyCheck opensslPolicyCheckWithMatchingName = { { sizeof(opensslChain) / sizeof(opensslChain[0]), opensslChain }, - { 0, 0, -1, -1, NULL}, NULL, 0 + { 0, 0, -1, -1, NULL}, &untrustedRootStatus, 0 }; static const ChainPolicyCheck opensslPolicyCheckWithoutMatchingName = { { sizeof(opensslChain) / sizeof(opensslChain[0]), opensslChain }, - { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, NULL, 0 + { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, &untrustedRootStatus, 0 }; static const ChainPolicyCheck winehqPolicyCheckWithMatchingName = { @@ -3828,11 +3860,26 @@ static const ChainPolicyCheck winehqPolicyCheckWithoutMatchingName = { static const ChainPolicyCheck stanfordPolicyCheckWithMatchingName = { { sizeof(stanfordChain) / sizeof(stanfordChain[0]), stanfordChain }, - { 0, 0, -1, -1, NULL}, NULL, 0 + { 0, 0, -1, -1, NULL}, &untrustedRootStatus, 0 }; static const ChainPolicyCheck stanfordPolicyCheckWithoutMatchingName = { { sizeof(stanfordChain) / sizeof(stanfordChain[0]), stanfordChain }, + { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, &untrustedRootStatus, 0 +}; + +static const ChainPolicyCheck invalidExtensionPolicyCheck = { + { sizeof(chain30) / sizeof(chain30[0]), chain30 }, + { 0, CERT_E_CRITICAL, 0, 1, NULL}, &badDateNestingStatus, 0 +}; + +static const ChainPolicyCheck fooPolicyCheckWithMatchingName = { + { sizeof(chain31) / sizeof(chain31[0]), chain31 }, + { 0, 0, -1, -1, NULL}, NULL, 0 +}; + +static const ChainPolicyCheck fooPolicyCheckWithoutMatchingName = { + { sizeof(chain31) / sizeof(chain31[0]), chain31 }, { 0, CERT_E_CN_NO_MATCH, 0, 0, NULL}, NULL, 0 }; @@ -3938,8 +3985,8 @@ static const char *num_to_str(WORD num) } static void checkChainPolicyStatus(LPCSTR policy, HCERTCHAINENGINE engine, - const ChainPolicyCheck *check, DWORD testIndex, SYSTEMTIME *sysTime, - PCERT_CHAIN_POLICY_PARA para) + const ChainPolicyCheck *check, LPCSTR testName, DWORD testIndex, + SYSTEMTIME *sysTime, PCERT_CHAIN_POLICY_PARA para) { PCCERT_CHAIN_CONTEXT chain = getChain(engine, &check->certs, 0, TRUE, sysTime, check->todo, testIndex); @@ -3952,20 +3999,23 @@ static void checkChainPolicyStatus(LPCSTR policy, HCERTCHAINENGINE engine, if (check->todo & TODO_POLICY) todo_wine ok(ret, - "%s[%d]: CertVerifyCertificateChainPolicy failed: %08x\n", + "%s[%d](%s): CertVerifyCertificateChainPolicy failed: %08x\n", + testName, testIndex, IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, - testIndex, GetLastError()); + GetLastError()); else { if (!ret && GetLastError() == ERROR_FILE_NOT_FOUND) { - skip("%d: missing policy %s, skipping test\n", testIndex, + skip("%s[%d]: missing policy %s, skipping test\n", + testName, testIndex, IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy); pCertFreeCertificateChain(chain); return; } - ok(ret, "%s[%d]: CertVerifyCertificateChainPolicy failed: %08x\n", - IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, testIndex, + ok(ret, "%s[%d](%s): CertVerifyCertificateChainPolicy failed: %08x\n", + testName, testIndex, + IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, GetLastError()); } if (ret) @@ -3975,22 +4025,25 @@ static void checkChainPolicyStatus(LPCSTR policy, HCERTCHAINENGINE engine, broken(policyStatus.dwError == CERT_TRUST_NO_ERROR) || (check->brokenStatus && broken(policyStatus.dwError == check->brokenStatus->dwError)), - "%s[%d]: expected %08x, got %08x\n", + "%s[%d](%s): expected %08x, got %08x\n", + testName, testIndex, IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, - testIndex, check->status.dwError, policyStatus.dwError); + check->status.dwError, policyStatus.dwError); else ok(policyStatus.dwError == check->status.dwError || broken(policyStatus.dwError == CERT_TRUST_NO_ERROR) || (check->brokenStatus && broken(policyStatus.dwError == check->brokenStatus->dwError)), - "%s[%d]: expected %08x, got %08x\n", + "%s[%d](%s): expected %08x, got %08x\n", + testName, testIndex, IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, - testIndex, check->status.dwError, policyStatus.dwError); + 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", + skip("%s[%d](%s): error %08x doesn't match expected %08x, not checking indexes\n", + testName, testIndex, IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, - testIndex, policyStatus.dwError, check->status.dwError); + policyStatus.dwError, check->status.dwError); pCertFreeCertificateChain(chain); return; } @@ -3999,43 +4052,114 @@ static void checkChainPolicyStatus(LPCSTR policy, HCERTCHAINENGINE engine, check->status.lChainIndex || (check->brokenStatus && broken(policyStatus.lChainIndex == check->brokenStatus->lChainIndex)), - "%s[%d]: expected %d, got %d\n", + "%s[%d](%s): expected %d, got %d\n", + testName, testIndex, IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, - testIndex, check->status.lChainIndex, - policyStatus.lChainIndex); + check->status.lChainIndex, policyStatus.lChainIndex); else ok(policyStatus.lChainIndex == check->status.lChainIndex || (check->brokenStatus && broken(policyStatus.lChainIndex == check->brokenStatus->lChainIndex)), - "%s[%d]: expected %d, got %d\n", + "%s[%d](%s): expected %d, got %d\n", + testName, testIndex, IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, - testIndex, check->status.lChainIndex, policyStatus.lChainIndex); if (check->todo & TODO_ELEMENTS) todo_wine ok(policyStatus.lElementIndex == check->status.lElementIndex || (check->brokenStatus && broken(policyStatus.lElementIndex == check->brokenStatus->lElementIndex)), - "%s[%d]: expected %d, got %d\n", + "%s[%d](%s): expected %d, got %d\n", + testName, testIndex, IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, - testIndex, check->status.lElementIndex, policyStatus.lElementIndex); else ok(policyStatus.lElementIndex == check->status.lElementIndex || (check->brokenStatus && broken(policyStatus.lElementIndex == check->brokenStatus->lElementIndex)), - "%s[%d]: expected %d, got %d\n", + testName, testIndex, + "%s[%d](%s): expected %d, got %d\n", IS_INTOID(policy) ? num_to_str(LOWORD(policy)) : policy, - testIndex, check->status.lElementIndex, policyStatus.lElementIndex); } pCertFreeCertificateChain(chain); } } +#define CHECK_CHAIN_POLICY_STATUS_ARRAY(policy, engine, array, date, para) \ + do { \ + DWORD i; \ + for (i = 0; i < sizeof(array) / sizeof(array)[0]; i++) \ + checkChainPolicyStatus((policy), (engine), &(array)[i], \ + #array, i, (date), (para)); \ + } while(0) + +#define CHECK_CHAIN_POLICY_STATUS(policy, engine, policyCheck, date, para) \ + checkChainPolicyStatus((policy), (engine), &(policyCheck), \ + #policyCheck, 0, (date), (para)) + +static void check_base_policy(void) +{ + CERT_CHAIN_POLICY_PARA policyPara = { 0 }; + + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_BASE, NULL, + basePolicyCheck, &oct2007, NULL); + policyPara.cbSize = sizeof(policyPara); + policyPara.dwFlags = CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_BASE, NULL, + ignoredUnknownCAPolicyCheck, &oct2007, &policyPara); + policyPara.dwFlags = CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG | + CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_BASE, NULL, + ignoredBadDateNestingBasePolicyCheck, &oct2007, &policyPara); + policyPara.dwFlags = CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_BASE, NULL, + ignoredInvalidDateBasePolicyCheck, &oct2007, &policyPara); + policyPara.dwFlags = CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG | + CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG; + policyPara.dwFlags = CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG | + CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG | + CERT_CHAIN_POLICY_IGNORE_WRONG_USAGE_FLAG; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_BASE, NULL, + ignoredInvalidUsageBasePolicyCheck, &oct2007, &policyPara); + policyPara.dwFlags = CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG | + CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_BASE, NULL, + invalidUsageBasePolicyCheck, &oct2007, &policyPara); + /* Test chain30, which has an invalid critical extension in an intermediate + * cert, against the base policy. + */ + policyPara.dwFlags = CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_BASE, NULL, + invalidExtensionPolicyCheck, &oct2007, &policyPara); +} + +static void check_authenticode_policy(void) +{ + CERT_CHAIN_POLICY_PARA policyPara = { 0 }; + SYSTEMTIME epochStart = { 0 }; + + /* The authenticode policy doesn't seem to check anything beyond the base + * policy. It might check for chains signed by the MS test cert, but none + * of these chains is. + */ + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_AUTHENTICODE, NULL, + authenticodePolicyCheck, &oct2007, NULL); + policyPara.cbSize = sizeof(policyPara); + policyPara.dwFlags = CERT_CHAIN_POLICY_ALLOW_UNKNOWN_CA_FLAG; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_AUTHENTICODE, NULL, + ignoredUnknownCAPolicyCheck, &oct2007, &policyPara); + epochStart.wDay = epochStart.wMonth = 1; + epochStart.wYear = 1601; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_AUTHENTICODE, NULL, + ignoredUnknownCAPolicyCheck, &epochStart, &policyPara); + policyPara.dwFlags = CERT_CHAIN_POLICY_IGNORE_NOT_TIME_VALID_FLAG; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_AUTHENTICODE, NULL, + ignoredInvalidDateBasePolicyCheck, &oct2007, &policyPara); +} + static void check_ssl_policy(void) { - DWORD i; CERT_CHAIN_POLICY_PARA policyPara = { 0 }; SSL_EXTRA_CERT_CHAIN_POLICY_PARA sslPolicyPara = { { 0 } }; WCHAR winehq[] = { 'w','i','n','e','h','q','.','o','r','g',0 }; @@ -4058,120 +4182,114 @@ static void check_ssl_policy(void) 'w','i','n','e','h','q','.','o','r','g',0 }; WCHAR a_dot_b_dot_winehq_dot_org[] = { 'a','.','b','.', 'w','i','n','e','h','q','.','o','r','g',0 }; + WCHAR foo_dot_com[] = { 'f','o','o','.','c','o','m',0 }; + WCHAR afoo_dot_com[] = { 'a','f','o','o','.','c','o','m',0 }; + WCHAR a_dot_foo_dot_com[] = { 'a','.','f','o','o','.','c','o','m',0 }; HCERTSTORE testRoot; CERT_CHAIN_ENGINE_CONFIG engineConfig = { sizeof(engineConfig), 0 }; HCERTCHAINENGINE engine; /* Check ssl policy with no parameter */ - for (i = 0; - i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], - i, &oct2007, NULL); + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_SSL, NULL, sslPolicyCheck, + &oct2007, NULL); /* Check again with a policy parameter that specifies nothing */ - for (i = 0; - i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], - i, &oct2007, &policyPara); + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_SSL, NULL, sslPolicyCheck, + &oct2007, &policyPara); /* Check yet again, but specify an empty SSL_EXTRA_CERT_CHAIN_POLICY_PARA * argument. */ policyPara.pvExtraPolicyPara = &sslPolicyPara; - for (i = 0; - i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], - i, &oct2007, &policyPara); + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_SSL, NULL, sslPolicyCheck, + &oct2007, &policyPara); /* And again, but specify the auth type as a client */ sslPolicyPara.dwAuthType = AUTHTYPE_CLIENT; - for (i = 0; - i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], - i, &oct2007, &policyPara); + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_SSL, NULL, sslPolicyCheck, + &oct2007, &policyPara); /* And again, but specify the auth type as a server */ sslPolicyPara.dwAuthType = AUTHTYPE_SERVER; - for (i = 0; - i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], - i, &oct2007, &policyPara); + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_SSL, NULL, sslPolicyCheck, + &oct2007, &policyPara); /* And again authenticating a client, but specify the size of the policy * parameter. */ U(sslPolicyPara).cbSize = sizeof(sslPolicyCheck); sslPolicyPara.dwAuthType = AUTHTYPE_CLIENT; - for (i = 0; - i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], - i, &oct2007, &policyPara); + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_SSL, NULL, sslPolicyCheck, + &oct2007, &policyPara); /* One more time authenticating a client, but specify winehq.org as the * server name. */ sslPolicyPara.pwszServerName = winehq; - for (i = 0; - i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], - i, &oct2007, &policyPara); + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_SSL, NULL, sslPolicyCheck, + &oct2007, &policyPara); /* And again authenticating a server, still specifying winehq.org as the * server name. */ sslPolicyPara.dwAuthType = AUTHTYPE_SERVER; - for (i = 0; - i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], - i, &oct2007, &policyPara); + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_SSL, NULL, sslPolicyCheck, + &oct2007, &policyPara); /* And again authenticating a server, this time specifying the size of the * policy param. */ policyPara.cbSize = sizeof(policyPara); - for (i = 0; - i < sizeof(sslPolicyCheck) / sizeof(sslPolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, &sslPolicyCheck[i], - i, &oct2007, &policyPara); - /* Yet again, but checking the iTunes chain, which contains a name - * extension. + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_SSL, NULL, sslPolicyCheck, + &oct2007, &policyPara); + /* And again, specifying a chain with an untrusted root, but ignoring + * unknown CAs. */ - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, - &iTunesPolicyCheckWithoutMatchingName, 0, &oct2007, &policyPara); + sslPolicyPara.fdwChecks = SECURITY_FLAG_IGNORE_UNKNOWN_CA; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + ignoredUnknownCAPolicyCheck, &oct2007, &policyPara); + sslPolicyPara.fdwChecks = 0; /* And again, but checking the Google chain at a bad date */ sslPolicyPara.pwszServerName = google_dot_com; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, - &googlePolicyCheckWithMatchingNameExpired, 0, &oct2007, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + googlePolicyCheckWithMatchingNameExpired, &oct2007, &policyPara); + /* Again checking the Google chain at a bad date, but ignoring date + * errors. + */ + sslPolicyPara.fdwChecks = SECURITY_FLAG_IGNORE_CERT_DATE_INVALID; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + googlePolicyCheckWithMatchingName, &oct2007, &policyPara); + sslPolicyPara.fdwChecks = 0; /* And again, but checking the Google chain at a good date */ sslPolicyPara.pwszServerName = google_dot_com; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, - &googlePolicyCheckWithMatchingName, 0, &oct2009, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + googlePolicyCheckWithMatchingName, &oct2009, &policyPara); /* Check again with the openssl cert, which has a wildcard in its name, * with various combinations of matching and non-matching names. * With "a.openssl.org": match */ sslPolicyPara.pwszServerName = a_dot_openssl_dot_org; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, - &opensslPolicyCheckWithMatchingName, 0, &oct2009, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + opensslPolicyCheckWithMatchingName, &oct2009, &policyPara); /* With "openssl.org": no match */ sslPolicyPara.pwszServerName = openssl_dot_org; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, - &opensslPolicyCheckWithoutMatchingName, 0, &oct2009, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + opensslPolicyCheckWithoutMatchingName, &oct2009, &policyPara); /* With "fopenssl.org": no match */ sslPolicyPara.pwszServerName = fopenssl_dot_org; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, - &opensslPolicyCheckWithoutMatchingName, 0, &oct2009, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + opensslPolicyCheckWithoutMatchingName, &oct2009, &policyPara); /* with "a.b.openssl.org": no match */ sslPolicyPara.pwszServerName = a_dot_b_dot_openssl_dot_org; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, - &opensslPolicyCheckWithoutMatchingName, 0, &oct2009, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + opensslPolicyCheckWithoutMatchingName, &oct2009, &policyPara); /* Check again with the cs.stanford.edu, which has both cs.stanford.edu * and www.cs.stanford.edu in its subject alternative name. * With "cs.stanford.edu": match */ sslPolicyPara.pwszServerName = cs_dot_stanford_dot_edu; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, - &stanfordPolicyCheckWithMatchingName, 0, &oct2009, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + stanfordPolicyCheckWithMatchingName, &oct2009, &policyPara); /* With "www.cs.stanford.edu": match */ sslPolicyPara.pwszServerName = www_dot_cs_dot_stanford_dot_edu; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, - &stanfordPolicyCheckWithMatchingName, 0, &oct2009, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + stanfordPolicyCheckWithMatchingName, &oct2009, &policyPara); /* With "a.cs.stanford.edu": no match */ sslPolicyPara.pwszServerName = a_dot_cs_dot_stanford_dot_edu; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, NULL, - &stanfordPolicyCheckWithoutMatchingName, 0, &oct2009, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + stanfordPolicyCheckWithoutMatchingName, &oct2009, &policyPara); /* Check chain29, which has a wildcard in its subject alternative name, * but not in its distinguished name. * Step 1: create a chain engine that trusts chain29's root. @@ -4181,25 +4299,49 @@ static void check_ssl_policy(void) CertAddEncodedCertificateToStore(testRoot, X509_ASN_ENCODING, chain0_0, sizeof(chain0_0), CERT_STORE_ADD_ALWAYS, NULL); engineConfig.hExclusiveRoot = testRoot; - if (!CertCreateCertificateChainEngine(&engineConfig, &engine)) + if (!pCertCreateCertificateChainEngine(&engineConfig, &engine)) { skip("Couldn't create chain engine\n"); return; } /* With "winehq.org": no match */ sslPolicyPara.pwszServerName = winehq; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, engine, - &winehqPolicyCheckWithoutMatchingName, 0, &oct2007, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, engine, + winehqPolicyCheckWithoutMatchingName, &oct2007, &policyPara); /* With "test.winehq.org": match */ sslPolicyPara.pwszServerName = test_dot_winehq_dot_org; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, engine, - &winehqPolicyCheckWithMatchingName, 0, &oct2007, &policyPara); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, engine, + winehqPolicyCheckWithMatchingName, &oct2007, &policyPara); /* With "a.b.winehq.org": no match */ sslPolicyPara.pwszServerName = a_dot_b_dot_winehq_dot_org; - checkChainPolicyStatus(CERT_CHAIN_POLICY_SSL, engine, - &winehqPolicyCheckWithoutMatchingName, 0, &oct2007, &policyPara); - CertFreeCertificateChainEngine(engine); + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, engine, + winehqPolicyCheckWithoutMatchingName, &oct2007, &policyPara); + /* When specifying to ignore name mismatch: match */ + sslPolicyPara.fdwChecks |= SECURITY_FLAG_IGNORE_CERT_CN_INVALID; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, engine, + winehqPolicyCheckWithMatchingName, &oct2007, &policyPara); + pCertFreeCertificateChainEngine(engine); CertCloseStore(testRoot, 0); + /* Test chain30, which has an invalid critical extension in an intermediate + * cert, against the SSL policy. + */ + sslPolicyPara.fdwChecks = SECURITY_FLAG_IGNORE_UNKNOWN_CA; + sslPolicyPara.pwszServerName = NULL; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + invalidExtensionPolicyCheck, &oct2007, &policyPara); + /* Test chain31, which has two CNs, "*.foo.com" and "foo.com", against + * some names that match one of the CNs: + */ + sslPolicyPara.pwszServerName = foo_dot_com; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + fooPolicyCheckWithMatchingName, &oct2007, &policyPara); + sslPolicyPara.pwszServerName = a_dot_foo_dot_com; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + fooPolicyCheckWithMatchingName, &oct2007, &policyPara); + /* and against a name that doesn't match either CN: */ + sslPolicyPara.pwszServerName = afoo_dot_com; + CHECK_CHAIN_POLICY_STATUS(CERT_CHAIN_POLICY_SSL, NULL, + fooPolicyCheckWithoutMatchingName, &oct2007, &policyPara); } static void testVerifyCertChainPolicy(void) @@ -4210,7 +4352,6 @@ static void testVerifyCertChainPolicy(void) PCCERT_CHAIN_CONTEXT chain; CERT_CHAIN_POLICY_STATUS policyStatus = { 0 }; CERT_CHAIN_POLICY_PARA policyPara = { 0 }; - DWORD i; if (!pCertVerifyCertificateChainPolicy) { @@ -4264,24 +4405,11 @@ static void testVerifyCertChainPolicy(void) pCertFreeCertificateChain(chain); CertFreeCertificateContext(cert); - for (i = 0; - i < sizeof(basePolicyCheck) / sizeof(basePolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_BASE, NULL, - &basePolicyCheck[i], i, &oct2007, NULL); + check_base_policy(); check_ssl_policy(); - /* The authenticode policy doesn't seem to check anything beyond the base - * policy. It might check for chains signed by the MS test cert, but none - * of these chains is. - */ - for (i = 0; i < - sizeof(authenticodePolicyCheck) / sizeof(authenticodePolicyCheck[0]); i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_AUTHENTICODE, NULL, - &authenticodePolicyCheck[i], i, &oct2007, NULL); - for (i = 0; i < - sizeof(basicConstraintsPolicyCheck) / sizeof(basicConstraintsPolicyCheck[0]); - i++) - checkChainPolicyStatus(CERT_CHAIN_POLICY_BASIC_CONSTRAINTS, NULL, - &basicConstraintsPolicyCheck[i], i, &oct2007, NULL); + check_authenticode_policy(); + CHECK_CHAIN_POLICY_STATUS_ARRAY(CERT_CHAIN_POLICY_BASIC_CONSTRAINTS, NULL, + basicConstraintsPolicyCheck, &oct2007, NULL); } START_TEST(chain) @@ -4294,9 +4422,9 @@ START_TEST(chain) pCertVerifyCertificateChainPolicy = (void*)GetProcAddress(hCrypt32, "CertVerifyCertificateChainPolicy"); testCreateCertChainEngine(); - if (!pCertGetCertificateChain) + if (!pCertGetCertificateChain || !pCertFreeCertificateChain) { - win_skip("CertGetCertificateChain() is not available\n"); + win_skip("Cert*CertificateChain functions not available\n"); } else { diff --git a/rostests/winetests/crypt32/crl.c b/rostests/winetests/crypt32/crl.c index bb622198aa7..313ebb3cf30 100644 --- a/rostests/winetests/crypt32/crl.c +++ b/rostests/winetests/crypt32/crl.c @@ -18,9 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include #include #include + #include #include #include @@ -102,7 +102,6 @@ static void testCreateCRL(void) ok(!context && (GLE == CRYPT_E_ASN1_EOD || GLE == OSS_MORE_INPUT), "Expected CRYPT_E_ASN1_EOD or OSS_MORE_INPUT, got %08x\n", GLE); context = CertCreateCRLContext(X509_ASN_ENCODING, bigCert, sizeof(bigCert)); - GLE = GetLastError(); ok(!context, "Expected failure\n"); context = CertCreateCRLContext(X509_ASN_ENCODING, signedCRL, sizeof(signedCRL) - 1); @@ -205,6 +204,7 @@ static void testAddCRL(void) /* Normal cases: a "signed" CRL is okay.. */ ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, signedCRL, sizeof(signedCRL), CERT_STORE_ADD_ALWAYS, NULL); + ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); /* and an unsigned one is too. */ ret = CertAddEncodedCRLToStore(store, X509_ASN_ENCODING, CRL, sizeof(CRL), CERT_STORE_ADD_ALWAYS, NULL); @@ -408,9 +408,9 @@ static void testFindCRL(void) BOOL ret; if (!store) return; - if (!pCertFindCRLInStore) + if (!pCertFindCRLInStore || !pCertFindCertificateInCRL) { - win_skip("CertFindCRLInStore() is not available\n"); + win_skip("CertFindCRLInStore or CertFindCertificateInCRL not available\n"); return; } @@ -477,9 +477,9 @@ static void testFindCRL(void) if (0) { /* Crash or return NULL/STATUS_ACCESS_VIOLATION */ - context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, NULL, + pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, NULL, NULL); - context = pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, + pCertFindCRLInStore(store, 0, 0, CRL_FIND_ISSUED_FOR, &issuedForPara, NULL); } /* Test whether the cert matches the CRL in the store */ @@ -521,7 +521,7 @@ static void testFindCRL(void) PCRL_ENTRY entry; count++; - if (CertFindCertificateInCRL(cert, context, 0, NULL, &entry) && + if (pCertFindCertificateInCRL(cert, context, 0, NULL, &entry) && entry) revoked_count++; } @@ -557,7 +557,7 @@ static void testFindCRL(void) PCRL_ENTRY entry; count++; - if (CertFindCertificateInCRL(cert, context, 0, NULL, &entry) && + if (pCertFindCertificateInCRL(cert, context, 0, NULL, &entry) && entry) revoked_count++; } @@ -586,7 +586,7 @@ static void testFindCRL(void) PCRL_ENTRY entry; count++; - if (CertFindCertificateInCRL(cert, context, 0, NULL, &entry) && + if (pCertFindCertificateInCRL(cert, context, 0, NULL, &entry) && entry) revoked_count++; } @@ -626,7 +626,7 @@ static void testFindCRL(void) PCRL_ENTRY entry; count++; - if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && + if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && entry) revoked_count++; } @@ -646,7 +646,7 @@ static void testFindCRL(void) PCRL_ENTRY entry; count++; - if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && + if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && entry) revoked_count++; } @@ -663,7 +663,7 @@ static void testFindCRL(void) PCRL_ENTRY entry; count++; - if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && + if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && entry) revoked_count++; } @@ -680,7 +680,7 @@ static void testFindCRL(void) PCRL_ENTRY entry; count++; - if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && + if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && entry) revoked_count++; } @@ -697,7 +697,7 @@ static void testFindCRL(void) PCRL_ENTRY entry; count++; - if (CertFindCertificateInCRL(rootCert, context, 0, NULL, &entry) && + if (pCertFindCertificateInCRL(rootCert, context, 0, NULL, &entry) && entry) revoked_count++; } @@ -716,7 +716,7 @@ static void testFindCRL(void) PCRL_ENTRY entry; count++; - if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && + if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && entry) revoked_count++; } @@ -734,7 +734,7 @@ static void testFindCRL(void) PCRL_ENTRY entry; count++; - if (CertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && + if (pCertFindCertificateInCRL(endCert, context, 0, NULL, &entry) && entry) revoked_count++; } @@ -906,6 +906,7 @@ static void testCRLProperties(void) size = sizeof(hashProperty); ret = CertGetCRLContextProperty(context, CERT_HASH_PROP_ID, hashProperty, &size); + ok(ret, "CertSetCRLContextProperty failed: %08x\n", GetLastError()); ok(!memcmp(hashProperty, hash, sizeof(hash)), "Unexpected hash\n"); /* Delete the (bogus) hash, and get the real one */ ret = CertSetCRLContextProperty(context, CERT_HASH_PROP_ID, 0, NULL); diff --git a/rostests/winetests/crypt32/ctl.c b/rostests/winetests/crypt32/ctl.c index 8ee26526289..f292a4c06d6 100644 --- a/rostests/winetests/crypt32/ctl.c +++ b/rostests/winetests/crypt32/ctl.c @@ -18,9 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include #include #include + #include #include #include @@ -213,6 +213,7 @@ static void checkHash(const BYTE *data, DWORD dataLen, ALG_ID algID, memset(hashProperty, 0, sizeof(hashProperty)); size = sizeof(hash); ret = CryptHashCertificate(0, algID, 0, data, dataLen, hash, &size); + ok(ret, "CryptHashCertificate failed: %08x\n", GetLastError()); ret = CertGetCTLContextProperty(context, propID, hashProperty, &size); ok(ret, "CertGetCTLContextProperty failed: %08x\n", GetLastError()); if (ret) diff --git a/rostests/winetests/crypt32/encode.c b/rostests/winetests/crypt32/encode.c index cc59a59e6a5..5d9e76be04f 100644 --- a/rostests/winetests/crypt32/encode.c +++ b/rostests/winetests/crypt32/encode.c @@ -121,7 +121,7 @@ static void test_encodeInt(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_INTEGER, &ints[i].val, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %d\n", GetLastError()); - if (buf) + if (ret) { ok(buf[0] == 2, "Got unexpected type %d for integer (expected 2)\n", buf[0]); @@ -140,7 +140,7 @@ static void test_encodeInt(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_MULTI_BYTE_INTEGER, &blob, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %d\n", GetLastError()); - if (buf) + if (ret) { ok(buf[0] == 2, "Got unexpected type %d for integer (expected 2)\n", buf[0]); @@ -164,7 +164,7 @@ static void test_encodeInt(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_MULTI_BYTE_INTEGER, &blob, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %d\n", GetLastError()); - if (buf) + if (ret) { ok(buf[0] == 2, "Got unexpected type %d for integer (expected 2)\n", buf[0]); @@ -187,7 +187,7 @@ static void test_encodeInt(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_MULTI_BYTE_UINT, &blob, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %d\n", GetLastError()); - if (buf) + if (ret) { ok(buf[0] == 2, "Got unexpected type %d for integer (expected 2)\n", buf[0]); @@ -256,7 +256,7 @@ static void test_decodeInt(DWORD dwEncoding) ok(ret, "CryptDecodeObjectEx failed: %d\n", GetLastError()); ok(bufSize == sizeof(int), "Wrong size %d\n", bufSize); ok(buf != NULL, "Expected allocated buffer\n"); - if (buf) + if (ret) { ok(!memcmp(buf, &ints[i].val, bufSize), "Expected %d, got %d\n", ints[i].val, *(int *)buf); @@ -276,7 +276,7 @@ static void test_decodeInt(DWORD dwEncoding) ok(ret, "CryptDecodeObjectEx failed: %d\n", GetLastError()); ok(bufSize >= sizeof(CRYPT_INTEGER_BLOB), "Wrong size %d\n", bufSize); ok(buf != NULL, "Expected allocated buffer\n"); - if (buf) + if (ret) { CRYPT_INTEGER_BLOB *blob = (CRYPT_INTEGER_BLOB *)buf; @@ -301,7 +301,7 @@ static void test_decodeInt(DWORD dwEncoding) ok(ret, "CryptDecodeObjectEx failed: %d\n", GetLastError()); ok(bufSize >= sizeof(CRYPT_INTEGER_BLOB), "Wrong size %d\n", bufSize); ok(buf != NULL, "Expected allocated buffer\n"); - if (buf) + if (ret) { CRYPT_INTEGER_BLOB *blob = (CRYPT_INTEGER_BLOB *)buf; @@ -317,7 +317,7 @@ static void test_decodeInt(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_MULTI_BYTE_INTEGER, longForm, sizeof(longForm), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(*(int *)buf == 1, "Expected 1, got %d\n", *(int *)buf); LocalFree(buf); @@ -326,7 +326,7 @@ static void test_decodeInt(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_INTEGER, extraBytes, sizeof(extraBytes), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(*(int *)buf == 1, "Expected 1, got %d\n", *(int *)buf); LocalFree(buf); @@ -388,7 +388,7 @@ static void test_encodeEnumerated(DWORD dwEncoding) &enums[j].val, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %d\n", GetLastError()); - if (buf) + if (ret) { ok(buf[0] == 0xa, "Got unexpected type %d for enumerated (expected 0xa)\n", @@ -456,7 +456,7 @@ static void testTimeEncoding(DWORD dwEncoding, LPCSTR structType, ok(ret, "CryptEncodeObjectEx failed: %d (0x%08x)\n", GetLastError(), GetLastError()); ok(buf != NULL, "Expected an allocated buffer\n"); - if (buf) + if (ret) { ok(buf[0] == time->encodedTime[0], "Expected type 0x%02x, got 0x%02x\n", time->encodedTime[0], @@ -765,7 +765,7 @@ static void test_encodeName(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(!memcmp(buf, emptySequence, sizeof(emptySequence)), "Got unexpected encoding for empty name\n"); @@ -788,7 +788,7 @@ static void test_encodeName(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(!memcmp(buf, emptyRDNs, sizeof(emptyRDNs)), "Got unexpected encoding for empty RDN array\n"); @@ -831,7 +831,7 @@ static void test_encodeName(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(!memcmp(buf, twoRDNs, sizeof(twoRDNs)), "Got unexpected encoding for two RDN array\n"); @@ -845,7 +845,7 @@ static void test_encodeName(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(encodedTwoRDNs), "Unexpected size %d\n", size); ok(!memcmp(buf, encodedTwoRDNs, size), @@ -915,7 +915,7 @@ static void test_encodeUnicodeName(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_UNICODE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(!memcmp(buf, emptySequence, sizeof(emptySequence)), "Got unexpected encoding for empty name\n"); @@ -955,7 +955,7 @@ static void test_encodeUnicodeName(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_UNICODE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(!memcmp(buf, twoRDNsNoNull, sizeof(twoRDNsNoNull)), "Got unexpected encoding for two RDN array\n"); @@ -969,7 +969,7 @@ static void test_encodeUnicodeName(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_UNICODE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(encodedTwoRDNs), "Unexpected size %d\n", size); ok(!memcmp(buf, encodedTwoRDNs, size), @@ -982,7 +982,7 @@ static void test_encodeUnicodeName(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_UNICODE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); todo_wine ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(anyType), "Unexpected size %d\n", size); ok(!memcmp(buf, anyType, size), "Unexpected value\n"); @@ -1081,7 +1081,7 @@ static void test_decodeName(DWORD dwEncoding) /* Interestingly, in Windows, if cRDN is 0, rgRGN may not be NULL. My * decoder works the same way, so only test the count. */ - if (buf) + if (ret) { ok(bufSize == sizeof(CERT_NAME_INFO), "Wrong bufSize %d\n", bufSize); ok(((CERT_NAME_INFO *)buf)->cRDN == 0, @@ -1109,7 +1109,7 @@ static void test_decodeName(DWORD dwEncoding) CRYPT_DECODE_ALLOC_FLAG | CRYPT_DECODE_SHARE_OID_STRING_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_NAME_INFO *info = (CERT_NAME_INFO *)buf; @@ -1125,7 +1125,7 @@ static void test_decodeName(DWORD dwEncoding) CRYPT_DECODE_ALLOC_FLAG | CRYPT_DECODE_SHARE_OID_STRING_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { static CHAR oid_sur_name[] = szOID_SUR_NAME, oid_common_name[] = szOID_COMMON_NAME; @@ -1177,7 +1177,7 @@ static void test_decodeUnicodeName(DWORD dwEncoding) CRYPT_DECODE_ALLOC_FLAG | CRYPT_DECODE_SHARE_OID_STRING_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == sizeof(CERT_NAME_INFO), "Got wrong bufSize %d\n", bufSize); @@ -1193,7 +1193,7 @@ static void test_decodeUnicodeName(DWORD dwEncoding) CRYPT_DECODE_ALLOC_FLAG | CRYPT_DECODE_SHARE_OID_STRING_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_NAME_INFO *info = (CERT_NAME_INFO *)buf; @@ -1209,7 +1209,7 @@ static void test_decodeUnicodeName(DWORD dwEncoding) CRYPT_DECODE_ALLOC_FLAG | CRYPT_DECODE_SHARE_OID_STRING_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { static CHAR oid_sur_name[] = szOID_SUR_NAME, oid_common_name[] = szOID_COMMON_NAME; @@ -1322,7 +1322,7 @@ static void test_encodeNameValue(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_NAME_VALUE, &value, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(printableCommonNameValue), "Unexpected size %d\n", size); @@ -1459,7 +1459,7 @@ static void test_encodeAltName(DWORD dwEncoding) /* Test with empty info */ ret = pCryptEncodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(emptySequence), "Wrong size %d\n", size); ok(!memcmp(buf, emptySequence, size), "Unexpected value\n"); @@ -1476,7 +1476,7 @@ static void test_encodeAltName(DWORD dwEncoding) entry.dwAltNameChoice = CERT_ALT_NAME_URL; ret = pCryptEncodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(emptyURL), "Wrong size %d\n", size); ok(!memcmp(buf, emptyURL, size), "Unexpected value\n"); @@ -1486,7 +1486,7 @@ static void test_encodeAltName(DWORD dwEncoding) U(entry).pwszURL = (LPWSTR)url; ret = pCryptEncodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(encodedURL), "Wrong size %d\n", size); ok(!memcmp(buf, encodedURL, size), "Unexpected value\n"); @@ -1507,7 +1507,7 @@ static void test_encodeAltName(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { /* This succeeds, but it shouldn't, so don't worry about conforming */ LocalFree(buf); @@ -1517,7 +1517,7 @@ static void test_encodeAltName(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(encodedDnsName), "Wrong size %d\n", size); ok(!memcmp(buf, encodedDnsName, size), "Unexpected value\n"); @@ -1529,7 +1529,7 @@ static void test_encodeAltName(DWORD dwEncoding) U(entry).IPAddress.pbData = (LPBYTE)localhost; ret = pCryptEncodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(encodedIPAddr), "Wrong size %d\n", size); ok(!memcmp(buf, encodedIPAddr, size), "Unexpected value\n"); @@ -1540,7 +1540,7 @@ static void test_encodeAltName(DWORD dwEncoding) U(entry).pszRegisteredID = oid; ret = pCryptEncodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(encodedOidName), "Wrong size %d\n", size); ok(!memcmp(buf, encodedOidName, size), "Unexpected value\n"); @@ -1552,7 +1552,7 @@ static void test_encodeAltName(DWORD dwEncoding) U(entry).DirectoryName.pbData = (LPBYTE)encodedCommonName; ret = pCryptEncodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(encodedDirectoryName), "Wrong size %d\n", size); ok(!memcmp(buf, encodedDirectoryName, size), "Unexpected value\n"); @@ -1596,7 +1596,7 @@ static void test_decodeAltName(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, emptySequence, emptySequence[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { info = (CERT_ALT_NAME_INFO *)buf; @@ -1607,7 +1607,7 @@ static void test_decodeAltName(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, emptyURL, emptyURL[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { info = (CERT_ALT_NAME_INFO *)buf; @@ -1626,7 +1626,7 @@ static void test_decodeAltName(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, encodedURL, encodedURL[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { info = (CERT_ALT_NAME_INFO *)buf; @@ -1641,7 +1641,7 @@ static void test_decodeAltName(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, encodedDnsName, encodedDnsName[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { info = (CERT_ALT_NAME_INFO *)buf; @@ -1657,7 +1657,7 @@ static void test_decodeAltName(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, encodedIPAddr, encodedIPAddr[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { info = (CERT_ALT_NAME_INFO *)buf; @@ -1676,7 +1676,7 @@ static void test_decodeAltName(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_ALTERNATE_NAME, encodedOidName, sizeof(encodedOidName), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { info = (CERT_ALT_NAME_INFO *)buf; @@ -1693,7 +1693,7 @@ static void test_decodeAltName(DWORD dwEncoding) encodedDirectoryName, sizeof(encodedDirectoryName), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { info = (CERT_ALT_NAME_INFO *)buf; @@ -1887,7 +1887,7 @@ static void test_encodeUnicodeNameValue(DWORD dwEncoding) CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret || broken(GetLastError() == OSS_PDU_MISMATCH /* Win9x */), "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == unicodeResults[i].encoded.cbData, "Value type %d: expected size %d, got %d\n", @@ -1908,7 +1908,7 @@ static void test_encodeUnicodeNameValue(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_UNICODE_NAME_VALUE, &value, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == unicodeWeirdness[i].encoded.cbData, "Value type %d: expected size %d, got %d\n", @@ -1995,7 +1995,7 @@ static void test_encodeOctets(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_OCTET_STRING, &blob, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %d\n", GetLastError()); - if (buf) + if (ret) { ok(buf[0] == 4, "Got unexpected type %d for octet string (expected 4)\n", buf[0]); @@ -2026,7 +2026,7 @@ static void test_decodeOctets(DWORD dwEncoding) "Expected size >= %d, got %d\n", (int)sizeof(CRYPT_DATA_BLOB) + octets[i].encoded[1], bufSize); ok(buf != NULL, "Expected allocated buffer\n"); - if (buf) + if (ret) { CRYPT_DATA_BLOB *blob = (CRYPT_DATA_BLOB *)buf; @@ -2081,7 +2081,7 @@ static void test_encodeBits(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_BITS, &blob, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == bits[i].encoded[1] + 2, "%d: Got unexpected size %d, expected %d\n", i, bufSize, @@ -2109,7 +2109,7 @@ static void test_decodeBits(DWORD dwEncoding) bits[i].encoded[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CRYPT_BIT_BLOB *blob; @@ -2131,7 +2131,7 @@ static void test_decodeBits(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_BITS, ber, ber[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CRYPT_BIT_BLOB *blob; @@ -2196,7 +2196,7 @@ static void test_encodeBasicConstraints(DWORD dwEncoding) &constraints2[i].info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == constraints2[i].encoded[1] + 2, "Expected %d bytes, got %d\n", constraints2[i].encoded[1] + 2, @@ -2214,7 +2214,7 @@ static void test_encodeBasicConstraints(DWORD dwEncoding) CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret || GetLastError() == OSS_BAD_PTR /* Win9x */, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == sizeof(emptyConstraint), "Wrong size %d\n", bufSize); ok(!memcmp(buf, emptyConstraint, sizeof(emptyConstraint)), @@ -2230,7 +2230,7 @@ static void test_encodeBasicConstraints(DWORD dwEncoding) CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret || GetLastError() == OSS_BAD_PTR /* Win9x */, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == sizeof(constraintWithDomainName), "Wrong size %d\n", bufSize); ok(!memcmp(buf, constraintWithDomainName, @@ -2260,7 +2260,7 @@ static void test_decodeBasicConstraints(DWORD dwEncoding) CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed for item %d: %08x\n", i, GetLastError()); - if (buf) + if (ret) { CERT_BASIC_CONSTRAINTS2_INFO *info = (CERT_BASIC_CONSTRAINTS2_INFO *)buf; @@ -2285,7 +2285,7 @@ static void test_decodeBasicConstraints(DWORD dwEncoding) badBool.encoded, badBool.encoded[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_BASIC_CONSTRAINTS2_INFO *info = (CERT_BASIC_CONSTRAINTS2_INFO *)buf; @@ -2306,7 +2306,7 @@ static void test_decodeBasicConstraints(DWORD dwEncoding) emptyConstraint, sizeof(emptyConstraint), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_BASIC_CONSTRAINTS_INFO *info = (CERT_BASIC_CONSTRAINTS_INFO *)buf; @@ -2319,7 +2319,7 @@ static void test_decodeBasicConstraints(DWORD dwEncoding) constraintWithDomainName, sizeof(constraintWithDomainName), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_BASIC_CONSTRAINTS_INFO *info = (CERT_BASIC_CONSTRAINTS_INFO *)buf; @@ -2356,7 +2356,7 @@ struct EncodedRSAPubKey size_t decodedModulusLen; }; -struct EncodedRSAPubKey rsaPubKeys[] = { +static const struct EncodedRSAPubKey rsaPubKeys[] = { { modulus1, sizeof(modulus1), mod1_encoded, sizeof(modulus1) }, { modulus2, sizeof(modulus2), mod2_encoded, 5 }, { modulus3, sizeof(modulus3), mod3_encoded, 5 }, @@ -2392,7 +2392,7 @@ static void test_encodeRsaPublicKey(DWORD dwEncoding) hdr->reserved = 1; ret = pCryptEncodeObjectEx(dwEncoding, RSA_CSP_PUBLICKEYBLOB, toEncode, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); - if (buf) + if (ret) { ok(bufSize == rsaPubKeys[0].encoded[1] + 2, "Expected size %d, got %d\n", rsaPubKeys[0].encoded[1] + 2, bufSize); @@ -2404,7 +2404,7 @@ static void test_encodeRsaPublicKey(DWORD dwEncoding) hdr->bVersion = 0; ret = pCryptEncodeObjectEx(dwEncoding, RSA_CSP_PUBLICKEYBLOB, toEncode, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); - if (buf) + if (ret) { ok(bufSize == rsaPubKeys[0].encoded[1] + 2, "Expected size %d, got %d\n", rsaPubKeys[0].encoded[1] + 2, bufSize); @@ -2416,7 +2416,7 @@ static void test_encodeRsaPublicKey(DWORD dwEncoding) hdr->aiKeyAlg = CALG_DES; ret = pCryptEncodeObjectEx(dwEncoding, RSA_CSP_PUBLICKEYBLOB, toEncode, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); - if (buf) + if (ret) { ok(bufSize == rsaPubKeys[0].encoded[1] + 2, "Expected size %d, got %d\n", rsaPubKeys[0].encoded[1] + 2, bufSize); @@ -2442,7 +2442,7 @@ static void test_encodeRsaPublicKey(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, RSA_CSP_PUBLICKEYBLOB, toEncode, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == rsaPubKeys[i].encoded[1] + 2, "Expected size %d, got %d\n", rsaPubKeys[i].encoded[1] + 2, @@ -2488,7 +2488,7 @@ static void test_decodeRsaPublicKey(DWORD dwEncoding) rsaPubKeys[i].encoded, rsaPubKeys[i].encoded[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { BLOBHEADER *hdr = (BLOBHEADER *)buf; RSAPUBKEY *rsaPubKey = (RSAPUBKEY *)(buf + sizeof(BLOBHEADER)); @@ -2550,7 +2550,7 @@ static void test_encodeSequenceOfAny(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_SEQUENCE_OF_ANY, &seq, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == sizeof(intSequence), "Wrong size %d\n", bufSize); ok(!memcmp(buf, intSequence, intSequence[1] + 2), "Unexpected value\n"); @@ -2564,7 +2564,7 @@ static void test_encodeSequenceOfAny(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_SEQUENCE_OF_ANY, &seq, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == sizeof(mixedSequence), "Wrong size %d\n", bufSize); ok(!memcmp(buf, mixedSequence, mixedSequence[1] + 2), @@ -2582,7 +2582,7 @@ static void test_decodeSequenceOfAny(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_SEQUENCE_OF_ANY, intSequence, intSequence[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CRYPT_SEQUENCE_OF_ANY *seq = (CRYPT_SEQUENCE_OF_ANY *)buf; DWORD i; @@ -2603,7 +2603,7 @@ static void test_decodeSequenceOfAny(DWORD dwEncoding) mixedSequence[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CRYPT_SEQUENCE_OF_ANY *seq = (CRYPT_SEQUENCE_OF_ANY *)buf; @@ -2663,7 +2663,7 @@ static void test_encodeExtensions(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_EXTENSIONS, &exts[i].exts, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == exts[i].encoded[1] + 2, "Expected %d bytes, got %d\n", exts[i].encoded[1] + 2, bufSize); @@ -2688,7 +2688,7 @@ static void test_decodeExtensions(DWORD dwEncoding) exts[i].encoded, exts[i].encoded[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_EXTENSIONS *ext = (CERT_EXTENSIONS *)buf; DWORD j; @@ -2710,6 +2710,17 @@ static void test_decodeExtensions(DWORD dwEncoding) } LocalFree(buf); } + ret = pCryptDecodeObjectEx(dwEncoding, X509_EXTENSIONS, + exts[i].encoded, exts[i].encoded[1] + 2, 0, NULL, NULL, &bufSize); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bufSize); + if (buf) + { + ret = pCryptDecodeObjectEx(dwEncoding, X509_EXTENSIONS, + exts[i].encoded, exts[i].encoded[1] + 2, 0, NULL, buf, &bufSize); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, buf); + } } } @@ -2792,7 +2803,7 @@ static void test_encodePublicKeyInfo(DWORD dwEncoding) &bufSize); ok(ret || GetLastError() == OSS_BAD_PTR /* Win9x */, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == pubKeys[i].encoded[1] + 2, "Expected %d bytes, got %d\n", pubKeys[i].encoded[1] + 2, bufSize); @@ -2844,7 +2855,7 @@ static void test_decodePublicKeyInfo(DWORD dwEncoding) pubKeys[i].encoded, pubKeys[i].encoded[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { comparePublicKeyInfo(&pubKeys[i].decoded, (CERT_PUBLIC_KEY_INFO *)buf); @@ -2855,7 +2866,7 @@ static void test_decodePublicKeyInfo(DWORD dwEncoding) pubKeys[i].encodedNoNull, pubKeys[i].encodedNoNull[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { comparePublicKeyInfo(&pubKeys[i].info, (CERT_PUBLIC_KEY_INFO *)buf); LocalFree(buf); @@ -3003,7 +3014,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret || GetLastError() == OSS_BAD_PTR /* Win9x */, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == v1Cert[1] + 2, "Expected size %d, got %d\n", v1Cert[1] + 2, size); @@ -3016,7 +3027,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret || GetLastError() == OSS_BAD_PTR /* Win9x */, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(v2Cert), "Wrong size %d\n", size); ok(!memcmp(buf, v2Cert, size), "Got unexpected value\n"); @@ -3028,7 +3039,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret || GetLastError() == OSS_BAD_PTR /* Win9x */, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(v3Cert), "Wrong size %d\n", size); ok(!memcmp(buf, v3Cert, size), "Got unexpected value\n"); @@ -3038,7 +3049,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) info.dwVersion = 3; /* Not a typo, CERT_V3 is 2 */ ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(v4Cert), "Wrong size %d\n", size); ok(!memcmp(buf, v4Cert, size), "Unexpected value\n"); @@ -3054,7 +3065,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret || GetLastError() == OSS_BAD_PTR /* Win9x */, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(v1CertWithConstraints), "Wrong size %d\n", size); ok(!memcmp(buf, v1CertWithConstraints, size), "Got unexpected value\n"); @@ -3065,7 +3076,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) info.SerialNumber.pbData = (BYTE *)serialNum; ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(v1CertWithSerial), "Wrong size %d\n", size); ok(!memcmp(buf, v1CertWithSerial, size), "Got unexpected value\n"); @@ -3080,7 +3091,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret || broken(GetLastError() == OSS_BAD_PTR /* Win98 */), "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(v1CertWithIssuerUniqueId), "Wrong size %d\n", size); ok(!memcmp(buf, v1CertWithIssuerUniqueId, size), @@ -3098,7 +3109,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) info.Subject.pbData = (BYTE *)encodedCommonName; ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(bigCert), "Wrong size %d\n", size); ok(!memcmp(buf, bigCert, size), "Got unexpected value\n"); @@ -3110,7 +3121,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) info.SubjectPublicKeyInfo.PublicKey.pbData = (LPBYTE)aKey; ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(v1CertWithPubKey) || size == sizeof(v1CertWithPubKeyNoNull), "Wrong size %d\n", size); @@ -3127,7 +3138,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(v1CertWithSubjectIssuerSerialAndIssuerUniqueId) || size == sizeof(v1CertWithSubjectIssuerSerialAndIssuerUniqueIdNoNull), @@ -3156,7 +3167,7 @@ static void test_encodeCertToBeSigned(DWORD dwEncoding) info.rgExtension = &ext; ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(v1CertWithSubjectKeyId), "Wrong size %d\n", size); ok(!memcmp(buf, v1CertWithSubjectKeyId, size), "Unexpected value\n"); @@ -3240,7 +3251,7 @@ static void test_decodeCertToBeSigned(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_CERT_TO_BE_SIGNED, bigCert, sizeof(bigCert), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_INFO *info = (CERT_INFO *)buf; @@ -3265,7 +3276,7 @@ static void test_decodeCertToBeSigned(DWORD dwEncoding) v1CertWithPubKey, sizeof(v1CertWithPubKey), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_INFO *info = (CERT_INFO *)buf; @@ -3326,7 +3337,7 @@ static void test_encodeCert(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &bufSize); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(bufSize == sizeof(signedBigCert), "Wrong size %d\n", bufSize); ok(!memcmp(buf, signedBigCert, bufSize), "Unexpected cert\n"); @@ -3343,7 +3354,7 @@ static void test_decodeCert(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_CERT, signedBigCert, sizeof(signedBigCert), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_SIGNED_CONTENT_INFO *info = (CERT_SIGNED_CONTENT_INFO *)buf; @@ -3361,7 +3372,7 @@ static void test_decodeCert(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, X509_CERT_TO_BE_SIGNED, signedBigCert, sizeof(signedBigCert), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_INFO *info = (CERT_INFO *)buf; @@ -3420,7 +3431,7 @@ static void test_encodeCRLDistPoints(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CRL_DIST_POINTS, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptyDistPoint), "Wrong size %d\n", size); ok(!memcmp(buf, emptyDistPoint, size), "Unexpected value\n"); @@ -3445,7 +3456,7 @@ static void test_encodeCRLDistPoints(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CRL_DIST_POINTS, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(distPointWithUrl), "Wrong size %d\n", size); ok(!memcmp(buf, distPointWithUrl, size), "Unexpected value\n"); @@ -3458,7 +3469,7 @@ static void test_encodeCRLDistPoints(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CRL_DIST_POINTS, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(distPointWithReason), "Wrong size %d\n", size); ok(!memcmp(buf, distPointWithReason, size), "Unexpected value\n"); @@ -3471,7 +3482,7 @@ static void test_encodeCRLDistPoints(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CRL_DIST_POINTS, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(distPointWithIssuer), "Wrong size %d\n", size); ok(!memcmp(buf, distPointWithIssuer, size), "Unexpected value\n"); @@ -3482,7 +3493,7 @@ static void test_encodeCRLDistPoints(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CRL_DIST_POINTS, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(distPointWithUrlAndIssuer), "Wrong size %d\n", size); @@ -3601,6 +3612,19 @@ static void test_decodeCRLDistPoints(DWORD dwEncoding) ok(!lstrcmpW(U(*entry).pwszURL, url), "Unexpected name\n"); LocalFree(buf); } + ret = pCryptDecodeObjectEx(dwEncoding, X509_CRL_DIST_POINTS, + distPointWithUrlAndIssuer, distPointWithUrlAndIssuer[1] + 2, 0, + NULL, NULL, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + if (buf) + { + ret = pCryptDecodeObjectEx(dwEncoding, X509_CRL_DIST_POINTS, + distPointWithUrlAndIssuer, distPointWithUrlAndIssuer[1] + 2, 0, + NULL, buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, buf); + } } static const BYTE badFlagsIDP[] = { 0x30,0x06,0x81,0x01,0xff,0x82,0x01,0xff }; @@ -3629,7 +3653,7 @@ static void test_encodeCRLIssuingDistPoint(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_ISSUING_DIST_POINT, &point, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptySequence), "Unexpected size %d\n", size); ok(!memcmp(buf, emptySequence, size), "Unexpected value\n"); @@ -3641,7 +3665,7 @@ static void test_encodeCRLIssuingDistPoint(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_ISSUING_DIST_POINT, &point, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(badFlagsIDP), "Unexpected size %d\n", size); ok(!memcmp(buf, badFlagsIDP, size), "Unexpected value\n"); @@ -3660,7 +3684,7 @@ static void test_encodeCRLIssuingDistPoint(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_ISSUING_DIST_POINT, &point, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptyNameIDP), "Unexpected size %d\n", size); ok(!memcmp(buf, emptyNameIDP, size), "Unexpected value\n"); @@ -3674,7 +3698,7 @@ static void test_encodeCRLIssuingDistPoint(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_ISSUING_DIST_POINT, &point, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(urlIDP), "Unexpected size %d\n", size); ok(!memcmp(buf, urlIDP, size), "Unexpected value\n"); @@ -3866,7 +3890,7 @@ static void test_encodeCRLToBeSigned(DWORD dwEncoding) CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(v1CRL), "Wrong size %d\n", size); ok(!memcmp(buf, v1CRL, size), "Got unexpected value\n"); @@ -3878,7 +3902,7 @@ static void test_encodeCRLToBeSigned(DWORD dwEncoding) CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == v2CRL[1] + 2, "Expected size %d, got %d\n", v2CRL[1] + 2, size); @@ -3892,7 +3916,7 @@ static void test_encodeCRLToBeSigned(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_CRL_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(v1CRLWithIssuer), "Wrong size %d\n", size); ok(!memcmp(buf, v1CRLWithIssuer, size), "Got unexpected value\n"); @@ -3912,7 +3936,7 @@ static void test_encodeCRLToBeSigned(DWORD dwEncoding) info.rgCRLEntry = &entry; ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_CRL_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(v1CRLWithIssuerAndEmptyEntry), "Wrong size %d\n", size); @@ -3925,7 +3949,7 @@ static void test_encodeCRLToBeSigned(DWORD dwEncoding) entry.SerialNumber.pbData = (BYTE *)serialNum; ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_CRL_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(v1CRLWithIssuerAndEntry), "Wrong size %d\n", size); @@ -3939,7 +3963,7 @@ static void test_encodeCRLToBeSigned(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_CRL_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(v1CRLWithEntryExt), "Wrong size %d\n", size); ok(!memcmp(buf, v1CRLWithEntryExt, size), "Got unexpected value\n"); @@ -3952,7 +3976,7 @@ static void test_encodeCRLToBeSigned(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_CRL_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(v1CRLWithExt), "Wrong size %d\n", size); ok(!memcmp(buf, v1CRLWithExt, size), "Got unexpected value\n"); @@ -3964,7 +3988,7 @@ static void test_encodeCRLToBeSigned(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_CERT_CRL_TO_BE_SIGNED, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(v2CRLWithExt), "Wrong size %d\n", size); ok(!memcmp(buf, v2CRLWithExt, size), "Got unexpected value\n"); @@ -4539,7 +4563,7 @@ static void test_decodeCRLToBeSigned(DWORD dwEncoding) v1CRLWithIssuer, v1CRLWithIssuer[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CRL_INFO *info = (CRL_INFO *)buf; @@ -4565,7 +4589,7 @@ static void test_decodeCRLToBeSigned(DWORD dwEncoding) v1CRLWithIssuerAndEntry, v1CRLWithIssuerAndEntry[1] + 2, CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CRL_INFO *info = (CRL_INFO *)buf; CRL_ENTRY *entry; @@ -4592,7 +4616,7 @@ static void test_decodeCRLToBeSigned(DWORD dwEncoding) verisignCRL, sizeof(verisignCRL), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CRL_INFO *info = (CRL_INFO *)buf; @@ -4609,7 +4633,7 @@ static void test_decodeCRLToBeSigned(DWORD dwEncoding) verisignCRLWithLotsOfEntries, sizeof(verisignCRLWithLotsOfEntries), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CRL_INFO *info = (CRL_INFO *)buf; @@ -4625,7 +4649,7 @@ static void test_decodeCRLToBeSigned(DWORD dwEncoding) v1CRLWithExt, sizeof(v1CRLWithExt), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CRL_INFO *info = (CRL_INFO *)buf; CRL_ENTRY *entry; @@ -4653,7 +4677,7 @@ static void test_decodeCRLToBeSigned(DWORD dwEncoding) v2CRLWithExt, sizeof(v2CRLWithExt), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CRL_INFO *info = (CRL_INFO *)buf; @@ -4682,7 +4706,7 @@ static void test_encodeEnhancedKeyUsage(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_ENHANCED_KEY_USAGE, &usage, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptySequence), "Wrong size %d\n", size); ok(!memcmp(buf, emptySequence, size), "Got unexpected value\n"); @@ -4694,7 +4718,7 @@ static void test_encodeEnhancedKeyUsage(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_ENHANCED_KEY_USAGE, &usage, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(encodedUsage), "Wrong size %d\n", size); ok(!memcmp(buf, encodedUsage, size), "Got unexpected value\n"); @@ -4712,7 +4736,7 @@ static void test_decodeEnhancedKeyUsage(DWORD dwEncoding) emptySequence, sizeof(emptySequence), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_ENHKEY_USAGE *usage = (CERT_ENHKEY_USAGE *)buf; @@ -4726,7 +4750,7 @@ static void test_decodeEnhancedKeyUsage(DWORD dwEncoding) encodedUsage, sizeof(encodedUsage), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_ENHKEY_USAGE *usage = (CERT_ENHKEY_USAGE *)buf; DWORD i; @@ -4741,6 +4765,17 @@ static void test_decodeEnhancedKeyUsage(DWORD dwEncoding) usage->rgpszUsageIdentifier[i]); LocalFree(buf); } + ret = pCryptDecodeObjectEx(dwEncoding, X509_ENHANCED_KEY_USAGE, + encodedUsage, sizeof(encodedUsage), 0, NULL, NULL, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + if (buf) + { + ret = pCryptDecodeObjectEx(dwEncoding, X509_ENHANCED_KEY_USAGE, + encodedUsage, sizeof(encodedUsage), 0, NULL, buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, buf); + } } static BYTE keyId[] = { 1,2,3,4 }; @@ -4762,7 +4797,7 @@ static void test_encodeAuthorityKeyId(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_KEY_ID, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptySequence), "Unexpected size %d\n", size); ok(!memcmp(buf, emptySequence, size), "Unexpected value\n"); @@ -4774,7 +4809,7 @@ static void test_encodeAuthorityKeyId(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_KEY_ID, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(authorityKeyIdWithId), "Unexpected size %d\n", size); ok(!memcmp(buf, authorityKeyIdWithId, size), "Unexpected value\n"); @@ -4787,7 +4822,7 @@ static void test_encodeAuthorityKeyId(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_KEY_ID, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(authorityKeyIdWithIssuer), "Unexpected size %d\n", size); @@ -4801,7 +4836,7 @@ static void test_encodeAuthorityKeyId(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_KEY_ID, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(authorityKeyIdWithSerial), "Unexpected size %d\n", size); @@ -4820,7 +4855,7 @@ static void test_decodeAuthorityKeyId(DWORD dwEncoding) emptySequence, sizeof(emptySequence), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_AUTHORITY_KEY_ID_INFO *info = (CERT_AUTHORITY_KEY_ID_INFO *)buf; @@ -4835,7 +4870,7 @@ static void test_decodeAuthorityKeyId(DWORD dwEncoding) authorityKeyIdWithId, sizeof(authorityKeyIdWithId), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_AUTHORITY_KEY_ID_INFO *info = (CERT_AUTHORITY_KEY_ID_INFO *)buf; @@ -4852,7 +4887,7 @@ static void test_decodeAuthorityKeyId(DWORD dwEncoding) authorityKeyIdWithIssuer, sizeof(authorityKeyIdWithIssuer), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_AUTHORITY_KEY_ID_INFO *info = (CERT_AUTHORITY_KEY_ID_INFO *)buf; @@ -4870,7 +4905,7 @@ static void test_decodeAuthorityKeyId(DWORD dwEncoding) authorityKeyIdWithSerial, sizeof(authorityKeyIdWithSerial), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_AUTHORITY_KEY_ID_INFO *info = (CERT_AUTHORITY_KEY_ID_INFO *)buf; @@ -4902,7 +4937,7 @@ static void test_encodeAuthorityKeyId2(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_KEY_ID2, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptySequence), "Unexpected size %d\n", size); ok(!memcmp(buf, emptySequence, size), "Unexpected value\n"); @@ -4914,7 +4949,7 @@ static void test_encodeAuthorityKeyId2(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_KEY_ID2, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(authorityKeyIdWithId), "Unexpected size %d\n", size); @@ -4935,7 +4970,7 @@ static void test_encodeAuthorityKeyId2(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_KEY_ID2, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(authorityKeyIdWithIssuerUrl), "Unexpected size %d\n", size); @@ -4950,7 +4985,7 @@ static void test_encodeAuthorityKeyId2(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_KEY_ID2, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(authorityKeyIdWithSerial), "Unexpected size %d\n", size); @@ -4969,7 +5004,7 @@ static void test_decodeAuthorityKeyId2(DWORD dwEncoding) emptySequence, sizeof(emptySequence), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_AUTHORITY_KEY_ID2_INFO *info = (CERT_AUTHORITY_KEY_ID2_INFO *)buf; @@ -4986,7 +5021,7 @@ static void test_decodeAuthorityKeyId2(DWORD dwEncoding) authorityKeyIdWithId, sizeof(authorityKeyIdWithId), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_AUTHORITY_KEY_ID2_INFO *info = (CERT_AUTHORITY_KEY_ID2_INFO *)buf; @@ -5005,7 +5040,7 @@ static void test_decodeAuthorityKeyId2(DWORD dwEncoding) authorityKeyIdWithIssuerUrl, sizeof(authorityKeyIdWithIssuerUrl), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_AUTHORITY_KEY_ID2_INFO *info = (CERT_AUTHORITY_KEY_ID2_INFO *)buf; @@ -5028,7 +5063,7 @@ static void test_decodeAuthorityKeyId2(DWORD dwEncoding) authorityKeyIdWithSerial, sizeof(authorityKeyIdWithSerial), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { CERT_AUTHORITY_KEY_ID2_INFO *info = (CERT_AUTHORITY_KEY_ID2_INFO *)buf; @@ -5070,7 +5105,7 @@ static void test_encodeAuthorityInfoAccess(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptySequence), "unexpected size %d\n", size); ok(!memcmp(buf, emptySequence, size), "unexpected value\n"); @@ -5097,7 +5132,7 @@ static void test_encodeAuthorityInfoAccess(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(authorityInfoAccessWithUrl), "unexpected size %d\n", size); @@ -5117,7 +5152,7 @@ static void test_encodeAuthorityInfoAccess(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(authorityInfoAccessWithUrlAndIPAddr), "unexpected size %d\n", size); @@ -5160,7 +5195,7 @@ static void test_decodeAuthorityInfoAccess(DWORD dwEncoding) emptySequence, sizeof(emptySequence), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { CERT_AUTHORITY_INFO_ACCESS aia = { 0, NULL }; @@ -5173,7 +5208,7 @@ static void test_decodeAuthorityInfoAccess(DWORD dwEncoding) authorityInfoAccessWithUrl, sizeof(authorityInfoAccessWithUrl), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { CERT_ACCESS_DESCRIPTION accessDescription; CERT_AUTHORITY_INFO_ACCESS aia; @@ -5193,7 +5228,7 @@ static void test_decodeAuthorityInfoAccess(DWORD dwEncoding) sizeof(authorityInfoAccessWithUrlAndIPAddr), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { CERT_ACCESS_DESCRIPTION accessDescription[2]; CERT_AUTHORITY_INFO_ACCESS aia; @@ -5215,6 +5250,19 @@ static void test_decodeAuthorityInfoAccess(DWORD dwEncoding) LocalFree(buf); buf = NULL; } + ret = pCryptDecodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, + authorityInfoAccessWithUrlAndIPAddr, + sizeof(authorityInfoAccessWithUrlAndIPAddr), 0, NULL, NULL, &size); + ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); + buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + if (buf) + { + ret = pCryptDecodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, + authorityInfoAccessWithUrlAndIPAddr, + sizeof(authorityInfoAccessWithUrlAndIPAddr), 0, NULL, buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, buf); + } } static const BYTE emptyCTL[] = { @@ -5275,7 +5323,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptyCTL), "unexpected size %d\n", size); ok(!memcmp(buf, emptyCTL, size), "unexpected value\n"); @@ -5286,7 +5334,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptyCTLWithVersion1), "unexpected size %d\n", size); ok(!memcmp(buf, emptyCTLWithVersion1, size), "unexpected value\n"); @@ -5299,7 +5347,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(ctlWithUsageIdentifier), "unexpected size %d\n", size); @@ -5313,7 +5361,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(ctlWithListIdentifier), "unexpected size %d\n", size); ok(!memcmp(buf, ctlWithListIdentifier, size), "unexpected value\n"); @@ -5326,7 +5374,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(ctlWithSequenceNumber), "unexpected size %d\n", size); @@ -5339,7 +5387,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(ctlWithThisUpdate), "unexpected size %d\n", size); ok(!memcmp(buf, ctlWithThisUpdate, size), "unexpected value\n"); @@ -5350,7 +5398,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(ctlWithThisAndNextUpdate), "unexpected size %d\n", size); @@ -5364,7 +5412,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(ctlWithAlgId), "unexpected size %d\n", size); ok(!memcmp(buf, ctlWithAlgId, size), "unexpected value\n"); @@ -5389,7 +5437,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(ctlWithBogusEntry), "unexpected size %d\n", size); ok(!memcmp(buf, ctlWithBogusEntry, size), "unexpected value\n"); @@ -5401,7 +5449,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(ctlWithOneEntry), "unexpected size %d\n", size); ok(!memcmp(buf, ctlWithOneEntry, size), "unexpected value\n"); @@ -5421,7 +5469,7 @@ static void test_encodeCTL(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CTL, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(ctlWithTwoEntries), "unexpected size %d\n", size); ok(!memcmp(buf, ctlWithTwoEntries, size), "unexpected value\n"); @@ -5611,7 +5659,7 @@ static void test_decodeCTL(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, PKCS_CTL, emptyCTL, sizeof(emptyCTL), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { compareCTLInfo("empty CTL", &info, (CTL_INFO *)buf); LocalFree(buf); @@ -5622,7 +5670,7 @@ static void test_decodeCTL(DWORD dwEncoding) sizeof(emptyCTLWithVersion1), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { compareCTLInfo("v1 CTL", &info, (CTL_INFO *)buf); LocalFree(buf); @@ -5635,7 +5683,7 @@ static void test_decodeCTL(DWORD dwEncoding) sizeof(ctlWithUsageIdentifier), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { compareCTLInfo("CTL with usage identifier", &info, (CTL_INFO *)buf); LocalFree(buf); @@ -5647,7 +5695,7 @@ static void test_decodeCTL(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithListIdentifier, sizeof(ctlWithListIdentifier), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { compareCTLInfo("CTL with list identifier", &info, (CTL_INFO *)buf); LocalFree(buf); @@ -5659,7 +5707,7 @@ static void test_decodeCTL(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithSequenceNumber, sizeof(ctlWithSequenceNumber), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { compareCTLInfo("CTL with sequence number", &info, (CTL_INFO *)buf); LocalFree(buf); @@ -5670,7 +5718,7 @@ static void test_decodeCTL(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithThisUpdate, sizeof(ctlWithThisUpdate), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { compareCTLInfo("CTL with this update", &info, (CTL_INFO *)buf); LocalFree(buf); @@ -5681,7 +5729,7 @@ static void test_decodeCTL(DWORD dwEncoding) sizeof(ctlWithThisAndNextUpdate), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { compareCTLInfo("CTL with this and next update", &info, (CTL_INFO *)buf); LocalFree(buf); @@ -5695,7 +5743,7 @@ static void test_decodeCTL(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithAlgId, sizeof(ctlWithAlgId), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { compareCTLInfo("CTL with algorithm identifier", &info, (CTL_INFO *)buf); LocalFree(buf); @@ -5730,7 +5778,7 @@ static void test_decodeCTL(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithOneEntry, sizeof(ctlWithOneEntry), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { compareCTLInfo("CTL with one entry", &info, (CTL_INFO *)buf); LocalFree(buf); @@ -5749,7 +5797,7 @@ static void test_decodeCTL(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, PKCS_CTL, ctlWithTwoEntries, sizeof(ctlWithTwoEntries), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { compareCTLInfo("CTL with two entries", &info, (CTL_INFO *)buf); LocalFree(buf); @@ -5809,7 +5857,7 @@ static void test_encodePKCSContentInfo(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CONTENT_INFO, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptyPKCSContentInfo), "Unexpected size %d\n", size); ok(!memcmp(buf, emptyPKCSContentInfo, size), "Unexpected value\n"); @@ -5820,7 +5868,7 @@ static void test_encodePKCSContentInfo(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CONTENT_INFO, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed; %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(bogusPKCSContentInfo), "Unexpected size %d\n", size); ok(!memcmp(buf, bogusPKCSContentInfo, size), "Unexpected value\n"); @@ -5830,7 +5878,7 @@ static void test_encodePKCSContentInfo(DWORD dwEncoding) info.Content.cbData = ints[0].encoded[1] + 2; ret = pCryptEncodeObjectEx(dwEncoding, PKCS_CONTENT_INFO, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(intPKCSContentInfo), "Unexpected size %d\n", size); ok(!memcmp(buf, intPKCSContentInfo, size), "Unexpected value\n"); @@ -5879,7 +5927,7 @@ static void test_decodePKCSContentInfo(DWORD dwEncoding) emptyPKCSContentInfo, sizeof(emptyPKCSContentInfo), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { info = (CRYPT_CONTENT_INFO *)buf; @@ -5908,7 +5956,7 @@ static void test_decodePKCSContentInfo(DWORD dwEncoding) intPKCSContentInfo, sizeof(intPKCSContentInfo), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { info = (CRYPT_CONTENT_INFO *)buf; @@ -5924,7 +5972,7 @@ static void test_decodePKCSContentInfo(DWORD dwEncoding) indefiniteSignedPKCSContent, sizeof(indefiniteSignedPKCSContent), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { info = (CRYPT_CONTENT_INFO *)buf; @@ -5971,7 +6019,7 @@ static void test_encodePKCSAttribute(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_ATTRIBUTE, &attr, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptyPKCSAttr), "Unexpected size %d\n", size); ok(!memcmp(buf, emptyPKCSAttr, size), "Unexpected value\n"); @@ -5984,7 +6032,7 @@ static void test_encodePKCSAttribute(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_ATTRIBUTE, &attr, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(bogusPKCSAttr), "Unexpected size %d\n", size); ok(!memcmp(buf, bogusPKCSAttr, size), "Unexpected value\n"); @@ -5994,7 +6042,7 @@ static void test_encodePKCSAttribute(DWORD dwEncoding) blob.cbData = ints[0].encoded[1] + 2; ret = pCryptEncodeObjectEx(dwEncoding, PKCS_ATTRIBUTE, &attr, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(intPKCSAttr), "Unexpected size %d\n", size); ok(!memcmp(buf, intPKCSAttr, size), "Unexpected value\n"); @@ -6013,7 +6061,7 @@ static void test_decodePKCSAttribute(DWORD dwEncoding) emptyPKCSAttr, sizeof(emptyPKCSAttr), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { attr = (CRYPT_ATTRIBUTE *)buf; @@ -6038,7 +6086,7 @@ static void test_decodePKCSAttribute(DWORD dwEncoding) intPKCSAttr, sizeof(intPKCSAttr), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { attr = (CRYPT_ATTRIBUTE *)buf; @@ -6072,7 +6120,7 @@ static void test_encodePKCSAttributes(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_ATTRIBUTES, &attributes, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptyPKCSAttributes), "Unexpected size %d\n", size); ok(!memcmp(buf, emptyPKCSAttributes, size), "Unexpected value\n"); @@ -6089,7 +6137,7 @@ static void test_encodePKCSAttributes(DWORD dwEncoding) attr[0].pszObjId = oid1; ret = pCryptEncodeObjectEx(dwEncoding, PKCS_ATTRIBUTES, &attributes, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { ok(size == sizeof(singlePKCSAttributes), "Unexpected size %d\n", size); ok(!memcmp(buf, singlePKCSAttributes, size), "Unexpected value\n"); @@ -6104,7 +6152,7 @@ static void test_encodePKCSAttributes(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_ATTRIBUTES, &attributes, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(doublePKCSAttributes), "Unexpected size %d\n", size); ok(!memcmp(buf, doublePKCSAttributes, size), "Unexpected value\n"); @@ -6123,7 +6171,7 @@ static void test_decodePKCSAttributes(DWORD dwEncoding) emptyPKCSAttributes, sizeof(emptyPKCSAttributes), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { attributes = (CRYPT_ATTRIBUTES *)buf; ok(attributes->cAttr == 0, "Expected no attributes, got %d\n", @@ -6134,7 +6182,7 @@ static void test_decodePKCSAttributes(DWORD dwEncoding) singlePKCSAttributes, sizeof(singlePKCSAttributes), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { attributes = (CRYPT_ATTRIBUTES *)buf; ok(attributes->cAttr == 1, "Expected 1 attribute, got %d\n", @@ -6149,7 +6197,7 @@ static void test_decodePKCSAttributes(DWORD dwEncoding) doublePKCSAttributes, sizeof(doublePKCSAttributes), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { attributes = (CRYPT_ATTRIBUTES *)buf; ok(attributes->cAttr == 2, "Expected 2 attributes, got %d\n", @@ -6168,6 +6216,17 @@ static void test_decodePKCSAttributes(DWORD dwEncoding) attributes->rgAttr[1].rgValue[0].cbData), "Unexpected value\n"); LocalFree(buf); } + ret = pCryptDecodeObjectEx(dwEncoding, PKCS_ATTRIBUTES, + doublePKCSAttributes, sizeof(doublePKCSAttributes), 0, NULL, NULL, &size); + ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); + buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + if (buf) + { + ret = pCryptDecodeObjectEx(dwEncoding, PKCS_ATTRIBUTES, + doublePKCSAttributes, sizeof(doublePKCSAttributes), 0, NULL, buf, &size); + ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, buf); + } } static const BYTE singleCapability[] = { @@ -6191,7 +6250,7 @@ static void test_encodePKCSSMimeCapabilities(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(emptySequence), "unexpected size %d\n", size); ok(!memcmp(buf, emptySequence, size), "unexpected value\n"); @@ -6214,7 +6273,7 @@ static void test_encodePKCSSMimeCapabilities(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(singleCapability), "unexpected size %d\n", size); ok(!memcmp(buf, singleCapability, size), "unexpected value\n"); @@ -6226,7 +6285,7 @@ static void test_encodePKCSSMimeCapabilities(DWORD dwEncoding) ret = pCryptEncodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, &capabilities, CRYPT_ENCODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(twoCapabilities), "unexpected size %d\n", size); ok(!memcmp(buf, twoCapabilities, size), "unexpected value\n"); @@ -6325,6 +6384,19 @@ static void test_decodePKCSSMimeCapabilities(DWORD dwEncoding) compareSMimeCapabilities("two capabilities", &capabilities, ptr); LocalFree(ptr); } + SetLastError(0xdeadbeef); + ret = pCryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, + twoCapabilities, sizeof(twoCapabilities), 0, NULL, NULL, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + ptr = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + if (ptr) + { + SetLastError(0xdeadbeef); + ret = pCryptDecodeObjectEx(dwEncoding, PKCS_SMIME_CAPABILITIES, + twoCapabilities, sizeof(twoCapabilities), 0, NULL, ptr, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, ptr); + } } static BYTE encodedCommonNameNoNull[] = { 0x30,0x14,0x31,0x12,0x30,0x10, @@ -6403,7 +6475,7 @@ static void test_encodePKCSSignerInfo(DWORD dwEncoding) { ok(ret || broken(GetLastError() == OSS_LIMITED /* Win9x */), "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(minimalPKCSSigner), "Unexpected size %d\n", size); if (size == sizeof(minimalPKCSSigner)) @@ -6425,7 +6497,7 @@ static void test_encodePKCSSignerInfo(DWORD dwEncoding) { ok(ret || broken(GetLastError() == OSS_LIMITED /* Win9x */), "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(PKCSSignerWithSerial), "Unexpected size %d\n", size); @@ -6448,7 +6520,7 @@ static void test_encodePKCSSignerInfo(DWORD dwEncoding) { ok(ret || broken(GetLastError() == OSS_LIMITED /* Win9x */), "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(PKCSSignerWithHashAlgo), "Unexpected size %d\n", size); @@ -6470,7 +6542,7 @@ static void test_encodePKCSSignerInfo(DWORD dwEncoding) else { ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(PKCSSignerWithHashAndEncryptionAlgo), "Unexpected size %d\n", size); @@ -6493,7 +6565,7 @@ static void test_encodePKCSSignerInfo(DWORD dwEncoding) else { ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(PKCSSignerWithHash), "Unexpected size %d\n", size); @@ -6516,7 +6588,7 @@ static void test_encodePKCSSignerInfo(DWORD dwEncoding) else { ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(PKCSSignerWithAuthAttr), "Unexpected size %d\n", size); @@ -6551,7 +6623,7 @@ static void test_decodePKCSSignerInfo(DWORD dwEncoding) CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret || broken(GetLastError() == OSS_DATA_ERROR), "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { info = (CMSG_SIGNER_INFO *)buf; ok(info->dwVersion == 0, "Expected version 0, got %d\n", @@ -6569,7 +6641,7 @@ static void test_decodePKCSSignerInfo(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, PKCS7_SIGNER_INFO, PKCSSignerWithHashAlgo, sizeof(PKCSSignerWithHashAlgo), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { info = (CMSG_SIGNER_INFO *)buf; ok(info->dwVersion == 0, "Expected version 0, got %d\n", @@ -6590,7 +6662,7 @@ static void test_decodePKCSSignerInfo(DWORD dwEncoding) PKCSSignerWithHashAndEncryptionAlgo, sizeof(PKCSSignerWithHashAndEncryptionAlgo), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { info = (CMSG_SIGNER_INFO *)buf; ok(info->dwVersion == 0, "Expected version 0, got %d\n", @@ -6612,7 +6684,7 @@ static void test_decodePKCSSignerInfo(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, PKCS7_SIGNER_INFO, PKCSSignerWithHash, sizeof(PKCSSignerWithHash), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { info = (CMSG_SIGNER_INFO *)buf; ok(info->dwVersion == 0, "Expected version 0, got %d\n", @@ -6638,7 +6710,7 @@ static void test_decodePKCSSignerInfo(DWORD dwEncoding) ret = pCryptDecodeObjectEx(dwEncoding, PKCS7_SIGNER_INFO, PKCSSignerWithAuthAttr, sizeof(PKCSSignerWithAuthAttr), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); - if (buf) + if (ret) { info = (CMSG_SIGNER_INFO *)buf; ok(info->AuthAttrs.cAttr == 1, "Expected 1 attribute, got %d\n", @@ -6709,7 +6781,7 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) else { ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(minimalPKCSSigner), "Unexpected size %d\n", size); ok(!memcmp(buf, minimalPKCSSigner, size), "Unexpected value\n"); @@ -6727,7 +6799,7 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) else { ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(PKCSSignerWithSerial), "Unexpected size %d\n", size); @@ -6747,7 +6819,7 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) else { ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(CMSSignerWithKeyId), "Unexpected size %d\n", size); @@ -6782,7 +6854,7 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) else { ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(PKCSSignerWithHashAlgo), "Unexpected size %d\n", size); @@ -6801,7 +6873,7 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) else { ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(PKCSSignerWithHashAndEncryptionAlgo), "Unexpected size %d\n", size); @@ -6821,7 +6893,7 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) else { ok(ret, "CryptEncodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { ok(size == sizeof(PKCSSignerWithHash), "Unexpected size %d\n", size); @@ -6856,7 +6928,7 @@ static void test_decodeCMSSignerInfo(DWORD dwEncoding) PKCSSignerWithSerial, sizeof(PKCSSignerWithSerial), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { info = (CMSG_CMS_SIGNER_INFO *)buf; ok(info->dwVersion == 0, "Expected version 0, got %d\n", @@ -6882,7 +6954,7 @@ static void test_decodeCMSSignerInfo(DWORD dwEncoding) PKCSSignerWithHashAlgo, sizeof(PKCSSignerWithHashAlgo), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { info = (CMSG_CMS_SIGNER_INFO *)buf; ok(info->dwVersion == 0, "Expected version 0, got %d\n", @@ -6911,7 +6983,7 @@ static void test_decodeCMSSignerInfo(DWORD dwEncoding) sizeof(PKCSSignerWithHashAndEncryptionAlgo), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { info = (CMSG_CMS_SIGNER_INFO *)buf; ok(info->dwVersion == 0, "Expected version 0, got %d\n", @@ -6941,7 +7013,7 @@ static void test_decodeCMSSignerInfo(DWORD dwEncoding) PKCSSignerWithHash, sizeof(PKCSSignerWithHash), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { info = (CMSG_CMS_SIGNER_INFO *)buf; ok(info->dwVersion == 0, "Expected version 0, got %d\n", @@ -6975,7 +7047,7 @@ static void test_decodeCMSSignerInfo(DWORD dwEncoding) CMSSignerWithKeyId, sizeof(CMSSignerWithKeyId), CRYPT_DECODE_ALLOC_FLAG, NULL, &buf, &size); ok(ret, "CryptDecodeObjectEx failed: %x\n", GetLastError()); - if (buf) + if (ret) { info = (CMSG_CMS_SIGNER_INFO *)buf; ok(info->dwVersion == 0, "Expected version 0, got %d\n", @@ -7137,7 +7209,7 @@ static CERT_GENERAL_SUBTREE IPAddressWithMinSubtree = { static CERT_GENERAL_SUBTREE IPAddressWithMinMaxSubtree = { { CERT_ALT_NAME_IP_ADDRESS, { 0 } }, 5, TRUE, 3 }; -struct EncodedNameConstraints encodedNameConstraints[] = { +static const struct EncodedNameConstraints encodedNameConstraints[] = { { { sizeof(emptySequence), (LPBYTE)emptySequence }, { 0 } }, { { sizeof(emptyDNSPermittedConstraints), emptyDNSPermittedConstraints }, { 1, &emptyDNSSubtree, 0, NULL } }, @@ -7487,6 +7559,17 @@ static void test_decodeCertPolicies(DWORD dwEncoding) "unexpected qualifier value\n"); LocalFree(info); } + ret = pCryptDecodeObjectEx(dwEncoding, X509_CERT_POLICIES, + twoPolicies, sizeof(twoPolicies), 0, NULL, NULL, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + if (info) + { + ret = pCryptDecodeObjectEx(dwEncoding, X509_CERT_POLICIES, + twoPolicies, sizeof(twoPolicies), 0, NULL, info, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, info); + } } static const BYTE policyMappingWithOneMapping[] = { @@ -7630,6 +7713,19 @@ static void test_decodeCertPolicyMappings(DWORD dwEncoding) info->rgPolicyMapping[1].pszSubjectDomainPolicy); LocalFree(info); } + ret = pCryptDecodeObjectEx(dwEncoding, mappingOids[i], + policyMappingWithTwoMappings, sizeof(policyMappingWithTwoMappings), 0, + NULL, NULL, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + info = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); + if (info) + { + ret = pCryptDecodeObjectEx(dwEncoding, mappingOids[i], + policyMappingWithTwoMappings, sizeof(policyMappingWithTwoMappings), 0, + NULL, info, &size); + ok(ret, "CryptDecodeObjectEx failed: %08x\n", GetLastError()); + HeapFree(GetProcessHeap(), 0, info); + } } } diff --git a/rostests/winetests/crypt32/main.c b/rostests/winetests/crypt32/main.c index 7c11e8e2ee3..8c5b41e08cd 100644 --- a/rostests/winetests/crypt32/main.c +++ b/rostests/winetests/crypt32/main.c @@ -28,7 +28,7 @@ #include "wine/test.h" -HMODULE hCrypt; +static HMODULE hCrypt; static void test_findAttribute(void) { @@ -47,8 +47,7 @@ static void test_findAttribute(void) if (0) { /* crashes */ - SetLastError(0xdeadbeef); - ret = CertFindAttribute(NULL, 1, NULL); + CertFindAttribute(NULL, 1, NULL); /* returns NULL, last error is ERROR_INVALID_PARAMETER * crashes on Vista */ @@ -93,7 +92,7 @@ static void test_findExtension(void) { /* crashes */ SetLastError(0xdeadbeef); - ret = CertFindExtension(NULL, 1, NULL); + CertFindExtension(NULL, 1, NULL); /* returns NULL, last error is ERROR_INVALID_PARAMETER * crashes on Vista */ @@ -138,7 +137,7 @@ static void test_findRDNAttr(void) { /* crashes */ SetLastError(0xdeadbeef); - ret = CertFindRDNAttr(NULL, NULL); + CertFindRDNAttr(NULL, NULL); /* returns NULL, last error is ERROR_INVALID_PARAMETER * crashes on Vista */ @@ -395,7 +394,7 @@ static void test_format_object(void) /* Crash */ if (0) { - ret = pCryptFormatObject(0, 0, 0, NULL, NULL, NULL, 0, NULL, NULL); + pCryptFormatObject(0, 0, 0, NULL, NULL, NULL, 0, NULL, NULL); } /* When called with any but the default encoding, it fails to find a * formatting function. diff --git a/rostests/winetests/crypt32/message.c b/rostests/winetests/crypt32/message.c index fa8df0e5951..be3a03b8dd2 100644 --- a/rostests/winetests/crypt32/message.c +++ b/rostests/winetests/crypt32/message.c @@ -27,6 +27,23 @@ #include "wine/test.h" +static BOOL (WINAPI * pCryptAcquireContextA) + (HCRYPTPROV *, LPCSTR, LPCSTR, DWORD, DWORD); + +static void init_function_pointers(void) +{ + HMODULE hAdvapi32 = GetModuleHandleA("advapi32.dll"); + +#define GET_PROC(dll, func) \ + p ## func = (void *)GetProcAddress(dll, #func); \ + if(!p ## func) \ + trace("GetProcAddress(%s) failed\n", #func); + + GET_PROC(hAdvapi32, CryptAcquireContextA) + +#undef GET_PROC +} + static const BYTE dataEmptyBareContent[] = { 0x04,0x00 }; static const BYTE dataEmptyContent[] = { 0x30,0x0f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x02, @@ -107,7 +124,7 @@ static void test_verify_detached_message_hash(void) if (0) { - ret = CryptVerifyDetachedMessageHash(NULL, NULL, 0, 0, NULL, NULL, NULL, + CryptVerifyDetachedMessageHash(NULL, NULL, 0, 0, NULL, NULL, NULL, NULL); } memset(¶, 0, sizeof(para)); @@ -453,6 +470,34 @@ static const BYTE signedWithCertWithPubKeyContent[] = { 0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20, 0x4c,0x61,0x6e,0x67,0x00,0x02,0x01,0x01,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48, 0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x04,0x06,0x00,0x05,0x00,0x04,0x00 }; +static const BYTE signedWithCertWithValidPubKeyContent[] = { +0x30,0x82,0x01,0x89,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02, +0xa0,0x82,0x01,0x7a,0x30,0x82,0x01,0x76,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c, +0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x13,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x06,0x04,0x04,0x01, +0x02,0x03,0x04,0xa0,0x81,0xd2,0x30,0x81,0xcf,0x02,0x01,0x01,0x30,0x02,0x06, +0x00,0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a, +0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x30,0x22,0x18,0x0f,0x31,0x36, +0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x18,0x0f, +0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a, +0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75, +0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x30,0x5c,0x30,0x0d,0x06,0x09,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x4b,0x00,0x30,0x48, +0x02,0x41,0x00,0xe2,0x54,0x3a,0xa7,0x83,0xb1,0x27,0x14,0x3e,0x59,0xbb,0xb4, +0x53,0xe6,0x1f,0xe7,0x5d,0xf1,0x21,0x68,0xad,0x85,0x53,0xdb,0x6b,0x1e,0xeb, +0x65,0x97,0x03,0x86,0x60,0xde,0xf3,0x6c,0x38,0x75,0xe0,0x4c,0x61,0xbb,0xbc, +0x62,0x17,0xa9,0xcd,0x79,0x3f,0x21,0x4e,0x96,0xcb,0x0e,0xdc,0x61,0x94,0x30, +0x18,0x10,0x6b,0xd0,0x1c,0x10,0x79,0x02,0x03,0x01,0x00,0x01,0xa3,0x16,0x30, +0x14,0x30,0x12,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x08,0x30,0x06, +0x01,0x01,0xff,0x02,0x01,0x01,0x31,0x77,0x30,0x75,0x02,0x01,0x01,0x30,0x1a, +0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75, +0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x02,0x01,0x01,0x30,0x0c,0x06,0x08, +0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x04,0x06,0x00,0x05, +0x00,0x04,0x40,0x81,0xa6,0x70,0xb3,0xef,0x59,0xd1,0x66,0xd1,0x9b,0xc0,0x9a, +0xb6,0x9a,0x5e,0x6d,0x6f,0x6d,0x0d,0x59,0xa9,0xaa,0x6e,0xe9,0x2c,0xa0,0x1e, +0xee,0xc2,0x60,0xbc,0x59,0xbe,0x3f,0x63,0x06,0x8d,0xc9,0x11,0x1d,0x23,0x64, +0x92,0xef,0x2e,0xfc,0x57,0x29,0xa4,0xaf,0xe0,0xee,0x93,0x19,0x39,0x51,0xe4, +0x44,0xb8,0x0b,0x28,0xf4,0xa8,0x0d }; static void test_verify_message_signature(void) { @@ -460,11 +505,19 @@ static void test_verify_message_signature(void) CRYPT_VERIFY_MESSAGE_PARA para = { 0 }; PCCERT_CONTEXT cert; DWORD cbDecoded; + BYTE decoded[sizeof(msgData)]; SetLastError(0xdeadbeef); ret = CryptVerifyMessageSignature(NULL, 0, NULL, 0, NULL, 0, NULL); ok(!ret && GetLastError() == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", GetLastError()); + /* Is cbDecoded set when invalid parameters are passed? */ + cbDecoded = 0xdeadbeef; + ret = CryptVerifyMessageSignature(NULL, 0, NULL, 0, NULL, &cbDecoded, + NULL); + ok(!ret && GetLastError() == E_INVALIDARG, + "Expected E_INVALIDARG, got %08x\n", GetLastError()); + ok(cbDecoded == 0, "expected 0, got %08x\n", cbDecoded); SetLastError(0xdeadbeef); ret = CryptVerifyMessageSignature(¶, 0, NULL, 0, NULL, 0, NULL); ok(!ret && GetLastError() == E_INVALIDARG, @@ -490,15 +543,24 @@ static void test_verify_message_signature(void) /* Check whether cert is set on error */ cert = (PCCERT_CONTEXT)0xdeadbeef; ret = CryptVerifyMessageSignature(¶, 0, NULL, 0, NULL, 0, &cert); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == OSS_BAD_ARG /* NT40 */), + "Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); ok(cert == NULL, "Expected NULL cert\n"); /* Check whether cbDecoded is set on error */ cbDecoded = 0xdeadbeef; ret = CryptVerifyMessageSignature(¶, 0, NULL, 0, NULL, &cbDecoded, NULL); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == OSS_BAD_ARG /* NT40 */), + "Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); ok(!cbDecoded, "Expected 0\n"); SetLastError(0xdeadbeef); ret = CryptVerifyMessageSignature(¶, 0, dataEmptyBareContent, sizeof(dataEmptyBareContent), NULL, 0, NULL); + ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH /* NT40 */), + "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); ok(GetLastError() == CRYPT_E_ASN1_BADTAG || GetLastError() == OSS_PDU_MISMATCH, /* win9x */ "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); @@ -542,6 +604,34 @@ static void test_verify_message_signature(void) ret = CryptVerifyMessageSignature(¶, 0, signedWithCertWithPubKeyContent, sizeof(signedWithCertWithPubKeyContent), NULL, 0, NULL); ok(!ret, "Expected failure\n"); + /* Apparently, an output pcbDecoded parameter is expected. */ + ret = CryptVerifyMessageSignature(¶, 0, + signedWithCertWithValidPubKeyContent, + sizeof(signedWithCertWithValidPubKeyContent), NULL, 0, NULL); + ok(!ret, "Expected failure\n"); + /* Finally, a message signed with a valid public key verifies successfully + */ + cbDecoded = 0xdeadbeef; + ret = CryptVerifyMessageSignature(¶, 0, + signedWithCertWithValidPubKeyContent, + sizeof(signedWithCertWithValidPubKeyContent), NULL, &cbDecoded, NULL); + ok(ret, "CryptVerifyMessageSignature failed: %08x\n", GetLastError()); + ok(cbDecoded == sizeof(msgData), "expected 4, got %d\n", cbDecoded); + cbDecoded = 0; + ret = CryptVerifyMessageSignature(¶, 0, + signedWithCertWithValidPubKeyContent, + sizeof(signedWithCertWithValidPubKeyContent), NULL, &cbDecoded, NULL); + /* Setting cbDecoded to 0 succeeds when a NULL buffer is provided */ + ok(ret, "CryptVerifyMessageSignature failed: %08x\n", GetLastError()); + ok(cbDecoded == sizeof(msgData), "expected 4, got %d\n", cbDecoded); + cbDecoded = 0; + ret = CryptVerifyMessageSignature(¶, 0, + signedWithCertWithValidPubKeyContent, + sizeof(signedWithCertWithValidPubKeyContent), decoded, &cbDecoded, NULL); + /* When a non-NULL buffer is provided, cbDecoded must not be too small */ + ok(!ret && GetLastError() == ERROR_MORE_DATA, + "expected ERROR_MORE_DATA, got %d (%08x)\n", GetLastError(), + GetLastError()); } static const BYTE detachedHashBlob[] = { @@ -600,6 +690,7 @@ static void test_hash_message(void) SetLastError(0xdeadbeef); ret = CryptHashMessage(¶, FALSE, 2, toHash, hashSize, NULL, NULL, NULL, NULL); + ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); /* Try again with a valid encoding type */ para.dwMsgEncodingType = PKCS_7_ASN_ENCODING; SetLastError(0xdeadbeef); @@ -615,7 +706,7 @@ static void test_hash_message(void) */ if (0) { - ret = CryptHashMessage(¶, FALSE, 2, NULL, NULL, NULL, + CryptHashMessage(¶, FALSE, 2, NULL, NULL, NULL, &hashedBlobSize, NULL, NULL); } /* Passing a valid pointer for the data to hash fails, as the hash @@ -702,6 +793,7 @@ static void test_hash_message(void) SetLastError(0xdeadbeef); ret = CryptHashMessage(¶, TRUE, 2, toHash, hashSize, NULL, &hashedBlobSize, computedHash, &computedHashSize); + ok(ret, "CryptHashMessage failed: 0x%08x\n", GetLastError()); ok(computedHashSize == sizeof(hashVal), "unexpected size of hash value %d\n", computedHashSize); ok(!memcmp(computedHash, hashVal, computedHashSize), @@ -710,12 +802,576 @@ static void test_hash_message(void) } } +static const BYTE publicPrivateKeyPair[] = { +0x07,0x02,0x00,0x00,0x00,0x24,0x00,0x00,0x52,0x53,0x41,0x32,0x00,0x02,0x00, +0x00,0x01,0x00,0x01,0x00,0x9b,0xd9,0x60,0xd9,0x5b,0x09,0x50,0x9e,0x09,0x94, +0x1e,0x6a,0x06,0x1d,0xdd,0x39,0xc5,0x96,0x17,0xe3,0xb9,0x0c,0x71,0x9c,0xf7, +0xc1,0x07,0x7b,0xd7,0x4a,0xaa,0x8a,0x3e,0xcd,0x78,0x3c,0x4c,0x95,0x98,0x28, +0x29,0x2d,0xe0,0xfc,0xe6,0x4f,0x95,0xca,0x87,0x92,0xdd,0xa3,0x8d,0xf0,0x39, +0xf3,0x1b,0x87,0x64,0x82,0x99,0xc0,0xa9,0xe8,0x87,0x86,0x2e,0x72,0x07,0x07, +0x8f,0x45,0x54,0x51,0x2f,0x51,0xd0,0x60,0x97,0x48,0x54,0x0e,0x78,0xb5,0x7e, +0x2b,0x9d,0xca,0x81,0xa8,0xa8,0x00,0x57,0x69,0xa6,0xf7,0x4d,0x45,0xe0,0xf7, +0xfa,0xd2,0xeb,0xaa,0xb8,0x06,0x34,0xce,0xf0,0x9d,0x2b,0x76,0x8a,0x4f,0x70, +0x51,0x90,0x33,0x72,0xcb,0x81,0x85,0x7e,0x35,0x2e,0xfb,0x81,0xf0,0xc7,0x85, +0xa5,0x75,0xf9,0x2d,0x00,0x71,0x66,0x36,0xfe,0x22,0xd6,0xc9,0x36,0x61,0x9b, +0x64,0x92,0xe8,0x25,0x38,0x35,0xeb,0x0c,0x84,0x83,0x76,0x42,0x90,0xf7,0x73, +0x91,0xdc,0x43,0x83,0x07,0x77,0xc9,0x1b,0x3f,0x74,0xc0,0xbe,0x18,0x97,0xd6, +0x86,0xe5,0xfa,0x28,0x7c,0xf7,0x8d,0x89,0xb1,0x93,0xac,0x48,0x3c,0xa1,0x02, +0xfa,0xc6,0x1c,0xa0,0xb5,0xe8,0x4f,0xd7,0xd1,0x33,0x63,0x8b,0x7e,0xf1,0x94, +0x56,0x07,0xbc,0x6e,0x0c,0xbd,0xa0,0x15,0xba,0x99,0x5d,0xb7,0x5e,0x09,0xf2, +0x1b,0x46,0x85,0x61,0x91,0x6a,0x78,0x31,0xb5,0xf0,0xba,0x20,0xf5,0x7a,0xb4, +0x8e,0xd3,0x50,0x87,0xf8,0xf3,0xe4,0xd9,0xab,0x6f,0x0e,0x59,0x42,0xac,0x7d, +0xb1,0x8c,0xea,0x33,0x54,0x08,0x38,0xc9,0xcd,0xac,0x10,0x19,0x4a,0xba,0x89, +0xdc,0xb6,0x73,0xef,0xec,0x56,0x93,0xd6,0xf2,0x4b,0xba,0x50,0x2d,0x8f,0x15, +0xed,0x8b,0xb5,0x67,0xc8,0xfc,0x51,0x5f }; +static const BYTE cert1[] = { +0x30,0x81,0xd0,0x30,0x81,0xbe,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x20,0x42, +0x68,0x69,0xe9,0xea,0x61,0x83,0x11,0xdf,0xc0,0x24,0x2f,0x3b,0xad,0x40,0x30, +0x09,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1d,0x05,0x00,0x30,0x0c,0x31,0x0a,0x30, +0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x4e,0x30,0x20,0x17,0x0d,0x31,0x30, +0x30,0x39,0x31,0x34,0x31,0x33,0x31,0x39,0x30,0x39,0x5a,0x18,0x0f,0x33,0x30, +0x31,0x30,0x30,0x39,0x31,0x34,0x31,0x33,0x31,0x39,0x30,0x39,0x5a,0x30,0x0c, +0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x4e,0x30,0x5c,0x30, +0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03, +0x4b,0x00,0x30,0x48,0x02,0x41,0x00,0xe8,0xa9,0xc0,0x99,0x82,0x64,0x87,0x1b, +0xf3,0x39,0xf0,0x8d,0xa3,0xdd,0x92,0x87,0xca,0x95,0x4f,0xe6,0xfc,0xe0,0x2d, +0x29,0x28,0x98,0x95,0x4c,0x3c,0x78,0xcd,0x3e,0x8a,0xaa,0x4a,0xd7,0x7b,0x07, +0xc1,0xf7,0x9c,0x71,0x0c,0xb9,0xe3,0x17,0x96,0xc5,0x39,0xdd,0x1d,0x06,0x6a, +0x1e,0x94,0x09,0x9e,0x50,0x09,0x5b,0xd9,0x60,0xd9,0x9b,0x02,0x03,0x01,0x00, +0x01,0x30,0x09,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1d,0x05,0x00,0x03,0x02,0x00, +0xc1 }; +static const BYTE cert2[] = { +0x30,0x82,0x01,0x15,0x30,0x82,0x01,0x02,0xa0,0x03,0x02,0x01,0x02,0x02,0x10, +0x1c,0xf2,0x1f,0xec,0x6b,0xdc,0x36,0xbf,0x4a,0xd7,0xe1,0x6c,0x84,0x85,0xcd, +0x2e,0x30,0x09,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1d,0x05,0x00,0x30,0x0c,0x31, +0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x58,0x30,0x20,0x17,0x0d, +0x31,0x30,0x30,0x37,0x31,0x32,0x31,0x31,0x33,0x37,0x35,0x36,0x5a,0x18,0x0f, +0x33,0x30,0x31,0x30,0x30,0x37,0x31,0x32,0x31,0x31,0x33,0x37,0x35,0x36,0x5a, +0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x58,0x30, +0x81,0x9f,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01, +0x05,0x00,0x03,0x81,0x8d,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xab,0xed, +0x6e,0xe0,0x00,0x3c,0xcf,0x2d,0x2b,0xda,0x05,0x88,0x6a,0x7e,0xed,0x60,0x30, +0x24,0xef,0x6c,0x6b,0xad,0x28,0x9b,0x14,0x90,0xf6,0xd0,0x96,0x79,0x6d,0xad, +0xac,0x46,0x14,0x7b,0x0e,0xfe,0xa9,0x8a,0x05,0x5a,0xc8,0x84,0x38,0x44,0xf9, +0xce,0xb2,0xe6,0xde,0x5b,0x80,0x0b,0x15,0xff,0x1b,0x60,0x3f,0xba,0xb2,0xfe, +0x6e,0xf5,0xdc,0x54,0x33,0xfc,0xfc,0x79,0x0a,0x10,0xa4,0x23,0x6d,0x67,0xeb, +0x16,0xb2,0x92,0xbf,0x63,0x42,0x17,0x0a,0xde,0xe6,0xab,0x8e,0xf7,0x8e,0x41, +0x8c,0x04,0xe8,0xe2,0x38,0x73,0xd3,0x82,0xd7,0xd1,0xee,0xd3,0xa6,0x54,0x8c, +0xcd,0x0b,0x93,0xda,0x63,0x55,0x0d,0x1f,0x68,0x5c,0x30,0xee,0xad,0x2d,0xd5, +0x40,0x56,0xe0,0xd8,0xc7,0xef,0x02,0x03,0x01,0x00,0x01,0x30,0x09,0x06,0x05, +0x2b,0x0e,0x03,0x02,0x1d,0x05,0x00,0x03,0x02,0x00,0x06 }; +static const BYTE crl[] = { +0x30,0x81,0xc2,0x30,0x7e,0x02,0x01,0x01,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48, +0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x3c,0x31,0x0b,0x30,0x09,0x06, +0x03,0x55,0x04,0x06,0x13,0x02,0x52,0x55,0x31,0x0c,0x30,0x0a,0x06,0x03,0x55, +0x04,0x08,0x13,0x03,0x53,0x50,0x62,0x31,0x0c,0x30,0x0a,0x06,0x03,0x55,0x04, +0x07,0x13,0x03,0x53,0x50,0x62,0x31,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x0a, +0x13,0x08,0x45,0x74,0x65,0x72,0x73,0x6f,0x66,0x74,0x17,0x0d,0x31,0x30,0x30, +0x36,0x32,0x38,0x31,0x32,0x35,0x31,0x32,0x37,0x5a,0x17,0x0d,0x31,0x30,0x30, +0x37,0x32,0x38,0x31,0x32,0x35,0x31,0x32,0x37,0x5a,0xa0,0x0e,0x30,0x0c,0x30, +0x0a,0x06,0x03,0x55,0x1d,0x14,0x04,0x03,0x02,0x01,0x00,0x30,0x0d,0x06,0x09, +0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x31,0x00,0x83, +0x35,0x9c,0xf5,0x35,0x5c,0xc1,0x20,0x81,0x80,0x5c,0x35,0x56,0xaf,0xb3,0x27, +0x15,0xc6,0xdd,0x24,0xe1,0xff,0xb9,0xf9,0x19,0x21,0xed,0x5e,0x1b,0xff,0x72, +0xc3,0x33,0xf6,0x9f,0xcb,0xde,0x84,0x0b,0x12,0x84,0xad,0x48,0x90,0x9d,0xdd, +0x89,0xbb }; +static const BYTE signedHashForEmptyMessage[] = { +0x30,0x81,0xbb,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0, +0x81,0xad,0x30,0x81,0xaa,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06,0x08,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x0b,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0x31,0x81,0x87,0x30,0x81,0x84,0x02,0x01, +0x01,0x30,0x20,0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13, +0x01,0x4e,0x02,0x10,0x20,0x42,0x68,0x69,0xe9,0xea,0x61,0x83,0x11,0xdf,0xc0, +0x24,0x2f,0x3b,0xad,0x40,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x02,0x05,0x05,0x00,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01, +0x01,0x01,0x05,0x00,0x04,0x40,0xe1,0xee,0xca,0x98,0x16,0x23,0x5a,0x34,0xfd, +0x91,0x69,0x97,0x1e,0x16,0xe4,0x57,0x45,0xad,0xc9,0x5d,0x2e,0xda,0x92,0xbf, +0xee,0x2f,0xb1,0xaa,0x32,0xfa,0x07,0x4e,0x63,0xfd,0xe1,0x52,0x17,0xd0,0xa4, +0x49,0x30,0x54,0x4d,0x12,0xa0,0x6a,0x1c,0x64,0xea,0xc7,0x50,0x49,0xa5,0xca, +0xc3,0x71,0xa4,0xf7,0x8c,0x25,0xe4,0x1a,0xca,0x89 }; +static const BYTE signedEmptyMessage[] = { +0x30,0x81,0xbb,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0, +0x81,0xad,0x30,0x81,0xaa,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06,0x08,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x0b,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0x31,0x81,0x87,0x30,0x81,0x84,0x02,0x01, +0x01,0x30,0x20,0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13, +0x01,0x4e,0x02,0x10,0x20,0x42,0x68,0x69,0xe9,0xea,0x61,0x83,0x11,0xdf,0xc0, +0x24,0x2f,0x3b,0xad,0x40,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x02,0x05,0x05,0x00,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01, +0x01,0x01,0x05,0x00,0x04,0x40,0xe1,0xee,0xca,0x98,0x16,0x23,0x5a,0x34,0xfd, +0x91,0x69,0x97,0x1e,0x16,0xe4,0x57,0x45,0xad,0xc9,0x5d,0x2e,0xda,0x92,0xbf, +0xee,0x2f,0xb1,0xaa,0x32,0xfa,0x07,0x4e,0x63,0xfd,0xe1,0x52,0x17,0xd0,0xa4, +0x49,0x30,0x54,0x4d,0x12,0xa0,0x6a,0x1c,0x64,0xea,0xc7,0x50,0x49,0xa5,0xca, +0xc3,0x71,0xa4,0xf7,0x8c,0x25,0xe4,0x1a,0xca,0x89 }; +static const BYTE signedHash[] = { +0x30,0x81,0xbb,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0, +0x81,0xad,0x30,0x81,0xaa,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06,0x08,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x0b,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0x31,0x81,0x87,0x30,0x81,0x84,0x02,0x01, +0x01,0x30,0x20,0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13, +0x01,0x4e,0x02,0x10,0x20,0x42,0x68,0x69,0xe9,0xea,0x61,0x83,0x11,0xdf,0xc0, +0x24,0x2f,0x3b,0xad,0x40,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x02,0x05,0x05,0x00,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01, +0x01,0x01,0x05,0x00,0x04,0x40,0x1e,0x04,0xa4,0xe3,0x90,0x54,0xed,0xcb,0x94, +0xa2,0xbe,0x81,0x73,0x7e,0x05,0xf2,0x82,0xd3,0x3a,0x26,0x96,0x7a,0x53,0xcd, +0x05,0xc3,0x09,0x69,0x3d,0x12,0x6c,0xb1,0xb0,0xab,0x0e,0xa1,0xec,0x1b,0xa1, +0xff,0x01,0x9c,0x49,0x9f,0x4b,0x69,0x59,0x74,0x20,0x9f,0xb0,0x19,0x95,0xe7, +0xed,0x1e,0x84,0xeb,0xe2,0x53,0x2c,0xa6,0x43,0xdf }; +static const BYTE signedHashWithCert[] = { +0x30,0x82,0x01,0x93,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02, +0xa0,0x82,0x01,0x84,0x30,0x82,0x01,0x80,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c, +0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x0b,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x81,0xd3,0x30,0x81, +0xd0,0x30,0x81,0xbe,0xa0,0x03,0x02,0x01,0x02,0x02,0x10,0x20,0x42,0x68,0x69, +0xe9,0xea,0x61,0x83,0x11,0xdf,0xc0,0x24,0x2f,0x3b,0xad,0x40,0x30,0x09,0x06, +0x05,0x2b,0x0e,0x03,0x02,0x1d,0x05,0x00,0x30,0x0c,0x31,0x0a,0x30,0x08,0x06, +0x03,0x55,0x04,0x03,0x13,0x01,0x4e,0x30,0x20,0x17,0x0d,0x31,0x30,0x30,0x39, +0x31,0x34,0x31,0x33,0x31,0x39,0x30,0x39,0x5a,0x18,0x0f,0x33,0x30,0x31,0x30, +0x30,0x39,0x31,0x34,0x31,0x33,0x31,0x39,0x30,0x39,0x5a,0x30,0x0c,0x31,0x0a, +0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x4e,0x30,0x5c,0x30,0x0d,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x4b,0x00, +0x30,0x48,0x02,0x41,0x00,0xe8,0xa9,0xc0,0x99,0x82,0x64,0x87,0x1b,0xf3,0x39, +0xf0,0x8d,0xa3,0xdd,0x92,0x87,0xca,0x95,0x4f,0xe6,0xfc,0xe0,0x2d,0x29,0x28, +0x98,0x95,0x4c,0x3c,0x78,0xcd,0x3e,0x8a,0xaa,0x4a,0xd7,0x7b,0x07,0xc1,0xf7, +0x9c,0x71,0x0c,0xb9,0xe3,0x17,0x96,0xc5,0x39,0xdd,0x1d,0x06,0x6a,0x1e,0x94, +0x09,0x9e,0x50,0x09,0x5b,0xd9,0x60,0xd9,0x9b,0x02,0x03,0x01,0x00,0x01,0x30, +0x09,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1d,0x05,0x00,0x03,0x02,0x00,0xc1,0x31, +0x81,0x87,0x30,0x81,0x84,0x02,0x01,0x01,0x30,0x20,0x30,0x0c,0x31,0x0a,0x30, +0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x4e,0x02,0x10,0x20,0x42,0x68,0x69, +0xe9,0xea,0x61,0x83,0x11,0xdf,0xc0,0x24,0x2f,0x3b,0xad,0x40,0x30,0x0c,0x06, +0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x0d,0x06,0x09, +0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x40,0x1e,0x04, +0xa4,0xe3,0x90,0x54,0xed,0xcb,0x94,0xa2,0xbe,0x81,0x73,0x7e,0x05,0xf2,0x82, +0xd3,0x3a,0x26,0x96,0x7a,0x53,0xcd,0x05,0xc3,0x09,0x69,0x3d,0x12,0x6c,0xb1, +0xb0,0xab,0x0e,0xa1,0xec,0x1b,0xa1,0xff,0x01,0x9c,0x49,0x9f,0x4b,0x69,0x59, +0x74,0x20,0x9f,0xb0,0x19,0x95,0xe7,0xed,0x1e,0x84,0xeb,0xe2,0x53,0x2c,0xa6, +0x43,0xdf }; +static const BYTE signedHashWithCRL[] = { +0x30,0x82,0x01,0x85,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02, +0xa0,0x82,0x01,0x76,0x30,0x82,0x01,0x72,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c, +0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x0b,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa1,0x81,0xc5,0x30,0x81, +0xc2,0x30,0x7e,0x02,0x01,0x01,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7, +0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x3c,0x31,0x0b,0x30,0x09,0x06,0x03,0x55, +0x04,0x06,0x13,0x02,0x52,0x55,0x31,0x0c,0x30,0x0a,0x06,0x03,0x55,0x04,0x08, +0x13,0x03,0x53,0x50,0x62,0x31,0x0c,0x30,0x0a,0x06,0x03,0x55,0x04,0x07,0x13, +0x03,0x53,0x50,0x62,0x31,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x0a,0x13,0x08, +0x45,0x74,0x65,0x72,0x73,0x6f,0x66,0x74,0x17,0x0d,0x31,0x30,0x30,0x36,0x32, +0x38,0x31,0x32,0x35,0x31,0x32,0x37,0x5a,0x17,0x0d,0x31,0x30,0x30,0x37,0x32, +0x38,0x31,0x32,0x35,0x31,0x32,0x37,0x5a,0xa0,0x0e,0x30,0x0c,0x30,0x0a,0x06, +0x03,0x55,0x1d,0x14,0x04,0x03,0x02,0x01,0x00,0x30,0x0d,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x31,0x00,0x83,0x35,0x9c, +0xf5,0x35,0x5c,0xc1,0x20,0x81,0x80,0x5c,0x35,0x56,0xaf,0xb3,0x27,0x15,0xc6, +0xdd,0x24,0xe1,0xff,0xb9,0xf9,0x19,0x21,0xed,0x5e,0x1b,0xff,0x72,0xc3,0x33, +0xf6,0x9f,0xcb,0xde,0x84,0x0b,0x12,0x84,0xad,0x48,0x90,0x9d,0xdd,0x89,0xbb, +0x31,0x81,0x87,0x30,0x81,0x84,0x02,0x01,0x01,0x30,0x20,0x30,0x0c,0x31,0x0a, +0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x4e,0x02,0x10,0x20,0x42,0x68, +0x69,0xe9,0xea,0x61,0x83,0x11,0xdf,0xc0,0x24,0x2f,0x3b,0xad,0x40,0x30,0x0c, +0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x0d,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x40,0x1e, +0x04,0xa4,0xe3,0x90,0x54,0xed,0xcb,0x94,0xa2,0xbe,0x81,0x73,0x7e,0x05,0xf2, +0x82,0xd3,0x3a,0x26,0x96,0x7a,0x53,0xcd,0x05,0xc3,0x09,0x69,0x3d,0x12,0x6c, +0xb1,0xb0,0xab,0x0e,0xa1,0xec,0x1b,0xa1,0xff,0x01,0x9c,0x49,0x9f,0x4b,0x69, +0x59,0x74,0x20,0x9f,0xb0,0x19,0x95,0xe7,0xed,0x1e,0x84,0xeb,0xe2,0x53,0x2c, +0xa6,0x43,0xdf }; +static const BYTE signedData[] = { +0x30,0x81,0xc3,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0, +0x81,0xb5,0x30,0x81,0xb2,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06,0x08,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x13,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x06,0x04,0x04,0x01,0x02,0x03,0x04, +0x31,0x81,0x87,0x30,0x81,0x84,0x02,0x01,0x01,0x30,0x20,0x30,0x0c,0x31,0x0a, +0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x4e,0x02,0x10,0x20,0x42,0x68, +0x69,0xe9,0xea,0x61,0x83,0x11,0xdf,0xc0,0x24,0x2f,0x3b,0xad,0x40,0x30,0x0c, +0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x0d,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x40,0xe4, +0x69,0xf5,0x62,0xfb,0x3a,0x7d,0x1c,0x7b,0x8b,0xcc,0xfc,0x6e,0x8e,0x91,0x85, +0xcf,0x3c,0xb8,0xfd,0x8a,0xac,0x81,0x96,0xa0,0x42,0xac,0x88,0xc4,0x48,0xe8, +0x43,0x64,0xd1,0x38,0xd2,0x6c,0xc4,0xd4,0x9b,0x9a,0xd4,0x33,0x02,0xef,0x88, +0xef,0x98,0x2d,0xac,0xad,0xc1,0x93,0x60,0xc4,0x3a,0xdc,0xa7,0xd6,0x97,0x70, +0x01,0xc1,0x84 }; + +static void test_sign_message(void) +{ + BOOL ret; + CRYPT_SIGN_MESSAGE_PARA para; + static char oid_rsa_md5[] = szOID_RSA_MD5; + static const BYTE blob1[] = { 0x01, 0x02, 0x03, 0x04 }; + static const BYTE blob2[] = { 0x11, 0x12, 0x13, 0x14 }; + const BYTE *toSign[] = { blob1, blob2 }; + DWORD signSize[] = { sizeof(blob1), sizeof(blob2) }; + LPBYTE signedBlob; + DWORD signedBlobSize; + PCCRL_CONTEXT crlContext; + CERT_KEY_CONTEXT keyContext; + HCRYPTPROV hCryptProv = 0; + HCRYPTKEY hKey = 0; + + memset(¶, 0, sizeof(para)); + SetLastError(0xdeadbeef); + ret = CryptSignMessage(¶, FALSE, 0, NULL, NULL, NULL, &signedBlobSize); + ok(!ret && + (GetLastError() == E_INVALIDARG || + GetLastError() == ERROR_ARITHMETIC_OVERFLOW), /* Win7 */ + "expected E_INVALIDARG or ERROR_ARITHMETIC_OVERFLOW, got %08x\n", + GetLastError()); + para.cbSize = sizeof(para); + para.dwMsgEncodingType = X509_ASN_ENCODING; + SetLastError(0xdeadbeef); + signedBlobSize = 255; + ret = CryptSignMessage(¶, FALSE, 0, NULL, NULL, NULL, &signedBlobSize); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + ok(!signedBlobSize, "unexpected size %d\n", signedBlobSize); + para.dwMsgEncodingType = PKCS_7_ASN_ENCODING; + SetLastError(0xdeadbeef); + signedBlobSize = 0; + ret = CryptSignMessage(¶, FALSE, 0, NULL, NULL, NULL, &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + todo_wine + ok(signedBlobSize, "bad size\n"); + + SetLastError(0xdeadbeef); + ret = pCryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT); + ok(ret, "CryptAcquireContextA failed: %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptImportKey(hCryptProv, publicPrivateKeyPair, + sizeof(publicPrivateKeyPair), 0, 0, &hKey); + if (!ret && GetLastError() == NTE_PERM) /* Win9x */ + { + skip("Failed to import a key\n"); + if (hCryptProv) + CryptReleaseContext(hCryptProv, 0); + return; + } + ok(ret, "CryptImportKey failed: %08x\n", GetLastError()); + + para.dwMsgEncodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING; + SetLastError(0xdeadbeef); + para.pSigningCert = CertCreateCertificateContext(X509_ASN_ENCODING | + PKCS_7_ASN_ENCODING, cert1, sizeof(cert1)); + ok(para.pSigningCert != NULL, "CertCreateCertificateContext failed: %08x\n", + GetLastError()); + para.HashAlgorithm.pszObjId = oid_rsa_md5; + + memset(&keyContext, 0, sizeof(keyContext)); + keyContext.cbSize = sizeof(keyContext); + keyContext.hCryptProv = hCryptProv; + keyContext.dwKeySpec = AT_SIGNATURE; + SetLastError(0xdeadbeef); + ret = CertSetCertificateContextProperty(para.pSigningCert, + CERT_KEY_CONTEXT_PROP_ID, 0, &keyContext); + ok(ret, "CertSetCertificateContextProperty failed: %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + signedBlobSize = 0; + ret = CryptSignMessage(¶, TRUE, 0, NULL, NULL, NULL, &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + signedBlob = CryptMemAlloc(signedBlobSize); + if (signedBlob) + { + SetLastError(0xdeadbeef); + ret = CryptSignMessage(¶, TRUE, 0, NULL, NULL, signedBlob, + &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + ok(signedBlobSize == sizeof(signedHashForEmptyMessage), + "unexpected size %d\n", signedBlobSize); + ok(!memcmp(signedBlob, signedHashForEmptyMessage, signedBlobSize), + "unexpected value\n"); + CryptMemFree(signedBlob); + } + + SetLastError(0xdeadbeef); + signedBlobSize = 0; + ret = CryptSignMessage(¶, FALSE, 0, NULL, NULL, NULL, &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + signedBlob = CryptMemAlloc(signedBlobSize); + if (signedBlob) + { + SetLastError(0xdeadbeef); + ret = CryptSignMessage(¶, FALSE, 0, NULL, NULL, signedBlob, + &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + ok(signedBlobSize == sizeof(signedEmptyMessage), "unexpected size %d\n", + signedBlobSize); + ok(!memcmp(signedBlob, signedEmptyMessage, signedBlobSize), + "unexpected value\n"); + CryptMemFree(signedBlob); + } + + SetLastError(0xdeadbeef); + signedBlobSize = 0; + ret = CryptSignMessage(¶, TRUE, 2, toSign, signSize, NULL, + &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + signedBlob = CryptMemAlloc(signedBlobSize); + if (signedBlob) + { + SetLastError(0xdeadbeef); + ret = CryptSignMessage(¶, TRUE, 2, toSign, signSize, signedBlob, + &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + ok(signedBlobSize == sizeof(signedHash), + "unexpected size of signed blob %d\n", signedBlobSize); + ok(!memcmp(signedBlob, signedHash, signedBlobSize), + "unexpected value\n"); + CryptMemFree(signedBlob); + } + + para.cMsgCert = 1; + para.rgpMsgCert = ¶.pSigningCert; + + SetLastError(0xdeadbeef); + signedBlobSize = 0; + ret = CryptSignMessage(¶, TRUE, 2, toSign, signSize, NULL, + &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + signedBlob = CryptMemAlloc(signedBlobSize); + if (signedBlob) + { + SetLastError(0xdeadbeef); + ret = CryptSignMessage(¶, TRUE, 2, toSign, signSize, signedBlob, + &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + ok(signedBlobSize == sizeof(signedHashWithCert), + "unexpected size of signed blob %d\n", signedBlobSize); + ok(!memcmp(signedBlob, signedHashWithCert, signedBlobSize), + "unexpected value\n"); + CryptMemFree(signedBlob); + } + + para.cMsgCert = 0; + para.rgpMsgCert = NULL; + para.cMsgCrl = 1; + SetLastError(0xdeadbeef); + crlContext = CertCreateCRLContext(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, + crl, sizeof(crl)); + ok(crlContext != NULL, "CertCreateCRLContext failed: %08x\n", + GetLastError()); + para.rgpMsgCrl = &crlContext; + + SetLastError(0xdeadbeef); + signedBlobSize = 0; + ret = CryptSignMessage(¶, TRUE, 2, toSign, signSize, NULL, + &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + signedBlob = CryptMemAlloc(signedBlobSize); + if (signedBlob) + { + SetLastError(0xdeadbeef); + ret = CryptSignMessage(¶, TRUE, 2, toSign, signSize, signedBlob, + &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + ok(signedBlobSize == sizeof(signedHashWithCRL), + "unexpected size of signed blob %d\n", signedBlobSize); + ok(!memcmp(signedBlob, signedHashWithCRL, signedBlobSize), + "unexpected value\n"); + CryptMemFree(signedBlob); + } + + CertFreeCRLContext(crlContext); + para.cMsgCrl = 0; + para.rgpMsgCrl = NULL; + + SetLastError(0xdeadbeef); + signedBlobSize = 0; + ret = CryptSignMessage(¶, FALSE, 1, toSign, signSize, NULL, + &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + signedBlob = CryptMemAlloc(signedBlobSize); + if (signedBlob) + { + SetLastError(0xdeadbeef); + ret = CryptSignMessage(¶, FALSE, 1, toSign, signSize, signedBlob, + &signedBlobSize); + ok(ret, "CryptSignMessage failed: %08x\n", GetLastError()); + ok(signedBlobSize == sizeof(signedData), + "unexpected size of signed blob %d\n", signedBlobSize); + ok(!memcmp(signedBlob, signedData, signedBlobSize), + "unexpected value\n"); + CryptMemFree(signedBlob); + } + + if (para.pSigningCert) + CertFreeCertificateContext(para.pSigningCert); + if (hKey) + CryptDestroyKey(hKey); + if (hCryptProv) + CryptReleaseContext(hCryptProv, 0); +} + +static const BYTE encryptedMessage[] = { +0x30,0x31,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x03,0xa0,0x24, +0x30,0x22,0x02,0x01,0x00,0x31,0x00,0x30,0x1b,0x06,0x09,0x2a,0x86,0x48,0x86, +0xf7,0x0d,0x01,0x07,0x01,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x03,0x04,0x05,0x00,0x80,0x00 }; + +static void test_encrypt_message(void) +{ + BOOL ret; + CRYPT_ENCRYPT_MESSAGE_PARA para; + static char oid_rsa_rc4[] = szOID_RSA_RC4; + static const BYTE blob[] = { 0x01, 0x02, 0x03, 0x04 }; + PCCERT_CONTEXT certs[2]; + HCRYPTPROV hCryptProv = 0; + LPBYTE encryptedBlob; + DWORD encryptedBlobSize; + + SetLastError(0xdeadbeef); + ret = pCryptAcquireContextA(&hCryptProv, NULL, NULL, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT); + ok(ret, "CryptAcquireContextA failed: %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + certs[0] = CertCreateCertificateContext(X509_ASN_ENCODING | + PKCS_7_ASN_ENCODING, cert1, sizeof(cert1)); + ok(certs[0] != NULL, "CertCreateCertificateContext failed: %08x\n", + GetLastError()); + SetLastError(0xdeadbeef); + certs[1] = CertCreateCertificateContext(X509_ASN_ENCODING | + PKCS_7_ASN_ENCODING, cert2, sizeof(cert2)); + ok(certs[1] != NULL, "CertCreateCertificateContext failed: %08x\n", + GetLastError()); + + memset(¶, 0, sizeof(para)); + SetLastError(0xdeadbeef); + encryptedBlobSize = 255; + ret = CryptEncryptMessage(¶, 0, NULL, NULL, 0, NULL, + &encryptedBlobSize); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + ok(!encryptedBlobSize, "unexpected size %d\n", encryptedBlobSize); + para.cbSize = sizeof(para); + para.dwMsgEncodingType = X509_ASN_ENCODING; + SetLastError(0xdeadbeef); + encryptedBlobSize = 255; + ret = CryptEncryptMessage(¶, 0, NULL, NULL, 0, NULL, + &encryptedBlobSize); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + ok(!encryptedBlobSize, "unexpected size %d\n", encryptedBlobSize); + para.dwMsgEncodingType = PKCS_7_ASN_ENCODING; + SetLastError(0xdeadbeef); + encryptedBlobSize = 255; + ret = CryptEncryptMessage(¶, 0, NULL, NULL, 0, NULL, + &encryptedBlobSize); + ok(!ret && + (GetLastError() == CRYPT_E_UNKNOWN_ALGO || + GetLastError() == E_INVALIDARG), /* Win9x */ + "expected CRYPT_E_UNKNOWN_ALGO or E_INVALIDARG, got %08x\n", + GetLastError()); + ok(!encryptedBlobSize, "unexpected size %d\n", encryptedBlobSize); + + para.hCryptProv = hCryptProv; + para.ContentEncryptionAlgorithm.pszObjId = oid_rsa_rc4; + + SetLastError(0xdeadbeef); + encryptedBlobSize = 0; + ret = CryptEncryptMessage(¶, 0, NULL, NULL, 0, NULL, + &encryptedBlobSize); + ok(ret || + broken(!ret) /* Win9x */, + "CryptEncryptMessage failed: %08x\n", GetLastError()); + if (ret) + { + encryptedBlob = CryptMemAlloc(encryptedBlobSize); + if (encryptedBlob) + { + SetLastError(0xdeadbeef); + ret = CryptEncryptMessage(¶, 0, NULL, NULL, 0, encryptedBlob, + &encryptedBlobSize); + ok(ret, "CryptEncryptMessage failed: %08x\n", GetLastError()); + ok(encryptedBlobSize == sizeof(encryptedMessage), + "unexpected size of encrypted blob %d\n", encryptedBlobSize); + ok(!memcmp(encryptedBlob, encryptedMessage, encryptedBlobSize), + "unexpected value\n"); + CryptMemFree(encryptedBlob); + } + } + + SetLastError(0xdeadbeef); + encryptedBlobSize = 0; + ret = CryptEncryptMessage(¶, 2, certs, NULL, 0, NULL, + &encryptedBlobSize); + ok(ret, "CryptEncryptMessage failed: %08x\n", GetLastError()); + if (ret) + { + encryptedBlob = CryptMemAlloc(encryptedBlobSize); + if (encryptedBlob) + { + SetLastError(0xdeadbeef); + ret = CryptEncryptMessage(¶, 2, certs, NULL, 0, encryptedBlob, + &encryptedBlobSize); + ok(ret, "CryptEncryptMessage failed: %08x\n", GetLastError()); + CryptMemFree(encryptedBlob); + } + } + + SetLastError(0xdeadbeef); + encryptedBlobSize = 0; + ret = CryptEncryptMessage(¶, 0, NULL, blob, sizeof(blob), NULL, + &encryptedBlobSize); + ok(ret || + broken(!ret) /* Win9x */, + "CryptEncryptMessage failed: %08x\n", GetLastError()); + if (ret) + { + encryptedBlob = CryptMemAlloc(encryptedBlobSize); + if (encryptedBlob) + { + SetLastError(0xdeadbeef); + ret = CryptEncryptMessage(¶, 0, NULL, blob, sizeof(blob), + encryptedBlob, &encryptedBlobSize); + ok(ret || + broken(!ret && GetLastError() == NTE_PERM), /* some NT4 */ + "CryptEncryptMessage failed: %08x\n", GetLastError()); + if (ret) + { + ok(encryptedBlobSize == 55, + "unexpected size of encrypted blob %d\n", encryptedBlobSize); + } + CryptMemFree(encryptedBlob); + } + } + + SetLastError(0xdeadbeef); + encryptedBlobSize = 0; + ret = CryptEncryptMessage(¶, 2, certs, blob, sizeof(blob), NULL, + &encryptedBlobSize); + ok(ret, "CryptEncryptMessage failed: %08x\n", GetLastError()); + if (ret) + { + encryptedBlob = CryptMemAlloc(encryptedBlobSize); + if (encryptedBlob) + { + SetLastError(0xdeadbeef); + ret = CryptEncryptMessage(¶, 2, certs, blob, sizeof(blob), + encryptedBlob, &encryptedBlobSize); + ok(ret || + broken(!ret), /* some Win95 and some NT4 */ + "CryptEncryptMessage failed: %08x\n", GetLastError()); + CryptMemFree(encryptedBlob); + } + } + + if (certs[0]) + CertFreeCertificateContext(certs[0]); + if (certs[1]) + CertFreeCertificateContext(certs[1]); + if (hCryptProv) + CryptReleaseContext(hCryptProv, 0); +} + START_TEST(message) { + init_function_pointers(); + test_msg_get_signer_count(); test_verify_detached_message_hash(); test_verify_message_hash(); test_verify_detached_message_signature(); test_verify_message_signature(); test_hash_message(); + test_sign_message(); + test_encrypt_message(); } diff --git a/rostests/winetests/crypt32/msg.c b/rostests/winetests/crypt32/msg.c index 39662ebe8f2..d5d5309c828 100644 --- a/rostests/winetests/crypt32/msg.c +++ b/rostests/winetests/crypt32/msg.c @@ -365,6 +365,8 @@ static BOOL WINAPI nop_stream_output(const void *pvArg, BYTE *pb, DWORD cb, return TRUE; } +static const BYTE dataEmptyBareContent[] = { 0x04,0x00 }; + static void test_data_msg_update(void) { HCRYPTMSG msg; @@ -390,20 +392,35 @@ static void test_data_msg_update(void) msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_DATA, NULL, NULL, NULL); - /* Can't update a message with no data */ - SetLastError(0xdeadbeef); + /* Starting with Vista, can update a message with no data. */ ret = CryptMsgUpdate(msg, NULL, 0, TRUE); - /* This test returns FALSE on XP and earlier but TRUE on Vista, so can't be tested. - * GetLastError is either E_INVALIDARG (NT) or unset (9x/Vista), so it doesn't - * make sense to test this. - */ + ok(ret || broken(!ret), "CryptMsgUpdate failed: %08x\n", GetLastError()); + if (ret) + { + DWORD size; - /* Curiously, a valid update will now fail as well, presumably because of - * the last (invalid, but final) update. - */ - ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); - ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, - "Expected CRYPT_E_MSG_ERROR, got %x\n", GetLastError()); + ret = CryptMsgGetParam(msg, CMSG_BARE_CONTENT_PARAM, 0, NULL, &size); + ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + if (ret) + { + LPBYTE buf = CryptMemAlloc(size); + + if (buf) + { + ret = CryptMsgGetParam(msg, CMSG_BARE_CONTENT_PARAM, 0, buf, + &size); + ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + if (ret) + { + ok(size == sizeof(dataEmptyBareContent), + "unexpected size %d\n", size); + ok(!memcmp(buf, dataEmptyBareContent, size), + "unexpected value\n"); + } + CryptMemFree(buf); + } + } + } CryptMsgClose(msg); msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, @@ -510,7 +527,6 @@ static void test_data_msg_get_param(void) CryptMsgClose(msg); } -static const BYTE dataEmptyBareContent[] = { 0x04,0x00 }; static const BYTE dataEmptyContent[] = { 0x30,0x0f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x02, 0x04,0x00 }; @@ -837,6 +853,8 @@ static void test_hash_msg_get_param(void) ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); ok(size == sizeof(buf), "Unexpected size %d\n", size); ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 0, buf, &size); + ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + ok(size == sizeof(buf), "Unexpected size %d\n", size); if (size == sizeof(buf)) ok(!memcmp(buf, emptyHashParam, size), "Unexpected value\n"); /* By getting the hash, further updates are not allowed */ @@ -1820,6 +1838,7 @@ static void test_signed_msg_encoding(void) CMSG_CONTENT_PARAM, signedWithCertWithValidPubKeyEmptyContent, sizeof(signedWithCertWithValidPubKeyEmptyContent)); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); check_param("signedWithCertWithValidPubKeyContent", msg, CMSG_CONTENT_PARAM, signedWithCertWithValidPubKeyContent, sizeof(signedWithCertWithValidPubKeyContent)); @@ -2031,6 +2050,239 @@ static void test_signed_msg(void) test_signed_msg_get_param(); } +static char oid_rsa_rc4[] = szOID_RSA_RC4; + +static void test_enveloped_msg_open(void) +{ + HCRYPTMSG msg; + BOOL ret; + CMSG_ENVELOPED_ENCODE_INFO envelopedInfo = { 0 }; + PCCERT_CONTEXT context; + + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, NULL); + ok(!msg && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + + envelopedInfo.cbSize = sizeof(envelopedInfo); + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, NULL); + ok(!msg && + (GetLastError() == CRYPT_E_UNKNOWN_ALGO || + GetLastError() == E_INVALIDARG), /* Win9x */ + "expected CRYPT_E_UNKNOWN_ALGO or E_INVALIDARG, got %08x\n", GetLastError()); + + envelopedInfo.ContentEncryptionAlgorithm.pszObjId = oid_rsa_rc4; + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, NULL); + ok(msg != NULL || + broken(!msg), /* Win9x */ + "CryptMsgOpenToEncode failed: %08x\n", GetLastError()); + CryptMsgClose(msg); + + envelopedInfo.cRecipients = 1; + if (!old_crypt32) + { + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, NULL); + ok(!msg && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + } + + context = CertCreateCertificateContext(X509_ASN_ENCODING, + v1CertWithValidPubKey, sizeof(v1CertWithValidPubKey)); + if (context) + { + envelopedInfo.rgpRecipientCert = (PCERT_INFO *)&context->pCertInfo; + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, NULL); + ok(msg != NULL, "CryptMsgOpenToEncode failed: %08x\n", GetLastError()); + CryptMsgClose(msg); + SetLastError(0xdeadbeef); + ret = pCryptAcquireContextA(&envelopedInfo.hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); + ok(ret, "CryptAcquireContextA failed: %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, NULL); + ok(msg != NULL, "CryptMsgOpenToEncode failed: %08x\n", GetLastError()); + CryptMsgClose(msg); + CryptReleaseContext(envelopedInfo.hCryptProv, 0); + CertFreeCertificateContext(context); + } + else + win_skip("failed to create certificate context, skipping tests\n"); +} + +static void test_enveloped_msg_update(void) +{ + HCRYPTMSG msg; + BOOL ret; + CMSG_ENVELOPED_ENCODE_INFO envelopedInfo = { sizeof(envelopedInfo), 0, + { oid_rsa_rc4, { 0, NULL } }, NULL }; + CMSG_STREAM_INFO streamInfo = { 0, nop_stream_output, NULL }; + + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, NULL); + ok(msg != NULL || + broken(!msg), /* Win9x */ + "CryptMsgOpenToEncode failed: %08x\n", GetLastError()); + if (msg) + { + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, NULL, 0, FALSE); + ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, + "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, + "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); + CryptMsgClose(msg); + } + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, NULL); + ok(msg != NULL || + broken(!msg), /* Win9x */ + "CryptMsgOpenToEncode failed: %08x\n", GetLastError()); + if (msg) + { + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); + ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, + "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); + ok(ret || + broken(!ret && GetLastError() == NTE_PERM), /* some NT4 */ + "CryptMsgUpdate failed: %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, + "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); + CryptMsgClose(msg); + } + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, + CMSG_ENVELOPED, &envelopedInfo, NULL, NULL); + ok(msg != NULL || + broken(!msg), /* Win9x */ + "CryptMsgOpenToEncode failed: %08x\n", GetLastError()); + if (msg) + { + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, NULL, 0, FALSE); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + CryptMsgClose(msg); + } + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, + CMSG_ENVELOPED, &envelopedInfo, NULL, NULL); + ok(msg != NULL || + broken(!msg), /* Win9x */ + "CryptMsgOpenToEncode failed: %08x\n", GetLastError()); + if (msg) + { + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); + ok(ret || + broken(!ret && GetLastError() == NTE_PERM), /* some NT4 */ + "CryptMsgUpdate failed: %08x\n", GetLastError()); + CryptMsgClose(msg); + } + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, &streamInfo); + ok(msg != NULL || + broken(!msg), /* Win9x */ + "CryptMsgOpenToEncode failed: %08x\n", GetLastError()); + if (msg) + { + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, NULL, 0, FALSE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + CryptMsgClose(msg); + } + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, &streamInfo); + ok(msg != NULL || + broken(!msg), /* Win9x */ + "CryptMsgOpenToEncode failed: %08x\n", GetLastError()); + if (msg) + { + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), FALSE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); + ok(ret || + broken(!ret && GetLastError() == NTE_PERM), /* some NT4 */ + "CryptMsgUpdate failed: %08x\n", GetLastError()); + CryptMsgClose(msg); + } +} + +static const BYTE envelopedEmptyBareContent[] = { +0x30,0x22,0x02,0x01,0x00,0x31,0x00,0x30,0x1b,0x06,0x09,0x2a,0x86,0x48,0x86, +0xf7,0x0d,0x01,0x07,0x01,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x03,0x04,0x05,0x00,0x80,0x00 }; +static const BYTE envelopedEmptyContent[] = { +0x30,0x31,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x03,0xa0,0x24, +0x30,0x22,0x02,0x01,0x00,0x31,0x00,0x30,0x1b,0x06,0x09,0x2a,0x86,0x48,0x86, +0xf7,0x0d,0x01,0x07,0x01,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x03,0x04,0x05,0x00,0x80,0x00 }; + +static void test_enveloped_msg_encoding(void) +{ + HCRYPTMSG msg; + CMSG_ENVELOPED_ENCODE_INFO envelopedInfo = { sizeof(envelopedInfo), 0, + { oid_rsa_rc4, { 0, NULL } }, NULL }; + + SetLastError(0xdeadbeef); + msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, + &envelopedInfo, NULL, NULL); + ok(msg != NULL || + broken(!msg), /* Win9x */ + "CryptMsgOpenToEncode failed: %08x\n", GetLastError()); + if (msg) + { + check_param("enveloped empty bare content", msg, + CMSG_BARE_CONTENT_PARAM, envelopedEmptyBareContent, + sizeof(envelopedEmptyBareContent)); + check_param("enveloped empty content", msg, CMSG_CONTENT_PARAM, + envelopedEmptyContent, sizeof(envelopedEmptyContent)); + CryptMsgClose(msg); + } +} + +static void test_enveloped_msg(void) +{ + test_enveloped_msg_open(); + test_enveloped_msg_update(); + test_enveloped_msg_encoding(); +} + static CRYPT_DATA_BLOB b4 = { 0, NULL }; static const struct update_accum a4 = { 1, &b4 }; @@ -2043,6 +2295,22 @@ static const BYTE bogusHashContent[] = { 0x02,0x05,0x05,0x00,0x30,0x13,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01, 0x07,0x01,0xa0,0x06,0x04,0x04,0x01,0x02,0x03,0x04,0x04,0x10,0x00,0xd6,0xc0, 0x5a,0x21,0x51,0x2a,0x79,0xa1,0xdf,0xeb,0x9d,0x2a,0x8f,0x26,0x2f }; +static const BYTE envelopedBareContentWithoutData[] = { +0x30,0x81,0xdb,0x02,0x01,0x00,0x31,0x81,0xba,0x30,0x81,0xb7,0x02,0x01,0x00, +0x30,0x20,0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01, +0x4e,0x02,0x10,0x63,0x75,0x75,0x7a,0x53,0x36,0xa9,0xba,0x41,0xa5,0xcc,0x01, +0x7f,0x76,0x4c,0xd9,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01, +0x01,0x01,0x05,0x00,0x04,0x81,0x80,0x87,0x46,0x26,0x56,0xe3,0xf3,0xa5,0x5b, +0xd4,0x2c,0x03,0xcc,0x52,0x7e,0xf7,0x55,0xf1,0x34,0x9f,0x63,0xf6,0x04,0x9f, +0xc5,0x13,0xf1,0xc9,0x57,0x0a,0xbc,0xa9,0x33,0xd2,0xf2,0x93,0xb6,0x5c,0x94, +0xc3,0x49,0xd6,0xd6,0x6d,0xc4,0x91,0x38,0x80,0xdd,0x0d,0x82,0xef,0xe5,0x72, +0x55,0x40,0x0a,0xdd,0x35,0xfe,0xdc,0x87,0x47,0x92,0xb1,0xbd,0x05,0xc9,0x18, +0x0e,0xde,0x4b,0x00,0x70,0x40,0x31,0x1f,0x5d,0x6c,0x8f,0x3a,0xfb,0x9a,0xc3, +0xb3,0x06,0xe7,0x68,0x3f,0x20,0x14,0x1c,0xf9,0x28,0x4b,0x0f,0x01,0x01,0xb6, +0xfe,0x07,0xe5,0xd8,0xf0,0x7c,0x17,0xbc,0xec,0xfb,0xd7,0x73,0x8a,0x71,0x49, +0x79,0x62,0xe4,0xbf,0xb5,0xe3,0x56,0xa6,0xb4,0x49,0x1e,0xdc,0xaf,0xd7,0x0e, +0x30,0x19,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0x30,0x0c, +0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x03,0x04,0x05,0x00 }; static void test_decode_msg_update(void) { @@ -2343,6 +2611,50 @@ static void test_decode_msg_update(void) ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, 0, NULL, + NULL); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, envelopedEmptyBareContent, + sizeof(envelopedEmptyBareContent), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, 0, NULL, + NULL); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, envelopedEmptyContent, + sizeof(envelopedEmptyContent), TRUE); + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_DATA_ERROR), /* Win9x */ + "expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); + CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, envelopedEmptyBareContent, + sizeof(envelopedEmptyBareContent), TRUE); + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_DATA_ERROR), /* Win9x */ + "expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); + CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, envelopedEmptyContent, + sizeof(envelopedEmptyContent), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, 0, NULL, + NULL); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, envelopedBareContentWithoutData, + sizeof(envelopedBareContentWithoutData), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + CryptMsgClose(msg); } static const BYTE hashParam[] = { 0x08,0xd6,0xc0,0x5a,0x21,0x51,0x2a,0x79,0xa1, @@ -2416,13 +2728,140 @@ static const BYTE signedWithCertAndCrlComputedHash[] = { static BYTE keyIdIssuer[] = { 0x30,0x13,0x31,0x11,0x30,0x0f,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37, 0x0a,0x07,0x01,0x04,0x01,0x01 }; +static const BYTE publicPrivateKeyPair[] = { +0x07,0x02,0x00,0x00,0x00,0xa4,0x00,0x00,0x52,0x53,0x41,0x32,0x00,0x04,0x00, +0x00,0x01,0x00,0x01,0x00,0x21,0x65,0x5d,0x97,0x19,0x3f,0xd0,0xd0,0x76,0x5b, +0xb1,0x10,0x4e,0xcc,0x14,0xb5,0x92,0x0f,0x60,0xad,0xb6,0x74,0x8d,0x94,0x50, +0xfd,0x14,0x5e,0xbc,0xf1,0x93,0xbf,0x24,0x21,0x64,0x9d,0xc7,0x77,0x04,0x54, +0xd1,0xbd,0x3e,0xd8,0x3b,0x2a,0x8b,0x95,0x70,0xdf,0x19,0x20,0xed,0x76,0x39, +0xfa,0x64,0x04,0xc6,0xf7,0x33,0x7b,0xaa,0x94,0x67,0x74,0xbc,0x6b,0xd5,0xa7, +0x69,0x99,0x99,0x47,0x88,0xc0,0x7e,0x36,0xf1,0xc5,0x7d,0xa8,0xd8,0x07,0x48, +0xe6,0x05,0x4f,0xf4,0x1f,0x37,0xd7,0xc7,0xa7,0x00,0x20,0xb3,0xe5,0x40,0x17, +0x86,0x43,0x77,0xe0,0x32,0x39,0x11,0x9c,0xd9,0xd8,0x53,0x9b,0x45,0x42,0x54, +0x65,0xca,0x15,0xbe,0xb2,0x44,0xf1,0xd0,0xf3,0xb6,0x4a,0x19,0xc8,0x3d,0x33, +0x63,0x93,0x4f,0x7c,0x67,0xc6,0x58,0x6d,0xf6,0xb7,0x20,0xd8,0x30,0xcc,0x52, +0xaa,0x68,0x66,0xf6,0x86,0xf8,0xe0,0x3a,0x73,0x0e,0x9d,0xc5,0x03,0x60,0x9e, +0x08,0xe9,0x5e,0xd4,0x5e,0xcc,0xbb,0xc1,0x48,0xad,0x9d,0xbb,0xfb,0x26,0x61, +0xa8,0x0e,0x9c,0xba,0xf1,0xd0,0x0b,0x5f,0x87,0xd4,0xb5,0xd2,0xdf,0x41,0xcb, +0x7a,0xec,0xb5,0x87,0x59,0x6a,0x9d,0xb3,0x6c,0x06,0xee,0x1f,0xc5,0xae,0x02, +0xa8,0x7f,0x33,0x6e,0x30,0x50,0x6d,0x65,0xd0,0x1f,0x00,0x47,0x43,0x25,0x90, +0x4a,0xa8,0x74,0x8c,0x23,0x8b,0x15,0x8a,0x74,0xd2,0x03,0xa6,0x1c,0xc1,0x7e, +0xbb,0xb1,0xa6,0x80,0x05,0x2b,0x62,0xfb,0x89,0xe5,0xba,0xc6,0xcc,0x12,0xce, +0xa8,0xe9,0xc4,0xb5,0x9d,0xd8,0x11,0xdd,0x95,0x90,0x71,0xb0,0xfe,0xaa,0x14, +0xce,0xd5,0xd0,0x5a,0x88,0x47,0xda,0x31,0xda,0x26,0x11,0x66,0xd1,0xd5,0xc5, +0x1b,0x08,0xbe,0xc6,0xf3,0x15,0xbf,0x80,0x78,0xcf,0x55,0xe0,0x61,0xee,0xf5, +0x71,0x1e,0x2f,0x0e,0xb3,0x67,0xf7,0xa1,0x86,0x04,0xcf,0x4b,0xc1,0x2f,0x94, +0x73,0xd1,0x5d,0x0c,0xee,0x10,0x58,0xbb,0x74,0x0c,0x61,0x02,0x15,0x69,0x68, +0xe0,0x21,0x3e,0xa6,0x27,0x22,0x8c,0xc8,0x61,0xbc,0xba,0xa9,0x4b,0x2e,0x71, +0x77,0x74,0xdc,0x63,0x05,0x32,0x7a,0x93,0x4f,0xbf,0xc7,0xa5,0x3a,0xe3,0x25, +0x4d,0x67,0xcf,0x78,0x1b,0x85,0x22,0x6c,0xfe,0x5c,0x34,0x0e,0x27,0x12,0xbc, +0xd5,0x33,0x1a,0x75,0x8a,0x9c,0x40,0x39,0xe8,0xa0,0xc9,0xae,0xf8,0xaf,0x9a, +0xc6,0x62,0x47,0xf3,0x5b,0xdf,0x5e,0xcd,0xc6,0xc0,0x5c,0xd7,0x0e,0x04,0x64, +0x3d,0xdd,0x57,0xef,0xf6,0xcd,0xdf,0xd2,0x7e,0x17,0x6c,0x0a,0x47,0x5e,0x77, +0x4b,0x02,0x49,0x78,0xc0,0xf7,0x09,0x6e,0xdf,0x96,0x04,0x51,0x74,0x3d,0x68, +0x99,0x43,0x8e,0x03,0x16,0x46,0xa4,0x04,0x84,0x01,0x6e,0xd4,0xca,0x5c,0xab, +0xb0,0xd3,0x82,0xf1,0xb9,0xba,0x51,0x99,0x03,0xe9,0x7f,0xdf,0x30,0x3b,0xf9, +0x18,0xbb,0x80,0x7f,0xf0,0x89,0xbb,0x6d,0x98,0x95,0xb7,0xfd,0xd8,0xdf,0xed, +0xf3,0x16,0x6f,0x96,0x4f,0xfd,0x54,0x66,0x6d,0x90,0xba,0xf5,0xcc,0xce,0x01, +0x34,0x34,0x51,0x07,0x66,0x20,0xfb,0x4a,0x3c,0x7e,0x19,0xf8,0x8e,0x35,0x0e, +0x07,0x48,0x74,0x38,0xd2,0x18,0xaa,0x2e,0x90,0x5e,0x0e,0xcc,0x50,0x6e,0x71, +0x6f,0x54,0xdb,0xbf,0x7b,0xb4,0xf4,0x79,0x6a,0x21,0xa3,0x6d,0xdf,0x61,0xc0, +0x8f,0xb3,0xb6,0xe1,0x8a,0x65,0x21,0x6e,0xf6,0x5b,0x80,0xf0,0xfb,0x28,0x87, +0x13,0x06,0xd6,0xbc,0x28,0x5c,0xda,0xc5,0x13,0x13,0x44,0x8d,0xf4,0xa8,0x7b, +0x5c,0x2a,0x7f,0x11,0x16,0x4e,0x52,0x41,0xe9,0xe7,0x8e }; +static const BYTE envelopedMessage[] = { +0x30,0x81,0xf2,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x03,0xa0, +0x81,0xe4,0x30,0x81,0xe1,0x02,0x01,0x00,0x31,0x81,0xba,0x30,0x81,0xb7,0x02, +0x01,0x00,0x30,0x20,0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03, +0x13,0x01,0x4e,0x02,0x10,0x63,0x75,0x75,0x7a,0x53,0x36,0xa9,0xba,0x41,0xa5, +0xcc,0x01,0x7f,0x76,0x4c,0xd9,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7, +0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x81,0x80,0xc2,0x0d,0x59,0x87,0xb3,0x65, +0xd2,0x64,0xcd,0xba,0xe3,0xaf,0x1e,0xa1,0xd3,0xdd,0xb3,0x53,0xfc,0x2f,0xae, +0xdc,0x6d,0x2a,0x81,0x84,0x38,0x6f,0xdf,0x81,0xb1,0x65,0xba,0xac,0x59,0xb1, +0x19,0x12,0x3f,0xde,0x12,0xce,0x77,0x42,0x71,0x67,0xa9,0x78,0x38,0x95,0x51, +0xbb,0x66,0x78,0xbf,0xaf,0x0a,0x98,0x4b,0xba,0xa5,0xf0,0x8b,0x9f,0xef,0xcf, +0x40,0x05,0xa1,0xd6,0x10,0xae,0xbf,0xb9,0xbd,0x4d,0x22,0x39,0x33,0x63,0x2b, +0x0b,0xd3,0x0c,0xb5,0x4b,0xe8,0xfe,0x15,0xa8,0xa5,0x2c,0x86,0x33,0x80,0x6e, +0x4c,0x7a,0x99,0x3c,0x6b,0x4b,0x60,0xfd,0x8e,0xb2,0xf3,0x82,0x2f,0x3e,0x1e, +0xba,0xb9,0x78,0x24,0x32,0xab,0xa4,0x10,0x1a,0x38,0x94,0x10,0x8d,0xf8,0x70, +0x3e,0x4e,0x30,0x1f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01, +0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x03,0x04,0x05,0x00,0x80, +0x04,0x5f,0x80,0xf2,0x17 }; +static const BYTE envelopedBareMessage[] = { +0x30,0x81,0xe1,0x02,0x01,0x00,0x31,0x81,0xba,0x30,0x81,0xb7,0x02,0x01,0x00, +0x30,0x20,0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01, +0x4e,0x02,0x10,0x63,0x75,0x75,0x7a,0x53,0x36,0xa9,0xba,0x41,0xa5,0xcc,0x01, +0x7f,0x76,0x4c,0xd9,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01, +0x01,0x01,0x05,0x00,0x04,0x81,0x80,0x69,0x79,0x12,0x6b,0xa1,0x2f,0xe9,0x0d, +0x34,0x79,0x77,0xe9,0x15,0xf2,0xff,0x0c,0x9a,0xf2,0x87,0xbd,0x12,0xc4,0x2d, +0x9e,0x81,0xc7,0x3c,0x74,0x05,0xdc,0x13,0xaf,0xe9,0xa2,0xba,0x72,0xe9,0xa5, +0x2b,0x81,0x39,0xd3,0x62,0xaa,0x78,0xc3,0x90,0x4f,0x06,0xf0,0xdb,0x18,0x5e, +0xe1,0x2e,0x19,0xa3,0xc2,0xac,0x1e,0xf1,0xbf,0xe6,0x03,0x00,0x96,0xfa,0xd2, +0x66,0x73,0xd0,0x45,0x55,0x57,0x71,0xff,0x3a,0x0c,0xad,0xce,0xde,0x68,0xd4, +0x45,0x20,0xc8,0x44,0x4d,0x5d,0xa2,0x98,0x79,0xb1,0x81,0x0f,0x8a,0xfc,0x70, +0xa5,0x18,0xd2,0x30,0x65,0x22,0x84,0x02,0x24,0x48,0xf7,0xa4,0xe0,0xa5,0x6c, +0xa8,0xa4,0xd0,0x86,0x4b,0x6e,0x9b,0x18,0xab,0x78,0xfa,0x76,0x12,0xce,0x55, +0x30,0x1f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0x30,0x0c, +0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x03,0x04,0x05,0x00,0x80,0x04,0x2c, +0x2d,0xa3,0x6e }; +static const BYTE envelopedMessageWith3Recps[] = { +0x30,0x82,0x02,0x69,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x03, +0xa0,0x82,0x02,0x5a,0x30,0x82,0x02,0x56,0x02,0x01,0x00,0x31,0x82,0x02,0x2e, +0x30,0x81,0xb7,0x02,0x01,0x00,0x30,0x20,0x30,0x0c,0x31,0x0a,0x30,0x08,0x06, +0x03,0x55,0x04,0x03,0x13,0x01,0x4e,0x02,0x10,0x63,0x75,0x75,0x7a,0x53,0x36, +0xa9,0xba,0x41,0xa5,0xcc,0x01,0x7f,0x76,0x4c,0xd9,0x30,0x0d,0x06,0x09,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x81,0x80,0xa4,0x2e, +0xe5,0x56,0x60,0xc5,0x64,0x07,0x29,0xaf,0x5c,0x38,0x3d,0x4b,0xec,0xbd,0xba, +0x97,0x60,0x17,0xed,0xd7,0x21,0x7b,0x19,0x94,0x95,0xf1,0xb2,0x84,0x06,0x1f, +0xc5,0x83,0xb3,0x5d,0xc8,0x2c,0x1c,0x0f,0xf7,0xfd,0x58,0x8b,0x0f,0x25,0xb5, +0x9f,0x7f,0x43,0x8f,0x5f,0x81,0x16,0x4a,0x62,0xfb,0x47,0xb5,0x36,0x72,0x21, +0x29,0xd4,0x9e,0x27,0x35,0xf4,0xd0,0xd4,0xc0,0xa3,0x7a,0x47,0xbe,0xc9,0xae, +0x08,0x17,0x6a,0xb5,0x63,0x38,0xa1,0xdc,0xf5,0xc1,0x8d,0x97,0x56,0xb4,0xc0, +0x2d,0x2b,0xec,0x3d,0xbd,0xce,0xd1,0x52,0x3e,0x29,0x34,0xe2,0x9a,0x00,0x96, +0x4c,0x85,0xaf,0x0f,0xfb,0x10,0x1d,0xf8,0x08,0x27,0x10,0x04,0x04,0xbf,0xae, +0x36,0xd0,0x6a,0x49,0xe7,0x43,0x30,0x81,0xb7,0x02,0x01,0x00,0x30,0x20,0x30, +0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x4e,0x02,0x10, +0xc2,0x8f,0xc4,0x5e,0x8d,0x3b,0x01,0x8c,0x4b,0x23,0xcb,0x93,0x77,0xab,0xb6, +0xe1,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05, +0x00,0x04,0x81,0x80,0x4b,0x22,0x8a,0xfa,0xa6,0xb6,0x01,0xe9,0xb5,0x54,0xcf, +0xa7,0x81,0x54,0xf9,0x08,0x42,0x8a,0x75,0x19,0x9c,0xc9,0x27,0x68,0x08,0xf9, +0x53,0xa7,0x60,0xf8,0xdd,0xba,0xfb,0x4f,0x63,0x8a,0x15,0x6a,0x5b,0xf6,0xe3, +0x4e,0x29,0xa9,0xc8,0x1d,0x63,0x92,0x8f,0x95,0x91,0x95,0x71,0xb5,0x5d,0x02, +0xe5,0xa0,0x07,0x67,0x36,0xe5,0x2d,0x7b,0xcd,0xe1,0xf2,0xa4,0xc6,0x24,0x70, +0xac,0xd7,0xaf,0x63,0xb2,0x04,0x02,0x8d,0xae,0x2f,0xdc,0x7e,0x6c,0x84,0xd3, +0xe3,0x66,0x54,0x3b,0x05,0xd8,0x77,0x40,0xe4,0x6b,0xbd,0xa9,0x8d,0x4d,0x74, +0x15,0xfd,0x74,0xf7,0xd3,0xc0,0xc9,0xf1,0x20,0x0e,0x08,0x13,0xcc,0xb0,0x94, +0x53,0x01,0xd4,0x5f,0x95,0x32,0xeb,0xe8,0x73,0x9f,0x6a,0xd1,0x30,0x81,0xb7, +0x02,0x01,0x00,0x30,0x20,0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04, +0x03,0x13,0x01,0x58,0x02,0x10,0x1c,0xf2,0x1f,0xec,0x6b,0xdc,0x36,0xbf,0x4a, +0xd7,0xe1,0x6c,0x84,0x85,0xcd,0x2e,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86, +0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x81,0x80,0x47,0x21,0xf9,0xe7,0x98, +0x7f,0xe7,0x49,0x3f,0x16,0xb8,0x4c,0x8b,0x7d,0x5d,0x56,0xa7,0x31,0xfd,0xa5, +0xcd,0x43,0x70,0x58,0xf1,0x33,0xfb,0xe6,0xc8,0xbb,0x6f,0x0a,0x89,0xa4,0xb9, +0x3e,0x3a,0xc5,0x85,0x46,0x54,0x73,0x37,0xa3,0xbd,0x36,0xc3,0xce,0x40,0xf3, +0xd7,0x92,0x54,0x8e,0x60,0x1f,0xa2,0xa7,0x03,0xc2,0x49,0xa9,0x02,0x28,0xc8, +0xa5,0xa7,0x42,0xcd,0x29,0x85,0x34,0xa7,0xa9,0xe8,0x8c,0x3d,0xb3,0xd0,0xac, +0x7d,0x31,0x5d,0xb4,0xcb,0x7e,0xad,0x62,0xfd,0x04,0x7b,0xa1,0x93,0xb5,0xbc, +0x08,0x4f,0x36,0xd7,0x5a,0x95,0xbc,0xff,0x47,0x0f,0x84,0x21,0x24,0xdf,0xc5, +0xfe,0xc8,0xe5,0x0b,0xc4,0xc4,0x5c,0x1a,0x50,0x31,0x91,0xce,0xf6,0x11,0xf1, +0x0e,0x28,0xce,0x30,0x1f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07, +0x01,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x03,0x04,0x05,0x00, +0x80,0x04,0x4e,0x99,0x9d,0x4c }; +static const BYTE serialNumber[] = { +0x2e,0xcd,0x85,0x84,0x6c,0xe1,0xd7,0x4a,0xbf,0x36,0xdc,0x6b,0xec,0x1f,0xf2, +0x1c }; +static const BYTE issuer[] = { +0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x58 }; static void test_decode_msg_get_param(void) { HCRYPTMSG msg; + HCRYPTPROV hCryptProv; + HCRYPTKEY key = 0; BOOL ret; DWORD size = 0, value; LPBYTE buf; + CMSG_CTRL_DECRYPT_PARA decryptPara = { sizeof(decryptPara), 0 }; msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); SetLastError(0xdeadbeef); @@ -2430,6 +2869,7 @@ static void test_decode_msg_get_param(void) ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE, "Expected CRYPT_E_INVALID_MSG_TYPE, got %x\n", GetLastError()); ret = CryptMsgUpdate(msg, dataContent, sizeof(dataContent), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); check_param("data content", msg, CMSG_CONTENT_PARAM, msgData, sizeof(msgData)); CryptMsgClose(msg); @@ -2447,6 +2887,7 @@ static void test_decode_msg_get_param(void) CryptMsgClose(msg); msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); ret = CryptMsgUpdate(msg, hashContent, sizeof(hashContent), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); check_param("hash content", msg, CMSG_CONTENT_PARAM, msgData, sizeof(msgData)); check_param("hash hash data", msg, CMSG_HASH_DATA_PARAM, hashParam, @@ -2466,6 +2907,7 @@ static void test_decode_msg_get_param(void) if (buf) { ret = CryptMsgGetParam(msg, CMSG_COMPUTED_HASH_PARAM, 1, buf, &size); + ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); ok(size == sizeof(hashParam), "Unexpected size %d\n", size); ok(!memcmp(buf, hashParam, size), "Unexpected value\n"); CryptMemFree(buf); @@ -2632,6 +3074,114 @@ static void test_decode_msg_get_param(void) CryptMemFree(buf); } CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, 0, NULL, + NULL); + CryptMsgUpdate(msg, envelopedEmptyBareContent, + sizeof(envelopedEmptyBareContent), TRUE); + check_param("enveloped empty bare content", msg, CMSG_CONTENT_PARAM, NULL, + 0); + CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); + CryptMsgUpdate(msg, envelopedEmptyContent, sizeof(envelopedEmptyContent), + TRUE); + check_param("enveloped empty content", msg, CMSG_CONTENT_PARAM, NULL, 0); + CryptMsgClose(msg); + + pCryptAcquireContextA(&hCryptProv, NULL, MS_ENHANCED_PROV_A, PROV_RSA_FULL, + CRYPT_VERIFYCONTEXT); + SetLastError(0xdeadbeef); + ret = CryptImportKey(hCryptProv, publicPrivateKeyPair, + sizeof(publicPrivateKeyPair), 0, 0, &key); + ok(ret || + broken(!ret && GetLastError() == NTE_PERM), /* WinME and some NT4 */ + "CryptImportKey failed: %08x\n", GetLastError()); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); + CryptMsgUpdate(msg, envelopedMessage, sizeof(envelopedMessage), TRUE); + check_param("enveloped message before decrypting", msg, CMSG_CONTENT_PARAM, + envelopedMessage + sizeof(envelopedMessage) - 4, 4); + if (key) + { + decryptPara.hCryptProv = hCryptProv; + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara); + ok(ret, "CryptMsgControl failed: %08x\n", GetLastError()); + decryptPara.hCryptProv = 0; + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara); + ok(!ret && GetLastError() == CRYPT_E_ALREADY_DECRYPTED, + "expected CRYPT_E_ALREADY_DECRYPTED, got %08x\n", GetLastError()); + check_param("enveloped message", msg, CMSG_CONTENT_PARAM, msgData, + sizeof(msgData)); + } + else + win_skip("failed to import a key, skipping tests\n"); + CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, 0, NULL, + NULL); + CryptMsgUpdate(msg, envelopedBareMessage, sizeof(envelopedBareMessage), + TRUE); + check_param("enveloped bare message before decrypting", msg, + CMSG_CONTENT_PARAM, envelopedBareMessage + + sizeof(envelopedBareMessage) - 4, 4); + if (key) + { + decryptPara.hCryptProv = hCryptProv; + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara); + ok(ret, "CryptMsgControl failed: %08x\n", GetLastError()); + check_param("enveloped bare message", msg, CMSG_CONTENT_PARAM, msgData, + sizeof(msgData)); + } + else + win_skip("failed to import a key, skipping tests\n"); + CryptMsgClose(msg); + + if (key) + CryptDestroyKey(key); + CryptReleaseContext(hCryptProv, 0); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); + CryptMsgUpdate(msg, envelopedMessageWith3Recps, + sizeof(envelopedMessageWith3Recps), TRUE); + value = 3; + check_param("recipient count", msg, CMSG_RECIPIENT_COUNT_PARAM, + (const BYTE *)&value, sizeof(value)); + size = 0; + SetLastError(0xdeadbeef); + ret = CryptMsgGetParam(msg, CMSG_RECIPIENT_INFO_PARAM, 3, NULL, &size); + ok(!ret && GetLastError() == CRYPT_E_INVALID_INDEX, + "expected CRYPT_E_INVALID_INDEX, got %08x\n", GetLastError()); + size = 0; + SetLastError(0xdeadbeef); + ret = CryptMsgGetParam(msg, CMSG_RECIPIENT_INFO_PARAM, 2, NULL, &size); + ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + ok(size >= 142, "unexpected size: %u\n", size); + if (ret) + buf = CryptMemAlloc(size); + else + buf = NULL; + if (buf) + { + CERT_INFO *certInfo = (CERT_INFO *)buf; + + SetLastError(0xdeadbeef); + ret = CryptMsgGetParam(msg, CMSG_RECIPIENT_INFO_PARAM, 2, buf, &size); + ok(ret, "CryptMsgGetParam failed: %08x\n", GetLastError()); + ok(certInfo->SerialNumber.cbData == sizeof(serialNumber), + "unexpected serial number size: %u\n", certInfo->SerialNumber.cbData); + ok(!memcmp(certInfo->SerialNumber.pbData, serialNumber, + sizeof(serialNumber)), "unexpected serial number\n"); + ok(certInfo->Issuer.cbData == sizeof(issuer), + "unexpected issuer size: %u\n", certInfo->Issuer.cbData); + ok(!memcmp(certInfo->Issuer.pbData, issuer, sizeof(issuer)), + "unexpected issuer\n"); + CryptMemFree(buf); + } + CryptMsgClose(msg); } static void test_decode_msg(void) @@ -2677,7 +3227,8 @@ static void test_msg_control(void) ok(!ret && GetLastError() == E_INVALIDARG, "Expected E_INVALIDARG, got %08x\n", GetLastError()); } - ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); /* or after an update. */ for (i = 1; !old_crypt32 && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) { @@ -2702,6 +3253,7 @@ static void test_msg_control(void) "Expected E_INVALIDARG, got %08x\n", GetLastError()); } ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); /* or after an update. */ for (i = 1; !old_crypt32 && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) { @@ -2725,6 +3277,7 @@ static void test_msg_control(void) "Expected E_INVALIDARG, got %08x\n", GetLastError()); } ret = CryptMsgUpdate(msg, NULL, 0, TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); /* or after an update. */ for (i = 1; !old_crypt32 && (i <= CMSG_CTRL_ADD_CMS_SIGNER_INFO); i++) { @@ -3003,6 +3556,43 @@ static void test_msg_control(void) ok(ret || broken(GetLastError() == OSS_DATA_ERROR /* Win9x */), "CryptMsgControl failed: %08x\n", GetLastError()); CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, 0, NULL, + NULL); + decryptPara.cbSize = 0; + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara); + ok(!ret && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + decryptPara.cbSize = sizeof(decryptPara); + if (!old_crypt32) + { + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara); + ok(!ret && GetLastError() == CRYPT_E_INVALID_MSG_TYPE, + "expected CRYPT_E_INVALID_MSG_TYPE, got %08x\n", GetLastError()); + } + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, envelopedEmptyBareContent, + sizeof(envelopedEmptyBareContent), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara); + ok(!ret && GetLastError() == CRYPT_E_INVALID_INDEX, + "expected CRYPT_E_INVALID_INDEX, got %08x\n", GetLastError()); + CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, CMSG_ENVELOPED, 0, NULL, + NULL); + SetLastError(0xdeadbeef); + ret = CryptMsgUpdate(msg, envelopedBareMessage, + sizeof(envelopedBareMessage), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ret = CryptMsgControl(msg, 0, CMSG_CTRL_DECRYPT, &decryptPara); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, + "expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError()); + CryptMsgClose(msg); } /* win9x has much less parameter checks and will crash on many tests @@ -3052,8 +3642,8 @@ static void test_msg_get_and_verify_signer(void) /* Crash */ if (0) { - ret = CryptMsgGetAndVerifySigner(NULL, 0, NULL, 0, NULL, NULL); - ret = CryptMsgGetAndVerifySigner(NULL, 0, NULL, 0, NULL, &signerIndex); + CryptMsgGetAndVerifySigner(NULL, 0, NULL, 0, NULL, NULL); + CryptMsgGetAndVerifySigner(NULL, 0, NULL, 0, NULL, &signerIndex); } msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, 0, 0, 0, NULL, NULL); @@ -3192,6 +3782,7 @@ START_TEST(msg) test_data_msg(); test_hash_msg(); test_signed_msg(); + test_enveloped_msg(); test_decode_msg(); test_msg_get_and_verify_signer(); diff --git a/rostests/winetests/crypt32/oid.c b/rostests/winetests/crypt32/oid.c index 030a548ac1a..b6614071aba 100644 --- a/rostests/winetests/crypt32/oid.c +++ b/rostests/winetests/crypt32/oid.c @@ -451,6 +451,7 @@ static void test_registerDefaultOIDFunction(void) /* Repeat a few tests on the normal encoding type */ ret = CryptRegisterDefaultOIDFunction(X509_ASN_ENCODING, "CertDllOpenStoreProv", 0, bogusDll); + ok(ret, "CryptRegisterDefaultOIDFunction failed\n"); ret = CryptUnregisterDefaultOIDFunction(X509_ASN_ENCODING, "CertDllOpenStoreProv", bogusDll); ok(ret, "CryptUnregisterDefaultOIDFunction failed\n"); diff --git a/rostests/winetests/crypt32/protectdata.c b/rostests/winetests/crypt32/protectdata.c index 29d04e81aa6..70a8ba86b05 100644 --- a/rostests/winetests/crypt32/protectdata.c +++ b/rostests/winetests/crypt32/protectdata.c @@ -244,7 +244,6 @@ static void test_simpleroundtrip(const char *plaintext) START_TEST(protectdata) { HMODULE hCrypt32 = GetModuleHandleA("crypt32.dll"); - hCrypt32 = GetModuleHandleA("crypt32.dll"); pCryptProtectData = (void*)GetProcAddress(hCrypt32, "CryptProtectData"); pCryptUnprotectData = (void*)GetProcAddress(hCrypt32, "CryptUnprotectData"); if (!pCryptProtectData || !pCryptUnprotectData) diff --git a/rostests/winetests/crypt32/store.c b/rostests/winetests/crypt32/store.c index 10a85a346fe..40d407a41a0 100644 --- a/rostests/winetests/crypt32/store.c +++ b/rostests/winetests/crypt32/store.c @@ -18,9 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include #include #include + #include #include #include @@ -102,6 +102,7 @@ static BOOL (WINAPI *pCertEnumSystemStore)(DWORD,void*,void*,PFN_CERT_ENUM_SYSTE static BOOL (WINAPI *pCertGetStoreProperty)(HCERTSTORE,DWORD,void*,DWORD*); static void (WINAPI *pCertRemoveStoreFromCollection)(HCERTSTORE,HCERTSTORE); static BOOL (WINAPI *pCertSetStoreProperty)(HCERTSTORE,DWORD,DWORD,const void*); +static BOOL (WINAPI *pCertAddCertificateLinkToStore)(HCERTSTORE,PCCERT_CONTEXT,DWORD,PCCERT_CONTEXT*); static void testMemStore(void) { @@ -199,6 +200,7 @@ static void testMemStore(void) if (buf) { ret = CertSerializeCertificateStoreElement(context, 0, buf, &size); + ok(ret, "CertSerializeCertificateStoreElement failed: %08x\n", GetLastError()); ok(size == sizeof(serializedCert), "Wrong size %d\n", size); ok(!memcmp(serializedCert, buf, size), "Unexpected serialized cert\n"); @@ -633,7 +635,7 @@ static void testCollectionStore(void) ok(ret, "CertAddEncodedCertificateToStore failed: %08x\n", GetLastError()); CertDeleteCertificateFromStore(context); - CertAddStoreToCollection(collection, store1, + pCertAddStoreToCollection(collection, store1, CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG, 0); ret = CertAddEncodedCertificateToStore(collection, X509_ASN_ENCODING, @@ -958,7 +960,7 @@ static void testRegStore(void) certCount++; } while (context != NULL); ok(certCount == 1 || - broken(certCount == 2), /* win9x */ + broken(certCount == 2) /* NT4 */ , "Expected 1 certificates, got %d\n", certCount); /* Try again with the correct hash... */ @@ -1074,6 +1076,7 @@ static void testSystemRegStore(void) /* Now check whether deleting is allowed */ store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_DELETE_FLAG, BogusW); + ok(!store, "CertOpenStore failed: %08x\n", GetLastError()); RegDeleteKeyW(HKEY_CURRENT_USER, BogusPathW); store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY, 0, 0, 0, NULL); @@ -1158,10 +1161,7 @@ static void testSystemStore(void) /* Check opening a bogus store */ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_OPEN_EXISTING_FLAG, BogusW); - ok((!store || - broken(store != 0)) && /* win9x */ - GetLastError() == ERROR_FILE_NOT_FOUND, - "Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError()); + ok(!store, "Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError()); store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, BogusW); ok(store != 0, "CertOpenStore failed: %08x\n", GetLastError()); @@ -1170,6 +1170,7 @@ static void testSystemStore(void) /* Now check whether deleting is allowed */ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_DELETE_FLAG, BogusW); + ok(!store, "Didn't expect a store to be returned when deleting\n"); RegDeleteKeyW(HKEY_CURRENT_USER, BogusPathW); } @@ -1760,7 +1761,7 @@ static void testMessageStore(void) store = CertOpenStore(CERT_STORE_PROV_PKCS7, 0, 0, 0, &blob); ok(!store && (GetLastError() == CRYPT_E_ASN1_BADTAG || - GetLastError() == OSS_DATA_ERROR), /* win9x */ + broken(GetLastError() == OSS_DATA_ERROR)), /* NT4 */ "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); } @@ -1842,7 +1843,7 @@ static void testCertOpenSystemStore(void) if (store) CertCloseStore(store, 0); /* Delete it so other tests succeed next time around */ - store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, + CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_DELETE_FLAG, BogusW); RegDeleteKeyW(HKEY_CURRENT_USER, BogusPathW); } @@ -2189,26 +2190,32 @@ static void testAddCertificateLink(void) WCHAR filename1[MAX_PATH], filename2[MAX_PATH]; HANDLE file; + if (!pCertAddCertificateLinkToStore) + { + win_skip("CertAddCertificateLinkToStore not found\n"); + return; + } + if (0) { /* Crashes, i.e. the store is dereferenced without checking. */ - ret = CertAddCertificateLinkToStore(NULL, NULL, 0, NULL); + ret = pCertAddCertificateLinkToStore(NULL, NULL, 0, NULL); } /* Adding a certificate link to a store requires a valid add disposition */ store1 = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); SetLastError(0xdeadbeef); - ret = CertAddCertificateLinkToStore(store1, NULL, 0, NULL); + ret = pCertAddCertificateLinkToStore(store1, NULL, 0, NULL); ok(!ret && GetLastError() == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", GetLastError()); source = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, sizeof(bigCert)); SetLastError(0xdeadbeef); - ret = CertAddCertificateLinkToStore(store1, source, 0, NULL); + ret = pCertAddCertificateLinkToStore(store1, source, 0, NULL); ok(!ret && GetLastError() == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", GetLastError()); - ret = CertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS, + ret = pCertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS, NULL); ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); if (0) @@ -2216,14 +2223,14 @@ static void testAddCertificateLink(void) /* Crashes, i.e. the source certificate is dereferenced without * checking when a valid add disposition is given. */ - ret = CertAddCertificateLinkToStore(store1, NULL, CERT_STORE_ADD_ALWAYS, + ret = pCertAddCertificateLinkToStore(store1, NULL, CERT_STORE_ADD_ALWAYS, NULL); } CertCloseStore(store1, 0); store1 = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); - ret = CertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS, + ret = pCertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS, &linked); ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); if (ret) @@ -2236,6 +2243,8 @@ static void testAddCertificateLink(void) if (buf) { ret = CertSerializeCertificateStoreElement(linked, 0, buf, &size); + ok(ret, "CertSerializeCertificateStoreElement failed: %08x\n", + GetLastError()); /* The serialized linked certificate is identical to the serialized * original certificate. */ @@ -2261,6 +2270,8 @@ static void testAddCertificateLink(void) { ret = CertGetCertificateContextProperty(linked, CERT_FRIENDLY_NAME_PROP_ID, buf, &size); + ok(ret, "CertGetCertificateContextProperty failed: %08x\n", + GetLastError()); ok(!lstrcmpW((LPCWSTR)buf, WineTestW), "unexpected friendly name\n"); HeapFree(GetProcessHeap(), 0, buf); @@ -2295,7 +2306,7 @@ static void testAddCertificateLink(void) /* Test adding a link to a memory store. */ store2 = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); - ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, + ret = pCertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, &linked); ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); if (ret) @@ -2311,6 +2322,7 @@ static void testAddCertificateLink(void) /* The serialized linked certificate is identical to the serialized * original certificate. */ + ok(ret, "CertSerializeCertificateStoreElement failed: %08x\n", GetLastError()); ok(size == sizeof(serializedCert), "Wrong size %d\n", size); ok(!memcmp(serializedCert, buf, size), "Unexpected serialized cert\n"); @@ -2333,6 +2345,7 @@ static void testAddCertificateLink(void) { ret = CertGetCertificateContextProperty(linked, CERT_FRIENDLY_NAME_PROP_ID, buf, &size); + ok(ret, "CertGetCertificateContextProperty failed: %08x\n", GetLastError()); ok(!lstrcmpW((LPCWSTR)buf, WineTestW), "unexpected friendly name\n"); HeapFree(GetProcessHeap(), 0, buf); @@ -2355,7 +2368,7 @@ static void testAddCertificateLink(void) ok(store2 != NULL, "CertOpenStore failed: %08x\n", GetLastError()); CloseHandle(file); /* Test adding a link to a file store. */ - ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, + ret = pCertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, &linked); ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); if (ret) @@ -2397,7 +2410,7 @@ static void testAddCertificateLink(void) source = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, sizeof(bigCert)); SetLastError(0xdeadbeef); - ret = CertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS, + ret = pCertAddCertificateLinkToStore(store1, source, CERT_STORE_ADD_ALWAYS, &linked); ok(!ret && GetLastError() == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", GetLastError()); @@ -2424,7 +2437,7 @@ static void testAddCertificateLink(void) ok(store2 != NULL, "CertOpenStore failed: %08x\n", GetLastError()); CloseHandle(file); - ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, + ret = pCertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, &linked); ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); if (ret) @@ -2447,7 +2460,7 @@ static void testAddCertificateLink(void) store2 = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, WineTestW); ok(store2 != NULL, "CertOpenStore failed: %08x\n", GetLastError()); - ret = CertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, + ret = pCertAddCertificateLinkToStore(store2, source, CERT_STORE_ADD_ALWAYS, &linked); ok(ret, "CertAddCertificateLinkToStore failed: %08x\n", GetLastError()); if (ret) @@ -2573,6 +2586,7 @@ START_TEST(store) pCertGetStoreProperty = (void*)GetProcAddress(hdll, "CertGetStoreProperty"); pCertRemoveStoreFromCollection = (void*)GetProcAddress(hdll, "CertRemoveStoreFromCollection"); pCertSetStoreProperty = (void*)GetProcAddress(hdll, "CertSetStoreProperty"); + pCertAddCertificateLinkToStore = (void*)GetProcAddress(hdll, "CertAddCertificateLinkToStore"); /* various combinations of CertOpenStore */ testMemStore(); diff --git a/rostests/winetests/crypt32/str.c b/rostests/winetests/crypt32/str.c index ebc334240ae..14435975422 100644 --- a/rostests/winetests/crypt32/str.c +++ b/rostests/winetests/crypt32/str.c @@ -26,16 +26,12 @@ #include "wine/test.h" -/*#define DUMP_STRINGS*/ -#ifdef DUMP_STRINGS -#include "wine/debug.h" -#endif - typedef struct _CertRDNAttrEncoding { LPCSTR pszObjId; DWORD dwValueType; CERT_RDN_VALUE_BLOB Value; LPCSTR str; + BOOL todo; } CertRDNAttrEncoding, *PCertRDNAttrEncoding; typedef struct _CertRDNAttrEncodingW { @@ -43,6 +39,7 @@ typedef struct _CertRDNAttrEncodingW { DWORD dwValueType; CERT_RDN_VALUE_BLOB Value; LPCWSTR str; + BOOL todo; } CertRDNAttrEncodingW, *PCertRDNAttrEncodingW; static BYTE bin1[] = { 0x55, 0x53 }; @@ -58,6 +55,18 @@ static BYTE bin6[] = { 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74 }; static BYTE bin7[] = { 0x61, 0x72, 0x69, 0x63, 0x40, 0x63, 0x6f, 0x64, 0x65, 0x77, 0x65, 0x61, 0x76, 0x65, 0x72, 0x73, 0x2e, 0x63, 0x6f, 0x6d }; +static BYTE bin8[] = { +0x65,0x00,0x50,0x00,0x4b,0x00,0x49,0x00,0x20,0x00,0x52,0x00,0x6f,0x00,0x6f, +0x00,0x74,0x00,0x20,0x00,0x43,0x00,0x65,0x00,0x72,0x00,0x74,0x00,0x69,0x00, +0x66,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e, +0x00,0x20,0x00,0x41,0x00,0x75,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x72,0x00, +0x69,0x00,0x74,0x00,0x79,0x00 }; +static BYTE bin9[] = { 0x61, 0x62, 0x63, 0x22, 0x64, 0x65, 0x66 }; +static BYTE bin10[] = { 0x61, 0x62, 0x63, 0x27, 0x64, 0x65, 0x66 }; +static BYTE bin11[] = { 0x61, 0x62, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x66 }; +static BYTE bin12[] = { 0x20, 0x61, 0x62, 0x63, 0x20 }; +static BYTE bin13[] = { 0x22, 0x64, 0x65, 0x66, 0x22 }; +static BYTE bin14[] = { 0x31, 0x3b, 0x33 }; static const BYTE cert[] = {0x30,0x82,0x2,0xbb,0x30,0x82,0x2,0x24,0x2,0x9,0x0,0xe3,0x5a,0x10,0xf1,0xfc, @@ -190,8 +199,10 @@ typedef BOOL (WINAPI *CertStrToNameAFunc)(DWORD dwCertEncodingType, typedef BOOL (WINAPI *CertStrToNameWFunc)(DWORD dwCertEncodingType, LPCWSTR pszX500, DWORD dwStrType, void *pvReserved, BYTE *pbEncoded, DWORD *pcbEncoded, LPCWSTR *ppszError); +typedef DWORD (WINAPI *CertGetNameStringAFunc)(PCCERT_CONTEXT cert, DWORD type, + DWORD flags, void *typePara, LPSTR str, DWORD cch); -HMODULE dll; +static HMODULE dll; static CertNameToStrAFunc pCertNameToStrA; static CertNameToStrWFunc pCertNameToStrW; static CryptDecodeObjectFunc pCryptDecodeObject; @@ -199,28 +210,42 @@ static CertRDNValueToStrAFunc pCertRDNValueToStrA; static CertRDNValueToStrWFunc pCertRDNValueToStrW; static CertStrToNameAFunc pCertStrToNameA; static CertStrToNameWFunc pCertStrToNameW; +static CertGetNameStringAFunc pCertGetNameStringA; static void test_CertRDNValueToStrA(void) { CertRDNAttrEncoding attrs[] = { { "2.5.4.6", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin1), bin1 }, "US" }, + { sizeof(bin1), bin1 }, "US", FALSE }, { "2.5.4.8", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin2), bin2 }, "Minnesota" }, + { sizeof(bin2), bin2 }, "Minnesota", FALSE }, { "2.5.4.7", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin3), bin3 }, "Minneapolis" }, + { sizeof(bin3), bin3 }, "Minneapolis", FALSE }, { "2.5.4.10", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin4), bin4 }, "CodeWeavers" }, + { sizeof(bin4), bin4 }, "CodeWeavers", FALSE }, { "2.5.4.11", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin5), bin5 }, "Wine Development" }, + { sizeof(bin5), bin5 }, "Wine Development", FALSE }, { "2.5.4.3", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin6), bin6 }, "localhost" }, + { sizeof(bin6), bin6 }, "localhost", FALSE }, { "1.2.840.113549.1.9.1", CERT_RDN_IA5_STRING, - { sizeof(bin7), bin7 }, "aric@codeweavers.com" }, + { sizeof(bin7), bin7 }, "aric@codeweavers.com", FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin9), bin9 }, "abc\"def", FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin10), bin10 }, "abc'def", FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin11), bin11 }, "abc, def", FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin12), bin12 }, " abc ", FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin13), bin13 }, "\"def\"", FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin14), bin14 }, "1;3", FALSE }, }; DWORD i, ret; char buffer[2000]; CERT_RDN_VALUE_BLOB blob = { 0, NULL }; + static const char ePKI[] = "ePKI Root Certification Authority"; if (!pCertRDNValueToStrA) return; @@ -239,11 +264,31 @@ static void test_CertRDNValueToStrA(void) { ret = pCertRDNValueToStrA(attrs[i].dwValueType, &attrs[i].Value, buffer, sizeof(buffer)); - ok(ret == strlen(attrs[i].str) + 1, "Expected length %d, got %d\n", - lstrlenA(attrs[i].str) + 1, ret); - ok(!strcmp(buffer, attrs[i].str), "Expected %s, got %s\n", attrs[i].str, - buffer); + if (attrs[i].todo) + { + todo_wine + ok(ret == strlen(attrs[i].str) + 1, "Expected length %d, got %d\n", + lstrlenA(attrs[i].str) + 1, ret); + todo_wine + ok(!strcmp(buffer, attrs[i].str), "Expected %s, got %s\n", + attrs[i].str, buffer); + } + else + { + ok(ret == strlen(attrs[i].str) + 1, "Expected length %d, got %d\n", + lstrlenA(attrs[i].str) + 1, ret); + ok(!strcmp(buffer, attrs[i].str), "Expected %s, got %s\n", + attrs[i].str, buffer); + } } + blob.pbData = bin8; + blob.cbData = sizeof(bin8); + ret = pCertRDNValueToStrA(CERT_RDN_UTF8_STRING, &blob, buffer, + sizeof(buffer)); + ok(ret == strlen(ePKI) + 1 || broken(ret != strlen(ePKI) + 1), + "Expected length %d, got %d\n", lstrlenA(ePKI), ret); + if (ret == strlen(ePKI) + 1) + ok(!strcmp(buffer, ePKI), "Expected %s, got %s\n", ePKI, buffer); } static void test_CertRDNValueToStrW(void) @@ -259,21 +304,44 @@ static void test_CertRDNValueToStrW(void) static const WCHAR localhostW[] = { 'l','o','c','a','l','h','o','s','t',0 }; static const WCHAR aricW[] = { 'a','r','i','c','@','c','o','d','e','w','e', 'a','v','e','r','s','.','c','o','m',0 }; + static const WCHAR ePKIW[] = { 'e','P','K','I',' ','R','o','o','t',' ', + 'C','e','r','t','i','f','i','c','a','t','i','o','n',' ','A','u','t','h', + 'o','r','i','t','y',0 }; + static const WCHAR embeddedDoubleQuoteW[] = { 'a','b','c','"','d','e','f', + 0 }; + static const WCHAR embeddedSingleQuoteW[] = { 'a','b','c','\'','d','e','f', + 0 }; + static const WCHAR embeddedCommaW[] = { 'a','b','c',',',' ','d','e','f',0 }; + static const WCHAR trailingAndEndingSpaceW[] = { ' ','a','b','c',' ',0 }; + static const WCHAR enclosingQuotesW[] = { '"','d','e','f','"',0 }; + static const WCHAR embeddedSemiW[] = { '1',';','3',0 }; CertRDNAttrEncodingW attrs[] = { { "2.5.4.6", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin1), bin1 }, usW }, + { sizeof(bin1), bin1 }, usW, FALSE }, { "2.5.4.8", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin2), bin2 }, minnesotaW }, + { sizeof(bin2), bin2 }, minnesotaW, FALSE }, { "2.5.4.7", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin3), bin3 }, minneapolisW }, + { sizeof(bin3), bin3 }, minneapolisW, FALSE }, { "2.5.4.10", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin4), bin4 }, codeweaversW }, + { sizeof(bin4), bin4 }, codeweaversW, FALSE }, { "2.5.4.11", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin5), bin5 }, wineDevW }, + { sizeof(bin5), bin5 }, wineDevW, FALSE }, { "2.5.4.3", CERT_RDN_PRINTABLE_STRING, - { sizeof(bin6), bin6 }, localhostW }, + { sizeof(bin6), bin6 }, localhostW, FALSE }, { "1.2.840.113549.1.9.1", CERT_RDN_IA5_STRING, - { sizeof(bin7), bin7 }, aricW }, + { sizeof(bin7), bin7 }, aricW, FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin9), bin9 }, embeddedDoubleQuoteW, FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin10), bin10 }, embeddedSingleQuoteW, FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin11), bin11 }, embeddedCommaW, FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin12), bin12 }, trailingAndEndingSpaceW, FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin13), bin13 }, enclosingQuotesW, FALSE }, + { "0", CERT_RDN_PRINTABLE_STRING, + { sizeof(bin14), bin14 }, embeddedSemiW, FALSE }, }; DWORD i, ret; WCHAR buffer[2000]; @@ -301,35 +369,102 @@ static void test_CertRDNValueToStrW(void) { ret = pCertRDNValueToStrW(attrs[i].dwValueType, &attrs[i].Value, buffer, sizeof(buffer) / sizeof(buffer[0])); - ok(ret == lstrlenW(attrs[i].str) + 1, "Expected length %d, got %d\n", - lstrlenW(attrs[i].str) + 1, ret); - ok(!lstrcmpW(buffer, attrs[i].str), "Unexpected value\n"); -#ifdef DUMP_STRINGS - trace("Expected %s, got %s\n", - wine_dbgstr_w(attrs[i].str), wine_dbgstr_w(buffer)); -#endif + if (attrs[i].todo) + { + todo_wine + ok(ret == lstrlenW(attrs[i].str) + 1, + "Expected length %d, got %d\n", lstrlenW(attrs[i].str) + 1, ret); + todo_wine + ok(!lstrcmpW(buffer, attrs[i].str), "Expected %s, got %s\n", + wine_dbgstr_w(attrs[i].str), wine_dbgstr_w(buffer)); + } + else + { + ok(ret == lstrlenW(attrs[i].str) + 1, + "Expected length %d, got %d\n", lstrlenW(attrs[i].str) + 1, ret); + ok(!lstrcmpW(buffer, attrs[i].str), "Expected %s, got %s\n", + wine_dbgstr_w(attrs[i].str), wine_dbgstr_w(buffer)); + } } + blob.pbData = bin8; + blob.cbData = sizeof(bin8); + ret = pCertRDNValueToStrW(CERT_RDN_UTF8_STRING, &blob, buffer, + sizeof(buffer)); + ok(ret == lstrlenW(ePKIW) + 1 || broken(ret != lstrlenW(ePKIW) + 1), + "Expected length %d, got %d\n", lstrlenW(ePKIW), ret); + if (ret == lstrlenW(ePKIW) + 1) + ok(!lstrcmpW(buffer, ePKIW), "Expected %s, got %s\n", + wine_dbgstr_w(ePKIW), wine_dbgstr_w(buffer)); } static void test_NameToStrConversionA(PCERT_NAME_BLOB pName, DWORD dwStrType, - LPCSTR expected) + LPCSTR expected, BOOL todo) { char buffer[2000] = { 0 }; DWORD i; i = pCertNameToStrA(X509_ASN_ENCODING, pName, dwStrType, NULL, 0); - ok(i == strlen(expected) + 1, "Expected %d chars, got %d\n", - lstrlenA(expected) + 1, i); + if (todo) + todo_wine + ok(i == strlen(expected) + 1, "Expected %d chars, got %d\n", + lstrlenA(expected) + 1, i); + else + ok(i == strlen(expected) + 1, "Expected %d chars, got %d\n", + lstrlenA(expected) + 1, i); i = pCertNameToStrA(X509_ASN_ENCODING,pName, dwStrType, buffer, sizeof(buffer)); - ok(i == strlen(expected) + 1, "Expected %d chars, got %d\n", - lstrlenA(expected) + 1, i); - ok(!strcmp(buffer, expected), "Expected %s, got %s\n", expected, buffer); + if (todo) + todo_wine + ok(i == strlen(expected) + 1, "Expected %d chars, got %d\n", + lstrlenA(expected) + 1, i); + else + ok(i == strlen(expected) + 1, "Expected %d chars, got %d\n", + lstrlenA(expected) + 1, i); + if (todo) + todo_wine + ok(!strcmp(buffer, expected), "Expected %s, got %s\n", expected, + buffer); + else + ok(!strcmp(buffer, expected), "Expected %s, got %s\n", expected, + buffer); } +static BYTE encodedSimpleCN[] = { +0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x31 }; +static BYTE encodedSingleQuotedCN[] = { 0x30,0x0e,0x31,0x0c,0x30,0x0a, + 0x06,0x03,0x55,0x04,0x03,0x13,0x03,0x27,0x31,0x27 }; +static BYTE encodedSpacedCN[] = { 0x30,0x0e,0x31,0x0c,0x30,0x0a,0x06,0x03, + 0x55,0x04,0x03,0x13,0x03,0x20,0x31,0x20 }; +static BYTE encodedQuotedCN[] = { 0x30,0x11,0x31,0x0f,0x30,0x0d,0x06,0x03, + 0x55, 0x04,0x03,0x1e,0x06,0x00,0x22,0x00,0x31,0x00,0x22, }; +static BYTE encodedMultipleAttrCN[] = { 0x30,0x0e,0x31,0x0c,0x30,0x0a, + 0x06,0x03,0x55,0x04,0x03,0x13,0x03,0x31,0x2b,0x32 }; +static BYTE encodedCommaCN[] = { +0x30,0x0e,0x31,0x0c,0x30,0x0a,0x06,0x03,0x55,0x04,0x03,0x13,0x03,0x61,0x2c, +0x62 }; +static BYTE encodedEqualCN[] = { +0x30,0x0e,0x31,0x0c,0x30,0x0a,0x06,0x03,0x55,0x04,0x03,0x13,0x03,0x61,0x3d, +0x62 }; +static BYTE encodedLessThanCN[] = { +0x30,0x0d,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x03,0x1e,0x02,0x00,0x3c +}; +static BYTE encodedGreaterThanCN[] = { +0x30,0x0d,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x03,0x1e,0x02,0x00,0x3e +}; +static BYTE encodedHashCN[] = { +0x30,0x0d,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x03,0x1e,0x02,0x00,0x23 +}; +static BYTE encodedSemiCN[] = { +0x30,0x0d,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x03,0x1e,0x02,0x00,0x3b +}; +static BYTE encodedNewlineCN[] = { +0x30,0x11,0x31,0x0f,0x30,0x0d,0x06,0x03,0x55,0x04,0x03,0x1e,0x06,0x00,0x61, +0x00,0x0a,0x00,0x62 }; + static void test_CertNameToStrA(void) { PCCERT_CONTEXT context; + CERT_NAME_BLOB blob; if (!pCertNameToStrA) { @@ -362,53 +497,137 @@ static void test_CertNameToStrA(void) ret, GetLastError()); test_NameToStrConversionA(&context->pCertInfo->Issuer, - CERT_SIMPLE_NAME_STR, issuerStr); + CERT_SIMPLE_NAME_STR, issuerStr, FALSE); test_NameToStrConversionA(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, - issuerStrSemicolon); + issuerStrSemicolon, FALSE); test_NameToStrConversionA(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR | CERT_NAME_STR_CRLF_FLAG, - issuerStrCRLF); + issuerStrCRLF, FALSE); test_NameToStrConversionA(&context->pCertInfo->Subject, - CERT_OID_NAME_STR, subjectStr); + CERT_OID_NAME_STR, subjectStr, FALSE); test_NameToStrConversionA(&context->pCertInfo->Subject, CERT_OID_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, - subjectStrSemicolon); + subjectStrSemicolon, FALSE); test_NameToStrConversionA(&context->pCertInfo->Subject, CERT_OID_NAME_STR | CERT_NAME_STR_CRLF_FLAG, - subjectStrCRLF); + subjectStrCRLF, FALSE); test_NameToStrConversionA(&context->pCertInfo->Subject, - CERT_X500_NAME_STR, x500SubjectStr); + CERT_X500_NAME_STR, x500SubjectStr, FALSE); test_NameToStrConversionA(&context->pCertInfo->Subject, - CERT_X500_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG | CERT_NAME_STR_REVERSE_FLAG, x500SubjectStrSemicolonReverse); + CERT_X500_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG | CERT_NAME_STR_REVERSE_FLAG, + x500SubjectStrSemicolonReverse, FALSE); CertFreeCertificateContext(context); } + blob.pbData = encodedSimpleCN; + blob.cbData = sizeof(encodedSimpleCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=1", FALSE); + blob.pbData = encodedSingleQuotedCN; + blob.cbData = sizeof(encodedSingleQuotedCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN='1'", FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "'1'", FALSE); + blob.pbData = encodedSpacedCN; + blob.cbData = sizeof(encodedSpacedCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\" 1 \"", FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\" 1 \"", FALSE); + blob.pbData = encodedQuotedCN; + blob.cbData = sizeof(encodedQuotedCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"\"\"1\"\"\"", + FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"\"\"1\"\"\"", + FALSE); + blob.pbData = encodedMultipleAttrCN; + blob.cbData = sizeof(encodedMultipleAttrCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"1+2\"", FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"1+2\"", FALSE); + blob.pbData = encodedCommaCN; + blob.cbData = sizeof(encodedCommaCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"a,b\"", FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"a,b\"", FALSE); + blob.pbData = encodedEqualCN; + blob.cbData = sizeof(encodedEqualCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"a=b\"", FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"a=b\"", FALSE); + blob.pbData = encodedLessThanCN; + blob.cbData = sizeof(encodedLessThanCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"<\"", FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"<\"", FALSE); + blob.pbData = encodedGreaterThanCN; + blob.cbData = sizeof(encodedGreaterThanCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\">\"", FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\">\"", FALSE); + blob.pbData = encodedHashCN; + blob.cbData = sizeof(encodedHashCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"#\"", FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"#\"", FALSE); + blob.pbData = encodedSemiCN; + blob.cbData = sizeof(encodedSemiCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\";\"", FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\";\"", FALSE); + blob.pbData = encodedNewlineCN; + blob.cbData = sizeof(encodedNewlineCN); + test_NameToStrConversionA(&blob, CERT_X500_NAME_STR, "CN=\"a\nb\"", FALSE); + test_NameToStrConversionA(&blob, CERT_SIMPLE_NAME_STR, "\"a\nb\"", FALSE); } static void test_NameToStrConversionW(PCERT_NAME_BLOB pName, DWORD dwStrType, - LPCWSTR expected) + LPCWSTR expected, BOOL todo) { WCHAR buffer[2000] = { 0 }; DWORD i; i = pCertNameToStrW(X509_ASN_ENCODING,pName, dwStrType, NULL, 0); - ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %d\n", - lstrlenW(expected) + 1, i); + if (todo) + todo_wine ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %d\n", + lstrlenW(expected) + 1, i); + else + ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %d\n", + lstrlenW(expected) + 1, i); i = pCertNameToStrW(X509_ASN_ENCODING,pName, dwStrType, buffer, sizeof(buffer) / sizeof(buffer[0])); - ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %d\n", - lstrlenW(expected) + 1, i); - ok(!lstrcmpW(buffer, expected), "Unexpected value\n"); -#ifdef DUMP_STRINGS - trace("Expected %s, got %s\n", - wine_dbgstr_w(expected), wine_dbgstr_w(buffer)); -#endif + if (todo) + todo_wine ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %d\n", + lstrlenW(expected) + 1, i); + else + ok(i == lstrlenW(expected) + 1, "Expected %d chars, got %d\n", + lstrlenW(expected) + 1, i); + if (todo) + todo_wine ok(!lstrcmpW(buffer, expected), "Expected %s, got %s\n", + wine_dbgstr_w(expected), wine_dbgstr_w(buffer)); + else + ok(!lstrcmpW(buffer, expected), "Expected %s, got %s\n", + wine_dbgstr_w(expected), wine_dbgstr_w(buffer)); } +static const WCHAR simpleCN_W[] = { 'C','N','=','1',0 }; +static const WCHAR singledQuotedCN_W[] = { 'C','N','=','\'','1','\'',0 }; +static const WCHAR simpleSingleQuotedCN_W[] = { '\'','1','\'',0 }; +static const WCHAR spacedCN_W[] = { 'C','N','=','"',' ','1',' ','"',0 }; +static const WCHAR simpleSpacedCN_W[] = { '"',' ','1',' ','"',0 }; +static const WCHAR quotedCN_W[] = { 'C','N','=','"','"','"','1','"','"','"',0 }; +static const WCHAR simpleQuotedCN_W[] = { '"','"','"','1','"','"','"',0 }; +static const WCHAR multipleAttrCN_W[] = { 'C','N','=','"','1','+','2','"',0 }; +static const WCHAR simpleMultipleAttrCN_W[] = { '"','1','+','2','"',0 }; +static const WCHAR commaCN_W[] = { 'C','N','=','"','a',',','b','"',0 }; +static const WCHAR simpleCommaCN_W[] = { '"','a',',','b','"',0 }; +static const WCHAR equalCN_W[] = { 'C','N','=','"','a','=','b','"',0 }; +static const WCHAR simpleEqualCN_W[] = { '"','a','=','b','"',0 }; +static const WCHAR lessThanCN_W[] = { 'C','N','=','"','<','"',0 }; +static const WCHAR simpleLessThanCN_W[] = { '"','<','"',0 }; +static const WCHAR greaterThanCN_W[] = { 'C','N','=','"','>','"',0 }; +static const WCHAR simpleGreaterThanCN_W[] = { '"','>','"',0 }; +static const WCHAR hashCN_W[] = { 'C','N','=','"','#','"',0 }; +static const WCHAR simpleHashCN_W[] = { '"','#','"',0 }; +static const WCHAR semiCN_W[] = { 'C','N','=','"',';','"',0 }; +static const WCHAR simpleSemiCN_W[] = { '"',';','"',0 }; +static const WCHAR newlineCN_W[] = { 'C','N','=','"','a','\n','b','"',0 }; +static const WCHAR simpleNewlineCN_W[] = { '"','a','\n','b','"',0 }; + static void test_CertNameToStrW(void) { PCCERT_CONTEXT context; + CERT_NAME_BLOB blob; if (!pCertNameToStrW) { @@ -441,26 +660,89 @@ static void test_CertNameToStrW(void) ret, GetLastError()); test_NameToStrConversionW(&context->pCertInfo->Issuer, - CERT_SIMPLE_NAME_STR, issuerStrW); + CERT_SIMPLE_NAME_STR, issuerStrW, FALSE); test_NameToStrConversionW(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, - issuerStrSemicolonW); + issuerStrSemicolonW, FALSE); test_NameToStrConversionW(&context->pCertInfo->Issuer, CERT_SIMPLE_NAME_STR | CERT_NAME_STR_CRLF_FLAG, - issuerStrCRLFW); + issuerStrCRLFW, FALSE); test_NameToStrConversionW(&context->pCertInfo->Subject, - CERT_OID_NAME_STR, subjectStrW); + CERT_OID_NAME_STR, subjectStrW, FALSE); test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_OID_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG, - subjectStrSemicolonW); + subjectStrSemicolonW, FALSE); test_NameToStrConversionW(&context->pCertInfo->Subject, CERT_OID_NAME_STR | CERT_NAME_STR_CRLF_FLAG, - subjectStrCRLFW); + subjectStrCRLFW, FALSE); test_NameToStrConversionW(&context->pCertInfo->Subject, - CERT_X500_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG | CERT_NAME_STR_REVERSE_FLAG, x500SubjectStrSemicolonReverseW); + CERT_X500_NAME_STR | CERT_NAME_STR_SEMICOLON_FLAG | CERT_NAME_STR_REVERSE_FLAG, + x500SubjectStrSemicolonReverseW, FALSE); CertFreeCertificateContext(context); } + blob.pbData = encodedSimpleCN; + blob.cbData = sizeof(encodedSimpleCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, simpleCN_W, FALSE); + blob.pbData = encodedSingleQuotedCN; + blob.cbData = sizeof(encodedSingleQuotedCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, singledQuotedCN_W, + FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, + simpleSingleQuotedCN_W, FALSE); + blob.pbData = encodedSpacedCN; + blob.cbData = sizeof(encodedSpacedCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, spacedCN_W, FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, simpleSpacedCN_W, + FALSE); + blob.pbData = encodedQuotedCN; + blob.cbData = sizeof(encodedQuotedCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, quotedCN_W, + FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, simpleQuotedCN_W, + FALSE); + blob.pbData = encodedMultipleAttrCN; + blob.cbData = sizeof(encodedMultipleAttrCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, multipleAttrCN_W, + FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, + simpleMultipleAttrCN_W, FALSE); + blob.pbData = encodedCommaCN; + blob.cbData = sizeof(encodedCommaCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, commaCN_W, FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, simpleCommaCN_W, + FALSE); + blob.pbData = encodedEqualCN; + blob.cbData = sizeof(encodedEqualCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, equalCN_W, FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, simpleEqualCN_W, + FALSE); + blob.pbData = encodedLessThanCN; + blob.cbData = sizeof(encodedLessThanCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, lessThanCN_W, FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, simpleLessThanCN_W, + FALSE); + blob.pbData = encodedGreaterThanCN; + blob.cbData = sizeof(encodedGreaterThanCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, greaterThanCN_W, + FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, + simpleGreaterThanCN_W, FALSE); + blob.pbData = encodedHashCN; + blob.cbData = sizeof(encodedHashCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, hashCN_W, FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, simpleHashCN_W, + FALSE); + blob.pbData = encodedSemiCN; + blob.cbData = sizeof(encodedSemiCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, semiCN_W, FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, simpleSemiCN_W, + FALSE); + blob.pbData = encodedNewlineCN; + blob.cbData = sizeof(encodedNewlineCN); + test_NameToStrConversionW(&blob, CERT_X500_NAME_STR, newlineCN_W, FALSE); + test_NameToStrConversionW(&blob, CERT_SIMPLE_NAME_STR, simpleNewlineCN_W, + FALSE); } struct StrToNameA @@ -470,18 +752,7 @@ struct StrToNameA const BYTE *encoded; }; -const BYTE encodedSimpleCN[] = { -0x30,0x0c,0x31,0x0a,0x30,0x08,0x06,0x03,0x55,0x04,0x03,0x13,0x01,0x31 }; -static const BYTE encodedSingleQuotedCN[] = { 0x30,0x0e,0x31,0x0c,0x30,0x0a, - 0x06,0x03,0x55,0x04,0x03,0x13,0x03,0x27,0x31,0x27 }; -static const BYTE encodedSpacedCN[] = { 0x30,0x0e,0x31,0x0c,0x30,0x0a,0x06,0x03, - 0x55,0x04,0x03,0x13,0x03,0x20,0x31,0x20 }; -static const BYTE encodedQuotedCN[] = { 0x30,0x11,0x31,0x0f,0x30,0x0d,0x06,0x03, - 0x55, 0x04,0x03,0x1e,0x06,0x00,0x22,0x00,0x31,0x00,0x22, }; -static const BYTE encodedMultipleAttrCN[] = { 0x30,0x0e,0x31,0x0c,0x30,0x0a, - 0x06,0x03,0x55,0x04,0x03,0x13,0x03,0x31,0x2b,0x32 }; - -struct StrToNameA namesA[] = { +static const struct StrToNameA namesA[] = { { "CN=1", sizeof(encodedSimpleCN), encodedSimpleCN }, { "CN=\"1\"", sizeof(encodedSimpleCN), encodedSimpleCN }, { "CN = \"1\"", sizeof(encodedSimpleCN), encodedSimpleCN }, @@ -489,6 +760,12 @@ struct StrToNameA namesA[] = { { "CN=\" 1 \"", sizeof(encodedSpacedCN), encodedSpacedCN }, { "CN=\"\"\"1\"\"\"", sizeof(encodedQuotedCN), encodedQuotedCN }, { "CN=\"1+2\"", sizeof(encodedMultipleAttrCN), encodedMultipleAttrCN }, + { "CN=\"a,b\"", sizeof(encodedCommaCN), encodedCommaCN }, + { "CN=\"a=b\"", sizeof(encodedEqualCN), encodedEqualCN }, + { "CN=\"<\"", sizeof(encodedLessThanCN), encodedLessThanCN }, + { "CN=\">\"", sizeof(encodedGreaterThanCN), encodedGreaterThanCN }, + { "CN=\"#\"", sizeof(encodedHashCN), encodedHashCN }, + { "CN=\";\"", sizeof(encodedSemiCN), encodedSemiCN }, }; static void test_CertStrToNameA(void) @@ -526,8 +803,36 @@ static void test_CertStrToNameA(void) "Expected CRYPT_E_INVALID_X500_STRING, got %08x\n", GetLastError()); ret = pCertStrToNameA(X509_ASN_ENCODING, "CN=1+2", 0, NULL, buf, &size, NULL); - todo_wine ok(!ret && GetLastError() == CRYPT_E_INVALID_X500_STRING, + ok(!ret && GetLastError() == CRYPT_E_INVALID_X500_STRING, "Expected CRYPT_E_INVALID_X500_STRING, got %08x\n", GetLastError()); + ret = pCertStrToNameA(X509_ASN_ENCODING, "CN=1+2", CERT_NAME_STR_NO_PLUS_FLAG, NULL, buf, + &size, NULL); + ok(ret && GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + ret = pCertStrToNameA(X509_ASN_ENCODING, "CN=1,2", CERT_NAME_STR_NO_QUOTING_FLAG, NULL, buf, + &size, NULL); + ok(!ret && GetLastError() == CRYPT_E_INVALID_X500_STRING, + "Expected CRYPT_E_INVALID_X500_STRING, got %08x\n", GetLastError()); + ret = pCertStrToNameA(X509_ASN_ENCODING, "CN=\"1,2;3,4\"", CERT_NAME_STR_NO_QUOTING_FLAG, NULL, buf, + &size, NULL); + ok(!ret && GetLastError() == CRYPT_E_INVALID_X500_STRING, + "Expected CRYPT_E_INVALID_X500_STRING, got %08x\n", GetLastError()); + ret = pCertStrToNameA(X509_ASN_ENCODING, "CN=abc", 0, NULL, buf, + &size, NULL); + ok(ret && GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + ret = pCertStrToNameA(X509_ASN_ENCODING, "CN=abc", CERT_NAME_STR_NO_QUOTING_FLAG, NULL, buf, + &size, NULL); + ok(ret && GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + ret = pCertStrToNameA(X509_ASN_ENCODING, "CN=\"abc\"", 0, NULL, buf, + &size, NULL); + ok(ret && GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + ret = pCertStrToNameA(X509_ASN_ENCODING, "CN=\"abc\"", CERT_NAME_STR_NO_QUOTING_FLAG, NULL, buf, + &size, NULL); + ok(!ret && GetLastError() == ERROR_MORE_DATA, + "Expected ERROR_MORE_DATA, got %08x\n", GetLastError()); for (i = 0; i < sizeof(namesA) / sizeof(namesA[0]); i++) { size = sizeof(buf); @@ -551,18 +856,13 @@ struct StrToNameW }; static const WCHAR badlyQuotedCN_W[] = { 'C','N','=','"','"','1','"','"',0 }; -static const WCHAR simpleCN_W[] = { 'C','N','=','1',0 }; static const WCHAR simpleCN2_W[] = { 'C','N','=','"','1','"',0 }; static const WCHAR simpleCN3_W[] = { 'C','N',' ','=',' ','"','1','"',0 }; -static const WCHAR singledQuotedCN_W[] = { 'C','N','=','\'','1','\'',0 }; -static const WCHAR spacedCN_W[] = { 'C','N','=','"',' ','1',' ','"',0 }; -static const WCHAR quotedCN_W[] = { 'C','N','=','"','"','"','1','"','"','"',0 }; -static const WCHAR multipleAttrCN_W[] = { 'C','N','=','"','1','+','2','"',0 }; static const WCHAR japaneseCN_W[] = { 'C','N','=',0x226f,0x575b,0 }; static const BYTE encodedJapaneseCN[] = { 0x30,0x0f,0x31,0x0d,0x30,0x0b,0x06, 0x03,0x55,0x04,0x03,0x1e,0x04,0x22,0x6f,0x57,0x5b }; -struct StrToNameW namesW[] = { +static const struct StrToNameW namesW[] = { { simpleCN_W, sizeof(encodedSimpleCN), encodedSimpleCN }, { simpleCN2_W, sizeof(encodedSimpleCN), encodedSimpleCN }, { simpleCN3_W, sizeof(encodedSimpleCN), encodedSimpleCN }, @@ -571,6 +871,12 @@ struct StrToNameW namesW[] = { { quotedCN_W, sizeof(encodedQuotedCN), encodedQuotedCN }, { multipleAttrCN_W, sizeof(encodedMultipleAttrCN), encodedMultipleAttrCN }, { japaneseCN_W, sizeof(encodedJapaneseCN), encodedJapaneseCN }, + { commaCN_W, sizeof(encodedCommaCN), encodedCommaCN }, + { equalCN_W, sizeof(encodedEqualCN), encodedEqualCN }, + { lessThanCN_W, sizeof(encodedLessThanCN), encodedLessThanCN }, + { greaterThanCN_W, sizeof(encodedGreaterThanCN), encodedGreaterThanCN }, + { hashCN_W, sizeof(encodedHashCN), encodedHashCN }, + { semiCN_W, sizeof(encodedSemiCN), encodedSemiCN }, }; static void test_CertStrToNameW(void) @@ -630,6 +936,162 @@ static void test_CertStrToNameW(void) } } +static void test_CertGetNameStringA(void) +{ + PCCERT_CONTEXT context; + + if (!pCertGetNameStringA) + { + win_skip("CertGetNameStringA is not available\n"); + return; + } + + context = CertCreateCertificateContext(X509_ASN_ENCODING, cert, + sizeof(cert)); + ok(context != NULL, "CertCreateCertificateContext failed: %08x\n", + GetLastError()); + if (context) + { + static const char aric[] = "aric@codeweavers.com"; + static const char localhost[] = "localhost"; + DWORD len, type; + LPSTR str; + + /* Bad string types/types missing from the cert */ + len = pCertGetNameStringA(NULL, 0, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %d\n", len); + len = pCertGetNameStringA(context, 0, 0, NULL, NULL, 0); + ok(len == 1, "expected 1, got %d\n", len); + len = pCertGetNameStringA(context, CERT_NAME_URL_TYPE, 0, NULL, NULL, + 0); + ok(len == 1, "expected 1, got %d\n", len); + + len = pCertGetNameStringA(context, CERT_NAME_EMAIL_TYPE, 0, NULL, NULL, + 0); + ok(len == strlen(aric) + 1, "unexpected length %d\n", len); + str = HeapAlloc(GetProcessHeap(), 0, len); + if (str) + { + len = pCertGetNameStringA(context, CERT_NAME_EMAIL_TYPE, 0, NULL, + str, len); + ok(!strcmp(str, aric), "unexpected value %s\n", str); + HeapFree(GetProcessHeap(), 0, str); + } + + len = pCertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, NULL, NULL, + 0); + ok(len == strlen(issuerStr) + 1, "unexpected length %d\n", len); + str = HeapAlloc(GetProcessHeap(), 0, len); + if (str) + { + len = pCertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, NULL, + str, len); + ok(!strcmp(str, issuerStr), "unexpected value %s\n", str); + HeapFree(GetProcessHeap(), 0, str); + } + type = 0; + len = pCertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, NULL, + 0); + ok(len == strlen(issuerStr) + 1, "unexpected length %d\n", len); + str = HeapAlloc(GetProcessHeap(), 0, len); + if (str) + { + len = pCertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, + str, len); + ok(!strcmp(str, issuerStr), "unexpected value %s\n", str); + HeapFree(GetProcessHeap(), 0, str); + } + type = CERT_OID_NAME_STR; + len = pCertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, NULL, + 0); + ok(len == strlen(subjectStr) + 1, "unexpected length %d\n", len); + str = HeapAlloc(GetProcessHeap(), 0, len); + if (str) + { + len = pCertGetNameStringA(context, CERT_NAME_RDN_TYPE, 0, &type, + str, len); + ok(!strcmp(str, subjectStr), "unexpected value %s\n", str); + HeapFree(GetProcessHeap(), 0, str); + } + + len = pCertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, NULL, NULL, + 0); + ok(len == strlen(aric) + 1, "unexpected length %d\n", len); + str = HeapAlloc(GetProcessHeap(), 0, len); + if (str) + { + len = pCertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, NULL, + str, len); + ok(!strcmp(str, aric), "unexpected value %s\n", str); + HeapFree(GetProcessHeap(), 0, str); + } + len = pCertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, + (void *)szOID_RSA_emailAddr, NULL, 0); + ok(len == strlen(aric) + 1, "unexpected length %d\n", len); + str = HeapAlloc(GetProcessHeap(), 0, len); + if (str) + { + len = pCertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, + (void *)szOID_RSA_emailAddr, str, len); + ok(!strcmp(str, aric), "unexpected value %s\n", str); + HeapFree(GetProcessHeap(), 0, str); + } + len = pCertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, + (void *)szOID_COMMON_NAME, NULL, 0); + ok(len == strlen(localhost) + 1, "unexpected length %d\n", len); + str = HeapAlloc(GetProcessHeap(), 0, len); + if (str) + { + len = pCertGetNameStringA(context, CERT_NAME_ATTR_TYPE, 0, + (void *)szOID_COMMON_NAME, str, len); + ok(!strcmp(str, localhost), "unexpected value %s\n", str); + HeapFree(GetProcessHeap(), 0, str); + } + + len = pCertGetNameStringA(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, + NULL, NULL, 0); + ok(len == strlen(localhost) + 1, "unexpected length %d\n", len); + str = HeapAlloc(GetProcessHeap(), 0, len); + if (str) + { + len = pCertGetNameStringA(context, CERT_NAME_SIMPLE_DISPLAY_TYPE, + 0, NULL, str, len); + ok(!strcmp(str, localhost), "unexpected value %s\n", str); + HeapFree(GetProcessHeap(), 0, str); + } + + len = pCertGetNameStringA(context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, + NULL, NULL, 0); + ok(len == strlen(localhost) + 1, "unexpected length %d\n", len); + str = HeapAlloc(GetProcessHeap(), 0, len); + if (str) + { + len = pCertGetNameStringA(context, CERT_NAME_FRIENDLY_DISPLAY_TYPE, + 0, NULL, str, len); + ok(!strcmp(str, localhost), "unexpected value %s\n", str); + HeapFree(GetProcessHeap(), 0, str); + } + + len = pCertGetNameStringA(context, CERT_NAME_DNS_TYPE, 0, NULL, NULL, + 0); + ok(len == strlen(localhost) + 1 || broken(len == 1) /* NT4 */, + "unexpected length %d\n", len); + if (len > 1) + { + str = HeapAlloc(GetProcessHeap(), 0, len); + if (str) + { + len = pCertGetNameStringA(context, CERT_NAME_DNS_TYPE, 0, NULL, + str, len); + ok(!strcmp(str, localhost), "unexpected value %s\n", str); + HeapFree(GetProcessHeap(), 0, str); + } + } + + CertFreeCertificateContext(context); + } +} + START_TEST(str) { dll = GetModuleHandleA("Crypt32.dll"); @@ -644,6 +1106,8 @@ START_TEST(str) "CryptDecodeObject"); pCertStrToNameA = (CertStrToNameAFunc)GetProcAddress(dll,"CertStrToNameA"); pCertStrToNameW = (CertStrToNameWFunc)GetProcAddress(dll,"CertStrToNameW"); + pCertGetNameStringA = (CertGetNameStringAFunc)GetProcAddress(dll, + "CertGetNameStringA"); test_CertRDNValueToStrA(); test_CertRDNValueToStrW(); @@ -651,4 +1115,5 @@ START_TEST(str) test_CertNameToStrW(); test_CertStrToNameA(); test_CertStrToNameW(); + test_CertGetNameStringA(); } From ad68c5f813725b53f3a3d694df3d7f1a98f42f58 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 15:51:05 +0000 Subject: [PATCH 047/289] [CRYPTDLG] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55111 --- reactos/dll/win32/cryptdlg/cryptdlg.spec | 4 ++-- reactos/media/doc/README.WINE | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/cryptdlg/cryptdlg.spec b/reactos/dll/win32/cryptdlg/cryptdlg.spec index 0da7b293fcb..b417d0d8b80 100644 --- a/reactos/dll/win32/cryptdlg/cryptdlg.spec +++ b/reactos/dll/win32/cryptdlg/cryptdlg.spec @@ -15,7 +15,7 @@ 15 stub CertSelectCertificateW 16 stdcall CertViewPropertiesA(ptr) 17 stdcall CertViewPropertiesW(ptr) -@ stdcall -private DllRegisterServer() -@ stdcall -private DllUnregisterServer() +18 stdcall -private DllRegisterServer() +19 stdcall -private DllUnregisterServer() 20 stdcall GetFriendlyNameOfCertA(ptr ptr long) 21 stdcall GetFriendlyNameOfCertW(ptr ptr long) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index d531dacea0d..f9bc29696a3 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -53,7 +53,7 @@ reactos/dll/win32/comdlg32 # Autosync reactos/dll/win32/compstui # Autosync reactos/dll/win32/credui # Synced to Wine-1.3.37 reactos/dll/win32/crypt32 # Synced to Wine-1.3.37 -reactos/dll/win32/cryptdlg # Autosync +reactos/dll/win32/cryptdlg # Synced to Wine-1.3.37 reactos/dll/win32/cryptdll # Autosync reactos/dll/win32/cryptnet # Autosync reactos/dll/win32/cryptui # Autosync From 8231f5eadb0c681a16302d3150c3fce61a64626c Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 16:03:34 +0000 Subject: [PATCH 048/289] * Update the sync notes for clusapi, comcat, compstui and cryptdll. svn path=/trunk/; revision=55113 --- reactos/media/doc/README.WINE | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index f9bc29696a3..e7e932fc33b 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -46,15 +46,15 @@ reactos/dll/win32/avifil32 # Autosync reactos/dll/win32/bcrypt # Synced to Wine-1.3.37 reactos/dll/win32/browseui # Out of sync reactos/dll/win32/cabinet # Synced to Wine-1.3.37 -reactos/dll/win32/clusapi # Autosync -reactos/dll/win32/comcat # Autosync +reactos/dll/win32/clusapi # Synced to Wine-1.3.37 +reactos/dll/win32/comcat # Synced to Wine-1.3.37 reactos/dll/win32/comctl32 # Synced to Wine 1.3.14 reactos/dll/win32/comdlg32 # Autosync -reactos/dll/win32/compstui # Autosync +reactos/dll/win32/compstui # Synced to Wine-1.3.37 reactos/dll/win32/credui # Synced to Wine-1.3.37 reactos/dll/win32/crypt32 # Synced to Wine-1.3.37 reactos/dll/win32/cryptdlg # Synced to Wine-1.3.37 -reactos/dll/win32/cryptdll # Autosync +reactos/dll/win32/cryptdll # Synced to Wine-1.3.37 reactos/dll/win32/cryptnet # Autosync reactos/dll/win32/cryptui # Autosync reactos/dll/win32/dbghelp # Autosync From 95ceec858b4c4f35d4b25a6ae4627244a320ef14 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 16:04:06 +0000 Subject: [PATCH 049/289] [COMCAT_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55114 --- rostests/winetests/comcat/comcat.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rostests/winetests/comcat/comcat.c b/rostests/winetests/comcat/comcat.c index 029d2e30ab3..f78e234b663 100644 --- a/rostests/winetests/comcat/comcat.c +++ b/rostests/winetests/comcat/comcat.c @@ -104,6 +104,7 @@ static void do_enum(void) ok_ole_success(hr,"ICatInformation_EnumClassesOfCategories"); hr = IEnumGUID_Next(pIEnum,1,the_guid, &fetched); + ok (hr == S_FALSE,"Expected S_FALSE, got 0x%08x\n", hr); ok (fetched == 0,"Fetched wrong number of guids %u\n",fetched); IEnumGUID_Release(pIEnum); @@ -113,6 +114,7 @@ static void do_enum(void) ok_ole_success(hr,"ICatInformation_EnumClassesOfCategories"); hr = IEnumGUID_Next(pIEnum,1,the_guid, &fetched); + ok (hr == S_OK,"Expected S_OK, got 0x%08x\n", hr); ok (fetched == 1,"Fetched wrong number of guids %u\n",fetched); ok (IsEqualGUID(the_guid,&wanted_guid),"Guids do not match\n"); From 5c2fb9efb70c6d5831a072e1c104b733b8bcd8be Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 16:07:08 +0000 Subject: [PATCH 050/289] [DDK] * Update usbbusif.h, usbdlib.h and usbscan.h annotations. svn path=/trunk/; revision=55116 --- reactos/include/ddk/usbbusif.h | 97 ++++++++++++++++++---------------- reactos/include/ddk/usbdlib.h | 85 ++++++++++++++++------------- reactos/include/ddk/usbscan.h | 52 +++++++++--------- 3 files changed, 125 insertions(+), 109 deletions(-) diff --git a/reactos/include/ddk/usbbusif.h b/reactos/include/ddk/usbbusif.h index 04297e97d62..81d60941c1c 100644 --- a/reactos/include/ddk/usbbusif.h +++ b/reactos/include/ddk/usbbusif.h @@ -12,31 +12,33 @@ typedef PVOID PUSB_DEVICE_HANDLE; #endif +_Must_inspect_result_ typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB) ( - IN PVOID, - IN PURB); + _In_ PVOID, + _In_ PURB); #define USB_HCD_CAPS_SUPPORTS_RT_THREADS 0x00000001 typedef VOID (USB_BUSIFFN *PUSB_BUSIFFN_GETUSBDI_VERSION) ( - IN PVOID, - OUT PUSBD_VERSION_INFORMATION OPTIONAL, - OUT PULONG OPTIONAL); + _In_ PVOID, + _Out_opt_ PUSBD_VERSION_INFORMATION, + _Out_opt_ PULONG); +_Must_inspect_result_ typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME) ( - IN PVOID, - OUT PULONG OPTIONAL); + _In_ PVOID, + _Out_opt_ PULONG); typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_ENUM_LOG_ENTRY) ( - IN PVOID, - IN ULONG, - IN ULONG, - IN ULONG, - IN ULONG); + _In_ PVOID, + _In_ ULONG, + _In_ ULONG, + _In_ ULONG, + _In_ ULONG); typedef struct _USB_BUS_INFORMATION_LEVEL_0 { ULONG TotalBandwidth; @@ -50,17 +52,19 @@ typedef struct _USB_BUS_INFORMATION_LEVEL_1 { WCHAR ControllerNameUnicodeString[1]; } USB_BUS_INFORMATION_LEVEL_1, *PUSB_BUS_INFORMATION_LEVEL_1; +_Must_inspect_result_ typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_INFORMATION) ( - IN PVOID, - IN ULONG, - IN OUT PVOID, - OUT PULONG, - OUT PULONG OPTIONAL); + _In_ PVOID, + _In_ ULONG, + _Inout_ PVOID, + _Out_ PULONG, + _Out_opt_ PULONG); +_Must_inspect_result_ typedef BOOLEAN (USB_BUSIFFN *PUSB_BUSIFFN_IS_DEVICE_HIGH_SPEED) ( - IN PVOID OPTIONAL); + _In_opt_ PVOID); #define USB_BUSIF_USBDI_VERSION_0 0x0000 #define USB_BUSIF_USBDI_VERSION_1 0x0001 @@ -113,21 +117,23 @@ typedef struct _USB_BUS_INTERFACE_USBDI_V2 { #if (NTDDI_VERSION >= NTDDI_VISTA) +_Must_inspect_result_ typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_BUS_TIME_EX) ( - IN PVOID OPTIONAL, - OUT PULONG OPTIONAL); + _In_opt_ PVOID, + _Out_opt_ PULONG); +_Must_inspect_result_ typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_QUERY_CONTROLLER_TYPE) ( - IN PVOID OPTIONAL, - OUT PULONG OPTIONAL, - OUT PUSHORT OPTIONAL, - OUT PUSHORT OPTIONAL, - OUT PUCHAR OPTIONAL, - OUT PUCHAR OPTIONAL, - OUT PUCHAR OPTIONAL, - OUT PUCHAR OPTIONAL); + _In_opt_ PVOID, + _Out_opt_ PULONG, + _Out_opt_ PUSHORT, + _Out_opt_ PUSHORT, + _Out_opt_ PUCHAR, + _Out_opt_ PUCHAR, + _Out_opt_ PUCHAR, + _Out_opt_ PUCHAR); typedef struct _USB_BUS_INTERFACE_USBDI_V3 { USHORT Size; @@ -161,25 +167,26 @@ typedef struct _USBC_FUNCTION_DESCRIPTOR{ PVOID Reserved; } USBC_FUNCTION_DESCRIPTOR, *PUSBC_FUNCTION_DESCRIPTOR; -typedef -NTSTATUS +_Must_inspect_result_ +typedef NTSTATUS (USB_BUSIFFN *USBC_START_DEVICE_CALLBACK)( - IN PUSB_DEVICE_DESCRIPTOR DeviceDescriptor, - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - OUT PUSBC_FUNCTION_DESCRIPTOR *FunctionDescriptorBuffer, - OUT PULONG FunctionDescriptorBufferLength, - IN PDEVICE_OBJECT FdoDeviceObject, - IN PDEVICE_OBJECT PdoDeviceObject); + _In_ PUSB_DEVICE_DESCRIPTOR DeviceDescriptor, + _In_ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + _Outptr_result_bytebuffer_maybenull_(*FunctionDescriptorBufferLength) + PUSBC_FUNCTION_DESCRIPTOR *FunctionDescriptorBuffer, + _Out_ PULONG FunctionDescriptorBufferLength, + _In_ PDEVICE_OBJECT FdoDeviceObject, + _In_ PDEVICE_OBJECT PdoDeviceObject); -typedef -BOOLEAN +_Must_inspect_result_ +typedef BOOLEAN (USB_BUSIFFN *USBC_PDO_ENABLE_CALLBACK)( - IN PVOID Context, - IN USHORT FirstInterfaceNumber, - IN USHORT NumberOfInterfaces, - IN UCHAR FunctionClass, - IN UCHAR FunctionSubClass, - IN UCHAR FunctionProtocol); + _In_ PVOID Context, + _In_ USHORT FirstInterfaceNumber, + _In_ USHORT NumberOfInterfaces, + _In_ UCHAR FunctionClass, + _In_ UCHAR FunctionSubClass, + _In_ UCHAR FunctionProtocol); #define USBC_DEVICE_CONFIGURATION_INTERFACE_VERSION_1 0x0001 @@ -190,7 +197,7 @@ typedef struct _USBC_DEVICE_CONFIGURATION_INTERFACE_V1 { PINTERFACE_REFERENCE InterfaceReference; PINTERFACE_DEREFERENCE InterfaceDereference; USBC_START_DEVICE_CALLBACK StartDeviceCallback; - USBC_PDO_ENABLE_CALLBACK PdoEnableCallback; + USBC_PDO_ENABLE_CALLBACK PdoEnableCallback; PVOID Reserved[7]; } USBC_DEVICE_CONFIGURATION_INTERFACE_V1, *PUSBC_DEVICE_CONFIGURATION_INTERFACE_V1; diff --git a/reactos/include/ddk/usbdlib.h b/reactos/include/ddk/usbdlib.h index 735420e9d4c..0a05d83ee70 100644 --- a/reactos/include/ddk/usbdlib.h +++ b/reactos/include/ddk/usbdlib.h @@ -114,109 +114,118 @@ typedef struct _USBD_INTERFACE_LIST_ENTRY { #ifndef _USBD_ +_IRQL_requires_max_(DISPATCH_LEVEL) DECLSPEC_IMPORT VOID NTAPI USBD_GetUSBDIVersion( - OUT PUSBD_VERSION_INFORMATION VersionInformation); + _Out_ PUSBD_VERSION_INFORMATION VersionInformation); DECLSPEC_IMPORT PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptor( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - IN UCHAR InterfaceNumber, - IN UCHAR AlternateSetting); + _In_ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + _In_ UCHAR InterfaceNumber, + _In_ UCHAR AlternateSetting); DECLSPEC_IMPORT PURB NTAPI USBD_CreateConfigurationRequest( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - OUT PUSHORT Siz); + _In_ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + _Out_ PUSHORT Siz); +_IRQL_requires_max_(APC_LEVEL) DECLSPEC_IMPORT PUSB_COMMON_DESCRIPTOR NTAPI USBD_ParseDescriptors( - IN PVOID DescriptorBuffer, - IN ULONG TotalLength, - IN PVOID StartPosition, - IN LONG DescriptorType); + _In_ PVOID DescriptorBuffer, + _In_ ULONG TotalLength, + _In_ PVOID StartPosition, + _In_ LONG DescriptorType); +_IRQL_requires_max_(APC_LEVEL) DECLSPEC_IMPORT PUSB_INTERFACE_DESCRIPTOR NTAPI USBD_ParseConfigurationDescriptorEx( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - IN PVOID StartPosition, - IN LONG InterfaceNumber, - IN LONG AlternateSetting, - IN LONG InterfaceClass, - IN LONG InterfaceSubClass, - IN LONG InterfaceProtocol); + _In_ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + _In_ PVOID StartPosition, + _In_ LONG InterfaceNumber, + _In_ LONG AlternateSetting, + _In_ LONG InterfaceClass, + _In_ LONG InterfaceSubClass, + _In_ LONG InterfaceProtocol); +_IRQL_requires_max_(DISPATCH_LEVEL) DECLSPEC_IMPORT PURB NTAPI USBD_CreateConfigurationRequestEx( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, - IN PUSBD_INTERFACE_LIST_ENTRY InterfaceList); + _In_ PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + _In_ PUSBD_INTERFACE_LIST_ENTRY InterfaceList); +_IRQL_requires_max_(PASSIVE_LEVEL) DECLSPEC_EXPORT ULONG NTAPI USBD_GetInterfaceLength( - IN PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, - IN PUCHAR BufferEnd); + _In_ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor, + _In_ PUCHAR BufferEnd); +_IRQL_requires_max_(PASSIVE_LEVEL) DECLSPEC_EXPORT VOID NTAPI USBD_RegisterHcFilter( - IN PDEVICE_OBJECT DeviceObject, - IN PDEVICE_OBJECT FilterDeviceObject); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PDEVICE_OBJECT FilterDeviceObject); +_IRQL_requires_max_(APC_LEVEL) DECLSPEC_EXPORT NTSTATUS NTAPI USBD_GetPdoRegistryParameter( - IN PDEVICE_OBJECT PhysicalDeviceObject, - IN OUT PVOID Parameter, - IN ULONG ParameterLength, - IN PWSTR KeyName, - IN ULONG KeyNameLength); + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _Inout_updates_bytes_(ParameterLength) PVOID Parameter, + _In_ ULONG ParameterLength, + _In_reads_bytes_(KeyNameLength) PWSTR KeyName, + _In_ ULONG KeyNameLength); DECLSPEC_EXPORT NTSTATUS NTAPI USBD_QueryBusTime( - IN PDEVICE_OBJECT RootHubPdo, - OUT PULONG CurrentFrame); + _In_ PDEVICE_OBJECT RootHubPdo, + _Out_ PULONG CurrentFrame); #if (NTDDI_VERSION >= NTDDI_WINXP) +_IRQL_requires_max_(DISPATCH_LEVEL) DECLSPEC_IMPORT ULONG NTAPI USBD_CalculateUsbBandwidth( - IN ULONG MaxPacketSize, - IN UCHAR EndpointType, - IN BOOLEAN LowSpeed); + _In_ ULONG MaxPacketSize, + _In_ UCHAR EndpointType, + _In_ BOOLEAN LowSpeed); #endif #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(DISPATCH_LEVEL) DECLSPEC_IMPORT USBD_STATUS NTAPI USBD_ValidateConfigurationDescriptor( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc, - IN ULONG BufferLength, - IN USHORT Level, - OUT PUCHAR *Offset, - IN ULONG Tag OPTIONAL); + _In_reads_bytes_(BufferLength) PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc, + _In_ ULONG BufferLength, + _In_ USHORT Level, + _Out_ PUCHAR *Offset, + _In_opt_ ULONG Tag); #endif diff --git a/reactos/include/ddk/usbscan.h b/reactos/include/ddk/usbscan.h index 718b13cad28..f522ad873bd 100644 --- a/reactos/include/ddk/usbscan.h +++ b/reactos/include/ddk/usbscan.h @@ -37,32 +37,32 @@ extern "C" { #define BULKIN_FLAG 0x80 typedef struct _DRV_VERSION { - OUT ULONG major; - OUT ULONG minor; - OUT ULONG internal; + _Out_ ULONG major; + _Out_ ULONG minor; + _Out_ ULONG internal; } DRV_VERSION, *PDRV_VERSION; typedef struct _IO_BLOCK { - IN ULONG uOffset; - IN ULONG uLength; - IN OUT PUCHAR pbyData; - IN ULONG uIndex; + _In_ ULONG uOffset; + _In_ ULONG uLength; + _Inout_updates_bytes_(uLength) PUCHAR pbyData; + _In_ ULONG uIndex; } IO_BLOCK, *PIO_BLOCK; typedef struct _IO_BLOCK_EX { - IN ULONG uOffset; - IN ULONG uLength; - IN OUT PUCHAR pbyData; - IN ULONG uIndex; - IN UCHAR bRequest; - IN UCHAR bmRequestType; - IN UCHAR fTransferDirectionIn; + _In_ ULONG uOffset; + _In_ ULONG uLength; + _Inout_updates_bytes_(uLength) PUCHAR pbyData; + _In_ ULONG uIndex; + _In_ UCHAR bRequest; + _In_ UCHAR bmRequestType; + _In_ UCHAR fTransferDirectionIn; } IO_BLOCK_EX, *PIO_BLOCK_EX; typedef struct _CHANNEL_INFO { - OUT ULONG EventChannelSize; - OUT ULONG uReadDataAlignment; - OUT ULONG uWriteDataAlignment; + _Out_ ULONG EventChannelSize; + _Out_ ULONG uReadDataAlignment; + _Out_ ULONG uWriteDataAlignment; }CHANNEL_INFO, *PCHANNEL_INFO; typedef enum _PIPE_TYPE { @@ -73,16 +73,16 @@ typedef enum _PIPE_TYPE { } PIPE_TYPE; typedef struct _USBSCAN_GET_DESCRIPTOR { - IN UCHAR DescriptorType; - IN UCHAR Index; - IN USHORT LanguageId; + _In_ UCHAR DescriptorType; + _In_ UCHAR Index; + _In_ USHORT LanguageId; } USBSCAN_GET_DESCRIPTOR, *PUSBSCAN_GET_DESCRIPTOR; typedef struct _DEVICE_DESCRIPTOR { - OUT USHORT usVendorId; - OUT USHORT usProductId; - OUT USHORT usBcdDevice; - OUT USHORT usLanguageId; + _Out_ USHORT usVendorId; + _Out_ USHORT usProductId; + _Out_ USHORT usBcdDevice; + _Out_ USHORT usLanguageId; } DEVICE_DESCRIPTOR, *PDEVICE_DESCRIPTOR; typedef enum _RAW_PIPE_TYPE { @@ -100,8 +100,8 @@ typedef struct _USBSCAN_PIPE_INFORMATION { } USBSCAN_PIPE_INFORMATION, *PUSBSCAN_PIPE_INFORMATION; typedef struct _USBSCAN_PIPE_CONFIGURATION { - OUT ULONG NumberOfPipes; - OUT USBSCAN_PIPE_INFORMATION PipeInfo[MAX_NUM_PIPES]; + _Out_ ULONG NumberOfPipes; + _Out_writes_(NumberOfPipes) USBSCAN_PIPE_INFORMATION PipeInfo[MAX_NUM_PIPES]; } USBSCAN_PIPE_CONFIGURATION, *PUSBSCAN_PIPE_CONFIGURATION; #if (NTDDI_VERSION >= NTDDI_WINXP) From cbc1c975e0d9eb7a239ce3ad8b4bc2471e617b8b Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 23 Jan 2012 16:49:52 +0000 Subject: [PATCH 051/289] [SMSS]: Add a new SMSS2 with the goal of having a Windows-compatible LPC API that will work with the new CSRSS that's already in the tree. So far, it launches the old SMSS and quits. svn path=/trunk/; revision=55123 --- reactos/base/system/CMakeLists.txt | 1 + reactos/base/system/smss2/CMakeLists.txt | 16 + reactos/base/system/smss2/smss.c | 327 +++++++++++++++++++++ reactos/base/system/smss2/smss.h | 7 + reactos/base/system/smss2/smss.rc | 4 + reactos/base/system/smss2/smss2.rbuild | 14 + reactos/base/system/system.rbuild | 3 + reactos/boot/bootdata/packages/reactos.dff | 1 + reactos/boot/bootdata/txtsetup.sif | 1 + reactos/ntoskrnl/ex/init.c | 2 +- 10 files changed, 375 insertions(+), 1 deletion(-) create mode 100644 reactos/base/system/smss2/CMakeLists.txt create mode 100644 reactos/base/system/smss2/smss.c create mode 100644 reactos/base/system/smss2/smss.h create mode 100644 reactos/base/system/smss2/smss.rc create mode 100644 reactos/base/system/smss2/smss2.rbuild diff --git a/reactos/base/system/CMakeLists.txt b/reactos/base/system/CMakeLists.txt index eb3d25b329a..7bd02413708 100644 --- a/reactos/base/system/CMakeLists.txt +++ b/reactos/base/system/CMakeLists.txt @@ -13,6 +13,7 @@ add_subdirectory(rundll32) add_subdirectory(runonce) add_subdirectory(services) add_subdirectory(smss) +add_subdirectory(smss2) add_subdirectory(subst) add_subdirectory(userinit) add_subdirectory(winlogon) diff --git a/reactos/base/system/smss2/CMakeLists.txt b/reactos/base/system/smss2/CMakeLists.txt new file mode 100644 index 00000000000..273e5c8c9b6 --- /dev/null +++ b/reactos/base/system/smss2/CMakeLists.txt @@ -0,0 +1,16 @@ + +include_directories(${REACTOS_SOURCE_DIR}/include/reactos/subsys) + +list(APPEND SOURCE + smss.c + smss.rc) + +add_executable(smss2 WIN32 ${SOURCE}) + +target_link_libraries(smss2 nt) + +add_pch(smss2 smss.h) + +set_module_type(smss2 nativecui) +add_importlibs(smss2 ntdll) +add_cd_file(TARGET smss2 DESTINATION reactos/system32 NO_CAB FOR all) diff --git a/reactos/base/system/smss2/smss.c b/reactos/base/system/smss2/smss.c new file mode 100644 index 00000000000..c880a174c8b --- /dev/null +++ b/reactos/base/system/smss2/smss.c @@ -0,0 +1,327 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: base/system/smss/smss.c + * PURPOSE: Main SMSS Code + * PROGRAMMERS: Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include "smss.h" +#define NDEBUG +#include "debug.h" + +/* GLOBALS ********************************************************************/ + +typedef struct _INIT_BUFFER +{ + WCHAR DebugBuffer[256]; + RTL_USER_PROCESS_INFORMATION ProcessInfo; +} INIT_BUFFER, *PINIT_BUFFER; + +/* NT Initial User Application */ +WCHAR NtInitialUserProcessBuffer[128] = L"\\SystemRoot\\System32\\smss.exe"; +ULONG NtInitialUserProcessBufferLength = sizeof(NtInitialUserProcessBuffer) - + sizeof(WCHAR); +ULONG NtInitialUserProcessBufferType = REG_SZ; + +UNICODE_STRING NtSystemRoot; + +/* FUNCTIONS ******************************************************************/ + +NTSTATUS +NTAPI +ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, + OUT PRTL_USER_PROCESS_PARAMETERS *ProcessParameters, + OUT PCHAR *ProcessEnvironment) +{ + NTSTATUS Status; + SIZE_T Size; + PWSTR p; + UNICODE_STRING NullString = RTL_CONSTANT_STRING(L""); + UNICODE_STRING SmssName, Environment, SystemDriveString, DebugString; + PVOID EnvironmentPtr = NULL; + PRTL_USER_PROCESS_INFORMATION ProcessInformation; + PRTL_USER_PROCESS_PARAMETERS ProcessParams = NULL; + + NullString.Length = sizeof(WCHAR); + + /* Use the initial buffer, after the strings */ + ProcessInformation = &InitBuffer->ProcessInfo; + + /* Allocate memory for the process parameters */ + Size = sizeof(*ProcessParams) + ((MAX_PATH * 6) * sizeof(WCHAR)); + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + (PVOID*)&ProcessParams, + 0, + &Size, + MEM_COMMIT, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + /* Failed, display error */ + p = InitBuffer->DebugBuffer; + _snwprintf(p, + 256 * sizeof(WCHAR), + L"INIT: Unable to allocate Process Parameters. 0x%lx", + Status); + RtlInitUnicodeString(&DebugString, p); + ZwDisplayString(&DebugString); + + /* Bugcheck the system */ + return Status; + } + + /* Setup the basic header, and give the process the low 1MB to itself */ + ProcessParams->Length = (ULONG)Size; + ProcessParams->MaximumLength = (ULONG)Size; + ProcessParams->Flags = RTL_USER_PROCESS_PARAMETERS_NORMALIZED | + RTL_USER_PROCESS_PARAMETERS_RESERVE_1MB; + + /* Allocate a page for the environment */ + Size = PAGE_SIZE; + Status = ZwAllocateVirtualMemory(NtCurrentProcess(), + &EnvironmentPtr, + 0, + &Size, + MEM_COMMIT, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + /* Failed, display error */ + p = InitBuffer->DebugBuffer; + _snwprintf(p, + 256 * sizeof(WCHAR), + L"INIT: Unable to allocate Process Environment. 0x%lx", + Status); + RtlInitUnicodeString(&DebugString, p); + ZwDisplayString(&DebugString); + + /* Bugcheck the system */ + return Status; + } + + /* Write the pointer */ + ProcessParams->Environment = EnvironmentPtr; + + /* Make a buffer for the DOS path */ + p = (PWSTR)(ProcessParams + 1); + ProcessParams->CurrentDirectory.DosPath.Buffer = p; + ProcessParams->CurrentDirectory.DosPath.MaximumLength = MAX_PATH * + sizeof(WCHAR); + + /* Copy the DOS path */ + RtlCopyUnicodeString(&ProcessParams->CurrentDirectory.DosPath, + &NtSystemRoot); + + /* Make a buffer for the DLL Path */ + p = (PWSTR)((PCHAR)ProcessParams->CurrentDirectory.DosPath.Buffer + + ProcessParams->CurrentDirectory.DosPath.MaximumLength); + ProcessParams->DllPath.Buffer = p; + ProcessParams->DllPath.MaximumLength = MAX_PATH * sizeof(WCHAR); + + /* Copy the DLL path and append the system32 directory */ + RtlCopyUnicodeString(&ProcessParams->DllPath, + &ProcessParams->CurrentDirectory.DosPath); + RtlAppendUnicodeToString(&ProcessParams->DllPath, L"\\System32"); + + /* Make a buffer for the image name */ + p = (PWSTR)((PCHAR)ProcessParams->DllPath.Buffer + + ProcessParams->DllPath.MaximumLength); + ProcessParams->ImagePathName.Buffer = p; + ProcessParams->ImagePathName.MaximumLength = MAX_PATH * sizeof(WCHAR); + + /* Make sure the buffer is a valid string which within the given length */ + if ((NtInitialUserProcessBufferType != REG_SZ) || + ((NtInitialUserProcessBufferLength != MAXULONG) && + ((NtInitialUserProcessBufferLength < sizeof(WCHAR)) || + (NtInitialUserProcessBufferLength > + sizeof(NtInitialUserProcessBuffer) - sizeof(WCHAR))))) + { + /* Invalid initial process string, bugcheck */ + return STATUS_INVALID_PARAMETER; + } + + /* Cut out anything after a space */ + p = NtInitialUserProcessBuffer; + while ((*p) && (*p != L' ')) p++; + + /* Set the image path length */ + ProcessParams->ImagePathName.Length = + (USHORT)((PCHAR)p - (PCHAR)NtInitialUserProcessBuffer); + + /* Copy the actual buffer */ + RtlCopyMemory(ProcessParams->ImagePathName.Buffer, + NtInitialUserProcessBuffer, + ProcessParams->ImagePathName.Length); + + /* Null-terminate it */ + ProcessParams->ImagePathName.Buffer[ProcessParams->ImagePathName.Length / + sizeof(WCHAR)] = UNICODE_NULL; + + /* Make a buffer for the command line */ + p = (PWSTR)((PCHAR)ProcessParams->ImagePathName.Buffer + + ProcessParams->ImagePathName.MaximumLength); + ProcessParams->CommandLine.Buffer = p; + ProcessParams->CommandLine.MaximumLength = MAX_PATH * sizeof(WCHAR); + + /* Add the image name to the command line */ + RtlAppendUnicodeToString(&ProcessParams->CommandLine, + NtInitialUserProcessBuffer); + + /* Create the environment string */ + RtlInitEmptyUnicodeString(&Environment, + ProcessParams->Environment, + (USHORT)Size); + + /* Append the DLL path to it */ + RtlAppendUnicodeToString(&Environment, L"Path=" ); + RtlAppendUnicodeStringToString(&Environment, &ProcessParams->DllPath); + RtlAppendUnicodeStringToString(&Environment, &NullString); + + /* Create the system drive string */ + SystemDriveString = NtSystemRoot; + SystemDriveString.Length = 2 * sizeof(WCHAR); + + /* Append it to the environment */ + RtlAppendUnicodeToString(&Environment, L"SystemDrive="); + RtlAppendUnicodeStringToString(&Environment, &SystemDriveString); + RtlAppendUnicodeStringToString(&Environment, &NullString); + + /* Append the system root to the environment */ + RtlAppendUnicodeToString(&Environment, L"SystemRoot="); + RtlAppendUnicodeStringToString(&Environment, &NtSystemRoot); + RtlAppendUnicodeStringToString(&Environment, &NullString); + + /* Create SMSS process */ + SmssName = ProcessParams->ImagePathName; + Status = RtlCreateUserProcess(&SmssName, + OBJ_CASE_INSENSITIVE, + RtlDeNormalizeProcessParams(ProcessParams), + NULL, + NULL, + NULL, + FALSE, + NULL, + NULL, + ProcessInformation); + if (!NT_SUCCESS(Status)) + { + /* Failed, display error */ + p = InitBuffer->DebugBuffer; + _snwprintf(p, + 256 * sizeof(WCHAR), + L"INIT: Unable to create Session Manager. 0x%lx", + Status); + RtlInitUnicodeString(&DebugString, p); + ZwDisplayString(&DebugString); + + /* Bugcheck the system */ + return Status; + } + + /* Resume the thread */ + Status = ZwResumeThread(ProcessInformation->ThreadHandle, NULL); + if (!NT_SUCCESS(Status)) + { + /* Failed, display error */ + p = InitBuffer->DebugBuffer; + _snwprintf(p, + 256 * sizeof(WCHAR), + L"INIT: Unable to resume Session Manager. 0x%lx", + Status); + RtlInitUnicodeString(&DebugString, p); + ZwDisplayString(&DebugString); + + /* Bugcheck the system */ + return Status; + } + + /* Return success */ + *ProcessParameters = ProcessParams; + *ProcessEnvironment = EnvironmentPtr; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +LaunchOldSmss(VOID) +{ + PINIT_BUFFER InitBuffer; + PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL; + PRTL_USER_PROCESS_INFORMATION ProcessInfo; + LARGE_INTEGER Timeout; + NTSTATUS Status; + PCHAR Environment; + SIZE_T Size; + + /* Setup system root */ + RtlInitUnicodeString(&NtSystemRoot, SharedUserData->NtSystemRoot); + + /* Allocate the initialization buffer */ + InitBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(INIT_BUFFER)); + if (!InitBuffer) + { + /* Bugcheck */ + return STATUS_NO_MEMORY; + } + + /* Launch initial process */ + ProcessInfo = &InitBuffer->ProcessInfo; + Status = ExpLoadInitialProcess(InitBuffer, &ProcessParameters, &Environment); + if (!NT_SUCCESS(Status)) + { + /* Failed, display error */ + DPRINT1("INIT: Session Manager failed to load.\n"); + return Status; + } + + /* Wait 5 seconds for initial process to initialize */ + Timeout.QuadPart = Int32x32To64(5, -10000000); + Status = ZwWaitForSingleObject(ProcessInfo->ProcessHandle, FALSE, &Timeout); + if (Status == STATUS_SUCCESS) + { + /* Failed, display error */ + DPRINT1("INIT: Session Manager terminated.\n"); + return STATUS_UNSUCCESSFUL; + } + + /* Close process handles */ + ZwClose(ProcessInfo->ThreadHandle); + ZwClose(ProcessInfo->ProcessHandle); + + /* Free the initial process environment */ + Size = 0; + ZwFreeVirtualMemory(NtCurrentProcess(), + (PVOID*)&Environment, + &Size, + MEM_RELEASE); + + /* Free the initial process parameters */ + Size = 0; + ZwFreeVirtualMemory(NtCurrentProcess(), + (PVOID*)&ProcessParameters, + &Size, + MEM_RELEASE); + return STATUS_SUCCESS; +} + +NTSTATUS +__cdecl +_main(IN INT argc, + IN PCHAR argv[], + IN PCHAR envp[], + IN ULONG DebugFlag) +{ + NTSTATUS Status; + + /* Launch the original SMSS */ + DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); + Status = LaunchOldSmss(); + + /* Terminate this SMSS for now, later we'll have an LPC thread running */ + return NtTerminateThread(NtCurrentThread(), Status); +} + +/* EOF */ diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h new file mode 100644 index 00000000000..8244485148a --- /dev/null +++ b/reactos/base/system/smss2/smss.h @@ -0,0 +1,7 @@ +#pragma once + +#define WIN32_NO_STATUS +#include +#define NTOS_MODE_USER +#include + diff --git a/reactos/base/system/smss2/smss.rc b/reactos/base/system/smss2/smss.rc new file mode 100644 index 00000000000..98ad190bcf7 --- /dev/null +++ b/reactos/base/system/smss2/smss.rc @@ -0,0 +1,4 @@ +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Session Manager\0" +#define REACTOS_STR_INTERNAL_NAME "smss\0" +#define REACTOS_STR_ORIGINAL_FILENAME "smss.exe\0" +#include diff --git a/reactos/base/system/smss2/smss2.rbuild b/reactos/base/system/smss2/smss2.rbuild new file mode 100644 index 00000000000..a48cc561d3a --- /dev/null +++ b/reactos/base/system/smss2/smss2.rbuild @@ -0,0 +1,14 @@ + + + + + . + include/reactos/subsys + nt + ntdll + smss.h + + smss.c + + smss.rc + diff --git a/reactos/base/system/system.rbuild b/reactos/base/system/system.rbuild index 885021ceab3..dd34b387646 100644 --- a/reactos/base/system/system.rbuild +++ b/reactos/base/system/system.rbuild @@ -40,6 +40,9 @@ + + + diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index 22127862008..a9aba361659 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -128,6 +128,7 @@ base\system\rundll32\rundll32.exe 1 base\system\runonce\runonce.exe 1 base\system\services\services.exe 1 base\system\smss\smss.exe 1 +base\system\smss2\smss2.exe 1 base\system\userinit\userinit.exe 1 base\system\winlogon\winlogon.exe 1 diff --git a/reactos/boot/bootdata/txtsetup.sif b/reactos/boot/bootdata/txtsetup.sif index 1c0ca8d0dca..1b7f1c771c8 100644 --- a/reactos/boot/bootdata/txtsetup.sif +++ b/reactos/boot/bootdata/txtsetup.sif @@ -48,6 +48,7 @@ pcix.sys=,,,,,,,,,,,,4 pcmcia.sys=,,,,,,,,,,,,4 swenum.sys=,,,,,,,,,,,,4 ntdll.dll=,,,,,,,,,,,,2 +smss2.exe=,,,,,,,,,,,,2 [HardwareIdsDatabase] ;*PNP0A00 = isapnp diff --git a/reactos/ntoskrnl/ex/init.c b/reactos/ntoskrnl/ex/init.c index 90c2bfac79e..5b16e200fdb 100644 --- a/reactos/ntoskrnl/ex/init.c +++ b/reactos/ntoskrnl/ex/init.c @@ -66,7 +66,7 @@ BOOLEAN InitIsWinPEMode, InitWinPEModeType; UNICODE_STRING NtSystemRoot; /* NT Initial User Application */ -WCHAR NtInitialUserProcessBuffer[128] = L"\\SystemRoot\\System32\\smss.exe"; +WCHAR NtInitialUserProcessBuffer[128] = L"\\SystemRoot\\System32\\smss2.exe"; ULONG NtInitialUserProcessBufferLength = sizeof(NtInitialUserProcessBuffer) - sizeof(WCHAR); ULONG NtInitialUserProcessBufferType = REG_SZ; From d870b715ea9d1b2c40e41c319636aa3901278781 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 17:02:51 +0000 Subject: [PATCH 052/289] [SMSS2] * Fix build. svn path=/trunk/; revision=55124 --- reactos/base/system/smss2/smss.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index 8244485148a..9fc8944ded7 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -1,7 +1,4 @@ -#pragma once - #define WIN32_NO_STATUS #include #define NTOS_MODE_USER #include - From a4743290194a09a671a79148b074315cbfe3bc4c Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 19:07:50 +0000 Subject: [PATCH 053/289] [DDK] * Update hidclass.h and hubbusif.h annotations. svn path=/trunk/; revision=55125 --- reactos/include/ddk/hidclass.h | 15 +- reactos/include/ddk/hubbusif.h | 466 +++++++++++++++++---------------- 2 files changed, 245 insertions(+), 236 deletions(-) diff --git a/reactos/include/ddk/hidclass.h b/reactos/include/ddk/hidclass.h index c93bfb4a525..69975003693 100644 --- a/reactos/include/ddk/hidclass.h +++ b/reactos/include/ddk/hidclass.h @@ -98,13 +98,16 @@ enum DeviceObjectState { DeviceObjectRemoved }; -typedef VOID (NTAPI *PHID_STATUS_CHANGE)( - PVOID Context, - enum DeviceObjectState State); +typedef VOID +(NTAPI *PHID_STATUS_CHANGE)( + _In_ PVOID Context, + _In_ enum DeviceObjectState State); -typedef NTSTATUS (NTAPI *PHIDP_GETCAPS)( - IN PHIDP_PREPARSED_DATA PreparsedData, - OUT PHIDP_CAPS Capabilities); +_Must_inspect_result_ +typedef NTSTATUS +(NTAPI *PHIDP_GETCAPS)( + _In_ PHIDP_PREPARSED_DATA PreparsedData, + _Out_ PHIDP_CAPS Capabilities); typedef struct _HID_COLLECTION_INFORMATION { ULONG DescriptorSize; diff --git a/reactos/include/ddk/hubbusif.h b/reactos/include/ddk/hubbusif.h index be7b12e6b48..bc089d8e2c4 100644 --- a/reactos/include/ddk/hubbusif.h +++ b/reactos/include/ddk/hubbusif.h @@ -32,15 +32,15 @@ typedef struct _ROOTHUB_PDO_EXTENSION { #define USB_IDLE_NOT_READY 0 #define USB_IDLE_READY 1 -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_CREATE_USB_DEVICE) +typedef NTSTATUS USB_BUSIFFN USB_BUSIFFN_CREATE_USB_DEVICE ( - IN PVOID BusContext, - OUT PUSB_DEVICE_HANDLE *NewDeviceHandle, - IN PUSB_DEVICE_HANDLE HubDeviceHandle, - IN USHORT PortStatus, - IN USHORT PortNumber); + _In_ PVOID BusContext, + _Outptr_ PUSB_DEVICE_HANDLE *NewDeviceHandle, + _In_ PUSB_DEVICE_HANDLE HubDeviceHandle, + _In_ USHORT PortStatus, + _In_ USHORT PortNumber); typedef USB_BUSIFFN_CREATE_USB_DEVICE *PUSB_BUSIFFN_CREATE_USB_DEVICE; typedef enum _USBPORT_CREATEDEV_ERROR { @@ -63,17 +63,17 @@ typedef struct _USB_CD_ERROR_INFORMATION { UCHAR XtraInfo[64]; } USB_CD_ERROR_INFORMATION, *PUSB_CD_ERROR_INFORMATION; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_CREATE_USB_DEVICE_EX) +typedef NTSTATUS USB_BUSIFFN USB_BUSIFFN_CREATE_USB_DEVICE_EX ( - IN PVOID BusContext, - OUT PUSB_DEVICE_HANDLE *NewDeviceHandle, - IN PUSB_DEVICE_HANDLE HsHubDeviceHandle, - IN USHORT PortStatus, - IN USHORT PortNumber, - OUT PUSB_CD_ERROR_INFORMATION CdErrorInfo, - IN USHORT TtPortNumber); + _In_ PVOID BusContext, + _Outptr_ PUSB_DEVICE_HANDLE *NewDeviceHandle, + _In_ PUSB_DEVICE_HANDLE HsHubDeviceHandle, + _In_ USHORT PortStatus, + _In_ USHORT PortNumber, + _Out_ PUSB_CD_ERROR_INFORMATION CdErrorInfo, + _In_ USHORT TtPortNumber); typedef USB_BUSIFFN_CREATE_USB_DEVICE_EX *PUSB_BUSIFFN_CREATE_USB_DEVICE_EX; typedef struct _USB_PORT_PATH { @@ -81,19 +81,19 @@ typedef struct _USB_PORT_PATH { ULONG PortPath[6]; } USB_PORT_PATH, *PUSB_PORT_PATH; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_CREATE_USB_DEVICE_V7) +typedef NTSTATUS USB_BUSIFFN USB_BUSIFFN_CREATE_USB_DEVICE_V7 ( - IN PVOID BusContext, - OUT PUSB_DEVICE_HANDLE *NewDeviceHandle, - IN PUSB_DEVICE_HANDLE HsHubDeviceHandle, - IN USHORT PortStatus, - IN PUSB_PORT_PATH PortPath, - OUT PUSB_CD_ERROR_INFORMATION CdErrorInfo, - IN USHORT TtPortNumber, - IN PDEVICE_OBJECT PdoDeviceObject, - IN PUNICODE_STRING PhysicalDeviceObjectName); + _In_ PVOID BusContext, + _Outptr_ PUSB_DEVICE_HANDLE *NewDeviceHandle, + _In_ PUSB_DEVICE_HANDLE HsHubDeviceHandle, + _In_ USHORT PortStatus, + _In_ PUSB_PORT_PATH PortPath, + _Out_ PUSB_CD_ERROR_INFORMATION CdErrorInfo, + _In_ USHORT TtPortNumber, + _In_ PDEVICE_OBJECT PdoDeviceObject, + _In_ PUNICODE_STRING PhysicalDeviceObjectName); typedef USB_BUSIFFN_CREATE_USB_DEVICE_V7 *PUSB_BUSIFFN_CREATE_USB_DEVICE_V7; typedef enum _USBPORT_INITDEV_ERROR { @@ -113,300 +113,306 @@ typedef struct _USB_ID_ERROR_INFORMATION { UCHAR XtraInfo[64]; } USB_ID_ERROR_INFORMATION, *PUSB_ID_ERROR_INFORMATION; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_INITIALIZE_USB_DEVICE) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_INITIALIZE_USB_DEVICE ( - IN PVOID BusContext, - IN OUT PUSB_DEVICE_HANDLE DeviceHandle); +USB_BUSIFFN_INITIALIZE_USB_DEVICE( + _In_ PVOID BusContext, + _Inout_ PUSB_DEVICE_HANDLE DeviceHandle); typedef USB_BUSIFFN_INITIALIZE_USB_DEVICE *PUSB_BUSIFFN_INITIALIZE_USB_DEVICE; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX ( - IN PVOID BusContext, - IN OUT PUSB_DEVICE_HANDLE DeviceHandle, - OUT PUSB_ID_ERROR_INFORMATION IdErrInfo); +USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX( + _In_ PVOID BusContext, + _Inout_ PUSB_DEVICE_HANDLE DeviceHandle, + _Out_ PUSB_ID_ERROR_INFORMATION IdErrInfo); typedef USB_BUSIFFN_INITIALIZE_USB_DEVICE_EX *PUSB_BUSIFFN_INITIALIZE_USB_DEVICE_EX; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_REMOVE_USB_DEVICE) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_REMOVE_USB_DEVICE ( - IN PVOID BusContext, - IN OUT PUSB_DEVICE_HANDLE DeviceHandle, - IN ULONG Flags); +USB_BUSIFFN_REMOVE_USB_DEVICE( + _In_ PVOID BusContext, + _Inout_ PUSB_DEVICE_HANDLE DeviceHandle, + _In_ ULONG Flags); typedef USB_BUSIFFN_REMOVE_USB_DEVICE *PUSB_BUSIFFN_REMOVE_USB_DEVICE; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_GET_USB_DESCRIPTORS) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_GET_USB_DESCRIPTORS ( - IN PVOID BusContext, - IN OUT PUSB_DEVICE_HANDLE DeviceHandle, - OUT PUCHAR DeviceDescriptorBuffer, - IN OUT PULONG DeviceDescriptorBufferLength, - OUT PUCHAR ConfigDescriptorBuffer, - IN OUT PULONG ConfigDescriptorBufferLength); +USB_BUSIFFN_GET_USB_DESCRIPTORS( + _In_ PVOID BusContext, + _Inout_ PUSB_DEVICE_HANDLE DeviceHandle, + _Out_writes_bytes_to_(*DeviceDescriptorBufferLength,*DeviceDescriptorBufferLength) + PUCHAR DeviceDescriptorBuffer, + _Inout_ PULONG DeviceDescriptorBufferLength, + _Out_writes_bytes_to_(*ConfigDescriptorBufferLength, *ConfigDescriptorBufferLength) + PUCHAR ConfigDescriptorBuffer, + _Inout_ PULONG ConfigDescriptorBufferLength); typedef USB_BUSIFFN_GET_USB_DESCRIPTORS *PUSB_BUSIFFN_GET_USB_DESCRIPTORS; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_RESTORE_DEVICE) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_RESTORE_DEVICE ( - IN PVOID BusContext, - IN OUT PUSB_DEVICE_HANDLE OldDeviceHandle, - IN OUT PUSB_DEVICE_HANDLE NewDeviceHandle); +USB_BUSIFFN_RESTORE_DEVICE( + _In_ PVOID BusContext, + _Inout_ PUSB_DEVICE_HANDLE OldDeviceHandle, + _Inout_ PUSB_DEVICE_HANDLE NewDeviceHandle); typedef USB_BUSIFFN_RESTORE_DEVICE *PUSB_BUSIFFN_RESTORE_DEVICE; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_GET_POTRTHACK_FLAGS) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_GET_POTRTHACK_FLAGS ( - IN PVOID BusContext, - IN OUT PULONG Flags); +USB_BUSIFFN_GET_POTRTHACK_FLAGS( + _In_ PVOID BusContext, + _Inout_ PULONG Flags); typedef USB_BUSIFFN_GET_POTRTHACK_FLAGS *PUSB_BUSIFFN_GET_POTRTHACK_FLAGS; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_GET_DEVICE_INFORMATION) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_GET_DEVICE_INFORMATION ( - IN PVOID BusContext, - IN PUSB_DEVICE_HANDLE DeviceHandle, - OUT PVOID DeviceInformationBuffer, - IN ULONG DeviceInformationBufferLength, - IN OUT PULONG LengthOfDataCopied); +USB_BUSIFFN_GET_DEVICE_INFORMATION( + _In_ PVOID BusContext, + _In_ PUSB_DEVICE_HANDLE DeviceHandle, + _Out_writes_bytes_to_(DeviceInformationBufferLength,*LengthOfDataCopied) + PVOID DeviceInformationBuffer, + _In_ ULONG DeviceInformationBufferLength, + _Inout_ PULONG LengthOfDataCopied); typedef USB_BUSIFFN_GET_DEVICE_INFORMATION *PUSB_BUSIFFN_GET_DEVICE_INFORMATION; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_GET_CONTROLLER_INFORMATION) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_GET_CONTROLLER_INFORMATION ( - IN PVOID BusContext, - IN OUT PVOID ControllerInformationBuffer, - IN ULONG ControllerInformationBufferLength, - IN OUT PULONG LengthOfDataCopied); +USB_BUSIFFN_GET_CONTROLLER_INFORMATION( + _In_ PVOID BusContext, + _Inout_updates_bytes_to_(ControllerInformationBufferLength, *LengthOfDataCopied) + PVOID ControllerInformationBuffer, + _In_ ULONG ControllerInformationBufferLength, + _Inout_ PULONG LengthOfDataCopied); typedef USB_BUSIFFN_GET_CONTROLLER_INFORMATION *PUSB_BUSIFFN_GET_CONTROLLER_INFORMATION; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND ( - IN PVOID BusContext, - IN BOOLEAN Enable); +USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND( + _In_ PVOID BusContext, + _In_ BOOLEAN Enable); typedef USB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND *PUSB_BUSIFFN_CONTROLLER_SELECTIVE_SUSPEND; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_GET_EXTENDED_HUB_INFO) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_GET_EXTENDED_HUB_INFO ( - IN PVOID BusContext, - IN PDEVICE_OBJECT HubPhysicalDeviceObject, - IN PVOID HubInformationBuffer, - IN ULONG HubInformationBufferLength, - OUT PULONG LengthOfDataCopied); +USB_BUSIFFN_GET_EXTENDED_HUB_INFO( + _In_ PVOID BusContext, + _In_ PDEVICE_OBJECT HubPhysicalDeviceObject, + _Inout_updates_bytes_to_(HubInformationBufferLength, *LengthOfDataCopied) + PVOID HubInformationBuffer, + _In_ ULONG HubInformationBufferLength, + _Out_ PULONG LengthOfDataCopied); typedef USB_BUSIFFN_GET_EXTENDED_HUB_INFO *PUSB_BUSIFFN_GET_EXTENDED_HUB_INFO; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_GET_ROOTHUB_SYM_NAME) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_GET_ROOTHUB_SYM_NAME ( - IN PVOID BusContext, - IN PVOID HubSymNameBuffer, - IN ULONG HubSymNameBufferLength, - OUT PULONG HubSymNameActualLength); +USB_BUSIFFN_GET_ROOTHUB_SYM_NAME( + _In_ PVOID BusContext, + _Inout_updates_bytes_to_(HubSymNameBufferLength, *HubSymNameActualLength) PVOID HubSymNameBuffer, + _In_ ULONG HubSymNameBufferLength, + _Out_ PULONG HubSymNameActualLength); typedef USB_BUSIFFN_GET_ROOTHUB_SYM_NAME *PUSB_BUSIFFN_GET_ROOTHUB_SYM_NAME; -typedef -PVOID +_Function_class_(USB_BUSIFFN_GET_DEVICE_BUSCONTEXT) +typedef PVOID USB_BUSIFFN -USB_BUSIFFN_GET_DEVICE_BUSCONTEXT ( - IN PVOID HubBusContext, - IN PVOID DeviceHandle); +USB_BUSIFFN_GET_DEVICE_BUSCONTEXT( + _In_ PVOID HubBusContext, + _In_ PVOID DeviceHandle); typedef USB_BUSIFFN_GET_DEVICE_BUSCONTEXT *PUSB_BUSIFFN_GET_DEVICE_BUSCONTEXT; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_INITIALIZE_20HUB) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_INITIALIZE_20HUB ( - IN PVOID BusContext, - IN PUSB_DEVICE_HANDLE HubDeviceHandle, - IN ULONG TtCount); +USB_BUSIFFN_INITIALIZE_20HUB( + _In_ PVOID BusContext, + _In_ PUSB_DEVICE_HANDLE HubDeviceHandle, + _In_ ULONG TtCount); typedef USB_BUSIFFN_INITIALIZE_20HUB *PUSB_BUSIFFN_INITIALIZE_20HUB; -typedef -BOOLEAN +_Function_class_(USB_BUSIFFN_IS_ROOT) +typedef BOOLEAN USB_BUSIFFN -USB_BUSIFFN_IS_ROOT ( - IN PVOID BusContext, - IN PVOID DeviceObject); +USB_BUSIFFN_IS_ROOT( + _In_ PVOID BusContext, + _In_ PVOID DeviceObject); typedef USB_BUSIFFN_IS_ROOT *PUSB_BUSIFFN_IS_ROOT; -typedef -VOID +_Function_class_(USB_BUSIFFN_ACQUIRE_SEMAPHORE) +typedef VOID USB_BUSIFFN -USB_BUSIFFN_ACQUIRE_SEMAPHORE ( - IN PVOID BusContext); +USB_BUSIFFN_ACQUIRE_SEMAPHORE( + _In_ PVOID BusContext); typedef USB_BUSIFFN_ACQUIRE_SEMAPHORE *PUSB_BUSIFFN_ACQUIRE_SEMAPHORE; -typedef -VOID +_Function_class_(USB_BUSIFFN_RELEASE_SEMAPHORE) +typedef VOID USB_BUSIFFN -USB_BUSIFFN_RELEASE_SEMAPHORE ( - IN PVOID BusContext); +USB_BUSIFFN_RELEASE_SEMAPHORE( + _In_ PVOID BusContext); typedef USB_BUSIFFN_RELEASE_SEMAPHORE *PUSB_BUSIFFN_RELEASE_SEMAPHORE; -typedef -VOID +_Function_class_(RH_INIT_CALLBACK) +typedef VOID __stdcall -RH_INIT_CALLBACK ( - IN PVOID CallBackContext); +RH_INIT_CALLBACK( + _In_ PVOID CallBackContext); typedef RH_INIT_CALLBACK *PRH_INIT_CALLBACK; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_ROOTHUB_INIT_NOTIFY) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_ROOTHUB_INIT_NOTIFY ( - IN PVOID BusContext, - IN PVOID CallbackContext, - IN PRH_INIT_CALLBACK CallbackRoutine); +USB_BUSIFFN_ROOTHUB_INIT_NOTIFY( + _In_ PVOID BusContext, + _In_ PVOID CallbackContext, + _In_ PRH_INIT_CALLBACK CallbackRoutine); typedef USB_BUSIFFN_ROOTHUB_INIT_NOTIFY *PUSB_BUSIFFN_ROOTHUB_INIT_NOTIFY; -typedef -VOID +_Function_class_(USB_BUSIFFN_FLUSH_TRANSFERS) +typedef VOID USB_BUSIFFN -USB_BUSIFFN_FLUSH_TRANSFERS ( - IN PVOID BusContext, - IN PVOID DeviceHandle); +USB_BUSIFFN_FLUSH_TRANSFERS( + _In_ PVOID BusContext, + _In_ PVOID DeviceHandle); typedef USB_BUSIFFN_FLUSH_TRANSFERS *PUSB_BUSIFFN_FLUSH_TRANSFERS; -typedef -ULONG +_Function_class_(USB_BUSIFFN_CALC_PIPE_BANDWIDTH) +typedef ULONG USB_BUSIFFN -USB_BUSIFFN_CALC_PIPE_BANDWIDTH ( - IN PVOID BusContext, - IN PUSBD_PIPE_INFORMATION PipeInfo, - IN USB_DEVICE_SPEED DeviceSpeed); +USB_BUSIFFN_CALC_PIPE_BANDWIDTH( + _In_ PVOID BusContext, + _In_ PUSBD_PIPE_INFORMATION PipeInfo, + _In_ USB_DEVICE_SPEED DeviceSpeed); typedef USB_BUSIFFN_CALC_PIPE_BANDWIDTH *PUSB_BUSIFFN_CALC_PIPE_BANDWIDTH; -typedef -VOID +_Function_class_(USB_BUSIFFN_SET_BUS_WAKE_MODE) +typedef VOID USB_BUSIFFN -USB_BUSIFFN_SET_BUS_WAKE_MODE ( - IN PVOID BusContext, - IN ULONG Mode); +USB_BUSIFFN_SET_BUS_WAKE_MODE( + _In_ PVOID BusContext, + _In_ ULONG Mode); typedef USB_BUSIFFN_SET_BUS_WAKE_MODE *PUSB_BUSIFFN_SET_BUS_WAKE_MODE; -typedef -VOID +_Function_class_(USB_BUSIFFN_SET_DEVICE_FLAG) +typedef VOID USB_BUSIFFN -USB_BUSIFFN_SET_DEVICE_FLAG ( - IN PVOID BusContext, - IN GUID *DeviceFlagGuid, - IN PVOID ValueData, - IN ULONG ValueLength); +USB_BUSIFFN_SET_DEVICE_FLAG( + _In_ PVOID BusContext, + _In_ GUID *DeviceFlagGuid, + _In_ PVOID ValueData, + _In_ ULONG ValueLength); typedef USB_BUSIFFN_SET_DEVICE_FLAG *PUSB_BUSIFFN_SET_DEVICE_FLAG; -typedef -VOID +_Function_class_(USB_BUSIFFN_SET_DEVHANDLE_DATA) +typedef VOID USB_BUSIFFN -USB_BUSIFFN_SET_DEVHANDLE_DATA ( - IN PVOID BusContext, - IN PVOID DeviceHandle, - IN PDEVICE_OBJECT UsbDevicePdo); +USB_BUSIFFN_SET_DEVHANDLE_DATA( + _In_ PVOID BusContext, + _In_ PVOID DeviceHandle, + _In_ PDEVICE_OBJECT UsbDevicePdo); typedef USB_BUSIFFN_SET_DEVHANDLE_DATA *PUSB_BUSIFFN_SET_DEVHANDLE_DATA; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_TEST_POINT) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_TEST_POINT ( - IN PVOID BusContext, - IN PVOID DeviceHandle, - IN ULONG Opcode, - IN PVOID TestData); +USB_BUSIFFN_TEST_POINT( + _In_ PVOID BusContext, + _In_ PVOID DeviceHandle, + _In_ ULONG Opcode, + _In_ PVOID TestData); typedef USB_BUSIFFN_TEST_POINT *PUSB_BUSIFFN_TEST_POINT; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO ( - IN PVOID BusContext, - IN PUSB_DEVICE_HANDLE DeviceHandle, - OUT PVOID DeviceInformationBuffer, - IN ULONG DeviceInformationBufferLength, - IN OUT PULONG LengthOfDataCopied); +USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO( + _In_ PVOID BusContext, + _In_ PUSB_DEVICE_HANDLE DeviceHandle, + _Out_writes_bytes_to_(DeviceInformationBufferLength,*LengthOfDataCopied) + PVOID DeviceInformationBuffer, + _In_ ULONG DeviceInformationBufferLength, + _Inout_ PULONG LengthOfDataCopied); typedef USB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO *PUSB_BUSIFFN_GET_DEVICE_PERFORMANCE_INFO; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_WAIT_ASYNC_POWERUP) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_WAIT_ASYNC_POWERUP ( - IN PVOID BusContext); +USB_BUSIFFN_WAIT_ASYNC_POWERUP( + _In_ PVOID BusContext); typedef USB_BUSIFFN_WAIT_ASYNC_POWERUP *PUSB_BUSIFFN_WAIT_ASYNC_POWERUP; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_GET_DEVICE_ADDRESS) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_GET_DEVICE_ADDRESS ( - IN PVOID BusContext, - IN PUSB_DEVICE_HANDLE DeviceHandle, - OUT PUSHORT DeviceAddress); +USB_BUSIFFN_GET_DEVICE_ADDRESS( + _In_ PVOID BusContext, + _In_ PUSB_DEVICE_HANDLE DeviceHandle, + _Out_ PUSHORT DeviceAddress); typedef USB_BUSIFFN_GET_DEVICE_ADDRESS *PUSB_BUSIFFN_GET_DEVICE_ADDRESS; -typedef -VOID +_Function_class_(USB_BUSIFFN_DEREF_DEVICE_HANDLE) +typedef VOID USB_BUSIFFN -USB_BUSIFFN_DEREF_DEVICE_HANDLE ( - IN PVOID BusContext, - IN PUSB_DEVICE_HANDLE DeviceHandle, - IN PVOID Object, - IN ULONG Tag); +USB_BUSIFFN_DEREF_DEVICE_HANDLE( + _In_ PVOID BusContext, + _In_ PUSB_DEVICE_HANDLE DeviceHandle, + _In_ PVOID Object, + _In_ ULONG Tag); typedef USB_BUSIFFN_DEREF_DEVICE_HANDLE *PUSB_BUSIFFN_DEREF_DEVICE_HANDLE; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_REF_DEVICE_HANDLE) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_REF_DEVICE_HANDLE ( - IN PVOID BusContext, - IN PUSB_DEVICE_HANDLE DeviceHandle, - IN PVOID Object, - IN ULONG Tag); +USB_BUSIFFN_REF_DEVICE_HANDLE( + _In_ PVOID BusContext, + _In_ PUSB_DEVICE_HANDLE DeviceHandle, + _In_ PVOID Object, + _In_ ULONG Tag); typedef USB_BUSIFFN_REF_DEVICE_HANDLE *PUSB_BUSIFFN_REF_DEVICE_HANDLE; -typedef -ULONG +_Function_class_(USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE) +typedef ULONG USB_BUSIFFN -USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE ( - IN PVOID BusContext, - IN PUSB_DEVICE_HANDLE DeviceHandle, - IN ULONG NewIdleReadyState); +USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE( + _In_ PVOID BusContext, + _In_ PUSB_DEVICE_HANDLE DeviceHandle, + _In_ ULONG NewIdleReadyState); typedef USB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE *PUSB_BUSIFFN_SET_DEVICE_HANDLE_IDLE_READY_STATE; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT ( - IN PVOID BusContext, - IN USHORT PortNumber, - OUT LPGUID ContainerId); +USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT( + _In_ PVOID BusContext, + _In_ USHORT PortNumber, + _Out_ LPGUID ContainerId); typedef USB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT *PUSB_BUSIFFN_GET_CONTAINER_ID_FOR_PORT; -typedef -VOID +_Function_class_(USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT) +typedef VOID USB_BUSIFFN -USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT ( - IN PVOID BusContext, - IN USHORT PortNumber, - IN LPGUID ContainerId); +USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT( + _In_ PVOID BusContext, + _In_ USHORT PortNumber, + _In_ LPGUID ContainerId); typedef USB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT *PUSB_BUSIFFN_SET_CONTAINER_ID_FOR_PORT; -typedef -NTSTATUS +_Function_class_(USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES) +typedef NTSTATUS USB_BUSIFFN -USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES ( - IN PVOID BusContext, - IN PUSB_DEVICE_HANDLE DeviceHandle); +USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES( + _In_ PVOID BusContext, + _In_ PUSB_DEVICE_HANDLE DeviceHandle); typedef USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES *PUSB_BUSIFFN_ABORT_ALL_DEVICE_PIPES; #define ERRATA_FLAG_RESET_TT_ON_CANCEL 1 @@ -425,13 +431,13 @@ typedef USB_BUSIFFN_ABORT_ALL_DEVICE_PIPES *PUSB_BUSIFFN_ABORT_ALL_DEVICE_PIPES; #define USB_BUSIF_HUB_SS_VERSION_0 0x0000 -typedef -VOID +_Function_class_(USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG) +typedef VOID USB_BUSIFFN -USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG ( - IN PVOID BusContext, - IN PUSB_DEVICE_HANDLE DeviceHandle, - IN ULONG DeviceErrataFlag); +USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG( + _In_ PVOID BusContext, + _In_ PUSB_DEVICE_HANDLE DeviceHandle, + _In_ ULONG DeviceErrataFlag); typedef USB_BUSIFFN_SET_DEVICE_ERRATA_FLAG *PUSB_BUSIFFN_SET_DEVICE_ERRATA_FLAG; DEFINE_GUID(USB_BUS_INTERFACE_HUB_GUID, From 312f5bfd313ae694bd6c99a605f71847ae5de8b0 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 19:12:00 +0000 Subject: [PATCH 054/289] [PSDK] * Update winsock2.h annotations. svn path=/trunk/; revision=55126 --- reactos/include/psdk/winsock2.h | 1385 ++++++++++++++++--------------- 1 file changed, 702 insertions(+), 683 deletions(-) diff --git a/reactos/include/psdk/winsock2.h b/reactos/include/psdk/winsock2.h index 537f31c1096..77cb8733f45 100644 --- a/reactos/include/psdk/winsock2.h +++ b/reactos/include/psdk/winsock2.h @@ -774,7 +774,11 @@ typedef struct _WSACOMPLETION { typedef struct _BLOB { ULONG cbSize; - BYTE *pBlobData; +#ifdef MIDL_PASS + [size_is(cbSize)] BYTE *pBlobData; +#else + _Field_size_bytes_(cbSize) BYTE *pBlobData ; +#endif } BLOB,*PBLOB,*LPBLOB; #endif /* _tagBLOB_DEFINED */ @@ -806,16 +810,17 @@ typedef struct _WSAQuerySetA { LPGUID lpNSProviderId; LPSTR lpszContext; DWORD dwNumberOfProtocols; - LPAFPROTOCOLS lpafpProtocols; + _Field_size_(dwNumberOfProtocols) LPAFPROTOCOLS lpafpProtocols; LPSTR lpszQueryString; DWORD dwNumberOfCsAddrs; - LPCSADDR_INFO lpcsaBuffer; + _Field_size_(dwNumberOfCsAddrs) LPCSADDR_INFO lpcsaBuffer; DWORD dwOutputFlags; LPBLOB lpBlob; } WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA; +_Struct_size_bytes_(dwSize) typedef struct _WSAQuerySetW { - DWORD dwSize; + _Field_range_(>=,sizeof(struct _WSAQuerySetW)) DWORD dwSize; LPWSTR lpszServiceInstanceName; LPGUID lpServiceClassId; LPWSAVERSION lpVersion; @@ -824,10 +829,10 @@ typedef struct _WSAQuerySetW { LPGUID lpNSProviderId; LPWSTR lpszContext; DWORD dwNumberOfProtocols; - LPAFPROTOCOLS lpafpProtocols; + _Field_size_(dwNumberOfProtocols) LPAFPROTOCOLS lpafpProtocols; LPWSTR lpszQueryString; DWORD dwNumberOfCsAddrs; - LPCSADDR_INFO lpcsaBuffer; + _Field_size_(dwNumberOfCsAddrs) LPCSADDR_INFO lpcsaBuffer; DWORD dwOutputFlags; LPBLOB lpBlob; } WSAQUERYSETW, *PWSAQUERYSETW, *LPWSAQUERYSETW; @@ -858,10 +863,10 @@ typedef struct _WSAQuerySet2W { LPGUID lpNSProviderId; LPWSTR lpszContext; DWORD dwNumberOfProtocols; - LPAFPROTOCOLS lpafpProtocols; + _Field_size_(dwNumberOfProtocols) LPAFPROTOCOLS lpafpProtocols; LPWSTR lpszQueryString; DWORD dwNumberOfCsAddrs; - LPCSADDR_INFO lpcsaBuffer; + _Field_size_(dwNumberOfCsAddrs) LPCSADDR_INFO lpcsaBuffer; DWORD dwOutputFlags; LPBLOB lpBlob; } WSAQUERYSET2W, *PWSAQUERYSET2W, *LPWSAQUERYSET2W; @@ -1013,186 +1018,189 @@ typedef struct pollfd { #if INCL_WINSOCK_API_TYPEDEFS +_Must_inspect_result_ typedef SOCKET (WSAAPI *LPFN_ACCEPT)( - IN SOCKET s, - OUT struct sockaddr FAR *addr OPTIONAL, - IN OUT int FAR *addrlen OPTIONAL); + _In_ SOCKET s, + _Out_writes_bytes_opt_(*addrlen) struct sockaddr FAR *addr, + _Inout_opt_ int FAR *addrlen); typedef int (WSAAPI *LPFN_BIND)( - IN SOCKET s, - IN const struct sockaddr FAR *name, - IN int namelen); + _In_ SOCKET s, + _In_reads_bytes_(namelen) const struct sockaddr FAR *name, + _In_ int namelen); typedef int (WSAAPI *LPFN_CLOSESOCKET)( - IN SOCKET s); + _In_ SOCKET s); typedef int (WSAAPI *LPFN_CONNECT)( - IN SOCKET s, - IN const struct sockaddr FAR *name, - IN int namelen); + _In_ SOCKET s, + _In_reads_bytes_(namelen) const struct sockaddr FAR *name, + _In_ int namelen); typedef int (WSAAPI *LPFN_IOCTLSOCKET)( - IN SOCKET s, - IN long cmd, - IN OUT u_long FAR *argp); + _In_ SOCKET s, + _In_ long cmd, + _Inout_ u_long FAR *argp); typedef int (WSAAPI *LPFN_GETPEERNAME)( - IN SOCKET s, - OUT struct sockaddr FAR *name, - IN OUT int FAR *namelen); + _In_ SOCKET s, + _Out_writes_bytes_to_(*namelen,*namelen) struct sockaddr FAR *name, + _Inout_ int FAR *namelen); typedef int (WSAAPI *LPFN_GETSOCKNAME)( - IN SOCKET s, - OUT struct sockaddr FAR *name, - IN OUT int FAR *namelen); + _In_ SOCKET s, + _Out_writes_bytes_to_(*namelen,*namelen) struct sockaddr FAR *name, + _Inout_ int FAR *namelen); typedef int (WSAAPI *LPFN_GETSOCKOPT)( - IN SOCKET s, - IN int level, - IN int optname, - OUT char FAR *optval, - IN OUT int FAR *optlen); + _In_ SOCKET s, + _In_ int level, + _In_ int optname, + _Out_writes_bytes_(*optlen) char FAR *optval, + _Inout_ int FAR *optlen); typedef u_long (WSAAPI *LPFN_HTONL)( - IN u_long hostlong); + _In_ u_long hostlong); typedef u_short (WSAAPI *LPFN_HTONS)( - IN u_short hostshort); + _In_ u_short hostshort); typedef unsigned long (WSAAPI *LPFN_INET_ADDR)( - IN const char FAR *cp); + _In_ const char FAR *cp); typedef char FAR * (WSAAPI *LPFN_INET_NTOA)( - IN struct in_addr in); + _In_ struct in_addr in); typedef int (WSAAPI *LPFN_LISTEN)( - IN SOCKET s, - IN int backlog); + _In_ SOCKET s, + _In_ int backlog); typedef u_long (WSAAPI *LPFN_NTOHL)( - IN u_long netlong); + _In_ u_long netlong); typedef u_short (WSAAPI *LPFN_NTOHS)( - IN u_short netshort); + _In_ u_short netshort); typedef int (WSAAPI *LPFN_RECV)( - IN SOCKET s, - OUT char FAR *buf, - IN int len, - IN int flags); + _In_ SOCKET s, + _Out_writes_bytes_to_(len, return) char FAR *buf, + _In_ int len, + _In_ int flags); typedef int (WSAAPI *LPFN_RECVFROM)( - IN SOCKET s, - OUT char FAR *buf, - IN int len, - IN int flags, - OUT struct sockaddr FAR *from OPTIONAL, - IN OUT int FAR * fromlen OPTIONAL); + _In_ SOCKET s, + _Out_writes_bytes_to_(len, return) char FAR *buf, + _In_ int len, + _In_ int flags, + _Out_writes_bytes_to_opt_(*fromlen, *fromlen) struct sockaddr FAR *from, + _Inout_opt_ int FAR * fromlen); typedef int (WSAAPI *LPFN_SELECT)( - IN int nfds, - IN OUT fd_set FAR *readfds OPTIONAL, - IN OUT fd_set FAR *writefds OPTIONAL, - IN OUT fd_set FAR *exceptfds OPTIONAL, - IN const struct timeval FAR *timeout OPTIONAL); + _In_ int nfds, + _Inout_opt_ fd_set FAR *readfds, + _Inout_opt_ fd_set FAR *writefds, + _Inout_opt_ fd_set FAR *exceptfds, + _In_opt_ const struct timeval FAR *timeout); typedef int (WSAAPI *LPFN_SEND)( - IN SOCKET s, - IN const char FAR *buf, - IN int len, - IN int flags); + _In_ SOCKET s, + _In_reads_bytes_(len) const char FAR *buf, + _In_ int len, + _In_ int flags); typedef int (WSAAPI *LPFN_SENDTO)( - IN SOCKET s, - IN const char FAR *buf, - IN int len, - IN int flags, - IN const struct sockaddr FAR *to OPTIONAL, - IN int tolen); + _In_ SOCKET s, + _In_reads_bytes_(len) const char FAR *buf, + _In_ int len, + _In_ int flags, + _In_reads_bytes_(tolen) const struct sockaddr FAR *to, + _In_ int tolen); typedef int (WSAAPI *LPFN_SETSOCKOPT)( - IN SOCKET s, - IN int level, - IN int optname, - IN const char FAR *optval OPTIONAL, - IN int optlen); + _In_ SOCKET s, + _In_ int level, + _In_ int optname, + _In_reads_bytes_(optlen) const char FAR *optval, + _In_ int optlen); typedef int (WSAAPI *LPFN_SHUTDOWN)( - IN SOCKET s, - IN int how); + _In_ SOCKET s, + _In_ int how); +_Must_inspect_result_ typedef SOCKET (WSAAPI *LPFN_SOCKET)( - IN int af, - IN int type, - IN int protocol); + _In_ int af, + _In_ int type, + _In_ int protocol); typedef struct hostent FAR * (WSAAPI *LPFN_GETHOSTBYADDR)( - IN const char FAR *addr, - IN int len, - IN int type); + _In_reads_bytes_(len) const char FAR *addr, + _In_ int len, + _In_ int type); typedef struct hostent FAR * (WSAAPI *LPFN_GETHOSTBYNAME)( - IN const char FAR *name); + _In_ const char FAR *name); typedef int (WSAAPI *LPFN_GETHOSTNAME)( - OUT char FAR *name, - IN int namelen); + _Out_writes_bytes_(namelen) char FAR *name, + _In_ int namelen); typedef struct servent FAR * (WSAAPI *LPFN_GETSERVBYPORT)( - IN int port, - IN const char FAR *proto); + _In_ int port, + _In_opt_z_ const char FAR *proto); typedef struct servent FAR * (WSAAPI *LPFN_GETSERVBYNAME)( - IN const char FAR *name, - IN const char FAR *proto); + _In_z_ const char FAR *name, + _In_opt_z_ const char FAR *proto); typedef struct protoent FAR * (WSAAPI *LPFN_GETPROTOBYNUMBER)( - IN int number); + _In_ int number); typedef struct protoent FAR * (WSAAPI *LPFN_GETPROTOBYNAME)( - IN const char FAR *name); + _In_z_ const char FAR *name); +_Must_inspect_result_ typedef int (WSAAPI *LPFN_WSASTARTUP)( - IN WORD wVersionRequired, - OUT LPWSADATA lpWSAData); + _In_ WORD wVersionRequired, + _Out_ LPWSADATA lpWSAData); typedef int (WSAAPI *LPFN_WSACLEANUP)(void); typedef void (WSAAPI *LPFN_WSASETLASTERROR)( - IN int iError); + _In_ int iError); typedef int (WSAAPI *LPFN_WSAGETLASTERROR)(void); @@ -1205,110 +1213,111 @@ typedef int typedef FARPROC (WSAAPI *LPFN_WSASETBLOCKINGHOOK)( - IN FARPROC lpBlockFunc); + _In_ FARPROC lpBlockFunc); typedef int (WSAAPI *LPFN_WSACANCELBLOCKINGCALL)(void); typedef HANDLE (WSAAPI *LPFN_WSAASYNCGETSERVBYNAME)( - IN HWND hWnd, - IN u_int wMsg, - IN const char FAR *name, - IN const char FAR *proto, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_z_ const char FAR *name, + _In_z_ const char FAR *proto, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); typedef HANDLE (WSAAPI *LPFN_WSAASYNCGETSERVBYPORT)( - IN HWND hWnd, - IN u_int wMsg, - IN int port, - IN const char FAR *proto, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_ int port, + _In_ const char FAR *proto, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); typedef HANDLE (WSAAPI *LPFN_WSAASYNCGETPROTOBYNAME)( - IN HWND hWnd, - IN u_int wMsg, - IN const char FAR *name, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_z_ const char FAR *name, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); typedef HANDLE (WSAAPI *LPFN_WSAASYNCGETPROTOBYNUMBER)( - IN HWND hWnd, - IN u_int wMsg, - IN int number, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_ int number, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); typedef HANDLE (WSAAPI *LPFN_WSAASYNCGETHOSTBYNAME)( - IN HWND hWnd, - IN u_int wMsg, - IN const char FAR *name, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_z_ const char FAR *name, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); typedef HANDLE (WSAAPI *LPFN_WSAASYNCGETHOSTBYADDR)( - IN HWND hWnd, - IN u_int wMsg, - IN const char FAR *addr, - IN int len, - IN int type, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_reads_bytes_(len) const char FAR *addr, + _In_ int len, + _In_ int type, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); typedef int (WSAAPI *LPFN_WSACANCELASYNCREQUEST)( - IN HANDLE hAsyncTaskHandle); + _In_ HANDLE hAsyncTaskHandle); typedef int (WSAAPI *LPFN_WSAASYNCSELECT)( - IN SOCKET s, - IN HWND hWnd, - IN u_int wMsg, - IN long lEvent); + _In_ SOCKET s, + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_ long lEvent); +_Must_inspect_result_ typedef SOCKET (WSAAPI *LPFN_WSAACCEPT)( - IN SOCKET s, - OUT struct sockaddr FAR *addr OPTIONAL, - IN OUT LPINT addrlen OPTIONAL, - IN LPCONDITIONPROC lpfnCondition OPTIONAL, - IN DWORD_PTR dwCallbackData OPTIONAL); + _In_ SOCKET s, + _Out_writes_bytes_to_opt_(*addrlen,*addrlen) struct sockaddr FAR *addr, + _Inout_opt_ LPINT addrlen, + _In_opt_ LPCONDITIONPROC lpfnCondition, + _In_opt_ DWORD_PTR dwCallbackData); typedef BOOL (WSAAPI *LPFN_WSACLOSEEVENT)( - IN WSAEVENT hEvent); + _In_ WSAEVENT hEvent); typedef int (WSAAPI *LPFN_WSACONNECT)( - IN SOCKET s, - IN const struct sockaddr FAR *name, - IN int namelen, - IN LPWSABUF lpCallerData OPTIONAL, - OUT LPWSABUF lpCalleeData OPTIONAL, - IN LPQOS lpSQOS OPTIONAL, - IN LPQOS lpGQOS OPTIONAL); + _In_ SOCKET s, + _In_reads_bytes_(namelen) const struct sockaddr FAR *name, + _In_ int namelen, + _In_opt_ LPWSABUF lpCallerData, + _Out_opt_ LPWSABUF lpCalleeData, + _In_opt_ LPQOS lpSQOS, + _In_opt_ LPQOS lpGQOS); typedef WSAEVENT (WSAAPI *LPFN_WSACREATEEVENT)(void); typedef int (WSAAPI *LPFN_WSADUPLICATESOCKETA)( - IN SOCKET s, - IN DWORD dwProcessId, - OUT LPWSAPROTOCOL_INFOA lpProtocolInfo); + _In_ SOCKET s, + _In_ DWORD dwProcessId, + _Out_ LPWSAPROTOCOL_INFOA lpProtocolInfo); typedef int (WSAAPI *LPFN_WSADUPLICATESOCKETW)( - IN SOCKET s, - IN DWORD dwProcessId, - OUT LPWSAPROTOCOL_INFOW lpProtocolInfo); + _In_ SOCKET s, + _In_ DWORD dwProcessId, + _Out_ LPWSAPROTOCOL_INFOW lpProtocolInfo); #ifdef UNICODE #define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETW @@ -1318,21 +1327,21 @@ typedef int typedef int (WSAAPI *LPFN_WSAENUMNETWORKEVENTS)( - IN SOCKET s, - IN WSAEVENT hEventObject, - OUT LPWSANETWORKEVENTS lpNetworkEvents); + _In_ SOCKET s, + _In_ WSAEVENT hEventObject, + _Out_ LPWSANETWORKEVENTS lpNetworkEvents); typedef int (WSAAPI *LPFN_WSAENUMPROTOCOLSA)( - IN LPINT lpiProtocols OPTIONAL, - OUT LPWSAPROTOCOL_INFOA lpProtocolBuffer OPTIONAL, - IN OUT LPDWORD lpdwBufferLength); + _In_opt_ LPINT lpiProtocols, + _Out_writes_bytes_to_opt_(*lpdwBufferLength,*lpdwBufferLength) LPWSAPROTOCOL_INFOA lpProtocolBuffer, + _Inout_ LPDWORD lpdwBufferLength); typedef int (WSAAPI *LPFN_WSAENUMPROTOCOLSW)( - IN LPINT lpiProtocols OPTIONAL, - OUT LPWSAPROTOCOL_INFOW lpProtocolBuffer OPTIONAL, - IN OUT LPDWORD lpdwBufferLength); + _In_opt_ LPINT lpiProtocols, + _Out_writes_bytes_to_opt_(*lpdwBufferLength,*lpdwBufferLength) LPWSAPROTOCOL_INFOW lpProtocolBuffer, + _Inout_ LPDWORD lpdwBufferLength); #ifdef UNICODE #define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSW @@ -1342,17 +1351,17 @@ typedef int typedef int (WSAAPI *LPFN_WSAEVENTSELECT)( - IN SOCKET s, - IN WSAEVENT hEventObject, - IN long lNetworkEvents); + _In_ SOCKET s, + _In_opt_ WSAEVENT hEventObject, + _In_ long lNetworkEvents); typedef BOOL (WSAAPI *LPFN_WSAGETOVERLAPPEDRESULT)( - IN SOCKET s, - IN LPWSAOVERLAPPED lpOverlapped, - OUT LPDWORD lpcbTransfer, - IN BOOL fWait, - OUT LPDWORD lpdwFlags); + _In_ SOCKET s, + _In_ LPWSAOVERLAPPED lpOverlapped, + _Out_ LPDWORD lpcbTransfer, + _In_ BOOL fWait, + _Out_ LPDWORD lpdwFlags); typedef BOOL (WSAAPI *LPFN_WSAGETQOSBYNAME)( @@ -1362,130 +1371,132 @@ typedef BOOL typedef int (WSAAPI *LPFN_WSAHTONL)( - IN SOCKET s, - IN u_long hostlong, - OUT u_long FAR *lpnetlong); + _In_ SOCKET s, + _In_ u_long hostlong, + _Out_ u_long FAR *lpnetlong); typedef int (WSAAPI *LPFN_WSAHTONS)( - IN SOCKET s, - IN u_short hostshort, - OUT u_short FAR *lpnetshort); + _In_ SOCKET s, + _In_ u_short hostshort, + _Out_ u_short FAR *lpnetshort); typedef int (WSAAPI *LPFN_WSAIOCTL)( - IN SOCKET s, - IN DWORD dwIoControlCode, - IN LPVOID lpvInBuffer OPTIONAL, - IN DWORD cbInBuffer, - OUT LPVOID lpvOutBuffer OPTIONAL, - IN DWORD cbOutBuffer, - OUT LPDWORD lpcbBytesReturned, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET s, + _In_ DWORD dwIoControlCode, + _In_reads_bytes_opt_(cbInBuffer) LPVOID lpvInBuffer, + _In_ DWORD cbInBuffer, + _Out_writes_bytes_to_opt_(cbOutBuffer, *lpcbBytesReturned) LPVOID lpvOutBuffer, + _In_ DWORD cbOutBuffer, + _Out_ LPDWORD lpcbBytesReturned, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); typedef SOCKET (WSAAPI *LPFN_WSAJOINLEAF)( - IN SOCKET s, - IN const struct sockaddr FAR *name, - IN int namelen, - IN LPWSABUF lpCallerData OPTIONAL, - OUT LPWSABUF lpCalleeData OPTIONAL, - IN LPQOS lpSQOS OPTIONAL, - IN LPQOS lpGQOS OPTIONAL, - IN DWORD dwFlags); + _In_ SOCKET s, + _In_reads_bytes_(namelen) const struct sockaddr FAR *name, + _In_ int namelen, + _In_opt_ LPWSABUF lpCallerData, + _Out_opt_ LPWSABUF lpCalleeData, + _In_opt_ LPQOS lpSQOS, + _In_opt_ LPQOS lpGQOS, + _In_ DWORD dwFlags); typedef int (WSAAPI *LPFN_WSANTOHL)( - IN SOCKET s, - IN u_long netlong, - OUT u_long FAR *lphostlong); + _In_ SOCKET s, + _In_ u_long netlong, + _Out_ u_long FAR *lphostlong); typedef int (WSAAPI *LPFN_WSANTOHS)( - IN SOCKET s, - IN u_short netshort, - OUT u_short FAR *lphostshort); + _In_ SOCKET s, + _In_ u_short netshort, + _Out_ u_short FAR *lphostshort); typedef int (WSAAPI *LPFN_WSARECV)( - IN SOCKET s, - IN LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesRecvd OPTIONAL, - IN OUT LPDWORD lpFlags, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET s, + _In_reads_(dwBufferCount) LPWSABUF lpBuffers, + _In_ DWORD dwBufferCount, + _Out_opt_ LPDWORD lpNumberOfBytesRecvd, + _Inout_ LPDWORD lpFlags, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); typedef int (WSAAPI *LPFN_WSARECVDISCONNECT)( - IN SOCKET s, - OUT LPWSABUF lpInboundDisconnectData); + _In_ SOCKET s, + __out_data_source(NETWORK) LPWSABUF lpInboundDisconnectData); typedef int (WSAAPI *LPFN_WSARECVFROM)( - IN SOCKET s, - IN LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesRecvd OPTIONAL, - IN OUT LPDWORD lpFlags, - OUT struct sockaddr FAR *lpFrom OPTIONAL, - IN OUT LPINT lpFromlen OPTIONAL, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET s, + _In_reads_(dwBufferCount) LPWSABUF lpBuffers, + _In_ DWORD dwBufferCount, + _Out_opt_ LPDWORD lpNumberOfBytesRecvd, + _Inout_ LPDWORD lpFlags, + _Out_writes_bytes_to_opt_(*lpFromlen,*lpFromlen) struct sockaddr FAR *lpFrom, + _Inout_opt_ LPINT lpFromlen, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); typedef BOOL (WSAAPI *LPFN_WSARESETEVENT)( - IN WSAEVENT hEvent); + _In_ WSAEVENT hEvent); typedef int (WSAAPI *LPFN_WSASEND)( - IN SOCKET s, - IN LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesSent OPTIONAL, - IN DWORD dwFlags, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET s, + _In_reads_(dwBufferCount) LPWSABUF lpBuffers, + _In_ DWORD dwBufferCount, + _Out_opt_ LPDWORD lpNumberOfBytesSent, + _In_ DWORD dwFlags, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); typedef int (WSAAPI *LPFN_WSASENDDISCONNECT)( - IN SOCKET s, - IN LPWSABUF lpOutboundDisconnectData OPTIONAL); + _In_ SOCKET s, + _In_opt_ LPWSABUF lpOutboundDisconnectData); typedef int (WSAAPI *LPFN_WSASENDTO)( - IN SOCKET s, - IN LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesSent OPTIONAL, - IN DWORD dwFlags, - IN const struct sockaddr FAR *lpTo, - IN int iTolen, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET s, + _In_reads_(dwBufferCount) LPWSABUF lpBuffers, + _In_ DWORD dwBufferCount, + _Out_opt_ LPDWORD lpNumberOfBytesSent, + _In_ DWORD dwFlags, + _In_reads_bytes_opt_(iTolen) const struct sockaddr FAR *lpTo, + _In_ int iTolen, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); typedef BOOL (WSAAPI *LPFN_WSASETEVENT)( - IN WSAEVENT hEvent); + _In_ WSAEVENT hEvent); +_Must_inspect_result_ typedef SOCKET (WSAAPI *LPFN_WSASOCKETA)( - IN int af, - IN int type, - IN int protocol, - IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL, - IN GROUP g, - IN DWORD dwFlags); + _In_ int af, + _In_ int type, + _In_ int protocol, + _In_opt_ LPWSAPROTOCOL_INFOA lpProtocolInfo, + _In_ GROUP g, + _In_ DWORD dwFlags); +_Must_inspect_result_ typedef SOCKET (WSAAPI *LPFN_WSASOCKETW)( - IN int af, - IN int type, - IN int protocol, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL, - IN GROUP g, - IN DWORD dwFlags); + _In_ int af, + _In_ int type, + _In_ int protocol, + _In_opt_ LPWSAPROTOCOL_INFOW lpProtocolInfo, + _In_ GROUP g, + _In_ DWORD dwFlags); #ifdef UNICODE #define LPFN_WSASOCKET LPFN_WSASOCKETW @@ -1495,27 +1506,27 @@ typedef SOCKET typedef DWORD (WSAAPI *LPFN_WSAWAITFORMULTIPLEEVENTS)( - IN DWORD cEvents, - IN const WSAEVENT FAR *lphEvents, - IN BOOL fWaitAll, - IN DWORD dwTimeout, - IN BOOL fAlertable); + _In_ DWORD cEvents, + _In_reads_(cEvents) const WSAEVENT FAR *lphEvents, + _In_ BOOL fWaitAll, + _In_ DWORD dwTimeout, + _In_ BOOL fAlertable); typedef INT (WSAAPI *LPFN_WSAADDRESSTOSTRINGA)( - IN LPSOCKADDR lpsaAddress, - IN DWORD dwAddressLength, - IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL, - OUT LPSTR lpszAddressString, - IN OUT LPDWORD lpdwAddressStringLength); + _In_reads_bytes_(dwAddressLength) LPSOCKADDR lpsaAddress, + _In_ DWORD dwAddressLength, + _In_opt_ LPWSAPROTOCOL_INFOA lpProtocolInfo, + _Out_writes_to_(*lpdwAddressStringLength,*lpdwAddressStringLength) LPSTR lpszAddressString, + _Inout_ LPDWORD lpdwAddressStringLength); typedef INT (WSAAPI *LPFN_WSAADDRESSTOSTRINGW)( - IN LPSOCKADDR lpsaAddress, - IN DWORD dwAddressLength, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL, - OUT LPWSTR lpszAddressString, - IN OUT LPDWORD lpdwAddressStringLength); + _In_reads_bytes_(dwAddressLength) LPSOCKADDR lpsaAddress, + _In_ DWORD dwAddressLength, + _In_opt_ LPWSAPROTOCOL_INFOW lpProtocolInfo, + _Out_writes_to_(*lpdwAddressStringLength,*lpdwAddressStringLength) LPWSTR lpszAddressString, + _Inout_ LPDWORD lpdwAddressStringLength); #ifdef UNICODE #define LPFN_WSAADDRESSTOSTRING LPFN_WSAADDRESSTOSTRINGW @@ -1525,19 +1536,19 @@ typedef INT typedef INT (WSAAPI *LPFN_WSASTRINGTOADDRESSA)( - IN LPSTR AddressString, - IN INT AddressFamily, - IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL, - OUT LPSOCKADDR lpAddress, - IN OUT LPINT lpAddressLength); + _In_ LPSTR AddressString, + _In_ INT AddressFamily, + _In_opt_ LPWSAPROTOCOL_INFOA lpProtocolInfo, + _Out_writes_bytes_to_(*lpAddressLength,*lpAddressLength) LPSOCKADDR lpAddress, + _Inout_ LPINT lpAddressLength); typedef INT (WSAAPI *LPFN_WSASTRINGTOADDRESSW)( - IN LPWSTR AddressString, - IN INT AddressFamily, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL, - OUT LPSOCKADDR lpAddress, - IN OUT LPINT lpAddressLength); + _In_ LPWSTR AddressString, + _In_ INT AddressFamily, + _In_opt_ LPWSAPROTOCOL_INFOW lpProtocolInfo, + _Out_writes_bytes_to_(*lpAddressLength,*lpAddressLength) LPSOCKADDR lpAddress, + _Inout_ LPINT lpAddressLength); #ifdef UNICODE #define LPFN_WSASTRINGTOADDRESS LPFN_WSASTRINGTOADDRESSW @@ -1547,15 +1558,15 @@ typedef INT typedef INT (WSAAPI *LPFN_WSALOOKUPSERVICEBEGINA)( - IN LPWSAQUERYSETA lpqsRestrictions, - IN DWORD dwControlFlags, - OUT LPHANDLE lphLookup); + _In_ LPWSAQUERYSETA lpqsRestrictions, + _In_ DWORD dwControlFlags, + _Out_ LPHANDLE lphLookup); typedef INT (WSAAPI *LPFN_WSALOOKUPSERVICEBEGINW)( - IN LPWSAQUERYSETW lpqsRestrictions, - IN DWORD dwControlFlags, - OUT LPHANDLE lphLookup); + _In_ LPWSAQUERYSETW lpqsRestrictions, + _In_ DWORD dwControlFlags, + _Out_ LPHANDLE lphLookup); #ifdef UNICODE #define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINW @@ -1565,17 +1576,17 @@ typedef INT typedef INT (WSAAPI *LPFN_WSALOOKUPSERVICENEXTA)( - IN HANDLE hLookup, - IN DWORD dwControlFlags, - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSAQUERYSETA lpqsResults); + _In_ HANDLE hLookup, + _In_ DWORD dwControlFlags, + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSAQUERYSETA lpqsResults); typedef INT (WSAAPI *LPFN_WSALOOKUPSERVICENEXTW)( - IN HANDLE hLookup, - IN DWORD dwControlFlags, - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSAQUERYSETW lpqsResults OPTIONAL); + _In_ HANDLE hLookup, + _In_ DWORD dwControlFlags, + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_opt_(*lpdwBufferLength,*lpdwBufferLength) LPWSAQUERYSETW lpqsResults); #ifdef UNICODE #define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTW @@ -1585,15 +1596,15 @@ typedef INT typedef INT (WSAAPI *LPFN_WSALOOKUPSERVICEEND)( - IN HANDLE hLookup); + _In_ HANDLE hLookup); typedef INT (WSAAPI *LPFN_WSAINSTALLSERVICECLASSA)( - IN LPWSASERVICECLASSINFOA lpServiceClassInfo); + _In_ LPWSASERVICECLASSINFOA lpServiceClassInfo); typedef INT (WSAAPI *LPFN_WSAINSTALLSERVICECLASSW)( - IN LPWSASERVICECLASSINFOW lpServiceClassInfo); + _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo); #ifdef UNICODE #define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSW @@ -1603,21 +1614,21 @@ typedef INT typedef INT (WSAAPI *LPFN_WSAREMOVESERVICECLASS)( - IN LPGUID lpServiceClassId); + _In_ LPGUID lpServiceClassId); typedef INT (WSAAPI *LPFN_WSAGETSERVICECLASSINFOA)( - IN LPGUID lpProviderId, - IN LPGUID lpServiceClassId, - IN OUT LPDWORD lpdwBufSize, - OUT LPWSASERVICECLASSINFOA lpServiceClassInfo); + _In_ LPGUID lpProviderId, + _In_ LPGUID lpServiceClassId, + _Inout_ LPDWORD lpdwBufSize, + _Out_writes_bytes_to_(*lpdwBufSize,*lpdwBufSize) LPWSASERVICECLASSINFOA lpServiceClassInfo); typedef INT (WSAAPI *LPFN_WSAGETSERVICECLASSINFOW)( - IN LPGUID lpProviderId, - IN LPGUID lpServiceClassId, - IN OUT LPDWORD lpdwBufSize, - OUT LPWSASERVICECLASSINFOW lpServiceClassInfo); + _In_ LPGUID lpProviderId, + _In_ LPGUID lpServiceClassId, + _Inout_ LPDWORD lpdwBufSize, + _Out_writes_bytes_to_(*lpdwBufSize,*lpdwBufSize) LPWSASERVICECLASSINFOW lpServiceClassInfo); #ifdef UNICODE #define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOW @@ -1627,13 +1638,13 @@ typedef INT typedef INT (WSAAPI *LPFN_WSAENUMNAMESPACEPROVIDERSA)( - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSANAMESPACE_INFOA lpnspBuffer); + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSANAMESPACE_INFOA lpnspBuffer); typedef INT (WSAAPI *LPFN_WSAENUMNAMESPACEPROVIDERSW)( - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSANAMESPACE_INFOW lpnspBuffer); + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSANAMESPACE_INFOW lpnspBuffer); #ifdef UNICODE #define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSW @@ -1643,15 +1654,15 @@ typedef INT typedef INT (WSAAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA)( - IN LPGUID lpServiceClassId, - OUT LPSTR lpszServiceClassName, - IN OUT LPDWORD lpdwBufferLength); + _In_ LPGUID lpServiceClassId, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPSTR lpszServiceClassName, + _Inout_ LPDWORD lpdwBufferLength); typedef INT (WSAAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW)( - IN LPGUID lpServiceClassId, - OUT LPWSTR lpszServiceClassName, - IN OUT LPDWORD lpdwBufferLength); + _In_ LPGUID lpServiceClassId, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSTR lpszServiceClassName, + _Inout_ LPDWORD lpdwBufferLength); #ifdef UNICODE #define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW @@ -1661,15 +1672,15 @@ typedef INT typedef INT (WSAAPI *LPFN_WSASETSERVICEA)( - IN LPWSAQUERYSETA lpqsRegInfo, - IN WSAESETSERVICEOP essoperation, - IN DWORD dwControlFlags); + _In_ LPWSAQUERYSETA lpqsRegInfo, + _In_ WSAESETSERVICEOP essoperation, + _In_ DWORD dwControlFlags); typedef INT (WSAAPI *LPFN_WSASETSERVICEW)( - IN LPWSAQUERYSETW lpqsRegInfo, - IN WSAESETSERVICEOP essoperation, - IN DWORD dwControlFlags); + _In_ LPWSAQUERYSETW lpqsRegInfo, + _In_ WSAESETSERVICEOP essoperation, + _In_ DWORD dwControlFlags); #ifdef UNICODE #define LPFN_WSASETSERVICE LPFN_WSASETSERVICEW @@ -1679,34 +1690,34 @@ typedef INT typedef INT (WSAAPI *LPFN_WSAPROVIDERCONFIGCHANGE)( - IN OUT LPHANDLE lpNotificationHandle OPTIONAL, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _Inout_ LPHANDLE lpNotificationHandle, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); #if(_WIN32_WINNT >= 0x0501) typedef INT (WSAAPI *LPFN_WSANSPIOCTL)( - IN HANDLE hLookup, - IN DWORD dwControlCode, - IN LPVOID lpvInBuffer OPTIONAL, - IN DWORD cbInBuffer, - OUT LPVOID lpvOutBuffer OPTIONAL, - IN DWORD cbOutBuffer, - OUT LPDWORD lpcbBytesReturned, - IN LPWSACOMPLETION lpCompletion OPTIONAL); + _In_ HANDLE hLookup, + _In_ DWORD dwControlCode, + _In_reads_bytes_opt_(cbInBuffer) LPVOID lpvInBuffer, + _In_ DWORD cbInBuffer, + _Out_writes_bytes_to_opt_(cbOutBuffer, *lpcbBytesReturned) LPVOID lpvOutBuffer, + _In_ DWORD cbOutBuffer, + _Out_ LPDWORD lpcbBytesReturned, + _In_opt_ LPWSACOMPLETION lpCompletion); #endif /* (_WIN32_WINNT >= 0x0501) */ #if (_WIN32_WINNT >= 0x0600) typedef INT (WSAAPI *LPFN_WSAENUMNAMESPACEPROVIDERSEXA)( - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSANAMESPACE_INFOEXA lpnspBuffer); + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSANAMESPACE_INFOEXA lpnspBuffer); typedef INT (WSAAPI *LPFN_WSAENUMNAMESPACEPROVIDERSEXW)( - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSANAMESPACE_INFOEXW lpnspBuffer); + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSANAMESPACE_INFOEXW lpnspBuffer); #ifdef UNICODE #define LPFN_WSAENUMNAMESPACEPROVIDERSEX LPFN_WSAENUMNAMESPACEPROVIDERSEXW @@ -1720,69 +1731,70 @@ typedef INT #if INCL_WINSOCK_API_PROTOTYPES +_Must_inspect_result_ WINSOCK_API_LINKAGE SOCKET WSAAPI accept( - IN SOCKET s, - OUT struct sockaddr FAR *addr OPTIONAL, - IN OUT int FAR *addrlen OPTIONAL); + _In_ SOCKET s, + _Out_writes_bytes_opt_(*addrlen) struct sockaddr FAR *addr, + _Inout_opt_ int FAR *addrlen); WINSOCK_API_LINKAGE int WSAAPI bind( - IN SOCKET s, - IN const struct sockaddr FAR *addr, - IN int namelen); + _In_ SOCKET s, + _In_reads_bytes_(namelen) const struct sockaddr FAR *addr, + _In_ int namelen); WINSOCK_API_LINKAGE int WSAAPI closesocket( - IN SOCKET s); + _In_ SOCKET s); WINSOCK_API_LINKAGE int WSAAPI connect( - IN SOCKET s, - IN const struct sockaddr FAR *name, - IN int namelen); + _In_ SOCKET s, + _In_reads_bytes_(namelen) const struct sockaddr FAR *name, + _In_ int namelen); WINSOCK_API_LINKAGE int WSAAPI ioctlsocket( - IN SOCKET s, - IN long cmd, - IN OUT u_long FAR *argp); + _In_ SOCKET s, + _In_ long cmd, + _Inout_ u_long FAR *argp); WINSOCK_API_LINKAGE int WSAAPI getpeername( - IN SOCKET s, - OUT struct sockaddr FAR *name, - IN OUT int FAR *namelen); + _In_ SOCKET s, + _Out_writes_bytes_to_(*namelen,*namelen) struct sockaddr FAR *name, + _Inout_ int FAR *namelen); WINSOCK_API_LINKAGE int WSAAPI getsockname( - IN SOCKET s, - OUT struct sockaddr FAR *name, - IN OUT int FAR *namelen); + _In_ SOCKET s, + _Out_writes_bytes_to_(*namelen,*namelen) struct sockaddr FAR *name, + _Inout_ int FAR *namelen); WINSOCK_API_LINKAGE int WSAAPI getsockopt( - IN SOCKET s, - IN int level, - IN int optname, - OUT char FAR *optval, - IN OUT int FAR *optlen); + _In_ SOCKET s, + _In_ int level, + _In_ int optname, + _Out_writes_bytes_(*optlen) char FAR *optval, + _Inout_ int FAR *optlen); WINSOCK_API_LINKAGE u_long @@ -1794,167 +1806,169 @@ WINSOCK_API_LINKAGE u_short WSAAPI htons( - IN u_short hostshort); + _In_ u_short hostshort); WINSOCK_API_LINKAGE unsigned long WSAAPI inet_addr( - IN const char FAR *cp); + _In_z_ const char FAR *cp); WINSOCK_API_LINKAGE char FAR * WSAAPI inet_ntoa( - IN struct in_addr in); + _In_ struct in_addr in); WINSOCK_API_LINKAGE int WSAAPI listen( - IN SOCKET s, - IN int backlog); + _In_ SOCKET s, + _In_ int backlog); WINSOCK_API_LINKAGE u_long WSAAPI ntohl( - IN u_long netlong); + _In_ u_long netlong); WINSOCK_API_LINKAGE u_short WSAAPI ntohs( - IN u_short netshort); + _In_ u_short netshort); WINSOCK_API_LINKAGE int WSAAPI recv( - IN SOCKET s, - OUT char FAR *buf, - IN int len, - IN int flags); + _In_ SOCKET s, + _Out_writes_bytes_to_(len, return) __out_data_source(NETWORK) char FAR *buf, + _In_ int len, + _In_ int flags); WINSOCK_API_LINKAGE int WSAAPI recvfrom( - IN SOCKET s, - OUT char FAR *buf, - IN int len, - IN int flags, - OUT struct sockaddr FAR *from OPTIONAL, - IN OUT int FAR *fromlen OPTIONAL); + _In_ SOCKET s, + _Out_writes_bytes_to_(len, return) __out_data_source(NETWORK) char FAR *buf, + _In_ int len, + _In_ int flags, + _Out_writes_bytes_to_opt_(*fromlen, *fromlen) struct sockaddr FAR *from, + _Inout_opt_ int FAR *fromlen); WINSOCK_API_LINKAGE int WSAAPI select( - IN int nfds, - IN OUT fd_set FAR *readfds OPTIONAL, - IN OUT fd_set FAR *writefds OPTIONAL, - IN OUT fd_set FAR *exceptfds OPTIONAL, - IN const struct timeval FAR *timeout OPTIONAL); + _In_ int nfds, + _Inout_opt_ fd_set FAR *readfds, + _Inout_opt_ fd_set FAR *writefds, + _Inout_opt_ fd_set FAR *exceptfds, + _In_opt_ const struct timeval FAR *timeout); WINSOCK_API_LINKAGE int WSAAPI send( - IN SOCKET s, - IN const char FAR *buf, - IN int len, - IN int flags); + _In_ SOCKET s, + _In_reads_bytes_(len) const char FAR *buf, + _In_ int len, + _In_ int flags); WINSOCK_API_LINKAGE int WSAAPI sendto( - IN SOCKET s, - IN const char FAR *buf, - IN int len, - IN int flags, - IN const struct sockaddr FAR *to OPTIONAL, - IN int tolen); + _In_ SOCKET s, + _In_reads_bytes_(len) const char FAR *buf, + _In_ int len, + _In_ int flags, + _In_reads_bytes_(tolen) const struct sockaddr FAR *to, + _In_ int tolen); WINSOCK_API_LINKAGE int WSAAPI setsockopt( - IN SOCKET s, - IN int level, - IN int optname, - IN const char FAR *optval OPTIONAL, - IN int optlen); + _In_ SOCKET s, + _In_ int level, + _In_ int optname, + _In_reads_bytes_opt_(optlen) const char FAR *optval, + _In_ int optlen); WINSOCK_API_LINKAGE int WSAAPI shutdown( - IN SOCKET s, - IN int how); + _In_ SOCKET s, + _In_ int how); +_Must_inspect_result_ WINSOCK_API_LINKAGE SOCKET WSAAPI socket( - IN int af, - IN int type, - IN int protocol); + _In_ int af, + _In_ int type, + _In_ int protocol); WINSOCK_API_LINKAGE struct hostent FAR * WSAAPI gethostbyaddr( - IN const char FAR *addr, - IN int len, - IN int type); + _In_reads_bytes_(len) const char FAR *addr, + _In_ int len, + _In_ int type); WINSOCK_API_LINKAGE struct hostent FAR * WSAAPI gethostbyname( - IN const char FAR *name); + _In_z_ const char FAR *name); WINSOCK_API_LINKAGE int WSAAPI gethostname( - OUT char FAR *name, - IN int namelen); + _Out_writes_bytes_(namelen) char FAR *name, + _In_ int namelen); WINSOCK_API_LINKAGE struct servent FAR * WSAAPI getservbyport( - IN int port, - IN const char FAR *proto); + _In_ int port, + _In_opt_z_ const char FAR *proto); WINSOCK_API_LINKAGE struct servent FAR * WSAAPI getservbyname( - IN const char FAR *name, - IN const char FAR *proto); + _In_z_ const char FAR *name, + _In_opt_z_ const char FAR *proto); WINSOCK_API_LINKAGE struct protoent FAR * WSAAPI getprotobynumber( - IN int number); + _In_ int number); WINSOCK_API_LINKAGE struct protoent FAR * WSAAPI getprotobyname( - IN const char FAR *name); + _In_z_ const char FAR *name); +_Must_inspect_result_ WINSOCK_API_LINKAGE int WSAAPI WSAStartup( - IN WORD wVersionRequired, - OUT LPWSADATA lpWSAData); + _In_ WORD wVersionRequired, + _Out_ LPWSADATA lpWSAData); WINSOCK_API_LINKAGE int @@ -1965,7 +1979,7 @@ WINSOCK_API_LINKAGE void WSAAPI WSASetLastError( - IN int iError); + _In_ int iError); WINSOCK_API_LINKAGE int @@ -1986,7 +2000,7 @@ WINSOCK_API_LINKAGE FARPROC WSAAPI WSASetBlockingHook( - IN FARPROC lpBlockFunc); + _In_ FARPROC lpBlockFunc); WINSOCK_API_LINKAGE int @@ -1997,108 +2011,109 @@ WINSOCK_API_LINKAGE HANDLE WSAAPI WSAAsyncGetServByName( - IN HWND hWnd, - IN u_int wMsg, - IN const char FAR *name, - IN const char FAR *proto, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_z_ const char FAR *name, + _In_z_ const char FAR *proto, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); WINSOCK_API_LINKAGE HANDLE WSAAPI WSAAsyncGetServByPort( - IN HWND hWnd, - IN u_int wMsg, - IN int port, - IN const char FAR *proto, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_ int port, + _In_ const char FAR *proto, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); WINSOCK_API_LINKAGE HANDLE WSAAPI WSAAsyncGetProtoByName( - IN HWND hWnd, - IN u_int wMsg, - IN const char FAR *name, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_z_ const char FAR *name, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); WINSOCK_API_LINKAGE HANDLE WSAAPI WSAAsyncGetProtoByNumber( - IN HWND hWnd, - IN u_int wMsg, - IN int number, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_ int number, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); WINSOCK_API_LINKAGE HANDLE WSAAPI WSAAsyncGetHostByName( - IN HWND hWnd, - IN u_int wMsg, - IN const char FAR *name, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_z_ const char FAR *name, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); WINSOCK_API_LINKAGE HANDLE WSAAPI WSAAsyncGetHostByAddr( - IN HWND hWnd, - IN u_int wMsg, - IN const char FAR *addr, - IN int len, - IN int type, - OUT char FAR *buf, - IN int buflen); + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_reads_bytes_(len) const char FAR *addr, + _In_ int len, + _In_ int type, + _Out_writes_bytes_(buflen) char FAR *buf, + _In_ int buflen); WINSOCK_API_LINKAGE int WSAAPI WSACancelAsyncRequest( - IN HANDLE hAsyncTaskHandle); + _In_ HANDLE hAsyncTaskHandle); WINSOCK_API_LINKAGE int WSAAPI WSAAsyncSelect( - IN SOCKET s, - IN HWND hWnd, - IN u_int wMsg, - IN long lEvent); + _In_ SOCKET s, + _In_ HWND hWnd, + _In_ u_int wMsg, + _In_ long lEvent); +_Must_inspect_result_ WINSOCK_API_LINKAGE SOCKET WSAAPI WSAAccept( - IN SOCKET s, - OUT struct sockaddr FAR *addr OPTIONAL, - IN OUT LPINT addrlen OPTIONAL, - IN LPCONDITIONPROC lpfnCondition OPTIONAL, - IN DWORD_PTR dwCallbackData OPTIONAL); + _In_ SOCKET s, + _Out_writes_bytes_to_opt_(*addrlen,*addrlen) struct sockaddr FAR *addr, + _Inout_opt_ LPINT addrlen, + _In_opt_ LPCONDITIONPROC lpfnCondition, + _In_opt_ DWORD_PTR dwCallbackData); WINSOCK_API_LINKAGE BOOL WSAAPI WSACloseEvent( - IN WSAEVENT hEvent); + _In_ WSAEVENT hEvent); WINSOCK_API_LINKAGE int WSAAPI WSAConnect( - IN SOCKET s, - IN const struct sockaddr FAR *name, - IN int namelen, - IN LPWSABUF lpCallerData OPTIONAL, - OUT LPWSABUF lpCalleeData OPTIONAL, - IN LPQOS lpSQOS OPTIONAL, - IN LPQOS lpGQOS OPTIONAL); + _In_ SOCKET s, + _In_reads_bytes_(namelen) const struct sockaddr FAR *name, + _In_ int namelen, + _In_opt_ LPWSABUF lpCallerData, + _Out_opt_ LPWSABUF lpCalleeData, + _In_opt_ LPQOS lpSQOS, + _In_opt_ LPQOS lpGQOS); #ifdef UNICODE #define WSAConnectByName WSAConnectByNameW @@ -2109,40 +2124,40 @@ WSAConnect( BOOL PASCAL WSAConnectByNameW( - IN SOCKET s, - IN LPWSTR nodename, - IN LPWSTR servicename, - IN OUT LPDWORD LocalAddressLength, - OUT LPSOCKADDR LocalAddress, - IN OUT LPDWORD RemoteAddressLength, - OUT LPSOCKADDR RemoteAddress, - IN const struct timeval *timeout, - IN LPWSAOVERLAPPED Reserved OPTIONAL); + _In_ SOCKET s, + _In_ LPWSTR nodename, + _In_ LPWSTR servicename, + _Inout_opt_ LPDWORD LocalAddressLength, + _Out_writes_bytes_to_opt_(*LocalAddressLength,*LocalAddressLength) LPSOCKADDR LocalAddress, + _Inout_opt_ LPDWORD RemoteAddressLength, + _Out_writes_bytes_to_opt_(*RemoteAddressLength,*RemoteAddressLength) LPSOCKADDR RemoteAddress, + _In_opt_ const struct timeval *timeout, + _Reserved_ LPWSAOVERLAPPED Reserved); BOOL PASCAL WSAConnectByNameA( - IN SOCKET s, - IN LPCSTR nodename, - IN LPCSTR servicename, - IN OUT LPDWORD LocalAddressLength, - OUT LPSOCKADDR LocalAddress, - IN OUT LPDWORD RemoteAddressLength, - OUT LPSOCKADDR RemoteAddress, - IN const struct timeval *timeout, - IN LPWSAOVERLAPPED Reserved OPTIONAL); + _In_ SOCKET s, + _In_ LPCSTR nodename, + _In_ LPCSTR servicename, + _Inout_opt_ LPDWORD LocalAddressLength, + _Out_writes_bytes_to_opt_(*LocalAddressLength,*LocalAddressLength) LPSOCKADDR LocalAddress, + _Inout_opt_ LPDWORD RemoteAddressLength, + _Out_writes_bytes_to_opt_(*RemoteAddressLength,*RemoteAddressLength) LPSOCKADDR RemoteAddress, + _In_opt_ const struct timeval *timeout, + _Reserved_ LPWSAOVERLAPPED Reserved); BOOL PASCAL WSAConnectByList( - IN SOCKET s, - IN PSOCKET_ADDRESS_LIST SocketAddress, - IN OUT LPDWORD LocalAddressLength, - OUT LPSOCKADDR LocalAddress, - IN OUT LPDWORD RemoteAddressLength, - OUT LPSOCKADDR RemoteAddress, - IN const struct timeval *timeout, - IN LPWSAOVERLAPPED Reserved OPTIONAL); + _In_ SOCKET s, + _In_ PSOCKET_ADDRESS_LIST SocketAddress, + _Inout_opt_ LPDWORD LocalAddressLength, + _Out_writes_bytes_to_opt_(*LocalAddressLength,*LocalAddressLength) LPSOCKADDR LocalAddress, + _Inout_opt_ LPDWORD RemoteAddressLength, + _Out_writes_bytes_to_opt_(*RemoteAddressLength,*RemoteAddressLength) LPSOCKADDR RemoteAddress, + _In_opt_ const struct timeval *timeout, + _Reserved_ LPWSAOVERLAPPED Reserved); WINSOCK_API_LINKAGE WSAEVENT @@ -2153,17 +2168,17 @@ WINSOCK_API_LINKAGE int WSAAPI WSADuplicateSocketA( - IN SOCKET s, - IN DWORD dwProcessId, - OUT LPWSAPROTOCOL_INFOA lpProtocolInfo); + _In_ SOCKET s, + _In_ DWORD dwProcessId, + _Out_ LPWSAPROTOCOL_INFOA lpProtocolInfo); WINSOCK_API_LINKAGE int WSAAPI WSADuplicateSocketW( - IN SOCKET s, - IN DWORD dwProcessId, - OUT LPWSAPROTOCOL_INFOW lpProtocolInfo); + _In_ SOCKET s, + _In_ DWORD dwProcessId, + _Out_ LPWSAPROTOCOL_INFOW lpProtocolInfo); #ifdef UNICODE #define WSADuplicateSocket WSADuplicateSocketW @@ -2175,25 +2190,25 @@ WINSOCK_API_LINKAGE int WSAAPI WSAEnumNetworkEvents( - IN SOCKET s, - IN WSAEVENT hEventObject, - OUT LPWSANETWORKEVENTS lpNetworkEvents); + _In_ SOCKET s, + _In_ WSAEVENT hEventObject, + _Out_ LPWSANETWORKEVENTS lpNetworkEvents); WINSOCK_API_LINKAGE int WSAAPI WSAEnumProtocolsA( - IN LPINT lpiProtocols OPTIONAL, - OUT LPWSAPROTOCOL_INFOA lpProtocolBuffer OPTIONAL, - IN OUT LPDWORD lpdwBufferLength); + _In_opt_ LPINT lpiProtocols, + _Out_writes_bytes_to_opt_(*lpdwBufferLength,*lpdwBufferLength) LPWSAPROTOCOL_INFOA lpProtocolBuffer, + _Inout_ LPDWORD lpdwBufferLength); WINSOCK_API_LINKAGE int WSAAPI WSAEnumProtocolsW( - IN LPINT lpiProtocols OPTIONAL, - OUT LPWSAPROTOCOL_INFOW lpProtocolBuffer OPTIONAL, - IN OUT LPDWORD lpdwBufferLength); + _In_opt_ LPINT lpiProtocols, + _Out_writes_bytes_to_opt_(*lpdwBufferLength,*lpdwBufferLength) LPWSAPROTOCOL_INFOW lpProtocolBuffer, + _Inout_ LPDWORD lpdwBufferLength); #ifdef UNICODE #define WSAEnumProtocols WSAEnumProtocolsW @@ -2205,186 +2220,188 @@ WINSOCK_API_LINKAGE int WSAAPI WSAEventSelect( - IN SOCKET s, - IN WSAEVENT hEventObject, - IN long lNetworkEvents); + _In_ SOCKET s, + _In_opt_ WSAEVENT hEventObject, + _In_ long lNetworkEvents); WINSOCK_API_LINKAGE BOOL WSAAPI WSAGetOverlappedResult( - IN SOCKET s, - IN LPWSAOVERLAPPED lpOverlapped, - OUT LPDWORD lpcbTransfer, - IN BOOL fWait, - OUT LPDWORD lpdwFlags); + _In_ SOCKET s, + _In_ LPWSAOVERLAPPED lpOverlapped, + _Out_ LPDWORD lpcbTransfer, + _In_ BOOL fWait, + _Out_ LPDWORD lpdwFlags); WINSOCK_API_LINKAGE BOOL WSAAPI WSAGetQOSByName( - IN SOCKET s, - IN LPWSABUF lpQOSName, - OUT LPQOS lpQOS); + _In_ SOCKET s, + _In_ LPWSABUF lpQOSName, + _Out_ LPQOS lpQOS); WINSOCK_API_LINKAGE int WSAAPI WSAHtonl( - IN SOCKET s, - IN u_long hostlong, - OUT u_long FAR *lpnetlong); + _In_ SOCKET s, + _In_ u_long hostlong, + _Out_ u_long FAR *lpnetlong); WINSOCK_API_LINKAGE int WSAAPI WSAHtons( - IN SOCKET s, - IN u_short hostshort, - OUT u_short FAR *lpnetshort); + _In_ SOCKET s, + _In_ u_short hostshort, + _Out_ u_short FAR *lpnetshort); WINSOCK_API_LINKAGE int WSAAPI WSAIoctl( - IN SOCKET s, - IN DWORD dwIoControlCode, - IN LPVOID lpvInBuffer OPTIONAL, - IN DWORD cbInBuffer, - OUT LPVOID lpvOutBuffer OPTIONAL, - IN DWORD cbOutBuffer, - OUT LPDWORD lpcbBytesReturned, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET s, + _In_ DWORD dwIoControlCode, + _In_reads_bytes_opt_(cbInBuffer) LPVOID lpvInBuffer, + _In_ DWORD cbInBuffer, + _Out_writes_bytes_to_opt_(cbOutBuffer, *lpcbBytesReturned) LPVOID lpvOutBuffer, + _In_ DWORD cbOutBuffer, + _Out_ LPDWORD lpcbBytesReturned, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); WINSOCK_API_LINKAGE SOCKET WSAAPI WSAJoinLeaf( - IN SOCKET s, - IN const struct sockaddr FAR *name, - IN int namelen, - IN LPWSABUF lpCallerData OPTIONAL, - OUT LPWSABUF lpCalleeData OPTIONAL, - IN LPQOS lpSQOS OPTIONAL, - IN LPQOS lpGQOS OPTIONAL, - IN DWORD dwFlags); + _In_ SOCKET s, + _In_reads_bytes_(namelen) const struct sockaddr FAR *name, + _In_ int namelen, + _In_opt_ LPWSABUF lpCallerData, + _Out_opt_ LPWSABUF lpCalleeData, + _In_opt_ LPQOS lpSQOS, + _In_opt_ LPQOS lpGQOS, + _In_ DWORD dwFlags); WINSOCK_API_LINKAGE int WSAAPI WSANtohl( - IN SOCKET s, - IN u_long netlong, - OUT u_long FAR *lphostlong); + _In_ SOCKET s, + _In_ u_long netlong, + _Out_ u_long FAR *lphostlong); WINSOCK_API_LINKAGE int WSAAPI WSANtohs( - IN SOCKET s, - IN u_short netshort, - OUT u_short FAR *lphostshort); + _In_ SOCKET s, + _In_ u_short netshort, + _Out_ u_short FAR *lphostshort); WINSOCK_API_LINKAGE int WSAAPI WSARecv( - IN SOCKET s, - IN LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesRecvd OPTIONAL, - IN OUT LPDWORD lpFlags, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET s, + _In_reads_(dwBufferCount) __out_data_source(NETWORK) LPWSABUF lpBuffers, + _In_ DWORD dwBufferCount, + _Out_opt_ LPDWORD lpNumberOfBytesRecvd, + _Inout_ LPDWORD lpFlags, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); WINSOCK_API_LINKAGE int WSAAPI WSARecvDisconnect( - IN SOCKET s, - IN LPWSABUF lpInboundDisconnectData OPTIONAL); + _In_ SOCKET s, + _In_opt_ __out_data_source(NETWORK) LPWSABUF lpInboundDisconnectData); WINSOCK_API_LINKAGE int WSAAPI WSARecvFrom( - IN SOCKET s, - IN OUT LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesRecvd OPTIONAL, - IN OUT LPDWORD lpFlags, - OUT struct sockaddr FAR *lpFrom, - IN OUT LPINT lpFromlen OPTIONAL, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET s, + _In_reads_(dwBufferCount) __out_data_source(NETWORK) LPWSABUF lpBuffers, + _In_ DWORD dwBufferCount, + _Out_opt_ LPDWORD lpNumberOfBytesRecvd, + _Inout_ LPDWORD lpFlags, + _Out_writes_bytes_to_opt_(*lpFromlen,*lpFromlen) struct sockaddr FAR *lpFrom, + _Inout_opt_ LPINT lpFromlen, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); WINSOCK_API_LINKAGE BOOL WSAAPI WSAResetEvent( - IN WSAEVENT hEvent); + _In_ WSAEVENT hEvent); WINSOCK_API_LINKAGE int WSAAPI WSASendDisconnect( - IN SOCKET s, - IN LPWSABUF lpOutboundDisconnectData OPTIONAL); + _In_ SOCKET s, + _In_opt_ LPWSABUF lpOutboundDisconnectData); WINSOCK_API_LINKAGE int WSAAPI WSASend( - IN SOCKET s, - IN LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesSent OPTIONAL, - IN DWORD dwFlags, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET s, + _In_reads_(dwBufferCount) LPWSABUF lpBuffers, + _In_ DWORD dwBufferCount, + _Out_opt_ LPDWORD lpNumberOfBytesSent, + _In_ DWORD dwFlags, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); WINSOCK_API_LINKAGE int WSAAPI WSASendTo( - IN SOCKET s, - IN LPWSABUF lpBuffers, - IN DWORD dwBufferCount, - OUT LPDWORD lpNumberOfBytesSent OPTIONAL, - IN DWORD dwFlags, - IN const struct sockaddr FAR *lpTo OPTIONAL, - IN int iTolen, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET s, + _In_reads_(dwBufferCount) LPWSABUF lpBuffers, + _In_ DWORD dwBufferCount, + _Out_opt_ LPDWORD lpNumberOfBytesSent, + _In_ DWORD dwFlags, + _In_reads_bytes_opt_(iTolen) const struct sockaddr FAR *lpTo, + _In_ int iTolen, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); WINSOCK_API_LINKAGE BOOL WSAAPI WSASetEvent( - IN WSAEVENT hEvent); + _In_ WSAEVENT hEvent); +_Must_inspect_result_ WINSOCK_API_LINKAGE SOCKET WSAAPI WSASocketA( - IN int af, - IN int type, - IN int protocol, - IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL, - IN GROUP g, - IN DWORD dwFlags); + _In_ int af, + _In_ int type, + _In_ int protocol, + _In_opt_ LPWSAPROTOCOL_INFOA lpProtocolInfo, + _In_ GROUP g, + _In_ DWORD dwFlags); +_Must_inspect_result_ WINSOCK_API_LINKAGE SOCKET WSAAPI WSASocketW( - IN int af, - IN int type, - IN int protocol, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL, - IN GROUP g, - IN DWORD dwFlags); + _In_ int af, + _In_ int type, + _In_ int protocol, + _In_opt_ LPWSAPROTOCOL_INFOW lpProtocolInfo, + _In_ GROUP g, + _In_ DWORD dwFlags); #ifdef UNICODE #define WSASocket WSASocketW @@ -2396,31 +2413,31 @@ WINSOCK_API_LINKAGE DWORD WSAAPI WSAWaitForMultipleEvents( - IN DWORD cEvents, - IN const WSAEVENT FAR *lphEvents, - IN BOOL fWaitAll, - IN DWORD dwTimeout, - IN BOOL fAlertable); + _In_ DWORD cEvents, + _In_reads_(cEvents) const WSAEVENT FAR *lphEvents, + _In_ BOOL fWaitAll, + _In_ DWORD dwTimeout, + _In_ BOOL fAlertable); WINSOCK_API_LINKAGE INT WSAAPI WSAAddressToStringA( - IN LPSOCKADDR lpsaAddress, - IN DWORD dwAddressLength, - IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL, - OUT LPSTR lpszAddressString, - IN OUT LPDWORD lpdwAddressStringLength); + _In_reads_bytes_(dwAddressLength) LPSOCKADDR lpsaAddress, + _In_ DWORD dwAddressLength, + _In_opt_ LPWSAPROTOCOL_INFOA lpProtocolInfo, + _Out_writes_to_(*lpdwAddressStringLength,*lpdwAddressStringLength) LPSTR lpszAddressString, + _Inout_ LPDWORD lpdwAddressStringLength); WINSOCK_API_LINKAGE INT WSAAPI WSAAddressToStringW( - IN LPSOCKADDR lpsaAddress, - IN DWORD dwAddressLength, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL, - OUT LPWSTR lpszAddressString, - IN OUT LPDWORD lpdwAddressStringLength); + _In_reads_bytes_(dwAddressLength) LPSOCKADDR lpsaAddress, + _In_ DWORD dwAddressLength, + _In_opt_ LPWSAPROTOCOL_INFOW lpProtocolInfo, + _Out_writes_to_(*lpdwAddressStringLength,*lpdwAddressStringLength) LPWSTR lpszAddressString, + _Inout_ LPDWORD lpdwAddressStringLength); #ifdef UNICODE #define WSAAddressToString WSAAddressToStringW @@ -2432,21 +2449,21 @@ WINSOCK_API_LINKAGE INT WSAAPI WSAStringToAddressA( - IN LPSTR AddressString, - IN INT AddressFamily, - IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL, - OUT LPSOCKADDR lpAddress, - IN OUT LPINT lpAddressLength); + _In_ LPSTR AddressString, + _In_ INT AddressFamily, + _In_opt_ LPWSAPROTOCOL_INFOA lpProtocolInfo, + _Out_writes_bytes_to_(*lpAddressLength,*lpAddressLength) LPSOCKADDR lpAddress, + _Inout_ LPINT lpAddressLength); WINSOCK_API_LINKAGE INT WSAAPI WSAStringToAddressW( - IN LPWSTR AddressString, - IN INT AddressFamily, - IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL, - OUT LPSOCKADDR lpAddress, - IN OUT LPINT lpAddressLength); + _In_ LPWSTR AddressString, + _In_ INT AddressFamily, + _In_opt_ LPWSAPROTOCOL_INFOW lpProtocolInfo, + _Out_writes_bytes_to_(*lpAddressLength,*lpAddressLength) LPSOCKADDR lpAddress, + _Inout_ LPINT lpAddressLength); #ifdef UNICODE #define WSAStringToAddress WSAStringToAddressW @@ -2458,17 +2475,17 @@ WINSOCK_API_LINKAGE INT WSAAPI WSALookupServiceBeginA( - IN LPWSAQUERYSETA lpqsRestrictions, - IN DWORD dwControlFlags, - OUT LPHANDLE lphLookup); + _In_ LPWSAQUERYSETA lpqsRestrictions, + _In_ DWORD dwControlFlags, + _Out_ LPHANDLE lphLookup); WINSOCK_API_LINKAGE INT WSAAPI WSALookupServiceBeginW( - IN LPWSAQUERYSETW lpqsRestrictions, - IN DWORD dwControlFlags, - OUT LPHANDLE lphLookup); + _In_ LPWSAQUERYSETW lpqsRestrictions, + _In_ DWORD dwControlFlags, + _Out_ LPHANDLE lphLookup); #ifdef UNICODE #define WSALookupServiceBegin WSALookupServiceBeginW @@ -2480,19 +2497,19 @@ WINSOCK_API_LINKAGE INT WSAAPI WSALookupServiceNextA( - IN HANDLE hLookup, - IN DWORD dwControlFlags, - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSAQUERYSETA lpqsResults); + _In_ HANDLE hLookup, + _In_ DWORD dwControlFlags, + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSAQUERYSETA lpqsResults); WINSOCK_API_LINKAGE INT WSAAPI WSALookupServiceNextW( - IN HANDLE hLookup, - IN DWORD dwControlFlags, - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSAQUERYSETW lpqsResults OPTIONAL); + _In_ HANDLE hLookup, + _In_ DWORD dwControlFlags, + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_opt_(*lpdwBufferLength,*lpdwBufferLength) LPWSAQUERYSETW lpqsResults); #ifdef UNICODE #define WSALookupServiceNext WSALookupServiceNextW @@ -2504,19 +2521,19 @@ WINSOCK_API_LINKAGE INT WSAAPI WSALookupServiceEnd( - IN HANDLE hLookup); + _In_ HANDLE hLookup); WINSOCK_API_LINKAGE INT WSAAPI WSAInstallServiceClassA( - IN LPWSASERVICECLASSINFOA lpServiceClassInfo); + _In_ LPWSASERVICECLASSINFOA lpServiceClassInfo); WINSOCK_API_LINKAGE INT WSAAPI WSAInstallServiceClassW( - IN LPWSASERVICECLASSINFOW lpServiceClassInfo); + _In_ LPWSASERVICECLASSINFOW lpServiceClassInfo); #ifdef UNICODE #define WSAInstallServiceClass WSAInstallServiceClassW @@ -2528,25 +2545,25 @@ WINSOCK_API_LINKAGE INT WSAAPI WSARemoveServiceClass( - IN LPGUID lpServiceClassId); + _In_ LPGUID lpServiceClassId); WINSOCK_API_LINKAGE INT WSAAPI WSAGetServiceClassInfoA( - IN LPGUID lpProviderId, - IN LPGUID lpServiceClassId, - IN OUT LPDWORD lpdwBufSize, - OUT LPWSASERVICECLASSINFOA lpServiceClassInfo); + _In_ LPGUID lpProviderId, + _In_ LPGUID lpServiceClassId, + _Inout_ LPDWORD lpdwBufSize, + _Out_writes_bytes_to_(*lpdwBufSize,*lpdwBufSize) LPWSASERVICECLASSINFOA lpServiceClassInfo); WINSOCK_API_LINKAGE INT WSAAPI WSAGetServiceClassInfoW( - IN LPGUID lpProviderId, - IN LPGUID lpServiceClassId, - IN OUT LPDWORD lpdwBufSize, - OUT LPWSASERVICECLASSINFOW lpServiceClassInfo); + _In_ LPGUID lpProviderId, + _In_ LPGUID lpServiceClassId, + _Inout_ LPDWORD lpdwBufSize, + _Out_writes_bytes_to_(*lpdwBufSize,*lpdwBufSize) LPWSASERVICECLASSINFOW lpServiceClassInfo); #ifdef UNICODE #define WSAGetServiceClassInfo WSAGetServiceClassInfoW @@ -2558,15 +2575,15 @@ WINSOCK_API_LINKAGE INT WSAAPI WSAEnumNameSpaceProvidersA( - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSANAMESPACE_INFOA lpnspBuffer); + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSANAMESPACE_INFOA lpnspBuffer); WINSOCK_API_LINKAGE INT WSAAPI WSAEnumNameSpaceProvidersW( - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSANAMESPACE_INFOW lpnspBuffer); + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSANAMESPACE_INFOW lpnspBuffer); #ifdef UNICODE #define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersW @@ -2574,21 +2591,23 @@ WSAEnumNameSpaceProvidersW( #define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersA #endif +_Success_(return == 0) WINSOCK_API_LINKAGE INT WSAAPI WSAGetServiceClassNameByClassIdA( - IN LPGUID lpServiceClassId, - OUT LPSTR lpszServiceClassName, - IN OUT LPDWORD lpdwBufferLength); + _In_ LPGUID lpServiceClassId, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPSTR lpszServiceClassName, + _Inout_ LPDWORD lpdwBufferLength); +_Success_(return == 0) WINSOCK_API_LINKAGE INT WSAAPI WSAGetServiceClassNameByClassIdW( - IN LPGUID lpServiceClassId, - OUT LPWSTR lpszServiceClassName, - IN OUT LPDWORD lpdwBufferLength); + _In_ LPGUID lpServiceClassId, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSTR lpszServiceClassName, + _Inout_ LPDWORD lpdwBufferLength); #ifdef UNICODE #define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdW @@ -2600,17 +2619,17 @@ WINSOCK_API_LINKAGE INT WSAAPI WSASetServiceA( - IN LPWSAQUERYSETA lpqsRegInfo, - IN WSAESETSERVICEOP essoperation, - IN DWORD dwControlFlags); + _In_ LPWSAQUERYSETA lpqsRegInfo, + _In_ WSAESETSERVICEOP essoperation, + _In_ DWORD dwControlFlags); WINSOCK_API_LINKAGE INT WSAAPI WSASetServiceW( - IN LPWSAQUERYSETW lpqsRegInfo, - IN WSAESETSERVICEOP essoperation, - IN DWORD dwControlFlags); + _In_ LPWSAQUERYSETW lpqsRegInfo, + _In_ WSAESETSERVICEOP essoperation, + _In_ DWORD dwControlFlags); #ifdef UNICODE #define WSASetService WSASetServiceW @@ -2622,23 +2641,23 @@ WINSOCK_API_LINKAGE INT WSAAPI WSAProviderConfigChange( - IN OUT LPHANDLE lpNotificationHandle OPTIONAL, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _Inout_ LPHANDLE lpNotificationHandle, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); #if(_WIN32_WINNT >= 0x0501) WINSOCK_API_LINKAGE INT WSAAPI WSANSPIoctl( - IN HANDLE hLookup, - IN DWORD dwControlCode, - IN LPVOID lpvInBuffer OPTIONAL, - IN DWORD cbInBuffer, - OUT LPVOID lpvOutBuffer OPTIONAL, - IN DWORD cbOutBuffer, - OUT LPDWORD lpcbBytesReturned, - IN LPWSACOMPLETION lpCompletion OPTIONAL); + _In_ HANDLE hLookup, + _In_ DWORD dwControlCode, + _In_reads_bytes_opt_(cbInBuffer) LPVOID lpvInBuffer, + _In_ DWORD cbInBuffer, + _Out_writes_bytes_to_opt_(cbOutBuffer, *lpcbBytesReturned) LPVOID lpvOutBuffer, + _In_ DWORD cbOutBuffer, + _Out_ LPDWORD lpcbBytesReturned, + _In_opt_ LPWSACOMPLETION lpCompletion); #endif /* (_WIN32_WINNT >= 0x0501) */ #if(_WIN32_WINNT >= 0x0600) @@ -2647,26 +2666,26 @@ WINSOCK_API_LINKAGE int WSAAPI WSASendMsg( - IN SOCKET Handle, - IN LPWSAMSG lpMsg, - IN DWORD dwFlags, - OUT LPDWORD lpNumberOfBytesSent OPTIONAL, - IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL, - IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL); + _In_ SOCKET Handle, + _In_ LPWSAMSG lpMsg, + _In_ DWORD dwFlags, + _Out_opt_ LPDWORD lpNumberOfBytesSent, + _Inout_opt_ LPWSAOVERLAPPED lpOverlapped, + _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); WINSOCK_API_LINKAGE INT WSAAPI WSAEnumNameSpaceProvidersExA( - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSANAMESPACE_INFOEXA lpnspBuffer); + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSANAMESPACE_INFOEXA lpnspBuffer); WINSOCK_API_LINKAGE INT WSAAPI WSAEnumNameSpaceProvidersExW( - IN OUT LPDWORD lpdwBufferLength, - OUT LPWSANAMESPACE_INFOEXW lpnspBuffer); + _Inout_ LPDWORD lpdwBufferLength, + _Out_writes_bytes_to_(*lpdwBufferLength,*lpdwBufferLength) LPWSANAMESPACE_INFOEXW lpnspBuffer); #ifdef UNICODE #define WSAEnumNameSpaceProvidersEx WSAEnumNameSpaceProvidersExW @@ -2678,9 +2697,9 @@ WINSOCK_API_LINKAGE int WSAAPI WSAPoll( - IN OUT LPWSAPOLLFD fdArray, - IN ULONG fds, - IN INT timeout); + _Inout_ LPWSAPOLLFD fdArray, + _In_ ULONG fds, + _In_ INT timeout); #endif /* (_WIN32_WINNT >= 0x0600) */ From d68b29a23494206be3a2f62a79f8922cd565bb14 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Mon, 23 Jan 2012 19:36:59 +0000 Subject: [PATCH 055/289] [FASTFAT] - Fix an if condition in VfatCreateFile causing opening a volume to always return access denied - Fix some DPRINT issues - Powered by VS11 svn path=/trunk/; revision=55127 --- reactos/drivers/filesystems/fastfat/create.c | 2 +- reactos/drivers/filesystems/fastfat/fsctl.c | 4 ++-- reactos/drivers/filesystems/fastfat/rw.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/filesystems/fastfat/create.c b/reactos/drivers/filesystems/fastfat/create.c index 3a2f5be23ba..d32eac3390e 100644 --- a/reactos/drivers/filesystems/fastfat/create.c +++ b/reactos/drivers/filesystems/fastfat/create.c @@ -453,7 +453,7 @@ VfatCreateFile ( PDEVICE_OBJECT DeviceObject, PIRP Irp ) if (FileObject->FileName.Length == 0 && (FileObject->RelatedFileObject == NULL || FileObject->RelatedFileObject->FsContext2 != NULL)) { - if (RequestedDisposition != FILE_OPEN || + if (RequestedDisposition != FILE_OPEN && RequestedDisposition != FILE_OPEN_IF) { return(STATUS_ACCESS_DENIED); diff --git a/reactos/drivers/filesystems/fastfat/fsctl.c b/reactos/drivers/filesystems/fastfat/fsctl.c index 6760ebfcbd9..0c1d0bcaee5 100644 --- a/reactos/drivers/filesystems/fastfat/fsctl.c +++ b/reactos/drivers/filesystems/fastfat/fsctl.c @@ -85,8 +85,8 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount, } PartitionInfoIsValid = TRUE; DPRINT("Partition Information:\n"); - DPRINT("StartingOffset %u\n", PartitionInfo.StartingOffset.QuadPart / 512); - DPRINT("PartitionLength %u\n", PartitionInfo.PartitionLength.QuadPart / 512); + DPRINT("StartingOffset %I64u\n", PartitionInfo.StartingOffset.QuadPart / 512); + DPRINT("PartitionLength %I64u\n", PartitionInfo.PartitionLength.QuadPart / 512); DPRINT("HiddenSectors %u\n", PartitionInfo.HiddenSectors); DPRINT("PartitionNumber %u\n", PartitionInfo.PartitionNumber); DPRINT("PartitionType %u\n", PartitionInfo.PartitionType); diff --git a/reactos/drivers/filesystems/fastfat/rw.c b/reactos/drivers/filesystems/fastfat/rw.c index 57edf7ef6bd..ab161833b33 100644 --- a/reactos/drivers/filesystems/fastfat/rw.c +++ b/reactos/drivers/filesystems/fastfat/rw.c @@ -355,7 +355,7 @@ VfatWriteFileData(PVFAT_IRP_CONTEXT IrpContext, DPRINT("VfatWriteFileData(DeviceExt %p, FileObject %p, " "Length %d, WriteOffset 0x%I64x), '%wZ'\n", DeviceExt, - IrpContext->FileObject, Length, WriteOffset, + IrpContext->FileObject, Length, WriteOffset.QuadPart, &Fcb->PathNameU); ASSERT(WriteOffset.QuadPart + Length <= Fcb->RFCB.AllocationSize.QuadPart); From 2ea0f55590b2af76c3e12c40e8765408ffd57774 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Mon, 23 Jan 2012 19:48:18 +0000 Subject: [PATCH 056/289] [NTOSKRNL/IO] - Always use interlocked operations on DeviceObject->ReferenceCount svn path=/trunk/; revision=55128 --- reactos/ntoskrnl/io/iomgr/device.c | 2 +- reactos/ntoskrnl/io/iomgr/file.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/device.c b/reactos/ntoskrnl/io/iomgr/device.c index 97643b680f8..f5f6dd6284b 100644 --- a/reactos/ntoskrnl/io/iomgr/device.c +++ b/reactos/ntoskrnl/io/iomgr/device.c @@ -486,7 +486,7 @@ IopDereferenceDeviceObject(IN PDEVICE_OBJECT DeviceObject, ASSERT(DeviceObject->ReferenceCount); /* Dereference the device */ - DeviceObject->ReferenceCount--; + InterlockedDecrement(&DeviceObject->ReferenceCount); /* * Check if we can unload it and it's safe to unload (or if we're forcing diff --git a/reactos/ntoskrnl/io/iomgr/file.c b/reactos/ntoskrnl/io/iomgr/file.c index 4898352bdad..6dacf5c833e 100644 --- a/reactos/ntoskrnl/io/iomgr/file.c +++ b/reactos/ntoskrnl/io/iomgr/file.c @@ -157,7 +157,7 @@ IopCheckDeviceAndDriver(IN POPEN_PACKET OpenPacket, else { /* Increase reference count */ - DeviceObject->ReferenceCount++; + InterlockedIncrement(&DeviceObject->ReferenceCount); return STATUS_SUCCESS; } } From 52654ceb2e55cc6fd3ee415e55170f0987ddf39f Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Mon, 23 Jan 2012 19:58:06 +0000 Subject: [PATCH 057/289] [DDK/XDK] - Disable VS11 warning about cast between different function classes (IO_DPC_ROUTINE to KDEFERRED_ROUTINE) where needed svn path=/trunk/; revision=55129 --- reactos/include/ddk/wdm.h | 8 ++++++++ reactos/include/xdk/iofuncs.h | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index 2cc168b29b1..f83b06ac71a 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -13763,9 +13763,16 @@ IoInitializeDpcRequest( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIO_DPC_ROUTINE DpcRoutine) { +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:28024) +#endif KeInitializeDpc(&DeviceObject->Dpc, (PKDEFERRED_ROUTINE) DpcRoutine, DeviceObject); +#ifdef _MSC_VER +#pragma warning(pop) +#endif } #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001 @@ -13821,6 +13828,7 @@ IoInitializeThreadedDpcRequest( { #ifdef _MSC_VER #pragma warning(push) +#pragma warning(disable:28024) #pragma warning(disable:28128) #endif KeInitializeThreadedDpc(&DeviceObject->Dpc, diff --git a/reactos/include/xdk/iofuncs.h b/reactos/include/xdk/iofuncs.h index 76a5d024fc3..85ed0fe1f7c 100644 --- a/reactos/include/xdk/iofuncs.h +++ b/reactos/include/xdk/iofuncs.h @@ -2793,9 +2793,16 @@ IoInitializeDpcRequest( _In_ PDEVICE_OBJECT DeviceObject, _In_ PIO_DPC_ROUTINE DpcRoutine) { +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:28024) +#endif KeInitializeDpc(&DeviceObject->Dpc, (PKDEFERRED_ROUTINE) DpcRoutine, DeviceObject); +#ifdef _MSC_VER +#pragma warning(pop) +#endif } #define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001 @@ -2851,6 +2858,7 @@ IoInitializeThreadedDpcRequest( { #ifdef _MSC_VER #pragma warning(push) +#pragma warning(disable:28024) #pragma warning(disable:28128) #endif KeInitializeThreadedDpc(&DeviceObject->Dpc, From 2d3c112a48a4e3555a76647949cb5f9527ca1c2e Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Mon, 23 Jan 2012 20:49:08 +0000 Subject: [PATCH 058/289] [NTOSKRNL] - Fix returning uninitialized status (CID 15086) svn path=/trunk/; revision=55130 --- reactos/ntoskrnl/se/sid.c | 67 ++++++++++++++------------------------- 1 file changed, 23 insertions(+), 44 deletions(-) diff --git a/reactos/ntoskrnl/se/sid.c b/reactos/ntoskrnl/se/sid.c index aefa07cd6e9..c0fa19d048e 100644 --- a/reactos/ntoskrnl/se/sid.c +++ b/reactos/ntoskrnl/se/sid.c @@ -266,7 +266,6 @@ SepCaptureSid(IN PSID InputSid, { ULONG SidSize = 0; PISID NewSid, Sid = (PISID)InputSid; - NTSTATUS Status; PAGED_CODE(); @@ -274,14 +273,9 @@ SepCaptureSid(IN PSID InputSid, { _SEH2_TRY { - ProbeForRead(Sid, - FIELD_OFFSET(SID, - SubAuthority), - sizeof(UCHAR)); + ProbeForRead(Sid, FIELD_OFFSET(SID, SubAuthority), sizeof(UCHAR)); SidSize = RtlLengthRequiredSid(Sid->SubAuthorityCount); - ProbeForRead(Sid, - SidSize, - sizeof(UCHAR)); + ProbeForRead(Sid, SidSize, sizeof(UCHAR)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -291,58 +285,43 @@ SepCaptureSid(IN PSID InputSid, _SEH2_END; /* allocate a SID and copy it */ - NewSid = ExAllocatePool(PoolType, - SidSize); - if (NewSid != NULL) - { - _SEH2_TRY - { - RtlCopyMemory(NewSid, - Sid, - SidSize); + NewSid = ExAllocatePool(PoolType, SidSize); + if (!NewSid) + return STATUS_INSUFFICIENT_RESOURCES; - *CapturedSid = NewSid; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Free the SID and return the exception code */ - ExFreePoolWithTag(NewSid, TAG_SID); - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; - } - else + _SEH2_TRY { - Status = STATUS_INSUFFICIENT_RESOURCES; + RtlCopyMemory(NewSid, Sid, SidSize); + + *CapturedSid = NewSid; } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Free the SID and return the exception code */ + ExFreePoolWithTag(NewSid, TAG_SID); + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; } else if (!CaptureIfKernel) { *CapturedSid = InputSid; - return STATUS_SUCCESS; } else { SidSize = RtlLengthRequiredSid(Sid->SubAuthorityCount); /* allocate a SID and copy it */ - NewSid = ExAllocatePool(PoolType, - SidSize); - if (NewSid != NULL) - { - RtlCopyMemory(NewSid, - Sid, - SidSize); + NewSid = ExAllocatePool(PoolType, SidSize); + if (NewSid == NULL) + return STATUS_INSUFFICIENT_RESOURCES; - *CapturedSid = NewSid; - } - else - { - Status = STATUS_INSUFFICIENT_RESOURCES; - } + RtlCopyMemory(NewSid, Sid, SidSize); + + *CapturedSid = NewSid; } - return Status; + return STATUS_SUCCESS; } VOID From fbabfef54dd43b4d77dbadd75324ef919e406be3 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 20:59:35 +0000 Subject: [PATCH 059/289] [MSI/BOOTDATA] * Improve and correct registering the CLISDs for MSI (they match Wine and Windows now). This reverts r55052. svn path=/trunk/; revision=55131 --- reactos/boot/bootdata/hivecls_i386.inf | 4 ---- reactos/dll/win32/msi/msi.rc | 3 +++ reactos/dll/win32/msi/msiserver.rgs | 8 ++++++++ 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 reactos/dll/win32/msi/msiserver.rgs diff --git a/reactos/boot/bootdata/hivecls_i386.inf b/reactos/boot/bootdata/hivecls_i386.inf index ece32a86ad8..db2a2d2384c 100644 --- a/reactos/boot/bootdata/hivecls_i386.inf +++ b/reactos/boot/bootdata/hivecls_i386.inf @@ -281,10 +281,6 @@ HKCR,"AVIFile\shell\open\command","",0x00020000,"%SystemRoot%\system32\mplay32.e HKCR,"CLSID",,0x00000012 -; For msi.dll -HKCR, "CLSID\{000C101D-0000-0000-C000-000000000046}", "DllVersion", "3.1.4000" -HKCR, "CLSID\{000C1090-0000-0000-C000-000000000046}", "InProcHandler32", "ole32.dll" - ; For Shell32.dll HKCR,"CLSID\{1F4DE370-D627-11D1-BA4F-00A0C91EEDBA}","",0x00000000,"Computer Search Results Folder" HKCR,"CLSID\{1F4DE370-D627-11D1-BA4F-00A0C91EEDBA}","LocalizedString",0x00020000,"@%SystemRoot%\system32\shell32.dll,-30521" diff --git a/reactos/dll/win32/msi/msi.rc b/reactos/dll/win32/msi/msi.rc index 019e3ad35c7..365891d22c7 100644 --- a/reactos/dll/win32/msi/msi.rc +++ b/reactos/dll/win32/msi/msi.rc @@ -66,6 +66,9 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* @makedep: msiserver.tlb */ 1 TYPELIB msiserver.tlb +/* @makedep: msiserver.rgs */ +2 WINE_REGISTRY msiserver.rgs + /* @makedep: instadvert.bmp */ 0x1001 BITMAP instadvert.bmp diff --git a/reactos/dll/win32/msi/msiserver.rgs b/reactos/dll/win32/msi/msiserver.rgs new file mode 100644 index 00000000000..9f408db4264 --- /dev/null +++ b/reactos/dll/win32/msi/msiserver.rgs @@ -0,0 +1,8 @@ +HKCR +{ + NoRemove CLSID + { + '{000C101D-0000-0000-C000-000000000046}' { DllVersion = s '3.1.4000' } + '{000C1090-0000-0000-C000-000000000046}' { InProcHandler32 = s 'ole32.dll' } + } +} From fc30d8ec5b15206e5f70a0881ab3dc7c8f79c9f9 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 21:40:37 +0000 Subject: [PATCH 060/289] [MSI] * Add some registration that was missing from the sync. svn path=/trunk/; revision=55132 --- reactos/dll/win32/msi/msi.rc | 2 + reactos/dll/win32/msi/msi.rgs | 83 +++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 reactos/dll/win32/msi/msi.rgs diff --git a/reactos/dll/win32/msi/msi.rc b/reactos/dll/win32/msi/msi.rc index 365891d22c7..333e6d1eb4a 100644 --- a/reactos/dll/win32/msi/msi.rc +++ b/reactos/dll/win32/msi/msi.rc @@ -69,6 +69,8 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* @makedep: msiserver.rgs */ 2 WINE_REGISTRY msiserver.rgs +3 WINE_REGISTRY msi.rgs + /* @makedep: instadvert.bmp */ 0x1001 BITMAP instadvert.bmp diff --git a/reactos/dll/win32/msi/msi.rgs b/reactos/dll/win32/msi/msi.rgs new file mode 100644 index 00000000000..fd09e8821ca --- /dev/null +++ b/reactos/dll/win32/msi/msi.rgs @@ -0,0 +1,83 @@ +HKCR +{ + NoRemove Interface + { + '{7BDE2046-D03B-4FFC-B84C-A098F38CFF0B}' = s 'IWineMsiRemoteDatabase' + { + NumMethods = s 8 + ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}' + } + '{902B3592-9D08-4DFD-A593-D07C52546421}' = s 'IWineMsiRemotePackage' + { + NumMethods = s 25 + ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}' + } + '{56D58B64-8780-4C22-A8BC-8B0B29E4A9F8}' = s 'IWineMsiRemoteCustomAction' + { + NumMethods = s 4 + ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}' + } + '{000C101C-0000-0000-C000-000000000046}' = s 'IMsiServer' + { + NumMethods = s 3 + ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}' + } + '{000C101D-0000-0000-C000-000000000046}' = s 'IMsiMessage' + { + NumMethods = s 3 + ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}' + } + '{000C1025-0000-0000-C000-000000000046}' = s 'IMsiCustomAction' + { + NumMethods = s 3 + ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}' + } + '{000C1033-0000-0000-C000-000000000046}' = s 'IMsiRemoteAPI' + { + NumMethods = s 3 + ProxyStubClsid32 = s '{000C103E-0000-0000-C000-000000000046}' + } + } + NoRemove CLSID + { + '{000C101C-0000-0000-C000-000000000046}' = s 'Msi install server' + { + ProgId = s 'IMsiServer' + } + '{000C101D-0000-0000-C000-000000000046}' = s 'Microsoft Windows Installer Message RPC' + { + ProgId = s 'WindowsInstaller.Message' + } + '{000C103E-0000-0000-C000-000000000046}' = s 'PSFactoryBuffer' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{000C1082-0000-0000-C000-000000000046}' = s 'MsiTransform' + { + } + '{000C1084-0000-0000-C000-000000000046}' = s 'MsiDatabase' + { + } + '{000C1086-0000-0000-C000-000000000046}' = s 'MsiPatch' + { + } + '{000C1094-0000-0000-C000-000000000046}' = s 'MsiServerX3' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + '{BA26E6FA-4F27-4F56-953A-3F90272018AA}' = s 'WineMsiRemoteCustomAction' + { + } + '{902B3592-9D08-4DFD-A593-D07C52546421}' = s 'WineMsiRemotePackage' + { + } + } + 'IMsiServer' = s 'Msi install server' + { + CLSID = s '{000C101C-0000-0000-C000-000000000046}' + } + 'WindowsInstaller.Message' = s 'Microsoft Windows Installer Message RPC' + { + CLSID = s '{000C101D-0000-0000-C000-000000000046}' + } +} From d32ee1f61162f69de82d3d6ccede3e3354d50ee8 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 23 Jan 2012 22:30:15 +0000 Subject: [PATCH 061/289] [PSDK] * Update dwmapi.h from Wine. svn path=/trunk/; revision=55133 --- reactos/include/psdk/dwmapi.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reactos/include/psdk/dwmapi.h b/reactos/include/psdk/dwmapi.h index 2cf5d6df8f8..b2546ae0201 100644 --- a/reactos/include/psdk/dwmapi.h +++ b/reactos/include/psdk/dwmapi.h @@ -30,6 +30,7 @@ extern "C" { #endif DECLARE_HANDLE(HTHUMBNAIL); +typedef HTHUMBNAIL *PHTHUMBNAIL; typedef struct _MilMatrix3x2D { @@ -53,12 +54,14 @@ typedef struct _DWM_BLURBEHIND BOOL fTransitionOnMaximized; } DWM_BLURBEHIND, *PDWM_BLURBEHIND; +DWMAPI DwmDefWindowProc(HWND, UINT, WPARAM, LPARAM, LRESULT*); DWMAPI DwmEnableBlurBehindWindow(HWND, const DWM_BLURBEHIND *); DWMAPI DwmEnableComposition(UINT); DWMAPI DwmEnableMMCSS(BOOL); DWMAPI DwmExtendFrameIntoClientArea(HWND,const MARGINS*); DWMAPI DwmGetColorizationColor(DWORD*,BOOL); DWMAPI DwmIsCompositionEnabled(BOOL*); +DWMAPI DwmRegisterThumbnail(HWND, HWND, PHTHUMBNAIL); DWMAPI DwmSetWindowAttribute(HWND, DWORD, LPCVOID, DWORD); DWMAPI DwmUnregisterThumbnail(HTHUMBNAIL); From 3c65192b651598a505694beb9a3e49367b00cd17 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 24 Jan 2012 13:50:22 +0000 Subject: [PATCH 062/289] [CRYPTNET] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55139 --- reactos/dll/win32/cryptnet/cryptnet_main.c | 133 +++++++++++++++------ reactos/media/doc/README.WINE | 2 +- 2 files changed, 98 insertions(+), 37 deletions(-) diff --git a/reactos/dll/win32/cryptnet/cryptnet_main.c b/reactos/dll/win32/cryptnet/cryptnet_main.c index 0b4e31dd9b7..5d063968974 100644 --- a/reactos/dll/win32/cryptnet/cryptnet_main.c +++ b/reactos/dll/win32/cryptnet/cryptnet_main.c @@ -60,8 +60,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) static const WCHAR cryptNet[] = { 'c','r','y','p','t','n','e','t','.', 'd','l','l',0 }; -static const WCHAR ldapProvOpenStore[] = { 'L','d','a','p','P','r','o','v', - 'O','p','e','S','t','o','r','e',0 }; /*********************************************************************** * DllRegisterServer (CRYPTNET.@) @@ -571,7 +569,7 @@ static BOOL CRYPT_GetObjectFromCache(LPCWSTR pszURL, PCRYPT_BLOB_ARRAY pObject, return ret; } -/* Parses the URL, and sets components's lpszHostName and lpszUrlPath members +/* Parses the URL, and sets components' lpszHostName and lpszUrlPath members * to NULL-terminated copies of those portions of the URL (to be freed with * CryptMemFree.) */ @@ -583,16 +581,25 @@ static BOOL CRYPT_CrackUrl(LPCWSTR pszURL, URL_COMPONENTSW *components) memset(components, 0, sizeof(*components)); components->dwStructSize = sizeof(*components); - components->lpszHostName = CryptMemAlloc(MAX_PATH * sizeof(WCHAR)); - components->dwHostNameLength = MAX_PATH; - components->lpszUrlPath = CryptMemAlloc(MAX_PATH * 2 * sizeof(WCHAR)); - components->dwUrlPathLength = 2 * MAX_PATH; + components->lpszHostName = CryptMemAlloc(INTERNET_MAX_HOST_NAME_LENGTH * sizeof(WCHAR)); + components->dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH; + if (!components->lpszHostName) + { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + components->lpszUrlPath = CryptMemAlloc(INTERNET_MAX_PATH_LENGTH * sizeof(WCHAR)); + components->dwUrlPathLength = INTERNET_MAX_PATH_LENGTH; + if (!components->lpszUrlPath) + { + CryptMemFree(components->lpszHostName); + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + ret = InternetCrackUrlW(pszURL, 0, ICU_DECODE, components); if (ret) { - if ((components->dwUrlPathLength == 2 * MAX_PATH - 1) || - (components->dwHostNameLength == MAX_PATH - 1)) - FIXME("Buffers are too small\n"); switch (components->nScheme) { case INTERNET_SCHEME_FTP: @@ -740,11 +747,15 @@ static void CRYPT_CacheURL(LPCWSTR pszURL, const CRYPT_BLOB_ARRAY *pObject, if (ret) lstrcpyW(cacheFileName, info->lpszLocalFileName); /* Check if the existing cache entry is up to date. If it isn't, - * overwite it with the new value. + * remove the existing cache entry, and create a new one with the + * new value. */ GetSystemTimeAsFileTime(&ft); if (CompareFileTime(&info->ExpireTime, &ft) < 0) + { create = TRUE; + DeleteUrlCacheEntryW(pszURL); + } CryptMemFree(info); } else @@ -814,7 +825,7 @@ static BOOL CRYPT_Connect(const URL_COMPONENTSW *components, components->nPort, context, pCredentials, phInt, phInt); *phHost = NULL; - *phInt = InternetOpenW(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, + *phInt = InternetOpenW(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, context ? INTERNET_FLAG_ASYNC : 0); if (*phInt) { @@ -1021,16 +1032,19 @@ static BOOL WINAPI File_RetrieveEncodedObjectW(LPCWSTR pszURL, *ppfnFreeObject = CRYPT_FreeBlob; *ppvFreeContext = NULL; - components.lpszUrlPath = CryptMemAlloc(MAX_PATH * 2 * sizeof(WCHAR)); - components.dwUrlPathLength = 2 * MAX_PATH; + components.lpszUrlPath = CryptMemAlloc(INTERNET_MAX_PATH_LENGTH * sizeof(WCHAR)); + components.dwUrlPathLength = INTERNET_MAX_PATH_LENGTH; + if (!components.lpszUrlPath) + { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + ret = InternetCrackUrlW(pszURL, 0, ICU_DECODE, &components); if (ret) { LPWSTR path; - if (components.dwUrlPathLength == 2 * MAX_PATH - 1) - FIXME("Buffers are too small\n"); - /* 3 == lstrlenW(L"c:") + 1 */ path = CryptMemAlloc((components.dwUrlPathLength + 3) * sizeof(WCHAR)); if (path) @@ -1083,6 +1097,11 @@ static BOOL WINAPI File_RetrieveEncodedObjectW(LPCWSTR pszURL, ret = FALSE; CryptMemFree(path); } + else + { + SetLastError(ERROR_OUTOFMEMORY); + ret = FALSE; + } } CryptMemFree(components.lpszUrlPath); return ret; @@ -1553,36 +1572,32 @@ BOOL WINAPI CryptRetrieveObjectByUrlW(LPCWSTR pszURL, LPCSTR pszObjectOid, return ret; } -static DWORD verify_cert_revocation_with_crl(PCCERT_CONTEXT cert, +static DWORD verify_cert_revocation_with_crl_online(PCCERT_CONTEXT cert, PCCRL_CONTEXT crl, DWORD index, FILETIME *pTime, PCERT_REVOCATION_STATUS pRevStatus) { DWORD error; + PCRL_ENTRY entry = NULL; - if (CertVerifyCRLTimeValidity(pTime, crl->pCrlInfo)) + CertFindCertificateInCRL(cert, crl, 0, NULL, &entry); + if (entry) { - /* The CRL isn't time valid */ - error = CRYPT_E_NO_REVOCATION_CHECK; + error = CRYPT_E_REVOKED; + pRevStatus->dwIndex = index; } else { - PCRL_ENTRY entry = NULL; - - CertFindCertificateInCRL(cert, crl, 0, NULL, &entry); - if (entry) - { - error = CRYPT_E_REVOKED; - pRevStatus->dwIndex = index; - } - else - error = ERROR_SUCCESS; + /* Since the CRL was retrieved for the cert being checked, then it's + * guaranteed to be fresh, and the cert is not revoked. + */ + error = ERROR_SUCCESS; } return error; } static DWORD verify_cert_revocation_from_dist_points_ext( const CRYPT_DATA_BLOB *value, PCCERT_CONTEXT cert, DWORD index, - FILETIME *pTime, DWORD dwFlags, PCERT_REVOCATION_PARA pRevPara, + FILETIME *pTime, DWORD dwFlags, const CERT_REVOCATION_PARA *pRevPara, PCERT_REVOCATION_STATUS pRevStatus) { DWORD error = ERROR_SUCCESS, cbUrlArray; @@ -1621,8 +1636,8 @@ static DWORD verify_cert_revocation_from_dist_points_ext( NULL, NULL, NULL, NULL); if (ret) { - error = verify_cert_revocation_with_crl(cert, crl, index, - pTime, pRevStatus); + error = verify_cert_revocation_with_crl_online(cert, crl, + index, pTime, pRevStatus); if (!error && timeout) { DWORD time = GetTickCount(); @@ -1692,6 +1707,45 @@ static DWORD verify_cert_revocation_from_aia_ext( return error; } +static DWORD verify_cert_revocation_with_crl_offline(PCCERT_CONTEXT cert, + PCCRL_CONTEXT crl, DWORD index, FILETIME *pTime, + PCERT_REVOCATION_STATUS pRevStatus) +{ + DWORD error; + LONG valid; + + valid = CompareFileTime(pTime, &crl->pCrlInfo->ThisUpdate); + if (valid <= 0) + { + /* If this CRL is not older than the time being verified, there's no + * way to know whether the certificate was revoked. + */ + TRACE("CRL not old enough\n"); + error = CRYPT_E_REVOCATION_OFFLINE; + } + else + { + PCRL_ENTRY entry = NULL; + + CertFindCertificateInCRL(cert, crl, 0, NULL, &entry); + if (entry) + { + error = CRYPT_E_REVOKED; + pRevStatus->dwIndex = index; + } + else + { + /* Since the CRL was not retrieved for the cert being checked, + * there's no guarantee it's fresh, so the cert *might* be okay, + * but it's safer not to guess. + */ + TRACE("certificate not found\n"); + error = CRYPT_E_REVOCATION_OFFLINE; + } + } + return error; +} + static DWORD verify_cert_revocation(PCCERT_CONTEXT cert, DWORD index, FILETIME *pTime, DWORD dwFlags, PCERT_REVOCATION_PARA pRevPara, PCERT_REVOCATION_STATUS pRevStatus) @@ -1757,18 +1811,25 @@ static DWORD verify_cert_revocation(PCCERT_CONTEXT cert, DWORD index, } if (crl) { - error = verify_cert_revocation_with_crl(cert, crl, index, - pTime, pRevStatus); + error = verify_cert_revocation_with_crl_offline(cert, crl, + index, pTime, pRevStatus); CertFreeCRLContext(crl); } else { + TRACE("no CRL found\n"); error = CRYPT_E_NO_REVOCATION_CHECK; pRevStatus->dwIndex = index; } } else { + if (!pRevPara) + WARN("no CERT_REVOCATION_PARA\n"); + else if (!pRevPara->hCrlStore) + WARN("no dist points/aia extension and no CRL store\n"); + else if (!pRevPara->pIssuerCert) + WARN("no dist points/aia extension and no issuer\n"); error = CRYPT_E_NO_REVOCATION_CHECK; pRevStatus->dwIndex = index; } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index e7e932fc33b..d21e5360dde 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -55,7 +55,7 @@ reactos/dll/win32/credui # Synced to Wine-1.3.37 reactos/dll/win32/crypt32 # Synced to Wine-1.3.37 reactos/dll/win32/cryptdlg # Synced to Wine-1.3.37 reactos/dll/win32/cryptdll # Synced to Wine-1.3.37 -reactos/dll/win32/cryptnet # Autosync +reactos/dll/win32/cryptnet # Synced to Wine-1.3.37 reactos/dll/win32/cryptui # Autosync reactos/dll/win32/dbghelp # Autosync reactos/dll/win32/dciman32 # Autosync From 5df9522396d4484a03d63ecddd1bd721798a6f19 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 24 Jan 2012 13:50:35 +0000 Subject: [PATCH 063/289] [CRYPTNET_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55140 --- rostests/winetests/cryptnet/cryptnet.c | 159 ++++++++++++++++++++----- 1 file changed, 130 insertions(+), 29 deletions(-) diff --git a/rostests/winetests/cryptnet/cryptnet.c b/rostests/winetests/cryptnet/cryptnet.c index 1cdafa4811c..683c6b676c7 100644 --- a/rostests/winetests/cryptnet/cryptnet.c +++ b/rostests/winetests/cryptnet/cryptnet.c @@ -316,7 +316,7 @@ static void make_tmp_file(LPSTR path) static void test_retrieveObjectByUrl(void) { BOOL ret; - char tmpfile[MAX_PATH * 2], *ptr, url[MAX_PATH + 8]; + char tmpfile[MAX_PATH * 2], url[MAX_PATH + 8]; CRYPT_BLOB_ARRAY *pBlobArray; PCCERT_CONTEXT cert; PCCRL_CONTEXT crl; @@ -332,17 +332,7 @@ static void test_retrieveObjectByUrl(void) GetLastError(), GetLastError()); make_tmp_file(tmpfile); - ptr = strchr(tmpfile, ':'); - if (ptr) - ptr += 2; /* skip colon and first slash */ - else - ptr = tmpfile; - snprintf(url, sizeof(url), "file:///%s", ptr); - do { - ptr = strchr(url, '\\'); - if (ptr) - *ptr = '/'; - } while (ptr); + snprintf(url, sizeof(url), "file://%s", tmpfile); pBlobArray = (CRYPT_BLOB_ARRAY *)0xdeadbeef; ret = CryptRetrieveObjectByUrlA(url, NULL, 0, 0, (void **)&pBlobArray, @@ -367,6 +357,7 @@ static void test_retrieveObjectByUrl(void) cert = (PCCERT_CONTEXT)0xdeadbeef; ret = CryptRetrieveObjectByUrlA(url, CONTEXT_OID_CERTIFICATE, 0, 0, (void **)&cert, NULL, NULL, NULL, NULL); + ok(ret, "CryptRetrieveObjectByUrlA failed: %d\n", GetLastError()); ok(cert && cert != (PCCERT_CONTEXT)0xdeadbeef, "Expected a cert\n"); if (cert && cert != (PCCERT_CONTEXT)0xdeadbeef) CertFreeCertificateContext(cert); @@ -374,12 +365,10 @@ static void test_retrieveObjectByUrl(void) SetLastError(0xdeadbeef); ret = CryptRetrieveObjectByUrlA(url, CONTEXT_OID_CRL, 0, 0, (void **)&crl, NULL, NULL, NULL, NULL); - /* w2k3,XP, newer w2k: CRYPT_E_NO_MATCH, 95: OSS_DATA_ERROR */ + /* w2k3,XP, newer w2k: CRYPT_E_NO_MATCH, older w2k: CRYPT_E_ASN1_BADTAG */ ok(!ret && (GetLastError() == CRYPT_E_NO_MATCH || - GetLastError() == CRYPT_E_ASN1_BADTAG || - GetLastError() == OSS_DATA_ERROR), - "got 0x%x/%u (expected CRYPT_E_NO_MATCH or CRYPT_E_ASN1_BADTAG or " - "OSS_DATA_ERROR)\n", GetLastError(), GetLastError()); + broken(GetLastError() == CRYPT_E_ASN1_BADTAG)), + "got 0x%x/%u (expected CRYPT_E_NO_MATCH)\n", GetLastError(), GetLastError()); /* only newer versions of cryptnet do the cleanup */ if(!ret && GetLastError() != CRYPT_E_ASN1_BADTAG && @@ -417,8 +406,8 @@ static void test_retrieveObjectByUrl(void) cert = (PCCERT_CONTEXT)0xdeadbeef; ret = CryptRetrieveObjectByUrlA(url, CONTEXT_OID_CERTIFICATE, 0, 0, (void **)&cert, NULL, NULL, NULL, &aux); - /* w2k: success, 9x: fail with E_INVALIDARG */ - ok(ret || (GetLastError() == E_INVALIDARG), + /* w2k: failure with E_INVALIDARG */ + ok(ret || broken(GetLastError() == E_INVALIDARG), "got %u with 0x%x/%u (expected '!=0' or '0' with E_INVALIDARG)\n", ret, GetLastError(), GetLastError()); if (cert && cert != (PCCERT_CONTEXT)0xdeadbeef) @@ -428,8 +417,8 @@ static void test_retrieveObjectByUrl(void) aux.cbSize = sizeof(aux); ret = CryptRetrieveObjectByUrlA(url, CONTEXT_OID_CERTIFICATE, 0, 0, (void **)&cert, NULL, NULL, NULL, &aux); - /* w2k: success, 9x: fail with E_INVALIDARG */ - ok(ret || (GetLastError() == E_INVALIDARG), + /* w2k: failure with E_INVALIDARG */ + ok(ret || broken(GetLastError() == E_INVALIDARG), "got %u with 0x%x/%u (expected '!=0' or '0' with E_INVALIDARG)\n", ret, GetLastError(), GetLastError()); if (!ret) { @@ -492,7 +481,7 @@ static const BYTE rootWithKeySignAndCRLSign[] = { 0x2e,0x7c,0xf2,0x06,0x9d,0xb3,0x3b,0x7e,0x2f,0xda,0x25,0x66,0x7e,0xa7,0x1f, 0x45,0xd4,0xf5,0xe3,0xdf,0x2a,0xf1,0x18,0x28,0x20,0xb5,0xf8,0xf5,0x8d,0x7a, 0x2e,0x84,0xee }; -static const BYTE eeCert[] = { +static const BYTE revokedCert[] = { 0x30,0x82,0x01,0xb9,0x30,0x82,0x01,0x22,0xa0,0x03,0x02,0x01,0x02,0x02,0x01, 0x01,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05, 0x00,0x30,0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x43, @@ -523,7 +512,37 @@ static const BYTE eeCert[] = { 0xd6,0x5e,0x0a,0x74,0xf2,0x85,0xa6,0xd5,0x3c,0x28,0xc0,0x89,0x5d,0xda,0xf3, 0xa6,0x01,0xc2,0xe9,0xa3,0xc1,0xb7,0x21,0x08,0xba,0x18,0x07,0x45,0xeb,0x77, 0x7d,0xcd,0xc6,0xe7,0x2a,0x7b,0x46,0xd2,0x3d,0xb5 }; -static const BYTE rootSignedCRL[] = { +static const BYTE unRevokedCert[] = { +0x30,0x82,0x01,0xa2,0x30,0x82,0x01,0x0d,0xa0,0x03,0x02,0x01,0x02,0x02,0x01, +0x02,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x30, +0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x43,0x65,0x72, +0x74,0x31,0x30,0x1e,0x17,0x0d,0x30,0x37,0x30,0x35,0x30,0x31,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x17,0x0d,0x30,0x37,0x31,0x30,0x30,0x31,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x30,0x24,0x31,0x22,0x30,0x0e,0x06,0x03,0x55,0x04,0x03, +0x13,0x07,0x66,0x6f,0x6f,0x2e,0x63,0x6f,0x6d,0x30,0x10,0x06,0x03,0x55,0x04, +0x03,0x13,0x09,0x2a,0x2e,0x66,0x6f,0x6f,0x2e,0x63,0x6f,0x6d,0x30,0x81,0x9d, +0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x03,0x81, +0x8d,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xb8,0x52,0xda,0xc5,0x4b,0x3f, +0xe5,0x33,0x0e,0x67,0x5f,0x48,0x21,0xdc,0x7e,0xef,0x37,0x33,0xba,0xff,0xb4, +0xc6,0xdc,0xb6,0x17,0x8e,0x20,0x55,0x07,0x12,0xd2,0x7b,0x3c,0xce,0x30,0xc5, +0xa7,0x48,0x9f,0x6e,0xfe,0xb8,0xbe,0xdb,0x9f,0x9b,0x17,0x60,0x16,0xde,0xc6, +0x8b,0x47,0xd1,0x57,0x71,0x3c,0x93,0xfc,0xbd,0xec,0x44,0x32,0x3b,0xb9,0xcf, +0x6b,0x05,0x72,0xa7,0x87,0x8e,0x7e,0xd4,0x9a,0x87,0x1c,0x2f,0xb7,0x82,0x40, +0xfc,0x6a,0x80,0x83,0x68,0x28,0xce,0x84,0xf4,0x0b,0x2e,0x44,0xcb,0x53,0xac, +0x85,0x85,0xb5,0x46,0x36,0x98,0x3c,0x10,0x02,0xaa,0x02,0xbc,0x8b,0xa2,0x23, +0xb2,0xd3,0x51,0x9a,0x22,0x4a,0xe3,0xaa,0x4e,0x7c,0xda,0x38,0xcf,0x49,0x98, +0x72,0xa3,0x02,0x03,0x01,0x00,0x01,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86, +0xf7,0x0d,0x01,0x01,0x05,0x03,0x81,0x81,0x00,0x9f,0x11,0x8a,0x0a,0x6e,0xb0, +0x73,0xcc,0x48,0xf1,0x92,0xca,0xaf,0x9a,0x3d,0xb9,0xcf,0xbe,0x84,0xd0,0xa8, +0x34,0x25,0x27,0x9d,0x28,0x68,0xc5,0x35,0x2b,0x84,0xff,0xdb,0xd0,0x1f,0x0d, +0xd7,0xd6,0x8c,0x1b,0x33,0x52,0x7d,0x19,0xd0,0xc2,0xf3,0x63,0xd6,0x55,0x45, +0xf9,0x46,0xa0,0xb7,0xb3,0x94,0xbb,0x25,0x9b,0x29,0x76,0x7c,0x11,0xc7,0x7b, +0xcc,0xcb,0x99,0x3c,0xae,0xe7,0x16,0xb5,0xa7,0x6a,0x1f,0x75,0x4a,0x58,0x65, +0xb1,0x5b,0x91,0x29,0x20,0x81,0x51,0x64,0x05,0x24,0xa5,0x77,0xb7,0x8e,0xc8, +0x32,0x0f,0x0d,0x4f,0xf9,0x78,0x0f,0xc4,0xef,0xd6,0x25,0x5a,0xa4,0x9b,0x07, +0x17,0xea,0x56,0xe2,0x7b,0x61,0x1c,0x2d,0x40,0x38,0x9a,0x24,0x64,0x4b,0x6d, +0x08,0x96 }; +static const BYTE rootSignedCRLWithBadAKI[] = { 0x30,0x82,0x01,0x1f,0x30,0x81,0x89,0x02,0x01,0x01,0x30,0x0d,0x06,0x09,0x2a, 0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x30,0x10,0x31,0x0e,0x30, 0x0c,0x06,0x03,0x55,0x04,0x03,0x13,0x05,0x43,0x65,0x72,0x74,0x31,0x17,0x0d, @@ -544,12 +563,31 @@ static const BYTE rootSignedCRL[] = { 0xa5,0xed,0xf9,0x77,0xb0,0x3c,0x81,0xcf,0xcc,0x49,0xb2,0x1a,0xc3,0xfd,0x34, 0xd5,0xbc,0xb0,0xd5,0xa5,0x9c,0x1b,0x72,0xc3,0x0f,0xa3,0xe3,0x3c,0xf0,0xc3, 0x91,0xe8,0x93,0x4f,0xd4,0x2f }; +static const BYTE rootSignedCRL[] = { +0x30,0x81,0xe6,0x30,0x53,0x30,0x0b,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x01,0x01,0x05,0x30,0x10,0x31,0x0e,0x30,0x0c,0x06,0x03,0x55,0x04,0x03,0x13, +0x05,0x43,0x65,0x72,0x74,0x31,0x17,0x0d,0x30,0x37,0x30,0x35,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5a,0x17,0x0d,0x30,0x37,0x31,0x32,0x33,0x31,0x32, +0x33,0x35,0x39,0x35,0x39,0x5a,0x30,0x14,0x30,0x12,0x02,0x01,0x01,0x17,0x0d, +0x30,0x37,0x31,0x30,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x0b, +0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x03,0x81,0x81,0x00, +0x94,0x84,0x0a,0xad,0x63,0xe3,0x05,0xc1,0xd8,0x94,0x44,0xeb,0x30,0x03,0xa1, +0xb4,0x7b,0x09,0x2f,0xf6,0xef,0x0f,0xe5,0x58,0x70,0x67,0xac,0x32,0x91,0xc0, +0x9d,0xf1,0x2b,0xf4,0xb3,0xcf,0xdd,0x1d,0x74,0x7b,0x6f,0x59,0x36,0x73,0xca, +0xcd,0x9c,0xb6,0xd9,0x35,0x39,0x45,0x8d,0xfd,0xf9,0x65,0xf3,0x42,0x2c,0x2c, +0xa6,0xfc,0xd2,0x23,0x6c,0x73,0x28,0x21,0x47,0x22,0x88,0x36,0x7d,0xd8,0xf0, +0xd0,0xca,0x11,0x20,0x50,0x6b,0x1e,0xb1,0x16,0x16,0xde,0xa6,0xc1,0x8d,0x18, +0xf1,0x42,0x22,0x1d,0x95,0x11,0xd7,0xa9,0x8f,0x90,0xe5,0x2f,0x71,0x52,0x47, +0xe0,0x45,0xb1,0x5a,0x2c,0x72,0x8a,0x25,0xca,0xd6,0x96,0xa2,0x7b,0x83,0x4c, +0xa3,0x24,0x7e,0xdd,0x45,0xa1,0x38,0xf8 }; -BOOL (WINAPI *pCertVerifyRevocation)(DWORD, DWORD, DWORD, void **, DWORD, +static BOOL (WINAPI *pCertVerifyRevocation)(DWORD, DWORD, DWORD, void **, DWORD, PCERT_REVOCATION_PARA, PCERT_REVOCATION_STATUS); /* Wednesday, Oct 1, 2007 */ static SYSTEMTIME oct2007 = { 2007, 10, 1, 1, 0, 0, 0, 0 }; +/* Tuesday, May 1, 2007 */ +static SYSTEMTIME may2007 = { 2007, 5, 2, 1, 0, 0, 0, 0 }; static void test_verifyRevocation(void) { @@ -570,7 +608,7 @@ static void test_verifyRevocation(void) if (0) { /* Crash */ - ret = pCertVerifyRevocation(0, 0, 0, NULL, 0, NULL, NULL); + pCertVerifyRevocation(0, 0, 0, NULL, 0, NULL, NULL); } SetLastError(0xdeadbeef); ret = pCertVerifyRevocation(0, 0, 0, NULL, 0, NULL, &status); @@ -600,7 +638,7 @@ static void test_verifyRevocation(void) certs[0] = CertCreateCertificateContext(X509_ASN_ENCODING, rootWithKeySignAndCRLSign, sizeof(rootWithKeySignAndCRLSign)); certs[1] = CertCreateCertificateContext(X509_ASN_ENCODING, - eeCert, sizeof(eeCert)); + revokedCert, sizeof(revokedCert)); /* The root cert itself can't be checked for revocation */ SetLastError(0xdeadbeef); ret = pCertVerifyRevocation(0, CERT_CONTEXT_REVOCATION_TYPE, @@ -632,7 +670,8 @@ static void test_verifyRevocation(void) revPara.hCrlStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, CERT_STORE_CREATE_NEW_FLAG, NULL); CertAddEncodedCRLToStore(revPara.hCrlStore, X509_ASN_ENCODING, - rootSignedCRL, sizeof(rootSignedCRL), CERT_STORE_ADD_ALWAYS, NULL); + rootSignedCRLWithBadAKI, sizeof(rootSignedCRLWithBadAKI), + CERT_STORE_ADD_ALWAYS, NULL); SetLastError(0xdeadbeef); ret = pCertVerifyRevocation(0, CERT_CONTEXT_REVOCATION_TYPE, 2, (void **)certs, 0, &revPara, &status); @@ -655,8 +694,9 @@ static void test_verifyRevocation(void) SetLastError(0xdeadbeef); ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, 1, (void **)&certs[1], 0, &revPara, &status); - /* Win2k thinks the cert is revoked, and it is, except the CRL is out of - * date, hence the revocation status should be unknown. + /* Win2k thinks the cert is revoked, and it is, except the CRL contains a + * bad authority key ID extension and can't be matched with the issuer + * cert, hence the revocation status should be unknown. */ ok(!ret && (GetLastError() == CRYPT_E_NO_REVOCATION_CHECK || broken(GetLastError() == CRYPT_E_REVOKED /* Win2k */)), @@ -679,6 +719,67 @@ static void test_verifyRevocation(void) "expected CRYPT_E_NO_REVOCATION_CHECK, got %08x\n", status.dwError); ok(status.dwIndex == 0, "expected index 0, got %d\n", status.dwIndex); CertCloseStore(revPara.hCrlStore, 0); + /* Test again with a valid CRL. This time, the cert should be revoked when + * the time is after the validity period of the CRL, or considered + * "revocation offline" when the checked time precedes the validity + * period of the CRL. + */ + revPara.hCrlStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + ret = CertAddEncodedCRLToStore(revPara.hCrlStore, X509_ASN_ENCODING, + rootSignedCRL, sizeof(rootSignedCRL), CERT_STORE_ADD_ALWAYS, NULL); + ok(ret, "CertAddEncodedCRLToStore failed: %08x\n", GetLastError()); + revPara.pftTimeToUse = NULL; + SetLastError(0xdeadbeef); + ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)&certs[1], 0, &revPara, &status); + ok(!ret && (GetLastError() == CRYPT_E_REVOKED || + broken(GetLastError() == CRYPT_E_NO_REVOCATION_CHECK /* NT4 */)), + "expected CRYPT_E_REVOKED, got %08x\n", GetLastError()); + revPara.pftTimeToUse = &time; + SetLastError(0xdeadbeef); + ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)&certs[1], 0, &revPara, &status); + ok(!ret && (GetLastError() == CRYPT_E_REVOKED || + broken(GetLastError() == CRYPT_E_NO_REVOCATION_CHECK /* NT4 */)), + "expected CRYPT_E_REVOKED, got %08x\n", GetLastError()); + SystemTimeToFileTime(&may2007, &time); + SetLastError(0xdeadbeef); + ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)&certs[1], 0, &revPara, &status); + ok(!ret && (GetLastError() == CRYPT_E_REVOCATION_OFFLINE || + broken(GetLastError() == CRYPT_E_NO_REVOCATION_CHECK /* NT4 */)), + "expected CRYPT_E_REVOCATION_OFFLINE, got %08x\n", GetLastError()); + CertFreeCertificateContext(certs[1]); + /* Test again with a valid CRL and an un-revoked cert. No matter the + * time checked, it's reported as revocation offline. + */ + certs[1] = CertCreateCertificateContext(X509_ASN_ENCODING, + unRevokedCert, sizeof(unRevokedCert)); + ok(certs[1] != NULL, "CertCreateCertificateContext failed: %08x\n", + GetLastError()); + revPara.pftTimeToUse = NULL; + SetLastError(0xdeadbeef); + ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)&certs[1], 0, &revPara, &status); + ok(!ret && (GetLastError() == CRYPT_E_REVOCATION_OFFLINE || + broken(GetLastError() == CRYPT_E_NO_REVOCATION_CHECK /* NT4 */)), + "expected CRYPT_E_REVOCATION_OFFLINE, got %08x\n", GetLastError()); + revPara.pftTimeToUse = &time; + SetLastError(0xdeadbeef); + ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)&certs[1], 0, &revPara, &status); + ok(!ret && (GetLastError() == CRYPT_E_REVOCATION_OFFLINE || + broken(GetLastError() == CRYPT_E_NO_REVOCATION_CHECK /* NT4 */)), + "expected CRYPT_E_REVOCATION_OFFLINE, got %08x\n", GetLastError()); + SystemTimeToFileTime(&may2007, &time); + SetLastError(0xdeadbeef); + ret = CertVerifyRevocation(X509_ASN_ENCODING, CERT_CONTEXT_REVOCATION_TYPE, + 1, (void **)&certs[1], 0, &revPara, &status); + ok(!ret && (GetLastError() == CRYPT_E_REVOCATION_OFFLINE || + broken(GetLastError() == CRYPT_E_NO_REVOCATION_CHECK /* NT4 */)), + "expected CRYPT_E_REVOCATION_OFFLINE, got %08x\n", GetLastError()); + CertCloseStore(revPara.hCrlStore, 0); CertFreeCertificateContext(certs[1]); CertFreeCertificateContext(certs[0]); } From 12d4780a2a102631d3f24d6be87614b044249509 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 24 Jan 2012 13:52:57 +0000 Subject: [PATCH 064/289] [DWMAPI] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55141 --- reactos/dll/win32/dwmapi/dwmapi.spec | 6 ++--- reactos/dll/win32/dwmapi/dwmapi_main.c | 32 ++++++++++++++++++++++++++ reactos/media/doc/README.WINE | 2 +- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/dwmapi/dwmapi.spec b/reactos/dll/win32/dwmapi/dwmapi.spec index 474587a7230..bb45563b814 100644 --- a/reactos/dll/win32/dwmapi/dwmapi.spec +++ b/reactos/dll/win32/dwmapi/dwmapi.spec @@ -21,7 +21,7 @@ 120 stub DWMAPI_120 @ stub DwmAttachMilContent -@ stub DwmDefWindowProc +@ stdcall DwmDefWindowProc(long long long long ptr) @ stub DwmDetachMilContent @ stdcall DwmEnableBlurBehindWindow(ptr ptr) @ stdcall DwmEnableMMCSS(long) @@ -32,11 +32,11 @@ @ stdcall DwmGetGraphicsStreamClient(long ptr) @ stdcall DwmGetGraphicsStreamTransformHint(long ptr) @ stdcall DwmGetTransportAttributes(ptr ptr ptr) -@ stub DwmGetWindowAttribute +@ stdcall DwmGetWindowAttribute(ptr long ptr long) @ stdcall DwmIsCompositionEnabled(ptr) @ stub DwmModifyPreviousDxFrameDuration @ stub DwmQueryThumbnailSourceSize -@ stub DwmRegisterThumbnail +@ stdcall DwmRegisterThumbnail(long long ptr) @ stub DwmSetDxFrameDuration @ stub DwmSetPresentParameters @ stdcall DwmSetWindowAttribute(long long ptr long) diff --git a/reactos/dll/win32/dwmapi/dwmapi_main.c b/reactos/dll/win32/dwmapi/dwmapi_main.c index fcc52c38264..39a99188a06 100644 --- a/reactos/dll/win32/dwmapi/dwmapi_main.c +++ b/reactos/dll/win32/dwmapi/dwmapi_main.c @@ -176,3 +176,35 @@ HRESULT WINAPI DwmEnableBlurBehindWindow(HWND hWnd, const DWM_BLURBEHIND *pBlurB return E_NOTIMPL; } + +/********************************************************************** + * DwmDefWindowProc (DWMAPI.@) + */ +BOOL WINAPI DwmDefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) +{ + static int i; + + if (!i++) FIXME("stub\n"); + + return FALSE; +} + +/********************************************************************** + * DwmGetWindowAttribute (DWMAPI.@) + */ +HRESULT WINAPI DwmGetWindowAttribute(HWND hwnd, DWORD attribute, PVOID pv_attribute, DWORD size) +{ + FIXME("(%p %d %p %d) stub\n", hwnd, attribute, pv_attribute, size); + + return E_NOTIMPL; +} + +/********************************************************************** + * DwmRegisterThumbnail (DWMAPI.@) + */ +HRESULT WINAPI DwmRegisterThumbnail(HWND dest, HWND src, PHTHUMBNAIL thumbnail_id) +{ + FIXME("(%p %p %p) stub\n", dest, src, thumbnail_id); + + return E_NOTIMPL; +} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index d21e5360dde..f7bff3f2a73 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -59,7 +59,7 @@ reactos/dll/win32/cryptnet # Synced to Wine-1.3.37 reactos/dll/win32/cryptui # Autosync reactos/dll/win32/dbghelp # Autosync reactos/dll/win32/dciman32 # Autosync -reactos/dll/win32/dwmapi # Autosync +reactos/dll/win32/dwmapi # Synced to Wine-1.3.37 reactos/dll/win32/fusion # Autosync reactos/dll/win32/gdiplus # Autosync reactos/dll/win32/hhctrl.ocx # Autosync From 6528ad11a0ac47217b5b3702ef05c430588f9ecc Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 24 Jan 2012 13:54:58 +0000 Subject: [PATCH 065/289] [HTTPAPI] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55142 --- reactos/dll/win32/httpapi/httpapi.spec | 2 +- reactos/dll/win32/httpapi/httpapi_main.c | 19 +++++++++++++++++++ reactos/media/doc/README.WINE | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/httpapi/httpapi.spec b/reactos/dll/win32/httpapi/httpapi.spec index a33286af206..7e5eede49a8 100644 --- a/reactos/dll/win32/httpapi/httpapi.spec +++ b/reactos/dll/win32/httpapi/httpapi.spec @@ -5,7 +5,7 @@ @ stub HttpCreateAppPool @ stub HttpCreateConfigGroup @ stub HttpCreateFilter -@ stub HttpCreateHttpHandle +@ stdcall HttpCreateHttpHandle(ptr long) @ stub HttpDeleteConfigGroup @ stdcall HttpDeleteServiceConfiguration(ptr long ptr long ptr) @ stub HttpFilterAccept diff --git a/reactos/dll/win32/httpapi/httpapi_main.c b/reactos/dll/win32/httpapi/httpapi_main.c index 7b29a15016d..3375cb6fdc4 100644 --- a/reactos/dll/win32/httpapi/httpapi_main.c +++ b/reactos/dll/win32/httpapi/httpapi_main.c @@ -157,3 +157,22 @@ ULONG WINAPI HttpSetServiceConfiguration( HANDLE handle, HTTP_SERVICE_CONFIG_ID FIXME( "(%p, %d, %p, %d, %p): stub!\n", handle, type, config, length, overlapped ); return NO_ERROR; } + +/*********************************************************************** + * HttpCreateHttpHandle (HTTPAPI.@) + * + * Creates a handle to the HTTP request queue + * + * PARAMS + * handle [O] handle to request queue + * reserved [I] reserved, must be NULL + * + * RETURNS + * NO_ERROR if function succeeds, or error code if function fails + * + */ +ULONG WINAPI HttpCreateHttpHandle( PHANDLE handle, ULONG reserved ) +{ + FIXME( "(%p, %d): stub!\n", handle, reserved); + return ERROR_CALL_NOT_IMPLEMENTED; +} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index f7bff3f2a73..081fefc68dd 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -65,7 +65,7 @@ reactos/dll/win32/gdiplus # Autosync reactos/dll/win32/hhctrl.ocx # Autosync reactos/dll/win32/hlink # Autosync reactos/dll/win32/hnetcfg # Autosync -reactos/dll/win32/httpapi # Autosync +reactos/dll/win32/httpapi # Synced to Wine-1.3.37 reactos/dll/win32/iccvid # Autosync reactos/dll/win32/icmp # Synced to Wine-0_9_10 reactos/dll/win32/imaadp32.acm # Autosync From db5937bfd827efbf0b5c42e0d919b795187ed7b8 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 24 Jan 2012 13:55:54 +0000 Subject: [PATCH 066/289] [PSDK] * Update mmddk.h from Wine. svn path=/trunk/; revision=55143 --- reactos/include/psdk/mmddk.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/reactos/include/psdk/mmddk.h b/reactos/include/psdk/mmddk.h index 5c5ec1e3951..70c0a84b982 100644 --- a/reactos/include/psdk/mmddk.h +++ b/reactos/include/psdk/mmddk.h @@ -380,6 +380,13 @@ typedef JOYDEVMSGPROC *LPJOYDEVMSGPROC; #define MCI_RECT 7 #define MCI_CONSTANT 8 #define MCI_END_CONSTANT 9 +#define MCI_HWND 10 +#define MCI_HPAL 11 +#define MCI_HDC 12 + +#ifdef _WIN64 +#define MCI_INTEGER64 13 +#endif /* _WIN64 */ #define MAKEMCIRESOURCE(wRet, wRes) MAKELRESULT((wRet), (wRes)) From d1c328619db4f9d898e9afd389a16beff86a459c Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 24 Jan 2012 14:02:18 +0000 Subject: [PATCH 067/289] [IMAADP32.ACM] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55144 --- reactos/dll/win32/imaadp32.acm/imaadp32.c | 14 +++----------- reactos/media/doc/README.WINE | 2 +- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/reactos/dll/win32/imaadp32.acm/imaadp32.c b/reactos/dll/win32/imaadp32.acm/imaadp32.c index 4e59448295f..f7b6ab13040 100644 --- a/reactos/dll/win32/imaadp32.acm/imaadp32.c +++ b/reactos/dll/win32/imaadp32.acm/imaadp32.c @@ -37,14 +37,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(adpcm); -/*********************************************************************** - * ADPCM_drvOpen - */ -static LRESULT ADPCM_drvOpen(LPCSTR str) -{ - return 1; -} - /*********************************************************************** * ADPCM_drvClose */ @@ -169,7 +161,7 @@ static void init_wfx_ima_adpcm(IMAADPCMWAVEFORMAT* awfx/*, DWORD nba*/) /*********************************************************************** * R16 * - * Read a 16 bit sample (correctly handles endianess) + * Read a 16 bit sample (correctly handles endianness) */ static inline short R16(const unsigned char* src) { @@ -179,7 +171,7 @@ static inline short R16(const unsigned char* src) /*********************************************************************** * W16 * - * Write a 16 bit sample (correctly handles endianess) + * Write a 16 bit sample (correctly handles endianness) */ static inline void W16(unsigned char* dst, short s) { @@ -928,7 +920,7 @@ LRESULT CALLBACK ADPCM_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, { case DRV_LOAD: return 1; case DRV_FREE: return 1; - case DRV_OPEN: return ADPCM_drvOpen((LPSTR)dwParam1); + case DRV_OPEN: return 1; case DRV_CLOSE: return ADPCM_drvClose(dwDevID); case DRV_ENABLE: return 1; case DRV_DISABLE: return 1; diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 081fefc68dd..8269d90b631 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -68,7 +68,7 @@ reactos/dll/win32/hnetcfg # Autosync reactos/dll/win32/httpapi # Synced to Wine-1.3.37 reactos/dll/win32/iccvid # Autosync reactos/dll/win32/icmp # Synced to Wine-0_9_10 -reactos/dll/win32/imaadp32.acm # Autosync +reactos/dll/win32/imaadp32.acm # Synced to Wine-1.3.37 reactos/dll/win32/imm32 # Autosync reactos/dll/win32/imagehlp # Autosync reactos/dll/win32/inetcomm # Autosync From b1675790133d18f4e7a984105dd84f93c362cbdd Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 24 Jan 2012 14:07:33 +0000 Subject: [PATCH 068/289] [MCIAVI32] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55145 --- reactos/dll/win32/mciavi32/info.c | 13 +-- reactos/dll/win32/mciavi32/mciavi.c | 12 ++- reactos/dll/win32/mciavi32/mciavi_res.rc | 100 +++++++++++--------- reactos/dll/win32/mciavi32/private_mciavi.h | 38 ++++---- reactos/media/doc/README.WINE | 2 +- 5 files changed, 87 insertions(+), 78 deletions(-) diff --git a/reactos/dll/win32/mciavi32/info.c b/reactos/dll/win32/mciavi32/info.c index b2ec0308cdd..668464cded1 100644 --- a/reactos/dll/win32/mciavi32/info.c +++ b/reactos/dll/win32/mciavi32/info.c @@ -211,16 +211,11 @@ DWORD MCIAVI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSW lpParms) WARN("Don't know this info command (%u)\n", dwFlags); ret = MCIERR_UNRECOGNIZED_COMMAND; } - if (str) { - if (strlenW(str) + 1 > lpParms->dwRetSize) { - ret = MCIERR_PARAM_OVERFLOW; - } else { - lstrcpynW(lpParms->lpstrReturn, str, lpParms->dwRetSize); - } - } else { - lpParms->lpstrReturn[0] = 0; + if (!ret) { + WCHAR zero = 0; + /* Only mciwave, mciseq and mcicda set dwRetSize (since NT). */ + lstrcpynW(lpParms->lpstrReturn, str ? str : &zero, lpParms->dwRetSize); } - LeaveCriticalSection(&wma->cs); return ret; } diff --git a/reactos/dll/win32/mciavi32/mciavi.c b/reactos/dll/win32/mciavi32/mciavi.c index 731083eea15..c78ddc058be 100644 --- a/reactos/dll/win32/mciavi32/mciavi.c +++ b/reactos/dll/win32/mciavi32/mciavi.c @@ -26,11 +26,13 @@ * - synchronization between audio and video (especially for interleaved * files) * - robustness when reading file can be enhanced - * - better move the AVI handling part to avifile DLL and make use of it + * - reimplement the AVI handling part with avifile DLL because + * "open @1122334 type avivideo alias a" expects an AVIFile/Stream + * and MCI_DGV_SET|STATUS_SPEED maps to Rate/Scale * - some files appear to have more than one audio stream (we only play the * first one) * - some files contain an index of audio/video frame. Better use it, - * instead of rebuilding it + * instead of rebuilding it (AVIFile does that already) * - stopping while playing a file with sound blocks until all buffered * audio is played... still should be stopped ASAP */ @@ -256,6 +258,12 @@ static DWORD MCIAVI_mciOpen(UINT wDevID, DWORD dwFlags, wma->lpFileName = HeapAlloc(GetProcessHeap(), 0, (strlenW(lpOpenParms->lpstrElementName) + 1) * sizeof(WCHAR)); strcpyW(wma->lpFileName, lpOpenParms->lpstrElementName); + if (lpOpenParms->lpstrElementName[0] == '@') { + /* The file name @11223344 encodes an AVIFile handle in decimal notation + * in Win3.1 and w2k/NT, but this feature is absent in win95 (KB140750). + * wma->hFile = LongToHandle(strtolW(lpOpenParms->lpstrElementName+1, NULL, 10)); */ + FIXME("Using AVIFile/Stream %s NIY\n", debugstr_w(lpOpenParms->lpstrElementName)); + } wma->hFile = mmioOpenW(lpOpenParms->lpstrElementName, NULL, MMIO_ALLOCBUF | MMIO_DENYWRITE | MMIO_READ); diff --git a/reactos/dll/win32/mciavi32/mciavi_res.rc b/reactos/dll/win32/mciavi32/mciavi_res.rc index d1e8faca3ec..e2e4caa805c 100644 --- a/reactos/dll/win32/mciavi32/mciavi_res.rc +++ b/reactos/dll/win32/mciavi32/mciavi_res.rc @@ -22,9 +22,15 @@ #include "mmddk.h" #include "digitalv.h" +#ifdef MCI_INTEGER64 +#define MCI_DWORD_PTR MCI_INTEGER64 +#else +#define MCI_DWORD_PTR MCI_INTEGER +#endif + MCIAVI RCDATA BEGIN -L"play\0", 0x00000806L, MCI_COMMAND_HEAD, +L"play\0", MCI_PLAY, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -36,8 +42,8 @@ L"window\0", 0x01000000L, MCI_FLAG, L"fullscreen by 2\0", 0x04000000L, MCI_FLAG, L"fullscreen\0", 0x02000000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"capability\0", 0x0000080bL, MCI_COMMAND_HEAD, -L"\0", 0x00000002L, MCI_RETURN, +L"capability\0", MCI_GETDEVCAPS, 0, MCI_COMMAND_HEAD, +L"\0", MCI_INTEGER, 0, MCI_RETURN, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -65,23 +71,23 @@ L"minimum play rate\0", 0x0000400bL, MCI_INTEGER, L"can colorkey\0", 0x00004100L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_CONSTANT, L"\0", 0x00000000L, MCI_END_COMMAND, -L"capture\0", 0x00000870L, MCI_COMMAND_HEAD, +L"capture\0", MCI_CAPTURE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"as\0", 0x00010000L, MCI_STRING, L"at\0", 0x00020000L, MCI_RECT, L"\0", 0x00000000L, MCI_END_COMMAND, -L"close\0", 0x00000804L, MCI_COMMAND_HEAD, +L"close\0", MCI_CLOSE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"configure\0", 0x0000087aL, MCI_COMMAND_HEAD, +L"configure\0", MCI_CONFIGURE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"copy\0", 0x00000852L, MCI_COMMAND_HEAD, +L"copy\0", MCI_COPY, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -91,7 +97,7 @@ L"at\0", 0x00010000L, MCI_RECT, L"audio stream\0", 0x00020000L, MCI_INTEGER, L"video stream\0", 0x00040000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"cue\0", 0x00000830L, MCI_COMMAND_HEAD, +L"cue\0", MCI_CUE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -100,7 +106,7 @@ L"output\0", 0x00020000L, MCI_FLAG, L"to\0", 0x00000008L, MCI_INTEGER, L"noshow\0", 0x00040000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"cut\0", 0x00000851L, MCI_COMMAND_HEAD, +L"cut\0", MCI_CUT, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -110,7 +116,7 @@ L"at\0", 0x00010000L, MCI_RECT, L"audio stream\0", 0x00020000L, MCI_INTEGER, L"video stream\0", 0x00040000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"delete\0", 0x00000856L, MCI_COMMAND_HEAD, +L"delete\0", MCI_DELETE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -120,15 +126,15 @@ L"at\0", 0x00010000L, MCI_RECT, L"audio stream\0", 0x00020000L, MCI_INTEGER, L"video stream\0", 0x00040000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"freeze\0", 0x00000844L, MCI_COMMAND_HEAD, +L"freeze\0", MCI_FREEZE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"at\0", 0x00010000L, MCI_RECT, L"outside\0", 0x00020000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"info\0", 0x0000080aL, MCI_COMMAND_HEAD, -L"\0", 0x00000001L, MCI_RETURN, +L"info\0", MCI_INFO, 0, MCI_COMMAND_HEAD, +L"\0", MCI_STRING, 0, MCI_RETURN, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -146,8 +152,8 @@ L"video algorithm\0", 0x00004006L, MCI_INTEGER, L"video quality\0", 0x00004003L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_CONSTANT, L"\0", 0x00000000L, MCI_END_COMMAND, -L"list\0", 0x00000878L, MCI_COMMAND_HEAD, -L"\0", 0x00000001L, MCI_RETURN, +L"list\0", MCI_LIST, 0, MCI_COMMAND_HEAD, +L"\0", MCI_STRING, 0, MCI_RETURN, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -166,13 +172,13 @@ L"video stream\0", 0x00004007L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_CONSTANT, L"algorithm\0", 0x00080000L, MCI_STRING, L"\0", 0x00000000L, MCI_END_COMMAND, -L"load\0", 0x00000850L, MCI_COMMAND_HEAD, +L"load\0", MCI_LOAD, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"\0", 0x00000100L, MCI_STRING, L"\0", 0x00000000L, MCI_END_COMMAND, -L"monitor\0", 0x00000871L, MCI_COMMAND_HEAD, +L"monitor\0", MCI_MONITOR, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -186,8 +192,8 @@ L"post\0", 0x0000a001L, MCI_INTEGER, L"direct\0", 0x0000a002L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_CONSTANT, L"\0", 0x00000000L, MCI_END_COMMAND, -L"open\0", 0x00000803L, MCI_COMMAND_HEAD, -L"\0", 0x00000002L, MCI_RETURN, +L"open\0", MCI_OPEN, 0, MCI_COMMAND_HEAD, +L"\0", MCI_INTEGER, 0, MCI_RETURN, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"type\0", 0x00002000L, MCI_STRING, @@ -199,10 +205,10 @@ L"overlapped\0", 0x00cf0000L, MCI_INTEGER, L"popup\0", 0x80880000L, MCI_INTEGER, L"child\0", 0x40000000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_CONSTANT, -L"parent\0", 0x00020000L, MCI_INTEGER, +L"parent\0", 0x00020000L, MCI_HWND, L"nostatic\0", 0x00040000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"paste\0", 0x00000853L, MCI_COMMAND_HEAD, +L"paste\0", MCI_PASTE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -213,12 +219,12 @@ L"overwrite\0", 0x00100000L, MCI_FLAG, L"audio stream\0", 0x00020000L, MCI_INTEGER, L"video stream\0", 0x00040000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"pause\0", 0x00000809L, MCI_COMMAND_HEAD, +L"pause\0", MCI_PAUSE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"put\0", 0x00000842L, MCI_COMMAND_HEAD, +L"put\0", MCI_PUT, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -230,7 +236,7 @@ L"video\0", 0x00100000L, MCI_FLAG, L"window\0", 0x00200000L, MCI_FLAG, L"client\0", 0x00400000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"quality\0", 0x00000877L, MCI_COMMAND_HEAD, +L"quality\0", MCI_QUALITY, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -244,14 +250,14 @@ L"algorithm\0", 0x00040000L, MCI_STRING, L"dialog\0", 0x00080000L, MCI_FLAG, L"handle\0", 0x00100000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"realize\0", 0x00000840L, MCI_COMMAND_HEAD, +L"realize\0", MCI_REALIZE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"normal\0", 0x00010000L, MCI_FLAG, L"background\0", 0x00020000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"record\0", 0x0000080fL, MCI_COMMAND_HEAD, +L"record\0", MCI_RECORD, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -264,26 +270,26 @@ L"hold\0", 0x00020000L, MCI_FLAG, L"audio stream\0", 0x00040000L, MCI_INTEGER, L"video stream\0", 0x00080000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"reserve\0", 0x00000872L, MCI_COMMAND_HEAD, +L"reserve\0", MCI_RESERVE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"in\0", 0x00010000L, MCI_STRING, L"size\0", 0x00020000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"restore\0", 0x0000087bL, MCI_COMMAND_HEAD, +L"restore\0", MCI_RESTORE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"from\0", 0x00010000L, MCI_STRING, L"at\0", 0x00020000L, MCI_RECT, L"\0", 0x00000000L, MCI_END_COMMAND, -L"resume\0", 0x00000855L, MCI_COMMAND_HEAD, +L"resume\0", MCI_RESUME, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"save\0", 0x00000813L, MCI_COMMAND_HEAD, +L"save\0", MCI_SAVE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -292,7 +298,7 @@ L"at\0", 0x00010000L, MCI_RECT, L"abort\0", 0x00020000L, MCI_FLAG, L"keepreserve\0", 0x00040000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"seek\0", 0x00000807L, MCI_COMMAND_HEAD, +L"seek\0", MCI_SEEK, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -300,7 +306,7 @@ L"to start\0", 0x00000100L, MCI_FLAG, L"to end\0", 0x00000200L, MCI_FLAG, L"to\0", 0x00000008L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"set\0", 0x0000080dL, MCI_COMMAND_HEAD, +L"set\0", MCI_SET, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -334,7 +340,7 @@ L"on\0", 0x00002000L, MCI_FLAG, L"off\0", 0x00004000L, MCI_FLAG, L"speed\0", 0x00020000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"setaudio\0", 0x00000873L, MCI_COMMAND_HEAD, +L"setaudio\0", MCI_SETAUDIO, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -367,7 +373,7 @@ L"off\0", 0x00004000L, MCI_FLAG, L"input\0", 0x02000000L, MCI_FLAG, L"output\0", 0x04000000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"setvideo\0", 0x00000876L, MCI_COMMAND_HEAD, +L"setvideo\0", MCI_SETVIDEO, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -404,7 +410,7 @@ L"off\0", 0x00004000L, MCI_FLAG, L"input\0", 0x02000000L, MCI_FLAG, L"output\0", 0x04000000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"signal\0", 0x00000875L, MCI_COMMAND_HEAD, +L"signal\0", MCI_SIGNAL, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -414,8 +420,8 @@ L"uservalue\0", 0x00040000L, MCI_INTEGER, L"cancel\0", 0x00080000L, MCI_FLAG, L"return position\0", 0x00100000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"status\0", 0x00000814L, MCI_COMMAND_HEAD, -L"\0", 0x00000002L, MCI_RETURN, +L"status\0", MCI_STATUS, 0, MCI_COMMAND_HEAD, +L"\0", MCI_DWORD_PTR, 0, MCI_RETURN, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -494,40 +500,40 @@ L"output\0", 0x00800000L, MCI_FLAG, L"disk space\0", 0x00200000L, MCI_STRING, L"reference\0", 0x00040000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"step\0", 0x0000080eL, MCI_COMMAND_HEAD, +L"step\0", MCI_STEP, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"reverse\0", 0x00010000L, MCI_FLAG, L"by\0", 0x00020000L, MCI_INTEGER, L"\0", 0x00000000L, MCI_END_COMMAND, -L"stop\0", 0x00000808L, MCI_COMMAND_HEAD, +L"stop\0", MCI_STOP, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"hold\0", 0x00010000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"undo\0", 0x00000879L, MCI_COMMAND_HEAD, +L"undo\0", MCI_UNDO, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"unfreeze\0", 0x00000845L, MCI_COMMAND_HEAD, +L"unfreeze\0", MCI_UNFREEZE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"at\0", 0x00010000L, MCI_RECT, L"\0", 0x00000000L, MCI_END_COMMAND, -L"update\0", 0x00000854L, MCI_COMMAND_HEAD, +L"update\0", MCI_UPDATE, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"at\0", 0x00010000L, MCI_RECT, -L"hdc\0", 0x00020000L, MCI_INTEGER, +L"hdc\0", 0x00020000L, MCI_HDC, L"paint\0", 0x00040000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"where\0", 0x00000843L, MCI_COMMAND_HEAD, -L"\0", 0x00000007L, MCI_RETURN, +L"where\0", MCI_WHERE, 0, MCI_COMMAND_HEAD, +L"\0", MCI_RECT, 0, MCI_RETURN, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, @@ -539,12 +545,12 @@ L"window\0", 0x00200000L, MCI_FLAG, L"max\0", 0x00400000L, MCI_FLAG, L"min\0", 0x00800000L, MCI_FLAG, L"\0", 0x00000000L, MCI_END_COMMAND, -L"window\0", 0x00000841L, MCI_COMMAND_HEAD, +L"window\0", MCI_WINDOW, 0, MCI_COMMAND_HEAD, L"notify\0", 0x00000001L, MCI_FLAG, L"wait\0", 0x00000002L, MCI_FLAG, L"test\0", 0x00000020L, MCI_FLAG, L"handle\0", 0x00010000L, MCI_CONSTANT, -L"default\0", 0x00000000L, MCI_INTEGER, +L"default\0", 0x00000000L, MCI_HWND, L"\0", 0x00000000L, MCI_END_CONSTANT, L"state\0", 0x00040000L, MCI_CONSTANT, L"hide\0", 0x00000000L, MCI_INTEGER, diff --git a/reactos/dll/win32/mciavi32/private_mciavi.h b/reactos/dll/win32/mciavi32/private_mciavi.h index 548254c5a4f..1ee0eb3432a 100644 --- a/reactos/dll/win32/mciavi32/private_mciavi.h +++ b/reactos/dll/win32/mciavi32/private_mciavi.h @@ -82,32 +82,32 @@ typedef struct { HANDLE ack_event; /* acknowledge that an async command has started */ } WINE_MCIAVI; -extern HINSTANCE MCIAVI_hInstance; +extern HINSTANCE MCIAVI_hInstance DECLSPEC_HIDDEN; /* info.c */ -DWORD MCIAVI_ConvertTimeFormatToFrame(WINE_MCIAVI* wma, DWORD val); -DWORD MCIAVI_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms); -DWORD MCIAVI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSW lpParms); -DWORD MCIAVI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SET_PARMS lpParms); -DWORD MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpParms); +DWORD MCIAVI_ConvertTimeFormatToFrame(WINE_MCIAVI* wma, DWORD val) DECLSPEC_HIDDEN; +DWORD MCIAVI_mciGetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms) DECLSPEC_HIDDEN; +DWORD MCIAVI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_INFO_PARMSW lpParms) DECLSPEC_HIDDEN; +DWORD MCIAVI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SET_PARMS lpParms) DECLSPEC_HIDDEN; +DWORD MCIAVI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_DGV_STATUS_PARMSW lpParms) DECLSPEC_HIDDEN; /* mmoutput.c */ -BOOL MCIAVI_GetInfo(WINE_MCIAVI* wma); -DWORD MCIAVI_OpenAudio(WINE_MCIAVI* wma, unsigned* nHdr, LPWAVEHDR* pWaveHdr); -BOOL MCIAVI_OpenVideo(WINE_MCIAVI* wma); -void MCIAVI_PlayAudioBlocks(WINE_MCIAVI* wma, unsigned nHdr, LPWAVEHDR waveHdr); -LRESULT MCIAVI_PaintFrame(WINE_MCIAVI* wma, HDC hDC); +BOOL MCIAVI_GetInfo(WINE_MCIAVI* wma) DECLSPEC_HIDDEN; +DWORD MCIAVI_OpenAudio(WINE_MCIAVI* wma, unsigned* nHdr, LPWAVEHDR* pWaveHdr) DECLSPEC_HIDDEN; +BOOL MCIAVI_OpenVideo(WINE_MCIAVI* wma) DECLSPEC_HIDDEN; +void MCIAVI_PlayAudioBlocks(WINE_MCIAVI* wma, unsigned nHdr, LPWAVEHDR waveHdr) DECLSPEC_HIDDEN; +LRESULT MCIAVI_PaintFrame(WINE_MCIAVI* wma, HDC hDC) DECLSPEC_HIDDEN; /* mciavi.c */ -WINE_MCIAVI* MCIAVI_mciGetOpenDev(UINT wDevID); -DWORD MCIAVI_mciClose(UINT, DWORD, LPMCI_GENERIC_PARMS); +WINE_MCIAVI* MCIAVI_mciGetOpenDev(UINT wDevID) DECLSPEC_HIDDEN; +DWORD MCIAVI_mciClose(UINT, DWORD, LPMCI_GENERIC_PARMS) DECLSPEC_HIDDEN; /* wnd.c */ -BOOL MCIAVI_RegisterClass(void); -BOOL MCIAVI_UnregisterClass(void); -BOOL MCIAVI_CreateWindow(WINE_MCIAVI* wma, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSW lpOpenParms); -DWORD MCIAVI_mciPut(UINT wDevID, DWORD dwFlags, LPMCI_DGV_PUT_PARMS lpParms); -DWORD MCIAVI_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms); -DWORD MCIAVI_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMSW lpParms); +BOOL MCIAVI_RegisterClass(void) DECLSPEC_HIDDEN; +BOOL MCIAVI_UnregisterClass(void) DECLSPEC_HIDDEN; +BOOL MCIAVI_CreateWindow(WINE_MCIAVI* wma, DWORD dwFlags, LPMCI_DGV_OPEN_PARMSW lpOpenParms) DECLSPEC_HIDDEN; +DWORD MCIAVI_mciPut(UINT wDevID, DWORD dwFlags, LPMCI_DGV_PUT_PARMS lpParms) DECLSPEC_HIDDEN; +DWORD MCIAVI_mciWhere(UINT wDevID, DWORD dwFlags, LPMCI_DGV_RECT_PARMS lpParms) DECLSPEC_HIDDEN; +DWORD MCIAVI_mciWindow(UINT wDevID, DWORD dwFlags, LPMCI_DGV_WINDOW_PARMSW lpParms) DECLSPEC_HIDDEN; #endif /* __WINE_PRIVATE_MCIAVI_H */ diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 8269d90b631..626041f82f9 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -83,7 +83,7 @@ reactos/dll/win32/localspl # Autosync reactos/dll/win32/localui # Autosync reactos/dll/win32/lz32 # Autosync reactos/dll/win32/mapi32 # Autosync -reactos/dll/win32/mciavi32 # Autosync +reactos/dll/win32/mciavi32 # Synced to Wine-1.3.37 reactos/dll/win32/mcicda # Autosync reactos/dll/win32/mciqtz32 # Autosync reactos/dll/win32/mciseq # Autosync From 90350df69a35b746e4d8f26e5c6f1439ac0e1b50 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 24 Jan 2012 14:10:25 +0000 Subject: [PATCH 069/289] [DDK] * Update classpnp.h annotations. svn path=/trunk/; revision=55146 --- reactos/include/ddk/classpnp.h | 552 ++++++++++++++++++--------------- 1 file changed, 309 insertions(+), 243 deletions(-) diff --git a/reactos/include/ddk/classpnp.h b/reactos/include/ddk/classpnp.h index 73703906efa..2cd907c8556 100644 --- a/reactos/include/ddk/classpnp.h +++ b/reactos/include/ddk/classpnp.h @@ -129,8 +129,6 @@ #define MEDIA_CHANGE_DEFAULT_TIME 1 #define MEDIA_CHANGE_TIMEOUT_TIME 300 -#define MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS 0x3b9aca00 - #ifdef ALLOCATE_SRB_FROM_POOL #define ClasspAllocateSrb(ext) \ @@ -187,6 +185,8 @@ #define DEFAULT_FAILURE_PREDICTION_PERIOD 60 * 60 * 1 +#define MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS (0x3b9aca00) + static inline ULONG CountOfSetBitsUChar(UCHAR _X) { ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; } static inline ULONG CountOfSetBitsULong(ULONG _X) @@ -286,139 +286,161 @@ typedef struct _CLASSPNP_SCAN_FOR_SPECIAL_INFO { ULONG_PTR Data; } CLASSPNP_SCAN_FOR_SPECIAL_INFO, *PCLASSPNP_SCAN_FOR_SPECIAL_INFO; +_IRQL_requires_max_(DISPATCH_LEVEL) typedef VOID (NTAPI *PCLASS_ERROR)( - PDEVICE_OBJECT DeviceObject, - PSCSI_REQUEST_BLOCK Srb, - NTSTATUS *Status, - BOOLEAN *Retry); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PSCSI_REQUEST_BLOCK Srb, + _Out_ NTSTATUS *Status, + _Inout_ BOOLEAN *Retry); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_ADD_DEVICE)( - PDRIVER_OBJECT DriverObject, - PDEVICE_OBJECT Pdo); + _In_ PDRIVER_OBJECT DriverObject, + _In_ PDEVICE_OBJECT Pdo); typedef NTSTATUS (NTAPI *PCLASS_POWER_DEVICE)( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_START_DEVICE)( - PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_STOP_DEVICE)( - PDEVICE_OBJECT DeviceObject, - UCHAR Type); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ UCHAR Type); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_INIT_DEVICE)( - PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_ENUM_DEVICE)( - PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_READ_WRITE)( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_DEVICE_CONTROL)( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp); +_IRQL_requires_max_(DISPATCH_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_SHUTDOWN_FLUSH)( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_CREATE_CLOSE)( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_QUERY_ID)( - PDEVICE_OBJECT DeviceObject, - BUS_QUERY_ID_TYPE IdType, - PUNICODE_STRING IdString); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ BUS_QUERY_ID_TYPE IdType, + _In_ PUNICODE_STRING IdString); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_REMOVE_DEVICE)( - PDEVICE_OBJECT DeviceObject, - UCHAR Type); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ UCHAR Type); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef VOID (NTAPI *PCLASS_UNLOAD)( - PDRIVER_OBJECT DriverObject); + _In_ PDRIVER_OBJECT DriverObject); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_QUERY_PNP_CAPABILITIES)( - PDEVICE_OBJECT PhysicalDeviceObject, - PDEVICE_CAPABILITIES Capabilities); + _In_ PDEVICE_OBJECT PhysicalDeviceObject, + _In_ PDEVICE_CAPABILITIES Capabilities); +_IRQL_requires_(DISPATCH_LEVEL) typedef VOID (NTAPI *PCLASS_TICK)( - PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_QUERY_WMI_REGINFO_EX)( - PDEVICE_OBJECT DeviceObject, - ULONG *RegFlags, - PUNICODE_STRING Name, - PUNICODE_STRING MofResourceName); + _In_ PDEVICE_OBJECT DeviceObject, + _Out_ ULONG *RegFlags, + _Out_ PUNICODE_STRING Name, + _Out_ PUNICODE_STRING MofResourceName); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_QUERY_WMI_REGINFO)( - PDEVICE_OBJECT DeviceObject, - ULONG *RegFlags, - PUNICODE_STRING Name); + _In_ PDEVICE_OBJECT DeviceObject, + _Out_ ULONG *RegFlags, + _Out_ PUNICODE_STRING Name); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_QUERY_WMI_DATABLOCK)( - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - ULONG GuidIndex, - ULONG BufferAvail, - PUCHAR Buffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ ULONG GuidIndex, + _In_ ULONG BufferAvail, + _Out_writes_bytes_(BufferAvail) PUCHAR Buffer); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_SET_WMI_DATABLOCK)( - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - ULONG GuidIndex, - ULONG BufferSize, - PUCHAR Buffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ ULONG GuidIndex, + _In_ ULONG BufferSize, + _In_reads_bytes_(BufferSize) PUCHAR Buffer); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_SET_WMI_DATAITEM)( - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - ULONG GuidIndex, - ULONG DataItemId, - ULONG BufferSize, - PUCHAR Buffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ ULONG GuidIndex, + _In_ ULONG DataItemId, + _In_ ULONG BufferSize, + _In_reads_bytes_(BufferSize) PUCHAR Buffer); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_EXECUTE_WMI_METHOD)( - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - ULONG GuidIndex, - ULONG MethodId, - ULONG InBufferSize, - ULONG OutBufferSize, - PUCHAR Buffer); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ ULONG GuidIndex, + _In_ ULONG MethodId, + _In_ ULONG InBufferSize, + _In_ ULONG OutBufferSize, + _In_reads_(_Inexpressible_(max(InBufferSize, OutBufferSize))) PUCHAR Buffer); +_IRQL_requires_max_(PASSIVE_LEVEL) typedef NTSTATUS (NTAPI *PCLASS_WMI_FUNCTION_CONTROL)( - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - ULONG GuidIndex, - CLASSENABLEDISABLEFUNCTION Function, - BOOLEAN Enable); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ ULONG GuidIndex, + _In_ CLASSENABLEDISABLEFUNCTION Function, + _In_ BOOLEAN Enable); typedef struct _SRB_HISTORY_ITEM { LARGE_INTEGER TickCountSent; @@ -431,27 +453,32 @@ typedef struct _SRB_HISTORY_ITEM { typedef struct _SRB_HISTORY { ULONG_PTR ClassDriverUse[4]; - ULONG TotalHistoryCount; - ULONG UsedHistoryCount; - SRB_HISTORY_ITEM History[1]; + _Field_range_(1,30000) ULONG TotalHistoryCount; + _Field_range_(0,TotalHistoryCount) ULONG UsedHistoryCount; + _Field_size_part_(TotalHistoryCount, UsedHistoryCount) SRB_HISTORY_ITEM History[1]; } SRB_HISTORY, *PSRB_HISTORY; +_IRQL_requires_max_(DISPATCH_LEVEL) typedef BOOLEAN (NTAPI *PCLASS_INTERPRET_SENSE_INFO)( - PDEVICE_OBJECT Fdo, - PIRP OriginalRequest, - PSCSI_REQUEST_BLOCK Srb, - UCHAR MajorFunctionCode, - ULONG IoDeviceCode, - ULONG PreviousRetryCount, - SRB_HISTORY *RequestHistory, - NTSTATUS *Status, - LONGLONG *RetryIn100nsUnits); + _In_ PDEVICE_OBJECT Fdo, + _In_opt_ PIRP OriginalRequest, + _In_ PSCSI_REQUEST_BLOCK Srb, + _In_ UCHAR MajorFunctionCode, + _In_ ULONG IoDeviceCode, + _In_ ULONG PreviousRetryCount, + _In_opt_ SRB_HISTORY *RequestHistory, + _Out_ NTSTATUS *Status, + _Out_ _Deref_out_range_(0,MAXIMUM_RETRY_FOR_SINGLE_IO_IN_100NS_UNITS) + LONGLONG *RetryIn100nsUnits); +_IRQL_requires_max_(DISPATCH_LEVEL) +_At_(RequestHistory->UsedHistoryCount, _Pre_equal_to_(RequestHistory->TotalHistoryCount) + _Out_range_(0, RequestHistory->TotalHistoryCount - 1)) typedef VOID (NTAPI *PCLASS_COMPRESS_RETRY_HISTORY_DATA)( - PDEVICE_OBJECT DeviceObject, - PSRB_HISTORY RequestHistory); + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PSRB_HISTORY RequestHistory); typedef struct { GUID Guid; @@ -509,16 +536,17 @@ typedef struct _FILE_OBJECT_EXTENSION { } FILE_OBJECT_EXTENSION, *PFILE_OBJECT_EXTENSION; typedef struct _CLASS_WORKING_SET { - ULONG Size; - ULONG XferPacketsWorkingSetMaximum; - ULONG XferPacketsWorkingSetMinimum; + _Field_range_(sizeof(CLASS_WORKING_SET),sizeof(CLASS_WORKING_SET)) ULONG Size; + _Field_range_(0,2048) ULONG XferPacketsWorkingSetMaximum; + _Field_range_(0,2048) ULONG XferPacketsWorkingSetMinimum; } CLASS_WORKING_SET, *PCLASS_WORKING_SET; typedef struct _CLASS_INTERPRET_SENSE_INFO2 { - ULONG Size; - ULONG HistoryCount; - PCLASS_COMPRESS_RETRY_HISTORY_DATA Compress; - PCLASS_INTERPRET_SENSE_INFO Interpret; + _Field_range_(sizeof(CLASS_INTERPRET_SENSE_INFO),sizeof(CLASS_INTERPRET_SENSE_INFO)) + ULONG Size; + _Field_range_(1,30000) ULONG HistoryCount; + __callback PCLASS_COMPRESS_RETRY_HISTORY_DATA Compress; + __callback PCLASS_INTERPRET_SENSE_INFO Interpret; } CLASS_INTERPRET_SENSE_INFO2, *PCLASS_INTERPRET_SENSE_INFO2; C_ASSERT((MAXULONG - sizeof(SRB_HISTORY)) / 30000 >= sizeof(SRB_HISTORY_ITEM)); @@ -642,18 +670,20 @@ typedef struct _COMPLETION_CONTEXT { SCSI_REQUEST_BLOCK Srb; } COMPLETION_CONTEXT, *PCOMPLETION_CONTEXT; +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ SCSIPORTAPI ULONG NTAPI ClassInitialize( - PVOID Argument1, - PVOID Argument2, - PCLASS_INIT_DATA InitializationData); + _In_ PVOID Argument1, + _In_ PVOID Argument2, + _In_ PCLASS_INIT_DATA InitializationData); typedef struct _CLASS_QUERY_WMI_REGINFO_EX_LIST { ULONG Size; - PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx; - PCLASS_QUERY_WMI_REGINFO_EX ClassPdoQueryWmiRegInfoEx; + __callback PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx; + __callback PCLASS_QUERY_WMI_REGINFO_EX ClassPdoQueryWmiRegInfoEx; } CLASS_QUERY_WMI_REGINFO_EX_LIST, *PCLASS_QUERY_WMI_REGINFO_EX_LIST; typedef struct _FUNCTIONAL_DEVICE_EXTENSION { @@ -738,50 +768,57 @@ typedef struct _FUNCTIONAL_DEVICE_EXTENSION { } FUNCTIONAL_DEVICE_EXTENSION, *PFUNCTIONAL_DEVICE_EXTENSION; +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ SCSIPORTAPI ULONG NTAPI ClassInitializeEx( - PDRIVER_OBJECT DriverObject, - LPGUID Guid, - PVOID Data); + _In_ PDRIVER_OBJECT DriverObject, + _In_ LPGUID Guid, + _In_ PVOID Data); +_IRQL_requires_max_(PASSIVE_LEVEL) +_Must_inspect_result_ +_Post_satisfies_(return <= 0) SCSIPORTAPI NTSTATUS NTAPI ClassCreateDeviceObject( - PDRIVER_OBJECT DriverObject, - PCCHAR ObjectNameBuffer, - PDEVICE_OBJECT LowerDeviceObject, - BOOLEAN IsFdo, - PDEVICE_OBJECT *DeviceObject); + _In_ PDRIVER_OBJECT DriverObject, + _In_z_ PCCHAR ObjectNameBuffer, + _In_ PDEVICE_OBJECT LowerDeviceObject, + _In_ BOOLEAN IsFdo, + _Outptr_result_nullonfailure_ _At_(*DeviceObject, __drv_allocatesMem(Mem) __drv_aliasesMem) + PDEVICE_OBJECT *DeviceObject); +_Must_inspect_result_ SCSIPORTAPI NTSTATUS NTAPI ClassReadDriveCapacity( - PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); SCSIPORTAPI VOID NTAPI ClassReleaseQueue( - PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); SCSIPORTAPI VOID NTAPI ClassSplitRequest( - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - ULONG MaximumBytes); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ ULONG MaximumBytes); SCSIPORTAPI NTSTATUS NTAPI ClassDeviceControl( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp); SCSIPORTAPI NTSTATUS @@ -803,281 +840,299 @@ SCSIPORTAPI BOOLEAN NTAPI ClassInterpretSenseInfo( - PDEVICE_OBJECT DeviceObject, - PSCSI_REQUEST_BLOCK Srb, - UCHAR MajorFunctionCode, - ULONG IoDeviceCode, - ULONG RetryCount, - NTSTATUS *Status, - ULONG *RetryInterval); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PSCSI_REQUEST_BLOCK Srb, + _In_ UCHAR MajorFunctionCode, + _In_ ULONG IoDeviceCode, + _In_ ULONG RetryCount, + _Out_ NTSTATUS *Status, + _Out_opt_ _Deref_out_range_(0,100) ULONG *RetryInterval); VOID NTAPI ClassSendDeviceIoControlSynchronous( - ULONG IoControlCode, - PDEVICE_OBJECT TargetDeviceObject, - PVOID Buffer, - ULONG InputBufferLength, - ULONG OutputBufferLength, - BOOLEAN InternalDeviceIoControl, - PIO_STATUS_BLOCK IoStatus); + _In_ ULONG IoControlCode, + _In_ PDEVICE_OBJECT TargetDeviceObject, + _Inout_updates_opt_(_Inexpressible_(max(InputBufferLength, OutputBufferLength))) + PVOID Buffer, + _In_ ULONG InputBufferLength, + _In_ ULONG OutputBufferLength, + _In_ BOOLEAN InternalDeviceIoControl, + _Out_ PIO_STATUS_BLOCK IoStatus); SCSIPORTAPI NTSTATUS NTAPI ClassSendIrpSynchronous( - PDEVICE_OBJECT TargetDeviceObject, - PIRP Irp); + _In_ PDEVICE_OBJECT TargetDeviceObject, + _In_ PIRP Irp); SCSIPORTAPI NTSTATUS NTAPI ClassForwardIrpSynchronous( - PCOMMON_DEVICE_EXTENSION CommonExtension, - PIRP Irp); + _In_ PCOMMON_DEVICE_EXTENSION CommonExtension, + _In_ PIRP Irp); SCSIPORTAPI NTSTATUS NTAPI ClassSendSrbSynchronous( - PDEVICE_OBJECT DeviceObject, - PSCSI_REQUEST_BLOCK Srb, - PVOID BufferAddress, - ULONG BufferLength, - BOOLEAN WriteToDevice); + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PSCSI_REQUEST_BLOCK Srb, + _In_reads_bytes_opt_(BufferLength) PVOID BufferAddress, + _In_ ULONG BufferLength, + _In_ BOOLEAN WriteToDevice); SCSIPORTAPI NTSTATUS NTAPI ClassSendSrbAsynchronous( - PDEVICE_OBJECT DeviceObject, - PSCSI_REQUEST_BLOCK Srb, - PIRP Irp, - PVOID BufferAddress, - ULONG BufferLength, - BOOLEAN WriteToDevice); + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PSCSI_REQUEST_BLOCK Srb, + _In_ PIRP Irp, + _In_reads_bytes_opt_(BufferLength) __drv_aliasesMem PVOID BufferAddress, + _In_ ULONG BufferLength, + _In_ BOOLEAN WriteToDevice); SCSIPORTAPI NTSTATUS NTAPI ClassBuildRequest( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp); SCSIPORTAPI ULONG NTAPI ClassModeSense( - PDEVICE_OBJECT DeviceObject, - PCHAR ModeSenseBuffer, - ULONG Length, - UCHAR PageMode); + _In_ PDEVICE_OBJECT DeviceObject, + _In_reads_bytes_(Length) PCHAR ModeSenseBuffer, + _In_ ULONG Length, + _In_ UCHAR PageMode); SCSIPORTAPI PVOID NTAPI ClassFindModePage( - PCHAR ModeSenseBuffer, - ULONG Length, - UCHAR PageMode, - BOOLEAN Use6Byte); + _In_reads_bytes_(Length) PCHAR ModeSenseBuffer, + _In_ ULONG Length, + _In_ UCHAR PageMode, + _In_ BOOLEAN Use6Byte); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI NTSTATUS NTAPI ClassClaimDevice( - PDEVICE_OBJECT LowerDeviceObject, - BOOLEAN Release); - + _In_ PDEVICE_OBJECT LowerDeviceObject, + _In_ BOOLEAN Release); + SCSIPORTAPI NTSTATUS NTAPI -ClassInternalIoControl ( +ClassInternalIoControl( PDEVICE_OBJECT DeviceObject, PIRP Irp); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassInitializeSrbLookasideList( - PCOMMON_DEVICE_EXTENSION CommonExtension, - ULONG NumberElements); + _Inout_ PCOMMON_DEVICE_EXTENSION CommonExtension, + _In_ ULONG NumberElements); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassDeleteSrbLookasideList( - PCOMMON_DEVICE_EXTENSION CommonExtension); + _Inout_ PCOMMON_DEVICE_EXTENSION CommonExtension); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI ULONG NTAPI ClassQueryTimeOutRegistryValue( - PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI NTSTATUS NTAPI ClassGetDescriptor( - PDEVICE_OBJECT DeviceObject, - PSTORAGE_PROPERTY_ID PropertyId, - PSTORAGE_DESCRIPTOR_HEADER *Descriptor); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PSTORAGE_PROPERTY_ID PropertyId, + _Outptr_ PSTORAGE_DESCRIPTOR_HEADER *Descriptor); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassInvalidateBusRelations( - PDEVICE_OBJECT Fdo); + _In_ PDEVICE_OBJECT Fdo); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassMarkChildrenMissing( - PFUNCTIONAL_DEVICE_EXTENSION Fdo); + _In_ PFUNCTIONAL_DEVICE_EXTENSION Fdo); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI BOOLEAN NTAPI ClassMarkChildMissing( - PPHYSICAL_DEVICE_EXTENSION PdoExtension, - BOOLEAN AcquireChildLock); + _In_ PPHYSICAL_DEVICE_EXTENSION PdoExtension, + _In_ BOOLEAN AcquireChildLock); SCSIPORTAPI VOID ClassDebugPrint( - CLASS_DEBUG_LEVEL DebugPrintLevel, - PCCHAR DebugMessage, + _In_ CLASS_DEBUG_LEVEL DebugPrintLevel, + _In_z_ PCCHAR DebugMessage, ...); +__drv_aliasesMem +_IRQL_requires_max_(DISPATCH_LEVEL) SCSIPORTAPI PCLASS_DRIVER_EXTENSION NTAPI ClassGetDriverExtension( - PDRIVER_OBJECT DriverObject); + _In_ PDRIVER_OBJECT DriverObject); SCSIPORTAPI VOID NTAPI ClassCompleteRequest( - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - CCHAR PriorityBoost); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp, + _In_ CCHAR PriorityBoost); SCSIPORTAPI VOID NTAPI ClassReleaseRemoveLock( - PDEVICE_OBJECT DeviceObject, + _In_ PDEVICE_OBJECT DeviceObject, PIRP Tag); SCSIPORTAPI ULONG NTAPI ClassAcquireRemoveLockEx( - PDEVICE_OBJECT DeviceObject, + _In_ PDEVICE_OBJECT DeviceObject, PVOID Tag, - PCSTR File, - ULONG Line); + _In_ PCSTR File, + _In_ ULONG Line); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassUpdateInformationInRegistry( - PDEVICE_OBJECT Fdo, - PCHAR DeviceName, - ULONG DeviceNumber, - PINQUIRYDATA InquiryData, - ULONG InquiryDataLength); + _In_ PDEVICE_OBJECT Fdo, + _In_ PCHAR DeviceName, + _In_ ULONG DeviceNumber, + _In_reads_bytes_opt_(InquiryDataLength) PINQUIRYDATA InquiryData, + _In_ ULONG InquiryDataLength); SCSIPORTAPI NTSTATUS NTAPI ClassWmiCompleteRequest( - PDEVICE_OBJECT DeviceObject, - PIRP Irp, - NTSTATUS Status, - ULONG BufferUsed, - CCHAR PriorityBoost); + _In_ PDEVICE_OBJECT DeviceObject, + _Inout_ PIRP Irp, + _In_ NTSTATUS Status, + _In_ ULONG BufferUsed, + _In_ CCHAR PriorityBoost); +_IRQL_requires_max_(DISPATCH_LEVEL) SCSIPORTAPI NTSTATUS NTAPI ClassWmiFireEvent( - PDEVICE_OBJECT DeviceObject, - LPGUID Guid, - ULONG InstanceIndex, - ULONG EventDataSize, - PVOID EventData); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ LPGUID Guid, + _In_ ULONG InstanceIndex, + _In_ ULONG EventDataSize, + _In_reads_bytes_(EventDataSize) PVOID EventData); SCSIPORTAPI VOID NTAPI ClassResetMediaChangeTimer( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassInitializeMediaChangeDetection( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - PUCHAR EventPrefix); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_ PUCHAR EventPrefix); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI NTSTATUS NTAPI ClassInitializeTestUnitPolling( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - BOOLEAN AllowDriveToSleep); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_ BOOLEAN AllowDriveToSleep); SCSIPORTAPI PVPB NTAPI ClassGetVpb( - PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); SCSIPORTAPI NTSTATUS NTAPI ClassSpinDownPowerHandler( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp); NTSTATUS NTAPI ClassStopUnitPowerHandler( - PDEVICE_OBJECT DeviceObject, - PIRP Irp); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ PIRP Irp); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI ClassSetFailurePredictionPoll( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - FAILURE_PREDICTION_METHOD FailurePredictionMethod, - ULONG PollingPeriod); + _Inout_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_ FAILURE_PREDICTION_METHOD FailurePredictionMethod, + _In_ ULONG PollingPeriod); +_IRQL_requires_max_(DISPATCH_LEVEL) VOID NTAPI ClassNotifyFailurePredicted( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - PUCHAR Buffer, - ULONG BufferSize, - BOOLEAN LogError, - ULONG UniqueErrorValue, - UCHAR PathId, - UCHAR TargetId, - UCHAR Lun); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_reads_bytes_(BufferSize) PUCHAR Buffer, + _In_ ULONG BufferSize, + _In_ BOOLEAN LogError, + _In_ ULONG UniqueErrorValue, + _In_ UCHAR PathId, + _In_ UCHAR TargetId, + _In_ UCHAR Lun); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassAcquireChildLock( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); SCSIPORTAPI VOID NTAPI ClassReleaseChildLock( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); NTSTATUS NTAPI @@ -1089,14 +1144,15 @@ ClassSignalCompletion( VOID NTAPI ClassSendStartUnit( - PDEVICE_OBJECT DeviceObject); + _In_ PDEVICE_OBJECT DeviceObject); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI NTSTATUS NTAPI ClassRemoveDevice( - PDEVICE_OBJECT DeviceObject, - UCHAR RemoveType); + _In_ PDEVICE_OBJECT DeviceObject, + _In_ UCHAR RemoveType); SCSIPORTAPI NTSTATUS @@ -1110,7 +1166,7 @@ SCSIPORTAPI VOID NTAPI ClassCheckMediaState( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); SCSIPORTAPI NTSTATUS @@ -1120,71 +1176,79 @@ ClassCheckVerifyComplete( PIRP Irp, PVOID Context); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassSetMediaChangeState( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - MEDIA_CHANGE_DETECTION_STATE State, - BOOLEAN Wait); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_ MEDIA_CHANGE_DETECTION_STATE State, + _In_ BOOLEAN Wait); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassEnableMediaChangeDetection( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassDisableMediaChangeDetection( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); +_IRQL_requires_max_(PASSIVE_LEVEL) SCSIPORTAPI VOID NTAPI ClassCleanupMediaChangeDetection( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension); +_IRQL_requires_max_(PASSIVE_LEVEL) VOID NTAPI ClassGetDeviceParameter( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - PWSTR SubkeyName, - PWSTR ParameterName, - PULONG ParameterValue); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_opt_ PWSTR SubkeyName, + _In_ PWSTR ParameterName, + _Inout_ PULONG ParameterValue); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI ClassSetDeviceParameter( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - PWSTR SubkeyName, - PWSTR ParameterName, - ULONG ParameterValue); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_opt_ PWSTR SubkeyName, + _In_ PWSTR ParameterName, + _In_ ULONG ParameterValue); #if (NTDDI_VERSION >= NTDDI_VISTA) +_IRQL_requires_max_(PASSIVE_LEVEL) PFILE_OBJECT_EXTENSION NTAPI ClassGetFsContext( - PCOMMON_DEVICE_EXTENSION CommonExtension, - PFILE_OBJECT FileObject); + _In_ PCOMMON_DEVICE_EXTENSION CommonExtension, + _In_ PFILE_OBJECT FileObject); +_IRQL_requires_max_(DISPATCH_LEVEL) VOID NTAPI ClassSendNotification( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - const GUID *Guid, - ULONG ExtraDataSize, - PVOID ExtraData); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_ const GUID *Guid, + _In_ ULONG ExtraDataSize, + _In_reads_bytes_opt_(ExtraDataSize) PVOID ExtraData); #endif /* (NTDDI_VERSION >= NTDDI_VISTA) */ static __inline BOOLEAN PORT_ALLOCATED_SENSE( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - PSCSI_REQUEST_BLOCK Srb) + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_ PSCSI_REQUEST_BLOCK Srb) { return ((BOOLEAN)((TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE) && TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)) && @@ -1194,8 +1258,8 @@ PORT_ALLOCATED_SENSE( static __inline VOID FREE_PORT_ALLOCATED_SENSE_BUFFER( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - PSCSI_REQUEST_BLOCK Srb) + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_ PSCSI_REQUEST_BLOCK Srb) { ASSERT(TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_PORT_DRIVER_ALLOCSENSE)); ASSERT(TEST_FLAG(Srb->SrbFlags, SRB_FLAGS_FREE_SENSE_BUFFER)); @@ -1208,14 +1272,16 @@ FREE_PORT_ALLOCATED_SENSE_BUFFER( return; } +_IRQL_requires_max_(PASSIVE_LEVEL) typedef VOID (NTAPI *PCLASS_SCAN_FOR_SPECIAL_HANDLER)( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - ULONG_PTR Data); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_ ULONG_PTR Data); +_IRQL_requires_max_(PASSIVE_LEVEL) VOID NTAPI ClassScanForSpecial( - PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, - CLASSPNP_SCAN_FOR_SPECIAL_INFO DeviceList[], - PCLASS_SCAN_FOR_SPECIAL_HANDLER Function); + _In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, + _In_ CLASSPNP_SCAN_FOR_SPECIAL_INFO DeviceList[], + _In_ PCLASS_SCAN_FOR_SPECIAL_HANDLER Function); From cd46fe19a90f46f300b627c6479e41c842685763 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Tue, 24 Jan 2012 20:34:31 +0000 Subject: [PATCH 070/289] [CRYPT32] - Fix MSVC build. Sent and applied upstream. svn path=/trunk/; revision=55148 --- reactos/dll/win32/crypt32/msg.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/crypt32/msg.c b/reactos/dll/win32/crypt32/msg.c index 50c1bee9dd7..610f8c5a7a1 100644 --- a/reactos/dll/win32/crypt32/msg.c +++ b/reactos/dll/win32/crypt32/msg.c @@ -1809,7 +1809,12 @@ static BOOL CEnvelopedEncodeMsg_GetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType, char oid_rsa_data[] = szOID_RSA_data; CRYPT_ENVELOPED_DATA envelopedData = { CMSG_ENVELOPED_DATA_PKCS_1_5_VERSION, msg->cRecipientInfo, - msg->recipientInfo, { oid_rsa_data, msg->algo, msg->data } + msg->recipientInfo, { oid_rsa_data, { + msg->algo.pszObjId, + { msg->algo.Parameters.cbData, msg->algo.Parameters.pbData } + }, + { msg->data.cbData, msg->data.pbData } + } }; ret = CRYPT_AsnEncodePKCSEnvelopedData(&envelopedData, pvData, From 50b16668d70ecedd428e9483510d307aea86f5b0 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Tue, 24 Jan 2012 20:57:03 +0000 Subject: [PATCH 071/289] [FREELDR] - Do not declare functions without prototypes - DPRINT fix - Powered by VS11 svn path=/trunk/; revision=55150 --- reactos/boot/freeldr/freeldr/debug.c | 2 +- reactos/boot/freeldr/freeldr/include/bget.h | 38 ++++++++------------- reactos/boot/freeldr/freeldr/mm/heap.c | 2 +- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/debug.c b/reactos/boot/freeldr/freeldr/debug.c index f0bc951a136..987ed78863c 100644 --- a/reactos/boot/freeldr/freeldr/debug.c +++ b/reactos/boot/freeldr/freeldr/debug.c @@ -188,7 +188,7 @@ DebugDumpBuffer(ULONG Mask, PVOID Buffer, ULONG Length) } DebugStartOfLine = FALSE; // We don't want line headers - DbgPrint("Dumping buffer at 0x%x with length of %d bytes:\n", Buffer, Length); + DbgPrint("Dumping buffer at %p with length of %lu bytes:\n", Buffer, Length); for (Idx=0; Idx Date: Tue, 24 Jan 2012 21:15:55 +0000 Subject: [PATCH 072/289] [NDK/DDK] - Improve/fix/update/add several function declarations and structures Patch by Samuel Serapion svn path=/trunk/; revision=55151 --- reactos/include/ddk/ntifs.h | 2 +- reactos/include/ndk/cmtypes.h | 51 +++++++++++++++++- reactos/include/ndk/extypes.h | 34 ++++++------ reactos/include/ndk/ldrtypes.h | 4 ++ reactos/include/ndk/peb_teb.h | 5 +- reactos/include/ndk/pstypes.h | 13 +++++ reactos/include/ndk/rtlfuncs.h | 79 +++++++++++++++++++++++++-- reactos/include/ndk/rtltypes.h | 99 +++++++++++++++++++++++++++------- reactos/include/xdk/rtlfuncs.h | 2 +- 9 files changed, 244 insertions(+), 45 deletions(-) diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 259b93c4476..dce94963a0f 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/include/ddk/ntifs.h @@ -1156,7 +1156,7 @@ RtlUnicodeToMultiByteN( _Out_writes_bytes_to_(MaxBytesInMultiByteString, *BytesInMultiByteString) PCHAR MultiByteString, _In_ ULONG MaxBytesInMultiByteString, _Out_opt_ PULONG BytesInMultiByteString, - _In_reads_bytes_(BytesInUnicodeString) PWCH UnicodeString, + _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString, _In_ ULONG BytesInUnicodeString); _IRQL_requires_max_(PASSIVE_LEVEL) diff --git a/reactos/include/ndk/cmtypes.h b/reactos/include/ndk/cmtypes.h index cff31f86f6b..e4693486f0c 100644 --- a/reactos/include/ndk/cmtypes.h +++ b/reactos/include/ndk/cmtypes.h @@ -115,6 +115,8 @@ typedef enum _CM_SHARE_DISPOSITION // #define CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE 0x0000 #define CM_RESOURCE_INTERRUPT_LATCHED 0x0001 +#define CM_RESOURCE_INTERRUPT_MESSAGE 0x0002 +#define CM_RESOURCE_INTERRUPT_POLICY_INCLUDED 0x0004 // // NtInitializeRegistry Flags @@ -136,7 +138,10 @@ typedef enum _KEY_INFORMATION_CLASS KeyFullInformation, KeyNameInformation, KeyCachedInformation, - KeyFlagsInformation + KeyFlagsInformation, + KeyVirtualizationInformation, + KeyHandleTagsInformation, + MaxKeyInfoClass } KEY_INFORMATION_CLASS; typedef enum _KEY_VALUE_INFORMATION_CLASS @@ -145,7 +150,8 @@ typedef enum _KEY_VALUE_INFORMATION_CLASS KeyValueFullInformation, KeyValuePartialInformation, KeyValueFullInformationAlign64, - KeyValuePartialInformationAlign64 + KeyValuePartialInformationAlign64, + MaxKeyValueInfoClass } KEY_VALUE_INFORMATION_CLASS; typedef enum _KEY_SET_INFORMATION_CLASS { @@ -216,11 +222,45 @@ typedef struct _KEY_WRITE_TIME_INFORMATION LARGE_INTEGER LastWriteTime; } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION; +typedef struct _KEY_WOW64_FLAGS_INFORMATION +{ + ULONG UserFlags; +} KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION; + typedef struct _KEY_USER_FLAGS_INFORMATION { ULONG UserFlags; } KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION; +typedef struct _KEY_HANDLE_TAGS_INFORMATION +{ + ULONG HandleTags; +} KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION; + +typedef struct _KEY_CONTROL_FLAGS_INFORMATION +{ + ULONG ControlFlags; +} KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION; + +typedef struct _KEY_VIRTUALIZATION_INFORMATION +{ + ULONG VirtualizationCandidate:1; + ULONG VirtualizationEnabled:1; + ULONG VirtualTarget:1; + ULONG VirtualStore:1; + ULONG VirtualSource:1; + ULONG Reserved:27; +} KEY_VIRTUALIZATION_INFORMATION, *PKEY_VIRTUALIZATION_INFORMATION; + +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_FULL_INFORMATION { LARGE_INTEGER LastWriteTime; @@ -268,6 +308,13 @@ typedef struct _KEY_VALUE_PARTIAL_INFORMATION UCHAR Data[1]; } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; +typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 +{ + ULONG Type; + ULONG DataLength; + UCHAR Data[1]; +} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64; + typedef struct _KEY_VALUE_BASIC_INFORMATION { ULONG TitleIndex; diff --git a/reactos/include/ndk/extypes.h b/reactos/include/ndk/extypes.h index 6915d751c7a..e26afa17049 100644 --- a/reactos/include/ndk/extypes.h +++ b/reactos/include/ndk/extypes.h @@ -772,7 +772,7 @@ typedef struct _SYSTEM_PERFORMANCE_INFORMATION ULONG TotalSystemCodePages; ULONG NonPagedPoolLookasideHits; ULONG PagedPoolLookasideHits; - ULONG Spare3Count; + ULONG AvailablePagedPoolPages; ULONG ResidentSystemCachePage; ULONG ResidentPagedPoolPage; ULONG ResidentSystemDriverPage; @@ -849,9 +849,10 @@ typedef struct _SYSTEM_PROCESS_INFORMATION { ULONG NextEntryOffset; ULONG NumberOfThreads; - LARGE_INTEGER SpareLi1; - LARGE_INTEGER SpareLi2; - LARGE_INTEGER SpareLi3; + LARGE_INTEGER WorkingSetPrivateSize; //VISTA + ULONG HardFaultCount; //WIN7 + ULONG NumberOfThreadsHighWatermark; //WIN7 + ULONGLONG CycleTime; //WIN7 LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; @@ -868,8 +869,8 @@ typedef struct _SYSTEM_PROCESS_INFORMATION // NOTE: *NOT* THE SAME AS VM_COUNTERS! // SIZE_T PeakVirtualSize; - ULONG VirtualSize; - SIZE_T PageFaultCount; + SIZE_T VirtualSize; + ULONG PageFaultCount; SIZE_T PeakWorkingSetSize; SIZE_T WorkingSetSize; SIZE_T QuotaPeakPagedPoolUsage; @@ -890,7 +891,7 @@ typedef struct _SYSTEM_PROCESS_INFORMATION LARGE_INTEGER WriteTransferCount; LARGE_INTEGER OtherTransferCount; - //SYSTEM_THREAD_INFORMATION TH[1]; + SYSTEM_THREAD_INFORMATION TH[1]; } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION; // Class 6 @@ -959,7 +960,7 @@ typedef struct _SYSTEM_POOL_ENTRY typedef struct _SYSTEM_POOL_INFORMATION { - ULONG TotalSize; + SIZE_T TotalSize; PVOID FirstEntry; USHORT EntryOverhead; BOOLEAN PoolTagPresent; @@ -1072,13 +1073,13 @@ typedef struct _SYSTEM_VDM_INSTEMUL_INFO // Class 21 typedef struct _SYSTEM_FILECACHE_INFORMATION { - ULONG CurrentSize; - ULONG PeakSize; + SIZE_T CurrentSize; + SIZE_T PeakSize; ULONG PageFaultCount; - ULONG MinimumWorkingSet; - ULONG MaximumWorkingSet; - ULONG CurrentSizeIncludingTransitionInPages; - ULONG PeakSizeIncludingTransitionInPages; + SIZE_T MinimumWorkingSet; + SIZE_T MaximumWorkingSet; + SIZE_T CurrentSizeIncludingTransitionInPages; + SIZE_T PeakSizeIncludingTransitionInPages; ULONG TransitionRePurposeCount; ULONG Flags; } SYSTEM_FILECACHE_INFORMATION, *PSYSTEM_FILECACHE_INFORMATION; @@ -1098,6 +1099,7 @@ typedef struct _SYSTEM_POOLTAG ULONG NonPagedFrees; SIZE_T NonPagedUsed; } SYSTEM_POOLTAG, *PSYSTEM_POOLTAG; + typedef struct _SYSTEM_POOLTAG_INFORMATION { ULONG Count; @@ -1229,7 +1231,7 @@ typedef struct _SYSTEM_REGISTRY_QUOTA_INFORMATION { ULONG RegistryQuotaAllowed; ULONG RegistryQuotaUsed; - ULONG PagedPoolSize; + SIZE_T PagedPoolSize; } SYSTEM_REGISTRY_QUOTA_INFORMATION, *PSYSTEM_REGISTRY_QUOTA_INFORMATION; // Class 38 @@ -1274,7 +1276,6 @@ typedef struct _SYSTEM_LEGACY_DRIVER_INFORMATION { PNP_VETO_TYPE VetoType; UNICODE_STRING VetoDriver; - // CHAR Buffer[0]; } SYSTEM_LEGACY_DRIVER_INFORMATION, *PSYSTEM_LEGACY_DRIVER_INFORMATION; // Class 44 @@ -1451,6 +1452,7 @@ typedef struct _SYSTEM_MEMORY_LIST_INFORMATION SIZE_T BadPageCount; SIZE_T PageCountByPriority[8]; SIZE_T RepurposedPagesByPriority[8]; + SIZE_T ModifiedPageCountPageFile; } SYSTEM_MEMORY_LIST_INFORMATION, *PSYSTEM_MEMORY_LIST_INFORMATION; #endif diff --git a/reactos/include/ndk/ldrtypes.h b/reactos/include/ndk/ldrtypes.h index 84ff1370352..1d073404943 100644 --- a/reactos/include/ndk/ldrtypes.h +++ b/reactos/include/ndk/ldrtypes.h @@ -114,6 +114,10 @@ typedef struct _PEB_LDR_DATA LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; PVOID EntryInProgress; +#if (NTDDI_VERSION >= NTDDI_WIN7) + UCHAR ShutdownInProgress; + PVOID ShutdownThreadId; +#endif } PEB_LDR_DATA, *PPEB_LDR_DATA; // diff --git a/reactos/include/ndk/peb_teb.h b/reactos/include/ndk/peb_teb.h index 4f43d058234..844b4d0f11c 100644 --- a/reactos/include/ndk/peb_teb.h +++ b/reactos/include/ndk/peb_teb.h @@ -146,7 +146,7 @@ typedef struct STRUCT(_PEB) PTR(PVOID*) FlsCallback; STRUCT(LIST_ENTRY) FlsListHead; PTR(PVOID) FlsBitmap; - ULONG FlsBitmapBits[4]; + ULONG FlsBitmapBits[FLS_MAXIMUM_AVAILABLE/(sizeof(ULONG)*8)]; ULONG FlsHighIndex; #endif #if (NTDDI_VERSION >= NTDDI_LONGHORN) @@ -189,6 +189,7 @@ C_ASSERT(FIELD_OFFSET(STRUCT(PEB), FlsHighIndex) == 0x22C); #endif #endif +#define GDI_BATCH_BUFFER_SIZE 0x136 // // GDI Batch Descriptor // @@ -196,7 +197,7 @@ typedef struct STRUCT(_GDI_TEB_BATCH) { ULONG Offset; PTR(HANDLE) HDC; - ULONG Buffer[0x136]; + ULONG Buffer[GDI_BATCH_BUFFER_SIZE]; } STRUCT(GDI_TEB_BATCH), *STRUCT(PGDI_TEB_BATCH); // diff --git a/reactos/include/ndk/pstypes.h b/reactos/include/ndk/pstypes.h index f13d19bdac7..2a9c2842daa 100644 --- a/reactos/include/ndk/pstypes.h +++ b/reactos/include/ndk/pstypes.h @@ -764,6 +764,19 @@ typedef struct _KERNEL_USER_TIMES LARGE_INTEGER UserTime; } KERNEL_USER_TIMES, *PKERNEL_USER_TIMES; +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_SESSION_INFORMATION { ULONG SessionId; diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 15566983183..9d9ce2050d0 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -964,7 +964,7 @@ NTSTATUS NTAPI RtlWalkHeap( IN HANDLE HeapHandle, - IN PVOID HeapEntry + IN OUT PRTL_HEAP_WALK_ENTRY HeapEntry ); #define RtlGetProcessHeap() (NtCurrentPeb()->ProcessHeap) @@ -1818,7 +1818,7 @@ RtlUnicodeToMultiByteN( PCHAR MbString, ULONG MbSize, PULONG ResultSize, - PWCHAR UnicodeString, + PCWCH UnicodeString, ULONG UnicodeSize ); @@ -1997,6 +1997,16 @@ RtlFillMemoryUlong( IN ULONG Fill ); +NTSYSAPI +VOID +NTAPI +RtlFillMemoryUlonglong( + OUT PVOID Destination, + IN SIZE_T Length, + IN ULONGLONG Pattern +); + + NTSYSAPI SIZE_T NTAPI @@ -2080,6 +2090,25 @@ RtlPrefixString( BOOLEAN CaseInsensitive ); +#ifdef _M_X64 +NTSYSAPI +NTSTATUS +NTAPI +RtlWow64GetThreadContext( + IN HANDLE ThreadHandle, + IN OUT PWOW64_CONTEXT ThreadContext +); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlWow64SetThreadContext( + IN HANDLE ThreadHandle, + IN PWOW64_CONTEXT ThreadContext +); +#endif + NTSYSAPI BOOLEAN NTAPI @@ -2321,6 +2350,25 @@ RtlInitializeContext( IN PINITIAL_TEB InitialTeb ); +#ifdef _M_AMD64 +NTSYSAPI +NTSTATUS +NTAPI +RtlWow64GetThreadContext( + IN HANDLE ThreadHandle, + IN OUT PWOW64_CONTEXT ThreadContext +); + + +NTSYSAPI +NTSTATUS +NTAPI +RtlWow64SetThreadContext( + IN HANDLE ThreadHandle, + IN PWOW64_CONTEXT ThreadContext +); +#endif + NTSYSAPI BOOLEAN NTAPI @@ -2545,6 +2593,19 @@ RtlGetFullPathName_U( OUT PWSTR *ShortName ); +#if (NTDDI_VERSION >= NTDDI_WIN7) +NTSYSAPI +NTSTATUS +NTAPI +RtlGetFullPathName_UEx( + IN PWSTR FileName, + IN ULONG BufferLength, + OUT PWSTR Buffer, + OUT OPTIONAL PWSTR *FilePart, + OUT OPTIONAL RTL_PATH_TYPE *InputPathType + ); +#endif + ULONG NTAPI RtlGetFullPathName_UstrEx( @@ -2586,9 +2647,9 @@ NTSYSAPI NTSTATUS NTAPI RtlQueryEnvironmentVariable_U( - PWSTR Environment, - PUNICODE_STRING Name, - PUNICODE_STRING Value + IN OPTIONAL PWSTR Environment, + IN PUNICODE_STRING Name, + OUT PUNICODE_STRING Value ); VOID @@ -2604,6 +2665,14 @@ RtlSetCurrentDirectory_U( IN PUNICODE_STRING name ); +NTSYSAPI +NTSTATUS +NTAPI +RtlSetCurrentEnvironment( + IN PVOID Environment, + OUT OPTIONAL PVOID *PreviousEnvironment +); + NTSYSAPI NTSTATUS NTAPI diff --git a/reactos/include/ndk/rtltypes.h b/reactos/include/ndk/rtltypes.h index 30bb586663a..1ab594b24ff 100644 --- a/reactos/include/ndk/rtltypes.h +++ b/reactos/include/ndk/rtltypes.h @@ -36,18 +36,23 @@ Author: // #define RTL_USER_PROCESS_PARAMETERS_NORMALIZED 0x01 #define RTL_USER_PROCESS_PARAMETERS_PROFILE_USER 0x02 -#define RTL_USER_PROCESS_PARAMETERS_PROFILE_SERVER 0x04 -#define RTL_USER_PROCESS_PARAMETERS_PROFILE_KERNEL 0x08 +#define RTL_USER_PROCESS_PARAMETERS_PROFILE_KERNEL 0x04 +#define RTL_USER_PROCESS_PARAMETERS_PROFILE_SERVER 0x08 #define RTL_USER_PROCESS_PARAMETERS_UNKNOWN 0x10 #define RTL_USER_PROCESS_PARAMETERS_RESERVE_1MB 0x20 #define RTL_USER_PROCESS_PARAMETERS_RESERVE_16MB 0x40 +#define RTL_USER_PROCESS_PARAMETERS_CASE_SENSITIVE 0x80 #define RTL_USER_PROCESS_PARAMETERS_DISABLE_HEAP_CHECKS 0x100 #define RTL_USER_PROCESS_PARAMETERS_PROCESS_OR_1 0x200 #define RTL_USER_PROCESS_PARAMETERS_PROCESS_OR_2 0x400 #define RTL_USER_PROCESS_PARAMETERS_PRIVATE_DLL_PATH 0x1000 -#define RTL_USER_PROCESS_PARAMETERS_LOCAL_DLL_PATH 0x2000 +#define RTL_USER_PROCESS_PARAMETERS_APP_MANIFEST_PRESENT 0x2000 +#define RTL_USER_PROCESS_PARAMETERS_IMAGE_KEY_MISSING 0x4000 #define RTL_USER_PROCESS_PARAMETERS_NX 0x20000 +#define RTL_MAX_DRIVE_LETTERS 32 +#define RTL_DRIVE_LETTER_VALID (USHORT)0x0001 + // // Exception Flags // @@ -901,44 +906,94 @@ typedef struct _RTL_PROCESS_MODULE_INFORMATION_EX typedef struct _RTL_HEAP_TAG_INFO { - ULONG NumberOfAllocations; - ULONG NumberOfFrees; - ULONG BytesAllocated; + ULONG NumberOfAllocations; + ULONG NumberOfFrees; + SIZE_T BytesAllocated; } RTL_HEAP_TAG_INFO, *PRTL_HEAP_TAG_INFO; typedef struct _RTL_HEAP_USAGE_ENTRY { struct _RTL_HEAP_USAGE_ENTRY *Next; + PVOID Address; + SIZE_T Size; + USHORT AllocatorBackTraceIndex; + USHORT TagIndex; } RTL_HEAP_USAGE_ENTRY, *PRTL_HEAP_USAGE_ENTRY; typedef struct _RTL_HEAP_USAGE { ULONG Length; - ULONG BytesAllocated; - ULONG BytesCommitted; - ULONG BytesReserved; - ULONG BytesReservedMaximum; + SIZE_T BytesAllocated; + SIZE_T BytesCommitted; + SIZE_T BytesReserved; + SIZE_T BytesReservedMaximum; PRTL_HEAP_USAGE_ENTRY Entries; PRTL_HEAP_USAGE_ENTRY AddedEntries; PRTL_HEAP_USAGE_ENTRY RemovedEntries; - UCHAR Reserved[32]; + ULONG_PTR Reserved[8]; } RTL_HEAP_USAGE, *PRTL_HEAP_USAGE; +typedef struct _RTL_HEAP_WALK_ENTRY +{ + PVOID DataAddress; + SIZE_T DataSize; + UCHAR OverheadBytes; + UCHAR SegmentIndex; + USHORT Flags; + union + { + struct + { + SIZE_T Settable; + USHORT TagIndex; + USHORT AllocatorBackTraceIndex; + ULONG Reserved[2]; + } Block; + struct + { + ULONG_PTR CommittedSize; + ULONG_PTR UnCommittedSize; + PVOID FirstEntry; + PVOID LastEntry; + } Segment; + }; +} RTL_HEAP_WALK_ENTRY, *PRTL_HEAP_WALK_ENTRY; + +typedef struct _RTL_HEAP_ENTRY +{ + SIZE_T Size; + USHORT Flags; + USHORT AllocatorBackTraceIndex; + union + { + struct + { + SIZE_T Settable; + ULONG Tag; + } s1; + struct + { + SIZE_T CommittedSize; + PVOID FirstBlock; + } s2; + } u; +} RTL_HEAP_ENTRY, *PRTL_HEAP_ENTRY; + typedef struct _RTL_HEAP_INFORMATION { PVOID BaseAddress; ULONG Flags; USHORT EntryOverhead; USHORT CreatorBackTraceIndex; - ULONG BytesAllocated; - ULONG BytesCommitted; + SIZE_T BytesAllocated; + SIZE_T BytesCommitted; ULONG NumberOfTags; ULONG NumberOfEntries; ULONG NumberOfPseudoTags; ULONG PseudoTagGranularity; ULONG Reserved[4]; - PVOID Tags; - PVOID Entries; + PRTL_HEAP_TAG Tags; + PRTL_HEAP_ENTRY Entries; } RTL_HEAP_INFORMATION, *PRTL_HEAP_INFORMATION; typedef struct _RTL_PROCESS_HEAPS @@ -1196,6 +1251,8 @@ typedef struct _RANGE_LIST_ITERATOR // // RTL Resource // +#define RTL_RESOURCE_FLAG_LONG_TERM ((ULONG)0x00000001) + typedef struct _RTL_RESOURCE { RTL_CRITICAL_SECTION Lock; @@ -1205,8 +1262,8 @@ typedef struct _RTL_RESOURCE ULONG ExclusiveWaiters; LONG NumberActive; HANDLE OwningThread; - ULONG TimeoutBoost; - PVOID DebugInfo; + ULONG Flags; + PRTL_RESOURCE_DEBUG DebugInfo; } RTL_RESOURCE, *PRTL_RESOURCE; // @@ -1241,7 +1298,13 @@ typedef struct _RTL_USER_PROCESS_PARAMETERS UNICODE_STRING DesktopInfo; UNICODE_STRING ShellInfo; UNICODE_STRING RuntimeData; - RTL_DRIVE_LETTER_CURDIR CurrentDirectories[32]; + RTL_DRIVE_LETTER_CURDIR CurrentDirectories[RTL_MAX_DRIVE_LETTERS]; +#if (NTDDI_VERSION >= NTDDI_LONGHORN) + SIZE_T EnvironmentSize; +#endif +#if (NTDDI_VERSION >= NTDDI_WIN7) + SIZE_T EnvironmentVersion; +#endif } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS; typedef struct _RTL_USER_PROCESS_INFORMATION diff --git a/reactos/include/xdk/rtlfuncs.h b/reactos/include/xdk/rtlfuncs.h index 187efdec8b9..14ca70e7728 100644 --- a/reactos/include/xdk/rtlfuncs.h +++ b/reactos/include/xdk/rtlfuncs.h @@ -1369,7 +1369,7 @@ RtlUnicodeToMultiByteN( _Out_writes_bytes_to_(MaxBytesInMultiByteString, *BytesInMultiByteString) PCHAR MultiByteString, _In_ ULONG MaxBytesInMultiByteString, _Out_opt_ PULONG BytesInMultiByteString, - _In_reads_bytes_(BytesInUnicodeString) PWCH UnicodeString, + _In_reads_bytes_(BytesInUnicodeString) PCWCH UnicodeString, _In_ ULONG BytesInUnicodeString); _IRQL_requires_max_(PASSIVE_LEVEL) From 456a8b2857fb95d717e6a1b2ab29d6ec405dc3d8 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 24 Jan 2012 21:56:02 +0000 Subject: [PATCH 073/289] Fix build svn path=/trunk/; revision=55153 --- reactos/include/ndk/extypes.h | 2 +- reactos/include/ndk/peb_teb.h | 2 +- reactos/include/ndk/rtlfuncs.h | 10 +--------- reactos/include/ndk/rtltypes.h | 16 +++++++++++++--- reactos/lib/rtl/nls.c | 2 +- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/reactos/include/ndk/extypes.h b/reactos/include/ndk/extypes.h index e26afa17049..0731b1fd702 100644 --- a/reactos/include/ndk/extypes.h +++ b/reactos/include/ndk/extypes.h @@ -772,7 +772,7 @@ typedef struct _SYSTEM_PERFORMANCE_INFORMATION ULONG TotalSystemCodePages; ULONG NonPagedPoolLookasideHits; ULONG PagedPoolLookasideHits; - ULONG AvailablePagedPoolPages; + ULONG Spare3Count; ULONG ResidentSystemCachePage; ULONG ResidentPagedPoolPage; ULONG ResidentSystemDriverPage; diff --git a/reactos/include/ndk/peb_teb.h b/reactos/include/ndk/peb_teb.h index 844b4d0f11c..ba70ebc3fb0 100644 --- a/reactos/include/ndk/peb_teb.h +++ b/reactos/include/ndk/peb_teb.h @@ -146,7 +146,7 @@ typedef struct STRUCT(_PEB) PTR(PVOID*) FlsCallback; STRUCT(LIST_ENTRY) FlsListHead; PTR(PVOID) FlsBitmap; - ULONG FlsBitmapBits[FLS_MAXIMUM_AVAILABLE/(sizeof(ULONG)*8)]; + ULONG FlsBitmapBits[4]; // [FLS_MAXIMUM_AVAILABLE/(sizeof(ULONG)*8)]; ULONG FlsHighIndex; #endif #if (NTDDI_VERSION >= NTDDI_LONGHORN) diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 9d9ce2050d0..50b2a0bd3b3 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -964,7 +964,7 @@ NTSTATUS NTAPI RtlWalkHeap( IN HANDLE HeapHandle, - IN OUT PRTL_HEAP_WALK_ENTRY HeapEntry + IN PVOID HeapEntry ); #define RtlGetProcessHeap() (NtCurrentPeb()->ProcessHeap) @@ -2665,14 +2665,6 @@ RtlSetCurrentDirectory_U( IN PUNICODE_STRING name ); -NTSYSAPI -NTSTATUS -NTAPI -RtlSetCurrentEnvironment( - IN PVOID Environment, - OUT OPTIONAL PVOID *PreviousEnvironment -); - NTSYSAPI NTSTATUS NTAPI diff --git a/reactos/include/ndk/rtltypes.h b/reactos/include/ndk/rtltypes.h index 1ab594b24ff..6c566723991 100644 --- a/reactos/include/ndk/rtltypes.h +++ b/reactos/include/ndk/rtltypes.h @@ -46,7 +46,7 @@ Author: #define RTL_USER_PROCESS_PARAMETERS_PROCESS_OR_1 0x200 #define RTL_USER_PROCESS_PARAMETERS_PROCESS_OR_2 0x400 #define RTL_USER_PROCESS_PARAMETERS_PRIVATE_DLL_PATH 0x1000 -#define RTL_USER_PROCESS_PARAMETERS_APP_MANIFEST_PRESENT 0x2000 +#define RTL_USER_PROCESS_PARAMETERS_LOCAL_DLL_PATH 0x2000 #define RTL_USER_PROCESS_PARAMETERS_IMAGE_KEY_MISSING 0x4000 #define RTL_USER_PROCESS_PARAMETERS_NX 0x20000 @@ -979,6 +979,16 @@ typedef struct _RTL_HEAP_ENTRY } u; } RTL_HEAP_ENTRY, *PRTL_HEAP_ENTRY; +typedef struct _RTL_HEAP_TAG +{ + ULONG NumberOfAllocations; + ULONG NumberOfFrees; + SIZE_T BytesAllocated; + USHORT TagIndex; + USHORT CreatorBackTraceIndex; + WCHAR TagName[24]; +} RTL_HEAP_TAG, *PRTL_HEAP_TAG; + typedef struct _RTL_HEAP_INFORMATION { PVOID BaseAddress; @@ -1262,8 +1272,8 @@ typedef struct _RTL_RESOURCE ULONG ExclusiveWaiters; LONG NumberActive; HANDLE OwningThread; - ULONG Flags; - PRTL_RESOURCE_DEBUG DebugInfo; + ULONG TimeoutBoost; + PVOID DebugInfo; } RTL_RESOURCE, *PRTL_RESOURCE; // diff --git a/reactos/lib/rtl/nls.c b/reactos/lib/rtl/nls.c index 697835dd697..d6e181dd5ca 100644 --- a/reactos/lib/rtl/nls.c +++ b/reactos/lib/rtl/nls.c @@ -502,7 +502,7 @@ NTSTATUS NTAPI RtlUnicodeToMultiByteN (PCHAR MbString, ULONG MbSize, PULONG ResultSize, - PWCHAR UnicodeString, + PCWCH UnicodeString, ULONG UnicodeSize) { ULONG Size = 0; From e4c48917119d2d25759e3c629271594fb4dff18a Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 24 Jan 2012 23:11:46 +0000 Subject: [PATCH 074/289] [PSDK] * Update winbase.h annotations. svn path=/trunk/; revision=55158 --- reactos/include/psdk/winbase.h | 1510 ++++++++++++++++++++++++-------- 1 file changed, 1158 insertions(+), 352 deletions(-) diff --git a/reactos/include/psdk/winbase.h b/reactos/include/psdk/winbase.h index 48c78983967..e7f6b07037c 100644 --- a/reactos/include/psdk/winbase.h +++ b/reactos/include/psdk/winbase.h @@ -1152,7 +1152,15 @@ typedef struct _ACTIVATION_CONTEXT_BASIC_INFORMATION { } ACTIVATION_CONTEXT_BASIC_INFORMATION, *PACTIVATION_CONTEXT_BASIC_INFORMATION; typedef const struct _ACTIVATION_CONTEXT_BASIC_INFORMATION *PCACTIVATION_CONTEXT_BASIC_INFORMATION; -typedef BOOL (WINAPI *PQUERYACTCTXW_FUNC)(DWORD,HANDLE,PVOID,ULONG,PVOID,SIZE_T,SIZE_T *); +typedef BOOL +(WINAPI *PQUERYACTCTXW_FUNC)( + _In_ DWORD dwFlags, + _In_ HANDLE hActCtx, + _In_opt_ PVOID pvSubInstance, + _In_ ULONG ulInfoClass, + _Out_writes_bytes_to_opt_(cbBuffer, *pcbWrittenOrRequired) PVOID pvBuffer, + _In_ SIZE_T cbBuffer, + _Out_opt_ SIZE_T *pcbWrittenOrRequired); typedef enum { LowMemoryResourceNotification , @@ -1179,7 +1187,7 @@ typedef RTL_SRWLOCK SRWLOCK, *PSRWLOCK; typedef RTL_CONDITION_VARIABLE CONDITION_VARIABLE, *PCONDITION_VARIABLE; #endif -typedef DWORD(WINAPI *LPPROGRESS_ROUTINE)(LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,LARGE_INTEGER,DWORD,DWORD,HANDLE,HANDLE,LPVOID); +typedef DWORD(WINAPI *LPPROGRESS_ROUTINE)(_In_ LARGE_INTEGER, _In_ LARGE_INTEGER, _In_ LARGE_INTEGER, _In_ LARGE_INTEGER, _In_ DWORD, _In_ DWORD, _In_ HANDLE, _In_ HANDLE, _In_opt_ LPVOID); typedef VOID (WINAPI *PFIBER_START_ROUTINE)( LPVOID lpFiberParameter ); typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE; @@ -1208,28 +1216,69 @@ typedef DWORD (WINAPI *APPLICATION_RECOVERY_CALLBACK)(PVOID); /* Functions */ #ifndef UNDER_CE -int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPSTR,int); +int APIENTRY WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR, _In_ int); #else -int APIENTRY WinMain(HINSTANCE,HINSTANCE,LPWSTR,int); +int APIENTRY WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPWSTR, _In_ int); #endif -int APIENTRY wWinMain(HINSTANCE,HINSTANCE,LPWSTR,int); -long WINAPI _hread(HFILE,LPVOID,long); -long WINAPI _hwrite(HFILE,LPCSTR,long); -HFILE WINAPI _lclose(HFILE); -HFILE WINAPI _lcreat(LPCSTR,int); -LONG WINAPI _llseek(HFILE,LONG,int); -HFILE WINAPI _lopen(LPCSTR,int); -UINT WINAPI _lread(HFILE,LPVOID,UINT); -UINT WINAPI _lwrite(HFILE,LPCSTR,UINT); +int APIENTRY wWinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPWSTR, _In_ int); + +long +WINAPI +_hread( + _In_ HFILE hFile, + _Out_writes_bytes_to_(lBytes, return) LPVOID lpBuffer, + _In_ long lBytes); + +long +WINAPI +_hwrite( + _In_ HFILE hFile, + _In_reads_bytes_(lBytes) LPCCH lpBuffer, + _In_ long lBytes); + +HFILE WINAPI _lclose(_In_ HFILE); +HFILE WINAPI _lcreat(_In_ LPCSTR, _In_ int); +LONG WINAPI _llseek(_In_ HFILE, _In_ LONG, _In_ int); +HFILE WINAPI _lopen(_In_ LPCSTR, _In_ int); + +UINT +WINAPI +_lread( + _In_ HFILE hFile, + _Out_writes_bytes_to_(uBytes, return) LPVOID lpBuffer, + _In_ UINT uBytes); + +UINT +WINAPI +_lwrite( + _In_ HFILE hFile, + _In_reads_bytes_(uBytes) LPCCH lpBuffer, + _In_ UINT uBytes); + BOOL WINAPI AccessCheck(PSECURITY_DESCRIPTOR,HANDLE,DWORD,PGENERIC_MAPPING,PPRIVILEGE_SET,PDWORD,PDWORD,PBOOL); -BOOL WINAPI AccessCheckAndAuditAlarmA(LPCSTR,LPVOID,LPSTR,LPSTR,PSECURITY_DESCRIPTOR,DWORD,PGENERIC_MAPPING,BOOL,PDWORD,PBOOL,PBOOL); + +BOOL +WINAPI +AccessCheckAndAuditAlarmA( + _In_ LPCSTR SubsystemName, + _In_opt_ LPVOID HandleId, + _In_ LPSTR ObjectTypeName, + _In_opt_ LPSTR ObjectName, + _In_ PSECURITY_DESCRIPTOR SecurityDescriptor, + _In_ DWORD DesiredAccess, + _In_ PGENERIC_MAPPING GenericMapping, + _In_ BOOL ObjectCreation, + _Out_ LPDWORD GrantedAccess, + _Out_ LPBOOL AccessStatus, + _Out_ LPBOOL pfGenerateOnClose); + BOOL WINAPI AccessCheckAndAuditAlarmW(LPCWSTR,LPVOID,LPWSTR,LPWSTR,PSECURITY_DESCRIPTOR,DWORD,PGENERIC_MAPPING,BOOL,PDWORD,PBOOL,PBOOL); #if (_WIN32_WINNT >= 0x0600) VOID WINAPI AcquireSRWLockExclusive(PSRWLOCK); VOID WINAPI AcquireSRWLockShared(PSRWLOCK); #endif #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI ActivateActCtx(HANDLE,ULONG_PTR*); +BOOL WINAPI ActivateActCtx(_Inout_opt_ HANDLE, _Out_ ULONG_PTR*); #endif BOOL WINAPI AddAccessAllowedAce(PACL,DWORD,DWORD,PSID); BOOL WINAPI AddAccessDeniedAce(PACL,DWORD,DWORD,PSID); @@ -1240,17 +1289,17 @@ BOOL WINAPI AddAccessAllowedObjectAce(PACL,DWORD,DWORD,DWORD,GUID*,GUID*,PSID); BOOL WINAPI AddAccessDeniedObjectAce(PACL,DWORD,DWORD,DWORD,GUID*,GUID*,PSID); #endif BOOL WINAPI AddAce(PACL,DWORD,DWORD,PVOID,DWORD); -ATOM WINAPI AddAtomA(LPCSTR); -ATOM WINAPI AddAtomW(LPCWSTR); +ATOM WINAPI AddAtomA(_In_opt_ LPCSTR); +ATOM WINAPI AddAtomW(_In_opt_ LPCWSTR); BOOL WINAPI AddAuditAccessAce(PACL,DWORD,DWORD,PSID,BOOL,BOOL); #if (_WIN32_WINNT >= 0x0500) BOOL WINAPI AddAuditAccessObjectAce(PACL,DWORD,DWORD,DWORD,GUID*,GUID*,PSID,BOOL,BOOL); #endif #if (_WIN32_WINNT >= 0x0501) -void WINAPI AddRefActCtx(HANDLE); +void WINAPI AddRefActCtx(_Inout_ HANDLE); #endif #if (_WIN32_WINNT >= 0x0500) -PVOID WINAPI AddVectoredExceptionHandler(ULONG,PVECTORED_EXCEPTION_HANDLER); +_Ret_maybenull_ PVOID WINAPI AddVectoredExceptionHandler(_In_ ULONG, _In_ PVECTORED_EXCEPTION_HANDLER); #endif BOOL WINAPI AccessCheckByType(PSECURITY_DESCRIPTOR,PSID,HANDLE,DWORD,POBJECT_TYPE_LIST,DWORD,PGENERIC_MAPPING,PPRIVILEGE_SET,LPDWORD,LPDWORD,LPBOOL); BOOL WINAPI AdjustTokenGroups(HANDLE,BOOL,PTOKEN_GROUPS,DWORD,PTOKEN_GROUPS,PDWORD); @@ -1261,54 +1310,116 @@ BOOL WINAPI AllocateLocallyUniqueId(PLUID); BOOL WINAPI AreAllAccessesGranted(DWORD,DWORD); BOOL WINAPI AreAnyAccessesGranted(DWORD,DWORD); BOOL WINAPI AreFileApisANSI(void); -BOOL WINAPI BackupEventLogA(HANDLE,LPCSTR); -BOOL WINAPI BackupEventLogW(HANDLE,LPCWSTR); -BOOL WINAPI BackupRead(HANDLE,LPBYTE,DWORD,LPDWORD,BOOL,BOOL,LPVOID*); -BOOL WINAPI BackupSeek(HANDLE,DWORD,DWORD,LPDWORD,LPDWORD,LPVOID*); -BOOL WINAPI BackupWrite(HANDLE,LPBYTE,DWORD,LPDWORD,BOOL,BOOL,LPVOID*); +BOOL WINAPI BackupEventLogA(_In_ HANDLE, _In_ LPCSTR); +BOOL WINAPI BackupEventLogW(_In_ HANDLE, _In_ LPCWSTR); + +BOOL +WINAPI +BackupRead( + _In_ HANDLE hFile, + _Out_writes_bytes_to_(nNumberOfBytesToRead, *lpNumberOfBytesRead) LPBYTE lpBuffer, + _In_ DWORD nNumberOfBytesToRead, + _Out_ LPDWORD lpNumberOfBytesRead, + _In_ BOOL bAbort, + _In_ BOOL bProcessSecurity, + _Inout_ LPVOID *lpContext); + +BOOL WINAPI BackupSeek(_In_ HANDLE, _In_ DWORD, _In_ DWORD, _Out_ LPDWORD, _Out_ LPDWORD, _Inout_ LPVOID*); + +BOOL +WINAPI +BackupWrite( + _In_ HANDLE hFile, + _In_reads_bytes_(nNumberOfBytesToWrite) LPBYTE lpBuffer, + _In_ DWORD nNumberOfBytesToWrite, + _Out_ LPDWORD lpNumberOfBytesWritten, + _In_ BOOL bAbort, + _In_ BOOL bProcessSecurity, + _Inout_ LPVOID *lpContext); + BOOL WINAPI Beep(DWORD,DWORD); -HANDLE WINAPI BeginUpdateResourceA(LPCSTR,BOOL); -HANDLE WINAPI BeginUpdateResourceW(LPCWSTR,BOOL); +HANDLE WINAPI BeginUpdateResourceA(_In_ LPCSTR, _In_ BOOL); +HANDLE WINAPI BeginUpdateResourceW(_In_ LPCWSTR, _In_ BOOL); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI BindIoCompletionCallback(HANDLE,LPOVERLAPPED_COMPLETION_ROUTINE,ULONG); +BOOL WINAPI BindIoCompletionCallback(_In_ HANDLE, _In_ LPOVERLAPPED_COMPLETION_ROUTINE, _In_ ULONG); #endif -BOOL WINAPI BuildCommDCBA(LPCSTR,LPDCB); -BOOL WINAPI BuildCommDCBW(LPCWSTR,LPDCB); -BOOL WINAPI BuildCommDCBAndTimeoutsA(LPCSTR,LPDCB,LPCOMMTIMEOUTS); -BOOL WINAPI BuildCommDCBAndTimeoutsW(LPCWSTR,LPDCB,LPCOMMTIMEOUTS); -BOOL WINAPI CallNamedPipeA(LPCSTR,PVOID,DWORD,PVOID,DWORD,PDWORD,DWORD); -BOOL WINAPI CallNamedPipeW(LPCWSTR,PVOID,DWORD,PVOID,DWORD,PDWORD,DWORD); -BOOL WINAPI CancelDeviceWakeupRequest(HANDLE); +BOOL WINAPI BuildCommDCBA(_In_ LPCSTR, _Out_ LPDCB); +BOOL WINAPI BuildCommDCBW(_In_ LPCWSTR, _Out_ LPDCB); +BOOL WINAPI BuildCommDCBAndTimeoutsA(_In_ LPCSTR, _Out_ LPDCB, _Out_ LPCOMMTIMEOUTS); +BOOL WINAPI BuildCommDCBAndTimeoutsW(_In_ LPCWSTR, _Out_ LPDCB, _Out_ LPCOMMTIMEOUTS); + +BOOL +WINAPI +CallNamedPipeA( + _In_ LPCSTR lpNamedPipeName, + _In_reads_bytes_opt_(nInBufferSize) LPVOID lpInBuffer, + _In_ DWORD nInBufferSize, + _Out_writes_bytes_to_opt_(nOutBufferSize, *lpBytesRead) LPVOID lpOutBuffer, + _In_ DWORD nOutBufferSize, + _Out_ LPDWORD lpBytesRead, + _In_ DWORD nTimeOut); + +BOOL +WINAPI +CallNamedPipeW( + _In_ LPCWSTR lpNamedPipeName, + _In_reads_bytes_opt_(nInBufferSize) LPVOID lpInBuffer, + _In_ DWORD nInBufferSize, + _Out_writes_bytes_to_opt_(nOutBufferSize, *lpBytesRead) LPVOID lpOutBuffer, + _In_ DWORD nOutBufferSize, + _Out_ LPDWORD lpBytesRead, + _In_ DWORD nTimeOut); + +BOOL WINAPI CancelDeviceWakeupRequest(_In_ HANDLE); BOOL WINAPI CancelIo(HANDLE); #if (_WIN32_WINNT >= 0x0600) BOOL WINAPI CancelIoEx(HANDLE,LPOVERLAPPED); BOOL WINAPI CancelSynchronousIo(HANDLE); #endif BOOL WINAPI CancelWaitableTimer(HANDLE); + #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI CheckNameLegalDOS8Dot3A(LPCSTR,LPSTR,DWORD,PBOOL,PBOOL); -BOOL WINAPI CheckNameLegalDOS8Dot3W(LPCWSTR,LPSTR,DWORD,PBOOL,PBOOL); -BOOL WINAPI CheckRemoteDebuggerPresent(HANDLE,PBOOL); + +BOOL +WINAPI +CheckNameLegalDOS8Dot3A( + _In_ LPCSTR lpName, + _Out_writes_opt_(OemNameSize) LPSTR lpOemName, + _In_ DWORD OemNameSize, + _Out_opt_ PBOOL pbNameContainsSpaces, + _Out_ PBOOL pbNameLegal); + +BOOL +WINAPI +CheckNameLegalDOS8Dot3W( + _In_ LPCWSTR lpName, + _Out_writes_opt_(OemNameSize) LPSTR lpOemName, + _In_ DWORD OemNameSize, + _Out_opt_ PBOOL pbNameContainsSpaces, + _Out_ PBOOL pbNameLegal); + +BOOL WINAPI CheckRemoteDebuggerPresent(_In_ HANDLE, _Out_ PBOOL); #endif -BOOL WINAPI ClearCommBreak(HANDLE); -BOOL WINAPI ClearCommError(HANDLE,PDWORD,LPCOMSTAT); -BOOL WINAPI ClearEventLogA(HANDLE,LPCSTR); -BOOL WINAPI ClearEventLogW(HANDLE,LPCWSTR); -BOOL WINAPI CloseEventLog(HANDLE); + +BOOL WINAPI ClearCommBreak(_In_ HANDLE); +BOOL WINAPI ClearCommError(_In_ HANDLE, _Out_opt_ PDWORD, _Out_opt_ LPCOMSTAT); +BOOL WINAPI ClearEventLogA(_In_ HANDLE, _In_opt_ LPCSTR); +BOOL WINAPI ClearEventLogW(_In_ HANDLE, _In_opt_ LPCWSTR); +BOOL WINAPI CloseEventLog(_In_ HANDLE); BOOL WINAPI CloseHandle(HANDLE); -BOOL WINAPI CommConfigDialogA(LPCSTR,HWND,LPCOMMCONFIG); -BOOL WINAPI CommConfigDialogW(LPCWSTR,HWND,LPCOMMCONFIG); +BOOL WINAPI CommConfigDialogA(_In_ LPCSTR, _In_opt_ HWND, _Inout_ LPCOMMCONFIG); +BOOL WINAPI CommConfigDialogW(_In_ LPCWSTR, _In_opt_ HWND, _Inout_ LPCOMMCONFIG); LONG WINAPI CompareFileTime(CONST FILETIME*,CONST FILETIME*); BOOL WINAPI ConnectNamedPipe(HANDLE,LPOVERLAPPED); BOOL WINAPI ContinueDebugEvent(DWORD,DWORD,DWORD); #if (_WIN32_WINNT >= 0x0400) BOOL WINAPI ConvertFiberToThread(void); #endif -PVOID WINAPI ConvertThreadToFiber(PVOID); -BOOL WINAPI CopyFileA(LPCSTR,LPCSTR,BOOL); -BOOL WINAPI CopyFileW(LPCWSTR,LPCWSTR,BOOL); -BOOL WINAPI CopyFileExA(LPCSTR,LPCSTR,LPPROGRESS_ROUTINE,LPVOID,LPBOOL,DWORD); -BOOL WINAPI CopyFileExW(LPCWSTR,LPCWSTR,LPPROGRESS_ROUTINE,LPVOID,LPBOOL,DWORD); +_Ret_maybenull_ PVOID WINAPI ConvertThreadToFiber(_In_opt_ PVOID); +BOOL WINAPI CopyFileA(_In_ LPCSTR, _In_ LPCSTR, _In_ BOOL); +BOOL WINAPI CopyFileW(_In_ LPCWSTR, _In_ LPCWSTR, _In_ BOOL); +BOOL WINAPI CopyFileExA(_In_ LPCSTR, _In_ LPCSTR, _In_opt_ LPPROGRESS_ROUTINE, _In_opt_ LPVOID, _In_opt_ LPBOOL, _In_ DWORD); +BOOL WINAPI CopyFileExW(_In_ LPCWSTR, _In_ LPCWSTR, _In_opt_ LPPROGRESS_ROUTINE, _In_opt_ LPVOID, _In_opt_ LPBOOL, _In_ DWORD); #define MoveMemory RtlMoveMemory #define CopyMemory RtlCopyMemory #define FillMemory RtlFillMemory @@ -1316,40 +1427,40 @@ BOOL WINAPI CopyFileExW(LPCWSTR,LPCWSTR,LPPROGRESS_ROUTINE,LPVOID,LPBOOL,DWORD); #define SecureZeroMemory RtlSecureZeroMemory BOOL WINAPI CopySid(DWORD,PSID,PSID); #if (_WIN32_WINNT >= 0x0501) -HANDLE WINAPI CreateActCtxA(PCACTCTXA); -HANDLE WINAPI CreateActCtxW(PCACTCTXW); +HANDLE WINAPI CreateActCtxA(_In_ PCACTCTXA); +HANDLE WINAPI CreateActCtxW(_In_ PCACTCTXW); #endif BOOL WINAPI CreateDirectoryA(LPCSTR,LPSECURITY_ATTRIBUTES); BOOL WINAPI CreateDirectoryW(LPCWSTR,LPSECURITY_ATTRIBUTES); -BOOL WINAPI CreateDirectoryExA(LPCSTR,LPCSTR,LPSECURITY_ATTRIBUTES); -BOOL WINAPI CreateDirectoryExW(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES); +BOOL WINAPI CreateDirectoryExA(_In_ LPCSTR, _In_ LPCSTR, _In_opt_ LPSECURITY_ATTRIBUTES); +BOOL WINAPI CreateDirectoryExW(_In_ LPCWSTR, _In_ LPCWSTR, _In_opt_ LPSECURITY_ATTRIBUTES); HANDLE WINAPI CreateEventA(LPSECURITY_ATTRIBUTES,BOOL,BOOL,LPCSTR); HANDLE WINAPI CreateEventW(LPSECURITY_ATTRIBUTES,BOOL,BOOL,LPCWSTR); #if (_WIN32_WINNT >= 0x0600) HANDLE WINAPI CreateEventExA(LPSECURITY_ATTRIBUTES,LPCSTR,DWORD,DWORD); HANDLE WINAPI CreateEventExW(LPSECURITY_ATTRIBUTES,LPCWSTR,DWORD,DWORD); #endif -LPVOID WINAPI CreateFiber(SIZE_T,LPFIBER_START_ROUTINE,LPVOID); +_Ret_maybenull_ LPVOID WINAPI CreateFiber(_In_ SIZE_T, _In_ LPFIBER_START_ROUTINE, _In_opt_ LPVOID); #if (_WIN32_WINNT >= 0x0400) -LPVOID WINAPI CreateFiberEx(SIZE_T,SIZE_T,DWORD,LPFIBER_START_ROUTINE,LPVOID); +_Ret_maybenull_ LPVOID WINAPI CreateFiberEx(_In_ SIZE_T, _In_ SIZE_T, _In_ DWORD, _In_ LPFIBER_START_ROUTINE, _In_opt_ LPVOID); #endif HANDLE WINAPI CreateFileA(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE); HANDLE WINAPI CreateFileW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE); -HANDLE WINAPI CreateFileMappingA(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR); +_Ret_maybenull_ HANDLE WINAPI CreateFileMappingA(_In_ HANDLE, _In_opt_ LPSECURITY_ATTRIBUTES, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_opt_ LPCSTR); HANDLE WINAPI CreateFileMappingW(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCWSTR); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI CreateHardLinkA(LPCSTR,LPCSTR,LPSECURITY_ATTRIBUTES); -BOOL WINAPI CreateHardLinkW(LPCWSTR,LPCWSTR,LPSECURITY_ATTRIBUTES); +BOOL WINAPI CreateHardLinkA(_In_ LPCSTR, _In_ LPCSTR, _Reserved_ LPSECURITY_ATTRIBUTES); +BOOL WINAPI CreateHardLinkW(_In_ LPCWSTR, _In_ LPCWSTR, _Reserved_ LPSECURITY_ATTRIBUTES); #endif HANDLE WINAPI CreateIoCompletionPort(HANDLE,HANDLE,ULONG_PTR,DWORD); #if (_WIN32_WINNT >= 0x0500) -HANDLE WINAPI CreateJobObjectA(LPSECURITY_ATTRIBUTES,LPCSTR); -HANDLE WINAPI CreateJobObjectW(LPSECURITY_ATTRIBUTES,LPCWSTR); -BOOL WINAPI TerminateJobObject(HANDLE,UINT); -BOOL WINAPI AssignProcessToJobObject(HANDLE,HANDLE); +_Ret_maybenull_ HANDLE WINAPI CreateJobObjectA(_In_opt_ LPSECURITY_ATTRIBUTES, _In_opt_ LPCSTR); +_Ret_maybenull_ HANDLE WINAPI CreateJobObjectW(_In_opt_ LPSECURITY_ATTRIBUTES, _In_opt_ LPCWSTR); +BOOL WINAPI TerminateJobObject(_In_ HANDLE, _In_ UINT); +BOOL WINAPI AssignProcessToJobObject(_In_ HANDLE, _In_ HANDLE); #endif -HANDLE WINAPI CreateMailslotA(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES); -HANDLE WINAPI CreateMailslotW(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES); +HANDLE WINAPI CreateMailslotA(_In_ LPCSTR, _In_ DWORD, _In_ DWORD, _In_opt_ LPSECURITY_ATTRIBUTES); +HANDLE WINAPI CreateMailslotW(_In_ LPCWSTR, _In_ DWORD, _In_ DWORD, _In_opt_ LPSECURITY_ATTRIBUTES); #if (_WIN32_WINNT >= 0x0501) HANDLE WINAPI CreateMemoryResourceNotification(MEMORY_RESOURCE_NOTIFICATION_TYPE); #endif @@ -1359,36 +1470,51 @@ HANDLE WINAPI CreateMutexW(LPSECURITY_ATTRIBUTES,BOOL,LPCWSTR); HANDLE WINAPI CreateMutexExA(LPSECURITY_ATTRIBUTES,LPCSTR,DWORD,DWORD); HANDLE WINAPI CreateMutexExW(LPSECURITY_ATTRIBUTES,LPCWSTR,DWORD,DWORD); #endif -HANDLE WINAPI CreateNamedPipeA(LPCSTR,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPSECURITY_ATTRIBUTES); -HANDLE WINAPI CreateNamedPipeW(LPCWSTR,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,LPSECURITY_ATTRIBUTES); +HANDLE WINAPI CreateNamedPipeA(_In_ LPCSTR, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_opt_ LPSECURITY_ATTRIBUTES); +HANDLE WINAPI CreateNamedPipeW(_In_ LPCWSTR, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_opt_ LPSECURITY_ATTRIBUTES); BOOL WINAPI CreatePipe(PHANDLE,PHANDLE,LPSECURITY_ATTRIBUTES,DWORD); BOOL WINAPI CreatePrivateObjectSecurity(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR*,BOOL,HANDLE,PGENERIC_MAPPING); BOOL WINAPI CreateProcessA(LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION); BOOL WINAPI CreateProcessW(LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION); -BOOL WINAPI CreateProcessAsUserA(HANDLE,LPCSTR,LPSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCSTR,LPSTARTUPINFOA,LPPROCESS_INFORMATION); + +BOOL +WINAPI +CreateProcessAsUserA( + _In_opt_ HANDLE, + _In_opt_ LPCSTR, + _Inout_opt_ LPSTR, + _In_opt_ LPSECURITY_ATTRIBUTES, + _In_opt_ LPSECURITY_ATTRIBUTES, + _In_ BOOL, + _In_ DWORD, + _In_opt_ PVOID, + _In_opt_ LPCSTR, + _In_ LPSTARTUPINFOA, + _Out_ LPPROCESS_INFORMATION); + BOOL WINAPI CreateProcessAsUserW(HANDLE,LPCWSTR,LPWSTR,LPSECURITY_ATTRIBUTES,LPSECURITY_ATTRIBUTES,BOOL,DWORD,PVOID,LPCWSTR,LPSTARTUPINFOW,LPPROCESS_INFORMATION); HANDLE WINAPI CreateRemoteThread(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD); -HANDLE WINAPI CreateSemaphoreA(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCSTR); -HANDLE WINAPI CreateSemaphoreW(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR); +_Ret_maybenull_ HANDLE WINAPI CreateSemaphoreA(_In_opt_ LPSECURITY_ATTRIBUTES, _In_ LONG, _In_ LONG, _In_opt_ LPCSTR); +_Ret_maybenull_ HANDLE WINAPI CreateSemaphoreW(_In_opt_ LPSECURITY_ATTRIBUTES, _In_ LONG, _In_ LONG, _In_opt_ LPCWSTR); #if (_WIN32_WINNT >= 0x0600) -HANDLE WINAPI CreateSemaphoreExA(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCSTR,DWORD,DWORD); +_Ret_maybenull_ HANDLE WINAPI CreateSemaphoreExA(_In_opt_ LPSECURITY_ATTRIBUTES, _In_ LONG, _In_ LONG, _In_opt_ LPCSTR, _Reserved_ DWORD, _In_ DWORD); HANDLE WINAPI CreateSemaphoreExW(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR,DWORD,DWORD); #endif -DWORD WINAPI CreateTapePartition(HANDLE,DWORD,DWORD,DWORD); +DWORD WINAPI CreateTapePartition(_In_ HANDLE, _In_ DWORD, _In_ DWORD, _In_ DWORD); #if (_WIN32_WINNT >= 0x0500) HANDLE WINAPI CreateTimerQueue(void); BOOL WINAPI CreateTimerQueueTimer(PHANDLE,HANDLE,WAITORTIMERCALLBACK,PVOID,DWORD,DWORD,ULONG); #endif HANDLE WINAPI CreateThread(LPSECURITY_ATTRIBUTES,DWORD,LPTHREAD_START_ROUTINE,PVOID,DWORD,PDWORD); -HANDLE WINAPI CreateWaitableTimerA(LPSECURITY_ATTRIBUTES,BOOL,LPCSTR); -HANDLE WINAPI CreateWaitableTimerW(LPSECURITY_ATTRIBUTES,BOOL,LPCWSTR); +_Ret_maybenull_ HANDLE WINAPI CreateWaitableTimerA(_In_opt_ LPSECURITY_ATTRIBUTES, _In_ BOOL, _In_opt_ LPCSTR); +_Ret_maybenull_ HANDLE WINAPI CreateWaitableTimerW(_In_opt_ LPSECURITY_ATTRIBUTES, _In_ BOOL, _In_opt_ LPCWSTR); #if (_WIN32_WINNT >= 0x0600) -HANDLE WINAPI CreateWaitableTimerExA(LPSECURITY_ATTRIBUTES,LPCSTR,DWORD,DWORD); +_Ret_maybenull_ HANDLE WINAPI CreateWaitableTimerExA(_In_opt_ LPSECURITY_ATTRIBUTES, _In_opt_ LPCSTR, _In_ DWORD, _In_ DWORD); HANDLE WINAPI CreateWaitableTimerExW(LPSECURITY_ATTRIBUTES,LPCWSTR,DWORD,DWORD); #endif #if (_WIN32_WINNT >= 0x0501) BOOL WINAPI CreateWellKnownSid(WELL_KNOWN_SID_TYPE,PSID,PSID,DWORD*); -BOOL WINAPI DeactivateActCtx(DWORD,ULONG_PTR); +BOOL WINAPI DeactivateActCtx(_In_ DWORD, _In_ ULONG_PTR); #endif BOOL WINAPI DebugActiveProcess(DWORD); #if (_WIN32_WINNT >= 0x0501) @@ -1396,78 +1522,95 @@ BOOL WINAPI DebugActiveProcessStop(DWORD); #endif void WINAPI DebugBreak(void); #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI DebugBreakProcess(HANDLE); -BOOL WINAPI DebugSetProcessKillOnExit(BOOL); +BOOL WINAPI DebugBreakProcess(_In_ HANDLE); +BOOL WINAPI DebugSetProcessKillOnExit(_In_ BOOL); #endif PVOID WINAPI DecodePointer(PVOID); PVOID WINAPI DecodeSystemPointer(PVOID); -BOOL WINAPI DecryptFileA(LPCSTR,DWORD); -BOOL WINAPI DecryptFileW(LPCWSTR,DWORD); -BOOL WINAPI DefineDosDeviceA(DWORD,LPCSTR,LPCSTR); +BOOL WINAPI DecryptFileA(_In_ LPCSTR, _Reserved_ DWORD); +BOOL WINAPI DecryptFileW(_In_ LPCWSTR, _Reserved_ DWORD); +BOOL WINAPI DefineDosDeviceA(_In_ DWORD, _In_ LPCSTR, _In_opt_ LPCSTR); BOOL WINAPI DefineDosDeviceW(DWORD,LPCWSTR,LPCWSTR); #define DefineHandleTable(w) ((w),TRUE) BOOL WINAPI DeleteAce(PACL,DWORD); -ATOM WINAPI DeleteAtom(ATOM); +ATOM WINAPI DeleteAtom(_In_ ATOM); void WINAPI DeleteCriticalSection(PCRITICAL_SECTION); -void WINAPI DeleteFiber(PVOID); +void WINAPI DeleteFiber(_In_ PVOID); BOOL WINAPI DeleteFileA(LPCSTR); BOOL WINAPI DeleteFileW(LPCWSTR); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI DeleteTimerQueue(HANDLE); +_Must_inspect_result_ BOOL WINAPI DeleteTimerQueue(_In_ HANDLE); BOOL WINAPI DeleteTimerQueueEx(HANDLE,HANDLE); BOOL WINAPI DeleteTimerQueueTimer(HANDLE,HANDLE,HANDLE); -BOOL WINAPI DeleteVolumeMountPointA(LPCSTR); +BOOL WINAPI DeleteVolumeMountPointA(_In_ LPCSTR); BOOL WINAPI DeleteVolumeMountPointW(LPCWSTR); #endif -BOOL WINAPI DeregisterEventSource(HANDLE); +BOOL WINAPI DeregisterEventSource(_In_ HANDLE); BOOL WINAPI DestroyPrivateObjectSecurity(PSECURITY_DESCRIPTOR*); BOOL WINAPI DeviceIoControl(HANDLE,DWORD,PVOID,DWORD,PVOID,DWORD,PDWORD,POVERLAPPED); BOOL WINAPI DisableThreadLibraryCalls(HMODULE); + #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI DnsHostnameToComputerNameA(LPCSTR,LPSTR,LPDWORD); -BOOL WINAPI DnsHostnameToComputerNameW(LPCWSTR,LPWSTR,LPDWORD); + +_Success_(return != FALSE) +BOOL +WINAPI +DnsHostnameToComputerNameA( + _In_ LPCSTR Hostname, + _Out_writes_to_opt_(*nSize, *nSize + 1) LPSTR ComputerName, + _Inout_ LPDWORD nSize); + +_Success_(return != FALSE) +BOOL +WINAPI +DnsHostnameToComputerNameW( + _In_ LPCWSTR Hostname, + _Out_writes_to_opt_(*nSize, *nSize + 1) LPWSTR ComputerName, + _Inout_ LPDWORD nSize); + #endif + BOOL WINAPI DisconnectNamedPipe(HANDLE); -BOOL WINAPI DosDateTimeToFileTime(WORD,WORD,LPFILETIME); +BOOL WINAPI DosDateTimeToFileTime(_In_ WORD, _In_ WORD, _Out_ LPFILETIME); BOOL WINAPI DuplicateHandle(HANDLE,HANDLE,HANDLE,PHANDLE,DWORD,BOOL,DWORD); BOOL WINAPI DuplicateToken(HANDLE,SECURITY_IMPERSONATION_LEVEL,PHANDLE); BOOL WINAPI DuplicateTokenEx(HANDLE,DWORD,LPSECURITY_ATTRIBUTES,SECURITY_IMPERSONATION_LEVEL,TOKEN_TYPE,PHANDLE); PVOID WINAPI EncodePointer(PVOID); PVOID WINAPI EncodeSystemPointer(PVOID); -BOOL WINAPI EncryptFileA(LPCSTR); -BOOL WINAPI EncryptFileW(LPCWSTR); -BOOL WINAPI EndUpdateResourceA(HANDLE,BOOL); -BOOL WINAPI EndUpdateResourceW(HANDLE,BOOL); +BOOL WINAPI EncryptFileA(_In_ LPCSTR); +BOOL WINAPI EncryptFileW(_In_ LPCWSTR); +BOOL WINAPI EndUpdateResourceA(_In_ HANDLE, _In_ BOOL); +BOOL WINAPI EndUpdateResourceW(_In_ HANDLE, _In_ BOOL); void WINAPI EnterCriticalSection(LPCRITICAL_SECTION); -BOOL WINAPI EnumResourceLanguagesA(HMODULE,LPCSTR,LPCSTR,ENUMRESLANGPROCA,LONG_PTR); -BOOL WINAPI EnumResourceLanguagesW(HMODULE,LPCWSTR,LPCWSTR,ENUMRESLANGPROCW,LONG_PTR); -BOOL WINAPI EnumResourceNamesA(HMODULE,LPCSTR,ENUMRESNAMEPROCA,LONG_PTR); -BOOL WINAPI EnumResourceNamesW(HMODULE,LPCWSTR,ENUMRESNAMEPROCW,LONG_PTR); -BOOL WINAPI EnumResourceTypesA(HMODULE,ENUMRESTYPEPROCA,LONG_PTR); -BOOL WINAPI EnumResourceTypesW(HMODULE,ENUMRESTYPEPROCW,LONG_PTR); +BOOL WINAPI EnumResourceLanguagesA(_In_opt_ HMODULE, _In_ LPCSTR, _In_ LPCSTR, _In_ ENUMRESLANGPROCA, _In_ LONG_PTR); +BOOL WINAPI EnumResourceLanguagesW(_In_opt_ HMODULE, _In_ LPCWSTR, _In_ LPCWSTR, _In_ ENUMRESLANGPROCW, _In_ LONG_PTR); +BOOL WINAPI EnumResourceNamesA(_In_opt_ HMODULE, _In_ LPCSTR, _In_ ENUMRESNAMEPROCA, _In_ LONG_PTR); +BOOL WINAPI EnumResourceNamesW(_In_opt_ HMODULE, _In_ LPCWSTR, _In_ ENUMRESNAMEPROCW, _In_ LONG_PTR); +BOOL WINAPI EnumResourceTypesA(_In_opt_ HMODULE, _In_ ENUMRESTYPEPROCA, _In_ LONG_PTR); +BOOL WINAPI EnumResourceTypesW(_In_opt_ HMODULE, _In_ ENUMRESTYPEPROCW, _In_ LONG_PTR); BOOL WINAPI EqualPrefixSid(PSID,PSID); BOOL WINAPI EqualSid(PSID,PSID); -DWORD WINAPI EraseTape(HANDLE,DWORD,BOOL); -BOOL WINAPI EscapeCommFunction(HANDLE,DWORD); +DWORD WINAPI EraseTape(_In_ HANDLE, _In_ DWORD, _In_ BOOL); +BOOL WINAPI EscapeCommFunction(_In_ HANDLE, _In_ DWORD); DECLSPEC_NORETURN void WINAPI ExitProcess(UINT); DECLSPEC_NORETURN void WINAPI ExitThread(DWORD); DWORD WINAPI ExpandEnvironmentStringsA(LPCSTR,LPSTR,DWORD); DWORD WINAPI ExpandEnvironmentStringsW(LPCWSTR,LPWSTR,DWORD); void WINAPI FatalAppExitA(UINT,LPCSTR); void WINAPI FatalAppExitW(UINT,LPCWSTR); -void WINAPI FatalExit(int); -BOOL WINAPI FileEncryptionStatusA(LPCSTR,LPDWORD); -BOOL WINAPI FileEncryptionStatusW(LPCWSTR,LPDWORD); -BOOL WINAPI FileTimeToDosDateTime(CONST FILETIME *,LPWORD,LPWORD); +__analysis_noreturn void WINAPI FatalExit(_In_ int); +BOOL WINAPI FileEncryptionStatusA(_In_ LPCSTR, _Out_ LPDWORD); +BOOL WINAPI FileEncryptionStatusW(_In_ LPCWSTR, _Out_ LPDWORD); +BOOL WINAPI FileTimeToDosDateTime(_In_ CONST FILETIME *, _Out_ LPWORD, _Out_ LPWORD); BOOL WINAPI FileTimeToLocalFileTime(CONST FILETIME *,LPFILETIME); BOOL WINAPI FileTimeToSystemTime(CONST FILETIME *,LPSYSTEMTIME); #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI FindActCtxSectionGuid(DWORD,const GUID*,ULONG,const GUID*,PACTCTX_SECTION_KEYED_DATA); -BOOL WINAPI FindActCtxSectionStringA(DWORD,const GUID*,ULONG,LPCSTR,PACTCTX_SECTION_KEYED_DATA); -BOOL WINAPI FindActCtxSectionStringW(DWORD,const GUID*,ULONG,LPCWSTR,PACTCTX_SECTION_KEYED_DATA); +BOOL WINAPI FindActCtxSectionGuid(_In_ DWORD, _Reserved_ const GUID*, _In_ ULONG, _In_opt_ const GUID*, _Out_ PACTCTX_SECTION_KEYED_DATA); +BOOL WINAPI FindActCtxSectionStringA(_In_ DWORD, _Reserved_ const GUID*, _In_ ULONG, _In_ LPCSTR, _Out_ PACTCTX_SECTION_KEYED_DATA); +BOOL WINAPI FindActCtxSectionStringW(_In_ DWORD, _Reserved_ const GUID*, _In_ ULONG, _In_ LPCWSTR, _Out_ PACTCTX_SECTION_KEYED_DATA); #endif -ATOM WINAPI FindAtomA(LPCSTR); -ATOM WINAPI FindAtomW(LPCWSTR); +ATOM WINAPI FindAtomA(_In_opt_ LPCSTR); +ATOM WINAPI FindAtomW(_In_opt_ LPCWSTR); BOOL WINAPI FindClose(HANDLE); BOOL WINAPI FindCloseChangeNotification(HANDLE); HANDLE WINAPI FindFirstChangeNotificationA(LPCSTR,BOOL,DWORD); @@ -1477,36 +1620,95 @@ HANDLE WINAPI FindFirstFileW(LPCWSTR,LPWIN32_FIND_DATAW); HANDLE WINAPI FindFirstFileExA(LPCSTR,FINDEX_INFO_LEVELS,PVOID,FINDEX_SEARCH_OPS,PVOID,DWORD); HANDLE WINAPI FindFirstFileExW(LPCWSTR,FINDEX_INFO_LEVELS,PVOID,FINDEX_SEARCH_OPS,PVOID,DWORD); #if (_WIN32_WINNT >= 0x0501) -HANDLE WINAPI FindFirstStreamW(LPCWSTR,STREAM_INFO_LEVELS,LPVOID,DWORD); +HANDLE WINAPI FindFirstStreamW(_In_ LPCWSTR, _In_ STREAM_INFO_LEVELS, _Out_ LPVOID, _Reserved_ DWORD); #endif BOOL WINAPI FindFirstFreeAce(PACL,PVOID*); + #if (_WIN32_WINNT >= 0x0500) -HANDLE WINAPI FindFirstVolumeA(LPSTR,DWORD); + +HANDLE +WINAPI +FindFirstVolumeA( + _Out_writes_(cchBufferLength) LPSTR lpszVolumeName, + _In_ DWORD cchBufferLength); + HANDLE WINAPI FindFirstVolumeW(LPWSTR,DWORD); -HANDLE WINAPI FindFirstVolumeMountPointA(LPCSTR,LPSTR,DWORD); -HANDLE WINAPI FindFirstVolumeMountPointW(LPCWSTR,LPWSTR,DWORD); + +HANDLE +WINAPI +FindFirstVolumeMountPointA( + _In_ LPCSTR lpszRootPathName, + _Out_writes_(cchBufferLength) LPSTR lpszVolumeMountPoint, + _In_ DWORD cchBufferLength); + +HANDLE +WINAPI +FindFirstVolumeMountPointW( + _In_ LPCWSTR lpszRootPathName, + _Out_writes_(cchBufferLength) LPWSTR lpszVolumeMountPoint, + _In_ DWORD cchBufferLength); + #endif + BOOL WINAPI FindNextChangeNotification(HANDLE); BOOL WINAPI FindNextFileA(HANDLE,LPWIN32_FIND_DATAA); BOOL WINAPI FindNextFileW(HANDLE,LPWIN32_FIND_DATAW); #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI FindNextStreamW(HANDLE,LPVOID); +BOOL WINAPI FindNextStreamW(_In_ HANDLE, _Out_ LPVOID); #endif + #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI FindNextVolumeA(HANDLE,LPSTR,DWORD); + +BOOL +WINAPI +FindNextVolumeA( + _Inout_ HANDLE hFindVolume, + _Out_writes_(cchBufferLength) LPSTR lpszVolumeName, + _In_ DWORD cchBufferLength); + BOOL WINAPI FindNextVolumeW(HANDLE,LPWSTR,DWORD); -BOOL WINAPI FindNextVolumeMountPointA(HANDLE,LPSTR,DWORD); -BOOL WINAPI FindNextVolumeMountPointW(HANDLE,LPWSTR,DWORD); + +BOOL +WINAPI +FindNextVolumeMountPointA( + _In_ HANDLE hFindVolumeMountPoint, + _Out_writes_(cchBufferLength) LPSTR lpszVolumeMountPoint, + _In_ DWORD cchBufferLength); + +BOOL +WINAPI +FindNextVolumeMountPointW( + _In_ HANDLE hFindVolumeMountPoint, + _Out_writes_(cchBufferLength) LPWSTR lpszVolumeMountPoint, + _In_ DWORD cchBufferLength); + BOOL WINAPI FindVolumeClose(HANDLE); -BOOL WINAPI FindVolumeMountPointClose(HANDLE); +BOOL WINAPI FindVolumeMountPointClose(_In_ HANDLE); + #endif -HRSRC WINAPI FindResourceA(HMODULE,LPCSTR,LPCSTR); -HRSRC WINAPI FindResourceW(HINSTANCE,LPCWSTR,LPCWSTR); -HRSRC WINAPI FindResourceExA(HINSTANCE,LPCSTR,LPCSTR,WORD); + +_Ret_maybenull_ HRSRC WINAPI FindResourceA(_In_opt_ HMODULE,_In_ LPCSTR, _In_ LPCSTR); +_Ret_maybenull_ HRSRC WINAPI FindResourceW(_In_opt_ HMODULE,_In_ LPCWSTR, _In_ LPCWSTR); +_Ret_maybenull_ HRSRC WINAPI FindResourceExA(_In_opt_ HMODULE, _In_ LPCSTR, _In_ LPCSTR, _In_ WORD); HRSRC WINAPI FindResourceExW(HINSTANCE,LPCWSTR,LPCWSTR,WORD); #if (_WIN32_WINNT >= 0x0502) -DWORD WINAPI GetFirmwareEnvironmentVariableA(LPCSTR,LPCSTR,PVOID,DWORD); -DWORD WINAPI GetFirmwareEnvironmentVariableW(LPCWSTR,LPCWSTR,PVOID,DWORD); + +DWORD +WINAPI +GetFirmwareEnvironmentVariableA( + _In_ LPCSTR lpName, + _In_ LPCSTR lpGuid, + _Out_writes_bytes_to_opt_(nSize, return) PVOID pBuffer, + _In_ DWORD nSize); + +DWORD +WINAPI +GetFirmwareEnvironmentVariableW( + _In_ LPCWSTR lpName, + _In_ LPCWSTR lpGuid, + _Out_writes_bytes_to_opt_(nSize, return) PVOID pBuffer, + _In_ DWORD nSize); + #endif BOOL WINAPI FlushFileBuffers(HANDLE); BOOL WINAPI FlushInstructionCache(HANDLE,LPCVOID,SIZE_T); @@ -1530,51 +1732,113 @@ PVOID WINAPI FreeSid(PSID); BOOL WINAPI GetAce(PACL,DWORD,LPVOID*); BOOL WINAPI GetAclInformation(PACL,PVOID,DWORD,ACL_INFORMATION_CLASS); #if (_WIN32_WINNT >= 0x0600) -HRESULT WINAPI GetApplicationRecoveryCallback(HANDLE,APPLICATION_RECOVERY_CALLBACK*,PVOID*, DWORD*, DWORD*); +HRESULT WINAPI GetApplicationRecoveryCallback(_In_ HANDLE, _Out_ APPLICATION_RECOVERY_CALLBACK*, _Outptr_opt_result_maybenull_ PVOID*, _Out_opt_ DWORD*, _Out_opt_ DWORD*); HRESULT WINAPI GetApplicationRestart(HANDLE,PWSTR,PDWORD,PDWORD); #endif -UINT WINAPI GetAtomNameA(ATOM,LPSTR,int); -UINT WINAPI GetAtomNameW(ATOM,LPWSTR,int); -BOOL WINAPI GetBinaryTypeA(LPCSTR,PDWORD); -BOOL WINAPI GetBinaryTypeW(LPCWSTR,PDWORD); + +UINT +WINAPI +GetAtomNameA( + _In_ ATOM nAtom, + _Out_writes_to_(nSize, return + 1) LPSTR lpBuffer, + _In_ int nSize); + +UINT +WINAPI +GetAtomNameW( + _In_ ATOM nAtom, + _Out_writes_to_(nSize, return + 1) LPWSTR lpBuffer, + _In_ int nSize); + +BOOL WINAPI GetBinaryTypeA(_In_ LPCSTR, _Out_ PDWORD); +BOOL WINAPI GetBinaryTypeW(_In_ LPCWSTR, _Out_ PDWORD); LPSTR WINAPI GetCommandLineA(VOID); LPWSTR WINAPI GetCommandLineW(VOID); -BOOL WINAPI GetCommConfig(HANDLE,LPCOMMCONFIG,PDWORD); -BOOL WINAPI GetCommMask(HANDLE,PDWORD); -BOOL WINAPI GetCommModemStatus(HANDLE,PDWORD); -BOOL WINAPI GetCommProperties(HANDLE,LPCOMMPROP); -BOOL WINAPI GetCommState(HANDLE,LPDCB); -BOOL WINAPI GetCommTimeouts(HANDLE,LPCOMMTIMEOUTS); -DWORD WINAPI GetCompressedFileSizeA(LPCSTR,PDWORD); -DWORD WINAPI GetCompressedFileSizeW(LPCWSTR,PDWORD); -BOOL WINAPI GetComputerNameA(LPSTR,PDWORD); -BOOL WINAPI GetComputerNameW(LPWSTR,PDWORD); + +_Success_(return != FALSE) +BOOL +WINAPI +GetCommConfig( + _In_ HANDLE hCommDev, + _Out_writes_bytes_opt_(*lpdwSize) LPCOMMCONFIG lpCC, + _Inout_ LPDWORD lpdwSize); + +BOOL WINAPI GetCommMask(_In_ HANDLE, _Out_ PDWORD); +BOOL WINAPI GetCommModemStatus(_In_ HANDLE, _Out_ PDWORD); +BOOL WINAPI GetCommProperties(_In_ HANDLE, _Inout_ LPCOMMPROP); +BOOL WINAPI GetCommState(_In_ HANDLE, _Out_ LPDCB); +BOOL WINAPI GetCommTimeouts(_In_ HANDLE, _Out_ LPCOMMTIMEOUTS); +DWORD WINAPI GetCompressedFileSizeA(_In_ LPCSTR, _Out_opt_ PDWORD); +DWORD WINAPI GetCompressedFileSizeW(_In_ LPCWSTR, _Out_opt_ PDWORD); + +_Success_(return != 0) +BOOL +WINAPI +GetComputerNameA( + _Out_writes_to_opt_(*nSize, *nSize + 1) LPSTR lpBuffer, + _Inout_ LPDWORD nSize); + +_Success_(return != 0) +BOOL +WINAPI +GetComputerNameW( + _Out_writes_to_opt_(*nSize, *nSize + 1) LPWSTR lpBuffer, + _Inout_ LPDWORD nSize); + #if (_WIN32_WINNT >= 0x0500) BOOL WINAPI GetComputerNameExA(COMPUTER_NAME_FORMAT,LPSTR,LPDWORD); BOOL WINAPI GetComputerNameExW(COMPUTER_NAME_FORMAT,LPWSTR,LPDWORD); #endif #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI GetCurrentActCtx(HANDLE*); +BOOL WINAPI GetCurrentActCtx( _Outptr_ HANDLE*); #endif DWORD WINAPI GetCurrentDirectoryA(DWORD,LPSTR); DWORD WINAPI GetCurrentDirectoryW(DWORD,LPWSTR); -BOOL WINAPI GetCurrentHwProfileA(LPHW_PROFILE_INFOA); -BOOL WINAPI GetCurrentHwProfileW(LPHW_PROFILE_INFOW); +BOOL WINAPI GetCurrentHwProfileA(_Out_ LPHW_PROFILE_INFOA); +BOOL WINAPI GetCurrentHwProfileW(_Out_ LPHW_PROFILE_INFOW); HANDLE WINAPI GetCurrentProcess(void); DWORD WINAPI GetCurrentProcessId(void); HANDLE WINAPI GetCurrentThread(void); DWORD WINAPI GetCurrentThreadId(void); #define GetCurrentTime GetTickCount -BOOL WINAPI GetDefaultCommConfigA(LPCSTR,LPCOMMCONFIG,PDWORD); -BOOL WINAPI GetDefaultCommConfigW(LPCWSTR,LPCOMMCONFIG,PDWORD); + +BOOL +WINAPI +GetDefaultCommConfigA( + _In_ LPCSTR lpszName, + _Out_writes_bytes_to_(*lpdwSize, *lpdwSize) LPCOMMCONFIG lpCC, + _Inout_ LPDWORD lpdwSize); + +BOOL +WINAPI +GetDefaultCommConfigW( + _In_ LPCWSTR lpszName, + _Out_writes_bytes_to_(*lpdwSize, *lpdwSize) LPCOMMCONFIG lpCC, + _Inout_ LPDWORD lpdwSize); + BOOL WINAPI GetDiskFreeSpaceA(LPCSTR,PDWORD,PDWORD,PDWORD,PDWORD); BOOL WINAPI GetDiskFreeSpaceW(LPCWSTR,PDWORD,PDWORD,PDWORD,PDWORD); BOOL WINAPI GetDiskFreeSpaceExA(LPCSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); BOOL WINAPI GetDiskFreeSpaceExW(LPCWSTR,PULARGE_INTEGER,PULARGE_INTEGER,PULARGE_INTEGER); + #if (_WIN32_WINNT >= 0x0502) -DWORD WINAPI GetDllDirectoryA(DWORD,LPSTR); -DWORD WINAPI GetDllDirectoryW(DWORD,LPWSTR); + +_Success_(return != 0 && return < nBufferLength) +DWORD +WINAPI +GetDllDirectoryA( + _In_ DWORD nBufferLength, + _Out_writes_to_opt_(nBufferLength, return + 1) LPSTR lpBuffer); + +_Success_(return != 0 && return < nBufferLength) +DWORD +WINAPI +GetDllDirectoryW( + _In_ DWORD nBufferLength, + _Out_writes_to_opt_(nBufferLength, return + 1) LPWSTR lpBuffer); + #endif + UINT WINAPI GetDriveTypeA(LPCSTR); UINT WINAPI GetDriveTypeW(LPCWSTR); LPSTR WINAPI GetEnvironmentStrings(void); @@ -1593,10 +1857,19 @@ DWORD WINAPI GetFileAttributesW(LPCWSTR); BOOL WINAPI GetFileAttributesExA(LPCSTR,GET_FILEEX_INFO_LEVELS,PVOID); BOOL WINAPI GetFileAttributesExW(LPCWSTR,GET_FILEEX_INFO_LEVELS,PVOID); #if (_WIN32_WINNT >= 0x0600) -BOOL WINAPI GetFileBandwidthReservation(HANDLE,LPDWORD,LPDWORD,LPBOOL,LPDWORD,LPDWORD); +BOOL WINAPI GetFileBandwidthReservation(_In_ HANDLE, _Out_ LPDWORD, _Out_ LPDWORD, _Out_ LPBOOL, _Out_ LPDWORD, _Out_ LPDWORD); #endif BOOL WINAPI GetFileInformationByHandle(HANDLE,LPBY_HANDLE_FILE_INFORMATION); -BOOL WINAPI GetFileSecurityA(LPCSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); + +BOOL +WINAPI +GetFileSecurityA( + _In_ LPCSTR lpFileName, + _In_ SECURITY_INFORMATION RequestedInformation, + _Out_writes_bytes_to_opt_(nLength, *lpnLengthNeeded) PSECURITY_DESCRIPTOR pSecurityDescriptor, + _In_ DWORD nLength, + _Out_ LPDWORD lpnLengthNeeded); + BOOL WINAPI GetFileSecurityW(LPCWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); DWORD WINAPI GetFileSize(HANDLE,PDWORD); BOOL WINAPI GetFileSizeEx(HANDLE,PLARGE_INTEGER); @@ -1611,13 +1884,20 @@ DWORD WINAPI GetLastError(void); DWORD WINAPI GetLengthSid(PSID); void WINAPI GetLocalTime(LPSYSTEMTIME); DWORD WINAPI GetLogicalDrives(void); -DWORD WINAPI GetLogicalDriveStringsA(DWORD,LPSTR); + +_Success_(return != 0 && return <= nBufferLength) +DWORD +WINAPI +GetLogicalDriveStringsA( + _In_ DWORD nBufferLength, + _Out_writes_to_opt_(nBufferLength, return + 1) LPSTR lpBuffer); + DWORD WINAPI GetLogicalDriveStringsW(DWORD,LPWSTR); #if (_WIN32_WINNT >= 0x0500 || _WIN32_WINDOWS >= 0x0410) DWORD WINAPI GetLongPathNameA(LPCSTR,LPSTR,DWORD); DWORD WINAPI GetLongPathNameW(LPCWSTR,LPWSTR,DWORD); #endif -BOOL WINAPI GetMailslotInfo(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD); +BOOL WINAPI GetMailslotInfo(_In_ HANDLE, _Out_opt_ PDWORD, _Out_opt_ PDWORD, _Out_opt_ PDWORD, _Out_opt_ PDWORD); DWORD WINAPI GetModuleFileNameA(HINSTANCE,LPSTR,DWORD); DWORD WINAPI GetModuleFileNameW(HINSTANCE,LPWSTR,DWORD); HMODULE WINAPI GetModuleHandleA(LPCSTR); @@ -1632,32 +1912,122 @@ WINBASEAPI WINBOOL WINAPI NeedCurrentDirectoryForExePathA(LPCSTR ExeName); WINBASEAPI WINBOOL WINAPI NeedCurrentDirectoryForExePathW(LPCWSTR ExeName); #endif -BOOL WINAPI GetNamedPipeHandleStateA(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD,LPSTR,DWORD); -BOOL WINAPI GetNamedPipeHandleStateW(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD,LPWSTR,DWORD); -BOOL WINAPI GetNamedPipeInfo(HANDLE,PDWORD,PDWORD,PDWORD,PDWORD); +BOOL +WINAPI +GetNamedPipeHandleStateA( + _In_ HANDLE hNamedPipe, + _Out_opt_ LPDWORD lpState, + _Out_opt_ LPDWORD lpCurInstances, + _Out_opt_ LPDWORD lpMaxCollectionCount, + _Out_opt_ LPDWORD lpCollectDataTimeout, + _Out_writes_opt_(nMaxUserNameSize) LPSTR lpUserName, + _In_ DWORD nMaxUserNameSize); + +BOOL +WINAPI +GetNamedPipeHandleStateW( + _In_ HANDLE hNamedPipe, + _Out_opt_ LPDWORD lpState, + _Out_opt_ LPDWORD lpCurInstances, + _Out_opt_ LPDWORD lpMaxCollectionCount, + _Out_opt_ LPDWORD lpCollectDataTimeout, + _Out_writes_opt_(nMaxUserNameSize) LPWSTR lpUserName, + _In_ DWORD nMaxUserNameSize); + +BOOL WINAPI GetNamedPipeInfo(_In_ HANDLE, _Out_opt_ PDWORD, _Out_opt_ PDWORD, _Out_opt_ PDWORD, _Out_opt_ PDWORD); #if (_WIN32_WINNT >= 0x0501) VOID WINAPI GetNativeSystemInfo(LPSYSTEM_INFO); #endif -BOOL WINAPI GetEventLogInformation(HANDLE,DWORD,LPVOID,DWORD,LPDWORD); -BOOL WINAPI GetNumberOfEventLogRecords(HANDLE,PDWORD); -BOOL WINAPI GetOldestEventLogRecord(HANDLE,PDWORD); + +BOOL +WINAPI +GetEventLogInformation( + _In_ HANDLE hEventLog, + _In_ DWORD dwInfoLevel, + _Out_writes_bytes_to_(cbBufSize, *pcbBytesNeeded) LPVOID lpBuffer, + _In_ DWORD cbBufSize, + _Out_ LPDWORD pcbBytesNeeded); + +BOOL WINAPI GetNumberOfEventLogRecords(_In_ HANDLE, _Out_ PDWORD); +BOOL WINAPI GetOldestEventLogRecord(_In_ HANDLE, _Out_ PDWORD); BOOL WINAPI GetOverlappedResult(HANDLE,LPOVERLAPPED,PDWORD,BOOL); DWORD WINAPI GetPriorityClass(HANDLE); BOOL WINAPI GetPrivateObjectSecurity(PSECURITY_DESCRIPTOR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,DWORD,PDWORD); -UINT WINAPI GetPrivateProfileIntA(LPCSTR,LPCSTR,INT,LPCSTR); -UINT WINAPI GetPrivateProfileIntW(LPCWSTR,LPCWSTR,INT,LPCWSTR); -DWORD WINAPI GetPrivateProfileSectionA(LPCSTR,LPSTR,DWORD,LPCSTR); -DWORD WINAPI GetPrivateProfileSectionW(LPCWSTR,LPWSTR,DWORD,LPCWSTR); -DWORD WINAPI GetPrivateProfileSectionNamesA(LPSTR,DWORD,LPCSTR); -DWORD WINAPI GetPrivateProfileSectionNamesW(LPWSTR,DWORD,LPCWSTR); -DWORD WINAPI GetPrivateProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPSTR,DWORD,LPCSTR); -DWORD WINAPI GetPrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD,LPCWSTR); -BOOL WINAPI GetPrivateProfileStructA(LPCSTR,LPCSTR,LPVOID,UINT,LPCSTR); -BOOL WINAPI GetPrivateProfileStructW(LPCWSTR,LPCWSTR,LPVOID,UINT,LPCWSTR); +UINT WINAPI GetPrivateProfileIntA(_In_ LPCSTR, _In_ LPCSTR, _In_ INT, _In_opt_ LPCSTR); +UINT WINAPI GetPrivateProfileIntW(_In_ LPCWSTR, _In_ LPCWSTR, _In_ INT, _In_opt_ LPCWSTR); + +DWORD +WINAPI +GetPrivateProfileSectionA( + _In_ LPCSTR lpAppName, + _Out_writes_to_opt_(nSize, return + 1) LPSTR lpReturnedString, + _In_ DWORD nSize, + _In_opt_ LPCSTR lpFileName); + +DWORD +WINAPI +GetPrivateProfileSectionW( + _In_ LPCWSTR lpAppName, + _Out_writes_to_opt_(nSize, return + 1) LPWSTR lpReturnedString, + _In_ DWORD nSize, + _In_opt_ LPCWSTR lpFileName); + +DWORD +WINAPI +GetPrivateProfileSectionNamesA( + _Out_writes_to_opt_(nSize, return + 1) LPSTR lpszReturnBuffer, + _In_ DWORD nSize, + _In_opt_ LPCSTR lpFileName); + +DWORD +WINAPI +GetPrivateProfileSectionNamesW( + _Out_writes_to_opt_(nSize, return + 1) LPWSTR lpszReturnBuffer, + _In_ DWORD nSize, + _In_opt_ LPCWSTR lpFileName); + +DWORD +WINAPI +GetPrivateProfileStringA( + _In_opt_ LPCSTR lpAppName, + _In_opt_ LPCSTR lpKeyName, + _In_opt_ LPCSTR lpDefault, + _Out_writes_to_opt_(nSize, return + 1) LPSTR lpReturnedString, + _In_ DWORD nSize, + _In_opt_ LPCSTR lpFileName); + +DWORD +WINAPI +GetPrivateProfileStringW( + _In_opt_ LPCWSTR lpAppName, + _In_opt_ LPCWSTR lpKeyName, + _In_opt_ LPCWSTR lpDefault, + _Out_writes_to_opt_(nSize, return + 1) LPWSTR lpReturnedString, + _In_ DWORD nSize, + _In_opt_ LPCWSTR lpFileName); + +BOOL +WINAPI +GetPrivateProfileStructA( + _In_ LPCSTR lpszSection, + _In_ LPCSTR lpszKey, + _Out_writes_bytes_opt_(uSizeStruct) LPVOID lpStruct, + _In_ UINT uSizeStruct, + _In_opt_ LPCSTR szFile); + +BOOL +WINAPI +GetPrivateProfileStructW( + _In_ LPCWSTR lpszSection, + _In_ LPCWSTR lpszKey, + _Out_writes_bytes_opt_(uSizeStruct) LPVOID lpStruct, + _In_ UINT uSizeStruct, + _In_opt_ LPCWSTR szFile); + FARPROC WINAPI GetProcAddress(HINSTANCE,LPCSTR); -BOOL WINAPI GetProcessAffinityMask(HANDLE,PDWORD_PTR,PDWORD_PTR); +BOOL WINAPI GetProcessAffinityMask(_In_ HANDLE, _Out_ PDWORD_PTR, _Out_ PDWORD_PTR); #if (_WIN32_WINNT >= 0x0502) -BOOL WINAPI GetProcessHandleCount(HANDLE,PDWORD); +BOOL WINAPI GetProcessHandleCount(_In_ HANDLE, _Out_ PDWORD); #endif HANDLE WINAPI GetProcessHeap(VOID); DWORD WINAPI GetProcessHeaps(DWORD,PHANDLE); @@ -1665,20 +2035,49 @@ DWORD WINAPI GetProcessHeaps(DWORD,PHANDLE); DWORD WINAPI GetProcessId(HANDLE); #endif #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI GetProcessIoCounters(HANDLE,PIO_COUNTERS); +BOOL WINAPI GetProcessIoCounters(_In_ HANDLE, _Out_ PIO_COUNTERS); #endif -BOOL WINAPI GetProcessPriorityBoost(HANDLE,PBOOL); -BOOL WINAPI GetProcessShutdownParameters(PDWORD,PDWORD); +BOOL WINAPI GetProcessPriorityBoost(_In_ HANDLE, _Out_ PBOOL); +BOOL WINAPI GetProcessShutdownParameters(_Out_ PDWORD, _Out_ PDWORD); BOOL WINAPI GetProcessTimes(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME,LPFILETIME); DWORD WINAPI GetProcessVersion(DWORD); HWINSTA WINAPI GetProcessWindowStation(void); -BOOL WINAPI GetProcessWorkingSetSize(HANDLE,PSIZE_T,PSIZE_T); -UINT WINAPI GetProfileIntA(LPCSTR,LPCSTR,INT); -UINT WINAPI GetProfileIntW(LPCWSTR,LPCWSTR,INT); -DWORD WINAPI GetProfileSectionA(LPCSTR,LPSTR,DWORD); -DWORD WINAPI GetProfileSectionW(LPCWSTR,LPWSTR,DWORD); -DWORD WINAPI GetProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPSTR,DWORD); -DWORD WINAPI GetProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPWSTR,DWORD); +BOOL WINAPI GetProcessWorkingSetSize(_In_ HANDLE, _Out_ PSIZE_T, _Out_ PSIZE_T); +UINT WINAPI GetProfileIntA(_In_ LPCSTR, _In_ LPCSTR, _In_ INT); +UINT WINAPI GetProfileIntW(_In_ LPCWSTR, _In_ LPCWSTR, _In_ INT); + +DWORD +WINAPI +GetProfileSectionA( + _In_ LPCSTR lpAppName, + _Out_writes_to_opt_(nSize, return + 1) LPSTR lpReturnedString, + _In_ DWORD nSize); + +DWORD +WINAPI +GetProfileSectionW( + _In_ LPCWSTR lpAppName, + _Out_writes_to_opt_(nSize, return + 1) LPWSTR lpReturnedString, + _In_ DWORD nSize); + +DWORD +WINAPI +GetProfileStringA( + _In_opt_ LPCSTR lpAppName, + _In_opt_ LPCSTR lpKeyName, + _In_opt_ LPCSTR lpDefault, + _Out_writes_to_opt_(nSize, return + 1) LPSTR lpReturnedString, + _In_ DWORD nSize); + +DWORD +WINAPI +GetProfileStringW( + _In_opt_ LPCWSTR lpAppName, + _In_opt_ LPCWSTR lpKeyName, + _In_opt_ LPCWSTR lpDefault, + _Out_writes_to_opt_(nSize, return + 1) LPWSTR lpReturnedString, + _In_ DWORD nSize); + BOOL WINAPI GetQueuedCompletionStatus(HANDLE,PDWORD,PULONG_PTR,LPOVERLAPPED*,DWORD); BOOL WINAPI GetSecurityDescriptorControl(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR_CONTROL,PDWORD); BOOL WINAPI GetSecurityDescriptorDacl(PSECURITY_DESCRIPTOR,LPBOOL,PACL*,LPBOOL); @@ -1687,25 +2086,33 @@ DWORD WINAPI GetSecurityDescriptorLength(PSECURITY_DESCRIPTOR); BOOL WINAPI GetSecurityDescriptorOwner(PSECURITY_DESCRIPTOR,PSID*,LPBOOL); DWORD WINAPI GetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR,PUCHAR); BOOL WINAPI GetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR,LPBOOL,PACL*,LPBOOL); -DWORD WINAPI GetShortPathNameA(LPCSTR,LPSTR,DWORD); + +_Success_(return != 0 && return < cchBuffer) +DWORD +WINAPI +GetShortPathNameA( + _In_ LPCSTR lpszLongPath, + _Out_writes_to_opt_(cchBuffer, return + 1) LPSTR lpszShortPath, + _In_ DWORD cchBuffer); + DWORD WINAPI GetShortPathNameW(LPCWSTR,LPWSTR,DWORD); PSID_IDENTIFIER_AUTHORITY WINAPI GetSidIdentifierAuthority(PSID); DWORD WINAPI GetSidLengthRequired(UCHAR); PDWORD WINAPI GetSidSubAuthority(PSID,DWORD); PUCHAR WINAPI GetSidSubAuthorityCount(PSID); -VOID WINAPI GetStartupInfoA(LPSTARTUPINFOA); +VOID WINAPI GetStartupInfoA(_Out_ LPSTARTUPINFOA); VOID WINAPI GetStartupInfoW(LPSTARTUPINFOW); HANDLE WINAPI GetStdHandle(DWORD); UINT WINAPI GetSystemDirectoryA(LPSTR,UINT); UINT WINAPI GetSystemDirectoryW(LPWSTR,UINT); VOID WINAPI GetSystemInfo(LPSYSTEM_INFO); -BOOL WINAPI GetSystemPowerStatus(LPSYSTEM_POWER_STATUS); +BOOL WINAPI GetSystemPowerStatus(_Out_ LPSYSTEM_POWER_STATUS); #if (_WIN32_WINNT >= 0x0502) -BOOL WINAPI GetSystemRegistryQuota(PDWORD,PDWORD); +BOOL WINAPI GetSystemRegistryQuota(_Out_opt_ PDWORD, _Out_opt_ PDWORD); #endif VOID WINAPI GetSystemTime(LPSYSTEMTIME); #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI GetSystemTimes(LPFILETIME,LPFILETIME,LPFILETIME); +BOOL WINAPI GetSystemTimes(_Out_opt_ LPFILETIME, _Out_opt_ LPFILETIME, _Out_opt_ LPFILETIME); #endif BOOL WINAPI GetSystemTimeAdjustment(PDWORD,PDWORD,PBOOL); void WINAPI GetSystemTimeAsFileTime(LPFILETIME); @@ -1713,24 +2120,60 @@ void WINAPI GetSystemTimeAsFileTime(LPFILETIME); UINT WINAPI GetSystemWindowsDirectoryA(LPSTR,UINT); UINT WINAPI GetSystemWindowsDirectoryW(LPWSTR,UINT); #endif + #if (_WIN32_WINNT >= 0x0501) -UINT WINAPI GetSystemWow64DirectoryA(LPSTR,UINT); -UINT WINAPI GetSystemWow64DirectoryW(LPWSTR,UINT); + +_Success_(return != 0 && return < uSize) +UINT +WINAPI +GetSystemWow64DirectoryA( + _Out_writes_to_opt_(uSize, return + 1) LPSTR lpBuffer, + _In_ UINT uSize); + +_Success_(return != 0 && return < uSize) +UINT +WINAPI +GetSystemWow64DirectoryW( + _Out_writes_to_opt_(uSize, return + 1) LPWSTR lpBuffer, + _In_ UINT uSize); + #endif -DWORD WINAPI GetTapeParameters(HANDLE,DWORD,PDWORD,PVOID); -DWORD WINAPI GetTapePosition(HANDLE,DWORD,PDWORD,PDWORD,PDWORD); -DWORD WINAPI GetTapeStatus(HANDLE); -UINT WINAPI GetTempFileNameA(LPCSTR,LPCSTR,UINT,LPSTR); + +DWORD +WINAPI +GetTapeParameters( + _In_ HANDLE hDevice, + _In_ DWORD dwOperation, + _Inout_ LPDWORD lpdwSize, + _Out_writes_bytes_(*lpdwSize) LPVOID lpTapeInformation); + +DWORD WINAPI GetTapePosition(_In_ HANDLE, _In_ DWORD, _Out_ PDWORD, _Out_ PDWORD, _Out_ PDWORD); +DWORD WINAPI GetTapeStatus(_In_ HANDLE); + +UINT +WINAPI +GetTempFileNameA( + _In_ LPCSTR lpPathName, + _In_ LPCSTR lpPrefixString, + _In_ UINT uUnique, + _Out_writes_(MAX_PATH) LPSTR lpTempFileName); + UINT WINAPI GetTempFileNameW(LPCWSTR,LPCWSTR,UINT,LPWSTR); -DWORD WINAPI GetTempPathA(DWORD,LPSTR); + +DWORD +WINAPI +GetTempPathA( + _In_ DWORD nBufferLength, + _Out_writes_to_opt_(nBufferLength, return + 1) LPSTR lpBuffer); + DWORD WINAPI GetTempPathW(DWORD,LPWSTR); BOOL WINAPI GetThreadContext(HANDLE,LPCONTEXT); #if (_WIN32_WINNT >= 0x0502) -BOOL WINAPI GetThreadIOPendingFlag(HANDLE,PBOOL); +BOOL WINAPI GetThreadIOPendingFlag(_In_ HANDLE, _Out_ PBOOL); #endif int WINAPI GetThreadPriority(HANDLE); BOOL WINAPI GetThreadPriorityBoost(HANDLE,PBOOL); -BOOL WINAPI GetThreadSelectorEntry(HANDLE,DWORD,LPLDT_ENTRY); +BOOL WINAPI GetThreadSelectorEntry(_In_ HANDLE, _In_ DWORD, _Out_ LPLDT_ENTRY); BOOL WINAPI GetThreadTimes(HANDLE,LPFILETIME,LPFILETIME,LPFILETIME,LPFILETIME); DWORD WINAPI GetTickCount(VOID); #if (_WIN32_WINNT >= 0x0600) @@ -1739,52 +2182,115 @@ ULONGLONG WINAPI GetTickCount64(VOID); DWORD WINAPI GetThreadId(HANDLE); DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION); BOOL WINAPI GetTokenInformation(HANDLE,TOKEN_INFORMATION_CLASS,PVOID,DWORD,PDWORD); -BOOL WINAPI GetUserNameA (LPSTR,PDWORD); -BOOL WINAPI GetUserNameW(LPWSTR,PDWORD); + +BOOL +WINAPI +GetUserNameA( + _Out_writes_to_opt_(*pcbBuffer, *pcbBuffer) LPSTR lpBuffer, + _Inout_ LPDWORD pcbBuffer); + +BOOL +WINAPI +GetUserNameW( + _Out_writes_to_opt_(*pcbBuffer, *pcbBuffer) LPWSTR lpBuffer, + _Inout_ LPDWORD pcbBuffer); + DWORD WINAPI GetVersion(void); BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA); BOOL WINAPI GetVersionExW(LPOSVERSIONINFOW); -BOOL WINAPI GetVolumeInformationA(LPCSTR,LPSTR,DWORD,PDWORD,PDWORD,PDWORD,LPSTR,DWORD); + +BOOL +WINAPI +GetVolumeInformationA( + _In_opt_ LPCSTR lpRootPathName, + _Out_writes_opt_(nVolumeNameSize) LPSTR lpVolumeNameBuffer, + _In_ DWORD nVolumeNameSize, + _Out_opt_ LPDWORD lpVolumeSerialNumber, + _Out_opt_ LPDWORD lpMaximumComponentLength, + _Out_opt_ LPDWORD lpFileSystemFlags, + _Out_writes_opt_(nFileSystemNameSize) LPSTR lpFileSystemNameBuffer, + _In_ DWORD nFileSystemNameSize); + BOOL WINAPI GetVolumeInformationW(LPCWSTR,LPWSTR,DWORD,PDWORD,PDWORD,PDWORD,LPWSTR,DWORD); + #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI GetVolumeNameForVolumeMountPointA(LPCSTR,LPSTR,DWORD); + +BOOL +WINAPI +GetVolumeNameForVolumeMountPointA( + _In_ LPCSTR lpszVolumeMountPoint, + _Out_writes_(cchBufferLength) LPSTR lpszVolumeName, + _In_ DWORD cchBufferLength); + BOOL WINAPI GetVolumeNameForVolumeMountPointW(LPCWSTR,LPWSTR,DWORD); -BOOL WINAPI GetVolumePathNameA(LPCSTR,LPSTR,DWORD); + +BOOL +WINAPI +GetVolumePathNameA( + _In_ LPCSTR lpszFileName, + _Out_writes_(cchBufferLength) LPSTR lpszVolumePathName, + _In_ DWORD cchBufferLength); + BOOL WINAPI GetVolumePathNameW(LPCWSTR,LPWSTR,DWORD); + #endif + #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI GetVolumePathNamesForVolumeNameA(LPCSTR,LPSTR,DWORD,PDWORD); + +BOOL +WINAPI +GetVolumePathNamesForVolumeNameA( + _In_ LPCSTR lpszVolumeName, + _Out_writes_to_opt_(cchBufferLength, *lpcchReturnLength) _Post_ _NullNull_terminated_ LPCH lpszVolumePathNames, + _In_ DWORD cchBufferLength, + _Out_ PDWORD lpcchReturnLength); + BOOL WINAPI GetVolumePathNamesForVolumeNameW(LPCWSTR,LPWSTR,DWORD,PDWORD); + #endif + UINT WINAPI GetWindowsDirectoryA(LPSTR,UINT); UINT WINAPI GetWindowsDirectoryW(LPWSTR,UINT); DWORD WINAPI GetWindowThreadProcessId(HWND,PDWORD); UINT WINAPI GetWriteWatch(DWORD,PVOID,SIZE_T,PVOID*,PULONG_PTR,PULONG); -ATOM WINAPI GlobalAddAtomA(LPCSTR); -ATOM WINAPI GlobalAddAtomW( LPCWSTR); +ATOM WINAPI GlobalAddAtomA(_In_opt_ LPCSTR); +ATOM WINAPI GlobalAddAtomW(_In_opt_ LPCWSTR); HGLOBAL WINAPI GlobalAlloc(UINT,SIZE_T); -SIZE_T WINAPI GlobalCompact(DWORD); /* Obsolete: Has no effect. */ -ATOM WINAPI GlobalDeleteAtom(ATOM); +SIZE_T WINAPI GlobalCompact(_In_ DWORD); /* Obsolete: Has no effect. */ +ATOM WINAPI GlobalDeleteAtom(_In_ ATOM); #define GlobalDiscard(m) GlobalReAlloc((m),0,GMEM_MOVEABLE) -ATOM WINAPI GlobalFindAtomA(LPCSTR); -ATOM WINAPI GlobalFindAtomW(LPCWSTR); -VOID WINAPI GlobalFix(HGLOBAL); /* Obsolete: Has no effect. */ -UINT WINAPI GlobalFlags(HGLOBAL); /* Obsolete: Has no effect. */ +ATOM WINAPI GlobalFindAtomA(_In_opt_ LPCSTR); +ATOM WINAPI GlobalFindAtomW(_In_opt_ LPCWSTR); +VOID WINAPI GlobalFix(_In_ HGLOBAL); /* Obsolete: Has no effect. */ +UINT WINAPI GlobalFlags(_In_ HGLOBAL); /* Obsolete: Has no effect. */ HGLOBAL WINAPI GlobalFree(HGLOBAL); -UINT WINAPI GlobalGetAtomNameA(ATOM,LPSTR,int); -UINT WINAPI GlobalGetAtomNameW(ATOM,LPWSTR,int); -HGLOBAL WINAPI GlobalHandle(LPCVOID); -LPVOID WINAPI GlobalLock(HGLOBAL); -VOID WINAPI GlobalMemoryStatus(LPMEMORYSTATUS); + +UINT +WINAPI +GlobalGetAtomNameA( + _In_ ATOM nAtom, + _Out_writes_to_(nSize, return + 1) LPSTR lpBuffer, + _In_ int nSize); + +UINT +WINAPI +GlobalGetAtomNameW( + _In_ ATOM nAtom, + _Out_writes_to_(nSize, return + 1) LPWSTR lpBuffer, + _In_ int nSize); + +_Ret_maybenull_ HGLOBAL WINAPI GlobalHandle(_In_ LPCVOID); +_Ret_maybenull_ LPVOID WINAPI GlobalLock(_In_ HGLOBAL); +VOID WINAPI GlobalMemoryStatus(_Out_ LPMEMORYSTATUS); #if (_WIN32_WINNT >= 0x0500) BOOL WINAPI GlobalMemoryStatusEx(LPMEMORYSTATUSEX); #endif HGLOBAL WINAPI GlobalReAlloc(HGLOBAL,SIZE_T,UINT); -SIZE_T WINAPI GlobalSize(HGLOBAL); -VOID WINAPI GlobalUnfix(HGLOBAL); /* Obsolete: Has no effect. */ -BOOL WINAPI GlobalUnlock(HGLOBAL); -BOOL WINAPI GlobalUnWire(HGLOBAL); /* Obsolete: Has no effect. */ -PVOID WINAPI GlobalWire(HGLOBAL); /* Obsolete: Has no effect. */ +SIZE_T WINAPI GlobalSize(_In_ HGLOBAL); +VOID WINAPI GlobalUnfix(_In_ HGLOBAL); /* Obsolete: Has no effect. */ +BOOL WINAPI GlobalUnlock(_In_ HGLOBAL); +BOOL WINAPI GlobalUnWire(_In_ HGLOBAL); /* Obsolete: Has no effect. */ +PVOID WINAPI GlobalWire(_In_ HGLOBAL); /* Obsolete: Has no effect. */ #define HasOverlappedIoCompleted(lpOverlapped) ((lpOverlapped)->Internal != STATUS_PENDING) PVOID WINAPI HeapAlloc(HANDLE,DWORD,SIZE_T); SIZE_T WINAPI HeapCompact(HANDLE,DWORD); @@ -1807,7 +2313,7 @@ BOOL WINAPI ImpersonateAnonymousToken(HANDLE); BOOL WINAPI ImpersonateLoggedOnUser(HANDLE); BOOL WINAPI ImpersonateNamedPipeClient(HANDLE); BOOL WINAPI ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL); -BOOL WINAPI InitAtomTable(DWORD); +BOOL WINAPI InitAtomTable(_In_ DWORD); BOOL WINAPI InitializeAcl(PACL,DWORD,DWORD); #if (_WIN32_WINNT >= 0x0600) VOID WINAPI InitializeConditionVariable(PCONDITION_VARIABLE); @@ -1957,20 +2463,27 @@ InterlockedOr_Inline(IN OUT volatile LONG *Target, #endif /* __INTERLOCKED_DECLARED */ -BOOL WINAPI IsBadCodePtr(FARPROC); -BOOL WINAPI IsBadHugeReadPtr(CONST VOID*,UINT_PTR); -BOOL WINAPI IsBadHugeWritePtr(PVOID,UINT_PTR); -BOOL WINAPI IsBadReadPtr(CONST VOID*,UINT_PTR); -BOOL WINAPI IsBadStringPtrA(LPCSTR,UINT_PTR); -BOOL WINAPI IsBadStringPtrW(LPCWSTR,UINT_PTR); -BOOL WINAPI IsBadWritePtr(PVOID,UINT_PTR); +BOOL WINAPI IsBadCodePtr(_In_opt_ FARPROC); +BOOL WINAPI IsBadHugeReadPtr(_In_opt_ CONST VOID*, _In_ UINT_PTR); +BOOL WINAPI IsBadHugeWritePtr(_In_opt_ PVOID, _In_ UINT_PTR); +BOOL WINAPI IsBadReadPtr(_In_opt_ CONST VOID*, _In_ UINT_PTR); +BOOL WINAPI IsBadStringPtrA(_In_opt_ LPCSTR, _In_ UINT_PTR); +BOOL WINAPI IsBadStringPtrW(_In_opt_ LPCWSTR, _In_ UINT_PTR); +BOOL WINAPI IsBadWritePtr(_In_opt_ PVOID, _In_ UINT_PTR); BOOL WINAPI IsDebuggerPresent(void); #if (_WIN32_WINNT >= 0x0501) BOOL WINAPI IsProcessInJob(HANDLE,HANDLE,PBOOL); #endif BOOL WINAPI IsProcessorFeaturePresent(DWORD); BOOL WINAPI IsSystemResumeAutomatic(void); -BOOL WINAPI IsTextUnicode(CONST VOID*,int,LPINT); + +BOOL +WINAPI +IsTextUnicode( + _In_reads_bytes_(iSize) CONST VOID *lpv, + _In_ int iSize, + _Inout_opt_ LPINT lpiResult); + #if (_WIN32_WINNT >= 0x0600) BOOL WINAPI IsThreadAFiber(VOID); #endif @@ -1983,50 +2496,151 @@ BOOL WINAPI IsWow64Process(HANDLE,PBOOL); #endif void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION); #define LimitEmsPages(n) -HINSTANCE WINAPI LoadLibraryA(LPCSTR); +_Ret_maybenull_ HINSTANCE WINAPI LoadLibraryA(_In_ LPCSTR); +_Ret_maybenull_ HINSTANCE WINAPI LoadLibraryW(_In_ LPCWSTR); HINSTANCE WINAPI LoadLibraryExA(LPCSTR,HANDLE,DWORD); HINSTANCE WINAPI LoadLibraryExW(LPCWSTR,HANDLE,DWORD); -HINSTANCE WINAPI LoadLibraryW(LPCWSTR); -DWORD WINAPI LoadModule(LPCSTR,PVOID); +DWORD WINAPI LoadModule(_In_ LPCSTR, _In_ PVOID); HGLOBAL WINAPI LoadResource(HINSTANCE,HRSRC); HLOCAL WINAPI LocalAlloc(UINT,SIZE_T); -SIZE_T WINAPI LocalCompact(UINT); /* Obsolete: Has no effect. */ +SIZE_T WINAPI LocalCompact(_In_ UINT); /* Obsolete: Has no effect. */ #define LocalDiscard(m) (LocalReAlloc((m),0,LMEM_MOVEABLE)) BOOL WINAPI LocalFileTimeToFileTime(CONST FILETIME *,LPFILETIME); -UINT WINAPI LocalFlags(HLOCAL); /* Obsolete: Has no effect. */ +UINT WINAPI LocalFlags(_In_ HLOCAL); /* Obsolete: Has no effect. */ HLOCAL WINAPI LocalFree(HLOCAL); -HLOCAL WINAPI LocalHandle(LPCVOID); +_Ret_maybenull_ HLOCAL WINAPI LocalHandle(_In_ LPCVOID); PVOID WINAPI LocalLock(HLOCAL); HLOCAL WINAPI LocalReAlloc(HLOCAL,SIZE_T,UINT); -SIZE_T WINAPI LocalShrink(HLOCAL,UINT); /* Obsolete: Has no effect. */ -SIZE_T WINAPI LocalSize(HLOCAL); +SIZE_T WINAPI LocalShrink(_In_ HLOCAL, _In_ UINT); /* Obsolete: Has no effect. */ +SIZE_T WINAPI LocalSize(_In_ HLOCAL); BOOL WINAPI LocalUnlock(HLOCAL); BOOL WINAPI LockFile(HANDLE,DWORD,DWORD,DWORD,DWORD); BOOL WINAPI LockFileEx(HANDLE,DWORD,DWORD,DWORD,DWORD,LPOVERLAPPED); PVOID WINAPI LockResource(HGLOBAL); #define LockSegment(w) GlobalFix((HANDLE)(w)) /* Obsolete: Has no effect. */ -BOOL WINAPI LogonUserA(LPSTR,LPSTR,LPSTR,DWORD,DWORD,PHANDLE); -BOOL WINAPI LogonUserW(LPWSTR,LPWSTR,LPWSTR,DWORD,DWORD,PHANDLE); -BOOL WINAPI LookupAccountNameA(LPCSTR,LPCSTR,PSID,PDWORD,LPSTR,PDWORD,PSID_NAME_USE); -BOOL WINAPI LookupAccountNameW(LPCWSTR,LPCWSTR,PSID,PDWORD,LPWSTR,PDWORD,PSID_NAME_USE); -BOOL WINAPI LookupAccountSidA(LPCSTR,PSID,LPSTR,PDWORD,LPSTR,PDWORD,PSID_NAME_USE); -BOOL WINAPI LookupAccountSidW(LPCWSTR,PSID,LPWSTR,PDWORD,LPWSTR,PDWORD,PSID_NAME_USE); -BOOL WINAPI LookupPrivilegeDisplayNameA(LPCSTR,LPCSTR,LPSTR,PDWORD,PDWORD); -BOOL WINAPI LookupPrivilegeDisplayNameW(LPCWSTR,LPCWSTR,LPWSTR,PDWORD,PDWORD); -BOOL WINAPI LookupPrivilegeNameA(LPCSTR,PLUID,LPSTR,PDWORD); -BOOL WINAPI LookupPrivilegeNameW(LPCWSTR,PLUID,LPWSTR,PDWORD); -BOOL WINAPI LookupPrivilegeValueA(LPCSTR,LPCSTR,PLUID); -BOOL WINAPI LookupPrivilegeValueW(LPCWSTR,LPCWSTR,PLUID); -LPSTR WINAPI lstrcatA(LPSTR,LPCSTR); -LPWSTR WINAPI lstrcatW(LPWSTR,LPCWSTR); +BOOL WINAPI LogonUserA(_In_ LPSTR, _In_opt_ LPSTR, _In_opt_ LPSTR, _In_ DWORD, _In_ DWORD, _Outptr_ PHANDLE); +BOOL WINAPI LogonUserW(_In_ LPWSTR, _In_opt_ LPWSTR, _In_opt_ LPWSTR, _In_ DWORD, _In_ DWORD, _Outptr_ PHANDLE); + +_Success_(return != FALSE) +BOOL +WINAPI +LookupAccountNameA( + _In_opt_ LPCSTR lpSystemName, + _In_ LPCSTR lpAccountName, + _Out_writes_bytes_to_opt_(*cbSid, *cbSid) PSID Sid, + _Inout_ LPDWORD cbSid, + _Out_writes_to_opt_(*cchReferencedDomainName, *cchReferencedDomainName + 1) LPSTR ReferencedDomainName, + _Inout_ LPDWORD cchReferencedDomainName, + _Out_ PSID_NAME_USE peUse); + +_Success_(return != FALSE) +BOOL +WINAPI +LookupAccountNameW( + _In_opt_ LPCWSTR lpSystemName, + _In_ LPCWSTR lpAccountName, + _Out_writes_bytes_to_opt_(*cbSid, *cbSid) PSID Sid, + _Inout_ LPDWORD cbSid, + _Out_writes_to_opt_(*cchReferencedDomainName, *cchReferencedDomainName + 1) LPWSTR ReferencedDomainName, + _Inout_ LPDWORD cchReferencedDomainName, + _Out_ PSID_NAME_USE peUse); + +_Success_(return != FALSE) +BOOL +WINAPI +LookupAccountSidA( + _In_opt_ LPCSTR lpSystemName, + _In_ PSID Sid, + _Out_writes_to_opt_(*cchName, *cchName + 1) LPSTR Name, + _Inout_ LPDWORD cchName, + _Out_writes_to_opt_(*cchReferencedDomainName, *cchReferencedDomainName + 1) LPSTR ReferencedDomainName, + _Inout_ LPDWORD cchReferencedDomainName, + _Out_ PSID_NAME_USE peUse); + +_Success_(return != FALSE) +BOOL +WINAPI +LookupAccountSidW( + _In_opt_ LPCWSTR lpSystemName, + _In_ PSID Sid, + _Out_writes_to_opt_(*cchName, *cchName + 1) LPWSTR Name, + _Inout_ LPDWORD cchName, + _Out_writes_to_opt_(*cchReferencedDomainName, *cchReferencedDomainName + 1) LPWSTR ReferencedDomainName, + _Inout_ LPDWORD cchReferencedDomainName, + _Out_ PSID_NAME_USE peUse); + +_Success_(return != FALSE) +BOOL +WINAPI +LookupPrivilegeDisplayNameA( + _In_opt_ LPCSTR lpSystemName, + _In_ LPCSTR lpName, + _Out_writes_to_opt_(*cchDisplayName, *cchDisplayName + 1) LPSTR lpDisplayName, + _Inout_ LPDWORD cchDisplayName, + _Out_ LPDWORD lpLanguageId); + +_Success_(return != FALSE) +BOOL +WINAPI +LookupPrivilegeDisplayNameW( + _In_opt_ LPCWSTR lpSystemName, + _In_ LPCWSTR lpName, + _Out_writes_to_opt_(*cchDisplayName, *cchDisplayName + 1) LPWSTR lpDisplayName, + _Inout_ LPDWORD cchDisplayName, + _Out_ LPDWORD lpLanguageId); + +_Success_(return != FALSE) +BOOL +WINAPI +LookupPrivilegeNameA( + _In_opt_ LPCSTR lpSystemName, + _In_ PLUID lpLuid, + _Out_writes_to_opt_(*cchName, *cchName + 1) LPSTR lpName, + _Inout_ LPDWORD cchName); + +_Success_(return != FALSE) +BOOL +WINAPI +LookupPrivilegeNameW( + _In_opt_ LPCWSTR lpSystemName, + _In_ PLUID lpLuid, + _Out_writes_to_opt_(*cchName, *cchName + 1) LPWSTR lpName, + _Inout_ LPDWORD cchName); + +BOOL WINAPI LookupPrivilegeValueA(_In_opt_ LPCSTR, _In_ LPCSTR, _Out_ PLUID); +BOOL WINAPI LookupPrivilegeValueW(_In_opt_ LPCWSTR, _In_ LPCWSTR, _Out_ PLUID); + +LPSTR +WINAPI +lstrcatA( + _Inout_updates_z_(_String_length_(lpString1) + _String_length_(lpString2) + 1) LPSTR lpString1, + _In_ LPCSTR lpString2); + +LPWSTR +WINAPI +lstrcatW( + _Inout_updates_z_(_String_length_(lpString1) + _String_length_(lpString2) + 1) LPWSTR lpString1, + _In_ LPCWSTR lpString2); + int WINAPI lstrcmpA(LPCSTR,LPCSTR); int WINAPI lstrcmpiA(LPCSTR,LPCSTR); int WINAPI lstrcmpiW( LPCWSTR,LPCWSTR); int WINAPI lstrcmpW(LPCWSTR,LPCWSTR); -LPSTR WINAPI lstrcpyA(LPSTR,LPCSTR); + +LPSTR +WINAPI +lstrcpyA( + _Out_writes_(_String_length_(lpString2) + 1) LPSTR lpString1, + _In_ LPCSTR lpString2); + +LPWSTR +WINAPI +lstrcpyW( + _Out_writes_(_String_length_(lpString2) + 1) LPWSTR lpString1, + _In_ LPCWSTR lpString2); + LPSTR WINAPI lstrcpynA(LPSTR,LPCSTR,int); LPWSTR WINAPI lstrcpynW(LPWSTR,LPCWSTR,int); -LPWSTR WINAPI lstrcpyW(LPWSTR,LPCWSTR); int WINAPI lstrlenA(LPCSTR); int WINAPI lstrlenW(LPCWSTR); BOOL WINAPI MakeAbsoluteSD(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PDWORD,PACL,PDWORD,PACL,PDWORD,PSID,PDWORD,PSID,PDWORD); @@ -2035,61 +2649,78 @@ BOOL WINAPI MakeSelfRelativeSD(PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR,PDWORD) VOID WINAPI MapGenericMask(PDWORD,PGENERIC_MAPPING); PVOID WINAPI MapViewOfFile(HANDLE,DWORD,DWORD,DWORD,SIZE_T); PVOID WINAPI MapViewOfFileEx(HANDLE,DWORD,DWORD,DWORD,SIZE_T,PVOID); -BOOL WINAPI MoveFileA(LPCSTR,LPCSTR); -BOOL WINAPI MoveFileExA(LPCSTR,LPCSTR,DWORD); -BOOL WINAPI MoveFileExW(LPCWSTR,LPCWSTR,DWORD); -BOOL WINAPI MoveFileW(LPCWSTR,LPCWSTR); -int WINAPI MulDiv(int,int,int); -BOOL WINAPI NotifyChangeEventLog(HANDLE,HANDLE); -BOOL WINAPI ObjectCloseAuditAlarmA(LPCSTR,PVOID,BOOL); +BOOL WINAPI MoveFileA(_In_ LPCSTR, _In_ LPCSTR); +BOOL WINAPI MoveFileW(_In_ LPCWSTR, _In_ LPCWSTR); +BOOL WINAPI MoveFileExA(_In_ LPCSTR, _In_opt_ LPCSTR, _In_ DWORD); +BOOL WINAPI MoveFileExW(_In_ LPCWSTR, _In_opt_ LPCWSTR, _In_ DWORD); +int WINAPI MulDiv(_In_ int, _In_ int, _In_ int); +BOOL WINAPI NotifyChangeEventLog(_In_ HANDLE, _In_ HANDLE); +BOOL WINAPI ObjectCloseAuditAlarmA(_In_ LPCSTR, _In_ PVOID, _In_ BOOL); BOOL WINAPI ObjectCloseAuditAlarmW(LPCWSTR,PVOID,BOOL); -BOOL WINAPI ObjectDeleteAuditAlarmA(LPCSTR,PVOID,BOOL); +BOOL WINAPI ObjectDeleteAuditAlarmA(_In_ LPCSTR, _In_ PVOID, _In_ BOOL); BOOL WINAPI ObjectDeleteAuditAlarmW(LPCWSTR,PVOID,BOOL); -BOOL WINAPI ObjectOpenAuditAlarmA(LPCSTR,PVOID,LPSTR,LPSTR,PSECURITY_DESCRIPTOR,HANDLE,DWORD,DWORD,PPRIVILEGE_SET,BOOL,BOOL,PBOOL); +BOOL WINAPI ObjectOpenAuditAlarmA(_In_ LPCSTR, _In_ PVOID, _In_ LPSTR, _In_opt_ LPSTR, _In_ PSECURITY_DESCRIPTOR, _In_ HANDLE, _In_ DWORD, _In_ DWORD, _In_opt_ PPRIVILEGE_SET, _In_ BOOL, _In_ BOOL, _Out_ PBOOL); BOOL WINAPI ObjectOpenAuditAlarmW(LPCWSTR,PVOID,LPWSTR,LPWSTR,PSECURITY_DESCRIPTOR,HANDLE,DWORD,DWORD,PPRIVILEGE_SET,BOOL,BOOL,PBOOL); -BOOL WINAPI ObjectPrivilegeAuditAlarmA(LPCSTR,PVOID,HANDLE,DWORD,PPRIVILEGE_SET,BOOL); +BOOL WINAPI ObjectPrivilegeAuditAlarmA(_In_ LPCSTR, _In_ PVOID, _In_ HANDLE, _In_ DWORD, _In_ PPRIVILEGE_SET, _In_ BOOL); BOOL WINAPI ObjectPrivilegeAuditAlarmW(LPCWSTR,PVOID,HANDLE,DWORD,PPRIVILEGE_SET,BOOL); -HANDLE WINAPI OpenBackupEventLogA(LPCSTR,LPCSTR); -HANDLE WINAPI OpenBackupEventLogW(LPCWSTR,LPCWSTR); +HANDLE WINAPI OpenBackupEventLogA(_In_opt_ LPCSTR, _In_ LPCSTR); +HANDLE WINAPI OpenBackupEventLogW(_In_opt_ LPCWSTR, _In_ LPCWSTR); HANDLE WINAPI OpenEventA(DWORD,BOOL,LPCSTR); -HANDLE WINAPI OpenEventLogA (LPCSTR,LPCSTR); -HANDLE WINAPI OpenEventLogW(LPCWSTR,LPCWSTR); +HANDLE WINAPI OpenEventLogA(_In_opt_ LPCSTR, _In_ LPCSTR); +HANDLE WINAPI OpenEventLogW(_In_opt_ LPCWSTR, _In_ LPCWSTR); HANDLE WINAPI OpenEventW(DWORD,BOOL,LPCWSTR); -HFILE WINAPI OpenFile(LPCSTR,LPOFSTRUCT,UINT); +HFILE WINAPI OpenFile(_In_ LPCSTR, _Inout_ LPOFSTRUCT, _In_ UINT); #if (_WIN32_WINNT >= 0x0600) -HANDLE WINAPI OpenFileById(HANDLE,LPFILE_ID_DESCRIPTOR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD); +HANDLE WINAPI OpenFileById(_In_ HANDLE, _In_ LPFILE_ID_DESCRIPTOR, _In_ DWORD, _In_ DWORD, _In_opt_ LPSECURITY_ATTRIBUTES, _In_ DWORD); #endif -HANDLE WINAPI OpenFileMappingA(DWORD,BOOL,LPCSTR); +HANDLE WINAPI OpenFileMappingA(_In_ DWORD, _In_ BOOL, _In_ LPCSTR); HANDLE WINAPI OpenFileMappingW(DWORD,BOOL,LPCWSTR); -HANDLE WINAPI OpenMutexA(DWORD,BOOL,LPCSTR); +_Ret_maybenull_ HANDLE WINAPI OpenMutexA(_In_ DWORD, _In_ BOOL, _In_ LPCSTR); HANDLE WINAPI OpenMutexW(DWORD,BOOL,LPCWSTR); HANDLE WINAPI OpenProcess(DWORD,BOOL,DWORD); BOOL WINAPI OpenProcessToken(HANDLE,DWORD,PHANDLE); -HANDLE WINAPI OpenSemaphoreA(DWORD,BOOL,LPCSTR); +_Ret_maybenull_ HANDLE WINAPI OpenSemaphoreA(_In_ DWORD, _In_ BOOL, _In_ LPCSTR); HANDLE WINAPI OpenSemaphoreW(DWORD,BOOL,LPCWSTR); #if (_WIN32_WINNT >= 0x0500) || (_WIN32_WINDOWS >= 0x0490) HANDLE WINAPI OpenThread(DWORD,BOOL,DWORD); #endif BOOL WINAPI OpenThreadToken(HANDLE,DWORD,BOOL,PHANDLE); -HANDLE WINAPI OpenWaitableTimerA(DWORD,BOOL,LPCSTR); +_Ret_maybenull_ HANDLE WINAPI OpenWaitableTimerA(_In_ DWORD, _In_ BOOL, _In_ LPCSTR); HANDLE WINAPI OpenWaitableTimerW(DWORD,BOOL,LPCWSTR); WINBASEAPI void WINAPI OutputDebugStringA(LPCSTR); WINBASEAPI void WINAPI OutputDebugStringW(LPCWSTR); BOOL WINAPI PeekNamedPipe(HANDLE,PVOID,DWORD,PDWORD,PDWORD,PDWORD); BOOL WINAPI PostQueuedCompletionStatus(HANDLE,DWORD,ULONG_PTR,LPOVERLAPPED); -DWORD WINAPI PrepareTape(HANDLE,DWORD,BOOL); +DWORD WINAPI PrepareTape(_In_ HANDLE, _In_ DWORD, _In_ BOOL); BOOL WINAPI PrivilegeCheck (HANDLE,PPRIVILEGE_SET,PBOOL); -BOOL WINAPI PrivilegedServiceAuditAlarmA(LPCSTR,LPCSTR,HANDLE,PPRIVILEGE_SET,BOOL); +BOOL WINAPI PrivilegedServiceAuditAlarmA(_In_ LPCSTR, _In_ LPCSTR, _In_ HANDLE, _In_ PPRIVILEGE_SET, _In_ BOOL); BOOL WINAPI PrivilegedServiceAuditAlarmW(LPCWSTR,LPCWSTR,HANDLE,PPRIVILEGE_SET,BOOL); #if (_WIN32_WINNT >= 0x0500) BOOL WINAPI ProcessIdToSessionId(DWORD,DWORD*); #endif BOOL WINAPI PulseEvent(HANDLE); -BOOL WINAPI PurgeComm(HANDLE,DWORD); +BOOL WINAPI PurgeComm(_In_ HANDLE, _In_ DWORD); + #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI QueryActCtxW(DWORD,HANDLE,PVOID,ULONG,PVOID,SIZE_T,SIZE_T*); +BOOL +WINAPI +QueryActCtxW( + _In_ DWORD dwFlags, + _In_ HANDLE hActCtx, + _In_opt_ PVOID pvSubInstance, + _In_ ULONG ulInfoClass, + _Out_writes_bytes_to_opt_(cbBuffer, *pcbWrittenOrRequired) PVOID pvBuffer, + _In_ SIZE_T cbBuffer, + _Out_opt_ SIZE_T *pcbWrittenOrRequired); #endif -DWORD WINAPI QueryDosDeviceA(LPCSTR,LPSTR,DWORD); + +DWORD +WINAPI +QueryDosDeviceA( + _In_opt_ LPCSTR lpDeviceName, + _Out_writes_to_opt_(ucchMax, return) LPSTR lpTargetPath, + _In_ DWORD ucchMax); + DWORD WINAPI QueryDosDeviceW(LPCWSTR,LPWSTR,DWORD); #if (_WIN32_WINNT >= 0x0501) BOOL WINAPI QueryMemoryResourceNotification(HANDLE,PBOOL); @@ -2104,9 +2735,41 @@ DWORD WINAPI QueueUserAPC(PAPCFUNC,HANDLE,ULONG_PTR); BOOL WINAPI QueueUserWorkItem(LPTHREAD_START_ROUTINE,PVOID,ULONG); #endif void WINAPI RaiseException(DWORD,DWORD,DWORD,const ULONG_PTR*); -BOOL WINAPI ReadDirectoryChangesW(HANDLE,PVOID,DWORD,BOOL,DWORD,PDWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); -BOOL WINAPI ReadEventLogA(HANDLE,DWORD,DWORD,PVOID,DWORD,DWORD *,DWORD *); -BOOL WINAPI ReadEventLogW(HANDLE,DWORD,DWORD,PVOID,DWORD,DWORD *,DWORD *); + +BOOL +WINAPI +ReadDirectoryChangesW( + _In_ HANDLE hDirectory, + _Out_writes_bytes_to_(nBufferLength, *lpBytesReturned) LPVOID lpBuffer, + _In_ DWORD nBufferLength, + _In_ BOOL bWatchSubtree, + _In_ DWORD dwNotifyFilter, + _Out_opt_ LPDWORD lpBytesReturned, + _Inout_opt_ LPOVERLAPPED lpOverlapped, + _In_opt_ LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine); + +BOOL +WINAPI +ReadEventLogA( + _In_ HANDLE hEventLog, + _In_ DWORD dwReadFlags, + _In_ DWORD dwRecordOffset, + _Out_writes_bytes_to_(nNumberOfBytesToRead, *pnBytesRead) LPVOID lpBuffer, + _In_ DWORD nNumberOfBytesToRead, + _Out_ DWORD *pnBytesRead, + _Out_ DWORD *pnMinNumberOfBytesNeeded); + +BOOL +WINAPI +ReadEventLogW( + _In_ HANDLE hEventLog, + _In_ DWORD dwReadFlags, + _In_ DWORD dwRecordOffset, + _Out_writes_bytes_to_(nNumberOfBytesToRead, *pnBytesRead) LPVOID lpBuffer, + _In_ DWORD nNumberOfBytesToRead, + _Out_ DWORD *pnBytesRead, + _Out_ DWORD *pnMinNumberOfBytesNeeded); + BOOL WINAPI ReadFile(HANDLE,PVOID,DWORD,PDWORD,LPOVERLAPPED); BOOL WINAPI ReadFileEx(HANDLE,PVOID,DWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); BOOL WINAPI ReadFileScatter(HANDLE,FILE_SEGMENT_ELEMENT*,DWORD,LPDWORD,LPOVERLAPPED); @@ -2114,17 +2777,17 @@ BOOL WINAPI ReadProcessMemory(HANDLE,LPCVOID,LPVOID,SIZE_T,PSIZE_T); #if (_WIN32_WINNT >= 0x0600) VOID WINAPI RecoveryFinished(BOOL); HRESULT WINAPI RecoveryInProgress(OUT PBOOL); -HRESULT WINAPI RegisterApplicationRecoveryCallback(APPLICATION_RECOVERY_CALLBACK,PVOID, DWORD, DWORD); -HRESULT WINAPI RegisterApplicationRestart(PCWSTR,DWORD); +HRESULT WINAPI RegisterApplicationRecoveryCallback(_In_ APPLICATION_RECOVERY_CALLBACK, _In_opt_ PVOID, _In_ DWORD, _In_ DWORD); +HRESULT WINAPI RegisterApplicationRestart(_In_opt_ PCWSTR, _In_ DWORD); #endif -HANDLE WINAPI RegisterEventSourceA (LPCSTR,LPCSTR); -HANDLE WINAPI RegisterEventSourceW(LPCWSTR,LPCWSTR); +HANDLE WINAPI RegisterEventSourceA(_In_opt_ LPCSTR, _In_ LPCSTR); +HANDLE WINAPI RegisterEventSourceW(_In_opt_ LPCWSTR, _In_ LPCWSTR); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI RegisterWaitForSingleObject(PHANDLE,HANDLE,WAITORTIMERCALLBACK,PVOID,ULONG,ULONG); +BOOL WINAPI RegisterWaitForSingleObject(_Outptr_ PHANDLE, _In_ HANDLE, _In_ WAITORTIMERCALLBACK, _In_opt_ PVOID, _In_ ULONG, _In_ ULONG); HANDLE WINAPI RegisterWaitForSingleObjectEx(HANDLE,WAITORTIMERCALLBACK,PVOID,ULONG,ULONG); #endif #if (_WIN32_WINNT >= 0x0501) -void WINAPI ReleaseActCtx(HANDLE); +void WINAPI ReleaseActCtx(_Inout_ HANDLE); #endif BOOL WINAPI ReleaseMutex(HANDLE); BOOL WINAPI ReleaseSemaphore(HANDLE,LONG,LPLONG); @@ -2135,42 +2798,98 @@ VOID WINAPI ReleaseSRWLockShared(PSRWLOCK); BOOL WINAPI RemoveDirectoryA(LPCSTR); BOOL WINAPI RemoveDirectoryW(LPCWSTR); #if (_WIN32_WINNT >= 0x0500) -ULONG WINAPI RemoveVectoredExceptionHandler(PVOID); +ULONG WINAPI RemoveVectoredExceptionHandler(_In_ PVOID); #endif #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI ReplaceFileA(LPCSTR,LPCSTR,LPCSTR,DWORD,LPVOID,LPVOID); -BOOL WINAPI ReplaceFileW(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPVOID,LPVOID); +BOOL WINAPI ReplaceFileA(_In_ LPCSTR, _In_ LPCSTR, _In_opt_ LPCSTR, _In_ DWORD, _Reserved_ LPVOID, _Reserved_ LPVOID); +BOOL WINAPI ReplaceFileW(_In_ LPCWSTR, _In_ LPCWSTR, _In_opt_ LPCWSTR, _In_ DWORD, _Reserved_ LPVOID, _Reserved_ LPVOID); #endif -BOOL WINAPI ReportEventA(HANDLE,WORD,WORD,DWORD,PSID,WORD,DWORD,LPCSTR*,PVOID); -BOOL WINAPI ReportEventW(HANDLE,WORD,WORD,DWORD,PSID,WORD,DWORD,LPCWSTR*,PVOID); + +BOOL +WINAPI +ReportEventA( + _In_ HANDLE hEventLog, + _In_ WORD wType, + _In_ WORD wCategory, + _In_ DWORD dwEventID, + _In_opt_ PSID lpUserSid, + _In_ WORD wNumStrings, + _In_ DWORD dwDataSize, + _In_reads_opt_(wNumStrings) LPCSTR *lpStrings, + _In_reads_bytes_opt_(dwDataSize) LPVOID lpRawData); + +BOOL +WINAPI +ReportEventW( + _In_ HANDLE hEventLog, + _In_ WORD wType, + _In_ WORD wCategory, + _In_ DWORD dwEventID, + _In_opt_ PSID lpUserSid, + _In_ WORD wNumStrings, + _In_ DWORD dwDataSize, + _In_reads_opt_(wNumStrings) LPCWSTR *lpStrings, + _In_reads_bytes_opt_(dwDataSize) LPVOID lpRawData); + BOOL WINAPI ResetEvent(HANDLE); UINT WINAPI ResetWriteWatch(LPVOID,SIZE_T); #if (_WIN32_WINNT >= 0x0510) -VOID WINAPI RestoreLastError(DWORD); +VOID WINAPI RestoreLastError(_In_ DWORD); #endif DWORD WINAPI ResumeThread(HANDLE); BOOL WINAPI RevertToSelf(void); -DWORD WINAPI SearchPathA(LPCSTR,LPCSTR,LPCSTR,DWORD,LPSTR,LPSTR*); + +_Success_(return != 0 && return < nBufferLength) +DWORD +WINAPI +SearchPathA( + _In_opt_ LPCSTR lpPath, + _In_ LPCSTR lpFileName, + _In_opt_ LPCSTR lpExtension, + _In_ DWORD nBufferLength, + _Out_writes_to_opt_(nBufferLength, return + 1) LPSTR lpBuffer, + _Out_opt_ LPSTR *lpFilePart); + DWORD WINAPI SearchPathW(LPCWSTR,LPCWSTR,LPCWSTR,DWORD,LPWSTR,LPWSTR*); BOOL WINAPI SetAclInformation(PACL,PVOID,DWORD,ACL_INFORMATION_CLASS); -BOOL WINAPI SetCommBreak(HANDLE); -BOOL WINAPI SetCommConfig(HANDLE,LPCOMMCONFIG,DWORD); -BOOL WINAPI SetCommMask(HANDLE,DWORD); -BOOL WINAPI SetCommState(HANDLE,LPDCB); -BOOL WINAPI SetCommTimeouts(HANDLE,LPCOMMTIMEOUTS); -BOOL WINAPI SetComputerNameA(LPCSTR); -BOOL WINAPI SetComputerNameW(LPCWSTR); +BOOL WINAPI SetCommBreak(_In_ HANDLE); + +BOOL +WINAPI +SetCommConfig( + _In_ HANDLE hCommDev, + _In_reads_bytes_(dwSize) LPCOMMCONFIG lpCC, + _In_ DWORD dwSize); + +BOOL WINAPI SetCommMask(_In_ HANDLE, _In_ DWORD); +BOOL WINAPI SetCommState(_In_ HANDLE, _In_ LPDCB); +BOOL WINAPI SetCommTimeouts(_In_ HANDLE, _In_ LPCOMMTIMEOUTS); +BOOL WINAPI SetComputerNameA(_In_ LPCSTR); +BOOL WINAPI SetComputerNameW(_In_ LPCWSTR); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI SetComputerNameExA(COMPUTER_NAME_FORMAT,LPCSTR); +BOOL WINAPI SetComputerNameExA(_In_ COMPUTER_NAME_FORMAT, _In_ LPCSTR); BOOL WINAPI SetComputerNameExW(COMPUTER_NAME_FORMAT,LPCWSTR); #endif BOOL WINAPI SetCurrentDirectoryA(LPCSTR); BOOL WINAPI SetCurrentDirectoryW(LPCWSTR); -BOOL WINAPI SetDefaultCommConfigA(LPCSTR,LPCOMMCONFIG,DWORD); -BOOL WINAPI SetDefaultCommConfigW(LPCWSTR,LPCOMMCONFIG,DWORD); + +BOOL +WINAPI +SetDefaultCommConfigA( + _In_ LPCSTR lpszName, + _In_reads_bytes_(dwSize) LPCOMMCONFIG lpCC, + _In_ DWORD dwSize); + +BOOL +WINAPI +SetDefaultCommConfigW( + _In_ LPCWSTR lpszName, + _In_reads_bytes_(dwSize) LPCOMMCONFIG lpCC, + _In_ DWORD dwSize); + #if (_WIN32_WINNT >= 0x0502) -BOOL WINAPI SetDllDirectoryA(LPCSTR); -BOOL WINAPI SetDllDirectoryW(LPCWSTR); +BOOL WINAPI SetDllDirectoryA(_In_opt_ LPCSTR); +BOOL WINAPI SetDllDirectoryW(_In_opt_ LPCWSTR); #endif BOOL WINAPI SetEndOfFile(HANDLE); BOOL WINAPI SetEnvironmentVariableA(LPCSTR,LPCSTR); @@ -2185,39 +2904,56 @@ BOOL WINAPI SetFileAttributesByHandle(HANDLE,DWORD,DWORD); #endif BOOL WINAPI SetFileAttributesW(LPCWSTR,DWORD); #if (_WIN32_WINNT >= 0x0600) -BOOL WINAPI SetFileBandwidthReservation(HANDLE,DWORD,DWORD,BOOL,LPDWORD,LPDWORD); -BOOL WINAPI SetFileCompletionNotificationModes(HANDLE,UCHAR); +BOOL WINAPI SetFileBandwidthReservation(_In_ HANDLE, _In_ DWORD, _In_ DWORD, _In_ BOOL, _Out_ LPDWORD, _Out_ LPDWORD); +BOOL WINAPI SetFileCompletionNotificationModes(_In_ HANDLE, _In_ UCHAR); #endif DWORD WINAPI SetFilePointer(HANDLE,LONG,PLONG,DWORD); BOOL WINAPI SetFilePointerEx(HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD); -BOOL WINAPI SetFileSecurityA(LPCSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); +BOOL WINAPI SetFileSecurityA(_In_ LPCSTR, _In_ SECURITY_INFORMATION, _In_ PSECURITY_DESCRIPTOR); BOOL WINAPI SetFileSecurityW(LPCWSTR,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI SetFileShortNameA(HANDLE,LPCSTR); -BOOL WINAPI SetFileShortNameW(HANDLE,LPCWSTR); +BOOL WINAPI SetFileShortNameA(_In_ HANDLE, _In_ LPCSTR); +BOOL WINAPI SetFileShortNameW(_In_ HANDLE, _In_ LPCWSTR); #endif BOOL WINAPI SetFileTime(HANDLE,const FILETIME*,const FILETIME*,const FILETIME*); #if (_WIN32_WINNT >= 0x0501) BOOL WINAPI SetFileValidData(HANDLE,LONGLONG); #endif + #if (_WIN32_WINNT >= 0x0502) -BOOL WINAPI SetFirmwareEnvironmentVariableA(LPCSTR,LPCSTR,PVOID,DWORD); -BOOL WINAPI SetFirmwareEnvironmentVariableW(LPCWSTR,LPCWSTR,PVOID,DWORD); + +BOOL +WINAPI +SetFirmwareEnvironmentVariableA( + _In_ LPCSTR lpName, + _In_ LPCSTR lpGuid, + _In_reads_bytes_opt_(nSize) PVOID pValue, + _In_ DWORD nSize); + +BOOL +WINAPI +SetFirmwareEnvironmentVariableW( + _In_ LPCWSTR lpName, + _In_ LPCWSTR lpGuid, + _In_reads_bytes_opt_(nSize) PVOID pValue, + _In_ DWORD nSize); + #endif + UINT WINAPI SetHandleCount(UINT); BOOL WINAPI SetHandleInformation(HANDLE,DWORD,DWORD); BOOL WINAPI SetKernelObjectSecurity(HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); void WINAPI SetLastError(DWORD); void WINAPI SetLastErrorEx(DWORD,DWORD); BOOL WINAPI SetLocalTime(const SYSTEMTIME*); -BOOL WINAPI SetMailslotInfo(HANDLE,DWORD); +BOOL WINAPI SetMailslotInfo(_In_ HANDLE, _In_ DWORD); BOOL WINAPI SetNamedPipeHandleState(HANDLE,PDWORD,PDWORD,PDWORD); BOOL WINAPI SetPriorityClass(HANDLE,DWORD); BOOL WINAPI SetPrivateObjectSecurity(SECURITY_INFORMATION,PSECURITY_DESCRIPTOR,PSECURITY_DESCRIPTOR *,PGENERIC_MAPPING,HANDLE); -BOOL WINAPI SetProcessAffinityMask(HANDLE,DWORD_PTR); -BOOL WINAPI SetProcessPriorityBoost(HANDLE,BOOL); +BOOL WINAPI SetProcessAffinityMask(_In_ HANDLE, _In_ DWORD_PTR); +BOOL WINAPI SetProcessPriorityBoost(_In_ HANDLE, _In_ BOOL); BOOL WINAPI SetProcessShutdownParameters(DWORD,DWORD); -BOOL WINAPI SetProcessWorkingSetSize(HANDLE,SIZE_T,SIZE_T); +BOOL WINAPI SetProcessWorkingSetSize(_In_ HANDLE, _In_ SIZE_T, _In_ SIZE_T); #if (_WIN32_WINNT >= 0x0600) VOID WINAPI SetSecurityAccessMask(SECURITY_INFORMATION,LPDWORD); #endif @@ -2229,29 +2965,29 @@ DWORD WINAPI SetSecurityDescriptorRMControl(PSECURITY_DESCRIPTOR,PUCHAR); BOOL WINAPI SetSecurityDescriptorSacl(PSECURITY_DESCRIPTOR,BOOL,PACL,BOOL); BOOL WINAPI SetStdHandle(DWORD,HANDLE); #define SetSwapAreaSize(w) (w) -BOOL WINAPI SetSystemPowerState(BOOL,BOOL); +BOOL WINAPI SetSystemPowerState(_In_ BOOL, _In_ BOOL); BOOL WINAPI SetSystemTime(const SYSTEMTIME*); -BOOL WINAPI SetSystemTimeAdjustment(DWORD,BOOL); -DWORD WINAPI SetTapeParameters(HANDLE,DWORD,PVOID); -DWORD WINAPI SetTapePosition(HANDLE,DWORD,DWORD,DWORD,DWORD,BOOL); -DWORD_PTR WINAPI SetThreadAffinityMask(HANDLE,DWORD_PTR); +BOOL WINAPI SetSystemTimeAdjustment(_In_ DWORD, _In_ BOOL); +DWORD WINAPI SetTapeParameters(_In_ HANDLE, _In_ DWORD, _In_ PVOID); +DWORD WINAPI SetTapePosition(_In_ HANDLE, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ BOOL); +DWORD_PTR WINAPI SetThreadAffinityMask(_In_ HANDLE, _In_ DWORD_PTR); BOOL WINAPI SetThreadContext(HANDLE,const CONTEXT*); -DWORD WINAPI SetThreadIdealProcessor(HANDLE,DWORD); +DWORD WINAPI SetThreadIdealProcessor(_In_ HANDLE, _In_ DWORD); BOOL WINAPI SetThreadPriority(HANDLE,int); BOOL WINAPI SetThreadPriorityBoost(HANDLE,BOOL); BOOL WINAPI SetThreadToken (PHANDLE,HANDLE); BOOL WINAPI SetTimeZoneInformation(const TIME_ZONE_INFORMATION *); BOOL WINAPI SetTokenInformation(HANDLE,TOKEN_INFORMATION_CLASS,PVOID,DWORD); LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER); -BOOL WINAPI SetupComm(HANDLE,DWORD,DWORD); -BOOL WINAPI SetVolumeLabelA(LPCSTR,LPCSTR); -BOOL WINAPI SetVolumeLabelW(LPCWSTR,LPCWSTR); +BOOL WINAPI SetupComm(_In_ HANDLE, _In_ DWORD, _In_ DWORD); +BOOL WINAPI SetVolumeLabelA(_In_opt_ LPCSTR, _In_opt_ LPCSTR); +BOOL WINAPI SetVolumeLabelW(_In_opt_ LPCWSTR, _In_opt_ LPCWSTR); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI SetVolumeMountPointA(LPCSTR,LPCSTR); -BOOL WINAPI SetVolumeMountPointW(LPCWSTR,LPCWSTR); +BOOL WINAPI SetVolumeMountPointA(_In_ LPCSTR, _In_ LPCSTR); +BOOL WINAPI SetVolumeMountPointW(_In_ LPCWSTR, _In_ LPCWSTR); #endif BOOL WINAPI SetWaitableTimer(HANDLE,const LARGE_INTEGER*,LONG,PTIMERAPCROUTINE,PVOID,BOOL); -DWORD WINAPI SignalObjectAndWait(HANDLE,HANDLE,DWORD,BOOL); +DWORD WINAPI SignalObjectAndWait(_In_ HANDLE, _In_ HANDLE, _In_ DWORD, _In_ BOOL); DWORD WINAPI SizeofResource(HINSTANCE,HRSRC); WINBASEAPI void WINAPI Sleep(DWORD); #if (_WIN32_WINNT >= 0x0600) @@ -2260,7 +2996,7 @@ BOOL WINAPI SleepConditionVariableSRW(PCONDITION_VARIABLE,PSRWLOCK,DWORD,ULONG); #endif DWORD WINAPI SleepEx(DWORD,BOOL); DWORD WINAPI SuspendThread(HANDLE); -void WINAPI SwitchToFiber(PVOID); +void WINAPI SwitchToFiber(_In_ PVOID); BOOL WINAPI SwitchToThread(void); BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME*,LPFILETIME); BOOL WINAPI SystemTimeToTzSpecificLocalTime(CONST TIME_ZONE_INFORMATION*,CONST SYSTEMTIME*,LPSYSTEMTIME); @@ -2271,7 +3007,7 @@ BOOL WINAPI TlsFree(DWORD); PVOID WINAPI TlsGetValue(DWORD); BOOL WINAPI TlsSetValue(DWORD,PVOID); BOOL WINAPI TransactNamedPipe(HANDLE,PVOID,DWORD,PVOID,DWORD,PDWORD,LPOVERLAPPED); -BOOL WINAPI TransmitCommChar(HANDLE,char); +BOOL WINAPI TransmitCommChar(_In_ HANDLE, _In_ char); BOOL WINAPI TryEnterCriticalSection(LPCRITICAL_SECTION); BOOL WINAPI TzSpecificLocalTimeToSystemTime(LPTIME_ZONE_INFORMATION,LPSYSTEMTIME,LPSYSTEMTIME); LONG WINAPI UnhandledExceptionFilter(LPEXCEPTION_POINTERS); @@ -2281,13 +3017,32 @@ BOOL WINAPI UnlockFileEx(HANDLE,DWORD,DWORD,DWORD,LPOVERLAPPED); #define UnlockSegment(w) GlobalUnfix((HANDLE)(w)) /* Obsolete: Has no effect. */ BOOL WINAPI UnmapViewOfFile(LPCVOID); #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI UnregisterWait(HANDLE); +_Must_inspect_result_ BOOL WINAPI UnregisterWait(_In_ HANDLE); BOOL WINAPI UnregisterWaitEx(HANDLE,HANDLE); #endif -BOOL WINAPI UpdateResourceA(HANDLE,LPCSTR,LPCSTR,WORD,PVOID,DWORD); -BOOL WINAPI UpdateResourceW(HANDLE,LPCWSTR,LPCWSTR,WORD,PVOID,DWORD); -BOOL WINAPI VerifyVersionInfoA(LPOSVERSIONINFOEXA,DWORD,DWORDLONG); -BOOL WINAPI VerifyVersionInfoW(LPOSVERSIONINFOEXW,DWORD,DWORDLONG); + +BOOL +WINAPI +UpdateResourceA( + _In_ HANDLE hUpdate, + _In_ LPCSTR lpType, + _In_ LPCSTR lpName, + _In_ WORD wLanguage, + _In_reads_bytes_opt_(cb) LPVOID lpData, + _In_ DWORD cb); + +BOOL +WINAPI +UpdateResourceW( + _In_ HANDLE hUpdate, + _In_ LPCWSTR lpType, + _In_ LPCWSTR lpName, + _In_ WORD wLanguage, + _In_reads_bytes_opt_(cb) LPVOID lpData, + _In_ DWORD cb); + +BOOL WINAPI VerifyVersionInfoA(_Inout_ LPOSVERSIONINFOEXA, _In_ DWORD, _In_ DWORDLONG); +BOOL WINAPI VerifyVersionInfoW(_Inout_ LPOSVERSIONINFOEXW, _In_ DWORD, _In_ DWORDLONG); PVOID WINAPI VirtualAlloc(PVOID,SIZE_T,DWORD,DWORD); PVOID WINAPI VirtualAllocEx(HANDLE,PVOID,SIZE_T,DWORD,DWORD); BOOL WINAPI VirtualFree(PVOID,SIZE_T,DWORD); @@ -2298,46 +3053,97 @@ BOOL WINAPI VirtualProtectEx(HANDLE,PVOID,SIZE_T,DWORD,PDWORD); SIZE_T WINAPI VirtualQuery(LPCVOID,PMEMORY_BASIC_INFORMATION,SIZE_T); SIZE_T WINAPI VirtualQueryEx(HANDLE,LPCVOID,PMEMORY_BASIC_INFORMATION,SIZE_T); BOOL WINAPI VirtualUnlock(PVOID,SIZE_T); -BOOL WINAPI WaitCommEvent(HANDLE,PDWORD,LPOVERLAPPED); +BOOL WINAPI WaitCommEvent(_In_ HANDLE, _Inout_ PDWORD, _Inout_opt_ LPOVERLAPPED); BOOL WINAPI WaitForDebugEvent(LPDEBUG_EVENT,DWORD); -DWORD WINAPI WaitForMultipleObjects(DWORD,const HANDLE*,BOOL,DWORD); + +DWORD +WINAPI +WaitForMultipleObjects( + _In_ DWORD nCount, + _In_reads_(nCount) CONST HANDLE *lpHandles, + _In_ BOOL bWaitAll, + _In_ DWORD dwMilliseconds); + DWORD WINAPI WaitForMultipleObjectsEx(DWORD,const HANDLE*,BOOL,DWORD,BOOL); DWORD WINAPI WaitForSingleObject(HANDLE,DWORD); DWORD WINAPI WaitForSingleObjectEx(HANDLE,DWORD,BOOL); -BOOL WINAPI WaitNamedPipeA(LPCSTR,DWORD); -BOOL WINAPI WaitNamedPipeW(LPCWSTR,DWORD); +BOOL WINAPI WaitNamedPipeA(_In_ LPCSTR, _In_ DWORD); +BOOL WINAPI WaitNamedPipeW(_In_ LPCWSTR, _In_ DWORD); #if (_WIN32_WINNT >= 0x0600) VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE); VOID WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE); #endif BOOL WINAPI WinLoadTrustProvider(GUID*); BOOL WINAPI Wow64DisableWow64FsRedirection(PVOID*); -BOOLEAN WINAPI Wow64EnableWow64FsRedirection(BOOLEAN); +BOOLEAN WINAPI Wow64EnableWow64FsRedirection(_In_ 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); -BOOL WINAPI WritePrivateProfileSectionA(LPCSTR,LPCSTR,LPCSTR); -BOOL WINAPI WritePrivateProfileSectionW(LPCWSTR,LPCWSTR,LPCWSTR); -BOOL WINAPI WritePrivateProfileStringA(LPCSTR,LPCSTR,LPCSTR,LPCSTR); -BOOL WINAPI WritePrivateProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR,LPCWSTR); -BOOL WINAPI WritePrivateProfileStructA(LPCSTR,LPCSTR,LPVOID,UINT,LPCSTR); -BOOL WINAPI WritePrivateProfileStructW(LPCWSTR,LPCWSTR,LPVOID,UINT,LPCWSTR); +BOOL WINAPI WritePrivateProfileSectionA(_In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_opt_ LPCSTR); +BOOL WINAPI WritePrivateProfileSectionW(_In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR); +BOOL WINAPI WritePrivateProfileStringA(_In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_opt_ LPCSTR); +BOOL WINAPI WritePrivateProfileStringW(_In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR); + +BOOL +WINAPI +WritePrivateProfileStructA( + _In_ LPCSTR lpszSection, + _In_ LPCSTR lpszKey, + _In_reads_bytes_opt_(uSizeStruct) LPVOID lpStruct, + _In_ UINT uSizeStruct, + _In_opt_ LPCSTR szFile); + +BOOL +WINAPI +WritePrivateProfileStructW( + _In_ LPCWSTR lpszSection, + _In_ LPCWSTR lpszKey, + _In_reads_bytes_opt_(uSizeStruct) LPVOID lpStruct, + _In_ UINT uSizeStruct, + _In_opt_ LPCWSTR szFile); + BOOL WINAPI WriteProcessMemory(HANDLE,LPVOID,LPCVOID,SIZE_T,SIZE_T*); -BOOL WINAPI WriteProfileSectionA(LPCSTR,LPCSTR); -BOOL WINAPI WriteProfileSectionW(LPCWSTR,LPCWSTR); -BOOL WINAPI WriteProfileStringA(LPCSTR,LPCSTR,LPCSTR); -BOOL WINAPI WriteProfileStringW(LPCWSTR,LPCWSTR,LPCWSTR); -DWORD WINAPI WriteTapemark(HANDLE,DWORD,DWORD,BOOL); +BOOL WINAPI WriteProfileSectionA(_In_ LPCSTR, _In_ LPCSTR); +BOOL WINAPI WriteProfileSectionW(_In_ LPCWSTR, _In_ LPCWSTR); +BOOL WINAPI WriteProfileStringA(_In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_opt_ LPCSTR); +BOOL WINAPI WriteProfileStringW(_In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR); +DWORD WINAPI WriteTapemark(_In_ HANDLE, _In_ DWORD, _In_ DWORD, _In_ BOOL); #define Yield() #if (_WIN32_WINNT >= 0x0501) -BOOL WINAPI ZombifyActCtx(HANDLE); +BOOL WINAPI ZombifyActCtx(_Inout_ HANDLE); #endif + #if (_WIN32_WINNT >= 0x0500) -BOOL WINAPI AllocateUserPhysicalPages(HANDLE,PULONG_PTR,PULONG_PTR); -BOOL WINAPI FreeUserPhysicalPages(HANDLE,PULONG_PTR,PULONG_PTR); -BOOL WINAPI MapUserPhysicalPages(PVOID,ULONG_PTR,PULONG_PTR); -BOOL WINAPI MapUserPhysicalPagesScatter(PVOID*,ULONG_PTR,PULONG_PTR); + +BOOL +WINAPI +AllocateUserPhysicalPages( + _In_ HANDLE hProcess, + _Inout_ PULONG_PTR NumberOfPages, + _Out_writes_to_(*NumberOfPages, *NumberOfPages) PULONG_PTR PageArray); + +BOOL +WINAPI +FreeUserPhysicalPages( + _In_ HANDLE hProcess, + _Inout_ PULONG_PTR NumberOfPages, + _In_reads_(*NumberOfPages) PULONG_PTR PageArray); + +BOOL +WINAPI +MapUserPhysicalPages( + _In_ PVOID VirtualAddress, + _In_ ULONG_PTR NumberOfPages, + _In_reads_opt_(NumberOfPages) PULONG_PTR PageArray); + +BOOL +WINAPI +MapUserPhysicalPagesScatter( + _In_reads_(NumberOfPages) PVOID *VirtualAddresses, + _In_ ULONG_PTR NumberOfPages, + _In_reads_opt_(NumberOfPages) PULONG_PTR PageArray); + #endif #ifdef UNICODE From e724bc458250ff4eec5982352fb866458c02b3c7 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Wed, 25 Jan 2012 00:09:43 +0000 Subject: [PATCH 075/289] [NTOSKRNL] - Fix some DPRINTs. Spotted by VS11. svn path=/trunk/; revision=55161 --- reactos/ntoskrnl/cache/section/io.c | 14 +++++++------- reactos/ntoskrnl/cc/view.c | 2 +- reactos/ntoskrnl/include/internal/i386/trap_x.h | 2 +- reactos/ntoskrnl/include/internal/ob_x.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/cache/section/io.c b/reactos/ntoskrnl/cache/section/io.c index 5d8c1f02987..8de79bf9b05 100644 --- a/reactos/ntoskrnl/cache/section/io.c +++ b/reactos/ntoskrnl/cache/section/io.c @@ -74,11 +74,11 @@ MiSimpleReadComplete PMDL Mdl = Irp->MdlAddress; /* Unlock MDL Pages, page 167. */ - DPRINT("MiSimpleReadComplete %x\n", Irp); + DPRINT("MiSimpleReadComplete %p\n", Irp); while (Mdl) { - DPRINT("MDL Unlock %x\n", Mdl); - MmUnlockPages(Mdl); + DPRINT("MDL Unlock %p\n", Mdl); + MmUnlockPages(Mdl); Mdl = Mdl->Next; } @@ -123,8 +123,8 @@ MiSimpleRead ASSERT(DeviceObject); DPRINT - ("PAGING READ: FileObject %x <%wZ> Offset %08x%08x Length %d\n", - &FileObject, + ("PAGING READ: FileObject %p <%wZ> Offset %08x%08x Length %d\n", + FileObject, &FileObject->FileName, FileOffset->HighPart, FileOffset->LowPart, @@ -215,8 +215,8 @@ _MiSimpleWrite ASSERT(DeviceObject); DPRINT - ("PAGING WRITE: FileObject %x Offset %x Length %d (%s:%d)\n", - &FileObject, + ("PAGING WRITE: FileObject %p Offset %x Length %d (%s:%d)\n", + FileObject, FileOffset->LowPart, Length, File, diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index 72ef668ebc6..b55b4ad22e1 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -866,7 +866,7 @@ CcRosGetCacheSegment(PBCB Bcb, */ *UptoDate = current->Valid; *BaseAddress = current->BaseAddress; - DPRINT("*BaseAddress 0x%.8X\n", *BaseAddress); + DPRINT("*BaseAddress %p\n", *BaseAddress); *CacheSeg = current; *BaseOffset = current->FileOffset; return(STATUS_SUCCESS); diff --git a/reactos/ntoskrnl/include/internal/i386/trap_x.h b/reactos/ntoskrnl/include/internal/i386/trap_x.h index 2f3922585ef..35e1fa95019 100644 --- a/reactos/ntoskrnl/include/internal/i386/trap_x.h +++ b/reactos/ntoskrnl/include/internal/i386/trap_x.h @@ -64,7 +64,7 @@ KiDumpTrapFrame(IN PKTRAP_FRAME TrapFrame) DbgPrint("Ecx: %x\n", TrapFrame->Ecx); DbgPrint("Eax: %x\n", TrapFrame->Eax); DbgPrint("PreviousPreviousMode: %x\n", TrapFrame->PreviousPreviousMode); - DbgPrint("ExceptionList: %x\n", TrapFrame->ExceptionList); + DbgPrint("ExceptionList: %p\n", TrapFrame->ExceptionList); DbgPrint("SegFs: %x\n", TrapFrame->SegFs); DbgPrint("Edi: %x\n", TrapFrame->Edi); DbgPrint("Esi: %x\n", TrapFrame->Esi); diff --git a/reactos/ntoskrnl/include/internal/ob_x.h b/reactos/ntoskrnl/include/internal/ob_x.h index d3966ed1a3e..b64ae13af6d 100644 --- a/reactos/ntoskrnl/include/internal/ob_x.h +++ b/reactos/ntoskrnl/include/internal/ob_x.h @@ -398,7 +398,7 @@ ObpCalloutEnd(IN KIRQL CalloutIrql, if (CalloutIrql != KeGetCurrentIrql()) { /* Print error */ - DbgPrint("OB: ObjectType: %wZ Procedure: %s Object: %08x\n", + DbgPrint("OB: ObjectType: %wZ Procedure: %s Object: %p\n", &ObjectType->Name, Procedure, Object); DbgPrint(" Returned at %x IRQL, but was called at %x IRQL\n", KeGetCurrentIrql(), CalloutIrql); From bd7ee662854d7c454ef38d9460d5e667f8c724cf Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Wed, 25 Jan 2012 00:12:18 +0000 Subject: [PATCH 076/289] [WS2_32] - Fix invalid AQ_WIN16 comparisons. Spotted by you-know-what. Fix taken from Wine. svn path=/trunk/; revision=55162 --- reactos/dll/win32/ws2_32/misc/async.c | 70 +++++++++++++-------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/reactos/dll/win32/ws2_32/misc/async.c b/reactos/dll/win32/ws2_32/misc/async.c index 7a1ee9f776b..0715f014f76 100644 --- a/reactos/dll/win32/ws2_32/misc/async.c +++ b/reactos/dll/win32/ws2_32/misc/async.c @@ -200,31 +200,23 @@ static int WS_copy_he(char *p_to,char *p_base,int t_size,struct hostent* p_he, i WS_hostent *p_to32 = (WS_hostent*)p_to; int size = hostent_size(p_he) + ( - (flag & AQ_WIN16) ? sizeof(struct ws_hostent16) : sizeof(WS_hostent) + (flag & AQ_WIN32) ? sizeof(WS_hostent) : sizeof(struct ws_hostent16) - sizeof(struct hostent) ); if (t_size < size) return -size; p = p_to; - p += (flag & AQ_WIN16) ? - sizeof(struct ws_hostent16) : sizeof(WS_hostent); + p += (flag & AQ_WIN32) ? + sizeof(WS_hostent) : sizeof(struct ws_hostent16); p_name = p; strcpy(p, p_he->h_name); p += strlen(p) + 1; p_aliases = p; - p += list_dup(p_he->h_aliases, p, p_base + (p - (char*)p_to), 0); + p += list_dup(p_he->h_aliases, p, p_base + (p - p_to), 0); p_addr = p; - list_dup(p_he->h_addr_list, p, p_base + (p - (char*)p_to), p_he->h_length); + list_dup(p_he->h_addr_list, p, p_base + (p - p_to), p_he->h_length); - if (flag & AQ_WIN16) - { - p_to16->h_addrtype = (INT16)p_he->h_addrtype; - p_to16->h_length = (INT16)p_he->h_length; - p_to16->h_name = (SEGPTR)(p_base + (p_name - p_to)); - p_to16->h_aliases = (SEGPTR)(p_base + (p_aliases - p_to)); - p_to16->h_addr_list = (SEGPTR)(p_base + (p_addr - p_to)); - } - else + if (flag & AQ_WIN32) { p_to32->h_addrtype = p_he->h_addrtype; p_to32->h_length = p_he->h_length; @@ -232,6 +224,14 @@ static int WS_copy_he(char *p_to,char *p_base,int t_size,struct hostent* p_he, i p_to32->h_aliases = (char **)(p_base + (p_aliases - p_to)); p_to32->h_addr_list = (char **)(p_base + (p_addr - p_to)); } + else + { + p_to16->h_addrtype = (INT16)p_he->h_addrtype; + p_to16->h_length = (INT16)p_he->h_length; + p_to16->h_name = (SEGPTR)(p_base + (p_name - p_to)); + p_to16->h_aliases = (SEGPTR)(p_base + (p_aliases - p_to)); + p_to16->h_addr_list = (SEGPTR)(p_base + (p_addr - p_to)); + } return size; } @@ -258,32 +258,31 @@ static int WS_copy_pe(char *p_to,char *p_base,int t_size,struct protoent* p_pe, WS_protoent *p_to32 = (WS_protoent*)p_to; int size = protoent_size(p_pe) + ( - (flag & AQ_WIN16) ? sizeof(struct ws_protoent16) : sizeof(WS_protoent) + (flag & AQ_WIN32) ? sizeof(WS_protoent) : sizeof(struct ws_protoent16) - sizeof(struct protoent) ); if (t_size < size) return -size; p = p_to; - p += (flag & AQ_WIN16) ? - sizeof(struct ws_protoent16) : sizeof(WS_protoent); + p += (flag & AQ_WIN32) ? sizeof(WS_protoent) : sizeof(struct ws_protoent16); p_name = p; strcpy(p, p_pe->p_name); p += strlen(p) + 1; p_aliases = p; - list_dup(p_pe->p_aliases, p, p_base + (p - (char*)p_to), 0); + list_dup(p_pe->p_aliases, p, p_base + (p - p_to), 0); - if (flag & AQ_WIN16) - { - p_to16->p_proto = (INT16)p_pe->p_proto; - p_to16->p_name = (SEGPTR)(p_base) + (p_name - p_to); - p_to16->p_aliases = (SEGPTR)((p_base) + (p_aliases - p_to)); - } - else + if (flag & AQ_WIN32) { p_to32->p_proto = p_pe->p_proto; p_to32->p_name = (p_base) + (p_name - p_to); p_to32->p_aliases = (char **)((p_base) + (p_aliases - p_to)); } + else + { + p_to16->p_proto = (INT16)p_pe->p_proto; + p_to16->p_name = (SEGPTR)(p_base) + (p_name - p_to); + p_to16->p_aliases = (SEGPTR)((p_base) + (p_aliases - p_to)); + } return size; } @@ -312,15 +311,14 @@ static int WS_copy_se(char *p_to,char *p_base,int t_size,struct servent* p_se, i WS_servent *p_to32 = (WS_servent*)p_to; int size = servent_size(p_se) + ( - (flag & AQ_WIN16) ? sizeof(struct ws_servent16) : sizeof(WS_servent) + (flag & AQ_WIN32) ? sizeof(WS_servent) : sizeof(struct ws_servent16) - sizeof(struct servent) ); if (t_size < size) return -size; p = p_to; - p += (flag & AQ_WIN16) ? - sizeof(struct ws_servent16) : sizeof(WS_servent); + p += (flag & AQ_WIN32) ? sizeof(WS_servent) : sizeof(struct ws_servent16); p_name = p; strcpy(p, p_se->s_name); p += strlen(p) + 1; p_proto = p; @@ -328,20 +326,20 @@ static int WS_copy_se(char *p_to,char *p_base,int t_size,struct servent* p_se, i p_aliases = p; list_dup(p_se->s_aliases, p, p_base + (p - p_to), 0); - if (flag & AQ_WIN16) - { - p_to16->s_port = (INT16)p_se->s_port; - p_to16->s_name = (SEGPTR)(p_base + (p_name - p_to)); - p_to16->s_proto = (SEGPTR)(p_base + (p_proto - p_to)); - p_to16->s_aliases = (SEGPTR)(p_base + (p_aliases - p_to)); - } - else + if (flag & AQ_WIN32) { p_to32->s_port = p_se->s_port; p_to32->s_name = (p_base + (p_name - p_to)); p_to32->s_proto = (p_base + (p_proto - p_to)); p_to32->s_aliases = (char **)(p_base + (p_aliases - p_to)); } + else + { + p_to16->s_port = (INT16)p_se->s_port; + p_to16->s_name = (SEGPTR)(p_base + (p_name - p_to)); + p_to16->s_proto = (SEGPTR)(p_base + (p_proto - p_to)); + p_to16->s_aliases = (SEGPTR)(p_base + (p_aliases - p_to)); + } return size; } From a802e528e27beeeb7c7c04ecacdd803069229978 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Wed, 25 Jan 2012 00:15:18 +0000 Subject: [PATCH 077/289] [MCICDA] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55163 --- reactos/dll/win32/mcicda/mcicda.c | 287 ++++++++++++++++-------------- reactos/media/doc/README.WINE | 2 +- 2 files changed, 151 insertions(+), 138 deletions(-) diff --git a/reactos/dll/win32/mcicda/mcicda.c b/reactos/dll/win32/mcicda/mcicda.c index 4f88928917d..1ea9a58f25d 100644 --- a/reactos/dll/win32/mcicda/mcicda.c +++ b/reactos/dll/win32/mcicda/mcicda.c @@ -33,7 +33,6 @@ #include "wownt32.h" #include "mmddk.h" #include "winioctl.h" -#define __NTDDSTOR_H /* ROS HACK */ #include "ntddcdrm.h" #include "winternl.h" #include "wine/debug.h" @@ -59,7 +58,7 @@ typedef struct { UINT wDevID; int nUseCount; /* Incremented for each shared open */ BOOL fShareable; /* TRUE if first open was shareable */ - WORD wNotifyDeviceID; /* MCI device ID with a pending notification */ + MCIDEVICEID wNotifyDeviceID; /* MCI device ID with a pending notification */ HANDLE hCallback; /* Callback handle for pending notification */ DWORD dwTimeFormat; HANDLE handle; @@ -142,17 +141,12 @@ static DWORD CALLBACK MCICDA_playLoop(void *ptr) IDirectSoundBuffer_Stop(wmcda->dsBuf); SetEvent(wmcda->stopEvent); - EnterCriticalSection(&wmcda->cs); - if (wmcda->hCallback) { - mciDriverNotify(wmcda->hCallback, wmcda->wNotifyDeviceID, - FAILED(hr) ? MCI_NOTIFY_FAILURE : - ((endPos!=lastPos) ? MCI_NOTIFY_ABORTED : - MCI_NOTIFY_SUCCESSFUL)); - wmcda->hCallback = NULL; - } - LeaveCriticalSection(&wmcda->cs); + /* A design bug in native: the independent CD player called by the + * MCI has no means to signal end of playing, therefore the MCI + * notification is left hanging. MCI_NOTIFY_SUPERSEDED will be + * signaled by the next command that has MCI_NOTIFY set (or + * MCI_NOTIFY_ABORTED for MCI_PLAY). */ - ExitThread(0); return 0; } @@ -167,6 +161,7 @@ static DWORD MCICDA_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp) WINE_MCICDAUDIO* wmcda; if (!modp) return 0xFFFFFFFF; + /* FIXME: MCIERR_CANNOT_LOAD_DRIVER if there's no drive of type CD-ROM */ wmcda = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WINE_MCICDAUDIO)); @@ -184,6 +179,7 @@ static DWORD MCICDA_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp) modp->wCustomCommandTable = MCI_NO_COMMAND_TABLE; modp->wType = MCI_DEVTYPE_CD_AUDIO; InitializeCriticalSection(&wmcda->cs); + wmcda->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": WINE_MCICDAUDIO.cs"); return modp->wDeviceID; } @@ -195,6 +191,7 @@ static DWORD MCICDA_drvClose(DWORD dwDevID) WINE_MCICDAUDIO* wmcda = (WINE_MCICDAUDIO*)mciGetDriverData(dwDevID); if (wmcda) { + wmcda->cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&wmcda->cs); HeapFree(GetProcessHeap(), 0, wmcda); mciSetDriverData(dwDevID, 0); @@ -216,6 +213,20 @@ static WINE_MCICDAUDIO* MCICDA_GetOpenDrv(UINT wDevID) return wmcda; } +/************************************************************************** + * MCICDA_mciNotify [internal] + * + * Notifications in MCI work like a 1-element queue. + * Each new notification request supersedes the previous one. + */ +static void MCICDA_Notify(DWORD_PTR hWndCallBack, WINE_MCICDAUDIO* wmcda, UINT wStatus) +{ + MCIDEVICEID wDevID = wmcda->wNotifyDeviceID; + HANDLE old = InterlockedExchangePointer(&wmcda->hCallback, NULL); + if (old) mciDriverNotify(old, wDevID, MCI_NOTIFY_SUPERSEDED); + mciDriverNotify(HWND_32(LOWORD(hWndCallBack)), wDevID, wStatus); +} + /************************************************************************** * MCICDA_GetStatus [internal] */ @@ -270,6 +281,7 @@ static int MCICDA_GetError(WINE_MCICDAUDIO* wmcda) switch (GetLastError()) { case ERROR_NOT_READY: return MCIERR_DEVICE_NOT_READY; + case ERROR_NOT_SUPPORTED: case ERROR_IO_DEVICE: return MCIERR_HARDWARE; default: FIXME("Unknown mode %u\n", GetLastError()); @@ -384,7 +396,6 @@ static DWORD MCICDA_CalcTime(WINE_MCICDAUDIO* wmcda, DWORD tf, DWORD dwFrame, LP return dwTime; } -static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms); static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms); /************************************************************************** @@ -392,11 +403,10 @@ static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms */ static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenParms) { - DWORD dwDeviceID; - DWORD ret = MCIERR_HARDWARE; + MCIDEVICEID dwDeviceID; + DWORD ret; WINE_MCICDAUDIO* wmcda = (WINE_MCICDAUDIO*)mciGetDriverData(wDevID); WCHAR root[7], drive = 0; - unsigned int count; TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpOpenParms); @@ -420,33 +430,32 @@ 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); - ret = MCIERR_NO_ELEMENT_ALLOWED; + ret = MCIERR_FLAGS_NOT_COMPATIBLE; goto the_error; } TRACE("MCI_OPEN_ELEMENT element name: %s\n", debugstr_w(lpOpenParms->lpstrElementName)); - if (!isalpha(lpOpenParms->lpstrElementName[0]) || lpOpenParms->lpstrElementName[1] != ':' || - (lpOpenParms->lpstrElementName[2] && lpOpenParms->lpstrElementName[2] != '\\')) + /* Only the first letter counts since w2k + * Win9x-NT accept only d: and w98SE accepts d:\foobar as well. + * Play d:\Track03.cda plays from the first track, not #3. */ + if (!isalpha(lpOpenParms->lpstrElementName[0])) { - WARN("MCI_OPEN_ELEMENT unsupported format: %s\n", - debugstr_w(lpOpenParms->lpstrElementName)); - ret = MCIERR_NO_ELEMENT_ALLOWED; + ret = MCIERR_INVALID_FILE; goto the_error; } drive = toupper(lpOpenParms->lpstrElementName[0]); root[0] = drive; root[1] = ':'; root[2] = '\\'; root[3] = '\0'; if (GetDriveTypeW(root) != DRIVE_CDROM) { - ret = MCIERR_INVALID_DEVICE_NAME; + ret = MCIERR_INVALID_FILE; goto the_error; } } else { - /* drive letter isn't passed... get the dwDeviceID'th cdrom in the system */ root[0] = 'A'; root[1] = ':'; root[2] = '\\'; root[3] = '\0'; - for (count = 0; root[0] <= 'Z'; root[0]++) + for ( ; root[0] <= 'Z'; root[0]++) { - if (GetDriveTypeW(root) == DRIVE_CDROM && ++count >= dwDeviceID) + if (GetDriveTypeW(root) == DRIVE_CDROM) { drive = root[0]; break; @@ -454,7 +463,7 @@ static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenPar } if (!drive) { - ret = MCIERR_INVALID_DEVICE_ID; + ret = MCIERR_CANNOT_LOAD_DRIVER; /* drvOpen should return this */ goto the_error; } } @@ -466,12 +475,14 @@ static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenPar root[0] = root[1] = '\\'; root[2] = '.'; root[3] = '\\'; root[4] = drive; root[5] = ':'; root[6] = '\0'; wmcda->handle = CreateFileW(root, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0); if (wmcda->handle == INVALID_HANDLE_VALUE) + { + ret = MCIERR_MUST_USE_SHAREABLE; goto the_error; + } if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpOpenParms->dwCallback); mciDriverNotify(HWND_32(LOWORD(lpOpenParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); + dwDeviceID, MCI_NOTIFY_SUCCESSFUL); } return 0; @@ -496,6 +507,8 @@ static DWORD MCICDA_Close(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParm if (--wmcda->nUseCount == 0) { CloseHandle(wmcda->handle); } + if ((dwParam & MCI_NOTIFY) && lpParms) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -505,11 +518,13 @@ static DWORD MCICDA_Close(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParm static DWORD MCICDA_GetDevCaps(UINT wDevID, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms) { + WINE_MCICDAUDIO* wmcda = (WINE_MCICDAUDIO*)mciGetDriverData(wDevID); DWORD ret = 0; TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_GETDEVCAPS_ITEM) { TRACE("MCI_GETDEVCAPS_ITEM dwItem=%08X;\n", lpParms->dwItem); @@ -552,14 +567,17 @@ static DWORD MCICDA_GetDevCaps(UINT wDevID, DWORD dwFlags, ret = MCI_RESOURCE_RETURNED; break; default: - ERR("Unsupported %x devCaps item\n", lpParms->dwItem); - return MCIERR_UNRECOGNIZED_COMMAND; + WARN("Unsupported %x devCaps item\n", lpParms->dwItem); + return MCIERR_UNSUPPORTED_FUNCTION; } } else { TRACE("No GetDevCaps-Item !\n"); - return MCIERR_UNRECOGNIZED_COMMAND; + return MCIERR_MISSING_PARAMETER; } TRACE("lpParms->dwReturn=%08X;\n", lpParms->dwReturn); + if (dwFlags & MCI_NOTIFY) { + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); + } return ret; } @@ -632,19 +650,19 @@ static DWORD MCICDA_Info(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms) str = buffer; } else { WARN("Don't know this info command (%u)\n", dwFlags); - ret = MCIERR_UNRECOGNIZED_COMMAND; + ret = MCIERR_MISSING_PARAMETER; } - if (str) { - if (lpParms->dwRetSize <= strlenW(str)) { - lstrcpynW(lpParms->lpstrReturn, str, lpParms->dwRetSize - 1); - ret = MCIERR_PARAM_OVERFLOW; - } else { - strcpyW(lpParms->lpstrReturn, str); - } - } else { - *lpParms->lpstrReturn = 0; + if (!ret) { + TRACE("=> %s\n", debugstr_w(str)); + if (lpParms->dwRetSize) { + WCHAR zero = 0; + /* FIXME? Since NT, mciwave, mciseq and mcicda set dwRetSize + * to the number of characters written, excluding \0. */ + lstrcpynW(lpParms->lpstrReturn, str ? str : &zero, lpParms->dwRetSize); + } else ret = MCIERR_PARAM_OVERFLOW; } - TRACE("=> %s (%d)\n", debugstr_w(lpParms->lpstrReturn), ret); + if (MMSYSERR_NOERROR==ret && (dwFlags & MCI_NOTIFY)) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return ret; } @@ -665,11 +683,6 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; - if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } if (dwFlags & MCI_STATUS_ITEM) { TRACE("dwItem = %x\n", lpParms->dwItem); switch (lpParms->dwItem) { @@ -679,6 +692,7 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm &data, sizeof(data), &br, NULL)) { return MCICDA_GetError(wmcda); + /* alt. data.CurrentPosition.TrackNumber = 1; -- what native yields */ } lpParms->dwReturn = data.CurrentPosition.TrackNumber; TRACE("CURRENT_TRACK=%lu\n", lpParms->dwReturn); @@ -737,7 +751,8 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm return MCICDA_GetError(wmcda); break; case MCI_STATUS_POSITION: - if (dwFlags & MCI_STATUS_START) { + switch (dwFlags & (MCI_STATUS_START | MCI_TRACK)) { + case MCI_STATUS_START: if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0, &toc, sizeof(toc), &br, NULL)) { WARN("error reading TOC !\n"); @@ -745,7 +760,8 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm } lpParms->dwReturn = FRAME_OF_TOC(toc, toc.FirstTrack); TRACE("get MCI_STATUS_START !\n"); - } else if (dwFlags & MCI_TRACK) { + break; + case MCI_TRACK: if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0, &toc, sizeof(toc), &br, NULL)) { WARN("error reading TOC !\n"); @@ -755,13 +771,17 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm return MCIERR_OUTOFRANGE; lpParms->dwReturn = FRAME_OF_TOC(toc, lpParms->dwTrack); TRACE("get MCI_TRACK #%u !\n", lpParms->dwTrack); - } else { + break; + case 0: fmt.Format = IOCTL_CDROM_CURRENT_POSITION; if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_Q_CHANNEL, &fmt, sizeof(fmt), &data, sizeof(data), &br, NULL)) { return MCICDA_GetError(wmcda); } lpParms->dwReturn = FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress); + break; + default: + return MCIERR_FLAGS_NOT_COMPATIBLE; } lpParms->dwReturn = MCICDA_CalcTime(wmcda, wmcda->dwTimeFormat, lpParms->dwReturn, &ret); TRACE("MCI_STATUS_POSITION=%08lX\n", lpParms->dwReturn); @@ -801,16 +821,17 @@ static DWORD MCICDA_Status(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParm else lpParms->dwReturn = (toc.TrackData[lpParms->dwTrack - toc.FirstTrack].Control & 0x04) ? MCI_CDA_TRACK_OTHER : MCI_CDA_TRACK_AUDIO; + /* FIXME: MAKEMCIRESOURCE "audio" | "other", localised */ } TRACE("MCI_CDA_STATUS_TYPE_TRACK[%d]=%ld\n", lpParms->dwTrack, lpParms->dwReturn); break; default: FIXME("unknown command %08X !\n", lpParms->dwItem); - return MCIERR_UNRECOGNIZED_COMMAND; + return MCIERR_UNSUPPORTED_FUNCTION; } - } else { - WARN("not MCI_STATUS_ITEM !\n"); - } + } else return MCIERR_MISSING_PARAMETER; + if ((dwFlags & MCI_NOTIFY) && HRESULT_CODE(ret)==0) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return ret; } @@ -827,24 +848,23 @@ static DWORD MCICDA_SkipDataTracks(WINE_MCICDAUDIO* wmcda,DWORD *frame) WARN("error reading TOC !\n"); return MCICDA_GetError(wmcda); } - /* Locate first track whose starting frame is bigger than frame */ - for(i=toc.FirstTrack;i<=toc.LastTrack+1;i++) - if ( FRAME_OF_TOC(toc, i) > *frame ) break; - if (i <= toc.FirstTrack && i>toc.LastTrack+1) { - i = 0; /* requested address is out of range: go back to start */ - *frame = FRAME_OF_TOC(toc,toc.FirstTrack); - } - else - i--; + if (*frame < FRAME_OF_TOC(toc,toc.FirstTrack) || + *frame >= FRAME_OF_TOC(toc,toc.LastTrack+1)) /* lead-out */ + return MCIERR_OUTOFRANGE; + for(i=toc.LastTrack+1;i>toc.FirstTrack;i--) + if ( FRAME_OF_TOC(toc, i) <= *frame ) break; /* i points to last track whose start address is not greater than frame. * Now skip non-audio tracks */ - for(;i<=toc.LastTrack+1;i++) + for(;i<=toc.LastTrack;i++) if ( ! (toc.TrackData[i-toc.FirstTrack].Control & 4) ) break; /* The frame will be an address in the next audio track or * address of lead-out. */ if ( FRAME_OF_TOC(toc, i) > *frame ) *frame = FRAME_OF_TOC(toc, i); + /* Lead-out is an invalid seek position (on Linux as well). */ + if (*frame == FRAME_OF_TOC(toc,toc.LastTrack+1)) + (*frame)--; return 0; } @@ -855,6 +875,7 @@ static DWORD MCICDA_Play(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) { WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID); DWORD ret = 0, start, end; + HANDLE oldcb; DWORD br; CDROM_PLAY_AUDIO_MSF play; CDROM_SUB_Q_DATA_FORMAT fmt; @@ -892,12 +913,27 @@ static DWORD MCICDA_Play(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) } if (dwFlags & MCI_TO) { end = MCICDA_CalcFrame(wmcda, lpParms->dwTo); + if ( (ret=MCICDA_SkipDataTracks(wmcda, &end)) ) + return ret; TRACE("MCI_TO=%08X -> %u\n", lpParms->dwTo, end); } else { end = FRAME_OF_TOC(toc, toc.LastTrack + 1) - 1; } + if (end < start) return MCIERR_OUTOFRANGE; TRACE("Playing from %u to %u\n", start, end); + oldcb = InterlockedExchangePointer(&wmcda->hCallback, + (dwFlags & MCI_NOTIFY) ? HWND_32(LOWORD(lpParms->dwCallback)) : NULL); + if (oldcb) mciDriverNotify(oldcb, wmcda->wNotifyDeviceID, MCI_NOTIFY_ABORTED); + + if (start == end || start == FRAME_OF_TOC(toc,toc.LastTrack+1)-1) { + if (dwFlags & MCI_NOTIFY) { + oldcb = InterlockedExchangePointer(&wmcda->hCallback, NULL); + if (oldcb) mciDriverNotify(oldcb, wDevID, MCI_NOTIFY_SUCCESSFUL); + } + return MMSYSERR_NOERROR; + } + if (wmcda->hThread != 0) { SetEvent(wmcda->stopEvent); WaitForSingleObject(wmcda->hThread, INFINITE); @@ -913,14 +949,6 @@ static DWORD MCICDA_Play(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) IDirectSound_Release(wmcda->dsObj); wmcda->dsObj = NULL; } - else if(wmcda->hCallback) { - mciDriverNotify(wmcda->hCallback, wmcda->wNotifyDeviceID, - MCI_NOTIFY_ABORTED); - wmcda->hCallback = NULL; - } - - if ((dwFlags&MCI_NOTIFY)) - wmcda->hCallback = HWND_32(LOWORD(lpParms->dwCallback)); if (pDirectSoundCreate) { WAVEFORMATEX format; @@ -980,8 +1008,15 @@ static DWORD MCICDA_Play(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) wmcda->hThread = CreateThread(NULL, 0, MCICDA_playLoop, wmcda, 0, &br); if (wmcda->hThread != 0) { hr = IDirectSoundBuffer_Play(wmcda->dsBuf, 0, 0, DSBPLAY_LOOPING); - if (SUCCEEDED(hr)) + if (SUCCEEDED(hr)) { + /* FIXME: implement MCI_WAIT and send notification only in that case */ + if (0) { + oldcb = InterlockedExchangePointer(&wmcda->hCallback, NULL); + if (oldcb) mciDriverNotify(oldcb, wmcda->wNotifyDeviceID, + FAILED(hr) ? MCI_NOTIFY_FAILURE : MCI_NOTIFY_SUCCESSFUL); + } return ret; + } SetEvent(wmcda->stopEvent); WaitForSingleObject(wmcda->hThread, INFINITE); @@ -1014,13 +1049,9 @@ static DWORD MCICDA_Play(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) NULL, 0, &br, NULL)) { wmcda->hCallback = NULL; ret = MCIERR_HARDWARE; - } else if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - /* - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - */ } + /* The independent CD player has no means to signal MCI_NOTIFY when it's done. + * Native sends a notification with MCI_WAIT only. */ return ret; } @@ -1030,12 +1061,16 @@ static DWORD MCICDA_Play(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID); + HANDLE oldcb; DWORD br; TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; + oldcb = InterlockedExchangePointer(&wmcda->hCallback, NULL); + if (oldcb) mciDriverNotify(oldcb, wmcda->wNotifyDeviceID, MCI_NOTIFY_ABORTED); + if (wmcda->hThread != 0) { SetEvent(wmcda->stopEvent); WaitForSingleObject(wmcda->hThread, INFINITE); @@ -1053,16 +1088,8 @@ static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms else if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_STOP_AUDIO, NULL, 0, NULL, 0, &br, NULL)) return MCIERR_HARDWARE; - if (wmcda->hCallback) { - mciDriverNotify(wmcda->hCallback, wmcda->wNotifyDeviceID, MCI_NOTIFY_ABORTED); - wmcda->hCallback = NULL; - } - - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if ((dwFlags & MCI_NOTIFY) && lpParms) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -1072,12 +1099,16 @@ static DWORD MCICDA_Stop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms static DWORD MCICDA_Pause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID); + HANDLE oldcb; DWORD br; TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; + oldcb = InterlockedExchangePointer(&wmcda->hCallback, NULL); + if (oldcb) mciDriverNotify(oldcb, wmcda->wNotifyDeviceID, MCI_NOTIFY_ABORTED); + if (wmcda->hThread != 0) { /* Don't bother calling stop if the playLoop thread has already stopped */ if(WaitForSingleObject(wmcda->stopEvent, 0) != WAIT_OBJECT_0 && @@ -1087,18 +1118,8 @@ static DWORD MCICDA_Pause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParm else if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_PAUSE_AUDIO, NULL, 0, NULL, 0, &br, NULL)) return MCIERR_HARDWARE; - EnterCriticalSection(&wmcda->cs); - if (wmcda->hCallback) { - mciDriverNotify(wmcda->hCallback, wmcda->wNotifyDeviceID, MCI_NOTIFY_SUPERSEDED); - wmcda->hCallback = NULL; - } - LeaveCriticalSection(&wmcda->cs); - - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if ((dwFlags & MCI_NOTIFY) && lpParms) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -1123,11 +1144,8 @@ static DWORD MCICDA_Resume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPar else if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_RESUME_AUDIO, NULL, 0, NULL, 0, &br, NULL)) return MCIERR_HARDWARE; - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if ((dwFlags & MCI_NOTIFY) && lpParms) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -1139,7 +1157,7 @@ static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) DWORD at; WINE_MCICDAUDIO* wmcda = MCICDA_GetOpenDrv(wDevID); CDROM_SEEK_AUDIO_MSF seek; - DWORD br, ret; + DWORD br, position, ret; CDROM_TOC toc; TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); @@ -1147,12 +1165,21 @@ static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + position = dwFlags & (MCI_SEEK_TO_START|MCI_SEEK_TO_END|MCI_TO); + if (!position) return MCIERR_MISSING_PARAMETER; + if (position&(position-1)) return MCIERR_FLAGS_NOT_COMPATIBLE; + + /* Stop sends MCI_NOTIFY_ABORTED when needed. + * Tests show that native first sends ABORTED and reads the TOC, + * then only checks the position flags, then stops and seeks. */ + MCICDA_Stop(wDevID, MCI_WAIT, 0); + if (!DeviceIoControl(wmcda->handle, IOCTL_CDROM_READ_TOC, NULL, 0, &toc, sizeof(toc), &br, NULL)) { WARN("error reading TOC !\n"); return MCICDA_GetError(wmcda); } - switch (dwFlags & ~(MCI_NOTIFY|MCI_WAIT)) { + switch (position) { case MCI_SEEK_TO_START: TRACE("Seeking to start\n"); at = FRAME_OF_TOC(toc,toc.FirstTrack); @@ -1161,6 +1188,8 @@ static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) break; case MCI_SEEK_TO_END: TRACE("Seeking to end\n"); + /* End is prior to lead-out + * yet Win9X seeks to even one frame less than that. */ at = FRAME_OF_TOC(toc, toc.LastTrack + 1) - 1; if ( (ret=MCICDA_SkipDataTracks(wmcda, &at)) ) return ret; @@ -1172,18 +1201,10 @@ static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) return ret; break; default: - TRACE("Unknown seek action %08lX\n", - (dwFlags & ~(MCI_NOTIFY|MCI_WAIT))); - return MCIERR_UNSUPPORTED_FUNCTION; + return MCIERR_FLAGS_NOT_COMPATIBLE; } - if (wmcda->hThread != 0) { - EnterCriticalSection(&wmcda->cs); - wmcda->start = at - FRAME_OF_TOC(toc, toc.FirstTrack); - /* Flush remaining data, or just let it play into the new data? */ - LeaveCriticalSection(&wmcda->cs); - } - else { + { seek.M = at / CDFRAMES_PERMIN; seek.S = (at / CDFRAMES_PERSEC) % 60; seek.F = at % CDFRAMES_PERSEC; @@ -1192,11 +1213,8 @@ static DWORD MCICDA_Seek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) return MCIERR_HARDWARE; } - if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if (dwFlags & MCI_NOTIFY) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -1242,7 +1260,6 @@ static DWORD MCICDA_Set(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; /* TRACE("dwTimeFormat=%08lX\n", lpParms->dwTimeFormat); - TRACE("dwAudio=%08lX\n", lpParms->dwAudio); */ if (dwFlags & MCI_SET_TIME_FORMAT) { switch (lpParms->dwTimeFormat) { @@ -1256,20 +1273,15 @@ static DWORD MCICDA_Set(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) TRACE("MCI_FORMAT_TMSF !\n"); break; default: - WARN("bad time format !\n"); return MCIERR_BAD_TIME_FORMAT; } wmcda->dwTimeFormat = lpParms->dwTimeFormat; } - if (dwFlags & MCI_SET_VIDEO) return MCIERR_UNSUPPORTED_FUNCTION; - if (dwFlags & MCI_SET_ON) return MCIERR_UNSUPPORTED_FUNCTION; - if (dwFlags & MCI_SET_OFF) return MCIERR_UNSUPPORTED_FUNCTION; - if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", - lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmcda->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if (dwFlags & MCI_SET_AUDIO) /* one xp machine ignored it */ + TRACE("SET_AUDIO %X %x\n", dwFlags, lpParms->dwAudio); + + if (dwFlags & MCI_NOTIFY) + MCICDA_Notify(lpParms->dwCallback, wmcda, MCI_NOTIFY_SUCCESSFUL); return 0; } @@ -1308,10 +1320,11 @@ LRESULT CALLBACK MCICDA_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, case MCI_SEEK: return MCICDA_Seek(dwDevID, dwParam1, (LPMCI_SEEK_PARMS)dwParam2); /* commands that should report an error as they are not supported in * the native version */ - case MCI_SET_DOOR_CLOSED: - case MCI_SET_DOOR_OPEN: + case MCI_RECORD: case MCI_LOAD: case MCI_SAVE: + return MCIERR_UNSUPPORTED_FUNCTION; + case MCI_BREAK: case MCI_FREEZE: case MCI_PUT: case MCI_REALIZE: diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 626041f82f9..50d847ec655 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -84,7 +84,7 @@ reactos/dll/win32/localui # Autosync reactos/dll/win32/lz32 # Autosync reactos/dll/win32/mapi32 # Autosync reactos/dll/win32/mciavi32 # Synced to Wine-1.3.37 -reactos/dll/win32/mcicda # Autosync +reactos/dll/win32/mcicda # Synced to Wine-1.3.37 reactos/dll/win32/mciqtz32 # Autosync reactos/dll/win32/mciseq # Autosync reactos/dll/win32/mciwave # Autosync From 1ef28d607141cf41c414d29bc651fdf934f5b2d9 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Wed, 25 Jan 2012 11:33:05 +0000 Subject: [PATCH 078/289] [WININET] Add zlib include path / link. svn path=/trunk/; revision=55172 --- reactos/dll/win32/wininet/CMakeLists.txt | 3 ++- reactos/dll/win32/wininet/wininet.rbuild | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/wininet/CMakeLists.txt b/reactos/dll/win32/wininet/CMakeLists.txt index 6ba338ecbbd..9b4873ad40f 100644 --- a/reactos/dll/win32/wininet/CMakeLists.txt +++ b/reactos/dll/win32/wininet/CMakeLists.txt @@ -5,6 +5,7 @@ add_definitions( -Dclose=_close) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +include_directories(${REACTOS_SOURCE_DIR}/lib/3rdparty/zlib) spec2def(wininet.dll wininet.spec) @@ -29,7 +30,7 @@ list(APPEND SOURCE add_library(wininet SHARED ${SOURCE}) set_module_type(wininet win32dll) -target_link_libraries(wininet wine ${PSEH_LIB}) +target_link_libraries(wininet wine ${PSEH_LIB} zlib) add_delay_importlibs(wininet secur32 crypt32) add_importlibs(wininet mpr shlwapi shell32 user32 advapi32 ws2_32 msvcrt kernel32 ntdll) add_cd_file(TARGET wininet DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/wininet/wininet.rbuild b/reactos/dll/win32/wininet/wininet.rbuild index 45b87b18665..ac2c43f7945 100644 --- a/reactos/dll/win32/wininet/wininet.rbuild +++ b/reactos/dll/win32/wininet/wininet.rbuild @@ -6,6 +6,7 @@ . include/reactos/wine + . @@ -22,6 +23,7 @@ secur32 crypt32 ws2_32 + zlib pseh cookie.c dialogs.c From c707066acb9a6e7443e189e39e4827607fe2be03 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 25 Jan 2012 16:45:42 +0000 Subject: [PATCH 079/289] [FREELDR] Fix wrong buffer size calculation that could lead to memory corruption Kudos go to Jardar for debugging the issue. svn path=/trunk/; revision=55173 --- reactos/boot/freeldr/freeldr/arch/i386/hardware.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c index 25a77b31a35..58298cf3597 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/hardware.c @@ -250,7 +250,8 @@ DetectPnpBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) TRACE("Estimated buffer size %u\n", NodeSize * NodeCount); /* Set 'Configuration Data' value */ - Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + (NodeSize * NodeCount); + Size = sizeof(CM_PARTIAL_RESOURCE_LIST) + + sizeof(CM_PNP_BIOS_INSTALLATION_CHECK) + (NodeSize * NodeCount); PartialResourceList = MmHeapAlloc(Size); if (PartialResourceList == NULL) { @@ -268,8 +269,8 @@ DetectPnpBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) PartialResourceList->PartialDescriptors[0].ShareDisposition = CmResourceShareUndetermined; - Ptr = (char *)(((ULONG_PTR)&PartialResourceList->PartialDescriptors[0]) + - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); + /* The buffer starts after PartialResourceList->PartialDescriptors[0] */ + Ptr = (char *)(PartialResourceList + 1); /* Set instalation check data */ memcpy (Ptr, InstData, sizeof(CM_PNP_BIOS_INSTALLATION_CHECK)); @@ -292,6 +293,12 @@ DetectPnpBios(PCONFIGURATION_COMPONENT_DATA SystemKey, ULONG *BusNumber) DeviceNode->Size, DeviceNode->Size); + if (PnpBufferSize + DeviceNode->Size > Size) + { + ERR("Buffer too small!\n"); + break; + } + memcpy (Ptr, DeviceNode, DeviceNode->Size); From 3468e87b38ffcd3090801ede4b00d7b30a421b4b Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 25 Jan 2012 16:56:06 +0000 Subject: [PATCH 080/289] [NTOSKRNL] Refactor KeUpdateSystemTime, improving readability, fixing a concurrency issue and fixing the code for 64 bit. svn path=/trunk/; revision=55174 --- reactos/ntoskrnl/ke/time.c | 129 ++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 66 deletions(-) diff --git a/reactos/ntoskrnl/ke/time.c b/reactos/ntoskrnl/ke/time.c index 49ca79d3a4b..1f83b268253 100644 --- a/reactos/ntoskrnl/ke/time.c +++ b/reactos/ntoskrnl/ke/time.c @@ -21,71 +21,31 @@ BOOLEAN KiTimeAdjustmentEnabled = FALSE; /* FUNCTIONS ******************************************************************/ VOID -FASTCALL -KeUpdateSystemTime(IN PKTRAP_FRAME TrapFrame, - IN ULONG Increment, - IN KIRQL Irql) +FORCEINLINE +KiWriteSystemTime(volatile KSYSTEM_TIME *SystemTime, ULARGE_INTEGER NewTime) { - PKPRCB Prcb = KeGetCurrentPrcb(); - ULARGE_INTEGER CurrentTime, InterruptTime; - ULONG Hand, OldTickCount; +#ifdef _WIN64 + /* Do a single atomic write */ + *(ULONGLONG*)SystemTime = NewTime.QuadPart; +#else + /* Update in 3 steps, so that a reader can recognize partial updates */ + SystemTime->High1Time = NewTime.HighPart; + SystemTime->LowPart = NewTime.LowPart; + SystemTime->High2Time = NewTime.HighPart; +#endif +} - /* Add the increment time to the shared data */ - InterruptTime.HighPart = SharedUserData->InterruptTime.High1Time; - InterruptTime.LowPart = SharedUserData->InterruptTime.LowPart; - InterruptTime.QuadPart += Increment; - SharedUserData->InterruptTime.High1Time = InterruptTime.HighPart; - SharedUserData->InterruptTime.LowPart = InterruptTime.LowPart; - SharedUserData->InterruptTime.High2Time = InterruptTime.HighPart; - - /* Update tick count */ - InterlockedExchangeAdd(&KiTickOffset, -(LONG)Increment); - - /* Check for incomplete tick */ - OldTickCount = KeTickCount.LowPart; - if (KiTickOffset <= 0) - { - /* Update the system time */ - CurrentTime.HighPart = SharedUserData->SystemTime.High1Time; - CurrentTime.LowPart = SharedUserData->SystemTime.LowPart; - CurrentTime.QuadPart += KeTimeAdjustment; - SharedUserData->SystemTime.High2Time = CurrentTime.HighPart; - SharedUserData->SystemTime.LowPart = CurrentTime.LowPart; - SharedUserData->SystemTime.High1Time = CurrentTime.HighPart; - - /* Update the tick count */ - CurrentTime.HighPart = KeTickCount.High1Time; - CurrentTime.LowPart = OldTickCount; - CurrentTime.QuadPart += 1; - KeTickCount.High2Time = CurrentTime.HighPart; - KeTickCount.LowPart = CurrentTime.LowPart; - KeTickCount.High1Time = CurrentTime.HighPart; - - /* Update it in the shared user data */ - SharedUserData->TickCount.High2Time = CurrentTime.HighPart; - SharedUserData->TickCount.LowPart = CurrentTime.LowPart; - SharedUserData->TickCount.High1Time = CurrentTime.HighPart; - - /* Check for timer expiration */ - Hand = OldTickCount & (TIMER_TABLE_SIZE - 1); - if (KiTimerTableListHead[Hand].Time.QuadPart <= InterruptTime.QuadPart) - { - /* Check if we are already doing expiration */ - if (!Prcb->TimerRequest) - { - /* Request a DPC to handle this */ - Prcb->TimerRequest = (ULONG_PTR)TrapFrame; - Prcb->TimerHand = Hand; - HalRequestSoftwareInterrupt(DISPATCH_LEVEL); - } - } - - /* Check for expiration with the new tick count as well */ - OldTickCount++; - } +VOID +FORCEINLINE +KiCheckForTimerExpiration( + PKPRCB Prcb, + PKTRAP_FRAME TrapFrame, + ULARGE_INTEGER InterruptTime) +{ + ULONG Hand; /* Check for timer expiration */ - Hand = OldTickCount & (TIMER_TABLE_SIZE - 1); + Hand = KeTickCount.LowPart & (TIMER_TABLE_SIZE - 1); if (KiTimerTableListHead[Hand].Time.QuadPart <= InterruptTime.QuadPart) { /* Check if we are already doing expiration */ @@ -97,19 +57,56 @@ KeUpdateSystemTime(IN PKTRAP_FRAME TrapFrame, HalRequestSoftwareInterrupt(DISPATCH_LEVEL); } } +} - /* Check if this was a full tick */ - if (KiTickOffset <= 0) +VOID +FASTCALL +KeUpdateSystemTime(IN PKTRAP_FRAME TrapFrame, + IN ULONG Increment, + IN KIRQL Irql) +{ + PKPRCB Prcb = KeGetCurrentPrcb(); + ULARGE_INTEGER CurrentTime, InterruptTime; + LONG OldTickOffset; + + /* Add the increment time to the shared data */ + InterruptTime.QuadPart = *(ULONGLONG*)&SharedUserData->InterruptTime; + InterruptTime.QuadPart += Increment; + KiWriteSystemTime(&SharedUserData->InterruptTime, InterruptTime); + + /* Check for timer expiration */ + KiCheckForTimerExpiration(Prcb, TrapFrame, InterruptTime); + + /* Update the tick offset */ + OldTickOffset = InterlockedExchangeAdd(&KiTickOffset, -(LONG)Increment); + + /* Check for full tick */ + if (OldTickOffset <= (LONG)Increment) { - /* Update the tick offset */ + /* Update the system time */ + CurrentTime.QuadPart = *(ULONGLONG*)&SharedUserData->SystemTime; + CurrentTime.QuadPart += KeTimeAdjustment; + KiWriteSystemTime(&SharedUserData->SystemTime, CurrentTime); + + /* Update the tick count */ + CurrentTime.QuadPart = (*(ULONGLONG*)&KeTickCount) + 1; + KiWriteSystemTime(&KeTickCount, CurrentTime); + + /* Update it in the shared user data */ + KiWriteSystemTime(&SharedUserData->TickCount, CurrentTime); + + /* Check for expiration with the new tick count as well */ + KiCheckForTimerExpiration(Prcb, TrapFrame, InterruptTime); + + /* Reset the tick offset */ KiTickOffset += KeMaximumIncrement; - /* Update system runtime */ + /* Update processor/thread runtime */ KeUpdateRunTime(TrapFrame, Irql); } else { - /* Increase interrupt count and exit */ + /* Increase interrupt count only */ Prcb->InterruptCount++; } From 569369e5497f0b5fbe495a19be4b9f623f1aed1d Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Wed, 25 Jan 2012 19:09:23 +0000 Subject: [PATCH 081/289] [FUSION] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55177 --- reactos/dll/win32/fusion/CMakeLists.txt | 1 + reactos/dll/win32/fusion/asmenum.c | 4 +- reactos/dll/win32/fusion/asmname.c | 54 +++++++++++++++--------- reactos/dll/win32/fusion/fusion.rbuild | 1 + reactos/dll/win32/fusion/fusion_ros.diff | 11 ----- reactos/dll/win32/fusion/fusionpriv.h | 20 ++++----- reactos/dll/win32/fusion/version.rc | 26 ++++++++++++ reactos/media/doc/README.WINE | 4 +- 8 files changed, 77 insertions(+), 44 deletions(-) delete mode 100644 reactos/dll/win32/fusion/fusion_ros.diff create mode 100644 reactos/dll/win32/fusion/version.rc diff --git a/reactos/dll/win32/fusion/CMakeLists.txt b/reactos/dll/win32/fusion/CMakeLists.txt index fc43e3f7bb2..cc8821f6906 100644 --- a/reactos/dll/win32/fusion/CMakeLists.txt +++ b/reactos/dll/win32/fusion/CMakeLists.txt @@ -14,6 +14,7 @@ list(APPEND SOURCE assembly.c fusion.c fusion_main.c + version.rc ${CMAKE_CURRENT_BINARY_DIR}/fusion_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/fusion.def) diff --git a/reactos/dll/win32/fusion/asmenum.c b/reactos/dll/win32/fusion/asmenum.c index 99462ed2c5d..52229a8697f 100644 --- a/reactos/dll/win32/fusion/asmenum.c +++ b/reactos/dll/win32/fusion/asmenum.c @@ -236,9 +236,9 @@ static int compare_assembly_names(ASMNAME *asmname1, ASMNAME *asmname2) DWORD size, i; size = sizeof(name1); - IAssemblyName_GetProperty(asmname1->name, ASM_NAME_NAME, &name1, &size); + IAssemblyName_GetProperty(asmname1->name, ASM_NAME_NAME, name1, &size); size = sizeof(name2); - IAssemblyName_GetProperty(asmname2->name, ASM_NAME_NAME, &name2, &size); + IAssemblyName_GetProperty(asmname2->name, ASM_NAME_NAME, name2, &size); if ((ret = strcmpiW(name1, name2))) return ret; diff --git a/reactos/dll/win32/fusion/asmname.c b/reactos/dll/win32/fusion/asmname.c index 34f05559ae4..c79690f0813 100644 --- a/reactos/dll/win32/fusion/asmname.c +++ b/reactos/dll/win32/fusion/asmname.c @@ -39,7 +39,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(fusion); typedef struct { - const IAssemblyNameVtbl *lpIAssemblyNameVtbl; + IAssemblyName IAssemblyName_iface; LPWSTR path; @@ -67,10 +67,15 @@ static const WCHAR procarch[] = {'p','r','o','c','e','s','s','o','r', #define CHARS_PER_PUBKEY 16 +static inline IAssemblyNameImpl *impl_from_IAssemblyName(IAssemblyName *iface) +{ + return CONTAINING_RECORD(iface, IAssemblyNameImpl, IAssemblyName_iface); +} + static HRESULT WINAPI IAssemblyNameImpl_QueryInterface(IAssemblyName *iface, REFIID riid, LPVOID *ppobj) { - IAssemblyNameImpl *This = (IAssemblyNameImpl *)iface; + IAssemblyNameImpl *This = impl_from_IAssemblyName(iface); TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppobj); @@ -90,7 +95,7 @@ static HRESULT WINAPI IAssemblyNameImpl_QueryInterface(IAssemblyName *iface, static ULONG WINAPI IAssemblyNameImpl_AddRef(IAssemblyName *iface) { - IAssemblyNameImpl *This = (IAssemblyNameImpl *)iface; + IAssemblyNameImpl *This = impl_from_IAssemblyName(iface); ULONG refCount = InterlockedIncrement(&This->ref); TRACE("(%p)->(ref before = %u)\n", This, refCount - 1); @@ -100,7 +105,7 @@ static ULONG WINAPI IAssemblyNameImpl_AddRef(IAssemblyName *iface) static ULONG WINAPI IAssemblyNameImpl_Release(IAssemblyName *iface) { - IAssemblyNameImpl *This = (IAssemblyNameImpl *)iface; + IAssemblyNameImpl *This = impl_from_IAssemblyName(iface); ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(ref before = %u)\n", This, refCount + 1); @@ -111,6 +116,7 @@ static ULONG WINAPI IAssemblyNameImpl_Release(IAssemblyName *iface) HeapFree(GetProcessHeap(), 0, This->displayname); HeapFree(GetProcessHeap(), 0, This->name); HeapFree(GetProcessHeap(), 0, This->culture); + HeapFree(GetProcessHeap(), 0, This->procarch); HeapFree(GetProcessHeap(), 0, This); } @@ -131,7 +137,7 @@ static HRESULT WINAPI IAssemblyNameImpl_GetProperty(IAssemblyName *iface, LPVOID pvProperty, LPDWORD pcbProperty) { - IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface; + IAssemblyNameImpl *name = impl_from_IAssemblyName(iface); TRACE("(%p, %d, %p, %p)\n", iface, PropertyId, pvProperty, pcbProperty); @@ -222,7 +228,7 @@ static HRESULT WINAPI IAssemblyNameImpl_GetDisplayName(IAssemblyName *iface, LPDWORD pccDisplayName, DWORD dwDisplayFlags) { - IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface; + IAssemblyNameImpl *name = impl_from_IAssemblyName(iface); WCHAR verstr[30]; DWORD size; LPWSTR cultureval = 0; @@ -362,7 +368,7 @@ static HRESULT WINAPI IAssemblyNameImpl_GetName(IAssemblyName *iface, LPDWORD lpcwBuffer, WCHAR *pwzName) { - IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface; + IAssemblyNameImpl *name = impl_from_IAssemblyName(iface); TRACE("(%p, %p, %p)\n", iface, lpcwBuffer, pwzName); @@ -383,7 +389,7 @@ static HRESULT WINAPI IAssemblyNameImpl_GetVersion(IAssemblyName *iface, LPDWORD pdwVersionHi, LPDWORD pdwVersionLow) { - IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface; + IAssemblyNameImpl *name = impl_from_IAssemblyName(iface); TRACE("(%p, %p, %p)\n", iface, pdwVersionHi, pdwVersionLow); @@ -430,11 +436,16 @@ static const IAssemblyNameVtbl AssemblyNameVtbl = { }; /* Internal methods */ +static inline IAssemblyNameImpl *unsafe_impl_from_IAssemblyName(IAssemblyName *iface) +{ + assert(iface->lpVtbl == &AssemblyNameVtbl); + + return impl_from_IAssemblyName(iface); +} + HRESULT IAssemblyName_SetPath(IAssemblyName *iface, LPCWSTR path) { - IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface; - - assert(name->lpIAssemblyNameVtbl == &AssemblyNameVtbl); + IAssemblyNameImpl *name = unsafe_impl_from_IAssemblyName(iface); name->path = strdupW(path); if (!name->path) @@ -446,9 +457,7 @@ HRESULT IAssemblyName_SetPath(IAssemblyName *iface, LPCWSTR path) HRESULT IAssemblyName_GetPath(IAssemblyName *iface, LPWSTR buf, ULONG *len) { ULONG buffer_size = *len; - IAssemblyNameImpl *name = (IAssemblyNameImpl *)iface; - - assert(name->lpIAssemblyNameVtbl == &AssemblyNameVtbl); + IAssemblyNameImpl *name = unsafe_impl_from_IAssemblyName(iface); if (!name->path) return S_OK; @@ -561,7 +570,10 @@ static HRESULT parse_display_name(IAssemblyNameImpl *name, LPCWSTR szAssemblyNam str = strdupW(szAssemblyName); save = str; if (!str) - return E_OUTOFMEMORY; + { + hr = E_OUTOFMEMORY; + goto done; + } ptr = strchrW(str, ','); if (ptr) *ptr = '\0'; @@ -575,7 +587,10 @@ static HRESULT parse_display_name(IAssemblyNameImpl *name, LPCWSTR szAssemblyNam name->name = strdupW(str); if (!name->name) - return E_OUTOFMEMORY; + { + hr = E_OUTOFMEMORY; + goto done; + } if (!ptr) goto done; @@ -621,7 +636,8 @@ static HRESULT parse_display_name(IAssemblyNameImpl *name, LPCWSTR szAssemblyNam else if (!lstrcmpW(str, procarch)) { name->procarch = strdupW(ptr); - hr = S_OK; + if (!name->procarch) + hr = E_OUTOFMEMORY; } if (FAILED(hr)) @@ -664,7 +680,7 @@ HRESULT WINAPI CreateAssemblyNameObject(LPASSEMBLYNAME *ppAssemblyNameObj, if (!name) return E_OUTOFMEMORY; - name->lpIAssemblyNameVtbl = &AssemblyNameVtbl; + name->IAssemblyName_iface.lpVtbl = &AssemblyNameVtbl; name->ref = 1; hr = parse_display_name(name, szAssemblyName); @@ -674,7 +690,7 @@ HRESULT WINAPI CreateAssemblyNameObject(LPASSEMBLYNAME *ppAssemblyNameObj, return hr; } - *ppAssemblyNameObj = (IAssemblyName *)name; + *ppAssemblyNameObj = &name->IAssemblyName_iface; return S_OK; } diff --git a/reactos/dll/win32/fusion/fusion.rbuild b/reactos/dll/win32/fusion/fusion.rbuild index 6c3caa22787..2febba476be 100644 --- a/reactos/dll/win32/fusion/fusion.rbuild +++ b/reactos/dll/win32/fusion/fusion.rbuild @@ -15,4 +15,5 @@ assembly.c fusion.c fusion_main.c + version.rc diff --git a/reactos/dll/win32/fusion/fusion_ros.diff b/reactos/dll/win32/fusion/fusion_ros.diff deleted file mode 100644 index 25677a0da2c..00000000000 --- a/reactos/dll/win32/fusion/fusion_ros.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- dll\win32\fusion\fusion_main - Kopie.c Fr Sep 5 17:28:27 2008 -+++ dll\win32\fusion\fusion_main.c Mi Sep 10 10:38:55 2008 -@@ -34,8 +34,6 @@ - - switch (fdwReason) - { -- case DLL_WINE_PREATTACH: -- return FALSE; /* prefer native version */ - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hinstDLL); - break; diff --git a/reactos/dll/win32/fusion/fusionpriv.h b/reactos/dll/win32/fusion/fusionpriv.h index c114cd4b6bc..8d51f5d0404 100644 --- a/reactos/dll/win32/fusion/fusionpriv.h +++ b/reactos/dll/win32/fusion/fusionpriv.h @@ -428,16 +428,16 @@ typedef struct struct tagASSEMBLY; typedef struct tagASSEMBLY ASSEMBLY; -HRESULT assembly_create(ASSEMBLY **out, LPCWSTR file); -HRESULT assembly_release(ASSEMBLY *assembly); -HRESULT assembly_get_name(ASSEMBLY *assembly, LPWSTR *name); -HRESULT assembly_get_path(const ASSEMBLY *assembly, LPWSTR *path); -HRESULT assembly_get_version(ASSEMBLY *assembly, LPWSTR *version); -BYTE assembly_get_architecture(ASSEMBLY *assembly); -HRESULT assembly_get_pubkey_token(ASSEMBLY *assembly, LPWSTR *token); +HRESULT assembly_create(ASSEMBLY **out, LPCWSTR file) DECLSPEC_HIDDEN; +HRESULT assembly_release(ASSEMBLY *assembly) DECLSPEC_HIDDEN; +HRESULT assembly_get_name(ASSEMBLY *assembly, LPWSTR *name) DECLSPEC_HIDDEN; +HRESULT assembly_get_path(const ASSEMBLY *assembly, LPWSTR *path) DECLSPEC_HIDDEN; +HRESULT assembly_get_version(ASSEMBLY *assembly, LPWSTR *version) DECLSPEC_HIDDEN; +BYTE assembly_get_architecture(ASSEMBLY *assembly) DECLSPEC_HIDDEN; +HRESULT assembly_get_pubkey_token(ASSEMBLY *assembly, LPWSTR *token) DECLSPEC_HIDDEN; -extern HRESULT IAssemblyName_SetPath(IAssemblyName *iface, LPCWSTR path); -extern HRESULT IAssemblyName_GetPath(IAssemblyName *iface, LPWSTR buf, ULONG *len); +extern HRESULT IAssemblyName_SetPath(IAssemblyName *iface, LPCWSTR path) DECLSPEC_HIDDEN; +extern HRESULT IAssemblyName_GetPath(IAssemblyName *iface, LPWSTR buf, ULONG *len) DECLSPEC_HIDDEN; static inline LPWSTR strdupW(LPCWSTR src) { @@ -461,7 +461,7 @@ static inline void token_to_str(BYTE *bytes, LPWSTR str) { DWORD i; - static const WCHAR hexval[16] = { + static const WCHAR hexval[] = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' }; diff --git a/reactos/dll/win32/fusion/version.rc b/reactos/dll/win32/fusion/version.rc new file mode 100644 index 00000000000..06b7e1c5516 --- /dev/null +++ b/reactos/dll/win32/fusion/version.rc @@ -0,0 +1,26 @@ +/* + * Copyright 2010 Louis Lenders + * + * 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 WINE_FILEDESCRIPTION_STR "Wine assembly manager" +#define WINE_FILENAME_STR "fusion.dll" +#define WINE_FILEVERSION 2,0,50727,4016 +#define WINE_FILEVERSION_STR "2.0.50727.4016" +#define WINE_PRODUCTVERSION 2,0,50727,4016 +#define WINE_PRODUCTVERSION_STR "2.0.50727.4016" + +#include "wine/wine_common_ver.rc" diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 50d847ec655..56d163b4a89 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -60,7 +60,7 @@ reactos/dll/win32/cryptui # Autosync reactos/dll/win32/dbghelp # Autosync reactos/dll/win32/dciman32 # Autosync reactos/dll/win32/dwmapi # Synced to Wine-1.3.37 -reactos/dll/win32/fusion # Autosync +reactos/dll/win32/fusion # Synced to Wine-1.3.37 reactos/dll/win32/gdiplus # Autosync reactos/dll/win32/hhctrl.ocx # Autosync reactos/dll/win32/hlink # Autosync @@ -69,8 +69,8 @@ reactos/dll/win32/httpapi # Synced to Wine-1.3.37 reactos/dll/win32/iccvid # Autosync reactos/dll/win32/icmp # Synced to Wine-0_9_10 reactos/dll/win32/imaadp32.acm # Synced to Wine-1.3.37 -reactos/dll/win32/imm32 # Autosync reactos/dll/win32/imagehlp # Autosync +reactos/dll/win32/imm32 # Autosync reactos/dll/win32/inetcomm # Autosync reactos/dll/win32/inetmib1 # Autosync reactos/dll/win32/initpki # Autosync From 4ea062311b490432c55b99db5fa3715ff5fbabc2 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Wed, 25 Jan 2012 19:09:28 +0000 Subject: [PATCH 082/289] [FUSION_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55178 --- rostests/winetests/fusion/asmcache.c | 168 +++++++++++++-------------- rostests/winetests/fusion/asmenum.c | 28 +++-- rostests/winetests/fusion/asmname.c | 109 +++++++++++++++-- 3 files changed, 200 insertions(+), 105 deletions(-) diff --git a/rostests/winetests/fusion/asmcache.c b/rostests/winetests/fusion/asmcache.c index 06867e6783e..46c1db9dbf1 100644 --- a/rostests/winetests/fusion/asmcache.c +++ b/rostests/winetests/fusion/asmcache.c @@ -1091,13 +1091,10 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); ok(info.uliAssemblySizeInKB.u.LowPart == 0, "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - todo_wine - { - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), - "Wrong assembly path returned\n"); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); - } + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), + "Wrong assembly path returned\n"); + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); /* pwzCachePath is full filename */ INIT_ASM_INFO(); @@ -1139,13 +1136,10 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); ok(info.uliAssemblySizeInKB.u.LowPart == 0, "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - todo_wine - { - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), - "Wrong assembly path returned\n"); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); - } + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), + "Wrong assembly path returned\n"); + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); /* info.cbAssemblyInfo is 1 */ INIT_ASM_INFO(); @@ -1193,15 +1187,13 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); todo_wine { - /* win9x: 32 */ - ok((info.uliAssemblySizeInKB.u.LowPart == 4) || - broken(info.uliAssemblySizeInKB.u.LowPart == 32), + ok((info.uliAssemblySizeInKB.u.LowPart == 4), "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), - "Wrong assembly path returned\n"); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); } + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), + "Wrong assembly path returned\n"); + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); /* QUERYASMINFO_FLAG_GETSIZE and QUERYASMINFO_FLAG_VALIDATE */ INIT_ASM_INFO(); @@ -1216,15 +1208,13 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); todo_wine { - /* win9x: 32 */ - ok((info.uliAssemblySizeInKB.u.LowPart == 4) || - broken(info.uliAssemblySizeInKB.u.LowPart == 32), + ok((info.uliAssemblySizeInKB.u.LowPart == 4), "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), - "Wrong assembly path returned\n"); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); } + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), + "Wrong assembly path returned\n"); + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); /* info.pszCurrentAssemblyPathBuf is NULL */ INIT_ASM_INFO(); @@ -1237,17 +1227,15 @@ static void test_QueryAssemblyInfo(void) "Expected ASSEMBLYINFO_FLAG_INSTALLED, got %08x\n", info.dwAssemblyFlags); ok(info.uliAssemblySizeInKB.u.HighPart == 0, "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); + ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), + "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr); todo_wine { - ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), - "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr); - /* win9x: 32 */ - ok((info.uliAssemblySizeInKB.u.LowPart == 4) || - broken(info.uliAssemblySizeInKB.u.LowPart == 32), + ok((info.uliAssemblySizeInKB.u.LowPart == 4), "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); } + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); /* info.cchBuf is exactly size of asmpath */ INIT_ASM_INFO(); @@ -1262,17 +1250,15 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), "Assembly path was changed\n"); + ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), + "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr); todo_wine { - ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), - "Expected HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), got %08x\n", hr); - /* win9x: 32 */ - ok((info.uliAssemblySizeInKB.u.LowPart == 4) || - broken(info.uliAssemblySizeInKB.u.LowPart == 32), + ok((info.uliAssemblySizeInKB.u.LowPart == 4), "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); } + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); /* info.cchBuf has room for NULL-terminator */ INIT_ASM_INFO(); @@ -1290,13 +1276,11 @@ static void test_QueryAssemblyInfo(void) "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); todo_wine { - /* win9x: 32 */ - ok((info.uliAssemblySizeInKB.u.LowPart == 4) || - broken(info.uliAssemblySizeInKB.u.LowPart == 32), + ok((info.uliAssemblySizeInKB.u.LowPart == 4), "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), - "Wrong assembly path returned\n"); } + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), + "Wrong assembly path returned\n"); /* display name is "wine, Version=1.0.0.0" */ INIT_ASM_INFO(); @@ -1314,21 +1298,36 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); todo_wine { - /* win9x: 32 */ - ok((info.uliAssemblySizeInKB.u.LowPart == 4) || - broken(info.uliAssemblySizeInKB.u.LowPart == 32), + ok((info.uliAssemblySizeInKB.u.LowPart == 4), "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), - "Wrong assembly path returned\n"); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); } + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), + "Wrong assembly path returned\n"); + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); - /* display name is "wine, Version=1.0.0.00000" */ - INIT_ASM_INFO(); + /* short buffer, QUERYASMINFO_FLAG_VALIDATE */ + memset(&info, 0, sizeof(info)); lstrcpyW(name, wine); lstrcatW(name, commasep); lstrcatW(name, otherver); + hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_VALIDATE, + name, &info); + ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "got %08x\n", hr); + ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, "got %08x\n", info.dwAssemblyFlags); + + /* short buffer, QUERYASMINFO_FLAG_GETSIZE */ + memset(&info, 0, sizeof(info)); + lstrcpyW(name, wine); + lstrcatW(name, commasep); + lstrcatW(name, otherver); + hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, + name, &info); + ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "got %08x\n", hr); + ok(info.dwAssemblyFlags == ASSEMBLYINFO_FLAG_INSTALLED, "got %08x\n", info.dwAssemblyFlags); + + /* display name is "wine, Version=1.0.0.00000" */ + INIT_ASM_INFO(); hr = IAssemblyCache_QueryAssemblyInfo(cache, QUERYASMINFO_FLAG_GETSIZE, name, &info); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); @@ -1340,15 +1339,13 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); todo_wine { - /* win9x: 32 */ - ok((info.uliAssemblySizeInKB.u.LowPart == 4) || - broken(info.uliAssemblySizeInKB.u.LowPart == 32), + ok((info.uliAssemblySizeInKB.u.LowPart == 4), "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), - "Wrong assembly path returned\n"); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); } + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), + "Wrong assembly path returned\n"); + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); /* display name is "wine, Version=1.0.0.1", versions don't match */ INIT_ASM_INFO(); @@ -1386,15 +1383,13 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); todo_wine { - /* win9x: 32 */ - ok((info.uliAssemblySizeInKB.u.LowPart == 4) || - broken(info.uliAssemblySizeInKB.u.LowPart == 32), + ok((info.uliAssemblySizeInKB.u.LowPart == 4), "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), - "Wrong assembly path returned\n"); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); } + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), + "Wrong assembly path returned\n"); + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); /* display name is "wine, Culture=en", cultures don't match */ INIT_ASM_INFO(); @@ -1415,9 +1410,12 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); ok(info.uliAssemblySizeInKB.u.LowPart == 0, "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), - "Assembly path was changed\n"); - ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); + todo_wine + { + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, empty), + "Assembly path was changed\n"); + ok(info.cchBuf == MAX_PATH, "Expected MAX_PATH, got %d\n", info.cchBuf); + } /* display name is "wine, PublicKeyTokens=2d03617b1c31e2f5" */ INIT_ASM_INFO(); @@ -1435,15 +1433,13 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); todo_wine { - /* win9x: 32 */ - ok((info.uliAssemblySizeInKB.u.LowPart == 4) || - broken(info.uliAssemblySizeInKB.u.LowPart == 32), + ok((info.uliAssemblySizeInKB.u.LowPart == 4), "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), - "Wrong assembly path returned\n"); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); } + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), + "Wrong assembly path returned\n"); + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); /* display name is "wine, PublicKeyToken=aaaaaaaaaaaaaaaa", pubkeys don't match */ INIT_ASM_INFO(); @@ -1481,15 +1477,13 @@ static void test_QueryAssemblyInfo(void) "Expected 0, got %d\n", info.uliAssemblySizeInKB.u.HighPart); todo_wine { - /* win9x: 32 */ - ok((info.uliAssemblySizeInKB.u.LowPart == 4) || - broken(info.uliAssemblySizeInKB.u.LowPart == 32), + ok((info.uliAssemblySizeInKB.u.LowPart == 4), "Expected 4, got %d\n", info.uliAssemblySizeInKB.u.LowPart); - ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), - "Wrong assembly path returned\n"); - ok(info.cchBuf == lstrlenW(asmpath) + 1, - "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); } + ok(!lstrcmpW(info.pszCurrentAssemblyPathBuf, asmpath), + "Wrong assembly path returned\n"); + ok(info.cchBuf == lstrlenW(asmpath) + 1, + "Expected %d, got %d\n", lstrlenW(asmpath) + 1, info.cchBuf); /* uninstall the assembly from the GAC */ disp = 0xf00dbad; diff --git a/rostests/winetests/fusion/asmenum.c b/rostests/winetests/fusion/asmenum.c index cb6ea3dfdeb..a060529f27e 100644 --- a/rostests/winetests/fusion/asmenum.c +++ b/rostests/winetests/fusion/asmenum.c @@ -147,13 +147,15 @@ static BOOL create_full_path(LPCSTR path) return ret; } -static void create_file_data(LPCSTR name, LPCSTR data, DWORD size) +static BOOL create_file_data(LPCSTR name, LPCSTR data, DWORD size) { HANDLE file; DWORD written; file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); - ok(file != INVALID_HANDLE_VALUE, "Failure to open file %s\n", name); + if (file == INVALID_HANDLE_VALUE) + return FALSE; + WriteFile(file, data, strlen(data), &written, NULL); if (size) @@ -163,10 +165,9 @@ static void create_file_data(LPCSTR name, LPCSTR data, DWORD size) } CloseHandle(file); + return TRUE; } -#define create_file(name, size) create_file_data(name, name, size) - static void test_CreateAssemblyEnum(void) { HRESULT hr; @@ -409,19 +410,31 @@ static void test_enumerate_name(void) CreateDirectoryA(path, NULL); lstrcatA(path, "\\Wine.dll"); - create_file(path, 100); + if (!create_file_data(path, path, 100)) + { + win_skip("Failed to open file %s, skipping name enumeration tests\n", path); + goto done; + } sprintf(path, "%s\\Wine\\1.0.1.2__16a3fcd171e93a8d", gac); CreateDirectoryA(path, NULL); lstrcatA(path, "\\Wine.dll"); - create_file(path, 100); + if (!create_file_data(path, path, 100)) + { + win_skip("Failed to open file %s, skipping name enumeration tests\n", path); + goto done; + } sprintf(path, "%s\\Wine\\1.0.1.2__123456789abcdef0", gac); CreateDirectoryA(path, NULL); lstrcatA(path, "\\Wine.dll"); - create_file(path, 100); + if (!create_file_data(path, path, 100)) + { + win_skip("Failed to open file %s, skipping name enumeration tests\n", path); + goto done; + } /* test case sensitivity */ to_widechar(namestr, "wine"); @@ -650,6 +663,7 @@ static void test_enumerate_name(void) IAssemblyEnum_Release(asmenum); IAssemblyName_Release(asmname); +done: sprintf(path, "%s\\Wine\\1.0.0.0__16a3fcd171e93a8d\\Wine.dll", gac); DeleteFileA(path); sprintf(path, "%s\\Wine\\1.0.1.2__16a3fcd171e93a8d\\Wine.dll", gac); diff --git a/rostests/winetests/fusion/asmname.c b/rostests/winetests/fusion/asmname.c index 824837b25fc..a99b288dca5 100644 --- a/rostests/winetests/fusion/asmname.c +++ b/rostests/winetests/fusion/asmname.c @@ -718,6 +718,99 @@ static void test_CreateAssemblyNameObject(void) IAssemblyName_Release(name); + /* Processor architecture tests */ + to_widechar(namestr, "wine, processorArchitecture=x86"); + name = NULL; + hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + ok(name != NULL, "Expected non-NULL name\n"); + + size = MAX_PATH; + hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + WideCharToMultiByte(CP_ACP, 0, str, -1, string1, MAX_PATH, NULL, NULL); + + if (lstrcmpA(string1, "wine") == 0) + win_skip("processorArchitecture not supported on .NET 1.x\n"); + else + { + ok_aw("wine, processorArchitecture=x86", str); + ok(size == 32, "Expected 32, got %d\n", size); + + IAssemblyName_Release(name); + + /* amd64 */ + to_widechar(namestr, "wine, processorArchitecture=AMD64"); + name = NULL; + hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + size = MAX_PATH; + hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok_aw("wine, processorArchitecture=AMD64", str); + ok(size == 34, "Expected 34, got %d\n", size); + + IAssemblyName_Release(name); + + /* ia64 */ + to_widechar(namestr, "wine, processorArchitecture=IA64"); + name = NULL; + hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + size = MAX_PATH; + hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok_aw("wine, processorArchitecture=IA64", str); + ok(size == 33, "Expected 33, got %d\n", size); + + IAssemblyName_Release(name); + + /* msil */ + to_widechar(namestr, "wine, processorArchitecture=MSIL"); + name = NULL; + hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + + size = MAX_PATH; + hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_PROCESSORARCHITECTURE); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok_aw("wine, processorArchitecture=MSIL", str); + ok(size == 33, "Expected 33, got %d\n", size); + + IAssemblyName_Release(name); + } + + /* Pulling out various different values */ + to_widechar(namestr, "wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef"); + name = NULL; + hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok(name != NULL, "Expected non-NULL name\n"); + + size = MAX_PATH; + hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_VERSION | ASM_DISPLAYF_CULTURE); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok_aw("wine, Version=1.2.3.4, Culture=en", str); + ok(size == 34, "Expected 34, got %d\n", size); + + size = MAX_PATH; + hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_CULTURE | ASM_DISPLAYF_PUBLIC_KEY_TOKEN); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok_aw("wine, Culture=en, PublicKeyToken=1234567890abcdef", str); + ok(size == 50, "Expected 50, got %d\n", size); + + size = MAX_PATH; + hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); + ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); + ok_aw("wine, Version=1.2.3.4, Culture=en, PublicKeyToken=1234567890abcdef", str); + ok(size == 67, "Expected 67, got %d\n", size); + + IAssemblyName_Release(name); + /* invalid property */ to_widechar(namestr, "wine, BadProp=42"); name = NULL; @@ -729,11 +822,8 @@ static void test_CreateAssemblyNameObject(void) str[0] = '\0'; hr = IAssemblyName_GetDisplayName(name, str, &size, ASM_DISPLAYF_FULL); ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); - todo_wine - { - ok_aw("wine", str); - ok(size == 5, "Expected 5, got %d\n", size); - } + ok_aw("wine", str); + ok(size == 5, "Expected 5, got %d\n", size); size = MAX_PATH; str[0] = '\0'; @@ -781,12 +871,9 @@ static void test_CreateAssemblyNameObject(void) to_widechar(namestr, "wine PublicKeyToken=1234567890abcdef"); name = (IAssemblyName *)0xdeadbeef; hr = pCreateAssemblyNameObject(&name, namestr, CANOF_PARSE_DISPLAY_NAME, NULL); - todo_wine - { - ok(hr == FUSION_E_INVALID_NAME, - "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); - ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); - } + ok(hr == FUSION_E_INVALID_NAME, + "Expected FUSION_E_INVALID_NAME, got %08x\n", hr); + ok(name == (IAssemblyName *)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", name); if(SUCCEEDED(hr)) IAssemblyName_Release(name); /* no '=' */ From cefc253b6668ac0a866a3bc7b2d143c56daaba8e Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Wed, 25 Jan 2012 19:12:49 +0000 Subject: [PATCH 083/289] [MCISEQ] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55179 --- reactos/dll/win32/mciseq/mcimidi.c | 341 ++++++++++------------------- reactos/media/doc/README.WINE | 2 +- 2 files changed, 120 insertions(+), 223 deletions(-) diff --git a/reactos/dll/win32/mciseq/mcimidi.c b/reactos/dll/win32/mciseq/mcimidi.c index ec9a24ae4f9..2783c079a86 100644 --- a/reactos/dll/win32/mciseq/mcimidi.c +++ b/reactos/dll/win32/mciseq/mcimidi.c @@ -21,9 +21,8 @@ /* TODO: * + implement it correctly - * + finish asynchronous commands (especially for reading/record) + * + finish asynchronous commands * + better implement non waiting command (without the MCI_WAIT flag). - * + implement the recording features */ #include @@ -62,13 +61,12 @@ 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 */ LPWSTR lpstrElementName; /* Name of file (if any) */ LPWSTR lpstrCopyright; LPWSTR lpstrName; + WORD wPort; /* the WINMM device unit */ WORD dwStatus; /* one from MCI_MODE_xxxx */ DWORD dwMciTimeFormat; /* One of the supported MCI_FORMAT_xxxx */ WORD wFormat; /* Format of MIDI hFile (0, 1 or 2) */ @@ -156,7 +154,7 @@ static DWORD MCI_SendCommandAsync(UINT wDevID, UINT wMsg, DWORD_PTR dwParam1, * MCI MIDI implementation * *======================================================================*/ -static DWORD MIDI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms); +static DWORD MIDI_mciResume(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms); /************************************************************************** * MIDI_drvOpen [internal] @@ -197,17 +195,35 @@ static DWORD MIDI_drvClose(DWORD dwDevID) /************************************************************************** * MIDI_mciGetOpenDev [internal] */ -static WINE_MCIMIDI* MIDI_mciGetOpenDev(UINT wDevID) +static WINE_MCIMIDI* MIDI_mciGetOpenDev(MCIDEVICEID wDevID, UINT wMsg) { WINE_MCIMIDI* wmm = (WINE_MCIMIDI*)mciGetDriverData(wDevID); - if (wmm == NULL || wmm->nUseCount == 0) { + if (wmm == NULL || ((wmm->nUseCount == 0) ^ (wMsg == MCI_OPEN_DRIVER))) { WARN("Invalid wDevID=%u\n", wDevID); return 0; } return wmm; } +/************************************************************************** + * MIDI_mciNotify [internal] + * + * Notifications in MCI work like a 1-element queue. + * Each new notification request supersedes the previous one. + * This affects Play and Record; other commands are immediate. + */ +static void MIDI_mciNotify(DWORD_PTR hWndCallBack, WINE_MCIMIDI* wmm, UINT wStatus) +{ + /* We simply save one parameter by not passing the wDevID local + * to the command. They are the same (via mciGetDriverData). + */ + MCIDEVICEID wDevID = wmm->wDevID; + HANDLE old = InterlockedExchangePointer(&wmm->hCallback, NULL); + if (old) mciDriverNotify(old, wDevID, MCI_NOTIFY_SUPERSEDED); + mciDriverNotify(HWND_32(LOWORD(hWndCallBack)), wDevID, wStatus); +} + /************************************************************************** * MIDI_mciReadByte [internal] */ @@ -704,16 +720,13 @@ static DWORD MIDI_GetMThdLengthMS(WINE_MCIMIDI* wmm) /************************************************************************** * MIDI_mciOpen [internal] */ -static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms) +static DWORD MIDI_mciOpen(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms) { DWORD dwRet = 0; - DWORD dwDeviceID; - WINE_MCIMIDI* wmm = (WINE_MCIMIDI*)mciGetDriverData(wDevID); - TRACE("(%04x, %08X, %p)\n", wDevID, dwFlags, lpParms); + TRACE("(%d, %08X, %p)\n", wmm->wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; - if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_OPEN_SHAREABLE) return MCIERR_HARDWARE; @@ -729,9 +742,8 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms) wmm->hMidi = 0; wmm->wPort = MIDI_MAPPER; wmm->lpstrElementName = NULL; - dwDeviceID = lpParms->wDeviceID; - TRACE("wDevID=%04X (lpParams->wDeviceID=%08X)\n", wDevID, dwDeviceID); + TRACE("wDevID=%d (lpParams->wDeviceID=%d)\n", wmm->wDevID, lpParms->wDeviceID); /* lpParms->wDeviceID = wDevID;*/ if (dwFlags & MCI_OPEN_ELEMENT) { @@ -754,7 +766,6 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms) wmm->lpstrCopyright = NULL; wmm->lpstrName = NULL; - wmm->wNotifyDeviceID = dwDeviceID; wmm->dwStatus = MCI_MODE_NOT_READY; /* while loading file contents */ /* spec says it should be the default format from the MIDI file... */ wmm->dwMciTimeFormat = MCI_FORMAT_MILLISECONDS; @@ -799,11 +810,8 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms) } else { wmm->dwPositionMS = 0; wmm->dwStatus = MCI_MODE_STOP; - if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmm->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if (dwFlags & MCI_NOTIFY) + MIDI_mciNotify(lpParms->dwCallback, wmm, MCI_NOTIFY_SUCCESSFUL); } return dwRet; } @@ -811,20 +819,23 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms) /************************************************************************** * MIDI_mciStop [internal] */ -static DWORD MIDI_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) +static DWORD MIDI_mciStop(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); + DWORD dwRet = 0; - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); + TRACE("(%d, %08X, %p);\n", wmm->wDevID, dwFlags, lpParms); - if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; + if (wmm->dwStatus != MCI_MODE_STOP) { + HANDLE old = InterlockedExchangePointer(&wmm->hCallback, NULL); + if (old) mciDriverNotify(old, wmm->wDevID, MCI_NOTIFY_ABORTED); + } if (wmm->dwStatus != MCI_MODE_STOP) { int oldstat = wmm->dwStatus; wmm->dwStatus = MCI_MODE_NOT_READY; if (oldstat == MCI_MODE_PAUSE) - midiOutReset((HMIDIOUT)wmm->hMidi); + dwRet = midiOutReset((HMIDIOUT)wmm->hMidi); while (wmm->dwStatus != MCI_MODE_STOP) Sleep(10); @@ -833,29 +844,22 @@ static DWORD MIDI_mciStop(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParm /* sanity reset */ wmm->dwStatus = MCI_MODE_STOP; - TRACE("wmm->dwStatus=%d\n", wmm->dwStatus); - - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmm->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } - return 0; + if ((dwFlags & MCI_NOTIFY) && lpParms && MMSYSERR_NOERROR==dwRet) + MIDI_mciNotify(lpParms->dwCallback, wmm, MCI_NOTIFY_SUCCESSFUL); + return dwRet; } /************************************************************************** * MIDI_mciClose [internal] */ -static DWORD MIDI_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) +static DWORD MIDI_mciClose(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); - - if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; + TRACE("(%d, %08X, %p);\n", wmm->wDevID, dwFlags, lpParms); if (wmm->dwStatus != MCI_MODE_STOP) { - MIDI_mciStop(wDevID, MCI_WAIT, lpParms); + /* mciStop handles MCI_NOTIFY_ABORTED */ + MIDI_mciStop(wmm, MCI_WAIT, lpParms); } wmm->nUseCount--; @@ -874,10 +878,8 @@ static DWORD MIDI_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPar return MCIERR_INTERNAL; } - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmm->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); + if ((dwFlags & MCI_NOTIFY) && lpParms) { + MIDI_mciNotify(lpParms->dwCallback, wmm, MCI_NOTIFY_SUCCESSFUL); } return 0; } @@ -909,18 +911,16 @@ static MCI_MIDITRACK* MIDI_mciFindNextEvent(WINE_MCIMIDI* wmm, LPDWORD hiPulse) /************************************************************************** * MIDI_mciPlay [internal] */ -static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) +static DWORD MIDI_mciPlay(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) { DWORD dwStartMS, dwEndMS; DWORD dwRet = 0; WORD doPlay, nt; MCI_MIDITRACK* mmt; DWORD hiPulse; - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); + HANDLE oldcb; - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); - - if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; + TRACE("(%d, %08X, %p);\n", wmm->wDevID, dwFlags, lpParms); if (wmm->hFile == 0) { WARN("Can't play: no file %s!\n", debugstr_w(wmm->lpstrElementName)); @@ -930,15 +930,14 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) if (wmm->dwStatus != MCI_MODE_STOP) { if (wmm->dwStatus == MCI_MODE_PAUSE) { /* FIXME: parameters (start/end) in lpParams may not be used */ - return MIDI_mciResume(wDevID, dwFlags, (LPMCI_GENERIC_PARMS)lpParms); + return MIDI_mciResume(wmm, dwFlags, (LPMCI_GENERIC_PARMS)lpParms); } WARN("Can't play: device is not stopped !\n"); return MCIERR_INTERNAL; } if (!(dwFlags & MCI_WAIT)) { - /** FIXME: I'm not 100% sure that wNotifyDeviceID is the right value in all cases ??? */ - return MCI_SendCommandAsync(wmm->wNotifyDeviceID, MCI_PLAY, dwFlags, (DWORD_PTR)lpParms, sizeof(LPMCI_PLAY_PARMS)); + return MCI_SendCommandAsync(wmm->wDevID, MCI_PLAY, dwFlags, (DWORD_PTR)lpParms, sizeof(MCI_PLAY_PARMS)); } if (lpParms && (dwFlags & MCI_FROM)) { @@ -955,6 +954,11 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) TRACE("Playing from %u to %u\n", dwStartMS, dwEndMS); + oldcb = InterlockedExchangePointer(&wmm->hCallback, + (dwFlags & MCI_NOTIFY) ? HWND_32(LOWORD(lpParms->dwCallback)) : NULL); + if (oldcb) mciDriverNotify(oldcb, wmm->wDevID, MCI_NOTIFY_ABORTED); + oldcb = NULL; + /* init tracks */ for (nt = 0; nt < wmm->nTracks; nt++) { mmt = &wmm->tracks[nt]; @@ -970,7 +974,6 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) } 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; } @@ -1173,87 +1176,24 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) midiOutReset((HMIDIOUT)wmm->hMidi); dwRet = midiOutClose((HMIDIOUT)wmm->hMidi); - /* to restart playing at beginning when it's over */ - wmm->dwPositionMS = 0; - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmm->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if (dwFlags & MCI_NOTIFY) + oldcb = InterlockedExchangePointer(&wmm->hCallback, NULL); wmm->dwStatus = MCI_MODE_STOP; + + /* Let the potentially asynchronous commands support FAILURE notification. */ + if (oldcb) mciDriverNotify(oldcb, wmm->wDevID, + dwRet ? MCI_NOTIFY_FAILURE : MCI_NOTIFY_SUCCESSFUL); return dwRet; } -/************************************************************************** - * MIDI_mciRecord [internal] - */ -static DWORD MIDI_mciRecord(UINT wDevID, DWORD dwFlags, LPMCI_RECORD_PARMS lpParms) -{ - int start, end; - MIDIHDR midiHdr; - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); - - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); - - if (wmm == 0) return MCIERR_INVALID_DEVICE_ID; - - if (wmm->hFile == 0) { - WARN("Can't find file=%s!\n", debugstr_w(wmm->lpstrElementName)); - return MCIERR_FILE_NOT_FOUND; - } - start = 1; end = 99999; - if (lpParms && (dwFlags & MCI_FROM)) { - start = lpParms->dwFrom; - TRACE("MCI_FROM=%d\n", start); - } - if (lpParms && (dwFlags & MCI_TO)) { - end = lpParms->dwTo; - TRACE("MCI_TO=%d\n", end); - } - midiHdr.lpData = HeapAlloc(GetProcessHeap(), 0, 1200); - if (!midiHdr.lpData) - return MCIERR_OUT_OF_MEMORY; - midiHdr.dwBufferLength = 1024; - midiHdr.dwUser = 0L; - midiHdr.dwFlags = 0L; - midiInPrepareHeader((HMIDIIN)wmm->hMidi, &midiHdr, sizeof(MIDIHDR)); - TRACE("After MIDM_PREPARE\n"); - wmm->dwStatus = MCI_MODE_RECORD; - /* FIXME: there is no buffer added */ - while (wmm->dwStatus != MCI_MODE_STOP) { - TRACE("wmm->dwStatus=%p %d\n", - &wmm->dwStatus, wmm->dwStatus); - midiHdr.dwBytesRecorded = 0; - midiInStart((HMIDIIN)wmm->hMidi); - TRACE("midiInStart => dwBytesRecorded=%u\n", midiHdr.dwBytesRecorded); - if (midiHdr.dwBytesRecorded == 0) break; - } - TRACE("Before MIDM_UNPREPARE\n"); - midiInUnprepareHeader((HMIDIIN)wmm->hMidi, &midiHdr, sizeof(MIDIHDR)); - TRACE("After MIDM_UNPREPARE\n"); - HeapFree(GetProcessHeap(), 0, midiHdr.lpData); - midiHdr.lpData = NULL; - wmm->dwStatus = MCI_MODE_STOP; - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmm->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } - return 0; -} - /************************************************************************** * MIDI_mciPause [internal] */ -static DWORD MIDI_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) +static DWORD MIDI_mciPause(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); - - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); - - if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; + TRACE("(%d, %08X, %p);\n", wmm->wDevID, dwFlags, lpParms); if (wmm->dwStatus == MCI_MODE_PLAY) { /* stop all notes */ @@ -1262,49 +1202,35 @@ static DWORD MIDI_mciPause(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPar midiOutShortMsg((HMIDIOUT)(wmm->hMidi), 0x78B0 | chn); wmm->dwStatus = MCI_MODE_PAUSE; } - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmm->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } - + if ((dwFlags & MCI_NOTIFY) && lpParms) + MIDI_mciNotify(lpParms->dwCallback, wmm, MCI_NOTIFY_SUCCESSFUL); return 0; } /************************************************************************** * MIDI_mciResume [internal] */ -static DWORD MIDI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) +static DWORD MIDI_mciResume(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) { - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); - - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); - - if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; + TRACE("(%d, %08X, %p);\n", wmm->wDevID, dwFlags, lpParms); if (wmm->dwStatus == MCI_MODE_PAUSE) { wmm->wStartedPlaying = FALSE; wmm->dwStatus = MCI_MODE_PLAY; } - if (lpParms && (dwFlags & MCI_NOTIFY)) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmm->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if ((dwFlags & MCI_NOTIFY) && lpParms) + MIDI_mciNotify(lpParms->dwCallback, wmm, MCI_NOTIFY_SUCCESSFUL); return 0; } /************************************************************************** * MIDI_mciSet [internal] */ -static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SEQ_SET_PARMS lpParms) +static DWORD MIDI_mciSet(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_SEQ_SET_PARMS lpParms) { - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); - - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); + TRACE("(%d, %08X, %p);\n", wmm->wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; - if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_SET_TIME_FORMAT) { switch (lpParms->dwTimeFormat) { @@ -1377,21 +1303,21 @@ static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SEQ_SET_PARMS lpParms } if (dwFlags & MCI_SEQ_SET_TEMPO) TRACE("MCI_SEQ_SET_TEMPO !\n"); + if (dwFlags & MCI_NOTIFY) + MIDI_mciNotify(lpParms->dwCallback, wmm, MCI_NOTIFY_SUCCESSFUL); return 0; } /************************************************************************** * MIDI_mciStatus [internal] */ -static DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms) +static DWORD MIDI_mciStatus(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_STATUS_PARMS lpParms) { - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); DWORD ret = 0; - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); + TRACE("(%d, %08X, %p);\n", wmm->wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; - if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_STATUS_ITEM) { switch (lpParms->dwItem) { @@ -1493,27 +1419,22 @@ static DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar WARN("No Status-Item!\n"); return MCIERR_UNRECOGNIZED_COMMAND; } - if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmm->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if ((dwFlags & MCI_NOTIFY) && HRESULT_CODE(ret)==0) + MIDI_mciNotify(lpParms->dwCallback, wmm, MCI_NOTIFY_SUCCESSFUL); return ret; } /************************************************************************** * MIDI_mciGetDevCaps [internal] */ -static DWORD MIDI_mciGetDevCaps(UINT wDevID, DWORD dwFlags, +static DWORD MIDI_mciGetDevCaps(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_GETDEVCAPS_PARMS lpParms) { - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); DWORD ret; - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); + TRACE("(%d, %08X, %p);\n", wmm->wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; - if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; if (dwFlags & MCI_GETDEVCAPS_ITEM) { switch (lpParms->dwItem) { @@ -1554,7 +1475,7 @@ static DWORD MIDI_mciGetDevCaps(UINT wDevID, DWORD dwFlags, break; case MCI_GETDEVCAPS_CAN_RECORD: TRACE("MCI_GETDEVCAPS_CAN_RECORD !\n"); - lpParms->dwReturn = MAKEMCIRESOURCE(TRUE, MCI_TRUE); + lpParms->dwReturn = MAKEMCIRESOURCE(FALSE, MCI_FALSE); ret = MCI_RESOURCE_RETURNED; break; case MCI_GETDEVCAPS_CAN_SAVE: @@ -1570,24 +1491,24 @@ static DWORD MIDI_mciGetDevCaps(UINT wDevID, DWORD dwFlags, WARN("No GetDevCaps-Item !\n"); return MCIERR_UNRECOGNIZED_COMMAND; } + if ((dwFlags & MCI_NOTIFY) && HRESULT_CODE(ret)==0) + MIDI_mciNotify(lpParms->dwCallback, wmm, MCI_NOTIFY_SUCCESSFUL); return ret; } /************************************************************************** * MIDI_mciInfo [internal] */ -static DWORD MIDI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms) +static DWORD MIDI_mciInfo(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms) { LPCWSTR str = 0; - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); DWORD ret = 0; static const WCHAR wszMidiSeq[] = {'W','i','n','e','\'','s',' ','M','I','D','I',' ','s','e','q','u','e','n','c','e','r',0}; - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); + TRACE("(%d, %08X, %p);\n", wmm->wDevID, dwFlags, lpParms); if (lpParms == NULL || lpParms->lpstrReturn == NULL) return MCIERR_NULL_PARAMETER_BLOCK; - if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; TRACE("buf=%p, len=%u\n", lpParms->lpstrReturn, lpParms->dwRetSize); @@ -1600,35 +1521,32 @@ static DWORD MIDI_mciInfo(UINT wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW lpParms) WARN("Don't know this info command (%u)\n", dwFlags); return MCIERR_UNRECOGNIZED_COMMAND; } - if (str) { - if (lpParms->dwRetSize <= strlenW(str)) { - lstrcpynW(lpParms->lpstrReturn, str, lpParms->dwRetSize - 1); - ret = MCIERR_PARAM_OVERFLOW; - } else { - strcpyW(lpParms->lpstrReturn, str); - } - } else { - *lpParms->lpstrReturn = 0; + if (!ret) { + if (lpParms->dwRetSize) { + WCHAR zero = 0; + /* FIXME? Since NT, mciwave, mciseq and mcicda set dwRetSize + * to the number of characters written, excluding \0. */ + lstrcpynW(lpParms->lpstrReturn, str ? str : &zero, lpParms->dwRetSize); + } else ret = MCIERR_PARAM_OVERFLOW; } + if (MMSYSERR_NOERROR==ret && (dwFlags & MCI_NOTIFY)) + MIDI_mciNotify(lpParms->dwCallback, wmm, MCI_NOTIFY_SUCCESSFUL); return ret; } /************************************************************************** * MIDI_mciSeek [internal] */ -static DWORD MIDI_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) +static DWORD MIDI_mciSeek(WINE_MCIMIDI* wmm, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) { DWORD ret = 0; - WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); - TRACE("(%04X, %08X, %p);\n", wDevID, dwFlags, lpParms); + TRACE("(%d, %08X, %p);\n", wmm->wDevID, dwFlags, lpParms); if (lpParms == NULL) { ret = MCIERR_NULL_PARAMETER_BLOCK; - } else if (wmm == NULL) { - ret = MCIERR_INVALID_DEVICE_ID; } else { - MIDI_mciStop(wDevID, MCI_WAIT, 0); + MIDI_mciStop(wmm, MCI_WAIT, 0); if (dwFlags & MCI_SEEK_TO_START) { wmm->dwPositionMS = 0; @@ -1643,11 +1561,8 @@ static DWORD MIDI_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) TRACE("Seeking to position=%u ms\n", wmm->dwPositionMS); - if (dwFlags & MCI_NOTIFY) { - TRACE("MCI_NOTIFY_SUCCESSFUL %08lX !\n", lpParms->dwCallback); - mciDriverNotify(HWND_32(LOWORD(lpParms->dwCallback)), - wmm->wNotifyDeviceID, MCI_NOTIFY_SUCCESSFUL); - } + if (dwFlags & MCI_NOTIFY) + MIDI_mciNotify(lpParms->dwCallback, wmm, MCI_NOTIFY_SUCCESSFUL); } return ret; } @@ -1662,6 +1577,7 @@ static DWORD MIDI_mciSeek(UINT wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lpParms) LRESULT CALLBACK MCIMIDI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, LPARAM dwParam1, LPARAM dwParam2) { + WINE_MCIMIDI* wmm; switch (wMsg) { case DRV_LOAD: return 1; case DRV_FREE: return 1; @@ -1674,51 +1590,32 @@ LRESULT CALLBACK MCIMIDI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, case DRV_OPEN: return MIDI_drvOpen((LPCWSTR)dwParam1, (LPMCI_OPEN_DRIVER_PARMSW)dwParam2); case DRV_CLOSE: return MIDI_drvClose(dwDevID); } + if ((wMsg < DRV_MCI_FIRST) || (wMsg > DRV_MCI_LAST)) { + TRACE("Sending msg %04x to default driver proc\n", wMsg); + return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); + } - if (dwDevID == 0xFFFFFFFF) return MCIERR_UNSUPPORTED_FUNCTION; + wmm = MIDI_mciGetOpenDev(dwDevID, wMsg); + if (wmm == NULL) return MCIERR_INVALID_DEVICE_ID; switch (wMsg) { - case MCI_OPEN_DRIVER: return MIDI_mciOpen (dwDevID, dwParam1, (LPMCI_OPEN_PARMSW) dwParam2); - case MCI_CLOSE_DRIVER: return MIDI_mciClose (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); - 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_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); - case MCI_GETDEVCAPS: return MIDI_mciGetDevCaps(dwDevID, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2); - case MCI_INFO: return MIDI_mciInfo (dwDevID, dwParam1, (LPMCI_INFO_PARMSW) dwParam2); - case MCI_SEEK: return MIDI_mciSeek (dwDevID, dwParam1, (LPMCI_SEEK_PARMS) dwParam2); - /* commands that should be supported */ - case MCI_LOAD: - case MCI_SAVE: - case MCI_FREEZE: - case MCI_PUT: - case MCI_REALIZE: - case MCI_UNFREEZE: - case MCI_UPDATE: - case MCI_WHERE: - case MCI_STEP: - case MCI_SPIN: - case MCI_ESCAPE: - case MCI_COPY: - case MCI_CUT: - case MCI_DELETE: - case MCI_PASTE: - WARN("Unsupported command [%u]\n", wMsg); - break; - /* commands that should report an error */ - case MCI_WINDOW: - TRACE("Unsupported command [%u]\n", wMsg); - break; + case MCI_OPEN_DRIVER: return MIDI_mciOpen (wmm, dwParam1, (LPMCI_OPEN_PARMSW) dwParam2); + case MCI_CLOSE_DRIVER: return MIDI_mciClose (wmm, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); + case MCI_PLAY: return MIDI_mciPlay (wmm, dwParam1, (LPMCI_PLAY_PARMS) dwParam2); + case MCI_STOP: return MIDI_mciStop (wmm, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); + case MCI_SET: return MIDI_mciSet (wmm, dwParam1, (LPMCI_SEQ_SET_PARMS) dwParam2); + case MCI_PAUSE: return MIDI_mciPause (wmm, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); + case MCI_RESUME: return MIDI_mciResume (wmm, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); + case MCI_STATUS: return MIDI_mciStatus (wmm, dwParam1, (LPMCI_STATUS_PARMS) dwParam2); + case MCI_GETDEVCAPS: return MIDI_mciGetDevCaps(wmm, dwParam1, (LPMCI_GETDEVCAPS_PARMS)dwParam2); + case MCI_INFO: return MIDI_mciInfo (wmm, dwParam1, (LPMCI_INFO_PARMSW) dwParam2); + case MCI_SEEK: return MIDI_mciSeek (wmm, dwParam1, (LPMCI_SEEK_PARMS) dwParam2); case MCI_OPEN: case MCI_CLOSE: FIXME("Shouldn't receive a MCI_OPEN or CLOSE message\n"); - break; + /* fall through */ default: - TRACE("Sending msg [%u] to default driver proc\n", wMsg); - return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); + TRACE("Unsupported command [0x%x]\n", wMsg); + return MCIERR_UNSUPPORTED_FUNCTION; /* Win9x: MCIERR_UNRECOGNIZED_COMMAND */ } - return MCIERR_UNRECOGNIZED_COMMAND; } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 56d163b4a89..f255446c5cc 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -86,7 +86,7 @@ reactos/dll/win32/mapi32 # Autosync reactos/dll/win32/mciavi32 # Synced to Wine-1.3.37 reactos/dll/win32/mcicda # Synced to Wine-1.3.37 reactos/dll/win32/mciqtz32 # Autosync -reactos/dll/win32/mciseq # Autosync +reactos/dll/win32/mciseq # Synced to Wine-1.3.37 reactos/dll/win32/mciwave # Autosync reactos/dll/win32/mlang # Autosync reactos/dll/win32/mpr # Autosync From 75941229624a9f4899ae379c299168682f405bcb Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Wed, 25 Jan 2012 19:13:31 +0000 Subject: [PATCH 084/289] [PSDK] * Update wincon.h annotations. svn path=/trunk/; revision=55180 --- reactos/include/psdk/wincon.h | 239 +++++++++++++++++++++++++++------- 1 file changed, 190 insertions(+), 49 deletions(-) diff --git a/reactos/include/psdk/wincon.h b/reactos/include/psdk/wincon.h index cbe02275d6a..2bea36c6941 100644 --- a/reactos/include/psdk/wincon.h +++ b/reactos/include/psdk/wincon.h @@ -101,7 +101,7 @@ typedef struct _CONSOLE_SCREEN_BUFFER_INFO { SMALL_RECT srWindow; COORD dwMaximumWindowSize; } CONSOLE_SCREEN_BUFFER_INFO,*PCONSOLE_SCREEN_BUFFER_INFO; -typedef BOOL(CALLBACK *PHANDLER_ROUTINE)(DWORD); +typedef BOOL(CALLBACK *PHANDLER_ROUTINE)(_In_ DWORD); typedef struct _KEY_EVENT_RECORD { BOOL bKeyDown; WORD wRepeatCount; @@ -175,72 +175,213 @@ typedef struct _CONSOLE_FONT_INFOEX { BOOL WINAPI AllocConsole(void); #if (_WIN32_WINNT >= 0x0501) #define ATTACH_PARENT_PROCESS (DWORD)-1 -BOOL WINAPI AttachConsole(DWORD); -BOOL WINAPI AddConsoleAliasA(LPCSTR,LPCSTR,LPCSTR); -BOOL WINAPI AddConsoleAliasW(LPCWSTR,LPCWSTR,LPCWSTR); -DWORD WINAPI GetConsoleAliasA(LPSTR,LPSTR,DWORD,LPSTR); -DWORD WINAPI GetConsoleAliasW(LPWSTR,LPWSTR,DWORD,LPWSTR); -DWORD WINAPI GetConsoleAliasesA(LPSTR,DWORD,LPSTR); -DWORD WINAPI GetConsoleAliasesW(LPWSTR,DWORD,LPWSTR); -DWORD WINAPI GetConsoleAliasesLengthA(LPSTR); -DWORD WINAPI GetConsoleAliasesLengthW(LPWSTR); +BOOL WINAPI AttachConsole(_In_ DWORD); +BOOL WINAPI AddConsoleAliasA(_In_ LPCSTR, _In_ LPCSTR, _In_ LPCSTR); +BOOL WINAPI AddConsoleAliasW(_In_ LPCWSTR, _In_ LPCWSTR, _In_ LPCWSTR); + +DWORD +WINAPI +GetConsoleAliasA( + _In_ LPSTR Source, + _Out_writes_(TargetBufferLength) LPSTR TargetBuffer, + _In_ DWORD TargetBufferLength, + _In_ LPSTR ExeName); + +DWORD +WINAPI +GetConsoleAliasW( + _In_ LPWSTR Source, + _Out_writes_(TargetBufferLength) LPWSTR TargetBuffer, + _In_ DWORD TargetBufferLength, + _In_ LPWSTR ExeName); + +DWORD +WINAPI +GetConsoleAliasesA( + _Out_writes_(AliasBufferLength) LPSTR AliasBuffer, + _In_ DWORD AliasBufferLength, + _In_ LPSTR ExeName); + +DWORD +WINAPI +GetConsoleAliasesW( + _Out_writes_(AliasBufferLength) LPWSTR AliasBuffer, + _In_ DWORD AliasBufferLength, + _In_ LPWSTR ExeName); + +DWORD WINAPI GetConsoleAliasesLengthA(_In_ LPSTR); +DWORD WINAPI GetConsoleAliasesLengthW(_In_ LPWSTR); #endif -HANDLE WINAPI CreateConsoleScreenBuffer(DWORD,DWORD,CONST SECURITY_ATTRIBUTES*,DWORD,LPVOID); -BOOL WINAPI FillConsoleOutputAttribute(HANDLE,WORD,DWORD,COORD,PDWORD); -BOOL WINAPI FillConsoleOutputCharacterA(HANDLE,CHAR,DWORD,COORD,PDWORD); -BOOL WINAPI FillConsoleOutputCharacterW(HANDLE,WCHAR,DWORD,COORD,PDWORD); -BOOL WINAPI FlushConsoleInputBuffer(HANDLE); +HANDLE WINAPI CreateConsoleScreenBuffer(_In_ DWORD, _In_ DWORD, _In_opt_ CONST SECURITY_ATTRIBUTES*, _In_ DWORD, _Reserved_ LPVOID); +BOOL WINAPI FillConsoleOutputAttribute(_In_ HANDLE, _In_ WORD, _In_ DWORD, _In_ COORD, _Out_ PDWORD); +BOOL WINAPI FillConsoleOutputCharacterA(_In_ HANDLE, _In_ CHAR, _In_ DWORD, _In_ COORD, _Out_ PDWORD); +BOOL WINAPI FillConsoleOutputCharacterW(_In_ HANDLE, _In_ WCHAR, _In_ DWORD, _In_ COORD, _Out_ PDWORD); +BOOL WINAPI FlushConsoleInputBuffer(_In_ HANDLE); BOOL WINAPI FreeConsole(void); -BOOL WINAPI GenerateConsoleCtrlEvent(DWORD,DWORD); +BOOL WINAPI GenerateConsoleCtrlEvent(_In_ DWORD, _In_ DWORD); UINT WINAPI GetConsoleCP(void); -BOOL WINAPI GetConsoleCursorInfo(HANDLE,PCONSOLE_CURSOR_INFO); +BOOL WINAPI GetConsoleCursorInfo(_In_ HANDLE, _Out_ PCONSOLE_CURSOR_INFO); BOOL WINAPI GetConsoleMode(HANDLE,PDWORD); UINT WINAPI GetConsoleOutputCP(void); -BOOL WINAPI GetConsoleScreenBufferInfo(HANDLE,PCONSOLE_SCREEN_BUFFER_INFO); -DWORD WINAPI GetConsoleTitleA(LPSTR,DWORD); -DWORD WINAPI GetConsoleTitleW(LPWSTR,DWORD); +BOOL WINAPI GetConsoleScreenBufferInfo(_In_ HANDLE, _Out_ PCONSOLE_SCREEN_BUFFER_INFO); + +DWORD +WINAPI +GetConsoleTitleA( + _Out_writes_(nSize) LPSTR lpConsoleTitle, + _In_ DWORD nSize); + +DWORD +WINAPI +GetConsoleTitleW( + _Out_writes_(nSize) LPWSTR lpConsoleTitle, + _In_ DWORD nSize); + #if (_WIN32_WINNT >= 0x0500) HWND WINAPI GetConsoleWindow(void); -WINBASEAPI BOOL APIENTRY GetConsoleDisplayMode(OUT LPDWORD lpModeFlags); -BOOL APIENTRY SetConsoleDisplayMode(IN HANDLE hConsoleOutput,IN DWORD dwFlags, OUT PCOORD lpNewScreenBufferDimensions); +WINBASEAPI BOOL APIENTRY GetConsoleDisplayMode(_Out_ LPDWORD lpModeFlags); +BOOL APIENTRY SetConsoleDisplayMode(_In_ HANDLE hConsoleOutput, _In_ DWORD dwFlags, _Out_opt_ PCOORD lpNewScreenBufferDimensions); #endif -COORD WINAPI GetLargestConsoleWindowSize(HANDLE); +COORD WINAPI GetLargestConsoleWindowSize(_In_ HANDLE); BOOL WINAPI GetNumberOfConsoleInputEvents(HANDLE,PDWORD); -BOOL WINAPI GetNumberOfConsoleMouseButtons(PDWORD); +BOOL WINAPI GetNumberOfConsoleMouseButtons(_Out_ PDWORD); BOOL WINAPI PeekConsoleInputA(HANDLE,PINPUT_RECORD,DWORD,PDWORD); -BOOL WINAPI PeekConsoleInputW(HANDLE,PINPUT_RECORD,DWORD,PDWORD); + +BOOL +WINAPI +PeekConsoleInputW( + _In_ HANDLE hConsoleInput, + _Out_writes_(nLength) PINPUT_RECORD lpBuffer, + _In_ DWORD nLength, + _Out_ LPDWORD lpNumberOfEventsRead); + BOOL WINAPI ReadConsoleA(HANDLE,PVOID,DWORD,PDWORD,PCONSOLE_READCONSOLE_CONTROL); BOOL WINAPI ReadConsoleW(HANDLE,PVOID,DWORD,PDWORD,PCONSOLE_READCONSOLE_CONTROL); BOOL WINAPI ReadConsoleInputA(HANDLE,PINPUT_RECORD,DWORD,PDWORD); BOOL WINAPI ReadConsoleInputW(HANDLE,PINPUT_RECORD,DWORD,PDWORD); -BOOL WINAPI ReadConsoleOutputAttribute(HANDLE,LPWORD,DWORD,COORD,LPDWORD); -BOOL WINAPI ReadConsoleOutputCharacterA(HANDLE,LPSTR,DWORD,COORD,PDWORD); -BOOL WINAPI ReadConsoleOutputCharacterW(HANDLE,LPWSTR,DWORD,COORD,PDWORD); -BOOL WINAPI ReadConsoleOutputA(HANDLE,PCHAR_INFO,COORD,COORD,PSMALL_RECT); -BOOL WINAPI ReadConsoleOutputW(HANDLE,PCHAR_INFO,COORD,COORD,PSMALL_RECT); -BOOL WINAPI ScrollConsoleScreenBufferA(HANDLE,const SMALL_RECT*,const SMALL_RECT*,COORD,const CHAR_INFO*); -BOOL WINAPI ScrollConsoleScreenBufferW(HANDLE,const SMALL_RECT*,const SMALL_RECT*,COORD,const CHAR_INFO*); -BOOL WINAPI SetConsoleActiveScreenBuffer(HANDLE); -BOOL WINAPI SetConsoleCP(UINT); + +BOOL +WINAPI +ReadConsoleOutputAttribute( + _In_ HANDLE hConsoleOutput, + _Out_writes_(nLength) LPWORD lpAttribute, + _In_ DWORD nLength, + _In_ COORD dwReadCoord, + _Out_ LPDWORD lpNumberOfAttrsRead); + +BOOL +WINAPI +ReadConsoleOutputCharacterA( + _In_ HANDLE hConsoleOutput, + _Out_writes_(nLength) LPSTR lpCharacter, + _In_ DWORD nLength, + _In_ COORD dwReadCoord, + _Out_ LPDWORD lpNumberOfCharsRead); + +BOOL +WINAPI +ReadConsoleOutputCharacterW( + _In_ HANDLE hConsoleOutput, + _Out_writes_(nLength) LPWSTR lpCharacter, + _In_ DWORD nLength, + _In_ COORD dwReadCoord, + _Out_ LPDWORD lpNumberOfCharsRead); + +BOOL +WINAPI +ReadConsoleOutputA( + _In_ HANDLE hConsoleOutput, + _Out_writes_(dwBufferSize.X * dwBufferSize.Y) PCHAR_INFO lpBuffer, + _In_ COORD dwBufferSize, + _In_ COORD dwBufferCoord, + _Inout_ PSMALL_RECT lpReadRegion); + +BOOL +WINAPI +ReadConsoleOutputW( + _In_ HANDLE hConsoleOutput, + _Out_writes_(dwBufferSize.X * dwBufferSize.Y) PCHAR_INFO lpBuffer, + _In_ COORD dwBufferSize, + _In_ COORD dwBufferCoord, + _Inout_ PSMALL_RECT lpReadRegion); + +BOOL WINAPI ScrollConsoleScreenBufferA(_In_ HANDLE, _In_ const SMALL_RECT*, _In_opt_ const SMALL_RECT*, _In_ COORD, _In_ const CHAR_INFO*); +BOOL WINAPI ScrollConsoleScreenBufferW(_In_ HANDLE, _In_ const SMALL_RECT*, _In_opt_ const SMALL_RECT*, _In_ COORD, _In_ const CHAR_INFO*); +BOOL WINAPI SetConsoleActiveScreenBuffer(_In_ HANDLE); +BOOL WINAPI SetConsoleCP(_In_ UINT); BOOL WINAPI SetConsoleCtrlHandler(PHANDLER_ROUTINE,BOOL); -BOOL WINAPI SetConsoleCursorInfo(HANDLE,const CONSOLE_CURSOR_INFO*); -BOOL WINAPI SetConsoleCursorPosition(HANDLE,COORD); +BOOL WINAPI SetConsoleCursorInfo(_In_ HANDLE, _In_ const CONSOLE_CURSOR_INFO*); +BOOL WINAPI SetConsoleCursorPosition(_In_ HANDLE, _In_ COORD); BOOL WINAPI SetConsoleMode(HANDLE,DWORD); -BOOL WINAPI SetConsoleOutputCP(UINT); -BOOL WINAPI SetConsoleScreenBufferSize(HANDLE,COORD); -BOOL WINAPI SetConsoleTextAttribute(HANDLE,WORD); -BOOL WINAPI SetConsoleTitleA(LPCSTR); -BOOL WINAPI SetConsoleTitleW(LPCWSTR); -BOOL WINAPI SetConsoleWindowInfo(HANDLE,BOOL,const SMALL_RECT*); +BOOL WINAPI SetConsoleOutputCP(_In_ UINT); +BOOL WINAPI SetConsoleScreenBufferSize(_In_ HANDLE, _In_ COORD); +BOOL WINAPI SetConsoleTextAttribute(_In_ HANDLE, _In_ WORD); +BOOL WINAPI SetConsoleTitleA(_In_ LPCSTR); +BOOL WINAPI SetConsoleTitleW(_In_ LPCWSTR); +BOOL WINAPI SetConsoleWindowInfo(_In_ HANDLE, _In_ BOOL, _In_ const SMALL_RECT*); BOOL WINAPI WriteConsoleA(HANDLE,CONST VOID*,DWORD,LPDWORD,LPVOID); BOOL WINAPI WriteConsoleW(HANDLE,CONST VOID*,DWORD,LPDWORD,LPVOID); -BOOL WINAPI WriteConsoleInputA(HANDLE,const INPUT_RECORD*,DWORD,PDWORD); -BOOL WINAPI WriteConsoleInputW(HANDLE,const INPUT_RECORD*,DWORD,PDWORD); -BOOL WINAPI WriteConsoleOutputA(HANDLE,const CHAR_INFO*,COORD,COORD,PSMALL_RECT); -BOOL WINAPI WriteConsoleOutputW(HANDLE,const CHAR_INFO*,COORD,COORD,PSMALL_RECT); -BOOL WINAPI WriteConsoleOutputAttribute(HANDLE,const WORD*,DWORD,COORD,PDWORD); -BOOL WINAPI WriteConsoleOutputCharacterA(HANDLE,LPCSTR,DWORD,COORD,PDWORD); -BOOL WINAPI WriteConsoleOutputCharacterW(HANDLE,LPCWSTR,DWORD,COORD,PDWORD); + +BOOL +WINAPI +WriteConsoleInputA( + _In_ HANDLE hConsoleInput, + _In_reads_(nLength) CONST INPUT_RECORD *lpBuffer, + _In_ DWORD nLength, + _Out_ LPDWORD lpNumberOfEventsWritten); + +BOOL +WINAPI +WriteConsoleInputW( + _In_ HANDLE hConsoleInput, + _In_reads_(nLength) CONST INPUT_RECORD *lpBuffer, + _In_ DWORD nLength, + _Out_ LPDWORD lpNumberOfEventsWritten); + +BOOL +WINAPI +WriteConsoleOutputA( + _In_ HANDLE hConsoleOutput, + _In_reads_(dwBufferSize.X * dwBufferSize.Y) CONST CHAR_INFO *lpBuffer, + _In_ COORD dwBufferSize, + _In_ COORD dwBufferCoord, + _Inout_ PSMALL_RECT lpWriteRegion); + +BOOL +WINAPI +WriteConsoleOutputW( + _In_ HANDLE hConsoleOutput, + _In_reads_(dwBufferSize.X * dwBufferSize.Y) CONST CHAR_INFO *lpBuffer, + _In_ COORD dwBufferSize, + _In_ COORD dwBufferCoord, + _Inout_ PSMALL_RECT lpWriteRegion); + +BOOL +WINAPI +WriteConsoleOutputAttribute( + _In_ HANDLE hConsoleOutput, + _In_reads_(nLength) CONST WORD *lpAttribute, + _In_ DWORD nLength, + _In_ COORD dwWriteCoord, + _Out_ LPDWORD lpNumberOfAttrsWritten); + +BOOL +WINAPI +WriteConsoleOutputCharacterA( + _In_ HANDLE hConsoleOutput, + _In_reads_(nLength) LPCSTR lpCharacter, + _In_ DWORD nLength, + _In_ COORD dwWriteCoord, + _Out_ LPDWORD lpNumberOfCharsWritten); + +BOOL +WINAPI +WriteConsoleOutputCharacterW( + _In_ HANDLE hConsoleOutput, + _In_reads_(nLength) LPCWSTR lpCharacter, + _In_ DWORD nLength, + _In_ COORD dwWriteCoord, + _Out_ LPDWORD lpNumberOfCharsWritten); #define CONSOLE_FULLSCREEN 1 #define CONSOLE_FULLSCREEN_HARDWARE 2 From 84c799fc9b65204962e8bb7ba2a5d139f41050d8 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 25 Jan 2012 20:20:04 +0000 Subject: [PATCH 085/289] [VIDEOPRT] - Create DEVICEMAP\VIDEO key with proper length. Fixes a bug exposed as "Arwinss unable to change resolution". See issue #6838 for more details. svn path=/trunk/; revision=55183 --- reactos/drivers/video/videoprt/videoprt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 3dac521f9a8..04d7a8c57e1 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -492,7 +492,7 @@ IntVideoPortFindAdapter( DeviceVideoBuffer, REG_SZ, DeviceExtension->RegistryPath.Buffer, - DeviceExtension->RegistryPath.MaximumLength); + DeviceExtension->RegistryPath.Length); RtlWriteRegistryValue( RTL_REGISTRY_DEVICEMAP, From 94ea8b7bfad27013b3919598ba4daee97b526649 Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Wed, 25 Jan 2012 22:09:49 +0000 Subject: [PATCH 086/289] - Better fix for the registry value bug introduced by Rafal. The string is guaranteed to be NULL terminated, however MaximumLength is off by one in some cases (more specifically in videoprt.c:131 two NULLs are being added by sizeof(Insert1) and sizeof(Insert2)). See issue #6838 for more details. svn path=/trunk/; revision=55184 --- reactos/drivers/video/videoprt/videoprt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/video/videoprt/videoprt.c b/reactos/drivers/video/videoprt/videoprt.c index 04d7a8c57e1..d3547ee68b0 100644 --- a/reactos/drivers/video/videoprt/videoprt.c +++ b/reactos/drivers/video/videoprt/videoprt.c @@ -492,7 +492,7 @@ IntVideoPortFindAdapter( DeviceVideoBuffer, REG_SZ, DeviceExtension->RegistryPath.Buffer, - DeviceExtension->RegistryPath.Length); + DeviceExtension->RegistryPath.Length + sizeof(UNICODE_NULL)); RtlWriteRegistryValue( RTL_REGISTRY_DEVICEMAP, From 3abad07395e0e86013b5a4923d4c3c8c1ad14124 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 14:46:32 +0000 Subject: [PATCH 087/289] [STRMIIDS] * Add CLSID_MediaStreamFilter. svn path=/trunk/; revision=55198 --- reactos/lib/sdk/strmiids/strmiids.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/lib/sdk/strmiids/strmiids.c b/reactos/lib/sdk/strmiids/strmiids.c index 26824d00de5..97de20178c7 100644 --- a/reactos/lib/sdk/strmiids/strmiids.c +++ b/reactos/lib/sdk/strmiids/strmiids.c @@ -17,6 +17,7 @@ DEFINE_GUID(CLSID_AMAudioData,0xf2468580,0xaf8a,0x11d0,0x82,0x12,0x00,0xc0,0x4f, DEFINE_GUID(CLSID_AMAudioStream,0x8496e040,0xaf4c,0x11d0,0x82,0x12,0x00,0xc0,0x4f,0xc3,0x2c,0x45); DEFINE_GUID(CLSID_AMDirectDrawStream,0x49c47ce4,0x9ba4,0x11d0,0x82,0x12,0x00,0xc0,0x4f,0xc3,0x2c,0x45); DEFINE_GUID(CLSID_AMMediaTypeStream,0xcf0f2f7c,0xf7bf,0x11d0,0x90,0xd,0x0,0xc0,0x4f,0xd9,0x18,0x9d); +DEFINE_GUID(CLSID_MediaStreamFilter,0x49c47ce0,0x9ba4,0x11d0,0x82,0x12,0x0,0xc0,0x4f,0xc3,0x2c,0x45); DEFINE_GUID(MSPID_PrimaryAudio,0xa35ff56b,0x9fda,0x11d0,0x8f,0xdf,0x0,0xc0,0x4f,0xd9,0x18,0x9d); DEFINE_GUID(MSPID_PrimaryVideo,0xa35ff56a,0x9fda,0x11d0,0x8f,0xdf,0x0,0xc0,0x4f,0xd9,0x18,0x9d); DEFINE_GUID(AM_INTERFACESETID_Standard,0x1a8766a0l,0x62ce,0x11cf,0xa5,0xd6,0x28,0xdb,0x04,0xc1,0x00,0x00); From 20becb4a6e83bd7e2caac8bec704d78a414b7885 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 15:03:30 +0000 Subject: [PATCH 088/289] [AMSTREAM] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55199 --- reactos/dll/directx/amstream/CMakeLists.txt | 18 +- reactos/dll/directx/amstream/amstream.c | 64 ++- reactos/dll/directx/amstream/amstream.rbuild | 2 - reactos/dll/directx/amstream/amstream.rgs | 21 + .../dll/directx/amstream/amstream_classes.idl | 40 ++ reactos/dll/directx/amstream/amstream_i.c | 14 - .../dll/directx/amstream/amstream_private.h | 11 +- reactos/dll/directx/amstream/main.c | 22 +- reactos/dll/directx/amstream/mediastream.c | 233 +++----- .../dll/directx/amstream/mediastreamfilter.c | 70 ++- reactos/dll/directx/amstream/regsvr.c | 505 ------------------ reactos/dll/directx/amstream/version.rc | 2 + reactos/media/doc/README.WINE | 2 +- 13 files changed, 240 insertions(+), 764 deletions(-) create mode 100644 reactos/dll/directx/amstream/amstream.rgs create mode 100644 reactos/dll/directx/amstream/amstream_classes.idl delete mode 100644 reactos/dll/directx/amstream/amstream_i.c delete mode 100644 reactos/dll/directx/amstream/regsvr.c diff --git a/reactos/dll/directx/amstream/CMakeLists.txt b/reactos/dll/directx/amstream/CMakeLists.txt index ef51b60ebf6..068f25db3f8 100644 --- a/reactos/dll/directx/amstream/CMakeLists.txt +++ b/reactos/dll/directx/amstream/CMakeLists.txt @@ -6,6 +6,7 @@ add_definitions(-D_WIN32_WINNT=0x600) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +set_rc_compiler() spec2def(amstream.dll amstream.spec) add_library(amstream SHARED @@ -13,24 +14,11 @@ add_library(amstream SHARED main.c mediastream.c mediastreamfilter.c - regsvr.c - amstream_i.c version.rc ${CMAKE_CURRENT_BINARY_DIR}/amstream.def) set_module_type(amstream win32dll) - -target_link_libraries(amstream - strmiids - uuid - wine) - -add_importlibs(amstream - ole32 - advapi32 - msvcrt - kernel32 - ntdll) - +target_link_libraries(amstream strmiids uuid wine) +add_importlibs(amstream ole32 advapi32 msvcrt kernel32 ntdll) add_dependencies(amstream dxsdk) add_cd_file(TARGET amstream DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/directx/amstream/amstream.c b/reactos/dll/directx/amstream/amstream.c index f8ae2a6e39b..bebe6e80208 100644 --- a/reactos/dll/directx/amstream/amstream.c +++ b/reactos/dll/directx/amstream/amstream.c @@ -4,9 +4,6 @@ * Copyright 2004 Christian Costa * Copyright 2006 Ivan Leo Puoti * - * This file contains the (internal) driver registration functions, - * driver enumeration APIs and DirectDraw creation functions. - * * 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 @@ -35,7 +32,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(amstream); typedef struct { - const IAMMultiMediaStreamVtbl *lpVtbl; + IAMMultiMediaStream IAMMultiMediaStream_iface; LONG ref; IGraphBuilder* pFilterGraph; IPin* ipin; @@ -45,6 +42,11 @@ typedef struct { STREAM_TYPE StreamType; } IAMMultiMediaStreamImpl; +static inline IAMMultiMediaStreamImpl *impl_from_IAMMultiMediaStream(IAMMultiMediaStream *iface) +{ + return CONTAINING_RECORD(iface, IAMMultiMediaStreamImpl, IAMMultiMediaStream_iface); +} + static const struct IAMMultiMediaStreamVtbl AM_Vtbl; HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj) @@ -63,7 +65,7 @@ HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj) return E_OUTOFMEMORY; } - object->lpVtbl = &AM_Vtbl; + object->IAMMultiMediaStream_iface.lpVtbl = &AM_Vtbl; object->ref = 1; *ppObj = object; @@ -74,14 +76,15 @@ HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj) /*** IUnknown methods ***/ static HRESULT WINAPI IAMMultiMediaStreamImpl_QueryInterface(IAMMultiMediaStream* iface, REFIID riid, void** ppvObject) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject); if (IsEqualGUID(riid, &IID_IUnknown) || + IsEqualGUID(riid, &IID_IMultiMediaStream) || IsEqualGUID(riid, &IID_IAMMultiMediaStream)) { - IClassFactory_AddRef(iface); + IUnknown_AddRef(iface); *ppvObject = This; return S_OK; } @@ -93,7 +96,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_QueryInterface(IAMMultiMediaStream static ULONG WINAPI IAMMultiMediaStreamImpl_AddRef(IAMMultiMediaStream* iface) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); TRACE("(%p/%p)\n", iface, This); @@ -102,7 +105,7 @@ static ULONG WINAPI IAMMultiMediaStreamImpl_AddRef(IAMMultiMediaStream* iface) static ULONG WINAPI IAMMultiMediaStreamImpl_Release(IAMMultiMediaStream* iface) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p/%p)\n", iface, This); @@ -116,7 +119,7 @@ static ULONG WINAPI IAMMultiMediaStreamImpl_Release(IAMMultiMediaStream* iface) /*** IMultiMediaStream methods ***/ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetInformation(IAMMultiMediaStream* iface, DWORD* pdwFlags, STREAM_TYPE* pStreamType) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->(%p,%p) stub!\n", This, iface, pdwFlags, pStreamType); @@ -125,7 +128,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetInformation(IAMMultiMediaStream static HRESULT WINAPI IAMMultiMediaStreamImpl_GetMediaStream(IAMMultiMediaStream* iface, REFMSPID idPurpose, IMediaStream** ppMediaStream) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); MSPID PurposeId; unsigned int i; @@ -147,7 +150,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetMediaStream(IAMMultiMediaStream static HRESULT WINAPI IAMMultiMediaStreamImpl_EnumMediaStreams(IAMMultiMediaStream* iface, LONG Index, IMediaStream** ppMediaStream) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->(%d,%p) stub!\n", This, iface, Index, ppMediaStream); @@ -156,7 +159,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_EnumMediaStreams(IAMMultiMediaStre static HRESULT WINAPI IAMMultiMediaStreamImpl_GetState(IAMMultiMediaStream* iface, STREAM_STATE* pCurrentState) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->(%p) stub!\n", This, iface, pCurrentState); @@ -165,7 +168,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetState(IAMMultiMediaStream* ifac static HRESULT WINAPI IAMMultiMediaStreamImpl_SetState(IAMMultiMediaStream* iface, STREAM_STATE NewState) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->() stub!\n", This, iface); @@ -174,7 +177,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_SetState(IAMMultiMediaStream* ifac static HRESULT WINAPI IAMMultiMediaStreamImpl_GetTime(IAMMultiMediaStream* iface, STREAM_TIME* pCurrentTime) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->(%p) stub!\n", This, iface, pCurrentTime); @@ -183,7 +186,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetTime(IAMMultiMediaStream* iface static HRESULT WINAPI IAMMultiMediaStreamImpl_GetDuration(IAMMultiMediaStream* iface, STREAM_TIME* pDuration) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->(%p) stub!\n", This, iface, pDuration); @@ -192,7 +195,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetDuration(IAMMultiMediaStream* i static HRESULT WINAPI IAMMultiMediaStreamImpl_Seek(IAMMultiMediaStream* iface, STREAM_TIME SeekTime) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->() stub!\n", This, iface); @@ -201,7 +204,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_Seek(IAMMultiMediaStream* iface, S static HRESULT WINAPI IAMMultiMediaStreamImpl_GetEndOfStream(IAMMultiMediaStream* iface, HANDLE* phEOS) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->(%p) stub!\n", This, iface, phEOS); @@ -211,7 +214,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetEndOfStream(IAMMultiMediaStream /*** IAMMultiMediaStream methods ***/ static HRESULT WINAPI IAMMultiMediaStreamImpl_Initialize(IAMMultiMediaStream* iface, STREAM_TYPE StreamType, DWORD dwFlags, IGraphBuilder* pFilterGraph) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); HRESULT hr = S_OK; TRACE("(%p/%p)->(%x,%x,%p)\n", This, iface, (DWORD)StreamType, dwFlags, pFilterGraph); @@ -236,7 +239,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_Initialize(IAMMultiMediaStream* if static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilterGraph(IAMMultiMediaStream* iface, IGraphBuilder** ppGraphBuilder) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); TRACE("(%p/%p)->(%p)\n", This, iface, ppGraphBuilder); @@ -253,7 +256,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilterGraph(IAMMultiMediaStream static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilter(IAMMultiMediaStream* iface, IMediaStreamFilter** ppFilter) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppFilter); @@ -263,29 +266,22 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_GetFilter(IAMMultiMediaStream* ifa static HRESULT WINAPI IAMMultiMediaStreamImpl_AddMediaStream(IAMMultiMediaStream* iface, IUnknown* pStreamObject, const MSPID* PurposeId, DWORD dwFlags, IMediaStream** ppNewStream) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); HRESULT hr; IMediaStream* pStream; IMediaStream** pNewStreams; FIXME("(%p/%p)->(%p,%s,%x,%p) partial stub!\n", This, iface, pStreamObject, debugstr_guid(PurposeId), dwFlags, ppNewStream); - if (IsEqualGUID(PurposeId, &MSPID_PrimaryVideo)) - hr = DirectDrawMediaStream_create((IMultiMediaStream*)iface, PurposeId, This->StreamType, &pStream); - else - hr = MediaStream_create((IMultiMediaStream*)iface, PurposeId, This->StreamType, &pStream); - + hr = mediastream_create((IMultiMediaStream*)iface, PurposeId, This->StreamType, &pStream); if (SUCCEEDED(hr)) { - pNewStreams = CoTaskMemAlloc((This->nbStreams+1)*sizeof(IMediaStream*)); + pNewStreams = CoTaskMemRealloc(This->pStreams, (This->nbStreams+1) * sizeof(IMediaStream*)); if (!pNewStreams) { IMediaStream_Release(pStream); return E_OUTOFMEMORY; } - if (This->nbStreams) - CopyMemory(pNewStreams, This->pStreams, This->nbStreams*sizeof(IMediaStream*)); - CoTaskMemFree(This->pStreams); This->pStreams = pNewStreams; This->pStreams[This->nbStreams] = pStream; This->nbStreams++; @@ -300,7 +296,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_AddMediaStream(IAMMultiMediaStream static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenFile(IAMMultiMediaStream* iface, LPCWSTR pszFileName, DWORD dwFlags) { HRESULT ret; - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); IFileSourceFilter *SourceFilter; IBaseFilter *BaseFilter; IEnumPins *EnumPins; @@ -373,7 +369,7 @@ end: static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenMoniker(IAMMultiMediaStream* iface, IBindCtx* pCtx, IMoniker* pMoniker, DWORD dwFlags) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->(%p,%p,%x) stub!\n", This, iface, pCtx, pMoniker, dwFlags); @@ -382,7 +378,7 @@ static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenMoniker(IAMMultiMediaStream* i static HRESULT WINAPI IAMMultiMediaStreamImpl_Render(IAMMultiMediaStream* iface, DWORD dwFlags) { - IAMMultiMediaStreamImpl *This = (IAMMultiMediaStreamImpl *)iface; + IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); FIXME("(%p/%p)->(%x) partial stub!\n", This, iface, dwFlags); diff --git a/reactos/dll/directx/amstream/amstream.rbuild b/reactos/dll/directx/amstream/amstream.rbuild index 46780d34e0b..26f61d09177 100644 --- a/reactos/dll/directx/amstream/amstream.rbuild +++ b/reactos/dll/directx/amstream/amstream.rbuild @@ -9,8 +9,6 @@ main.c mediastream.c mediastreamfilter.c - regsvr.c - amstream_i.c version.rc wine strmiids diff --git a/reactos/dll/directx/amstream/amstream.rgs b/reactos/dll/directx/amstream/amstream.rgs new file mode 100644 index 00000000000..2497ffbab4b --- /dev/null +++ b/reactos/dll/directx/amstream/amstream.rgs @@ -0,0 +1,21 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{49C47CE0-9BA4-11D0-8212-00C04FC32C45}' = s 'SFilter Class' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{49C47CE4-9BA4-11D0-8212-00C04FC32C45}' = s 'Stream Class' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{49C47CE5-9BA4-11D0-8212-00C04FC32C45}' = s 'MMStream Class' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + } +} diff --git a/reactos/dll/directx/amstream/amstream_classes.idl b/reactos/dll/directx/amstream/amstream_classes.idl new file mode 100644 index 00000000000..701275d2f28 --- /dev/null +++ b/reactos/dll/directx/amstream/amstream_classes.idl @@ -0,0 +1,40 @@ +/* + * COM Classes for amstream + * + * Copyright 2010 Alexandre Julliard + * + * 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 + */ + +[ + helpstring("SFilter Class"), + threading(both), + uuid(49c47ce0-9ba4-11d0-8212-00c04fc32c45) +] +coclass MediaStreamFilter { interface IMediaStreamFilter; } + +[ + helpstring("Stream Class"), + threading(both), + uuid(49c47ce4-9ba4-11d0-8212-00c04fc32c45) +] +coclass AMDirectDrawStream { interface IAMMultiMediaStream; } + +[ + helpstring("MMStream Class"), + threading(both), + uuid(49c47ce5-9ba4-11d0-8212-00c04fc32c45) +] +coclass AMMultiMediaStream { interface IAMMultiMediaStream; } diff --git a/reactos/dll/directx/amstream/amstream_i.c b/reactos/dll/directx/amstream/amstream_i.c deleted file mode 100644 index d978bca54ed..00000000000 --- a/reactos/dll/directx/amstream/amstream_i.c +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -DEFINE_GUID(CLSID_MediaStreamFilter, 0x49c47ce0, 0x9ba4, 0x11d0, 0x82, 0x12, 0x00, 0xc0, 0x4f, 0xc3, 0x2c, 0x45); - -#ifdef __cplusplus -} -#endif diff --git a/reactos/dll/directx/amstream/amstream_private.h b/reactos/dll/directx/amstream/amstream_private.h index b10b632b6df..69fd23f7ca6 100644 --- a/reactos/dll/directx/amstream/amstream_private.h +++ b/reactos/dll/directx/amstream/amstream_private.h @@ -3,9 +3,6 @@ * * Copyright 2004 Christian Costa * - * This file contains the (internal) driver registration functions, - * driver enumeration APIs and DirectDraw creation functions. - * * 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 @@ -34,9 +31,9 @@ #include "dshow.h" #include "mmstream.h" -HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj); -HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, LPVOID *ppObj); -HRESULT MediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, STREAM_TYPE StreamType, IMediaStream** ppMediaStream); -HRESULT DirectDrawMediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, STREAM_TYPE StreamType, IMediaStream** ppMediaStream); +HRESULT AM_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; +HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, LPVOID *ppObj) DECLSPEC_HIDDEN; +HRESULT mediastream_create(IMultiMediaStream *Parent, const MSPID *pPurposeId, + STREAM_TYPE StreamType, IMediaStream **ppMediaStream) DECLSPEC_HIDDEN; #endif /* __AMSTREAM_PRIVATE_INCLUDED__ */ diff --git a/reactos/dll/directx/amstream/main.c b/reactos/dll/directx/amstream/main.c index 8af5619b13d..9f239746e99 100644 --- a/reactos/dll/directx/amstream/main.c +++ b/reactos/dll/directx/amstream/main.c @@ -3,9 +3,6 @@ * * Copyright 2004 Christian Costa * - * This file contains the (internal) driver registration functions, - * driver enumeration APIs and DirectDraw creation functions. - * * 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 @@ -32,6 +29,7 @@ #include "winerror.h" #include "ole2.h" +#include "rpcproxy.h" #include "amstream_private.h" #include "amstream.h" @@ -40,6 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(amstream); +static HINSTANCE instance; static DWORD dll_ref = 0; /* For the moment, do nothing here. */ @@ -47,6 +46,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) { switch(fdwReason) { case DLL_PROCESS_ATTACH: + instance = hInstDLL; DisableThreadLibraryCalls(hInstDLL); break; case DLL_PROCESS_DETACH: @@ -207,3 +207,19 @@ HRESULT WINAPI DllCanUnloadNow(void) { return dll_ref != 0 ? S_FALSE : S_OK; } + +/*********************************************************************** + * DllRegisterServer (AMSTREAM.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( instance ); +} + +/*********************************************************************** + * DllUnregisterServer (AMSTREAM.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( instance ); +} diff --git a/reactos/dll/directx/amstream/mediastream.c b/reactos/dll/directx/amstream/mediastream.c index dc4ec642cf9..12d3542a6fa 100644 --- a/reactos/dll/directx/amstream/mediastream.c +++ b/reactos/dll/directx/amstream/mediastream.c @@ -3,9 +3,6 @@ * * Copyright 2005, 2008 Christian Costa * - * This file contains the (internal) driver registration functions, - * driver enumeration APIs and DirectDraw creation functions. - * * 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 @@ -36,104 +33,75 @@ WINE_DEFAULT_DEBUG_CHANNEL(amstream); typedef struct { - const IMediaStreamVtbl *lpVtbl; - LONG ref; - IMultiMediaStream* Parent; - MSPID PurposeId; - STREAM_TYPE StreamType; -} IMediaStreamImpl; - -typedef struct { - const IDirectDrawMediaStreamVtbl *lpVtbl; + IDirectDrawMediaStream IDirectDrawMediaStream_iface; LONG ref; IMultiMediaStream* Parent; MSPID PurposeId; STREAM_TYPE StreamType; } IDirectDrawMediaStreamImpl; -static const struct IMediaStreamVtbl MediaStream_Vtbl; -static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl; - -HRESULT MediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, STREAM_TYPE StreamType, IMediaStream** ppMediaStream) +static inline IDirectDrawMediaStreamImpl *impl_from_IDirectDrawMediaStream(IDirectDrawMediaStream *iface) { - IMediaStreamImpl* object; - - TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream); - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl)); - if (!object) - { - ERR("Out of memory\n"); - return E_OUTOFMEMORY; - } - - object->lpVtbl = &MediaStream_Vtbl; - object->ref = 1; - - object->Parent = Parent; - object->PurposeId = *pPurposeId; - object->StreamType = StreamType; - - *ppMediaStream = (IMediaStream*)object; - - return S_OK; + return CONTAINING_RECORD(iface, IDirectDrawMediaStreamImpl, IDirectDrawMediaStream_iface); } -/*** IUnknown methods ***/ -static HRESULT WINAPI IMediaStreamImpl_QueryInterface(IMediaStream* iface, REFIID riid, void** ppvObject) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_QueryInterface(IDirectDrawMediaStream *iface, + REFIID riid, void **ppv) { - IMediaStreamImpl *This = (IMediaStreamImpl *)iface; + IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface); - TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject); + TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppv); if (IsEqualGUID(riid, &IID_IUnknown) || - IsEqualGUID(riid, &IID_IMediaStream)) + IsEqualGUID(riid, &IID_IMediaStream) || + IsEqualGUID(riid, &IID_IDirectDrawMediaStream)) { - IClassFactory_AddRef(iface); - *ppvObject = This; - return S_OK; + IUnknown_AddRef(iface); + *ppv = This; + return S_OK; } - ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject); + ERR("(%p)->(%s,%p),not found\n", This, debugstr_guid(riid), ppv); return E_NOINTERFACE; } -static ULONG WINAPI IMediaStreamImpl_AddRef(IMediaStream* iface) +static ULONG WINAPI IDirectDrawMediaStreamImpl_AddRef(IDirectDrawMediaStream *iface) { - IMediaStreamImpl *This = (IMediaStreamImpl *)iface; + IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface); TRACE("(%p/%p)\n", iface, This); return InterlockedIncrement(&This->ref); } -static ULONG WINAPI IMediaStreamImpl_Release(IMediaStream* iface) +static ULONG WINAPI IDirectDrawMediaStreamImpl_Release(IDirectDrawMediaStream *iface) { - IMediaStreamImpl *This = (IMediaStreamImpl *)iface; + IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p/%p)\n", iface, This); if (!ref) - HeapFree(GetProcessHeap(), 0, This); + HeapFree(GetProcessHeap(), 0, This); return ref; } /*** IMediaStream methods ***/ -static HRESULT WINAPI IMediaStreamImpl_GetMultiMediaStream(IMediaStream* iface, IMultiMediaStream** ppMultiMediaStream) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetMultiMediaStream(IDirectDrawMediaStream *iface, + IMultiMediaStream** ppMultiMediaStream) { - IMediaStreamImpl *This = (IMediaStreamImpl *)iface; + IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface); FIXME("(%p/%p)->(%p) stub!\n", This, iface, ppMultiMediaStream); return S_FALSE; } - -static HRESULT WINAPI IMediaStreamImpl_GetInformation(IMediaStream* iface, MSPID* pPurposeId, STREAM_TYPE* pType) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetInformation(IDirectDrawMediaStream *iface, + MSPID *pPurposeId, STREAM_TYPE *pType) { - IMediaStreamImpl *This = (IMediaStreamImpl *)iface; + IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface); TRACE("(%p/%p)->(%p,%p)\n", This, iface, pPurposeId, pType); @@ -145,163 +113,109 @@ static HRESULT WINAPI IMediaStreamImpl_GetInformation(IMediaStream* iface, MSPID return S_OK; } -static HRESULT WINAPI IMediaStreamImpl_SetSameFormat(IMediaStream* iface, IMediaStream* pStreamThatHasDesiredFormat, DWORD dwFlags) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetSameFormat(IDirectDrawMediaStream *iface, + IMediaStream *pStreamThatHasDesiredFormat, DWORD dwFlags) { - IMediaStreamImpl *This = (IMediaStreamImpl *)iface; + IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface); FIXME("(%p/%p)->(%p,%x) stub!\n", This, iface, pStreamThatHasDesiredFormat, dwFlags); return S_FALSE; } -static HRESULT WINAPI IMediaStreamImpl_AllocateSample(IMediaStream* iface, DWORD dwFlags, IStreamSample** ppSample) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_AllocateSample(IDirectDrawMediaStream *iface, + DWORD dwFlags, IStreamSample **ppSample) { - IMediaStreamImpl *This = (IMediaStreamImpl *)iface; + IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface); FIXME("(%p/%p)->(%x,%p) stub!\n", This, iface, dwFlags, ppSample); return S_FALSE; } -static HRESULT WINAPI IMediaStreamImpl_CreateSharedSample(IMediaStream* iface, IStreamSample* pExistingSample, DWORD dwFlags, IStreamSample** ppSample) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSharedSample(IDirectDrawMediaStream *iface, + IStreamSample *pExistingSample, DWORD dwFlags, IStreamSample **ppSample) { - IMediaStreamImpl *This = (IMediaStreamImpl *)iface; + IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface); FIXME("(%p/%p)->(%p,%x,%p) stub!\n", This, iface, pExistingSample, dwFlags, ppSample); return S_FALSE; } -static HRESULT WINAPI IMediaStreamImpl_SendEndOfStream(IMediaStream* iface, DWORD dwFlags) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_SendEndOfStream(IDirectDrawMediaStream *iface, + DWORD dwFlags) { - IMediaStreamImpl *This = (IMediaStreamImpl *)iface; + IDirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface); FIXME("(%p/%p)->(%x) stub!\n", This, iface, dwFlags); return S_FALSE; } -static const struct IMediaStreamVtbl MediaStream_Vtbl = +static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetFormat(IDirectDrawMediaStream *iface, + DDSURFACEDESC *pDDSDCurrent, IDirectDrawPalette **ppDirectDrawPalette, + DDSURFACEDESC *pDDSDDesired, DWORD *pdwFlags) { - IMediaStreamImpl_QueryInterface, - IMediaStreamImpl_AddRef, - IMediaStreamImpl_Release, - IMediaStreamImpl_GetMultiMediaStream, - IMediaStreamImpl_GetInformation, - IMediaStreamImpl_SetSameFormat, - IMediaStreamImpl_AllocateSample, - IMediaStreamImpl_CreateSharedSample, - IMediaStreamImpl_SendEndOfStream -}; - -HRESULT DirectDrawMediaStream_create(IMultiMediaStream* Parent, const MSPID* pPurposeId, STREAM_TYPE StreamType, IMediaStream** ppMediaStream) -{ - IDirectDrawMediaStreamImpl* object; - - TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream); - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamImpl)); - if (!object) - { - ERR("Out of memory\n"); - return E_OUTOFMEMORY; - } - - object->lpVtbl = &DirectDrawMediaStream_Vtbl; - object->ref = 1; - - object->Parent = Parent; - object->PurposeId = *pPurposeId; - object->StreamType = StreamType; - - *ppMediaStream = (IMediaStream*)object; - - return S_OK; -} - -static HRESULT WINAPI IDirectDrawMediaStreamImpl_QueryInterface(IDirectDrawMediaStream* iface, REFIID riid, void** ppvObject) -{ - IMediaStreamImpl *This = (IMediaStreamImpl *)iface; - - TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject); - - if (IsEqualGUID(riid, &IID_IUnknown) || - IsEqualGUID(riid, &IID_IMediaStream) || - IsEqualGUID(riid, &IID_IDirectDrawMediaStream)) - { - IClassFactory_AddRef(iface); - *ppvObject = This; - return S_OK; - } - - ERR("(%p)->(%s,%p),not found\n",This,debugstr_guid(riid),ppvObject); - return E_NOINTERFACE; -} - -static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetFormat(IDirectDrawMediaStream* iface, DDSURFACEDESC *pDDSDCurrent, - IDirectDrawPalette **ppDirectDrawPalette, DDSURFACEDESC *pDDSDDesired, DWORD *pdwFlags) -{ - FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, pDDSDCurrent, ppDirectDrawPalette, pDDSDDesired, pdwFlags); + FIXME("(%p)->(%p,%p,%p,%p) stub!\n", iface, pDDSDCurrent, ppDirectDrawPalette, pDDSDDesired, + pdwFlags); return E_NOTIMPL; } -static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetFormat(IDirectDrawMediaStream* iface, const DDSURFACEDESC *pDDSurfaceDesc, - IDirectDrawPalette *pDirectDrawPalette) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetFormat(IDirectDrawMediaStream *iface, + const DDSURFACEDESC *pDDSurfaceDesc, IDirectDrawPalette *pDirectDrawPalette) { FIXME("(%p)->(%p,%p) stub!\n", iface, pDDSurfaceDesc, pDirectDrawPalette); return E_NOTIMPL; } -static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetDirectDraw(IDirectDrawMediaStream* iface, IDirectDraw **ppDirectDraw) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetDirectDraw(IDirectDrawMediaStream *iface, + IDirectDraw **ppDirectDraw) { FIXME("(%p)->(%p) stub!\n", iface, ppDirectDraw); return E_NOTIMPL; } -static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetDirectDraw(IDirectDrawMediaStream* iface, IDirectDraw *pDirectDraw) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_SetDirectDraw(IDirectDrawMediaStream *iface, + IDirectDraw *pDirectDraw) { FIXME("(%p)->(%p) stub!\n", iface, pDirectDraw); return E_NOTIMPL; } -static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSample(IDirectDrawMediaStream* iface, IDirectDrawSurface *pSurface, const RECT *pRect, - DWORD dwFlags, IDirectDrawStreamSample **ppSample) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_CreateSample(IDirectDrawMediaStream *iface, + IDirectDrawSurface *pSurface, const RECT *pRect, DWORD dwFlags, + IDirectDrawStreamSample **ppSample) { FIXME("(%p)->(%p,%p,%x,%p) stub!\n", iface, pSurface, pRect, dwFlags, ppSample); return E_NOTIMPL; } -static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetTimePerFrame(IDirectDrawMediaStream* iface, STREAM_TIME *pFrameTime) +static HRESULT WINAPI IDirectDrawMediaStreamImpl_GetTimePerFrame(IDirectDrawMediaStream *iface, + STREAM_TIME *pFrameTime) { FIXME("(%p)->(%p) stub!\n", iface, pFrameTime); return E_NOTIMPL; } -/* Note: Hack so we can reuse the old functions without compiler warnings */ -#if !defined(__STRICT_ANSI__) && defined(__GNUC__) -# define XCAST(fun) (typeof(DirectDrawMediaStream_Vtbl.fun)) -#else -# define XCAST(fun) (void*) -#endif - static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl = { IDirectDrawMediaStreamImpl_QueryInterface, - XCAST(AddRef)IMediaStreamImpl_AddRef, - XCAST(Release)IMediaStreamImpl_Release, - XCAST(GetMultiMediaStream)IMediaStreamImpl_GetMultiMediaStream, - XCAST(GetInformation)IMediaStreamImpl_GetInformation, - XCAST(SetSameFormat)IMediaStreamImpl_SetSameFormat, - XCAST(AllocateSample)IMediaStreamImpl_AllocateSample, - XCAST(CreateSharedSample)IMediaStreamImpl_CreateSharedSample, - XCAST(SendEndOfStream)IMediaStreamImpl_SendEndOfStream, + IDirectDrawMediaStreamImpl_AddRef, + IDirectDrawMediaStreamImpl_Release, + IDirectDrawMediaStreamImpl_GetMultiMediaStream, + IDirectDrawMediaStreamImpl_GetInformation, + IDirectDrawMediaStreamImpl_SetSameFormat, + IDirectDrawMediaStreamImpl_AllocateSample, + IDirectDrawMediaStreamImpl_CreateSharedSample, + IDirectDrawMediaStreamImpl_SendEndOfStream, IDirectDrawMediaStreamImpl_GetFormat, IDirectDrawMediaStreamImpl_SetFormat, IDirectDrawMediaStreamImpl_GetDirectDraw, @@ -309,4 +223,29 @@ static const struct IDirectDrawMediaStreamVtbl DirectDrawMediaStream_Vtbl = IDirectDrawMediaStreamImpl_CreateSample, IDirectDrawMediaStreamImpl_GetTimePerFrame }; -#undef XCAST + +HRESULT mediastream_create(IMultiMediaStream *Parent, const MSPID *pPurposeId, + STREAM_TYPE StreamType, IMediaStream **ppMediaStream) +{ + IDirectDrawMediaStreamImpl *object; + + TRACE("(%p,%s,%p)\n", Parent, debugstr_guid(pPurposeId), ppMediaStream); + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawMediaStreamImpl)); + if (!object) + { + ERR("Out of memory\n"); + return E_OUTOFMEMORY; + } + + object->IDirectDrawMediaStream_iface.lpVtbl = &DirectDrawMediaStream_Vtbl; + object->ref = 1; + + object->Parent = Parent; + object->PurposeId = *pPurposeId; + object->StreamType = StreamType; + + *ppMediaStream = (IMediaStream*)&object->IDirectDrawMediaStream_iface; + + return S_OK; +} diff --git a/reactos/dll/directx/amstream/mediastreamfilter.c b/reactos/dll/directx/amstream/mediastreamfilter.c index 4a4d7123e16..0c72c775ee0 100644 --- a/reactos/dll/directx/amstream/mediastreamfilter.c +++ b/reactos/dll/directx/amstream/mediastreamfilter.c @@ -3,9 +3,6 @@ * * Copyright 2008 Christian Costa * - * This file contains the (internal) driver registration functions, - * driver enumeration APIs and DirectDraw creation functions. - * * 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 @@ -36,7 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(amstream); typedef struct { - const IMediaStreamFilterVtbl *lpVtbl; + IMediaStreamFilter IMediaStreamFilter_iface; LONG ref; CRITICAL_SECTION csFilter; FILTER_STATE state; @@ -45,37 +42,17 @@ typedef struct { FILTER_INFO filterInfo; } IMediaStreamFilterImpl; -static const struct IMediaStreamFilterVtbl MediaStreamFilter_Vtbl; - -HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, LPVOID *ppObj) +static inline IMediaStreamFilterImpl *impl_from_IMediaStreamFilter(IMediaStreamFilter *iface) { - IMediaStreamFilterImpl* object; - - TRACE("(%p,%p)\n", pUnkOuter, ppObj); - - if( pUnkOuter ) - return CLASS_E_NOAGGREGATION; - - object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamFilterImpl)); - if (!object) - { - ERR("Out of memory\n"); - return E_OUTOFMEMORY; - } - - object->lpVtbl = &MediaStreamFilter_Vtbl; - object->ref = 1; - - *ppObj = object; - - return S_OK; + return CONTAINING_RECORD(iface, IMediaStreamFilterImpl, IMediaStreamFilter_iface); } /*** IUnknown methods ***/ -static HRESULT WINAPI MediaStreamFilterImpl_QueryInterface(IMediaStreamFilter * iface, REFIID riid, LPVOID * ppv) +static HRESULT WINAPI MediaStreamFilterImpl_QueryInterface(IMediaStreamFilter *iface, REFIID riid, + void **ppv) { - IMediaStreamFilterImpl *This = (IMediaStreamFilterImpl *)iface; + IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), ppv); @@ -101,9 +78,9 @@ static HRESULT WINAPI MediaStreamFilterImpl_QueryInterface(IMediaStreamFilter * return E_NOINTERFACE; } -static ULONG WINAPI MediaStreamFilterImpl_AddRef(IMediaStreamFilter * iface) +static ULONG WINAPI MediaStreamFilterImpl_AddRef(IMediaStreamFilter *iface) { - IMediaStreamFilterImpl *This = (IMediaStreamFilterImpl *)iface; + IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); ULONG refCount = InterlockedIncrement(&This->ref); TRACE("(%p)->() AddRef from %d\n", iface, refCount - 1); @@ -111,18 +88,15 @@ static ULONG WINAPI MediaStreamFilterImpl_AddRef(IMediaStreamFilter * iface) return refCount; } -static ULONG WINAPI MediaStreamFilterImpl_Release(IMediaStreamFilter * iface) +static ULONG WINAPI MediaStreamFilterImpl_Release(IMediaStreamFilter *iface) { - IMediaStreamFilterImpl *This = (IMediaStreamFilterImpl *)iface; + IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->() Release from %d\n", iface, refCount + 1); if (!refCount) - { - This->lpVtbl = NULL; HeapFree(GetProcessHeap(), 0, This); - } return refCount; } @@ -311,3 +285,27 @@ static const IMediaStreamFilterVtbl MediaStreamFilter_Vtbl = MediaStreamFilterImpl_Flush, MediaStreamFilterImpl_EndOfStream }; + +HRESULT MediaStreamFilter_create(IUnknown *pUnkOuter, void **ppObj) +{ + IMediaStreamFilterImpl* object; + + TRACE("(%p,%p)\n", pUnkOuter, ppObj); + + if( pUnkOuter ) + return CLASS_E_NOAGGREGATION; + + object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IMediaStreamFilterImpl)); + if (!object) + { + ERR("Out of memory\n"); + return E_OUTOFMEMORY; + } + + object->IMediaStreamFilter_iface.lpVtbl = &MediaStreamFilter_Vtbl; + object->ref = 1; + + *ppObj = object; + + return S_OK; +} diff --git a/reactos/dll/directx/amstream/regsvr.c b/reactos/dll/directx/amstream/regsvr.c deleted file mode 100644 index 9c328914749..00000000000 --- a/reactos/dll/directx/amstream/regsvr.c +++ /dev/null @@ -1,505 +0,0 @@ -/* - * self-registerable dll functions for amstream.dll - * - * Copyright (C) 2003 John K. Hohm - * - * 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 "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "wingdi.h" -#include "winreg.h" -#include "winerror.h" - -#include "ole2.h" - -#include "amstream.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -WINE_DEFAULT_DEBUG_CHANNEL(amstream); - -/* - * Near the bottom of this file are the exported DllRegisterServer and - * DllUnregisterServer, which make all this worthwhile. - */ - -/*********************************************************************** - * interface for self-registering - */ -struct regsvr_interface -{ - IID const *iid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - IID const *base_iid; /* can be NULL to omit */ - int num_methods; /* can be <0 to omit */ - CLSID const *ps_clsid; /* can be NULL to omit */ - CLSID const *ps_clsid32; /* can be NULL to omit */ -}; - -static HRESULT register_interfaces(struct regsvr_interface const *list); -static HRESULT unregister_interfaces(struct regsvr_interface const *list); - -struct regsvr_coclass -{ - CLSID const *clsid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - LPCSTR ips; /* can be NULL to omit */ - LPCSTR ips32; /* can be NULL to omit */ - LPCSTR ips32_tmodel; /* can be NULL to omit */ - LPCSTR progid; /* can be NULL to omit */ - LPCSTR viprogid; /* can be NULL to omit */ - LPCSTR progid_extra; /* can be NULL to omit */ -}; - -static HRESULT register_coclasses(struct regsvr_coclass const *list); -static HRESULT unregister_coclasses(struct regsvr_coclass const *list); - -/*********************************************************************** - * static string constants - */ -static WCHAR const interface_keyname[10] = { - 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; -static WCHAR const base_ifa_keyname[14] = { - 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', - 'e', 0 }; -static WCHAR const num_methods_keyname[11] = { - 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; -static WCHAR const ps_clsid_keyname[15] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', 0 }; -static WCHAR const ps_clsid32_keyname[17] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', '3', '2', 0 }; -static WCHAR const clsid_keyname[6] = { - 'C', 'L', 'S', 'I', 'D', 0 }; -static WCHAR const curver_keyname[7] = { - 'C', 'u', 'r', 'V', 'e', 'r', 0 }; -static WCHAR const ips_keyname[13] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static WCHAR const ips32_keyname[15] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static WCHAR const progid_keyname[7] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static WCHAR const viprogid_keyname[25] = { - 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p', - 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D', - 0 }; -static char const tmodel_valuename[] = "ThreadingModel"; - -/*********************************************************************** - * static helper functions - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); -static LONG register_key_defvalueW(HKEY base, WCHAR const *name, - WCHAR const *value); -static LONG register_key_defvalueA(HKEY base, WCHAR const *name, - char const *value); -static LONG register_progid(WCHAR const *clsid, - char const *progid, char const *curver_progid, - char const *name, char const *extra); - -/*********************************************************************** - * register_interfaces - */ -static HRESULT register_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - HKEY iid_key; - - StringFromGUID2(list->iid, buf, 39); - res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_interface_key; - - if (list->name) { - res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->base_iid) { - res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (0 <= list->num_methods) { - static WCHAR const fmt[3] = { '%', 'd', 0 }; - HKEY key; - - res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - - sprintfW(buf, fmt, list->num_methods); - res = RegSetValueExW(key, NULL, 0, REG_SZ, - (CONST BYTE*)buf, - (lstrlenW(buf) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid) { - res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid32) { - res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - error_close_iid_key: - RegCloseKey(iid_key); - } - -error_close_interface_key: - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_interfaces - */ -static HRESULT unregister_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, - KEY_READ | KEY_WRITE, &interface_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->iid, buf, 39); - res = RegDeleteTreeW(interface_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - } - - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * register_coclasses - */ -static HRESULT register_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - HKEY clsid_key; - - StringFromGUID2(list->clsid, buf, 39); - res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->name) { - res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips) { - res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips32) { - HKEY ips32_key; - - res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &ips32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->ips32, - lstrlenA(list->ips32) + 1); - if (res == ERROR_SUCCESS && list->ips32_tmodel) - res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, - (CONST BYTE*)list->ips32_tmodel, - strlen(list->ips32_tmodel) + 1); - RegCloseKey(ips32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->progid) { - res = register_key_defvalueA(clsid_key, progid_keyname, - list->progid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->progid, NULL, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->viprogid) { - res = register_key_defvalueA(clsid_key, viprogid_keyname, - list->viprogid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->viprogid, list->progid, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - error_close_clsid_key: - RegCloseKey(clsid_key); - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_coclasses - */ -static HRESULT unregister_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, - KEY_READ | KEY_WRITE, &coclass_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->clsid, buf, 39); - res = RegDeleteTreeW(coclass_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->progid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - - if (list->viprogid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * regsvr_key_guid - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) -{ - WCHAR buf[39]; - - StringFromGUID2(guid, buf, 39); - return register_key_defvalueW(base, name, buf); -} - -/*********************************************************************** - * regsvr_key_defvalueW - */ -static LONG register_key_defvalueW( - HKEY base, - WCHAR const *name, - WCHAR const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - (lstrlenW(value) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_key_defvalueA - */ -static LONG register_key_defvalueA( - HKEY base, - WCHAR const *name, - char const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - lstrlenA(value) + 1); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_progid - */ -static LONG register_progid( - WCHAR const *clsid, - char const *progid, - char const *curver_progid, - char const *name, - char const *extra) -{ - LONG res; - HKEY progid_key; - - res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &progid_key, NULL); - if (res != ERROR_SUCCESS) return res; - - if (name) { - res = RegSetValueExA(progid_key, NULL, 0, REG_SZ, - (CONST BYTE*)name, strlen(name) + 1); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (clsid) { - res = register_key_defvalueW(progid_key, clsid_keyname, clsid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (curver_progid) { - res = register_key_defvalueA(progid_key, curver_keyname, - curver_progid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (extra) { - HKEY extra_key; - - res = RegCreateKeyExA(progid_key, extra, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &extra_key, NULL); - if (res == ERROR_SUCCESS) - RegCloseKey(extra_key); - } - -error_close_progid_key: - RegCloseKey(progid_key); - return res; -} - -/*********************************************************************** - * coclass list - */ -static struct regsvr_coclass const coclass_list[] = { - { &CLSID_AMMultiMediaStream, - "ActiveMovie MultiMedia Stream", - NULL, - "amstream.dll", - "Both" - }, - - { &CLSID_AMDirectDrawStream, - "ActiveMovie MultiMedia Stream", - NULL, - "amstream.dll", - "Both" - }, - - { &CLSID_MediaStreamFilter, - "SFilter Class", - NULL, - "amstream.dll", - "Both" - }, - - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * interface list - */ - -static struct regsvr_interface const interface_list[] = { - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * DllRegisterServer (AMSTREAM.@) - */ -HRESULT WINAPI DllRegisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = register_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = register_interfaces(interface_list); - return hr; -} - -/*********************************************************************** - * DllUnregisterServer (AMSTREAM.@) - */ -HRESULT WINAPI DllUnregisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = unregister_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = unregister_interfaces(interface_list); - return hr; -} diff --git a/reactos/dll/directx/amstream/version.rc b/reactos/dll/directx/amstream/version.rc index d81bda3b212..7d46313d5ad 100644 --- a/reactos/dll/directx/amstream/version.rc +++ b/reactos/dll/directx/amstream/version.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +1 WINE_REGISTRY amstream.rgs + #define WINE_FILEDESCRIPTION_STR "Wine AMStream dll" #define WINE_FILENAME_STR "amstream.dll" #define WINE_FILEVERSION 6,5,1,900 diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index f255446c5cc..688afdb7b35 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -30,7 +30,7 @@ reactos/tools/wrc # Synced to Wine-1.3.26 The following libraries are shared with Wine. -reactos/dll/directx/amstream # Autosync +reactos/dll/directx/amstream # Synced to Wine-1.3.37 reactos/dll/directx/dinput # Synced to Wine-20090208 reactos/dll/directx/dinput8 # Synced to Wine-20090208 reactos/dll/directx/dmusic # Synced to Wine-1_1_23 From dd90d2334d2ebd74481e9517a5c5aeee09b4a798 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 15:03:34 +0000 Subject: [PATCH 089/289] [AMSTREAM_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55200 --- rostests/winetests/amstream/amstream.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/rostests/winetests/amstream/amstream.c b/rostests/winetests/amstream/amstream.c index f59bc060d78..4798967cb2a 100644 --- a/rostests/winetests/amstream/amstream.c +++ b/rostests/winetests/amstream/amstream.c @@ -18,8 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include - #define COBJMACROS #include "wine/test.h" @@ -29,9 +27,9 @@ #define FILE_LEN 9 static const char fileA[FILE_LEN] = "test.avi"; -IAMMultiMediaStream* pams; -IDirectDraw7* pdd7 = NULL; -IDirectDrawSurface7* pdds7 = NULL; +static IAMMultiMediaStream* pams; +static IDirectDraw7* pdd7; +static IDirectDrawSurface7* pdds7; static int create_ammultimediastream(void) { From c8c27cf35b59119ee46ef299833b79b21898889b Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 26 Jan 2012 15:07:46 +0000 Subject: [PATCH 090/289] [Usp10] - Sync to Wine 1.3.37. svn path=/trunk/; revision=55201 --- reactos/dll/win32/usp10/CMakeLists.txt | 1 + reactos/dll/win32/usp10/opentype.c | 1117 ++++++++++++++++++ reactos/dll/win32/usp10/shape.c | 1337 +++++++--------------- reactos/dll/win32/usp10/usp10.c | 516 ++++++++- reactos/dll/win32/usp10/usp10.rbuild | 1 + reactos/dll/win32/usp10/usp10.spec | 6 +- reactos/dll/win32/usp10/usp10_internal.h | 93 +- 7 files changed, 2079 insertions(+), 992 deletions(-) create mode 100644 reactos/dll/win32/usp10/opentype.c diff --git a/reactos/dll/win32/usp10/CMakeLists.txt b/reactos/dll/win32/usp10/CMakeLists.txt index 6d2ac1d1b41..e0732956029 100644 --- a/reactos/dll/win32/usp10/CMakeLists.txt +++ b/reactos/dll/win32/usp10/CMakeLists.txt @@ -12,6 +12,7 @@ list(APPEND SOURCE linebreak.c usp10.c mirror.c + opentype.c shape.c shaping.c ${CMAKE_CURRENT_BINARY_DIR}/usp10_stubs.c diff --git a/reactos/dll/win32/usp10/opentype.c b/reactos/dll/win32/usp10/opentype.c new file mode 100644 index 00000000000..c30d5131ede --- /dev/null +++ b/reactos/dll/win32/usp10/opentype.c @@ -0,0 +1,1117 @@ +/* + * Opentype font interfaces for the Uniscribe Script Processor (usp10.dll) + * + * Copyright 2012 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 + * + */ +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winnls.h" +#include "usp10.h" +#include "winternl.h" + +#include "usp10_internal.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(uniscribe); + +#ifdef WORDS_BIGENDIAN +#define GET_BE_WORD(x) (x) +#define GET_BE_DWORD(x) (x) +#else +#define GET_BE_WORD(x) RtlUshortByteSwap(x) +#define GET_BE_DWORD(x) RtlUlongByteSwap(x) +#endif + +/* These are all structures needed for the cmap format 12 table */ +#define CMAP_TAG MS_MAKE_TAG('c', 'm', 'a', 'p') + +typedef struct { + WORD platformID; + WORD encodingID; + DWORD offset; +} CMAP_EncodingRecord; + +typedef struct { + WORD version; + WORD numTables; + CMAP_EncodingRecord tables[1]; +} CMAP_Header; + +typedef struct { + DWORD startCharCode; + DWORD endCharCode; + DWORD startGlyphID; +} CMAP_SegmentedCoverage_group; + +typedef struct { + WORD format; + WORD reserved; + DWORD length; + DWORD language; + DWORD nGroups; + CMAP_SegmentedCoverage_group groups[1]; +} CMAP_SegmentedCoverage; + +/* These are all structures needed for the GDEF table */ +#define GDEF_TAG MS_MAKE_TAG('G', 'D', 'E', 'F') + +enum {BaseGlyph=1, LigatureGlyph, MarkGlyph, ComponentGlyph}; + +typedef struct { + DWORD Version; + WORD GlyphClassDef; + WORD AttachList; + WORD LigCaretList; + WORD MarkAttachClassDef; +} GDEF_Header; + +typedef struct { + WORD ClassFormat; + WORD StartGlyph; + WORD GlyphCount; + WORD ClassValueArray[1]; +} GDEF_ClassDefFormat1; + +typedef struct { + WORD Start; + WORD End; + WORD Class; +} GDEF_ClassRangeRecord; + +typedef struct { + WORD ClassFormat; + WORD ClassRangeCount; + GDEF_ClassRangeRecord ClassRangeRecord[1]; +} GDEF_ClassDefFormat2; + +/* These are all structures needed for the GSUB table */ + +typedef struct { + DWORD version; + WORD ScriptList; + WORD FeatureList; + WORD LookupList; +} GSUB_Header; + +typedef struct { + CHAR ScriptTag[4]; + WORD Script; +} GSUB_ScriptRecord; + +typedef struct { + WORD ScriptCount; + GSUB_ScriptRecord ScriptRecord[1]; +} GSUB_ScriptList; + +typedef struct { + CHAR LangSysTag[4]; + WORD LangSys; +} GSUB_LangSysRecord; + +typedef struct { + WORD DefaultLangSys; + WORD LangSysCount; + GSUB_LangSysRecord LangSysRecord[1]; +} GSUB_Script; + +typedef struct { + WORD LookupOrder; /* Reserved */ + WORD ReqFeatureIndex; + WORD FeatureCount; + WORD FeatureIndex[1]; +} GSUB_LangSys; + +typedef struct { + CHAR FeatureTag[4]; + WORD Feature; +} GSUB_FeatureRecord; + +typedef struct { + WORD FeatureCount; + GSUB_FeatureRecord FeatureRecord[1]; +} GSUB_FeatureList; + +typedef struct { + WORD FeatureParams; /* Reserved */ + WORD LookupCount; + WORD LookupListIndex[1]; +} GSUB_Feature; + +typedef struct { + WORD LookupCount; + WORD Lookup[1]; +} GSUB_LookupList; + +typedef struct { + WORD LookupType; + WORD LookupFlag; + WORD SubTableCount; + WORD SubTable[1]; +} GSUB_LookupTable; + +typedef struct { + WORD CoverageFormat; + WORD GlyphCount; + WORD GlyphArray[1]; +} GSUB_CoverageFormat1; + +typedef struct { + WORD Start; + WORD End; + WORD StartCoverageIndex; +} GSUB_RangeRecord; + +typedef struct { + WORD CoverageFormat; + WORD RangeCount; + GSUB_RangeRecord RangeRecord[1]; +} GSUB_CoverageFormat2; + +typedef struct { + WORD SubstFormat; /* = 1 */ + WORD Coverage; + WORD DeltaGlyphID; +} GSUB_SingleSubstFormat1; + +typedef struct { + WORD SubstFormat; /* = 2 */ + WORD Coverage; + WORD GlyphCount; + WORD Substitute[1]; +}GSUB_SingleSubstFormat2; + +typedef struct { + WORD SubstFormat; /* = 1 */ + WORD Coverage; + WORD SequenceCount; + WORD Sequence[1]; +}GSUB_MultipleSubstFormat1; + +typedef struct { + WORD GlyphCount; + WORD Substitute[1]; +}GSUB_Sequence; + +typedef struct { + WORD SubstFormat; /* = 1 */ + WORD Coverage; + WORD LigSetCount; + WORD LigatureSet[1]; +}GSUB_LigatureSubstFormat1; + +typedef struct { + WORD LigatureCount; + WORD Ligature[1]; +}GSUB_LigatureSet; + +typedef struct{ + WORD LigGlyph; + WORD CompCount; + WORD Component[1]; +}GSUB_Ligature; + +typedef struct{ + WORD SequenceIndex; + WORD LookupListIndex; + +}GSUB_SubstLookupRecord; + +typedef struct{ + WORD SubstFormat; /* = 1 */ + WORD Coverage; + WORD ChainSubRuleSetCount; + WORD ChainSubRuleSet[1]; +}GSUB_ChainContextSubstFormat1; + +typedef struct { + WORD SubstFormat; /* = 3 */ + WORD BacktrackGlyphCount; + WORD Coverage[1]; +}GSUB_ChainContextSubstFormat3_1; + +typedef struct{ + WORD InputGlyphCount; + WORD Coverage[1]; +}GSUB_ChainContextSubstFormat3_2; + +typedef struct{ + WORD LookaheadGlyphCount; + WORD Coverage[1]; +}GSUB_ChainContextSubstFormat3_3; + +typedef struct{ + WORD SubstCount; + GSUB_SubstLookupRecord SubstLookupRecord[1]; +}GSUB_ChainContextSubstFormat3_4; + +typedef struct { + WORD SubstFormat; /* = 1 */ + WORD Coverage; + WORD AlternateSetCount; + WORD AlternateSet[1]; +} GSUB_AlternateSubstFormat1; + +typedef struct{ + WORD GlyphCount; + WORD Alternate[1]; +} GSUB_AlternateSet; + +/********** + * CMAP + **********/ + +static VOID *load_CMAP_format12_table(HDC hdc, ScriptCache *psc) +{ + CMAP_Header *CMAP_Table = NULL; + int length; + int i; + + if (!psc->CMAP_Table) + { + length = GetFontData(hdc, CMAP_TAG , 0, NULL, 0); + if (length != GDI_ERROR) + { + psc->CMAP_Table = HeapAlloc(GetProcessHeap(),0,length); + GetFontData(hdc, CMAP_TAG , 0, psc->CMAP_Table, length); + TRACE("Loaded cmap table of %i bytes\n",length); + } + else + return NULL; + } + + CMAP_Table = psc->CMAP_Table; + + for (i = 0; i < GET_BE_WORD(CMAP_Table->numTables); i++) + { + if ( (GET_BE_WORD(CMAP_Table->tables[i].platformID) == 3) && + (GET_BE_WORD(CMAP_Table->tables[i].encodingID) == 10) ) + { + CMAP_SegmentedCoverage *format = (CMAP_SegmentedCoverage*)(((BYTE*)CMAP_Table) + GET_BE_DWORD(CMAP_Table->tables[i].offset)); + if (GET_BE_WORD(format->format) == 12) + return format; + } + } + return NULL; +} + +static int compare_group(const void *a, const void* b) +{ + const DWORD *chr = a; + const CMAP_SegmentedCoverage_group *group = b; + + if (*chr < GET_BE_DWORD(group->startCharCode)) + return -1; + if (*chr > GET_BE_DWORD(group->endCharCode)) + return 1; + return 0; +} + +DWORD OpenType_CMAP_GetGlyphIndex(HDC hdc, ScriptCache *psc, DWORD utf32c, LPWORD pgi, DWORD flags) +{ + /* BMP: use gdi32 for ease */ + if (utf32c < 0x10000) + { + WCHAR ch = utf32c; + return GetGlyphIndicesW(hdc,&ch, 1, pgi, flags); + } + + if (!psc->CMAP_format12_Table) + psc->CMAP_format12_Table = load_CMAP_format12_table(hdc, psc); + + if (flags & GGI_MARK_NONEXISTING_GLYPHS) + *pgi = 0xffff; + else + *pgi = 0; + + if (psc->CMAP_format12_Table) + { + CMAP_SegmentedCoverage *format = NULL; + CMAP_SegmentedCoverage_group *group = NULL; + + format = (CMAP_SegmentedCoverage *)psc->CMAP_format12_Table; + + group = bsearch(&utf32c, format->groups, GET_BE_DWORD(format->nGroups), + sizeof(CMAP_SegmentedCoverage_group), compare_group); + + if (group) + { + DWORD offset = utf32c - GET_BE_DWORD(group->startCharCode); + *pgi = GET_BE_DWORD(group->startGlyphID) + offset; + return 0; + } + } + return 0; +} + +/********** + * GDEF + **********/ + +static WORD GDEF_get_glyph_class(const GDEF_Header *header, WORD glyph) +{ + int offset; + WORD class = 0; + const GDEF_ClassDefFormat1 *cf1; + + if (!header) + return 0; + + offset = GET_BE_WORD(header->GlyphClassDef); + if (!offset) + return 0; + + cf1 = (GDEF_ClassDefFormat1*)(((BYTE*)header)+offset); + if (GET_BE_WORD(cf1->ClassFormat) == 1) + { + if (glyph >= GET_BE_WORD(cf1->StartGlyph)) + { + int index = glyph - GET_BE_WORD(cf1->StartGlyph); + if (index < GET_BE_WORD(cf1->GlyphCount)) + class = GET_BE_WORD(cf1->ClassValueArray[index]); + } + } + else if (GET_BE_WORD(cf1->ClassFormat) == 2) + { + const GDEF_ClassDefFormat2 *cf2 = (GDEF_ClassDefFormat2*)cf1; + int i, top; + top = GET_BE_WORD(cf2->ClassRangeCount); + for (i = 0; i < top; i++) + { + if (glyph >= GET_BE_WORD(cf2->ClassRangeRecord[i].Start) && + glyph <= GET_BE_WORD(cf2->ClassRangeRecord[i].End)) + { + class = GET_BE_WORD(cf2->ClassRangeRecord[i].Class); + break; + } + } + } + else + ERR("Unknown Class Format %i\n",GET_BE_WORD(cf1->ClassFormat)); + + return class; +} + +static VOID *load_gdef_table(HDC hdc) +{ + VOID* GDEF_Table = NULL; + int length = GetFontData(hdc, GDEF_TAG , 0, NULL, 0); + if (length != GDI_ERROR) + { + GDEF_Table = HeapAlloc(GetProcessHeap(),0,length); + GetFontData(hdc, GDEF_TAG , 0, GDEF_Table, length); + TRACE("Loaded GDEF table of %i bytes\n",length); + } + return GDEF_Table; +} + +void OpenType_GDEF_UpdateGlyphProps(HDC hdc, ScriptCache *psc, const WORD *pwGlyphs, const WORD cGlyphs, WORD* pwLogClust, const WORD cChars, SCRIPT_GLYPHPROP *pGlyphProp) +{ + int i; + + if (!psc->GDEF_Table) + psc->GDEF_Table = load_gdef_table(hdc); + + for (i = 0; i < cGlyphs; i++) + { + WORD class; + int char_count = 0; + int k; + + for (k = 0; k < cChars; k++) + if (pwLogClust[k] == i) + char_count++; + + class = GDEF_get_glyph_class(psc->GDEF_Table, pwGlyphs[i]); + + switch (class) + { + case 0: + case BaseGlyph: + pGlyphProp[i].sva.fClusterStart = 1; + pGlyphProp[i].sva.fDiacritic = 0; + pGlyphProp[i].sva.fZeroWidth = 0; + break; + case LigatureGlyph: + pGlyphProp[i].sva.fClusterStart = 1; + pGlyphProp[i].sva.fDiacritic = 0; + pGlyphProp[i].sva.fZeroWidth = 0; + break; + case MarkGlyph: + pGlyphProp[i].sva.fClusterStart = 0; + pGlyphProp[i].sva.fDiacritic = 1; + pGlyphProp[i].sva.fZeroWidth = 1; + break; + case ComponentGlyph: + pGlyphProp[i].sva.fClusterStart = 0; + pGlyphProp[i].sva.fDiacritic = 0; + pGlyphProp[i].sva.fZeroWidth = 0; + break; + default: + ERR("Unknown glyph class %i\n",class); + pGlyphProp[i].sva.fClusterStart = 1; + pGlyphProp[i].sva.fDiacritic = 0; + pGlyphProp[i].sva.fZeroWidth = 0; + } + + if (char_count == 0) + pGlyphProp[i].sva.fClusterStart = 0; + } +} + +/********** + * GSUB + **********/ +static INT GSUB_apply_lookup(const GSUB_LookupList* lookup, INT lookup_index, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count); + +static INT GSUB_is_glyph_covered(LPCVOID table , UINT glyph) +{ + const GSUB_CoverageFormat1* cf1; + + cf1 = table; + + if (GET_BE_WORD(cf1->CoverageFormat) == 1) + { + int count = GET_BE_WORD(cf1->GlyphCount); + int i; + TRACE("Coverage Format 1, %i glyphs\n",count); + for (i = 0; i < count; i++) + if (glyph == GET_BE_WORD(cf1->GlyphArray[i])) + return i; + return -1; + } + else if (GET_BE_WORD(cf1->CoverageFormat) == 2) + { + const GSUB_CoverageFormat2* cf2; + int i; + int count; + cf2 = (const GSUB_CoverageFormat2*)cf1; + + count = GET_BE_WORD(cf2->RangeCount); + TRACE("Coverage Format 2, %i ranges\n",count); + for (i = 0; i < count; i++) + { + if (glyph < GET_BE_WORD(cf2->RangeRecord[i].Start)) + return -1; + if ((glyph >= GET_BE_WORD(cf2->RangeRecord[i].Start)) && + (glyph <= GET_BE_WORD(cf2->RangeRecord[i].End))) + { + return (GET_BE_WORD(cf2->RangeRecord[i].StartCoverageIndex) + + glyph - GET_BE_WORD(cf2->RangeRecord[i].Start)); + } + } + return -1; + } + else + ERR("Unknown CoverageFormat %i\n",GET_BE_WORD(cf1->CoverageFormat)); + + return -1; +} + +static INT GSUB_apply_SingleSubst(const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) +{ + int j; + TRACE("Single Substitution Subtable\n"); + + for (j = 0; j < GET_BE_WORD(look->SubTableCount); j++) + { + int offset; + const GSUB_SingleSubstFormat1 *ssf1; + offset = GET_BE_WORD(look->SubTable[j]); + ssf1 = (const GSUB_SingleSubstFormat1*)((const BYTE*)look+offset); + if (GET_BE_WORD(ssf1->SubstFormat) == 1) + { + int offset = GET_BE_WORD(ssf1->Coverage); + TRACE(" subtype 1, delta %i\n", GET_BE_WORD(ssf1->DeltaGlyphID)); + if (GSUB_is_glyph_covered((const BYTE*)ssf1+offset, glyphs[glyph_index]) != -1) + { + TRACE(" Glyph 0x%x ->",glyphs[glyph_index]); + glyphs[glyph_index] = glyphs[glyph_index] + GET_BE_WORD(ssf1->DeltaGlyphID); + TRACE(" 0x%x\n",glyphs[glyph_index]); + return glyph_index + write_dir; + } + } + else + { + const GSUB_SingleSubstFormat2 *ssf2; + INT index; + INT offset; + + ssf2 = (const GSUB_SingleSubstFormat2 *)ssf1; + offset = GET_BE_WORD(ssf1->Coverage); + TRACE(" subtype 2, glyph count %i\n", GET_BE_WORD(ssf2->GlyphCount)); + index = GSUB_is_glyph_covered((const BYTE*)ssf2+offset, glyphs[glyph_index]); + TRACE(" Coverage index %i\n",index); + if (index != -1) + { + if (glyphs[glyph_index] == GET_BE_WORD(ssf2->Substitute[index])) + return GSUB_E_NOGLYPH; + + TRACE(" Glyph is 0x%x ->",glyphs[glyph_index]); + glyphs[glyph_index] = GET_BE_WORD(ssf2->Substitute[index]); + TRACE("0x%x\n",glyphs[glyph_index]); + return glyph_index + write_dir; + } + } + } + return GSUB_E_NOGLYPH; +} + +static INT GSUB_apply_MultipleSubst(const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) +{ + int j; + TRACE("Multiple Substitution Subtable\n"); + + for (j = 0; j < GET_BE_WORD(look->SubTableCount); j++) + { + int offset, index; + const GSUB_MultipleSubstFormat1 *msf1; + offset = GET_BE_WORD(look->SubTable[j]); + msf1 = (const GSUB_MultipleSubstFormat1*)((const BYTE*)look+offset); + + offset = GET_BE_WORD(msf1->Coverage); + index = GSUB_is_glyph_covered((const BYTE*)msf1+offset, glyphs[glyph_index]); + if (index != -1) + { + const GSUB_Sequence *seq; + int sub_count; + int j; + offset = GET_BE_WORD(msf1->Sequence[index]); + seq = (const GSUB_Sequence*)((const BYTE*)msf1+offset); + sub_count = GET_BE_WORD(seq->GlyphCount); + TRACE(" Glyph 0x%x (+%i)->",glyphs[glyph_index],(sub_count-1)); + + for (j = (*glyph_count)+(sub_count-1); j > glyph_index; j--) + glyphs[j] =glyphs[j-(sub_count-1)]; + + for (j = 0; j < sub_count; j++) + if (write_dir < 0) + glyphs[glyph_index + (sub_count-1) - j] = GET_BE_WORD(seq->Substitute[j]); + else + glyphs[glyph_index + j] = GET_BE_WORD(seq->Substitute[j]); + + *glyph_count = *glyph_count + (sub_count - 1); + + if (TRACE_ON(uniscribe)) + { + for (j = 0; j < sub_count; j++) + TRACE(" 0x%x",glyphs[glyph_index+j]); + TRACE("\n"); + } + + return glyph_index + (sub_count * write_dir); + } + } + return GSUB_E_NOGLYPH; +} + +static INT GSUB_apply_AlternateSubst(const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) +{ + int j; + TRACE("Alternate Substitution Subtable\n"); + + for (j = 0; j < GET_BE_WORD(look->SubTableCount); j++) + { + int offset; + const GSUB_AlternateSubstFormat1 *asf1; + INT index; + + offset = GET_BE_WORD(look->SubTable[j]); + asf1 = (const GSUB_AlternateSubstFormat1*)((const BYTE*)look+offset); + offset = GET_BE_WORD(asf1->Coverage); + + index = GSUB_is_glyph_covered((const BYTE*)asf1+offset, glyphs[glyph_index]); + if (index != -1) + { + const GSUB_AlternateSet *as; + offset = GET_BE_WORD(asf1->AlternateSet[index]); + as = (const GSUB_AlternateSet*)((const BYTE*)asf1+offset); + FIXME("%i alternates, picking index 0\n",GET_BE_WORD(as->GlyphCount)); + if (glyphs[glyph_index] == GET_BE_WORD(as->Alternate[0])) + return GSUB_E_NOGLYPH; + + TRACE(" Glyph 0x%x ->",glyphs[glyph_index]); + glyphs[glyph_index] = GET_BE_WORD(as->Alternate[0]); + TRACE(" 0x%x\n",glyphs[glyph_index]); + return glyph_index + write_dir; + } + } + return GSUB_E_NOGLYPH; +} + +static INT GSUB_apply_LigatureSubst(const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) +{ + int j; + + TRACE("Ligature Substitution Subtable\n"); + for (j = 0; j < GET_BE_WORD(look->SubTableCount); j++) + { + const GSUB_LigatureSubstFormat1 *lsf1; + int offset,index; + + offset = GET_BE_WORD(look->SubTable[j]); + lsf1 = (const GSUB_LigatureSubstFormat1*)((const BYTE*)look+offset); + offset = GET_BE_WORD(lsf1->Coverage); + index = GSUB_is_glyph_covered((const BYTE*)lsf1+offset, glyphs[glyph_index]); + TRACE(" Coverage index %i\n",index); + if (index != -1) + { + const GSUB_LigatureSet *ls; + int k, count; + + offset = GET_BE_WORD(lsf1->LigatureSet[index]); + ls = (const GSUB_LigatureSet*)((const BYTE*)lsf1+offset); + count = GET_BE_WORD(ls->LigatureCount); + TRACE(" LigatureSet has %i members\n",count); + for (k = 0; k < count; k++) + { + const GSUB_Ligature *lig; + int CompCount,l,CompIndex; + + offset = GET_BE_WORD(ls->Ligature[k]); + lig = (const GSUB_Ligature*)((const BYTE*)ls+offset); + CompCount = GET_BE_WORD(lig->CompCount) - 1; + CompIndex = glyph_index+write_dir; + for (l = 0; l < CompCount && CompIndex >= 0 && CompIndex < *glyph_count; l++) + { + int CompGlyph; + CompGlyph = GET_BE_WORD(lig->Component[l]); + if (CompGlyph != glyphs[CompIndex]) + break; + CompIndex += write_dir; + } + if (l == CompCount) + { + int replaceIdx = glyph_index; + if (write_dir < 0) + replaceIdx = glyph_index - CompCount; + + TRACE(" Glyph is 0x%x (+%i) ->",glyphs[glyph_index],CompCount); + glyphs[replaceIdx] = GET_BE_WORD(lig->LigGlyph); + TRACE("0x%x\n",glyphs[replaceIdx]); + if (CompCount > 0) + { + int j; + for (j = replaceIdx + 1; j < *glyph_count; j++) + glyphs[j] =glyphs[j+CompCount]; + *glyph_count = *glyph_count - CompCount; + } + return replaceIdx + write_dir; + } + } + } + } + return GSUB_E_NOGLYPH; +} + +static INT GSUB_apply_ChainContextSubst(const GSUB_LookupList* lookup, const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) +{ + int j; + BOOL done = FALSE; + + TRACE("Chaining Contextual Substitution Subtable\n"); + for (j = 0; j < GET_BE_WORD(look->SubTableCount) && !done; j++) + { + const GSUB_ChainContextSubstFormat1 *ccsf1; + int offset; + int dirLookahead = write_dir; + int dirBacktrack = -1 * write_dir; + + offset = GET_BE_WORD(look->SubTable[j]); + ccsf1 = (const GSUB_ChainContextSubstFormat1*)((const BYTE*)look+offset); + if (GET_BE_WORD(ccsf1->SubstFormat) == 1) + { + FIXME(" TODO: subtype 1 (Simple context glyph substitution)\n"); + continue; + } + else if (GET_BE_WORD(ccsf1->SubstFormat) == 2) + { + FIXME(" TODO: subtype 2 (Class-based Chaining Context Glyph Substitution)\n"); + continue; + } + else if (GET_BE_WORD(ccsf1->SubstFormat) == 3) + { + int k; + int indexGlyphs; + const GSUB_ChainContextSubstFormat3_1 *ccsf3_1; + const GSUB_ChainContextSubstFormat3_2 *ccsf3_2; + const GSUB_ChainContextSubstFormat3_3 *ccsf3_3; + const GSUB_ChainContextSubstFormat3_4 *ccsf3_4; + int newIndex = glyph_index; + + ccsf3_1 = (const GSUB_ChainContextSubstFormat3_1 *)ccsf1; + + TRACE(" subtype 3 (Coverage-based Chaining Context Glyph Substitution)\n"); + + for (k = 0; k < GET_BE_WORD(ccsf3_1->BacktrackGlyphCount); k++) + { + offset = GET_BE_WORD(ccsf3_1->Coverage[k]); + if (GSUB_is_glyph_covered((const BYTE*)ccsf3_1+offset, glyphs[glyph_index + (dirBacktrack * (k+1))]) == -1) + break; + } + if (k != GET_BE_WORD(ccsf3_1->BacktrackGlyphCount)) + continue; + TRACE("Matched Backtrack\n"); + + ccsf3_2 = (const GSUB_ChainContextSubstFormat3_2 *)(((LPBYTE)ccsf1)+sizeof(GSUB_ChainContextSubstFormat3_1) + (sizeof(WORD) * (GET_BE_WORD(ccsf3_1->BacktrackGlyphCount)-1))); + + indexGlyphs = GET_BE_WORD(ccsf3_2->InputGlyphCount); + for (k = 0; k < indexGlyphs; k++) + { + offset = GET_BE_WORD(ccsf3_2->Coverage[k]); + if (GSUB_is_glyph_covered((const BYTE*)ccsf3_1+offset, glyphs[glyph_index + (write_dir * k)]) == -1) + break; + } + if (k != indexGlyphs) + continue; + TRACE("Matched IndexGlyphs\n"); + + ccsf3_3 = (const GSUB_ChainContextSubstFormat3_3 *)(((LPBYTE)ccsf3_2)+sizeof(GSUB_ChainContextSubstFormat3_2) + (sizeof(WORD) * (GET_BE_WORD(ccsf3_2->InputGlyphCount)-1))); + + for (k = 0; k < GET_BE_WORD(ccsf3_3->LookaheadGlyphCount); k++) + { + offset = GET_BE_WORD(ccsf3_3->Coverage[k]); + if (GSUB_is_glyph_covered((const BYTE*)ccsf3_1+offset, glyphs[glyph_index + (dirLookahead * (indexGlyphs + k))]) == -1) + break; + } + if (k != GET_BE_WORD(ccsf3_3->LookaheadGlyphCount)) + continue; + TRACE("Matched LookAhead\n"); + + ccsf3_4 = (const GSUB_ChainContextSubstFormat3_4 *)(((LPBYTE)ccsf3_3)+sizeof(GSUB_ChainContextSubstFormat3_3) + (sizeof(WORD) * (GET_BE_WORD(ccsf3_3->LookaheadGlyphCount)-1))); + + if (GET_BE_WORD(ccsf3_4->SubstCount)) + { + for (k = 0; k < GET_BE_WORD(ccsf3_4->SubstCount); k++) + { + int lookupIndex = GET_BE_WORD(ccsf3_4->SubstLookupRecord[k].LookupListIndex); + int SequenceIndex = GET_BE_WORD(ccsf3_4->SubstLookupRecord[k].SequenceIndex) * write_dir; + + TRACE("SUBST: %i -> %i %i\n",k, SequenceIndex, lookupIndex); + newIndex = GSUB_apply_lookup(lookup, lookupIndex, glyphs, glyph_index + SequenceIndex, write_dir, glyph_count); + if (newIndex == -1) + { + ERR("Chain failed to generate a glyph\n"); + continue; + } + } + return newIndex; + } + else return GSUB_E_NOGLYPH; + } + } + return -1; +} + +static INT GSUB_apply_lookup(const GSUB_LookupList* lookup, INT lookup_index, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) +{ + int offset; + const GSUB_LookupTable *look; + + offset = GET_BE_WORD(lookup->Lookup[lookup_index]); + look = (const GSUB_LookupTable*)((const BYTE*)lookup + offset); + TRACE("type %i, flag %x, subtables %i\n",GET_BE_WORD(look->LookupType),GET_BE_WORD(look->LookupFlag),GET_BE_WORD(look->SubTableCount)); + switch(GET_BE_WORD(look->LookupType)) + { + case 1: + return GSUB_apply_SingleSubst(look, glyphs, glyph_index, write_dir, glyph_count); + case 2: + return GSUB_apply_MultipleSubst(look, glyphs, glyph_index, write_dir, glyph_count); + case 3: + return GSUB_apply_AlternateSubst(look, glyphs, glyph_index, write_dir, glyph_count); + case 4: + return GSUB_apply_LigatureSubst(look, glyphs, glyph_index, write_dir, glyph_count); + case 6: + return GSUB_apply_ChainContextSubst(lookup, look, glyphs, glyph_index, write_dir, glyph_count); + default: + FIXME("We do not handle SubType %i\n",GET_BE_WORD(look->LookupType)); + } + return GSUB_E_NOGLYPH; +} + +INT OpenType_apply_GSUB_lookup(LPCVOID table, INT lookup_index, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) +{ + const GSUB_Header *header = (const GSUB_Header *)table; + const GSUB_LookupList *lookup = (const GSUB_LookupList*)((const BYTE*)header + GET_BE_WORD(header->LookupList)); + + return GSUB_apply_lookup(lookup, lookup_index, glyphs, glyph_index, write_dir, glyph_count); +} + +static void GSUB_initialize_script_cache(ScriptCache *psc) +{ + int i; + + if (!psc->script_count) + { + const GSUB_ScriptList *script; + const GSUB_Header* header = (const GSUB_Header*)psc->GSUB_Table; + script = (const GSUB_ScriptList*)((const BYTE*)header + GET_BE_WORD(header->ScriptList)); + psc->script_count = GET_BE_WORD(script->ScriptCount); + TRACE("initializing %i scripts in this font\n",psc->script_count); + psc->scripts = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(LoadedScript) * psc->script_count); + for (i = 0; i < psc->script_count; i++) + { + int offset = GET_BE_WORD(script->ScriptRecord[i].Script); + psc->scripts[i].tag = MS_MAKE_TAG(script->ScriptRecord[i].ScriptTag[0], script->ScriptRecord[i].ScriptTag[1], script->ScriptRecord[i].ScriptTag[2], script->ScriptRecord[i].ScriptTag[3]); + psc->scripts[i].table = ((const BYTE*)script + offset); + } + } +} + +HRESULT OpenType_GSUB_GetFontScriptTags(ScriptCache *psc, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags, LPCVOID* script_table) +{ + int i; + HRESULT rc = S_OK; + + GSUB_initialize_script_cache(psc); + *pcTags = psc->script_count; + + if (!searchingFor && cMaxTags < *pcTags) + rc = E_OUTOFMEMORY; + else if (searchingFor) + rc = USP_E_SCRIPT_NOT_IN_FONT; + + for (i = 0; i < psc->script_count; i++) + { + if (i < cMaxTags) + pScriptTags[i] = psc->scripts[i].tag; + + if (searchingFor) + { + if (searchingFor == psc->scripts[i].tag) + { + pScriptTags[0] = psc->scripts[i].tag; + *pcTags = 1; + if (script_table) + *script_table = psc->scripts[i].table; + rc = S_OK; + break; + } + } + } + return rc; +} + +static void GSUB_initialize_language_cache(LoadedScript *script) +{ + int i; + + if (!script->language_count) + { + const GSUB_Script* table = script->table; + script->language_count = GET_BE_WORD(table->LangSysCount); + script->default_language.tag = MS_MAKE_TAG('d','f','l','t'); + script->default_language.table = (const BYTE*)table + GET_BE_WORD(table->DefaultLangSys); + + TRACE("Deflang %p, LangCount %i\n",script->default_language.table, script->language_count); + + script->languages = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(LoadedLanguage) * script->language_count); + + for (i = 0; i < script->language_count; i++) + { + int offset = GET_BE_WORD(table->LangSysRecord[i].LangSys); + script->languages[i].tag = MS_MAKE_TAG(table->LangSysRecord[i].LangSysTag[0], table->LangSysRecord[i].LangSysTag[1], table->LangSysRecord[i].LangSysTag[2], table->LangSysRecord[i].LangSysTag[3]); + script->languages[i].table = ((const BYTE*)table + offset); + } + } +} + +HRESULT OpenType_GSUB_GetFontLanguageTags(ScriptCache *psc, OPENTYPE_TAG script_tag, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pLanguageTags, int *pcTags, LPCVOID* language_table) +{ + int i; + HRESULT rc = S_OK; + LoadedScript *script = NULL; + + GSUB_initialize_script_cache(psc); + + for (i = 0; i < psc->script_count; i++) + { + if (psc->scripts[i].tag == script_tag) + { + script = &psc->scripts[i]; + break; + } + } + + if (!script) + return E_INVALIDARG; + + GSUB_initialize_language_cache(script); + + if (!searchingFor && cMaxTags < script->language_count) + rc = E_OUTOFMEMORY; + else if (searchingFor) + rc = E_INVALIDARG; + + *pcTags = script->language_count; + + for (i = 0; i < script->language_count; i++) + { + if (i < cMaxTags) + pLanguageTags[i] = script->languages[i].tag; + + if (searchingFor) + { + if (searchingFor == script->languages[i].tag) + { + pLanguageTags[0] = script->languages[i].tag; + *pcTags = 1; + if (language_table) + *language_table = script->languages[i].table; + rc = S_OK; + break; + } + } + } + + if (script->default_language.table) + { + if (i < cMaxTags) + pLanguageTags[i] = script->default_language.tag; + + if (searchingFor && FAILED(rc)) + { + pLanguageTags[0] = script->default_language.tag; + if (language_table) + *language_table = script->default_language.table; + } + i++; + *pcTags = (*pcTags) + 1; + } + + return rc; +} + + +static void GSUB_initialize_feature_cache(LPCVOID table, LoadedLanguage *language) +{ + int i; + + if (!language->feature_count) + { + const GSUB_LangSys *lang= language->table; + const GSUB_Header *header = (const GSUB_Header *)table; + const GSUB_FeatureList *feature_list; + + language->feature_count = GET_BE_WORD(lang->FeatureCount); + TRACE("%i features\n",language->feature_count); + + language->features = HeapAlloc(GetProcessHeap(),0,sizeof(LoadedFeature)*language->feature_count); + + feature_list = (const GSUB_FeatureList*)((const BYTE*)header + GET_BE_WORD(header->FeatureList)); + + for (i = 0; i < language->feature_count; i++) + { + const GSUB_Feature *feature; + int j; + int index = GET_BE_WORD(lang->FeatureIndex[i]); + + language->features[i].tag = MS_MAKE_TAG(feature_list->FeatureRecord[index].FeatureTag[0], feature_list->FeatureRecord[index].FeatureTag[1], feature_list->FeatureRecord[index].FeatureTag[2], feature_list->FeatureRecord[index].FeatureTag[3]); + language->features[i].feature = ((const BYTE*)feature_list + GET_BE_WORD(feature_list->FeatureRecord[index].Feature)); + feature = (const GSUB_Feature*)language->features[i].feature; + language->features[i].lookup_count = GET_BE_WORD(feature->LookupCount); + language->features[i].lookups = HeapAlloc(GetProcessHeap(),0,sizeof(WORD) * language->features[i].lookup_count); + for (j = 0; j < language->features[i].lookup_count; j++) + language->features[i].lookups[j] = GET_BE_WORD(feature->LookupListIndex[j]); + } + } +} + +HRESULT OpenType_GSUB_GetFontFeatureTags(ScriptCache *psc, OPENTYPE_TAG script_tag, OPENTYPE_TAG language_tag, BOOL filtered, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pFeatureTags, int *pcTags, LoadedFeature** feature) +{ + int i; + HRESULT rc = S_OK; + LoadedScript *script = NULL; + LoadedLanguage *language = NULL; + + GSUB_initialize_script_cache(psc); + + for (i = 0; i < psc->script_count; i++) + { + if (psc->scripts[i].tag == script_tag) + { + script = &psc->scripts[i]; + break; + } + } + + if (!script) + { + *pcTags = 0; + if (!filtered) + return S_OK; + else + return E_INVALIDARG; + } + + GSUB_initialize_language_cache(script); + + if (script->default_language.table && script->default_language.tag == language_tag) + language = &script->default_language; + else + { + for (i = 0; i < script->language_count; i++) + { + if (script->languages[i].tag == language_tag) + { + language = &script->languages[i]; + break; + } + } + } + + if (!language) + { + *pcTags = 0; + return S_OK; + } + + GSUB_initialize_feature_cache(psc->GSUB_Table, language); + + *pcTags = language->feature_count; + + if (!searchingFor && cMaxTags < *pcTags) + rc = E_OUTOFMEMORY; + else if (searchingFor) + rc = E_INVALIDARG; + + for (i = 0; i < language->feature_count; i++) + { + if (i < cMaxTags) + pFeatureTags[i] = language->features[i].tag; + + if (searchingFor) + { + if (searchingFor == language->features[i].tag) + { + pFeatureTags[0] = language->features[i].tag; + *pcTags = 1; + if (feature) + *feature = &language->features[i]; + rc = S_OK; + break; + } + } + } + return rc; +} diff --git a/reactos/dll/win32/usp10/shape.c b/reactos/dll/win32/usp10/shape.c index 8d3a355fffa..5f71d6cff19 100644 --- a/reactos/dll/win32/usp10/shape.c +++ b/reactos/dll/win32/usp10/shape.c @@ -19,6 +19,7 @@ * */ #include +#include #include "windef.h" #include "winbase.h" @@ -53,6 +54,8 @@ static void ContextualShape_Tamil(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *ps static void ContextualShape_Telugu(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust); static void ContextualShape_Kannada(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust); static void ContextualShape_Malayalam(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust); +static void ContextualShape_Khmer(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust); +static void ContextualShape_Mongolian(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust); typedef VOID (*ShapeCharGlyphPropProc)( HDC , ScriptCache*, SCRIPT_ANALYSIS*, const WCHAR*, const INT, const WORD*, const INT, WORD*, SCRIPT_CHARPROP*, SCRIPT_GLYPHPROP*); @@ -71,6 +74,7 @@ static void ShapeCharGlyphProp_Tamil( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS static void ShapeCharGlyphProp_Telugu( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ); static void ShapeCharGlyphProp_Kannada( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ); static void ShapeCharGlyphProp_Malayalam( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ); +static void ShapeCharGlyphProp_Khmer( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ); extern const unsigned short indic_syllabic_table[]; extern const unsigned short wine_shaping_table[]; @@ -96,221 +100,6 @@ enum joined_forms { Afx }; -#ifdef WORDS_BIGENDIAN -#define GET_BE_WORD(x) (x) -#else -#define GET_BE_WORD(x) RtlUshortByteSwap(x) -#endif - -/* These are all structures needed for the GSUB table */ -#define GSUB_TAG MS_MAKE_TAG('G', 'S', 'U', 'B') -#define GSUB_E_NOFEATURE -2 -#define GSUB_E_NOGLYPH -1 - -typedef struct { - DWORD version; - WORD ScriptList; - WORD FeatureList; - WORD LookupList; -} GSUB_Header; - -typedef struct { - CHAR ScriptTag[4]; - WORD Script; -} GSUB_ScriptRecord; - -typedef struct { - WORD ScriptCount; - GSUB_ScriptRecord ScriptRecord[1]; -} GSUB_ScriptList; - -typedef struct { - CHAR LangSysTag[4]; - WORD LangSys; -} GSUB_LangSysRecord; - -typedef struct { - WORD DefaultLangSys; - WORD LangSysCount; - GSUB_LangSysRecord LangSysRecord[1]; -} GSUB_Script; - -typedef struct { - WORD LookupOrder; /* Reserved */ - WORD ReqFeatureIndex; - WORD FeatureCount; - WORD FeatureIndex[1]; -} GSUB_LangSys; - -typedef struct { - CHAR FeatureTag[4]; - WORD Feature; -} GSUB_FeatureRecord; - -typedef struct { - WORD FeatureCount; - GSUB_FeatureRecord FeatureRecord[1]; -} GSUB_FeatureList; - -typedef struct { - WORD FeatureParams; /* Reserved */ - WORD LookupCount; - WORD LookupListIndex[1]; -} GSUB_Feature; - -typedef struct { - WORD LookupCount; - WORD Lookup[1]; -} GSUB_LookupList; - -typedef struct { - WORD LookupType; - WORD LookupFlag; - WORD SubTableCount; - WORD SubTable[1]; -} GSUB_LookupTable; - -typedef struct { - WORD CoverageFormat; - WORD GlyphCount; - WORD GlyphArray[1]; -} GSUB_CoverageFormat1; - -typedef struct { - WORD Start; - WORD End; - WORD StartCoverageIndex; -} GSUB_RangeRecord; - -typedef struct { - WORD CoverageFormat; - WORD RangeCount; - GSUB_RangeRecord RangeRecord[1]; -} GSUB_CoverageFormat2; - -typedef struct { - WORD SubstFormat; /* = 1 */ - WORD Coverage; - WORD DeltaGlyphID; -} GSUB_SingleSubstFormat1; - -typedef struct { - WORD SubstFormat; /* = 2 */ - WORD Coverage; - WORD GlyphCount; - WORD Substitute[1]; -}GSUB_SingleSubstFormat2; - -typedef struct { - WORD SubstFormat; /* = 1 */ - WORD Coverage; - WORD SequenceCount; - WORD Sequence[1]; -}GSUB_MultipleSubstFormat1; - -typedef struct { - WORD GlyphCount; - WORD Substitute[1]; -}GSUB_Sequence; - -typedef struct { - WORD SubstFormat; /* = 1 */ - WORD Coverage; - WORD LigSetCount; - WORD LigatureSet[1]; -}GSUB_LigatureSubstFormat1; - -typedef struct { - WORD LigatureCount; - WORD Ligature[1]; -}GSUB_LigatureSet; - -typedef struct{ - WORD LigGlyph; - WORD CompCount; - WORD Component[1]; -}GSUB_Ligature; - -typedef struct{ - WORD SequenceIndex; - WORD LookupListIndex; - -}GSUB_SubstLookupRecord; - -typedef struct{ - WORD SubstFormat; /* = 1 */ - WORD Coverage; - WORD ChainSubRuleSetCount; - WORD ChainSubRuleSet[1]; -}GSUB_ChainContextSubstFormat1; - -typedef struct { - WORD SubstFormat; /* = 3 */ - WORD BacktrackGlyphCount; - WORD Coverage[1]; -}GSUB_ChainContextSubstFormat3_1; - -typedef struct{ - WORD InputGlyphCount; - WORD Coverage[1]; -}GSUB_ChainContextSubstFormat3_2; - -typedef struct{ - WORD LookaheadGlyphCount; - WORD Coverage[1]; -}GSUB_ChainContextSubstFormat3_3; - -typedef struct{ - WORD SubstCount; - GSUB_SubstLookupRecord SubstLookupRecord[1]; -}GSUB_ChainContextSubstFormat3_4; - -typedef struct { - WORD SubstFormat; /* = 1 */ - WORD Coverage; - WORD AlternateSetCount; - WORD AlternateSet[1]; -} GSUB_AlternateSubstFormat1; - -typedef struct{ - WORD GlyphCount; - WORD Alternate[1]; -} GSUB_AlternateSet; - -/* These are all structures needed for the GDEF table */ -#define GDEF_TAG MS_MAKE_TAG('G', 'D', 'E', 'F') - -enum {BaseGlyph=1, LigatureGlyph, MarkGlyph, ComponentGlyph}; - -typedef struct { - DWORD Version; - WORD GlyphClassDef; - WORD AttachList; - WORD LigCaretList; - WORD MarkAttachClassDef; -} GDEF_Header; - -typedef struct { - WORD ClassFormat; - WORD StartGlyph; - WORD GlyphCount; - WORD ClassValueArray[1]; -} GDEF_ClassDefFormat1; - -typedef struct { - WORD Start; - WORD End; - WORD Class; -} GDEF_ClassRangeRecord; - -typedef struct { - WORD ClassFormat; - WORD ClassRangeCount; - GDEF_ClassRangeRecord ClassRangeRecord[1]; -} GDEF_ClassDefFormat2; - -static INT GSUB_apply_lookup(const GSUB_LookupList* lookup, INT lookup_index, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count); - typedef struct tagVowelComponents { WCHAR base; @@ -452,6 +241,12 @@ static OPENTYPE_FEATURE_RECORD devanagari_features[] = { MS_MAKE_TAG('c','a','l','t'), 1}, }; +static OPENTYPE_FEATURE_RECORD myanmar_features[] = +{ + { MS_MAKE_TAG('l','i','g','a'), 1}, + { MS_MAKE_TAG('c','l','i','g'), 1}, +}; + static const char* required_bengali_features[] = { "nukt", @@ -539,11 +334,52 @@ static const char* required_telugu_features[] = NULL }; +static OPENTYPE_FEATURE_RECORD khmer_features[] = +{ + { MS_MAKE_TAG('p','r','e','s'), 1}, + { MS_MAKE_TAG('b','l','w','s'), 1}, + { MS_MAKE_TAG('a','b','v','s'), 1}, + { MS_MAKE_TAG('p','s','t','s'), 1}, + { MS_MAKE_TAG('c','l','i','g'), 1}, +}; + +static const char* required_khmer_features[] = +{ + "pref", + "blwf", + "abvf", + "pstf", + "pres", + "blws", + "abvs", + "psts", + "clig", + NULL +}; + +static OPENTYPE_FEATURE_RECORD no_features[] = +{ }; + +static OPENTYPE_FEATURE_RECORD ethiopic_features[] = +{ + { MS_MAKE_TAG('c','c','m','p'), 1}, + { MS_MAKE_TAG('l','o','c','l'), 1}, + { MS_MAKE_TAG('c','a','l','t'), 1}, + { MS_MAKE_TAG('l','i','g','a'), 1}, +}; + +static OPENTYPE_FEATURE_RECORD mongolian_features[] = +{ + { MS_MAKE_TAG('c','c','m','p'), 1}, + { MS_MAKE_TAG('l','o','c','l'), 1}, + { MS_MAKE_TAG('c','a','l','t'), 1}, + { MS_MAKE_TAG('r','l','i','g'), 1}, +}; + typedef struct ScriptShapeDataTag { TEXTRANGE_PROPERTIES defaultTextRange; const char** requiredFeatures; - CHAR otTag[5]; - CHAR newOtTag[5]; + OPENTYPE_TAG newOtTag; ContextualShapingProc contextProc; ShapeCharGlyphPropProc charGlyphPropProc; } ScriptShapeData; @@ -551,501 +387,101 @@ typedef struct ScriptShapeDataTag { /* in order of scripts */ static const ScriptShapeData ShapingData[] = { - {{ standard_features, 2}, NULL, "", "", NULL, NULL}, - {{ latin_features, 2}, NULL, "latn", "", NULL, NULL}, - {{ latin_features, 2}, NULL, "latn", "", NULL, NULL}, - {{ latin_features, 2}, NULL, "latn", "", NULL, NULL}, - {{ standard_features, 2}, NULL, "" , "", NULL, NULL}, - {{ latin_features, 2}, NULL, "latn", "", NULL, NULL}, - {{ arabic_features, 6}, required_arabic_features, "arab", "", ContextualShape_Arabic, ShapeCharGlyphProp_Arabic}, - {{ arabic_features, 6}, required_arabic_features, "arab", "", ContextualShape_Arabic, ShapeCharGlyphProp_Arabic}, - {{ hebrew_features, 1}, NULL, "hebr", "", NULL, NULL}, - {{ syriac_features, 4}, required_syriac_features, "syrc", "", ContextualShape_Syriac, ShapeCharGlyphProp_None}, - {{ arabic_features, 6}, required_arabic_features, "arab", "", ContextualShape_Arabic, ShapeCharGlyphProp_Arabic}, - {{ NULL, 0}, NULL, "thaa", "", NULL, ShapeCharGlyphProp_None}, - {{ standard_features, 2}, NULL, "grek", "", NULL, NULL}, - {{ standard_features, 2}, NULL, "cyrl", "", NULL, NULL}, - {{ standard_features, 2}, NULL, "armn", "", NULL, NULL}, - {{ standard_features, 2}, NULL, "geor", "", NULL, NULL}, - {{ sinhala_features, 3}, NULL, "sinh", "", ContextualShape_Sinhala, ShapeCharGlyphProp_Sinhala}, - {{ tibetan_features, 2}, NULL, "tibt", "", NULL, ShapeCharGlyphProp_Tibet}, - {{ tibetan_features, 2}, NULL, "tibt", "", NULL, ShapeCharGlyphProp_Tibet}, - {{ phags_features, 3}, NULL, "phag", "", ContextualShape_Phags_pa, ShapeCharGlyphProp_Thai}, - {{ thai_features, 1}, NULL, "thai", "", NULL, ShapeCharGlyphProp_Thai}, - {{ thai_features, 1}, NULL, "thai", "", NULL, ShapeCharGlyphProp_Thai}, - {{ thai_features, 1}, required_lao_features, "lao", "", NULL, ShapeCharGlyphProp_Thai}, - {{ thai_features, 1}, required_lao_features, "lao", "", NULL, ShapeCharGlyphProp_Thai}, - {{ devanagari_features, 6}, required_devanagari_features, "deva", "dev2", ContextualShape_Devanagari, ShapeCharGlyphProp_Devanagari}, - {{ devanagari_features, 6}, required_devanagari_features, "deva", "dev2", ContextualShape_Devanagari, ShapeCharGlyphProp_Devanagari}, - {{ devanagari_features, 6}, required_bengali_features, "beng", "bng2", ContextualShape_Bengali, ShapeCharGlyphProp_Bengali}, - {{ devanagari_features, 6}, required_bengali_features, "beng", "bng2", ContextualShape_Bengali, ShapeCharGlyphProp_Bengali}, - {{ devanagari_features, 6}, required_bengali_features, "beng", "bng2", ContextualShape_Bengali, ShapeCharGlyphProp_Bengali}, - {{ devanagari_features, 6}, required_gurmukhi_features, "guru", "gur2", ContextualShape_Gurmukhi, ShapeCharGlyphProp_Gurmukhi}, - {{ devanagari_features, 6}, required_gurmukhi_features, "guru", "gur2", ContextualShape_Gurmukhi, ShapeCharGlyphProp_Gurmukhi}, - {{ devanagari_features, 6}, required_devanagari_features, "gujr", "gjr2", ContextualShape_Gujarati, ShapeCharGlyphProp_Gujarati}, - {{ devanagari_features, 6}, required_devanagari_features, "gujr", "gjr2", ContextualShape_Gujarati, ShapeCharGlyphProp_Gujarati}, - {{ devanagari_features, 6}, required_devanagari_features, "gujr", "gjr2", ContextualShape_Gujarati, ShapeCharGlyphProp_Gujarati}, - {{ devanagari_features, 6}, required_oriya_features, "orya", "ory2", ContextualShape_Oriya, ShapeCharGlyphProp_Oriya}, - {{ devanagari_features, 6}, required_oriya_features, "orya", "ory2", ContextualShape_Oriya, ShapeCharGlyphProp_Oriya}, - {{ devanagari_features, 6}, required_tamil_features, "taml", "tam2", ContextualShape_Tamil, ShapeCharGlyphProp_Tamil}, - {{ devanagari_features, 6}, required_tamil_features, "taml", "tam2", ContextualShape_Tamil, ShapeCharGlyphProp_Tamil}, - {{ devanagari_features, 6}, required_telugu_features, "telu", "tel2", ContextualShape_Telugu, ShapeCharGlyphProp_Telugu}, - {{ devanagari_features, 6}, required_telugu_features, "telu", "tel2", ContextualShape_Telugu, ShapeCharGlyphProp_Telugu}, - {{ devanagari_features, 6}, required_telugu_features, "knda", "knd2", ContextualShape_Kannada, ShapeCharGlyphProp_Kannada}, - {{ devanagari_features, 6}, required_telugu_features, "knda", "knd2", ContextualShape_Kannada, ShapeCharGlyphProp_Kannada}, - {{ devanagari_features, 6}, required_telugu_features, "mlym", "mlm2", ContextualShape_Malayalam, ShapeCharGlyphProp_Malayalam}, - {{ devanagari_features, 6}, required_telugu_features, "mlym", "mlm2", ContextualShape_Malayalam, ShapeCharGlyphProp_Malayalam}, - {{ standard_features, 2}, NULL, "" , "", NULL, NULL}, - {{ latin_features, 2}, NULL, "latn" , "", NULL, NULL}, - {{ standard_features, 2}, NULL, "" , "", NULL, NULL}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ latin_features, 2}, NULL, 0, NULL, NULL}, + {{ latin_features, 2}, NULL, 0, NULL, NULL}, + {{ latin_features, 2}, NULL, 0, NULL, NULL}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ latin_features, 2}, NULL, 0, NULL, NULL}, + {{ arabic_features, 6}, required_arabic_features, 0, ContextualShape_Arabic, ShapeCharGlyphProp_Arabic}, + {{ arabic_features, 6}, required_arabic_features, 0, ContextualShape_Arabic, ShapeCharGlyphProp_Arabic}, + {{ hebrew_features, 1}, NULL, 0, NULL, NULL}, + {{ syriac_features, 4}, required_syriac_features, 0, ContextualShape_Syriac, ShapeCharGlyphProp_None}, + {{ arabic_features, 6}, required_arabic_features, 0, ContextualShape_Arabic, ShapeCharGlyphProp_Arabic}, + {{ NULL, 0}, NULL, 0, NULL, ShapeCharGlyphProp_None}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ sinhala_features, 3}, NULL, 0, ContextualShape_Sinhala, ShapeCharGlyphProp_Sinhala}, + {{ tibetan_features, 2}, NULL, 0, NULL, ShapeCharGlyphProp_Tibet}, + {{ tibetan_features, 2}, NULL, 0, NULL, ShapeCharGlyphProp_Tibet}, + {{ phags_features, 3}, NULL, 0, ContextualShape_Phags_pa, ShapeCharGlyphProp_Thai}, + {{ thai_features, 1}, NULL, 0, NULL, ShapeCharGlyphProp_Thai}, + {{ thai_features, 1}, NULL, 0, NULL, ShapeCharGlyphProp_Thai}, + {{ thai_features, 1}, required_lao_features, 0, NULL, ShapeCharGlyphProp_Thai}, + {{ thai_features, 1}, required_lao_features, 0, NULL, ShapeCharGlyphProp_Thai}, + {{ devanagari_features, 6}, required_devanagari_features, MS_MAKE_TAG('d','e','v','2'), ContextualShape_Devanagari, ShapeCharGlyphProp_Devanagari}, + {{ devanagari_features, 6}, required_devanagari_features, MS_MAKE_TAG('d','e','v','2'), ContextualShape_Devanagari, ShapeCharGlyphProp_Devanagari}, + {{ devanagari_features, 6}, required_bengali_features, MS_MAKE_TAG('b','n','g','2'), ContextualShape_Bengali, ShapeCharGlyphProp_Bengali}, + {{ devanagari_features, 6}, required_bengali_features, MS_MAKE_TAG('b','n','g','2'), ContextualShape_Bengali, ShapeCharGlyphProp_Bengali}, + {{ devanagari_features, 6}, required_bengali_features, MS_MAKE_TAG('b','n','g','2'), ContextualShape_Bengali, ShapeCharGlyphProp_Bengali}, + {{ devanagari_features, 6}, required_gurmukhi_features, MS_MAKE_TAG('g','u','r','2'), ContextualShape_Gurmukhi, ShapeCharGlyphProp_Gurmukhi}, + {{ devanagari_features, 6}, required_gurmukhi_features, MS_MAKE_TAG('g','u','r','2'), ContextualShape_Gurmukhi, ShapeCharGlyphProp_Gurmukhi}, + {{ devanagari_features, 6}, required_devanagari_features, MS_MAKE_TAG('g','j','r','2'), ContextualShape_Gujarati, ShapeCharGlyphProp_Gujarati}, + {{ devanagari_features, 6}, required_devanagari_features, MS_MAKE_TAG('g','j','r','2'), ContextualShape_Gujarati, ShapeCharGlyphProp_Gujarati}, + {{ devanagari_features, 6}, required_devanagari_features, MS_MAKE_TAG('g','j','r','2'), ContextualShape_Gujarati, ShapeCharGlyphProp_Gujarati}, + {{ devanagari_features, 6}, required_oriya_features, MS_MAKE_TAG('o','r','y','2'), ContextualShape_Oriya, ShapeCharGlyphProp_Oriya}, + {{ devanagari_features, 6}, required_oriya_features, MS_MAKE_TAG('o','r','y','2'), ContextualShape_Oriya, ShapeCharGlyphProp_Oriya}, + {{ devanagari_features, 6}, required_tamil_features, MS_MAKE_TAG('t','a','m','2'), ContextualShape_Tamil, ShapeCharGlyphProp_Tamil}, + {{ devanagari_features, 6}, required_tamil_features, MS_MAKE_TAG('t','a','m','2'), ContextualShape_Tamil, ShapeCharGlyphProp_Tamil}, + {{ devanagari_features, 6}, required_telugu_features, MS_MAKE_TAG('t','e','l','2'), ContextualShape_Telugu, ShapeCharGlyphProp_Telugu}, + {{ devanagari_features, 6}, required_telugu_features, MS_MAKE_TAG('t','e','l','2'), ContextualShape_Telugu, ShapeCharGlyphProp_Telugu}, + {{ devanagari_features, 6}, required_telugu_features, MS_MAKE_TAG('k','n','d','2'), ContextualShape_Kannada, ShapeCharGlyphProp_Kannada}, + {{ devanagari_features, 6}, required_telugu_features, MS_MAKE_TAG('k','n','d','2'), ContextualShape_Kannada, ShapeCharGlyphProp_Kannada}, + {{ devanagari_features, 6}, required_telugu_features, MS_MAKE_TAG('m','l','m','2'), ContextualShape_Malayalam, ShapeCharGlyphProp_Malayalam}, + {{ devanagari_features, 6}, required_telugu_features, MS_MAKE_TAG('m','l','m','2'), ContextualShape_Malayalam, ShapeCharGlyphProp_Malayalam}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ latin_features, 2}, NULL, 0, NULL, NULL}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ myanmar_features, 2}, NULL, 0, NULL, NULL}, + {{ myanmar_features, 2}, NULL, 0, NULL, NULL}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ standard_features, 2}, NULL, 0, NULL, NULL}, + {{ khmer_features, 5}, required_khmer_features, 0, ContextualShape_Khmer, ShapeCharGlyphProp_Khmer}, + {{ khmer_features, 5}, required_khmer_features, 0, ContextualShape_Khmer, ShapeCharGlyphProp_Khmer}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ ethiopic_features, 4}, NULL, 0, NULL, NULL}, + {{ ethiopic_features, 4}, NULL, 0, NULL, NULL}, + {{ mongolian_features, 4}, NULL, 0, ContextualShape_Mongolian, NULL}, + {{ mongolian_features, 4}, NULL, 0, ContextualShape_Mongolian, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ hebrew_features, 1}, NULL, 0, NULL, NULL}, + {{ latin_features, 2}, NULL, 0, NULL, NULL}, + {{ thai_features, 1}, NULL, 0, NULL, ShapeCharGlyphProp_Thai}, }; -static INT GSUB_is_glyph_covered(LPCVOID table , UINT glyph) -{ - const GSUB_CoverageFormat1* cf1; +extern scriptData scriptInformation[]; - cf1 = table; - - if (GET_BE_WORD(cf1->CoverageFormat) == 1) - { - int count = GET_BE_WORD(cf1->GlyphCount); - int i; - TRACE("Coverage Format 1, %i glyphs\n",count); - for (i = 0; i < count; i++) - if (glyph == GET_BE_WORD(cf1->GlyphArray[i])) - return i; - return -1; - } - else if (GET_BE_WORD(cf1->CoverageFormat) == 2) - { - const GSUB_CoverageFormat2* cf2; - int i; - int count; - cf2 = (const GSUB_CoverageFormat2*)cf1; - - count = GET_BE_WORD(cf2->RangeCount); - TRACE("Coverage Format 2, %i ranges\n",count); - for (i = 0; i < count; i++) - { - if (glyph < GET_BE_WORD(cf2->RangeRecord[i].Start)) - return -1; - if ((glyph >= GET_BE_WORD(cf2->RangeRecord[i].Start)) && - (glyph <= GET_BE_WORD(cf2->RangeRecord[i].End))) - { - return (GET_BE_WORD(cf2->RangeRecord[i].StartCoverageIndex) + - glyph - GET_BE_WORD(cf2->RangeRecord[i].Start)); - } - } - return -1; - } - else - ERR("Unknown CoverageFormat %i\n",GET_BE_WORD(cf1->CoverageFormat)); - - return -1; -} - -static const GSUB_Script* GSUB_get_script_table( const GSUB_Header* header, const char* tag) -{ - const GSUB_ScriptList *script; - const GSUB_Script *deflt = NULL; - int i; - script = (const GSUB_ScriptList*)((const BYTE*)header + GET_BE_WORD(header->ScriptList)); - - TRACE("%i scripts in this font\n",GET_BE_WORD(script->ScriptCount)); - for (i = 0; i < GET_BE_WORD(script->ScriptCount); i++) - { - const GSUB_Script *scr; - int offset; - - offset = GET_BE_WORD(script->ScriptRecord[i].Script); - scr = (const GSUB_Script*)((const BYTE*)script + offset); - - if (strncmp(script->ScriptRecord[i].ScriptTag, tag,4)==0) - return scr; - if (strncmp(script->ScriptRecord[i].ScriptTag, "dflt",4)==0) - deflt = scr; - } - return deflt; -} - -static const GSUB_LangSys* GSUB_get_lang_table( const GSUB_Script* script, const char* tag) -{ - int i; - int offset; - const GSUB_LangSys *Lang; - - TRACE("Deflang %x, LangCount %i\n",GET_BE_WORD(script->DefaultLangSys), GET_BE_WORD(script->LangSysCount)); - - for (i = 0; i < GET_BE_WORD(script->LangSysCount) ; i++) - { - offset = GET_BE_WORD(script->LangSysRecord[i].LangSys); - Lang = (const GSUB_LangSys*)((const BYTE*)script + offset); - - if ( strncmp(script->LangSysRecord[i].LangSysTag,tag,4)==0) - return Lang; - } - offset = GET_BE_WORD(script->DefaultLangSys); - if (offset) - { - Lang = (const GSUB_LangSys*)((const BYTE*)script + offset); - return Lang; - } - return NULL; -} - -static const GSUB_Feature * GSUB_get_feature(const GSUB_Header *header, const GSUB_LangSys *lang, const char* tag) -{ - int i; - const GSUB_FeatureList *feature; - feature = (const GSUB_FeatureList*)((const BYTE*)header + GET_BE_WORD(header->FeatureList)); - - TRACE("%i features\n",GET_BE_WORD(lang->FeatureCount)); - for (i = 0; i < GET_BE_WORD(lang->FeatureCount); i++) - { - int index = GET_BE_WORD(lang->FeatureIndex[i]); - if (strncmp(feature->FeatureRecord[index].FeatureTag,tag,4)==0) - { - const GSUB_Feature *feat; - feat = (const GSUB_Feature*)((const BYTE*)feature + GET_BE_WORD(feature->FeatureRecord[index].Feature)); - return feat; - } - } - return NULL; -} - -static INT GSUB_apply_SingleSubst(const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) -{ - int j; - TRACE("Single Substitution Subtable\n"); - - for (j = 0; j < GET_BE_WORD(look->SubTableCount); j++) - { - int offset; - const GSUB_SingleSubstFormat1 *ssf1; - offset = GET_BE_WORD(look->SubTable[j]); - ssf1 = (const GSUB_SingleSubstFormat1*)((const BYTE*)look+offset); - if (GET_BE_WORD(ssf1->SubstFormat) == 1) - { - int offset = GET_BE_WORD(ssf1->Coverage); - TRACE(" subtype 1, delta %i\n", GET_BE_WORD(ssf1->DeltaGlyphID)); - if (GSUB_is_glyph_covered((const BYTE*)ssf1+offset, glyphs[glyph_index]) != -1) - { - TRACE(" Glyph 0x%x ->",glyphs[glyph_index]); - glyphs[glyph_index] = glyphs[glyph_index] + GET_BE_WORD(ssf1->DeltaGlyphID); - TRACE(" 0x%x\n",glyphs[glyph_index]); - return glyph_index + write_dir; - } - } - else - { - const GSUB_SingleSubstFormat2 *ssf2; - INT index; - INT offset; - - ssf2 = (const GSUB_SingleSubstFormat2 *)ssf1; - offset = GET_BE_WORD(ssf1->Coverage); - TRACE(" subtype 2, glyph count %i\n", GET_BE_WORD(ssf2->GlyphCount)); - index = GSUB_is_glyph_covered((const BYTE*)ssf2+offset, glyphs[glyph_index]); - TRACE(" Coverage index %i\n",index); - if (index != -1) - { - if (glyphs[glyph_index] == GET_BE_WORD(ssf2->Substitute[index])) - return GSUB_E_NOGLYPH; - - TRACE(" Glyph is 0x%x ->",glyphs[glyph_index]); - glyphs[glyph_index] = GET_BE_WORD(ssf2->Substitute[index]); - TRACE("0x%x\n",glyphs[glyph_index]); - return glyph_index + write_dir; - } - } - } - return GSUB_E_NOGLYPH; -} - -static INT GSUB_apply_MultipleSubst(const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) -{ - int j; - TRACE("Multiple Substitution Subtable\n"); - - for (j = 0; j < GET_BE_WORD(look->SubTableCount); j++) - { - int offset, index; - const GSUB_MultipleSubstFormat1 *msf1; - offset = GET_BE_WORD(look->SubTable[j]); - msf1 = (const GSUB_MultipleSubstFormat1*)((const BYTE*)look+offset); - - offset = GET_BE_WORD(msf1->Coverage); - index = GSUB_is_glyph_covered((const BYTE*)msf1+offset, glyphs[glyph_index]); - if (index != -1) - { - const GSUB_Sequence *seq; - int sub_count; - int j; - offset = GET_BE_WORD(msf1->Sequence[index]); - seq = (const GSUB_Sequence*)((const BYTE*)msf1+offset); - sub_count = GET_BE_WORD(seq->GlyphCount); - TRACE(" Glyph 0x%x (+%i)->",glyphs[glyph_index],(sub_count-1)); - - for (j = (*glyph_count)+(sub_count-1); j > glyph_index; j--) - glyphs[j] =glyphs[j-(sub_count-1)]; - - for (j = 0; j < sub_count; j++) - if (write_dir < 0) - glyphs[glyph_index + (sub_count-1) - j] = GET_BE_WORD(seq->Substitute[j]); - else - glyphs[glyph_index + j] = GET_BE_WORD(seq->Substitute[j]); - - *glyph_count = *glyph_count + (sub_count - 1); - - if (TRACE_ON(uniscribe)) - { - for (j = 0; j < sub_count; j++) - TRACE(" 0x%x",glyphs[glyph_index+j]); - TRACE("\n"); - } - - return glyph_index + (sub_count * write_dir); - } - } - return GSUB_E_NOGLYPH; -} - -static INT GSUB_apply_AlternateSubst(const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) -{ - int j; - TRACE("Alternate Substitution Subtable\n"); - - for (j = 0; j < GET_BE_WORD(look->SubTableCount); j++) - { - int offset; - const GSUB_AlternateSubstFormat1 *asf1; - INT index; - - offset = GET_BE_WORD(look->SubTable[j]); - asf1 = (const GSUB_AlternateSubstFormat1*)((const BYTE*)look+offset); - offset = GET_BE_WORD(asf1->Coverage); - - index = GSUB_is_glyph_covered((const BYTE*)asf1+offset, glyphs[glyph_index]); - if (index != -1) - { - const GSUB_AlternateSet *as; - offset = GET_BE_WORD(asf1->AlternateSet[index]); - as = (const GSUB_AlternateSet*)((const BYTE*)asf1+offset); - FIXME("%i alternates, picking index 0\n",GET_BE_WORD(as->GlyphCount)); - if (glyphs[glyph_index] == GET_BE_WORD(as->Alternate[0])) - return GSUB_E_NOGLYPH; - - TRACE(" Glyph 0x%x ->",glyphs[glyph_index]); - glyphs[glyph_index] = GET_BE_WORD(as->Alternate[0]); - TRACE(" 0x%x\n",glyphs[glyph_index]); - return glyph_index + write_dir; - } - } - return GSUB_E_NOGLYPH; -} - -static INT GSUB_apply_LigatureSubst(const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) -{ - int j; - - TRACE("Ligature Substitution Subtable\n"); - for (j = 0; j < GET_BE_WORD(look->SubTableCount); j++) - { - const GSUB_LigatureSubstFormat1 *lsf1; - int offset,index; - - offset = GET_BE_WORD(look->SubTable[j]); - lsf1 = (const GSUB_LigatureSubstFormat1*)((const BYTE*)look+offset); - offset = GET_BE_WORD(lsf1->Coverage); - index = GSUB_is_glyph_covered((const BYTE*)lsf1+offset, glyphs[glyph_index]); - TRACE(" Coverage index %i\n",index); - if (index != -1) - { - const GSUB_LigatureSet *ls; - int k, count; - - offset = GET_BE_WORD(lsf1->LigatureSet[index]); - ls = (const GSUB_LigatureSet*)((const BYTE*)lsf1+offset); - count = GET_BE_WORD(ls->LigatureCount); - TRACE(" LigatureSet has %i members\n",count); - for (k = 0; k < count; k++) - { - const GSUB_Ligature *lig; - int CompCount,l,CompIndex; - - offset = GET_BE_WORD(ls->Ligature[k]); - lig = (const GSUB_Ligature*)((const BYTE*)ls+offset); - CompCount = GET_BE_WORD(lig->CompCount) - 1; - CompIndex = glyph_index+write_dir; - for (l = 0; l < CompCount && CompIndex >= 0 && CompIndex < *glyph_count; l++) - { - int CompGlyph; - CompGlyph = GET_BE_WORD(lig->Component[l]); - if (CompGlyph != glyphs[CompIndex]) - break; - CompIndex += write_dir; - } - if (l == CompCount) - { - int replaceIdx = glyph_index; - if (write_dir < 0) - replaceIdx = glyph_index - CompCount; - - TRACE(" Glyph is 0x%x (+%i) ->",glyphs[glyph_index],CompCount); - glyphs[replaceIdx] = GET_BE_WORD(lig->LigGlyph); - TRACE("0x%x\n",glyphs[replaceIdx]); - if (CompCount > 0) - { - int j; - for (j = replaceIdx + 1; j < *glyph_count; j++) - glyphs[j] =glyphs[j+CompCount]; - *glyph_count = *glyph_count - CompCount; - } - return replaceIdx + write_dir; - } - } - } - } - return GSUB_E_NOGLYPH; -} - -static INT GSUB_apply_ChainContextSubst(const GSUB_LookupList* lookup, const GSUB_LookupTable *look, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) -{ - int j; - BOOL done = FALSE; - - TRACE("Chaining Contextual Substitution Subtable\n"); - for (j = 0; j < GET_BE_WORD(look->SubTableCount) && !done; j++) - { - const GSUB_ChainContextSubstFormat1 *ccsf1; - int offset; - int dirLookahead = write_dir; - int dirBacktrack = -1 * write_dir; - - offset = GET_BE_WORD(look->SubTable[j]); - ccsf1 = (const GSUB_ChainContextSubstFormat1*)((const BYTE*)look+offset); - if (GET_BE_WORD(ccsf1->SubstFormat) == 1) - { - FIXME(" TODO: subtype 1 (Simple context glyph substitution)\n"); - continue; - } - else if (GET_BE_WORD(ccsf1->SubstFormat) == 2) - { - FIXME(" TODO: subtype 2 (Class-based Chaining Context Glyph Substitution)\n"); - continue; - } - else if (GET_BE_WORD(ccsf1->SubstFormat) == 3) - { - int k; - int indexGlyphs; - const GSUB_ChainContextSubstFormat3_1 *ccsf3_1; - const GSUB_ChainContextSubstFormat3_2 *ccsf3_2; - const GSUB_ChainContextSubstFormat3_3 *ccsf3_3; - const GSUB_ChainContextSubstFormat3_4 *ccsf3_4; - int newIndex = glyph_index; - - ccsf3_1 = (const GSUB_ChainContextSubstFormat3_1 *)ccsf1; - - TRACE(" subtype 3 (Coverage-based Chaining Context Glyph Substitution)\n"); - - for (k = 0; k < GET_BE_WORD(ccsf3_1->BacktrackGlyphCount); k++) - { - offset = GET_BE_WORD(ccsf3_1->Coverage[k]); - if (GSUB_is_glyph_covered((const BYTE*)ccsf3_1+offset, glyphs[glyph_index + (dirBacktrack * (k+1))]) == -1) - break; - } - if (k != GET_BE_WORD(ccsf3_1->BacktrackGlyphCount)) - continue; - TRACE("Matched Backtrack\n"); - - ccsf3_2 = (const GSUB_ChainContextSubstFormat3_2 *)(((LPBYTE)ccsf1)+sizeof(GSUB_ChainContextSubstFormat3_1) + (sizeof(WORD) * (GET_BE_WORD(ccsf3_1->BacktrackGlyphCount)-1))); - - indexGlyphs = GET_BE_WORD(ccsf3_2->InputGlyphCount); - for (k = 0; k < indexGlyphs; k++) - { - offset = GET_BE_WORD(ccsf3_2->Coverage[k]); - if (GSUB_is_glyph_covered((const BYTE*)ccsf3_1+offset, glyphs[glyph_index + (write_dir * k)]) == -1) - break; - } - if (k != indexGlyphs) - continue; - TRACE("Matched IndexGlyphs\n"); - - ccsf3_3 = (const GSUB_ChainContextSubstFormat3_3 *)(((LPBYTE)ccsf3_2)+sizeof(GSUB_ChainContextSubstFormat3_2) + (sizeof(WORD) * (GET_BE_WORD(ccsf3_2->InputGlyphCount)-1))); - - for (k = 0; k < GET_BE_WORD(ccsf3_3->LookaheadGlyphCount); k++) - { - offset = GET_BE_WORD(ccsf3_3->Coverage[k]); - if (GSUB_is_glyph_covered((const BYTE*)ccsf3_1+offset, glyphs[glyph_index + (dirLookahead * (indexGlyphs + k))]) == -1) - break; - } - if (k != GET_BE_WORD(ccsf3_3->LookaheadGlyphCount)) - continue; - TRACE("Matched LookAhead\n"); - - ccsf3_4 = (const GSUB_ChainContextSubstFormat3_4 *)(((LPBYTE)ccsf3_3)+sizeof(GSUB_ChainContextSubstFormat3_3) + (sizeof(WORD) * (GET_BE_WORD(ccsf3_3->LookaheadGlyphCount)-1))); - - if (GET_BE_WORD(ccsf3_4->SubstCount)) - { - for (k = 0; k < GET_BE_WORD(ccsf3_4->SubstCount); k++) - { - int lookupIndex = GET_BE_WORD(ccsf3_4->SubstLookupRecord[k].LookupListIndex); - int SequenceIndex = GET_BE_WORD(ccsf3_4->SubstLookupRecord[k].SequenceIndex) * write_dir; - - TRACE("SUBST: %i -> %i %i\n",k, SequenceIndex, lookupIndex); - newIndex = GSUB_apply_lookup(lookup, lookupIndex, glyphs, glyph_index + SequenceIndex, write_dir, glyph_count); - if (newIndex == -1) - { - ERR("Chain failed to generate a glyph\n"); - continue; - } - } - return newIndex; - } - else return GSUB_E_NOGLYPH; - } - } - return -1; -} - -static INT GSUB_apply_lookup(const GSUB_LookupList* lookup, INT lookup_index, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) -{ - int offset; - const GSUB_LookupTable *look; - - offset = GET_BE_WORD(lookup->Lookup[lookup_index]); - look = (const GSUB_LookupTable*)((const BYTE*)lookup + offset); - TRACE("type %i, flag %x, subtables %i\n",GET_BE_WORD(look->LookupType),GET_BE_WORD(look->LookupFlag),GET_BE_WORD(look->SubTableCount)); - switch(GET_BE_WORD(look->LookupType)) - { - case 1: - return GSUB_apply_SingleSubst(look, glyphs, glyph_index, write_dir, glyph_count); - case 2: - return GSUB_apply_MultipleSubst(look, glyphs, glyph_index, write_dir, glyph_count); - case 3: - return GSUB_apply_AlternateSubst(look, glyphs, glyph_index, write_dir, glyph_count); - case 4: - return GSUB_apply_LigatureSubst(look, glyphs, glyph_index, write_dir, glyph_count); - case 6: - return GSUB_apply_ChainContextSubst(lookup, look, glyphs, glyph_index, write_dir, glyph_count); - default: - FIXME("We do not handle SubType %i\n",GET_BE_WORD(look->LookupType)); - } - return GSUB_E_NOGLYPH; -} - -static INT GSUB_apply_feature_all_lookups(const GSUB_Header * header, const GSUB_Feature* feature, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) +static INT GSUB_apply_feature_all_lookups(LPCVOID header, LoadedFeature *feature, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) { int i; int out_index = GSUB_E_NOGLYPH; - const GSUB_LookupList *lookup; - lookup = (const GSUB_LookupList*)((const BYTE*)header + GET_BE_WORD(header->LookupList)); - - TRACE("%i lookups\n", GET_BE_WORD(feature->LookupCount)); - for (i = 0; i < GET_BE_WORD(feature->LookupCount); i++) + TRACE("%i lookups\n", feature->lookup_count); + for (i = 0; i < feature->lookup_count; i++) { - out_index = GSUB_apply_lookup(lookup, GET_BE_WORD(feature->LookupListIndex[i]), glyphs, glyph_index, write_dir, glyph_count); + out_index = OpenType_apply_GSUB_lookup(header, feature->lookups[i], glyphs, glyph_index, write_dir, glyph_count); if (out_index != GSUB_E_NOGLYPH) break; } @@ -1061,23 +497,23 @@ static INT GSUB_apply_feature_all_lookups(const GSUB_Header * header, const GSUB return out_index; } -static const char* get_opentype_script(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache *psc, BOOL tryNew) +static OPENTYPE_TAG get_opentype_script(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache *psc, BOOL tryNew) { UINT charset; if (psc->userScript != 0) { - if (tryNew && ShapingData[psa->eScript].newOtTag[0] != 0 && strncmp((char*)&psc->userScript,ShapingData[psa->eScript].otTag,4)==0) + if (tryNew && ShapingData[psa->eScript].newOtTag != 0 && psc->userScript == scriptInformation[psa->eScript].scriptTag) return ShapingData[psa->eScript].newOtTag; else - return (char*)&psc->userScript; + return psc->userScript; } - if (tryNew && ShapingData[psa->eScript].newOtTag[0] != 0) + if (tryNew && ShapingData[psa->eScript].newOtTag != 0) return ShapingData[psa->eScript].newOtTag; - if (ShapingData[psa->eScript].otTag[0] != 0) - return ShapingData[psa->eScript].otTag; + if (scriptInformation[psa->eScript].scriptTag) + return scriptInformation[psa->eScript].scriptTag; /* * fall back to the font charset @@ -1085,93 +521,62 @@ static const char* get_opentype_script(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCach charset = GetTextCharsetInfo(hdc, NULL, 0x0); switch (charset) { - case ANSI_CHARSET: return "latn"; - case BALTIC_CHARSET: return "latn"; /* ?? */ - case CHINESEBIG5_CHARSET: return "hani"; - case EASTEUROPE_CHARSET: return "latn"; /* ?? */ - case GB2312_CHARSET: return "hani"; - case GREEK_CHARSET: return "grek"; - case HANGUL_CHARSET: return "hang"; - case RUSSIAN_CHARSET: return "cyrl"; - case SHIFTJIS_CHARSET: return "kana"; - case TURKISH_CHARSET: return "latn"; /* ?? */ - case VIETNAMESE_CHARSET: return "latn"; - case JOHAB_CHARSET: return "latn"; /* ?? */ - case ARABIC_CHARSET: return "arab"; - case HEBREW_CHARSET: return "hebr"; - case THAI_CHARSET: return "thai"; - default: return "latn"; + case ANSI_CHARSET: + case BALTIC_CHARSET: return MS_MAKE_TAG('l','a','t','n'); + case CHINESEBIG5_CHARSET: return MS_MAKE_TAG('h','a','n','i'); + case EASTEUROPE_CHARSET: return MS_MAKE_TAG('l','a','t','n'); /* ?? */ + case GB2312_CHARSET: return MS_MAKE_TAG('h','a','n','i'); + case GREEK_CHARSET: return MS_MAKE_TAG('g','r','e','k'); + case HANGUL_CHARSET: return MS_MAKE_TAG('h','a','n','g'); + case RUSSIAN_CHARSET: return MS_MAKE_TAG('c','y','r','l'); + case SHIFTJIS_CHARSET: return MS_MAKE_TAG('k','a','n','a'); + case TURKISH_CHARSET: return MS_MAKE_TAG('l','a','t','n'); /* ?? */ + case VIETNAMESE_CHARSET: return MS_MAKE_TAG('l','a','t','n'); + case JOHAB_CHARSET: return MS_MAKE_TAG('l','a','t','n'); /* ?? */ + case ARABIC_CHARSET: return MS_MAKE_TAG('a','r','a','b'); + case HEBREW_CHARSET: return MS_MAKE_TAG('h','e','b','r'); + case THAI_CHARSET: return MS_MAKE_TAG('t','h','a','i'); + default: return MS_MAKE_TAG('l','a','t','n'); } } -static LPCVOID load_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache *psc, const char* feat) +static LoadedFeature* load_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache *psc, const char* feat) { - const GSUB_Feature *feature; - const char* script; - int i; - - script = get_opentype_script(hdc,psa,psc,FALSE); - - for (i = 0; i < psc->feature_count; i++) - { - if (strncmp(psc->features[i].tag,feat,4)==0 && strncmp(psc->features[i].script,script,4)==0) - return psc->features[i].feature; - } - - feature = NULL; + LoadedFeature *feature = NULL; if (psc->GSUB_Table) { - const GSUB_Script *script; - const GSUB_LangSys *language; int attempt = 2; + OPENTYPE_TAG tags; + OPENTYPE_TAG language; + OPENTYPE_TAG script; + int cTags; do { - script = GSUB_get_script_table(psc->GSUB_Table, get_opentype_script(hdc,psa,psc,(attempt==2))); + script = get_opentype_script(hdc,psa,psc,(attempt==2)); + if (psc->userLang != 0) + language = psc->userLang; + else + language = MS_MAKE_TAG('d','f','l','t'); attempt--; - if (script) - { - if (psc->userLang != 0) - language = GSUB_get_lang_table(script,(char*)&psc->userLang); - else - language = GSUB_get_lang_table(script, "xxxx"); /* Need to get Lang tag */ - if (language) - feature = GSUB_get_feature(psc->GSUB_Table, language, feat); - } + + OpenType_GSUB_GetFontFeatureTags(psc, script, language, FALSE, MS_MAKE_TAG(feat[0],feat[1],feat[2],feat[3]), 1, &tags, &cTags, &feature); + } while(attempt && !feature); /* try in the default (latin) table */ if (!feature) - { - script = GSUB_get_script_table(psc->GSUB_Table, "latn"); - if (script) - { - language = GSUB_get_lang_table(script, "xxxx"); /* Need to get Lang tag */ - if (language) - feature = GSUB_get_feature(psc->GSUB_Table, language, feat); - } - } + OpenType_GSUB_GetFontFeatureTags(psc, MS_MAKE_TAG('l','a','t','n'), MS_MAKE_TAG('d','f','l','t'), FALSE, MS_MAKE_TAG(feat[0],feat[1],feat[2],feat[3]), 1, &tags, &cTags, &feature); } TRACE("Feature %s located at %p\n",debugstr_an(feat,4),feature); - - psc->feature_count++; - - if (psc->features) - psc->features = HeapReAlloc(GetProcessHeap(), 0, psc->features, psc->feature_count * sizeof(LoadedFeature)); - else - psc->features = HeapAlloc(GetProcessHeap(), 0, psc->feature_count * sizeof(LoadedFeature)); - - lstrcpynA(psc->features[psc->feature_count - 1].tag, feat, 5); - lstrcpynA(psc->features[psc->feature_count - 1].script, script, 5); - psc->features[psc->feature_count - 1].feature = feature; return feature; } static INT apply_GSUB_feature_to_glyph(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, WORD *glyphs, INT index, INT write_dir, INT* glyph_count, const char* feat) { - const GSUB_Feature *feature; + LoadedFeature *feature; feature = load_GSUB_feature(hdc, psa, psc, feat); if (!feature) @@ -1184,11 +589,11 @@ static INT apply_GSUB_feature_to_glyph(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCach static VOID *load_gsub_table(HDC hdc) { VOID* GSUB_Table = NULL; - int length = GetFontData(hdc, GSUB_TAG , 0, NULL, 0); + int length = GetFontData(hdc, MS_MAKE_TAG('G', 'S', 'U', 'B'), 0, NULL, 0); if (length != GDI_ERROR) { GSUB_Table = HeapAlloc(GetProcessHeap(),0,length); - GetFontData(hdc, GSUB_TAG , 0, GSUB_Table, length); + GetFontData(hdc, MS_MAKE_TAG('G', 'S', 'U', 'B'), 0, GSUB_Table, length); TRACE("Loaded GSUB table of %i bytes\n",length); } return GSUB_Table; @@ -1212,117 +617,6 @@ INT SHAPE_does_GSUB_feature_apply_to_chars(HDC hdc, SCRIPT_ANALYSIS *psa, Script return rc; } -static WORD GDEF_get_glyph_class(const GDEF_Header *header, WORD glyph) -{ - int offset; - WORD class = 0; - const GDEF_ClassDefFormat1 *cf1; - - if (!header) - return 0; - - offset = GET_BE_WORD(header->GlyphClassDef); - if (!offset) - return 0; - - cf1 = (GDEF_ClassDefFormat1*)(((BYTE*)header)+offset); - if (GET_BE_WORD(cf1->ClassFormat) == 1) - { - if (glyph >= GET_BE_WORD(cf1->StartGlyph)) - { - int index = glyph - GET_BE_WORD(cf1->StartGlyph); - if (index < GET_BE_WORD(cf1->GlyphCount)) - class = GET_BE_WORD(cf1->ClassValueArray[index]); - } - } - else if (GET_BE_WORD(cf1->ClassFormat) == 2) - { - const GDEF_ClassDefFormat2 *cf2 = (GDEF_ClassDefFormat2*)cf1; - int i, top; - top = GET_BE_WORD(cf2->ClassRangeCount); - for (i = 0; i < top; i++) - { - if (glyph >= GET_BE_WORD(cf2->ClassRangeRecord[i].Start) && - glyph <= GET_BE_WORD(cf2->ClassRangeRecord[i].End)) - { - class = GET_BE_WORD(cf2->ClassRangeRecord[i].Class); - break; - } - } - } - else - ERR("Unknown Class Format %i\n",GET_BE_WORD(cf1->ClassFormat)); - - return class; -} - -static VOID *load_gdef_table(HDC hdc) -{ - VOID* GDEF_Table = NULL; - int length = GetFontData(hdc, GDEF_TAG , 0, NULL, 0); - if (length != GDI_ERROR) - { - GDEF_Table = HeapAlloc(GetProcessHeap(),0,length); - GetFontData(hdc, GDEF_TAG , 0, GDEF_Table, length); - TRACE("Loaded GDEF table of %i bytes\n",length); - } - return GDEF_Table; -} - -static void GDEF_UpdateGlyphProps(HDC hdc, ScriptCache *psc, const WORD *pwGlyphs, const WORD cGlyphs, WORD* pwLogClust, const WORD cChars, SCRIPT_GLYPHPROP *pGlyphProp) -{ - int i; - - if (!psc->GDEF_Table) - psc->GDEF_Table = load_gdef_table(hdc); - - for (i = 0; i < cGlyphs; i++) - { - WORD class; - int char_count = 0; - int k; - - for (k = 0; k < cChars; k++) - if (pwLogClust[k] == i) - char_count++; - - class = GDEF_get_glyph_class(psc->GDEF_Table, pwGlyphs[i]); - - switch (class) - { - case 0: - case BaseGlyph: - pGlyphProp[i].sva.fClusterStart = 1; - pGlyphProp[i].sva.fDiacritic = 0; - pGlyphProp[i].sva.fZeroWidth = 0; - break; - case LigatureGlyph: - pGlyphProp[i].sva.fClusterStart = 1; - pGlyphProp[i].sva.fDiacritic = 0; - pGlyphProp[i].sva.fZeroWidth = 0; - break; - case MarkGlyph: - pGlyphProp[i].sva.fClusterStart = 0; - pGlyphProp[i].sva.fDiacritic = 1; - pGlyphProp[i].sva.fZeroWidth = 1; - break; - case ComponentGlyph: - pGlyphProp[i].sva.fClusterStart = 0; - pGlyphProp[i].sva.fDiacritic = 0; - pGlyphProp[i].sva.fZeroWidth = 0; - break; - default: - ERR("Unknown glyph class %i\n",class); - pGlyphProp[i].sva.fClusterStart = 1; - pGlyphProp[i].sva.fDiacritic = 0; - pGlyphProp[i].sva.fZeroWidth = 0; - } - - if (char_count == 0) - pGlyphProp[i].sva.fClusterStart = 0; - } -} - static void UpdateClustersFromGlyphProp(const int cGlyphs, const int cChars, WORD* pwLogClust, SCRIPT_GLYPHPROP *pGlyphProp) { int i; @@ -1445,20 +739,15 @@ static int apply_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, W { if (psc->GSUB_Table) { - const GSUB_Feature *feature; - const GSUB_LookupList *lookup; - const GSUB_Header *header = psc->GSUB_Table; - int lookup_index, lookup_count; + LoadedFeature *feature; + int lookup_index; feature = load_GSUB_feature(hdc, psa, psc, feat); if (!feature) return GSUB_E_NOFEATURE; - TRACE("applying feature %s\n",debugstr_an(feat,4)); - lookup = (const GSUB_LookupList*)((const BYTE*)header + GET_BE_WORD(header->LookupList)); - lookup_count = GET_BE_WORD(feature->LookupCount); - TRACE("%i lookups\n", lookup_count); - for (lookup_index = 0; lookup_index < lookup_count; lookup_index++) + TRACE("applying feature %s: %i lookups\n",debugstr_an(feat,4),feature->lookup_count); + for (lookup_index = 0; lookup_index < feature->lookup_count; lookup_index++) { int i; @@ -1466,13 +755,13 @@ static int apply_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, W i = 0; else i = *pcGlyphs-1; - TRACE("applying lookup (%i/%i)\n",lookup_index,lookup_count); + TRACE("applying lookup (%i/%i)\n",lookup_index,feature->lookup_count); while(i < *pcGlyphs && i >= 0) { INT nextIndex; INT prevCount = *pcGlyphs; - nextIndex = GSUB_apply_lookup(lookup, GET_BE_WORD(feature->LookupListIndex[lookup_index]), pwOutGlyphs, i, write_dir, pcGlyphs); + nextIndex = OpenType_apply_GSUB_lookup(psc->GSUB_Table, feature->lookups[lookup_index], pwOutGlyphs, i, write_dir, pcGlyphs); if (*pcGlyphs != prevCount) { UpdateClusters(nextIndex, *pcGlyphs - prevCount, write_dir, cChars, pwLogClust); @@ -1489,7 +778,13 @@ static int apply_GSUB_feature(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, W static inline BOOL get_GSUB_Indic2(SCRIPT_ANALYSIS *psa, ScriptCache *psc) { - return(GSUB_get_script_table(psc->GSUB_Table,ShapingData[psa->eScript].newOtTag)!=NULL); + OPENTYPE_TAG tag; + HRESULT hr; + int count = 0; + + hr = OpenType_GSUB_GetFontScriptTags(psc, ShapingData[psa->eScript].newOtTag, 1, &tag, &count, NULL); + + return(SUCCEEDED(hr)); } static WCHAR neighbour_char(int i, int delta, const WCHAR* chars, INT cchLen) @@ -2157,7 +1452,7 @@ static inline void shift_syllable_glyph_indexs(IndicSyllable *glyph_index, INT i glyph_index->pref+= shift; } -static void Apply_Indic_BasicForm(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwChars, INT cChars, IndicSyllable *syllable, WORD *pwOutGlyphs, INT* pcGlyphs, WORD *pwLogClust, lexical_function lexical, IndicSyllable *glyph_index, const GSUB_Feature *feature ) +static void Apply_Indic_BasicForm(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwChars, INT cChars, IndicSyllable *syllable, WORD *pwOutGlyphs, INT* pcGlyphs, WORD *pwLogClust, lexical_function lexical, IndicSyllable *glyph_index, LoadedFeature *feature ) { int index = glyph_index->start; @@ -2294,13 +1589,13 @@ static void ShapeIndicSyllables(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, { int c; int overall_shift = 0; - const GSUB_Feature *locl = (modern)?load_GSUB_feature(hdc, psa, psc, "locl"):NULL; - const GSUB_Feature *nukt = load_GSUB_feature(hdc, psa, psc, "nukt"); - const GSUB_Feature *akhn = load_GSUB_feature(hdc, psa, psc, "akhn"); - const GSUB_Feature *rkrf = (modern)?load_GSUB_feature(hdc, psa, psc, "rkrf"):NULL; - const GSUB_Feature *pstf = load_GSUB_feature(hdc, psa, psc, "pstf"); - const GSUB_Feature *vatu = (!rkrf)?load_GSUB_feature(hdc, psa, psc, "vatu"):NULL; - const GSUB_Feature *cjct = (modern)?load_GSUB_feature(hdc, psa, psc, "cjct"):NULL; + LoadedFeature *locl = (modern)?load_GSUB_feature(hdc, psa, psc, "locl"):NULL; + LoadedFeature *nukt = load_GSUB_feature(hdc, psa, psc, "nukt"); + LoadedFeature *akhn = load_GSUB_feature(hdc, psa, psc, "akhn"); + LoadedFeature *rkrf = (modern)?load_GSUB_feature(hdc, psa, psc, "rkrf"):NULL; + LoadedFeature *pstf = load_GSUB_feature(hdc, psa, psc, "pstf"); + LoadedFeature *vatu = (!rkrf)?load_GSUB_feature(hdc, psa, psc, "vatu"):NULL; + LoadedFeature *cjct = (modern)?load_GSUB_feature(hdc, psa, psc, "cjct"):NULL; BOOL rphf = (load_GSUB_feature(hdc, psa, psc, "rphf") != NULL); BOOL pref = (load_GSUB_feature(hdc, psa, psc, "pref") != NULL); BOOL blwf = (load_GSUB_feature(hdc, psa, psc, "blwf") != NULL); @@ -2625,7 +1920,6 @@ static int gurmukhi_lex(WCHAR c) static const ConsonantComponents Gurmukhi_consonants[] = { {{0x0A32,0x0A3C,0x0000}, 0x0A33}, - {{0x0A38,0x0A3C,0x0000}, 0x0A36}, {{0x0A16,0x0A3C,0x0000}, 0x0A59}, {{0x0A17,0x0A3C,0x0000}, 0x0A5A}, {{0x0A1C,0x0A3C,0x0000}, 0x0A5B}, @@ -2958,6 +2252,107 @@ static void ContextualShape_Malayalam(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS HeapFree(GetProcessHeap(),0,syllables); } +static int khmer_lex(WCHAR c) +{ + return unicode_lex(c); +} + +static void ContextualShape_Khmer(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust) +{ + int cCount = cChars; + WCHAR *input; + IndicSyllable *syllables = NULL; + int syllable_count = 0; + + if (*pcGlyphs != cChars) + { + ERR("Number of Glyphs and Chars need to match at the beginning\n"); + return; + } + + input = HeapAlloc(GetProcessHeap(), 0, cChars * sizeof(WCHAR)); + memcpy(input, pwcChars, cChars * sizeof(WCHAR)); + + /* Step 1: Reorder within Syllables */ + Indic_ReorderCharacters( hdc, psa, psc, input, cCount, &syllables, &syllable_count, khmer_lex, Reorder_Like_Devanagari, FALSE); + TRACE("reordered string %s\n",debugstr_wn(input,cCount)); + GetGlyphIndicesW(hdc, input, cCount, pwOutGlyphs, 0); + *pcGlyphs = cCount; + + /* Step 2: Base Form application to syllables */ + ShapeIndicSyllables(hdc, psc, psa, input, cChars, syllables, syllable_count, pwOutGlyphs, pcGlyphs, pwLogClust, khmer_lex, NULL, FALSE); + + HeapFree(GetProcessHeap(),0,input); + HeapFree(GetProcessHeap(),0,syllables); +} + +static inline BOOL mongolian_wordbreak(WCHAR chr) +{ + return ((chr == 0x0020) || (chr == 0x200C) || (chr == 0x202F) || (chr == 0x180E) || (chr == 0x1800) || (chr == 0x1802) || (chr == 0x1803) || (chr == 0x1805) || (chr == 0x1808) || (chr == 0x1809) || (chr == 0x1807)); +} + +static void ContextualShape_Mongolian(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR* pwcChars, INT cChars, WORD* pwOutGlyphs, INT* pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust) +{ + INT *context_shape; + INT dirL; + int i; + + if (*pcGlyphs != cChars) + { + ERR("Number of Glyphs and Chars need to match at the beginning\n"); + return; + } + + if (!psa->fLogicalOrder && psa->fRTL) + dirL = -1; + else + dirL = 1; + + if (!psc->GSUB_Table) + psc->GSUB_Table = load_gsub_table(hdc); + + if (!psc->GSUB_Table) + return; + + context_shape = HeapAlloc(GetProcessHeap(),0,sizeof(INT) * cChars); + + for (i = 0; i < cChars; i++) + { + if (i == 0 || mongolian_wordbreak(pwcChars[i-1])) + { + if ((i == cChars-1) || mongolian_wordbreak(pwcChars[i+1])) + context_shape[i] = Xn; + else + context_shape[i] = Xl; + } + else + { + if ((i == cChars-1) || mongolian_wordbreak(pwcChars[i+1])) + context_shape[i] = Xr; + else + context_shape[i] = Xm; + } + } + + /* Contextual Shaping */ + i = 0; + while(i < *pcGlyphs) + { + INT nextIndex; + INT prevCount = *pcGlyphs; + nextIndex = apply_GSUB_feature_to_glyph(hdc, psa, psc, pwOutGlyphs, i, dirL, pcGlyphs, contextual_features[context_shape[i]]); + if (nextIndex > GSUB_E_NOGLYPH) + { + UpdateClusters(nextIndex, *pcGlyphs - prevCount, dirL, cChars, pwLogClust); + i = nextIndex; + } + else + i++; + } + + HeapFree(GetProcessHeap(),0,context_shape); +} + static void ShapeCharGlyphProp_Default( HDC hdc, ScriptCache* psc, SCRIPT_ANALYSIS* psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD* pwLogClust, SCRIPT_CHARPROP* pCharProp, SCRIPT_GLYPHPROP* pGlyphProp) { int i,k; @@ -2988,7 +2383,7 @@ static void ShapeCharGlyphProp_Default( HDC hdc, ScriptCache* psc, SCRIPT_ANALYS pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_CHARACTER; } - GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); + OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp); } @@ -3099,7 +2494,7 @@ static void ShapeCharGlyphProp_Arabic( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSI pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_NONE; } - GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); + OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp); HeapFree(GetProcessHeap(),0,spaces); } @@ -3135,7 +2530,7 @@ static void ShapeCharGlyphProp_Thai( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS } } - GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); + OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); for (i = 0; i < cGlyphs; i++) { @@ -3209,7 +2604,7 @@ static void ShapeCharGlyphProp_None( HDC hdc, ScriptCache* psc, SCRIPT_ANALYSIS* else pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_NONE; } - GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); + OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp); } @@ -3242,7 +2637,7 @@ static void ShapeCharGlyphProp_Tibet( HDC hdc, ScriptCache* psc, SCRIPT_ANALYSIS else pGlyphProp[i].sva.uJustification = SCRIPT_JUSTIFY_NONE; } - GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); + OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); UpdateClustersFromGlyphProp(cGlyphs, cChars, pwLogClust, pGlyphProp); /* Tibeten script does not set sva.fDiacritic or sva.fZeroWidth */ @@ -3256,11 +2651,11 @@ static void ShapeCharGlyphProp_Tibet( HDC hdc, ScriptCache* psc, SCRIPT_ANALYSIS } } -static void ShapeCharGlyphProp_BaseIndic( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp, lexical_function lexical, BOOL use_syllables) +static void ShapeCharGlyphProp_BaseIndic( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp, lexical_function lexical, BOOL use_syllables, BOOL override_gsub) { int i,k; - GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); + OpenType_GDEF_UpdateGlyphProps(hdc, psc, pwGlyphs, cGlyphs, pwLogClust, cChars, pGlyphProp); for (i = 0; i < cGlyphs; i++) { int char_index[20]; @@ -3275,9 +2670,12 @@ static void ShapeCharGlyphProp_BaseIndic( HDC hdc, ScriptCache *psc, SCRIPT_ANAL } } - /* Indic scripts do not set fDiacritic or fZeroWidth */ - pGlyphProp[i].sva.fDiacritic = FALSE; - pGlyphProp[i].sva.fZeroWidth = FALSE; + if (override_gsub) + { + /* Most indic scripts do not set fDiacritic or fZeroWidth */ + pGlyphProp[i].sva.fDiacritic = FALSE; + pGlyphProp[i].sva.fZeroWidth = FALSE; + } if (char_count == 0) continue; @@ -3303,7 +2701,11 @@ static void ShapeCharGlyphProp_BaseIndic( HDC hdc, ScriptCache *psc, SCRIPT_ANAL break; case lex_ZWJ: case lex_ZWNJ: - k = char_count; + /* check for dangling joiners */ + if (pwcChars[char_index[k]-1] == 0x0020 || pwcChars[char_index[k]+1] == 0x0020) + pGlyphProp[i].sva.fClusterStart = 1; + else + k = char_count; break; default: pGlyphProp[i].sva.fClusterStart = 1; @@ -3341,52 +2743,57 @@ static void ShapeCharGlyphProp_BaseIndic( HDC hdc, ScriptCache *psc, SCRIPT_ANAL static void ShapeCharGlyphProp_Sinhala( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) { - ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, sinhala_lex, FALSE); + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, sinhala_lex, FALSE, FALSE); } static void ShapeCharGlyphProp_Devanagari( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) { - ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, devanagari_lex, TRUE); + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, devanagari_lex, TRUE, TRUE); } static void ShapeCharGlyphProp_Bengali( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) { - ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, bengali_lex, TRUE); + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, bengali_lex, TRUE, TRUE); } static void ShapeCharGlyphProp_Gurmukhi( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) { - ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, gurmukhi_lex, TRUE); + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, gurmukhi_lex, TRUE, TRUE); } static void ShapeCharGlyphProp_Gujarati( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) { - ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, gujarati_lex, TRUE); + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, gujarati_lex, TRUE, TRUE); } static void ShapeCharGlyphProp_Oriya( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) { - ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, oriya_lex, TRUE); + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, oriya_lex, TRUE, TRUE); } static void ShapeCharGlyphProp_Tamil( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) { - ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, tamil_lex, TRUE); + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, tamil_lex, TRUE, TRUE); } static void ShapeCharGlyphProp_Telugu( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) { - ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, telugu_lex, TRUE); + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, telugu_lex, TRUE, TRUE); } static void ShapeCharGlyphProp_Kannada( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) { - ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, kannada_lex, TRUE); + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, kannada_lex, TRUE, TRUE); } static void ShapeCharGlyphProp_Malayalam( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) { - ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, malayalam_lex, TRUE); + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, malayalam_lex, TRUE, TRUE); +} + +static void ShapeCharGlyphProp_Khmer( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp ) +{ + ShapeCharGlyphProp_BaseIndic(hdc, psc, psa, pwcChars, cChars, pwGlyphs, cGlyphs, pwLogClust, pCharProp, pGlyphProp, khmer_lex, TRUE, TRUE); } void SHAPE_CharGlyphProp(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp) @@ -3442,7 +2849,7 @@ rpRangeProperties = &ShapingData[psa->eScript].defaultTextRange; HRESULT SHAPE_CheckFontForRequiredFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa) { - const GSUB_Feature *feature; + LoadedFeature *feature; int i; if (!ShapingData[psa->eScript].requiredFeatures) @@ -3463,3 +2870,75 @@ HRESULT SHAPE_CheckFontForRequiredFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANA return USP_E_SCRIPT_NOT_IN_FONT; } + +HRESULT SHAPE_GetFontScriptTags( HDC hdc, ScriptCache *psc, + SCRIPT_ANALYSIS *psa, int cMaxTags, + OPENTYPE_TAG *pScriptTags, int *pcTags) +{ + HRESULT hr; + OPENTYPE_TAG searching = 0x00000000; + + if (!psc->GSUB_Table) + psc->GSUB_Table = load_gsub_table(hdc); + + if (psa && scriptInformation[psa->eScript].scriptTag) + searching = scriptInformation[psa->eScript].scriptTag; + + hr = OpenType_GSUB_GetFontScriptTags(psc, searching, cMaxTags, pScriptTags, pcTags, NULL); + if (FAILED(hr)) + *pcTags = 0; + return hr; +} + +HRESULT SHAPE_GetFontLanguageTags( HDC hdc, ScriptCache *psc, + SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, + int cMaxTags, OPENTYPE_TAG *pLangSysTags, + int *pcTags) +{ + HRESULT hr; + OPENTYPE_TAG searching = 0x00000000; + BOOL fellback = FALSE; + + if (!psc->GSUB_Table) + psc->GSUB_Table = load_gsub_table(hdc); + + if (psa && psc->userLang != 0) + searching = psc->userLang; + + hr = OpenType_GSUB_GetFontLanguageTags(psc, tagScript, searching, cMaxTags, pLangSysTags, pcTags, NULL); + if (FAILED(hr)) + { + fellback = TRUE; + hr = OpenType_GSUB_GetFontLanguageTags(psc, MS_MAKE_TAG('l','a','t','n'), searching, cMaxTags, pLangSysTags, pcTags, NULL); + } + + if (FAILED(hr) || fellback) + *pcTags = 0; + if (SUCCEEDED(hr) && fellback && psa) + hr = E_INVALIDARG; + return hr; +} + +HRESULT SHAPE_GetFontFeatureTags( HDC hdc, ScriptCache *psc, + SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, + OPENTYPE_TAG tagLangSys, int cMaxTags, + OPENTYPE_TAG *pFeatureTags, int *pcTags) +{ + HRESULT hr; + BOOL filter = FALSE; + + if (!psc->GSUB_Table) + psc->GSUB_Table = load_gsub_table(hdc); + + if (psa && scriptInformation[psa->eScript].scriptTag) + { + FIXME("Filtering not implemented\n"); + filter = TRUE; + } + + hr = OpenType_GSUB_GetFontFeatureTags(psc, tagScript, tagLangSys, filter, 0x00000000, cMaxTags, pFeatureTags, pcTags, NULL); + + if (FAILED(hr)) + *pcTags = 0; + return hr; +} diff --git a/reactos/dll/win32/usp10/usp10.c b/reactos/dll/win32/usp10/usp10.c index 422c229fa75..a017baf392c 100644 --- a/reactos/dll/win32/usp10/usp10.c +++ b/reactos/dll/win32/usp10/usp10.c @@ -44,8 +44,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(uniscribe); typedef struct _scriptRange { WORD script; - WORD rangeFirst; - WORD rangeLast; + DWORD rangeFirst; + DWORD rangeLast; WORD numericScript; WORD punctScript; } scriptRange; @@ -57,7 +57,8 @@ static const scriptRange scriptRanges[] = { /* Latin Extended-A: U+0100–U+017F */ /* Latin Extended-B: U+0180–U+024F */ /* IPA Extensions: U+0250–U+02AF */ - { Script_Latin, 0x80, 0x2af , Script_Numeric2, Script_Punctuation}, + /* Spacing Modifier Letters:U+02B0–U+02FF */ + { Script_Latin, 0x80, 0x2ff , Script_Numeric2, Script_Punctuation}, /* Combining Diacritical Marks : U+0300–U+036F */ { Script_Diacritical,0x300, 0x36f, 0, 0}, /* Greek: U+0370–U+03FF */ @@ -81,6 +82,8 @@ static const scriptRange scriptRanges[] = { { Script_Arabic, 0x750, 0x77f, 0, 0}, /* Thaana: U+0780–U+07BF */ { Script_Thaana, 0x780, 0x7bf, 0, 0}, + /* N’Ko: U+07C0–U+07FF */ + { Script_NKo, 0x7c0, 0x7ff, 0, 0}, /* Devanagari: U+0900–U+097F */ { Script_Devanagari, 0x900, 0x97f, Script_Devanagari_Numeric, 0}, /* Bengali: U+0980–U+09FF */ @@ -107,8 +110,35 @@ static const scriptRange scriptRanges[] = { { Script_Lao, 0xe80, 0xeff, Script_Lao_Numeric, 0}, /* Tibetan: U+0F00–U+0FFF */ { Script_Tibetan, 0xf00, 0xfff, 0, 0}, + /* Myanmar: U+1000–U+109F */ + { Script_Myanmar, 0x1000, 0x109f, Script_Myanmar_Numeric, 0}, /* Georgian: U+10A0–U+10FF */ { Script_Georgian, 0x10a0, 0x10ff, 0, 0}, + /* Hangul Jamo: U+1100–U+11FF */ + { Script_Hangul, 0x1100, 0x11ff, 0, 0}, + /* Ethiopic: U+1200–U+137F */ + /* Ethiopic Extensions: U+1380–U+139F */ + { Script_Ethiopic, 0x1200, 0x139f, 0, 0}, + /* Cherokee: U+13A0–U+13FF */ + { Script_Cherokee, 0x13a0, 0x13ff, 0, 0}, + /* Canadian Aboriginal Syllabics: U+1400–U+167F */ + { Script_Canadian, 0x1400, 0x167f, 0, 0}, + /* Ogham: U+1680–U+169F */ + { Script_Ogham, 0x1680, 0x169f, 0, 0}, + /* Runic: U+16A0–U+16F0 */ + { Script_Runic, 0x16a0, 0x16f0, 0, 0}, + /* Khmer: U+1780–U+17FF */ + { Script_Khmer, 0x1780, 0x17ff, Script_Khmer_Numeric, 0}, + /* Mongolian: U+1800–U+18AF */ + { Script_Mongolian, 0x1800, 0x18af, Script_Mongolian_Numeric, 0}, + /* Canadian Aboriginal Syllabics Extended: U+18B0–U+18FF */ + { Script_Canadian, 0x18b0, 0x18ff, 0, 0}, + /* Tai Le: U+1950–U+197F */ + { Script_Tai_Le, 0x1950, 0x197f, 0, 0}, + /* New Tai Lue: U+1980–U+19DF */ + { Script_New_Tai_Lue,0x1980, 0x19df, Script_New_Tai_Lue_Numeric, 0}, + /* Khmer Symbols: U+19E0–U+19FF */ + { Script_Khmer, 0x19e0, 0x19ff, Script_Khmer_Numeric, 0}, /* Vedic Extensions: U+1CD0-U+1CFF */ { Script_Devanagari, 0x1cd0, 0x1cff, Script_Devanagari_Numeric, 0}, /* Phonetic Extensions: U+1D00–U+1DBF */ @@ -145,6 +175,8 @@ static const scriptRange scriptRanges[] = { /* Miscellaneous Mathematical Symbols-A : U+27c0 –U+27ef */ /* Supplemental Arrows-A : U+27f0 –U+27ff */ { Script_Latin, 0x2100, 0x27ff, 0, 0}, + /* Braille Patterns: U+2800–U+28FF */ + { Script_Braille, 0x2800, 0x28ff, 0, 0}, /* Supplemental Arrows-B : U+2900 –U+297f */ /* Miscellaneous Mathematical Symbols-B : U+2980 –U+29ff */ /* Supplemental Mathematical Operators : U+2a00 –U+2aff */ @@ -154,8 +186,62 @@ static const scriptRange scriptRanges[] = { { Script_Latin, 0x2c60, 0x2c7f, 0, 0}, /* Georgian: U+2D00–U+2D2F */ { Script_Georgian, 0x2d00, 0x2d2f, 0, 0}, + /* Tifinagh: U+2D30–U+2D7F */ + { Script_Tifinagh, 0x2d30, 0x2d7f, 0, 0}, + /* Ethiopic Extensions: U+2D80–U+2DDF */ + { Script_Ethiopic, 0x2d80, 0x2ddf, 0, 0}, /* Cyrillic Extended-A: U+2DE0–U+2DFF */ { Script_Cyrillic, 0x2de0, 0x2dff, 0, 0}, + /* CJK Radicals Supplement: U+2E80–U+2EFF */ + /* Kangxi Radicals: U+2F00–U+2FDF */ + { Script_CJK_Han, 0x2e80, 0x2fdf, 0, 0}, + /* Ideographic Description Characters: U+2FF0–U+2FFF */ + { Script_Ideograph ,0x2ff0, 0x2fff, 0, 0}, + /* CJK Symbols and Punctuation: U+3000–U+303F */ + { Script_Ideograph ,0x3000, 0x3004, 0, 0}, + { Script_CJK_Han ,0x3005, 0x3005, 0, 0}, + { Script_Ideograph ,0x3006, 0x3006, 0, 0}, + { Script_CJK_Han ,0x3007, 0x3007, 0, 0}, + { Script_Ideograph ,0x3008, 0x3020, 0, 0}, + { Script_CJK_Han ,0x3021, 0x3029, 0, 0}, + { Script_Ideograph ,0x302a, 0x3030, 0, 0}, + /* Kana Marks: */ + { Script_Kana ,0x3031, 0x3035, 0, 0}, + { Script_Ideograph ,0x3036, 0x3037, 0, 0}, + { Script_CJK_Han ,0x3038, 0x303b, 0, 0}, + { Script_Ideograph ,0x303c, 0x303f, 0, 0}, + /* Hiragana: U+3040–U+309F */ + /* Katakana: U+30A0–U+30FF */ + { Script_Kana ,0x3040, 0x30ff, 0, 0}, + /* Bopomofo: U+3100–U+312F */ + { Script_Bopomofo ,0x3100, 0x312f, 0, 0}, + /* Hangul Compatibility Jamo: U+3130–U+318F */ + { Script_Hangul ,0x3130, 0x318f, 0, 0}, + /* Kanbun: U+3190–U+319F */ + { Script_Ideograph ,0x3190, 0x319f, 0, 0}, + /* Bopomofo Extended: U+31A0–U+31BF */ + { Script_Bopomofo ,0x31a0, 0x31bf, 0, 0}, + /* CJK Strokes: U+31C0–U+31EF */ + { Script_Ideograph ,0x31c0, 0x31ef, 0, 0}, + /* Katakana Phonetic Extensions: U+31F0–U+31FF */ + { Script_Kana ,0x31f0, 0x31ff, 0, 0}, + /* Enclosed CJK Letters and Months: U+3200–U+32FF */ + { Script_Hangul ,0x3200, 0x321f, 0, 0}, + { Script_Ideograph ,0x3220, 0x325f, 0, 0}, + { Script_Hangul ,0x3260, 0x327f, 0, 0}, + { Script_Ideograph ,0x3280, 0x32ef, 0, 0}, + { Script_Kana ,0x32d0, 0x31ff, 0, 0}, + /* CJK Compatibility: U+3300–U+33FF*/ + { Script_Kana ,0x3300, 0x3357, 0, 0}, + { Script_Ideograph ,0x3358, 0x33ff, 0, 0}, + /* CJK Unified Ideographs Extension A: U+3400–U+4DBF */ + { Script_CJK_Han ,0x3400, 0x4dbf, 0, 0}, + /* CJK Unified Ideographs: U+4E00–U+9FFF */ + { Script_CJK_Han ,0x4e00, 0x9fff, 0, 0}, + /* Yi: U+A000–U+A4CF */ + { Script_Yi ,0xa000, 0xa4cf, 0, 0}, + /* Vai: U+A500–U+A63F */ + { Script_Vai ,0xa500, 0xa63f, Script_Vai_Numeric, 0}, /* Cyrillic Extended-B: U+A640–U+A69F */ { Script_Cyrillic, 0xa640, 0xa69f, 0, 0}, /* Modifier Tone Letters: U+A700–U+A71F */ @@ -165,6 +251,22 @@ static const scriptRange scriptRanges[] = { { Script_Phags_pa, 0xa840, 0xa87f, 0, 0}, /* Devanagari Extended: U+A8E0-U+A8FF */ { Script_Devanagari, 0xa8e0, 0xa8ff, Script_Devanagari_Numeric, 0}, + /* Myanmar Extended-A: U+AA60–U+AA7F */ + { Script_Myanmar, 0xaa60, 0xaa7f, Script_Myanmar_Numeric, 0}, + /* Hangul Jamo Extended-A: U+A960–U+A97F */ + { Script_Hangul, 0xa960, 0xa97f, 0, 0}, + /* Hangul Syllables: U+AC00–U+D7A3 */ + { Script_Hangul, 0xac00, 0xd7a3, 0, 0}, + /* Hangul Jamo Extended-B: U+D7B0–U+D7FF */ + { Script_Hangul, 0xd7b0, 0xd7ff, 0, 0}, + /* Surrogates Area: U+D800–U+DFFF */ + { Script_Surrogates, 0xd800, 0xdbfe, 0, 0}, + { Script_Private, 0xdbff, 0xdc00, 0, 0}, + { Script_Surrogates, 0xdc01, 0xdfff, 0, 0}, + /* Private Use Area: U+E000–U+F8FF */ + { Script_Private, 0xe000, 0xf8ff, 0, 0}, + /* CJK Compatibility Ideographs: U+F900–U+FAFF */ + { Script_CJK_Han ,0xf900, 0xfaff, 0, 0}, /* Latin Ligatures: U+FB00–U+FB06 */ { Script_Latin, 0xfb00, 0xfb06, 0, 0}, /* Armenian ligatures U+FB13..U+FB17 */ @@ -173,22 +275,31 @@ static const scriptRange scriptRanges[] = { { Script_Hebrew, 0xfb1d, 0xfb4f, 0, 0}, /* Arabic Presentation Forms-A: U+FB50–U+FDFF*/ { Script_Arabic, 0xfb50, 0xfdff, 0, 0}, + /* Vertical Forms: U+FE10–U+FE1F */ + /* Combining Half Marks: U+FE20–U+FE2F */ + /* CJK Compatibility Forms: U+FE30–U+FE4F */ + /* Small Form Variants: U+FE50–U+FE6F */ + { Script_Ideograph ,0xfe10, 0xfe6f, 0, 0}, /* Arabic Presentation Forms-B: U+FE70–U+FEFF*/ { Script_Arabic, 0xfe70, 0xfeff, 0, 0}, + /* Halfwidth and Fullwidth Forms: U+FF00–FFEF */ + { Script_Ideograph ,0xff00, 0xff64, Script_Numeric2, 0}, + { Script_Kana ,0xff65, 0xff9f, 0, 0}, + { Script_Hangul ,0xffa0, 0xffdf, 0, 0}, + { Script_Ideograph ,0xffe0, 0xffef, 0, 0}, + /* Plane - 1 */ + /* Deseret: U+10400–U+1044F */ + { Script_Deseret, 0x10400, 0x1044F, 0, 0}, + /* Osmanya: U+10480–U+104AF */ + { Script_Osmanya, 0x10480, 0x104AF, Script_Osmanya_Numeric, 0}, + /* Mathematical Alphanumeric Symbols: U+1D400–U+1D7FF */ + { Script_MathAlpha, 0x1D400, 0x1D7FF, 0, 0}, /* END */ { SCRIPT_UNDEFINED, 0, 0, 0} }; -typedef struct _scriptData -{ - SCRIPT_ANALYSIS a; - SCRIPT_PROPERTIES props; - OPENTYPE_TAG scriptTag; - WCHAR fallbackFont[LF_FACESIZE]; -} scriptData; - /* the must be in order so that the index matches the Script value */ -static const scriptData scriptInformation[] = { +const scriptData scriptInformation[] = { {{SCRIPT_UNDEFINED, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_NEUTRAL, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0x00000000, @@ -196,7 +307,7 @@ static const scriptData scriptInformation[] = { {{Script_Latin, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_ENGLISH, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, MS_MAKE_TAG('l','a','t','n'), - {0}}, + {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0}}, {{Script_CR, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_NEUTRAL, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0x00000000, @@ -204,7 +315,7 @@ static const scriptData scriptInformation[] = { {{Script_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_ENGLISH, 1, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0x00000000, - {0}}, + {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0}}, {{Script_Control, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_ENGLISH, 0, 1, 0, 0, ANSI_CHARSET, 1, 0, 0, 0, 0, 0, 1, 0, 0}, 0x00000000, @@ -212,7 +323,7 @@ static const scriptData scriptInformation[] = { {{Script_Punctuation, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_NEUTRAL, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0x00000000, - {0}}, + {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0}}, {{Script_Arabic, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}}, {LANG_ARABIC, 0, 1, 0, 0, ARABIC_CHARSET, 0, 0, 0, 0, 0, 0, 1, 1, 0}, MS_MAKE_TAG('a','r','a','b'), @@ -240,11 +351,11 @@ static const scriptData scriptInformation[] = { {{Script_Greek, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_GREEK, 0, 0, 0, 0, GREEK_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('g','r','e','k'), - {0}}, + {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0}}, {{Script_Cyrillic, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_RUSSIAN, 0, 0, 0, 0, RUSSIAN_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('c','y','r','l'), - {0}}, + {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0}}, {{Script_Armenian, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_ARMENIAN, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, MS_MAKE_TAG('a','r','m','n'), @@ -372,11 +483,151 @@ static const scriptData scriptInformation[] = { {{Script_Punctuation2, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_ENGLISH, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, MS_MAKE_TAG('l','a','t','n'), - {0}}, + {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0}}, {{Script_Numeric2, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, {LANG_ENGLISH, 1, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, 0x00000000, {0}}, + {{Script_Myanmar, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0x55, 0, 1, 1, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0}, + MS_MAKE_TAG('m','y','m','r'), + {0}}, + {{Script_Myanmar_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0x55, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('m','y','m','r'), + {0}}, + {{Script_Tai_Le, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('t','a','l','e'), + {'M','i','c','r','o','s','o','f','t',' ','T','a','i',' ','L','e'}}, + {{Script_New_Tai_Lue, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('t','a','l','u'), + {'M','i','c','r','o','s','o','f','t',' ','N','e','w',' ','T','a','i',' ','L','u','e'}}, + {{Script_New_Tai_Lue_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('t','a','l','u'), + {'M','i','c','r','o','s','o','f','t',' ','N','e','w',' ','T','a','i',' ','L','u','e'}}, + {{Script_Khmer, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0x53, 0, 1, 1, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0}, + MS_MAKE_TAG('k','h','m','r'), + {'D','a','u','n','P','e','n','h'}}, + {{Script_Khmer, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0x53, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('k','h','m','r'), + {'D','a','u','n','P','e','n','h'}}, + {{Script_CJK_Han, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ENGLISH, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + MS_MAKE_TAG('h','a','n','i'), + {0}}, + {{Script_Ideograph, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ENGLISH, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + MS_MAKE_TAG('h','a','n','i'), + {0}}, + {{Script_Bopomofo, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ENGLISH, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + MS_MAKE_TAG('b','o','p','o'), + {0}}, + {{Script_Kana, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ENGLISH, 0, 0, 0, 0, ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + MS_MAKE_TAG('k','a','n','a'), + {0}}, + {{Script_Hangul, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_KOREAN, 0, 1, 0, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + MS_MAKE_TAG('h','a','n','g'), + {0}}, + {{Script_Yi, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ENGLISH, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + MS_MAKE_TAG('y','i',' ',' '), + {'M','i','c','r','o','s','o','f','t',' ','Y','i',' ','B','a','i','t','i'}}, + {{Script_Ethiopic, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0x5e, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('e','t','h','i'), + {'N','y','a','l','a'}}, + {{Script_Ethiopic_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0x5e, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('e','t','h','i'), + {'N','y','a','l','a'}}, + {{Script_Mongolian, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_MONGOLIAN, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('m','o','n','g'), + {'M','o','n','g','o','l','i','a','n',' ','B','a','i','t','i'}}, + {{Script_Mongolian_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_MONGOLIAN, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('m','o','n','g'), + {'M','o','n','g','o','l','i','a','n',' ','B','a','i','t','i'}}, + {{Script_Tifinagh, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('t','f','n','g'), + {'E','b','r','i','m','a'}}, + {{Script_NKo, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('n','k','o',' '), + {'E','b','r','i','m','a'}}, + {{Script_Vai, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('v','a','i',' '), + {'E','b','r','i','m','a'}}, + {{Script_Vai_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('v','a','i',' '), + {'E','b','r','i','m','a'}}, + {{Script_Cherokee, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0x5c, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('c','h','e','r'), + {'P','l','a','n','t','a','g','e','n','e','t',' ','C','h','e','r','o','k','e','e'}}, + {{Script_Canadian, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0x5d, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('c','a','n','s'), + {'E','u','p','h','e','m','i','a'}}, + {{Script_Ogham, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('o','g','a','m'), + {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l'}}, + {{Script_Runic, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('r','u','n','r'), + {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l'}}, + {{Script_Braille, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ENGLISH, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('b','r','a','i'), + {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l'}}, + {{Script_Surrogates, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_ENGLISH, 0, 1, 0, 1, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0}, + 0x00000000, + {0}}, + {{Script_Private, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 0, 0, 0, DEFAULT_CHARSET, 0, 1, 0, 0, 0, 0, 1, 0, 0}, + 0x00000000, + {0}}, + {{Script_Deseret, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('d','s','r','t'), + {'S','e','g','o','e',' ','U','I',' ','S','y','m','b','o','l'}}, + {{Script_Osmanya, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('o','s','m','a'), + {'E','b','r','i','m','a'}}, + {{Script_Osmanya_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 1, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('o','s','m','a'), + {'E','b','r','i','m','a'}}, + {{Script_MathAlpha, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {0, 0, 1, 0, 0, DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('m','a','t','h'), + {'C','a','m','b','r','i','a',' ','M','a','t','h'}}, + {{Script_Hebrew_Currency, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_HEBREW, 0, 1, 0, 0, HEBREW_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('h','e','b','r'), + {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0}}, + {{Script_Vietnamese_Currency, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_VIETNAMESE, 0, 0, 0, 0, VIETNAMESE_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('l','a','t','n'), + {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0}}, + {{Script_Thai_Currency, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}}, + {LANG_THAI, 0, 1, 0, 0, THAI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + MS_MAKE_TAG('t','h','a','i'), + {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f',0}}, }; static const SCRIPT_PROPERTIES *script_props[] = @@ -403,7 +654,25 @@ static const SCRIPT_PROPERTIES *script_props[] = &scriptInformation[38].props, &scriptInformation[39].props, &scriptInformation[40].props, &scriptInformation[41].props, &scriptInformation[42].props, &scriptInformation[43].props, - &scriptInformation[44].props, &scriptInformation[45].props + &scriptInformation[44].props, &scriptInformation[45].props, + &scriptInformation[46].props, &scriptInformation[47].props, + &scriptInformation[48].props, &scriptInformation[49].props, + &scriptInformation[50].props, &scriptInformation[51].props, + &scriptInformation[52].props, &scriptInformation[53].props, + &scriptInformation[54].props, &scriptInformation[55].props, + &scriptInformation[56].props, &scriptInformation[57].props, + &scriptInformation[58].props, &scriptInformation[59].props, + &scriptInformation[60].props, &scriptInformation[61].props, + &scriptInformation[62].props, &scriptInformation[63].props, + &scriptInformation[64].props, &scriptInformation[65].props, + &scriptInformation[66].props, &scriptInformation[67].props, + &scriptInformation[68].props, &scriptInformation[69].props, + &scriptInformation[70].props, &scriptInformation[71].props, + &scriptInformation[72].props, &scriptInformation[73].props, + &scriptInformation[74].props, &scriptInformation[75].props, + &scriptInformation[76].props, &scriptInformation[77].props, + &scriptInformation[78].props, &scriptInformation[79].props, + &scriptInformation[80].props, &scriptInformation[81].props }; typedef struct { @@ -469,7 +738,7 @@ static inline BYTE get_cache_pitch_family(SCRIPT_CACHE *psc) return ((ScriptCache *)*psc)->tm.tmPitchAndFamily; } -static inline WORD get_cache_glyph(SCRIPT_CACHE *psc, WCHAR c) +static inline WORD get_cache_glyph(SCRIPT_CACHE *psc, DWORD c) { WORD *block = ((ScriptCache *)*psc)->glyphs[c >> GLYPH_BLOCK_SHIFT]; @@ -535,24 +804,50 @@ static WCHAR mirror_char( WCHAR ch ) return ch + wine_mirror_map[wine_mirror_map[ch >> 8] + (ch & 0xff)]; } -static WORD get_char_script( WCHAR ch) +static inline DWORD decode_surrogate_pair(LPCWSTR str, INT index, INT end) +{ + if (index < end-1 && IS_SURROGATE_PAIR(str[index],str[index+1])) + { + DWORD ch = 0x10000 + ((str[index] - 0xd800) << 10) + (str[index+1] - 0xdc00); + TRACE("Surrogate Pair %x %x => %x\n",str[index], str[index+1], ch); + return ch; + } + return 0; +} + +static WORD get_char_script( LPCWSTR str, INT index, INT end, INT *consumed) { static const WCHAR latin_punc[] = {'#','$','&','\'',',',';','<','>','?','@','\\','^','_','`','{','|','}','~', 0x00a0, 0}; WORD type = 0; + DWORD ch; int i; - if (ch == 0xc || ch == 0x20 || ch == 0x202f) + *consumed = 1; + + if (str[index] == 0xc || str[index] == 0x20 || str[index] == 0x202f) return Script_CR; /* These punctuation are separated out as Latin punctuation */ - if (strchrW(latin_punc,ch)) + if (strchrW(latin_punc,str[index])) return Script_Punctuation2; /* These chars are itemized as Punctuation by Windows */ - if (ch == 0x2212 || ch == 0x2044) + if (str[index] == 0x2212 || str[index] == 0x2044) return Script_Punctuation; - GetStringTypeW(CT_CTYPE1, &ch, 1, &type); + /* Currency Symboles by Unicode point */ + switch (str[index]) + { + case 0x09f2: + case 0x09f3: return Script_Bengali_Currency; + case 0x0af1: return Script_Gujarati_Currency; + case 0x0e3f: return Script_Thai_Currency; + case 0x20aa: return Script_Hebrew_Currency; + case 0x20ab: return Script_Vietnamese_Currency; + case 0xfb29: return Script_Hebrew_Currency; + } + + GetStringTypeW(CT_CTYPE1, &str[index], 1, &type); if (type == 0) return SCRIPT_UNDEFINED; @@ -560,6 +855,12 @@ static WORD get_char_script( WCHAR ch) if (type & C1_CNTRL) return Script_Control; + ch = decode_surrogate_pair(str, index, end); + if (ch) + *consumed = 2; + else + ch = str[index]; + i = 0; do { @@ -623,7 +924,20 @@ HRESULT WINAPI ScriptFreeCache(SCRIPT_CACHE *psc) } heap_free(((ScriptCache *)*psc)->GSUB_Table); heap_free(((ScriptCache *)*psc)->GDEF_Table); - heap_free(((ScriptCache *)*psc)->features); + heap_free(((ScriptCache *)*psc)->CMAP_Table); + for (i = 0; i < ((ScriptCache *)*psc)->script_count; i++) + { + int j; + for (j = 0; j < ((ScriptCache *)*psc)->scripts[i].language_count; j++) + { + int k; + for (k = 0; k < ((ScriptCache *)*psc)->scripts[i].languages[j].feature_count; k++) + heap_free(((ScriptCache *)*psc)->scripts[i].languages[j].features[k].lookups); + heap_free(((ScriptCache *)*psc)->scripts[i].languages[j].features); + } + heap_free(((ScriptCache *)*psc)->scripts[i].languages); + } + heap_free(((ScriptCache *)*psc)->scripts); heap_free(*psc); *psc = NULL; } @@ -874,6 +1188,7 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int WORD last_indic = -1; WORD layoutRTL = 0; BOOL forceLevels = FALSE; + INT consumed = 0; TRACE("%s,%d,%d,%p,%p,%p,%p\n", debugstr_wn(pwcInChars, cInChars), cInChars, cMaxItems, psControl, psState, pItems, pcItems); @@ -887,7 +1202,16 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int for (i = 0; i < cInChars; i++) { - scripts[i] = get_char_script(pwcInChars[i]); + if (consumed <= 0) + { + scripts[i] = get_char_script(pwcInChars,i,cInChars,&consumed); + consumed --; + } + else + { + scripts[i] = scripts[i-1]; + consumed --; + } /* Devanagari danda (U+0964) and double danda (U+0965) are used for all Indic scripts */ if ((pwcInChars[i] == 0x964 || pwcInChars[i] ==0x965) && last_indic > 0) @@ -1480,12 +1804,16 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString, LOGFONTW lf; GetObjectW(GetCurrentObject(hdc, OBJ_FONT), sizeof(lf), & lf); lf.lfCharSet = scriptInformation[analysis->pItem[i].a.eScript].props.bCharSet; + lf.lfFaceName[0] = 0; find_fallback_font(analysis->pItem[i].a.eScript, lf.lfFaceName); - analysis->glyphs[i].fallbackFont = CreateFontIndirectW(&lf); - if (analysis->glyphs[i].fallbackFont) + if (lf.lfFaceName[0]) { - ScriptFreeCache(sc); - originalFont = SelectObject(hdc, analysis->glyphs[i].fallbackFont); + analysis->glyphs[i].fallbackFont = CreateFontIndirectW(&lf); + if (analysis->glyphs[i].fallbackFont) + { + ScriptFreeCache(sc); + originalFont = SelectObject(hdc, analysis->glyphs[i].fallbackFont); + } } } @@ -1578,6 +1906,8 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa, INT runStart, runEnd; INT iGlyph, cGlyphs; HFONT oldFont = 0x0; + RECT crc; + int i; TRACE("(%p,%d,%d,%d,%d,%d, 0x%1x, %d, %d)\n", ssa, iX, iY, iItem, cStart, cEnd, uOptions, fSelected, fDisabled); @@ -1588,6 +1918,7 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa, (cEnd >= 0 && analysis->pItem[iItem].iCharPos >= cEnd)) return S_OK; + CopyRect(&crc,prc); if (fSelected) { BkMode = GetBkMode(analysis->hdc); @@ -1618,6 +1949,7 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa, ScriptStringCPtoX(ssa, cEnd, FALSE, &off_x); else ScriptStringCPtoX(ssa, analysis->pItem[iItem+1].iCharPos-1, TRUE, &off_x); + crc.left = iX + off_x; } else { @@ -1625,6 +1957,7 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa, ScriptStringCPtoX(ssa, cStart, FALSE, &off_x); else ScriptStringCPtoX(ssa, analysis->pItem[iItem].iCharPos, FALSE, &off_x); + crc.left = iX + off_x; } if (analysis->pItem[iItem].a.fRTL) @@ -1639,6 +1972,24 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa, cGlyphs++; + /* adjust for cluster glyphs when starting */ + if (analysis->pItem[iItem].a.fRTL) + i = analysis->pItem[iItem+1].iCharPos - 1; + else + i = analysis->pItem[iItem].iCharPos; + + for (; i >=analysis->pItem[iItem].iCharPos && i < analysis->pItem[iItem+1].iCharPos; (analysis->pItem[iItem].a.fRTL)?i--:i++) + { + if (analysis->glyphs[iItem].pwLogClust[i - analysis->pItem[iItem].iCharPos] == iGlyph) + { + if (analysis->pItem[iItem].a.fRTL) + ScriptStringCPtoX(ssa, i, TRUE, &off_x); + else + ScriptStringCPtoX(ssa, i, FALSE, &off_x); + break; + } + } + if (cEnd < 0 || scriptInformation[analysis->pItem[iItem].a.eScript].props.fNeedsCaretInfo) { INT direction; @@ -1660,7 +2011,7 @@ static HRESULT SS_ItemOut( SCRIPT_STRING_ANALYSIS ssa, hr = ScriptTextOut(analysis->hdc, (SCRIPT_CACHE *)&analysis->glyphs[iItem].sc, iX + off_x, - iY, uOptions, prc, &analysis->pItem[iItem].a, NULL, 0, + iY, uOptions, &crc, &analysis->pItem[iItem].a, NULL, 0, &analysis->glyphs[iItem].glyphs[iGlyph], cGlyphs, &analysis->glyphs[iItem].piAdvance[iGlyph], NULL, &analysis->glyphs[iItem].pGoffset[iGlyph]); @@ -2299,17 +2650,20 @@ HRESULT WINAPI ScriptBreak(const WCHAR *chars, int count, const SCRIPT_ANALYSIS HRESULT WINAPI ScriptIsComplex(const WCHAR *chars, int len, DWORD flag) { int i; + INT consumed = 0; TRACE("(%s,%d,0x%x)\n", debugstr_wn(chars, len), len, flag); - for (i = 0; i < len; i++) + for (i = 0; i < len; i+=consumed) { int script; + if (i >= len) + break; if ((flag & SIC_ASCIIDIGIT) && chars[i] >= 0x30 && chars[i] <= 0x39) return S_OK; - script = get_char_script(chars[i]); + script = get_char_script(chars,i,len, &consumed); if ((scriptInformation[script].props.fComplex && (flag & SIC_COMPLEX))|| (!scriptInformation[script].props.fComplex && (flag & SIC_NEUTRAL))) return S_OK; @@ -2354,8 +2708,9 @@ HRESULT WINAPI ScriptShapeOpenType( HDC hdc, SCRIPT_CACHE *psc, SCRIPT_GLYPHPROP *pOutGlyphProps, int *pcGlyphs) { HRESULT hr; - unsigned int i; + unsigned int i,g; BOOL rtl; + int cluster; TRACE("(%p, %p, %p, %s, %s, %p, %p, %d, %s, %d, %d, %p, %p, %p, %p, %p )\n", hdc, psc, psa, @@ -2382,7 +2737,7 @@ HRESULT WINAPI ScriptShapeOpenType( HDC hdc, SCRIPT_CACHE *psc, ((ScriptCache *)*psc)->userLang = tagLangSys; /* set fNoGlyphIndex non truetype/opentype fonts */ - if (!psa->fNoGlyphIndex && !((ScriptCache *)*psc)->sfnt) + if (psa && !psa->fNoGlyphIndex && !((ScriptCache *)*psc)->sfnt) psa->fNoGlyphIndex = TRUE; /* Initialize a SCRIPT_VISATTR and LogClust for each char in this run */ @@ -2411,35 +2766,59 @@ HRESULT WINAPI ScriptShapeOpenType( HDC hdc, SCRIPT_CACHE *psc, rChars = heap_alloc(sizeof(WCHAR) * cChars); if (!rChars) return E_OUTOFMEMORY; - for (i = 0; i < cChars; i++) + for (i = 0, g = 0, cluster = 0; i < cChars; i++) { int idx = i; - WCHAR chInput; + DWORD chInput; + if (rtl) idx = cChars - 1 - i; - if (psa->fRTL) - chInput = mirror_char(pwcChars[idx]); - else - chInput = pwcChars[idx]; - /* special case for tabs */ - if (chInput == 0x0009) - chInput = 0x0020; - if (!(pwOutGlyphs[i] = get_cache_glyph(psc, chInput))) + if (!cluster) { - WORD glyph; - if (!hdc) + chInput = decode_surrogate_pair(pwcChars, idx, cChars); + if (!chInput) { - heap_free(rChars); - return E_PENDING; + if (psa->fRTL) + chInput = mirror_char(pwcChars[idx]); + else + chInput = pwcChars[idx]; + /* special case for tabs */ + if (chInput == 0x0009) + chInput = 0x0020; + rChars[i] = chInput; } - if (GetGlyphIndicesW(hdc, &chInput, 1, &glyph, 0) == GDI_ERROR) + else { - heap_free(rChars); - return S_FALSE; + rChars[i] = pwcChars[idx]; + rChars[i+1] = pwcChars[(rtl)?idx-1:idx+1]; + cluster = 1; } - pwOutGlyphs[i] = set_cache_glyph(psc, chInput, glyph); + if (!(pwOutGlyphs[g] = get_cache_glyph(psc, chInput))) + { + WORD glyph; + if (!hdc) + { + heap_free(rChars); + return E_PENDING; + } + if (OpenType_CMAP_GetGlyphIndex(hdc, (ScriptCache *)*psc, chInput, &glyph, 0) == GDI_ERROR) + { + heap_free(rChars); + return S_FALSE; + } + pwOutGlyphs[g] = set_cache_glyph(psc, chInput, glyph); + } + g++; + } + else + { + int k; + cluster--; + pwLogClust[idx] = (rtl)?pwLogClust[idx+1]:pwLogClust[idx-1]; + for (k = (rtl)?idx-1:idx+1; k >= 0 && k < cChars; (rtl)?k--:k++) + pwLogClust[k]--; } - rChars[i] = chInput; } + *pcGlyphs = g; SHAPE_ContextualShaping(hdc, (ScriptCache *)*psc, psa, rChars, cChars, pwOutGlyphs, pcGlyphs, cMaxGlyphs, pwLogClust); SHAPE_ApplyDefaultOpentypeFeatures(hdc, (ScriptCache *)*psc, psa, pwOutGlyphs, pcGlyphs, cMaxGlyphs, cChars, pwLogClust); @@ -3176,6 +3555,33 @@ HRESULT WINAPI ScriptJustify(const SCRIPT_VISATTR *sva, const int *advance, return S_OK; } +HRESULT WINAPI ScriptGetFontScriptTags( HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags) +{ + HRESULT hr; + if (!pScriptTags || !pcTags || cMaxTags == 0) return E_INVALIDARG; + if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr; + + return SHAPE_GetFontScriptTags(hdc, (ScriptCache *)*psc, psa, cMaxTags, pScriptTags, pcTags); +} + +HRESULT WINAPI ScriptGetFontLanguageTags( HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, int cMaxTags, OPENTYPE_TAG *pLangSysTags, int *pcTags) +{ + HRESULT hr; + if (!pLangSysTags || !pcTags || cMaxTags == 0) return E_INVALIDARG; + if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr; + + return SHAPE_GetFontLanguageTags(hdc, (ScriptCache *)*psc, psa, tagScript, cMaxTags, pLangSysTags, pcTags); +} + +HRESULT WINAPI ScriptGetFontFeatureTags( HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, OPENTYPE_TAG tagLangSys, int cMaxTags, OPENTYPE_TAG *pFeatureTags, int *pcTags) +{ + HRESULT hr; + if (!pFeatureTags || !pcTags || cMaxTags == 0) return E_INVALIDARG; + if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr; + + return SHAPE_GetFontFeatureTags(hdc, (ScriptCache *)*psc, psa, tagScript, tagLangSys, cMaxTags, pFeatureTags, pcTags); +} + BOOL gbLpkPresent = FALSE; VOID WINAPI LpkPresent() { diff --git a/reactos/dll/win32/usp10/usp10.rbuild b/reactos/dll/win32/usp10/usp10.rbuild index 9c477d1ecd8..714ed009d96 100644 --- a/reactos/dll/win32/usp10/usp10.rbuild +++ b/reactos/dll/win32/usp10/usp10.rbuild @@ -13,6 +13,7 @@ linebreak.c indicsyllable.c mirror.c + opentype.c shape.c shaping.c wine diff --git a/reactos/dll/win32/usp10/usp10.spec b/reactos/dll/win32/usp10/usp10.spec index 99b3e2bda9f..36a712c683b 100644 --- a/reactos/dll/win32/usp10/usp10.spec +++ b/reactos/dll/win32/usp10/usp10.spec @@ -7,10 +7,10 @@ @ stdcall ScriptFreeCache(ptr) @ stdcall ScriptGetCMap(ptr ptr ptr long long ptr) @ stub ScriptGetFontAlternateGlyphs -@ stub ScriptGetFontFeatureTags -@ stub ScriptGetFontLanguageTags +@ stdcall ScriptGetFontFeatureTags(long ptr ptr long long long ptr ptr) +@ stdcall ScriptGetFontLanguageTags(long ptr ptr long long ptr ptr) @ stdcall ScriptGetFontProperties(long ptr ptr) -@ stub ScriptGetFontScriptTags +@ stdcall ScriptGetFontScriptTags(long ptr ptr long ptr ptr) @ stdcall ScriptGetGlyphABCWidth(ptr ptr long ptr) @ stdcall ScriptGetLogicalWidths(ptr long long ptr ptr ptr ptr) @ stdcall ScriptGetProperties(ptr long) diff --git a/reactos/dll/win32/usp10/usp10_internal.h b/reactos/dll/win32/usp10/usp10_internal.h index 6f5d3d14d86..02beaf628dc 100644 --- a/reactos/dll/win32/usp10/usp10_internal.h +++ b/reactos/dll/win32/usp10/usp10_internal.h @@ -75,18 +75,81 @@ #define Script_Diacritical 44 #define Script_Punctuation2 45 #define Script_Numeric2 46 +/* Unicode Chapter 11 continued */ +#define Script_Myanmar 47 +#define Script_Myanmar_Numeric 48 +#define Script_Tai_Le 49 +#define Script_New_Tai_Lue 50 +#define Script_New_Tai_Lue_Numeric 51 +#define Script_Khmer 52 +#define Script_Khmer_Numeric 53 +/* Unicode Chapter 12 */ +#define Script_CJK_Han 54 +#define Script_Ideograph 55 +#define Script_Bopomofo 56 +#define Script_Kana 57 +#define Script_Hangul 58 +#define Script_Yi 59 +/* Unicode Chapter 13 */ +#define Script_Ethiopic 60 +#define Script_Ethiopic_Numeric 61 +#define Script_Mongolian 62 +#define Script_Mongolian_Numeric 63 +#define Script_Tifinagh 64 +#define Script_NKo 65 +#define Script_Vai 66 +#define Script_Vai_Numeric 67 +#define Script_Cherokee 68 +#define Script_Canadian 69 +/* Unicode Chapter 14 */ +#define Script_Ogham 70 +#define Script_Runic 71 +/* Unicode Chapter 15 */ +#define Script_Braille 72 +/* Unicode Chapter 16 */ +#define Script_Surrogates 73 +#define Script_Private 74 +/* Unicode Chapter 13 : Plane 1 */ +#define Script_Deseret 75 +#define Script_Osmanya 76 +#define Script_Osmanya_Numeric 77 +/* Unicode Chapter 15 : Plane 1 */ +#define Script_MathAlpha 78 +/* Additional Currency Scripts */ +#define Script_Hebrew_Currency 79 +#define Script_Vietnamese_Currency 80 +#define Script_Thai_Currency 81 #define GLYPH_BLOCK_SHIFT 8 #define GLYPH_BLOCK_SIZE (1UL << GLYPH_BLOCK_SHIFT) #define GLYPH_BLOCK_MASK (GLYPH_BLOCK_SIZE - 1) #define GLYPH_MAX 65536 +#define GSUB_E_NOFEATURE -2 +#define GSUB_E_NOGLYPH -1 + typedef struct { - char tag[5]; - char script[5]; + OPENTYPE_TAG tag; LPCVOID feature; + INT lookup_count; + WORD *lookups; } LoadedFeature; +typedef struct { + OPENTYPE_TAG tag; + LPCVOID table; + INT feature_count; + LoadedFeature *features; +} LoadedLanguage; + +typedef struct { + OPENTYPE_TAG tag; + LPCVOID table; + LoadedLanguage default_language; + INT language_count; + LoadedLanguage *languages; +} LoadedScript; + typedef struct { LOGFONTW lf; TEXTMETRICW tm; @@ -95,13 +158,23 @@ typedef struct { ABC *widths[GLYPH_MAX / GLYPH_BLOCK_SIZE]; LPVOID GSUB_Table; LPVOID GDEF_Table; - INT feature_count; - LoadedFeature *features; + LPVOID CMAP_Table; + LPVOID CMAP_format12_Table; + INT script_count; + LoadedScript *scripts; OPENTYPE_TAG userScript; OPENTYPE_TAG userLang; } ScriptCache; +typedef struct _scriptData +{ + SCRIPT_ANALYSIS a; + SCRIPT_PROPERTIES props; + OPENTYPE_TAG scriptTag; + WCHAR fallbackFont[LF_FACESIZE]; +} scriptData; + typedef struct { INT start; INT base; @@ -142,8 +215,18 @@ void SHAPE_ApplyDefaultOpentypeFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANALYS HRESULT SHAPE_CheckFontForRequiredFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa) DECLSPEC_HIDDEN; void SHAPE_CharGlyphProp(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR* pwcChars, const INT cChars, const WORD* pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp) DECLSPEC_HIDDEN; INT SHAPE_does_GSUB_feature_apply_to_chars(HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, const WCHAR *chars, INT write_dir, INT count, const char* feature) DECLSPEC_HIDDEN; +HRESULT SHAPE_GetFontScriptTags( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags) DECLSPEC_HIDDEN; +HRESULT SHAPE_GetFontLanguageTags( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, int cMaxTags, OPENTYPE_TAG *pLangSysTags, int *pcTags) DECLSPEC_HIDDEN; +HRESULT SHAPE_GetFontFeatureTags( HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, OPENTYPE_TAG tagLangSys, int cMaxTags, OPENTYPE_TAG *pFeatureTags, int *pcTags) DECLSPEC_HIDDEN; void Indic_ReorderCharacters( HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, LPWSTR input, int cChars, IndicSyllable **syllables, int *syllable_count, lexical_function lexical_f, reorder_function reorder_f, BOOL modern) DECLSPEC_HIDDEN; -void Indic_ParseSyllables( HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, LPCWSTR input, const int cChar, IndicSyllable **syllables, int *syllable_count, lexical_function lex, BOOL modern); +void Indic_ParseSyllables( HDC hdc, SCRIPT_ANALYSIS *psa, ScriptCache* psc, LPCWSTR input, const int cChar, IndicSyllable **syllables, int *syllable_count, lexical_function lex, BOOL modern) DECLSPEC_HIDDEN; void BREAK_line(const WCHAR *chars, int count, const SCRIPT_ANALYSIS *sa, SCRIPT_LOGATTR *la) DECLSPEC_HIDDEN; + +DWORD OpenType_CMAP_GetGlyphIndex(HDC hdc, ScriptCache *psc, DWORD utf32c, LPWORD pgi, DWORD flags) DECLSPEC_HIDDEN; +void OpenType_GDEF_UpdateGlyphProps(HDC hdc, ScriptCache *psc, const WORD *pwGlyphs, const WORD cGlyphs, WORD* pwLogClust, const WORD cChars, SCRIPT_GLYPHPROP *pGlyphProp) DECLSPEC_HIDDEN; +INT OpenType_apply_GSUB_lookup(LPCVOID table, INT lookup_index, WORD *glyphs, INT glyph_index, INT write_dir, INT *glyph_count) DECLSPEC_HIDDEN; +HRESULT OpenType_GSUB_GetFontScriptTags(ScriptCache *psc, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags, LPCVOID* script_table) DECLSPEC_HIDDEN; +HRESULT OpenType_GSUB_GetFontLanguageTags(ScriptCache *psc, OPENTYPE_TAG script_tag, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pLanguageTags, int *pcTags, LPCVOID* language_table) DECLSPEC_HIDDEN; +HRESULT OpenType_GSUB_GetFontFeatureTags(ScriptCache *psc, OPENTYPE_TAG script_tag, OPENTYPE_TAG language_tag, BOOL filtered, OPENTYPE_TAG searchingFor, int cMaxTags, OPENTYPE_TAG *pFeatureTags, int *pcTags, LoadedFeature** feature) DECLSPEC_HIDDEN; From 8ac4dcd6dd36c878fca231def2c2274dac78275c Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 26 Jan 2012 15:09:49 +0000 Subject: [PATCH 091/289] [User32] - Edit, Sync to Wine 1.3.37. svn path=/trunk/; revision=55202 --- reactos/dll/win32/user32/controls/edit.c | 71 +++++++++++++++++++----- 1 file changed, 56 insertions(+), 15 deletions(-) diff --git a/reactos/dll/win32/user32/controls/edit.c b/reactos/dll/win32/user32/controls/edit.c index 8401b22c980..62e1eaf74d2 100644 --- a/reactos/dll/win32/user32/controls/edit.c +++ b/reactos/dll/win32/user32/controls/edit.c @@ -1058,13 +1058,15 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap) while (line_def->index != li) line_def = line_def->next; - if (!line_def->ssa) - return 0; - lw = line_def->width; w = es->format_rect.right - es->format_rect.left; - ScriptStringCPtoX(line_def->ssa, (index - 1) - li, TRUE, &x); - x -= es->x_offset; + if (line_def->ssa) + { + ScriptStringCPtoX(line_def->ssa, (index - 1) - li, TRUE, &x); + x -= es->x_offset; + } + else + x = es->x_offset; if (es->style & ES_RIGHT) x = w - (lw - x); @@ -1080,6 +1082,7 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap) { if (es->x_offset >= get_text_length(es)) { + int leftover = es->x_offset - get_text_length(es); if (es->ssa) { const SIZE *size; @@ -1088,8 +1091,10 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap) } else xoff = 0; + xoff += es->char_width * leftover; } - ScriptStringCPtoX(es->ssa, es->x_offset, FALSE, &xoff); + else + ScriptStringCPtoX(es->ssa, es->x_offset, FALSE, &xoff); } else xoff = 0; @@ -1109,8 +1114,8 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap) } else if (es->ssa) ScriptStringCPtoX(es->ssa, index, FALSE, &xi); - else - xi = 0; + else + xi = 0; } x = xi - xoff; @@ -1145,18 +1150,52 @@ static LRESULT EDIT_EM_PosFromChar(EDITSTATE *es, INT index, BOOL after_wrap) */ static void EDIT_GetLineRect(EDITSTATE *es, INT line, INT scol, INT ecol, LPRECT rc) { - INT line_index = EDIT_EM_LineIndex(es, line); - INT pt1, pt2; + SCRIPT_STRING_ANALYSIS ssa; + INT line_index = 0; + INT pt1, pt2, pt3; if (es->style & ES_MULTILINE) + { + const LINEDEF *line_def = NULL; rc->top = es->format_rect.top + (line - es->y_offset) * es->line_height; + if (line >= es->line_count) + return; + + line_def = es->first_line_def; + if (line == -1) { + INT index = es->selection_end - line_def->length; + while ((index >= 0) && line_def->next) { + line_index += line_def->length; + line_def = line_def->next; + index -= line_def->length; + } + } else { + while (line > 0) { + line_index += line_def->length; + line_def = line_def->next; + line--; + } + } + ssa = line_def->ssa; + } else + { + line_index = 0; rc->top = es->format_rect.top; + ssa = es->ssa; + } + rc->bottom = rc->top + es->line_height; - pt1 = (scol == 0) ? es->format_rect.left : (short)LOWORD(EDIT_EM_PosFromChar(es, line_index + scol, TRUE)); - pt2 = (ecol == -1) ? es->format_rect.right : (short)LOWORD(EDIT_EM_PosFromChar(es, line_index + ecol, TRUE)); - rc->right = max(pt1 , pt2); - rc->left = min(pt1, pt2); + pt1 = (scol == 0) ? es->format_rect.left : (short)LOWORD(EDIT_EM_PosFromChar(es, line_index + scol, TRUE)); + pt2 = (ecol == -1) ? es->format_rect.right : (short)LOWORD(EDIT_EM_PosFromChar(es, line_index + ecol, TRUE)); + if (ssa) + { + ScriptStringCPtoX(ssa, scol, FALSE, &pt3); + pt3+=es->format_rect.left; + } + else pt3 = pt1; + rc->right = max(max(pt1 , pt2),pt3); + rc->left = min(min(pt1, pt2),pt3); } @@ -3666,7 +3705,7 @@ static void EDIT_WM_Paint(EDITSTATE *es, HDC hdc) (es->style & ES_NOHIDESEL)); dc = hdc ? hdc : BeginPaint(es->hwndSelf, &ps); - /* The dc we use for calcualting may not be the one we paint into. + /* The dc we use for calculating may not be the one we paint into. This is the safest action. */ EDIT_InvalidateUniscribeData(es); GetClientRect(es->hwndSelf, &rcClient); @@ -3719,11 +3758,13 @@ static void EDIT_WM_Paint(EDITSTATE *es, HDC hdc) if (es->style & ES_MULTILINE) { INT vlc = get_vertical_line_count(es); for (i = es->y_offset ; i <= min(es->y_offset + vlc, es->y_offset + es->line_count - 1) ; i++) { + EDIT_UpdateUniscribeData(es, dc, i); EDIT_GetLineRect(es, i, 0, -1, &rcLine); if (IntersectRect(&rc, &rcRgn, &rcLine)) EDIT_PaintLine(es, dc, i, rev); } } else { + EDIT_UpdateUniscribeData(es, dc, 0); EDIT_GetLineRect(es, 0, 0, -1, &rcLine); if (IntersectRect(&rc, &rcRgn, &rcLine)) EDIT_PaintLine(es, dc, 0, rev); From 31c093f050c84f8da3fb43aaa4f4e237d801677e Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 26 Jan 2012 15:17:18 +0000 Subject: [PATCH 092/289] - Sync up to support ComCtl32 tests. svn path=/trunk/; revision=55203 --- reactos/include/psdk/commctrl.h | 6 ++++++ reactos/include/psdk/prsht.h | 22 ++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/reactos/include/psdk/commctrl.h b/reactos/include/psdk/commctrl.h index a6563982eaa..591b8374248 100644 --- a/reactos/include/psdk/commctrl.h +++ b/reactos/include/psdk/commctrl.h @@ -4012,10 +4012,16 @@ typedef struct { #define MonthCal_SetMonthDelta(hmc,n) (int)SNDMSG(hmc,MCM_SETMONTHDELTA,n,0) #define MCM_GETMAXTODAYWIDTH (MCM_FIRST+21) #define MonthCal_GetMaxTodayWidth(hmc) (DWORD)SNDMSG(hmc,MCM_GETMAXTODAYWIDTH,0,0) +#define MCM_GETCURRENTVIEW (MCM_FIRST + 22) +#define MonthCal_GetCurrentView(hmc) (DWORD)SNDMSG(hmc, MCM_GETCURRENTVIEW, 0, 0) +#define MCM_GETCALENDARCOUNT (MCM_FIRST + 23) +#define MonthCal_GetCalendarCount(hmc) (DWORD)SNDMSG(hmc, MCM_GETCALENDARCOUNT, 0, 0) #define MCM_SETUNICODEFORMAT CCM_SETUNICODEFORMAT #define MonthCal_SetUnicodeFormat(hwnd,fUnicode) (WINBOOL)SNDMSG((hwnd),MCM_SETUNICODEFORMAT,(WPARAM)(fUnicode),0) #define MCM_GETUNICODEFORMAT CCM_GETUNICODEFORMAT #define MonthCal_GetUnicodeFormat(hwnd) (WINBOOL)SNDMSG((hwnd),MCM_GETUNICODEFORMAT,0,0) +#define MCM_SIZERECTTOMIN (MCM_FIRST + 29) +#define MonthCal_SizeRectToMin(hmc, prc) SNDMSG(hmc, MCM_SIZERECTTOMIN, 0, (LPARAM)(prc)) #define MCM_SETCALENDARBORDER (MCM_FIRST + 30) #define MCM_GETCALENDARBORDER (MCM_FIRST + 31) diff --git a/reactos/include/psdk/prsht.h b/reactos/include/psdk/prsht.h index dc1b1afedac..b68f0bc127f 100644 --- a/reactos/include/psdk/prsht.h +++ b/reactos/include/psdk/prsht.h @@ -192,8 +192,13 @@ typedef struct _PROPSHEETPAGEA { LPCSTR pszHeaderTitle; LPCSTR pszHeaderSubTitle; #endif -} PROPSHEETPAGEA,*LPPROPSHEETPAGEA; -typedef const PROPSHEETPAGEA *LPCPROPSHEETPAGEA; +} PROPSHEETPAGEA,*LPPROPSHEETPAGEA, + PROPSHEETPAGEA_LATEST, *LPPROPSHEETPAGEA_LATEST; +typedef const PROPSHEETPAGEA *LPCPROPSHEETPAGEA, *LPCPROPSHEETPAGEA_LATEST; +#define PROPSHEETPAGEA_V1_SIZE CCSIZEOF_STRUCT(PROPSHEETPAGEA, pcRefParent) +#define PROPSHEETPAGEA_V2_SIZE CCSIZEOF_STRUCT(PROPSHEETPAGEA, pszHeaderSubTitle) +#define PROPSHEETPAGEA_V3_SIZE CCSIZEOF_STRUCT(PROPSHEETPAGEA, hActCtx) +#define PROPSHEETPAGEA_V4_SIZE sizeof(PROPSHEETPAGEA) typedef struct _PROPSHEETPAGEW { DWORD dwSize; DWORD dwFlags; @@ -215,8 +220,13 @@ typedef struct _PROPSHEETPAGEW { LPCWSTR pszHeaderTitle; LPCWSTR pszHeaderSubTitle; #endif -} PROPSHEETPAGEW,*LPPROPSHEETPAGEW; -typedef const PROPSHEETPAGEW *LPCPROPSHEETPAGEW; +} PROPSHEETPAGEW,*LPPROPSHEETPAGEW, + PROPSHEETPAGEW_LATEST, *LPPROPSHEETPAGEW_LATEST; +typedef const PROPSHEETPAGEW *LPCPROPSHEETPAGEW, *LPCPROPSHEETPAGEW_LATEST; +#define PROPSHEETPAGEW_V1_SIZE CCSIZEOF_STRUCT(PROPSHEETPAGEW, pcRefParent) +#define PROPSHEETPAGEW_V2_SIZE CCSIZEOF_STRUCT(PROPSHEETPAGEW, pszHeaderSubTitle) +#define PROPSHEETPAGEW_V3_SIZE CCSIZEOF_STRUCT(PROPSHEETPAGEW, hActCtx) +#define PROPSHEETPAGEW_V4_SIZE sizeof(PROPSHEETPAGEW) typedef UINT(CALLBACK *LPFNPSPCALLBACKA)(HWND,UINT,LPPROPSHEETPAGEA); typedef UINT(CALLBACK *LPFNPSPCALLBACKW)(HWND,UINT,LPPROPSHEETPAGEW); typedef int(CALLBACK *PFNPROPSHEETCALLBACK)(HWND,UINT,LPARAM); @@ -257,6 +267,8 @@ typedef struct _PROPSHEETHEADERA { #endif } PROPSHEETHEADERA,*LPPROPSHEETHEADERA; typedef const PROPSHEETHEADERA *LPCPROPSHEETHEADERA; +#define PROPSHEETHEADERA_V1_SIZE CCSIZEOF_STRUCT(PROPSHEETHEADERA, pfnCallback) +#define PROPSHEETHEADERA_V2_SIZE sizeof(PROPSHEETHEADERA) typedef struct _PROPSHEETHEADERW { DWORD dwSize; DWORD dwFlags; @@ -290,6 +302,8 @@ typedef struct _PROPSHEETHEADERW { #endif } PROPSHEETHEADERW,*LPPROPSHEETHEADERW; typedef const PROPSHEETHEADERW *LPCPROPSHEETHEADERW; +#define PROPSHEETHEADERW_V1_SIZE CCSIZEOF_STRUCT(PROPSHEETHEADERW, pfnCallback) +#define PROPSHEETHEADERW_V2_SIZE sizeof(PROPSHEETHEADERW) typedef BOOL(CALLBACK *LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE,LPARAM); typedef BOOL(CALLBACK *LPFNADDPROPSHEETPAGES)(LPVOID,LPFNADDPROPSHEETPAGE,LPARAM); typedef struct _PSHNOTIFY { From 3c2d102561d8d32913821e1f3a57ffab6c8feb79 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 15:17:25 +0000 Subject: [PATCH 093/289] [MCIWAVE] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55204 --- reactos/dll/win32/mciwave/mciwave.c | 53 ++++++++++++++++------------- reactos/media/doc/README.WINE | 2 +- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/reactos/dll/win32/mciwave/mciwave.c b/reactos/dll/win32/mciwave/mciwave.c index 67cf09a9ac3..effecf43069 100644 --- a/reactos/dll/win32/mciwave/mciwave.c +++ b/reactos/dll/win32/mciwave/mciwave.c @@ -465,7 +465,7 @@ static LRESULT WAVE_mciOpenFile(WINE_MCIWAVE* wmw, LPCWSTR filename) fn = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(filename) + 1) * sizeof(WCHAR)); if (!fn) return MCIERR_OUT_OF_MEMORY; strcpyW(fn, filename); - HeapFree(GetProcessHeap(), 0, (void*)wmw->lpFileName); + HeapFree(GetProcessHeap(), 0, wmw->lpFileName); wmw->lpFileName = fn; if (strlenW(filename) > 0) { @@ -483,7 +483,7 @@ static LRESULT WAVE_mciOpenFile(WINE_MCIWAVE* wmw, LPCWSTR filename) { LPMMCKINFO lpckMainRIFF = &wmw->ckMainRIFF; - /* make sure we're are the beginning of the file */ + /* make sure we're at the beginning of the file */ mmioSeek(wmw->hFile, 0, SEEK_SET); /* first reading of this file. read the waveformat chunk */ @@ -568,6 +568,8 @@ static LRESULT WAVE_mciOpen(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_P if (wmw->hFile != 0) mmioClose(wmw->hFile, 0); wmw->hFile = 0; + HeapFree(GetProcessHeap(), 0, wmw->lpFileName); + wmw->lpFileName = NULL; } return dwRet; } @@ -680,7 +682,7 @@ static DWORD WAVE_mciClose(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_GENERIC_PARM if (wmw->lpWaveFormat != &wmw->wfxRef) HeapFree(GetProcessHeap(), 0, wmw->lpWaveFormat); wmw->lpWaveFormat = &wmw->wfxRef; - HeapFree(GetProcessHeap(), 0, (void*)wmw->lpFileName); + HeapFree(GetProcessHeap(), 0, wmw->lpFileName); wmw->lpFileName = NULL; if ((dwFlags & MCI_NOTIFY) && lpParms) { @@ -754,8 +756,8 @@ static DWORD WAVE_mciPlay(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt, return MCIERR_FILE_NOT_FOUND; } - if (wmw->dwStatus == MCI_MODE_PAUSE && !wmw->fInput) { - /* FIXME: parameters (start/end) in lpParams may not be used */ + if (wmw->dwStatus == MCI_MODE_PAUSE && !wmw->fInput && !(dwFlags & (MCI_FROM | MCI_TO))) { + /* FIXME: notification is different with Resume than Play */ return WAVE_mciResume(wDevID, dwFlags, (LPMCI_GENERIC_PARMS)lpParms); } @@ -763,8 +765,12 @@ static DWORD WAVE_mciPlay(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt, * We have to set MCI_MODE_PLAY before we do this so that the app can spin * on MCI_STATUS, so we have to allow it here if we're not going to start this thread. */ - if ((wmw->dwStatus != MCI_MODE_STOP) && ((wmw->dwStatus != MCI_MODE_PLAY) && (dwFlags & MCI_WAIT))) { - return MCIERR_INTERNAL; + if ( !(wmw->dwStatus == MCI_MODE_STOP) && + !((wmw->dwStatus == MCI_MODE_PLAY) && (dwFlags & MCI_WAIT) && !wmw->hWave)) { + /* FIXME: Check FROM/TO parameters first. */ + /* FIXME: Play; Play [notify|wait] must hook into the running player. */ + dwRet = WAVE_mciStop(wDevID, MCI_WAIT, NULL); + if (dwRet) return dwRet; } if (wmw->lpWaveFormat->wFormatTag == WAVE_FORMAT_PCM) { @@ -916,7 +922,7 @@ cleanUp: wmw->dwStatus = MCI_MODE_STOP; - /* Let the potentically asynchronous commands support FAILURE notification. */ + /* Let the potentially asynchronous commands support FAILURE notification. */ if (oldcb) mciDriverNotify(oldcb, wDevID, dwRet ? MCI_NOTIFY_FAILURE : MCI_NOTIFY_SUCCESSFUL); @@ -1009,7 +1015,8 @@ static DWORD WAVE_mciRecord(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt * We have to set MCI_MODE_RECORD before we do this so that the app can spin * on MCI_STATUS, so we have to allow it here if we're not going to start this thread. */ - if ((wmw->dwStatus != MCI_MODE_STOP) && ((wmw->dwStatus != MCI_MODE_RECORD) && (dwFlags & MCI_WAIT))) { + if ( !(wmw->dwStatus == MCI_MODE_STOP) && + !((wmw->dwStatus == MCI_MODE_RECORD) && (dwFlags & MCI_WAIT) && !wmw->hWave)) { return MCIERR_INTERNAL; } @@ -1025,7 +1032,7 @@ static DWORD WAVE_mciRecord(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt * we don't modify the wave part of an existing file (ie. we always erase an * existing content, we don't overwrite) */ - HeapFree(GetProcessHeap(), 0, (void*)wmw->lpFileName); + HeapFree(GetProcessHeap(), 0, wmw->lpFileName); dwRet = create_tmp_file(&wmw->hFile, (WCHAR**)&wmw->lpFileName); if (dwRet != 0) return dwRet; @@ -1463,6 +1470,7 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM TRACE("(%u, %08X, %p);\n", wDevID, dwFlags, lpParms); if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; if (wmw == NULL) return MCIERR_INVALID_DEVICE_ID; + if (!(dwFlags & MCI_STATUS_ITEM)) return MCIERR_MISSING_PARAMETER; if (dwFlags & MCI_STATUS_ITEM) { switch (lpParms->dwItem) { @@ -1572,7 +1580,7 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM break; default: WARN("unknown command %08X !\n", lpParms->dwItem); - return MCIERR_UNRECOGNIZED_COMMAND; + return MCIERR_UNSUPPORTED_FUNCTION; } } if ((dwFlags & MCI_NOTIFY) && HRESULT_CODE(ret)==0) @@ -1665,6 +1673,8 @@ static DWORD WAVE_mciInfo(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW l if (!lpParms || !lpParms->lpstrReturn) return MCIERR_NULL_PARAMETER_BLOCK; + TRACE("buf=%p, len=%u\n", lpParms->lpstrReturn, lpParms->dwRetSize); + if (wmw == NULL) { ret = MCIERR_INVALID_DEVICE_ID; } else { @@ -1672,8 +1682,6 @@ static DWORD WAVE_mciInfo(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW l static const WCHAR wszWaveIn [] = {'W','i','n','e',' ','W','a','v','e',' ','I','n',0}; static const WCHAR wszWaveOut[] = {'W','i','n','e',' ','W','a','v','e',' ','O','u','t',0}; - TRACE("buf=%p, len=%u\n", lpParms->lpstrReturn, lpParms->dwRetSize); - switch (dwFlags & ~(MCI_WAIT|MCI_NOTIFY)) { case MCI_INFO_PRODUCT: str = wszAudio; break; case MCI_INFO_FILE: str = wmw->lpFileName; break; @@ -1681,17 +1689,16 @@ static DWORD WAVE_mciInfo(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_INFO_PARMSW l case MCI_WAVE_OUTPUT: str = wszWaveOut; break; default: WARN("Don't know this info command (%u)\n", dwFlags); - ret = MCIERR_UNRECOGNIZED_COMMAND; + ret = MCIERR_UNRECOGNIZED_KEYWORD; } } - if (str) { - if (strlenW(str) + 1 > lpParms->dwRetSize) { - ret = MCIERR_PARAM_OVERFLOW; - } else { - lstrcpynW(lpParms->lpstrReturn, str, lpParms->dwRetSize); - } - } else { - lpParms->lpstrReturn[0] = 0; + if (!ret) { + if (lpParms->dwRetSize) { + WCHAR zero = 0; + /* FIXME? Since NT, mciwave, mciseq and mcicda set dwRetSize + * to the number of characters written, excluding \0. */ + lstrcpynW(lpParms->lpstrReturn, str ? str : &zero, lpParms->dwRetSize); + } else ret = MCIERR_PARAM_OVERFLOW; } if (MMSYSERR_NOERROR==ret && (dwFlags & MCI_NOTIFY)) WAVE_mciNotify(lpParms->dwCallback, wmw, MCI_NOTIFY_SUCCESSFUL); @@ -1752,7 +1759,7 @@ LRESULT CALLBACK MCIWAVE_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, case MCI_CUT: case MCI_DELETE: case MCI_PASTE: - FIXME("Unsupported yet command [%u]\n", wMsg); + FIXME("Unsupported command [%u]\n", wMsg); break; case MCI_WINDOW: TRACE("Unsupported command [%u]\n", wMsg); diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 688afdb7b35..f90f9e21359 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -87,7 +87,7 @@ reactos/dll/win32/mciavi32 # Synced to Wine-1.3.37 reactos/dll/win32/mcicda # Synced to Wine-1.3.37 reactos/dll/win32/mciqtz32 # Autosync reactos/dll/win32/mciseq # Synced to Wine-1.3.37 -reactos/dll/win32/mciwave # Autosync +reactos/dll/win32/mciwave # Synced to Wine-1.3.37 reactos/dll/win32/mlang # Autosync reactos/dll/win32/mpr # Autosync reactos/dll/win32/mprapi # Autosync From 58447ec2362f70b0567b237073bfda327d88e586 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 26 Jan 2012 15:18:59 +0000 Subject: [PATCH 094/289] [Usp10_wineTest] - Sync to Wine 1.3.37. svn path=/trunk/; revision=55205 --- rostests/winetests/usp10/usp10.c | 1832 +++++++++++++++++++++++++----- 1 file changed, 1560 insertions(+), 272 deletions(-) diff --git a/rostests/winetests/usp10/usp10.c b/rostests/winetests/usp10/usp10.c index efc0569d3be..82297558030 100644 --- a/rostests/winetests/usp10/usp10.c +++ b/rostests/winetests/usp10/usp10.c @@ -32,63 +32,189 @@ #include typedef struct _itemTest { - char todo_flag[4]; + char todo_flag[5]; int iCharPos; int fRTL; int fLayoutRTL; int uBidiLevel; + ULONG scriptTag; + BOOL isBroken; + int broken_value[5]; } itemTest; +typedef struct _shapeTest_char { + WORD wLogClust; + SCRIPT_CHARPROP CharProp; +} shapeTest_char; + +typedef struct _shapeTest_glyph { + int Glyph; + SCRIPT_GLYPHPROP GlyphProp; +} shapeTest_glyph; + +/* Uniscribe 1.6 calls */ +static HRESULT (WINAPI *pScriptItemizeOpenType)( const WCHAR *pwcInChars, int cInChars, int cMaxItems, const SCRIPT_CONTROL *psControl, const SCRIPT_STATE *psState, SCRIPT_ITEM *pItems, ULONG *pScriptTags, int *pcItems); + +static HRESULT (WINAPI *pScriptShapeOpenType)( HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, OPENTYPE_TAG tagLangSys, int *rcRangeChars, TEXTRANGE_PROPERTIES **rpRangeProperties, int cRanges, const WCHAR *pwcChars, int cChars, int cMaxGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProps, WORD *pwOutGlyphs, SCRIPT_GLYPHPROP *pOutGlyphProps, int *pcGlyphs); + +static DWORD (WINAPI *pGetGlyphIndicesW)(HDC hdc, LPCWSTR lpstr, INT count, LPWORD pgi, DWORD flags); + +static HRESULT (WINAPI *pScriptGetFontScriptTags)( HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags); +static HRESULT (WINAPI *pScriptGetFontLanguageTags)( HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, int cMaxTags, OPENTYPE_TAG *pLangSysTags, int *pcTags); +static HRESULT (WINAPI *pScriptGetFontFeatureTags)( HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, OPENTYPE_TAG tagLangSys, int cMaxTags, OPENTYPE_TAG *pFeatureTags, int *pcTags); + static inline void _test_items_ok(LPCWSTR string, DWORD cchString, SCRIPT_CONTROL *Control, SCRIPT_STATE *State, - DWORD nItems, const itemTest* items, BOOL nItemsToDo) + DWORD nItems, const itemTest* items, BOOL nItemsToDo, + const INT nItemsBroken[2]) { HRESULT hr; int x, outnItems; SCRIPT_ITEM outpItems[15]; + ULONG tags[15] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}; + + if (pScriptItemizeOpenType) + hr = pScriptItemizeOpenType(string, cchString, 15, Control, State, outpItems, tags, &outnItems); + else + hr = ScriptItemize(string, cchString, 15, Control, State, outpItems, &outnItems); - hr = ScriptItemize(string, cchString, 15, Control, State, outpItems, &outnItems); winetest_ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + if (nItemsBroken && (broken(nItemsBroken[0] == outnItems) || broken(nItemsBroken[1] == outnItems))) + { + winetest_win_skip("This test broken on this platform\n"); + return; + } if (nItemsToDo) todo_wine winetest_ok(outnItems == nItems, "Wrong number of items\n"); else winetest_ok(outnItems == nItems, "Wrong number of items\n"); for (x = 0; x <= outnItems; x++) { - if (items[x].todo_flag[0]) + if (items[x].isBroken && broken(outpItems[x].iCharPos == items[x].broken_value[0])) + winetest_win_skip("This test broken on this platform\n"); + else if (items[x].todo_flag[0]) todo_wine winetest_ok(outpItems[x].iCharPos == items[x].iCharPos, "%i:Wrong CharPos\n",x); else winetest_ok(outpItems[x].iCharPos == items[x].iCharPos, "%i:Wrong CharPos (%i)\n",x,outpItems[x].iCharPos); - if (items[x].todo_flag[1]) + if (items[x].isBroken && broken(outpItems[x].a.fRTL== items[x].broken_value[1])) + winetest_win_skip("This test broken on this platform\n"); + else if (items[x].todo_flag[1]) todo_wine winetest_ok(outpItems[x].a.fRTL == items[x].fRTL, "%i:Wrong fRTL\n",x); else winetest_ok(outpItems[x].a.fRTL == items[x].fRTL, "%i:Wrong fRTL(%i)\n",x,outpItems[x].a.fRTL); - if (items[x].todo_flag[2]) + + if (items[x].isBroken && broken(outpItems[x].a.fLayoutRTL == items[x].broken_value[2])) + winetest_win_skip("This test broken on this platform\n"); + else if (items[x].todo_flag[2]) todo_wine winetest_ok(outpItems[x].a.fLayoutRTL == items[x].fLayoutRTL, "%i:Wrong fLayoutRTL\n",x); else winetest_ok(outpItems[x].a.fLayoutRTL == items[x].fLayoutRTL, "%i:Wrong fLayoutRTL(%i)\n",x,outpItems[x].a.fLayoutRTL); - if (items[x].todo_flag[3]) + + if (items[x].isBroken && broken(outpItems[x].a.s.uBidiLevel == items[x].broken_value[3])) + winetest_win_skip("This test broken on this platform\n"); + else if (items[x].todo_flag[3]) todo_wine winetest_ok(outpItems[x].a.s.uBidiLevel == items[x].uBidiLevel, "%i:Wrong BidiLevel\n",x); else winetest_ok(outpItems[x].a.s.uBidiLevel == items[x].uBidiLevel, "%i:Wrong BidiLevel(%i)\n",x,outpItems[x].a.s.uBidiLevel); + if (x != outnItems) + winetest_ok(outpItems[x].a.eScript != SCRIPT_UNDEFINED, "%i: Undefined script\n",x); + if (pScriptItemizeOpenType) + { + if (items[x].isBroken && broken(tags[x] == items[x].broken_value[4])) + winetest_win_skip("This test broken on this platform\n"); + else if (items[x].todo_flag[4]) + todo_wine winetest_ok(tags[x] == items[x].scriptTag,"%i:Incorrect Script Tag %x != %x\n",x,tags[x],items[x].scriptTag); + else + winetest_ok(tags[x] == items[x].scriptTag,"%i:Incorrect Script Tag %x != %x\n",x,tags[x],items[x].scriptTag); + } } } -#define test_items_ok(a,b,c,d,e,f,g) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _test_items_ok(a,b,c,d,e,f,g) +#define test_items_ok(a,b,c,d,e,f,g,h) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _test_items_ok(a,b,c,d,e,f,g,h) +#define MS_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( (ULONG)_x4 << 24 ) | \ + ( (ULONG)_x3 << 16 ) | \ + ( (ULONG)_x2 << 8 ) | \ + (ULONG)_x1 ) + +#define latn_tag MS_MAKE_TAG('l','a','t','n') +#define arab_tag MS_MAKE_TAG('a','r','a','b') +#define thai_tag MS_MAKE_TAG('t','h','a','i') +#define hebr_tag MS_MAKE_TAG('h','e','b','r') +#define syrc_tag MS_MAKE_TAG('s','y','r','c') +#define deva_tag MS_MAKE_TAG('d','e','v','a') +#define beng_tag MS_MAKE_TAG('b','e','n','g') +#define guru_tag MS_MAKE_TAG('g','u','r','u') +#define gujr_tag MS_MAKE_TAG('g','u','j','r') +#define orya_tag MS_MAKE_TAG('o','r','y','a') +#define taml_tag MS_MAKE_TAG('t','a','m','l') +#define telu_tag MS_MAKE_TAG('t','e','l','u') +#define knda_tag MS_MAKE_TAG('k','n','d','a') +#define mlym_tag MS_MAKE_TAG('m','l','y','m') +#define mymr_tag MS_MAKE_TAG('m','y','m','r') +#define tale_tag MS_MAKE_TAG('t','a','l','e') +#define talu_tag MS_MAKE_TAG('t','a','l','u') +#define khmr_tag MS_MAKE_TAG('k','h','m','r') +#define hani_tag MS_MAKE_TAG('h','a','n','i') +#define bopo_tag MS_MAKE_TAG('b','o','p','o') +#define kana_tag MS_MAKE_TAG('k','a','n','a') +#define hang_tag MS_MAKE_TAG('h','a','n','g') +#define yi_tag MS_MAKE_TAG('y','i',' ',' ') +#define ethi_tag MS_MAKE_TAG('e','t','h','i') +#define mong_tag MS_MAKE_TAG('m','o','n','g') +#define tfng_tag MS_MAKE_TAG('t','f','n','g') +#define nko_tag MS_MAKE_TAG('n','k','o',' ') +#define vai_tag MS_MAKE_TAG('v','a','i',' ') +#define cher_tag MS_MAKE_TAG('c','h','e','r') +#define cans_tag MS_MAKE_TAG('c','a','n','s') +#define ogam_tag MS_MAKE_TAG('o','g','a','m') +#define runr_tag MS_MAKE_TAG('r','u','n','r') +#define brai_tag MS_MAKE_TAG('b','r','a','i') +#define dsrt_tag MS_MAKE_TAG('d','s','r','t') +#define osma_tag MS_MAKE_TAG('o','s','m','a') +#define math_tag MS_MAKE_TAG('m','a','t','h') static void test_ScriptItemize( void ) { static const WCHAR test1[] = {'t', 'e', 's', 't',0}; - static const itemTest t11[2] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},4,0,0,0}}; - static const itemTest t12[2] = {{{0,0,0,0},0,0,0,2},{{0,0,0,0},4,0,0,0}}; + static const itemTest t11[2] = {{{0,0,0,0,0},0,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},4,0,0,0,-1}}; + static const itemTest t12[2] = {{{0,0,0,0,0},0,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; + + static const WCHAR test1b[] = {' ', ' ', ' ', ' ',0}; + static const itemTest t1b1[2] = {{{0,0,0,0,0},0,0,0,0,0,FALSE},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; + static const itemTest t1b2[2] = {{{0,0,0,0,0},0,1,1,1,0,FALSE},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; + + static const WCHAR test1c[] = {' ', ' ', ' ', '1', '2', ' ',0}; + static const itemTest t1c1[2] = {{{0,0,0,0,0},0,0,0,0,0,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const itemTest t1c2[4] = {{{0,0,0,0,0},0,1,1,1,0,FALSE},{{0,0,0,0,0},3,0,1,2,0,FALSE},{{0,0,0,0,0},5,1,1,1,0,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; /* Arabic, English*/ static const WCHAR test2[] = {'1','2','3','-','5','2',0x064a,0x064f,0x0633,0x0627,0x0648,0x0650,0x064a,'7','1','.',0}; - static const itemTest t21[7] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},3,0,0,0},{{0,0,0,0},4,0,0,0},{{0,0,0,0},6,1,1,1},{{0,0,0,0},13,0,0,0},{{0,0,0,0},15,0,0,0},{{0,0,0,0},16,0,0,0}}; - static const itemTest t22[5] = {{{0,0,0,1},0,0,0,2},{{0,0,0,0},6,1,1,1},{{0,0,1,0},13,0,1,2},{{0,0,0,0},15,0,0,0},{{0,0,0,0},16,0,0,0}}; - static const itemTest t23[5] = {{{0,0,1,0},0,0,1,2},{{0,0,0,0},6,1,1,1},{{0,0,1,0},13,0,1,2},{{0,0,0,0},15,1,1,1},{{0,0,0,0},16,0,0,0}}; + static const itemTest t21[7] = {{{0,0,0,0,0},0,0,0,0,0,FALSE},{{0,0,0,0,0},3,0,0,0,0,FALSE},{{0,0,0,0,0},4,0,0,0,0,FALSE},{{0,0,0,0,0},6,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},13,0,0,0,0,FALSE},{{0,0,0,0,0},15,0,0,0,0,FALSE},{{0,0,0,0,0},16,0,0,0,-1,FALSE}}; + static const itemTest t22[5] = {{{0,0,0,0,0},0,0,0,2,0,FALSE},{{0,0,0,0,0},6,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},13,0,1,2,0,FALSE},{{0,0,0,0,0},15,0,0,0,0,FALSE},{{0,0,0,0,0},16,0,0,0,-1,FALSE}}; + static const itemTest t23[5] = {{{0,0,0,0,0},0,0,1,2,0,FALSE},{{0,0,0,0,0},6,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},13,0,1,2,0,FALSE},{{0,0,0,0,0},15,1,1,1,0,FALSE},{{0,0,0,0,0},16,0,0,0,-1,FALSE}}; + + static const WCHAR test2b[] = {'A','B','C','-','D','E','F',' ',0x0621,0x0623,0x0624,0}; + static const itemTest t2b1[5] = {{{0,0,0,0,0},0,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},3,0,0,0,0,FALSE},{{0,0,0,0,0},4,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},8,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; + static const itemTest t2b2[5] = {{{0,0,0,0,0},0,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},3,0,0,2,0,FALSE},{{0,0,0,0,0},4,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},7,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; + static const itemTest t2b3[3] = {{{0,0,0,0,0},0,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},7,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; + static const int b2[2] = {4,4}; + + /* leading space */ + static const WCHAR test2c[] = {' ',0x0621,0x0623,0x0624,'A','B','C','-','D','E','F',0}; + static const itemTest t2c1[5] = {{{0,0,0,0,0},0,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},4,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},7,0,0,0,0,FALSE},{{0,0,0,0,0},8,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; + static const itemTest t2c2[6] = {{{0,0,0,0,0},0,0,0,0,0,FALSE},{{0,0,0,0,0},1,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},4,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},7,0,0,0,0,FALSE},{{0,0,0,0,0},8,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; + static const itemTest t2c3[5] = {{{0,0,0,0,0},0,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},4,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},7,0,0,2,0,FALSE},{{0,0,0,0,0},8,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; + static const itemTest t2c4[3] = {{{0,0,0,0,0},0,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},4,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; + + /* trailing space */ + static const WCHAR test2d[] = {'A','B','C','-','D','E','F',0x0621,0x0623,0x0624,' ',0}; + static const itemTest t2d1[5] = {{{0,0,0,0,0},0,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},3,0,0,0,0,FALSE},{{0,0,0,0,0},4,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},7,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; + static const itemTest t2d2[6] = {{{0,0,0,0,0},0,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},3,0,0,0,0,FALSE},{{0,0,0,0,0},4,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},7,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},10,0,0,0,0,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; + static const itemTest t2d3[5] = {{{0,0,0,0,0},0,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},3,0,0,2,0,FALSE},{{0,0,0,0,0},4,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},7,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; + static const itemTest t2d4[3] = {{{0,0,0,0,0},0,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},7,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},11,0,0,0,-1,FALSE}}; /* Thai */ static const WCHAR test3[] = @@ -97,13 +223,15 @@ static void test_ScriptItemize( void ) ,0x0e04,0x0e27,0x0e32,0x0e21,0x0e2a, 0x0e33,0x0e40,0x0e23,0x0e47,0x0e08, 0x0e2d,0x0e22,0x0e39,0x0e48,0x0e17,0x0e35,0x0e48,0x0e19,0x0e31,0x0e48,0x0e19,0}; - static const itemTest t31[2] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},41,0,0,0}}; - static const itemTest t32[2] = {{{0,0,0,0},0,0,0,2},{{0,0,0,0},41,0,0,0}}; + static const itemTest t31[2] = {{{0,0,0,0,0},0,0,0,0,thai_tag,FALSE},{{0,0,0,0,0},41,0,0,0,-1,FALSE}}; + static const itemTest t32[2] = {{{0,0,0,0,0},0,0,0,2,thai_tag,FALSE},{{0,0,0,0,0},41,0,0,0,-1,FALSE}}; static const WCHAR test4[] = {'1','2','3','-','5','2',' ','i','s',' ','7','1','.',0}; - static const itemTest t41[6] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},3,0,0,0},{{0,0,0,0},4,0,0,0},{{0,0,0,0},7,0,0,0},{{0,0,0,0},10,0,0,0},{{0,0,0,0},12,0,0,0}}; - static const itemTest t42[5] = {{{0,0,1,0},0,0,1,2},{{0,0,0,0},6,1,1,1},{{0,0,0,0},7,0,0,2},{{1,0,0,1},10,0,0,2},{{1,0,0,0},12,0,0,0}}; + static const itemTest t41[6] = {{{0,0,0,0,0},0,0,0,0,0,FALSE},{{0,0,0,0,0},3,0,0,0,0,FALSE},{{0,0,0,0,0},4,0,0,0,0,FALSE},{{0,0,0,0,0},7,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},10,0,0,0,0,FALSE},{{0,0,0,0,0},12,0,0,0,-1,FALSE}}; + static const itemTest t42[5] = {{{0,0,0,0,0},0,0,1,2,0,FALSE},{{0,0,0,0,0},6,1,1,1,0,FALSE},{{0,0,0,0,0},7,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},10,0,0,2,0,FALSE},{{0,0,0,0,0},12,0,0,0,-1,FALSE}}; + static const itemTest t43[4] = {{{0,0,0,0,0},0,0,1,2,0,FALSE},{{0,0,0,0,0},6,1,1,1,0,FALSE},{{0,0,0,0,0},7,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},12,0,0,0,-1,FALSE}}; + static const int b43[2] = {4,4}; /* Arabic */ static const WCHAR test5[] = @@ -111,33 +239,236 @@ static void test_ScriptItemize( void ) 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}; - static const itemTest t51[2] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},38,0,0,0}}; + static const itemTest t51[2] = {{{0,0,0,0,0},0,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},38,0,0,0,-1,FALSE}}; /* Hebrew */ static const WCHAR test6[] = {0x05e9, 0x05dc, 0x05d5, 0x05dd, '.',0}; - static const itemTest t61[3] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,0,0,0},{{0,0,0,0},5,0,0,0}}; - static const itemTest t62[3] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,1,1,1},{{0,0,0,0},5,0,0,0}}; + static const itemTest t61[3] = {{{0,0,0,0,0},0,1,1,1,hebr_tag,FALSE},{{0,0,0,0,0},4,0,0,0,0,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const itemTest t62[3] = {{{0,0,0,0,0},0,1,1,1,hebr_tag,FALSE},{{0,0,0,0,0},4,1,1,1,0,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const itemTest t63[2] = {{{0,0,0,0,0},0,1,1,1,hebr_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const int b63[2] = {2,2}; static const WCHAR test7[] = {'p','a','r','t',' ','o','n','e',' ',0x05d7, 0x05dc, 0x05e7, ' ', 0x05e9, 0x05ea, 0x05d9, 0x05d9, 0x05dd, ' ','p','a','r','t',' ','t','h','r','e','e', 0}; - static const itemTest t71[4] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},9,1,1,1},{{0,0,0,0},19,0,0,0},{{0,0,0,0},29,0,0,0}}; - static const itemTest t72[4] = {{{0,0,0,0},0,0,0,0},{{0,0,0,0},9,1,1,1},{{0,0,0,0},18,0,0,0},{{0,0,0,0},29,0,0,0}}; - static const itemTest t73[4] = {{{0,0,0,0},0,0,0,2},{{0,0,0,0},8,1,1,1},{{0,0,0,0},19,0,0,2},{{0,0,0,0},29,0,0,0}}; + static const itemTest t71[4] = {{{0,0,0,0,0},0,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},9,1,1,1,hebr_tag,FALSE},{{0,0,0,0,0},19,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},29,0,0,0,-1,FALSE}}; + static const itemTest t72[4] = {{{0,0,0,0,0},0,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},9,1,1,1,hebr_tag,FALSE},{{0,0,0,0,0},18,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},29,0,0,0,-1,FALSE}}; + static const itemTest t73[4] = {{{0,0,0,0,0},0,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},8,1,1,1,hebr_tag,FALSE},{{0,0,0,0,0},19,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},29,0,0,0,-1,FALSE}}; static const WCHAR test8[] = {0x0633, 0x0644, 0x0627, 0x0645,0}; - static const itemTest t81[2] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,0,0,0}}; + static const itemTest t81[2] = {{{0,0,0,0,0},0,1,1,1,arab_tag,FALSE},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; /* Syriac (Like Arabic )*/ static const WCHAR test9[] = {0x0710, 0x0712, 0x0712, 0x0714, '.',0}; - static const itemTest t91[3] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,0,0,0},{{0,0,0,0},5,0,0,0}}; - static const itemTest t92[3] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,1,1,1},{{0,0,0,0},5,0,0,0}}; + static const itemTest t91[3] = {{{0,0,0,0,0},0,1,1,1,syrc_tag,FALSE},{{0,0,0,0,0},4,0,0,0,0,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const itemTest t92[3] = {{{0,0,0,0,0},0,1,1,1,syrc_tag},{{0,0,0,0,0},4,1,1,1,0,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const itemTest t93[2] = {{{0,0,0,0,0},0,1,1,1,syrc_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const int b93[2] = {2,2}; static const WCHAR test10[] = {0x0717, 0x0718, 0x071a, 0x071b,0}; - static const itemTest t101[2] = {{{0,0,0,0},0,1,1,1},{{0,0,0,0},4,0,0,0}}; + static const itemTest t101[2] = {{{0,0,0,0,0},0,1,1,1,syrc_tag,FALSE},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; + + /* Devanagari */ + static const WCHAR test11[] = {0x0926, 0x0947, 0x0935, 0x0928, 0x093e, 0x0917, 0x0930, 0x0940}; + static const itemTest t111[2] = {{{0,0,0,0,0},0,0,0,0,deva_tag,FALSE},{{0,0,0,0,0},8,0,0,0,-1,FALSE}}; + static const itemTest t112[2] = {{{0,0,0,0,0},0,0,0,2,deva_tag,FALSE},{{0,0,0,0,0},8,0,0,0,-1,FALSE}}; + + /* Bengali */ + static const WCHAR test12[] = {0x09ac, 0x09be, 0x0982, 0x09b2, 0x09be}; + static const itemTest t121[2] = {{{0,0,0,0,0},0,0,0,0,beng_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const itemTest t122[2] = {{{0,0,0,0,0},0,0,0,2,beng_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + + /* Gurmukhi */ + static const WCHAR test13[] = {0x0a17, 0x0a41, 0x0a30, 0x0a2e, 0x0a41, 0x0a16, 0x0a40}; + static const itemTest t131[2] = {{{0,0,0,0,0},0,0,0,0,guru_tag,FALSE},{{0,0,0,0,0},7,0,0,0,-1,FALSE}}; + static const itemTest t132[2] = {{{0,0,0,0,0},0,0,0,2,guru_tag,FALSE},{{0,0,0,0,0},7,0,0,0,-1,FALSE}}; + + /* Gujarati */ + static const WCHAR test14[] = {0x0a97, 0x0ac1, 0x0a9c, 0x0ab0, 0x0abe, 0x0aa4, 0x0ac0}; + static const itemTest t141[2] = {{{0,0,0,0,0},0,0,0,0,gujr_tag,FALSE},{{0,0,0,0,0},7,0,0,0,-1,FALSE}}; + static const itemTest t142[2] = {{{0,0,0,0,0},0,0,0,2,gujr_tag,FALSE},{{0,0,0,0,0},7,0,0,0,-1,FALSE}}; + + /* Oriya */ + static const WCHAR test15[] = {0x0b13, 0x0b21, 0x0b3c, 0x0b3f, 0x0b06}; + static const itemTest t151[2] = {{{0,0,0,0,0},0,0,0,0,orya_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const itemTest t152[2] = {{{0,0,0,0,0},0,0,0,2,orya_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + + /* Tamil */ + static const WCHAR test16[] = {0x0ba4, 0x0bae, 0x0bbf, 0x0bb4, 0x0bcd}; + static const itemTest t161[2] = {{{0,0,0,0,0},0,0,0,0,taml_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const itemTest t162[2] = {{{0,0,0,0,0},0,0,0,2,taml_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + + /* Telugu */ + static const WCHAR test17[] = {0x0c24, 0x0c46, 0x0c32, 0x0c41, 0x0c17, 0x0c41}; + static const itemTest t171[2] = {{{0,0,0,0,0},0,0,0,0,telu_tag,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const itemTest t172[2] = {{{0,0,0,0,0},0,0,0,2,telu_tag,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + + /* Kannada */ + static const WCHAR test18[] = {0x0c95, 0x0ca8, 0x0ccd, 0x0ca8, 0x0ca1}; + static const itemTest t181[2] = {{{0,0,0,0,0},0,0,0,0,knda_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const itemTest t182[2] = {{{0,0,0,0,0},0,0,0,2,knda_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + + /* Malayalam */ + static const WCHAR test19[] = {0x0d2e, 0x0d32, 0x0d2f, 0x0d3e, 0x0d33, 0x0d02}; + static const itemTest t191[2] = {{{0,0,0,0,0},0,0,0,0,mlym_tag,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const itemTest t192[2] = {{{0,0,0,0,0},0,0,0,2,mlym_tag,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + + /* Diacritical */ + static const WCHAR test20[] = {0x0309,'a','b','c','d',0}; + static const itemTest t201[3] = {{{0,0,0,0,0},0,0,0,0,0x0,FALSE},{{0,0,0,0,0},1,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + static const itemTest t202[3] = {{{0,0,0,0,0},0,0,0,2,0,TRUE,{-1,1,1,1,-1}},{{0,0,0,0,0},1,0,0,2,latn_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + + static const WCHAR test21[] = {0x0710, 0x0712, 0x0308, 0x0712, 0x0714,0}; + static const itemTest t211[2] = {{{0,0,0,0,0},0,1,1,1,syrc_tag,FALSE},{{0,0,0,0,0},5,0,0,0,-1,FALSE}}; + + /* Latin Punctuation */ + static const WCHAR test22[] = {'#','$',',','!','\"','*',0}; + static const itemTest t221[3] = {{{0,0,0,0,0},0,0,0,0,latn_tag,FALSE},{{0,0,0,0,0},3,0,0,0,0,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const itemTest t222[3] = {{{0,0,0,0,0},0,1,1,1,latn_tag,FALSE},{{0,0,0,0,0},3,1,1,1,0,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const itemTest t223[2] = {{{0,0,0,0,0},0,1,1,1,latn_tag,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const int b222[2] = {1,1}; + static const int b223[2] = {2,2}; + + /* Number 2*/ + static const WCHAR test23[] = {'1','2','3',0x00b2,0x00b3,0x2070,0}; + static const itemTest t231[3] = {{{0,0,0,0,0},0,0,0,0,0,FALSE},{{0,0,0,0,0},3,0,0,0,0,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const itemTest t232[3] = {{{0,0,0,0,0},0,0,1,2,0,FALSE},{{0,0,0,0,0},3,0,1,2,0,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + + /* Myanmar */ + static const WCHAR test24[] = {0x1019,0x103c,0x1014,0x103a,0x1019,0x102c,0x1021,0x1000,0x1039,0x1001,0x101b,0x102c}; + static const itemTest t241[2] = {{{0,0,0,0,0},0,0,0,0,mymr_tag,FALSE},{{0,0,0,0,0},12,0,0,0,-1,FALSE}}; + static const itemTest t242[2] = {{{0,0,0,0,0},0,0,0,2,mymr_tag,TRUE,{-1,1,1,1,-1}},{{0,0,0,0,0},12,0,0,0,-1,FALSE}}; + + /* Tai Le */ + static const WCHAR test25[] = {0x1956,0x196d,0x1970,0x1956,0x196c,0x1973,0x1951,0x1968,0x1952,0x1970}; + static const itemTest t251[2] = {{{0,0,0,0,0},0,0,0,0,tale_tag,TRUE,{-1,-1,-1,-1,latn_tag}},{{0,0,0,0,0},10,0,0,0,-1,FALSE}}; + static const itemTest t252[2] = {{{0,0,0,0,0},0,0,0,2,tale_tag,TRUE,{-1,1,1,1,latn_tag}},{{0,0,0,0,0},10,0,0,0,-1,FALSE}}; + + /* New Tai Lue */ + static const WCHAR test26[] = {0x1992,0x19c4}; + static const itemTest t261[2] = {{{0,0,0,0,0},0,0,0,0,talu_tag,TRUE,{-1,-1,-1,-1,latn_tag}},{{0,0,0,0,0},2,0,0,0,-1,FALSE}}; + static const itemTest t262[2] = {{{0,0,0,0,0},0,0,0,2,talu_tag,TRUE,{-1,1,1,1,latn_tag}},{{0,0,0,0,0},2,0,0,0,-1,FALSE}}; + + /* Khmer */ + static const WCHAR test27[] = {0x1781,0x17c1,0x1798,0x179a,0x1797,0x17b6,0x179f,0x17b6}; + static const itemTest t271[2] = {{{0,0,0,0,0},0,0,0,0,khmr_tag,FALSE},{{0,0,0,0,0},8,0,0,0,-1,FALSE}}; + static const itemTest t272[2] = {{{0,0,0,0,0},0,0,0,2,khmr_tag,TRUE,{-1,1,1,1,-1}},{{0,0,0,0,0},8,0,0,0,-1,FALSE}}; + + /* CJK Han */ + static const WCHAR test28[] = {0x8bed,0x7d20,0x6587,0x5b57}; + static const itemTest t281[2] = {{{0,0,0,0,0},0,0,0,0,hani_tag,FALSE},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; + static const itemTest t282[2] = {{{0,0,0,0,0},0,0,0,2,hani_tag,FALSE},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; + + /* Ideographic */ + static const WCHAR test29[] = {0x2ff0,0x2ff3,0x2ffb,0x2ff0,0x65e5,0x65e5,0x5de5,0x7f51,0x4e02,0x4e5e}; + static const itemTest t291[3] = {{{0,0,0,0,0},0,0,0,0,hani_tag,FALSE},{{0,0,0,0,0},4,0,0,0,hani_tag,FALSE},{{0,0,0,0,0},10,0,0,0,-1,FALSE}}; + static const itemTest t292[3] = {{{0,0,0,0,0},0,1,1,1,hani_tag,FALSE},{{0,0,0,0,0},4,0,0,2,hani_tag,FALSE},{{0,0,0,0,0},10,0,0,0,-1,FALSE}}; + + /* Bopomofo */ + static const WCHAR test30[] = {0x3113,0x3128,0x3127,0x3123,0x3108,0x3128,0x310f,0x3120}; + static const itemTest t301[2] = {{{0,0,0,0,0},0,0,0,0,bopo_tag,FALSE},{{0,0,0,0,0},8,0,0,0,-1,FALSE}}; + static const itemTest t302[2] = {{{0,0,0,0,0},0,0,0,2,bopo_tag,FALSE},{{0,0,0,0,0},8,0,0,0,-1,FALSE}}; + + /* Kana */ + static const WCHAR test31[] = {0x3072,0x3089,0x304b,0x306a,0x30ab,0x30bf,0x30ab,0x30ca}; + static const itemTest t311[2] = {{{0,0,0,0,0},0,0,0,0,kana_tag,FALSE},{{0,0,0,0,0},8,0,0,0,-1,FALSE}}; + static const itemTest t312[2] = {{{0,0,0,0,0},0,0,0,2,kana_tag,FALSE},{{0,0,0,0,0},8,0,0,0,-1,FALSE}}; + static const int b311[2] = {2,2}; + static const int b312[2] = {2,2}; + + /* Hangul */ + static const WCHAR test32[] = {0xd55c,0xad6d,0xc5b4}; + static const itemTest t321[2] = {{{0,0,0,0,0},0,0,0,0,hang_tag,FALSE},{{0,0,0,0,0},3,0,0,0,-1,FALSE}}; + static const itemTest t322[2] = {{{0,0,0,0,0},0,0,0,2,hang_tag,FALSE},{{0,0,0,0,0},3,0,0,0,-1,FALSE}}; + + /* Yi */ + static const WCHAR test33[] = {0xa188,0xa320,0xa071,0xa0b7}; + static const itemTest t331[2] = {{{0,0,0,0,0},0,0,0,0,yi_tag,FALSE},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; + static const itemTest t332[2] = {{{0,0,0,0,0},0,0,0,2,yi_tag,FALSE},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; + + /* Ethiopic */ + static const WCHAR test34[] = {0x130d,0x12d5,0x12dd}; + static const itemTest t341[2] = {{{0,0,0,0,0},0,0,0,0,ethi_tag,FALSE},{{0,0,0,0,0},3,0,0,0,-1,FALSE}}; + static const itemTest t342[2] = {{{0,0,0,0,0},0,0,0,2,ethi_tag,FALSE},{{0,0,0,0,0},3,0,0,0,-1,FALSE}}; + static const int b342[2] = {2,2}; + + /* Mongolian */ + static const WCHAR test35[] = {0x182e,0x1823,0x1829,0x182d,0x1823,0x182f,0x0020,0x182a,0x1822,0x1834,0x1822,0x182d,0x180c}; + static const itemTest t351[2] = {{{0,0,0,0,0},0,0,0,0,mong_tag,FALSE},{{0,0,0,0,0},13,0,0,0,-1,FALSE}}; + static const itemTest t352[2] = {{{0,0,0,0,0},0,0,0,2,mong_tag,TRUE,{-1,1,1,1,-1}},{{0,0,0,0,0},13,0,0,0,-1,FALSE}}; + static const int b351[2] = {2,2}; + static const int b352[2] = {2,3}; + + /* Tifinagh */ + static const WCHAR test36[] = {0x2d5c,0x2d49,0x2d3c,0x2d49,0x2d4f,0x2d30,0x2d56}; + static const itemTest t361[2] = {{{0,0,0,0,0},0,0,0,0,tfng_tag,TRUE,{-1,-1,-1,-1,latn_tag}},{{0,0,0,0,0},7,0,0,0,-1,FALSE}}; + static const itemTest t362[2] = {{{0,0,0,0,0},0,0,0,2,tfng_tag,TRUE,{-1,1,1,1,latn_tag}},{{0,0,0,0,0},7,0,0,0,-1,FALSE}}; + + /* N'Ko */ + static const WCHAR test37[] = {0x07d2,0x07de,0x07cf}; + static const itemTest t371[2] = {{{0,0,0,0,0},0,1,1,1,nko_tag,TRUE,{-1,0,0,0,arab_tag}},{{0,0,0,0,0},3,0,0,0,-1,FALSE}}; + static const itemTest t372[2] = {{{0,0,0,0,0},0,1,1,1,nko_tag,TRUE,{-1,0,0,2,arab_tag}},{{0,0,0,0,0},3,0,0,0,-1,FALSE}}; + + /* Vai */ + static const WCHAR test38[] = {0xa559,0xa524}; + static const itemTest t381[2] = {{{0,0,0,0,0},0,0,0,0,vai_tag,TRUE,{-1,-1,-1,-1,latn_tag}},{{0,0,0,0,0},2,0,0,0,-1,FALSE}}; + static const itemTest t382[2] = {{{0,0,0,0,0},0,0,0,2,vai_tag,TRUE,{-1,1,1,1,latn_tag}},{{0,0,0,0,0},2,0,0,0,-1,FALSE}}; + + /* Cherokee */ + static const WCHAR test39[] = {0x13e3,0x13b3,0x13a9,0x0020,0x13a6,0x13ec,0x13c2,0x13af,0x13cd,0x13d7}; + static const itemTest t391[2] = {{{0,0,0,0,0},0,0,0,0,cher_tag,FALSE},{{0,0,0,0,0},10,0,0,0,-1,FALSE}}; + static const itemTest t392[2] = {{{0,0,0,0,0},0,0,0,2,cher_tag,TRUE,{-1,1,1,1,-1}},{{0,0,0,0,0},10,0,0,0,-1,FALSE}}; + + /* Canadian Aboriginal Syllabics */ + static const WCHAR test40[] = {0x1403,0x14c4,0x1483,0x144e,0x1450,0x1466}; + static const itemTest t401[2] = {{{0,0,0,0,0},0,0,0,0,cans_tag,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const itemTest t402[2] = {{{0,0,0,0,0},0,0,0,2,cans_tag,TRUE,{-1,1,1,1,-1}},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + + /* Ogham */ + static const WCHAR test41[] = {0x169b,0x1691,0x168c,0x1690,0x168b,0x169c}; + static const itemTest t411[2] = {{{0,0,0,0,0},0,0,0,0,ogam_tag,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const itemTest t412[4] = {{{0,0,0,0,0},0,1,1,1,ogam_tag,FALSE},{{0,0,0,0,0},1,0,0,2,ogam_tag,FALSE},{{0,0,0,0,0},5,1,1,1,ogam_tag,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const int b412[2] = {1,1}; + + /* Runic */ + static const WCHAR test42[] = {0x16a0,0x16a1,0x16a2,0x16a3,0x16a4,0x16a5}; + static const itemTest t421[2] = {{{0,0,0,0,0},0,0,0,0,runr_tag,FALSE},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + static const itemTest t422[4] = {{{0,0,0,0,0},0,0,0,2,runr_tag,TRUE,{-1,1,1,1,-1}},{{0,0,0,0,0},6,0,0,0,-1,FALSE}}; + + /* Braille */ + static const WCHAR test43[] = {0x280f,0x2817,0x2811,0x280d,0x280a,0x2811,0x2817}; + static const itemTest t431[2] = {{{0,0,0,0,0},0,0,0,0,brai_tag,FALSE},{{0,0,0,0,0},7,0,0,0,-1,FALSE}}; + static const itemTest t432[4] = {{{0,0,0,0,0},0,0,0,2,brai_tag,TRUE,{-1,1,1,1,-1}},{{0,0,0,0,0},7,0,0,0,-1,FALSE}}; + + /* Private and Surrogates Area */ + static const WCHAR test44[] = {0xe000, 0xe001, 0xd800, 0xd801}; + static const itemTest t441[3] = {{{0,0,0,0,0},0,0,0,0,0,FALSE},{{0,0,0,0,0},2,0,0,0,0,FALSE},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; + static const itemTest t442[4] = {{{0,0,0,0,0},0,0,0,2,0,TRUE,{-1,1,1,1,-1}},{{0,0,0,0,0},2,0,0,2,0,TRUE,{-1,1,1,1,-1}},{{0,0,0,0,0},4,0,0,0,-1,FALSE}}; + + /* Deseret */ + static const WCHAR test45[] = {0xd801,0xdc19,0xd801,0xdc32,0xd801,0xdc4c,0xd801,0xdc3c,0xd801,0xdc32,0xd801,0xdc4b,0xd801,0xdc2f,0xd801,0xdc4c,0xd801,0xdc3b,0xd801,0xdc32,0xd801,0xdc4a,0xd801,0xdc28}; + static const itemTest t451[2] = {{{0,0,0,0,0},0,0,0,0,dsrt_tag,TRUE,{-1,-1,-1,-1,0x0}},{{0,0,0,0,0},24,0,0,0,-1,FALSE}}; + static const itemTest t452[2] = {{{0,0,0,0,0},0,0,0,2,dsrt_tag,TRUE,{-1,1,1,1,0x0}},{{0,0,0,0,0},24,0,0,0,-1,FALSE}}; + + /* Osmanya */ + static const WCHAR test46[] = {0xd801,0xdc8b,0xd801,0xdc98,0xd801,0xdc88,0xd801,0xdc91,0xd801,0xdc9b,0xd801,0xdc92,0xd801,0xdc95,0xd801,0xdc80}; + static const itemTest t461[2] = {{{0,0,0,0,0},0,0,0,0,osma_tag,TRUE,{-1,-1,-1,-1,0x0}},{{0,0,0,0,0},16,0,0,0,-1,FALSE}}; + static const itemTest t462[2] = {{{0,0,0,0,0},0,0,0,2,osma_tag,TRUE,{-1,1,1,1,0x0}},{{0,0,0,0,0},16,0,0,0,-1,FALSE}}; + + /* Mathematical Alphanumeric Symbols */ + static const WCHAR test47[] = {0xd835,0xdc00,0xd835,0xdc35,0xd835,0xdc6a,0xd835,0xdc9f,0xd835,0xdcd4,0xd835,0xdd09,0xd835,0xdd3e,0xd835,0xdd73,0xd835,0xdda8,0xd835,0xdddd,0xd835,0xde12,0xd835,0xde47,0xd835,0xde7c}; + static const itemTest t471[2] = {{{0,0,0,0,0},0,0,0,0,math_tag,TRUE,{-1,-1,-1,-1,0x0}},{{0,0,0,0,0},26,0,0,0,-1,FALSE}}; + static const itemTest t472[2] = {{{0,0,0,0,0},0,0,0,2,math_tag,TRUE,{-1,1,1,1,0x0}},{{0,0,0,0,0},26,0,0,0,-1,FALSE}}; SCRIPT_ITEM items[15]; SCRIPT_CONTROL Control; SCRIPT_STATE State; HRESULT hr; + HMODULE usp10; int nItems; + usp10 = LoadLibraryA("usp10.dll"); + ok (usp10 != 0,"Unable to LoadLibrary on usp10.dll\n"); + pScriptItemizeOpenType = (void*)GetProcAddress(usp10, "ScriptItemizeOpenType"); + pScriptShapeOpenType = (void*)GetProcAddress(usp10, "ScriptShapeOpenType"); + pGetGlyphIndicesW = (void*)GetProcAddress(GetModuleHandleA("gdi32.dll"), "GetGlyphIndicesW"); + memset(&Control, 0, sizeof(Control)); memset(&State, 0, sizeof(State)); @@ -153,42 +484,847 @@ static void test_ScriptItemize( void ) hr = ScriptItemize(test1, 0, 10, NULL, NULL, items, &nItems); ok (hr == E_INVALIDARG, "ScriptItemize should return E_INVALIDARG if cInChars is 0\n"); - test_items_ok(test1,4,NULL,NULL,1,t11,FALSE); - test_items_ok(test2,16,NULL,NULL,6,t21,FALSE); - test_items_ok(test3,41,NULL,NULL,1,t31,FALSE); - test_items_ok(test4,12,NULL,NULL,5,t41,FALSE); - test_items_ok(test5,38,NULL,NULL,1,t51,FALSE); - test_items_ok(test6,5,NULL,NULL,2,t61,FALSE); - test_items_ok(test7,29,NULL,NULL,3,t71,FALSE); - test_items_ok(test8,4,NULL,NULL,1,t81,FALSE); - test_items_ok(test9,5,NULL,NULL,2,t91,FALSE); - test_items_ok(test10,4,NULL,NULL,1,t101,FALSE); + test_items_ok(test1,4,NULL,NULL,1,t11,FALSE,0); + test_items_ok(test1b,4,NULL,NULL,1,t1b1,FALSE,0); + test_items_ok(test1c,6,NULL,NULL,1,t1c1,FALSE,0); + test_items_ok(test2,16,NULL,NULL,6,t21,FALSE,0); + test_items_ok(test2b,11,NULL,NULL,4,t2b1,FALSE,0); + test_items_ok(test2c,11,NULL,NULL,4,t2c1,FALSE,0); + test_items_ok(test2d,11,NULL,NULL,4,t2d1,FALSE,0); + test_items_ok(test3,41,NULL,NULL,1,t31,FALSE,0); + test_items_ok(test4,12,NULL,NULL,5,t41,FALSE,0); + test_items_ok(test5,38,NULL,NULL,1,t51,FALSE,0); + test_items_ok(test6,5,NULL,NULL,2,t61,FALSE,0); + test_items_ok(test7,29,NULL,NULL,3,t71,FALSE,0); + test_items_ok(test8,4,NULL,NULL,1,t81,FALSE,0); + test_items_ok(test9,5,NULL,NULL,2,t91,FALSE,0); + test_items_ok(test10,4,NULL,NULL,1,t101,FALSE,0); + test_items_ok(test11,8,NULL,NULL,1,t111,FALSE,0); + test_items_ok(test12,5,NULL,NULL,1,t121,FALSE,0); + test_items_ok(test13,7,NULL,NULL,1,t131,FALSE,0); + test_items_ok(test14,7,NULL,NULL,1,t141,FALSE,0); + test_items_ok(test15,5,NULL,NULL,1,t151,FALSE,0); + test_items_ok(test16,5,NULL,NULL,1,t161,FALSE,0); + test_items_ok(test17,6,NULL,NULL,1,t171,FALSE,0); + test_items_ok(test18,5,NULL,NULL,1,t181,FALSE,0); + test_items_ok(test19,6,NULL,NULL,1,t191,FALSE,0); + test_items_ok(test20,5,NULL,NULL,2,t201,FALSE,0); + test_items_ok(test21,5,NULL,NULL,1,t211,FALSE,0); + test_items_ok(test22,6,NULL,NULL,2,t221,FALSE,0); + test_items_ok(test23,6,NULL,NULL,2,t231,FALSE,0); + test_items_ok(test24,12,NULL,NULL,1,t241,FALSE,0); + test_items_ok(test25,10,NULL,NULL,1,t251,FALSE,0); + test_items_ok(test26,2,NULL,NULL,1,t261,FALSE,0); + test_items_ok(test27,8,NULL,NULL,1,t271,FALSE,0); + test_items_ok(test28,4,NULL,NULL,1,t281,FALSE,0); + test_items_ok(test29,10,NULL,NULL,2,t291,FALSE,0); + test_items_ok(test30,8,NULL,NULL,1,t301,FALSE,0); + test_items_ok(test31,8,NULL,NULL,1,t311,FALSE,b311); + test_items_ok(test32,3,NULL,NULL,1,t321,FALSE,0); + test_items_ok(test33,4,NULL,NULL,1,t331,FALSE,0); + test_items_ok(test34,3,NULL,NULL,1,t341,FALSE,0); + test_items_ok(test35,13,NULL,NULL,1,t351,FALSE,b351); + test_items_ok(test36,7,NULL,NULL,1,t361,FALSE,0); + test_items_ok(test37,3,NULL,NULL,1,t371,FALSE,0); + test_items_ok(test38,2,NULL,NULL,1,t381,FALSE,0); + test_items_ok(test39,10,NULL,NULL,1,t391,FALSE,0); + test_items_ok(test40,6,NULL,NULL,1,t401,FALSE,0); + test_items_ok(test41,6,NULL,NULL,1,t411,FALSE,0); + test_items_ok(test42,6,NULL,NULL,1,t421,FALSE,0); + test_items_ok(test43,7,NULL,NULL,1,t431,FALSE,0); + test_items_ok(test44,4,NULL,NULL,2,t441,FALSE,0); + test_items_ok(test45,24,NULL,NULL,1,t451,FALSE,0); + test_items_ok(test46,16,NULL,NULL,1,t461,FALSE,0); + test_items_ok(test47,26,NULL,NULL,1,t471,FALSE,0); State.uBidiLevel = 0; - test_items_ok(test1,4,&Control,&State,1,t11,FALSE); - test_items_ok(test2,16,&Control,&State,4,t22,FALSE); - test_items_ok(test3,41,&Control,&State,1,t31,FALSE); - test_items_ok(test4,12,&Control,&State,5,t41,FALSE); - test_items_ok(test5,38,&Control,&State,1,t51,FALSE); - test_items_ok(test6,5,&Control,&State,2,t61,FALSE); - test_items_ok(test7,29,&Control,&State,3,t72,FALSE); - test_items_ok(test8,4,&Control,&State,1,t81,FALSE); - test_items_ok(test9,5,&Control,&State,2,t91,FALSE); - test_items_ok(test10,4,&Control,&State,1,t101,FALSE); + test_items_ok(test1,4,&Control,&State,1,t11,FALSE,0); + test_items_ok(test1b,4,&Control,&State,1,t1b1,FALSE,0); + test_items_ok(test1c,6,&Control,&State,1,t1c1,FALSE,0); + test_items_ok(test2,16,&Control,&State,4,t22,FALSE,0); + test_items_ok(test2b,11,&Control,&State,4,t2b1,FALSE,0); + test_items_ok(test2c,11,&Control,&State,5,t2c2,FALSE,0); + test_items_ok(test2d,11,&Control,&State,5,t2d2,FALSE,0); + test_items_ok(test3,41,&Control,&State,1,t31,FALSE,0); + test_items_ok(test4,12,&Control,&State,5,t41,FALSE,0); + test_items_ok(test5,38,&Control,&State,1,t51,FALSE,0); + test_items_ok(test6,5,&Control,&State,2,t61,FALSE,0); + test_items_ok(test7,29,&Control,&State,3,t72,FALSE,0); + test_items_ok(test8,4,&Control,&State,1,t81,FALSE,0); + test_items_ok(test9,5,&Control,&State,2,t91,FALSE,0); + test_items_ok(test10,4,&Control,&State,1,t101,FALSE,0); + test_items_ok(test11,8,&Control,&State,1,t111,FALSE,0); + test_items_ok(test12,5,&Control,&State,1,t121,FALSE,0); + test_items_ok(test13,7,&Control,&State,1,t131,FALSE,0); + test_items_ok(test14,7,&Control,&State,1,t141,FALSE,0); + test_items_ok(test15,5,&Control,&State,1,t151,FALSE,0); + test_items_ok(test16,5,&Control,&State,1,t161,FALSE,0); + test_items_ok(test17,6,&Control,&State,1,t171,FALSE,0); + test_items_ok(test18,5,&Control,&State,1,t181,FALSE,0); + test_items_ok(test19,6,&Control,&State,1,t191,FALSE,0); + test_items_ok(test20,5,&Control,&State,2,t201,FALSE,0); + test_items_ok(test21,5,&Control,&State,1,t211,FALSE,0); + test_items_ok(test22,6,&Control,&State,2,t221,FALSE,0); + test_items_ok(test23,6,&Control,&State,2,t231,FALSE,0); + test_items_ok(test24,12,&Control,&State,1,t241,FALSE,0); + test_items_ok(test25,10,&Control,&State,1,t251,FALSE,0); + test_items_ok(test26,2,&Control,&State,1,t261,FALSE,0); + test_items_ok(test27,8,&Control,&State,1,t271,FALSE,0); + test_items_ok(test28,4,&Control,&State,1,t281,FALSE,0); + test_items_ok(test29,10,&Control,&State,2,t291,FALSE,0); + test_items_ok(test30,8,&Control,&State,1,t301,FALSE,0); + test_items_ok(test31,8,&Control,&State,1,t311,FALSE,b311); + test_items_ok(test32,3,&Control,&State,1,t321,FALSE,0); + test_items_ok(test33,4,&Control,&State,1,t331,FALSE,0); + test_items_ok(test34,3,&Control,&State,1,t341,FALSE,0); + test_items_ok(test35,13,&Control,&State,1,t351,FALSE,b351); + test_items_ok(test36,7,&Control,&State,1,t361,FALSE,0); + test_items_ok(test37,3,&Control,&State,1,t371,FALSE,0); + test_items_ok(test38,2,&Control,&State,1,t381,FALSE,0); + test_items_ok(test39,10,&Control,&State,1,t391,FALSE,0); + test_items_ok(test40,6,&Control,&State,1,t401,FALSE,0); + test_items_ok(test41,6,&Control,&State,1,t411,FALSE,0); + test_items_ok(test42,6,&Control,&State,1,t421,FALSE,0); + test_items_ok(test43,7,&Control,&State,1,t431,FALSE,0); + test_items_ok(test44,4,&Control,&State,2,t441,FALSE,0); + test_items_ok(test45,24,&Control,&State,1,t451,FALSE,0); + test_items_ok(test46,16,&Control,&State,1,t461,FALSE,0); + test_items_ok(test47,26,&Control,&State,1,t471,FALSE,0); State.uBidiLevel = 1; - test_items_ok(test1,4,&Control,&State,1,t12,FALSE); - test_items_ok(test2,16,&Control,&State,4,t23,FALSE); - test_items_ok(test3,41,&Control,&State,1,t32,FALSE); - test_items_ok(test4,12,&Control,&State,4,t42,TRUE); - test_items_ok(test5,38,&Control,&State,1,t51,FALSE); - test_items_ok(test6,5,&Control,&State,2,t62,FALSE); - test_items_ok(test7,29,&Control,&State,3,t73,FALSE); - test_items_ok(test8,4,&Control,&State,1,t81,FALSE); - test_items_ok(test9,5,&Control,&State,2,t92,FALSE); - test_items_ok(test10,4,&Control,&State,1,t101,FALSE); + test_items_ok(test1,4,&Control,&State,1,t12,FALSE,0); + test_items_ok(test1b,4,&Control,&State,1,t1b2,FALSE,0); + test_items_ok(test1c,6,&Control,&State,3,t1c2,FALSE,0); + test_items_ok(test2,16,&Control,&State,4,t23,FALSE,0); + test_items_ok(test2b,11,&Control,&State,4,t2b2,FALSE,0); + test_items_ok(test2c,11,&Control,&State,4,t2c3,FALSE,0); + test_items_ok(test2d,11,&Control,&State,4,t2d3,FALSE,0); + test_items_ok(test3,41,&Control,&State,1,t32,FALSE,0); + test_items_ok(test4,12,&Control,&State,4,t42,FALSE,0); + test_items_ok(test5,38,&Control,&State,1,t51,FALSE,0); + test_items_ok(test6,5,&Control,&State,2,t62,FALSE,0); + test_items_ok(test7,29,&Control,&State,3,t73,FALSE,0); + test_items_ok(test8,4,&Control,&State,1,t81,FALSE,0); + test_items_ok(test9,5,&Control,&State,2,t92,FALSE,0); + test_items_ok(test10,4,&Control,&State,1,t101,FALSE,0); + test_items_ok(test11,8,&Control,&State,1,t112,FALSE,0); + test_items_ok(test12,5,&Control,&State,1,t122,FALSE,0); + test_items_ok(test13,7,&Control,&State,1,t132,FALSE,0); + test_items_ok(test14,7,&Control,&State,1,t142,FALSE,0); + test_items_ok(test15,5,&Control,&State,1,t152,FALSE,0); + test_items_ok(test16,5,&Control,&State,1,t162,FALSE,0); + test_items_ok(test17,6,&Control,&State,1,t172,FALSE,0); + test_items_ok(test18,5,&Control,&State,1,t182,FALSE,0); + test_items_ok(test19,6,&Control,&State,1,t192,FALSE,0); + test_items_ok(test20,5,&Control,&State,2,t202,FALSE,0); + test_items_ok(test21,5,&Control,&State,1,t211,FALSE,0); + test_items_ok(test22,6,&Control,&State,2,t222,FALSE,b222); + test_items_ok(test23,6,&Control,&State,2,t232,FALSE,0); + test_items_ok(test24,12,&Control,&State,1,t242,FALSE,0); + test_items_ok(test25,10,&Control,&State,1,t252,FALSE,0); + test_items_ok(test26,2,&Control,&State,1,t262,FALSE,0); + test_items_ok(test27,8,&Control,&State,1,t272,FALSE,0); + test_items_ok(test28,4,&Control,&State,1,t282,FALSE,0); + test_items_ok(test29,10,&Control,&State,2,t292,FALSE,0); + test_items_ok(test30,8,&Control,&State,1,t302,FALSE,0); + test_items_ok(test31,8,&Control,&State,1,t312,FALSE,b312); + test_items_ok(test32,3,&Control,&State,1,t322,FALSE,0); + test_items_ok(test33,4,&Control,&State,1,t332,FALSE,0); + test_items_ok(test34,3,&Control,&State,1,t342,FALSE,b342); + test_items_ok(test35,13,&Control,&State,1,t352,FALSE,b352); + test_items_ok(test36,7,&Control,&State,1,t362,FALSE,0); + test_items_ok(test37,3,&Control,&State,1,t372,FALSE,0); + test_items_ok(test38,2,&Control,&State,1,t382,FALSE,0); + test_items_ok(test39,10,&Control,&State,1,t392,FALSE,0); + test_items_ok(test40,6,&Control,&State,1,t402,FALSE,0); + test_items_ok(test41,6,&Control,&State,3,t412,FALSE,b412); + test_items_ok(test42,6,&Control,&State,1,t422,FALSE,0); + test_items_ok(test43,7,&Control,&State,1,t432,FALSE,0); + test_items_ok(test44,4,&Control,&State,2,t442,FALSE,0); + test_items_ok(test45,24,&Control,&State,1,t452,FALSE,0); + test_items_ok(test46,16,&Control,&State,1,t462,FALSE,0); + test_items_ok(test47,26,&Control,&State,1,t472,FALSE,0); + + State.uBidiLevel = 1; + Control.fMergeNeutralItems = TRUE; + test_items_ok(test1,4,&Control,&State,1,t12,FALSE,0); + test_items_ok(test1b,4,&Control,&State,1,t1b2,FALSE,0); + test_items_ok(test1c,6,&Control,&State,3,t1c2,FALSE,0); + test_items_ok(test2,16,&Control,&State,4,t23,FALSE,0); + test_items_ok(test2b,11,&Control,&State,2,t2b3,FALSE,b2); + test_items_ok(test2c,11,&Control,&State,2,t2c4,FALSE,b2); + test_items_ok(test2d,11,&Control,&State,2,t2d4,FALSE,b2); + test_items_ok(test3,41,&Control,&State,1,t32,FALSE,0); + test_items_ok(test4,12,&Control,&State,3,t43,FALSE,b43); + test_items_ok(test5,38,&Control,&State,1,t51,FALSE,0); + test_items_ok(test6,5,&Control,&State,1,t63,FALSE,b63); + test_items_ok(test7,29,&Control,&State,3,t73,FALSE,0); + test_items_ok(test8,4,&Control,&State,1,t81,FALSE,0); + test_items_ok(test9,5,&Control,&State,1,t93,FALSE,b93); + test_items_ok(test10,4,&Control,&State,1,t101,FALSE,0); + test_items_ok(test11,8,&Control,&State,1,t112,FALSE,0); + test_items_ok(test12,5,&Control,&State,1,t122,FALSE,0); + test_items_ok(test13,7,&Control,&State,1,t132,FALSE,0); + test_items_ok(test14,7,&Control,&State,1,t142,FALSE,0); + test_items_ok(test15,5,&Control,&State,1,t152,FALSE,0); + test_items_ok(test16,5,&Control,&State,1,t162,FALSE,0); + test_items_ok(test17,6,&Control,&State,1,t172,FALSE,0); + test_items_ok(test18,5,&Control,&State,1,t182,FALSE,0); + test_items_ok(test19,6,&Control,&State,1,t192,FALSE,0); + test_items_ok(test20,5,&Control,&State,2,t202,FALSE,0); + test_items_ok(test21,5,&Control,&State,1,t211,FALSE,0); + test_items_ok(test22,6,&Control,&State,1,t223,FALSE,b223); + test_items_ok(test23,6,&Control,&State,2,t232,FALSE,0); + test_items_ok(test24,12,&Control,&State,1,t242,FALSE,0); + test_items_ok(test25,10,&Control,&State,1,t252,FALSE,0); + test_items_ok(test26,2,&Control,&State,1,t262,FALSE,0); + test_items_ok(test27,8,&Control,&State,1,t272,FALSE,0); + test_items_ok(test28,4,&Control,&State,1,t282,FALSE,0); + test_items_ok(test29,10,&Control,&State,2,t292,FALSE,0); + test_items_ok(test30,8,&Control,&State,1,t302,FALSE,0); + test_items_ok(test31,8,&Control,&State,1,t312,FALSE,b312); + test_items_ok(test32,3,&Control,&State,1,t322,FALSE,0); + test_items_ok(test33,4,&Control,&State,1,t332,FALSE,0); + test_items_ok(test34,3,&Control,&State,1,t342,FALSE,b342); + test_items_ok(test35,13,&Control,&State,1,t352,FALSE,b352); + test_items_ok(test36,7,&Control,&State,1,t362,FALSE,0); + test_items_ok(test37,3,&Control,&State,1,t372,FALSE,0); + test_items_ok(test38,2,&Control,&State,1,t382,FALSE,0); + test_items_ok(test39,10,&Control,&State,1,t392,FALSE,0); + test_items_ok(test40,6,&Control,&State,1,t402,FALSE,0); + test_items_ok(test41,6,&Control,&State,3,t412,FALSE,b412); + test_items_ok(test42,6,&Control,&State,1,t422,FALSE,0); + test_items_ok(test43,7,&Control,&State,1,t432,FALSE,0); + test_items_ok(test44,4,&Control,&State,2,t442,FALSE,0); + test_items_ok(test45,24,&Control,&State,1,t452,FALSE,0); + test_items_ok(test46,16,&Control,&State,1,t462,FALSE,0); + test_items_ok(test47,26,&Control,&State,1,t472,FALSE,0); } +static inline void _test_shape_ok(int valid, HDC hdc, LPCWSTR string, + DWORD cchString, SCRIPT_CONTROL *Control, + SCRIPT_STATE *State, DWORD item, DWORD nGlyphs, + const shapeTest_char* charItems, + const shapeTest_glyph* glyphItems) +{ + HRESULT hr; + int x, outnItems=0, outnGlyphs=0; + SCRIPT_ITEM outpItems[15]; + SCRIPT_CACHE sc = NULL; + WORD *glyphs; + WORD *logclust; + int maxGlyphs = cchString * 1.5; + SCRIPT_GLYPHPROP *glyphProp; + SCRIPT_CHARPROP *charProp; + ULONG tags[15]; + + hr = pScriptItemizeOpenType(string, cchString, 15, Control, State, outpItems, tags, &outnItems); + if (hr == USP_E_SCRIPT_NOT_IN_FONT) + { + if (valid > 0) + winetest_win_skip("Select font does not support script\n"); + else + winetest_trace("Select font does not support script\n"); + return; + } + if (valid > 0) + winetest_ok(!hr, "ScriptItemizeOpenType should return S_OK not %08x\n", hr); + else if (hr) + winetest_trace("ScriptItemizeOpenType should return S_OK not %08x\n", hr); + + + if (outnItems <= item) + { + if (valid > 0) + winetest_win_skip("Did not get enough items\n"); + else + winetest_trace("Did not get enough items\n"); + return; + } + + logclust = HeapAlloc(GetProcessHeap(), 0, sizeof(WORD) * cchString); + memset(logclust,'a',sizeof(WORD) * cchString); + charProp = HeapAlloc(GetProcessHeap(), 0, sizeof(SCRIPT_CHARPROP) * cchString); + memset(charProp,'a',sizeof(SCRIPT_CHARPROP) * cchString); + glyphs = HeapAlloc(GetProcessHeap(), 0, sizeof(WORD) * maxGlyphs); + memset(glyphs,'a',sizeof(WORD) * cchString); + glyphProp = HeapAlloc(GetProcessHeap(), 0, sizeof(SCRIPT_GLYPHPROP) * maxGlyphs); + memset(glyphProp,'a',sizeof(SCRIPT_GLYPHPROP) * cchString); + + hr = pScriptShapeOpenType(hdc, &sc, &outpItems[item].a, tags[item], 0x00000000, NULL, NULL, 0, string, cchString, maxGlyphs, logclust, charProp, glyphs, glyphProp, &outnGlyphs); + if (valid > 0) + winetest_ok(hr == S_OK, "ScriptShapeOpenType failed (%x)\n",hr); + else if (hr != S_OK) + winetest_trace("ScriptShapeOpenType failed (%x)\n",hr); + if (FAILED(hr)) + return; + + for (x = 0; x < cchString; x++) + { + if (valid > 0) + winetest_ok(logclust[x] == charItems[x].wLogClust, "%i: invalid LogClust(%i)\n",x,logclust[x]); + else if (logclust[x] != charItems[x].wLogClust) + winetest_trace("%i: invalid LogClust(%i)\n",x,logclust[x]); + if (valid > 0) + winetest_ok(charProp[x].fCanGlyphAlone == charItems[x].CharProp.fCanGlyphAlone, "%i: invalid fCanGlyphAlone\n",x); + else if (charProp[x].fCanGlyphAlone != charItems[x].CharProp.fCanGlyphAlone) + winetest_trace("%i: invalid fCanGlyphAlone\n",x); + } + + if (valid > 0) + winetest_ok(nGlyphs == outnGlyphs, "got incorrect number of glyphs (%i)\n",outnGlyphs); + else if (nGlyphs != outnGlyphs) + winetest_trace("got incorrect number of glyphs (%i)\n",outnGlyphs); + for (x = 0; x < outnGlyphs; x++) + { + if (glyphItems[x].Glyph) + { + if (valid > 0) + winetest_ok(glyphs[x]!=0, "%i: Glyph not present when it should be\n",x); + else if (glyphs[x]==0) + winetest_trace("%i: Glyph not present when it should be\n",x); + } + else + { + if (valid > 0) + winetest_ok(glyphs[x]==0, "%i: Glyph present when it should not be\n",x); + else if (glyphs[x]!=0) + winetest_trace("%i: Glyph present when it should not be\n",x); + } + if (valid > 0) + winetest_ok(glyphProp[x].sva.uJustification == glyphItems[x].GlyphProp.sva.uJustification, "%i: uJustification incorrect (%i)\n",x,glyphProp[x].sva.uJustification); + else if (glyphProp[x].sva.uJustification != glyphItems[x].GlyphProp.sva.uJustification) + winetest_trace("%i: uJustification incorrect (%i)\n",x,glyphProp[x].sva.uJustification); + if (valid > 0) + winetest_ok(glyphProp[x].sva.fClusterStart == glyphItems[x].GlyphProp.sva.fClusterStart, "%i: fClusterStart incorrect (%i)\n",x,glyphProp[x].sva.fClusterStart); + else if (glyphProp[x].sva.fClusterStart != glyphItems[x].GlyphProp.sva.fClusterStart) + winetest_trace("%i: fClusterStart incorrect (%i)\n",x,glyphProp[x].sva.fClusterStart); + if (valid > 0) + winetest_ok(glyphProp[x].sva.fDiacritic == glyphItems[x].GlyphProp.sva.fDiacritic, "%i: fDiacritic incorrect (%i)\n",x,glyphProp[x].sva.fDiacritic); + else if (glyphProp[x].sva.fDiacritic != glyphItems[x].GlyphProp.sva.fDiacritic) + winetest_trace("%i: fDiacritic incorrect (%i)\n",x,glyphProp[x].sva.fDiacritic); + if (valid > 0) + winetest_ok(glyphProp[x].sva.fZeroWidth == glyphItems[x].GlyphProp.sva.fZeroWidth, "%i: fZeroWidth incorrect (%i)\n",x,glyphProp[x].sva.fZeroWidth); + else if (glyphProp[x].sva.fZeroWidth != glyphItems[x].GlyphProp.sva.fZeroWidth) + winetest_trace("%i: fZeroWidth incorrect (%i)\n",x,glyphProp[x].sva.fZeroWidth); + } + + HeapFree(GetProcessHeap(),0,logclust); + HeapFree(GetProcessHeap(),0,charProp); + HeapFree(GetProcessHeap(),0,glyphs); + HeapFree(GetProcessHeap(),0,glyphProp); + ScriptFreeCache(&sc); +} + +#define test_shape_ok(a,b,c,d,e,f,g,h,i) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _test_shape_ok(1,a,b,c,d,e,f,g,h,i) + +#define test_shape_ok_valid(v,a,b,c,d,e,f,g,h,i) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _test_shape_ok(v,a,b,c,d,e,f,g,h,i) + +typedef struct tagRangeP { + BYTE range; + LOGFONTA lf; +} fontEnumParam; + +static int CALLBACK enumFontProc( const LOGFONT *lpelfe, const TEXTMETRIC *lpntme, + DWORD FontType, LPARAM lParam) +{ + NEWTEXTMETRICEX *ntme = (NEWTEXTMETRICEX*)lpntme; + fontEnumParam *rp = (fontEnumParam*) lParam; + int idx = 0; + DWORD i; + DWORD mask = 0; + + if (FontType != TRUETYPE_FONTTYPE) + return 1; + + i = rp->range; + while (i > sizeof(DWORD)*8) + { + idx++; + i -= (sizeof(DWORD)*8); + } + if (idx > 3) + return 0; + + mask = 1 << i; + + if (ntme->ntmFontSig.fsUsb[idx] & mask) + { + memcpy(&(rp->lf),lpelfe,sizeof(LOGFONT)); + return 0; + } + return 1; +} + +static int _find_font_for_range(HDC hdc, const CHAR *recommended, BYTE range, const WCHAR check, HFONT *hfont, HFONT *origFont) +{ + int rc = 0; + fontEnumParam lParam; + + lParam.range = range; + memset(&lParam.lf,0,sizeof(LOGFONT)); + *hfont = NULL; + + if (recommended) + { + lstrcpyA(lParam.lf.lfFaceName, recommended); + if (!EnumFontFamiliesExA(hdc, &lParam.lf, enumFontProc, (LPARAM)&lParam, 0)) + { + *hfont = CreateFontIndirectA(&lParam.lf); + if (*hfont) + { + winetest_trace("using font %s\n",lParam.lf.lfFaceName); + rc = 1; + } + } + } + + if (!*hfont) + { + memset(&lParam.lf,0,sizeof(LOGFONT)); + lParam.lf.lfCharSet = DEFAULT_CHARSET; + + if (!EnumFontFamiliesExA(hdc, &lParam.lf, enumFontProc, (LPARAM)&lParam, 0) && lParam.lf.lfFaceName[0]) + { + *hfont = CreateFontIndirectA(&lParam.lf); + if (*hfont) + winetest_trace("trying font %s: failures will only be warnings\n",lParam.lf.lfFaceName); + } + } + + if (*hfont) + { + WORD glyph = 0; + + *origFont = SelectObject(hdc,*hfont); + if (pGetGlyphIndicesW && (pGetGlyphIndicesW(hdc, &check, 1, &glyph, 0) == GDI_ERROR || glyph ==0)) + { + winetest_trace(" Font fails to contain required glyphs\n"); + SelectObject(hdc,*origFont); + DeleteObject(*hfont); + *hfont=NULL; + rc = 0; + } + else if (!rc) + rc = -1; + } + else + winetest_trace("Failed to find usable font\n"); + + return rc; +} + +#define find_font_for_range(a,b,c,d,e,f) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _find_font_for_range(a,b,c,d,e,f) + +static void test_ScriptShapeOpenType(HDC hdc) +{ + HRESULT hr; + SCRIPT_CACHE sc = NULL; + WORD glyphs[4], logclust[4]; + SCRIPT_GLYPHPROP glyphProp[4]; + SCRIPT_ITEM items[2]; + ULONG tags[2]; + SCRIPT_CONTROL Control; + SCRIPT_STATE State; + int nb, outnItems; + HFONT hfont, hfont_orig; + int test_valid; + + static const WCHAR test1[] = {'w', 'i', 'n', 'e',0}; + static const shapeTest_char t1_c[] = {{0,{0,0}},{1,{0,0}},{2,{0,0}},{3,{0,0}}}; + static const shapeTest_glyph t1_g[] = { + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}} }; + + static const WCHAR test2[] = {0x202B, 'i', 'n', 0x202C,0}; + static const shapeTest_char t2_c[] = {{0,{0,0}},{1,{0,0}},{2,{0,0}},{3,{0,0}}}; + static const shapeTest_glyph t2_g[] = { + {0,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {0,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}} }; + + /* Hebrew */ + static const WCHAR test_hebrew[] = {0x05e9, 0x05dc, 0x05d5, 0x05dd,0}; + static const shapeTest_char hebrew_c[] = {{3,{0,0}},{2,{0,0}},{1,{0,0}},{0,{0,0}}}; + static const shapeTest_glyph hebrew_g[] = { + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}} }; + + /* Arabic */ + static const WCHAR test_arabic[] = {0x0633,0x0644,0x0627,0x0645,0}; + static const shapeTest_char arabic_c[] = {{2,{0,0}},{1,{0,0}},{1,{0,0}},{0,{0,0}}}; + static const shapeTest_glyph arabic_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_ARABIC_NORMAL,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_ARABIC_SEEN,1,0,0,0,0},0}} }; + + /* Thai */ + static const WCHAR test_thai[] = {0x0e2a, 0x0e04, 0x0e23, 0x0e34, 0x0e1b, 0x0e15, 0x0e4c, 0x0e44, 0x0e17, 0x0e22,}; + static const shapeTest_char thai_c[] = {{0,{0,0}},{1,{0,0}},{2,{0,0}},{2,{0,0}},{4,{0,0}},{5,{0,0}},{5,{0,0}},{7,{0,0}},{8,{0,0}},{9,{0,0}}}; + static const shapeTest_glyph thai_g[] = { + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,0,1,1,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,0,1,1,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}}; + + /* Syriac */ + static const WCHAR test_syriac[] = {0x0710, 0x0710, 0x0710, 0x0728, 0x0718, 0x0723,0}; + static const shapeTest_char syriac_c[] = {{5,{0,0}},{4,{0,0}},{3,{0,0}},{2,{0,0}},{1,{0,0}},{0,{0,0}}}; + static const shapeTest_glyph syriac_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}} }; + + /* Thaana */ + static const WCHAR test_thaana[] = {0x078a, 0x07ae, 0x0792, 0x07b0, 0x0020, 0x0796, 0x07aa, 0x0789, 0x07b0, 0x0795, 0x07ac, 0x0791, 0x07b0}; + static const shapeTest_char thaana_c[] = {{12,{0,0}},{12,{0,0}},{10,{0,0}},{10,{0,0}},{8,{1,0}},{7,{0,0}},{7,{0,0}},{5,{0,0}},{5,{0,0}},{3,{0,0}},{3,{0,0}},{1,{0,0}},{1,{0,0}}}; + static const shapeTest_glyph thaana_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,0,1,1,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,1,1,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,1,1,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,1,1,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,1,1,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,1,1,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}} }; + + /* Phags-pa */ + static const WCHAR test_phagspa[] = {0xa84f, 0xa861, 0xa843, 0x0020, 0xa863, 0xa861, 0xa859, 0x0020, 0xa850, 0xa85c, 0xa85e}; + static const shapeTest_char phagspa_c[] = {{0,{0,0}},{1,{0,0}},{2,{0,0}},{3,{1,0}},{4,{0,0}},{5,{0,0}},{6,{0,0}},{7,{1,0}},{8,{0,0}},{9,{0,0}},{10,{0,0}}}; + static const shapeTest_glyph phagspa_g[] = { + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}} }; + + /* Lao */ + static const WCHAR test_lao[] = {0x0ead, 0x0eb1, 0x0e81, 0x0eaa, 0x0ead, 0x0e99, 0x0ea5, 0x0eb2, 0x0ea7, 0}; + static const shapeTest_char lao_c[] = {{0,{0,0}},{0,{0,0}},{2,{0,0}},{3,{0,0}},{4,{0,0}},{5,{0,0}},{6,{0,0}},{7,{0,0}},{8,{0,0}}}; + static const shapeTest_glyph lao_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,0,1,1,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_CHARACTER,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}} }; + + /* Tibetan */ + static const WCHAR test_tibetan[] = {0x0f04, 0x0f05, 0x0f0e, 0x0020, 0x0f51, 0x0f7c, 0x0f53, 0x0f0b, 0x0f5a, 0x0f53, 0x0f0b, 0x0f51, 0x0f44, 0x0f0b, 0x0f54, 0x0f7c, 0x0f0d}; + static const shapeTest_char tibetan_c[] = {{0,{0,0}},{1,{0,0}},{2,{0,0}},{3,{1,0}},{4,{0,0}},{4,{0,0}},{6,{0,0}},{7,{0,0}},{8,{0,0}},{9,{0,0}},{10,{0,0}},{11,{0,0}},{12,{0,0}},{13,{0,0}},{14,{0,0}},{14,{0,0}},{16,{0,0}}}; + static const shapeTest_glyph tibetan_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_BLANK,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}} }; + + /* Devanagari */ + static const WCHAR test_devanagari[] = {0x0926, 0x0947, 0x0935, 0x0928, 0x093e, 0x0917, 0x0930, 0x0940}; + static const shapeTest_char devanagari_c[] = {{0,{0,0}},{0,{0,0}},{2,{0,0}},{3,{0,0}},{3,{0,0}},{5,{0,0}},{6,{0,0}},{6,{0,0}}}; + static const shapeTest_glyph devanagari_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}} }; + + /* Bengali */ + static const WCHAR test_bengali[] = {0x09ac, 0x09be, 0x0982, 0x09b2, 0x09be}; + static const shapeTest_char bengali_c[] = {{0,{0,0}},{0,{0,0}},{0,{0,0}},{3,{0,0}},{3,{0,0}}}; + static const shapeTest_glyph bengali_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}} }; + + /* Gurmukhi */ + static const WCHAR test_gurmukhi[] = {0x0a17, 0x0a41, 0x0a30, 0x0a2e, 0x0a41, 0x0a16, 0x0a40}; + static const shapeTest_char gurmukhi_c[] = {{0,{0,0}},{0,{0,0}},{2,{0,0}},{3,{0,0}},{3,{0,0}},{5,{0,0}},{5,{0,0}}}; + static const shapeTest_glyph gurmukhi_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}} }; + + /* Gujarati */ + static const WCHAR test_gujarati[] = {0x0a97, 0x0ac1, 0x0a9c, 0x0ab0, 0x0abe, 0x0aa4, 0x0ac0}; + static const shapeTest_char gujarati_c[] = {{0,{0,0}},{0,{0,0}},{2,{0,0}},{3,{0,0}},{3,{0,0}},{5,{0,0}},{5,{0,0}}}; + static const shapeTest_glyph gujarati_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}} }; + + /* Oriya */ + static const WCHAR test_oriya[] = {0x0b13, 0x0b21, 0x0b3c, 0x0b3f, 0x0b06}; + static const shapeTest_char oriya_c[] = {{0,{0,0}},{1,{0,0}},{1,{0,0}},{1,{0,0}},{3,{0,0}}}; + static const shapeTest_glyph oriya_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}} }; + + /* Tamil */ + static const WCHAR test_tamil[] = {0x0ba4, 0x0bae, 0x0bbf, 0x0bb4, 0x0bcd}; + static const shapeTest_char tamil_c[] = {{0,{0,0}},{1,{0,0}},{1,{0,0}},{3,{0,0}},{3,{0,0}}}; + static const shapeTest_glyph tamil_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}} }; + + /* Telugu */ + static const WCHAR test_telugu[] = {0x0c24, 0x0c46, 0x0c32, 0x0c41, 0x0c17, 0x0c41}; + static const shapeTest_char telugu_c[] = {{0,{0,0}},{0,{0,0}},{2,{0,0}},{2,{0,0}},{4,{0,0}},{4,{0,0}}}; + static const shapeTest_glyph telugu_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}} }; + + /* Malayalam */ + static const WCHAR test_malayalam[] = {0x0d2e, 0x0d32, 0x0d2f, 0x0d3e, 0x0d33, 0x0d02}; + static const shapeTest_char malayalam_c[] = {{0,{0,0}},{1,{0,0}},{2,{0,0}},{2,{0,0}},{4,{0,0}},{4,{0,0}}}; + static const shapeTest_glyph malayalam_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}} }; + + /* Kannada */ + static const WCHAR test_kannada[] = {0x0c95, 0x0ca8, 0x0ccd, 0x0ca8, 0x0ca1}; + static const shapeTest_char kannada_c[] = {{0,{0,0}},{1,{0,0}},{1,{0,0}},{1,{0,0}},{3,{0,0}}}; + static const shapeTest_glyph kannada_g[] = { + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,1,0,0,0,0},0}}, + {1,{{SCRIPT_JUSTIFY_NONE,0,0,0,0,0},0}} }; + + if (!pScriptItemizeOpenType || !pScriptShapeOpenType) + { + win_skip("ScriptShapeOpenType not available on this platform\n"); + return; + } + + memset(&Control, 0 , sizeof(Control)); + memset(&State, 0 , sizeof(State)); + + hr = pScriptItemizeOpenType(test1, 4, 2, &Control, &State, items, tags, &outnItems); + ok(!hr, "ScriptItemizeOpenType should return S_OK not %08x\n", hr); + ok(items[0].a.fNoGlyphIndex == FALSE, "fNoGlyphIndex TRUE\n"); + + hr = pScriptShapeOpenType(hdc, &sc, &items[0].a, tags[0], 0x00000000, NULL, NULL, 0, test1, 4, 4, NULL, NULL, glyphs, NULL, &nb); + ok(hr == E_INVALIDARG, "ScriptShapeOpenType should return E_INVALIDARG not %08x\n", hr); + + hr = pScriptShapeOpenType(hdc, &sc, &items[0].a, tags[0], 0x00000000, NULL, NULL, 0, test1, 4, 4, NULL, NULL, glyphs, glyphProp, NULL); + ok(hr == E_INVALIDARG, "ScriptShapeOpenType should return E_INVALIDARG not %08x\n", hr); + + hr = pScriptShapeOpenType(NULL, &sc, &items[0].a, tags[0], 0x00000000, NULL, NULL, 0, test1, 4, 4, NULL, NULL, glyphs, glyphProp, &nb); + ok(hr == E_INVALIDARG, "ScriptShapeOpenType should return E_PENDING not %08x\n", hr); + + hr = pScriptShapeOpenType(hdc, &sc, &items[0].a, tags[0], 0x00000000, NULL, NULL, 0, test1, 4, 4, NULL, NULL, glyphs, glyphProp, &nb); + ok( hr == E_INVALIDARG, + "ScriptShapeOpenType should return E_FAIL or E_INVALIDARG, not %08x\n", hr); + hr = pScriptShapeOpenType(hdc, &sc, &items[0].a, tags[0], 0x00000000, NULL, NULL, 0, test1, 4, 4, logclust, NULL, glyphs, glyphProp, &nb); + ok(hr == E_INVALIDARG, "ScriptShapeOpenType should return E_INVALIDARG not %08x\n", hr); + + ScriptFreeCache(&sc); + + test_shape_ok(hdc, test1, 4, &Control, &State, 0, 4, t1_c, t1_g); + test_shape_ok(hdc, test2, 4, &Control, &State, 1, 4, t2_c, t2_g); + + test_valid = find_font_for_range(hdc, "Microsoft Sans Serif", 11, test_hebrew[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_hebrew, 4, &Control, &State, 0, 4, hebrew_c, hebrew_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Microsoft Sans Serif", 13, test_arabic[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_arabic, 4, &Control, &State, 0, 3, arabic_c, arabic_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Microsoft Sans Serif", 24, test_thai[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_thai, 10, &Control, &State, 0, 10, thai_c, thai_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Estrangelo Edessa", 71, test_syriac[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_syriac, 6, &Control, &State, 0, 6, syriac_c, syriac_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "MV Boli", 72, test_thaana[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_thaana, 13, &Control, &State, 0, 13, thaana_c, thaana_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Microsoft PhagsPa", 53, test_phagspa[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_phagspa, 11, &Control, &State, 0, 11, phagspa_c, phagspa_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "DokChampa", 25, test_lao[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_lao, 9, &Control, &State, 0, 9, lao_c, lao_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Microsoft Himalaya", 70, test_tibetan[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_tibetan, 17, &Control, &State, 0, 17, tibetan_c, tibetan_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Mangal", 15, test_devanagari[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_devanagari, 8, &Control, &State, 0, 8, devanagari_c, devanagari_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Vrinda", 16, test_bengali[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_bengali, 5, &Control, &State, 0, 5, bengali_c, bengali_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Raavi", 17, test_gurmukhi[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_gurmukhi, 7, &Control, &State, 0, 7, gurmukhi_c, gurmukhi_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Shruti", 18, test_gujarati[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_gujarati, 7, &Control, &State, 0, 7, gujarati_c, gujarati_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Kalinga", 19, test_oriya[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_oriya, 5, &Control, &State, 0, 4, oriya_c, oriya_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Latha", 20, test_tamil[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_tamil, 5, &Control, &State, 0, 4, tamil_c, tamil_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Gautami", 21, test_telugu[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_telugu, 6, &Control, &State, 0, 6, telugu_c, telugu_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Kartika", 23, test_malayalam[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_malayalam, 6, &Control, &State, 0, 6, malayalam_c, malayalam_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } + + test_valid = find_font_for_range(hdc, "Tunga", 22, test_kannada[0], &hfont, &hfont_orig); + if (hfont != NULL) + { + test_shape_ok_valid(test_valid, hdc, test_kannada, 5, &Control, &State, 0, 4, kannada_c, kannada_g); + SelectObject(hdc, hfont_orig); + DeleteObject(hfont); + } +} static void test_ScriptShape(HDC hdc) { @@ -404,10 +1540,11 @@ static void test_ScriptItemIzeShapePlace(HDC hdc, unsigned short pwOutGlyphs[256 /* This test determines that the pointer returned by ScriptGetProperties is valid * by checking a known value in the table */ hr = ScriptGetProperties(&ppSp, &iMaxProps); + ok(hr == S_OK, "ScriptGetProperties failed: 0x%08x\n", hr); trace("number of script properties %d\n", iMaxProps); ok (iMaxProps > 0, "Number of scripts returned should not be 0\n"); if (iMaxProps > 0) - ok( ppSp[5]->langid == 9, "Langid[5] not = to 9\n"); /* Check a known value to ensure */ + ok( ppSp[0]->langid == 0, "Langid[0] not = to 0\n"); /* Check a known value to ensure */ /* ptrs work */ /* This is a valid test that will cause parsing to take place */ @@ -426,7 +1563,6 @@ static void test_ScriptItemIzeShapePlace(HDC hdc, unsigned short pwOutGlyphs[256 /* It would appear that we have a valid SCRIPT_ANALYSIS and can continue * ie. ScriptItemize has succeeded and that pItem has been set */ cInChars = 5; - cMaxItems = 255; if (hr == 0) { psc = NULL; /* must be null on first call */ cChars = cInChars; @@ -493,7 +1629,7 @@ static void test_ScriptItemIzeShapePlace(HDC hdc, unsigned short pwOutGlyphs[256 ok (hr == 0, "ScriptPlace should return 0 not (%08x)\n", hr); } } - hr = ScriptFreeCache( &psc); + ScriptFreeCache( &psc); ok (!psc, "psc is not null after ScriptFreeCache\n"); } @@ -633,7 +1769,7 @@ static void test_ScriptGetCMap(HDC hdc, unsigned short pwOutGlyphs[256]) ok (cnt == cInChars, "Translation not correct. WCHAR %d - %04x != %04x\n", cnt, pwOutGlyphs[cnt], pwOutGlyphs3[cnt]); - hr = ScriptFreeCache( &psc); + ScriptFreeCache( &psc); ok (!psc, "psc is not null after ScriptFreeCache\n"); cInChars = cChars = 4; @@ -664,7 +1800,7 @@ static void test_ScriptGetCMap(HDC hdc, unsigned short pwOutGlyphs[256]) ok(pwOutGlyphs3[7] == pwOutGlyphs2[7], "glyph not mirrored correctly\n"); ok(pwOutGlyphs3[8] == pwOutGlyphs2[8], "glyph not mirrored correctly\n"); - hr = ScriptFreeCache( &psc); + ScriptFreeCache( &psc); ok (!psc, "psc is not null after ScriptFreeCache\n"); } @@ -775,11 +1911,9 @@ static void test_ScriptTextOut(HDC hdc) /* It would appear that we have a valid SCRIPT_ANALYSIS and can continue * ie. ScriptItemize has succeeded and that pItem has been set */ cInChars = 5; - 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, @@ -895,11 +2029,9 @@ static void test_ScriptTextOut2(HDC hdc) /* It would appear that we have a valid SCRIPT_ANALYSIS and can continue * ie. ScriptItemize has succeeded and that pItem has been set */ cInChars = 5; - cMaxItems = 255; if (hr == 0) { psc = NULL; /* must be null on first call */ cChars = cInChars; - cMaxGlyphs = cInChars; cMaxGlyphs = 256; hr = ScriptShape(hdc2, &psc, TestItem1, cChars, cMaxGlyphs, &pItem[0].a, @@ -957,7 +2089,7 @@ static void test_ScriptTextOut3(HDC hdc) ABC pABC[256]; RECT rect; - /* This is to ensure that non exisiting glyphs are translated into a valid glyph number */ + /* This is to ensure that nonexistent glyphs are translated into a valid glyph number */ cInChars = 2; cMaxItems = 255; hr = ScriptItemize(TestItem1, cInChars, cMaxItems, NULL, NULL, pItem, &pcItems); @@ -973,11 +2105,9 @@ static void test_ScriptTextOut3(HDC hdc) /* 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, @@ -1007,31 +2137,126 @@ static void test_ScriptTextOut3(HDC hdc) } } +#define test_item_ScriptXtoX(a,b,c,d,e,f) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _test_item_ScriptXtoX(a,b,c,d,e,f) + +static void _test_item_ScriptXtoX(SCRIPT_ANALYSIS *psa, int cChars, int cGlyphs, const int* offsets, const WORD *pwLogClust, const int* piAdvance ) +{ + int iX, iCP; + int icChars, icGlyphs; + int piCP, piX; + HRESULT hr; + SCRIPT_VISATTR psva[10]; + int piTrailing; + BOOL fTrailing; + int direction; + + memset(psva,0,sizeof(psva)); + direction = (psa->fRTL)?-1:+1; + + for(iCP = 0; iCP < cChars; iCP++) + { + iX = offsets[iCP]; + icChars = cChars; + icGlyphs = cGlyphs; + hr = ScriptXtoCP(iX, icChars, icGlyphs, pwLogClust, psva, piAdvance, psa, &piCP, &piTrailing); + winetest_ok(hr == S_OK, "ScriptXtoCP: should return S_OK not %08x\n", hr); + winetest_ok(piCP == iCP, "ScriptXtoCP: iX=%d should return piCP=%d not %d\n", iX, iCP, piCP); + winetest_ok(piTrailing == 0, "ScriptXtoCP: iX=%d should return piTrailing=0 not %d\n", iX, piTrailing); + } + + for(iCP = 0; iCP < cChars; iCP++) + { + iX = offsets[iCP]+direction; + icChars = cChars; + icGlyphs = cGlyphs; + hr = ScriptXtoCP(iX, icChars, icGlyphs, pwLogClust, psva, piAdvance, psa, &piCP, &piTrailing); + winetest_ok(hr == S_OK, "ScriptXtoCP leading: should return S_OK not %08x\n", hr); + winetest_ok(piCP == iCP, "ScriptXtoCP leading: iX=%d should return piCP=%d not %d\n", iX, iCP, piCP); + winetest_ok(piTrailing == 0, "ScriptXtoCP leading: iX=%d should return piTrailing=0 not %d\n", iX, piTrailing); + } + + for(iCP = 0; iCP < cChars; iCP++) + { + iX = offsets[iCP+1]-direction; + icChars = cChars; + icGlyphs = cGlyphs; + hr = ScriptXtoCP(iX, icChars, icGlyphs, pwLogClust, psva, piAdvance, psa, &piCP, &piTrailing); + winetest_ok(hr == S_OK, "ScriptXtoCP trailing: should return S_OK not %08x\n", hr); + winetest_ok(piCP == iCP, "ScriptXtoCP trailing: iX=%d should return piCP=%d not %d\n", iX, iCP, piCP); + winetest_ok(piTrailing == 1, "ScriptXtoCP trailing: iX=%d should return piTrailing=1 not %d\n", iX, piTrailing); + } + + for(iCP = 0; iCP <= cChars+1; iCP++) + { + fTrailing = FALSE; + icChars = cChars; + icGlyphs = cGlyphs; + hr = ScriptCPtoX(iCP, fTrailing, icChars, icGlyphs, pwLogClust, psva, piAdvance, psa, &piX); + winetest_ok(hr == S_OK, "ScriptCPtoX: should return S_OK not %08x\n", hr); + winetest_ok(piX == offsets[iCP], + "ScriptCPtoX: iCP=%d should return piX=%d not %d\n", iCP, offsets[iCP], piX); + } + + for(iCP = 0; iCP <= cChars+1; iCP++) + { + fTrailing = TRUE; + icChars = cChars; + icGlyphs = cGlyphs; + hr = ScriptCPtoX(iCP, fTrailing, icChars, icGlyphs, pwLogClust, psva, piAdvance, psa, &piX); + winetest_ok(hr == S_OK, "ScriptCPtoX trailing: should return S_OK not %08x\n", hr); + winetest_ok(piX == offsets[iCP+1], + "ScriptCPtoX trailing: iCP=%d should return piX=%d not %d\n", iCP, offsets[iCP+1], piX); + } +} + static void test_ScriptXtoX(void) /**************************************************************************************** * This routine tests the ScriptXtoCP and ScriptCPtoX functions using static variables * ****************************************************************************************/ { - static const WCHAR test[] = {'t', 'e', 's', 't',0}; - SCRIPT_ITEM items[2]; - int iX, iCP; - int cChars; - int cGlyphs; - WORD pwLogClust[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + WORD pwLogClust[10] = {0, 0, 0, 1, 1, 2, 2, 3, 3, 3}; + WORD pwLogClust_RTL[10] = {3, 3, 3, 2, 2, 1, 1, 0, 0, 0}; + WORD pwLogClust_2[7] = {4, 3, 3, 2, 1, 0 ,0}; + int piAdvance[10] = {201, 190, 210, 180, 170, 204, 189, 195, 212, 203}; + int piAdvance_2[5] = {39, 26, 19, 17, 11}; + static const int offsets[13] = {0, 67, 134, 201, 296, 391, 496, 601, 1052, 1503, 1954, 1954, 1954}; + static const int offsets_RTL[13] = {781, 721, 661, 601, 496, 391, 296, 201, 134, 67, 0, 0, 0}; + static const int offsets_2[10] = {112, 101, 92, 84, 65, 39, 19, 0, 0, 0}; SCRIPT_VISATTR psva[10]; - int piAdvance[10] = {200, 190, 210, 180, 170, 204, 189, 195, 212, 203}; - int piCP, piX; + SCRIPT_ANALYSIS sa; + int iX; + int piCP; int piTrailing; - BOOL fTrailing; HRESULT hr; - hr = ScriptItemize(test, lstrlenW(test), sizeof(items)/sizeof(items[0]), NULL, NULL, items, NULL); - ok(!hr, "ScriptItemize should return S_OK not %08x\n", hr); + memset(&sa, 0 , sizeof(SCRIPT_ANALYSIS)); + memset(psva, 0, sizeof(psva)); - iX = -1; - cChars = 10; - cGlyphs = 10; - hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing); + sa.fRTL = FALSE; + hr = ScriptXtoCP(-1, 10, 10, pwLogClust, psva, piAdvance, &sa, &piCP, &piTrailing); + ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr); + if (piTrailing) + ok(piCP == -1, "Negative iX should return piCP=-1 not %d\n", piCP); + else /* win2k3 */ + ok(piCP == 10, "Negative iX should return piCP=10 not %d\n", piCP); + + for (iX = 0; iX <= 7; iX++) + { + WORD clust = 0; + INT advance = 16; + hr = ScriptXtoCP(iX, 1, 1, &clust, psva, &advance, &sa, &piCP, &piTrailing); + ok(piCP==0 && piTrailing==0,"%i should return 0(%i) and 0(%i)\n",iX, piCP,piTrailing); + } + for (iX = 8; iX < 16; iX++) + { + WORD clust = 0; + INT advance = 16; + hr = ScriptXtoCP(iX, 1, 1, &clust, psva, &advance, &sa, &piCP, &piTrailing); + ok(piCP==0 && piTrailing==1,"%i should return 0(%i) and 1(%i)\n",iX, piCP,piTrailing); + } + + sa.fRTL = TRUE; + hr = ScriptXtoCP(-1, 10, 10, pwLogClust_RTL, psva, piAdvance, &sa, &piCP, &piTrailing); ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr); if (piTrailing) ok(piCP == -1, "Negative iX should return piCP=-1 not %d\n", piCP); @@ -1039,118 +2264,31 @@ static void test_ScriptXtoX(void) ok(piCP == 10, "Negative iX should return piCP=10 not %d\n", piCP); iX = 1954; - cChars = 10; - cGlyphs = 10; - hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing); + hr = ScriptXtoCP(1954, 10, 10, pwLogClust_RTL, psva, piAdvance, &sa, &piCP, &piTrailing); ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr); - if (piTrailing) /* win2k3 */ - ok(piCP == -1, "Negative iX should return piCP=-1 not %d\n", piCP); - else - ok(piCP == 10, "Negative iX should return piCP=10 not %d\n", piCP); - - iX = 779; - cChars = 10; - cGlyphs = 10; - hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing); - ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr); - ok(piCP == 3 || - piCP == -1, /* win2k3 */ - "iX=%d should return piCP=3 or piCP=-1 not %d\n", iX, piCP); + ok(piCP == -1, "iX=%d should return piCP=-1 not %d\n", iX, piCP); ok(piTrailing == 1, "iX=%d should return piTrailing=1 not %d\n", iX, piTrailing); - iX = 780; - cChars = 10; - cGlyphs = 10; - hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing); - ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr); - ok(piCP == 3 || - piCP == -1, /* win2k3 */ - "iX=%d should return piCP=3 or piCP=-1 not %d\n", iX, piCP); - ok(piTrailing == 1, "iX=%d should return piTrailing=1 not %d\n", iX, piTrailing); + for (iX = 1; iX <= 8; iX++) + { + WORD clust = 0; + INT advance = 16; + hr = ScriptXtoCP(iX, 1, 1, &clust, psva, &advance, &sa, &piCP, &piTrailing); + ok(piCP==0 && piTrailing==1,"%i should return 0(%i) and 1(%i)\n",iX,piCP,piTrailing); + } + for (iX = 9; iX < 16; iX++) + { + WORD clust = 0; + INT advance = 16; + hr = ScriptXtoCP(iX, 1, 1, &clust, psva, &advance, &sa, &piCP, &piTrailing); + ok(piCP==0 && piTrailing==0,"%i should return 0(%i) and 0(%i)\n",iX,piCP,piTrailing); + } - iX = 868; - cChars = 10; - cGlyphs = 10; - hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing); - ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr); - ok(piCP == 4 || - piCP == -1, /* win2k3 */ - "iX=%d should return piCP=4 or piCP=-1 not %d\n", iX, piCP); - - iX = 0; - cChars = 10; - cGlyphs = 10; - hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing); - ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr); - ok(piCP == 0 || - piCP == 10, /* win2k3 */ - "iX=%d should return piCP=0 piCP=10 not %d\n", iX, piCP); - - iX = 195; - cChars = 10; - cGlyphs = 10; - hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing); - ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr); - ok(piCP == 0, "iX=%d should return piCP=0 not %d\n", iX, piCP); - - iX = 196; - cChars = 10; - cGlyphs = 10; - hr = ScriptXtoCP(iX, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piCP, &piTrailing); - ok(hr == S_OK, "ScriptXtoCP should return S_OK not %08x\n", hr); - ok(piCP == 1 || - piCP == 0, /* win2k3 */ - "iX=%d should return piCP=1 or piCP=0 not %d\n", iX, piCP); - - iCP=5; - fTrailing = FALSE; - cChars = 10; - cGlyphs = 10; - hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piX); - ok(hr == S_OK, "ScriptCPtoX should return S_OK not %08x\n", hr); - ok(piX == 976 || - piX == 100, /* win2k3 */ - "iCP=%d should return piX=976 or piX=100 not %d\n", iCP, piX); - - iCP=5; - fTrailing = TRUE; - cChars = 10; - cGlyphs = 10; - hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piX); - ok(hr == S_OK, "ScriptCPtoX should return S_OK not %08x\n", hr); - ok(piX == 1171 || - piX == 80, /* win2k3 */ - "iCP=%d should return piX=1171 or piX=80 not %d\n", iCP, piX); - - iCP=6; - fTrailing = FALSE; - cChars = 10; - cGlyphs = 10; - hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piX); - ok(hr == S_OK, "ScriptCPtoX should return S_OK not %08x\n", hr); - ok(piX == 1171 || - piX == 80, /* win2k3 */ - "iCP=%d should return piX=1171 or piX=80 not %d\n", iCP, piX); - - iCP=11; - fTrailing = FALSE; - cChars = 10; - cGlyphs = 10; - hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piX); - ok(hr == S_OK, "ScriptCPtoX should return S_OK not %08x\n", hr); - ok(piX == 1953 || - piX == 0, /* win2k3 */ - "iCP=%d should return piX=1953 or piX=0 not %d\n", iCP, piX); - - iCP=11; - fTrailing = TRUE; - cChars = 10; - cGlyphs = 10; - hr = ScriptCPtoX(iCP, fTrailing, cChars, cGlyphs, pwLogClust, psva, piAdvance, &items[0].a, &piX); - ok(hr == S_OK, "ScriptCPtoX should return S_OK not %08x\n", hr); - ok(piX == 1953 || - piX == 0, /* win2k3 */ - "iCP=%d should return piX=1953 or piX=0 not %d\n", iCP, piX); + sa.fRTL = FALSE; + test_item_ScriptXtoX(&sa, 10, 10, offsets, pwLogClust, piAdvance); + sa.fRTL = TRUE; + test_item_ScriptXtoX(&sa, 10, 10, offsets_RTL, pwLogClust_RTL, piAdvance); + test_item_ScriptXtoX(&sa, 7, 5, offsets_2, pwLogClust_2, piAdvance_2); } static void test_ScriptString(HDC hdc) @@ -1159,7 +2297,7 @@ static void test_ScriptString(HDC hdc) * * This set of tests are for the string functions of uniscribe. The ScriptStringAnalyse * function allocates memory pointed to by the SCRIPT_STRING_ANALYSIS ssa pointer. This - * memory if freed by ScriptStringFree. There needs to be a valid hdc for this as + * memory is freed by ScriptStringFree. There needs to be a valid hdc for this as * ScriptStringAnalyse calls ScriptSItemize, ScriptShape and ScriptPlace which require it. * */ @@ -1171,10 +2309,7 @@ static void test_ScriptString(HDC hdc) int Charset; DWORD Flags = SSA_GLYPHS; int ReqWidth = 100; - SCRIPT_CONTROL Control; - SCRIPT_STATE State; const int Dx[5] = {10, 10, 10, 10, 10}; - SCRIPT_TABDEF Tabdef; const BYTE InClass = 0; SCRIPT_STRING_ANALYSIS ssa = NULL; @@ -1193,20 +2328,20 @@ static void test_ScriptString(HDC hdc) Charset = -1; /* this flag indicates unicode input */ /* Test without hdc to get E_PENDING */ hr = ScriptStringAnalyse( NULL, teststr, len, Glyphs, Charset, Flags, - ReqWidth, &Control, &State, Dx, &Tabdef, - &InClass, &ssa); + ReqWidth, NULL, NULL, Dx, NULL, + &InClass, &ssa); ok(hr == E_PENDING, "ScriptStringAnalyse Stub should return E_PENDING not %08x\n", hr); /* test with hdc, this should be a valid test */ hr = ScriptStringAnalyse( hdc, teststr, len, Glyphs, Charset, Flags, - ReqWidth, &Control, &State, Dx, &Tabdef, + ReqWidth, NULL, NULL, Dx, NULL, &InClass, &ssa); ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr); ScriptStringFree(&ssa); /* test makes sure that a call with a valid pssa still works */ hr = ScriptStringAnalyse( hdc, teststr, len, Glyphs, Charset, Flags, - ReqWidth, &Control, &State, Dx, &Tabdef, + ReqWidth, NULL, NULL, Dx, NULL, &InClass, &ssa); ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr); ok(ssa != NULL, "ScriptStringAnalyse pssa should not be NULL\n"); @@ -1243,16 +2378,14 @@ static void test_ScriptStringXtoCP_CPtoX(HDC hdc) */ HRESULT hr; - WCHAR teststr1[] = {'T', 'e', 's', 't', 'e', 'a', 'b', ' ', 'a', '\0'}; + static const WCHAR teststr1[] = {0x05e9, 'i', 0x05dc, 'n', 0x05d5, 'e', 0x05dd, '.',0}; + static const BOOL rtl[] = {1, 0, 1, 0, 1, 0, 1, 0}; void *String = (WCHAR *) &teststr1; /* ScriptStringAnalysis needs void */ int String_len = (sizeof(teststr1)/sizeof(WCHAR))-1; int Glyphs = String_len * 2 + 16; /* size of buffer as recommended */ int Charset = -1; /* unicode */ DWORD Flags = SSA_GLYPHS; int ReqWidth = 100; - SCRIPT_CONTROL Control; - SCRIPT_STATE State; - SCRIPT_TABDEF Tabdef; const BYTE InClass = 0; SCRIPT_STRING_ANALYSIS ssa = NULL; @@ -1260,18 +2393,16 @@ static void test_ScriptStringXtoCP_CPtoX(HDC hdc) int iTrailing; int Cp; /* Character position in string */ int X; + int trail,lead; BOOL fTrailing; /* Test with hdc, this should be a valid test * Here we generate an SCRIPT_STRING_ANALYSIS that will be used as input to the * following character positions to X and X to character position functions. */ - memset(&Control, 0, sizeof(SCRIPT_CONTROL)); - memset(&State, 0, sizeof(SCRIPT_STATE)); - memset(&Tabdef, 0, sizeof(SCRIPT_TABDEF)); hr = ScriptStringAnalyse( hdc, String, String_len, Glyphs, Charset, Flags, - ReqWidth, &Control, &State, NULL, &Tabdef, + ReqWidth, NULL, NULL, NULL, NULL, &InClass, &ssa); ok(hr == S_OK || hr == E_INVALIDARG, /* NT */ @@ -1293,75 +2424,112 @@ static void test_ScriptStringXtoCP_CPtoX(HDC hdc) * returns the beginning of the next character and iTrailing is FALSE. So for this * loop iTrailing will be FALSE in both cases. */ - fTrailing = FALSE; - hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X); + hr = ScriptStringCPtoX(ssa, Cp, TRUE, &trail); ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr); - hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); - ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); - ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, X); - ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n", - iTrailing, X); - fTrailing = TRUE; - hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X); + hr = ScriptStringCPtoX(ssa, Cp, FALSE, &lead); ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr); - hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); - ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); + if (rtl[Cp]) + ok(lead > trail, "Leading values should be after trailing for rtl characters(%i)\n",Cp); + else + ok(lead < trail, "Trailing values should be after leading for ltr characters(%i)\n",Cp); - /* - * Check that character position returned by ScriptStringXtoCP in Ch matches the - * one input to ScriptStringCPtoX. This means that the Cp to X position and back - * again works - */ - ok(Cp + 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp + 1, Ch, X); - ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n", - iTrailing, X); + /* move by 1 pixel so that we are not inbetween 2 characters. That could result in being the lead of a rtl and + at the same time the trail of an ltr */ + + /* inside the leading edge */ + X = lead; + if (rtl[Cp]) X--; else X++; + hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); + ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, trail); + ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n", + iTrailing, X); + + /* inside the trailing edge */ + X = trail; + if (rtl[Cp]) X++; else X--; + hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); + ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, trail); + ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n", + iTrailing, X); + + /* outside the "trailing" edge */ + if (Cp < String_len-1) + { + if (rtl[Cp]) X = lead; else X = trail; + X++; + hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); + ok(Cp + 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp + 1, Ch, trail); + if (rtl[Cp+1]) + ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n", + iTrailing, X); + else + ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n", + iTrailing, X); + } + + /* outside the "leading" edge */ + if (Cp != 0) + { + if (rtl[Cp]) X = trail; else X = lead; + X--; + hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); + ok(Cp - 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp - 1, Ch, trail); + if (Cp != 0 && rtl[Cp-1]) + ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n", + iTrailing, X); + else + ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n", + iTrailing, X); + } } - /* - * This test is to check that if the X position is just inside the trailing edge of the - * character then iTrailing will indicate the trailing edge, ie. TRUE - */ - fTrailing = TRUE; - Cp = 3; - hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X); - ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr); - X--; /* put X just inside the trailing edge */ - hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); - ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); - ok(Cp == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp, Ch, X); - ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n", - iTrailing, X); - /* - * This test is to check that if the X position is just outside the trailing edge of the - * character then iTrailing will indicate the leading edge, ie. FALSE, and Ch will indicate - * the next character, ie. Cp + 1 - */ - fTrailing = TRUE; - Cp = 3; - hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X); - ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr); - X++; /* put X just outside the trailing edge */ - hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); - ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); - ok(Cp + 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp + 1, Ch, X); - ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = %d\n", - iTrailing, X); + /* Check beyond the leading boundary of the whole string */ + if (rtl[0]) + { + /* having a leading rtl character seems to confuse usp */ + /* this looks to be a windows bug we should emulate */ + hr = ScriptStringCPtoX(ssa, 0, TRUE, &X); + ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr); + X--; + hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); + ok(Ch == 1, "ScriptStringXtoCP should return Ch = 1 not %d for X outside leading edge when rtl\n", Ch); + ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = outside leading edge when rtl\n", + iTrailing); + } + else + { + hr = ScriptStringCPtoX(ssa, 0, FALSE, &X); + ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr); + X--; + hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); + ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); + ok(Ch == -1, "ScriptStringXtoCP should return Ch = -1 not %d for X outside leading edge\n", Ch); + ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = outside leading edge\n", + iTrailing); + } - /* - * This test is to check that if the X position is just outside the leading edge of the - * character then iTrailing will indicate the trailing edge, ie. TRUE, and Ch will indicate - * the next character down , ie. Cp - 1 - */ - fTrailing = FALSE; - Cp = 3; - hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X); - ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr); - X--; /* put X just outside the leading edge */ + /* Check beyond the end boundary of the whole string */ + if (rtl[String_len-1]) + { + hr = ScriptStringCPtoX(ssa, String_len-1, FALSE, &X); + ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr); + } + else + { + hr = ScriptStringCPtoX(ssa, String_len-1, TRUE, &X); + ok(hr == S_OK, "ScriptStringCPtoX should return S_OK not %08x\n", hr); + } + X++; hr = ScriptStringXtoCP(ssa, X, &Ch, &iTrailing); ok(hr == S_OK, "ScriptStringXtoCP should return S_OK not %08x\n", hr); - ok(Cp - 1 == Ch, "ScriptStringXtoCP should return Ch = %d not %d for X = %d\n", Cp - 1, Ch, X); - ok(iTrailing == TRUE, "ScriptStringXtoCP should return iTrailing = 1 not %d for X = %d\n", - iTrailing, X); + ok(Ch == String_len, "ScriptStringXtoCP should return Ch = %i not %d for X outside trailing edge\n", String_len, Ch); + ok(iTrailing == FALSE, "ScriptStringXtoCP should return iTrailing = 0 not %d for X = outside trailing edge\n", + iTrailing); /* * Cleanup the SSA for the next round of tests @@ -1374,17 +2542,17 @@ static void test_ScriptStringXtoCP_CPtoX(HDC hdc) * generate an SSA for the subsequent tests. */ hr = ScriptStringAnalyse( hdc, String, String_len, Glyphs, Charset, Flags, - ReqWidth, &Control, &State, NULL, &Tabdef, + ReqWidth, NULL, NULL, NULL, NULL, &InClass, &ssa); ok(hr == S_OK, "ScriptStringAnalyse should return S_OK not %08x\n", hr); /* * When ScriptStringCPtoX is called with a character position Cp that exceeds the - * string length, return E_INVALIDARG. This also invalidates the ssa so a + * string length, return E_INVALIDARG. This also invalidates the ssa so a * ScriptStringFree should also fail. */ fTrailing = FALSE; - Cp = String_len + 1; + Cp = String_len + 1; hr = ScriptStringCPtoX(ssa, Cp, fTrailing, &X); ok(hr == E_INVALIDARG, "ScriptStringCPtoX should return E_INVALIDARG not %08x\n", hr); @@ -1701,6 +2869,123 @@ static void test_newlines(void) ok(count == 4, "got %d expected 4\n", count); } +static void test_ScriptGetFontFunctions(HDC hdc) +{ + HRESULT hr; + pScriptGetFontScriptTags = (void*)GetProcAddress(GetModuleHandleA("usp10.dll"), "ScriptGetFontScriptTags"); + pScriptGetFontLanguageTags = (void*)GetProcAddress(GetModuleHandleA("usp10.dll"), "ScriptGetFontLanguageTags"); + pScriptGetFontFeatureTags = (void*)GetProcAddress(GetModuleHandleA("usp10.dll"), "ScriptGetFontFeatureTags"); + if (!pScriptGetFontScriptTags || !pScriptGetFontLanguageTags || !pScriptGetFontFeatureTags) + { + win_skip("ScriptGetFontScriptTags,ScriptGetFontLanguageTags or ScriptGetFontFeatureTags not available on this platform\n"); + } + else + { + SCRIPT_CACHE sc = NULL; + OPENTYPE_TAG tags[5]; + int count = 0; + int outnItems=0; + SCRIPT_ITEM outpItems[15]; + SCRIPT_CONTROL Control; + SCRIPT_STATE State; + static const WCHAR test_phagspa[] = {0xa84f, 0xa861, 0xa843, 0x0020, 0xa863, 0xa861, 0xa859, 0x0020, 0xa850, 0xa85c, 0xa85e}; + + hr = pScriptGetFontScriptTags(hdc, &sc, NULL, 0, NULL, NULL); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontScriptTags(hdc, &sc, NULL, 0, NULL, &count); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontScriptTags(hdc, &sc, NULL, 5, tags, NULL); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontScriptTags(hdc, &sc, NULL, 0, tags, &count); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontScriptTags(NULL, &sc, NULL, 5, tags, &count); + ok(hr == E_PENDING,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontScriptTags(hdc, &sc, NULL, 5, tags, &count); + ok((hr == S_OK || hr == E_OUTOFMEMORY),"Incorrect return code\n"); + if (hr == S_OK) + ok(count <= 5, "Count should be less or equal to 5 with S_OK return\n"); + else if (hr == E_OUTOFMEMORY) + ok(count == 0, "Count should be 0 with E_OUTOFMEMORY return\n"); + ok(sc != NULL, "ScriptCache should be initialized\n"); + + ScriptFreeCache(&sc); + sc = NULL; + + hr = pScriptGetFontLanguageTags(hdc, &sc, NULL, latn_tag, 0, NULL, NULL); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontLanguageTags(hdc, &sc, NULL, latn_tag, 0, NULL, &count); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontLanguageTags(hdc, &sc, NULL, latn_tag, 5, tags, NULL); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontLanguageTags(hdc, &sc, NULL, latn_tag, 0, tags, &count); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontLanguageTags(NULL, &sc, NULL, latn_tag, 5, tags, &count); + ok(hr == E_PENDING,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontLanguageTags(hdc, &sc, NULL, latn_tag, 5, tags, &count); + ok((hr == S_OK || hr == E_OUTOFMEMORY),"Incorrect return code\n"); + if (hr == S_OK) + ok(count <= 5, "Count should be less or equal to 5 with S_OK return\n"); + else if (hr == E_OUTOFMEMORY) + ok(count == 0, "Count should be 0 with E_OUTOFMEMORY return\n"); + + ScriptFreeCache(&sc); + sc = NULL; + + hr = pScriptGetFontFeatureTags(hdc, &sc, NULL, latn_tag, 0x0, 0, NULL, NULL); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontFeatureTags(hdc, &sc, NULL, latn_tag, 0x0, 0, NULL, &count); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontFeatureTags(hdc, &sc, NULL, latn_tag, 0x0, 5, tags, NULL); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontFeatureTags(hdc, &sc, NULL, latn_tag, 0x0, 0, tags, &count); + ok(hr == E_INVALIDARG,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontFeatureTags(NULL, &sc, NULL, latn_tag, 0x0, 5, tags, &count); + ok(hr == E_PENDING,"Incorrect return code\n"); + ok(sc == NULL, "ScriptCache should remain uninitialized\n"); + hr = pScriptGetFontFeatureTags(hdc, &sc, NULL, latn_tag, 0x0, 5, tags, &count); + ok((hr == S_OK || hr == E_OUTOFMEMORY),"Incorrect return code\n"); + if (hr == S_OK) + ok(count <= 5, "Count should be less or equal to 5 with S_OK return\n"); + else if (hr == E_OUTOFMEMORY) + ok(count == 0, "Count should be 0 with E_OUTOFMEMORY return\n"); + + memset(&Control, 0, sizeof(Control)); + memset(&State, 0, sizeof(State)); + + hr = ScriptItemize(test_phagspa, 10, 15, &Control, &State, outpItems, &outnItems); + ok(hr == S_OK, "ScriptItemize failed: 0x%08x\n", hr); + memset(tags,0,sizeof(tags)); + hr = pScriptGetFontScriptTags(hdc, &sc, &outpItems[0].a, 5, tags, &count); + ok( hr == USP_E_SCRIPT_NOT_IN_FONT || broken(hr == S_OK), "wrong return code\n"); + + hr = pScriptGetFontLanguageTags(hdc, &sc, NULL, dsrt_tag, 5, tags, &count); + ok( hr == S_OK, "wrong return code\n"); + hr = pScriptGetFontLanguageTags(hdc, &sc, &outpItems[0].a, dsrt_tag, 5, tags, &count); + ok( hr == E_INVALIDARG || broken(hr == S_OK), "wrong return code\n"); + + hr = pScriptGetFontFeatureTags(hdc, &sc, NULL, dsrt_tag, 0x0, 5, tags, &count); + ok( hr == S_OK, "wrong return code\n"); + hr = pScriptGetFontFeatureTags(hdc, &sc, &outpItems[0].a, dsrt_tag, 0x0, 5, tags, &count); + ok( hr == E_INVALIDARG || broken(hr == S_OK), "wrong return code\n"); + + ScriptFreeCache(&sc); + } +} + START_TEST(usp10) { HWND hwnd; @@ -1736,6 +3021,7 @@ START_TEST(usp10) test_ScriptCacheGetHeight(hdc); test_ScriptGetGlyphABCWidth(hdc); test_ScriptShape(hdc); + test_ScriptShapeOpenType(hdc); test_ScriptPlace(hdc); test_ScriptGetFontProperties(hdc); @@ -1752,6 +3038,8 @@ START_TEST(usp10) test_ScriptBreak(); test_newlines(); + test_ScriptGetFontFunctions(hdc); + ReleaseDC(hwnd, hdc); DestroyWindow(hwnd); } From 4e28716aca8125ffbbf63feda73e1584588c6fed Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 26 Jan 2012 15:19:24 +0000 Subject: [PATCH 095/289] [ComCtl32_wineTest] - Sync to Wine 1.3.37. svn path=/trunk/; revision=55206 --- rostests/winetests/comctl32/comboex.c | 87 ++- rostests/winetests/comctl32/datetime.c | 49 +- rostests/winetests/comctl32/dpa.c | 40 +- rostests/winetests/comctl32/header.c | 8 +- rostests/winetests/comctl32/imagelist.c | 791 ++++++++++++++++-------- rostests/winetests/comctl32/ipaddress.c | 1 - rostests/winetests/comctl32/listview.c | 577 ++++++++++++----- rostests/winetests/comctl32/misc.c | 7 - rostests/winetests/comctl32/monthcal.c | 611 +++++++++++++----- rostests/winetests/comctl32/mru.c | 390 +++++++++--- rostests/winetests/comctl32/msg.h | 4 +- rostests/winetests/comctl32/propsheet.c | 363 +++++++++-- rostests/winetests/comctl32/rebar.c | 445 ++++++++----- rostests/winetests/comctl32/resources.h | 1 + rostests/winetests/comctl32/status.c | 49 +- rostests/winetests/comctl32/tab.c | 407 +++++++++--- rostests/winetests/comctl32/toolbar.c | 575 ++++++++++++----- rostests/winetests/comctl32/tooltips.c | 24 +- rostests/winetests/comctl32/trackbar.c | 6 +- rostests/winetests/comctl32/treeview.c | 766 ++++++++++++++++++++--- rostests/winetests/comctl32/updown.c | 2 +- 21 files changed, 3909 insertions(+), 1294 deletions(-) diff --git a/rostests/winetests/comctl32/comboex.c b/rostests/winetests/comctl32/comboex.c index f9a42dfe604..172e56429d4 100644 --- a/rostests/winetests/comctl32/comboex.c +++ b/rostests/winetests/comctl32/comboex.c @@ -42,6 +42,8 @@ static BOOL (WINAPI *pSetWindowSubclass)(HWND, SUBCLASSPROC, UINT_PTR, DWORD_PTR #define MAX_CHARS 100 static char *textBuffer = NULL; +static BOOL received_end_edit = FALSE; + static HWND createComboEx(DWORD style) { return CreateWindowExA(0, WC_COMBOBOXEXA, NULL, style, 0, 0, 300, 300, hComboExParentWnd, NULL, hMainHinst, NULL); @@ -234,7 +236,8 @@ static void test_WM_LBUTTONDOWN(void) COMBOBOXINFO cbInfo; UINT x, y, item_height; LRESULT result; - int i, idx; + UINT i; + int idx; RECT rect; WCHAR buffer[3]; static const UINT choices[] = {8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72}; @@ -340,6 +343,7 @@ static void test_WM_LBUTTONDOWN(void) ok(idx == 4 || broken(idx == -1), /* win98 */ "Current Selection: expected %d, got %d\n", 4, idx); + ok(received_end_edit, "Expected to receive a CBEN_ENDEDIT message\n"); DestroyWindow(hComboEx); } @@ -379,6 +383,77 @@ static void test_CB_GETLBTEXT(void) DestroyWindow(hCombo); } +static void test_WM_WINDOWPOSCHANGING(void) +{ + HWND hCombo; + WINDOWPOS wp; + RECT rect; + int combo_height; + int ret; + + hCombo = createComboEx(WS_BORDER | WS_VISIBLE | WS_CHILD | CBS_DROPDOWN); + ok(hCombo != NULL, "createComboEx failed\n"); + ret = GetWindowRect(hCombo, &rect); + ok(ret, "GetWindowRect failed\n"); + combo_height = rect.bottom - rect.top; + ok(combo_height > 0, "wrong combo height\n"); + + /* Test height > combo_height */ + wp.x = rect.left; + wp.y = rect.top; + wp.cx = (rect.right - rect.left); + wp.cy = combo_height * 2; + wp.flags = 0; + wp.hwnd = hCombo; + wp.hwndInsertAfter = NULL; + + ret = SendMessageA(hCombo, WM_WINDOWPOSCHANGING, 0, (LPARAM)&wp); + ok(ret == 0, "expected 0, got %x\n", ret); + ok(wp.cy == combo_height, + "Expected height %d, got %d\n", combo_height, wp.cy); + + /* Test height < combo_height */ + wp.x = rect.left; + wp.y = rect.top; + wp.cx = (rect.right - rect.left); + wp.cy = combo_height / 2; + wp.flags = 0; + wp.hwnd = hCombo; + wp.hwndInsertAfter = NULL; + + ret = SendMessageA(hCombo, WM_WINDOWPOSCHANGING, 0, (LPARAM)&wp); + ok(ret == 0, "expected 0, got %x\n", ret); + ok(wp.cy == combo_height, + "Expected height %d, got %d\n", combo_height, wp.cy); + + ret = DestroyWindow(hCombo); + ok(ret, "DestroyWindow failed\n"); +} + +static LRESULT ComboExTestOnNotify(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + NMHDR *hdr = (NMHDR*)lParam; + switch(hdr->code){ + case CBEN_ENDEDITA: + { + NMCBEENDEDITA *edit_info = (NMCBEENDEDITA*)hdr; + if(edit_info->iWhy==CBENF_DROPDOWN){ + received_end_edit = TRUE; + } + break; + } + case CBEN_ENDEDITW: + { + NMCBEENDEDITW *edit_info = (NMCBEENDEDITW*)hdr; + if(edit_info->iWhy==CBENF_DROPDOWN){ + received_end_edit = TRUE; + } + break; + } + } + return 0; +} + static LRESULT CALLBACK ComboExTestWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { @@ -386,7 +461,8 @@ static LRESULT CALLBACK ComboExTestWndProc(HWND hWnd, UINT msg, WPARAM wParam, L case WM_DESTROY: PostQuitMessage(0); break; - + case WM_NOTIFY: + return ComboExTestOnNotify(hWnd,msg,wParam,lParam); default: return DefWindowProcA(hWnd, msg, wParam, lParam); } @@ -503,16 +579,16 @@ static void test_get_set_item(void) item.lParam = 0xdeadbeef; ret = SendMessage(hComboEx, CBEM_GETITEMA, 0, (LPARAM)&item); expect(TRUE, ret); - ok(item.lParam == 0, "Expected zero, got %ld\n", item.lParam); + ok(item.lParam == 0, "Expected zero, got %lx\n", item.lParam); - item.lParam = 0xdeadbeef; + item.lParam = 0x1abe11ed; ret = SendMessage(hComboEx, CBEM_SETITEMA, 0, (LPARAM)&item); expect(TRUE, ret); item.lParam = 0; ret = SendMessage(hComboEx, CBEM_GETITEMA, 0, (LPARAM)&item); expect(TRUE, ret); - ok(item.lParam == 0xdeadbeef, "Expected 0xdeadbeef, got %ld\n", item.lParam); + ok(item.lParam == 0x1abe11ed, "Expected 0x1abe11ed, got %lx\n", item.lParam); DestroyWindow(hComboEx); } @@ -527,6 +603,7 @@ START_TEST(comboex) test_comboboxex(); test_WM_LBUTTONDOWN(); test_CB_GETLBTEXT(); + test_WM_WINDOWPOSCHANGING(); test_comboboxex_subclass(); test_get_set_item(); diff --git a/rostests/winetests/comctl32/datetime.c b/rostests/winetests/comctl32/datetime.c index a97ab342dae..171da5ce594 100644 --- a/rostests/winetests/comctl32/datetime.c +++ b/rostests/winetests/comctl32/datetime.c @@ -204,22 +204,21 @@ static void test_dtm_set_format(void) static void test_mccolor_types(HWND hWndDateTime, int mccolor_type, const char* mccolor_name) { - LRESULT r; - COLORREF theColor, prevColor; + COLORREF theColor, prevColor, crColor; theColor=RGB(0,0,0); - r = SendMessage(hWndDateTime, DTM_SETMCCOLOR, mccolor_type, theColor); - ok(r != -1, "%s: Set RGB(0,0,0): Expected COLORREF of previous value, got %ld\n", mccolor_name, r); + crColor = SendMessage(hWndDateTime, DTM_SETMCCOLOR, mccolor_type, theColor); + ok(crColor != ~0u, "%s: Set RGB(0,0,0): Expected COLORREF of previous value, got %d\n", mccolor_name, crColor); prevColor=theColor; theColor=RGB(255,255,255); - r = SendMessage(hWndDateTime, DTM_SETMCCOLOR, mccolor_type, theColor); - ok(r==prevColor, "%s: Set RGB(255,255,255): Expected COLORREF of previous value, got %ld\n", mccolor_name, r); + crColor = SendMessage(hWndDateTime, DTM_SETMCCOLOR, mccolor_type, theColor); + ok(crColor==prevColor, "%s: Set RGB(255,255,255): Expected COLORREF of previous value, got %d\n", mccolor_name, crColor); prevColor=theColor; theColor=RGB(100,180,220); - r = SendMessage(hWndDateTime, DTM_SETMCCOLOR, mccolor_type, theColor); - ok(r==prevColor, "%s: Set RGB(100,180,220): Expected COLORREF of previous value, got %ld\n", mccolor_name, r); - r = SendMessage(hWndDateTime, DTM_GETMCCOLOR, mccolor_type, 0); - ok(r==theColor, "%s: GETMCCOLOR: Expected %d, got %ld\n", mccolor_name, theColor, r); + crColor = SendMessage(hWndDateTime, DTM_SETMCCOLOR, mccolor_type, theColor); + ok(crColor==prevColor, "%s: Set RGB(100,180,220): Expected COLORREF of previous value, got %d\n", mccolor_name, crColor); + crColor = SendMessage(hWndDateTime, DTM_GETMCCOLOR, mccolor_type, 0); + ok(crColor==theColor, "%s: GETMCCOLOR: Expected %d, got %d\n", mccolor_name, theColor, crColor); } static void test_dtm_set_and_get_mccolor(void) @@ -600,6 +599,15 @@ static void test_dtm_set_and_get_system_time(void) r = SendMessage(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt); expect(GDT_VALID, r); expect_systime(&ref, &getSt); + /* day invalid for current month */ + st = ref; + st.wDay = 30; + st.wMonth = 2; + r = SendMessage(hWnd, DTM_SETSYSTEMTIME, GDT_VALID, (LPARAM)&st); + expect(0, r); + r = SendMessage(hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)&getSt); + expect(GDT_VALID, r); + expect_systime(&ref, &getSt); /* day of week isn't validated */ st = ref; st.wDayOfWeek = 10; @@ -659,7 +667,7 @@ static void test_dtm_set_and_get_system_time(void) static void test_wm_set_get_text(void) { static const CHAR a_str[] = "a"; - char buff[16], time[16]; + CHAR buff[16], time[16], caltype[3]; HWND hWnd; LRESULT ret; @@ -673,10 +681,23 @@ static void test_wm_set_get_text(void) buff[0] = 0; ret = SendMessage(hWnd, WM_GETTEXT, sizeof(buff), (LPARAM)buff); - ok(strcmp(buff, a_str) != 0, "Expected text not to change, got %s\n", buff); + ok(strcmp(buff, a_str) != 0, "Expected text to change, got %s\n", buff); + ok(ret != 0, "Expected non-zero return value\n"); - GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL, time, sizeof(time)); - ok(!strcmp(buff, time), "Expected %s, got %s\n", time, buff); + SetLastError(0xdeadbeef); + ret = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ICALENDARTYPE, caltype, 3); + if (ret == 0) + skip("Must know local calendar type (%x)\n", GetLastError()); + else if (atoi(caltype) != CAL_GREGORIAN) + skip("DateTimePicker Control only supports Gregorian calendar (type: %s)\n", caltype); + else { + SetLastError(0xdeadbeef); + ret = GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL, time, sizeof(time)); + if (ret == 0) + skip("GetDateFormat failed, returned %ld, error %d\n", ret, GetLastError()); + else + ok(!strcmp(buff, time), "Expected %s, got %s\n", time, buff); + } DestroyWindow(hWnd); } diff --git a/rostests/winetests/comctl32/dpa.c b/rostests/winetests/comctl32/dpa.c index 419c1b14d0e..e3591397fd5 100644 --- a/rostests/winetests/comctl32/dpa.c +++ b/rostests/winetests/comctl32/dpa.c @@ -96,13 +96,13 @@ static BOOL InitFunctionPtrs(HMODULE hcomctl32) /* Callbacks */ static INT CALLBACK CB_CmpLT(PVOID p1, PVOID p2, LPARAM lp) { - ok(lp == 0xdeadbeef, "lp=%ld\n", lp); + ok(lp == 0x1abe11ed, "lp=%ld\n", lp); return p1 < p2 ? -1 : p1 > p2 ? 1 : 0; } static INT CALLBACK CB_CmpGT(PVOID p1, PVOID p2, LPARAM lp) { - ok(lp == 0xdeadbeef, "lp=%ld\n", lp); + ok(lp == 0x1abe11ed, "lp=%ld\n", lp); return p1 > p2 ? -1 : p1 < p2 ? 1 : 0; } @@ -115,14 +115,14 @@ static INT nMessages[4]; static PVOID CALLBACK CB_MergeInsertSrc(UINT op, PVOID p1, PVOID p2, LPARAM lp) { nMessages[op]++; - ok(lp == 0xdeadbeef, "lp=%ld\n", lp); + ok(lp == 0x1abe11ed, "lp=%ld\n", lp); return p1; } static PVOID CALLBACK CB_MergeDeleteOddSrc(UINT op, PVOID p1, PVOID p2, LPARAM lp) { nMessages[op]++; - ok(lp == 0xdeadbeef, "lp=%ld\n", lp); + ok(lp == 0x1abe11ed, "lp=%ld\n", lp); return ((PCHAR)p2)+1; } @@ -247,12 +247,12 @@ static void test_dpa(void) INT j, k; k = pDPA_GetPtrIndex(dpa, (PVOID)(INT_PTR)i); /* Linear searches should work on unsorted DPAs */ - j = pDPA_Search(dpa, (PVOID)(INT_PTR)i, 0, CB_CmpLT, 0xdeadbeef, 0); + j = pDPA_Search(dpa, (PVOID)(INT_PTR)i, 0, CB_CmpLT, 0x1abe11ed, 0); ok(j == k, "j=%d k=%d\n", j, k); } /* Sort DPA */ - ok(pDPA_Sort(dpa, CB_CmpGT, 0xdeadbeef), "\n"); + ok(pDPA_Sort(dpa, CB_CmpGT, 0x1abe11ed), "\n"); rc=CheckDPA(dpa, 0x654321, &dw); ok(rc, "dw=0x%x\n", dw); @@ -262,7 +262,7 @@ static void test_dpa(void) /* The old data should have been preserved */ rc=CheckDPA(dpa2, 0x654321, &dw2); ok(rc, "dw=0x%x\n", dw2); - ok(pDPA_Sort(dpa, CB_CmpLT, 0xdeadbeef), "\n"); + ok(pDPA_Sort(dpa, CB_CmpLT, 0x1abe11ed), "\n"); /* Test if the DPA itself was really copied */ rc=CheckDPA(dpa, 0x123456, &dw); @@ -284,14 +284,14 @@ static void test_dpa(void) /* The array is in order so ptr == index+1 */ j = pDPA_GetPtrIndex(dpa, (PVOID)(INT_PTR)i); ok(j+1 == i, "j=%d i=%d\n", j, i); - j = pDPA_Search(dpa, (PVOID)(INT_PTR)i, 0, CB_CmpLT, 0xdeadbeef, DPAS_SORTED); + j = pDPA_Search(dpa, (PVOID)(INT_PTR)i, 0, CB_CmpLT, 0x1abe11ed, DPAS_SORTED); ok(j+1 == i, "j=%d i=%d\n", j, i); /* Linear searches respect iStart ... */ - j = pDPA_Search(dpa, (PVOID)(INT_PTR)i, i+1, CB_CmpLT, 0xdeadbeef, 0); + j = pDPA_Search(dpa, (PVOID)(INT_PTR)i, i+1, CB_CmpLT, 0x1abe11ed, 0); ok(j == DPA_ERR, "j=%d\n", j); /* ... but for a binary search it's ignored */ - j = pDPA_Search(dpa, (PVOID)(INT_PTR)i, i+1, CB_CmpLT, 0xdeadbeef, DPAS_SORTED); + j = pDPA_Search(dpa, (PVOID)(INT_PTR)i, i+1, CB_CmpLT, 0x1abe11ed, DPAS_SORTED); ok(j+1 == i, "j=%d i=%d\n", j, i); } @@ -313,15 +313,15 @@ static void test_dpa(void) /* Check where to re-insert the deleted item */ i = pDPA_Search(dpa, (PVOID)3, 0, - CB_CmpLT, 0xdeadbeef, DPAS_SORTED|DPAS_INSERTAFTER); + CB_CmpLT, 0x1abe11ed, DPAS_SORTED|DPAS_INSERTAFTER); ok(i == 2, "i=%d\n", i); /* DPAS_INSERTBEFORE works just like DPAS_INSERTAFTER */ i = pDPA_Search(dpa, (PVOID)3, 0, - CB_CmpLT, 0xdeadbeef, DPAS_SORTED|DPAS_INSERTBEFORE); + CB_CmpLT, 0x1abe11ed, DPAS_SORTED|DPAS_INSERTBEFORE); ok(i == 2, "i=%d\n", i); /* without DPAS_INSERTBEFORE/AFTER */ i = pDPA_Search(dpa, (PVOID)3, 0, - CB_CmpLT, 0xdeadbeef, DPAS_SORTED); + CB_CmpLT, 0x1abe11ed, DPAS_SORTED); ok(i == -1, "i=%d\n", i); /* Re-insert the item */ @@ -334,7 +334,7 @@ static void test_dpa(void) * should be bogus */ for(i = 0; i < 6; i++) { - INT j = pDPA_Search(dpa, (PVOID)(INT_PTR)i, 0, CB_CmpGT, 0xdeadbeef, + INT j = pDPA_Search(dpa, (PVOID)(INT_PTR)i, 0, CB_CmpGT, 0x1abe11ed, DPAS_SORTED|DPAS_INSERTBEFORE); ok(j != i, "i=%d\n", i); } @@ -396,7 +396,7 @@ static void test_DPA_Merge(void) /* Delete all odd entries from dpa2 */ memset(nMessages, 0, sizeof(nMessages)); pDPA_Merge(dpa2, dpa, DPAM_INTERSECT, - CB_CmpLT, CB_MergeDeleteOddSrc, 0xdeadbeef); + CB_CmpLT, CB_MergeDeleteOddSrc, 0x1abe11ed); rc = CheckDPA(dpa2, 0x246, &dw); ok(rc, "dw=0x%x\n", dw); @@ -413,7 +413,7 @@ static void test_DPA_Merge(void) /* DPAM_INTERSECT - returning source while merging */ memset(nMessages, 0, sizeof(nMessages)); pDPA_Merge(dpa2, dpa, DPAM_INTERSECT, - CB_CmpLT, CB_MergeInsertSrc, 0xdeadbeef); + CB_CmpLT, CB_MergeInsertSrc, 0x1abe11ed); rc = CheckDPA(dpa2, 0x135, &dw); ok(rc, "dw=0x%x\n", dw); @@ -433,7 +433,7 @@ static void test_DPA_Merge(void) memset(nMessages, 0, sizeof(nMessages)); pDPA_Merge(dpa2, dpa, DPAM_UNION, - CB_CmpLT, CB_MergeInsertSrc, 0xdeadbeef); + CB_CmpLT, CB_MergeInsertSrc, 0x1abe11ed); rc = CheckDPA(dpa2, 0x123456, &dw); ok(rc || broken(!rc && dw == 0x23456), /* 4.7x */ @@ -448,7 +448,7 @@ static void test_DPA_Merge(void) /* Merge dpa3 into dpa2 and dpa */ memset(nMessages, 0, sizeof(nMessages)); pDPA_Merge(dpa, dpa3, DPAM_UNION|DPAM_SORTED, - CB_CmpLT, CB_MergeInsertSrc, 0xdeadbeef); + CB_CmpLT, CB_MergeInsertSrc, 0x1abe11ed); expect(3, nMessages[DPAMM_MERGE]); expect(0, nMessages[DPAMM_DELETE]); expect(3, nMessages[DPAMM_INSERT]); @@ -461,7 +461,7 @@ static void test_DPA_Merge(void) memset(nMessages, 0, sizeof(nMessages)); pDPA_Merge(dpa2, dpa3, DPAM_UNION|DPAM_SORTED, - CB_CmpLT, CB_MergeInsertSrc, 0xdeadbeef); + CB_CmpLT, CB_MergeInsertSrc, 0x1abe11ed); expect(3, nMessages[DPAMM_MERGE]); expect(0, nMessages[DPAMM_DELETE]); ok(nMessages[DPAMM_INSERT] == 3 || @@ -667,7 +667,7 @@ static void test_DPA_SaveStream(void) IStream* pStm = NULL; DWORD dwMode, dw; HRESULT hRes; - ULONG ret; + INT ret; INT i; BOOL rc; LARGE_INTEGER liZero; diff --git a/rostests/winetests/comctl32/header.c b/rostests/winetests/comctl32/header.c index d9b4a7329ff..08d5065bbcb 100644 --- a/rostests/winetests/comctl32/header.c +++ b/rostests/winetests/comctl32/header.c @@ -955,6 +955,7 @@ static void test_hdm_imageMessages(HWND hParent) { HIMAGELIST hImageList = ImageList_Create (4, 4, 0, 1, 0); HIMAGELIST hIml; + BOOL wasValid; HWND hChild; flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -977,6 +978,9 @@ static void test_hdm_imageMessages(HWND hParent) ok_sequence(sequences, HEADER_SEQ_INDEX, imageMessages_seq, "imageMessages sequence testing", FALSE); DestroyWindow(hChild); + + wasValid = ImageList_Destroy(hImageList); + ok(wasValid, "Header must not free image list at destruction!\n"); } static void test_hdm_filterMessages(HWND hParent) @@ -1024,10 +1028,6 @@ static void test_hdm_filterMessages(HWND hParent) else ok_sequence(sequences, HEADER_SEQ_INDEX, filterMessages_seq_noninteractive, "filterMessages sequence testing", FALSE); - /* Some Win9x versions don't send a WM_KILLFOCUS. - * Set the focus explicitly to the parent to avoid a crash. - */ - SetFocus(hParent); DestroyWindow(hChild); } diff --git a/rostests/winetests/comctl32/imagelist.c b/rostests/winetests/comctl32/imagelist.c index 5398201d708..b920b9aaf5b 100644 --- a/rostests/winetests/comctl32/imagelist.c +++ b/rostests/winetests/comctl32/imagelist.c @@ -254,7 +254,7 @@ static void check_bits(HWND hwnd, HIMAGELIST himl, int idx, int size, #endif /* VISIBLE */ } -static void testHotspot (void) +static void test_hotspot(void) { struct hotspot { int dx; @@ -328,7 +328,7 @@ static void testHotspot (void) DestroyWindow(hwnd); } -static BOOL DoTest1(void) +static void test_add_remove(void) { HIMAGELIST himl ; @@ -369,67 +369,42 @@ static BOOL DoTest1(void) /* remove one extra */ ok(!ImageList_Remove(himl,0),"removed nonexistent icon\n"); - /* check SetImageCount/GetImageCount */ - if (pImageList_SetImageCount) - { - ok(pImageList_SetImageCount(himl, 3), "couldn't increase image count\n"); - ok(ImageList_GetImageCount(himl) == 3, "invalid image count after increase\n"); - ok(pImageList_SetImageCount(himl, 1), "couldn't decrease image count\n"); - ok(ImageList_GetImageCount(himl) == 1, "invalid image count after decrease to 1\n"); - ok(pImageList_SetImageCount(himl, 0), "couldn't decrease image count\n"); - ok(ImageList_GetImageCount(himl) == 0, "invalid image count after decrease to 0\n"); - } - else - { - skip("skipped ImageList_SetImageCount tests\n"); - } - /* destroy it */ ok(ImageList_Destroy(himl),"destroy imagelist failed\n"); + ok(-1==ImageList_AddIcon((HIMAGELIST)0xdeadbeef, hicon1),"don't crash on bad handle\n"); + ok(DestroyIcon(hicon1),"icon 1 wasn't deleted\n"); ok(DestroyIcon(hicon2),"icon 2 wasn't deleted\n"); ok(DestroyIcon(hicon3),"icon 3 wasn't deleted\n"); - - return TRUE; } -static BOOL DoTest2(void) +static void test_imagecount(void) { - HIMAGELIST himl ; + HIMAGELIST himl; - HICON hicon1 ; - HICON hicon2 ; - HICON hicon3 ; + ok(0==ImageList_GetImageCount((HIMAGELIST)0xdeadbeef),"don't crash on bad handle\n"); + + if (!pImageList_SetImageCount) + { + win_skip("ImageList_SetImageCount not available\n"); + return; + } - /* create an imagelist to play with */ himl = ImageList_Create(84, 84, ILC_COLOR16, 0, 3); ok(himl!=0,"failed to create imagelist\n"); - /* load the icons to add to the image list */ - hicon1 = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); - ok(hicon1 != 0, "no hicon1\n"); - hicon2 = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); - ok(hicon2 != 0, "no hicon2\n"); - hicon3 = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); - ok(hicon3 != 0, "no hicon3\n"); + ok(pImageList_SetImageCount(himl, 3), "couldn't increase image count\n"); + ok(ImageList_GetImageCount(himl) == 3, "invalid image count after increase\n"); + ok(pImageList_SetImageCount(himl, 1), "couldn't decrease image count\n"); + ok(ImageList_GetImageCount(himl) == 1, "invalid image count after decrease to 1\n"); + ok(pImageList_SetImageCount(himl, 0), "couldn't decrease image count\n"); + ok(ImageList_GetImageCount(himl) == 0, "invalid image count after decrease to 0\n"); - /* add three */ - ok(0==ImageList_AddIcon(himl, hicon1),"failed to add icon1\n"); - ok(1==ImageList_AddIcon(himl, hicon2),"failed to add icon2\n"); - ok(2==ImageList_AddIcon(himl, hicon3),"failed to add icon3\n"); - - /* destroy it */ - ok(ImageList_Destroy(himl),"destroy imagelist failed\n"); - - ok(DestroyIcon(hicon1),"icon 1 wasn't deleted\n"); - ok(DestroyIcon(hicon2),"icon 2 wasn't deleted\n"); - ok(DestroyIcon(hicon3),"icon 3 wasn't deleted\n"); - - return TRUE; + ok(ImageList_Destroy(himl), "destroy imagelist failed\n"); } -static BOOL DoTest3(void) +static void test_DrawIndirect(void) { HIMAGELIST himl; @@ -444,7 +419,7 @@ static BOOL DoTest3(void) if (!pImageList_DrawIndirect) { win_skip("ImageList_DrawIndirect not available, skipping test\n"); - return TRUE; + return; } hwndfortest = create_a_window(); @@ -476,17 +451,14 @@ static BOOL DoTest3(void) memset(&imldp, 0, sizeof (imldp)); ok(!pImageList_DrawIndirect(&imldp), "zero data succeeded!\n"); - imldp.cbSize = sizeof (imldp); + imldp.cbSize = IMAGELISTDRAWPARAMS_V3_SIZE; ok(!pImageList_DrawIndirect(&imldp), "zero hdc succeeded!\n"); imldp.hdcDst = hdc; ok(!pImageList_DrawIndirect(&imldp),"zero himl succeeded!\n"); + imldp.himl = (HIMAGELIST)0xdeadbeef; + ok(!pImageList_DrawIndirect(&imldp),"bad himl succeeded!\n"); imldp.himl = himl; - if (!pImageList_DrawIndirect(&imldp)) - { - /* Earlier versions of native comctl32 use a smaller structure */ - imldp.cbSize -= 3 * sizeof(DWORD); - ok(pImageList_DrawIndirect(&imldp),"DrawIndirect should succeed\n"); - } + REDRAW(hwndfortest); WAIT; @@ -518,11 +490,9 @@ static BOOL DoTest3(void) ReleaseDC(hwndfortest, hdc); DestroyWindow(hwndfortest); - - return TRUE; } -static void testMerge(void) +static void test_merge(void) { HIMAGELIST himl1, himl2, hmerge; HICON hicon1; @@ -604,39 +574,37 @@ static void testMerge(void) struct my_IStream { - IStream is; + IStream IStream_iface; char *iml_data; /* written imagelist data */ ULONG iml_data_size; }; -static HRESULT STDMETHODCALLTYPE Test_Stream_QueryInterface( - IStream* This, - REFIID riid, - void** ppvObject) +static struct my_IStream *impl_from_IStream(IStream *iface) +{ + return CONTAINING_RECORD(iface, struct my_IStream, IStream_iface); +} + +static HRESULT STDMETHODCALLTYPE Test_Stream_QueryInterface(IStream *iface, REFIID riid, + void **ppvObject) { assert(0); return E_NOTIMPL; } -static ULONG STDMETHODCALLTYPE Test_Stream_AddRef( - IStream* This) +static ULONG STDMETHODCALLTYPE Test_Stream_AddRef(IStream *iface) { assert(0); return 2; } -static ULONG STDMETHODCALLTYPE Test_Stream_Release( - IStream* This) +static ULONG STDMETHODCALLTYPE Test_Stream_Release(IStream *iface) { assert(0); return 1; } -static HRESULT STDMETHODCALLTYPE Test_Stream_Read( - IStream* This, - void* pv, - ULONG cb, - ULONG* pcbRead) +static HRESULT STDMETHODCALLTYPE Test_Stream_Read(IStream *iface, void *pv, ULONG cb, + ULONG *pcbRead) { assert(0); return E_NOTIMPL; @@ -654,13 +622,10 @@ static BOOL allocate_storage(struct my_IStream *my_is, ULONG add) return my_is->iml_data ? TRUE : FALSE; } -static HRESULT STDMETHODCALLTYPE Test_Stream_Write( - IStream* This, - const void* pv, - ULONG cb, - ULONG* pcbWritten) +static HRESULT STDMETHODCALLTYPE Test_Stream_Write(IStream *iface, const void *pv, ULONG cb, + ULONG *pcbWritten) { - struct my_IStream *my_is = (struct my_IStream *)This; + struct my_IStream *my_is = impl_from_IStream(iface); ULONG current_iml_data_size = my_is->iml_data_size; if (!allocate_storage(my_is, cb)) return E_FAIL; @@ -671,82 +636,61 @@ static HRESULT STDMETHODCALLTYPE Test_Stream_Write( return S_OK; } -static HRESULT STDMETHODCALLTYPE Test_Stream_Seek( - IStream* This, - LARGE_INTEGER dlibMove, - DWORD dwOrigin, - ULARGE_INTEGER* plibNewPosition) +static HRESULT STDMETHODCALLTYPE Test_Stream_Seek(IStream *iface, LARGE_INTEGER dlibMove, + DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition) { assert(0); return E_NOTIMPL; } -static HRESULT STDMETHODCALLTYPE Test_Stream_SetSize( - IStream* This, - ULARGE_INTEGER libNewSize) +static HRESULT STDMETHODCALLTYPE Test_Stream_SetSize(IStream *iface, ULARGE_INTEGER libNewSize) { assert(0); return E_NOTIMPL; } -static HRESULT STDMETHODCALLTYPE Test_Stream_CopyTo( - IStream* This, - IStream* pstm, - ULARGE_INTEGER cb, - ULARGE_INTEGER* pcbRead, - ULARGE_INTEGER* pcbWritten) +static HRESULT STDMETHODCALLTYPE Test_Stream_CopyTo(IStream *iface, IStream *pstm, + ULARGE_INTEGER cb, ULARGE_INTEGER *pcbRead, + ULARGE_INTEGER *pcbWritten) { assert(0); return E_NOTIMPL; } -static HRESULT STDMETHODCALLTYPE Test_Stream_Commit( - IStream* This, - DWORD grfCommitFlags) +static HRESULT STDMETHODCALLTYPE Test_Stream_Commit(IStream *iface, DWORD grfCommitFlags) { assert(0); return E_NOTIMPL; } -static HRESULT STDMETHODCALLTYPE Test_Stream_Revert( - IStream* This) +static HRESULT STDMETHODCALLTYPE Test_Stream_Revert(IStream *iface) { assert(0); return E_NOTIMPL; } -static HRESULT STDMETHODCALLTYPE Test_Stream_LockRegion( - IStream* This, - ULARGE_INTEGER libOffset, - ULARGE_INTEGER cb, - DWORD dwLockType) +static HRESULT STDMETHODCALLTYPE Test_Stream_LockRegion(IStream *iface, ULARGE_INTEGER libOffset, + ULARGE_INTEGER cb, DWORD dwLockType) { assert(0); return E_NOTIMPL; } -static HRESULT STDMETHODCALLTYPE Test_Stream_UnlockRegion( - IStream* This, - ULARGE_INTEGER libOffset, - ULARGE_INTEGER cb, - DWORD dwLockType) +static HRESULT STDMETHODCALLTYPE Test_Stream_UnlockRegion(IStream *iface, ULARGE_INTEGER libOffset, + ULARGE_INTEGER cb, DWORD dwLockType) { assert(0); return E_NOTIMPL; } -static HRESULT STDMETHODCALLTYPE Test_Stream_Stat( - IStream* This, - STATSTG* pstatstg, - DWORD grfStatFlag) +static HRESULT STDMETHODCALLTYPE Test_Stream_Stat(IStream *iface, STATSTG *pstatstg, + DWORD grfStatFlag) { assert(0); return E_NOTIMPL; } -static HRESULT STDMETHODCALLTYPE Test_Stream_Clone( - IStream* This, - IStream** ppstm) +static HRESULT STDMETHODCALLTYPE Test_Stream_Clone(IStream *iface, IStream **ppstm) { assert(0); return E_NOTIMPL; @@ -774,30 +718,12 @@ static struct my_IStream Test_Stream = { { &Test_Stream_Vtbl }, 0, 0 }; static INT DIB_GetWidthBytes( int width, int bpp ) { - int words; - - switch (bpp) - { - case 1: words = (width + 31) / 32; break; - case 4: words = (width + 7) / 8; break; - case 8: words = (width + 3) / 4; break; - case 15: - case 16: words = (width + 1) / 2; break; - case 24: words = (width * 3 + 3)/4; break; - case 32: words = width; break; - - default: - words=0; - trace("Unknown depth %d, please report.\n", bpp ); - assert(0); - break; - } - return 4 * words; + return ((width * bpp + 31) / 8) & ~3; } -static void check_bitmap_data(const char *bm_data, ULONG bm_data_size, - INT width, INT height, INT bpp, - const char *comment) +static ULONG check_bitmap_data(const char *bm_data, ULONG bm_data_size, + INT width, INT height, INT bpp, + const char *comment) { const BITMAPFILEHEADER *bmfh = (const BITMAPFILEHEADER *)bm_data; const BITMAPINFOHEADER *bmih = (const BITMAPINFOHEADER *)(bm_data + sizeof(*bmfh)); @@ -830,9 +756,10 @@ static void check_bitmap_data(const char *bm_data, ULONG bm_data_size, fclose(f); } #endif + return hdr_size + image_size; } -static void check_ilhead_data(const char *ilh_data, INT cx, INT cy, INT cur, INT max, INT grow) +static void check_ilhead_data(const char *ilh_data, INT cx, INT cy, INT cur, INT max, INT grow, INT flags) { const ILHEAD *ilh = (const ILHEAD *)ilh_data; @@ -844,19 +771,12 @@ static void check_ilhead_data(const char *ilh_data, INT cx, INT cy, INT cur, INT ok(ilh->cx == cx, "wrong cx %d (expected %d)\n", ilh->cx, cx); ok(ilh->cy == cy, "wrong cy %d (expected %d)\n", ilh->cy, cy); ok(ilh->bkcolor == CLR_NONE, "wrong bkcolor %x\n", ilh->bkcolor); - ok(ilh->flags == ILC_COLOR24, "wrong flags %04x\n", ilh->flags); - ok(ilh->ovls[0] == -1 || - ilh->ovls[0] == 0, /* win95 */ - "wrong ovls[0] %04x\n", ilh->ovls[0]); - ok(ilh->ovls[1] == -1 || - ilh->ovls[1] == 0, /* win95 */ - "wrong ovls[1] %04x\n", ilh->ovls[1]); - ok(ilh->ovls[2] == -1 || - ilh->ovls[2] == 0, /* win95 */ - "wrong ovls[2] %04x\n", ilh->ovls[2]); - ok(ilh->ovls[3] == -1 || - ilh->ovls[3] == 0, /* win95 */ - "wrong ovls[3] %04x\n", ilh->ovls[3]); + ok(ilh->flags == flags || broken(!(ilh->flags & 0xfe) && (flags & 0xfe) == ILC_COLOR4), /* <= w2k */ + "wrong flags %04x\n", ilh->flags); + ok(ilh->ovls[0] == -1, "wrong ovls[0] %04x\n", ilh->ovls[0]); + ok(ilh->ovls[1] == -1, "wrong ovls[1] %04x\n", ilh->ovls[1]); + ok(ilh->ovls[2] == -1, "wrong ovls[2] %04x\n", ilh->ovls[2]); + ok(ilh->ovls[3] == -1, "wrong ovls[3] %04x\n", ilh->ovls[3]); } static HBITMAP create_bitmap(INT cx, INT cy, COLORREF color, const char *comment) @@ -899,9 +819,9 @@ static HBITMAP create_bitmap(INT cx, INT cy, COLORREF color, const char *comment Test_Stream.iml_data_size = 0; static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, INT grow, - INT width, INT height, INT bpp, const char *comment) + INT width, INT height, INT flags, const char *comment) { - INT ret, cxx, cyy; + INT ret, cxx, cyy, size; trace("%s\n", comment); @@ -914,23 +834,32 @@ static void check_iml_data(HIMAGELIST himl, INT cx, INT cy, INT cur, INT max, IN ok(cyy == cy, "wrong cy %d (expected %d)\n", cyy, cy); iml_clear_stream_data(); - ret = ImageList_Write(himl, &Test_Stream.is); + ret = ImageList_Write(himl, &Test_Stream.IStream_iface); ok(ret, "ImageList_Write failed\n"); ok(Test_Stream.iml_data != 0, "ImageList_Write didn't write any data\n"); ok(Test_Stream.iml_data_size > sizeof(ILHEAD), "ImageList_Write wrote not enough data\n"); - check_ilhead_data(Test_Stream.iml_data, cx, cy, cur, max, grow); - check_bitmap_data(Test_Stream.iml_data + sizeof(ILHEAD), - Test_Stream.iml_data_size - sizeof(ILHEAD), - width, height, bpp, comment); + check_ilhead_data(Test_Stream.iml_data, cx, cy, cur, max, grow, flags); + size = check_bitmap_data(Test_Stream.iml_data + sizeof(ILHEAD), + Test_Stream.iml_data_size - sizeof(ILHEAD), + width, height, flags & 0xfe, comment); + if (size < Test_Stream.iml_data_size - sizeof(ILHEAD)) /* mask is present */ + { + ok( flags & ILC_MASK, "extra data %u/%u but mask not expected\n", + Test_Stream.iml_data_size, size ); + check_bitmap_data(Test_Stream.iml_data + sizeof(ILHEAD) + size, + Test_Stream.iml_data_size - sizeof(ILHEAD) - size, + width, height, 1, comment); + } } static void image_list_init(HIMAGELIST himl) { HBITMAP hbm; char comment[16]; - INT n = 1, i; + INT n = 1; + DWORD i; static const struct test_data { BYTE grey; @@ -964,7 +893,7 @@ static void image_list_init(HIMAGELIST himl) { 255, BMP_CX, BMP_CX, 24, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "total 24" } }; - check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, BMP_CX * 4, BMP_CX * 1, 24, "total 0"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "total 0"); #define add_bitmap(grey) \ sprintf(comment, "%d", n++); \ @@ -985,43 +914,44 @@ static void test_imagelist_storage(void) { HIMAGELIST himl; HBITMAP hbm; + HICON icon; INT ret; himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 1, 1); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, BMP_CX * 4, BMP_CX * 1, 24, "empty"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 2, 4, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "empty"); image_list_init(himl); - check_iml_data(himl, BMP_CX, BMP_CX, 24, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "orig"); + check_iml_data(himl, BMP_CX, BMP_CX, 24, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "orig"); ret = ImageList_Remove(himl, 4); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 23, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "1"); + check_iml_data(himl, BMP_CX, BMP_CX, 23, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "1"); ret = ImageList_Remove(himl, 5); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 22, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "2"); + check_iml_data(himl, BMP_CX, BMP_CX, 22, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "2"); ret = ImageList_Remove(himl, 6); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 21, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "3"); + check_iml_data(himl, BMP_CX, BMP_CX, 21, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "3"); ret = ImageList_Remove(himl, 7); ok(ret, "ImageList_Remove failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "4"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "4"); ret = ImageList_Remove(himl, -2); ok(!ret, "ImageList_Remove(-2) should fail\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "5"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "5"); ret = ImageList_Remove(himl, 20); ok(!ret, "ImageList_Remove(20) should fail\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, 24, "6"); + check_iml_data(himl, BMP_CX, BMP_CX, 20, 27, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "6"); ret = ImageList_Remove(himl, -1); ok(ret, "ImageList_Remove(-1) failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 4, 4, BMP_CX * 4, BMP_CX * 1, 24, "7"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 4, 4, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "7"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); @@ -1032,11 +962,11 @@ static void test_imagelist_storage(void) himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 0, 32); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 1, 32, BMP_CX * 4, BMP_CX * 1, 24, "init 0 grow 32"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 1, 32, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "init 0 grow 32"); hbm = create_bitmap(BMP_CX * 9, BMP_CX, 0, "9"); ret = ImageList_Add(himl, hbm, NULL); ok(ret == 0, "ImageList_Add returned %d, expected 0\n", ret); - check_iml_data(himl, BMP_CX, BMP_CX, 1, 34, 32, BMP_CX * 4, BMP_CX * 9, 24, "add 1 x 9"); + check_iml_data(himl, BMP_CX, BMP_CX, 1, 34, 32, BMP_CX * 4, BMP_CX * 9, ILC_COLOR24, "add 1 x 9"); DeleteObject(hbm); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); @@ -1044,14 +974,14 @@ static void test_imagelist_storage(void) himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 4, 4); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, 24, "init 4 grow 4"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24, "init 4 grow 4"); hbm = create_bitmap(BMP_CX, BMP_CX * 9, 0, "9"); ret = ImageList_Add(himl, hbm, NULL); ok(ret == 0, "ImageList_Add returned %d, expected 0\n", ret); - check_iml_data(himl, BMP_CX, BMP_CX, 9, 15, 4, BMP_CX * 4, BMP_CX * 4, 24, "add 9 x 1"); + check_iml_data(himl, BMP_CX, BMP_CX, 9, 15, 4, BMP_CX * 4, BMP_CX * 4, ILC_COLOR24, "add 9 x 1"); ret = ImageList_Add(himl, hbm, NULL); ok(ret == 9, "ImageList_Add returned %d, expected 9\n", ret); - check_iml_data(himl, BMP_CX, BMP_CX, 18, 25, 4, BMP_CX * 4, BMP_CX * 7, 24, "add 9 x 1"); + check_iml_data(himl, BMP_CX, BMP_CX, 18, 25, 4, BMP_CX * 4, BMP_CX * 7, ILC_COLOR24, "add 9 x 1"); DeleteObject(hbm); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); @@ -1059,49 +989,156 @@ static void test_imagelist_storage(void) himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 207, 209); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 208, 212, BMP_CX * 4, BMP_CX * 52, 24, "init 207 grow 209"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 208, 212, BMP_CX * 4, BMP_CX * 52, ILC_COLOR24, "init 207 grow 209"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 209, 207); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 210, 208, BMP_CX * 4, BMP_CX * 53, 24, "init 209 grow 207"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 210, 208, BMP_CX * 4, BMP_CX * 53, ILC_COLOR24, "init 209 grow 207"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 14, 4); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 15, 4, BMP_CX * 4, BMP_CX * 4, 24, "init 14 grow 4"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 15, 4, BMP_CX * 4, BMP_CX * 4, ILC_COLOR24, "init 14 grow 4"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 5, 9); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 6, 12, BMP_CX * 4, BMP_CX * 2, 24, "init 5 grow 9"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 6, 12, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24, "init 5 grow 9"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 9, 5); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 10, 8, BMP_CX * 4, BMP_CX * 3, 24, "init 9 grow 5"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 10, 8, BMP_CX * 4, BMP_CX * 3, ILC_COLOR24, "init 9 grow 5"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 2, 4); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 4, BMP_CX * 4, BMP_CX * 1, 24, "init 2 grow 4"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 4, BMP_CX * 4, BMP_CX * 1, ILC_COLOR24, "init 2 grow 4"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24, 4, 2); ok(himl != 0, "ImageList_Create failed\n"); - check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, 24, "init 4 grow 2"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24, "init 4 grow 2"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR8, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR8, "bpp 8"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4, "bpp 4"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, 0, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4, "bpp default"); + icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); + ok( ImageList_AddIcon(himl, icon) == 0,"failed to add icon\n"); + ok( ImageList_AddIcon(himl, icon) == 1,"failed to add icon\n"); + DestroyIcon( icon ); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4, "bpp default"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR24|ILC_MASK, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24|ILC_MASK, + "bpp 24 + mask"); + icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); + ok( ImageList_AddIcon(himl, icon) == 0,"failed to add icon\n"); + ok( ImageList_AddIcon(himl, icon) == 1,"failed to add icon\n"); + DestroyIcon( icon ); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR24|ILC_MASK, + "bpp 24 + mask"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 4, 2); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4|ILC_MASK, + "bpp 4 + mask"); + icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); + ok( ImageList_AddIcon(himl, icon) == 0,"failed to add icon\n"); + ok( ImageList_AddIcon(himl, icon) == 1,"failed to add icon\n"); + DestroyIcon( icon ); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 5, 4, BMP_CX * 4, BMP_CX * 2, ILC_COLOR4|ILC_MASK, + "bpp 4 + mask"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, 99); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 100, BMP_CX * 4, BMP_CX, ILC_COLOR4|ILC_MASK, + "init 2 grow 99"); + icon = CreateIcon(hinst, 32, 32, 1, 1, icon_bits, icon_bits); + ok( ImageList_AddIcon(himl, icon) == 0,"failed to add icon\n"); + ok( ImageList_AddIcon(himl, icon) == 1,"failed to add icon\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 2, 3, 100, BMP_CX * 4, BMP_CX, ILC_COLOR4|ILC_MASK, + "init 2 grow 99 2 icons"); + ok( ImageList_AddIcon(himl, icon) == 2,"failed to add icon\n"); + DestroyIcon( icon ); + check_iml_data(himl, BMP_CX, BMP_CX, 3, 104, 100, BMP_CX * 4, BMP_CX * 104/4, ILC_COLOR4|ILC_MASK, + "init 2 grow 99 3 icons"); + ok( ImageList_Remove(himl, -1) == TRUE,"failed to remove icon\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 100, 100, BMP_CX * 4, BMP_CX * 100/4, ILC_COLOR4|ILC_MASK, + "init 2 grow 99 empty"); + ok( ImageList_SetImageCount(himl, 22) == TRUE,"failed to set image count\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 22, 23, 100, BMP_CX * 4, BMP_CX * 24/4, ILC_COLOR4|ILC_MASK, + "init 2 grow 99 set count 22"); + ok( ImageList_SetImageCount(himl, 0) == TRUE,"failed to set image count\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 1, 100, BMP_CX * 4, BMP_CX, ILC_COLOR4|ILC_MASK, + "init 2 grow 99 set count 0"); + ok( ImageList_SetImageCount(himl, 42) == TRUE,"failed to set image count\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 42, 43, 100, BMP_CX * 4, BMP_CX * 44/4, ILC_COLOR4|ILC_MASK, + "init 2 grow 99 set count 42"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, 65536+12); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 12, BMP_CX * 4, BMP_CX, ILC_COLOR4|ILC_MASK, + "init 2 grow 65536+12"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, 65535); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 0, BMP_CX * 4, BMP_CX, ILC_COLOR4|ILC_MASK, + "init 2 grow 65535"); + ret = ImageList_Destroy(himl); + ok(ret, "ImageList_Destroy failed\n"); + iml_clear_stream_data(); + + himl = ImageList_Create(BMP_CX, BMP_CX, ILC_COLOR4|ILC_MASK, 2, -20); + ok(himl != 0, "ImageList_Create failed\n"); + check_iml_data(himl, BMP_CX, BMP_CX, 0, 3, 4, BMP_CX * 4, BMP_CX, ILC_COLOR4|ILC_MASK, + "init 2 grow -20"); ret = ImageList_Destroy(himl); ok(ret, "ImageList_Destroy failed\n"); iml_clear_stream_data(); @@ -1245,6 +1282,7 @@ static void test_ImageList_DrawIndirect(void) int iImage = -1, iAlphaImage = -1, iTransparentImage = -1; UINT32 *bits = 0; UINT32 maskBits = 0x00000000, inverseMaskBits = 0xFFFFFFFF; + int bpp, broken_value; BITMAPINFO bitmapInfo = {{sizeof(BITMAPINFOHEADER), 2, 1, 1, 32, BI_RGB, 0, 0, 0, 0, 0}}; @@ -1253,6 +1291,7 @@ static void test_ImageList_DrawIndirect(void) ok(hdcDst != 0, "CreateCompatibleDC(0) failed to return a valid DC\n"); if (!hdcDst) return; + bpp = GetDeviceCaps(hdcDst, BITSPIXEL); hbmMask = CreateBitmap(2, 1, 1, 1, &maskBits); ok(hbmMask != 0, "CreateBitmap failed\n"); @@ -1301,19 +1340,22 @@ static void test_ImageList_DrawIndirect(void) check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iImage, ILD_NORMAL, 0x00ABCDEF, __LINE__); check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iImage, ILD_TRANSPARENT, 0x00ABCDEF, __LINE__); todo_wine check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND25, ILS_NORMAL, 0, 0x00E8F1FA, 0x00D4D9DD, __LINE__); - todo_wine check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND50, ILS_NORMAL, 0, 0x00E8F1FA, 0x00B4BDC4, __LINE__); + if (bpp == 16 || bpp == 24) broken_value = 0x00D4D9DD; + else broken_value = 0x00B4BDC4; + todo_wine check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND50, ILS_NORMAL, 0, 0x00E8F1FA, broken_value, __LINE__); check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iImage, ILD_MASK, 0x00ABCDEF, __LINE__); check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iImage, ILD_IMAGE, 0x00ABCDEF, __LINE__); check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iImage, ILD_PRESERVEALPHA, 0x00ABCDEF, __LINE__); check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iAlphaImage, ILD_NORMAL, 0x00D3E5F7, __LINE__); check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iAlphaImage, ILD_TRANSPARENT, 0x00D3E5F7, __LINE__); - todo_wine - { - check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND25, ILS_NORMAL, 0, 0x00E8F1FA, 0x009DA8B1, __LINE__); - check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND50, ILS_NORMAL, 0, 0x00E8F1FA, 0x008C99A3, __LINE__); - } + if (bpp == 16 || bpp == 24) broken_value = 0x00D4D9DD; + else broken_value = 0x009DA8B1; + todo_wine check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND25, ILS_NORMAL, 0, 0x00E8F1FA, broken_value, __LINE__); + if (bpp == 16 || bpp == 24) broken_value = 0x00D4D9DD; + else broken_value = 0x008C99A3; + todo_wine check_ImageList_DrawIndirect_broken(hdcDst, himl, bits, iAlphaImage, ILD_BLEND50, ILS_NORMAL, 0, 0x00E8F1FA, broken_value, __LINE__); check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iAlphaImage, ILD_MASK, 0x00D3E5F7, __LINE__); check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iAlphaImage, ILD_IMAGE, 0x00D3E5F7, __LINE__); todo_wine check_ImageList_DrawIndirect_fStyle(hdcDst, himl, bits, iAlphaImage, ILD_PRESERVEALPHA, 0x005D6F81, __LINE__); @@ -1368,7 +1410,7 @@ cleanup: static void test_iimagelist(void) { - IImageList *imgl; + IImageList *imgl, *imgl2; HIMAGELIST himl; HRESULT hr; ULONG ret; @@ -1400,6 +1442,15 @@ static void test_iimagelist(void) ret = ImageList_Destroy((HIMAGELIST)imgl); ok(ret == FALSE, "Expected FALSE, got %d\n", ret); + /* ref counting, HIMAGELIST_QueryInterface adds a reference */ + imgl = (IImageList*)createImageList(32, 32); + hr = pHIMAGELIST_QueryInterface((HIMAGELIST)imgl, &IID_IImageList, (void**)&imgl2); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(imgl2 == imgl, "got different pointer\n"); + ret = IImageList_Release(imgl); + ok(ret == 1, "got %u\n", ret); + IImageList_Release(imgl); + if (!pImageList_CoCreateInstance) { win_skip("Vista imagelist functions not available\n"); @@ -1426,7 +1477,7 @@ static void test_iimagelist(void) ImageList_Destroy(himl); } -static void testHotspot_v6(void) +static void test_hotspot_v6(void) { struct hotspot { int dx; @@ -1501,7 +1552,7 @@ static void testHotspot_v6(void) IImageList_Release(imgl1); } -static void DoTest1_v6(void) +static void test_IImageList_Add_Remove(void) { IImageList *imgl; HIMAGELIST himl; @@ -1511,7 +1562,7 @@ static void DoTest1_v6(void) HICON hicon2; HICON hicon3; - int ret = 0; + int ret; /* create an imagelist to play with */ himl = ImageList_Create(84, 84, ILC_COLOR16, 0, 3); @@ -1529,45 +1580,71 @@ static void DoTest1_v6(void) /* remove when nothing exists */ hr = IImageList_Remove(imgl, 0); - ok(!(SUCCEEDED(hr)), "removed nonexistent icon\n"); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); /* removing everything from an empty imagelist should succeed */ hr = IImageList_Remove(imgl, -1); - ok(SUCCEEDED(hr), "removed nonexistent icon\n"); + ok(hr == S_OK, "removed nonexistent icon\n"); /* add three */ - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl, -1, hicon1, &ret)) && (ret == 0),"failed to add icon1\n"); - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl, -1, hicon2, &ret)) && (ret == 1),"failed to add icon2\n"); - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl, -1, hicon3, &ret)) && (ret == 2),"failed to add icon3\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl, -1, hicon1, &ret) == S_OK && (ret == 0),"failed to add icon1\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl, -1, hicon2, &ret) == S_OK && (ret == 1),"failed to add icon2\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl, -1, hicon3, &ret) == S_OK && (ret == 2),"failed to add icon3\n"); /* remove an index out of range */ - ok(FAILED(IImageList_Remove(imgl, 4711)),"removed nonexistent icon\n"); + ok( IImageList_Remove(imgl, 4711) == E_INVALIDARG, "got 0x%08x\n", hr); /* remove three */ - ok(SUCCEEDED(IImageList_Remove(imgl,0)),"can't remove 0\n"); - ok(SUCCEEDED(IImageList_Remove(imgl,0)),"can't remove 0\n"); - ok(SUCCEEDED(IImageList_Remove(imgl,0)),"can't remove 0\n"); + ok( IImageList_Remove(imgl,0) == S_OK, "can't remove 0\n"); + ok( IImageList_Remove(imgl,0) == S_OK, "can't remove 0\n"); + ok( IImageList_Remove(imgl,0) == S_OK, "can't remove 0\n"); /* remove one extra */ - ok(FAILED(IImageList_Remove(imgl, 0)),"removed nonexistent icon\n"); - - /* check SetImageCount/GetImageCount */ - ok(SUCCEEDED(IImageList_SetImageCount(imgl, 3)), "couldn't increase image count\n"); - ok(SUCCEEDED(IImageList_GetImageCount(imgl, &ret)) && (ret == 3), "invalid image count after increase\n"); - ok(SUCCEEDED(IImageList_SetImageCount(imgl, 1)), "couldn't decrease image count\n"); - ok(SUCCEEDED(IImageList_GetImageCount(imgl, &ret)) && (ret == 1), "invalid image count after decrease to 1\n"); - ok(SUCCEEDED(IImageList_SetImageCount(imgl, 0)), "couldn't decrease image count\n"); - ok(SUCCEEDED(IImageList_GetImageCount(imgl, &ret)) && (ret == 0), "invalid image count after decrease to 0\n"); - - /* destroy it */ - ok(SUCCEEDED(IImageList_Release(imgl)),"release imagelist failed\n"); + ok( IImageList_Remove(imgl, 0) == E_INVALIDARG, "got 0x%08x\n", hr); + IImageList_Release(imgl); ok(DestroyIcon(hicon1),"icon 1 wasn't deleted\n"); ok(DestroyIcon(hicon2),"icon 2 wasn't deleted\n"); ok(DestroyIcon(hicon3),"icon 3 wasn't deleted\n"); } -static void DoTest3_v6(void) +static void test_IImageList_Get_SetImageCount(void) +{ + IImageList *imgl; + HIMAGELIST himl; + HRESULT hr; + INT ret; + + /* create an imagelist to play with */ + himl = ImageList_Create(84, 84, ILC_COLOR16, 0, 3); + ok(himl != 0,"failed to create imagelist\n"); + + imgl = (IImageList *) himl; + + /* check SetImageCount/GetImageCount */ + hr = IImageList_SetImageCount(imgl, 3); + ok(hr == S_OK, "got 0x%08x\n", hr); + ret = 0; + hr = IImageList_GetImageCount(imgl, &ret); + ok(hr == S_OK && ret == 3, "invalid image count after increase\n"); + hr = IImageList_SetImageCount(imgl, 1); + ok(hr == S_OK, "got 0x%08x\n", hr); + ret = 0; + hr = IImageList_GetImageCount(imgl, &ret); + ok(hr == S_OK && ret == 1, "invalid image count after decrease to 1\n"); + hr = IImageList_SetImageCount(imgl, 0); + ok(hr == S_OK, "got 0x%08x\n", hr); + ret = -1; + hr = IImageList_GetImageCount(imgl, &ret); + ok(hr == S_OK && ret == 0, "invalid image count after decrease to 0\n"); + + IImageList_Release(imgl); +} + +static void test_IImageList_Draw(void) { IImageList *imgl; HIMAGELIST himl; @@ -1578,6 +1655,7 @@ static void DoTest3_v6(void) IMAGELISTDRAWPARAMS imldp; HWND hwndfortest; + HRESULT hr; HDC hdc; int ret; @@ -1600,26 +1678,28 @@ static void DoTest3_v6(void) ok(hbm3 != 0, "no bitmap 3\n"); /* add three */ - ok(SUCCEEDED(IImageList_Add(imgl, hbm1, 0, &ret)) && (ret == 0), "failed to add bitmap 1\n"); - ok(SUCCEEDED(IImageList_Add(imgl, hbm2, 0, &ret)) && (ret == 1), "failed to add bitmap 2\n"); + ret = -1; + ok( IImageList_Add(imgl, hbm1, 0, &ret) == S_OK && (ret == 0), "failed to add bitmap 1\n"); + ret = -1; + ok( IImageList_Add(imgl, hbm2, 0, &ret) == S_OK && (ret == 1), "failed to add bitmap 2\n"); - ok(SUCCEEDED(IImageList_SetImageCount(imgl, 3)), "Setimage count failed\n"); - ok(SUCCEEDED(IImageList_Replace(imgl, 2, hbm3, 0)), "failed to replace bitmap 3\n"); + ok( IImageList_SetImageCount(imgl, 3) == S_OK, "Setimage count failed\n"); + ok( IImageList_Replace(imgl, 2, hbm3, 0) == S_OK, "failed to replace bitmap 3\n"); + +if (0) +{ + /* crashes on native */ + IImageList_Draw(imgl, NULL); +} memset(&imldp, 0, sizeof (imldp)); - ok(FAILED(IImageList_Draw(imgl, &imldp)), "zero data succeeded!\n"); + hr = IImageList_Draw(imgl, &imldp); + ok( hr == E_INVALIDARG, "got 0x%08x\n", hr); - imldp.cbSize = sizeof (imldp); + imldp.cbSize = IMAGELISTDRAWPARAMS_V3_SIZE; imldp.hdcDst = hdc; imldp.himl = himl; - if (FAILED(IImageList_Draw(imgl, &imldp))) - { - /* Earlier versions of native comctl32 use a smaller structure */ - imldp.cbSize -= 3 * sizeof(DWORD); - ok(SUCCEEDED(IImageList_Draw(imgl, &imldp)), "should succeed\n"); - } - REDRAW(hwndfortest); WAIT; @@ -1628,21 +1708,21 @@ static void DoTest3_v6(void) imldp.rgbFg = CLR_DEFAULT; imldp.y = 100; imldp.x = 100; - ok(SUCCEEDED(IImageList_Draw(imgl, &imldp)), "should succeed\n"); + ok( IImageList_Draw(imgl, &imldp) == S_OK, "should succeed\n"); imldp.i ++; - ok(SUCCEEDED(IImageList_Draw(imgl, &imldp)), "should succeed\n"); + ok( IImageList_Draw(imgl, &imldp) == S_OK, "should succeed\n"); imldp.i ++; - ok(SUCCEEDED(IImageList_Draw(imgl, &imldp)), "should succeed\n"); + ok( IImageList_Draw(imgl, &imldp) == S_OK, "should succeed\n"); imldp.i ++; - ok(FAILED(IImageList_Draw(imgl, &imldp)), "should fail\n"); + ok( IImageList_Draw(imgl, &imldp) == E_INVALIDARG, "should fail\n"); /* remove three */ - ok(SUCCEEDED(IImageList_Remove(imgl, 0)), "removing 1st bitmap\n"); - ok(SUCCEEDED(IImageList_Remove(imgl, 0)), "removing 2nd bitmap\n"); - ok(SUCCEEDED(IImageList_Remove(imgl, 0)), "removing 3rd bitmap\n"); + ok( IImageList_Remove(imgl, 0) == S_OK, "removing 1st bitmap\n"); + ok( IImageList_Remove(imgl, 0) == S_OK, "removing 2nd bitmap\n"); + ok( IImageList_Remove(imgl, 0) == S_OK, "removing 3rd bitmap\n"); /* destroy it */ - ok(SUCCEEDED(IImageList_Release(imgl)), "release imagelist failed\n"); + IImageList_Release(imgl); /* bitmaps should not be deleted by the imagelist */ ok(DeleteObject(hbm1),"bitmap 1 can't be deleted\n"); @@ -1653,7 +1733,7 @@ static void DoTest3_v6(void) DestroyWindow(hwndfortest); } -static void testMerge_v6(void) +static void test_IImageList_Merge(void) { HIMAGELIST himl1, himl2; IImageList *imgl1, *imgl2, *merge; @@ -1678,16 +1758,24 @@ static void testMerge_v6(void) imgl1 = (IImageList *) himl1; imgl2 = (IImageList *) himl2; - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl2, -1, hicon1, &ret)) && (ret == 0),"add icon1 to himl2 failed\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl2, -1, hicon1, &ret) == S_OK && (ret == 0),"add icon1 to himl2 failed\n"); + +if (0) +{ + /* null cases that crash on native */ + IImageList_Merge(imgl1, -1, NULL, 0, 0, 0, &IID_IImageList, (void**)&merge); + IImageList_Merge(imgl1, -1, (IUnknown*) imgl2, 0, 0, 0, &IID_IImageList, NULL); +} /* If himl1 has no images, merge still succeeds */ hr = IImageList_Merge(imgl1, -1, (IUnknown *) imgl2, 0, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl1,-1 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl1,-1 failed\n"); + if (hr == S_OK) IImageList_Release(merge); hr = IImageList_Merge(imgl1, 0, (IUnknown *) imgl2, 0, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl1,0 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl1,0 failed\n"); + if (hr == S_OK) IImageList_Release(merge); /* Same happens if himl2 is empty */ IImageList_Release(imgl2); @@ -1697,30 +1785,32 @@ static void testMerge_v6(void) imgl2 = (IImageList *) himl2; hr = IImageList_Merge(imgl1, -1, (IUnknown *) imgl2, -1, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl2,-1 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl2,-1 failed\n"); + if (hr == S_OK) IImageList_Release(merge); hr = IImageList_Merge(imgl1, -1, (IUnknown *) imgl2, 0, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl2,0 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl2,0 failed\n"); + if (hr == S_OK) IImageList_Release(merge); /* Now try merging an image with itself */ - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl2, -1, hicon1, &ret)) && (ret == 0),"re-add icon1 to himl2 failed\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl2, -1, hicon1, &ret) == S_OK && (ret == 0),"re-add icon1 to himl2 failed\n"); hr = IImageList_Merge(imgl2, 0, (IUnknown *) imgl2, 0, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl2 with itself failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl2 with itself failed\n"); + if (hr == S_OK) IImageList_Release(merge); /* Try merging 2 different image lists */ - ok(SUCCEEDED(IImageList_ReplaceIcon(imgl1, -1, hicon1, &ret)) && (ret == 0),"add icon1 to himl1 failed\n"); + ret = -1; + ok( IImageList_ReplaceIcon(imgl1, -1, hicon1, &ret) == S_OK && (ret == 0),"add icon1 to himl1 failed\n"); hr = IImageList_Merge(imgl1, 0, (IUnknown *) imgl2, 0, 0, 0, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl1 with himl2 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl1 with himl2 failed\n"); + if (hr == S_OK) IImageList_Release(merge); hr = IImageList_Merge(imgl1, 0, (IUnknown *) imgl2, 0, 8, 16, &IID_IImageList, (void **) &merge); - ok(SUCCEEDED(hr), "merge himl1 with himl2 8,16 failed\n"); - if (SUCCEEDED(hr)) IImageList_Release(merge); + ok(hr == S_OK, "merge himl1 with himl2 8,16 failed\n"); + if (hr == S_OK) IImageList_Release(merge); IImageList_Release(imgl1); IImageList_Release(imgl2); @@ -1729,6 +1819,181 @@ static void testMerge_v6(void) DestroyWindow(hwnd); } +static void test_iconsize(void) +{ + HIMAGELIST himl; + INT cx, cy; + BOOL ret; + + himl = ImageList_Create(16, 16, ILC_COLOR16, 0, 3); + /* null pointers, not zero imagelist dimensions */ + ret = ImageList_GetIconSize(himl, NULL, NULL); + ok(!ret, "got %d\n", ret); + + /* doesn't touch return pointers */ + cx = 0x1abe11ed; + ret = ImageList_GetIconSize(himl, &cx, NULL); + ok(!ret, "got %d\n", ret); + ok(cx == 0x1abe11ed, "got %d\n", cx); + + cy = 0x1abe11ed; + ret = ImageList_GetIconSize(himl, NULL, &cy); + ok(!ret, "got %d\n", ret); + ok(cy == 0x1abe11ed, "got %d\n", cy); + + ImageList_Destroy(himl); + + ret = ImageList_GetIconSize((HIMAGELIST)0xdeadbeef, &cx, &cy); + ok(!ret, "got %d\n", ret); +} + +static void test_create_destroy(void) +{ + HIMAGELIST himl; + BOOL rc; + + /* list with zero or negative image dimensions */ + himl = ImageList_Create(0, 0, ILC_COLOR16, 0, 3); + ok(himl == NULL, "got %p\n", himl); + + himl = ImageList_Create(0, 16, ILC_COLOR16, 0, 3); + ok(himl == NULL, "got %p\n", himl); + + himl = ImageList_Create(16, 0, ILC_COLOR16, 0, 3); + ok(himl == NULL, "got %p\n", himl); + + himl = ImageList_Create(16, -1, ILC_COLOR16, 0, 3); + ok(himl == NULL, "got %p\n", himl); + + himl = ImageList_Create(-1, 16, ILC_COLOR16, 0, 3); + ok(himl == NULL, "got %p\n", himl); + + rc = ImageList_Destroy((HIMAGELIST)0xdeadbeef); + ok(rc == FALSE, "ImageList_Destroy(0xdeadbeef) should fail and not crash\n"); +} + +static void test_IImageList_Clone(void) +{ + IImageList *imgl, *imgl2; + HIMAGELIST himl; + HRESULT hr; + ULONG ref; + + himl = ImageList_Create(16, 16, ILC_COLOR16, 0, 3); + imgl = (IImageList*)himl; + +if (0) +{ + /* crashes on native */ + IImageList_Clone(imgl, &IID_IImageList, NULL); +} + + hr = IImageList_Clone(imgl, &IID_IImageList, (void**)&imgl2); + ok(hr == S_OK, "got 0x%08x\n", hr); + ref = IImageList_Release(imgl2); + ok(ref == 0, "got %u\n", ref); + + IImageList_Release(imgl); +} + +static void test_IImageList_GetBkColor(void) +{ + IImageList *imgl; + HIMAGELIST himl; + COLORREF color; + HRESULT hr; + + himl = ImageList_Create(16, 16, ILC_COLOR16, 0, 3); + imgl = (IImageList*)himl; + +if (0) +{ + /* crashes on native */ + IImageList_GetBkColor(imgl, NULL); +} + + hr = IImageList_GetBkColor(imgl, &color); + ok(hr == S_OK, "got 0x%08x\n", hr); + + IImageList_Release(imgl); +} + +static void test_IImageList_SetBkColor(void) +{ + IImageList *imgl; + HIMAGELIST himl; + COLORREF color; + HRESULT hr; + + himl = ImageList_Create(16, 16, ILC_COLOR16, 0, 3); + imgl = (IImageList*)himl; + +if (0) +{ + /* crashes on native */ + IImageList_SetBkColor(imgl, RGB(0, 0, 0), NULL); +} + + hr = IImageList_SetBkColor(imgl, CLR_NONE, &color); + ok(hr == S_OK, "got 0x%08x\n", hr); + + hr = IImageList_SetBkColor(imgl, CLR_NONE, &color); + ok(hr == S_OK, "got 0x%08x\n", hr); + + color = 0xdeadbeef; + hr = IImageList_GetBkColor(imgl, &color); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(color == CLR_NONE, "got %x\n", color); + + IImageList_Release(imgl); +} + +static void test_IImageList_GetImageCount(void) +{ + IImageList *imgl; + HIMAGELIST himl; + int count; + HRESULT hr; + + himl = ImageList_Create(16, 16, ILC_COLOR16, 0, 3); + imgl = (IImageList*)himl; + +if (0) +{ + /* crashes on native */ + IImageList_GetImageCount(imgl, NULL); +} + + count = -1; + hr = IImageList_GetImageCount(imgl, &count); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(count == 0, "got %d\n", count); + + IImageList_Release(imgl); +} + +static void test_IImageList_GetIconSize(void) +{ + IImageList *imgl; + HIMAGELIST himl; + int cx, cy; + HRESULT hr; + + himl = ImageList_Create(16, 16, ILC_COLOR16, 0, 3); + imgl = (IImageList*)himl; + + hr = IImageList_GetIconSize(imgl, NULL, NULL); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = IImageList_GetIconSize(imgl, &cx, NULL); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + hr = IImageList_GetIconSize(imgl, NULL, &cy); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + IImageList_Release(imgl); +} + START_TEST(imagelist) { ULONG_PTR ctx_cookie; @@ -1744,12 +2009,14 @@ START_TEST(imagelist) InitCommonControls(); - testHotspot(); - DoTest1(); - DoTest2(); - DoTest3(); - testMerge(); + test_create_destroy(); + test_hotspot(); + test_add_remove(); + test_imagecount(); + test_DrawIndirect(); + test_merge(); test_imagelist_storage(); + test_iconsize(); FreeLibrary(hComCtl32); @@ -1774,10 +2041,16 @@ START_TEST(imagelist) test_shell_imagelist(); test_iimagelist(); - testHotspot_v6(); - DoTest1_v6(); - DoTest3_v6(); - testMerge_v6(); + test_hotspot_v6(); + test_IImageList_Add_Remove(); + test_IImageList_Get_SetImageCount(); + test_IImageList_Draw(); + test_IImageList_Merge(); + test_IImageList_Clone(); + test_IImageList_GetBkColor(); + test_IImageList_SetBkColor(); + test_IImageList_GetImageCount(); + test_IImageList_GetIconSize(); CoUninitialize(); diff --git a/rostests/winetests/comctl32/ipaddress.c b/rostests/winetests/comctl32/ipaddress.c index 85f92b1d582..96540cbe68e 100644 --- a/rostests/winetests/comctl32/ipaddress.c +++ b/rostests/winetests/comctl32/ipaddress.c @@ -20,7 +20,6 @@ #include #include -#include #include "wine/test.h" diff --git a/rostests/winetests/comctl32/listview.c b/rostests/winetests/comctl32/listview.c index 6ef82bb359a..b3df59e7c63 100644 --- a/rostests/winetests/comctl32/listview.c +++ b/rostests/winetests/comctl32/listview.c @@ -3,7 +3,7 @@ * * Copyright 2006 Mike McCormack for CodeWeavers * Copyright 2007 George Gov - * Copyright 2009 Nikolay Sivov + * Copyright 2009-2011 Nikolay Sivov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -59,6 +59,10 @@ static INT notifyFormat; static BOOL g_is_below_5; /* item data passed to LVN_GETDISPINFOA */ static LVITEMA g_itema; +/* alter notification code A->W */ +static BOOL g_disp_A_to_W; +/* dispinfo data sent with LVN_LVN_ENDLABELEDIT */ +static NMLVDISPINFO g_editbox_disp_info; static HWND subclass_editbox(HWND hwndListview); @@ -301,6 +305,13 @@ static const struct message listview_destroy[] = { { 0 } }; +static const struct message listview_header_changed_seq[] = { + { LVM_SETCOLUMNA, sent }, + { WM_NOTIFY, sent|id|defwinproc, 0, 0, LISTVIEW_ID }, + { WM_NOTIFY, sent|id|defwinproc, 0, 0, LISTVIEW_ID }, + { 0 } +}; + static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static LONG defwndproc_counter = 0; @@ -338,17 +349,36 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP switch (((NMHDR*)lParam)->code) { case LVN_BEGINLABELEDIT: + { + HWND edit = NULL; + /* subclass edit box */ if (!blockEdit) - subclass_editbox(((NMHDR*)lParam)->hwndFrom); + edit = subclass_editbox(((NMHDR*)lParam)->hwndFrom); + + if (edit) + { + INT len = SendMessageA(edit, EM_GETLIMITTEXT, 0, 0); + ok(len == 259 || broken(len == 260) /* includes NULL in NT4 */, + "text limit %d, expected 259\n", len); + } return blockEdit; - + } case LVN_ENDLABELEDIT: { + HWND edit; + /* always accept new item text */ NMLVDISPINFO *di = (NMLVDISPINFO*)lParam; - trace("LVN_ENDLABELEDIT: text=%s\n", di->item.pszText); + g_editbox_disp_info = *di; + trace("LVN_ENDLABELEDIT: text=%s\n", di->item.pszText ? di->item.pszText : "(null)"); + + /* edit control still available from this notification */ + edit = (HWND)SendMessageA(((NMHDR*)lParam)->hwndFrom, LVM_GETEDITCONTROL, 0, 0); + ok(IsWindow(edit), "expected valid edit control handle\n"); + ok((GetWindowLongA(edit, GWL_STYLE) & ES_MULTILINE) == 0, "edit is multiline\n"); + return TRUE; } case LVN_BEGINSCROLL: @@ -372,6 +402,20 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP { NMLVDISPINFOA *dispinfo = (NMLVDISPINFOA*)lParam; g_itema = dispinfo->item; + + if (g_disp_A_to_W && (dispinfo->item.mask & LVIF_TEXT)) + { + static const WCHAR testW[] = {'T','E','S','T',0}; + dispinfo->hdr.code = LVN_GETDISPINFOW; + memcpy(dispinfo->item.pszText, testW, sizeof(testW)); + } + + /* test control buffer size for text, 10 used to mask cases when control + is using caller buffer to process LVM_GETITEM for example */ + if (dispinfo->item.mask & LVIF_TEXT && dispinfo->item.cchTextMax > 10) + ok(dispinfo->item.cchTextMax == 260 || + broken(dispinfo->item.cchTextMax == 264) /* NT4 reports aligned size */, + "buffer size %d\n", dispinfo->item.cchTextMax); } break; case NM_HOVER: @@ -619,13 +663,12 @@ static void test_lvm_hittest_(HWND hwnd, INT x, INT y, INT item, UINT flags, UIN BOOL todo_item, BOOL todo_flags, int line) { LVHITTESTINFO lpht; - DWORD ret; + INT ret; lpht.pt.x = x; lpht.pt.y = y; lpht.iSubItem = 10; - trace("hittesting pt=(%d,%d)\n", lpht.pt.x, lpht.pt.y); ret = SendMessage(hwnd, LVM_HITTEST, 0, (LPARAM)&lpht); if (todo_item) @@ -663,12 +706,11 @@ static void test_lvm_subitemhittest_(HWND hwnd, INT x, INT y, INT item, INT subi BOOL todo_item, BOOL todo_subitem, BOOL todo_flags, int line) { LVHITTESTINFO lpht; - DWORD ret; + INT ret; lpht.pt.x = x; lpht.pt.y = y; - trace("subhittesting pt=(%d,%d)\n", lpht.pt.x, lpht.pt.y); ret = SendMessage(hwnd, LVM_SUBITEMHITTEST, 0, (LPARAM)&lpht); if (todo_item) @@ -707,7 +749,7 @@ static void test_lvm_subitemhittest_(HWND hwnd, INT x, INT y, INT item, INT subi static void test_images(void) { HWND hwnd; - DWORD r; + INT r; LVITEM item; HIMAGELIST himl; HBITMAP hbmp; @@ -736,6 +778,8 @@ static void test_images(void) ok(r == 0, "should return zero\n"); r = SendMessage(hwnd, LVM_SETICONSPACING, 0, MAKELONG(100,50)); + ok(r != 0, "got 0\n"); + /* returns dimensions */ r = SendMessage(hwnd, LVM_GETITEMCOUNT, 0, 0); @@ -757,6 +801,7 @@ static void test_images(void) memset(&r1, 0, sizeof r1); r1.left = LVIR_ICON; r = SendMessage(hwnd, LVM_GETITEMRECT, 0, (LPARAM) &r1); + expect(1, r); r = SendMessage(hwnd, LVM_DELETEALLITEMS, 0, 0); ok(r == TRUE, "should not fail\n"); @@ -769,6 +814,7 @@ static void test_images(void) memset(&r2, 0, sizeof r2); r2.left = LVIR_ICON; r = SendMessage(hwnd, LVM_GETITEMRECT, 0, (LPARAM) &r2); + expect(1, r); ok(!memcmp(&r1, &r2, sizeof r1), "rectangle should be the same\n"); @@ -796,12 +842,13 @@ static void test_checkboxes(void) item.iSubItem = 0; item.pszText = text; r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); - ok(r == 0, "ret %d\n", r); + expect(0, r); item.iItem = 0; item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0xfccc, "state %x\n", item.state); /* Don't set LVIF_STATE */ @@ -812,22 +859,24 @@ static void test_checkboxes(void) item.iSubItem = 0; item.pszText = text; r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); - ok(r == 1, "ret %d\n", r); + expect(1, r); item.iItem = 1; item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0, "state %x\n", item.state); r = SendMessage(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES); - ok(r == 0, "should return zero\n"); + expect(0, r); /* Having turned on checkboxes, check that all existing items are set to 0x1000 (unchecked) */ item.iItem = 0; item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); if (item.state != 0x1ccc) { win_skip("LVS_EX_CHECKBOXES style is unavailable. Skipping.\n"); @@ -841,12 +890,13 @@ static void test_checkboxes(void) item.state = 0; item.pszText = text2; r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); - ok(r == 2, "ret %d\n", r); + expect(2, r); item.iItem = 2; item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0x1000, "state %x\n", item.state); /* Add a further item this time specifying a state and still its state goes to 0x1000 */ @@ -856,12 +906,13 @@ static void test_checkboxes(void) item.state = 0x2aaa; item.pszText = text3; r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); - ok(r == 3, "ret %d\n", r); + expect(3, r); item.iItem = 3; item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0x1aaa, "state %x\n", item.state); /* Set an item's state to checked */ @@ -870,11 +921,13 @@ static void test_checkboxes(void) item.stateMask = 0xf000; item.state = 0x2000; r = SendMessage(hwnd, LVM_SETITEMA, 0, (LPARAM) &item); + expect(1, r); item.iItem = 3; item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0x2aaa, "state %x\n", item.state); /* Check that only the bits we asked for are returned, @@ -885,6 +938,7 @@ static void test_checkboxes(void) item.stateMask = 0xf000; item.state = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0x2000, "state %x\n", item.state); /* Set the style again and check that doesn't change an item's state */ @@ -895,6 +949,7 @@ static void test_checkboxes(void) item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0x2aaa, "state %x\n", item.state); /* Unsetting the checkbox extended style doesn't change an item's state */ @@ -905,16 +960,18 @@ static void test_checkboxes(void) item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0x2aaa, "state %x\n", item.state); /* Now setting the style again will change an item's state */ r = SendMessage(hwnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_CHECKBOXES, LVS_EX_CHECKBOXES); - ok(r == 0, "ret %x\n", r); + expect(0, r); item.iItem = 3; item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0x1aaa, "state %x\n", item.state); /* Toggle checkbox tests (bug 9934) */ @@ -931,6 +988,7 @@ static void test_checkboxes(void) item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0x1aab, "state %x\n", item.state); r = SendMessage(hwnd, WM_KEYDOWN, VK_SPACE, 0); @@ -942,6 +1000,7 @@ static void test_checkboxes(void) item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0x2aab, "state %x\n", item.state); r = SendMessage(hwnd, WM_KEYDOWN, VK_SPACE, 0); @@ -953,6 +1012,7 @@ static void test_checkboxes(void) item.mask = LVIF_STATE; item.stateMask = 0xffff; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); ok(item.state == 0x1aab, "state %x\n", item.state); DestroyWindow(hwnd); @@ -961,7 +1021,7 @@ static void test_checkboxes(void) static void insert_column(HWND hwnd, int idx) { LVCOLUMN column; - DWORD rc; + INT rc; memset(&column, 0xcc, sizeof(column)); column.mask = LVCF_SUBITEM; @@ -976,7 +1036,7 @@ static void insert_item(HWND hwnd, int idx) static CHAR text[] = "foo"; LVITEMA item; - DWORD rc; + INT rc; memset(&item, 0xcc, sizeof (item)); item.mask = LVIF_TEXT; @@ -991,10 +1051,11 @@ static void insert_item(HWND hwnd, int idx) static void test_items(void) { const LPARAM lparamTest = 0x42; + static CHAR text[] = "Text"; + char buffA[5]; HWND hwnd; LVITEMA item; DWORD r; - static CHAR text[] = "Text"; hwnd = CreateWindowEx(0, "SysListView32", "foo", LVS_REPORT, 10, 10, 100, 200, hwndparent, NULL, NULL, NULL); @@ -1017,7 +1078,7 @@ static void test_items(void) item.iItem = 0; item.iSubItem = 0; r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); - ok(r == 0, "ret %d\n", r); + expect(0, r); /* get */ memset (&item, 0xcc, sizeof (item)); item.mask = LVIF_STATE; @@ -1026,7 +1087,7 @@ static void test_items(void) item.iItem = 0; item.iSubItem = 0; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); ok(item.state & LVIS_SELECTED, "Expected LVIS_SELECTED\n"); SendMessage(hwnd, LVM_DELETEITEM, 0, 0); @@ -1039,7 +1100,7 @@ static void test_items(void) item.iItem = 0; item.iSubItem = 0; r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); - ok(r == 0, "ret %d\n", r); + expect(0, r); /* get */ memset (&item, 0xcc, sizeof (item)); item.mask = LVIF_STATE; @@ -1048,7 +1109,7 @@ static void test_items(void) item.iItem = 0; item.iSubItem = 0; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); ok(item.state & LVIS_FOCUSED, "Expected LVIS_FOCUSED\n"); SendMessage(hwnd, LVM_DELETEITEM, 0, 0); @@ -1061,7 +1122,7 @@ static void test_items(void) item.iItem = 0; item.iSubItem = 0; r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); - ok(r == 0, "ret %d\n", r); + expect(0, r); /* get */ memset (&item, 0xcc, sizeof (item)); item.mask = LVIF_STATE; @@ -1070,7 +1131,7 @@ static void test_items(void) item.iItem = 0; item.iSubItem = 0; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); ok(item.state & LVIS_CUT, "Expected LVIS_CUT\n"); SendMessage(hwnd, LVM_DELETEITEM, 0, 0); @@ -1081,7 +1142,7 @@ static void test_items(void) item.iSubItem = 0; item.lParam = lparamTest; r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); - ok(r == 0, "ret %d\n", r); + expect(0, r); /* Test getting of the param */ memset (&item, 0xcc, sizeof (item)); @@ -1089,7 +1150,7 @@ static void test_items(void) item.iItem = 0; item.iSubItem = 0; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); ok(item.lParam == lparamTest, "got lParam %lx, expected %lx\n", item.lParam, lparamTest); /* Set up a subitem */ @@ -1099,7 +1160,56 @@ static void test_items(void) item.iSubItem = 1; item.pszText = text; r = SendMessage(hwnd, LVM_SETITEMA, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); + + item.mask = LVIF_TEXT; + item.iItem = 0; + item.iSubItem = 1; + item.pszText = buffA; + item.cchTextMax = sizeof(buffA); + r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); + ok(!memcmp(item.pszText, text, sizeof(text)), "got text %s, expected %s\n", item.pszText, text); + + /* set up with extra flag */ + /* 1. reset subitem text */ + item.mask = LVIF_TEXT; + item.iItem = 0; + item.iSubItem = 1; + item.pszText = NULL; + r = SendMessage(hwnd, LVM_SETITEMA, 0, (LPARAM) &item); + expect(1, r); + + item.mask = LVIF_TEXT; + item.iItem = 0; + item.iSubItem = 1; + item.pszText = buffA; + buffA[0] = 'a'; + item.cchTextMax = sizeof(buffA); + r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); + ok(item.pszText[0] == 0, "got %p\n", item.pszText); + + /* 2. set new text with extra flag specified */ + item.mask = LVIF_TEXT | LVIF_DI_SETITEM; + item.iItem = 0; + item.iSubItem = 1; + item.pszText = text; + r = SendMessage(hwnd, LVM_SETITEMA, 0, (LPARAM) &item); + ok(r == 1 || broken(r == 0) /* NT4 */, "ret %d\n", r); + + if (r == 1) + { + item.mask = LVIF_TEXT; + item.iItem = 0; + item.iSubItem = 1; + item.pszText = buffA; + buffA[0] = 'a'; + item.cchTextMax = sizeof(buffA); + r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); + expect(1, r); + ok(!memcmp(item.pszText, text, sizeof(text)), "got %s, expected %s\n", item.pszText, text); + } /* Query param from subitem: returns main item param */ memset (&item, 0xcc, sizeof (item)); @@ -1107,7 +1217,7 @@ static void test_items(void) item.iItem = 0; item.iSubItem = 1; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); ok(item.lParam == lparamTest, "got lParam %lx, expected %lx\n", item.lParam, lparamTest); /* Set up param on first subitem: no effect */ @@ -1117,7 +1227,7 @@ static void test_items(void) item.iSubItem = 1; item.lParam = lparamTest+1; r = SendMessage(hwnd, LVM_SETITEMA, 0, (LPARAM) &item); - ok(r == 0, "ret %d\n", r); + expect(0, r); /* Query param from subitem again: should still return main item param */ memset (&item, 0xcc, sizeof (item)); @@ -1125,7 +1235,7 @@ static void test_items(void) item.iItem = 0; item.iSubItem = 1; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); ok(item.lParam == lparamTest, "got lParam %lx, expected %lx\n", item.lParam, lparamTest); /**** Some tests of state highlighting ****/ @@ -1136,11 +1246,11 @@ static void test_items(void) item.state = LVIS_SELECTED; item.stateMask = LVIS_SELECTED | LVIS_DROPHILITED; r = SendMessage(hwnd, LVM_SETITEM, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); item.iSubItem = 1; item.state = LVIS_DROPHILITED; r = SendMessage(hwnd, LVM_SETITEM, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); memset (&item, 0xcc, sizeof (item)); item.mask = LVIF_STATE; @@ -1148,11 +1258,11 @@ static void test_items(void) item.iSubItem = 0; item.stateMask = -1; r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); ok(item.state == LVIS_SELECTED, "got state %x, expected %x\n", item.state, LVIS_SELECTED); item.iSubItem = 1; r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); todo_wine ok(item.state == LVIS_DROPHILITED, "got state %x, expected %x\n", item.state, LVIS_DROPHILITED); /* some notnull but meaningless masks */ @@ -1161,13 +1271,13 @@ static void test_items(void) item.iItem = 0; item.iSubItem = 0; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); memset (&item, 0, sizeof(item)); item.mask = LVIF_DI_SETITEM; item.iItem = 0; item.iSubItem = 0; r = SendMessage(hwnd, LVM_GETITEMA, 0, (LPARAM) &item); - ok(r != 0, "ret %d\n", r); + expect(1, r); /* set text to callback value already having it */ r = SendMessage(hwnd, LVM_DELETEALLITEMS, 0, 0); @@ -1177,7 +1287,7 @@ static void test_items(void) item.pszText = LPSTR_TEXTCALLBACK; item.iItem = 0; r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM) &item); - ok(r == 0, "ret %d\n", r); + expect(0, r); memset (&item, 0, sizeof (item)); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -1213,8 +1323,7 @@ static void test_columns(void) /* Check its width */ rc = SendMessageA(hwnd, LVM_GETCOLUMNWIDTH, 0, 0); - ok(rc == 10 || broken(rc == 0) /* win9x */, - "Inserting column with no mask failed to set width to 10 with %d\n", rc); + ok(rc == 10, "Inserting column with no mask failed to set width to 10 with %d\n", rc); DestroyWindow(hwnd); @@ -1226,16 +1335,16 @@ static void test_columns(void) column.mask = LVCF_WIDTH; column.cx = 100; rc = SendMessageA(hwnd, LVM_INSERTCOLUMNA, 0, (LPARAM)&column); - ok(rc == 0, "Inserting column failed with %d\n", rc); + expect(0, rc); column.cx = 200; rc = SendMessageA(hwnd, LVM_INSERTCOLUMNA, 1, (LPARAM)&column); - ok(rc == 1, "Inserting column failed with %d\n", rc); + expect(1, rc); flush_sequences(sequences, NUM_MSG_SEQUENCES); rc = SendMessageA(hwnd, LVM_GETCOLUMNORDERARRAY, 2, (LPARAM)&order); - ok(rc == 1, "Expected LVM_GETCOLUMNORDERARRAY to succeed\n"); + expect(1, rc); ok(order[0] == 0, "Expected order 0, got %d\n", order[0]); ok(order[1] == 1, "Expected order 1, got %d\n", order[1]); @@ -1253,7 +1362,7 @@ static void test_columns(void) item.mask = LVIF_TEXT; memset(&g_itema, 0, sizeof(g_itema)); rc = SendMessageA(hwnd, LVM_GETITEMA, 0, (LPARAM)&item); - ok(rc == 1, "got %d\n", rc); + expect(1, rc); ok(g_itema.iSubItem == 1, "got %d\n", g_itema.iSubItem); ok_sequence(sequences, PARENT_SEQ_INDEX, single_getdispinfo_parent_seq, @@ -1326,7 +1435,7 @@ static void test_create(void) col.mask = LVCF_WIDTH; col.cx = 100; r = SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&col); - ok(r == 0, "Expected 0 column's inserted\n"); + expect(0, r); hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); ok(IsWindow(hHeader), "Header should be created\n"); ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); @@ -1344,7 +1453,7 @@ static void test_create(void) col.mask = LVCF_WIDTH; col.cx = 100; r = SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&col); - ok(r == 0, "Expected 0 column's inserted\n"); + expect(0, r); hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); ok(IsWindow(hHeader), "Header should be created\n"); ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); @@ -1392,7 +1501,7 @@ static void test_create(void) col.mask = LVCF_WIDTH; col.cx = 100; r = SendMessage(hList, LVM_INSERTCOLUMN, 0, (LPARAM)&col); - ok(r == 0, "Expected 0 column's inserted\n"); + expect(0, r); hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); ok(IsWindow(hHeader), "Header should be created\n"); ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); @@ -1434,6 +1543,34 @@ static void test_create(void) ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); DestroyWindow(hList); + /* setting LVS_EX_GRIDLINES creates header */ + hList = CreateWindow("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + GetModuleHandle(NULL), 0); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(!IsWindow(hHeader), "Header shouldn't be created\n"); + ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_GRIDLINES); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader) || + broken(!IsWindow(hHeader)), /* 4.7x common controls */ + "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + DestroyWindow(hList); + + /* setting LVS_EX_FULLROWSELECT creates header */ + hList = CreateWindow("SysListView32", "Test", LVS_REPORT, 0, 0, 100, 100, NULL, NULL, + GetModuleHandle(NULL), 0); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(!IsWindow(hHeader), "Header shouldn't be created\n"); + ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); + hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); + ok(IsWindow(hHeader) || + broken(!IsWindow(hHeader)), /* 4.7x common controls */ + "Header should be created\n"); + ok(hHeader == GetDlgItem(hList, 0), "Expected header as dialog item\n"); + DestroyWindow(hList); + /* not report style accepts LVS_EX_HEADERDRAGDROP too */ hList = create_listview_control(LVS_ICON); SendMessage(hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_HEADERDRAGDROP); @@ -1451,11 +1588,11 @@ static void test_create(void) rect.top = 1; rect.right = rect.bottom = -10; r = SendMessage(hList, LVM_GETSUBITEMRECT, -1, (LPARAM)&rect); - ok(r != 0, "Expected not-null LRESULT\n"); + expect(1, r); hHeader = (HWND)SendMessage(hList, LVM_GETHEADER, 0, 0); ok(!IsWindow(hHeader), "Header shouldn't be created\n"); - ok(NULL == GetDlgItem(hList, 0), "NULL dialog item expected\n"); + ok(GetDlgItem(hList, 0) == NULL, "NULL dialog item expected\n"); DestroyWindow(hList); @@ -1479,7 +1616,6 @@ static void test_redraw(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); - trace("invalidate & update\n"); InvalidateRect(hwnd, NULL, TRUE); UpdateWindow(hwnd); ok_sequence(sequences, LISTVIEW_SEQ_INDEX, redraw_listview_seq, "redraw listview", FALSE); @@ -1495,7 +1631,7 @@ static void test_redraw(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); r = SendMessageA(hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0); - ok(r != 0, "Expected not zero result\n"); + ok(r == 1, "Expected not zero result\n"); ok_sequence(sequences, PARENT_FULL_SEQ_INDEX, forward_erasebkgnd_parent_seq, "forward WM_ERASEBKGND on CLR_NONE", FALSE); @@ -1504,7 +1640,7 @@ static void test_redraw(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); r = SendMessageA(hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0); - ok(r != 0, "Expected not zero result\n"); + expect(1, r); ok_sequence(sequences, PARENT_FULL_SEQ_INDEX, empty_seq, "don't forward WM_ERASEBKGND on non-CLR_NONE", FALSE); @@ -1516,7 +1652,7 @@ static void test_redraw(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); r = SendMessageA(hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0); - ok(r != 0, "Expected not zero result\n"); + expect(1, r); ok_sequence(sequences, PARENT_FULL_SEQ_INDEX, forward_erasebkgnd_parent_seq, "forward WM_ERASEBKGND on CLR_NONE", FALSE); @@ -1525,7 +1661,7 @@ static void test_redraw(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); r = SendMessageA(hwnd, WM_ERASEBKGND, (WPARAM)hdc, 0); - todo_wine ok(r != 0, "Expected not zero result\n"); + todo_wine expect(1, r); ok_sequence(sequences, PARENT_FULL_SEQ_INDEX, empty_seq, "don't forward WM_ERASEBKGND on non-CLR_NONE", FALSE); @@ -1595,7 +1731,7 @@ static void test_icon_spacing(void) HWND hwnd; WORD w, h; - DWORD r; + INT r; hwnd = create_listview_control(LVS_ICON); ok(hwnd != NULL, "failed to create a listview window\n"); @@ -1613,8 +1749,6 @@ static void test_icon_spacing(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); - trace("test icon spacing\n"); - r = SendMessage(hwnd, LVM_SETICONSPACING, 0, MAKELPARAM(20, 30)); ok(r == MAKELONG(w, h) || broken(r == MAKELONG(w, w)), /* win98 */ @@ -1641,8 +1775,7 @@ static void test_icon_spacing(void) static void test_color(void) { - /* SETBKCOLOR/GETBKCOLOR, SETTEXTCOLOR/GETTEXTCOLOR, SETTEXTBKCOLOR/GETTEXTBKCOLOR */ - + RECT rect; HWND hwnd; DWORD r; int i; @@ -1655,30 +1788,60 @@ static void test_color(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); - trace("test color seq\n"); for (i = 0; i < 4; i++) { color = colors[i]; r = SendMessage(hwnd, LVM_SETBKCOLOR, 0, color); expect(TRUE, r); - r = SendMessage(hwnd, LVM_GETBKCOLOR, 0, color); + r = SendMessage(hwnd, LVM_GETBKCOLOR, 0, 0); expect(color, r); r = SendMessage(hwnd, LVM_SETTEXTCOLOR, 0, color); expect (TRUE, r); - r = SendMessage(hwnd, LVM_GETTEXTCOLOR, 0, color); + r = SendMessage(hwnd, LVM_GETTEXTCOLOR, 0, 0); expect(color, r); r = SendMessage(hwnd, LVM_SETTEXTBKCOLOR, 0, color); expect(TRUE, r); - r = SendMessage(hwnd, LVM_GETTEXTBKCOLOR, 0, color); + r = SendMessage(hwnd, LVM_GETTEXTBKCOLOR, 0, 0); expect(color, r); } ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_color_seq, "test color seq", FALSE); - flush_sequences(sequences, NUM_MSG_SEQUENCES); + + /* invalidation test done separately to avoid a message chain mess */ + r = ValidateRect(hwnd, NULL); + expect(TRUE, r); + r = SendMessage(hwnd, LVM_SETBKCOLOR, 0, colors[0]); + expect(TRUE, r); + + rect.right = rect.bottom = 1; + r = GetUpdateRect(hwnd, &rect, TRUE); + todo_wine expect(FALSE, r); + ok(rect.right == 0 && rect.bottom == 0, "got update rectangle\n"); + + r = ValidateRect(hwnd, NULL); + expect(TRUE, r); + r = SendMessage(hwnd, LVM_SETTEXTCOLOR, 0, colors[0]); + expect(TRUE, r); + + rect.right = rect.bottom = 1; + r = GetUpdateRect(hwnd, &rect, TRUE); + todo_wine expect(FALSE, r); + ok(rect.right == 0 && rect.bottom == 0, "got update rectangle\n"); + + r = ValidateRect(hwnd, NULL); + expect(TRUE, r); + r = SendMessage(hwnd, LVM_SETTEXTBKCOLOR, 0, colors[0]); + expect(TRUE, r); + + rect.right = rect.bottom = 1; + r = GetUpdateRect(hwnd, &rect, TRUE); + todo_wine expect(FALSE, r); + ok(rect.right == 0 && rect.bottom == 0, "got update rectangle\n"); + DestroyWindow(hwnd); } @@ -1719,8 +1882,6 @@ static void test_item_count(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); - trace("test item count\n"); - r = SendMessage(hwnd, LVM_GETITEMCOUNT, 0, 0); expect(0, r); @@ -1809,8 +1970,6 @@ static void test_item_position(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); - trace("test item position\n"); - /* [item0] */ item0.mask = LVIF_TEXT; item0.iItem = 0; @@ -1872,7 +2031,7 @@ static void test_getorigin(void) hwnd = create_listview_control(LVS_ICON); ok(hwnd != NULL, "failed to create a listview window\n"); flush_sequences(sequences, NUM_MSG_SEQUENCES); - trace("test get origin results\n"); + r = SendMessage(hwnd, LVM_GETORIGIN, 0, (LPARAM)&position); expect(TRUE, r); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -1881,7 +2040,7 @@ static void test_getorigin(void) hwnd = create_listview_control(LVS_SMALLICON); ok(hwnd != NULL, "failed to create a listview window\n"); flush_sequences(sequences, NUM_MSG_SEQUENCES); - trace("test get origin results\n"); + r = SendMessage(hwnd, LVM_GETORIGIN, 0, (LPARAM)&position); expect(TRUE, r); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -1890,7 +2049,7 @@ static void test_getorigin(void) hwnd = create_listview_control(LVS_LIST); ok(hwnd != NULL, "failed to create a listview window\n"); flush_sequences(sequences, NUM_MSG_SEQUENCES); - trace("test get origin results\n"); + r = SendMessage(hwnd, LVM_GETORIGIN, 0, (LPARAM)&position); expect(FALSE, r); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -1899,12 +2058,11 @@ static void test_getorigin(void) hwnd = create_listview_control(LVS_REPORT); ok(hwnd != NULL, "failed to create a listview window\n"); flush_sequences(sequences, NUM_MSG_SEQUENCES); - trace("test get origin results\n"); + r = SendMessage(hwnd, LVM_GETORIGIN, 0, (LPARAM)&position); expect(FALSE, r); flush_sequences(sequences, NUM_MSG_SEQUENCES); DestroyWindow(hwnd); - } static void test_multiselect(void) @@ -1919,7 +2077,7 @@ static void test_multiselect(void) } select_task; HWND hwnd; - DWORD r; + INT r; int i,j,item_count,selected_count; static const int items=5; BYTE kstate[256]; @@ -2118,8 +2276,8 @@ static void test_subitem_rect(void) rect.top = 1; rect.right = rect.bottom = 0; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, -1, (LPARAM)&rect); + expect(1, r); - ok(r != 0, "Expected not-null LRESULT\n"); expect(100, rect.left); expect(250, rect.right); todo_wine @@ -2129,8 +2287,8 @@ todo_wine rect.top = 2; rect.right = rect.bottom = 0; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, -1, (LPARAM)&rect); + expect(1, r); - ok(r != 0, "Expected not-null LRESULT\n"); expect(250, rect.left); expect(450, rect.right); todo_wine @@ -2143,7 +2301,7 @@ todo_wine rect.top = 1; rect.right = rect.bottom = 0; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 0, (LPARAM)&rect); - ok(r != 0, "Expected not-null LRESULT\n"); + expect(1, r); expect(100, rect.left); expect(250, rect.right); @@ -2151,7 +2309,7 @@ todo_wine rect.top = 1; rect.right = rect.bottom = 0; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 0, (LPARAM)&rect); - ok(r != 0, "Expected not-null LRESULT\n"); + expect(1, r); /* no icon attached - zero width rectangle, with no left padding */ expect(100, rect.left); expect(100, rect.right); @@ -2160,7 +2318,7 @@ todo_wine rect.top = 1; rect.right = rect.bottom = 0; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 0, (LPARAM)&rect); - ok(r != 0, "Expected not-null LRESULT\n"); + expect(1, r); /* same as full LVIR_BOUNDS */ expect(100, rect.left); expect(250, rect.right); @@ -2171,7 +2329,7 @@ todo_wine rect.top = 1; rect.right = rect.bottom = 0; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 0, (LPARAM)&rect); - ok(r != 0, "Expected not-null LRESULT\n"); + expect(1, r); expect(90, rect.left); expect(240, rect.right); @@ -2205,21 +2363,21 @@ todo_wine rect.top = 0; rect.right = rect.bottom = -1; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 2, (LPARAM)&rect); - ok(r == FALSE, "got %d\n", r); + expect(FALSE, r); /* for subitems rectangle is calculated even if there's no item added */ rect.left = LVIR_BOUNDS; rect.top = 1; rect.right = rect.bottom = -1; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 1, (LPARAM)&rect); - ok(r == TRUE, "got %d\n", r); + expect(TRUE, r); rect2.left = LVIR_BOUNDS; rect2.top = 1; rect2.right = rect2.bottom = -1; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 2, (LPARAM)&rect2); todo_wine { - ok(r == TRUE, "got %d\n", r); + expect(TRUE, r); expect(rect.right, rect2.right); expect(rect.left, rect2.left); expect(rect.bottom, rect2.top); @@ -2234,7 +2392,7 @@ todo_wine { rect.top = 0; rect.right = rect.bottom = -1; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 0, (LPARAM)&rect); - ok(r == TRUE, "got %d\n", r); + expect(TRUE, r); expect(0, rect.left); expect(600, rect.right); @@ -2242,7 +2400,7 @@ todo_wine { rect.top = 1; rect.right = rect.bottom = -1; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 0, (LPARAM)&rect); - ok(r == TRUE, "got %d\n", r); + expect(TRUE, r); expect(0, rect.left); expect(200, rect.right); @@ -2250,7 +2408,7 @@ todo_wine { rect2.top = 1; rect2.right = rect2.bottom = -1; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 1, (LPARAM)&rect2); - ok(r == TRUE, "got %d\n", r); + expect(TRUE, r); expect(0, rect2.left); expect(200, rect2.right); /* items are of the same height */ @@ -2262,7 +2420,7 @@ todo_wine { rect.top = 2; rect.right = rect.bottom = -1; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, 0, (LPARAM)&rect); - ok(r == TRUE, "got %d\n", r); + expect(TRUE, r); expect(300, rect.left); expect(600, rect.right); @@ -2275,7 +2433,7 @@ todo_wine { rect.top = 1; rect.right = rect.bottom = -10; r = SendMessage(hwnd, LVM_GETSUBITEMRECT, -1, (LPARAM)&rect); - ok(r == 0, "Expected not-null LRESULT\n"); + expect(0, r); /* rect is unchanged */ expect(0, rect.left); expect(-10, rect.right); @@ -2295,7 +2453,7 @@ static void test_sorting(void) { HWND hwnd; LVITEMA item = {0}; - DWORD r; + INT r; LONG_PTR style; static CHAR names[][5] = {"A", "B", "C", "D", "0"}; CHAR buff[10]; @@ -2541,7 +2699,7 @@ static void test_ownerdata(void) hwnd = create_listview_control(LVS_OWNERDATA | LVS_REPORT); ok(hwnd != NULL, "failed to create a listview window\n"); res = SendMessageA(hwnd, LVM_SETITEMCOUNT, 1, 0); - ok(res != 0, "Expected LVM_SETITEMCOUNT to succeed\n"); + expect(1, res); res = SendMessageA(hwnd, LVM_GETSELECTEDCOUNT, 0, 0); expect(0, res); memset(&item, 0, sizeof(item)); @@ -2559,7 +2717,7 @@ static void test_ownerdata(void) hwnd = create_listview_control(LVS_OWNERDATA | LVS_REPORT); ok(hwnd != NULL, "failed to create a listview window\n"); res = SendMessageA(hwnd, LVM_SETITEMCOUNT, 1, 0); - ok(res != 0, "Expected LVM_SETITEMCOUNT to succeed\n"); + expect(1, res); res = SendMessageA(hwnd, LVM_GETITEMCOUNT, 0, 0); expect(1, res); memset(&item, 0, sizeof(item)); @@ -2575,7 +2733,7 @@ static void test_ownerdata(void) hwnd = create_listview_control(LVS_OWNERDATA | LVS_REPORT); ok(hwnd != NULL, "failed to create a listview window\n"); res = SendMessageA(hwnd, LVM_SETITEMCOUNT, 20, 0); - ok(res != 0, "Expected LVM_SETITEMCOUNT to succeed\n"); + expect(1, res); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -2718,7 +2876,7 @@ static void test_ownerdata(void) hwnd = create_listview_control(LVS_OWNERDATA | LVS_REPORT); ok(hwnd != NULL, "failed to create a listview window\n"); res = SendMessageA(hwnd, LVM_SETITEMCOUNT, 1, 0); - ok(res != 0, "Expected LVM_SETITEMCOUNT to succeed\n"); + expect(1, res); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -2992,7 +3150,8 @@ static void test_hittest(void) LVITEMA item; static CHAR text[] = "1234567890ABCDEFGHIJKLMNOPQRST"; POINT pos; - INT x, y; + INT x, y, i; + WORD vert; HIMAGELIST himl, himl2; HBITMAP hbmp; @@ -3018,8 +3177,13 @@ static void test_hittest(void) memset(&bounds, 0, sizeof(bounds)); bounds.left = LVIR_BOUNDS; r = SendMessage(hwnd, LVM_GETITEMRECT, 0, (LPARAM)&bounds); + expect(1, r); ok(bounds.bottom - bounds.top > 0, "Expected non zero item height\n"); ok(bounds.right - bounds.left > 0, "Expected non zero item width\n"); + r = SendMessage(hwnd, LVM_GETITEMSPACING, TRUE, 0); + vert = HIWORD(r); + ok(bounds.bottom - bounds.top == vert, + "Vertical spacing inconsistent (%d != %d)\n", bounds.bottom - bounds.top, vert); r = SendMessage(hwnd, LVM_GETITEMPOSITION, 0, (LPARAM)&pos); expect(TRUE, r); @@ -3052,8 +3216,18 @@ static void test_hittest(void) test_lvm_subitemhittest(hwnd, x, y, -1, -1, LVHT_NOWHERE, FALSE, FALSE, FALSE); /* subitem returned with -1 item too */ x = pos.x + 150; - y = -10; + y = bounds.top - vert; test_lvm_subitemhittest(hwnd, x, y, -1, 1, LVHT_NOWHERE, FALSE, FALSE, FALSE); + test_lvm_subitemhittest(hwnd, x, y - vert + 1, -1, 1, LVHT_NOWHERE, FALSE, FALSE, FALSE); + /* return values appear to underflow with negative indices */ + i = -2; + y = y - vert; + while (i > -10) { + test_lvm_subitemhittest(hwnd, x, y, i, 1, LVHT_ONITEMLABEL, TRUE, FALSE, TRUE); + test_lvm_subitemhittest(hwnd, x, y - vert + 1, i, 1, LVHT_ONITEMLABEL, TRUE, FALSE, TRUE); + y = y - vert; + i--; + } /* parent client area is 100x100 by default */ MoveWindow(hwnd, 0, 0, 300, 100, FALSE); x = pos.x + 150; /* outside column */ @@ -3100,7 +3274,7 @@ static void test_hittest(void) ok(r == 1, "should be one\n"); r = SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_STATE, (LPARAM)himl); - ok(r == 0, "should return zero\n"); + expect(0, r); item.mask = LVIF_IMAGE; item.iImage = 0; @@ -3136,7 +3310,7 @@ static void test_hittest(void) ok(himl2 == himl, "should return handle\n"); r = SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)himl); - ok(r == 0, "should return zero\n"); + expect(0, r); /* on item icon */ x = pos.x + 8; y = pos.y + (bounds.bottom - bounds.top) / 2; @@ -3261,7 +3435,7 @@ static void test_columnscreation(void) static void test_getitemrect(void) { HWND hwnd; - HIMAGELIST himl; + HIMAGELIST himl, himl_ret; HBITMAP hbm; RECT rect; DWORD r; @@ -3269,6 +3443,7 @@ static void test_getitemrect(void) LVCOLUMNA col; INT order[2]; POINT pt; + HDC hdc; /* rectangle isn't empty for empty text items */ hwnd = create_listview_control(LVS_LIST); @@ -3278,10 +3453,13 @@ static void test_getitemrect(void) r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item); expect(0, r); rect.left = LVIR_LABEL; - SendMessage(hwnd, LVM_GETITEMRECT, 0, (LPARAM)&rect); + r = SendMessage(hwnd, LVM_GETITEMRECT, 0, (LPARAM)&rect); + expect(TRUE, r); expect(0, rect.left); expect(0, rect.top); - todo_wine expect(96, rect.right); + hdc = GetDC(hwnd); + todo_wine expect(((GetDeviceCaps(hdc, LOGPIXELSX) + 15) / 16) * 16, rect.right); + ReleaseDC(hwnd, hdc); DestroyWindow(hwnd); hwnd = create_listview_control(LVS_REPORT); @@ -3385,14 +3563,14 @@ static void test_getitemrect(void) hbm = CreateBitmap(16, 16, 1, 1, NULL); ok(hbm != NULL, "failed to create bitmap\n"); r = ImageList_Add(himl, hbm, 0); - ok(r == 0, "should be zero\n"); + expect(0, r); hbm = CreateBitmap(16, 16, 1, 1, NULL); ok(hbm != NULL, "failed to create bitmap\n"); r = ImageList_Add(himl, hbm, 0); - ok(r == 1, "should be one\n"); + expect(1, r); r = SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_STATE, (LPARAM)himl); - ok(r == 0, "should return zero\n"); + expect(0, r); item.mask = LVIF_STATE; item.state = INDEXTOSTATEIMAGEMASK(1); @@ -3419,11 +3597,11 @@ static void test_getitemrect(void) expect(18, rect.left); expect(50, rect.right); - r = SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_STATE, 0); - ok(r != 0, "should return current list handle\n"); + himl_ret = (HIMAGELIST)SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_STATE, 0); + ok(himl_ret == himl, "got %p, expected %p\n", himl_ret, himl); r = SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)himl); - ok(r == 0, "should return zero\n"); + expect(0, r); item.mask = LVIF_STATE | LVIF_IMAGE; item.iImage = 1; @@ -3511,10 +3689,11 @@ static void test_editbox(void) { static CHAR testitemA[] = "testitem"; static CHAR testitem1A[] = "testitem_quitelongname"; + static CHAR testitem2A[] = "testITEM_quitelongname"; static CHAR buffer[25]; HWND hwnd, hwndedit, hwndedit2, header; LVITEMA item; - DWORD r; + INT r; hwnd = create_listview_control(LVS_EDITLABELS | LVS_REPORT); ok(hwnd != NULL, "failed to create a listview window\n"); @@ -3607,8 +3786,11 @@ static void test_editbox(void) /* modify edit and notify control that it lost focus */ r = SendMessage(hwndedit, WM_SETTEXT, 0, (LPARAM)testitem1A); expect(TRUE, r); + g_editbox_disp_info.item.pszText = NULL; r = SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(0, EN_KILLFOCUS), (LPARAM)hwndedit); expect(0, r); + ok(g_editbox_disp_info.item.pszText != NULL, "expected notification with not null text\n"); + memset(&item, 0, sizeof(item)); item.pszText = buffer; item.cchTextMax = sizeof(buffer); @@ -3618,6 +3800,29 @@ static void test_editbox(void) expect(lstrlen(item.pszText), r); ok(strcmp(buffer, testitem1A) == 0, "Expected item text to change\n"); ok(!IsWindow(hwndedit), "Expected Edit window to be freed\n"); + + /* change item name to differ in casing only */ + SetFocus(hwnd); + hwndedit = (HWND)SendMessage(hwnd, LVM_EDITLABEL, 0, 0); + ok(IsWindow(hwndedit), "Expected Edit window to be created\n"); + /* modify edit and notify control that it lost focus */ + r = SendMessage(hwndedit, WM_SETTEXT, 0, (LPARAM)testitem2A); + expect(TRUE, r); + g_editbox_disp_info.item.pszText = NULL; + r = SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(0, EN_KILLFOCUS), (LPARAM)hwndedit); + expect(0, r); + ok(g_editbox_disp_info.item.pszText != NULL, "got %p\n", g_editbox_disp_info.item.pszText); + + memset(&item, 0, sizeof(item)); + item.pszText = buffer; + item.cchTextMax = sizeof(buffer); + item.iItem = 0; + item.iSubItem = 0; + r = SendMessage(hwnd, LVM_GETITEMTEXTA, 0, (LPARAM)&item); + expect(lstrlen(item.pszText), r); + ok(strcmp(buffer, testitem2A) == 0, "got %s, expected %s\n", buffer, testitem2A); + ok(!IsWindow(hwndedit), "Expected Edit window to be freed\n"); + /* end edit without saving */ SetFocus(hwnd); hwndedit = (HWND)SendMessage(hwnd, LVM_EDITLABEL, 0, 0); @@ -3642,7 +3847,7 @@ static void test_editbox(void) item.iSubItem = 0; r = SendMessage(hwnd, LVM_GETITEMTEXTA, 0, (LPARAM)&item); expect(lstrlen(item.pszText), r); - ok(strcmp(buffer, testitem1A) == 0, "Expected item text to change\n"); + ok(strcmp(buffer, testitem2A) == 0, "Expected item text to change\n"); /* LVM_EDITLABEL with -1 destroys current edit */ hwndedit = (HWND)SendMessage(hwnd, LVM_GETEDITCONTROL, 0, 0); @@ -3686,7 +3891,7 @@ static void test_editbox(void) ok_sequence(sequences, EDITBOX_SEQ_INDEX, editbox_create_pos, "edit box create - sizing", FALSE); - /* WM_COMMAND with EN_KILLFOCUS isn't forwared to parent */ + /* WM_COMMAND with EN_KILLFOCUS isn't forwarded to parent */ SetFocus(hwnd); hwndedit = (HWND)SendMessage(hwnd, LVM_EDITLABEL, 0, 0); ok(IsWindow(hwndedit), "Expected Edit window to be created\n"); @@ -3711,7 +3916,7 @@ static void test_notifyformat(void) CCM_SETUNICODEFORMAT == LVM_SETUNICODEFORMAT */ r = SendMessage(hwnd, LVM_GETUNICODEFORMAT, 0, 0); expect(0, r); - r = SendMessage(hwnd, WM_NOTIFYFORMAT, 0, NF_QUERY); + SendMessage(hwnd, WM_NOTIFYFORMAT, 0, NF_QUERY); /* set */ r = SendMessage(hwnd, LVM_SETUNICODEFORMAT, 1, 0); expect(0, r); @@ -3741,7 +3946,7 @@ static void test_notifyformat(void) r = SendMessage(hwnd, LVM_GETUNICODEFORMAT, 0, 0); expect(0, r); r = SendMessage(header, HDM_GETUNICODEFORMAT, 0, 0); - ok( r == 1 || broken(r == 0), /* win9x */ "Expected 1, got %d\n", r ); + ok( r == 1, "Expected 1, got %d\n", r ); r = SendMessage(hwnd, WM_NOTIFYFORMAT, 0, NF_QUERY); ok(r != 0, "Expected valid format\n"); @@ -3751,7 +3956,7 @@ static void test_notifyformat(void) r = SendMessage(hwnd, LVM_GETUNICODEFORMAT, 0, 0); expect(1, r); r = SendMessage(header, HDM_GETUNICODEFORMAT, 0, 0); - ok( r == 1 || broken(r == 0), /* win9x */ "Expected 1, got %d\n", r ); + ok( r == 1, "Expected 1, got %d\n", r ); notifyFormat = NFR_ANSI; r = SendMessage(hwnd, WM_NOTIFYFORMAT, 0, NF_REQUERY); @@ -3759,17 +3964,10 @@ static void test_notifyformat(void) r = SendMessage(hwnd, LVM_GETUNICODEFORMAT, 0, 0); expect(0, r); r = SendMessage(header, HDM_GETUNICODEFORMAT, 0, 0); - ok( r == 1 || broken(r == 0), /* win9x */ "Expected 1, got %d\n", r ); + ok( r == 1, "Expected 1, got %d\n", r ); DestroyWindow(hwnd); - /* try different unicode window combination and defaults */ - if (!GetModuleHandleW(NULL)) - { - win_skip("Additional notify format tests are incompatible with Win9x\n"); - return; - } - hwndparentW = create_parent_window(TRUE); ok(IsWindow(hwndparentW), "Unicode parent creation failed\n"); if (!IsWindow(hwndparentW)) return; @@ -3966,7 +4164,7 @@ static void test_canceleditlabel(void) hwndedit = (HWND)SendMessage(hwnd, LVM_EDITLABEL, 0, 0); ok(IsWindow(hwndedit), "Expected edit control to be created\n"); ret = SetWindowText(hwndedit, test1); - ok(ret != 0, "Expected edit text to change\n"); + expect(1, ret); ret = SendMessage(hwnd, LVM_CANCELEDITLABEL, 0, 0); expect(TRUE, ret); ok(!IsWindow(hwndedit), "Expected edit control to be destroyed\n"); @@ -3983,7 +4181,7 @@ static void test_canceleditlabel(void) static void test_mapidindex(void) { HWND hwnd; - DWORD ret; + INT ret; /* LVM_MAPINDEXTOID unsupported with LVS_OWNERDATA */ hwnd = create_listview_control(LVS_OWNERDATA | LVS_REPORT); @@ -4105,10 +4303,11 @@ todo_wine { static void test_getcolumnwidth(void) { HWND hwnd; - DWORD ret; + INT ret; DWORD_PTR style; LVCOLUMNA col; LVITEMA itema; + HDC hdc; /* default column width */ hwnd = create_listview_control(LVS_ICON); @@ -4132,7 +4331,9 @@ static void test_getcolumnwidth(void) memset(&itema, 0, sizeof(itema)); SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&itema); ret = SendMessage(hwnd, LVM_GETCOLUMNWIDTH, 0, 0); - todo_wine expect(96, ret); + hdc = GetDC(hwnd); + todo_wine expect(((GetDeviceCaps(hdc, LOGPIXELSX) + 15) / 16) * 16, ret); + ReleaseDC(hwnd, hdc); DestroyWindow(hwnd); } @@ -4254,37 +4455,39 @@ static void test_approximate_viewrect(void) } ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, 11, MAKELPARAM(100,100)); - ok(MAKELONG(77,827)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(77,827), ret); ret = SendMessage(hwnd, LVM_SETICONSPACING, 0, MAKELPARAM(50, 50)); + ok(ret != 0, "got 0\n"); + ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, 11, MAKELPARAM(100,100)); - ok(MAKELONG(102,302)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(102,302), ret); ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, -1, MAKELPARAM(100,100)); - ok(MAKELONG(52,52)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(52,52), ret); itema.pszText = test; ret = SendMessage(hwnd, LVM_SETITEMTEXT, 0, (LPARAM)&itema); expect(TRUE, ret); ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, -1, MAKELPARAM(100,100)); - ok(MAKELONG(52,52)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(52,52), ret); ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, 0, MAKELPARAM(100,100)); - ok(MAKELONG(52,2)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(52,2), ret); ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, 1, MAKELPARAM(100,100)); - ok(MAKELONG(52,52)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(52,52), ret); ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, 2, MAKELPARAM(100,100)); - ok(MAKELONG(102,52)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(102,52), ret); ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, 3, MAKELPARAM(100,100)); - ok(MAKELONG(102,102)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(102,102), ret); ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, 4, MAKELPARAM(100,100)); - ok(MAKELONG(102,102)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(102,102), ret); ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, 5, MAKELPARAM(100,100)); - ok(MAKELONG(102,152)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(102,152), ret); ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, 6, MAKELPARAM(100,100)); - ok(MAKELONG(102,152)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(102,152), ret); ret = SendMessage(hwnd, LVM_APPROXIMATEVIEWRECT, 7, MAKELPARAM(160,100)); - ok(MAKELONG(152,152)==ret,"Incorrect Approximate rect\n"); + expect(MAKELONG(152,152), ret); DestroyWindow(hwnd); } @@ -4294,7 +4497,7 @@ static void test_finditem(void) LVFINDINFOA fi; static char f[5]; HWND hwnd; - DWORD r; + INT r; hwnd = create_listview_control(LVS_REPORT); insert_item(hwnd, 0); @@ -4453,31 +4656,48 @@ static void test_destroynotify(void) static void test_header_notification(void) { + static char textA[] = "newtext"; HWND list, header; HDITEMA item; NMHEADER nmh; LVCOLUMNA col; - LRESULT ret; + DWORD ret; + BOOL r; list = create_listview_control(LVS_REPORT); - ok(list != 0, "failed to create listview window\n"); + ok(list != NULL, "failed to create listview window\n"); memset(&col, 0, sizeof(col)); col.mask = LVCF_WIDTH; col.cx = 100; ret = SendMessage(list, LVM_INSERTCOLUMNA, 0, (LPARAM)&col); - ok(!ret, "expected 0, got %ld\n", ret); + expect(0, ret); + + /* check list parent notification after header item changed, + this test should be placed before header subclassing to avoid + Listview -> Header messages to be logged */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + col.mask = LVCF_TEXT; + col.pszText = textA; + r = SendMessage(list, LVM_SETCOLUMNA, 0, (LPARAM)&col); + expect(TRUE, r); + + ok_sequence(sequences, LISTVIEW_SEQ_INDEX, listview_header_changed_seq, + "header notify, listview", FALSE); + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, + "header notify, parent", FALSE); header = subclass_header(list); ret = SendMessage(header, HDM_GETITEMCOUNT, 0, 0); - ok(ret == 1, "expected header item count 1, got %ld\n", ret); + expect(1, ret); memset(&item, 0, sizeof(item)); item.mask = HDI_WIDTH; ret = SendMessage(header, HDM_GETITEMA, 0, (LPARAM)&item); - ok(ret, "HDM_GETITEM failed\n"); - ok(item.cxy == 100, "expected 100, got %d\n", item.cxy); + expect(1, ret); + expect(100, item.cxy); nmh.hdr.hwndFrom = header; nmh.hdr.idFrom = GetWindowLongPtr(header, GWLP_ID); @@ -4488,7 +4708,7 @@ static void test_header_notification(void) item.cxy = 50; nmh.pitem = &item; ret = SendMessage(list, WM_NOTIFY, 0, (LPARAM)&nmh); - ok(!ret, "WM_NOTIFY/HDN_ITEMCHANGED failed\n"); + expect(0, ret); DestroyWindow(list); } @@ -4500,7 +4720,7 @@ static void test_createdragimage(void) HWND list; list = create_listview_control(LVS_ICON); - ok(list != 0, "failed to create listview window\n"); + ok(list != NULL, "failed to create listview window\n"); insert_item(list, 0); @@ -4515,6 +4735,73 @@ static void test_createdragimage(void) DestroyWindow(list); } +static void test_dispinfo(void) +{ + static const char testA[] = "TEST"; + WCHAR buff[10]; + LVITEMA item; + HWND hwnd; + DWORD ret; + + hwnd = create_listview_control(LVS_ICON); + ok(hwnd != NULL, "failed to create listview window\n"); + + insert_item(hwnd, 0); + + memset(&item, 0, sizeof(item)); + item.pszText = LPSTR_TEXTCALLBACKA; + ret = SendMessageA(hwnd, LVM_SETITEMTEXTA, 0, (LPARAM)&item); + expect(1, ret); + + g_disp_A_to_W = TRUE; + item.pszText = (char*)buff; + item.cchTextMax = sizeof(buff)/sizeof(WCHAR); + ret = SendMessageA(hwnd, LVM_GETITEMTEXTA, 0, (LPARAM)&item); + ok(ret == sizeof(testA)-1, "got %d, expected 4\n", ret); + g_disp_A_to_W = FALSE; + + ok(memcmp(item.pszText, testA, sizeof(testA)) == 0, + "got %s, expected %s\n", item.pszText, testA); + + DestroyWindow(hwnd); +} + +static void test_LVM_SETITEMTEXT(void) +{ + static char testA[] = "TEST"; + LVITEMA item; + HWND hwnd; + DWORD ret; + + hwnd = create_listview_control(LVS_ICON); + ok(hwnd != NULL, "failed to create listview window\n"); + + insert_item(hwnd, 0); + + /* null item pointer */ + ret = SendMessage(hwnd, LVM_SETITEMTEXTA, 0, 0); + expect(FALSE, ret); + + ret = SendMessage(hwnd, LVM_SETITEMTEXTW, 0, 0); + expect(FALSE, ret); + + /* index out of bounds */ + item.pszText = testA; + item.cchTextMax = 0; /* ignored */ + item.iSubItem = 0; + + ret = SendMessageA(hwnd, LVM_SETITEMTEXTA, 1, (LPARAM)&item); + expect(FALSE, ret); + + ret = SendMessageA(hwnd, LVM_SETITEMTEXTA, -1, (LPARAM)&item); + expect(FALSE, ret); + + ret = SendMessageA(hwnd, LVM_SETITEMTEXTA, 0, (LPARAM)&item); + expect(TRUE, ret); + + DestroyWindow(hwnd); +} + START_TEST(listview) { HMODULE hComctl32; @@ -4578,6 +4865,8 @@ START_TEST(listview) test_hover(); test_destroynotify(); test_createdragimage(); + test_dispinfo(); + test_LVM_SETITEMTEXT(); if (!load_v6_module(&ctx_cookie, &hCtx)) { diff --git a/rostests/winetests/comctl32/misc.c b/rostests/winetests/comctl32/misc.c index 8f83260db17..5aff06f95ea 100644 --- a/rostests/winetests/comctl32/misc.c +++ b/rostests/winetests/comctl32/misc.c @@ -87,18 +87,15 @@ static void test_GetPtrAW(void) * Our implementation also crashes and we should probably leave * it like that. */ - count = -1; count = pStr_GetPtrA(NULL, NULL, destsize); trace("count : %d\n", count); } - count = 0; count = pStr_GetPtrA(source, NULL, 0); ok (count == sourcelen || broken(count == sourcelen - 1), /* win9x */ "Expected count to be %d, it was %d\n", sourcelen, count); - count = 0; strcpy(dest, desttest); count = pStr_GetPtrA(source, dest, 0); ok (count == sourcelen || @@ -108,26 +105,22 @@ static void test_GetPtrAW(void) broken(!lstrcmp(dest, "")), /* Win7 */ "Expected destination to not have changed\n"); - count = 0; count = pStr_GetPtrA(source, NULL, destsize); ok (count == sourcelen || broken(count == sourcelen - 1), /* win9x */ "Expected count to be %d, it was %d\n", sourcelen, count); - count = 0; count = pStr_GetPtrA(source, dest, destsize); ok (count == sourcelen || broken(count == sourcelen - 1), /* win9x */ "Expected count to be %d, it was %d\n", sourcelen, count); ok (!lstrcmp(source, dest), "Expected source and destination to be the same\n"); - count = -1; strcpy(dest, desttest); count = pStr_GetPtrA(NULL, dest, destsize); ok (count == 0, "Expected count to be 0, it was %d\n", count); ok (dest[0] == '\0', "Expected destination to be cut-off and 0 terminated\n"); - count = 0; destsize = 15; count = pStr_GetPtrA(source, dest, destsize); ok (count == 15 || diff --git a/rostests/winetests/comctl32/monthcal.c b/rostests/winetests/comctl32/monthcal.c index 30f682ff815..0585bb44ba7 100644 --- a/rostests/winetests/comctl32/monthcal.c +++ b/rostests/winetests/comctl32/monthcal.c @@ -28,12 +28,14 @@ #include "commctrl.h" #include "wine/test.h" +#include "v6util.h" #include #include #include "msg.h" #define expect(expected, got) ok(expected == got, "Expected %d, got %d\n", expected, got); #define expect_hex(expected, got) ok(expected == got, "Expected %x, got %x\n", expected, got); +#define expect_d(expected, got) ok(abs((expected) - (got)) <= 2, "Expected %d, got %d\n", expected, got); #define NUM_MSG_SEQUENCES 2 #define PARENT_SEQ_INDEX 0 @@ -83,45 +85,6 @@ static const struct message create_monthcal_multi_sel_style_seq[] = { { 0 } }; -static const struct message monthcal_color_seq[] = { - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_BACKGROUND, 0}, - - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_MONTHBK, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_MONTHBK, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_MONTHBK, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_MONTHBK, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_MONTHBK, 0}, - - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TEXT, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TEXT, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TEXT, 0}, - - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLEBK, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TITLEBK, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLEBK, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TITLEBK, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLEBK, 0}, - - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TITLETEXT, 0}, - - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, RGB(0,0,0)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, 0}, - { MCM_SETCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, RGB(255,255,255)}, - { MCM_GETCOLOR, sent|wparam|lparam, MCSC_TRAILINGTEXT, 0}, - { 0 } -}; - static const struct message monthcal_curr_date_seq[] = { { MCM_SETCURSEL, sent|wparam, 0}, { WM_PAINT, sent|wparam|lparam|defwinproc, 0, 0}, @@ -292,26 +255,6 @@ static const struct message destroy_monthcal_multi_sel_style_seq[] = { { 0 } }; -/* expected message sequence for parent window*/ -static const struct message destroy_parent_seq[] = { - { 0x0090, sent|optional }, /* Vista */ - { WM_WINDOWPOSCHANGING, sent|wparam, 0}, - { WM_WINDOWPOSCHANGED, sent|wparam, 0}, - { WM_IME_SETCONTEXT, sent|wparam|optional, 0}, - { WM_IME_NOTIFY, sent|wparam|lparam|defwinproc|optional, 1, 0}, - { WM_NCACTIVATE, sent|wparam|optional, 0}, - { WM_ACTIVATE, sent|wparam|optional, 0}, - { WM_NCACTIVATE, sent|wparam|lparam|optional, 0, 0}, - { WM_ACTIVATE, sent|wparam|lparam|optional, 0, 0}, - { WM_ACTIVATEAPP, sent|wparam|optional, 0}, - { WM_KILLFOCUS, sent|wparam|lparam|optional, 0, 0}, - { WM_IME_SETCONTEXT, sent|wparam|optional, 0}, - { WM_IME_NOTIFY, sent|wparam|lparam|defwinproc|optional, 1, 0}, - { WM_DESTROY, sent|wparam|lparam, 0, 0}, - { WM_NCDESTROY, sent|wparam|lparam, 0, 0}, - { 0 } -}; - static void test_monthcal(void) { HWND hwnd; @@ -523,6 +466,29 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP add_message(sequences, PARENT_SEQ_INDEX, &msg); } + if (message == WM_NOTIFY) + { + NMHDR *hdr = (NMHDR*)lParam; + switch (hdr->code) + { + case MCN_GETDAYSTATE: + { + NMDAYSTATE *nmstate = (NMDAYSTATE*)lParam; + static MONTHDAYSTATE months[14] = { 0 }; + + ok(nmstate->cDayState > 0, "got %d\n", nmstate->cDayState); + ok(nmstate->cDayState <= 14, "got %d\n", nmstate->cDayState); + ok(nmstate->prgDayState != NULL, "got %p\n", nmstate->prgDayState); + + nmstate->prgDayState = months; + + return TRUE; + } + default: + break; + } + } + defwndproc_counter++; ret = DefWindowProcA(hwnd, message, wParam, lParam); defwndproc_counter--; @@ -629,82 +595,83 @@ static HWND create_monthcal_control(DWORD style) /* Setter and Getters Tests */ -static void test_monthcal_color(void) +static void test_color(void) { - int res, temp; + COLORREF color, prev; HWND hwnd; hwnd = create_monthcal_control(0); - flush_sequences(sequences, NUM_MSG_SEQUENCES); + /* invalid color index */ + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT + 1, 0); + expect(~0u, color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TRAILINGTEXT + 1, RGB(255,255,255)); + expect(~0u, prev); - /* Setter and Getters for color*/ - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_BACKGROUND, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_BACKGROUND, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); - expect(RGB(255,255,255), temp); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_BACKGROUND, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_BACKGROUND, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_BACKGROUND, 0); + expect(RGB(255,255,255), color); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_MONTHBK, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_MONTHBK, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); - expect(RGB(255,255,255), temp); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_MONTHBK, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_MONTHBK, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_MONTHBK, 0); + expect(RGB(255,255,255), color); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TEXT, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TEXT, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); - expect(RGB(255,255,255), temp); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TEXT, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TEXT, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TEXT, 0); + expect(RGB(255,255,255), color); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLEBK, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLEBK, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); - expect(RGB(255,255,255), temp); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLEBK, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLEBK, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLEBK, 0); + expect(RGB(255,255,255), color); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLETEXT, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLETEXT, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); - expect(RGB(255,255,255), temp); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLETEXT, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TITLETEXT, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TITLETEXT, 0); + expect(RGB(255,255,255), color); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TRAILINGTEXT, RGB(0,0,0)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); - expect(RGB(0,0,0), temp); - res = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TRAILINGTEXT, RGB(255,255,255)); - expect(temp, res); - temp = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); - expect(RGB(255,255,255), temp); - - ok_sequence(sequences, MONTHCAL_SEQ_INDEX, monthcal_color_seq, "monthcal color", FALSE); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TRAILINGTEXT, RGB(0,0,0)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); + expect(RGB(0,0,0), color); + prev = SendMessage(hwnd, MCM_SETCOLOR, MCSC_TRAILINGTEXT, RGB(255,255,255)); + expect(color, prev); + color = SendMessage(hwnd, MCM_GETCOLOR, MCSC_TRAILINGTEXT, 0); + expect(RGB(255,255,255), color); DestroyWindow(hwnd); } -static void test_monthcal_currdate(void) +static void test_currdate(void) { SYSTEMTIME st_original, st_new, st_test; int res; @@ -831,15 +798,43 @@ static void test_monthcal_currdate(void) res = SendMessage(hwnd, MCM_SETCURSEL, 0, (LPARAM)&st_new); expect(1, res); + /* set with invalid day of week */ + memset(&st_test, 0, sizeof(st_test)); + st_test.wYear = 2009; + st_test.wDay = 7; + st_test.wMonth = 10; + st_test.wDayOfWeek = 100; + res = SendMessage(hwnd, MCM_SETCURSEL, 0, (LPARAM)&st_test); + expect(1, res); + + memset(&st_test, 0, sizeof(st_test)); + res = SendMessage(hwnd, MCM_GETCURSEL, 0, (LPARAM)&st_test); + expect(1, res); + expect(2009, st_test.wYear); + expect(7, st_test.wDay); + expect(10, st_test.wMonth); + expect(3, st_test.wDayOfWeek); + DestroyWindow(hwnd); } -static void test_monthcal_firstDay(void) +static void test_firstDay(void) { int res, fday, i, prev; - CHAR b[128]; + CHAR b[128], caltype[3]; LCID lcid = LOCALE_USER_DEFAULT; HWND hwnd; + LRESULT ret; + + SetLastError(0xdeadbeef); + ret = GetLocaleInfoA(lcid, LOCALE_ICALENDARTYPE, caltype, 3); + if (ret == 0) { + skip("Must know local calendar type (%x)\n", GetLastError()); + return; + } else if (atoi(caltype) != CAL_GREGORIAN) { + skip("MonthCalendar Control only supports Gregorian calendar (type: %s)\n", caltype); + return; + } hwnd = create_monthcal_control(0); @@ -881,7 +876,7 @@ static void test_monthcal_firstDay(void) DestroyWindow(hwnd); } -static void test_monthcal_unicode(void) +static void test_unicode(void) { int res, temp; HWND hwnd; @@ -924,7 +919,7 @@ static void test_monthcal_unicode(void) DestroyWindow(hwnd); } -static void test_monthcal_hittest(void) +static void test_hittest(void) { typedef struct hittest_test { @@ -965,11 +960,11 @@ static void test_monthcal_hittest(void) res = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); expect(0, mchit.pt.x); expect(0, mchit.pt.y); - expect(-1, res); + expect(~0u, res); expect(0, mchit.uHit); /* test with invalid pointer */ res = SendMessage(hwnd, MCM_HITTEST, 0, 0); - expect(-1, res); + expect(~0u, res); /* resize control to display single Calendar */ res = SendMessage(hwnd, MCM_GETMINREQRECT, 0, (LPARAM)&r); @@ -1175,7 +1170,7 @@ static void test_monthcal_hittest(void) DestroyWindow(hwnd); } -static void test_monthcal_todaylink(void) +static void test_todaylink(void) { MCHITTESTINFO mchit; SYSTEMTIME st_test, st_new; @@ -1188,6 +1183,7 @@ static void test_monthcal_todaylink(void) hwnd = create_monthcal_control(0); res = SendMessage(hwnd, MCM_GETMINREQRECT, 0, (LPARAM)&r); + expect(1, res); MoveWindow(hwnd, 0, 0, r.right, r.bottom, FALSE); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -1206,7 +1202,8 @@ static void test_monthcal_todaylink(void) st_test.wMonth = 1; st_test.wYear = 2005; - SendMessage(hwnd, MCM_SETTODAY, 0, (LPARAM)&st_test); + res = SendMessage(hwnd, MCM_SETTODAY, 0, (LPARAM)&st_test); + expect(0, res); memset(&st_new, 0, sizeof(st_new)); res = SendMessage(hwnd, MCM_GETTODAY, 0, (LPARAM)&st_new); @@ -1230,7 +1227,7 @@ static void test_monthcal_todaylink(void) DestroyWindow(hwnd); } -static void test_monthcal_today(void) +static void test_today(void) { SYSTEMTIME st_test, st_new; int res; @@ -1250,7 +1247,8 @@ static void test_monthcal_today(void) st_new.wDay = 27; st_new.wMonth = 27; - SendMessage(hwnd, MCM_SETTODAY, 0, (LPARAM)&st_test); + res = SendMessage(hwnd, MCM_SETTODAY, 0, (LPARAM)&st_test); + expect(0, res); res = SendMessage(hwnd, MCM_GETTODAY, 0, (LPARAM)&st_new); expect(1, res); @@ -1267,7 +1265,8 @@ static void test_monthcal_today(void) st_test.wDay = 0; st_test.wMonth = 0; - SendMessage(hwnd, MCM_SETTODAY, 0, (LPARAM)&st_test); + res = SendMessage(hwnd, MCM_SETTODAY, 0, (LPARAM)&st_test); + expect(0, res); res = SendMessage(hwnd, MCM_GETTODAY, 0, (LPARAM)&st_new); expect(1, res); @@ -1285,7 +1284,7 @@ static void test_monthcal_today(void) DestroyWindow(hwnd); } -static void test_monthcal_scroll(void) +static void test_scroll(void) { int res; HWND hwnd; @@ -1323,7 +1322,7 @@ static void test_monthcal_scroll(void) DestroyWindow(hwnd); } -static void test_monthcal_monthrange(void) +static void test_monthrange(void) { int res; SYSTEMTIME st_visible[2], st_daystate[2], st; @@ -1360,34 +1359,32 @@ static void test_monthcal_monthrange(void) flush_sequences(sequences, NUM_MSG_SEQUENCES); res = SendMessage(hwnd, MCM_GETMONTHRANGE, GMR_VISIBLE, (LPARAM)st_visible); - todo_wine { - expect(2, res); - } + expect(2, res); expect(2000, st_visible[0].wYear); expect(11, st_visible[0].wMonth); expect(1, st_visible[0].wDay); expect(2000, st_visible[1].wYear); + expect(12, st_visible[1].wMonth); + expect(31, st_visible[1].wDay); - todo_wine { - expect(12, st_visible[1].wMonth); - expect(31, st_visible[1].wDay); - } res = SendMessage(hwnd, MCM_GETMONTHRANGE, GMR_DAYSTATE, (LPARAM)st_daystate); - todo_wine { - expect(4, res); - } + expect(4, res); expect(2000, st_daystate[0].wYear); expect(10, st_daystate[0].wMonth); expect(29, st_daystate[0].wDay); - - todo_wine { - expect(2001, st_daystate[1].wYear); - expect(1, st_daystate[1].wMonth); - expect(6, st_daystate[1].wDay); - } + expect(2001, st_daystate[1].wYear); + expect(1, st_daystate[1].wMonth); + expect(6, st_daystate[1].wDay); ok_sequence(sequences, MONTHCAL_SEQ_INDEX, monthcal_monthrange_seq, "monthcal monthrange", FALSE); + /* with null date array parameter */ + res = SendMessage(hwnd, MCM_GETMONTHRANGE, GMR_VISIBLE, 0); + expect(2, res); + + res = SendMessage(hwnd, MCM_GETMONTHRANGE, GMR_DAYSTATE, 0); + expect(4, res); + /* resize control to display single Calendar */ MoveWindow(hwnd, 0, 0, r.right, r.bottom, FALSE); @@ -1416,7 +1413,7 @@ static void test_monthcal_monthrange(void) DestroyWindow(hwnd); } -static void test_monthcal_maxselday(void) +static void test_maxselday(void) { int res; HWND hwnd; @@ -1482,7 +1479,7 @@ static void test_monthcal_maxselday(void) DestroyWindow(hwnd); } -static void test_monthcal_size(void) +static void test_size(void) { int res; RECT r1, r2; @@ -1518,7 +1515,7 @@ static void test_monthcal_size(void) DestroyWindow(hwnd); } -static void test_monthcal_create(void) +static void test_create(void) { HWND hwnd; @@ -1535,7 +1532,7 @@ static void test_monthcal_create(void) DestroyWindow(hwnd); } -static void test_monthcal_destroy(void) +static void test_destroy(void) { HWND hwnd; @@ -1552,7 +1549,7 @@ static void test_monthcal_destroy(void) ok_sequence(sequences, MONTHCAL_SEQ_INDEX, destroy_monthcal_multi_sel_style_seq, "Destroy monthcal (multi sel style)", FALSE); } -static void test_monthcal_selrange(void) +static void test_selrange(void) { HWND hwnd; SYSTEMTIME st, range[2], range2[2]; @@ -1680,11 +1677,256 @@ static void test_killfocus(void) DestroyWindow(hwnd); } +static void test_hittest_v6(void) +{ + MCHITTESTINFO mchit; + DWORD ret; + HWND hwnd; + RECT r; + + hwnd = create_monthcal_control(0); + SendMessage(hwnd, MCM_SETCALENDARBORDER, TRUE, 0); + + SendMessage(hwnd, MCM_GETMINREQRECT, 0, (LPARAM)&r); + /* reserving some area around calendar */ + MoveWindow(hwnd, 0, 0, r.right * 3 / 2, r.bottom * 3 / 2, FALSE); + mchit.cbSize = sizeof(MCHITTESTINFO); + mchit.pt.x = mchit.pt.y = 0; + mchit.iOffset = -1; + mchit.iRow = -1; + mchit.iCol = -1; + ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); + if (ret == ~0u) + { + win_skip("Only MCHITTESTINFO_V1 supported\n"); + DestroyWindow(hwnd); + return; + } + todo_wine expect_hex(MCHT_NOWHERE, ret); + expect(-1, mchit.iOffset); + expect(-1, mchit.iRow); + expect(-1, mchit.iCol); + + MoveWindow(hwnd, 0, 0, r.right, r.bottom, FALSE); + mchit.pt.x = r.right / 2; + mchit.pt.y = r.bottom / 2; + mchit.iOffset = -1; + ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); + expect_hex(MCHT_CALENDARDATE, ret); + expect(0, mchit.iOffset); + + /* over day area */ + mchit.pt.x = r.right / (7*2); + mchit.pt.y = r.bottom / 2; + mchit.iOffset = -1; + mchit.iCol = mchit.iRow = -1; + mchit.uHit = 0; + mchit.rc.left = mchit.rc.right = mchit.rc.top = mchit.rc.bottom = -1; + ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); + expect_hex(MCHT_CALENDARDATE, ret); + expect_hex(MCHT_CALENDARDATE, mchit.uHit); + expect(0, mchit.iOffset); + expect(2, mchit.iRow); + expect(0, mchit.iCol); + /* returned a one day rectangle */ + expect_d(r.right / 7, mchit.rc.right - mchit.rc.left); + expect_d(r.bottom / 10, mchit.rc.bottom - mchit.rc.top); + + /* title */ + mchit.pt.x = 1; + mchit.pt.y = 1; + mchit.iOffset = -1; + mchit.iCol = mchit.iRow = -1; + mchit.uHit = 0; + mchit.rc.left = mchit.rc.right = mchit.rc.top = mchit.rc.bottom = -1; + ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); + expect_hex(MCHT_TITLE, ret); + expect_hex(MCHT_TITLE, mchit.uHit); + expect(0, mchit.iOffset); + expect(-1, mchit.iRow); + expect(-1, mchit.iCol); + expect(0, mchit.rc.left); + expect(0, mchit.rc.top); + expect_d(r.right, mchit.rc.right); + ok(mchit.rc.bottom > 0, "got %d\n", mchit.rc.bottom); + + /* between two calendars */ + MoveWindow(hwnd, 0, 0, r.right * 5/2, r.bottom, FALSE); + mchit.pt.x = r.right / (5*4); + mchit.pt.y = r.bottom / 2; + mchit.iOffset = -2; + mchit.iCol = mchit.iRow = -2; + mchit.uHit = ~0; + mchit.rc.left = mchit.rc.right = mchit.rc.top = mchit.rc.bottom = -1; + ret = SendMessage(hwnd, MCM_HITTEST, 0, (LPARAM)&mchit); + todo_wine expect_hex(MCHT_NOWHERE, ret); + todo_wine expect_hex(MCHT_NOWHERE, mchit.uHit); + expect(-2, mchit.iOffset); + expect(-2, mchit.iRow); + expect(-2, mchit.iCol); + todo_wine expect(0, mchit.rc.left); + todo_wine expect(0, mchit.rc.top); + todo_wine expect_d(r.right * 5/2, mchit.rc.right); + todo_wine expect_d(r.bottom, mchit.rc.bottom); + + DestroyWindow(hwnd); +} + +static void test_get_set_border(void) +{ + HWND hwnd; + DWORD ret; + + hwnd = create_monthcal_control(0); + + /* a non-default value */ + ret = SendMessage(hwnd, MCM_SETCALENDARBORDER, TRUE, 10); + expect(0, ret); + + ret = SendMessage(hwnd, MCM_GETCALENDARBORDER, 0, 0); + + if (ret != 10) + { + skip("MCM_GET/SETCALENDARBORDER not supported\n"); + DestroyWindow(hwnd); + return; + } + + expect(10, ret); + + DestroyWindow(hwnd); +} + +static void test_MCM_SIZERECTTOMIN(void) +{ + HWND hwnd; + DWORD ret; + RECT r, r2; + + hwnd = create_monthcal_control(0); + + ret = SendMessageA(hwnd, MCM_GETMINREQRECT, 0, (LPARAM)&r2); + if (ret == 0) + { + win_skip("Message MCM_GETMINREQRECT unsupported. Skipping.\n"); + DestroyWindow(hwnd); + return; + } + + ret = SendMessageA(hwnd, MCM_SIZERECTTOMIN, 0, 0); + ok(ret == 0, "got %d\n", ret); + + r.left = r.right = r.top = r.bottom = 0; + ret = SendMessageA(hwnd, MCM_SIZERECTTOMIN, 0, (LPARAM)&r); + if (ret == 0) + { + skip("Message MCM_SIZERECTTOMIN unsupported. Skipping.\n"); + DestroyWindow(hwnd); + return; + } + ok(ret == 1, "got %d\n", ret); + ok(r.left == 0 && r.right > 0, "got %d, %d\n", r.left, r.right); + + r = r2; + ret = SendMessageA(hwnd, MCM_SIZERECTTOMIN, 0, (LPARAM)&r); + ok(ret == 1, "got %d\n", ret); + + r2.right = (r2.right - r2.left) * 3; + r2.bottom = (r2.bottom - r2.top) * 3; + r2.left = r2.top = 0; + ret = SendMessageA(hwnd, MCM_SIZERECTTOMIN, 0, (LPARAM)&r2); + ok(ret == 1, "got %d\n", ret); + + DestroyWindow(hwnd); +} + +static void test_MCM_GETCALENDARCOUNT(void) +{ + HWND hwnd; + DWORD ret; + + hwnd = create_monthcal_control(0); + + ret = SendMessageA(hwnd, MCM_GETCALENDARCOUNT, 0, 0); + if (ret == 0) + { + win_skip("Message MCM_GETCALENDARCOUNT unsupported. Skipping.\n"); + DestroyWindow(hwnd); + return; + } + + expect(2, ret); + + DestroyWindow(hwnd); +} + +static void test_daystate(void) +{ + MONTHDAYSTATE state[4]; + DWORD ret, style; + HWND hwnd; + RECT r; + + /* without MCS_DAYSTATE */ + hwnd = create_monthcal_control(0); + + ret = SendMessage(hwnd, MCM_GETMINREQRECT, 0, (LPARAM)&r); + expect(TRUE, ret); + + /* resize control to display two Calendars */ + MoveWindow(hwnd, 0, 0, r.right, (5/2)*r.bottom, FALSE); + + ret = SendMessageA(hwnd, MCM_GETMONTHRANGE, GMR_DAYSTATE, 0); + expect(4, ret); + + ret = SendMessageA(hwnd, MCM_SETDAYSTATE, 4, (LPARAM)&state); + expect(0, ret); + + ret = SendMessageA(hwnd, MCM_SETDAYSTATE, 2, (LPARAM)&state); + expect(0, ret); + + ret = SendMessageA(hwnd, MCM_SETDAYSTATE, 0, 0); + expect(0, ret); + + /* try to switch on */ + SetWindowLongA(hwnd, GWL_STYLE, GetWindowLongA(hwnd, GWL_STYLE) | MCS_DAYSTATE); + style = GetWindowLongA(hwnd, GWL_STYLE); + ok((style & MCS_DAYSTATE) == 0, "got 0x%08x\n", style); + + DestroyWindow(hwnd); + + /* with MCS_DAYSTATE */ + hwnd = create_monthcal_control(MCS_DAYSTATE); + + ret = SendMessageA(hwnd, MCM_GETMONTHRANGE, GMR_DAYSTATE, 0); + expect(4, ret); + + ret = SendMessageA(hwnd, MCM_SETDAYSTATE, 4, (LPARAM)&state); + expect(1, ret); + + ret = SendMessageA(hwnd, MCM_SETDAYSTATE, 2, (LPARAM)&state); + expect(0, ret); + + ret = SendMessageA(hwnd, MCM_SETDAYSTATE, 0, 0); + expect(0, ret); + + /* try to switch off */ + SetWindowLongA(hwnd, GWL_STYLE, GetWindowLongA(hwnd, GWL_STYLE) & ~MCS_DAYSTATE); + style = GetWindowLongA(hwnd, GWL_STYLE); + ok((style & MCS_DAYSTATE) == MCS_DAYSTATE, "got 0x%08x\n", style); + + DestroyWindow(hwnd); +} + START_TEST(monthcal) { - HMODULE hComctl32; BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); INITCOMMONCONTROLSEX iccex; + HMODULE hComctl32; + HWND hwnd; + + ULONG_PTR ctx_cookie; + HANDLE hCtx; hComctl32 = GetModuleHandleA("comctl32.dll"); pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); @@ -1703,23 +1945,50 @@ START_TEST(monthcal) parent_wnd = create_parent_window(); - test_monthcal_create(); - test_monthcal_destroy(); - test_monthcal_color(); - test_monthcal_currdate(); - test_monthcal_firstDay(); - test_monthcal_unicode(); - test_monthcal_today(); - test_monthcal_scroll(); - test_monthcal_monthrange(); - test_monthcal_hittest(); - test_monthcal_todaylink(); - test_monthcal_size(); - test_monthcal_maxselday(); - test_monthcal_selrange(); + test_create(); + test_destroy(); + test_color(); + test_currdate(); + test_firstDay(); + test_unicode(); + test_today(); + test_scroll(); + test_monthrange(); + test_hittest(); + test_todaylink(); + test_size(); + test_maxselday(); + test_selrange(); test_killfocus(); + test_daystate(); + + if (!load_v6_module(&ctx_cookie, &hCtx)) + { + DestroyWindow(parent_wnd); + return; + } + + /* this is a XP SP3 failure workaround */ + hwnd = CreateWindowExA(0, MONTHCAL_CLASSA, "foo", + WS_CHILD | WS_BORDER | WS_VISIBLE, + 0, 0, 100, 100, + parent_wnd, NULL, GetModuleHandleA(NULL), NULL); + if (!IsWindow(hwnd)) + { + win_skip("FIXME: failed to create Monthcal window.\n"); + unload_v6_module(ctx_cookie, hCtx); + DestroyWindow(parent_wnd); + return; + } + else + DestroyWindow(hwnd); + + test_hittest_v6(); + test_get_set_border(); + test_MCM_SIZERECTTOMIN(); + test_MCM_GETCALENDARCOUNT(); + + unload_v6_module(ctx_cookie, hCtx); - flush_sequences(sequences, NUM_MSG_SEQUENCES); DestroyWindow(parent_wnd); - ok_sequence(sequences, PARENT_SEQ_INDEX, destroy_parent_seq, "Destroy parent window", FALSE); } diff --git a/rostests/winetests/comctl32/mru.c b/rostests/winetests/comctl32/mru.c index 24fcff56d68..86eddc02607 100644 --- a/rostests/winetests/comctl32/mru.c +++ b/rostests/winetests/comctl32/mru.c @@ -37,57 +37,57 @@ #define REG_TEST_SUBKEYA "MRUTest" #define REG_TEST_FULLKEY REG_TEST_KEYA "\\" REG_TEST_SUBKEYA -/* Undocumented MRU structures & functions */ -typedef struct tagCREATEMRULISTA +/* Undocumented MRU functions */ +typedef struct tagMRUINFOA { DWORD cbSize; - DWORD nMaxItems; - DWORD dwFlags; + UINT uMax; + UINT fFlags; HKEY hKey; LPCSTR lpszSubKey; PROC lpfnCompare; -} CREATEMRULISTA, *LPCREATEMRULISTA; +} MRUINFOA; -#define MRUF_STRING_LIST 0 -#define MRUF_BINARY_LIST 1 -#define MRUF_DELAYED_SAVE 2 +typedef struct tagMRUINFOW +{ + DWORD cbSize; + UINT uMax; + UINT fFlags; + HKEY hKey; + LPCWSTR lpszSubKey; + PROC lpfnCompare; +} MRUINFOW; + +#define MRU_STRING 0 /* this one's invented */ +#define MRU_BINARY 1 +#define MRU_CACHEWRITE 2 #define LIST_SIZE 3 /* Max entries for each mru */ -static CREATEMRULISTA mruA = -{ - sizeof(CREATEMRULISTA), - LIST_SIZE, - 0, - NULL, - REG_TEST_SUBKEYA, - NULL -}; - static HMODULE hComctl32; -static HANDLE (WINAPI *pCreateMRUListA)(LPCREATEMRULISTA); +static HANDLE (WINAPI *pCreateMRUListA)(MRUINFOA*); static void (WINAPI *pFreeMRUList)(HANDLE); static INT (WINAPI *pAddMRUStringA)(HANDLE,LPCSTR); -static INT (WINAPI *pEnumMRUList)(HANDLE,INT,LPVOID,DWORD); +static INT (WINAPI *pEnumMRUListA)(HANDLE,INT,LPVOID,DWORD); static INT (WINAPI *pEnumMRUListW)(HANDLE,INT,LPVOID,DWORD); -static HANDLE (WINAPI *pCreateMRUListLazyA)(LPCREATEMRULISTA, DWORD, DWORD, DWORD); +static HANDLE (WINAPI *pCreateMRUListLazyA)(MRUINFOA*, DWORD, DWORD, DWORD); +static HANDLE (WINAPI *pCreateMRUListLazyW)(MRUINFOW*, DWORD, DWORD, DWORD); static INT (WINAPI *pFindMRUData)(HANDLE, LPCVOID, DWORD, LPINT); static INT (WINAPI *pAddMRUData)(HANDLE, LPCVOID, DWORD); -/* -static INT (WINAPI *pFindMRUStringA)(HANDLE,LPCSTR,LPINT); -*/ - +static HANDLE (WINAPI *pCreateMRUListW)(MRUINFOW*); static void InitPointers(void) { pCreateMRUListA = (void*)GetProcAddress(hComctl32,(LPCSTR)151); pFreeMRUList = (void*)GetProcAddress(hComctl32,(LPCSTR)152); pAddMRUStringA = (void*)GetProcAddress(hComctl32,(LPCSTR)153); - pEnumMRUList = (void*)GetProcAddress(hComctl32,(LPCSTR)154); + pEnumMRUListA = (void*)GetProcAddress(hComctl32,(LPCSTR)154); pCreateMRUListLazyA = (void*)GetProcAddress(hComctl32,(LPCSTR)157); pAddMRUData = (void*)GetProcAddress(hComctl32,(LPCSTR)167); pFindMRUData = (void*)GetProcAddress(hComctl32,(LPCSTR)169); + pCreateMRUListW = (void*)GetProcAddress(hComctl32,(LPCSTR)400); pEnumMRUListW = (void*)GetProcAddress(hComctl32,(LPCSTR)403); + pCreateMRUListLazyW = (void*)GetProcAddress(hComctl32,(LPCSTR)404); } /* Based on RegDeleteTreeW from dlls/advapi32/registry.c */ @@ -226,24 +226,15 @@ static INT CALLBACK cmp_mru_strA(LPCVOID data1, LPCVOID data2) return lstrcmpiA(data1, data2); } -static HANDLE create_mruA(HKEY hKey, DWORD flags, PROC cmp) -{ - mruA.dwFlags = flags; - mruA.lpfnCompare = cmp; - mruA.hKey = hKey; - - SetLastError(0); - return pCreateMRUListA(&mruA); -} - static void test_MRUListA(void) { const char *checks[LIST_SIZE+1]; + MRUINFOA infoA; HANDLE hMRU; HKEY hKey; INT iRet; - if (!pCreateMRUListA || !pFreeMRUList || !pAddMRUStringA || !pEnumMRUList) + if (!pCreateMRUListA || !pFreeMRUList || !pAddMRUStringA || !pEnumMRUListA) { skip("MRU entry points not found\n"); return; @@ -255,42 +246,75 @@ static void test_MRUListA(void) hMRU = pCreateMRUListA(NULL); } - /* Create (size too small) */ - mruA.cbSize = sizeof(mruA) - 2; - hMRU = create_mruA(NULL, MRUF_STRING_LIST, (PROC)cmp_mru_strA); + /* size too small */ + infoA.cbSize = sizeof(infoA) - 2; + infoA.uMax = LIST_SIZE; + infoA.fFlags = MRU_STRING; + infoA.hKey = NULL; + infoA.lpszSubKey = REG_TEST_SUBKEYA; + infoA.lpfnCompare = (PROC)cmp_mru_strA; + + SetLastError(0); + hMRU = pCreateMRUListA(&infoA); ok (!hMRU && !GetLastError(), "CreateMRUListA(too small) expected NULL,0 got %p,%d\n", hMRU, GetLastError()); - mruA.cbSize = sizeof(mruA); - /* Create (size too big) */ - mruA.cbSize = sizeof(mruA) + 2; - hMRU = create_mruA(NULL, MRUF_STRING_LIST, (PROC)cmp_mru_strA); + /* size too big */ + infoA.cbSize = sizeof(infoA) + 2; + infoA.uMax = LIST_SIZE; + infoA.fFlags = MRU_STRING; + infoA.hKey = NULL; + infoA.lpszSubKey = REG_TEST_SUBKEYA; + infoA.lpfnCompare = (PROC)cmp_mru_strA; + + SetLastError(0); + hMRU = pCreateMRUListA(&infoA); ok (!hMRU && !GetLastError(), "CreateMRUListA(too big) expected NULL,0 got %p,%d\n", hMRU, GetLastError()); - mruA.cbSize = sizeof(mruA); - /* Create (NULL hKey) */ - hMRU = create_mruA(NULL, MRUF_STRING_LIST, (PROC)cmp_mru_strA); + /* NULL hKey */ + infoA.cbSize = sizeof(infoA); + infoA.uMax = LIST_SIZE; + infoA.fFlags = MRU_STRING; + infoA.hKey = NULL; + infoA.lpszSubKey = REG_TEST_SUBKEYA; + infoA.lpfnCompare = (PROC)cmp_mru_strA; + + SetLastError(0); + hMRU = pCreateMRUListA(&infoA); ok (!hMRU && !GetLastError(), "CreateMRUListA(NULL key) expected NULL,0 got %p,%d\n", hMRU, GetLastError()); - /* Create (NULL name) */ - mruA.lpszSubKey = NULL; - hMRU = create_mruA(NULL, MRUF_STRING_LIST, (PROC)cmp_mru_strA); + /* NULL subkey name */ + infoA.cbSize = sizeof(infoA); + infoA.uMax = LIST_SIZE; + infoA.fFlags = MRU_STRING; + infoA.hKey = NULL; + infoA.lpszSubKey = NULL; + infoA.lpfnCompare = (PROC)cmp_mru_strA; + + SetLastError(0); + hMRU = pCreateMRUListA(&infoA); ok (!hMRU && !GetLastError(), "CreateMRUListA(NULL name) expected NULL,0 got %p,%d\n", hMRU, GetLastError()); - mruA.lpszSubKey = REG_TEST_SUBKEYA; /* Create a string MRU */ ok(!RegCreateKeyA(HKEY_CURRENT_USER, REG_TEST_KEYA, &hKey), "Couldn't create test key \"%s\"\n", REG_TEST_KEYA); - if (!hKey) - return; - hMRU = create_mruA(hKey, MRUF_STRING_LIST, (PROC)cmp_mru_strA); + if (!hKey) return; + + infoA.cbSize = sizeof(infoA); + infoA.uMax = LIST_SIZE; + infoA.fFlags = MRU_STRING; + infoA.hKey = hKey; + infoA.lpszSubKey = REG_TEST_SUBKEYA; + infoA.lpfnCompare = (PROC)cmp_mru_strA; + + hMRU = pCreateMRUListA(&infoA); ok(hMRU && !GetLastError(), "CreateMRUListA(string) expected non-NULL,0 got %p,%d\n", hMRU, GetLastError()); @@ -363,28 +387,28 @@ static void test_MRUListA(void) check_reg_entries("abc", checks); /* NULL buffer = get list size */ - iRet = pEnumMRUList(hMRU, 0, NULL, 0); + iRet = pEnumMRUListA(hMRU, 0, NULL, 0); ok(iRet == 3 || iRet == -1 /* Vista */, "EnumMRUList expected %d or -1, got %d\n", LIST_SIZE, iRet); /* negative item pos = get list size */ - iRet = pEnumMRUList(hMRU, -1, NULL, 0); + iRet = pEnumMRUListA(hMRU, -1, NULL, 0); ok(iRet == 3 || iRet == -1 /* Vista */, "EnumMRUList expected %d or -1, got %d\n", LIST_SIZE, iRet); /* negative item pos = get list size */ - iRet = pEnumMRUList(hMRU, -5, NULL, 0); + iRet = pEnumMRUListA(hMRU, -5, NULL, 0); ok(iRet == 3 || iRet == -1 /* Vista */, "EnumMRUList expected %d or -1, got %d\n", LIST_SIZE, iRet); /* negative item pos = get list size */ - iRet = pEnumMRUList(hMRU, -1, buffer, 255); + iRet = pEnumMRUListA(hMRU, -1, buffer, 255); ok(iRet == 3, "EnumMRUList expected %d, got %d\n", LIST_SIZE, iRet); /* negative item pos = get list size */ - iRet = pEnumMRUList(hMRU, -5, buffer, 255); + iRet = pEnumMRUListA(hMRU, -5, buffer, 255); ok(iRet == 3, "EnumMRUList expected %d, got %d\n", LIST_SIZE, iRet); /* check entry 0 */ buffer[0] = 0; - iRet = pEnumMRUList(hMRU, 0, buffer, 255); + iRet = pEnumMRUListA(hMRU, 0, buffer, 255); ok(iRet == lstrlen(checks[3]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[3]), iRet); ok(strcmp(buffer, checks[3]) == 0, "EnumMRUList expected %s, got %s\n", checks[3], buffer); @@ -393,7 +417,7 @@ static void test_MRUListA(void) buffer[1] = 'A'; /* overwritten with 0 */ buffer[2] = 'A'; /* unchanged */ buffer[3] = 0; /* unchanged */ - iRet = pEnumMRUList(hMRU, 0, buffer, 2); + iRet = pEnumMRUListA(hMRU, 0, buffer, 2); ok(iRet == lstrlen(checks[3]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[3]), iRet); ok(strcmp(buffer, "T") == 0, "EnumMRUList expected %s, got %s\n", "T", buffer); /* make sure space after buffer has old values */ @@ -401,19 +425,19 @@ static void test_MRUListA(void) /* check entry 1 */ buffer[0] = 0; - iRet = pEnumMRUList(hMRU, 1, buffer, 255); + iRet = pEnumMRUListA(hMRU, 1, buffer, 255); ok(iRet == lstrlen(checks[1]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[1]), iRet); ok(strcmp(buffer, checks[1]) == 0, "EnumMRUList expected %s, got %s\n", checks[1], buffer); /* check entry 2 */ buffer[0] = 0; - iRet = pEnumMRUList(hMRU, 2, buffer, 255); + iRet = pEnumMRUListA(hMRU, 2, buffer, 255); ok(iRet == lstrlen(checks[2]), "EnumMRUList expected %d, got %d\n", lstrlen(checks[2]), iRet); ok(strcmp(buffer, checks[2]) == 0, "EnumMRUList expected %s, got %s\n", checks[2], buffer); /* check out of bounds entry 3 */ strcpy(buffer, "dummy"); - iRet = pEnumMRUList(hMRU, 3, buffer, 255); + iRet = pEnumMRUListA(hMRU, 3, buffer, 255); ok(iRet == -1, "EnumMRUList expected %d, got %d\n", -1, iRet); ok(strcmp(buffer, "dummy") == 0, "EnumMRUList expected unchanged buffer %s, got %s\n", "dummy", buffer); @@ -423,12 +447,37 @@ static void test_MRUListA(void) /* FreeMRUList(NULL) crashes on Win98 OSR0 */ } +/* +typedef struct tagMRUINFOA +{ + DWORD cbSize; + UINT uMax; + UINT fFlags; + HKEY hKey; + LPCSTR lpszSubKey; + PROC lpfnCompare; +} MRUINFOA; +*/ +typedef struct { + MRUINFOA mruA; + BOOL ret; +} create_lazya_t; + +static const create_lazya_t create_lazyA[] = { + {{ sizeof(MRUINFOA) + 1, 0, 0, HKEY_CURRENT_USER, NULL, NULL }, FALSE }, + {{ sizeof(MRUINFOA) - 1, 0, 0, HKEY_CURRENT_USER, NULL, NULL }, FALSE }, + {{ sizeof(MRUINFOA) + 1, 0, 0, HKEY_CURRENT_USER, "WineTest", NULL }, TRUE }, + {{ sizeof(MRUINFOA) - 1, 0, 0, HKEY_CURRENT_USER, "WineTest", NULL }, TRUE }, + {{ sizeof(MRUINFOA), 0, 0, HKEY_CURRENT_USER, "WineTest", NULL }, TRUE }, + {{ sizeof(MRUINFOA), 0, 0, HKEY_CURRENT_USER, NULL, NULL }, FALSE }, + {{ sizeof(MRUINFOA), 0, 0, NULL, "WineTest", NULL }, FALSE }, + {{ 0, 0, 0, NULL, "WineTest", NULL }, FALSE }, + {{ 0, 0, 0, HKEY_CURRENT_USER, "WineTest", NULL }, TRUE } +}; static void test_CreateMRUListLazyA(void) { - HANDLE hMRU; - HKEY hKey; - CREATEMRULISTA listA = { 0 }; + int i; if (!pCreateMRUListLazyA || !pFreeMRUList) { @@ -436,33 +485,25 @@ static void test_CreateMRUListLazyA(void) return; } - /* wrong size */ - listA.cbSize = sizeof(listA) + 1; - hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0); - ok(hMRU == NULL, "Expected NULL handle, got %p\n", hMRU); - listA.cbSize = 4; - hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0); - ok(hMRU == NULL, "Expected NULL handle, got %p\n", hMRU); - /* NULL hKey */ - listA.cbSize = sizeof(listA); - listA.hKey = NULL; - hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0); - ok(hMRU == NULL, "Expected NULL handle, got %p\n", hMRU); - /* NULL subkey */ - ok(!RegCreateKeyA(HKEY_CURRENT_USER, REG_TEST_KEYA, &hKey), - "Couldn't create test key \"%s\"\n", REG_TEST_KEYA); - listA.cbSize = sizeof(listA); - listA.hKey = hKey; - listA.lpszSubKey = NULL; - hMRU = pCreateMRUListLazyA(&listA, 0, 0, 0); - ok(hMRU == NULL || broken(hMRU != NULL), /* Win9x */ - "Expected NULL handle, got %p\n", hMRU); - if (hMRU) pFreeMRUList(hMRU); + for (i = 0; i < sizeof(create_lazyA)/sizeof(create_lazya_t); i++) + { + const create_lazya_t *ptr = &create_lazyA[i]; + HANDLE hMRU; + + hMRU = pCreateMRUListLazyA((MRUINFOA*)&ptr->mruA, 0, 0, 0); + if (ptr->ret) + { + ok(hMRU != NULL, "%d: got %p\n", i, hMRU); + pFreeMRUList(hMRU); + } + else + ok(hMRU == NULL, "%d: got %p\n", i, hMRU); + } } static void test_EnumMRUList(void) { - if (!pEnumMRUList || !pEnumMRUListW) + if (!pEnumMRUListA || !pEnumMRUListW) { win_skip("EnumMRUListA/EnumMRUListW entry point not found\n"); return; @@ -472,7 +513,7 @@ static void test_EnumMRUList(void) if (0) { /* crashes on NT4, passed on Win2k, XP, 2k3, Vista, 2k8 */ - pEnumMRUList(NULL, 0, NULL, 0); + pEnumMRUListA(NULL, 0, NULL, 0); pEnumMRUListW(NULL, 0, NULL, 0); } } @@ -507,6 +548,171 @@ static void test_AddMRUData(void) ok(iRet == -1, "AddMRUData expected -1, got %d\n", iRet); } +static void test_CreateMRUListW(void) +{ + static const WCHAR mrutestW[] = {'M','R','U','T','e','s','t',0}; + MRUINFOW infoW; + void *named; + HKEY hKey; + HANDLE hMru; + + if (!pCreateMRUListW) + { + win_skip("CreateMRUListW entry point not found\n"); + return; + } + + /* exported by name too on recent versions */ + named = GetProcAddress(hComctl32, "CreateMRUListW"); + if (named) + ok(named == pCreateMRUListW, "got %p, expected %p\n", named, pCreateMRUListW); + + ok(!RegCreateKeyA(HKEY_CURRENT_USER, REG_TEST_KEYA, &hKey), + "Couldn't create test key \"%s\"\n", REG_TEST_KEYA); + + infoW.cbSize = sizeof(infoW); + infoW.uMax = 1; + infoW.fFlags = 0; + infoW.lpszSubKey = mrutestW; + infoW.hKey = hKey; + infoW.lpfnCompare = NULL; + + hMru = pCreateMRUListW(&infoW); + ok(hMru != NULL, "got %p\n", hMru); + pFreeMRUList(hMru); + + /* smaller size */ + infoW.cbSize = sizeof(infoW) - 1; + infoW.uMax = 1; + infoW.fFlags = 0; + infoW.lpszSubKey = mrutestW; + infoW.hKey = hKey; + infoW.lpfnCompare = NULL; + + hMru = pCreateMRUListW(&infoW); + ok(hMru != NULL, "got %p\n", hMru); + pFreeMRUList(hMru); + + /* increased size */ + infoW.cbSize = sizeof(infoW) + 1; + infoW.uMax = 1; + infoW.fFlags = 0; + infoW.lpszSubKey = mrutestW; + infoW.hKey = hKey; + infoW.lpfnCompare = NULL; + + hMru = pCreateMRUListW(&infoW); + ok(hMru != NULL, "got %p\n", hMru); + pFreeMRUList(hMru); + + /* zero size */ + infoW.cbSize = 0; + infoW.uMax = 1; + infoW.fFlags = 0; + infoW.lpszSubKey = mrutestW; + infoW.hKey = hKey; + infoW.lpfnCompare = NULL; + + hMru = pCreateMRUListW(&infoW); + ok(hMru != NULL, "got %p\n", hMru); + pFreeMRUList(hMru); + + /* NULL hKey */ + infoW.cbSize = sizeof(infoW); + infoW.uMax = 1; + infoW.fFlags = 0; + infoW.lpszSubKey = mrutestW; + infoW.hKey = NULL; + infoW.lpfnCompare = NULL; + + hMru = pCreateMRUListW(&infoW); + ok(hMru == NULL, "got %p\n", hMru); + + RegCloseKey(hKey); +} + +static void test_CreateMRUListLazyW(void) +{ + static const WCHAR mrutestW[] = {'M','R','U','T','e','s','t',0}; + MRUINFOW infoW; + void *named; + HKEY hKey; + HANDLE hMru; + + if (!pCreateMRUListLazyW) + { + win_skip("CreateMRUListLazyW entry point not found\n"); + return; + } + + /* check that it's not exported by name */ + named = GetProcAddress(hComctl32, "CreateMRUListLazyW"); + ok(named == NULL, "got %p\n", named); + + ok(!RegCreateKeyA(HKEY_CURRENT_USER, REG_TEST_KEYA, &hKey), + "Couldn't create test key \"%s\"\n", REG_TEST_KEYA); + + infoW.cbSize = sizeof(infoW); + infoW.uMax = 1; + infoW.fFlags = 0; + infoW.lpszSubKey = mrutestW; + infoW.hKey = hKey; + infoW.lpfnCompare = NULL; + + hMru = pCreateMRUListLazyW(&infoW, 0, 0, 0); + ok(hMru != NULL, "got %p\n", hMru); + pFreeMRUList(hMru); + + /* smaller size */ + infoW.cbSize = sizeof(infoW) - 1; + infoW.uMax = 1; + infoW.fFlags = 0; + infoW.lpszSubKey = mrutestW; + infoW.hKey = hKey; + infoW.lpfnCompare = NULL; + + hMru = pCreateMRUListLazyW(&infoW, 0, 0, 0); + ok(hMru != NULL, "got %p\n", hMru); + pFreeMRUList(hMru); + + /* increased size */ + infoW.cbSize = sizeof(infoW) + 1; + infoW.uMax = 1; + infoW.fFlags = 0; + infoW.lpszSubKey = mrutestW; + infoW.hKey = hKey; + infoW.lpfnCompare = NULL; + + hMru = pCreateMRUListLazyW(&infoW, 0, 0, 0); + ok(hMru != NULL, "got %p\n", hMru); + pFreeMRUList(hMru); + + /* zero size */ + infoW.cbSize = 0; + infoW.uMax = 1; + infoW.fFlags = 0; + infoW.lpszSubKey = mrutestW; + infoW.hKey = hKey; + infoW.lpfnCompare = NULL; + + hMru = pCreateMRUListLazyW(&infoW, 0, 0, 0); + ok(hMru != NULL, "got %p\n", hMru); + pFreeMRUList(hMru); + + /* NULL hKey */ + infoW.cbSize = sizeof(infoW); + infoW.uMax = 1; + infoW.fFlags = 0; + infoW.lpszSubKey = mrutestW; + infoW.hKey = NULL; + infoW.lpfnCompare = NULL; + + hMru = pCreateMRUListLazyW(&infoW, 0, 0, 0); + ok(hMru == NULL, "got %p\n", hMru); + + RegCloseKey(hKey); +} + START_TEST(mru) { hComctl32 = GetModuleHandleA("comctl32.dll"); @@ -519,9 +725,11 @@ START_TEST(mru) test_MRUListA(); test_CreateMRUListLazyA(); + test_CreateMRUListLazyW(); test_EnumMRUList(); test_FindMRUData(); test_AddMRUData(); + test_CreateMRUListW(); delete_reg_entries(); } diff --git a/rostests/winetests/comctl32/msg.h b/rostests/winetests/comctl32/msg.h index 361ccdbf598..1d78ffea94e 100644 --- a/rostests/winetests/comctl32/msg.h +++ b/rostests/winetests/comctl32/msg.h @@ -89,7 +89,7 @@ static void add_message(struct msg_sequence **seq, int sequence_index, msg_seq->count++; } -static void flush_sequence(struct msg_sequence **seg, int sequence_index) +static inline void flush_sequence(struct msg_sequence **seg, int sequence_index) { struct msg_sequence *msg_seq = seg[sequence_index]; HeapFree(GetProcessHeap(), 0, msg_seq->sequence); @@ -97,7 +97,7 @@ static void flush_sequence(struct msg_sequence **seg, int sequence_index) msg_seq->count = msg_seq->size = 0; } -static void flush_sequences(struct msg_sequence **seq, int n) +static inline void flush_sequences(struct msg_sequence **seq, int n) { int i; diff --git a/rostests/winetests/comctl32/propsheet.c b/rostests/winetests/comctl32/propsheet.c index bfbaaa0e7bd..92fb1dd19de 100644 --- a/rostests/winetests/comctl32/propsheet.c +++ b/rostests/winetests/comctl32/propsheet.c @@ -20,18 +20,37 @@ #include #include +#include "msg.h" #include "resources.h" #include "wine/test.h" -static HWND parent; +static HWND parenthwnd; static HWND sheethwnd; static LONG active_page = -1; #define IDC_APPLY_BUTTON 12321 + +/* try to make sure pending X events have been processed before continuing */ +static void flush_events(void) +{ + MSG msg; + int diff = 200; + int min_timeout = 100; + DWORD time = GetTickCount() + diff; + + while (diff > 0) + { + if (MsgWaitForMultipleObjects( 0, NULL, FALSE, min_timeout, QS_ALLINPUT ) == WAIT_TIMEOUT) break; + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessage( &msg ); + diff = time - GetTickCount(); + } +} + + static int CALLBACK sheet_callback(HWND hwnd, UINT msg, LPARAM lparam) { switch(msg) @@ -88,6 +107,7 @@ static void test_title(void) PROPSHEETPAGEA psp; PROPSHEETHEADERA psh; HWND hdlg; + DWORD style; memset(&psp, 0, sizeof(psp)); psp.dwSize = sizeof(psp); @@ -101,7 +121,7 @@ static void test_title(void) hpsp[0] = CreatePropertySheetPageA(&psp); memset(&psh, 0, sizeof(psh)); - psh.dwSize = sizeof(psh); + psh.dwSize = PROPSHEETHEADERA_V1_SIZE; psh.dwFlags = PSH_MODELESS | PSH_USECALLBACK; psh.pszCaption = "test caption"; psh.nPages = 1; @@ -110,12 +130,13 @@ static void test_title(void) psh.pfnCallback = sheet_callback; hdlg = (HWND)PropertySheetA(&psh); - if (hdlg == INVALID_HANDLE_VALUE) - { - win_skip("comctl32 4.70 needs dwSize adjustment\n"); - psh.dwSize = sizeof(psh) - sizeof(HBITMAP) - sizeof(HPALETTE) - sizeof(HBITMAP); - hdlg = (HWND)PropertySheetA(&psh); - } + ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle value %p\n", hdlg); + + style = GetWindowLong(hdlg, GWL_STYLE); + ok(style == (WS_POPUP|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CAPTION|WS_SYSMENU| + DS_CONTEXTHELP|DS_MODALFRAME|DS_SETFONT|DS_3DLOOK), + "got unexpected style: %x\n", style); + DestroyWindow(hdlg); } @@ -124,7 +145,8 @@ static void test_nopage(void) HPROPSHEETPAGE hpsp[1]; PROPSHEETPAGEA psp; PROPSHEETHEADERA psh; - HWND hdlg; + HWND hdlg, hpage; + MSG msg; memset(&psp, 0, sizeof(psp)); psp.dwSize = sizeof(psp); @@ -138,7 +160,7 @@ static void test_nopage(void) hpsp[0] = CreatePropertySheetPageA(&psp); memset(&psh, 0, sizeof(psh)); - psh.dwSize = sizeof(psh); + psh.dwSize = PROPSHEETHEADERA_V1_SIZE; psh.dwFlags = PSH_MODELESS | PSH_USECALLBACK; psh.pszCaption = "test caption"; psh.nPages = 1; @@ -147,15 +169,18 @@ static void test_nopage(void) psh.pfnCallback = sheet_callback; hdlg = (HWND)PropertySheetA(&psh); - if (hdlg == INVALID_HANDLE_VALUE) - { - win_skip("comctl32 4.70 needs dwSize adjustment\n"); - psh.dwSize = sizeof(psh) - sizeof(HBITMAP) - sizeof(HPALETTE) - sizeof(HBITMAP); - hdlg = (HWND)PropertySheetA(&psh); - } + ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle value %p\n", hdlg); + ShowWindow(hdlg,SW_NORMAL); SendMessage(hdlg, PSM_REMOVEPAGE, 0, 0); + hpage = PropSheet_GetCurrentPageHwnd(hdlg); + ok(hpage == NULL, "expected no current page, got %p, index=%d\n", hpage, PropSheet_HwndToIndex(hdlg, hpage)); + flush_events(); RedrawWindow(hdlg,NULL,NULL,RDW_UPDATENOW|RDW_ERASENOW); + + /* Check that the property sheet was fully redrawn */ + ok(!PeekMessage(&msg, 0, WM_PAINT, WM_PAINT, PM_NOREMOVE), + "expected no pending WM_PAINT messages\n"); DestroyWindow(hdlg); } @@ -165,7 +190,7 @@ static int CALLBACK disableowner_callback(HWND hwnd, UINT msg, LPARAM lparam) { case PSCB_INITIALIZED: { - ok(IsWindowEnabled(parent) == 0, "parent window should be disabled\n"); + ok(IsWindowEnabled(parenthwnd) == 0, "parent window should be disabled\n"); PostQuitMessage(0); return FALSE; } @@ -198,7 +223,7 @@ static void test_disableowner(void) INT_PTR p; register_parent_wnd_class(); - parent = CreateWindowA("parent class", "", WS_CAPTION | WS_SYSMENU | WS_VISIBLE, 100, 100, 100, 100, GetDesktopWindow(), NULL, GetModuleHandleA(NULL), 0); + parenthwnd = CreateWindowA("parent class", "", WS_CAPTION | WS_SYSMENU | WS_VISIBLE, 100, 100, 100, 100, GetDesktopWindow(), NULL, GetModuleHandleA(NULL), 0); memset(&psp, 0, sizeof(psp)); psp.dwSize = sizeof(psp); @@ -212,19 +237,19 @@ static void test_disableowner(void) hpsp[0] = CreatePropertySheetPageA(&psp); memset(&psh, 0, sizeof(psh)); - psh.dwSize = sizeof(psh); + psh.dwSize = PROPSHEETHEADERA_V1_SIZE; psh.dwFlags = PSH_USECALLBACK; psh.pszCaption = "test caption"; psh.nPages = 1; - psh.hwndParent = parent; + psh.hwndParent = parenthwnd; U3(psh).phpage = hpsp; psh.pfnCallback = disableowner_callback; p = PropertySheetA(&psh); todo_wine ok(p == 0, "Expected 0, got %ld\n", p); - ok(IsWindowEnabled(parent) != 0, "parent window should be enabled\n"); - DestroyWindow(parent); + ok(IsWindowEnabled(parenthwnd) != 0, "parent window should be enabled\n"); + DestroyWindow(parenthwnd); } static INT_PTR CALLBACK nav_page_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) @@ -257,6 +282,7 @@ static void test_wiznavigation(void) PROPSHEETHEADERA psh; HWND hdlg, control; LONG_PTR controlID; + DWORD style; LRESULT defidres; BOOL hwndtoindex_supported = TRUE; const INT nextID = 12324; @@ -291,22 +317,22 @@ static void test_wiznavigation(void) /* set up the property sheet dialog */ memset(&psh, 0, sizeof(psh)); - psh.dwSize = sizeof(psh); + psh.dwSize = PROPSHEETHEADERA_V1_SIZE; psh.dwFlags = PSH_MODELESS | PSH_WIZARD; psh.pszCaption = "A Wizard"; psh.nPages = 4; psh.hwndParent = GetDesktopWindow(); U3(psh).phpage = hpsp; hdlg = (HWND)PropertySheetA(&psh); - if (hdlg == INVALID_HANDLE_VALUE) - { - win_skip("comctl32 4.70 needs dwSize adjustment\n"); - psh.dwSize = sizeof(psh) - sizeof(HBITMAP) - sizeof(HPALETTE) - sizeof(HBITMAP); - hdlg = (HWND)PropertySheetA(&psh); - } + ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle %p\n", hdlg); ok(active_page == 0, "Active page should be 0. Is: %d\n", active_page); + style = GetWindowLong(hdlg, GWL_STYLE) & ~(DS_CONTEXTHELP|WS_SYSMENU); + ok(style == (WS_POPUP|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CAPTION| + DS_MODALFRAME|DS_SETFONT|DS_3DLOOK), + "got unexpected style: %x\n", style); + control = GetFocus(); controlID = GetWindowLongPtr(control, GWLP_ID); ok(controlID == nextID, "Focus should have been set to the Next button. Expected: %d, Found: %ld\n", nextID, controlID); @@ -394,7 +420,7 @@ static void test_buttons(void) hpsp[0] = CreatePropertySheetPageA(&psp); memset(&psh, 0, sizeof(psh)); - psh.dwSize = sizeof(psh); + psh.dwSize = PROPSHEETHEADERA_V1_SIZE; psh.dwFlags = PSH_MODELESS | PSH_USECALLBACK; psh.pszCaption = "test caption"; psh.nPages = 1; @@ -403,12 +429,7 @@ static void test_buttons(void) psh.pfnCallback = sheet_callback; hdlg = (HWND)PropertySheetA(&psh); - if (hdlg == INVALID_HANDLE_VALUE) - { - win_skip("comctl32 4.70 needs dwSize adjustment\n"); - psh.dwSize = sizeof(psh) - sizeof(HBITMAP) - sizeof(HPALETTE) - sizeof(HBITMAP); - hdlg = (HWND)PropertySheetA(&psh); - } + ok(hdlg != INVALID_HANDLE_VALUE, "got null handle\n"); /* OK button */ button = GetDlgItem(hdlg, IDOK); @@ -478,7 +499,7 @@ static void test_custom_default_button(void) psp[0].pszTitle = "Page1"; psp[0].lParam = 0; - psh.dwSize = sizeof (PROPSHEETHEADERA); + psh.dwSize = PROPSHEETHEADERA_V1_SIZE; psh.dwFlags = PSH_PROPSHEETPAGE | PSH_MODELESS; psh.hwndParent = GetDesktopWindow(); psh.hInstance = GetModuleHandleA(NULL); @@ -519,12 +540,276 @@ static void test_custom_default_button(void) } } - todo_wine ok(add_button_has_been_pressed, "The Add button has not been pressed!\n"); DestroyWindow(hdlg); } +#define RECEIVER_SHEET_CALLBACK 0 +#define RECEIVER_SHEET_WINPROC 1 +#define RECEIVER_PAGE 2 + +#define NUM_MSG_SEQUENCES 1 +#define PROPSHEET_SEQ_INDEX 0 + +static struct msg_sequence *sequences[NUM_MSG_SEQUENCES]; +static WNDPROC oldWndProc; + +static const struct message property_sheet_seq[] = { + { PSCB_PRECREATE, sent|id, 0, 0, RECEIVER_SHEET_CALLBACK }, + { PSCB_INITIALIZED, sent|id, 0, 0, RECEIVER_SHEET_CALLBACK }, + { WM_WINDOWPOSCHANGING, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + /*{ WM_NCCALCSIZE, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + { WM_WINDOWPOSCHANGED, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_MOVE, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_SIZE, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + /*{ WM_GETTEXT, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_NCCALCSIZE, sent|id|optional, 0, 0, RECEIVER_SHEET_WINPROC }, + { DM_REPOSITION, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + { WM_WINDOWPOSCHANGING, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_WINDOWPOSCHANGING, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_ACTIVATEAPP, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + /*{ WM_NCACTIVATE, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETTEXT, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETTEXT, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + { WM_ACTIVATE, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + /*{ WM_IME_SETCONTEXT, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_IME_NOTIFY, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + { WM_SETFOCUS, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_KILLFOCUS, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + /*{ WM_IME_SETCONTEXT, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + { WM_PARENTNOTIFY, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_INITDIALOG, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_WINDOWPOSCHANGING, sent|id, 0, 0, RECEIVER_PAGE }, + /*{ WM_NCCALCSIZE, sent|id, 0, 0, RECEIVER_PAGE },*/ + { WM_CHILDACTIVATE, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_WINDOWPOSCHANGED, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_MOVE, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_SIZE, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_NOTIFY, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_STYLECHANGING, sent|id|optional, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_STYLECHANGED, sent|id|optional, 0, 0, RECEIVER_SHEET_WINPROC }, + /*{ WM_GETTEXT, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + { WM_SETTEXT, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_SHOWWINDOW, sent|id, 0, 0, RECEIVER_PAGE }, + /*{ 0x00000401, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { 0x00000400, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + { WM_CHANGEUISTATE, sent|id|optional, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_UPDATEUISTATE, sent|id|optional, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_UPDATEUISTATE, sent|id|optional, 0, 0, RECEIVER_PAGE }, + { WM_SHOWWINDOW, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_WINDOWPOSCHANGING, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + /*{ WM_NCPAINT, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_ERASEBKGND, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + { WM_CTLCOLORDLG, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_WINDOWPOSCHANGED, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + /*{ WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_PAINT, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_PAINT, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_NCPAINT, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_ERASEBKGND, sent|id, 0, 0, RECEIVER_PAGE },*/ + { WM_CTLCOLORDLG, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_CTLCOLORSTATIC, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_CTLCOLORSTATIC, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_CTLCOLORBTN, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_CTLCOLORBTN, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_CTLCOLORBTN, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + /*{ WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + { WM_COMMAND, sent|id|optional, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_NOTIFY, sent|id|optional, 0, 0, RECEIVER_PAGE }, + { WM_NOTIFY, sent|id|optional, 0, 0, RECEIVER_PAGE }, + { WM_WINDOWPOSCHANGING, sent|id|optional, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_WINDOWPOSCHANGED, sent|id|optional, 0, 0, RECEIVER_SHEET_WINPROC }, + /*{ WM_NCACTIVATE, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_GETICON, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + /*{ WM_ACTIVATE, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_ACTIVATE, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_ACTIVATEAPP, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_ACTIVATEAPP, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_DESTROY, sent|id, 0, 0, RECEIVER_SHEET_WINPROC }, + { WM_DESTROY, sent|id, 0, 0, RECEIVER_PAGE },*/ + /*{ WM_NCDESTROY, sent|id, 0, 0, RECEIVER_PAGE }, + { WM_NCDESTROY, sent|id, 0, 0, RECEIVER_SHEET_WINPROC },*/ + { 0 } +}; + +static void save_message(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, INT receiver) +{ + struct message msg; + + if (message < WM_USER && + message != WM_GETICON && + message != WM_GETTEXT && + message != WM_IME_SETCONTEXT && + message != WM_IME_NOTIFY && + message != WM_PAINT && + message != WM_ERASEBKGND && + message != WM_SETCURSOR && + (message < WM_NCCREATE || message > WM_NCMBUTTONDBLCLK) && + (message < WM_MOUSEFIRST || message > WM_MOUSEHWHEEL) && + message != 0x90) + { + /*trace("check_message: %04x, %04x\n", message, receiver);*/ + + msg.message = message; + msg.flags = sent|wparam|lparam|id; + msg.wParam = wParam; + msg.lParam = lParam; + msg.id = receiver; + add_message(sequences, PROPSHEET_SEQ_INDEX, &msg); + } +} + +static LRESULT CALLBACK sheet_callback_messages_proc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + save_message(hwnd, msg, wParam, lParam, RECEIVER_SHEET_WINPROC); + + return CallWindowProc (oldWndProc, hwnd, msg, wParam, lParam); +} + +static int CALLBACK sheet_callback_messages(HWND hwnd, UINT msg, LPARAM lParam) +{ + save_message(hwnd, msg, 0, lParam, RECEIVER_SHEET_CALLBACK); + + switch (msg) + { + case PSCB_INITIALIZED: + oldWndProc = (WNDPROC)GetWindowLongPtr (hwnd, GWLP_WNDPROC); + SetWindowLongPtr (hwnd, GWLP_WNDPROC, (LONG_PTR)&sheet_callback_messages_proc); + return TRUE; + } + + return TRUE; +} + +static INT_PTR CALLBACK page_dlg_proc_messages(HWND hwnd, UINT msg, WPARAM wParam, + LPARAM lParam) +{ + save_message(hwnd, msg, wParam, lParam, RECEIVER_PAGE); + + return FALSE; +} + +static void test_messages(void) +{ + HPROPSHEETPAGE hpsp[1]; + PROPSHEETPAGEA psp; + PROPSHEETHEADERA psh; + HWND hdlg; + + init_msg_sequences(sequences, NUM_MSG_SEQUENCES); + + memset(&psp, 0, sizeof(psp)); + psp.dwSize = sizeof(psp); + psp.dwFlags = 0; + psp.hInstance = GetModuleHandleA(NULL); + U(psp).pszTemplate = MAKEINTRESOURCE(IDD_PROP_PAGE_MESSAGE_TEST); + U2(psp).pszIcon = NULL; + psp.pfnDlgProc = page_dlg_proc_messages; + psp.lParam = 0; + + hpsp[0] = CreatePropertySheetPageA(&psp); + + memset(&psh, 0, sizeof(psh)); + psh.dwSize = PROPSHEETHEADERA_V1_SIZE; + psh.dwFlags = PSH_NOAPPLYNOW | PSH_WIZARD | PSH_USECALLBACK + | PSH_MODELESS | PSH_USEICONID; + psh.pszCaption = "test caption"; + psh.nPages = 1; + psh.hwndParent = GetDesktopWindow(); + U3(psh).phpage = hpsp; + psh.pfnCallback = sheet_callback_messages; + + hdlg = (HWND)PropertySheetA(&psh); + ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle %p\n", hdlg); + + ShowWindow(hdlg,SW_NORMAL); + + ok_sequence(sequences, PROPSHEET_SEQ_INDEX, property_sheet_seq, "property sheet with custom window proc", TRUE); + + DestroyWindow(hdlg); +} + +static void test_PSM_ADDPAGE(void) +{ + HPROPSHEETPAGE hpsp[3]; + PROPSHEETPAGEA psp; + PROPSHEETHEADERA psh; + HWND hdlg, tab; + BOOL ret; + DWORD r; + + memset(&psp, 0, sizeof(psp)); + psp.dwSize = sizeof(psp); + psp.dwFlags = 0; + psp.hInstance = GetModuleHandleA(NULL); + U(psp).pszTemplate = MAKEINTRESOURCE(IDD_PROP_PAGE_MESSAGE_TEST); + U2(psp).pszIcon = NULL; + psp.pfnDlgProc = page_dlg_proc_messages; + psp.lParam = 0; + + /* two page with the same data */ + hpsp[0] = CreatePropertySheetPageA(&psp); + hpsp[1] = CreatePropertySheetPageA(&psp); + hpsp[2] = CreatePropertySheetPageA(&psp); + + memset(&psh, 0, sizeof(psh)); + psh.dwSize = PROPSHEETHEADERA_V1_SIZE; + psh.dwFlags = PSH_MODELESS; + psh.pszCaption = "test caption"; + psh.nPages = 1; + psh.hwndParent = GetDesktopWindow(); + U3(psh).phpage = hpsp; + + hdlg = (HWND)PropertySheetA(&psh); + ok(hdlg != INVALID_HANDLE_VALUE, "got invalid handle %p\n", hdlg); + + /* add pages one by one */ + ret = SendMessageA(hdlg, PSM_ADDPAGE, 0, (LPARAM)hpsp[1]); + ok(ret == TRUE, "got %d\n", ret); + + /* try with null and invalid value */ + ret = SendMessageA(hdlg, PSM_ADDPAGE, 0, 0); + ok(ret == FALSE, "got %d\n", ret); + +if (0) +{ + /* crashes on native */ + ret = SendMessageA(hdlg, PSM_ADDPAGE, 0, (LPARAM)INVALID_HANDLE_VALUE); +} + /* check item count */ + tab = (HWND)SendMessageA(hdlg, PSM_GETTABCONTROL, 0, 0); + + r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); + ok(r == 2, "got %d\n", r); + + ret = SendMessageA(hdlg, PSM_ADDPAGE, 0, (LPARAM)hpsp[2]); + ok(ret == TRUE, "got %d\n", ret); + + r = SendMessageA(tab, TCM_GETITEMCOUNT, 0, 0); + ok(r == 3, "got %d\n", r); + + DestroyWindow(hdlg); +} + START_TEST(propsheet) { test_title(); @@ -533,4 +818,6 @@ START_TEST(propsheet) test_wiznavigation(); test_buttons(); test_custom_default_button(); + test_messages(); + test_PSM_ADDPAGE(); } diff --git a/rostests/winetests/comctl32/rebar.c b/rostests/winetests/comctl32/rebar.c index d5f27b926a4..88c931c633a 100644 --- a/rostests/winetests/comctl32/rebar.c +++ b/rostests/winetests/comctl32/rebar.c @@ -30,8 +30,9 @@ #include "wine/test.h" -RECT height_change_notify_rect; +static RECT height_change_notify_rect; static HWND hMainWnd; +static int system_font_height; #define check_rect(name, val, exp) ok(val.top == exp.top && val.bottom == exp.bottom && \ @@ -46,7 +47,8 @@ static HWND hMainWnd; #define compare(val, exp, format) ok((val) == (exp), #val " value " format " expected " format "\n", (val), (exp)); -#define expect_eq(expr, value, type, format) { type ret = expr; ok((value) == ret, #expr " expected " format " got " format "\n", (value), (ret)); } +#define expect_eq(line, expr, value, type, format) { type ret = expr;\ + ok((value) == ret, #expr " expected " format " got " format " from line %d\n", (value), (ret), line); } static INT CALLBACK is_font_installed_proc(const LOGFONT *elf, const TEXTMETRIC *ntm, DWORD type, LPARAM lParam) { @@ -65,6 +67,17 @@ static BOOL is_font_installed(const char *name) return ret; } +static void init_system_font_height(void) { + HDC hDC; + TEXTMETRIC tm; + + hDC = CreateCompatibleDC(NULL); + GetTextMetrics(hDC, &tm); + DeleteDC(NULL); + + system_font_height = tm.tmHeight; +} + static HWND create_rebar_control(void) { HWND hwnd; @@ -167,131 +180,258 @@ static void dump_sizes(HWND hRebar) #else +static int string_width(const CHAR *s) { + SIZE sz; + HDC hdc; + + hdc = CreateCompatibleDC(NULL); + GetTextExtentPoint32A(hdc, s, strlen(s), &sz); + DeleteDC(hdc); + + return sz.cx; +} + typedef struct { RECT rc; DWORD fStyle; - INT cx; + UINT cx; } rbband_result_t; typedef struct { RECT rcClient; int cyBarHeight; int nRows; - int cyRowHeights[50]; + int *cyRowHeights; int nBands; - rbband_result_t bands[50]; + rbband_result_t *bands; } rbsize_result_t; -rbsize_result_t rbsize_results[] = { - { {0, 0, 672, 0}, 0, 0, {0, }, 0, {{{0, 0, 0, 0}, 0, 0}, - }, }, - { {0, 0, 672, 4}, 4, 1, {4, }, 1, { - { { 0, 0, 672, 4}, 0x00, 200}, - }, }, - { {0, 0, 672, 4}, 4, 1, {4, }, 2, { - { { 0, 0, 200, 4}, 0x00, 200}, { {200, 0, 672, 4}, 0x04, 200}, - }, }, - { {0, 0, 672, 30}, 30, 1, {30, }, 3, { - { { 0, 0, 200, 30}, 0x00, 200}, { {200, 0, 400, 30}, 0x04, 200}, - { {400, 0, 672, 30}, 0x00, 200}, - }, }, - { {0, 0, 672, 34}, 34, 1, {34, }, 4, { - { { 0, 0, 200, 34}, 0x00, 200}, { {200, 0, 400, 34}, 0x04, 200}, - { {400, 0, 604, 34}, 0x00, 200}, { {604, 0, 672, 34}, 0x04, 68}, - }, }, - { {0, 0, 672, 34}, 34, 1, {34, }, 4, { - { { 0, 0, 200, 34}, 0x00, 200}, { {200, 0, 400, 34}, 0x04, 200}, - { {400, 0, 604, 34}, 0x00, 200}, { {604, 0, 672, 34}, 0x04, 68}, - }, }, - { {0, 0, 672, 34}, 34, 1, {34, }, 4, { - { { 0, 0, 200, 34}, 0x00, 200}, { {202, 0, 402, 34}, 0x04, 200}, - { {404, 0, 604, 34}, 0x00, 200}, { {606, 0, 672, 34}, 0x04, 66}, - }, }, - { {0, 0, 672, 70}, 70, 2, {34, 34, }, 5, { - { { 0, 0, 142, 34}, 0x00, 200}, { {144, 0, 557, 34}, 0x00, 200}, - { {559, 0, 672, 34}, 0x04, 200}, { { 0, 36, 200, 70}, 0x00, 200}, - { {202, 36, 672, 70}, 0x04, 66}, - }, }, - { {0, 0, 672, 34}, 34, 1, {34, }, 5, { - { { 0, 0, 167, 34}, 0x00, 200}, { {169, 0, 582, 34}, 0x00, 200}, - { {559, 0, 759, 34}, 0x08, 200}, { {584, 0, 627, 34}, 0x00, 200}, - { {629, 0, 672, 34}, 0x04, 66}, - }, }, - { {0, 0, 672, 34}, 34, 1, {34, }, 4, { - { { 0, 0, 167, 34}, 0x00, 200}, { {169, 0, 582, 34}, 0x00, 200}, - { {584, 0, 627, 34}, 0x00, 200}, { {629, 0, 672, 34}, 0x04, 66}, - }, }, - { {0, 0, 672, 34}, 34, 1, {34, }, 3, { - { { 0, 0, 413, 34}, 0x00, 200}, { {415, 0, 615, 34}, 0x00, 200}, - { {617, 0, 672, 34}, 0x04, 66}, - }, }, - { {0, 0, 672, 34}, 34, 1, {34, }, 2, { - { { 0, 0, 604, 34}, 0x00, 200}, { {606, 0, 672, 34}, 0x04, 66}, - }, }, - { {0, 0, 672, 40}, 40, 2, {20, 20, }, 5, { - { { 0, 0, 114, 20}, 0x00, 40}, { {114, 0, 184, 20}, 0x00, 70}, - { {184, 0, 424, 20}, 0x00, 240}, { {424, 0, 672, 20}, 0x00, 60}, - { { 0, 20, 672, 40}, 0x00, 200}, - }, }, - { {0, 0, 672, 40}, 40, 2, {20, 20, }, 5, { - { { 0, 0, 114, 20}, 0x00, 40}, { {114, 0, 227, 20}, 0x00, 113}, - { {227, 0, 424, 20}, 0x00, 197}, { {424, 0, 672, 20}, 0x00, 60}, - { { 0, 20, 672, 40}, 0x00, 200}, - }, }, - { {0, 0, 672, 40}, 40, 2, {20, 20, }, 5, { - { { 0, 0, 114, 20}, 0x00, 40}, { {114, 0, 328, 20}, 0x00, 214}, - { {328, 0, 511, 20}, 0x00, 183}, { {511, 0, 672, 20}, 0x00, 161}, - { { 0, 20, 672, 40}, 0x00, 200}, - }, }, - { {0, 0, 672, 40}, 40, 2, {20, 20, }, 5, { - { { 0, 0, 114, 20}, 0x00, 40}, { {114, 0, 167, 20}, 0x00, 53}, - { {167, 0, 511, 20}, 0x00, 344}, { {511, 0, 672, 20}, 0x00, 161}, - { { 0, 20, 672, 40}, 0x00, 200}, - }, }, - { {0, 0, 672, 40}, 40, 2, {20, 20, }, 5, { - { { 0, 0, 114, 20}, 0x00, 40}, { {114, 0, 328, 20}, 0x00, 214}, - { {328, 0, 511, 20}, 0x00, 183}, { {511, 0, 672, 20}, 0x00, 161}, - { { 0, 20, 672, 40}, 0x00, 200}, - }, }, - { {0, 0, 672, 40}, 40, 2, {20, 20, }, 5, { - { { 0, 0, 114, 20}, 0x00, 40}, { {114, 0, 328, 20}, 0x00, 214}, - { {328, 0, 511, 20}, 0x00, 183}, { {511, 0, 672, 20}, 0x00, 161}, - { { 0, 20, 672, 40}, 0x00, 200}, - }, }, - { {0, 0, 672, 56}, 56, 2, {28, 28, }, 5, { - { { 0, 0, 114, 28}, 0x00, 40}, { {114, 0, 328, 28}, 0x00, 214}, - { {328, 0, 511, 28}, 0x00, 183}, { {511, 0, 672, 28}, 0x00, 161}, - { { 0, 28, 672, 56}, 0x00, 200}, - }, }, - { {0, 0, 672, 40}, 40, 2, {20, 20, }, 5, { - { { 0, 0, 114, 20}, 0x00, 40}, { {114, 0, 328, 20}, 0x00, 214}, - { {328, 0, 511, 20}, 0x00, 183}, { {511, 0, 672, 20}, 0x00, 161}, - { { 0, 20, 672, 40}, 0x00, 200}, - }, }, - { {0, 0, 672, 56}, 56, 2, {28, 28, }, 5, { - { { 0, 0, 114, 28}, 0x00, 40}, { {114, 0, 328, 28}, 0x00, 214}, - { {328, 0, 511, 28}, 0x00, 183}, { {511, 0, 672, 28}, 0x00, 161}, - { { 0, 28, 672, 56}, 0x00, 200}, - }, }, - { {0, 0, 672, 0}, 0, 0, {0, }, 0, {{{0, 0, 0, 0}, 0, 0}, - }, }, - { {0, 0, 672, 65}, 65, 1, {65, }, 3, { - { { 0, 0, 90, 65}, 0x40, 90}, { { 90, 0, 180, 65}, 0x40, 90}, - { {180, 0, 672, 65}, 0x40, 90}, - }, }, - { {0, 0, 0, 226}, 0, 0, {0, }, 0, {{{0, 0, 0, 0}, 0, 0}, - }, }, - { {0, 0, 65, 226}, 65, 1, {65, }, 1, { - { { 0, 0, 226, 65}, 0x40, 90}, - }, }, - { {0, 0, 65, 226}, 65, 1, {65, }, 2, { - { { 0, 0, 90, 65}, 0x40, 90}, { { 90, 0, 226, 65}, 0x40, 90}, - }, }, - { {0, 0, 65, 226}, 65, 1, {65, }, 3, { - { { 0, 0, 90, 65}, 0x40, 90}, { { 90, 0, 163, 65}, 0x40, 90}, - { {163, 0, 226, 65}, 0x40, 90}, - }, }, -}; +static rbsize_result_t rbsize_init(int cleft, int ctop, int cright, int cbottom, int cyBarHeight, int nRows, int nBands) +{ + rbsize_result_t ret; + + SetRect(&ret.rcClient, cleft, ctop, cright, cbottom); + ret.cyBarHeight = cyBarHeight; + ret.nRows = 0; + ret.cyRowHeights = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nRows*sizeof(int)); + ret.nBands = 0; + ret.bands = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nBands*sizeof(rbband_result_t)); + + return ret; +} + +static void rbsize_add_row(rbsize_result_t *rbsr, int rowHeight) { + rbsr->cyRowHeights[rbsr->nRows] = rowHeight; + rbsr->nRows++; +} + +static void rbsize_add_band(rbsize_result_t *rbsr, int left, int top, int right, int bottom, DWORD fStyle, UINT cx) +{ + SetRect(&(rbsr->bands[rbsr->nBands].rc), left, top, right, bottom); + rbsr->bands[rbsr->nBands].fStyle = fStyle; + rbsr->bands[rbsr->nBands].cx = cx; + rbsr->nBands++; +} + +static rbsize_result_t *rbsize_results; + +#define rbsize_results_num 27 + +static void rbsize_results_init(void) +{ + rbsize_results = HeapAlloc(GetProcessHeap(), 0, rbsize_results_num*sizeof(rbsize_result_t)); + + rbsize_results[0] = rbsize_init(0, 0, 672, 0, 0, 0, 0); + + rbsize_results[1] = rbsize_init(0, 0, 672, 4, 4, 1, 1); + rbsize_add_row(&rbsize_results[1], 4); + rbsize_add_band(&rbsize_results[1], 0, 0, 672, 4, 0x00, 200); + + rbsize_results[2] = rbsize_init(0, 0, 672, 4, 4, 1, 2); + rbsize_add_row(&rbsize_results[2], 4); + rbsize_add_band(&rbsize_results[2], 0, 0, 200, 4, 0x00, 200); + rbsize_add_band(&rbsize_results[2], 200, 0, 672, 4, 0x04, 200); + + rbsize_results[3] = rbsize_init(0, 0, 672, 30, 30, 1, 3); + rbsize_add_row(&rbsize_results[3], 30); + rbsize_add_band(&rbsize_results[3], 0, 0, 200, 30, 0x00, 200); + rbsize_add_band(&rbsize_results[3], 200, 0, 400, 30, 0x04, 200); + rbsize_add_band(&rbsize_results[3], 400, 0, 672, 30, 0x00, 200); + + rbsize_results[4] = rbsize_init(0, 0, 672, 34, 34, 1, 4); + rbsize_add_row(&rbsize_results[4], 34); + rbsize_add_band(&rbsize_results[4], 0, 0, 200, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[4], 200, 0, 400, 34, 0x04, 200); + rbsize_add_band(&rbsize_results[4], 400, 0, 604, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[4], 604, 0, 672, 34, 0x04, 68); + + rbsize_results[5] = rbsize_init(0, 0, 672, 34, 34, 1, 4); + rbsize_add_row(&rbsize_results[5], 34); + rbsize_add_band(&rbsize_results[5], 0, 0, 200, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[5], 200, 0, 400, 34, 0x04, 200); + rbsize_add_band(&rbsize_results[5], 400, 0, 604, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[5], 604, 0, 672, 34, 0x04, 68); + + rbsize_results[6] = rbsize_init(0, 0, 672, 34, 34, 1, 4); + rbsize_add_row(&rbsize_results[6], 34); + rbsize_add_band(&rbsize_results[6], 0, 0, 200, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[6], 202, 0, 402, 34, 0x04, 200); + rbsize_add_band(&rbsize_results[6], 404, 0, 604, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[6], 606, 0, 672, 34, 0x04, 66); + + rbsize_results[7] = rbsize_init(0, 0, 672, 70, 70, 2, 5); + rbsize_add_row(&rbsize_results[7], 34); + rbsize_add_row(&rbsize_results[7], 34); + rbsize_add_band(&rbsize_results[7], 0, 0, 142, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[7], 144, 0, 557, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[7], 559, 0, 672, 34, 0x04, 200); + rbsize_add_band(&rbsize_results[7], 0, 36, 200, 70, 0x00, 200); + rbsize_add_band(&rbsize_results[7], 202, 36, 672, 70, 0x04, 66); + + rbsize_results[8] = rbsize_init(0, 0, 672, 34, 34, 1, 5); + rbsize_add_row(&rbsize_results[8], 34); + rbsize_add_band(&rbsize_results[8], 0, 0, 167, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[8], 169, 0, 582, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[8], 559, 0, 759, 34, 0x08, 200); + rbsize_add_band(&rbsize_results[8], 584, 0, 627, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[8], 629, 0, 672, 34, 0x04, 66); + + rbsize_results[9] = rbsize_init(0, 0, 672, 34, 34, 1, 4); + rbsize_add_row(&rbsize_results[9], 34); + rbsize_add_band(&rbsize_results[9], 0, 0, 167, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[9], 169, 0, 582, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[9], 584, 0, 627, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[9], 629, 0, 672, 34, 0x04, 66); + + rbsize_results[10] = rbsize_init(0, 0, 672, 34, 34, 1, 3); + rbsize_add_row(&rbsize_results[10], 34); + rbsize_add_band(&rbsize_results[10], 0, 0, 413, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[10], 415, 0, 615, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[10], 617, 0, 672, 34, 0x04, 66); + + rbsize_results[11] = rbsize_init(0, 0, 672, 34, 34, 1, 2); + rbsize_add_row(&rbsize_results[11], 34); + rbsize_add_band(&rbsize_results[11], 0, 0, 604, 34, 0x00, 200); + rbsize_add_band(&rbsize_results[11], 606, 0, 672, 34, 0x04, 66); + + rbsize_results[12] = rbsize_init(0, 0, 672, 8 + 2*system_font_height, 40, 2, 5); + rbsize_add_row(&rbsize_results[12], 4 + system_font_height); + rbsize_add_row(&rbsize_results[12], 4 + system_font_height); + rbsize_add_band(&rbsize_results[12], 0, 0, 87 + string_width("ABC"), 4 + system_font_height, 0x00, 40); + rbsize_add_band(&rbsize_results[12], 87 + string_width("ABC"), 0, 157 + string_width("ABC"), 4 + system_font_height, 0x00, 70); + rbsize_add_band(&rbsize_results[12], 157 + string_width("ABC"), 0, 397 + string_width("ABC"), 4 + system_font_height, 0x00, 240); + rbsize_add_band(&rbsize_results[12], 397 + string_width("ABC"), 0, 672, 4 + system_font_height, 0x00, 60); + rbsize_add_band(&rbsize_results[12], 0, 4 + system_font_height, 672, 8 + 2*system_font_height, 0x00, 200); + + rbsize_results[13] = rbsize_init(0, 0, 672, 8 + 2*system_font_height, 40, 2, 5); + rbsize_add_row(&rbsize_results[13], 4 + system_font_height); + rbsize_add_row(&rbsize_results[13], 4 + system_font_height); + rbsize_add_band(&rbsize_results[13], 0, 0, 87 + string_width("ABC"), 4 + system_font_height, 0x00, 40); + rbsize_add_band(&rbsize_results[13], 87 + string_width("ABC"), 0, 200 + string_width("ABC"), 4 + system_font_height, 0x00, 113); + rbsize_add_band(&rbsize_results[13], 200 + string_width("ABC"), 0, 397 + string_width("ABC"), 4 + system_font_height, 0x00, 197); + rbsize_add_band(&rbsize_results[13], 397 + string_width("ABC"), 0, 672, 4 + system_font_height, 0x00, 60); + rbsize_add_band(&rbsize_results[13], 0, 4 + system_font_height, 672, 8 + 2*system_font_height, 0x00, 200); + + rbsize_results[14] = rbsize_init(0, 0, 672, 8 + 2*system_font_height, 40, 2, 5); + rbsize_add_row(&rbsize_results[14], 4 + system_font_height); + rbsize_add_row(&rbsize_results[14], 4 + system_font_height); + rbsize_add_band(&rbsize_results[14], 0, 0, 87 + string_width("ABC"), 4 + system_font_height, 0x00, 40); + rbsize_add_band(&rbsize_results[14], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 4 + system_font_height, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[14], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height, 0x00, 183); + rbsize_add_band(&rbsize_results[14], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height, 0x00, 77 + string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[14], 0, 4 + system_font_height, 672, 8 + 2*system_font_height, 0x00, 200); + + rbsize_results[15] = rbsize_init(0, 0, 672, 8 + 2*system_font_height, 40, 2, 5); + rbsize_add_row(&rbsize_results[15], 4 + system_font_height); + rbsize_add_row(&rbsize_results[15], 4 + system_font_height); + rbsize_add_band(&rbsize_results[15], 0, 0, 87 + string_width("ABC"), 4 + system_font_height, 0x00, 40); + rbsize_add_band(&rbsize_results[15], 87 + string_width("ABC"), 0, 140 + string_width("ABC"), 4 + system_font_height, 0x00, 53); + rbsize_add_band(&rbsize_results[15], 140 + string_width("ABC"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height, 0x00, 455 - string_width("MMMMMMM") - string_width("ABC")); + rbsize_add_band(&rbsize_results[15], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height, 0x00, 77 + string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[15], 0, 4 + system_font_height, 672, 8 + 2*system_font_height, 0x00, 200); + + rbsize_results[16] = rbsize_init(0, 0, 672, 8 + 2*system_font_height, 40, 2, 5); + rbsize_add_row(&rbsize_results[16], 4 + system_font_height); + rbsize_add_row(&rbsize_results[16], 4 + system_font_height); + rbsize_add_band(&rbsize_results[16], 0, 0, 87 + string_width("ABC"), 4 + system_font_height, 0x00, 40); + rbsize_add_band(&rbsize_results[16], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 4 + system_font_height, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[16], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height, 0x00, 183); + rbsize_add_band(&rbsize_results[16], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height, 0x00, 77 + string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[16], 0, 4 + system_font_height, 672, 8 + 2*system_font_height, 0x00, 200); + + rbsize_results[17] = rbsize_init(0, 0, 672, 8 + 2*system_font_height, 40, 2, 5); + rbsize_add_row(&rbsize_results[17], 4 + system_font_height); + rbsize_add_row(&rbsize_results[17], 4 + system_font_height); + rbsize_add_band(&rbsize_results[17], 0, 0, 87 + string_width("ABC"), 4 + system_font_height, 0x00, 40); + rbsize_add_band(&rbsize_results[17], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 4 + system_font_height, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[17], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height, 0x00, 183); + rbsize_add_band(&rbsize_results[17], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height, 0x00, 77 + string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[17], 0, 4 + system_font_height, 672, 8 + 2*system_font_height, 0x00, 200); + + rbsize_results[18] = rbsize_init(0, 0, 672, 56, 56, 2, 5); + rbsize_add_row(&rbsize_results[18], 28); + rbsize_add_row(&rbsize_results[18], 28); + rbsize_add_band(&rbsize_results[18], 0, 0, 87 + string_width("ABC"), 28, 0x00, 40); + rbsize_add_band(&rbsize_results[18], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 28, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[18], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 28, 0x00, 183); + rbsize_add_band(&rbsize_results[18], 595 - string_width("MMMMMMM"), 0, 672, 28, 0x00, 77 + string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[18], 0, 28, 672, 56, 0x00, 200); + + rbsize_results[19] = rbsize_init(0, 0, 672, 8 + 2*system_font_height, 40, 2, 5); + rbsize_add_row(&rbsize_results[19], 4 + system_font_height); + rbsize_add_row(&rbsize_results[19], 4 + system_font_height); + rbsize_add_band(&rbsize_results[19], 0, 0, 87 + string_width("ABC"), 4 + system_font_height, 0x00, 40); + rbsize_add_band(&rbsize_results[19], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 4 + system_font_height, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[19], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 4 + system_font_height, 0x00, 183); + rbsize_add_band(&rbsize_results[19], 595 - string_width("MMMMMMM"), 0, 672, 4 + system_font_height, 0x00, 77 + string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[19], 0, 4 + system_font_height, 672, 8 + 2*system_font_height, 0x00, 200); + + rbsize_results[20] = rbsize_init(0, 0, 672, 56, 56, 2, 5); + rbsize_add_row(&rbsize_results[20], 28); + rbsize_add_row(&rbsize_results[20], 28); + rbsize_add_band(&rbsize_results[20], 0, 0, 87 + string_width("ABC"), 28, 0x00, 40); + rbsize_add_band(&rbsize_results[20], 87 + string_width("ABC"), 0, 412 - string_width("MMMMMMM"), 28, 0x00, 325 - string_width("ABC") - string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[20], 412 - string_width("MMMMMMM"), 0, 595 - string_width("MMMMMMM"), 28, 0x00, 183); + rbsize_add_band(&rbsize_results[20], 595 - string_width("MMMMMMM"), 0, 672, 28, 0x00, 77 + string_width("MMMMMMM")); + rbsize_add_band(&rbsize_results[20], 0, 28, 672, 56, 0x00, 200); + + rbsize_results[21] = rbsize_init(0, 0, 672, 0, 0, 0, 0); + + rbsize_results[22] = rbsize_init(0, 0, 672, 65, 56, 1, 3); + rbsize_add_row(&rbsize_results[22], 65); + rbsize_add_band(&rbsize_results[22], 0, 0, 90, 65, 0x40, 90); + rbsize_add_band(&rbsize_results[22], 90, 0, 180, 65, 0x40, 90); + rbsize_add_band(&rbsize_results[22], 180, 0, 672, 65, 0x40, 90); + + rbsize_results[23] = rbsize_init(0, 0, 0, 226, 0, 0, 0); + + rbsize_results[24] = rbsize_init(0, 0, 65, 226, 65, 1, 1); + rbsize_add_row(&rbsize_results[24], 65); + rbsize_add_band(&rbsize_results[24], 0, 0, 226, 65, 0x40, 90); + + rbsize_results[25] = rbsize_init(0, 0, 65, 226, 65, 1, 2); + rbsize_add_row(&rbsize_results[25], 65); + rbsize_add_band(&rbsize_results[25], 0, 0, 90, 65, 0x40, 90); + rbsize_add_band(&rbsize_results[25], 90, 0, 226, 65, 0x40, 90); + + rbsize_results[26] = rbsize_init(0, 0, 65, 226, 65, 1, 3); + rbsize_add_row(&rbsize_results[26], 65); + rbsize_add_band(&rbsize_results[26], 0, 0, 90, 65, 0x40, 90); + rbsize_add_band(&rbsize_results[26], 90, 0, 163, 65, 0x40, 90); + rbsize_add_band(&rbsize_results[26], 163, 0, 226, 65, 0x40, 90); +} + +static void rbsize_results_free(void) +{ + int i; + + for (i = 0; i < rbsize_results_num; i++) { + HeapFree(GetProcessHeap(), 0, rbsize_results[i].cyRowHeights); + HeapFree(GetProcessHeap(), 0, rbsize_results[i].bands); + } + HeapFree(GetProcessHeap(), 0, rbsize_results); + rbsize_results = NULL; +} static int rbsize_numtests = 0; @@ -299,8 +439,7 @@ static int rbsize_numtests = 0; RECT rc; \ REBARBANDINFO rbi; \ int count, i/*, mask=(todomask)*/; \ - rbsize_result_t *res = &rbsize_results[rbsize_numtests]; \ - assert(rbsize_numtests < sizeof(rbsize_results)/sizeof(rbsize_results[0])); \ + const rbsize_result_t *res = &rbsize_results[rbsize_numtests]; \ GetClientRect(hRebar, &rc); \ check_rect("client", rc, res->rcClient); \ count = SendMessage(hRebar, RB_GETROWCOUNT, 0, 0); \ @@ -353,6 +492,8 @@ static void test_layout(void) HIMAGELIST himl; REBARINFO ri; + rbsize_results_init(); + hRebar = create_rebar_control(); check_sizes(); rbi.cbSize = REBARBANDINFOA_V6_SIZE; @@ -510,6 +651,7 @@ static void test_layout(void) SendMessageA(hRebar, RB_INSERTBAND, -1, (LPARAM)&rbi); check_sizes(); + rbsize_results_free(); DestroyWindow(hRebar); ImageList_Destroy(himl); } @@ -547,7 +689,7 @@ typedef struct { BOOL heightNotify; } rbresize_test_result_t; -rbresize_test_result_t resize_results[] = { +static const rbresize_test_result_t resize_results[] = { /* style 00000001 */ {{0, 2, 672, 2}, 0, FALSE}, {{0, 2, 672, 22}, 1, TRUE}, @@ -668,12 +810,13 @@ rbresize_test_result_t resize_results[] = { {{-2, 0, 674, 24}, 0, FALSE}, }; -static int resize_numtests = 0; +static DWORD resize_numtests = 0; #define comment(fmt, arg1) #define check_client() { \ RECT r; \ - rbresize_test_result_t *res = &resize_results[resize_numtests++]; \ + int value; \ + const rbresize_test_result_t *res = &resize_results[resize_numtests++]; \ assert(resize_numtests <= sizeof(resize_results)/sizeof(resize_results[0])); \ GetWindowRect(hRebar, &r); \ MapWindowPoints(HWND_DESKTOP, hMainWnd, (LPPOINT)&r, 2); \ @@ -682,7 +825,8 @@ static int resize_numtests = 0; } else { \ check_rect("client", r, res->rc); \ } \ - expect_eq((int)SendMessage(hRebar, RB_GETROWCOUNT, 0, 0), res->iNumRows, int, "%d"); \ + value = (int)SendMessage(hRebar, RB_GETROWCOUNT, 0, 0); \ + ok(res->iNumRows == value, "RB_GETROWCOUNT expected %d got %d\n", res->iNumRows, value); \ if (res->heightNotify) { \ RECT rcClient; \ GetClientRect(hRebar, &rcClient); \ @@ -746,11 +890,11 @@ static void test_resize(void) } } -static void expect_band_content(HWND hRebar, UINT uBand, INT fStyle, COLORREF clrFore, +static void expect_band_content_(int line, HWND hRebar, UINT uBand, INT fStyle, COLORREF clrFore, COLORREF clrBack, LPCSTR lpText, int iImage, HWND hwndChild, INT cxMinChild, INT cyMinChild, INT cx, HBITMAP hbmBack, INT wID, INT cyChild, INT cyMaxChild, INT cyIntegral, INT cxIdeal, LPARAM lParam, - INT cxHeader, INT cxHeader_broken) + UINT cxHeader, UINT cxHeader_broken) { CHAR buf[MAX_PATH] = "abc"; REBARBANDINFOA rb; @@ -762,28 +906,35 @@ static void expect_band_content(HWND hRebar, UINT uBand, INT fStyle, COLORREF cl | RBBIM_SIZE | RBBIM_STYLE | RBBIM_TEXT; rb.lpText = buf; rb.cch = MAX_PATH; - ok(SendMessageA(hRebar, RB_GETBANDINFOA, uBand, (LPARAM)&rb), "RB_GETBANDINFO failed\n"); - expect_eq(rb.fStyle, fStyle, int, "%x"); - expect_eq(rb.clrFore, clrFore, COLORREF, "%x"); - expect_eq(rb.clrBack, clrBack, COLORREF, "%x"); - expect_eq(strcmp(rb.lpText, lpText), 0, int, "%d"); - expect_eq(rb.iImage, iImage, int, "%x"); - expect_eq(rb.hwndChild, hwndChild, HWND, "%p"); - expect_eq(rb.cxMinChild, cxMinChild, int, "%d"); - expect_eq(rb.cyMinChild, cyMinChild, int, "%d"); - expect_eq(rb.cx, cx, int, "%d"); - expect_eq(rb.hbmBack, hbmBack, HBITMAP, "%p"); - expect_eq(rb.wID, wID, int, "%d"); + ok(SendMessageA(hRebar, RB_GETBANDINFOA, uBand, (LPARAM)&rb), "RB_GETBANDINFO failed from line %d\n", line); + expect_eq(line, rb.fStyle, fStyle, int, "%x"); + expect_eq(line, rb.clrFore, clrFore, COLORREF, "%x"); + expect_eq(line, rb.clrBack, clrBack, COLORREF, "%x"); + expect_eq(line, strcmp(rb.lpText, lpText), 0, int, "%d"); + expect_eq(line, rb.iImage, iImage, int, "%x"); + expect_eq(line, rb.hwndChild, hwndChild, HWND, "%p"); + expect_eq(line, rb.cxMinChild, cxMinChild, int, "%d"); + expect_eq(line, rb.cyMinChild, cyMinChild, int, "%d"); + expect_eq(line, rb.cx, cx, int, "%d"); + expect_eq(line, rb.hbmBack, hbmBack, HBITMAP, "%p"); + expect_eq(line, rb.wID, wID, int, "%d"); /* the values of cyChild, cyMaxChild and cyIntegral can't be read unless the band is RBBS_VARIABLEHEIGHT */ - expect_eq(rb.cyChild, cyChild, int, "%x"); - expect_eq(rb.cyMaxChild, cyMaxChild, int, "%x"); - expect_eq(rb.cyIntegral, cyIntegral, int, "%x"); - expect_eq(rb.cxIdeal, cxIdeal, int, "%d"); - expect_eq(rb.lParam, lParam, LPARAM, "%ld"); - ok( rb.cxHeader == cxHeader || broken(rb.cxHeader == cxHeader_broken), - "expected %d for %d\n", cxHeader, rb.cxHeader ); + expect_eq(line, rb.cyChild, cyChild, int, "%x"); + expect_eq(line, rb.cyMaxChild, cyMaxChild, int, "%x"); + expect_eq(line, rb.cyIntegral, cyIntegral, int, "%x"); + expect_eq(line, rb.cxIdeal, cxIdeal, int, "%d"); + expect_eq(line, rb.lParam, lParam, LPARAM, "%ld"); + ok(rb.cxHeader == cxHeader || rb.cxHeader == cxHeader + 1 || broken(rb.cxHeader == cxHeader_broken), + "expected %d for %d from line %d\n", cxHeader, rb.cxHeader, line); } +#define expect_band_content(hRebar, uBand, fStyle, clrFore, clrBack,\ + lpText, iImage, hwndChild, cxMinChild, cyMinChild, cx, hbmBack, wID,\ + cyChild, cyMaxChild, cyIntegral, cxIdeal, lParam, cxHeader, cxHeader_broken) \ + expect_band_content_(__LINE__, hRebar, uBand, fStyle, clrFore, clrBack,\ + lpText, iImage, hwndChild, cxMinChild, cyMinChild, cx, hbmBack, wID,\ + cyChild, cyMaxChild, cyIntegral, cxIdeal, lParam, cxHeader, cxHeader_broken) + static void test_bandinfo(void) { REBARBANDINFOA rb; @@ -814,13 +965,13 @@ static void test_bandinfo(void) rb.fMask = RBBIM_TEXT; rb.lpText = szABC; ok(SendMessageA(hRebar, RB_SETBANDINFOA, 0, (LPARAM)&rb), "RB_SETBANDINFO failed\n"); - expect_band_content(hRebar, 0, 0, 0, GetSysColor(COLOR_3DFACE), "ABC", -1, NULL, 15, 20, 0, NULL, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 35, -1); + expect_band_content(hRebar, 0, 0, 0, GetSysColor(COLOR_3DFACE), "ABC", -1, NULL, 15, 20, 0, NULL, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 3 + 2*system_font_height, -1); rb.cbSize = REBARBANDINFOA_V6_SIZE; rb.fMask = 0; ok(SendMessageA(hRebar, RB_INSERTBANDA, 1, (LPARAM)&rb), "RB_INSERTBAND failed\n"); expect_band_content(hRebar, 1, 0, 0, GetSysColor(COLOR_3DFACE), "", -1, NULL, 0, 0, 0, NULL, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 9, -1); - expect_band_content(hRebar, 0, 0, 0, GetSysColor(COLOR_3DFACE), "ABC", -1, NULL, 15, 20, 0, NULL, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 40, -1); + expect_band_content(hRebar, 0, 0, 0, GetSysColor(COLOR_3DFACE), "ABC", -1, NULL, 15, 20, 0, NULL, 0, 0xdddddddd, 0xdddddddd, 0xdddddddd, 0, 0, 8 + 2*system_font_height, -1); rb.fMask = RBBIM_HEADERSIZE; rb.cxHeader = 50; @@ -839,7 +990,7 @@ static void test_bandinfo(void) rb.fStyle = RBBS_VARIABLEHEIGHT; rb.lpText = szABC; ok(SendMessageA(hRebar, RB_SETBANDINFOA, 0, (LPARAM)&rb), "RB_SETBANDINFO failed\n"); - expect_band_content(hRebar, 0, RBBS_VARIABLEHEIGHT, 0, GetSysColor(COLOR_3DFACE), "ABC", -1, NULL, 15, 20, 0, NULL, 0, 20, 0x7fffffff, 0, 0, 0, 40, 5); + expect_band_content(hRebar, 0, RBBS_VARIABLEHEIGHT, 0, GetSysColor(COLOR_3DFACE), "ABC", -1, NULL, 15, 20, 0, NULL, 0, 20, 0x7fffffff, 0, 0, 0, 8 + 2*system_font_height, 5); DestroyWindow(hRebar); } @@ -962,7 +1113,9 @@ START_TEST(rebar) INITCOMMONCONTROLSEX iccex; MSG msg; - /* LoadLibrary is needed. This file has no references to functions in comctl32 */ + init_system_font_height(); + + /* LoadLibrary is needed. This file has no reference to functions in comctl32 */ hComctl32 = LoadLibraryA("comctl32.dll"); pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); if (!pInitCommonControlsEx) diff --git a/rostests/winetests/comctl32/resources.h b/rostests/winetests/comctl32/resources.h index beabce5bcee..e5217f1e9a5 100644 --- a/rostests/winetests/comctl32/resources.h +++ b/rostests/winetests/comctl32/resources.h @@ -37,6 +37,7 @@ #define IDD_PROP_PAGE_EXIT 33 #define IDD_PROP_PAGE_WITH_CUSTOM_DEFAULT_BUTTON 34 +#define IDD_PROP_PAGE_MESSAGE_TEST 35 #define IDC_PS_EDIT1 1000 #define IDC_PS_EDIT2 1001 diff --git a/rostests/winetests/comctl32/status.c b/rostests/winetests/comctl32/status.c index 839b138bb40..6e5a3e7d8dc 100644 --- a/rostests/winetests/comctl32/status.c +++ b/rostests/winetests/comctl32/status.c @@ -40,8 +40,8 @@ static WNDPROC g_status_wndproc; static RECT g_rcCreated; static HWND g_hMainWnd; static int g_wmsize_count = 0; -static DWORD g_ysize; -static DWORD g_dpisize; +static INT g_ysize; +static INT g_dpisize; static int g_wmdrawitm_ctr; static WNDPROC g_wndproc_saved; @@ -120,7 +120,7 @@ static int CALLBACK check_height_font_enumproc(ENUMLOGFONTEX *enumlf, NEWTEXTMET static const int sizes[] = { 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 20, 22, 28, 36, 48, 72}; DWORD i; - DWORD y; + INT y; LPSTR facename = (CHAR *)enumlf->elfFullName; /* on win9x, enumlf->elfFullName is only valid for truetype fonts */ @@ -260,8 +260,9 @@ static void test_status_control(void) HICON hIcon; char ch; char chstr[10] = "Inval id"; + COLORREF crColor = RGB(0,0,0); - hWndStatus = create_status_control(WS_VISIBLE, 0); + hWndStatus = create_status_control(WS_VISIBLE | SBT_TOOLTIPS, 0); /* Divide into parts and set text */ r = SendMessage(hWndStatus, SB_SETPARTS, 3, (LPARAM)nParts); @@ -343,14 +344,14 @@ static void test_status_control(void) } /* Set background color */ - r = SendMessage(hWndStatus, SB_SETBKCOLOR , 0, RGB(255,0,0)); - ok(r == CLR_DEFAULT || - broken(r == 0), /* win95 */ - "Expected %d, got %d\n", CLR_DEFAULT, r); - r = SendMessage(hWndStatus, SB_SETBKCOLOR , 0, CLR_DEFAULT); - ok(r == RGB(255,0,0) || - broken(r == 0), /* win95 */ - "Expected %d, got %d\n", RGB(255,0,0), r); + crColor = SendMessage(hWndStatus, SB_SETBKCOLOR , 0, RGB(255,0,0)); + ok(crColor == CLR_DEFAULT || + broken(crColor == RGB(0,0,0)), /* win95 */ + "Expected 0x%.8x, got 0x%.8x\n", CLR_DEFAULT, crColor); + crColor = SendMessage(hWndStatus, SB_SETBKCOLOR , 0, CLR_DEFAULT); + ok(crColor == RGB(255,0,0) || + broken(crColor == RGB(0,0,0)), /* win95 */ + "Expected 0x%.8x, got 0x%.8x\n", RGB(255,0,0), crColor); /* Add an icon to the status bar */ hIcon = LoadIcon(NULL, IDI_QUESTION); @@ -369,6 +370,7 @@ static void test_status_control(void) /* Set the Unicode format */ r = SendMessage(hWndStatus, SB_SETUNICODEFORMAT, FALSE, 0); + expect(FALSE,r); r = SendMessage(hWndStatus, SB_GETUNICODEFORMAT, 0, 0); expect(FALSE,r); r = SendMessage(hWndStatus, SB_SETUNICODEFORMAT, TRUE, 0); @@ -381,6 +383,12 @@ static void test_status_control(void) /* Reset number of parts */ r = SendMessage(hWndStatus, SB_SETPARTS, 2, (LPARAM)nParts); expect(TRUE,r); + r = SendMessage(hWndStatus, SB_GETPARTS, 0, 0); + ok(r == 2, "Expected 2, got %d\n", r); + r = SendMessage(hWndStatus, SB_SETPARTS, 0, 0); + expect(FALSE,r); + r = SendMessage(hWndStatus, SB_GETPARTS, 0, 0); + ok(r == 2, "Expected 2, got %d\n", r); /* Set the minimum height and get rectangle information again */ SendMessage(hWndStatus, SB_SETMINHEIGHT, 50, 0); @@ -399,15 +407,12 @@ static void test_status_control(void) expect(FALSE,r); /* Set the ToolTip text */ - todo_wine - { - SendMessage(hWndStatus, SB_SETTIPTEXT, 0,(LPARAM) "Tooltip Text"); - lstrcpyA(charArray, "apple"); - SendMessage(hWndStatus, SB_GETTIPTEXT, MAKEWPARAM (0, 20),(LPARAM) charArray); - ok(strcmp(charArray,"Tooltip Text") == 0 || - broken(!strcmp(charArray, "apple")), /* win95 */ - "Expected Tooltip Text, got %s\n", charArray); - } + SendMessage(hWndStatus, SB_SETTIPTEXT, 0,(LPARAM) "Tooltip Text"); + lstrcpyA(charArray, "apple"); + SendMessage(hWndStatus, SB_GETTIPTEXT, MAKEWPARAM (0, 20),(LPARAM) charArray); + ok(strcmp(charArray,"Tooltip Text") == 0 || + broken(!strcmp(charArray, "apple")), /* win95 */ + "Expected Tooltip Text, got %s\n", charArray); /* Make simple */ SendMessage(hWndStatus, SB_SIMPLE, TRUE, 0); @@ -455,7 +460,7 @@ static void test_status_ownerdraw(void) r = SendMessage(hWndStatus, SB_SETTEXT, SBT_OWNERDRAW, (LPARAM)statustext); ok( r == TRUE, "Sendmessage returned %d, expected 1\n", r); ok( 1 == g_wmdrawitm_ctr, "got %d drawitem messages expected 1\n", g_wmdrawitm_ctr); - /* ;and again */ + /* and again */ g_wmdrawitm_ctr = 0; r = SendMessage(hWndStatus, SB_SETTEXT, SBT_OWNERDRAW, (LPARAM)statustext); ok( r == TRUE, "Sendmessage returned %d, expected 1\n", r); diff --git a/rostests/winetests/comctl32/tab.c b/rostests/winetests/comctl32/tab.c index 6774d51a1a5..36179dcbc47 100644 --- a/rostests/winetests/comctl32/tab.c +++ b/rostests/winetests/comctl32/tab.c @@ -41,27 +41,44 @@ #define TabWidthPadded(padd_x, num) (DEFAULT_MIN_TAB_WIDTH - (TAB_PADDING_X - (padd_x)) * num) -#define TabCheckSetSize(hwnd, SetWidth, SetHeight, ExpWidth, ExpHeight, Msg)\ - SendMessage (hwnd, TCM_SETITEMSIZE, 0,\ - (LPARAM) MAKELPARAM((SetWidth >= 0) ? SetWidth:0, (SetHeight >= 0) ? SetHeight:0));\ - if (winetest_interactive) RedrawWindow (hwnd, NULL, 0, RDW_UPDATENOW);\ - CheckSize(hwnd, ExpWidth, ExpHeight, Msg); +static void CheckSize(HWND hwnd, INT width, INT height, const char *msg, int line) +{ + RECT r; -#define CheckSize(hwnd,width,height,msg)\ - SendMessage (hwnd, TCM_GETITEMRECT, 0, (LPARAM) &rTab);\ - if ((width >= 0) && (height < 0))\ - ok (width == rTab.right - rTab.left, "%s: Expected width [%d] got [%d]\n",\ - msg, (int)width, rTab.right - rTab.left);\ - else if ((height >= 0) && (width < 0))\ - ok (height == rTab.bottom - rTab.top, "%s: Expected height [%d] got [%d]\n",\ - msg, (int)height, rTab.bottom - rTab.top);\ - else\ - ok ((width == rTab.right - rTab.left) &&\ - (height == rTab.bottom - rTab.top ),\ - "%s: Expected [%d,%d] got [%d,%d]\n", msg, (int)width, (int)height,\ - rTab.right - rTab.left, rTab.bottom - rTab.top); + SendMessage(hwnd, TCM_GETITEMRECT, 0, (LPARAM)&r); + if (width >= 0 && height < 0) + { + ok_(__FILE__,line) (width == r.right - r.left, "%s: Expected width [%d] got [%d]\n",\ + msg, width, r.right - r.left); + } + else if (height >= 0 && width < 0) + { + ok_(__FILE__,line) (height == r.bottom - r.top, "%s: Expected height [%d] got [%d]\n",\ + msg, height, r.bottom - r.top); + } + else + ok_(__FILE__,line) ((width == r.right - r.left) && (height == r.bottom - r.top ), + "%s: Expected [%d,%d] got [%d,%d]\n", msg, width, height, + r.right - r.left, r.bottom - r.top); +} -static HFONT hFont = 0; +#define CHECKSIZE(hwnd,width,height,msg) CheckSize(hwnd,width,height,msg,__LINE__) + +static void TabCheckSetSize(HWND hwnd, INT set_width, INT set_height, INT exp_width, + INT exp_height, const char *msg, int line) +{ + SendMessage(hwnd, TCM_SETITEMSIZE, 0, + (LPARAM) MAKELPARAM((set_width >= 0) ? set_width : 0, (set_height >= 0) ? set_height : 0)); + if (winetest_interactive) RedrawWindow (hwnd, NULL, 0, RDW_UPDATENOW); + CheckSize(hwnd, exp_width, exp_height, msg, line); +} + +#define TABCHECKSETSIZE(hwnd,set_width,set_height,exp_width,exp_height,msg) \ + TabCheckSetSize(hwnd,set_width,set_height,exp_width,exp_height,msg,__LINE__) + +static HFONT hFont; +static DRAWITEMSTRUCT g_drawitem; +static HWND parent_wnd; static struct msg_sequence *sequences[NUM_MSG_SEQUENCES]; @@ -269,6 +286,11 @@ static const struct message delete_focus_seq[] = { { 0 } }; +static const struct message rbuttonup_seq[] = { + { WM_RBUTTONUP, sent|wparam|lparam, 0, 0 }, + { WM_CONTEXTMENU, sent|defwinproc }, + { 0 } +}; static HWND create_tabcontrol (DWORD style, DWORD mask) @@ -337,6 +359,10 @@ static LRESULT WINAPI parentWindowProcess(HWND hwnd, UINT message, WPARAM wParam add_message(sequences, PARENT_SEQ_INDEX, &msg); } + /* dump sent structure data */ + if (message == WM_DRAWITEM) + g_drawitem = *(DRAWITEMSTRUCT*)lParam; + defwndproc_counter++; ret = DefWindowProcA(hwnd, message, wParam, lParam); defwndproc_counter--; @@ -517,16 +543,16 @@ static void test_tab(INT nMinTabWidth) ReleaseDC(hwTab, hdc); trace (" TCS_FIXEDWIDTH tabs no icon...\n"); - CheckSize(hwTab, dpi, -1, "default width"); - TabCheckSetSize(hwTab, 50, 20, 50, 20, "set size"); - TabCheckSetSize(hwTab, 0, 1, 0, 1, "min size"); + CHECKSIZE(hwTab, dpi, -1, "default width"); + TABCHECKSETSIZE(hwTab, 50, 20, 50, 20, "set size"); + TABCHECKSETSIZE(hwTab, 0, 1, 0, 1, "min size"); SendMessage(hwTab, TCM_SETIMAGELIST, 0, (LPARAM)himl); trace (" TCS_FIXEDWIDTH tabs with icon...\n"); - TabCheckSetSize(hwTab, 50, 30, 50, 30, "set size > icon"); - TabCheckSetSize(hwTab, 20, 20, 25, 20, "set size < icon"); - TabCheckSetSize(hwTab, 0, 1, 25, 1, "min size"); + TABCHECKSETSIZE(hwTab, 50, 30, 50, 30, "set size > icon"); + TABCHECKSETSIZE(hwTab, 20, 20, 25, 20, "set size < icon"); + TABCHECKSETSIZE(hwTab, 0, 1, 25, 1, "min size"); DestroyWindow (hwTab); @@ -537,19 +563,19 @@ static void test_tab(INT nMinTabWidth) dpi = GetDeviceCaps(hdc, LOGPIXELSX); ReleaseDC(hwTab, hdc); trace (" TCS_FIXEDWIDTH buttons no icon...\n"); - CheckSize(hwTab, dpi, -1, "default width"); - TabCheckSetSize(hwTab, 20, 20, 20, 20, "set size 1"); - TabCheckSetSize(hwTab, 10, 50, 10, 50, "set size 2"); - TabCheckSetSize(hwTab, 0, 1, 0, 1, "min size"); + CHECKSIZE(hwTab, dpi, -1, "default width"); + TABCHECKSETSIZE(hwTab, 20, 20, 20, 20, "set size 1"); + TABCHECKSETSIZE(hwTab, 10, 50, 10, 50, "set size 2"); + TABCHECKSETSIZE(hwTab, 0, 1, 0, 1, "min size"); SendMessage(hwTab, TCM_SETIMAGELIST, 0, (LPARAM)himl); trace (" TCS_FIXEDWIDTH buttons with icon...\n"); - TabCheckSetSize(hwTab, 50, 30, 50, 30, "set size > icon"); - TabCheckSetSize(hwTab, 20, 20, 25, 20, "set size < icon"); - TabCheckSetSize(hwTab, 0, 1, 25, 1, "min size"); + TABCHECKSETSIZE(hwTab, 50, 30, 50, 30, "set size > icon"); + TABCHECKSETSIZE(hwTab, 20, 20, 25, 20, "set size < icon"); + TABCHECKSETSIZE(hwTab, 0, 1, 25, 1, "min size"); SendMessage(hwTab, TCM_SETPADDING, 0, MAKELPARAM(4,4)); - TabCheckSetSize(hwTab, 0, 1, 25, 1, "set padding, min size"); + TABCHECKSETSIZE(hwTab, 0, 1, 25, 1, "set padding, min size"); DestroyWindow (hwTab); @@ -560,19 +586,19 @@ static void test_tab(INT nMinTabWidth) dpi = GetDeviceCaps(hdc, LOGPIXELSX); ReleaseDC(hwTab, hdc); trace (" TCS_FIXEDWIDTH | TCS_BOTTOM tabs...\n"); - CheckSize(hwTab, dpi, -1, "no icon, default width"); + CHECKSIZE(hwTab, dpi, -1, "no icon, default width"); - TabCheckSetSize(hwTab, 20, 20, 20, 20, "no icon, set size 1"); - TabCheckSetSize(hwTab, 10, 50, 10, 50, "no icon, set size 2"); - TabCheckSetSize(hwTab, 0, 1, 0, 1, "no icon, min size"); + TABCHECKSETSIZE(hwTab, 20, 20, 20, 20, "no icon, set size 1"); + TABCHECKSETSIZE(hwTab, 10, 50, 10, 50, "no icon, set size 2"); + TABCHECKSETSIZE(hwTab, 0, 1, 0, 1, "no icon, min size"); SendMessage(hwTab, TCM_SETIMAGELIST, 0, (LPARAM)himl); - TabCheckSetSize(hwTab, 50, 30, 50, 30, "with icon, set size > icon"); - TabCheckSetSize(hwTab, 20, 20, 25, 20, "with icon, set size < icon"); - TabCheckSetSize(hwTab, 0, 1, 25, 1, "with icon, min size"); + TABCHECKSETSIZE(hwTab, 50, 30, 50, 30, "with icon, set size > icon"); + TABCHECKSETSIZE(hwTab, 20, 20, 25, 20, "with icon, set size < icon"); + TABCHECKSETSIZE(hwTab, 0, 1, 25, 1, "with icon, min size"); SendMessage(hwTab, TCM_SETPADDING, 0, MAKELPARAM(4,4)); - TabCheckSetSize(hwTab, 0, 1, 25, 1, "set padding, min size"); + TABCHECKSETSIZE(hwTab, 0, 1, 25, 1, "set padding, min size"); DestroyWindow (hwTab); @@ -592,15 +618,15 @@ static void test_tab(INT nMinTabWidth) SendMessage(hwTab, TCM_SETIMAGELIST, 0, 0); SendMessage(hwTab, TCM_SETPADDING, 0, MAKELPARAM(i,i)); - TabCheckSetSize(hwTab, 50, 20, max(size.cx + i*2, nTabWidth), 20, "no icon, set size"); - TabCheckSetSize(hwTab, 0, 1, max(size.cx + i*2, nTabWidth), 1, "no icon, min size"); + TABCHECKSETSIZE(hwTab, 50, 20, max(size.cx + i*2, nTabWidth), 20, "no icon, set size"); + TABCHECKSETSIZE(hwTab, 0, 1, max(size.cx + i*2, nTabWidth), 1, "no icon, min size"); SendMessage(hwTab, TCM_SETIMAGELIST, 0, (LPARAM)himl); nTabWidth = (nMinTabWidth < 0) ? TabWidthPadded(i, 3) : nMinTabWidth; - TabCheckSetSize(hwTab, 50, 30, max(size.cx + 21 + i*3, nTabWidth), 30, "with icon, set size > icon"); - TabCheckSetSize(hwTab, 20, 20, max(size.cx + 21 + i*3, nTabWidth), 20, "with icon, set size < icon"); - TabCheckSetSize(hwTab, 0, 1, max(size.cx + 21 + i*3, nTabWidth), 1, "with icon, min size"); + TABCHECKSETSIZE(hwTab, 50, 30, max(size.cx + 21 + i*3, nTabWidth), 30, "with icon, set size > icon"); + TABCHECKSETSIZE(hwTab, 20, 20, max(size.cx + 21 + i*3, nTabWidth), 20, "with icon, set size < icon"); + TABCHECKSETSIZE(hwTab, 0, 1, max(size.cx + 21 + i*3, nTabWidth), 1, "with icon, min size"); } DestroyWindow (hwTab); @@ -620,16 +646,16 @@ static void test_tab(INT nMinTabWidth) SendMessage(hwTab, TCM_SETIMAGELIST, 0, 0); SendMessage(hwTab, TCM_SETPADDING, 0, MAKELPARAM(i,i)); - TabCheckSetSize(hwTab, 50, 20, nTabWidth, 20, "no icon, set size"); - TabCheckSetSize(hwTab, 0, 1, nTabWidth, 1, "no icon, min size"); + TABCHECKSETSIZE(hwTab, 50, 20, nTabWidth, 20, "no icon, set size"); + TABCHECKSETSIZE(hwTab, 0, 1, nTabWidth, 1, "no icon, min size"); SendMessage(hwTab, TCM_SETIMAGELIST, 0, (LPARAM)himl); if (i > 1 && nMinTabWidth > 0 && nMinTabWidth < DEFAULT_MIN_TAB_WIDTH) nTabWidth += EXTRA_ICON_PADDING *(i-1); - TabCheckSetSize(hwTab, 50, 30, nTabWidth, 30, "with icon, set size > icon"); - TabCheckSetSize(hwTab, 20, 20, nTabWidth, 20, "with icon, set size < icon"); - TabCheckSetSize(hwTab, 0, 1, nTabWidth, 1, "with icon, min size"); + TABCHECKSETSIZE(hwTab, 50, 30, nTabWidth, 30, "with icon, set size > icon"); + TABCHECKSETSIZE(hwTab, 20, 20, nTabWidth, 20, "with icon, set size < icon"); + TABCHECKSETSIZE(hwTab, 0, 1, nTabWidth, 1, "with icon, min size"); } DestroyWindow (hwTab); @@ -638,8 +664,23 @@ static void test_tab(INT nMinTabWidth) DeleteObject(hFont); } -static void test_curfocus(HWND parent_wnd, INT nTabs) +static void test_width(void) { + trace ("Testing with default MinWidth\n"); + test_tab(-1); + trace ("Testing with MinWidth set to -3\n"); + test_tab(-3); + trace ("Testing with MinWidth set to 24\n"); + test_tab(24); + trace ("Testing with MinWidth set to 54\n"); + test_tab(54); + trace ("Testing with MinWidth set to 94\n"); + test_tab(94); +} + +static void test_curfocus(void) +{ + const INT nTabs = 5; INT focusIndex; HWND hTab; @@ -671,8 +712,9 @@ static void test_curfocus(HWND parent_wnd, INT nTabs) DestroyWindow(hTab); } -static void test_cursel(HWND parent_wnd, INT nTabs) +static void test_cursel(void) { + const INT nTabs = 5; INT selectionIndex; INT focusIndex; TCITEM tcItem; @@ -723,8 +765,9 @@ static void test_cursel(HWND parent_wnd, INT nTabs) DestroyWindow(hTab); } -static void test_extendedstyle(HWND parent_wnd, INT nTabs) +static void test_extendedstyle(void) { + const INT nTabs = 5; DWORD prevExtendedStyle; DWORD extendedStyle; HWND hTab; @@ -757,8 +800,9 @@ static void test_extendedstyle(HWND parent_wnd, INT nTabs) DestroyWindow(hTab); } -static void test_unicodeformat(HWND parent_wnd, INT nTabs) +static void test_unicodeformat(void) { + const INT nTabs = 5; INT unicodeFormat; HWND hTab; @@ -788,13 +832,46 @@ static void test_unicodeformat(HWND parent_wnd, INT nTabs) DestroyWindow(hTab); } -static void test_getset_item(HWND parent_wnd, INT nTabs) +static void test_getset_item(void) { - TCITEM tcItem; - DWORD ret; char szText[32] = "New Label"; + const INT nTabs = 5; + TCITEM tcItem; + LPARAM lparam; + DWORD ret; HWND hTab; + hTab = CreateWindowA( + WC_TABCONTROLA, + "TestTab", + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | TCS_FOCUSNEVER | TCS_FIXEDWIDTH | TCS_OWNERDRAWFIXED, + 10, 10, 300, 100, + parent_wnd, NULL, NULL, 0); + + ok(GetParent(hTab) == NULL, "got %p, expected null parent\n", GetParent(hTab)); + + ret = SendMessageA(hTab, TCM_SETITEMEXTRA, sizeof(LPARAM)-1, 0); + ok(ret == TRUE, "got %d\n", ret); + + /* set some item data */ + tcItem.lParam = ~0; + tcItem.mask = TCIF_PARAM; + + ret = SendMessageA(hTab, TCM_INSERTITEMA, 0, (LPARAM)&tcItem); + ok(ret == 0, "got %d\n", ret); + + /* all sizeof(LPARAM) returned anyway when using sizeof(LPARAM)-1 size */ + memset(&lparam, 0xaa, sizeof(lparam)); + tcItem.lParam = lparam; + tcItem.mask = TCIF_PARAM; + ret = SendMessage(hTab, TCM_GETITEM, 0, (LPARAM)&tcItem); + expect(TRUE, ret); + /* everything higher specified size is preserved */ + memset(&lparam, 0xff, sizeof(lparam)-1); + ok(tcItem.lParam == lparam, "Expected 0x%lx, got 0x%lx\n", lparam, tcItem.lParam); + + DestroyWindow(hTab); + hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); ok(hTab != NULL, "Failed to create tab control\n"); @@ -898,10 +975,11 @@ static void test_getset_item(HWND parent_wnd, INT nTabs) DestroyWindow(hTab); } -static void test_getset_tooltips(HWND parent_wnd, INT nTabs) +static void test_getset_tooltips(void) { - HWND hTab, toolTip; char toolTipText[32] = "ToolTip Text Test"; + const INT nTabs = 5; + HWND hTab, toolTip; hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); ok(hTab != NULL, "Failed to create tab control\n"); @@ -921,8 +999,9 @@ static void test_getset_tooltips(HWND parent_wnd, INT nTabs) DestroyWindow(hTab); } -static void test_misc(HWND parent_wnd, INT nTabs) +static void test_misc(void) { + const INT nTabs = 5; HWND hTab; RECT rTab; INT nTabsRetrieved; @@ -975,14 +1054,14 @@ static void test_misc(HWND parent_wnd, INT nTabs) hdc = GetDC(hTab); dpi = GetDeviceCaps(hdc, LOGPIXELSX); ReleaseDC(hTab, hdc); - CheckSize(hTab, dpi, -1 , "Default Width"); + CHECKSIZE(hTab, dpi, -1 , "Default Width"); ok_sequence(sequences, TAB_SEQ_INDEX, get_item_rect_seq, "Get itemRect test sequence", FALSE); ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Get itemRect test parent sequence", FALSE); DestroyWindow(hTab); } -static void test_adjustrect(HWND parent_wnd) +static void test_adjustrect(void) { HWND hTab; INT r; @@ -999,7 +1078,7 @@ static void test_adjustrect(HWND parent_wnd) expect(-1, r); } -static void test_insert_focus(HWND parent_wnd) +static void test_insert_focus(void) { HWND hTab; INT nTabsRetrieved; @@ -1015,6 +1094,9 @@ static void test_insert_focus(HWND parent_wnd) hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, mask, 0); ok(hTab != NULL, "Failed to create tab control\n"); + r = SendMessage(hTab, TCM_GETCURSEL, 0, 0); + expect(-1, r); + flush_sequences(sequences, NUM_MSG_SEQUENCES); nTabsRetrieved = SendMessage(hTab, TCM_GETITEMCOUNT, 0, 0); @@ -1062,7 +1144,7 @@ static void test_insert_focus(HWND parent_wnd) DestroyWindow(hTab); } -static void test_delete_focus(HWND parent_wnd) +static void test_delete_focus(void) { HWND hTab; INT nTabsRetrieved; @@ -1111,7 +1193,7 @@ static void test_delete_focus(HWND parent_wnd) DestroyWindow(hTab); } -static void test_removeimage(HWND parent_wnd) +static void test_removeimage(void) { static const BYTE bits[32]; HWND hwTab; @@ -1174,10 +1256,10 @@ static void test_removeimage(HWND parent_wnd) DestroyIcon(hicon); } -static void test_delete_selection(HWND parent_wnd) +static void test_delete_selection(void) { HWND hTab; - DWORD ret; + INT ret; hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, 4); ok(hTab != NULL, "Failed to create tab control\n"); @@ -1196,9 +1278,158 @@ static void test_delete_selection(HWND parent_wnd) DestroyWindow(hTab); } +static void test_TCM_SETITEMEXTRA(void) +{ + HWND hTab; + DWORD ret; + + hTab = CreateWindowA( + WC_TABCONTROLA, + "TestTab", + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | TCS_FOCUSNEVER | TCS_FIXEDWIDTH, + 10, 10, 300, 100, + parent_wnd, NULL, NULL, 0); + + /* zero is valid size too */ + ret = SendMessageA(hTab, TCM_SETITEMEXTRA, 0, 0); + if (ret == FALSE) + { + win_skip("TCM_SETITEMEXTRA not supported\n"); + DestroyWindow(hTab); + return; + } + + ret = SendMessageA(hTab, TCM_SETITEMEXTRA, -1, 0); + ok(ret == FALSE, "got %d\n", ret); + + ret = SendMessageA(hTab, TCM_SETITEMEXTRA, 2, 0); + ok(ret == TRUE, "got %d\n", ret); + DestroyWindow(hTab); + + /* it's not possible to change extra data size for control with tabs */ + hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, 4); + ok(hTab != NULL, "Failed to create tab control\n"); + + ret = SendMessageA(hTab, TCM_SETITEMEXTRA, 2, 0); + ok(ret == FALSE, "got %d\n", ret); + DestroyWindow(hTab); +} + +static void test_TCS_OWNERDRAWFIXED(void) +{ + LPARAM lparam; + ULONG_PTR itemdata, itemdata2; + TCITEMA item; + HWND hTab; + BOOL ret; + + hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH|TCS_OWNERDRAWFIXED, TCIF_TEXT|TCIF_IMAGE, 4); + ok(hTab != NULL, "Failed to create tab control\n"); + + ok(GetParent(hTab) == NULL, "got %p, expected null parent\n", GetParent(hTab)); + + /* set some item data */ + memset(&lparam, 0xde, sizeof(LPARAM)); + + item.mask = TCIF_PARAM; + item.lParam = lparam; + ret = SendMessageA(hTab, TCM_SETITEMA, 0, (LPARAM)&item); + ok(ret == TRUE, "got %d\n", ret); + + memset(&g_drawitem, 0, sizeof(g_drawitem)); + + ShowWindow(hTab, SW_SHOW); + RedrawWindow(hTab, NULL, 0, RDW_UPDATENOW); + + itemdata = 0; + memset(&itemdata, 0xde, 4); + ok(g_drawitem.itemData == itemdata, "got 0x%lx, expected 0x%lx\n", g_drawitem.itemData, itemdata); + + DestroyWindow(hTab); + + /* now with custom extra data length */ + hTab = CreateWindowA( + WC_TABCONTROLA, + "TestTab", + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | TCS_FOCUSNEVER | TCS_FIXEDWIDTH | TCS_OWNERDRAWFIXED, + 10, 10, 300, 100, + parent_wnd, NULL, NULL, 0); + + ok(GetParent(hTab) == NULL, "got %p, expected null parent\n", GetParent(hTab)); + + ret = SendMessageA(hTab, TCM_SETITEMEXTRA, sizeof(LPARAM)+1, 0); + ok(ret == TRUE, "got %d\n", ret); + + /* set some item data */ + memset(&lparam, 0xde, sizeof(LPARAM)); + item.mask = TCIF_PARAM; + item.lParam = lparam; + + ret = SendMessageA(hTab, TCM_INSERTITEMA, 0, (LPARAM)&item); + ok(ret == 0, "got %d\n", ret); + + memset(&g_drawitem, 0, sizeof(g_drawitem)); + + ShowWindow(hTab, SW_SHOW); + RedrawWindow(hTab, NULL, 0, RDW_UPDATENOW); + + memset(&itemdata, 0xde, sizeof(ULONG_PTR)); + ok(*(ULONG_PTR*)g_drawitem.itemData == itemdata, "got 0x%lx, expected 0x%lx\n", g_drawitem.itemData, itemdata); + + DestroyWindow(hTab); + + /* same thing, but size smaller than default */ + hTab = CreateWindowA( + WC_TABCONTROLA, + "TestTab", + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | TCS_FOCUSNEVER | TCS_FIXEDWIDTH | TCS_OWNERDRAWFIXED, + 10, 10, 300, 100, + parent_wnd, NULL, NULL, 0); + + ok(GetParent(hTab) == NULL, "got %p, expected null parent\n", GetParent(hTab)); + + ret = SendMessageA(hTab, TCM_SETITEMEXTRA, sizeof(LPARAM)-1, 0); + ok(ret == TRUE, "got %d\n", ret); + + memset(&lparam, 0xde, sizeof(lparam)); + item.mask = TCIF_PARAM; + item.lParam = lparam; + + ret = SendMessageA(hTab, TCM_INSERTITEMA, 0, (LPARAM)&item); + ok(ret == 0, "got %d\n", ret); + + memset(&g_drawitem, 0, sizeof(g_drawitem)); + + ShowWindow(hTab, SW_SHOW); + RedrawWindow(hTab, NULL, 0, RDW_UPDATENOW); + + itemdata = itemdata2 = 0; + memset(&itemdata, 0xde, 4); + memset(&itemdata2, 0xde, sizeof(LPARAM)-1); + ok(g_drawitem.itemData == itemdata || broken(g_drawitem.itemData == itemdata2) /* win98 */, + "got 0x%lx, expected 0x%lx\n", g_drawitem.itemData, itemdata); + + DestroyWindow(hTab); +} + +static void test_WM_CONTEXTMENU(void) +{ + HWND hTab; + + hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, 4); + ok(hTab != NULL, "Failed to create tab control\n"); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + SendMessageA(hTab, WM_RBUTTONUP, 0, 0); + + ok_sequence(sequences, TAB_SEQ_INDEX, rbuttonup_seq, "WM_RBUTTONUP response sequence", FALSE); + + DestroyWindow(hTab); +} + START_TEST(tab) { - HWND parent_wnd; LOGFONTA logfont; lstrcpyA(logfont.lfFaceName, "Arial"); @@ -1210,36 +1441,30 @@ START_TEST(tab) InitCommonControls(); - trace ("Testing with default MinWidth\n"); - test_tab(-1); - trace ("Testing with MinWidth set to -3\n"); - test_tab(-3); - trace ("Testing with MinWidth set to 24\n"); - test_tab(24); - trace ("Testing with MinWidth set to 54\n"); - test_tab(54); - trace ("Testing with MinWidth set to 94\n"); - test_tab(94); + test_width(); init_msg_sequences(sequences, NUM_MSG_SEQUENCES); parent_wnd = createParentWindow(); ok(parent_wnd != NULL, "Failed to create parent window!\n"); - test_curfocus(parent_wnd, 5); - test_cursel(parent_wnd, 5); - test_extendedstyle(parent_wnd, 5); - test_unicodeformat(parent_wnd, 5); - test_getset_item(parent_wnd, 5); - test_getset_tooltips(parent_wnd, 5); - test_misc(parent_wnd, 5); + test_curfocus(); + test_cursel(); + test_extendedstyle(); + test_unicodeformat(); + test_getset_item(); + test_getset_tooltips(); + test_misc(); - test_adjustrect(parent_wnd); + test_adjustrect(); - test_insert_focus(parent_wnd); - test_delete_focus(parent_wnd); - test_delete_selection(parent_wnd); - test_removeimage(parent_wnd); + test_insert_focus(); + test_delete_focus(); + test_delete_selection(); + test_removeimage(); + test_TCM_SETITEMEXTRA(); + test_TCS_OWNERDRAWFIXED(); + test_WM_CONTEXTMENU(); DestroyWindow(parent_wnd); } diff --git a/rostests/winetests/comctl32/toolbar.c b/rostests/winetests/comctl32/toolbar.c index 8311df575ec..5049ef66ea2 100644 --- a/rostests/winetests/comctl32/toolbar.c +++ b/rostests/winetests/comctl32/toolbar.c @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include #include #include "windef.h" @@ -57,12 +56,17 @@ static const struct message ttgetdispinfo_parent_seq[] = { #define expect(EXPECTED,GOT) ok((GOT)==(EXPECTED), "Expected %d, got %d\n", (EXPECTED), (GOT)) -#define check_rect(name, val, exp) ok(val.top == exp.top && val.bottom == exp.bottom && \ - val.left == exp.left && val.right == exp.right, "invalid rect (" name ") (%d,%d) (%d,%d) - expected (%d,%d) (%d,%d)\n", \ - val.left, val.top, val.right, val.bottom, exp.left, exp.top, exp.right, exp.bottom); +#define check_rect(name, val, exp, ...) ok(val.top == exp.top && val.bottom == exp.bottom && \ + val.left == exp.left && val.right == exp.right, "invalid rect (%d,%d) (%d,%d) - expected (%d,%d) (%d,%d) - (" name ")\n", \ + val.left, val.top, val.right, val.bottom, exp.left, exp.top, exp.right, exp.bottom, __VA_ARGS__); #define compare(val, exp, format) ok((val) == (exp), #val " value " format " expected " format "\n", (val), (exp)); +#define check_button_size(handle, width, height, ...) {\ + LRESULT bsize = SendMessageA(handle, TB_GETBUTTONSIZE, 0, 0);\ + ok(bsize == MAKELONG(width, height), "Unexpected button size - got size (%d, %d), expected (%d, %d)\n", LOWORD(bsize), HIWORD(bsize), width, height);\ + } + static void MakeButton(TBBUTTON *p, int idCommand, int fsStyle, int nString) { p->iBitmap = -2; p->idCommand = idCommand; @@ -160,6 +164,7 @@ static void basic_test(void) TBBUTTON buttons[9]; HWND hToolbar; int i; + for (i=0; i<9; i++) MakeButton(buttons+i, 1000+i, TBSTYLE_CHECKGROUP, 0); MakeButton(buttons+3, 1003, TBSTYLE_SEP|TBSTYLE_GROUP, 0); @@ -505,6 +510,14 @@ static void test_add_string(void) ok(ret == 2, "TB_ADDSTRINGA - unexpected return %d\n", ret); CHECK_STRING_TABLE(3, ret2); + /* null instance handle */ + ret = SendMessageA(hToolbar, TB_ADDSTRINGA, 0, IDS_TBADD1); + ok(ret == -1, "TB_ADDSTRINGA - unexpected return %d\n", ret); + + /* invalid instance handle */ + ret = SendMessageA(hToolbar, TB_ADDSTRINGA, 0xdeadbeef, IDS_TBADD1); + ok(ret == -1, "TB_ADDSTRINGA - unexpected return %d\n", ret); + ret = SendMessageA(hToolbar, TB_ADDSTRINGA, (WPARAM)GetModuleHandle(NULL), IDS_TBADD1); ok(ret == 3, "TB_ADDSTRINGA - unexpected return %d\n", ret); CHECK_STRING_TABLE(3, ret2); @@ -664,137 +677,312 @@ static void dump_sizes(HWND hToolbar) #else +static int system_font_height(void) { + HDC hDC; + TEXTMETRIC tm; + + hDC = CreateCompatibleDC(NULL); + GetTextMetrics(hDC, &tm); + DeleteDC(NULL); + + return tm.tmHeight; +} + +static int string_width(const CHAR *s) { + SIZE sz; + HDC hdc; + + hdc = CreateCompatibleDC(NULL); + GetTextExtentPoint32A(hdc, s, strlen(s), &sz); + DeleteDC(hdc); + + return sz.cx; +} + typedef struct { RECT rcClient; SIZE szMin; INT nButtons; - RECT rcButtons[100]; + RECT *prcButtons; } tbsize_result_t; -static tbsize_result_t tbsize_results[] = -{ - { {0, 0, 672, 26}, {100, 22}, 5, { - { 0, 2, 23, 24}, { 23, 2, 46, 24}, { 46, 2, 54, 24}, - { 54, 2, 77, 24}, { 77, 2, 100, 24}, - }, }, - { {0, 0, 672, 26}, {146, 22}, 7, { - { 0, 2, 23, 24}, { 23, 2, 46, 24}, { 46, 2, 54, 24}, - { 54, 2, 77, 24}, { 77, 2, 100, 24}, {100, 2, 123, 24}, - { 0, 24, 23, 46}, - }, }, - { {0, 0, 672, 48}, {146, 22}, 7, { - { 0, 2, 23, 24}, { 23, 2, 46, 24}, { 46, 2, 54, 24}, - { 54, 2, 77, 24}, { 77, 2, 100, 24}, {100, 2, 123, 24}, - { 0, 24, 23, 46}, - }, }, - { {0, 0, 672, 26}, {146, 22}, 7, { - { 0, 2, 23, 24}, { 23, 2, 46, 24}, { 46, 2, 54, 24}, - { 54, 2, 77, 24}, { 77, 2, 100, 24}, {100, 2, 123, 24}, - {123, 2, 146, 24}, - }, }, - { {0, 0, 672, 26}, {192, 22}, 9, { - { 0, 2, 23, 24}, { 23, 2, 46, 24}, { 46, 2, 54, 24}, - { 54, 2, 77, 24}, { 77, 2, 100, 24}, {100, 2, 123, 24}, - {123, 2, 146, 24}, {146, 2, 169, 24}, {169, 2, 192, 24}, - }, }, - { {0, 0, 672, 92}, {882, 22}, 39, { - { 0, 2, 23, 24}, { 23, 2, 46, 24}, { 0, 2, 8, 29}, - { 0, 29, 23, 51}, { 23, 29, 46, 51}, { 46, 29, 69, 51}, - { 69, 29, 92, 51}, { 92, 29, 115, 51}, {115, 29, 138, 51}, - {138, 29, 161, 51}, {161, 29, 184, 51}, {184, 29, 207, 51}, - {207, 29, 230, 51}, {230, 29, 253, 51}, {253, 29, 276, 51}, - {276, 29, 299, 51}, {299, 29, 322, 51}, {322, 29, 345, 51}, - {345, 29, 368, 51}, {368, 29, 391, 51}, {391, 29, 414, 51}, - {414, 29, 437, 51}, {437, 29, 460, 51}, {460, 29, 483, 51}, - {483, 29, 506, 51}, {506, 29, 529, 51}, {529, 29, 552, 51}, - {552, 29, 575, 51}, {575, 29, 598, 51}, {598, 29, 621, 51}, - {621, 29, 644, 51}, {644, 29, 667, 51}, { 0, 51, 23, 73}, - { 23, 51, 46, 73}, { 46, 51, 69, 73}, { 69, 51, 92, 73}, - { 92, 51, 115, 73}, {115, 51, 138, 73}, {138, 51, 161, 73}, - }, }, - { {0, 0, 48, 226}, {23, 140}, 7, { - { 0, 2, 23, 24}, { 23, 2, 46, 24}, { 46, 2, 94, 24}, - { 94, 2, 117, 24}, {117, 2, 140, 24}, {140, 2, 163, 24}, - { 0, 24, 23, 46}, - }, }, - { {0, 0, 92, 226}, {23, 140}, 7, { - { 0, 2, 23, 24}, { 23, 2, 46, 24}, { 0, 24, 92, 32}, - { 0, 32, 23, 54}, { 23, 32, 46, 54}, { 46, 32, 69, 54}, - { 69, 32, 92, 54}, - }, }, - { {0, 0, 672, 26}, {194, 30}, 7, { - { 0, 2, 31, 32}, { 31, 2, 62, 32}, { 62, 2, 70, 32}, - { 70, 2, 101, 32}, {101, 2, 132, 32}, {132, 2, 163, 32}, - { 0, 32, 31, 62}, - }, }, - { {0, 0, 672, 64}, {194, 30}, 7, { - { 0, 2, 31, 32}, { 31, 2, 62, 32}, { 62, 2, 70, 32}, - { 70, 2, 101, 32}, {101, 2, 132, 32}, {132, 2, 163, 32}, - { 0, 32, 31, 62}, - }, }, - { {0, 0, 672, 64}, {194, 30}, 7, { - { 0, 0, 31, 30}, { 31, 0, 62, 30}, { 62, 0, 70, 30}, - { 70, 0, 101, 30}, {101, 0, 132, 30}, {132, 0, 163, 30}, - { 0, 30, 31, 60}, - }, }, - { {0, 0, 124, 226}, {31, 188}, 7, { - { 0, 0, 31, 30}, { 31, 0, 62, 30}, { 0, 30, 124, 38}, - { 0, 38, 31, 68}, { 31, 38, 62, 68}, { 62, 38, 93, 68}, - { 93, 38, 124, 68}, - }, }, - { {0, 0, 672, 26}, {146, 22}, 7, { - { 0, 2, 23, 24}, { 23, 2, 46, 24}, { 46, 2, 54, 24}, - { 54, 2, 77, 24}, { 77, 2, 100, 24}, {100, 2, 123, 24}, - {123, 2, 146, 24}, - }, }, - { {0, 0, 672, 26}, {146, 100}, 7, { - { 0, 0, 23, 100}, { 23, 0, 46, 100}, { 46, 0, 54, 100}, - { 54, 0, 77, 100}, { 77, 0, 100, 100}, {100, 0, 123, 100}, - {123, 0, 146, 100}, - }, }, - { {0, 0, 672, 26}, {215, 100}, 10, { - { 0, 0, 23, 100}, { 23, 0, 46, 100}, { 46, 0, 54, 100}, - { 54, 0, 77, 100}, { 77, 0, 100, 100}, {100, 0, 123, 100}, - {123, 0, 146, 100}, {146, 0, 169, 100}, {169, 0, 192, 100}, - {192, 0, 215, 100}, - }, }, - { {0, 0, 672, 26}, {238, 39}, 11, { - { 0, 0, 23, 39}, { 23, 0, 46, 39}, { 46, 0, 54, 39}, - { 54, 0, 77, 39}, { 77, 0, 100, 39}, {100, 0, 123, 39}, - {123, 0, 146, 39}, {146, 0, 169, 39}, {169, 0, 192, 39}, - {192, 0, 215, 39}, {215, 0, 238, 39}, - }, }, - { {0, 0, 672, 26}, {238, 22}, 11, { - { 0, 0, 23, 22}, { 23, 0, 46, 22}, { 46, 0, 54, 22}, - { 54, 0, 77, 22}, { 77, 0, 100, 22}, {100, 0, 123, 22}, - {123, 0, 146, 22}, {146, 0, 169, 22}, {169, 0, 192, 22}, - {192, 0, 215, 22}, {215, 0, 238, 22}, - }, }, - { {0, 0, 672, 26}, {489, 39}, 3, { - { 0, 2, 163, 41}, {163, 2, 330, 41}, {330, 2, 493, 41}, - }, }, - { {0, 0, 672, 104}, {978, 24}, 6, { - { 0, 2, 163, 26}, {163, 2, 326, 26}, {326, 2, 489, 26}, - {489, 2, 652, 26}, {652, 2, 819, 26}, {819, 2, 850, 26}, - }, }, - { {0, 0, 672, 28}, {978, 38}, 6, { - { 0, 0, 163, 38}, {163, 0, 326, 38}, {326, 0, 489, 38}, - {489, 0, 652, 38}, {652, 0, 819, 38}, {819, 0, 850, 38}, - }, }, - { {0, 0, 672, 100}, {239, 102}, 3, { - { 0, 2, 100, 102}, {100, 2, 139, 102}, {139, 2, 239, 102}, - }, }, - { {0, 0, 672, 42}, {185, 40}, 3, { - { 0, 2, 75, 40}, {75, 2, 118, 40}, {118, 2, 185, 40}, - }, }, - { {0, 0, 672, 42}, {67, 40}, 1, { - { 0, 2, 67, 40}, - }, }, - { {0, 0, 672, 42}, {67, 41}, 2, { - { 0, 2, 672, 41}, { 0, 41, 672, 80}, - }, }, -}; +static tbsize_result_t init_tbsize_result(int nButtonsAlloc, int cleft, int ctop, int cright, int cbottom, int minx, int miny) { + tbsize_result_t ret; + + SetRect(&ret.rcClient, cleft, ctop, cright, cbottom); + ret.szMin.cx = minx; + ret.szMin.cy = miny; + ret.nButtons = 0; + ret.prcButtons = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, nButtonsAlloc*sizeof(RECT)); + + return ret; +} + +static void tbsize_addbutton(tbsize_result_t *tbsr, int left, int top, int right, int bottom) { + SetRect(&tbsr->prcButtons[tbsr->nButtons], left, top, right, bottom); + tbsr->nButtons++; +} + +#define STRING0 "A" +#define STRING1 "MMMMMMMMMMMMM" +#define STRING2 "Tst" + +static tbsize_result_t *tbsize_results; + +#define tbsize_results_num 24 + +static void init_tbsize_results(void) { + int fontheight = system_font_height(); + int buttonwidth; + + tbsize_results = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, tbsize_results_num*sizeof(tbsize_result_t)); + + tbsize_results[0] = init_tbsize_result(5, 0, 0 ,672 ,26, 100 ,22); + tbsize_addbutton(&tbsize_results[0], 0, 2, 23, 24); + tbsize_addbutton(&tbsize_results[0], 23, 2, 46, 24); + tbsize_addbutton(&tbsize_results[0], 46, 2, 54, 24); + tbsize_addbutton(&tbsize_results[0], 54, 2, 77, 24); + tbsize_addbutton(&tbsize_results[0], 77, 2, 100, 24); + + tbsize_results[1] = init_tbsize_result(7, 0, 0, 672, 26, 146, 22); + tbsize_addbutton(&tbsize_results[1], 0, 2, 23, 24); + tbsize_addbutton(&tbsize_results[1], 23, 2, 46, 24); + tbsize_addbutton(&tbsize_results[1], 46, 2, 54, 24); + tbsize_addbutton(&tbsize_results[1], 54, 2, 77, 24); + tbsize_addbutton(&tbsize_results[1], 77, 2, 100, 24); + tbsize_addbutton(&tbsize_results[1], 100, 2, 123, 24); + tbsize_addbutton(&tbsize_results[1], 0, 24, 23, 46); + + tbsize_results[2] = init_tbsize_result(7, 0, 0, 672, 26, 146, 22); + tbsize_addbutton(&tbsize_results[2], 0, 2, 23, 24); + tbsize_addbutton(&tbsize_results[2], 23, 2, 46, 24); + tbsize_addbutton(&tbsize_results[2], 46, 2, 54, 24); + tbsize_addbutton(&tbsize_results[2], 54, 2, 77, 24); + tbsize_addbutton(&tbsize_results[2], 77, 2, 100, 24); + tbsize_addbutton(&tbsize_results[2], 100, 2, 123, 24); + tbsize_addbutton(&tbsize_results[2], 0, 24, 23, 46); + + tbsize_results[3] = init_tbsize_result(7, 0, 0, 672, 26, 146, 22); + tbsize_addbutton(&tbsize_results[3], 0, 2, 23, 24); + tbsize_addbutton(&tbsize_results[3], 23, 2, 46, 24); + tbsize_addbutton(&tbsize_results[3], 46, 2, 54, 24); + tbsize_addbutton(&tbsize_results[3], 54, 2, 77, 24); + tbsize_addbutton(&tbsize_results[3], 77, 2, 100, 24); + tbsize_addbutton(&tbsize_results[3], 100, 2, 123, 24); + tbsize_addbutton(&tbsize_results[3], 123, 2, 146, 24); + + tbsize_results[4] = init_tbsize_result(9, 0, 0, 672, 26, 192, 22); + tbsize_addbutton(&tbsize_results[4], 0, 2, 23, 24); + tbsize_addbutton(&tbsize_results[4], 23, 2, 46, 24); + tbsize_addbutton(&tbsize_results[4], 46, 2, 54, 24); + tbsize_addbutton(&tbsize_results[4], 54, 2, 77, 24); + tbsize_addbutton(&tbsize_results[4], 77, 2, 100, 24); + tbsize_addbutton(&tbsize_results[4], 100, 2, 123, 24); + tbsize_addbutton(&tbsize_results[4], 123, 2, 146, 24); + tbsize_addbutton(&tbsize_results[4], 146, 2, 169, 24); + tbsize_addbutton(&tbsize_results[4], 169, 2, 192, 24); + + tbsize_results[5] = init_tbsize_result(39, 0, 0, 672, 92, 882, 22); + tbsize_addbutton(&tbsize_results[5], 0, 2, 23, 24); + tbsize_addbutton(&tbsize_results[5], 23, 2, 46, 24); + tbsize_addbutton(&tbsize_results[5], 0, 2, 8, 29); + tbsize_addbutton(&tbsize_results[5], 0, 29, 23, 51); + tbsize_addbutton(&tbsize_results[5], 23, 29, 46, 51); + tbsize_addbutton(&tbsize_results[5], 46, 29, 69, 51); + tbsize_addbutton(&tbsize_results[5], 69, 29, 92, 51); + tbsize_addbutton(&tbsize_results[5], 92, 29, 115, 51); + tbsize_addbutton(&tbsize_results[5], 115, 29, 138, 51); + tbsize_addbutton(&tbsize_results[5], 138, 29, 161, 51); + tbsize_addbutton(&tbsize_results[5], 161, 29, 184, 51); + tbsize_addbutton(&tbsize_results[5], 184, 29, 207, 51); + tbsize_addbutton(&tbsize_results[5], 207, 29, 230, 51); + tbsize_addbutton(&tbsize_results[5], 230, 29, 253, 51); + tbsize_addbutton(&tbsize_results[5], 253, 29, 276, 51); + tbsize_addbutton(&tbsize_results[5], 276, 29, 299, 51); + tbsize_addbutton(&tbsize_results[5], 299, 29, 322, 51); + tbsize_addbutton(&tbsize_results[5], 322, 29, 345, 51); + tbsize_addbutton(&tbsize_results[5], 345, 29, 368, 51); + tbsize_addbutton(&tbsize_results[5], 368, 29, 391, 51); + tbsize_addbutton(&tbsize_results[5], 391, 29, 414, 51); + tbsize_addbutton(&tbsize_results[5], 414, 29, 437, 51); + tbsize_addbutton(&tbsize_results[5], 437, 29, 460, 51); + tbsize_addbutton(&tbsize_results[5], 460, 29, 483, 51); + tbsize_addbutton(&tbsize_results[5], 483, 29, 506, 51); + tbsize_addbutton(&tbsize_results[5], 506, 29, 529, 51); + tbsize_addbutton(&tbsize_results[5], 529, 29, 552, 51); + tbsize_addbutton(&tbsize_results[5], 552, 29, 575, 51); + tbsize_addbutton(&tbsize_results[5], 575, 29, 598, 51); + tbsize_addbutton(&tbsize_results[5], 598, 29, 621, 51); + tbsize_addbutton(&tbsize_results[5], 621, 29, 644, 51); + tbsize_addbutton(&tbsize_results[5], 644, 29, 667, 51); + tbsize_addbutton(&tbsize_results[5], 0, 51, 23, 73); + tbsize_addbutton(&tbsize_results[5], 23, 51, 46, 73); + tbsize_addbutton(&tbsize_results[5], 46, 51, 69, 73); + tbsize_addbutton(&tbsize_results[5], 69, 51, 92, 73); + tbsize_addbutton(&tbsize_results[5], 92, 51, 115, 73); + tbsize_addbutton(&tbsize_results[5], 115, 51, 138, 73); + tbsize_addbutton(&tbsize_results[5], 138, 51, 161, 73); + + tbsize_results[6] = init_tbsize_result(7, 0, 0, 48, 226, 23, 140); + tbsize_addbutton(&tbsize_results[6], 0, 2, 23, 24); + tbsize_addbutton(&tbsize_results[6], 23, 2, 46, 24); + tbsize_addbutton(&tbsize_results[6], 46, 2, 94, 24); + tbsize_addbutton(&tbsize_results[6], 94, 2, 117, 24); + tbsize_addbutton(&tbsize_results[6], 117, 2, 140, 24); + tbsize_addbutton(&tbsize_results[6], 140, 2, 163, 24); + tbsize_addbutton(&tbsize_results[6], 0, 24, 23, 46); + + tbsize_results[7] = init_tbsize_result(7, 0, 0, 92, 226, 23, 140); + tbsize_addbutton(&tbsize_results[7], 0, 2, 23, 24); + tbsize_addbutton(&tbsize_results[7], 23, 2, 46, 24); + tbsize_addbutton(&tbsize_results[7], 0, 24, 92, 32); + tbsize_addbutton(&tbsize_results[7], 0, 32, 23, 54); + tbsize_addbutton(&tbsize_results[7], 23, 32, 46, 54); + tbsize_addbutton(&tbsize_results[7], 46, 32, 69, 54); + tbsize_addbutton(&tbsize_results[7], 69, 32, 92, 54); + + tbsize_results[8] = init_tbsize_result(7, 0, 0, 672, 26, 194, 30); + tbsize_addbutton(&tbsize_results[8], 0, 2, 31, 32); + tbsize_addbutton(&tbsize_results[8], 31, 2, 62, 32); + tbsize_addbutton(&tbsize_results[8], 62, 2, 70, 32); + tbsize_addbutton(&tbsize_results[8], 70, 2, 101, 32); + tbsize_addbutton(&tbsize_results[8], 101, 2, 132, 32); + tbsize_addbutton(&tbsize_results[8], 132, 2, 163, 32); + tbsize_addbutton(&tbsize_results[8], 0, 32, 31, 62); + + tbsize_results[9] = init_tbsize_result(7, 0, 0, 672, 64, 194, 30); + tbsize_addbutton(&tbsize_results[9], 0, 2, 31, 32); + tbsize_addbutton(&tbsize_results[9], 31, 2, 62, 32); + tbsize_addbutton(&tbsize_results[9], 62, 2, 70, 32); + tbsize_addbutton(&tbsize_results[9], 70, 2, 101, 32); + tbsize_addbutton(&tbsize_results[9], 101, 2, 132, 32); + tbsize_addbutton(&tbsize_results[9], 132, 2, 163, 32); + tbsize_addbutton(&tbsize_results[9], 0, 32, 31, 62); + + tbsize_results[10] = init_tbsize_result(7, 0, 0, 672, 64, 194, 30); + tbsize_addbutton(&tbsize_results[10], 0, 0, 31, 30); + tbsize_addbutton(&tbsize_results[10], 31, 0, 62, 30); + tbsize_addbutton(&tbsize_results[10], 62, 0, 70, 30); + tbsize_addbutton(&tbsize_results[10], 70, 0, 101, 30); + tbsize_addbutton(&tbsize_results[10], 101, 0, 132, 30); + tbsize_addbutton(&tbsize_results[10], 132, 0, 163, 30); + tbsize_addbutton(&tbsize_results[10], 0, 30, 31, 60); + + tbsize_results[11] = init_tbsize_result(7, 0, 0, 124, 226, 31, 188); + tbsize_addbutton(&tbsize_results[11], 0, 0, 31, 30); + tbsize_addbutton(&tbsize_results[11], 31, 0, 62, 30); + tbsize_addbutton(&tbsize_results[11], 0, 30, 124, 38); + tbsize_addbutton(&tbsize_results[11], 0, 38, 31, 68); + tbsize_addbutton(&tbsize_results[11], 31, 38, 62, 68); + tbsize_addbutton(&tbsize_results[11], 62, 38, 93, 68); + tbsize_addbutton(&tbsize_results[11], 93, 38, 124, 68); + + tbsize_results[12] = init_tbsize_result(7, 0, 0, 672, 26, 146, 22); + tbsize_addbutton(&tbsize_results[12], 0, 2, 23, 24); + tbsize_addbutton(&tbsize_results[12], 23, 2, 46, 24); + tbsize_addbutton(&tbsize_results[12], 46, 2, 54, 24); + tbsize_addbutton(&tbsize_results[12], 54, 2, 77, 24); + tbsize_addbutton(&tbsize_results[12], 77, 2, 100, 24); + tbsize_addbutton(&tbsize_results[12], 100, 2, 123, 24); + tbsize_addbutton(&tbsize_results[12], 123, 2, 146, 24); + + tbsize_results[13] = init_tbsize_result(7, 0, 0, 672, 26, 146, 100); + tbsize_addbutton(&tbsize_results[13], 0, 0, 23, 100); + tbsize_addbutton(&tbsize_results[13], 23, 0, 46, 100); + tbsize_addbutton(&tbsize_results[13], 46, 0, 54, 100); + tbsize_addbutton(&tbsize_results[13], 54, 0, 77, 100); + tbsize_addbutton(&tbsize_results[13], 77, 0, 100, 100); + tbsize_addbutton(&tbsize_results[13], 100, 0, 123, 100); + tbsize_addbutton(&tbsize_results[13], 123, 0, 146, 100); + + tbsize_results[14] = init_tbsize_result(10, 0, 0, 672, 26, 146, 100); + tbsize_addbutton(&tbsize_results[14], 0, 0, 23, 100); + tbsize_addbutton(&tbsize_results[14], 23, 0, 46, 100); + tbsize_addbutton(&tbsize_results[14], 46, 0, 54, 100); + tbsize_addbutton(&tbsize_results[14], 54, 0, 77, 100); + tbsize_addbutton(&tbsize_results[14], 77, 0, 100, 100); + tbsize_addbutton(&tbsize_results[14], 100, 0, 123, 100); + tbsize_addbutton(&tbsize_results[14], 123, 0, 146, 100); + tbsize_addbutton(&tbsize_results[14], 146, 0, 169, 100); + tbsize_addbutton(&tbsize_results[14], 169, 0, 192, 100); + tbsize_addbutton(&tbsize_results[14], 192, 0, 215, 100); + + tbsize_results[15] = init_tbsize_result(11, 0, 0, 672, 26, 238, 39); + tbsize_addbutton(&tbsize_results[15], 0, 0, 23, 23 + fontheight); + tbsize_addbutton(&tbsize_results[15], 23, 0, 46, 23 + fontheight); + tbsize_addbutton(&tbsize_results[15], 46, 0, 54, 23 + fontheight); + tbsize_addbutton(&tbsize_results[15], 54, 0, 77, 23 + fontheight); + tbsize_addbutton(&tbsize_results[15], 77, 0, 100, 23 + fontheight); + tbsize_addbutton(&tbsize_results[15], 100, 0, 123, 23 + fontheight); + tbsize_addbutton(&tbsize_results[15], 123, 0, 146, 23 + fontheight); + tbsize_addbutton(&tbsize_results[15], 146, 0, 169, 23 + fontheight); + tbsize_addbutton(&tbsize_results[15], 169, 0, 192, 23 + fontheight); + tbsize_addbutton(&tbsize_results[15], 192, 0, 215, 23 + fontheight); + tbsize_addbutton(&tbsize_results[15], 215, 0, 238, 23 + fontheight); + + tbsize_results[16] = init_tbsize_result(11, 0, 0, 672, 26, 239, 22); + tbsize_addbutton(&tbsize_results[16], 0, 0, 23, 22); + tbsize_addbutton(&tbsize_results[16], 23, 0, 46, 22); + tbsize_addbutton(&tbsize_results[16], 46, 0, 54, 22); + tbsize_addbutton(&tbsize_results[16], 54, 0, 77, 22); + tbsize_addbutton(&tbsize_results[16], 77, 0, 100, 22); + tbsize_addbutton(&tbsize_results[16], 100, 0, 123, 22); + tbsize_addbutton(&tbsize_results[16], 123, 0, 146, 22); + tbsize_addbutton(&tbsize_results[16], 146, 0, 169, 22); + tbsize_addbutton(&tbsize_results[16], 169, 0, 192, 22); + tbsize_addbutton(&tbsize_results[16], 192, 0, 215, 22); + tbsize_addbutton(&tbsize_results[16], 215, 0, 238, 22); + + buttonwidth = 7 + string_width(STRING1); + + tbsize_results[17] = init_tbsize_result(3, 0, 0, 672, 26, 489, 39); + tbsize_addbutton(&tbsize_results[17], 0, 2, buttonwidth, 25 + fontheight); + tbsize_addbutton(&tbsize_results[17], buttonwidth, 2, 2*buttonwidth + 4, 25 + fontheight); + tbsize_addbutton(&tbsize_results[17], 2*buttonwidth + 4, 2, 3*buttonwidth + 4, 25 + fontheight); + + tbsize_results[18] = init_tbsize_result(6, 0, 0, 672, 104, 978, 24); + tbsize_addbutton(&tbsize_results[18], 0, 2, buttonwidth, 10 + fontheight); + tbsize_addbutton(&tbsize_results[18], buttonwidth, 2, 2*buttonwidth, 10 + fontheight); + tbsize_addbutton(&tbsize_results[18], 2*buttonwidth, 2, 3*buttonwidth, 10 + fontheight); + tbsize_addbutton(&tbsize_results[18], 3*buttonwidth, 2, 4*buttonwidth, 10 + fontheight); + tbsize_addbutton(&tbsize_results[18], 4*buttonwidth, 2, 5*buttonwidth + 4, 10 + fontheight); + tbsize_addbutton(&tbsize_results[18], 5*buttonwidth + 4, 2, 5*buttonwidth + 4 + string_width(STRING2) + 11, 10 + fontheight); + + tbsize_results[19] = init_tbsize_result(6, 0, 0, 672, 28, 978, 38); + tbsize_addbutton(&tbsize_results[19], 0, 0, buttonwidth, 22 + fontheight); + tbsize_addbutton(&tbsize_results[19], buttonwidth, 0, 2*buttonwidth, 22 + fontheight); + tbsize_addbutton(&tbsize_results[19], 2*buttonwidth, 0, 3*buttonwidth, 22 + fontheight); + tbsize_addbutton(&tbsize_results[19], 3*buttonwidth, 0, 4*buttonwidth, 22 + fontheight); + tbsize_addbutton(&tbsize_results[19], 4*buttonwidth, 0, 5*buttonwidth + 4, 22 + fontheight); + tbsize_addbutton(&tbsize_results[19], 5*buttonwidth + 4, 0, 5*buttonwidth + 4 + string_width(STRING2) + 11, 22 + fontheight); + + tbsize_results[20] = init_tbsize_result(3, 0, 0, 672, 100, 239, 102); + tbsize_addbutton(&tbsize_results[20], 0, 2, 100, 102); + tbsize_addbutton(&tbsize_results[20], 100, 2, 139, 102); + tbsize_addbutton(&tbsize_results[20], 139, 2, 239, 102); + + tbsize_results[21] = init_tbsize_result(3, 0, 0, 672, 42, 185, 40); + tbsize_addbutton(&tbsize_results[21], 0, 2, 75, 40); + tbsize_addbutton(&tbsize_results[21], 75, 2, 118, 40); + tbsize_addbutton(&tbsize_results[21], 118, 2, 165 + string_width(STRING2), 40); + + tbsize_results[22] = init_tbsize_result(1, 0, 0, 672, 42, 67, 40); + tbsize_addbutton(&tbsize_results[22], 0, 2, 47 + string_width(STRING2), 40); + + tbsize_results[23] = init_tbsize_result(2, 0, 0, 672, 42, 67, 41); + tbsize_addbutton(&tbsize_results[23], 0, 2, 672, 25 + fontheight); + tbsize_addbutton(&tbsize_results[23], 0, 25 + fontheight, 672, 48 + 2*fontheight); +} + +static void free_tbsize_results(void) { + int i; + + for (i = 0; i < tbsize_results_num; i++) + HeapFree(GetProcessHeap(), 0, tbsize_results[i].prcButtons); + HeapFree(GetProcessHeap(), 0, tbsize_results); + tbsize_results = NULL; +} static int tbsize_numtests = 0; @@ -812,13 +1000,12 @@ static tbsize_alt_result_t tbsize_alt_results[] = { 20, 2, { 107, 2, 207, 102 } } }; -static int tbsize_alt_numtests = 0; +static DWORD tbsize_alt_numtests = 0; #define check_sizes_todo(todomask) { \ RECT rc; \ int buttonCount, i, mask=(todomask); \ tbsize_result_t *res = &tbsize_results[tbsize_numtests]; \ - assert(tbsize_numtests < sizeof(tbsize_results)/sizeof(tbsize_results[0])); \ GetClientRect(hToolbar, &rc); \ /*check_rect("client", rc, res->rcClient);*/ \ buttonCount = SendMessage(hToolbar, TB_BUTTONCOUNT, 0, 0); \ @@ -830,9 +1017,9 @@ static int tbsize_alt_numtests = 0; win_skip("Alternate rect found\n"); \ tbsize_alt_numtests++; \ } else if (!(mask&1)) { \ - check_rect("button", rc, res->rcButtons[i]); \ + check_rect("button = %d, tbsize_numtests = %d", rc, res->prcButtons[i], i, tbsize_numtests); \ } else {\ - todo_wine { check_rect("button", rc, res->rcButtons[i]); } \ + todo_wine { check_rect("button = %d, tbsize_numtests = %d", rc, res->prcButtons[i], i, tbsize_numtests); } \ } \ mask >>= 1; \ } \ @@ -855,7 +1042,7 @@ static TBBUTTON buttons3[] = { {0, 30, TBSTATE_ENABLED, 0, {0, }, 0, 0}, {0, 31, TBSTATE_ENABLED, 0, {0, }, 0, 1}, {0, 32, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0, }, 0, 1}, - {0, 33, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0, }, 0, (UINT_PTR)"Tst"} + {0, 33, TBSTATE_ENABLED, BTNS_AUTOSIZE, {0, }, 0, (UINT_PTR)STRING2} }; static void test_sizes(void) @@ -865,6 +1052,9 @@ static void test_sizes(void) TBBUTTONINFO tbinfo; int style; int i; + int fontheight = system_font_height(); + + init_tbsize_results(); rebuild_toolbar_with_buttons(&hToolbar); style = GetWindowLong(hToolbar, GWL_STYLE); @@ -922,15 +1112,15 @@ static void test_sizes(void) SendMessageA(hToolbar, TB_ADDBUTTONS, 2, (LPARAM)buttons2); check_sizes(); /* TB_SETBUTTONSIZE can't be used to reduce the size of a button below the default */ - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 22), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 22); ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(22, 21))==1, "TB_SETBUTTONSIZE\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 22), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 22); ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(5, 100))==1, "TB_SETBUTTONSIZE\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 100), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 100); ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(3, 3))==1, "TB_SETBUTTONSIZE\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 22), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 22); ok(SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(5, 100))==1, "TB_SETBUTTONSIZE\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 100), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 100); check_sizes(); /* add some buttons with non-default sizes */ SendMessageA(hToolbar, TB_ADDBUTTONS, 2, (LPARAM)buttons2); @@ -938,26 +1128,26 @@ static void test_sizes(void) check_sizes(); SendMessageA(hToolbar, TB_ADDBUTTONS, 1, (LPARAM)&buttons3[0]); /* TB_ADDSTRING resets the size */ - SendMessageA(hToolbar, TB_ADDSTRING, 0, (LPARAM)"A\0MMMMMMMMMMMMM\0"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 39), "Unexpected button size\n"); + SendMessageA(hToolbar, TB_ADDSTRING, 0, (LPARAM) STRING0 "\0" STRING1 "\0"); + check_button_size(hToolbar, 23, 23 + fontheight); check_sizes(); /* TB_SETBUTTONSIZE can be used to crop the text */ SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(3, 3)); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 22), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 22); check_sizes(); /* the default size is bitmap size + padding */ SendMessageA(hToolbar, TB_SETPADDING, 0, MAKELONG(1, 1)); SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(3, 3)); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(17, 17), "Unexpected button size\n"); + check_button_size(hToolbar, 17, 17); SendMessageA(hToolbar, TB_SETBITMAPSIZE, 0, MAKELONG(3, 3)); SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(3, 3)); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(4, 4), "Unexpected button size\n"); + check_button_size(hToolbar, 4, 4); rebuild_toolbar(&hToolbar); /* sending a TB_SETBITMAPSIZE with the same sizes is enough to make the button smaller */ - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 22), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 22); SendMessageA(hToolbar, TB_SETBITMAPSIZE, 0, MAKELONG(16, 15)); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 21), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 21); /* -1 in TB_SETBITMAPSIZE is a special code meaning that the coordinate shouldn't be changed */ add_128x15_bitmap(hToolbar, 16); ok(SendMessageA(hToolbar, TB_SETBITMAPSIZE, 0, MAKELONG(14, -1)), "TB_SETBITMAPSIZE failed\n"); @@ -972,64 +1162,64 @@ static void test_sizes(void) CHECK_IMAGELIST(16, 14, 12); rebuild_toolbar(&hToolbar); - SendMessageA(hToolbar, TB_ADDSTRINGA, 0, (LPARAM)"A\0MMMMMMMMMMMMM\0"); + SendMessageA(hToolbar, TB_ADDSTRINGA, 0, (LPARAM)STRING0 "\0" STRING1 "\0"); /* the height is increased after a TB_ADDSTRING */ - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 39), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 23 + fontheight); SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(100, 100)); /* if a string is in the pool, even adding a button without a string resets the size */ SendMessageA(hToolbar, TB_ADDBUTTONS, 1, (LPARAM)&buttons2[0]); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 22), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 22); SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(100, 100)); /* an BTNS_AUTOSIZE button is also considered when computing the new size */ SendMessageA(hToolbar, TB_ADDBUTTONS, 1, (LPARAM)&buttons3[2]); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(163, 39), "Unexpected button size\n"); + check_button_size(hToolbar, 7 + string_width(STRING1), 23 + fontheight); SendMessageA(hToolbar, TB_ADDBUTTONS, 1, (LPARAM)&buttons3[0]); check_sizes(); /* delete button doesn't change the buttons size */ SendMessageA(hToolbar, TB_DELETEBUTTON, 2, 0); SendMessageA(hToolbar, TB_DELETEBUTTON, 1, 0); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(163, 39), "Unexpected button size\n"); + check_button_size(hToolbar, 7 + string_width(STRING1), 23 + fontheight); /* TB_INSERTBUTTONS will */ SendMessageA(hToolbar, TB_INSERTBUTTON, 1, (LPARAM)&buttons2[0]); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 22), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 22); /* TB_HIDEBUTTON and TB_MOVEBUTTON doesn't force a recalc */ SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(100, 100)); ok(SendMessageA(hToolbar, TB_MOVEBUTTON, 0, 1), "TB_MOVEBUTTON failed\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(100, 100), "Unexpected button size\n"); + check_button_size(hToolbar, 100, 100); ok(SendMessageA(hToolbar, TB_HIDEBUTTON, 20, TRUE), "TB_HIDEBUTTON failed\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(100, 100), "Unexpected button size\n"); + check_button_size(hToolbar, 100, 100); /* however changing the hidden flag with TB_SETSTATE does */ ok(SendMessageA(hToolbar, TB_SETSTATE, 20, TBSTATE_ENABLED|TBSTATE_HIDDEN), "TB_SETSTATE failed\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(100, 100), "Unexpected button size\n"); + check_button_size(hToolbar, 100, 100); ok(SendMessageA(hToolbar, TB_SETSTATE, 20, TBSTATE_ENABLED), "TB_SETSTATE failed\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(23, 22), "Unexpected button size\n"); + check_button_size(hToolbar, 23, 22); /* TB_SETIMAGELIST always changes the height but the width only if necessary */ SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(100, 100)); himl = ImageList_LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP_80x15), 20, 2, CLR_NONE, IMAGE_BITMAP, LR_DEFAULTCOLOR); ok(SendMessageA(hToolbar, TB_SETIMAGELIST, 0, (LPARAM)himl) == 0, "TB_SETIMAGELIST failed\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(100, 21), "Unexpected button size\n"); + check_button_size(hToolbar, 100, 21); SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(100, 100)); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(100, 100), "Unexpected button size\n"); + check_button_size(hToolbar, 100, 100); /* But there are no update when we change imagelist, and image sizes are the same */ himl2 = ImageList_LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BITMAP_128x15), 20, 2, CLR_NONE, IMAGE_BITMAP, LR_DEFAULTCOLOR); ok(SendMessageA(hToolbar, TB_SETIMAGELIST, 0, (LRESULT)himl2) == (LRESULT)himl, "TB_SETIMAGELIST failed\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(100, 100), "Unexpected button size\n"); + check_button_size(hToolbar, 100, 100); SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(1, 1)); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(27, 21), "Unexpected button size\n"); + check_button_size(hToolbar, 27, 21); ok(SendMessageA(hToolbar, TB_SETIMAGELIST, 0, 0) == (LRESULT)himl2, "TB_SETIMAGELIST failed\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(27, 7), "Unexpected button size\n"); + check_button_size(hToolbar, 27, 7); SendMessageA(hToolbar, TB_SETBUTTONSIZE, 0, MAKELONG(1, 1)); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(8, 7), "Unexpected button size\n"); + check_button_size(hToolbar, 8, 7) ok(SendMessageA(hToolbar, TB_SETIMAGELIST, 0, (LPARAM)himl) == 0, "TB_SETIMAGELIST failed\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(27, 21), "Unexpected button size\n"); + check_button_size(hToolbar, 27, 21) /* the text is taken into account */ - SendMessageA(hToolbar, TB_ADDSTRINGA, 0, (LPARAM)"A\0MMMMMMMMMMMMM\0"); + SendMessageA(hToolbar, TB_ADDSTRINGA, 0, (LPARAM)STRING0 "\0" STRING1 "\0"); SendMessageA(hToolbar, TB_ADDBUTTONS, 4, (LPARAM)buttons3); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(163, 38), "Unexpected button size\n"); + check_button_size(hToolbar, 7 + string_width(STRING1), 22 + fontheight); ok(SendMessageA(hToolbar, TB_SETIMAGELIST, 0, 0) == (LRESULT)himl, "TB_SETIMAGELIST failed\n"); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(163, 24), "Unexpected button size\n"); + check_button_size(hToolbar, 7 + string_width(STRING1), 8 + fontheight); /* the style change also comes into effect */ check_sizes(); SetWindowLong(hToolbar, GWL_STYLE, GetWindowLong(hToolbar, GWL_STYLE) | TBSTYLE_FLAT); @@ -1041,9 +1231,9 @@ static void test_sizes(void) ImageList_Destroy(himl2); SendMessageA(hToolbar, TB_ADDBUTTONS, 1, (LPARAM)&buttons3[3]); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(27, 39), "Unexpected button size\n"); + check_button_size(hToolbar, 7 + string_width(STRING2), 23 + fontheight); SendMessageA(hToolbar, TB_DELETEBUTTON, 0, 0); - ok(SendMessageA(hToolbar, TB_GETBUTTONSIZE, 0, 0) == MAKELONG(27, 39), "Unexpected button size\n"); + check_button_size(hToolbar, 7 + string_width(STRING2), 23 + fontheight); rebuild_toolbar(&hToolbar); @@ -1092,6 +1282,7 @@ static void test_sizes(void) ok(SendMessageA(hToolbar, TB_SETBUTTONINFO, 33, (LPARAM)&tbinfo) != 0, "TB_SETBUTTONINFO failed\n"); } + free_tbsize_results(); DestroyWindow(hToolbar); } @@ -1338,7 +1529,7 @@ static void test_setrows(void) { TBBUTTON buttons[9]; HWND hToolbar; - int i; + DWORD i; for (i=0; i<9; i++) MakeButton(buttons+i, 1000+i, TBSTYLE_FLAT | TBSTYLE_CHECKGROUP, 0); @@ -1443,6 +1634,53 @@ static void test_tooltip(void) DestroyWindow(hToolbar); } +static void test_get_set_style(void) +{ + TBBUTTON buttons[9]; + DWORD style, style2, ret; + HWND hToolbar; + int i; + + for (i=0; i<9; i++) + MakeButton(buttons+i, 1000+i, TBSTYLE_CHECKGROUP, 0); + MakeButton(buttons+3, 1003, TBSTYLE_SEP|TBSTYLE_GROUP, 0); + MakeButton(buttons+6, 1006, TBSTYLE_SEP, 0); + + hToolbar = CreateToolbarEx(hMainWnd, + WS_VISIBLE | WS_CLIPCHILDREN | CCS_TOP | + WS_CHILD | TBSTYLE_LIST, + 100, + 0, NULL, 0, + buttons, sizeof(buttons)/sizeof(buttons[0]), + 0, 0, 20, 16, sizeof(TBBUTTON)); + ok(hToolbar != NULL, "Toolbar creation\n"); + SendMessage(hToolbar, TB_ADDSTRINGA, 0, (LPARAM)"test\000"); + + style = SendMessageA(hToolbar, TB_GETSTYLE, 0, 0); + style2 = GetWindowLongA(hToolbar, GWL_STYLE); + ok(style == style2, "got 0x%08x, expected 0x%08x\n", style, style2); + + /* try to alter common window bits */ + style2 |= WS_BORDER; + ret = SendMessageA(hToolbar, TB_SETSTYLE, 0, style2); + ok(ret == 0, "got %d\n", ret); + style = SendMessageA(hToolbar, TB_GETSTYLE, 0, 0); + style2 = GetWindowLongA(hToolbar, GWL_STYLE); + ok((style != style2) && (style == (style2 | WS_BORDER)), + "got 0x%08x, expected 0x%08x\n", style, style2); + ok(style & WS_BORDER, "got 0x%08x\n", style); + + /* now styles are the same, alter window style */ + ret = SendMessageA(hToolbar, TB_SETSTYLE, 0, style2); + ok(ret == 0, "got %d\n", ret); + style2 |= WS_BORDER; + SetWindowLongA(hToolbar, GWL_STYLE, style2); + style = SendMessageA(hToolbar, TB_GETSTYLE, 0, 0); + ok(style == style2, "got 0x%08x, expected 0x%08x\n", style, style2); + + DestroyWindow(hToolbar); +} + START_TEST(toolbar) { WNDCLASSA wc; @@ -1482,6 +1720,7 @@ START_TEST(toolbar) test_setrows(); test_getstring(); test_tooltip(); + test_get_set_style(); PostQuitMessage(0); while(GetMessageA(&msg,0,0,0)) { diff --git a/rostests/winetests/comctl32/tooltips.c b/rostests/winetests/comctl32/tooltips.c index 8ca3f7bb903..596598f1ade 100644 --- a/rostests/winetests/comctl32/tooltips.c +++ b/rostests/winetests/comctl32/tooltips.c @@ -148,7 +148,7 @@ static void test_customdraw(void) { {CDRF_NEWFONT, TEST_CDDS_PREPAINT} }; - int iterationNumber; + DWORD iterationNumber; WNDCLASSA wc; LRESULT lResult; @@ -435,7 +435,7 @@ static void test_ttm_gettoolinfo(void) ti.uFlags = 0; ti.uId = 0x1234ABCD; ti.lpszText = NULL; - ti.lParam = 0xdeadbeef; + ti.lParam = 0x1abe11ed; GetClientRect(hwnd, &ti.rect); r = SendMessageA(hwnd, TTM_ADDTOOLA, 0, (LPARAM)&ti); ok(r, "Adding the tool to the tooltip failed\n"); @@ -444,9 +444,9 @@ static void test_ttm_gettoolinfo(void) ti.lParam = 0xaaaaaaaa; r = SendMessageA(hwnd, TTM_GETTOOLINFOA, 0, (LPARAM)&ti); ok(r, "Getting tooltip info failed\n"); - ok(0xdeadbeef == ti.lParam || - broken(0xdeadbeef != ti.lParam), /* comctl32 < 5.81 */ - "Expected 0xdeadbeef, got %lx\n", ti.lParam); + ok(0x1abe11ed == ti.lParam || + broken(0x1abe11ed != ti.lParam), /* comctl32 < 5.81 */ + "Expected 0x1abe11ed, got %lx\n", ti.lParam); tiW.cbSize = TTTOOLINFOW_V2_SIZE; tiW.hwnd = NULL; @@ -454,22 +454,22 @@ static void test_ttm_gettoolinfo(void) tiW.lParam = 0xaaaaaaaa; r = SendMessageA(hwnd, TTM_GETTOOLINFOW, 0, (LPARAM)&tiW); ok(r, "Getting tooltip info failed\n"); - ok(0xdeadbeef == tiW.lParam || - broken(0xdeadbeef != tiW.lParam), /* comctl32 < 5.81 */ - "Expected 0xdeadbeef, got %lx\n", tiW.lParam); + ok(0x1abe11ed == tiW.lParam || + broken(0x1abe11ed != tiW.lParam), /* comctl32 < 5.81 */ + "Expected 0x1abe11ed, got %lx\n", tiW.lParam); ti.cbSize = TTTOOLINFOA_V2_SIZE; ti.uId = 0x1234ABCD; - ti.lParam = 0xaaaaaaaa; + ti.lParam = 0x55555555; SendMessageA(hwnd, TTM_SETTOOLINFOA, 0, (LPARAM)&ti); ti.cbSize = TTTOOLINFOA_V2_SIZE; ti.lParam = 0xdeadbeef; r = SendMessageA(hwnd, TTM_GETTOOLINFOA, 0, (LPARAM)&ti); ok(r, "Getting tooltip info failed\n"); - ok(0xaaaaaaaa == ti.lParam || - broken(0xaaaaaaaa != ti.lParam), /* comctl32 < 5.81 */ - "Expected 0xaaaaaaaa, got %lx\n", ti.lParam); + ok(0x55555555 == ti.lParam || + broken(0x55555555 != ti.lParam), /* comctl32 < 5.81 */ + "Expected 0x55555555, got %lx\n", ti.lParam); DestroyWindow(hwnd); diff --git a/rostests/winetests/comctl32/trackbar.c b/rostests/winetests/comctl32/trackbar.c index 68261d833fb..725490f6b82 100644 --- a/rostests/winetests/comctl32/trackbar.c +++ b/rostests/winetests/comctl32/trackbar.c @@ -17,7 +17,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include #include #include #include @@ -30,7 +29,7 @@ #define PARENT_SEQ_INDEX 0 #define TRACKBAR_SEQ_INDEX 1 -HWND hWndParent; +static HWND hWndParent; static struct msg_sequence *sequences[NUM_MSG_SEQUENCE]; @@ -527,6 +526,7 @@ static void test_line_size(HWND hWndTrackbar){ /* test TBM_SETLINESIZE */ r = SendMessage(hWndTrackbar, TBM_SETLINESIZE, 0, 10); + expect(1,r); r = SendMessage(hWndTrackbar, TBM_SETLINESIZE, 0, 4); expect(10, r); @@ -953,7 +953,7 @@ static void test_ignore_selection(HWND hWndTrackbar){ static void test_initial_state(void) { HWND hWnd; - DWORD ret; + int ret; hWnd = create_trackbar(0, hWndParent); diff --git a/rostests/winetests/comctl32/treeview.c b/rostests/winetests/comctl32/treeview.c index 320deba0e0e..51d4bc4b232 100644 --- a/rostests/winetests/comctl32/treeview.c +++ b/rostests/winetests/comctl32/treeview.c @@ -30,9 +30,21 @@ #include "commctrl.h" #include "wine/test.h" +#include "v6util.h" #include "msg.h" -const char *TEST_CALLBACK_TEXT = "callback_text"; +// Hack wine! Not in Sdk CommCtrl.h! +#define TVIS_FOCUSED 0x0001 +// + +static const char *TEST_CALLBACK_TEXT = "callback_text"; + +static TVITEMA g_item_expanding, g_item_expanded; +static BOOL g_get_from_expand; +static BOOL g_get_rect_in_expand; +static BOOL g_disp_A_to_W; +static BOOL g_disp_set_stateimage; +static BOOL g_beginedit_alter_text; #define NUM_MSG_SEQUENCES 2 #define TREEVIEW_SEQ_INDEX 0 @@ -41,6 +53,7 @@ const char *TEST_CALLBACK_TEXT = "callback_text"; #define expect(expected, got) ok(got == expected, "Expected %d, got %d\n", expected, got) static struct msg_sequence *sequences[NUM_MSG_SEQUENCES]; +static struct msg_sequence *item_sequence[1]; static const struct message FillRootSeq[] = { { TVM_INSERTITEM, sent }, @@ -69,8 +82,8 @@ static const struct message rootchild_select_seq[] = { }; static const struct message getitemtext_seq[] = { - { TVM_INSERTITEM, sent }, - { TVM_GETITEM, sent }, + { TVM_INSERTITEMA, sent }, + { TVM_GETITEMA, sent }, { TVM_DELETEITEM, sent }, { 0 } }; @@ -84,10 +97,14 @@ static const struct message focus_seq[] = { { WM_NCCALCSIZE, sent|wparam|defwinproc, TRUE }, { WM_WINDOWPOSCHANGED, sent|defwinproc }, { WM_SIZE, sent|defwinproc }, + { WM_WINDOWPOSCHANGING, sent|defwinproc|optional }, + { WM_NCCALCSIZE, sent|wparam|defwinproc|optional, TRUE }, + { WM_WINDOWPOSCHANGED, sent|defwinproc|optional }, + { WM_SIZE, sent|defwinproc|optional }, { WM_PAINT, sent|defwinproc }, { WM_NCPAINT, sent|wparam|defwinproc, 1 }, { WM_ERASEBKGND, sent|defwinproc }, - { TVM_EDITLABEL, sent }, + { TVM_EDITLABELA, sent }, { WM_COMMAND, sent|wparam|defwinproc, MAKEWPARAM(0, EN_UPDATE) }, { WM_COMMAND, sent|wparam|defwinproc, MAKEWPARAM(0, EN_CHANGE) }, { WM_PARENTNOTIFY, sent|wparam|defwinproc, MAKEWPARAM(WM_CREATE, 0) }, @@ -133,10 +150,10 @@ static const struct message test_get_set_insertmarkcolor_seq[] = { }; static const struct message test_get_set_item_seq[] = { - { TVM_GETITEM, sent }, - { TVM_SETITEM, sent }, - { TVM_GETITEM, sent }, - { TVM_SETITEM, sent }, + { TVM_GETITEMA, sent }, + { TVM_SETITEMA, sent }, + { TVM_GETITEMA, sent }, + { TVM_SETITEMA, sent }, { 0 } }; @@ -186,8 +203,22 @@ static const struct message test_get_set_unicodeformat_seq[] = { }; static const struct message parent_expand_seq[] = { - { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDING }, - { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDED }, + { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA }, + { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA }, + { 0 } +}; + +static const struct message parent_singleexpand_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGINGA }, + { WM_NOTIFY, sent|id, 0, 0, TVN_SELCHANGEDA }, + { WM_NOTIFY, sent|id, 0, 0, TVN_SINGLEEXPAND }, + { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDINGA }, + { WM_NOTIFY, sent|id, 0, 0, TVN_ITEMEXPANDEDA }, + { 0 } +}; + +static const struct message parent_get_dispinfo_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, TVN_GETDISPINFOA }, { 0 } }; @@ -253,13 +284,13 @@ static LRESULT WINAPI TreeviewWndProc(HWND hwnd, UINT message, WPARAM wParam, LP return ret; } -static HWND create_treeview_control(void) +static HWND create_treeview_control(DWORD style) { WNDPROC pOldWndProc; HWND hTree; hTree = CreateWindowExA(WS_EX_CLIENTEDGE, WC_TREEVIEWA, NULL, WS_CHILD|WS_VISIBLE| - TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS|TVS_EDITLABELS, + TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS|TVS_EDITLABELS|style, 0, 0, 120, 100, hMainWnd, (HMENU)100, GetModuleHandleA(0), 0); SetFocus(hTree); @@ -292,10 +323,10 @@ static void fill_tree(HWND hTree) static void test_fillroot(void) { - TVITEM tvi; + TVITEMA tvi; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -313,7 +344,7 @@ static void test_fillroot(void) /* UMLPad 1.15 depends on this being not -1 (I_IMAGECALLBACK) */ tvi.hItem = hRoot; tvi.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE; - SendMessage( hTree, TVM_GETITEM, 0, (LPARAM)&tvi ); + SendMessage( hTree, TVM_GETITEMA, 0, (LPARAM)&tvi ); ok(tvi.iImage == 0, "tvi.iImage=%d\n", tvi.iImage); ok(tvi.iSelectedImage == 0, "tvi.iSelectedImage=%d\n", tvi.iSelectedImage); @@ -325,17 +356,17 @@ static void test_callback(void) HTREEITEM hRoot; HTREEITEM hItem1, hItem2; TVINSERTSTRUCTA ins; - TVITEM tvi; + TVITEMA tvi; CHAR test_string[] = "Test_string"; + static const CHAR test2A[] = "TEST2"; CHAR buf[128]; - LRESULT ret; HWND hTree; + DWORD ret; - hTree = create_treeview_control(); - fill_tree(hTree); + hTree = create_treeview_control(0); ret = TreeView_DeleteAllItems(hTree); - ok(ret == TRUE, "ret\n"); + expect(TRUE, ret); ins.hParent = TVI_ROOT; ins.hInsertAfter = TVI_ROOT; U(ins).item.mask = TVIF_TEXT; @@ -348,7 +379,7 @@ static void test_callback(void) tvi.pszText = buf; tvi.cchTextMax = sizeof(buf)/sizeof(buf[0]); ret = TreeView_GetItem(hTree, &tvi); - ok(ret == 1, "ret\n"); + expect(TRUE, ret); ok(strcmp(tvi.pszText, TEST_CALLBACK_TEXT) == 0, "Callback item text mismatch %s vs %s\n", tvi.pszText, TEST_CALLBACK_TEXT); @@ -361,17 +392,17 @@ static void test_callback(void) tvi.hItem = hItem1; ret = TreeView_GetItem(hTree, &tvi); - ok(ret == TRUE, "ret\n"); + expect(TRUE, ret); ok(strcmp(tvi.pszText, test_string) == 0, "Item text mismatch %s vs %s\n", tvi.pszText, test_string); /* undocumented: pszText of NULL also means LPSTR_CALLBACK: */ tvi.pszText = NULL; ret = TreeView_SetItem(hTree, &tvi); - ok(ret == 1, "Expected SetItem return 1, got %ld\n", ret); + expect(TRUE, ret); tvi.pszText = buf; ret = TreeView_GetItem(hTree, &tvi); - ok(ret == TRUE, "Expected GetItem return TRUE, got %ld\n", ret); + expect(TRUE, ret); ok(strcmp(tvi.pszText, TEST_CALLBACK_TEXT) == 0, "Item text mismatch %s vs %s\n", tvi.pszText, TEST_CALLBACK_TEXT); @@ -381,10 +412,77 @@ static void test_callback(void) tvi.hItem = hItem2; memset(buf, 0, sizeof(buf)); ret = TreeView_GetItem(hTree, &tvi); - ok(ret == TRUE, "Expected GetItem return TRUE, got %ld\n", ret); + expect(TRUE, ret); ok(strcmp(tvi.pszText, TEST_CALLBACK_TEXT) == 0, "Item text mismatch %s vs %s\n", tvi.pszText, TEST_CALLBACK_TEXT); + /* notification handler changed A->W */ + g_disp_A_to_W = TRUE; + tvi.hItem = hItem2; + memset(buf, 0, sizeof(buf)); + ret = TreeView_GetItem(hTree, &tvi); + expect(TRUE, ret); + ok(strcmp(tvi.pszText, test2A) == 0, "got %s, expected %s\n", + tvi.pszText, test2A); + g_disp_A_to_W = FALSE; + + /* handler changes state image index */ + SetWindowLongA(hTree, GWL_STYLE, GetWindowLongA(hTree, GWL_STYLE) | TVS_CHECKBOXES); + + /* clear selection, handler will set selected state */ + ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, 0); + expect(TRUE, ret); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + tvi.hItem = hRoot; + tvi.mask = TVIF_STATE; + tvi.state = TVIS_SELECTED; + ret = TreeView_GetItem(hTree, &tvi); + expect(TRUE, ret); + ok(tvi.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", tvi.state); + + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, + "no TVN_GETDISPINFO for a state seq", FALSE); + + tvi.hItem = hRoot; + tvi.mask = TVIF_IMAGE | TVIF_STATE; + tvi.state = TVIS_FOCUSED; + tvi.stateMask = TVIS_FOCUSED; + tvi.iImage = I_IMAGECALLBACK; + ret = TreeView_SetItem(hTree, &tvi); + expect(TRUE, ret); + + /* ask for item image index through callback - state is also set with state image index */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + tvi.hItem = hRoot; + tvi.mask = TVIF_IMAGE; + tvi.state = 0; + ret = TreeView_GetItem(hTree, &tvi); + expect(TRUE, ret); + ok(tvi.state == (INDEXTOSTATEIMAGEMASK(1) | TVIS_FOCUSED), "got 0x%x\n", tvi.state); + + ok_sequence(sequences, PARENT_SEQ_INDEX, parent_get_dispinfo_seq, + "callback for state/overlay image index, noop seq", FALSE); + + /* ask for image again and overwrite state to some value in handler */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + g_disp_set_stateimage = TRUE; + tvi.hItem = hRoot; + tvi.mask = TVIF_IMAGE; + tvi.state = INDEXTOSTATEIMAGEMASK(1); + tvi.stateMask = 0; + ret = TreeView_GetItem(hTree, &tvi); + expect(TRUE, ret); + /* handler sets TVIS_SELECTED as well */ + ok(tvi.state == (TVIS_FOCUSED | TVIS_SELECTED | INDEXTOSTATEIMAGEMASK(2) | INDEXTOOVERLAYMASK(3)), "got 0x%x\n", tvi.state); + g_disp_set_stateimage = FALSE; + + ok_sequence(sequences, PARENT_SEQ_INDEX, parent_get_dispinfo_seq, + "callback for state/overlay image index seq", FALSE); + DestroyWindow(hTree); } @@ -393,7 +491,7 @@ static void test_select(void) BOOL r; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); /* root-none select tests */ @@ -454,13 +552,13 @@ static void test_getitemtext(void) { TVINSERTSTRUCTA ins; HTREEITEM hChild; - TVITEM tvi; + TVITEMA tvi; HWND hTree; CHAR szBuffer[80] = "Blah"; int nBufferSize = sizeof(szBuffer)/sizeof(CHAR); - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -480,7 +578,7 @@ static void test_getitemtext(void) tvi.cchTextMax = nBufferSize; tvi.pszText = szBuffer; - SendMessageA( hTree, TVM_GETITEM, 0, (LPARAM)&tvi ); + SendMessageA( hTree, TVM_GETITEMA, 0, (LPARAM)&tvi ); ok(!strcmp(szBuffer, ""), "szBuffer=\"%s\", expected \"\"\n", szBuffer); ok(SendMessageA(hTree, TVM_DELETEITEM, 0, (LPARAM)hChild), "DeleteItem failed\n"); ok_sequence(sequences, TREEVIEW_SEQ_INDEX, getitemtext_seq, "get item text seq", FALSE); @@ -497,7 +595,7 @@ static void test_focus(void) HWND hTree; HWND hEdit; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -534,14 +632,14 @@ static void test_get_set_bkcolor(void) COLORREF crColor = RGB(0,0,0); HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); /* If the value is -1, the control is using the system color for the background color. */ crColor = (COLORREF)SendMessage( hTree, TVM_GETBKCOLOR, 0, 0 ); - ok(crColor == -1, "Default background color reported as 0x%.8x\n", crColor); + ok(crColor == ~0u, "Default background color reported as 0x%.8x\n", crColor); /* Test for black background */ SendMessage( hTree, TVM_SETBKCOLOR, 0, RGB(0,0,0) ); @@ -564,18 +662,18 @@ static void test_get_set_bkcolor(void) static void test_get_set_imagelist(void) { - HIMAGELIST hImageList = NULL; + HIMAGELIST himl; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); /* Test a NULL HIMAGELIST */ - SendMessage( hTree, TVM_SETIMAGELIST, TVSIL_NORMAL, (LPARAM)hImageList ); - hImageList = (HIMAGELIST)SendMessage( hTree, TVM_GETIMAGELIST, TVSIL_NORMAL, 0 ); - ok(hImageList == NULL, "NULL image list, reported as 0x%p, expected 0.\n", hImageList); + SendMessage( hTree, TVM_SETIMAGELIST, TVSIL_NORMAL, 0 ); + himl = (HIMAGELIST)SendMessage( hTree, TVM_GETIMAGELIST, TVSIL_NORMAL, 0 ); + ok(himl == NULL, "NULL image list, reported as %p, expected 0.\n", himl); /* TODO: Test an actual image list */ @@ -592,7 +690,7 @@ static void test_get_set_indent(void) int ulMoreThanTwiceMin = -1; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -618,7 +716,7 @@ static void test_get_set_insertmark(void) COLORREF crColor = RGB(0,0,0); HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -635,35 +733,50 @@ static void test_get_set_insertmark(void) static void test_get_set_item(void) { - TVITEM tviRoot = {0}; + TVITEMA tviRoot = {0}; int nBufferSize = 80; char szBuffer[80] = {0}; + DWORD ret; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); + tviRoot.hItem = hRoot; + tviRoot.mask = TVIF_STATE; + tviRoot.state = TVIS_FOCUSED; + tviRoot.stateMask = TVIS_FOCUSED; + ret = SendMessage( hTree, TVM_SETITEMA, 0, (LPARAM)&tviRoot ); + expect(TRUE, ret); + flush_sequences(sequences, NUM_MSG_SEQUENCES); - /* Test the root item */ + /* Test the root item, state is set even when not requested */ tviRoot.hItem = hRoot; tviRoot.mask = TVIF_TEXT; + tviRoot.state = 0; + tviRoot.stateMask = 0; tviRoot.cchTextMax = nBufferSize; tviRoot.pszText = szBuffer; - SendMessage( hTree, TVM_GETITEM, 0, (LPARAM)&tviRoot ); + ret = SendMessage( hTree, TVM_GETITEMA, 0, (LPARAM)&tviRoot ); + expect(TRUE, ret); ok(!strcmp("Root", szBuffer), "GetItem: szBuffer=\"%s\", expected \"Root\"\n", szBuffer); + ok(tviRoot.state == TVIS_FOCUSED, "got 0x%0x\n", tviRoot.state); /* Change the root text */ strncpy(szBuffer, "Testing123", nBufferSize); - SendMessage( hTree, TVM_SETITEM, 0, (LPARAM)&tviRoot ); + ret = SendMessage( hTree, TVM_SETITEMA, 0, (LPARAM)&tviRoot ); + expect(TRUE, ret); memset(szBuffer, 0, nBufferSize); - SendMessage( hTree, TVM_GETITEM, 0, (LPARAM)&tviRoot ); + ret = SendMessage( hTree, TVM_GETITEMA, 0, (LPARAM)&tviRoot ); + expect(TRUE, ret); ok(!strcmp("Testing123", szBuffer), "GetItem: szBuffer=\"%s\", expected \"Testing123\"\n", szBuffer); /* Reset the root text */ memset(szBuffer, 0, nBufferSize); strncpy(szBuffer, "Root", nBufferSize); - SendMessage( hTree, TVM_SETITEM, 0, (LPARAM)&tviRoot ); + ret = SendMessage( hTree, TVM_SETITEMA, 0, (LPARAM)&tviRoot ); + expect(TRUE, ret); ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_item_seq, "test get set item", FALSE); @@ -677,7 +790,7 @@ static void test_get_set_itemheight(void) int ulNewHeight = 0; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -703,6 +816,32 @@ static void test_get_set_itemheight(void) ok_sequence(sequences, TREEVIEW_SEQ_INDEX, test_get_set_itemheight_seq, "test get set item height", FALSE); + /* without TVS_NONEVENHEIGHT */ + SetWindowLong(hTree, GWL_STYLE, GetWindowLong(hTree, GWL_STYLE) & ~TVS_NONEVENHEIGHT); + /* odd value */ + ulOldHeight = SendMessage( hTree, TVM_SETITEMHEIGHT, 3, 0); + ok(ulOldHeight == 8, "got %d, expected %d\n", ulOldHeight, 8); + ulNewHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 ); + ok(ulNewHeight == 2, "got %d, expected %d\n", ulNewHeight, 2); + + ulOldHeight = SendMessage( hTree, TVM_SETITEMHEIGHT, 4, 0); + ok(ulOldHeight == 2, "got %d, expected %d\n", ulOldHeight, 2); + ulNewHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 ); + ok(ulNewHeight == 4, "got %d, expected %d\n", ulNewHeight, 4); + + /* with TVS_NONEVENHEIGHT */ + SetWindowLong(hTree, GWL_STYLE, GetWindowLong(hTree, GWL_STYLE) | TVS_NONEVENHEIGHT); + /* odd value */ + ulOldHeight = SendMessage( hTree, TVM_SETITEMHEIGHT, 3, 0); + ok(ulOldHeight == 4, "got %d, expected %d\n", ulOldHeight, 4); + ulNewHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 ); + ok(ulNewHeight == 3, "got %d, expected %d\n", ulNewHeight, 3); + /* even value */ + ulOldHeight = SendMessage( hTree, TVM_SETITEMHEIGHT, 10, 0); + ok(ulOldHeight == 3, "got %d, expected %d\n", ulOldHeight, 3); + ulNewHeight = (int) SendMessage( hTree, TVM_GETITEMHEIGHT, 0, 0 ); + ok(ulNewHeight == 10, "got %d, expected %d\n", ulNewHeight, 10); + DestroyWindow(hTree); } @@ -712,7 +851,7 @@ static void test_get_set_scrolltime(void) int ulTime = 0; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -733,13 +872,13 @@ static void test_get_set_textcolor(void) COLORREF crColor = RGB(0,0,0); HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); crColor = (COLORREF)SendMessage( hTree, TVM_GETTEXTCOLOR, 0, 0 ); - ok(crColor == -1, "Default text color reported as 0x%.8x\n", crColor); + ok(crColor == ~0u, "Default text color reported as 0x%.8x\n", crColor); /* Test for black text */ SendMessage( hTree, TVM_SETTEXTCOLOR, 0, RGB(0,0,0) ); @@ -766,7 +905,7 @@ static void test_get_set_tooltips(void) HWND hPopupTreeView; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -793,7 +932,7 @@ static void test_get_set_unicodeformat(void) BOOL bNewSetting = 0; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -817,10 +956,6 @@ static void test_get_set_unicodeformat(void) DestroyWindow(hTree); } -static TVITEMA g_item_expanding, g_item_expanded; -static BOOL g_get_from_expand; -static BOOL g_get_rect_in_expand; - static LRESULT CALLBACK parent_wnd_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static LONG defwndproc_counter = 0; @@ -876,10 +1011,42 @@ static LRESULT CALLBACK parent_wnd_proc(HWND hWnd, UINT message, WPARAM wParam, if (disp->item.mask & TVIF_TEXT) { lstrcpyn(disp->item.pszText, TEST_CALLBACK_TEXT, disp->item.cchTextMax); } + + if (g_disp_A_to_W && (disp->item.mask & TVIF_TEXT)) { + static const WCHAR testW[] = {'T','E','S','T','2',0}; + + disp->hdr.code = TVN_GETDISPINFOW; + memcpy(disp->item.pszText, testW, sizeof(testW)); + } + + if (g_disp_set_stateimage) + { + ok(disp->item.mask == TVIF_IMAGE, "got %x\n", disp->item.mask); + /* both masks set here are necessary to change state bits */ + disp->item.mask |= TVIF_STATE; + disp->item.state = TVIS_SELECTED | INDEXTOSTATEIMAGEMASK(2) | INDEXTOOVERLAYMASK(3); + disp->item.stateMask = TVIS_SELECTED | TVIS_OVERLAYMASK | TVIS_STATEIMAGEMASK; + } + break; } + case TVN_BEGINLABELEDIT: + { + if (g_beginedit_alter_text) + { + static const char* textA = ""; + HWND edit; + + edit = (HWND)SendMessageA(pHdr->hwndFrom, TVM_GETEDITCONTROL, 0, 0); + ok(IsWindow(edit), "failed to get edit handle\n"); + SetWindowTextA(edit, textA); + } + + break; + } + case TVN_ENDLABELEDIT: return TRUE; - case TVN_ITEMEXPANDING: + case TVN_ITEMEXPANDINGA: ok(pTreeView->itemNew.mask == (TVIF_HANDLE | TVIF_SELECTEDIMAGE | TVIF_IMAGE | TVIF_PARAM | TVIF_STATE), "got wrong mask %x\n", pTreeView->itemNew.mask); @@ -896,7 +1063,7 @@ static LRESULT CALLBACK parent_wnd_proc(HWND hWnd, UINT message, WPARAM wParam, ok(ret == TRUE, "got %lu\n", ret); } break; - case TVN_ITEMEXPANDED: + case TVN_ITEMEXPANDEDA: ok(pTreeView->itemNew.mask & TVIF_STATE, "got wrong mask %x\n", pTreeView->itemNew.mask); ok(pTreeView->itemNew.state & (TVIS_EXPANDED|TVIS_EXPANDEDONCE), "got wrong mask %x\n", pTreeView->itemNew.mask); @@ -910,7 +1077,8 @@ static LRESULT CALLBACK parent_wnd_proc(HWND hWnd, UINT message, WPARAM wParam, ret = SendMessageA(pHdr->hwndFrom, TVM_GETITEMA, 0, (LPARAM)&g_item_expanded); ok(ret == TRUE, "got %lu\n", ret); } - if (g_get_rect_in_expand) { + if (g_get_rect_in_expand) + { visibleItem = TreeView_GetNextItem(pHdr->hwndFrom, NULL, TVGN_FIRSTVISIBLE); ok(pTreeView->itemNew.hItem == visibleItem, "expanded item == first visible item\n"); *(HTREEITEM*)&rect = visibleItem; @@ -918,12 +1086,27 @@ static LRESULT CALLBACK parent_wnd_proc(HWND hWnd, UINT message, WPARAM wParam, visibleItem = TreeView_GetNextItem(pHdr->hwndFrom, visibleItem, TVGN_NEXTVISIBLE); *(HTREEITEM*)&rect = visibleItem; ok(visibleItem != NULL, "There must be a visible item after the first visisble item.\n"); - todo_wine ok(SendMessage(pHdr->hwndFrom, TVM_GETITEMRECT, TRUE, (LPARAM)&rect), "Failed to get rect for second visible item.\n"); } break; + case TVN_DELETEITEMA: + { + struct message item; + + ok(pTreeView->itemNew.mask == 0, "got wrong mask 0x%x\n", pTreeView->itemNew.mask); + + ok(pTreeView->itemOld.mask == (TVIF_HANDLE | TVIF_PARAM), "got wrong mask 0x%x\n", pTreeView->itemOld.mask); + ok(pTreeView->itemOld.hItem != NULL, "got %p\n", pTreeView->itemOld.hItem); + + memset(&item, 0, sizeof(item)); + item.lParam = (LPARAM)pTreeView->itemOld.hItem; + add_message(item_sequence, 0, &item); + + break; + } } } + break; } case WM_DESTROY: @@ -948,9 +1131,9 @@ static void test_expandinvisible(void) LRESULT ret; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); - /* The test builds the following tree and expands then node 1, while node 0 is collapsed. + /* The test builds the following tree and expands node 1, while node 0 is collapsed. * * 0 * |- 1 @@ -1018,18 +1201,18 @@ static void test_itemedit(void) DWORD r; HWND edit; TVITEMA item; - CHAR buff[2]; + CHAR buffA[20]; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); /* try with null item */ - edit = (HWND)SendMessage(hTree, TVM_EDITLABEL, 0, 0); + edit = (HWND)SendMessage(hTree, TVM_EDITLABELA, 0, 0); ok(!IsWindow(edit), "Expected valid handle\n"); /* trigger edit */ - edit = (HWND)SendMessage(hTree, TVM_EDITLABEL, 0, (LPARAM)hRoot); + edit = (HWND)SendMessage(hTree, TVM_EDITLABELA, 0, (LPARAM)hRoot); ok(IsWindow(edit), "Expected valid handle\n"); /* item shouldn't be selected automatically after TVM_EDITLABEL */ r = SendMessage(hTree, TVM_GETITEMSTATE, (WPARAM)hRoot, TVIS_SELECTED); @@ -1046,7 +1229,7 @@ static void test_itemedit(void) expect(0, r); /* try to cancel with wrong (not null) handle */ - edit = (HWND)SendMessage(hTree, TVM_EDITLABEL, 0, (LPARAM)hRoot); + edit = (HWND)SendMessage(hTree, TVM_EDITLABELA, 0, (LPARAM)hRoot); ok(IsWindow(edit), "Expected valid handle\n"); r = SendMessage(hTree, WM_COMMAND, MAKEWPARAM(0, EN_KILLFOCUS), (LPARAM)hTree); expect(0, r); @@ -1057,13 +1240,13 @@ static void test_itemedit(void) /* remove selection after starting edit */ r = TreeView_SelectItem(hTree, hRoot); expect(TRUE, r); - edit = (HWND)SendMessage(hTree, TVM_EDITLABEL, 0, (LPARAM)hRoot); + edit = (HWND)SendMessage(hTree, TVM_EDITLABELA, 0, (LPARAM)hRoot); ok(IsWindow(edit), "Expected valid handle\n"); r = TreeView_SelectItem(hTree, NULL); expect(TRUE, r); /* alter text */ - strncpy(buff, "x", sizeof(buff)/sizeof(CHAR)); - r = SendMessage(edit, WM_SETTEXT, 0, (LPARAM)buff); + strcpy(buffA, "x"); + r = SendMessage(edit, WM_SETTEXT, 0, (LPARAM)buffA); expect(TRUE, r); r = SendMessage(hTree, WM_COMMAND, MAKEWPARAM(0, EN_KILLFOCUS), (LPARAM)edit); expect(0, r); @@ -1071,11 +1254,43 @@ static void test_itemedit(void) /* check that text is saved */ item.mask = TVIF_TEXT; item.hItem = hRoot; - item.pszText = buff; - item.cchTextMax = sizeof(buff)/sizeof(CHAR); - r = SendMessage(hTree, TVM_GETITEM, 0, (LPARAM)&item); + item.pszText = buffA; + item.cchTextMax = sizeof(buffA)/sizeof(CHAR); + r = SendMessage(hTree, TVM_GETITEMA, 0, (LPARAM)&item); expect(TRUE, r); - ok(!strcmp("x", buff), "Expected item text to change\n"); + ok(!strcmp("x", buffA), "Expected item text to change\n"); + + /* try A/W messages */ + edit = (HWND)SendMessageA(hTree, TVM_EDITLABELA, 0, (LPARAM)hRoot); + ok(IsWindow(edit), "Expected valid handle\n"); + ok(IsWindowUnicode(edit), "got ansi window\n"); + r = SendMessage(hTree, WM_COMMAND, MAKEWPARAM(0, EN_KILLFOCUS), (LPARAM)edit); + expect(0, r); + ok(!IsWindow(edit), "expected invalid handle\n"); + + edit = (HWND)SendMessageA(hTree, TVM_EDITLABELW, 0, (LPARAM)hRoot); + ok(IsWindow(edit), "Expected valid handle\n"); + ok(IsWindowUnicode(edit), "got ansi window\n"); + r = SendMessage(hTree, WM_COMMAND, MAKEWPARAM(0, EN_KILLFOCUS), (LPARAM)edit); + expect(0, r); + + /* alter text during TVM_BEGINLABELEDIT, check that it's preserved */ + strcpy(buffA, ""); + + item.mask = TVIF_TEXT; + item.hItem = hRoot; + item.pszText = buffA; + item.cchTextMax = 0; + r = SendMessage(hTree, TVM_SETITEMA, 0, (LPARAM)&item); + expect(TRUE, r); + + g_beginedit_alter_text = TRUE; + edit = (HWND)SendMessageA(hTree, TVM_EDITLABELA, 0, (LPARAM)hRoot); + ok(IsWindow(edit), "Expected valid handle\n"); + g_beginedit_alter_text = FALSE; + + GetWindowTextA(edit, buffA, sizeof(buffA)/sizeof(CHAR)); + ok(!strcmp(buffA, ""), "got string %s\n", buffA); DestroyWindow(hTree); } @@ -1096,7 +1311,7 @@ static void test_get_linecolor(void) COLORREF clr; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); /* newly created control has default color */ clr = (COLORREF)SendMessage(hTree, TVM_GETLINECOLOR, 0, 0); @@ -1113,7 +1328,7 @@ static void test_get_insertmarkcolor(void) COLORREF clr; HWND hTree; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); /* newly created control has default color */ clr = (COLORREF)SendMessage(hTree, TVM_GETINSERTMARKCOLOR, 0, 0); @@ -1131,7 +1346,7 @@ static void test_expandnotify(void) BOOL ret; TVITEMA item; - hTree = create_treeview_control(); + hTree = create_treeview_control(0); fill_tree(hTree); item.hItem = hRoot; @@ -1139,12 +1354,12 @@ static void test_expandnotify(void) item.state = TVIS_EXPANDED; ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); - ok(ret == TRUE, "got %d\n", ret); + expect(TRUE, ret); ok((item.state & TVIS_EXPANDED) == 0, "expected collapsed\n"); /* preselect root node here */ ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hRoot); - ok(ret == TRUE, "got %d\n", ret); + expect(TRUE, ret); g_get_from_expand = TRUE; /* expand */ @@ -1152,7 +1367,7 @@ static void test_expandnotify(void) g_item_expanding.state = 0xdeadbeef; g_item_expanded.state = 0xdeadbeef; ret = SendMessageA(hTree, TVM_EXPAND, TVE_EXPAND, (LPARAM)hRoot); - ok(ret == TRUE, "got %d\n", ret); + expect(TRUE, ret); ok(g_item_expanding.state == TVIS_SELECTED, "got state on TVN_ITEMEXPANDING 0x%08x\n", g_item_expanding.state); ok(g_item_expanded.state == (TVIS_SELECTED|TVIS_EXPANDED), "got state on TVN_ITEMEXPANDED 0x%08x\n", @@ -1163,33 +1378,356 @@ static void test_expandnotify(void) /* check that it's expanded */ item.state = TVIS_EXPANDED; ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); - ok(ret == TRUE, "got %d\n", ret); + expect(TRUE, ret); ok((item.state & TVIS_EXPANDED) == TVIS_EXPANDED, "expected expanded\n"); /* collapse */ flush_sequences(sequences, NUM_MSG_SEQUENCES); ret = SendMessageA(hTree, TVM_EXPAND, TVE_COLLAPSE, (LPARAM)hRoot); - ok(ret == TRUE, "got %d\n", ret); + expect(TRUE, ret); item.state = TVIS_EXPANDED; ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); - ok(ret == TRUE, "got %d\n", ret); + expect(TRUE, ret); ok((item.state & TVIS_EXPANDED) == 0, "expected collapsed\n"); - /* all next collapse/expand attempts won't produce any notifications, + /* all further collapse/expand attempts won't produce any notifications, the only way is to reset with all children removed */ ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "collapse after expand notifications", FALSE); + /* try to toggle child that doesn't have children itself */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + ret = SendMessageA(hTree, TVM_EXPAND, TVE_TOGGLE, (LPARAM)hChild); + expect(FALSE, ret); + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "toggle node without children", FALSE); + + DestroyWindow(hTree); + + /* test TVM_GETITEMRECT inside TVN_ITEMEXPANDED notification */ + hTree = create_treeview_control(0); + fill_tree(hTree); + g_get_rect_in_expand = TRUE; + ret = TreeView_Select(hTree, hChild, TVGN_CARET); + expect(TRUE, ret); + g_get_rect_in_expand = FALSE; + + DestroyWindow(hTree); + + /* TVE_TOGGLE acts as any other TVM_EXPAND */ + hTree = create_treeview_control(0); + fill_tree(hTree); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + ret = SendMessageA(hTree, TVM_EXPAND, TVE_TOGGLE, (LPARAM)hRoot); + expect(TRUE, ret); + ok_sequence(sequences, PARENT_SEQ_INDEX, parent_expand_seq, "toggle node (expand)", FALSE); + + /* toggle again - no notifications */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + ret = SendMessageA(hTree, TVM_EXPAND, TVE_TOGGLE, (LPARAM)hRoot); + expect(TRUE, ret); + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_seq, "toggle node (collapse)", FALSE); + DestroyWindow(hTree); } -static void test_rect_retrieval_after_expand_with_select(void) { - BOOL ret; - HWND hTree; - hTree = create_treeview_control(); - fill_tree(hTree); - g_get_rect_in_expand = TRUE; - ret = TreeView_Select(hTree, hChild, TVGN_CARET); - g_get_rect_in_expand = FALSE; - ok(ret,"TreeView_Select should return true\n"); +static void test_expandedimage(void) +{ + TVITEMEXA item; + HWND hTree; + BOOL ret; + + hTree = create_treeview_control(0); + fill_tree(hTree); + + item.mask = TVIF_EXPANDEDIMAGE; + item.iExpandedImage = 1; + item.hItem = hRoot; + ret = SendMessageA(hTree, TVM_SETITEMA, 0, (LPARAM)&item); + ok(ret, "got %d\n", ret); + + item.mask = TVIF_EXPANDEDIMAGE; + item.iExpandedImage = -1; + item.hItem = hRoot; + ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); + ok(ret, "got %d\n", ret); + + if (item.iExpandedImage != 1) + { + win_skip("TVIF_EXPANDEDIMAGE not supported\n"); + DestroyWindow(hTree); + return; + } + + /* test for default iExpandedImage value */ + item.mask = TVIF_EXPANDEDIMAGE; + item.iExpandedImage = -1; + item.hItem = hChild; + ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); + ok(ret, "got %d\n", ret); + ok(item.iExpandedImage == (WORD)I_IMAGENONE, "got %d\n", item.iExpandedImage); + + DestroyWindow(hTree); +} + +static void test_TVS_SINGLEEXPAND(void) +{ + HWND hTree; + BOOL ret; + + hTree = create_treeview_control(0); + SetWindowLongA(hTree, GWL_STYLE, GetWindowLong(hTree, GWL_STYLE) | TVS_SINGLEEXPAND); + /* to avoid painting related notifications */ + ShowWindow(hTree, SW_HIDE); + fill_tree(hTree); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hRoot); + ok(ret, "got %d\n", ret); + ok_sequence(sequences, PARENT_SEQ_INDEX, parent_singleexpand_seq, "singleexpand notifications", FALSE); + + /* a workaround for NT4 that sends expand notifications when nothing is about to expand */ + ret = SendMessageA(hTree, TVM_DELETEITEM, 0, (LPARAM)hRoot); + ok(ret, "got %d\n", ret); + fill_tree(hTree); + ret = SendMessageA(hTree, TVM_SELECTITEM, TVGN_CARET, 0); + ok(ret, "got %d\n", ret); + + DestroyWindow(hTree); +} + +static void test_WM_PAINT(void) +{ + HWND hTree; + COLORREF clr; + LONG ret; + RECT rc; + HDC hdc; + + hTree = create_treeview_control(0); + + clr = SendMessageA(hTree, TVM_SETBKCOLOR, 0, RGB(255, 0, 0)); + ok(clr == ~0u, "got %d, expected -1\n", clr); + + hdc = GetDC(hMainWnd); + + GetClientRect(hMainWnd, &rc); + FillRect(hdc, &rc, GetStockObject(BLACK_BRUSH)); + + clr = GetPixel(hdc, 1, 1); + ok(clr == RGB(0, 0, 0), "got 0x%x\n", clr); + + ret = SendMessageA(hTree, WM_PAINT, (WPARAM)hdc, 0); + ok(ret == 0, "got %d\n", ret); + + clr = GetPixel(hdc, 1, 1); + ok(clr == RGB(255, 0, 0) || broken(clr == RGB(0, 0, 0)) /* win98 */, + "got 0x%x\n", clr); + + ReleaseDC(hMainWnd, hdc); + + DestroyWindow(hTree); +} + +static void test_delete_items(void) +{ + const struct message *msg; + HWND hTree; + INT ret; + + hTree = create_treeview_control(0); + fill_tree(hTree); + + /* check delete order */ + flush_sequences(item_sequence, 1); + ret = SendMessage(hTree, TVM_DELETEITEM, 0, 0); + ok(ret == TRUE, "got %d\n", ret); + + msg = item_sequence[0]->sequence; + ok(item_sequence[0]->count == 2, "expected 2 items, got %d\n", item_sequence[0]->count); + + if (item_sequence[0]->count == 2) + { + ok(msg[0].lParam == (LPARAM)hChild, "expected %p, got 0x%lx\n", hChild, msg[0].lParam); + ok(msg[1].lParam == (LPARAM)hRoot, "expected %p, got 0x%lx\n", hRoot, msg[1].lParam); + } + + ret = SendMessageA(hTree, TVM_GETCOUNT, 0, 0); + ok(ret == 0, "got %d\n", ret); + + DestroyWindow(hTree); +} + +struct _ITEM_DATA +{ + HTREEITEM parent; /* for root value of parent field is unidetified */ + HTREEITEM nextsibling; + HTREEITEM firstchild; +}; + +static void _check_item(HTREEITEM item, HTREEITEM parent, HTREEITEM nextsibling, HTREEITEM firstchild, int line) +{ + struct _ITEM_DATA *data = (struct _ITEM_DATA*)item; + + ok_(__FILE__, line)(data->parent == parent, "parent %p, got %p\n", parent, data->parent); + ok_(__FILE__, line)(data->nextsibling == nextsibling, "sibling %p, got %p\n", nextsibling, data->nextsibling); + ok_(__FILE__, line)(data->firstchild == firstchild, "firstchild %p, got %p\n", firstchild, data->firstchild); +} + +#define check_item(a, b, c, d) _check_item(a, b, c, d, __LINE__) + +static void test_htreeitem_layout(void) +{ + TVINSERTSTRUCTA ins; + HTREEITEM item1, item2; + HWND hTree; + + hTree = create_treeview_control(0); + fill_tree(hTree); + + /* root has some special pointer in parent field */ + check_item(hRoot, ((struct _ITEM_DATA*)hRoot)->parent, 0, hChild); + check_item(hChild, hRoot, 0, 0); + + ins.hParent = hChild; + ins.hInsertAfter = TVI_FIRST; + U(ins).item.mask = 0; + item1 = TreeView_InsertItem(hTree, &ins); + + check_item(item1, hChild, 0, 0); + + ins.hParent = hRoot; + ins.hInsertAfter = TVI_FIRST; + U(ins).item.mask = 0; + item2 = TreeView_InsertItem(hTree, &ins); + + check_item(item2, hRoot, hChild, 0); + + SendMessage(hTree, TVM_DELETEITEM, 0, (LPARAM)hChild); + + /* without children now */ + check_item(hRoot, ((struct _ITEM_DATA*)hRoot)->parent, 0, item2); + + DestroyWindow(hTree); +} + +static void test_TVS_CHECKBOXES(void) +{ + HIMAGELIST himl; + TVITEMA item; + HWND hTree; + DWORD ret; + + hTree = create_treeview_control(0); + fill_tree(hTree); + + himl = (HIMAGELIST)SendMessageA(hTree, TVM_GETIMAGELIST, TVSIL_STATE, 0); + ok(himl == NULL, "got %p\n", himl); + + item.hItem = hRoot; + item.mask = TVIF_STATE; + item.state = INDEXTOSTATEIMAGEMASK(1); + item.stateMask = TVIS_STATEIMAGEMASK; + ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); + expect(TRUE, ret); + ok(item.state == 0, "got 0x%x\n", item.state); + + /* set some index for a child */ + item.hItem = hChild; + item.mask = TVIF_STATE; + item.state = INDEXTOSTATEIMAGEMASK(4); + item.stateMask = TVIS_STATEIMAGEMASK; + ret = SendMessageA(hTree, TVM_SETITEMA, 0, (LPARAM)&item); + expect(TRUE, ret); + + /* enabling check boxes set all items to 1 state image index */ + SetWindowLongA(hTree, GWL_STYLE, GetWindowLongA(hTree, GWL_STYLE) | TVS_CHECKBOXES); + himl = (HIMAGELIST)SendMessageA(hTree, TVM_GETIMAGELIST, TVSIL_STATE, 0); + ok(himl != NULL, "got %p\n", himl); + + item.hItem = hRoot; + item.mask = TVIF_STATE; + item.state = 0; + item.stateMask = TVIS_STATEIMAGEMASK; + ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); + expect(TRUE, ret); + ok(item.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", item.state); + + item.hItem = hChild; + item.mask = TVIF_STATE; + item.state = 0; + item.stateMask = TVIS_STATEIMAGEMASK; + ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); + expect(TRUE, ret); + ok(item.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", item.state); + + DestroyWindow(hTree); + + /* the same, but initially created with TVS_CHECKBOXES */ + hTree = create_treeview_control(0); + fill_tree(hTree); + himl = (HIMAGELIST)SendMessageA(hTree, TVM_GETIMAGELIST, TVSIL_STATE, 0); + ok(himl == NULL, "got %p\n", himl); + DestroyWindow(hTree); + + hTree = create_treeview_control(TVS_CHECKBOXES); + fill_tree(hTree); + himl = (HIMAGELIST)SendMessageA(hTree, TVM_GETIMAGELIST, TVSIL_STATE, 0); + todo_wine ok(himl == NULL, "got %p\n", himl); + + item.hItem = hRoot; + item.mask = TVIF_STATE; + item.state = 0; + item.stateMask = TVIS_STATEIMAGEMASK; + ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); + expect(TRUE, ret); + ok(item.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", item.state); + + item.hItem = hChild; + item.mask = TVIF_STATE; + item.state = 0; + item.stateMask = TVIS_STATEIMAGEMASK; + ret = SendMessageA(hTree, TVM_GETITEMA, 0, (LPARAM)&item); + expect(TRUE, ret); + ok(item.state == INDEXTOSTATEIMAGEMASK(1), "got 0x%x\n", item.state); + + DestroyWindow(hTree); +} + +static void test_TVM_GETNEXTITEM(void) +{ + HTREEITEM item; + HWND hTree; + + hTree = create_treeview_control(0); + fill_tree(hTree); + + item = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_ROOT, 0); + ok(item == hRoot, "got %p, expected %p\n", item, hRoot); + + item = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_ROOT, (LPARAM)TVI_ROOT); + ok(item == hRoot, "got %p, expected %p\n", item, hRoot); + + item = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_ROOT, (LPARAM)hRoot); + ok(item == hRoot, "got %p, expected %p\n", item, hRoot); + + item = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_ROOT, (LPARAM)hChild); + ok(item == hRoot, "got %p, expected %p\n", item, hRoot); + + item = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_CHILD, 0); + ok(item == hRoot, "got %p, expected %p\n", item, hRoot); + + item = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hRoot); + ok(item == hChild, "got %p, expected %p\n", item, hChild); + + item = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)TVI_ROOT); + ok(item == hRoot, "got %p, expected %p\n", item, hRoot); + + item = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_PARENT, 0); + ok(item == NULL, "got %p\n", item); + + item = (HTREEITEM)SendMessageA(hTree, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hChild); + ok(item == hRoot, "got %p, expected %p\n", item, hRoot); + + DestroyWindow(hTree); } START_TEST(treeview) @@ -1198,6 +1736,10 @@ START_TEST(treeview) BOOL (WINAPI *pInitCommonControlsEx)(const INITCOMMONCONTROLSEX*); WNDCLASSA wc; MSG msg; + + ULONG_PTR ctx_cookie; + HANDLE hCtx; + HWND hwnd; hComctl32 = GetModuleHandleA("comctl32.dll"); pInitCommonControlsEx = (void*)GetProcAddress(hComctl32, "InitCommonControlsEx"); @@ -1212,6 +1754,7 @@ START_TEST(treeview) InitCommonControls(); init_msg_sequences(sequences, NUM_MSG_SEQUENCES); + init_msg_sequences(item_sequence, 1); wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; @@ -1252,10 +1795,43 @@ START_TEST(treeview) test_itemedit(); test_treeview_classinfo(); test_expandnotify(); - test_rect_retrieval_after_expand_with_select(); + test_TVS_SINGLEEXPAND(); + test_WM_PAINT(); + test_delete_items(); + test_htreeitem_layout(); + test_TVS_CHECKBOXES(); + test_TVM_GETNEXTITEM(); + + if (!load_v6_module(&ctx_cookie, &hCtx)) + { + DestroyWindow(hMainWnd); + return; + } + + /* this is a XP SP3 failure workaround */ + hwnd = CreateWindowExA(0, WC_TREEVIEW, "foo", + WS_CHILD | WS_BORDER | WS_VISIBLE, + 0, 0, 100, 100, + hMainWnd, NULL, GetModuleHandleA(NULL), NULL); + if (!IsWindow(hwnd)) + { + win_skip("FIXME: failed to create TreeView window.\n"); + unload_v6_module(ctx_cookie, hCtx); + DestroyWindow(hMainWnd); + return; + } + else + DestroyWindow(hwnd); + + /* comctl32 version 6 tests start here */ + test_expandedimage(); + test_htreeitem_layout(); + + unload_v6_module(ctx_cookie, hCtx); PostMessageA(hMainWnd, WM_CLOSE, 0, 0); - while(GetMessageA(&msg,0,0,0)) { + while(GetMessageA(&msg, 0, 0, 0)) + { TranslateMessage(&msg); DispatchMessageA(&msg); } diff --git a/rostests/winetests/comctl32/updown.c b/rostests/winetests/comctl32/updown.c index 859b3a0a988..e2a640f8d56 100644 --- a/rostests/winetests/comctl32/updown.c +++ b/rostests/winetests/comctl32/updown.c @@ -44,7 +44,6 @@ * - more stuff to test */ -#include #include #include #include @@ -406,6 +405,7 @@ static void test_updown_pos32(void) low = high = -1; r = SendMessage(updown, UDM_GETRANGE32, (WPARAM) &low , (LPARAM) &high ); + expect(0,r); if (low == -1) { win_skip("UDM_SETRANGE32/UDM_GETRANGE32 not available\n"); From bf0952f9a8ac5883faaae0927bd10451190a443c Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 15:19:30 +0000 Subject: [PATCH 096/289] * Addendum to r55201. svn path=/trunk/; revision=55207 --- reactos/media/doc/README.WINE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index f90f9e21359..e69947cbaaa 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -165,7 +165,7 @@ reactos/dll/win32/twain_32 # Out of sync reactos/dll/win32/updspapi # Autosync reactos/dll/win32/url # Autosync reactos/dll/win32/urlmon # Autosync -reactos/dll/win32/usp10 # Autosync +reactos/dll/win32/usp10 # Synced to Wine-1.3.37 reactos/dll/win32/uxtheme # Autosync reactos/dll/win32/version # Autosync reactos/dll/win32/wer # Autosync From 75cfcb0115a8830fd54c82c9993e414affde7447 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 15:22:08 +0000 Subject: [PATCH 097/289] [DDK] * Update bdasup.h annotations. svn path=/trunk/; revision=55208 --- reactos/include/ddk/bdasup.h | 176 ++++++++++++++++++++++------------- 1 file changed, 113 insertions(+), 63 deletions(-) diff --git a/reactos/include/ddk/bdasup.h b/reactos/include/ddk/bdasup.h index 51964113d77..9124e76f57a 100644 --- a/reactos/include/ddk/bdasup.h +++ b/reactos/include/ddk/bdasup.h @@ -51,143 +51,193 @@ typedef struct _KSM_PIN { /* Functions */ +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaCheckChanges( - IN PIRP Irp); + _In_ PIRP Irp); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaCommitChanges( - IN PIRP Irp); + _In_ PIRP Irp); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaCreateFilterFactory( - IN PKSDEVICE pKSDevice, - IN const KSFILTER_DESCRIPTOR *pFilterDescriptor, - IN const BDA_FILTER_TEMPLATE *pBdaFilterTemplate); + _In_ PKSDEVICE pKSDevice, + _In_ const KSFILTER_DESCRIPTOR *pFilterDescriptor, + _In_ const BDA_FILTER_TEMPLATE *pBdaFilterTemplate); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaCreateFilterFactoryEx( - IN PKSDEVICE pKSDevice, - IN const KSFILTER_DESCRIPTOR *pFilterDescriptor, - IN const BDA_FILTER_TEMPLATE *pBdaFilterTemplate, - OUT PKSFILTERFACTORY *ppKSFilterFactory); + _In_ PKSDEVICE pKSDevice, + _In_ const KSFILTER_DESCRIPTOR *pFilterDescriptor, + _In_ const BDA_FILTER_TEMPLATE *pBdaFilterTemplate, + _Out_opt_ PKSFILTERFACTORY *ppKSFilterFactory); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaCreatePin( - IN PKSFILTER pKSFilter, - IN ULONG ulPinType, - OUT ULONG *pulPinId); + _In_ PKSFILTER pKSFilter, + _In_ ULONG ulPinType, + _Out_opt_ ULONG *pulPinId); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaCreateTopology( - IN PKSFILTER pKSFilter, - IN ULONG InputPinId, - IN ULONG OutputPinId); + _In_ PKSFILTER pKSFilter, + _In_ ULONG InputPinId, + _In_ ULONG OutputPinId); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaDeletePin( - IN PKSFILTER pKSFilter, - IN ULONG *pulPinId); + _In_ PKSFILTER pKSFilter, + _Out_opt_ ULONG *pulPinId); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaFilterFactoryUpdateCacheData( - IN PKSFILTERFACTORY pFilterFactory, - IN const KSFILTER_DESCRIPTOR *pFilterDescriptor OPTIONAL); + _In_ PKSFILTERFACTORY pFilterFactory, + _In_opt_ const KSFILTER_DESCRIPTOR *pFilterDescriptor); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaGetChangeState( - IN PIRP Irp, - OUT BDA_CHANGE_STATE *pChangeState); + _In_ PIRP Irp, + _Out_opt_ BDA_CHANGE_STATE *pChangeState); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaInitFilter( - IN PKSFILTER pKSFilter, - IN const BDA_FILTER_TEMPLATE *pBdaFilterTemplate); + _In_ PKSFILTER pKSFilter, + _In_ const BDA_FILTER_TEMPLATE *pBdaFilterTemplate); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaMethodCreatePin( - IN PIRP Irp, - IN KSMETHOD *pKSMethod, - OUT ULONG *pulPinFactoryID); + _In_ PIRP Irp, + _In_ KSMETHOD *pKSMethod, + _Out_opt_ ULONG *pulPinFactoryID); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaMethodCreateTopology( - IN PIRP Irp, - IN KSMETHOD *pKSMethod, - OPTIONAL PVOID pvIgnored); + _In_ PIRP Irp, + _In_ KSMETHOD *pKSMethod, + PVOID pvIgnored); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaMethodDeletePin( - IN PIRP Irp, - IN KSMETHOD *pKSMethod, - OPTIONAL PVOID pvIgnored); + _In_ PIRP Irp, + _In_ KSMETHOD *pKSMethod, + PVOID pvIgnored); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaPropertyGetControllingPinId( - IN PIRP Irp, - IN KSP_BDA_NODE_PIN *pProperty, - OUT ULONG *pulControllingPinId); + _In_ PIRP Irp, + _In_ KSP_BDA_NODE_PIN *pProperty, + _Out_opt_ ULONG *pulControllingPinId); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaPropertyGetPinControl( - IN PIRP Irp, - IN KSPROPERTY *pKSProperty, - OUT ULONG *pulProperty); + _In_ PIRP Irp, + _In_ KSPROPERTY *pKSProperty, + _Out_opt_ ULONG *pulProperty); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaPropertyNodeDescriptors( - IN PIRP Irp, - IN KSPROPERTY *pKSProperty, - OUT BDANODE_DESCRIPTOR *pNodeDescriptorProperty); + _In_ PIRP Irp, + _In_ KSPROPERTY *pKSProperty, + _Out_opt_ BDANODE_DESCRIPTOR *pNodeDescriptorProperty); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaPropertyNodeEvents( - IN PIRP Irp, - IN KSP_NODE *pKSProperty, - OUT GUID *pguidProperty); + _In_ PIRP Irp, + _In_ KSP_NODE *pKSProperty, + _Out_opt_ GUID *pguidProperty); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaPropertyNodeMethods( - IN PIRP Irp, - IN KSP_NODE *pKSProperty, - OUT GUID *pguidProperty); + _In_ PIRP Irp, + _In_ KSP_NODE *pKSProperty, + _Out_opt_ GUID *pguidProperty); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaPropertyNodeProperties( - IN PIRP Irp, - IN KSP_NODE *pKSProperty, - OUT GUID *pguidProperty); + _In_ PIRP Irp, + _In_ KSP_NODE *pKSProperty, + _Out_opt_ GUID *pguidProperty); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaPropertyNodeTypes( - IN PIRP Irp, - IN KSPROPERTY *pKSProperty, - OUT ULONG *pulProperty); + _In_ PIRP Irp, + _In_ KSPROPERTY *pKSProperty, + _Out_writes_bytes_(OutputBufferLenFromIrp(Irp)) ULONG *pulProperty); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaPropertyPinTypes( - IN PIRP Irp, - IN KSPROPERTY *pKSProperty, - OUT ULONG *pulProperty); + _In_ PIRP Irp, + _In_ KSPROPERTY *pKSProperty, + _Out_writes_bytes_(OutputBufferLenFromIrp(Irp)) ULONG *pulProperty); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaPropertyTemplateConnections( - IN PIRP Irp, - IN KSPROPERTY *pKSProperty, - OUT KSTOPOLOGY_CONNECTION *pConnectionProperty); + _In_ PIRP Irp, + _In_ KSPROPERTY *pKSProperty, + _Out_opt_ KSTOPOLOGY_CONNECTION *pConnectionProperty); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaStartChanges( - IN PIRP Irp); + _In_ PIRP Irp); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaUninitFilter( - IN PKSFILTER pKSFilter); + _In_ PKSFILTER pKSFilter); +_Must_inspect_result_ +_IRQL_requires_(PASSIVE_LEVEL) STDMETHODIMP_(NTSTATUS) BdaValidateNodeProperty( - IN PIRP Irp, - IN KSPROPERTY *pKSProperty); + _In_ PIRP Irp, + _In_ KSPROPERTY *pKSProperty); #if defined(__cplusplus) } From 81ec63a850b16fdf7e3f6b5eddf13d9c3f4d3b98 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Thu, 26 Jan 2012 15:55:16 +0000 Subject: [PATCH 098/289] [User32_wineTest] - Sync to Wine 1.3.37. svn path=/trunk/; revision=55209 --- rostests/winetests/user32/broadcast.c | 1 - rostests/winetests/user32/class.c | 1 - rostests/winetests/user32/combo.c | 1 - rostests/winetests/user32/cursoricon.c | 46 ++-- rostests/winetests/user32/dce.c | 1 - rostests/winetests/user32/dialog.c | 74 +++++- rostests/winetests/user32/edit.c | 110 ++++----- rostests/winetests/user32/generated.c | 39 ++-- rostests/winetests/user32/input.c | 9 +- rostests/winetests/user32/msg.c | 310 ++++++++++++++++++++++--- rostests/winetests/user32/resource.c | 18 +- rostests/winetests/user32/resource.rc | 18 ++ rostests/winetests/user32/scroll.c | 18 +- rostests/winetests/user32/static.c | 1 - rostests/winetests/user32/sysparams.c | 38 ++- rostests/winetests/user32/win.c | 282 +++++++++++++++++++--- 16 files changed, 788 insertions(+), 179 deletions(-) diff --git a/rostests/winetests/user32/broadcast.c b/rostests/winetests/user32/broadcast.c index 21d38e3cc40..f15bb375139 100644 --- a/rostests/winetests/user32/broadcast.c +++ b/rostests/winetests/user32/broadcast.c @@ -20,7 +20,6 @@ //#define _WIN32_WINNT 0x0501 -#include #include #include diff --git a/rostests/winetests/user32/class.c b/rostests/winetests/user32/class.c index f9d1aef8325..29b2706e1cc 100755 --- a/rostests/winetests/user32/class.c +++ b/rostests/winetests/user32/class.c @@ -21,7 +21,6 @@ /* To get CS_DROPSHADOW with the MSVC headers */ //#define _WIN32_WINNT 0x0501 -#include #include #include #include diff --git a/rostests/winetests/user32/combo.c b/rostests/winetests/user32/combo.c index af23f96d1c1..0514ed834e5 100644 --- a/rostests/winetests/user32/combo.c +++ b/rostests/winetests/user32/combo.c @@ -17,7 +17,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include #include #include diff --git a/rostests/winetests/user32/cursoricon.c b/rostests/winetests/user32/cursoricon.c index cc47a25952f..4a570aedd44 100644 --- a/rostests/winetests/user32/cursoricon.c +++ b/rostests/winetests/user32/cursoricon.c @@ -20,7 +20,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include #include #include #include @@ -185,7 +184,7 @@ typedef struct { 0, /* biYPelsPerMeter */ \ 0, /* biClrUsed */ \ 0 /* biClrImportant */ \ - }, \ + } \ /* DIB data: left uninitialized */ \ } \ } @@ -697,7 +696,7 @@ static void test_initial_cursor(void) ok(error == 0xdeadbeef, "Last error: 0x%08x\n", error); } -static void test_icon_info_dbg(HICON hIcon, UINT exp_cx, UINT exp_cy, UINT exp_bpp, int line) +static void test_icon_info_dbg(HICON hIcon, UINT exp_cx, UINT exp_cy, UINT exp_mask_cy, UINT exp_bpp, int line) { ICONINFO info; DWORD ret; @@ -737,13 +736,13 @@ static void test_icon_info_dbg(HICON hIcon, UINT exp_cx, UINT exp_cy, UINT exp_b ok_(__FILE__, line)(bmMask.bmBitsPixel == 1, "bmMask.bmBitsPixel = %d\n", bmMask.bmBitsPixel); ok_(__FILE__, line)(bmMask.bmWidth == exp_cx, "bmMask.bmWidth = %d\n", bmMask.bmWidth); - ok_(__FILE__, line)(bmMask.bmHeight == exp_cy, "bmMask.bmHeight = %d\n", bmMask.bmHeight); + ok_(__FILE__, line)(bmMask.bmHeight == exp_mask_cy, "bmMask.bmHeight = %d\n", bmMask.bmHeight); } else { ok_(__FILE__, line)(bmMask.bmBitsPixel == 1, "bmMask.bmBitsPixel = %d\n", bmMask.bmBitsPixel); ok_(__FILE__, line)(bmMask.bmWidth == exp_cx, "bmMask.bmWidth = %d\n", bmMask.bmWidth); - ok_(__FILE__, line)(bmMask.bmHeight == exp_cy * 2, "bmMask.bmHeight = %d\n", bmMask.bmHeight); + ok_(__FILE__, line)(bmMask.bmHeight == exp_mask_cy, "bmMask.bmHeight = %d\n", bmMask.bmHeight); } if (pGetIconInfoExA) { @@ -778,7 +777,7 @@ static void test_icon_info_dbg(HICON hIcon, UINT exp_cx, UINT exp_cy, UINT exp_b } } -#define test_icon_info(a,b,c,d) test_icon_info_dbg((a),(b),(c),(d),__LINE__) +#define test_icon_info(a,b,c,d,e) test_icon_info_dbg((a),(b),(c),(d),(e),__LINE__) static void test_CreateIcon(void) { @@ -790,6 +789,7 @@ static void test_CreateIcon(void) HDC hdc; void *bits; UINT display_bpp; + int i; hdc = GetDC(0); display_bpp = GetDeviceCaps(hdc, BITSPIXEL); @@ -801,12 +801,12 @@ static void test_CreateIcon(void) hIcon = CreateIcon(0, 16, 16, 1, 1, bmp_bits, bmp_bits); ok(hIcon != 0, "CreateIcon failed\n"); - test_icon_info(hIcon, 16, 16, 1); + test_icon_info(hIcon, 16, 16, 32, 1); DestroyIcon(hIcon); hIcon = CreateIcon(0, 16, 16, 1, display_bpp, bmp_bits, bmp_bits); ok(hIcon != 0, "CreateIcon failed\n"); - test_icon_info(hIcon, 16, 16, display_bpp); + test_icon_info(hIcon, 16, 16, 16, display_bpp); DestroyIcon(hIcon); hbmMask = CreateBitmap(16, 16, 1, 1, bmp_bits); @@ -841,7 +841,7 @@ static void test_CreateIcon(void) info.hbmColor = hbmColor; hIcon = CreateIconIndirect(&info); ok(hIcon != 0, "CreateIconIndirect failed\n"); - test_icon_info(hIcon, 16, 16, display_bpp); + test_icon_info(hIcon, 16, 16, 16, display_bpp); DestroyIcon(hIcon); DeleteObject(hbmMask); @@ -858,11 +858,27 @@ static void test_CreateIcon(void) SetLastError(0xdeadbeaf); hIcon = CreateIconIndirect(&info); ok(hIcon != 0, "CreateIconIndirect failed\n"); - test_icon_info(hIcon, 16, 16, 1); + test_icon_info(hIcon, 16, 16, 32, 1); DestroyIcon(hIcon); - DeleteObject(hbmMask); - DeleteObject(hbmColor); + + for (i = 0; i <= 4; i++) + { + hbmMask = CreateBitmap(1, i, 1, 1, bmp_bits); + ok(hbmMask != 0, "CreateBitmap failed\n"); + + info.fIcon = TRUE; + info.xHotspot = 0; + info.yHotspot = 0; + info.hbmMask = hbmMask; + info.hbmColor = 0; + SetLastError(0xdeadbeaf); + hIcon = CreateIconIndirect(&info); + ok(hIcon != 0, "CreateIconIndirect failed\n"); + test_icon_info(hIcon, 1, i / 2, max(i,1), 1); + DestroyIcon(hIcon); + DeleteObject(hbmMask); + } /* test creating an icon from a DIB section */ @@ -891,7 +907,7 @@ static void test_CreateIcon(void) SetLastError(0xdeadbeaf); hIcon = CreateIconIndirect(&info); ok(hIcon != 0, "CreateIconIndirect failed\n"); - test_icon_info(hIcon, 32, 32, 8); + test_icon_info(hIcon, 32, 32, 32, 8); DestroyIcon(hIcon); DeleteObject(hbmColor); @@ -909,7 +925,7 @@ static void test_CreateIcon(void) SetLastError(0xdeadbeaf); hIcon = CreateIconIndirect(&info); ok(hIcon != 0, "CreateIconIndirect failed\n"); - test_icon_info(hIcon, 32, 32, 8); + test_icon_info(hIcon, 32, 32, 32, 8); DestroyIcon(hIcon); DeleteObject(hbmColor); @@ -927,7 +943,7 @@ static void test_CreateIcon(void) SetLastError(0xdeadbeaf); hIcon = CreateIconIndirect(&info); ok(hIcon != 0, "CreateIconIndirect failed\n"); - test_icon_info(hIcon, 32, 32, 8); + test_icon_info(hIcon, 32, 32, 32, 8); DestroyIcon(hIcon); DeleteObject(hbmMask); diff --git a/rostests/winetests/user32/dce.c b/rostests/winetests/user32/dce.c index 4aacd64a593..9b5a89ebea3 100755 --- a/rostests/winetests/user32/dce.c +++ b/rostests/winetests/user32/dce.c @@ -18,7 +18,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include #include #include #include diff --git a/rostests/winetests/user32/dialog.c b/rostests/winetests/user32/dialog.c index 8e4ffb577de..1d007ef71c3 100755 --- a/rostests/winetests/user32/dialog.c +++ b/rostests/winetests/user32/dialog.c @@ -33,6 +33,9 @@ #include #include +#undef WINVER +#define WINVER 0x0600 /* For NONCLIENTMETRICS with padding */ + #include "wine/test.h" #include "windef.h" #include "winbase.h" @@ -830,8 +833,7 @@ static void test_initial_focus(void) { /* Test 1: * This test intentionally returns FALSE in response to WM_INITDIALOG - * without setting focus to a control. This is not allowed according to - * MSDN, but it is exactly what MFC's CFormView does. + * without setting focus to a control. This is what MFC's CFormView does. * * Since the WM_INITDIALOG handler returns FALSE without setting the focus, * the focus should initially be NULL. Later, when we manually set focus to @@ -913,6 +915,31 @@ static void test_initial_focus(void) DestroyWindow(hDlg); } + + /* Test 4: + * If the dialog has no tab-accessible controls, set focus to first control */ + { + HWND hDlg; + HRSRC hResource; + HANDLE hTemplate; + DLGTEMPLATE* pTemplate; + HWND hLabel; + + hResource = FindResourceA(g_hinst,"FOCUS_TEST_DIALOG_2", RT_DIALOG); + hTemplate = LoadResource(g_hinst, hResource); + pTemplate = LockResource(hTemplate); + + hDlg = CreateDialogIndirectParamA(g_hinst, pTemplate, NULL, focusDlgWinProc, 0); + g_hwndInitialFocusT1 = GetFocus(); + hLabel = GetDlgItem(hDlg, 200); + ok (hDlg != 0, "Failed to create test dialog.\n"); + + ok ((g_hwndInitialFocusT1 == hLabel), + "Focus should have been set to the first control, expected (%p) got (%p).\n", + hLabel, g_hwndInitialFocusT1); + + DestroyWindow(hDlg); + } } static void test_GetDlgItemText(void) @@ -1058,11 +1085,50 @@ static INT_PTR CALLBACK TestReturnKeyDlgProc (HWND hDlg, UINT uiMsg, return FALSE; } +static INT_PTR CALLBACK TestControlStyleDlgProc(HWND hdlg, UINT msg, + WPARAM wparam, LPARAM lparam) +{ + HWND control; + DWORD style, exstyle; + char buf[256]; + + switch (msg) + { + case WM_INITDIALOG: + control = GetDlgItem(hdlg, 7); + ok(control != 0, "dialog control with id 7 not found\n"); + style = GetWindowLong(control, GWL_STYLE); + ok(style == (WS_CHILD|WS_VISIBLE), "expected WS_CHILD|WS_VISIBLE, got %#x\n", style); + exstyle = GetWindowLong(control, GWL_EXSTYLE); + ok(exstyle == (WS_EX_NOPARENTNOTIFY|WS_EX_TRANSPARENT|WS_EX_CLIENTEDGE), "expected WS_EX_NOPARENTNOTIFY|WS_EX_TRANSPARENT|WS_EX_CLIENTEDGE, got %#x\n", exstyle); + buf[0] = 0; + GetWindowText(control, buf, sizeof(buf)); + ok(lstrcmp(buf, "bump7") == 0, "expected bump7, got %s\n", buf); + + control = GetDlgItem(hdlg, 8); + ok(control != 0, "dialog control with id 8 not found\n"); + style = GetWindowLong(control, GWL_STYLE); + ok(style == (WS_CHILD|WS_VISIBLE), "expected WS_CHILD|WS_VISIBLE, got %#x\n", style); + exstyle = GetWindowLong(control, GWL_EXSTYLE); + ok(exstyle == (WS_EX_NOPARENTNOTIFY|WS_EX_TRANSPARENT), "expected WS_EX_NOPARENTNOTIFY|WS_EX_TRANSPARENT, got %#x\n", exstyle); + buf[0] = 0; + GetWindowText(control, buf, sizeof(buf)); + ok(lstrcmp(buf, "bump8") == 0, "expected bump8, got %s\n", buf); + + EndDialog(hdlg, -7); + return TRUE; + } + return FALSE; +} + static void test_DialogBoxParamA(void) { INT_PTR ret; HWND hwnd_invalid = (HWND)0x4444; + ret = DialogBoxParamA(GetModuleHandle(0), "TEST_DLG_CHILD_POPUP", 0, TestControlStyleDlgProc, 0); + ok(ret == -7, "expected -7, got %ld\n", ret); + SetLastError(0xdeadbeef); ret = DialogBoxParamA(GetModuleHandle(NULL), "IDD_DIALOG" , hwnd_invalid, 0 , 0); ok(0 == ret || broken(ret == -1), "DialogBoxParamA returned %ld, expected 0\n", ret); @@ -1109,7 +1175,7 @@ static void test_DialogBoxParamA(void) static void test_DisabledDialogTest(void) { g_terminated = FALSE; - DialogBoxParam(g_hinst, "IDD_DIALOG", NULL, (DLGPROC)disabled_test_proc, 0); + DialogBoxParam(g_hinst, "IDD_DIALOG", NULL, disabled_test_proc, 0); ok(FALSE == g_terminated, "dialog with disabled ok button has been terminated\n"); } @@ -1198,7 +1264,7 @@ static void test_MessageBoxFontTest(void) } GetObjectW(hFont, sizeof(LOGFONTW), &lfStaticFont); - ncMetrics.cbSize = sizeof(NONCLIENTMETRICSW); + ncMetrics.cbSize = FIELD_OFFSET(NONCLIENTMETRICSW, iPaddedBorderWidth); SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, 0, &ncMetrics, 0); ok( !memcmp(&lfStaticFont, &ncMetrics.lfMessageFont, FIELD_OFFSET(LOGFONTW, lfFaceName)) && !lstrcmpW(lfStaticFont.lfFaceName, ncMetrics.lfMessageFont.lfFaceName), diff --git a/rostests/winetests/user32/edit.c b/rostests/winetests/user32/edit.c index c1ca3a3ddab..89a28433544 100755 --- a/rostests/winetests/user32/edit.c +++ b/rostests/winetests/user32/edit.c @@ -1736,7 +1736,7 @@ static void test_espassword(void) hwEdit = create_editcontrol(ES_PASSWORD, 0); r = get_edit_style(hwEdit); - ok(r == ES_PASSWORD, "Wrong style expected 0x%x got: 0x%x\n", ES_PASSWORD, r); + ok(r == ES_PASSWORD, "Wrong style expected ES_PASSWORD got: 0x%x\n", r); /* set text */ r = SendMessage(hwEdit , WM_SETTEXT, 0, (LPARAM) password); ok(r == TRUE, "Expected: %d, got: %d\n", TRUE, r); @@ -1840,7 +1840,7 @@ static void test_enter(void) /* multiline */ hwEdit = create_editcontrol(ES_MULTILINE, 0); r = get_edit_style(hwEdit); - ok(ES_MULTILINE == r, "Wrong style expected 0x%x got: 0x%x\n", ES_MULTILINE, r); + ok(ES_MULTILINE == r, "Wrong style expected ES_MULTILINE got: 0x%x\n", r); /* set text */ r = SendMessage(hwEdit , WM_SETTEXT, 0, (LPARAM) ""); @@ -1880,7 +1880,7 @@ static void test_enter(void) /* single line with ES_WANTRETURN */ hwEdit = create_editcontrol(ES_WANTRETURN, 0); r = get_edit_style(hwEdit); - ok(ES_WANTRETURN == r, "Wrong style expected 0x%x got: 0x%x\n", ES_WANTRETURN, r); + ok(ES_WANTRETURN == r, "Wrong style expected ES_WANTRETURN got: 0x%x\n", r); /* set text */ r = SendMessage(hwEdit , WM_SETTEXT, 0, (LPARAM) ""); @@ -1907,7 +1907,7 @@ static void test_tab(void) /* multiline */ hwEdit = create_editcontrol(ES_MULTILINE, 0); r = get_edit_style(hwEdit); - ok(ES_MULTILINE == r, "Wrong style expected 0x%x got: 0x%x\n", ES_MULTILINE, r); + ok(ES_MULTILINE == r, "Wrong style expected ES_MULTILINE got: 0x%x\n", r); /* set text */ r = SendMessage(hwEdit , WM_SETTEXT, 0, (LPARAM) ""); @@ -1950,57 +1950,57 @@ static void test_edit_dialog(void) int r; /* from bug 11841 */ - r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 0); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, edit_dialog_proc, 0); ok(333 == r, "Expected %d, got %d\n", 333, r); - r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 1); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, edit_dialog_proc, 1); ok(111 == r, "Expected %d, got %d\n", 111, r); - r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 2); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, edit_dialog_proc, 2); ok(444 == r, "Expected %d, got %d\n", 444, r); /* more tests for WM_CHAR */ - r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 3); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, edit_dialog_proc, 3); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 4); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, edit_dialog_proc, 4); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 5); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, edit_dialog_proc, 5); ok(444 == r, "Expected %d, got %d\n", 444, r); /* more tests for WM_KEYDOWN + WM_CHAR */ - r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 6); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, edit_dialog_proc, 6); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 7); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, edit_dialog_proc, 7); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 8); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, edit_dialog_proc, 8); ok(444 == r, "Expected %d, got %d\n", 444, r); /* tests with an editable edit control */ - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 0); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 0); ok(333 == r, "Expected %d, got %d\n", 333, r); - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 1); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 1); ok(111 == r, "Expected %d, got %d\n", 111, r); - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 2); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 2); ok(444 == r, "Expected %d, got %d\n", 444, r); /* tests for WM_CHAR */ - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 3); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 3); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 4); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 4); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 5); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 5); ok(444 == r, "Expected %d, got %d\n", 444, r); /* tests for WM_KEYDOWN + WM_CHAR */ - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 6); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 6); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 7); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 7); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 8); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 8); ok(444 == r, "Expected %d, got %d\n", 444, r); /* multiple tab tests */ - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 9); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 9); ok(22 == r, "Expected %d, got %d\n", 22, r); - r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 10); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, edit_dialog_proc, 10); ok(33 == r, "Expected %d, got %d\n", 33, r); } @@ -2009,13 +2009,13 @@ static void test_multi_edit_dialog(void) int r; /* test for multiple edit dialogs (bug 12319) */ - r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, (DLGPROC)multi_edit_dialog_proc, 0); + r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, multi_edit_dialog_proc, 0); ok(2222 == r, "Expected %d, got %d\n", 2222, r); - r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, (DLGPROC)multi_edit_dialog_proc, 1); + r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, multi_edit_dialog_proc, 1); ok(1111 == r, "Expected %d, got %d\n", 1111, r); - r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, (DLGPROC)multi_edit_dialog_proc, 2); + r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, multi_edit_dialog_proc, 2); ok(2222 == r, "Expected %d, got %d\n", 2222, r); - r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, (DLGPROC)multi_edit_dialog_proc, 3); + r = DialogBoxParam(hinst, "MULTI_EDIT_DIALOG", NULL, multi_edit_dialog_proc, 3); ok(11 == r, "Expected %d, got %d\n", 11, r); } @@ -2024,27 +2024,27 @@ static void test_wantreturn_edit_dialog(void) int r; /* tests for WM_KEYDOWN */ - r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_wantreturn_dialog_proc, 0); + r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, edit_wantreturn_dialog_proc, 0); ok(333 == r, "Expected %d, got %d\n", 333, r); - r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_wantreturn_dialog_proc, 1); + r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, edit_wantreturn_dialog_proc, 1); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_wantreturn_dialog_proc, 2); + r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, edit_wantreturn_dialog_proc, 2); ok(444 == r, "Expected %d, got %d\n", 444, r); /* tests for WM_CHAR */ - r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_wantreturn_dialog_proc, 3); + r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, edit_wantreturn_dialog_proc, 3); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_wantreturn_dialog_proc, 4); + r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, edit_wantreturn_dialog_proc, 4); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_wantreturn_dialog_proc, 5); + r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, edit_wantreturn_dialog_proc, 5); ok(444 == r, "Expected %d, got %d\n", 444, r); /* tests for WM_KEYDOWN + WM_CHAR */ - r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_wantreturn_dialog_proc, 6); + r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, edit_wantreturn_dialog_proc, 6); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_wantreturn_dialog_proc, 7); + r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, edit_wantreturn_dialog_proc, 7); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_wantreturn_dialog_proc, 8); + r = DialogBoxParam(hinst, "EDIT_WANTRETURN_DIALOG", NULL, edit_wantreturn_dialog_proc, 8); ok(444 == r, "Expected %d, got %d\n", 444, r); } @@ -2053,51 +2053,51 @@ static void test_singleline_wantreturn_edit_dialog(void) int r; /* tests for WM_KEYDOWN */ - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 0); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, edit_singleline_dialog_proc, 0); ok(222 == r, "Expected %d, got %d\n", 222, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 1); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, edit_singleline_dialog_proc, 1); ok(111 == r, "Expected %d, got %d\n", 111, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 2); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, edit_singleline_dialog_proc, 2); ok(444 == r, "Expected %d, got %d\n", 444, r); /* tests for WM_CHAR */ - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 3); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, edit_singleline_dialog_proc, 3); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 4); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, edit_singleline_dialog_proc, 4); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 5); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, edit_singleline_dialog_proc, 5); ok(444 == r, "Expected %d, got %d\n", 444, r); /* tests for WM_KEYDOWN + WM_CHAR */ - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 6); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, edit_singleline_dialog_proc, 6); ok(222 == r, "Expected %d, got %d\n", 222, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 7); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, edit_singleline_dialog_proc, 7); ok(111 == r, "Expected %d, got %d\n", 111, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 8); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_DIALOG", NULL, edit_singleline_dialog_proc, 8); ok(444 == r, "Expected %d, got %d\n", 444, r); /* tests for WM_KEYDOWN */ - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 0); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, edit_singleline_dialog_proc, 0); ok(222 == r, "Expected %d, got %d\n", 222, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 1); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, edit_singleline_dialog_proc, 1); ok(111 == r, "Expected %d, got %d\n", 111, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 2); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, edit_singleline_dialog_proc, 2); ok(444 == r, "Expected %d, got %d\n", 444, r); /* tests for WM_CHAR */ - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 3); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, edit_singleline_dialog_proc, 3); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 4); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, edit_singleline_dialog_proc, 4); ok(444 == r, "Expected %d, got %d\n", 444, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 5); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, edit_singleline_dialog_proc, 5); ok(444 == r, "Expected %d, got %d\n", 444, r); /* tests for WM_KEYDOWN + WM_CHAR */ - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 6); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, edit_singleline_dialog_proc, 6); ok(222 == r, "Expected %d, got %d\n", 222, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 7); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, edit_singleline_dialog_proc, 7); ok(111 == r, "Expected %d, got %d\n", 111, r); - r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, (DLGPROC)edit_singleline_dialog_proc, 8); + r = DialogBoxParam(hinst, "EDIT_SINGLELINE_WANTRETURN_DIALOG", NULL, edit_singleline_dialog_proc, 8); ok(444 == r, "Expected %d, got %d\n", 444, r); } diff --git a/rostests/winetests/user32/generated.c b/rostests/winetests/user32/generated.c index c8e8b5542be..174d4dc654a 100644 --- a/rostests/winetests/user32/generated.c +++ b/rostests/winetests/user32/generated.c @@ -5,7 +5,8 @@ * Unit tests for data structure packing */ -//#define WINVER 0x0501 +#undef WINVER +#define WINVER 0x0600 //#define _WIN32_IE 0x0501 //#define _WIN32_WINNT 0x0501 @@ -1562,7 +1563,7 @@ static void test_pack_LPNONCLIENTMETRICSA(void) /* LPNONCLIENTMETRICSA */ TEST_TYPE_SIZE (LPNONCLIENTMETRICSA, 8) TEST_TYPE_ALIGN (LPNONCLIENTMETRICSA, 8) - TEST_TARGET_SIZE (LPNONCLIENTMETRICSA, 340) + TEST_TARGET_SIZE (LPNONCLIENTMETRICSA, 344) TEST_TARGET_ALIGN(LPNONCLIENTMETRICSA, 4) } @@ -1571,7 +1572,7 @@ static void test_pack_LPNONCLIENTMETRICSW(void) /* LPNONCLIENTMETRICSW */ TEST_TYPE_SIZE (LPNONCLIENTMETRICSW, 8) TEST_TYPE_ALIGN (LPNONCLIENTMETRICSW, 8) - TEST_TARGET_SIZE (LPNONCLIENTMETRICSW, 500) + TEST_TARGET_SIZE (LPNONCLIENTMETRICSW, 504) TEST_TARGET_ALIGN(LPNONCLIENTMETRICSW, 4) } @@ -2390,7 +2391,7 @@ static void test_pack_NMHDR(void) static void test_pack_NONCLIENTMETRICSA(void) { /* NONCLIENTMETRICSA */ - TEST_TYPE_SIZE (NONCLIENTMETRICSA, 340) + TEST_TYPE_SIZE (NONCLIENTMETRICSA, 344) TEST_TYPE_ALIGN (NONCLIENTMETRICSA, 4) TEST_FIELD_SIZE (NONCLIENTMETRICSA, cbSize, 4) TEST_FIELD_ALIGN (NONCLIENTMETRICSA, cbSize, 4) @@ -2437,12 +2438,15 @@ static void test_pack_NONCLIENTMETRICSA(void) TEST_FIELD_SIZE (NONCLIENTMETRICSA, lfMessageFont, 60) TEST_FIELD_ALIGN (NONCLIENTMETRICSA, lfMessageFont, 4) TEST_FIELD_OFFSET(NONCLIENTMETRICSA, lfMessageFont, 280) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iPaddedBorderWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iPaddedBorderWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth, 340) } static void test_pack_NONCLIENTMETRICSW(void) { /* NONCLIENTMETRICSW */ - TEST_TYPE_SIZE (NONCLIENTMETRICSW, 500) + TEST_TYPE_SIZE (NONCLIENTMETRICSW, 504) TEST_TYPE_ALIGN (NONCLIENTMETRICSW, 4) TEST_FIELD_SIZE (NONCLIENTMETRICSW, cbSize, 4) TEST_FIELD_ALIGN (NONCLIENTMETRICSW, cbSize, 4) @@ -2489,6 +2493,9 @@ static void test_pack_NONCLIENTMETRICSW(void) TEST_FIELD_SIZE (NONCLIENTMETRICSW, lfMessageFont, 92) TEST_FIELD_ALIGN (NONCLIENTMETRICSW, lfMessageFont, 4) TEST_FIELD_OFFSET(NONCLIENTMETRICSW, lfMessageFont, 408) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iPaddedBorderWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iPaddedBorderWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iPaddedBorderWidth, 500) } static void test_pack_PAINTSTRUCT(void) @@ -2870,7 +2877,7 @@ static void test_pack_PNONCLIENTMETRICSA(void) /* PNONCLIENTMETRICSA */ TEST_TYPE_SIZE (PNONCLIENTMETRICSA, 8) TEST_TYPE_ALIGN (PNONCLIENTMETRICSA, 8) - TEST_TARGET_SIZE (PNONCLIENTMETRICSA, 340) + TEST_TARGET_SIZE (PNONCLIENTMETRICSA, 344) TEST_TARGET_ALIGN(PNONCLIENTMETRICSA, 4) } @@ -2879,7 +2886,7 @@ static void test_pack_PNONCLIENTMETRICSW(void) /* PNONCLIENTMETRICSW */ TEST_TYPE_SIZE (PNONCLIENTMETRICSW, 8) TEST_TYPE_ALIGN (PNONCLIENTMETRICSW, 8) - TEST_TARGET_SIZE (PNONCLIENTMETRICSW, 500) + TEST_TARGET_SIZE (PNONCLIENTMETRICSW, 504) TEST_TARGET_ALIGN(PNONCLIENTMETRICSW, 4) } @@ -5060,7 +5067,7 @@ static void test_pack_LPNONCLIENTMETRICSA(void) /* LPNONCLIENTMETRICSA */ TEST_TYPE_SIZE (LPNONCLIENTMETRICSA, 4) TEST_TYPE_ALIGN (LPNONCLIENTMETRICSA, 4) - TEST_TARGET_SIZE (LPNONCLIENTMETRICSA, 340) + TEST_TARGET_SIZE (LPNONCLIENTMETRICSA, 344) TEST_TARGET_ALIGN(LPNONCLIENTMETRICSA, 4) } @@ -5069,7 +5076,7 @@ static void test_pack_LPNONCLIENTMETRICSW(void) /* LPNONCLIENTMETRICSW */ TEST_TYPE_SIZE (LPNONCLIENTMETRICSW, 4) TEST_TYPE_ALIGN (LPNONCLIENTMETRICSW, 4) - TEST_TARGET_SIZE (LPNONCLIENTMETRICSW, 500) + TEST_TARGET_SIZE (LPNONCLIENTMETRICSW, 504) TEST_TARGET_ALIGN(LPNONCLIENTMETRICSW, 4) } @@ -5888,7 +5895,7 @@ static void test_pack_NMHDR(void) static void test_pack_NONCLIENTMETRICSA(void) { /* NONCLIENTMETRICSA */ - TEST_TYPE_SIZE (NONCLIENTMETRICSA, 340) + TEST_TYPE_SIZE (NONCLIENTMETRICSA, 344) TEST_TYPE_ALIGN (NONCLIENTMETRICSA, 4) TEST_FIELD_SIZE (NONCLIENTMETRICSA, cbSize, 4) TEST_FIELD_ALIGN (NONCLIENTMETRICSA, cbSize, 4) @@ -5935,12 +5942,15 @@ static void test_pack_NONCLIENTMETRICSA(void) TEST_FIELD_SIZE (NONCLIENTMETRICSA, lfMessageFont, 60) TEST_FIELD_ALIGN (NONCLIENTMETRICSA, lfMessageFont, 4) TEST_FIELD_OFFSET(NONCLIENTMETRICSA, lfMessageFont, 280) + TEST_FIELD_SIZE (NONCLIENTMETRICSA, iPaddedBorderWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSA, iPaddedBorderWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth, 340) } static void test_pack_NONCLIENTMETRICSW(void) { /* NONCLIENTMETRICSW */ - TEST_TYPE_SIZE (NONCLIENTMETRICSW, 500) + TEST_TYPE_SIZE (NONCLIENTMETRICSW, 504) TEST_TYPE_ALIGN (NONCLIENTMETRICSW, 4) TEST_FIELD_SIZE (NONCLIENTMETRICSW, cbSize, 4) TEST_FIELD_ALIGN (NONCLIENTMETRICSW, cbSize, 4) @@ -5987,6 +5997,9 @@ static void test_pack_NONCLIENTMETRICSW(void) TEST_FIELD_SIZE (NONCLIENTMETRICSW, lfMessageFont, 92) TEST_FIELD_ALIGN (NONCLIENTMETRICSW, lfMessageFont, 4) TEST_FIELD_OFFSET(NONCLIENTMETRICSW, lfMessageFont, 408) + TEST_FIELD_SIZE (NONCLIENTMETRICSW, iPaddedBorderWidth, 4) + TEST_FIELD_ALIGN (NONCLIENTMETRICSW, iPaddedBorderWidth, 4) + TEST_FIELD_OFFSET(NONCLIENTMETRICSW, iPaddedBorderWidth, 500) } static void test_pack_PAINTSTRUCT(void) @@ -6368,7 +6381,7 @@ static void test_pack_PNONCLIENTMETRICSA(void) /* PNONCLIENTMETRICSA */ TEST_TYPE_SIZE (PNONCLIENTMETRICSA, 4) TEST_TYPE_ALIGN (PNONCLIENTMETRICSA, 4) - TEST_TARGET_SIZE (PNONCLIENTMETRICSA, 340) + TEST_TARGET_SIZE (PNONCLIENTMETRICSA, 344) TEST_TARGET_ALIGN(PNONCLIENTMETRICSA, 4) } @@ -6377,7 +6390,7 @@ static void test_pack_PNONCLIENTMETRICSW(void) /* PNONCLIENTMETRICSW */ TEST_TYPE_SIZE (PNONCLIENTMETRICSW, 4) TEST_TYPE_ALIGN (PNONCLIENTMETRICSW, 4) - TEST_TARGET_SIZE (PNONCLIENTMETRICSW, 500) + TEST_TARGET_SIZE (PNONCLIENTMETRICSW, 504) TEST_TARGET_ALIGN(PNONCLIENTMETRICSW, 4) } diff --git a/rostests/winetests/user32/input.c b/rostests/winetests/user32/input.c index 60904afa24d..72855afc395 100755 --- a/rostests/winetests/user32/input.c +++ b/rostests/winetests/user32/input.c @@ -1540,7 +1540,7 @@ static void test_key_map(void) static void test_ToUnicode(void) { - WCHAR wStr[2]; + WCHAR wStr[4]; BYTE state[256]; const BYTE SC_RETURN = 0x1c, SC_TAB = 0x0f; const BYTE HIGHEST_BIT = 0x80; @@ -1548,8 +1548,9 @@ static void test_ToUnicode(void) for(i=0; i<256; i++) state[i]=0; + wStr[1] = 0xAA; SetLastError(0xdeadbeef); - ret = ToUnicode(VK_RETURN, SC_RETURN, state, wStr, 2, 0); + ret = ToUnicode(VK_RETURN, SC_RETURN, state, wStr, 4, 0); if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { win_skip("ToUnicode is not implemented\n"); @@ -1558,7 +1559,11 @@ static void test_ToUnicode(void) ok(ret == 1, "ToUnicode for Return key didn't return 1 (was %i)\n", ret); if(ret == 1) + { ok(wStr[0]=='\r', "ToUnicode for CTRL + Return was %i (expected 13)\n", wStr[0]); + ok(wStr[1]==0 || broken(wStr[1]!=0) /* nt4 */, + "ToUnicode didn't null-terminate the buffer when there was room.\n"); + } state[VK_CONTROL] |= HIGHEST_BIT; state[VK_LCONTROL] |= HIGHEST_BIT; diff --git a/rostests/winetests/user32/msg.c b/rostests/winetests/user32/msg.c index 2e11d8e7fa2..5d88b001b0d 100755 --- a/rostests/winetests/user32/msg.c +++ b/rostests/winetests/user32/msg.c @@ -8134,12 +8134,6 @@ static VOID CALLBACK tfunc(HWND hwnd, UINT uMsg, UINT_PTR id, DWORD dwTime) { } -static VOID CALLBACK tfunc_crash(HWND hwnd, UINT uMsg, UINT_PTR id, DWORD dwTime) -{ - /* Crash on purpose */ - *(volatile int *)0 = 2; -} - #define TIMER_ID 0x19 static DWORD WINAPI timer_thread_proc(LPVOID x) @@ -8161,7 +8155,6 @@ static void test_timers(void) { struct timer_info info; DWORD id; - MSG msg; info.hWnd = CreateWindow ("TestWindowClass", NULL, WS_OVERLAPPEDWINDOW , @@ -8184,26 +8177,6 @@ static void test_timers(void) ok( KillTimer(info.hWnd, TIMER_ID), "KillTimer failed\n"); ok(DestroyWindow(info.hWnd), "failed to destroy window\n"); - - /* Test timer callback with crash */ - SetLastError(0xdeadbeef); - info.hWnd = CreateWindowW(testWindowClassW, NULL, - WS_OVERLAPPEDWINDOW , - CW_USEDEFAULT, CW_USEDEFAULT, 300, 300, 0, - NULL, NULL, 0); - if ((!info.hWnd && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) || /* Win9x/Me */ - (!pGetMenuInfo)) /* Win95/NT4 */ - { - win_skip("Test would crash on Win9x/WinMe/NT4\n"); - DestroyWindow(info.hWnd); - return; - } - info.id = SetTimer(info.hWnd, TIMER_ID, 0, tfunc_crash); - ok(info.id, "SetTimer failed\n"); - Sleep(150); - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); - - ok(DestroyWindow(info.hWnd), "failed to destroy window\n"); } static int count = 0; @@ -9516,8 +9489,8 @@ static DWORD CALLBACK send_msg_thread_2(void *param) case WAIT_OBJECT_0 + EV_SENDMSG: trace("thread: sending message\n"); - ok( SendNotifyMessageA(info->hwnd, WM_USER, 0, 0), - "SendNotifyMessageA failed error %u\n", GetLastError()); + ret = SendNotifyMessageA(info->hwnd, WM_USER, 0, 0); + ok(ret, "SendNotifyMessageA failed error %u\n", GetLastError()); SetEvent(info->hevent[EV_ACK]); break; @@ -11236,7 +11209,7 @@ static void test_dialog_messages(void) cls.lpszClassName = "MyDialogClass"; cls.hInstance = GetModuleHandle(0); /* need a cast since a dlgproc is used as a wndproc */ - cls.lpfnWndProc = (WNDPROC)test_dlg_proc; + cls.lpfnWndProc = test_dlg_proc; if (!RegisterClass(&cls)) assert(0); hdlg = CreateDialogParam(0, "CLASS_TEST_DIALOG_2", 0, test_dlg_proc, 0); @@ -11256,6 +11229,52 @@ static void test_dialog_messages(void) UnregisterClass(cls.lpszClassName, cls.hInstance); } +static void test_EndDialog(void) +{ + HWND hparent, hother, hactive, hdlg; + WNDCLASS cls; + + hparent = CreateWindowExA(0, "TestParentClass", "Test parent", + WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_DISABLED, + 100, 100, 200, 200, 0, 0, 0, NULL); + ok (hparent != 0, "Failed to create parent window\n"); + + hother = CreateWindowExA(0, "TestParentClass", "Test parent 2", + WS_OVERLAPPEDWINDOW | WS_VISIBLE, + 100, 100, 200, 200, 0, 0, 0, NULL); + ok (hother != 0, "Failed to create parent window\n"); + + ok(GetClassInfo(0, "#32770", &cls), "GetClassInfo failed\n"); + cls.lpszClassName = "MyDialogClass"; + cls.hInstance = GetModuleHandle(0); + /* need a cast since a dlgproc is used as a wndproc */ + cls.lpfnWndProc = (WNDPROC)test_dlg_proc; + if (!RegisterClass(&cls)) assert(0); + + flush_sequence(); + SetForegroundWindow(hother); + hactive = GetForegroundWindow(); + ok(hother == hactive, "Wrong window has focus (%p != %p)\n", hother, hactive); + + /* create a dialog where the parent is disabled, this parent should still + receive the focus when the dialog exits (even though "normally" a + disabled window should not receive the focus) */ + hdlg = CreateDialogParam(0, "CLASS_TEST_DIALOG_2", hparent, test_dlg_proc, 0); + ok(IsWindow(hdlg), "CreateDialogParam failed\n"); + SetForegroundWindow(hdlg); + hactive = GetForegroundWindow(); + ok(hdlg == hactive, "Wrong window has focus (%p != %p)\n", hdlg, hactive); + EndDialog(hdlg, 0); + hactive = GetForegroundWindow(); + ok(hparent == hactive, "Wrong window has focus (parent != active) (active: %p, parent: %p, dlg: %p, other: %p)\n", hactive, hparent, hdlg, hother); + DestroyWindow(hdlg); + flush_sequence(); + + DestroyWindow( hother ); + DestroyWindow( hparent ); + UnregisterClass(cls.lpszClassName, cls.hInstance); +} + static void test_nullCallback(void) { HWND hwnd; @@ -13024,6 +13043,7 @@ static void test_keyflags(void) test_window = CreateWindowEx(0, "TestWindowClass", NULL, WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 200, 200, 0, 0, 0, NULL); + flush_events(); flush_sequence(); /* keyup without a keydown */ @@ -13470,6 +13490,234 @@ end: flush_sequence(); } + +static const struct message WmSetFocus_1[] = { + { HCBT_SETFOCUS, hook }, /* child */ + { HCBT_ACTIVATE, hook }, /* parent */ + { WM_QUERYNEWPALETTE, sent|wparam|lparam|parent|optional, 0, 0 }, + { WM_WINDOWPOSCHANGING, sent|parent, 0, SWP_NOSIZE|SWP_NOMOVE }, + { WM_ACTIVATEAPP, sent|wparam|parent, 1 }, + { WM_NCACTIVATE, sent|parent }, + { WM_GETTEXT, sent|defwinproc|parent|optional }, + { WM_GETTEXT, sent|defwinproc|parent|optional }, + { WM_ACTIVATE, sent|wparam|parent, 1 }, + { HCBT_SETFOCUS, hook }, /* parent */ + { WM_SETFOCUS, sent|defwinproc|parent }, + { WM_KILLFOCUS, sent|parent }, + { WM_SETFOCUS, sent }, + { 0 } +}; +static const struct message WmSetFocus_2[] = { + { HCBT_SETFOCUS, hook }, /* parent */ + { WM_KILLFOCUS, sent }, + { WM_SETFOCUS, sent|parent }, + { 0 } +}; +static const struct message WmSetFocus_3[] = { + { HCBT_SETFOCUS, hook }, /* child */ + { 0 } +}; +static const struct message WmSetFocus_4[] = { + { 0 } +}; + +static void test_SetFocus(void) +{ + HWND parent, old_parent, child, old_focus, old_active; + MSG msg; + struct wnd_event wnd_event; + HANDLE hthread; + DWORD ret, tid; + + wnd_event.start_event = CreateEvent(NULL, 0, 0, NULL); + ok(wnd_event.start_event != 0, "CreateEvent error %d\n", GetLastError()); + hthread = CreateThread(NULL, 0, thread_proc, &wnd_event, 0, &tid); + ok(hthread != 0, "CreateThread error %d\n", GetLastError()); + ret = WaitForSingleObject(wnd_event.start_event, INFINITE); + ok(ret == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(wnd_event.start_event); + + parent = CreateWindowEx(0, "TestParentClass", NULL, WS_OVERLAPPEDWINDOW, + 0, 0, 0, 0, 0, 0, 0, NULL); + ok(parent != 0, "failed to create parent window\n"); + child = CreateWindowEx(0, "TestWindowClass", NULL, WS_CHILD, + 0, 0, 0, 0, parent, 0, 0, NULL); + ok(child != 0, "failed to create child window\n"); + + trace("parent %p, child %p, thread window %p\n", parent, child, wnd_event.hwnd); + + SetFocus(0); + SetActiveWindow(0); + + flush_events(); + flush_sequence(); + + ok(GetActiveWindow() == 0, "expected active 0, got %p\n", GetActiveWindow()); + ok(GetFocus() == 0, "expected focus 0, got %p\n", GetFocus()); + + log_all_parent_messages++; + + old_focus = SetFocus(child); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok_sequence(WmSetFocus_1, "SetFocus on a child window", TRUE); + ok(old_focus == parent, "expected old focus %p, got %p\n", parent, old_focus); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == child, "expected focus %p, got %p\n", child, GetFocus()); + + old_focus = SetFocus(parent); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok_sequence(WmSetFocus_2, "SetFocus on a parent window", FALSE); + ok(old_focus == child, "expected old focus %p, got %p\n", child, old_focus); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + SetLastError(0xdeadbeef); + old_focus = SetFocus((HWND)0xdeadbeef); + ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE || broken(GetLastError() == 0xdeadbeef), + "expected ERROR_INVALID_WINDOW_HANDLE, got %d\n", GetLastError()); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok_sequence(WmEmptySeq, "SetFocus on an invalid window", FALSE); + ok(old_focus == 0, "expected old focus 0, got %p\n", old_focus); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + SetLastError(0xdeadbeef); + old_focus = SetFocus(GetDesktopWindow()); + ok(GetLastError() == ERROR_ACCESS_DENIED /* Vista+ */ || + broken(GetLastError() == 0xdeadbeef), "expected ERROR_ACCESS_DENIED, got %d\n", GetLastError()); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok_sequence(WmEmptySeq, "SetFocus on a desktop window", TRUE); + ok(old_focus == 0, "expected old focus 0, got %p\n", old_focus); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + SetLastError(0xdeadbeef); + old_focus = SetFocus(wnd_event.hwnd); + ok(GetLastError() == ERROR_ACCESS_DENIED /* Vista+ */ || + broken(GetLastError() == 0xdeadbeef), "expected ERROR_ACCESS_DENIED, got %d\n", GetLastError()); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok_sequence(WmEmptySeq, "SetFocus on another thread window", TRUE); + ok(old_focus == 0, "expected old focus 0, got %p\n", old_focus); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + SetLastError(0xdeadbeef); + old_active = SetActiveWindow((HWND)0xdeadbeef); + ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE || broken(GetLastError() == 0xdeadbeef), + "expected ERROR_INVALID_WINDOW_HANDLE, got %d\n", GetLastError()); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok_sequence(WmEmptySeq, "SetActiveWindow on an invalid window", FALSE); + ok(old_active == 0, "expected old focus 0, got %p\n", old_active); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + SetLastError(0xdeadbeef); + old_active = SetActiveWindow(GetDesktopWindow()); +todo_wine + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok_sequence(WmEmptySeq, "SetActiveWindow on a desktop window", TRUE); + ok(old_active == 0, "expected old focus 0, got %p\n", old_focus); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + SetLastError(0xdeadbeef); + old_active = SetActiveWindow(wnd_event.hwnd); +todo_wine + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok_sequence(WmEmptySeq, "SetActiveWindow on another thread window", TRUE); + ok(old_active == 0, "expected old focus 0, got %p\n", old_active); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + SetLastError(0xdeadbeef); + ret = AttachThreadInput(GetCurrentThreadId(), tid, TRUE); + ok(ret, "AttachThreadInput error %d\n", GetLastError()); + +todo_wine { + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); +} + flush_events(); + flush_sequence(); + + old_focus = SetFocus(wnd_event.hwnd); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok(old_focus == wnd_event.hwnd, "expected old focus %p, got %p\n", wnd_event.hwnd, old_focus); + ok(GetActiveWindow() == wnd_event.hwnd, "expected active %p, got %p\n", wnd_event.hwnd, GetActiveWindow()); + ok(GetFocus() == wnd_event.hwnd, "expected focus %p, got %p\n", wnd_event.hwnd, GetFocus()); + + old_focus = SetFocus(parent); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok(old_focus == parent, "expected old focus %p, got %p\n", parent, old_focus); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + flush_events(); + flush_sequence(); + + old_active = SetActiveWindow(wnd_event.hwnd); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok(old_active == parent, "expected old focus %p, got %p\n", parent, old_active); + ok(GetActiveWindow() == wnd_event.hwnd, "expected active %p, got %p\n", wnd_event.hwnd, GetActiveWindow()); + ok(GetFocus() == wnd_event.hwnd, "expected focus %p, got %p\n", wnd_event.hwnd, GetFocus()); + + SetLastError(0xdeadbeef); + ret = AttachThreadInput(GetCurrentThreadId(), tid, FALSE); + ok(ret, "AttachThreadInput error %d\n", GetLastError()); + + ok(GetActiveWindow() == 0, "expected active 0, got %p\n", GetActiveWindow()); + ok(GetFocus() == 0, "expected focus 0, got %p\n", GetFocus()); + + old_parent = SetParent(child, GetDesktopWindow()); + ok(old_parent == parent, "expected old parent %p, got %p\n", parent, old_parent); + + ok(GetActiveWindow() == 0, "expected active 0, got %p\n", GetActiveWindow()); + ok(GetFocus() == 0, "expected focus 0, got %p\n", GetFocus()); + + old_focus = SetFocus(parent); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok(old_focus == parent, "expected old focus %p, got %p\n", parent, old_focus); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + flush_events(); + flush_sequence(); + + SetLastError(0xdeadbeef); + old_focus = SetFocus(child); +todo_wine + ok(GetLastError() == ERROR_INVALID_PARAMETER /* Vista+ */ || + broken(GetLastError() == 0) /* XP */ || + broken(GetLastError() == 0xdeadbeef), "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok_sequence(WmSetFocus_3, "SetFocus on a child window", TRUE); + ok(old_focus == 0, "expected old focus 0, got %p\n", old_focus); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + SetLastError(0xdeadbeef); + old_active = SetActiveWindow(child); + ok(GetLastError() == 0xdeadbeef, "expected 0xdeadbeef, got %d\n", GetLastError()); + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); + ok_sequence(WmEmptySeq, "SetActiveWindow on a child window", FALSE); + ok(old_active == parent, "expected old active %p, got %p\n", parent, old_active); + ok(GetActiveWindow() == parent, "expected active %p, got %p\n", parent, GetActiveWindow()); + ok(GetFocus() == parent, "expected focus %p, got %p\n", parent, GetFocus()); + + log_all_parent_messages--; + + DestroyWindow(child); + DestroyWindow(parent); + + ret = PostMessage(wnd_event.hwnd, WM_QUIT, 0, 0); + ok(ret, "PostMessage(WM_QUIT) error %d\n", GetLastError()); + ret = WaitForSingleObject(hthread, INFINITE); + ok(ret == WAIT_OBJECT_0, "WaitForSingleObject failed\n"); + CloseHandle(hthread); +} + START_TEST(msg) { char **test_argv; @@ -13533,6 +13781,7 @@ START_TEST(msg) hEvent_hook = 0; #endif + test_SetFocus(); test_SetParent(); test_PostMessage(); test_ShowWindow(); @@ -13572,6 +13821,7 @@ START_TEST(msg) test_SetWindowRgn(); test_sys_menu(); test_dialog_messages(); + test_EndDialog(); test_nullCallback(); test_dbcs_wm_char(); test_menu_messages(); diff --git a/rostests/winetests/user32/resource.c b/rostests/winetests/user32/resource.c index 5bc2d7a34d0..dd4342de7df 100755 --- a/rostests/winetests/user32/resource.c +++ b/rostests/winetests/user32/resource.c @@ -90,7 +90,7 @@ static void test_LoadStringA (void) {sizeof str, sizeof str - 1}, {sizeof str - 1, sizeof str - 2}}; unsigned int i; - int ret; + int ret, ret2; assert (sizeof str < sizeof buf); for (i = 0; i < sizeof tests / sizeof tests[0]; i++) { @@ -110,17 +110,17 @@ static void test_LoadStringA (void) ret = LoadStringA(hInst, 1, buf, sizeof(buf) ); ok( ret > 0, "LoadString failed: ret %d err %d\n", ret, GetLastError()); - ok( LoadStringA( hInst, MAKELONG( 1, 0x8000 ), buf, sizeof(buf)) == ret, - "LoadString failed: ret %d err %d\n", ret, GetLastError()); - ok( LoadStringA( hInst, MAKELONG( 1, 0xffff ), buf, sizeof(buf)) == ret, - "LoadString failed: ret %d err %d\n", ret, GetLastError()); + ret2 = LoadStringA( hInst, MAKELONG( 1, 0x8000 ), buf, sizeof(buf)); + ok( ret2 == ret, "LoadString failed: ret %d err %d\n", ret, GetLastError()); + ret2 = LoadStringA( hInst, MAKELONG( 1, 0xffff ), buf, sizeof(buf)); + ok( ret2 == ret, "LoadString failed: ret %d err %d\n", ret, GetLastError()); ret = LoadStringA(hInst, 65534, buf, sizeof(buf) ); ok( ret > 0, "LoadString failed: ret %d err %d\n", ret, GetLastError()); - ok( LoadStringA( hInst, MAKELONG( 65534, 0x8000 ), buf, sizeof(buf)) == ret, - "LoadString failed: ret %d err %d\n", ret, GetLastError()); - ok( LoadStringA( hInst, MAKELONG( 65534, 0xffff ), buf, sizeof(buf)) == ret, - "LoadString failed: ret %d err %d\n", ret, GetLastError()); + ret2 = LoadStringA( hInst, MAKELONG( 65534, 0x8000 ), buf, sizeof(buf)); + ok( ret2 == ret, "LoadString failed: ret %d err %d\n", ret, GetLastError()); + ret2 = LoadStringA( hInst, MAKELONG( 65534, 0xffff ), buf, sizeof(buf)); + ok( ret2 == ret, "LoadString failed: ret %d err %d\n", ret, GetLastError()); ret = LoadStringA(hInst, 0, buf, 0); ok( ret == -1 || broken(ret == 0), diff --git a/rostests/winetests/user32/resource.rc b/rostests/winetests/user32/resource.rc index 43417100f08..be4703843f9 100755 --- a/rostests/winetests/user32/resource.rc +++ b/rostests/winetests/user32/resource.rc @@ -45,6 +45,16 @@ STRINGTABLE 65534 "Test high id" } +/* Test dialog with a mixed style WS_CHILD | WS_POPUP control */ +TEST_DLG_CHILD_POPUP DIALOG 0, 0, 60, 30 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Test dialog with mixed style controls" +FONT 8, "MS Shell Dlg" +{ + CONTROL "bump7",7,"static",WS_CHILD|WS_POPUP|WS_BORDER,0,0,40,10,WS_EX_TRANSPARENT + CONTROL "bump8",8,"static",WS_POPUP,0,10,40,10,WS_EX_TRANSPARENT +} + TEST_DIALOG DIALOG 0, 0, 60, 30 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "Test dialog" @@ -89,6 +99,14 @@ FONT 8, "MS Shell Dlg" EDITTEXT 200,4,4,50,14 } +FOCUS_TEST_DIALOG_2 DIALOG 0, 0, 60, 30 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Test dialog" +FONT 8, "MS Shell Dlg" +{ + LTEXT "Hello world", 200,4,4,50,14 +} + IDD_DIALOG DIALOG 0, 0, 186, 95 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" diff --git a/rostests/winetests/user32/scroll.c b/rostests/winetests/user32/scroll.c index e4bfdb15de5..b0e206f71b8 100644 --- a/rostests/winetests/user32/scroll.c +++ b/rostests/winetests/user32/scroll.c @@ -302,13 +302,10 @@ todo_wine if (bThemeActive || style != WS_HSCROLL) todo_wine ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == ( style | WS_VSCROLL), - "unexpected style change %8lx expected %8lx\n", - (winstyle & (WS_HSCROLL|WS_VSCROLL)), style | WS_VSCROLL); + "unexpected style change %08x/%08x\n", winstyle, style); else - ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == style || - broken((winstyle & (WS_HSCROLL|WS_VSCROLL)) == (WS_HSCROLL|WS_VSCROLL)), /* Win 9x/ME */ - "unexpected style change %8lx expected %8x\n", - (winstyle & (WS_HSCROLL|WS_VSCROLL)), style); + ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == style, + "unexpected style change %08x/%08x\n", winstyle, style); } /* do the test again with H and V reversed. * Start with a clean window */ @@ -341,13 +338,10 @@ todo_wine if (bThemeActive || style != WS_VSCROLL) todo_wine ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == ( style | WS_HSCROLL), - "unexpected style change %8lx expected %8lx\n", - (winstyle & (WS_HSCROLL|WS_VSCROLL)), style | WS_HSCROLL); + "unexpected style change %08x/%08x\n", winstyle, style); else - ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == style || - broken((winstyle & (WS_HSCROLL|WS_VSCROLL)) == (WS_HSCROLL|WS_VSCROLL)), /* Win 9x/ME */ - "unexpected style change %8lx expected %8x\n", - (winstyle & (WS_HSCROLL|WS_VSCROLL)), style); + ok( (winstyle & (WS_HSCROLL|WS_VSCROLL)) == style, + "unexpected style change %08x/%08x\n", winstyle, style); } /* Slightly change the test to use SetScrollInfo * Start with a clean window */ diff --git a/rostests/winetests/user32/static.c b/rostests/winetests/user32/static.c index 62089bd46c2..13955aa4cb7 100644 --- a/rostests/winetests/user32/static.c +++ b/rostests/winetests/user32/static.c @@ -17,7 +17,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include #include #include diff --git a/rostests/winetests/user32/sysparams.c b/rostests/winetests/user32/sysparams.c index 1de3da0300f..f3e98b61db8 100755 --- a/rostests/winetests/user32/sysparams.c +++ b/rostests/winetests/user32/sysparams.c @@ -25,6 +25,8 @@ #undef _WIN32_WINNT #define _WIN32_WINNT 0x0600 /* For SPI_GETMOUSEHOVERWIDTH and more */ //#define _WIN32_IE 0x0700 +#undef WINVER +#define WINVER 0x0600 /* For COLOR_MENUBAR, NONCLIENTMETRICS with padding */ #include "wine/test.h" #include "windef.h" @@ -682,7 +684,7 @@ static BOOL test_setborder(UINT curr_val, int usesetborder, int dpi) INT frame; NONCLIENTMETRICSA ncm; - ncm.cbSize = sizeof( ncm); + ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth); rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,GetLastError()); if( usesetborder) { @@ -727,11 +729,11 @@ static void test_SPI_SETBORDER( void ) /* 6 */ { BOOL rc; UINT old_border; - NONCLIENTMETRICSA ncmsave; + NONCLIENTMETRICS ncmsave; INT CaptionWidth, PaddedBorderWidth; - ncmsave.cbSize = sizeof( ncmsave); + ncmsave.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth); rc=SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncmsave, 0); if( !rc) { win_skip("SPI_GETNONCLIENTMETRICS is not available\n"); @@ -1415,10 +1417,10 @@ static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */ NONCLIENTMETRICSA Ncmcur; NONCLIENTMETRICSA Ncmstart; - Ncmorig.cbSize = sizeof(NONCLIENTMETRICSA); - Ncmnew.cbSize = sizeof(NONCLIENTMETRICSA); - Ncmcur.cbSize = sizeof(NONCLIENTMETRICSA); - Ncmstart.cbSize = sizeof(NONCLIENTMETRICSA); + Ncmorig.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth); + Ncmnew.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth); + Ncmcur.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth); + Ncmstart.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth); trace("testing SPI_{GET,SET}NONCLIENTMETRICS\n"); change_counter = 0; @@ -2574,8 +2576,28 @@ static void test_GetSystemMetrics( void) NONCLIENTMETRICS ncm; SIZE screen; + assert(sizeof(ncm) == 344); + + ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth); + rc = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); + ok(rc, "SystemParametersInfoA failed\n"); + + ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth) - 1; + rc = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); + ok(!rc, "SystemParametersInfoA should fail\n"); + + ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth) + 1; + SetLastError(0xdeadbeef); + rc = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); + ok(!rc, "SystemParametersInfoA should fail\n"); + + ncm.cbSize = sizeof(ncm); /* Vista added padding */ + SetLastError(0xdeadbeef); + rc = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); + ok(rc || broken(!rc) /* before Vista */, "SystemParametersInfoA failed\n"); + minim.cbSize = sizeof( minim); - ncm.cbSize = sizeof( ncm); + ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICS, iPaddedBorderWidth); SystemParametersInfo( SPI_GETMINIMIZEDMETRICS, 0, &minim, 0); rc = SystemParametersInfo( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0); if( !rc) { diff --git a/rostests/winetests/user32/win.c b/rostests/winetests/user32/win.c index 365f6ef3f40..644be213653 100644 --- a/rostests/winetests/user32/win.c +++ b/rostests/winetests/user32/win.c @@ -2513,7 +2513,7 @@ static LRESULT WINAPI set_focus_on_activate_proc(HWND hwnd, UINT msg, WPARAM wp, static void test_SetFocus(HWND hwnd) { - HWND child, child2; + HWND child, child2, ret; WNDPROC old_wnd_proc; /* check if we can set focus to non-visible windows */ @@ -2588,9 +2588,32 @@ todo_wine ok( GetActiveWindow() == hwnd, "parent window %p should be active\n", hwnd); todo_wine ok( GetFocus() == child, "Focus should be on child %p, not %p\n", child, GetFocus() ); - SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)old_wnd_proc); + SetFocus( hwnd ); + SetParent( child, GetDesktopWindow()); + SetParent( child2, child ); + ok( GetActiveWindow() == hwnd, "parent window %p should be active\n", hwnd); + ok( GetFocus() == hwnd, "Focus should be on parent %p\n", hwnd ); + ret = SetFocus( child2 ); + ok( ret == 0, "SetFocus %p should fail\n", child2); + ok( GetActiveWindow() == hwnd, "parent window %p should be active\n", hwnd); + ok( GetFocus() == hwnd, "Focus should be on parent %p\n", hwnd ); + ret = SetFocus( child ); + ok( ret == 0, "SetFocus %p should fail\n", child); + ok( GetActiveWindow() == hwnd, "parent window %p should be active\n", hwnd); + ok( GetFocus() == hwnd, "Focus should be on parent %p\n", hwnd ); + SetWindowLongW( child, GWL_STYLE, WS_POPUP|WS_CHILD ); + SetFocus( child2 ); + ok( GetActiveWindow() == child, "child window %p should be active\n", child); + ok( GetFocus() == child2, "Focus should be on child2 %p\n", child2 ); + SetFocus( hwnd ); + ok( GetActiveWindow() == hwnd, "parent window %p should be active\n", hwnd); + ok( GetFocus() == hwnd, "Focus should be on parent %p\n", hwnd ); + SetFocus( child ); + ok( GetActiveWindow() == child, "child window %p should be active\n", child); + ok( GetFocus() == child, "Focus should be on child %p\n", child ); + DestroyWindow( child2 ); DestroyWindow( child ); } @@ -3642,7 +3665,7 @@ static LRESULT WINAPI StyleCheckProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM ok(!(lpcs->dwExStyle & WS_EX_WINDOWEDGE), "Window shouldn't have WS_EX_WINDOWEDGE style\n"); ok((lpss->styleOld & ~WS_EX_WINDOWEDGE) == (lpcs->dwExStyle & ~WS_EX_WINDOWEDGE), - "Ex style (0x%08lx) should match what the caller passed to CreateWindowEx (0x%08lx)\n", + "Ex style (0x%08x) should match what the caller passed to CreateWindowEx (0x%08x)\n", (lpss->styleOld & ~WS_EX_WINDOWEDGE), (lpcs->dwExStyle & ~WS_EX_WINDOWEDGE)); ok(lpss->styleNew == lpcs->style, @@ -3673,6 +3696,7 @@ static void register_style_check_class(void) }; atomStyleCheckClass = RegisterClass(&wc); + assert(atomStyleCheckClass); } static void check_window_style(DWORD dwStyleIn, DWORD dwExStyleIn, DWORD dwStyleOut, DWORD dwExStyleOut) @@ -3700,28 +3724,42 @@ static void check_window_style(DWORD dwStyleIn, DWORD dwExStyleIn, DWORD dwStyle dwActualStyle = GetWindowLong(hwnd, GWL_STYLE); dwActualExStyle = GetWindowLong(hwnd, GWL_EXSTYLE); - ok((dwActualStyle == dwStyleOut) && (dwActualExStyle == dwExStyleOut), - "Style (0x%08x) should really be 0x%08x and/or Ex style (0x%08x) should really be 0x%08x\n", - dwActualStyle, dwStyleOut, dwActualExStyle, dwExStyleOut); + ok(dwActualStyle == dwStyleOut, "expected style %#x, got %#x\n", dwStyleOut, dwActualStyle); + ok(dwActualExStyle == dwExStyleOut, "expected ex_style %#x, got %#x\n", dwExStyleOut, dwActualExStyle); /* try setting the styles explicitly */ SetWindowLong( hwnd, GWL_EXSTYLE, dwExStyleIn ); + dwActualStyle = GetWindowLong(hwnd, GWL_STYLE); + dwActualExStyle = GetWindowLong(hwnd, GWL_EXSTYLE); + /* WS_EX_WINDOWEDGE can't always be changed */ + if (dwExStyleIn & WS_EX_DLGMODALFRAME) + dwExStyleOut = dwExStyleIn | WS_EX_WINDOWEDGE; + else if ((dwActualStyle & (WS_DLGFRAME | WS_THICKFRAME)) && !(dwExStyleIn & WS_EX_STATICEDGE)) + dwExStyleOut = dwExStyleIn | WS_EX_WINDOWEDGE; + else + dwExStyleOut = dwExStyleIn & ~WS_EX_WINDOWEDGE; + ok(dwActualStyle == dwStyleOut, "expected style %#x, got %#x\n", dwStyleOut, dwActualStyle); + ok(dwActualExStyle == dwExStyleOut, "expected ex_style %#x, got %#x\n", dwExStyleOut, dwActualExStyle); + SetWindowLong( hwnd, GWL_STYLE, dwStyleIn ); dwActualStyle = GetWindowLong(hwnd, GWL_STYLE); dwActualExStyle = GetWindowLong(hwnd, GWL_EXSTYLE); /* WS_CLIPSIBLINGS can't be reset on top-level windows */ - if (dwStyleIn & WS_CHILD) dwStyleOut = dwStyleIn; + if ((dwStyleIn & (WS_CHILD|WS_POPUP)) == WS_CHILD) dwStyleOut = dwStyleIn; else dwStyleOut = dwStyleIn | WS_CLIPSIBLINGS; /* WS_EX_WINDOWEDGE can't always be changed */ - if ((dwExStyleIn & WS_EX_DLGMODALFRAME) || (dwStyleIn & WS_THICKFRAME)) + if (dwExStyleIn & WS_EX_DLGMODALFRAME) + dwExStyleOut = dwExStyleIn | WS_EX_WINDOWEDGE; + else if ((dwActualStyle & (WS_DLGFRAME | WS_THICKFRAME)) && !(dwExStyleIn & WS_EX_STATICEDGE)) dwExStyleOut = dwExStyleIn | WS_EX_WINDOWEDGE; - else if (dwStyleIn & (WS_CHILD | WS_POPUP)) - dwExStyleOut = dwExStyleIn & ~WS_EX_WINDOWEDGE; else - dwExStyleOut = dwExStyleIn; - ok((dwActualStyle == dwStyleOut) && (dwActualExStyle == dwExStyleOut), - "%08x/%08x: Style (0x%08x) should really be 0x%08x and/or Ex style (0x%08x) should really be 0x%08x\n", - dwStyleIn, dwExStyleIn, dwActualStyle, dwStyleOut, dwActualExStyle, dwExStyleOut); + dwExStyleOut = dwExStyleIn & ~WS_EX_WINDOWEDGE; + ok(dwActualStyle == dwStyleOut, "expected style %#x, got %#x\n", dwStyleOut, dwActualStyle); + /* FIXME: Remove the condition below once Wine is fixed */ + if (dwActualExStyle != dwExStyleOut) + todo_wine ok(dwActualExStyle == dwExStyleOut, "expected ex_style %#x, got %#x\n", dwExStyleOut, dwActualExStyle); + else + ok(dwActualExStyle == dwExStyleOut, "expected ex_style %#x, got %#x\n", dwExStyleOut, dwActualExStyle); DestroyWindow(hwnd); if (hwndParent) DestroyWindow(hwndParent); @@ -3733,14 +3771,36 @@ static void test_window_styles(void) register_style_check_class(); check_window_style(0, 0, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE); + check_window_style(WS_DLGFRAME, 0, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE); + check_window_style(WS_THICKFRAME, 0, WS_THICKFRAME|WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE); + check_window_style(WS_DLGFRAME, WS_EX_STATICEDGE, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_STATICEDGE); + check_window_style(WS_THICKFRAME, WS_EX_STATICEDGE, WS_THICKFRAME|WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_STATICEDGE); check_window_style(WS_OVERLAPPEDWINDOW, 0, WS_CLIPSIBLINGS|WS_OVERLAPPEDWINDOW, WS_EX_WINDOWEDGE); check_window_style(WS_CHILD, 0, WS_CHILD, 0); + check_window_style(WS_CHILD|WS_DLGFRAME, 0, WS_CHILD|WS_DLGFRAME, WS_EX_WINDOWEDGE); + check_window_style(WS_CHILD|WS_THICKFRAME, 0, WS_CHILD|WS_THICKFRAME, WS_EX_WINDOWEDGE); + check_window_style(WS_CHILD|WS_DLGFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_DLGFRAME, WS_EX_STATICEDGE); + check_window_style(WS_CHILD|WS_THICKFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_THICKFRAME, WS_EX_STATICEDGE); + check_window_style(WS_CHILD|WS_CAPTION, 0, WS_CHILD|WS_CAPTION, WS_EX_WINDOWEDGE); + check_window_style(WS_CHILD|WS_CAPTION|WS_SYSMENU, 0, WS_CHILD|WS_CAPTION|WS_SYSMENU, WS_EX_WINDOWEDGE); + check_window_style(WS_CHILD, WS_EX_WINDOWEDGE, WS_CHILD, 0); + check_window_style(WS_CHILD, WS_EX_DLGMODALFRAME, WS_CHILD, WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME); + check_window_style(WS_CHILD, WS_EX_DLGMODALFRAME|WS_EX_STATICEDGE, WS_CHILD, WS_EX_STATICEDGE|WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME); + check_window_style(WS_CHILD|WS_POPUP, 0, WS_CHILD|WS_POPUP|WS_CLIPSIBLINGS, 0); + check_window_style(WS_CHILD|WS_POPUP|WS_DLGFRAME, 0, WS_CHILD|WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE); + check_window_style(WS_CHILD|WS_POPUP|WS_THICKFRAME, 0, WS_CHILD|WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE); + check_window_style(WS_CHILD|WS_POPUP|WS_DLGFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE); + check_window_style(WS_CHILD|WS_POPUP|WS_THICKFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE); + check_window_style(WS_CHILD|WS_POPUP, WS_EX_APPWINDOW, WS_CHILD|WS_POPUP|WS_CLIPSIBLINGS, WS_EX_APPWINDOW); + check_window_style(WS_CHILD|WS_POPUP, WS_EX_WINDOWEDGE, WS_CHILD|WS_POPUP|WS_CLIPSIBLINGS, 0); check_window_style(WS_CHILD, WS_EX_WINDOWEDGE, WS_CHILD, 0); check_window_style(0, WS_EX_TOOLWINDOW, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW); check_window_style(WS_POPUP, 0, WS_POPUP|WS_CLIPSIBLINGS, 0); check_window_style(WS_POPUP, WS_EX_WINDOWEDGE, WS_POPUP|WS_CLIPSIBLINGS, 0); - check_window_style(WS_CHILD, WS_EX_DLGMODALFRAME, WS_CHILD, WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME); - check_window_style(WS_CHILD, WS_EX_DLGMODALFRAME|WS_EX_STATICEDGE, WS_CHILD, WS_EX_STATICEDGE|WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME); + check_window_style(WS_POPUP|WS_DLGFRAME, 0, WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE); + check_window_style(WS_POPUP|WS_THICKFRAME, 0, WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE); + check_window_style(WS_POPUP|WS_DLGFRAME, WS_EX_STATICEDGE, WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE); + check_window_style(WS_POPUP|WS_THICKFRAME, WS_EX_STATICEDGE, WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE); check_window_style(WS_CAPTION, WS_EX_STATICEDGE, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_STATICEDGE|WS_EX_WINDOWEDGE); check_window_style(0, WS_EX_APPWINDOW, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_APPWINDOW|WS_EX_WINDOWEDGE); @@ -3753,6 +3813,175 @@ static void test_window_styles(void) } } +static INT_PTR WINAPI empty_dlg_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + return 0; +} + +static void check_dialog_style(DWORD style_in, DWORD ex_style_in, DWORD style_out, DWORD ex_style_out) +{ + struct + { + DLGTEMPLATE dt; + WORD menu_name; + WORD class_id; + WORD class_atom; + WCHAR caption[1]; + } dlg_data; + DWORD style, ex_style; + HWND hwnd, parent = 0; + + if (style_in & WS_CHILD) + parent = CreateWindowEx(0, "static", NULL, WS_OVERLAPPEDWINDOW, + 0, 0, 0, 0, NULL, NULL, NULL, NULL); + + dlg_data.dt.style = style_in; + dlg_data.dt.dwExtendedStyle = ex_style_in; + dlg_data.dt.cdit = 0; + dlg_data.dt.x = 0; + dlg_data.dt.y = 0; + dlg_data.dt.cx = 100; + dlg_data.dt.cy = 100; + dlg_data.menu_name = 0; + dlg_data.class_id = 0; + dlg_data.class_atom = 0; + dlg_data.caption[0] = 0; + + hwnd = CreateDialogIndirectParam(GetModuleHandle(0), &dlg_data.dt, parent, empty_dlg_proc, 0); + ok(hwnd != 0, "dialog creation failed, style %#x, exstyle %#x\n", style_in, ex_style_in); + + flush_events( TRUE ); + + style = GetWindowLong(hwnd, GWL_STYLE); + ex_style = GetWindowLong(hwnd, GWL_EXSTYLE); + ok(style == (style_out | DS_3DLOOK), "expected style %#x, got %#x\n", style_out | DS_3DLOOK, style); + ok(ex_style == ex_style_out, "expected ex_style %#x, got %#x\n", ex_style_out, ex_style); + + /* try setting the styles explicitly */ + SetWindowLong(hwnd, GWL_EXSTYLE, ex_style_in); + style = GetWindowLong(hwnd, GWL_STYLE); + ex_style = GetWindowLong(hwnd, GWL_EXSTYLE); + ok(style == (style_out | DS_3DLOOK), "expected style %#x, got %#x\n", style_out|DS_3DLOOK, style); + /* WS_EX_WINDOWEDGE can't always be changed */ + if (ex_style_in & WS_EX_DLGMODALFRAME) + ex_style_out = ex_style_in | WS_EX_WINDOWEDGE; + else if ((style & (WS_DLGFRAME | WS_THICKFRAME)) && !(ex_style_in & WS_EX_STATICEDGE)) + ex_style_out = ex_style_in | WS_EX_WINDOWEDGE; + else + ex_style_out = ex_style_in & ~WS_EX_WINDOWEDGE; + ok(ex_style == ex_style_out, "expected ex_style %#x, got %#x\n", ex_style_out, ex_style); + + SetWindowLong(hwnd, GWL_STYLE, style_in); + style = GetWindowLong(hwnd, GWL_STYLE); + ex_style = GetWindowLong(hwnd, GWL_EXSTYLE); + /* WS_CLIPSIBLINGS can't be reset on top-level windows */ + if ((style_in & (WS_CHILD | WS_POPUP)) == WS_CHILD) style_out = style_in; + else style_out = style_in | WS_CLIPSIBLINGS; + ok(style == style_out, "expected style %#x, got %#x\n", style_out, style); + /* WS_EX_WINDOWEDGE can't always be changed */ + if (ex_style_in & WS_EX_DLGMODALFRAME) + ex_style_out = ex_style_in | WS_EX_WINDOWEDGE; + else if ((style & (WS_DLGFRAME | WS_THICKFRAME)) && !(ex_style_in & WS_EX_STATICEDGE)) + ex_style_out = ex_style_in | WS_EX_WINDOWEDGE; + else + ex_style_out = ex_style_in & ~WS_EX_WINDOWEDGE; + /* FIXME: Remove the condition below once Wine is fixed */ + if (ex_style != ex_style_out) + todo_wine ok(ex_style == ex_style_out, "expected ex_style %#x, got %#x\n", ex_style_out, ex_style); + else + ok(ex_style == ex_style_out, "expected ex_style %#x, got %#x\n", ex_style_out, ex_style); + + DestroyWindow(hwnd); + DestroyWindow(parent); +} + +static void test_dialog_styles(void) +{ + check_dialog_style(0, 0, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_DLGFRAME, 0, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_THICKFRAME, 0, WS_THICKFRAME|WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_DLGFRAME, WS_EX_STATICEDGE, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_STATICEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_THICKFRAME, WS_EX_STATICEDGE, WS_THICKFRAME|WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_STATICEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(DS_CONTROL, 0, WS_CLIPSIBLINGS|WS_CAPTION|DS_CONTROL, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_CAPTION, 0, WS_CAPTION|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_BORDER, 0, WS_CAPTION|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_DLGFRAME, 0, WS_CAPTION|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_BORDER|DS_CONTROL, 0, WS_CAPTION|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_DLGFRAME|DS_CONTROL, 0, WS_CAPTION|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_CAPTION|WS_SYSMENU, 0, WS_CAPTION|WS_SYSMENU|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_SYSMENU, 0, WS_CAPTION|WS_SYSMENU|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_CAPTION|DS_CONTROL, 0, WS_CAPTION|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_SYSMENU|DS_CONTROL, 0, WS_CAPTION|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_CAPTION|WS_SYSMENU|DS_CONTROL, 0, WS_CAPTION|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_OVERLAPPEDWINDOW, 0, WS_CLIPSIBLINGS|WS_OVERLAPPEDWINDOW, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD, 0, WS_CHILD, 0); + check_dialog_style(WS_CHILD|WS_DLGFRAME, 0, WS_CHILD|WS_DLGFRAME, WS_EX_WINDOWEDGE); + check_dialog_style(WS_CHILD|WS_THICKFRAME, 0, WS_CHILD|WS_THICKFRAME, WS_EX_WINDOWEDGE); + check_dialog_style(WS_CHILD|WS_DLGFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_DLGFRAME, WS_EX_STATICEDGE); + check_dialog_style(WS_CHILD|WS_THICKFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_THICKFRAME, WS_EX_STATICEDGE); + check_dialog_style(WS_CHILD|DS_CONTROL, 0, WS_CHILD|DS_CONTROL, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_CAPTION, 0, WS_CHILD|WS_CAPTION, WS_EX_WINDOWEDGE); + check_dialog_style(WS_CHILD|WS_BORDER, 0, WS_CHILD|WS_BORDER, 0); + check_dialog_style(WS_CHILD|WS_DLGFRAME, 0, WS_CHILD|WS_DLGFRAME, WS_EX_WINDOWEDGE); + check_dialog_style(WS_CHILD|WS_BORDER|DS_CONTROL, 0, WS_CHILD|DS_CONTROL, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_DLGFRAME|DS_CONTROL, 0, WS_CHILD|DS_CONTROL, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_CAPTION|WS_SYSMENU, 0, WS_CHILD|WS_CAPTION|WS_SYSMENU, WS_EX_WINDOWEDGE); + check_dialog_style(WS_CHILD|WS_SYSMENU, 0, WS_CHILD|WS_SYSMENU, 0); + check_dialog_style(WS_CHILD|WS_CAPTION|DS_CONTROL, 0, WS_CHILD|DS_CONTROL, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_SYSMENU|DS_CONTROL, 0, WS_CHILD|DS_CONTROL, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_CAPTION|WS_SYSMENU|DS_CONTROL, 0, WS_CHILD|DS_CONTROL, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD, WS_EX_WINDOWEDGE, WS_CHILD, 0); + check_dialog_style(WS_CHILD, WS_EX_DLGMODALFRAME, WS_CHILD, WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME); + check_dialog_style(WS_CHILD, WS_EX_DLGMODALFRAME|WS_EX_STATICEDGE, WS_CHILD, WS_EX_STATICEDGE|WS_EX_WINDOWEDGE|WS_EX_DLGMODALFRAME); + check_dialog_style(WS_CHILD|WS_POPUP, 0, WS_CHILD|WS_POPUP|WS_CLIPSIBLINGS, 0); + check_dialog_style(WS_CHILD|WS_POPUP|WS_DLGFRAME, 0, WS_CHILD|WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE); + check_dialog_style(WS_CHILD|WS_POPUP|WS_THICKFRAME, 0, WS_CHILD|WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE); + check_dialog_style(WS_CHILD|WS_POPUP|WS_DLGFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE); + check_dialog_style(WS_CHILD|WS_POPUP|WS_THICKFRAME, WS_EX_STATICEDGE, WS_CHILD|WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE); + check_dialog_style(WS_CHILD|WS_POPUP|DS_CONTROL, 0, WS_CHILD|WS_POPUP|WS_CLIPSIBLINGS|DS_CONTROL, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_POPUP|WS_CAPTION, 0, WS_CHILD|WS_POPUP|WS_CAPTION|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE); + check_dialog_style(WS_CHILD|WS_POPUP|WS_BORDER, 0, WS_CHILD|WS_POPUP|WS_BORDER|WS_CLIPSIBLINGS, 0); + check_dialog_style(WS_CHILD|WS_POPUP|WS_DLGFRAME, 0, WS_CHILD|WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE); + check_dialog_style(WS_CHILD|WS_POPUP|WS_BORDER|DS_CONTROL, 0, WS_CHILD|WS_POPUP|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_POPUP|WS_DLGFRAME|DS_CONTROL, 0, WS_CHILD|WS_POPUP|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_POPUP|WS_CAPTION|WS_SYSMENU, 0, WS_CHILD|WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE); + check_dialog_style(WS_CHILD|WS_POPUP|WS_SYSMENU, 0, WS_CHILD|WS_POPUP|WS_SYSMENU|WS_CLIPSIBLINGS, 0); + check_dialog_style(WS_CHILD|WS_POPUP|WS_CAPTION|DS_CONTROL, 0, WS_CHILD|WS_POPUP|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_POPUP|WS_SYSMENU|DS_CONTROL, 0, WS_CHILD|WS_POPUP|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_POPUP|WS_CAPTION|WS_SYSMENU|DS_CONTROL, 0, WS_CHILD|WS_POPUP|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CHILD|WS_POPUP, WS_EX_APPWINDOW, WS_CHILD|WS_POPUP|WS_CLIPSIBLINGS, WS_EX_APPWINDOW); + check_dialog_style(WS_CHILD|WS_POPUP, WS_EX_WINDOWEDGE, WS_CHILD|WS_POPUP|WS_CLIPSIBLINGS, 0); + check_dialog_style(WS_CHILD, WS_EX_WINDOWEDGE, WS_CHILD, 0); + check_dialog_style(0, WS_EX_TOOLWINDOW, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW|WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP, 0, WS_POPUP|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP, WS_EX_WINDOWEDGE, WS_POPUP|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_DLGFRAME, 0, WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_THICKFRAME, 0, WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_DLGFRAME, WS_EX_STATICEDGE, WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_THICKFRAME, WS_EX_STATICEDGE, WS_POPUP|WS_THICKFRAME|WS_CLIPSIBLINGS, WS_EX_STATICEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|DS_CONTROL, 0, WS_POPUP|WS_CLIPSIBLINGS|DS_CONTROL, WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_CAPTION, 0, WS_POPUP|WS_CAPTION|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_BORDER, 0, WS_POPUP|WS_BORDER|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_DLGFRAME, 0, WS_POPUP|WS_DLGFRAME|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_BORDER|DS_CONTROL, 0, WS_POPUP|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_DLGFRAME|DS_CONTROL, 0, WS_POPUP|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_CAPTION|WS_SYSMENU, 0, WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_CLIPSIBLINGS, WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_SYSMENU, 0, WS_POPUP|WS_SYSMENU|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_CAPTION|DS_CONTROL, 0, WS_POPUP|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_SYSMENU|DS_CONTROL, 0, WS_POPUP|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_POPUP|WS_CAPTION|WS_SYSMENU|DS_CONTROL, 0, WS_POPUP|DS_CONTROL|WS_CLIPSIBLINGS, WS_EX_CONTROLPARENT); + check_dialog_style(WS_CAPTION, WS_EX_STATICEDGE, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_STATICEDGE|WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(0, WS_EX_APPWINDOW, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_APPWINDOW|WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + + if (pGetLayeredWindowAttributes) + { + check_dialog_style(0, WS_EX_LAYERED, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_LAYERED|WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(0, WS_EX_LAYERED|WS_EX_TRANSPARENT, WS_CLIPSIBLINGS|WS_CAPTION, WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + check_dialog_style(0, WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOOLWINDOW, WS_CLIPSIBLINGS|WS_CAPTION, + WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOOLWINDOW|WS_EX_WINDOWEDGE|WS_EX_CONTROLPARENT); + } +} + static void test_scrollwindow( HWND hwnd) { HDC hdc; @@ -5094,20 +5323,20 @@ static void test_CreateWindow(void) ok( !pGetProcessDefaultLayout( NULL ), "GetProcessDefaultLayout succeeded\n" ); ok( GetLastError() == ERROR_NOACCESS, "wrong error %u\n", GetLastError() ); SetLastError( 0xdeadbeef ); - ok( pGetProcessDefaultLayout( &layout ), - "GetProcessDefaultLayout failed err %u\n", GetLastError ()); + res = pGetProcessDefaultLayout( &layout ); + ok( res, "GetProcessDefaultLayout failed err %u\n", GetLastError ()); ok( layout == 0, "GetProcessDefaultLayout wrong layout %x\n", layout ); SetLastError( 0xdeadbeef ); - ok( pSetProcessDefaultLayout( 7 ), - "SetProcessDefaultLayout failed err %u\n", GetLastError ()); - ok( pGetProcessDefaultLayout( &layout ), - "GetProcessDefaultLayout failed err %u\n", GetLastError ()); + res = pSetProcessDefaultLayout( 7 ); + ok( res, "SetProcessDefaultLayout failed err %u\n", GetLastError ()); + res = pGetProcessDefaultLayout( &layout ); + ok( res, "GetProcessDefaultLayout failed err %u\n", GetLastError ()); ok( layout == 7, "GetProcessDefaultLayout wrong layout %x\n", layout ); SetLastError( 0xdeadbeef ); - ok( pSetProcessDefaultLayout( LAYOUT_RTL ), - "SetProcessDefaultLayout failed err %u\n", GetLastError ()); - ok( pGetProcessDefaultLayout( &layout ), - "GetProcessDefaultLayout failed err %u\n", GetLastError ()); + res = pSetProcessDefaultLayout( LAYOUT_RTL ); + ok( res, "SetProcessDefaultLayout failed err %u\n", GetLastError ()); + res = pGetProcessDefaultLayout( &layout ); + ok( res, "GetProcessDefaultLayout failed err %u\n", GetLastError ()); ok( layout == LAYOUT_RTL, "GetProcessDefaultLayout wrong layout %x\n", layout ); hwnd = CreateWindowEx(WS_EX_APPWINDOW, "static", NULL, WS_POPUP, 0, 0, 100, 100, 0, 0, 0, NULL); @@ -6685,6 +6914,7 @@ START_TEST(win) test_AdjustWindowRect(); test_window_styles(); + test_dialog_styles(); test_redrawnow(); test_csparentdc(); test_SetWindowLong(); From 9306cf966fa9db104239ebeb48c230e869708f09 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 16:12:48 +0000 Subject: [PATCH 099/289] [SYSSETUP] * Register atl before anything else. svn path=/trunk/; revision=55210 --- reactos/media/inf/syssetup.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/media/inf/syssetup.inf b/reactos/media/inf/syssetup.inf index de341f4cf7b..f015a13c8fa 100644 --- a/reactos/media/inf/syssetup.inf +++ b/reactos/media/inf/syssetup.inf @@ -26,9 +26,9 @@ ks.inf RegisterDlls = OleControlDlls [OleControlDlls] +11,,atl.dll,1 11,,actxprxy.dll,1 11,,amstream.dll,1 -11,,atl.dll,1 11,,avifil32.dll,1 11,,browseui.dll,1 11,,comcat.dll,1 From f7df1564c3228ad01570a932bc4b0b081ee155c5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 26 Jan 2012 17:01:40 +0000 Subject: [PATCH 100/289] [USETUP] - Fix an off-by-one bug in the drive letter assignment code that prevented the 4th partition on a disk from being assigned a drive letter svn path=/trunk/; revision=55212 --- reactos/base/setup/usetup/partlist.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/base/setup/usetup/partlist.c b/reactos/base/setup/usetup/partlist.c index 2a9b49354b7..229a167e3f6 100644 --- a/reactos/base/setup/usetup/partlist.c +++ b/reactos/base/setup/usetup/partlist.c @@ -88,12 +88,12 @@ AssignDriverLetters (PPARTLIST List) PARTENTRY, ListEntry); - for (i=0; i<3; i++) + for (i=0; i<4; i++) PartEntry->DriveLetter[i] = 0; if (PartEntry->Unpartitioned == FALSE) { - for (i=0; i<3; i++) + for (i=0; i<4; i++) { if (IsContainerPartition (PartEntry->PartInfo[i].PartitionType)) continue; From b896ffbf1741fc6ba0fe5c366a271dbbb2c9685c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 26 Jan 2012 18:27:21 +0000 Subject: [PATCH 101/289] [USETUP] - Allow removable media to be selected as an installation target - Fix broken unpartitioned space calculation if the first partition starts below the disk's track size (such as a 1MB aligned partition) svn path=/trunk/; revision=55215 --- reactos/base/setup/usetup/partlist.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/reactos/base/setup/usetup/partlist.c b/reactos/base/setup/usetup/partlist.c index 229a167e3f6..0fd6fbb1997 100644 --- a/reactos/base/setup/usetup/partlist.c +++ b/reactos/base/setup/usetup/partlist.c @@ -374,7 +374,8 @@ ScanForUnpartitionedDiskSpace (PDISKENTRY DiskEntry) PartEntry->PartInfo[j].StartingOffset.QuadPart - (LastStartingOffset + LastPartitionLength); - if (LastUnusedPartitionLength >= DiskEntry->CylinderSize) + if (PartEntry->PartInfo[j].StartingOffset.QuadPart > (LastStartingOffset + LastPartitionLength) && + LastUnusedPartitionLength >= DiskEntry->CylinderSize) { DPRINT ("Unpartitioned disk space %I64u\n", LastUnusedPartitionLength); @@ -718,7 +719,8 @@ AddDiskToList (HANDLE FileHandle, return; } - if (DiskGeometry.MediaType != FixedMedia) + if (DiskGeometry.MediaType != FixedMedia && + DiskGeometry.MediaType != RemovableMedia) { return; } From 475731718862bc38a8d5a902d3826025bc13ec21 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 18:42:55 +0000 Subject: [PATCH 102/289] [SYSSETUP] * Register atl before anything else on rbuild builds too. svn path=/trunk/; revision=55216 --- reactos/media/inf/inf.rbuild | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/media/inf/inf.rbuild b/reactos/media/inf/inf.rbuild index da6f3876c56..8d78bf66df6 100644 --- a/reactos/media/inf/inf.rbuild +++ b/reactos/media/inf/inf.rbuild @@ -27,7 +27,7 @@ nettcpip.inf ports.inf scsi.inf - syssetup.inf + syssetup.inf unknown.inf usb.inf usbport.inf From 84a22571196f2487eff863bce0a2a87c896a40df Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 19:09:02 +0000 Subject: [PATCH 103/289] [CMAKE] * Define _inline to __inline when cross compiling. Dedicated to Alex. svn path=/trunk/; revision=55218 --- reactos/cmake/gcc.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/cmake/gcc.cmake b/reactos/cmake/gcc.cmake index 75a8ebdeb01..dc82e51085c 100644 --- a/reactos/cmake/gcc.cmake +++ b/reactos/cmake/gcc.cmake @@ -74,6 +74,8 @@ elseif(ARCH MATCHES arm) add_definitions(-D__MSVCRT__) # DUBIOUS endif() +add_definitions(-D_inline=__inline) + # alternative arch name if(ARCH MATCHES amd64) set(ARCH2 x86_64) From f9013c3575a548b2de8248e3e8f53e78118d75cc Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Thu, 26 Jan 2012 19:15:07 +0000 Subject: [PATCH 104/289] [SDK]: Some fixes/additions to this header. svn path=/trunk/; revision=55220 --- reactos/include/psdk/ntdddisk.h | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/reactos/include/psdk/ntdddisk.h b/reactos/include/psdk/ntdddisk.h index c52a72d7192..d1b3ee4d494 100644 --- a/reactos/include/psdk/ntdddisk.h +++ b/reactos/include/psdk/ntdddisk.h @@ -151,6 +151,19 @@ extern "C" { #define IOCTL_DISK_SET_CACHE_INFORMATION \ CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +// +// NTDDI_WIN2003 was an older define used in the early beta builds, which +// Microsoft forgot to fix in a few headers. +// NTDDI_WS03 is the correct term. +// +#if (NTDDI_VERSION < NTDDI_WS03) +#define IOCTL_DISK_GET_WRITE_CACHE_STATE \ + CTL_CODE(IOCTL_DISK_BASE, 0x0037, METHOD_BUFFERED, FILE_READ_ACCESS) +#else +#define OBSOLETE_DISK_GET_WRITE_CACHE_STATE \ + CTL_CODE(IOCTL_DISK_BASE, 0x0037, METHOD_BUFFERED, FILE_READ_ACCESS) +#endif + #define IOCTL_DISK_SET_DRIVE_LAYOUT \ CTL_CODE(IOCTL_DISK_BASE, 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) @@ -460,11 +473,36 @@ typedef struct _SET_PARTITION_INFORMATION_EX { } DUMMYUNIONNAME; } SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX; +typedef struct _CREATE_DISK_GPT { + GUID DiskId; + ULONG MaxPartitionCount; +} CREATE_DISK_GPT, *PCREATE_DISK_GPT; + +typedef struct _CREATE_DISK_MBR { + ULONG Signature; +} CREATE_DISK_MBR, *PCREATE_DISK_MBR; + +typedef struct _CREATE_DISK { + PARTITION_STYLE PartitionStyle; + _ANONYMOUS_UNION union { + CREATE_DISK_MBR Mbr; + CREATE_DISK_GPT Gpt; + } DUMMYUNIONNAME; +} CREATE_DISK, *PCREATE_DISK; + typedef struct _VERIFY_INFORMATION { LARGE_INTEGER StartingOffset; ULONG Length; } VERIFY_INFORMATION, *PVERIFY_INFORMATION; +#if (OSVER(NTDDI_VERSION) == NTDDI_WINXP) +typedef enum _DISK_WRITE_CACHE_STATE { + DiskWriteCacheNormal, + DiskWriteCacheForceDisable, + DiskWriteCacheDisableNotSupported +} DISK_WRITE_CACHE_STATE, *PDISK_WRITE_CACHE_STATE; +#endif + typedef enum { EqualPriority, KeepPrefetchedData, From d88311c29f89c2fe39cda18b9069f13bd4ba99f9 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 19:18:19 +0000 Subject: [PATCH 105/289] [DDK] * portcls.h: Don't check for non existing NTDDI_WIN2003. svn path=/trunk/; revision=55221 --- reactos/include/ddk/portcls.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/ddk/portcls.h b/reactos/include/ddk/portcls.h index 8300ddd41ef..1a1ede62ae7 100644 --- a/reactos/include/ddk/portcls.h +++ b/reactos/include/ddk/portcls.h @@ -614,7 +614,7 @@ DECLARE_INTERFACE_(IServiceGroup, IServiceSink) { typedef IServiceGroup *PSERVICEGROUP; -#if (NTDDI_VERSION >= NTDDI_WIN2003) +#if (NTDDI_VERSION >= NTDDI_WS03) /* =============================================================== IUnregisterSubdevice Interface */ From 934c32a726114e95948e674a56206a56cfc0c42a Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 20:06:08 +0000 Subject: [PATCH 106/289] [NTOSKRNL] * Remove some redundant definitions now that they've been added in r55220. Fixes build. svn path=/trunk/; revision=55224 --- reactos/ntoskrnl/fstub/fstubex.c | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/reactos/ntoskrnl/fstub/fstubex.c b/reactos/ntoskrnl/fstub/fstubex.c index 6035ed8fd32..74797e9ddd6 100644 --- a/reactos/ntoskrnl/fstub/fstubex.c +++ b/reactos/ntoskrnl/fstub/fstubex.c @@ -53,27 +53,6 @@ typedef struct _EFI_PARTITION_ENTRY WCHAR Name[0x24]; // 56 } EFI_PARTITION_ENTRY, *PEFI_PARTITION_ENTRY; -typedef struct _CREATE_DISK_MBR -{ - ULONG Signature; -} CREATE_DISK_MBR, *PCREATE_DISK_MBR; - -typedef struct _CREATE_DISK_GPT -{ - GUID DiskId; - ULONG MaxPartitionCount; -} CREATE_DISK_GPT, *PCREATE_DISK_GPT; - -typedef struct _CREATE_DISK -{ - PARTITION_STYLE PartitionStyle; - union - { - CREATE_DISK_MBR Mbr; - CREATE_DISK_GPT Gpt; - }; -} CREATE_DISK, *PCREATE_DISK; - typedef struct _PARTITION_TABLE_ENTRY { UCHAR BootIndicator; From 98c2a10bd6e22ce9f31322265f56f09efd4413a8 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 26 Jan 2012 20:59:35 +0000 Subject: [PATCH 107/289] [MSADP32.ACM] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55226 --- reactos/dll/win32/msadp32.acm/msadp32.c | 4 ++-- reactos/media/doc/README.WINE | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/msadp32.acm/msadp32.c b/reactos/dll/win32/msadp32.acm/msadp32.c index f7b8f8d2bf7..a9aba4cb176 100644 --- a/reactos/dll/win32/msadp32.acm/msadp32.c +++ b/reactos/dll/win32/msadp32.acm/msadp32.c @@ -180,7 +180,7 @@ static void init_wfx_adpcm(ADPCMWAVEFORMAT* awfx) /*********************************************************************** * R16 * - * Read a 16 bit sample (correctly handles endianess) + * Read a 16 bit sample (correctly handles endianness) */ static inline short R16(const unsigned char* src) { @@ -190,7 +190,7 @@ static inline short R16(const unsigned char* src) /*********************************************************************** * W16 * - * Write a 16 bit sample (correctly handles endianess) + * Write a 16 bit sample (correctly handles endianness) */ static inline void W16(unsigned char* dst, short s) { diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index e69947cbaaa..f2244b6ca30 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -92,7 +92,7 @@ reactos/dll/win32/mlang # Autosync reactos/dll/win32/mpr # Autosync reactos/dll/win32/mprapi # Autosync reactos/dll/win32/msacm32 # Autosync -reactos/dll/win32/msadp32.acm # Autosync +reactos/dll/win32/msadp32.acm # Synced to Wine-1.3.37 reactos/dll/win32/mscat32 # Autosync reactos/dll/win32/mscms # Autosync reactos/dll/win32/mscoree # Autosync From 433b6266c646d52b5756ee8faa90f8964ba1dde1 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Thu, 26 Jan 2012 21:16:59 +0000 Subject: [PATCH 108/289] Laa-a-a-a-dies and gentlemen..... For your unique, viewing and executing pleasure.. For one time only....by popular demand.... The one... The only... The unforgettable, unforgivable... Meanest, baddest, piece of code around... He's back..... with a vengeance... The ultimate... Mega... Uber.. Amazing... HACK OF DOOOOOOOOOOOOOOOOOOOOOOOOOOOOOM svn path=/trunk/; revision=55227 --- reactos/ntoskrnl/include/internal/mm.h | 14 ++++++++ reactos/ntoskrnl/ke/i386/thrdini.c | 3 ++ reactos/ntoskrnl/ke/procobj.c | 9 +++++ reactos/ntoskrnl/ke/thrdobj.c | 3 ++ reactos/ntoskrnl/ke/thrdschd.c | 6 ++++ reactos/ntoskrnl/mm/i386/page.c | 48 ++++++++++++++++++++++++++ reactos/ntoskrnl/mm/mmfault.c | 35 +++++++++++++++++++ 7 files changed, 118 insertions(+) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 09918a62af6..278b667f40e 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -6,6 +6,20 @@ struct _EPROCESS; +/* ReactOS Mm Hacks */ +VOID +FASTCALL +MiSyncForProcessAttach( + IN PKTHREAD NextThread, + IN PEPROCESS Process +); + +VOID +FASTCALL +MiSyncForContextSwitch( + IN PKTHREAD Thread +); + extern PMMSUPPORT MmKernelAddressSpace; extern PFN_COUNT MiFreeSwapPages; extern PFN_COUNT MiUsedSwapPages; diff --git a/reactos/ntoskrnl/ke/i386/thrdini.c b/reactos/ntoskrnl/ke/i386/thrdini.c index 8ee631428d1..cb120d39cb3 100644 --- a/reactos/ntoskrnl/ke/i386/thrdini.c +++ b/reactos/ntoskrnl/ke/i386/thrdini.c @@ -433,6 +433,9 @@ KiSwapContextEntry(IN PKSWITCHFRAME SwitchFrame, /* Get thread pointers */ OldThread = (PKTHREAD)(OldThreadAndApcFlag & ~3); NewThread = Pcr->PrcbData.CurrentThread; + + /* ReactOS Mm Hack */ + MiSyncForContextSwitch(NewThread); /* Get the old thread and set its kernel stack */ OldThread->KernelStack = SwitchFrame; diff --git a/reactos/ntoskrnl/ke/procobj.c b/reactos/ntoskrnl/ke/procobj.c index 7051c8241e1..c8de4f05f43 100644 --- a/reactos/ntoskrnl/ke/procobj.c +++ b/reactos/ntoskrnl/ke/procobj.c @@ -97,6 +97,9 @@ KiAttachProcess(IN PKTHREAD Thread, /* Release lock */ KiReleaseApcLockFromDpcLevel(ApcLock); + /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ + MiSyncForProcessAttach(Thread, (PEPROCESS)Process); + /* Swap Processes */ KiSwapProcess(Process, SavedApcState->Process); @@ -615,6 +618,9 @@ KeDetachProcess(VOID) /* Release lock */ KiReleaseApcLockFromDpcLevel(&ApcLock); + /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ + MiSyncForProcessAttach(Thread, (PEPROCESS)Process); + /* Swap Processes */ KiSwapProcess(Thread->ApcState.Process, Process); @@ -782,6 +788,9 @@ KeUnstackDetachProcess(IN PRKAPC_STATE ApcState) /* Release lock */ KiReleaseApcLockFromDpcLevel(&ApcLock); + /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ + MiSyncForProcessAttach(Thread, (PEPROCESS)Process); + /* Swap Processes */ KiSwapProcess(Thread->ApcState.Process, Process); diff --git a/reactos/ntoskrnl/ke/thrdobj.c b/reactos/ntoskrnl/ke/thrdobj.c index cfccf0de1b2..686fbbbe4ad 100644 --- a/reactos/ntoskrnl/ke/thrdobj.c +++ b/reactos/ntoskrnl/ke/thrdobj.c @@ -856,6 +856,9 @@ KeInitThread(IN OUT PKTHREAD Thread, Thread->StackBase = KernelStack; Thread->StackLimit = (ULONG_PTR)KernelStack - KERNEL_STACK_SIZE; Thread->KernelStackResident = TRUE; + + /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ + MiSyncForProcessAttach(Thread, (PEPROCESS)Process); /* Enter SEH to avoid crashes due to user mode */ Status = STATUS_SUCCESS; diff --git a/reactos/ntoskrnl/ke/thrdschd.c b/reactos/ntoskrnl/ke/thrdschd.c index ee418c7e7ef..b9a063846d3 100644 --- a/reactos/ntoskrnl/ke/thrdschd.c +++ b/reactos/ntoskrnl/ke/thrdschd.c @@ -394,6 +394,9 @@ KiSwapThread(IN PKTHREAD CurrentThread, /* Save the wait IRQL */ WaitIrql = CurrentThread->WaitIrql; + /* REACTOS Mm Hack of Doom */ + MiSyncForContextSwitch(NextThread); + /* Swap contexts */ ApcState = KiSwapContext(WaitIrql, CurrentThread); @@ -790,6 +793,9 @@ NtYieldExecution(VOID) /* Sanity check */ ASSERT(OldIrql <= DISPATCH_LEVEL); + /* REACTOS Mm Hack of Doom */ + MiSyncForContextSwitch(NextThread); + /* Swap to new thread */ KiSwapContext(APC_LEVEL, Thread); Status = STATUS_SUCCESS; diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index 9ebf1bd2b93..2b80afd0c4f 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -1028,6 +1028,54 @@ MmGetPhysicalAddress(PVOID vaddr) return p; } +VOID +NTAPI +MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size) +{ + ULONG StartOffset, EndOffset, Offset; + PULONG Pde; + + // + // Check if the process isn't there anymore + // This is probably a bad sign, since it means the caller is setting cr3 to + // 0 or something... + // + if ((PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0]) == 0) && (Process != PsGetCurrentProcess())) + { + DPRINT1("Process: %16s is dead: %p\n", Process->ImageFileName, Process->Pcb.DirectoryTableBase[0]); + ASSERT(FALSE); + return; + } + + if (Address < MmSystemRangeStart) + { + KeBugCheck(MEMORY_MANAGEMENT); + } + + StartOffset = ADDR_TO_PDE_OFFSET(Address); + EndOffset = ADDR_TO_PDE_OFFSET((PVOID)((ULONG_PTR)Address + Size)); + + if (Process != NULL && Process != PsGetCurrentProcess()) + { + Pde = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0])); + } + else + { + Pde = (PULONG)PAGEDIRECTORY_MAP; + } + for (Offset = StartOffset; Offset <= EndOffset; Offset++) + { + if (Offset != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP)) + { + InterlockedCompareExchangePte(&Pde[Offset], MmGlobalKernelPageDirectory[Offset], 0); + } + } + if (Pde != (PULONG)PAGEDIRECTORY_MAP) + { + MmDeleteHyperspaceMapping(Pde); + } +} + VOID INIT_FUNCTION NTAPI diff --git a/reactos/ntoskrnl/mm/mmfault.c b/reactos/ntoskrnl/mm/mmfault.c index b8628a8db25..c749f187232 100644 --- a/reactos/ntoskrnl/mm/mmfault.c +++ b/reactos/ntoskrnl/mm/mmfault.c @@ -20,6 +20,41 @@ /* PRIVATE FUNCTIONS **********************************************************/ +VOID +FASTCALL +MiSyncForProcessAttach(IN PKTHREAD Thread, + IN PEPROCESS Process) +{ + PETHREAD Ethread = CONTAINING_RECORD(Thread, ETHREAD, Tcb); + //DPRINT1("Hack sync for process: %p and thread: %p\n", Process, Thread); + //DPRINT1("Thread stack hack: %p %d\n", Thread->StackLimit, Thread->LargeStack); + + /* Hack Sync because Mm is broken */ + MmUpdatePageDir(Process, Ethread, sizeof(ETHREAD)); + MmUpdatePageDir(Process, Ethread->ThreadsProcess, sizeof(EPROCESS)); + MmUpdatePageDir(Process, + (PVOID)Thread->StackLimit, + Thread->LargeStack ? + KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); +} + +VOID +FASTCALL +MiSyncForContextSwitch(IN PKTHREAD Thread) +{ + PVOID Process = PsGetCurrentProcess(); + PETHREAD Ethread = CONTAINING_RECORD(Thread, ETHREAD, Tcb); + //DPRINT1("Hack sync for thread: %p and process: %p\n", Thread, Process); + //DPRINT1("Thread stack hack: %p %d\n", Thread->StackLimit, Thread->LargeStack); + + /* Hack Sync because Mm is broken */ + MmUpdatePageDir(Process, Ethread->ThreadsProcess, sizeof(EPROCESS)); + MmUpdatePageDir(Process, + (PVOID)Thread->StackLimit, + Thread->LargeStack ? + KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); +} + NTSTATUS NTAPI MmpAccessFault(KPROCESSOR_MODE Mode, From d85e3f4b787555bb9657ca7c8431ce5359cfa179 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 10:32:23 +0000 Subject: [PATCH 109/289] [MSFTEDIT] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55233 --- reactos/dll/win32/msftedit/msftedit.spec | 6 +++--- reactos/media/doc/README.WINE | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/msftedit/msftedit.spec b/reactos/dll/win32/msftedit/msftedit.spec index 0dd878d585a..5f718863bc2 100644 --- a/reactos/dll/win32/msftedit/msftedit.spec +++ b/reactos/dll/win32/msftedit/msftedit.spec @@ -1,9 +1,9 @@ 2 extern IID_IRichEditOle 3 extern IID_IRichEditOleCallback 4 stdcall CreateTextServices(ptr ptr ptr) riched20.CreateTextServices -5 extern IID_ITextServices -6 extern IID_ITextHost -7 extern IID_ITextHost2 +5 extern IID_ITextServices riched20.IID_ITextServices +6 extern IID_ITextHost riched20.IID_ITextHost +7 extern IID_ITextHost2 riched20.IID_ITextHost2 8 stdcall REExtendedRegisterClass() riched20.REExtendedRegisterClass 9 stdcall RichEdit10ANSIWndProc(ptr long long long) riched20.RichEdit10ANSIWndProc 10 stdcall RichEditANSIWndProc(ptr long long long) riched20.RichEditANSIWndProc diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index f2244b6ca30..202ce397f62 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -97,7 +97,7 @@ reactos/dll/win32/mscat32 # Autosync reactos/dll/win32/mscms # Autosync reactos/dll/win32/mscoree # Autosync reactos/dll/win32/msctf # Autosync -reactos/dll/win32/msftedit # Autosync +reactos/dll/win32/msftedit # Synced to Wine-1.3.37 reactos/dll/win32/msg711.acm # Autosync reactos/dll/win32/msgsm32.acm # Autosync reactos/dll/win32/mshtml # Autosync From 5bade8d8fb26c408da7929e9313e2d31556db37b Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 11:01:06 +0000 Subject: [PATCH 110/289] [MSCMS] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55234 --- reactos/dll/win32/mscms/CMakeLists.txt | 1 - reactos/dll/win32/mscms/handle.c | 2 + reactos/dll/win32/mscms/icc.c | 16 ++--- reactos/dll/win32/mscms/mscms.rbuild | 1 - reactos/dll/win32/mscms/mscms_priv.h | 36 +++++------ reactos/dll/win32/mscms/profile.c | 25 +++++++- reactos/dll/win32/mscms/stub.c | 10 ++-- reactos/dll/win32/mscms/transform.c | 83 +++++++++++++++----------- reactos/media/doc/README.WINE | 2 +- 9 files changed, 105 insertions(+), 71 deletions(-) diff --git a/reactos/dll/win32/mscms/CMakeLists.txt b/reactos/dll/win32/mscms/CMakeLists.txt index 0be83686493..38577be9a08 100644 --- a/reactos/dll/win32/mscms/CMakeLists.txt +++ b/reactos/dll/win32/mscms/CMakeLists.txt @@ -21,5 +21,4 @@ add_library(mscms SHARED ${SOURCE}) set_module_type(mscms win32dll) target_link_libraries(mscms wine) add_importlibs(mscms msvcrt advapi32 kernel32 ntdll) -add_pch(mscms mscms_priv.h) add_cd_file(TARGET mscms DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/mscms/handle.c b/reactos/dll/win32/mscms/handle.c index 84f1d8ba30f..1fec81030ce 100644 --- a/reactos/dll/win32/mscms/handle.c +++ b/reactos/dll/win32/mscms/handle.c @@ -60,6 +60,8 @@ void free_handle_tables( void ) HeapFree( GetProcessHeap(), 0, transformtable ); transformtable = NULL; num_transform_handles = 0; + + DeleteCriticalSection( &MSCMS_handle_cs ); } struct profile *grab_profile( HPROFILE handle ) diff --git a/reactos/dll/win32/mscms/icc.c b/reactos/dll/win32/mscms/icc.c index 67b65ed6643..f751c70d918 100644 --- a/reactos/dll/win32/mscms/icc.c +++ b/reactos/dll/win32/mscms/icc.c @@ -33,7 +33,7 @@ #ifdef HAVE_LCMS -static inline void MSCMS_adjust_endianess32( ULONG *ptr ) +static inline void MSCMS_adjust_endianness32( ULONG *ptr ) { #ifndef WORDS_BIGENDIAN *ptr = RtlUlongByteSwap(*ptr); @@ -48,7 +48,7 @@ void MSCMS_get_profile_header( const icProfile *iccprofile, PROFILEHEADER *heade /* ICC format is big-endian, swap bytes if necessary */ for (i = 0; i < sizeof(PROFILEHEADER) / sizeof(ULONG); i++) - MSCMS_adjust_endianess32( (ULONG *)header + i ); + MSCMS_adjust_endianness32( (ULONG *)header + i ); } void MSCMS_set_profile_header( icProfile *iccprofile, const PROFILEHEADER *header ) @@ -60,14 +60,14 @@ void MSCMS_set_profile_header( icProfile *iccprofile, const PROFILEHEADER *heade /* ICC format is big-endian, swap bytes if necessary */ for (i = 0; i < sizeof(icHeader) / sizeof(ULONG); i++) - MSCMS_adjust_endianess32( (ULONG *)iccheader + i ); + MSCMS_adjust_endianness32( (ULONG *)iccheader + i ); } DWORD MSCMS_get_tag_count( const icProfile *iccprofile ) { ULONG count = iccprofile->count; - MSCMS_adjust_endianess32( &count ); + MSCMS_adjust_endianness32( &count ); return count; } @@ -79,9 +79,9 @@ void MSCMS_get_tag_by_index( icProfile *iccprofile, DWORD index, icTag *tag ) tag->offset = tmp->offset; tag->size = tmp->size; - MSCMS_adjust_endianess32( &tag->sig ); - MSCMS_adjust_endianess32( &tag->offset ); - MSCMS_adjust_endianess32( &tag->size ); + MSCMS_adjust_endianness32( &tag->sig ); + MSCMS_adjust_endianness32( &tag->offset ); + MSCMS_adjust_endianness32( &tag->size ); } void MSCMS_get_tag_data( const icProfile *iccprofile, const icTag *tag, DWORD offset, void *buffer ) @@ -98,7 +98,7 @@ DWORD MSCMS_get_profile_size( const icProfile *iccprofile ) { DWORD size = ((const icHeader *)iccprofile)->size; - MSCMS_adjust_endianess32( &size ); + MSCMS_adjust_endianness32( &size ); return size; } diff --git a/reactos/dll/win32/mscms/mscms.rbuild b/reactos/dll/win32/mscms/mscms.rbuild index 838302033ac..5afe2342938 100644 --- a/reactos/dll/win32/mscms/mscms.rbuild +++ b/reactos/dll/win32/mscms/mscms.rbuild @@ -10,7 +10,6 @@ stub.c transform.c version.rc - mscms_priv.h wine advapi32 ntdll diff --git a/reactos/dll/win32/mscms/mscms_priv.h b/reactos/dll/win32/mscms/mscms_priv.h index 479148bee80..ffaf13ba648 100644 --- a/reactos/dll/win32/mscms/mscms_priv.h +++ b/reactos/dll/win32/mscms/mscms_priv.h @@ -87,28 +87,28 @@ struct transform cmsHTRANSFORM cmstransform; }; -extern HPROFILE create_profile( struct profile * ); -extern BOOL close_profile( HPROFILE ); +extern HPROFILE create_profile( struct profile * ) DECLSPEC_HIDDEN; +extern BOOL close_profile( HPROFILE ) DECLSPEC_HIDDEN; -extern HTRANSFORM create_transform( struct transform * ); -extern BOOL close_transform( HTRANSFORM ); +extern HTRANSFORM create_transform( struct transform * ) DECLSPEC_HIDDEN; +extern BOOL close_transform( HTRANSFORM ) DECLSPEC_HIDDEN; -struct profile *grab_profile( HPROFILE ); -struct transform *grab_transform( HTRANSFORM ); +struct profile *grab_profile( HPROFILE ) DECLSPEC_HIDDEN; +struct transform *grab_transform( HTRANSFORM ) DECLSPEC_HIDDEN; -void release_profile( struct profile * ); -void release_transform( struct transform * ); +void release_profile( struct profile * ) DECLSPEC_HIDDEN; +void release_transform( struct transform * ) DECLSPEC_HIDDEN; -extern void free_handle_tables( void ); +extern void free_handle_tables( void ) DECLSPEC_HIDDEN; -extern DWORD MSCMS_get_tag_count( const icProfile *iccprofile ); -extern void MSCMS_get_tag_by_index( icProfile *iccprofile, DWORD index, icTag *tag ); -extern void MSCMS_get_tag_data( const icProfile *iccprofile, const icTag *tag, DWORD offset, void *buffer ); -extern void MSCMS_set_tag_data( icProfile *iccprofile, const icTag *tag, DWORD offset, const void *buffer ); -extern void MSCMS_get_profile_header( const icProfile *iccprofile, PROFILEHEADER *header ); -extern void MSCMS_set_profile_header( icProfile *iccprofile, const PROFILEHEADER *header ); -extern DWORD MSCMS_get_profile_size( const icProfile *iccprofile ); - -extern const char *MSCMS_dbgstr_tag(DWORD); +extern DWORD MSCMS_get_tag_count( const icProfile *iccprofile ) DECLSPEC_HIDDEN; +extern void MSCMS_get_tag_by_index( icProfile *iccprofile, DWORD index, icTag *tag ) DECLSPEC_HIDDEN; +extern void MSCMS_get_tag_data( const icProfile *iccprofile, const icTag *tag, DWORD offset, void *buffer ) DECLSPEC_HIDDEN; +extern void MSCMS_set_tag_data( icProfile *iccprofile, const icTag *tag, DWORD offset, const void *buffer ) DECLSPEC_HIDDEN; +extern void MSCMS_get_profile_header( const icProfile *iccprofile, PROFILEHEADER *header ) DECLSPEC_HIDDEN; +extern void MSCMS_set_profile_header( icProfile *iccprofile, const PROFILEHEADER *header ) DECLSPEC_HIDDEN; +extern DWORD MSCMS_get_profile_size( const icProfile *iccprofile ) DECLSPEC_HIDDEN; #endif /* HAVE_LCMS */ + +extern const char *MSCMS_dbgstr_tag(DWORD) DECLSPEC_HIDDEN; diff --git a/reactos/dll/win32/mscms/profile.c b/reactos/dll/win32/mscms/profile.c index c9a5b42b6bd..c4eae9de756 100644 --- a/reactos/dll/win32/mscms/profile.c +++ b/reactos/dll/win32/mscms/profile.c @@ -30,6 +30,7 @@ #include "wingdi.h" #include "winuser.h" #include "winreg.h" +#include "shlwapi.h" #include "icm.h" #include "mscms_priv.h" @@ -497,7 +498,7 @@ BOOL WINAPI GetColorProfileFromHandle( HPROFILE handle, PBYTE buffer, PDWORD siz * Failure: FALSE * * NOTES - * The profile header returned will be adjusted for endianess. + * The profile header returned will be adjusted for endianness. */ BOOL WINAPI GetColorProfileHeader( HPROFILE handle, PPROFILEHEADER header ) { @@ -660,9 +661,9 @@ BOOL WINAPI GetStandardColorSpaceProfileW( PCWSTR machine, DWORD id, PWSTR profi GetColorDirectoryW( machine, rgbprofile, &len ); switch (id) + { case LCS_sRGB: case LCS_WINDOWS_COLOR_SPACE: /* FIXME */ - { lstrcatW( rgbprofile, rgbprofilefile ); len = lstrlenW( rgbprofile ) * sizeof(WCHAR); @@ -1470,7 +1471,25 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing if (!flags) return NULL; if (!sharing) sharing = FILE_SHARE_READ; - handle = CreateFileW( profile->pProfileData, flags, sharing, NULL, creation, 0, NULL ); + if (!PathIsRelativeW( profile->pProfileData )) + handle = CreateFileW( profile->pProfileData, flags, sharing, NULL, creation, 0, NULL ); + else + { + DWORD size; + WCHAR *path; + + if (!GetColorDirectoryW( NULL, NULL, &size ) && GetLastError() == ERROR_MORE_DATA) + { + size += (strlenW( profile->pProfileData ) + 2) * sizeof(WCHAR); + if (!(path = HeapAlloc( GetProcessHeap(), 0, size ))) return NULL; + GetColorDirectoryW( NULL, path, &size ); + PathAddBackslashW( path ); + strcatW( path, profile->pProfileData ); + } + else return NULL; + handle = CreateFileW( path, flags, sharing, NULL, creation, 0, NULL ); + HeapFree( GetProcessHeap(), 0, path ); + } if (handle == INVALID_HANDLE_VALUE) { WARN( "Unable to open color profile %u\n", GetLastError() ); diff --git a/reactos/dll/win32/mscms/stub.c b/reactos/dll/win32/mscms/stub.c index d7e6877f7fd..84c0cdc9243 100644 --- a/reactos/dll/win32/mscms/stub.c +++ b/reactos/dll/win32/mscms/stub.c @@ -137,21 +137,21 @@ BOOL WINAPI GetPS2ColorSpaceArray( HPROFILE profile, DWORD intent, DWORD type, P BOOL WINAPI RegisterCMMA( PCSTR machine, DWORD id, PCSTR dll ) { - FIXME( "( %p, 0x%08x, %p ) stub\n", machine, id, dll ); + FIXME( "( %p, %s, %p ) stub\n", machine, MSCMS_dbgstr_tag(id), dll ); return TRUE; } BOOL WINAPI RegisterCMMW( PCWSTR machine, DWORD id, PCWSTR dll ) { - FIXME( "( %p, 0x%08x, %p ) stub\n", machine, id, dll ); + FIXME( "( %p, %s, %p ) stub\n", machine, MSCMS_dbgstr_tag(id), dll ); return TRUE; } BOOL WINAPI SelectCMM( DWORD id ) { - FIXME( "(%x) stub\n", id ); + FIXME( "(%s) stub\n", MSCMS_dbgstr_tag(id) ); return TRUE; } @@ -190,14 +190,14 @@ BOOL WINAPI SpoolerCopyFileEvent( LPWSTR printer, LPWSTR key, DWORD event ) BOOL WINAPI UnregisterCMMA( PCSTR machine, DWORD id ) { - FIXME( "( %p, 0x%08x ) stub\n", machine, id ); + FIXME( "( %p, %s ) stub\n", machine, MSCMS_dbgstr_tag(id) ); return TRUE; } BOOL WINAPI UnregisterCMMW( PCWSTR machine, DWORD id ) { - FIXME( "( %p, 0x%08x ) stub\n", machine, id ); + FIXME( "( %p, %s ) stub\n", machine, MSCMS_dbgstr_tag(id) ); return TRUE; } diff --git a/reactos/dll/win32/mscms/transform.c b/reactos/dll/win32/mscms/transform.c index a795386d35f..a5b348644e0 100644 --- a/reactos/dll/win32/mscms/transform.c +++ b/reactos/dll/win32/mscms/transform.c @@ -238,7 +238,7 @@ HTRANSFORM WINAPI CreateMultiProfileTransform( PHPROFILE profiles, DWORD nprofil if (out_format == TYPE_Lab_16) cmsconvert = cmsCreateLabProfile( NULL ); } - cmsprofiles = HeapAlloc( GetProcessHeap(), 0, (nprofiles + 1) * sizeof(cmsHPROFILE *) ); + cmsprofiles = HeapAlloc( GetProcessHeap(), 0, (nprofiles + 1) * sizeof(cmsHPROFILE) ); if (cmsprofiles) { cmsprofiles[0] = profile0->cmsprofile; @@ -355,8 +355,8 @@ BOOL WINAPI TranslateBitmapBits( HTRANSFORM handle, PVOID srcbits, BMFORMAT inpu BOOL WINAPI TranslateColors( HTRANSFORM handle, PCOLOR in, DWORD count, COLORTYPE input_type, PCOLOR out, COLORTYPE output_type ) { - BOOL ret = FALSE; #ifdef HAVE_LCMS + BOOL ret = TRUE; struct transform *transform = grab_transform( handle ); cmsHTRANSFORM xfrm; unsigned int i; @@ -374,78 +374,93 @@ BOOL WINAPI TranslateColors( HTRANSFORM handle, PCOLOR in, DWORD count, { switch (output_type) { - case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].rgb, &out[i].rgb, 1 ); return TRUE; - case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].rgb, &out[i].Lab, 1 ); return TRUE; - case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].rgb, &out[i].gray, 1 ); return TRUE; - case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].rgb, &out[i].cmyk, 1 ); return TRUE; - case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].rgb, &out[i].XYZ, 1 ); return TRUE; + case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].rgb, &out[i].rgb, 1 ); goto done; + case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].rgb, &out[i].Lab, 1 ); goto done; + case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].rgb, &out[i].gray, 1 ); goto done; + case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].rgb, &out[i].cmyk, 1 ); goto done; + case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].rgb, &out[i].XYZ, 1 ); goto done; default: FIXME("unhandled input/output pair: %d/%d\n", input_type, output_type); - return FALSE; + ret = FALSE; + break; } + break; } case COLOR_Lab: { switch (output_type) { - case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].Lab, &out[i].rgb, 1 ); return TRUE; - case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].Lab, &out[i].Lab, 1 ); return TRUE; - case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].Lab, &out[i].gray, 1 ); return TRUE; - case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].Lab, &out[i].cmyk, 1 ); return TRUE; - case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].Lab, &out[i].XYZ, 1 ); return TRUE; + case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].Lab, &out[i].rgb, 1 ); goto done; + case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].Lab, &out[i].Lab, 1 ); goto done; + case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].Lab, &out[i].gray, 1 ); goto done; + case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].Lab, &out[i].cmyk, 1 ); goto done; + case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].Lab, &out[i].XYZ, 1 ); goto done; default: FIXME("unhandled input/output pair: %d/%d\n", input_type, output_type); - return FALSE; + ret = FALSE; + break; } + break; } case COLOR_GRAY: { switch (output_type) { - case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].gray, &out[i].rgb, 1 ); return TRUE; - case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].gray, &out[i].Lab, 1 ); return TRUE; - case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].gray, &out[i].gray, 1 ); return TRUE; - case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].gray, &out[i].cmyk, 1 ); return TRUE; - case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].gray, &out[i].XYZ, 1 ); return TRUE; + case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].gray, &out[i].rgb, 1 ); goto done; + case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].gray, &out[i].Lab, 1 ); goto done; + case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].gray, &out[i].gray, 1 ); goto done; + case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].gray, &out[i].cmyk, 1 ); goto done; + case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].gray, &out[i].XYZ, 1 ); goto done; default: FIXME("unhandled input/output pair: %d/%d\n", input_type, output_type); - return FALSE; + ret = FALSE; + break; } + break; } case COLOR_CMYK: { switch (output_type) { - case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].cmyk, &out[i].rgb, 1 ); return TRUE; - case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].cmyk, &out[i].Lab, 1 ); return TRUE; - case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].cmyk, &out[i].gray, 1 ); return TRUE; - case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].cmyk, &out[i].cmyk, 1 ); return TRUE; - case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].cmyk, &out[i].XYZ, 1 ); return TRUE; + case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].cmyk, &out[i].rgb, 1 ); goto done; + case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].cmyk, &out[i].Lab, 1 ); goto done; + case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].cmyk, &out[i].gray, 1 ); goto done; + case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].cmyk, &out[i].cmyk, 1 ); goto done; + case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].cmyk, &out[i].XYZ, 1 ); goto done; default: FIXME("unhandled input/output pair: %d/%d\n", input_type, output_type); - return FALSE; + ret = FALSE; + break; } + break; } case COLOR_XYZ: { switch (output_type) { - case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].XYZ, &out[i].rgb, 1 ); return TRUE; - case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].XYZ, &out[i].Lab, 1 ); return TRUE; - case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].XYZ, &out[i].gray, 1 ); return TRUE; - case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].XYZ, &out[i].cmyk, 1 ); return TRUE; - case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].XYZ, &out[i].XYZ, 1 ); return TRUE; + case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].XYZ, &out[i].rgb, 1 ); goto done; + case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].XYZ, &out[i].Lab, 1 ); goto done; + case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].XYZ, &out[i].gray, 1 ); goto done; + case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].XYZ, &out[i].cmyk, 1 ); goto done; + case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( xfrm, &in[i].XYZ, &out[i].XYZ, 1 ); goto done; default: FIXME("unhandled input/output pair: %d/%d\n", input_type, output_type); - return FALSE; + ret = FALSE; + break; } + break; } default: FIXME("unhandled input/output pair: %d/%d\n", input_type, output_type); + ret = FALSE; break; } - release_transform( transform ); -#endif /* HAVE_LCMS */ +done: + release_transform( transform ); return ret; + +#else /* HAVE_LCMS */ + return FALSE; +#endif /* HAVE_LCMS */ } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 202ce397f62..afeb16ce695 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -94,7 +94,7 @@ reactos/dll/win32/mprapi # Autosync reactos/dll/win32/msacm32 # Autosync reactos/dll/win32/msadp32.acm # Synced to Wine-1.3.37 reactos/dll/win32/mscat32 # Autosync -reactos/dll/win32/mscms # Autosync +reactos/dll/win32/mscms # Synced to Wine-1.3.37 reactos/dll/win32/mscoree # Autosync reactos/dll/win32/msctf # Autosync reactos/dll/win32/msftedit # Synced to Wine-1.3.37 From 2b0aee28defdf7a7a0907e1f2599195d0ce286ba Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 11:01:09 +0000 Subject: [PATCH 111/289] [MSCMS_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55235 --- rostests/winetests/mscms/profile.c | 94 ++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 32 deletions(-) diff --git a/rostests/winetests/mscms/profile.c b/rostests/winetests/mscms/profile.c index 91ae97a0912..d4293ff0769 100644 --- a/rostests/winetests/mscms/profile.c +++ b/rostests/winetests/mscms/profile.c @@ -30,8 +30,8 @@ #include "wine/test.h" -HMODULE hmscms; -HMODULE huser32; +static HMODULE hmscms; +static HMODULE huser32; static BOOL (WINAPI *pAssociateColorProfileWithDeviceA)(PCSTR,PCSTR,PCSTR); static BOOL (WINAPI *pCloseColorProfile)(HPROFILE); @@ -459,39 +459,42 @@ static void test_GetStandardColorSpaceProfileA(void) DWORD size; CHAR oldprofile[MAX_PATH]; CHAR newprofile[MAX_PATH]; - const CHAR emptyA[] = ""; - DWORD zero = 0; - DWORD sizeP = sizeof(newprofile); /* Parameter checks */ /* Single invalid parameter checks: */ + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 1st param, */ - ret = pGetStandardColorSpaceProfileA(machine, LCS_sRGB, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileA(machine, LCS_sRGB, newprofile, &size); ok( !ret && GetLastError() == ERROR_NOT_SUPPORTED, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 2nd param, */ - ret = pGetStandardColorSpaceProfileA(NULL, (DWORD)-1, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileA(NULL, (DWORD)-1, newprofile, &size); ok( !ret && GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 4th param, */ ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, NULL); ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 3rd param, */ - ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, NULL, &sizeP); + ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, NULL, &size); ok( !ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = 0; SetLastError(0xfaceabee); /* dereferenced 4th param, */ - ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, &zero); + ret = pGetStandardColorSpaceProfileA(NULL, LCS_sRGB, newprofile, &size); ok( !ret && (GetLastError() == ERROR_MORE_DATA || GetLastError() == ERROR_INSUFFICIENT_BUFFER), "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); /* Several invalid parameter checks: */ + size = 0; SetLastError(0xfaceabee); /* 1st, maybe 2nd and then dereferenced 4th param, */ - ret = pGetStandardColorSpaceProfileA(machine, 0, newprofile, &zero); + ret = pGetStandardColorSpaceProfileA(machine, 0, newprofile, &size); ok( !ret && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_NOT_SUPPORTED), "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); @@ -499,15 +502,17 @@ static void test_GetStandardColorSpaceProfileA(void) ret = pGetStandardColorSpaceProfileA(NULL, 0, newprofile, NULL); ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = 0; SetLastError(0xfaceabee); /* maybe 2nd, then 3rd and dereferenced 4th param, */ - ret = pGetStandardColorSpaceProfileA(NULL, 0, NULL, &zero); + ret = pGetStandardColorSpaceProfileA(NULL, 0, NULL, &size); ok( !ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || GetLastError() == ERROR_FILE_NOT_FOUND), "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* maybe 2nd param. */ - ret = pGetStandardColorSpaceProfileA(NULL, 0, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileA(NULL, 0, newprofile, &size); if (!ret) ok( GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); - else ok( !lstrcmpiA( newprofile, emptyA ) && GetLastError() == 0xfaceabee, + else ok( !lstrcmpiA( newprofile, "" ) && GetLastError() == 0xfaceabee, "GetStandardColorSpaceProfileA() returns %d (GLE=%d)\n", ret, GetLastError() ); /* Functional checks */ @@ -540,45 +545,55 @@ static void test_GetStandardColorSpaceProfileW(void) WCHAR oldprofile[MAX_PATH]; WCHAR newprofile[MAX_PATH]; CHAR newprofileA[MAX_PATH]; - const CHAR empty[] = ""; - DWORD zero = 0; - DWORD sizeP = sizeof(newprofile); /* Parameter checks */ /* Single invalid parameter checks: */ + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 1st param, */ - ret = pGetStandardColorSpaceProfileW(machineW, LCS_sRGB, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileW(machineW, LCS_sRGB, newprofile, &size); ok( !ret && GetLastError() == ERROR_NOT_SUPPORTED, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 2nd param, */ - ret = pGetStandardColorSpaceProfileW(NULL, (DWORD)-1, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileW(NULL, (DWORD)-1, newprofile, &size); ok( !ret && GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 2nd param, */ - ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &size); ok( (!ret && GetLastError() == ERROR_FILE_NOT_FOUND) || broken(ret), /* Win98 and WinME */ "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 3rd param, */ - ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, NULL, &sizeP); - ok( !ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, NULL, &size); + ok( !ret || broken(ret) /* win98 */, "GetStandardColorSpaceProfileW succeeded\n" ); + ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER || + broken(GetLastError() == 0xfaceabee) /* win98 */, + "GetStandardColorSpaceProfileW() returns GLE=%u\n", GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* 4th param, */ ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, NULL); ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = 0; SetLastError(0xfaceabee); /* dereferenced 4th param. */ - ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, &zero); - ok( !ret && (GetLastError() == ERROR_MORE_DATA || GetLastError() == ERROR_INSUFFICIENT_BUFFER), - "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + ret = pGetStandardColorSpaceProfileW(NULL, LCS_sRGB, newprofile, &size); + ok( !ret || broken(ret) /* win98 */, "GetStandardColorSpaceProfileW succeeded\n" ); + ok( GetLastError() == ERROR_MORE_DATA || + GetLastError() == ERROR_INSUFFICIENT_BUFFER || + broken(GetLastError() == 0xfaceabee) /* win98 */, + "GetStandardColorSpaceProfileW() returns GLE=%u\n", GetLastError() ); /* Several invalid parameter checks: */ + size = 0; SetLastError(0xfaceabee); /* 1st, maybe 2nd and then dereferenced 4th param, */ - ret = pGetStandardColorSpaceProfileW(machineW, 0, newprofile, &zero); + ret = pGetStandardColorSpaceProfileW(machineW, 0, newprofile, &size); ok( !ret && (GetLastError() == ERROR_INVALID_PARAMETER || GetLastError() == ERROR_NOT_SUPPORTED), "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); @@ -586,18 +601,23 @@ static void test_GetStandardColorSpaceProfileW(void) ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, NULL); ok( !ret && GetLastError() == ERROR_INVALID_PARAMETER, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + size = 0; SetLastError(0xfaceabee); /* maybe 2nd, then 3rd and dereferenced 4th param, */ - ret = pGetStandardColorSpaceProfileW(NULL, 0, NULL, &zero); - ok( !ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || GetLastError() == ERROR_FILE_NOT_FOUND), - "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); + ret = pGetStandardColorSpaceProfileW(NULL, 0, NULL, &size); + ok( !ret || broken(ret) /* win98 */, "GetStandardColorSpaceProfileW succeeded\n" ); + ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER || + GetLastError() == ERROR_FILE_NOT_FOUND || + broken(GetLastError() == 0xfaceabee) /* win98 */, + "GetStandardColorSpaceProfileW() returns GLE=%u\n", GetLastError() ); + size = sizeof(newprofile); SetLastError(0xfaceabee); /* maybe 2nd param. */ - ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &sizeP); + ret = pGetStandardColorSpaceProfileW(NULL, 0, newprofile, &size); if (!ret) ok( GetLastError() == ERROR_FILE_NOT_FOUND, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); else { WideCharToMultiByte(CP_ACP, 0, newprofile, -1, newprofileA, sizeof(newprofileA), NULL, NULL); - ok( !lstrcmpiA( newprofileA, empty ) && GetLastError() == 0xfaceabee, + ok( !lstrcmpiA( newprofileA, "" ) && GetLastError() == 0xfaceabee, "GetStandardColorSpaceProfileW() returns %d (GLE=%d)\n", ret, GetLastError() ); } @@ -932,6 +952,16 @@ static void test_OpenColorProfileA(void) ret = pCloseColorProfile( handle ); ok( ret, "CloseColorProfile() failed (%d)\n", GetLastError() ); + + profile.dwType = PROFILE_FILENAME; + profile.pProfileData = (void *)"sRGB Color Space Profile.icm"; + profile.cbDataSize = sizeof("sRGB Color Space Profile.icm"); + + handle = pOpenColorProfileA( &profile, PROFILE_READ, FILE_SHARE_READ, OPEN_EXISTING ); + ok( handle != NULL, "OpenColorProfileA() failed (%d)\n", GetLastError() ); + + ret = pCloseColorProfile( handle ); + ok( ret, "CloseColorProfile() failed (%d)\n", GetLastError() ); } } @@ -1328,10 +1358,10 @@ START_TEST(profile) ret = GetSystemDirectoryA( profilefile1, sizeof(profilefile1) ); ok( ret > 0, "GetSystemDirectoryA() returns %d, LastError = %d\n", ret, GetLastError()); ok( lstrlenA(profilefile1) > 0 && lstrlenA(profilefile1) < MAX_PATH, - "GetSystemDirectoryA() returns %d, LastError = %d\n", ret, GetLastError()); + "Expected length between 0 and MAX_PATH, got %d\n", lstrlenA(profilefile1)); MultiByteToWideChar(CP_ACP, 0, profilefile1, -1, profilefile1W, MAX_PATH); ok( lstrlenW(profilefile1W) > 0 && lstrlenW(profilefile1W) < MAX_PATH, - "GetSystemDirectoryA() returns %d, LastError = %d\n", ret, GetLastError()); + "Expected length between 0 and MAX_PATH, got %d\n", lstrlenW(profilefile1W)); lstrcpyA(profilefile2, profilefile1); lstrcpyW(profilefile2W, profilefile1W); From cdd21169574c6b175dae3c9c3e43ecdf4ae33662 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 12:14:01 +0000 Subject: [PATCH 112/289] [HLINK] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55236 --- reactos/dll/win32/hlink/CMakeLists.txt | 2 + reactos/dll/win32/hlink/browse_ctx.c | 69 ++++++----- reactos/dll/win32/hlink/extserv.c | 103 ++++++++-------- reactos/dll/win32/hlink/hlink.rbuild | 1 + reactos/dll/win32/hlink/hlink.rc | 1 + reactos/dll/win32/hlink/hlink.rgs | 17 +++ reactos/dll/win32/hlink/hlink.spec | 2 +- reactos/dll/win32/hlink/hlink_classes.idl | 36 ++++++ reactos/dll/win32/hlink/hlink_main.c | 81 +++++------- reactos/dll/win32/hlink/hlink_private.h | 4 +- reactos/dll/win32/hlink/link.c | 144 ++++++++++++---------- reactos/media/doc/README.WINE | 2 +- 12 files changed, 254 insertions(+), 208 deletions(-) create mode 100644 reactos/dll/win32/hlink/hlink.rc create mode 100644 reactos/dll/win32/hlink/hlink.rgs create mode 100644 reactos/dll/win32/hlink/hlink_classes.idl diff --git a/reactos/dll/win32/hlink/CMakeLists.txt b/reactos/dll/win32/hlink/CMakeLists.txt index 793a4ce4713..85d1388d88f 100644 --- a/reactos/dll/win32/hlink/CMakeLists.txt +++ b/reactos/dll/win32/hlink/CMakeLists.txt @@ -2,6 +2,7 @@ add_definitions(-D__WINESRC__) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +set_rc_compiler() spec2def(hlink.dll hlink.spec) list(APPEND SOURCE @@ -9,6 +10,7 @@ list(APPEND SOURCE extserv.c hlink_main.c link.c + hlink.rc ${CMAKE_CURRENT_BINARY_DIR}/hlink_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/hlink.def) diff --git a/reactos/dll/win32/hlink/browse_ctx.c b/reactos/dll/win32/hlink/browse_ctx.c index 1e15c13a543..4e91398f498 100644 --- a/reactos/dll/win32/hlink/browse_ctx.c +++ b/reactos/dll/win32/hlink/browse_ctx.c @@ -24,43 +24,23 @@ WINE_DEFAULT_DEBUG_CHANNEL(hlink); -static const IHlinkBrowseContextVtbl hlvt; - typedef struct { - const IHlinkBrowseContextVtbl *lpVtbl; + IHlinkBrowseContext IHlinkBrowseContext_iface; LONG ref; HLBWINFO* BrowseWindowInfo; IHlink* CurrentPage; } HlinkBCImpl; - -HRESULT WINAPI HLinkBrowseContext_Constructor(IUnknown *pUnkOuter, REFIID riid, - LPVOID *ppv) +static inline HlinkBCImpl *impl_from_IHlinkBrowseContext(IHlinkBrowseContext *iface) { - HlinkBCImpl * hl; - - TRACE("unkOut=%p riid=%s\n", pUnkOuter, debugstr_guid(riid)); - *ppv = NULL; - - if (pUnkOuter) - return CLASS_E_NOAGGREGATION; - - hl = heap_alloc_zero(sizeof(HlinkBCImpl)); - if (!hl) - return E_OUTOFMEMORY; - - hl->ref = 1; - hl->lpVtbl = &hlvt; - - *ppv = hl; - return S_OK; + return CONTAINING_RECORD(iface, HlinkBCImpl, IHlinkBrowseContext_iface); } static HRESULT WINAPI IHlinkBC_fnQueryInterface( IHlinkBrowseContext *iface, REFIID riid, LPVOID* ppvObj) { - HlinkBCImpl *This = (HlinkBCImpl*)iface; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); TRACE ("(%p)->(%s,%p)\n", This, debugstr_guid (riid), ppvObj); if (IsEqualIID(riid, &IID_IUnknown) || @@ -77,7 +57,7 @@ static HRESULT WINAPI IHlinkBC_fnQueryInterface( IHlinkBrowseContext *iface, static ULONG WINAPI IHlinkBC_fnAddRef (IHlinkBrowseContext* iface) { - HlinkBCImpl *This = (HlinkBCImpl*)iface; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); ULONG refCount = InterlockedIncrement(&This->ref); TRACE("(%p)->(count=%u)\n", This, refCount - 1); @@ -87,7 +67,7 @@ static ULONG WINAPI IHlinkBC_fnAddRef (IHlinkBrowseContext* iface) static ULONG WINAPI IHlinkBC_fnRelease (IHlinkBrowseContext* iface) { - HlinkBCImpl *This = (HlinkBCImpl*)iface; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(count=%u)\n", This, refCount + 1); @@ -106,7 +86,7 @@ static HRESULT WINAPI IHlinkBC_Register(IHlinkBrowseContext* iface, DWORD dwReserved, IUnknown *piunk, IMoniker *pimk, DWORD *pdwRegister) { static const WCHAR szIdent[] = {'W','I','N','E','H','L','I','N','K',0}; - HlinkBCImpl *This = (HlinkBCImpl*)iface; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); IMoniker *mon; IMoniker *composite; IRunningObjectTable *ROT; @@ -138,7 +118,7 @@ static HRESULT WINAPI IHlinkBC_Revoke(IHlinkBrowseContext* iface, { HRESULT r = S_OK; IRunningObjectTable *ROT; - HlinkBCImpl *This = (HlinkBCImpl*)iface; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); FIXME("(%p)->(%i)\n", This, dwRegister); @@ -152,7 +132,7 @@ static HRESULT WINAPI IHlinkBC_Revoke(IHlinkBrowseContext* iface, static HRESULT WINAPI IHlinkBC_SetBrowseWindowInfo(IHlinkBrowseContext* iface, HLBWINFO *phlbwi) { - HlinkBCImpl *This = (HlinkBCImpl*)iface; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); TRACE("(%p)->(%p)\n", This, phlbwi); if(!phlbwi) @@ -168,7 +148,7 @@ static HRESULT WINAPI IHlinkBC_SetBrowseWindowInfo(IHlinkBrowseContext* iface, static HRESULT WINAPI IHlinkBC_GetBrowseWindowInfo(IHlinkBrowseContext* iface, HLBWINFO *phlbwi) { - HlinkBCImpl *This = (HlinkBCImpl*)iface; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); TRACE("(%p)->(%p)\n", This, phlbwi); if(!phlbwi) @@ -185,7 +165,7 @@ static HRESULT WINAPI IHlinkBC_GetBrowseWindowInfo(IHlinkBrowseContext* iface, static HRESULT WINAPI IHlinkBC_SetInitialHlink(IHlinkBrowseContext* iface, IMoniker *pimkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName) { - HlinkBCImpl *This = (HlinkBCImpl*)iface; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); FIXME("(%p)->(%p %s %s)\n", This, pimkTarget, debugstr_w(pwzLocation), debugstr_w(pwzFriendlyName)); @@ -203,7 +183,7 @@ static HRESULT WINAPI IHlinkBC_OnNavigateHlink(IHlinkBrowseContext *iface, DWORD grfHLNF, IMoniker* pmkTarget, LPCWSTR pwzLocation, LPCWSTR pwzFriendlyName, ULONG *puHLID) { - HlinkBCImpl *This = (HlinkBCImpl*)iface; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); FIXME("(%p)->(%i %p %s %s %p)\n", This, grfHLNF, pmkTarget, debugstr_w(pwzLocation), debugstr_w(pwzFriendlyName), puHLID); @@ -236,7 +216,7 @@ static HRESULT WINAPI IHlinkBC_QueryHlink( IHlinkBrowseContext* iface, static HRESULT WINAPI IHlinkBC_GetHlink( IHlinkBrowseContext* iface, ULONG uHLID, IHlink** ppihl) { - HlinkBCImpl *This = (HlinkBCImpl*)iface; + HlinkBCImpl *This = impl_from_IHlinkBrowseContext(iface); TRACE("(%p)->(%x %p)\n", This, uHLID, ppihl); @@ -266,7 +246,7 @@ static HRESULT WINAPI IHlinkBC_Clone( IHlinkBrowseContext* iface, } static HRESULT WINAPI IHlinkBC_Close(IHlinkBrowseContext* iface, - DWORD reserverd) + DWORD reserved) { FIXME("\n"); return E_NOTIMPL; @@ -292,3 +272,24 @@ static const IHlinkBrowseContextVtbl hlvt = IHlinkBC_Clone, IHlinkBC_Close }; + +HRESULT HLinkBrowseContext_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv) +{ + HlinkBCImpl * hl; + + TRACE("unkOut=%p riid=%s\n", pUnkOuter, debugstr_guid(riid)); + *ppv = NULL; + + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + hl = heap_alloc_zero(sizeof(HlinkBCImpl)); + if (!hl) + return E_OUTOFMEMORY; + + hl->ref = 1; + hl->IHlinkBrowseContext_iface.lpVtbl = &hlvt; + + *ppv = hl; + return S_OK; +} diff --git a/reactos/dll/win32/hlink/extserv.c b/reactos/dll/win32/hlink/extserv.c index d3f9e581463..7f1d565d290 100644 --- a/reactos/dll/win32/hlink/extserv.c +++ b/reactos/dll/win32/hlink/extserv.c @@ -23,13 +23,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(hlink); -#define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl))) - typedef struct { - const IUnknownVtbl *lpIUnknownVtbl; - const IAuthenticateVtbl *lpIAuthenticateVtbl; - const IHttpNegotiateVtbl *lpIHttpNegotiateVtbl; - const IExtensionServicesVtbl *lpIExtensionServicesVtbl; + IUnknown IUnknown_iface; + IAuthenticate IAuthenticate_iface; + IHttpNegotiate IHttpNegotiate_iface; + IExtensionServices IExtensionServices_iface; LONG ref; IUnknown *outer; @@ -40,31 +38,29 @@ typedef struct { LPWSTR headers; } ExtensionService; -#define EXTSERVUNK(x) ((IUnknown*)&(x)->lpIUnknownVtbl) -#define AUTHENTICATE(x) (&(x)->lpIAuthenticateVtbl) -#define HTTPNEGOTIATE(x) (&(x)->lpIHttpNegotiateVtbl) -#define EXTENSIONSERVICES(x) (&(x)->lpIExtensionServicesVtbl) - -#define EXTSERVUNK_THIS(iface) DEFINE_THIS(ExtensionService, IUnknown, iface) +static inline ExtensionService *impl_from_IUnknown(IUnknown *iface) +{ + return CONTAINING_RECORD(iface, ExtensionService, IUnknown_iface); +} static HRESULT WINAPI ExtServUnk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv) { - ExtensionService *This = EXTSERVUNK_THIS(iface); + ExtensionService *This = impl_from_IUnknown(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = EXTSERVUNK(This); + *ppv = &This->IUnknown_iface; }else if(IsEqualGUID(&IID_IAuthenticate, riid)) { TRACE("(%p)->(IID_IAuthenticate %p)\n", This, ppv); - *ppv = AUTHENTICATE(This); + *ppv = &This->IAuthenticate_iface; }else if(IsEqualGUID(&IID_IHttpNegotiate, riid)) { TRACE("(%p)->(IID_IHttpNegotiate %p)\n", This, ppv); - *ppv = HTTPNEGOTIATE(This); + *ppv = &This->IHttpNegotiate_iface; }else if(IsEqualGUID(&IID_IExtensionServices, riid)) { TRACE("(%p)->(IID_IExtensionServices %p)\n", This, ppv); - *ppv = EXTENSIONSERVICES(This); + *ppv = &This->IExtensionServices_iface; } if(*ppv) { @@ -78,7 +74,7 @@ static HRESULT WINAPI ExtServUnk_QueryInterface(IUnknown *iface, REFIID riid, vo static ULONG WINAPI ExtServUnk_AddRef(IUnknown *iface) { - ExtensionService *This = EXTSERVUNK_THIS(iface); + ExtensionService *This = impl_from_IUnknown(iface); LONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); @@ -88,7 +84,7 @@ static ULONG WINAPI ExtServUnk_AddRef(IUnknown *iface) static ULONG WINAPI ExtServUnk_Release(IUnknown *iface) { - ExtensionService *This = EXTSERVUNK_THIS(iface); + ExtensionService *This = impl_from_IUnknown(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); @@ -103,38 +99,39 @@ static ULONG WINAPI ExtServUnk_Release(IUnknown *iface) return ref; } -#undef EXTSERVUNK_THIS - static const IUnknownVtbl ExtServUnkVtbl = { ExtServUnk_QueryInterface, ExtServUnk_AddRef, ExtServUnk_Release }; -#define AUTHENTICATE_THIS(iface) DEFINE_THIS(ExtensionService, IAuthenticate, iface) +static inline ExtensionService *impl_from_IAuthenticate(IAuthenticate *iface) +{ + return CONTAINING_RECORD(iface, ExtensionService, IAuthenticate_iface); +} static HRESULT WINAPI Authenticate_QueryInterface(IAuthenticate *iface, REFIID riid, void **ppv) { - ExtensionService *This = AUTHENTICATE_THIS(iface); + ExtensionService *This = impl_from_IAuthenticate(iface); return IUnknown_QueryInterface(This->outer, riid, ppv); } static ULONG WINAPI Authenticate_AddRef(IAuthenticate *iface) { - ExtensionService *This = AUTHENTICATE_THIS(iface); + ExtensionService *This = impl_from_IAuthenticate(iface); return IUnknown_AddRef(This->outer); } static ULONG WINAPI Authenticate_Release(IAuthenticate *iface) { - ExtensionService *This = AUTHENTICATE_THIS(iface); + ExtensionService *This = impl_from_IAuthenticate(iface); return IUnknown_Release(This->outer); } static HRESULT WINAPI Authenticate_Authenticate(IAuthenticate *iface, HWND *phwnd, LPWSTR *pszUsername, LPWSTR *pszPassword) { - ExtensionService *This = AUTHENTICATE_THIS(iface); + ExtensionService *This = impl_from_IAuthenticate(iface); TRACE("(%p)->(%p %p %p)\n", This, phwnd, pszUsername, pszPassword); @@ -148,8 +145,6 @@ static HRESULT WINAPI Authenticate_Authenticate(IAuthenticate *iface, return S_OK; } -#undef AUTHENTICATE_THIS - static const IAuthenticateVtbl AuthenticateVtbl = { Authenticate_QueryInterface, Authenticate_AddRef, @@ -157,30 +152,33 @@ static const IAuthenticateVtbl AuthenticateVtbl = { Authenticate_Authenticate }; -#define HTTPNEGOTIATE_THIS(iface) DEFINE_THIS(ExtensionService, IHttpNegotiate, iface) +static inline ExtensionService *impl_from_IHttpNegotiate(IHttpNegotiate *iface) +{ + return CONTAINING_RECORD(iface, ExtensionService, IHttpNegotiate_iface); +} static HRESULT WINAPI HttpNegotiate_QueryInterface(IHttpNegotiate *iface, REFIID riid, void **ppv) { - ExtensionService *This = HTTPNEGOTIATE_THIS(iface); + ExtensionService *This = impl_from_IHttpNegotiate(iface); return IUnknown_QueryInterface(This->outer, riid, ppv); } static ULONG WINAPI HttpNegotiate_AddRef(IHttpNegotiate *iface) { - ExtensionService *This = HTTPNEGOTIATE_THIS(iface); + ExtensionService *This = impl_from_IHttpNegotiate(iface); return IUnknown_AddRef(This->outer); } static ULONG WINAPI HttpNegotiate_Release(IHttpNegotiate *iface) { - ExtensionService *This = HTTPNEGOTIATE_THIS(iface); + ExtensionService *This = impl_from_IHttpNegotiate(iface); return IUnknown_Release(This->outer); } static HRESULT WINAPI HttpNegotiate_BeginningTransaction(IHttpNegotiate *iface, LPCWSTR szURL, LPCWSTR szHeaders, DWORD dwReserved, LPWSTR *pszAdditionalHeaders) { - ExtensionService *This = HTTPNEGOTIATE_THIS(iface); + ExtensionService *This = impl_from_IHttpNegotiate(iface); TRACE("(%p)->(%s %s %x %p)\n", This, debugstr_w(szURL), debugstr_w(szHeaders), dwReserved, pszAdditionalHeaders); @@ -195,7 +193,7 @@ static HRESULT WINAPI HttpNegotiate_BeginningTransaction(IHttpNegotiate *iface, static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate *iface, DWORD dwResponseCode, LPCWSTR szResponseHeaders, LPCWSTR szRequestHeaders, LPWSTR *pszAdditionalRequestHeaders) { - ExtensionService *This = HTTPNEGOTIATE_THIS(iface); + ExtensionService *This = impl_from_IHttpNegotiate(iface); TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders), debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders); @@ -204,8 +202,6 @@ static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate *iface, DWORD dwRe return S_OK; } -#undef HTTPNEGOTIATE_THIS - static const IHttpNegotiateVtbl HttpNegotiateVtbl = { HttpNegotiate_QueryInterface, HttpNegotiate_AddRef, @@ -214,23 +210,26 @@ static const IHttpNegotiateVtbl HttpNegotiateVtbl = { HttpNegotiate_OnResponse }; -#define EXTENSIONSERVICES_THIS(iface) DEFINE_THIS(ExtensionService, IExtensionServices, iface) +static inline ExtensionService *impl_from_IExtensionServices(IExtensionServices *iface) +{ + return CONTAINING_RECORD(iface, ExtensionService, IExtensionServices_iface); +} static HRESULT WINAPI ExtServ_QueryInterface(IExtensionServices *iface, REFIID riid, void **ppv) { - ExtensionService *This = EXTENSIONSERVICES_THIS(iface); + ExtensionService *This = impl_from_IExtensionServices(iface); return IUnknown_QueryInterface(This->outer, riid, ppv); } static ULONG WINAPI ExtServ_AddRef(IExtensionServices *iface) { - ExtensionService *This = EXTENSIONSERVICES_THIS(iface); + ExtensionService *This = impl_from_IExtensionServices(iface); return IUnknown_AddRef(This->outer); } static ULONG WINAPI ExtServ_Release(IExtensionServices *iface) { - ExtensionService *This = EXTENSIONSERVICES_THIS(iface); + ExtensionService *This = impl_from_IExtensionServices(iface); return IUnknown_Release(This->outer); } @@ -260,7 +259,7 @@ static HRESULT ExtServ_ImplSetAdditionalHeaders(ExtensionService* This, LPCWSTR static HRESULT WINAPI ExtServ_SetAdditionalHeaders(IExtensionServices* iface, LPCWSTR pwzAdditionalHeaders) { - ExtensionService *This = EXTENSIONSERVICES_THIS(iface); + ExtensionService *This = impl_from_IExtensionServices(iface); TRACE("(%p)->(%s)\n", This, debugstr_w(pwzAdditionalHeaders)); @@ -281,15 +280,13 @@ static HRESULT ExtServ_ImplSetAuthenticateData(ExtensionService* This, HWND phwn static HRESULT WINAPI ExtServ_SetAuthenticateData(IExtensionServices* iface, HWND phwnd, LPCWSTR pwzUsername, LPCWSTR pwzPassword) { - ExtensionService *This = EXTENSIONSERVICES_THIS(iface); + ExtensionService *This = impl_from_IExtensionServices(iface); TRACE("(%p)->(%p %s %s)\n", This, phwnd, debugstr_w(pwzUsername), debugstr_w(pwzPassword)); return ExtServ_ImplSetAuthenticateData(This, phwnd, pwzUsername, pwzPassword); } -#undef EXTENSIONSERVICES_THIS - static const IExtensionServicesVtbl ExtServVtbl = { ExtServ_QueryInterface, ExtServ_AddRef, @@ -314,10 +311,10 @@ HRESULT WINAPI HlinkCreateExtensionServices(LPCWSTR pwzAdditionalHeaders, ret = heap_alloc(sizeof(*ret)); - ret->lpIUnknownVtbl = &ExtServUnkVtbl; - ret->lpIAuthenticateVtbl = &AuthenticateVtbl; - ret->lpIHttpNegotiateVtbl = &HttpNegotiateVtbl; - ret->lpIExtensionServicesVtbl= &ExtServVtbl; + ret->IUnknown_iface.lpVtbl = &ExtServUnkVtbl; + ret->IAuthenticate_iface.lpVtbl = &AuthenticateVtbl; + ret->IHttpNegotiate_iface.lpVtbl = &HttpNegotiateVtbl; + ret->IExtensionServices_iface.lpVtbl = &ExtServVtbl; ret->ref = 1; ret->headers = NULL; ret->hwnd = NULL; @@ -328,14 +325,14 @@ HRESULT WINAPI HlinkCreateExtensionServices(LPCWSTR pwzAdditionalHeaders, ExtServ_ImplSetAdditionalHeaders(ret, pwzAdditionalHeaders); if(!punkOuter) { - ret->outer = EXTSERVUNK(ret); - hres = IUnknown_QueryInterface(EXTSERVUNK(ret), riid, ppv); - IUnknown_Release(EXTSERVUNK(ret)); + ret->outer = &ret->IUnknown_iface; + hres = IUnknown_QueryInterface(&ret->IUnknown_iface, riid, ppv); + IUnknown_Release(&ret->IUnknown_iface); }else if(IsEqualGUID(&IID_IUnknown, riid)) { ret->outer = punkOuter; - *ppv = EXTSERVUNK(ret); + *ppv = &ret->IUnknown_iface; }else { - IUnknown_Release(EXTSERVUNK(ret)); + IUnknown_Release(&ret->IUnknown_iface); hres = E_INVALIDARG; } diff --git a/reactos/dll/win32/hlink/hlink.rbuild b/reactos/dll/win32/hlink/hlink.rbuild index 1a64f365fb3..c0f041fd751 100644 --- a/reactos/dll/win32/hlink/hlink.rbuild +++ b/reactos/dll/win32/hlink/hlink.rbuild @@ -11,6 +11,7 @@ extserv.c hlink_main.c link.c + hlink.rc hlink_private.h wine shell32 diff --git a/reactos/dll/win32/hlink/hlink.rc b/reactos/dll/win32/hlink/hlink.rc new file mode 100644 index 00000000000..c96bec24934 --- /dev/null +++ b/reactos/dll/win32/hlink/hlink.rc @@ -0,0 +1 @@ +1 WINE_REGISTRY hlink.rgs diff --git a/reactos/dll/win32/hlink/hlink.rgs b/reactos/dll/win32/hlink/hlink.rgs new file mode 100644 index 00000000000..cf2673bc986 --- /dev/null +++ b/reactos/dll/win32/hlink/hlink.rgs @@ -0,0 +1,17 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{79EAC9D0-BAF9-11CE-8C82-00AA004BA90B}' = s 'StdHlink' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + '{79EAC9D1-BAF9-11CE-8C82-00AA004BA90B}' = s 'StdHlinkBrowseContext' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + } +} diff --git a/reactos/dll/win32/hlink/hlink.spec b/reactos/dll/win32/hlink/hlink.spec index ca8144e7d76..6a5bfdfca34 100644 --- a/reactos/dll/win32/hlink/hlink.spec +++ b/reactos/dll/win32/hlink/hlink.spec @@ -30,4 +30,4 @@ @ stdcall -private DllCanUnloadNow() @ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllRegisterServer() -# @ stub -private DllUnregisterServer +@ stdcall -private DllUnregisterServer() diff --git a/reactos/dll/win32/hlink/hlink_classes.idl b/reactos/dll/win32/hlink/hlink_classes.idl new file mode 100644 index 00000000000..98b5d328095 --- /dev/null +++ b/reactos/dll/win32/hlink/hlink_classes.idl @@ -0,0 +1,36 @@ +/* + * COM Classes for hlink + * + * Copyright 2010 Alexandre Julliard + * + * 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 + */ + +[ + threading(apartment), + uuid(79eac9d0-baf9-11ce-8c82-00aa004ba90b) +] +coclass StdHlink +{ + interface IHlink; + interface IPersistStream; + interface IDataObject; +} + +[ + threading(apartment), + uuid(79eac9d1-baf9-11ce-8c82-00aa004ba90b) +] +coclass StdHlinkBrowseContext { interface IHlinkBrowseContext; } diff --git a/reactos/dll/win32/hlink/hlink_main.c b/reactos/dll/win32/hlink/hlink_main.c index cda96836484..9823a5d9320 100644 --- a/reactos/dll/win32/hlink/hlink_main.c +++ b/reactos/dll/win32/hlink/hlink_main.c @@ -21,20 +21,28 @@ #include "hlink_private.h" #include "winreg.h" +#include "rpcproxy.h" #include "hlguids.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(hlink); -typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown*, REFIID, LPVOID*); +static HINSTANCE instance; + +typedef HRESULT (*LPFNCREATEINSTANCE)(IUnknown*, REFIID, LPVOID*); typedef struct { - const IClassFactoryVtbl *lpVtbl; - LPFNCREATEINSTANCE lpfnCI; + IClassFactory IClassFactory_iface; + LPFNCREATEINSTANCE lpfnCI; } CFImpl; +static inline CFImpl *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, CFImpl, IClassFactory_iface); +} + BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("%p %d %p\n", hinstDLL, fdwReason, lpvReserved); @@ -42,6 +50,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) switch (fdwReason) { case DLL_PROCESS_ATTACH: + instance = hinstDLL; DisableThreadLibraryCalls(hinstDLL); break; case DLL_PROCESS_DETACH: @@ -252,14 +261,16 @@ HRESULT WINAPI HlinkNavigateToStringReference( LPCWSTR pwzTarget, HRESULT r; IHlink *hlink = NULL; - FIXME("%s %s %p %08x %p %08x %p %p %p\n", + TRACE("%s %s %p %08x %p %08x %p %p %p\n", debugstr_w(pwzTarget), debugstr_w(pwzLocation), pihlsite, dwSiteData, pihlframe, grfHLNF, pibc, pibsc, pihlbc); r = HlinkCreateFromString( pwzTarget, pwzLocation, NULL, pihlsite, dwSiteData, NULL, &IID_IHlink, (LPVOID*) &hlink ); - if (SUCCEEDED(r)) + if (SUCCEEDED(r)) { r = HlinkNavigate(hlink, pihlframe, grfHLNF, pibc, pibsc, pihlbc); + IHlink_Release(hlink); + } return r; } @@ -496,7 +507,7 @@ cleanup: static HRESULT WINAPI HLinkCF_fnQueryInterface ( LPCLASSFACTORY iface, REFIID riid, LPVOID *ppvObj) { - CFImpl *This = (CFImpl *)iface; + CFImpl *This = impl_from_IClassFactory(iface); TRACE("(%p)->(%s)\n",This,debugstr_guid(riid)); @@ -526,7 +537,7 @@ static ULONG WINAPI HLinkCF_fnRelease(LPCLASSFACTORY iface) static HRESULT WINAPI HLinkCF_fnCreateInstance( LPCLASSFACTORY iface, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject) { - CFImpl *This = (CFImpl *)iface; + CFImpl *This = impl_from_IClassFactory(iface); TRACE("%p->(%p,%s,%p)\n", This, pUnkOuter, debugstr_guid(riid), ppvObject); @@ -550,8 +561,8 @@ static const IClassFactoryVtbl hlcfvt = HLinkCF_fnLockServer }; -static CFImpl HLink_cf = { &hlcfvt, HLink_Constructor }; -static CFImpl HLinkBrowseContext_cf = { &hlcfvt, HLinkBrowseContext_Constructor }; +static CFImpl HLink_cf = { { &hlcfvt }, HLink_Constructor }; +static CFImpl HLinkBrowseContext_cf = { { &hlcfvt }, HLinkBrowseContext_Constructor }; /*********************************************************************** * DllGetClassObject (HLINK.@) @@ -567,55 +578,27 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) *ppv = NULL; if (IsEqualIID(rclsid, &CLSID_StdHlink)) - pcf = (IClassFactory*) &HLink_cf; + pcf = &HLink_cf.IClassFactory_iface; else if (IsEqualIID(rclsid, &CLSID_StdHlinkBrowseContext)) - pcf = (IClassFactory*) &HLinkBrowseContext_cf; + pcf = &HLinkBrowseContext_cf.IClassFactory_iface; else return CLASS_E_CLASSNOTAVAILABLE; return IClassFactory_QueryInterface(pcf, iid, ppv); } -static HRESULT register_clsid(LPCGUID guid) -{ - static const WCHAR clsid[] = - {'C','L','S','I','D','\\',0}; - static const WCHAR ips[] = - {'\\','I','n','p','r','o','c','S','e','r','v','e','r','3','2',0}; - static const WCHAR hlink[] = - {'h','l','i','n','k','.','d','l','l',0}; - static const WCHAR threading_model[] = - {'T','h','r','e','a','d','i','n','g','M','o','d','e','l',0}; - static const WCHAR apartment[] = - {'A','p','a','r','t','m','e','n','t',0}; - WCHAR path[80]; - HKEY key = NULL; - LONG r; - - lstrcpyW(path, clsid); - StringFromGUID2(guid, &path[6], 80); - lstrcatW(path, ips); - r = RegCreateKeyW(HKEY_CLASSES_ROOT, path, &key); - if (r != ERROR_SUCCESS) - return E_FAIL; - - RegSetValueExW(key, NULL, 0, REG_SZ, (const BYTE *)hlink, sizeof hlink); - RegSetValueExW(key, threading_model, 0, REG_SZ, (const BYTE *)apartment, sizeof apartment); - RegCloseKey(key); - - return S_OK; -} - /*********************************************************************** - * DllRegisterServer (HLINK.@) + * DllRegisterServer (HLINK.@) */ HRESULT WINAPI DllRegisterServer(void) { - HRESULT r; - - r = register_clsid(&CLSID_StdHlink); - if (SUCCEEDED(r)) - r = register_clsid(&CLSID_StdHlinkBrowseContext); - - return S_OK; + return __wine_register_resources( instance ); +} + +/*********************************************************************** + * DllUnregisterServer (HLINK.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( instance ); } diff --git a/reactos/dll/win32/hlink/hlink_private.h b/reactos/dll/win32/hlink/hlink_private.h index 0df374c908e..e0ff09eaa78 100644 --- a/reactos/dll/win32/hlink/hlink_private.h +++ b/reactos/dll/win32/hlink/hlink_private.h @@ -29,8 +29,8 @@ #include "wine/unicode.h" -extern HRESULT WINAPI HLink_Constructor(IUnknown*,REFIID,void**); -extern HRESULT WINAPI HLinkBrowseContext_Constructor(IUnknown*,REFIID,void**); +extern HRESULT HLink_Constructor(IUnknown*,REFIID,void**) DECLSPEC_HIDDEN; +extern HRESULT HLinkBrowseContext_Constructor(IUnknown*,REFIID,void**) DECLSPEC_HIDDEN; static inline void *heap_alloc(size_t len) { diff --git a/reactos/dll/win32/hlink/link.c b/reactos/dll/win32/hlink/link.c index b0d99aaf4e9..a9297823ebf 100644 --- a/reactos/dll/win32/hlink/link.c +++ b/reactos/dll/win32/hlink/link.c @@ -37,17 +37,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(hlink); /* known flags */ #define HLINK_SAVE_ALL (HLINK_SAVE_TARGET_FRAME_PRESENT|HLINK_SAVE_FRIENDLY_PRESENT|HLINK_SAVE_LOCATION_PRESENT|0x04|HLINK_SAVE_MONIKER_IS_ABSOLUTE|HLINK_SAVE_MONIKER_PRESENT) -static const IHlinkVtbl hlvt; -static const IPersistStreamVtbl psvt; -static const IDataObjectVtbl dovt; - typedef struct { - const IHlinkVtbl *lpVtbl; + IHlink IHlink_iface; LONG ref; - const IPersistStreamVtbl *lpPSVtbl; - const IDataObjectVtbl *lpDOVtbl; + IPersistStream IPersistStream_iface; + IDataObject IDataObject_iface; LPWSTR FriendlyName; LPWSTR Location; @@ -58,15 +54,20 @@ typedef struct BOOL absolute; } HlinkImpl; - -static inline HlinkImpl* HlinkImpl_from_IPersistStream( IPersistStream* iface) +static inline HlinkImpl *impl_from_IHlink(IHlink *iface) { - return (HlinkImpl*) ((CHAR*)iface - FIELD_OFFSET(HlinkImpl, lpPSVtbl)); + return CONTAINING_RECORD(iface, HlinkImpl, IHlink_iface); } -static inline HlinkImpl* HlinkImpl_from_IDataObject( IDataObject* iface) + +static inline HlinkImpl* impl_from_IPersistStream( IPersistStream* iface) { - return (HlinkImpl*) ((CHAR*)iface - FIELD_OFFSET(HlinkImpl, lpDOVtbl)); + return CONTAINING_RECORD(iface, HlinkImpl, IPersistStream_iface); +} + +static inline HlinkImpl* impl_from_IDataObject( IDataObject* iface) +{ + return CONTAINING_RECORD(iface, HlinkImpl, IDataObject_iface); } static HRESULT __GetMoniker(HlinkImpl* This, IMoniker** moniker, @@ -105,34 +106,10 @@ static HRESULT __GetMoniker(HlinkImpl* This, IMoniker** moniker, return S_OK; } -HRESULT WINAPI HLink_Constructor(IUnknown *pUnkOuter, REFIID riid, - LPVOID *ppv) -{ - HlinkImpl * hl; - - TRACE("unkOut=%p riid=%s\n", pUnkOuter, debugstr_guid(riid)); - *ppv = NULL; - - if (pUnkOuter) - return CLASS_E_NOAGGREGATION; - - hl = heap_alloc_zero(sizeof(HlinkImpl)); - if (!hl) - return E_OUTOFMEMORY; - - hl->ref = 1; - hl->lpVtbl = &hlvt; - hl->lpPSVtbl = &psvt; - hl->lpDOVtbl = &dovt; - - *ppv = hl; - return S_OK; -} - static HRESULT WINAPI IHlink_fnQueryInterface(IHlink* iface, REFIID riid, LPVOID *ppvObj) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE ("(%p)->(%s,%p)\n", This, debugstr_guid (riid), ppvObj); @@ -141,9 +118,9 @@ static HRESULT WINAPI IHlink_fnQueryInterface(IHlink* iface, REFIID riid, if (IsEqualIID(riid, &IID_IUnknown) || (IsEqualIID(riid, &IID_IHlink))) *ppvObj = This; else if (IsEqualIID(riid, &IID_IPersistStream)) - *ppvObj = &(This->lpPSVtbl); + *ppvObj = &This->IPersistStream_iface; else if (IsEqualIID(riid, &IID_IDataObject)) - *ppvObj = &(This->lpDOVtbl); + *ppvObj = &This->IDataObject_iface; if (*ppvObj) { @@ -155,7 +132,7 @@ static HRESULT WINAPI IHlink_fnQueryInterface(IHlink* iface, REFIID riid, static ULONG WINAPI IHlink_fnAddRef (IHlink* iface) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); ULONG refCount = InterlockedIncrement(&This->ref); TRACE("(%p)->(count=%u)\n", This, refCount - 1); @@ -165,7 +142,7 @@ static ULONG WINAPI IHlink_fnAddRef (IHlink* iface) static ULONG WINAPI IHlink_fnRelease (IHlink* iface) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(count=%u)\n", This, refCount + 1); @@ -187,7 +164,7 @@ static ULONG WINAPI IHlink_fnRelease (IHlink* iface) static HRESULT WINAPI IHlink_fnSetHlinkSite( IHlink* iface, IHlinkSite* pihlSite, DWORD dwSiteData) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p)->(%p %i)\n", This, pihlSite, dwSiteData); @@ -206,7 +183,7 @@ static HRESULT WINAPI IHlink_fnSetHlinkSite( IHlink* iface, static HRESULT WINAPI IHlink_fnGetHlinkSite( IHlink* iface, IHlinkSite** ppihlSite, DWORD *pdwSiteData) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p)->(%p %p)\n", This, ppihlSite, pdwSiteData); @@ -223,7 +200,7 @@ static HRESULT WINAPI IHlink_fnGetHlinkSite( IHlink* iface, static HRESULT WINAPI IHlink_fnSetMonikerReference( IHlink* iface, DWORD rfHLSETF, IMoniker *pmkTarget, LPCWSTR pwzLocation) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p)->(%i %p %s)\n", This, rfHLSETF, pmkTarget, debugstr_w(pwzLocation)); @@ -259,7 +236,7 @@ static HRESULT WINAPI IHlink_fnSetMonikerReference( IHlink* iface, static HRESULT WINAPI IHlink_fnSetStringReference(IHlink* iface, DWORD grfHLSETF, LPCWSTR pwzTarget, LPCWSTR pwzLocation) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p)->(%i %s %s)\n", This, grfHLSETF, debugstr_w(pwzTarget), debugstr_w(pwzLocation)); @@ -323,7 +300,7 @@ static HRESULT WINAPI IHlink_fnSetStringReference(IHlink* iface, static HRESULT WINAPI IHlink_fnGetMonikerReference(IHlink* iface, DWORD dwWhichRef, IMoniker **ppimkTarget, LPWSTR *ppwzLocation) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p) -> (%i %p %p)\n", This, dwWhichRef, ppimkTarget, ppwzLocation); @@ -348,7 +325,7 @@ static HRESULT WINAPI IHlink_fnGetMonikerReference(IHlink* iface, static HRESULT WINAPI IHlink_fnGetStringReference (IHlink* iface, DWORD dwWhichRef, LPWSTR *ppwzTarget, LPWSTR *ppwzLocation) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p) -> (%i %p %p)\n", This, dwWhichRef, ppwzTarget, ppwzLocation); @@ -396,7 +373,7 @@ static HRESULT WINAPI IHlink_fnGetStringReference (IHlink* iface, static HRESULT WINAPI IHlink_fnSetFriendlyName (IHlink *iface, LPCWSTR pwzFriendlyName) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p) -> (%s)\n", This, debugstr_w(pwzFriendlyName)); @@ -409,7 +386,7 @@ static HRESULT WINAPI IHlink_fnSetFriendlyName (IHlink *iface, static HRESULT WINAPI IHlink_fnGetFriendlyName (IHlink* iface, DWORD grfHLFNAMEF, LPWSTR* ppwzFriendlyName) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p) -> (%i %p)\n", This, grfHLFNAMEF, ppwzFriendlyName); @@ -445,7 +422,7 @@ static HRESULT WINAPI IHlink_fnGetFriendlyName (IHlink* iface, static HRESULT WINAPI IHlink_fnSetTargetFrameName(IHlink* iface, LPCWSTR pwzTargetFramename) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p)->(%s)\n", This, debugstr_w(pwzTargetFramename)); heap_free(This->TargetFrameName); @@ -457,10 +434,18 @@ static HRESULT WINAPI IHlink_fnSetTargetFrameName(IHlink* iface, static HRESULT WINAPI IHlink_fnGetTargetFrameName(IHlink* iface, LPWSTR *ppwzTargetFrameName) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); TRACE("(%p)->(%p)\n", This, ppwzTargetFrameName); + + if(!This->TargetFrameName) { + *ppwzTargetFrameName = NULL; + return S_FALSE; + } + *ppwzTargetFrameName = hlink_co_strdupW( This->TargetFrameName ); + if(!*ppwzTargetFrameName) + return E_OUTOFMEMORY; return S_OK; } @@ -474,7 +459,7 @@ static HRESULT WINAPI IHlink_fnGetMiscStatus(IHlink* iface, DWORD* pdwStatus) static HRESULT WINAPI IHlink_fnNavigate(IHlink* iface, DWORD grfHLNF, LPBC pbc, IBindStatusCallback *pbsc, IHlinkBrowseContext *phbc) { - HlinkImpl *This = (HlinkImpl*)iface; + HlinkImpl *This = impl_from_IHlink(iface); IMoniker *mon = NULL; HRESULT r; @@ -565,23 +550,23 @@ static const IHlinkVtbl hlvt = static HRESULT WINAPI IDataObject_fnQueryInterface(IDataObject* iface, REFIID riid, LPVOID *ppvObj) { - HlinkImpl *This = HlinkImpl_from_IDataObject(iface); + HlinkImpl *This = impl_from_IDataObject(iface); TRACE("%p\n", This); - return IHlink_QueryInterface((IHlink*)This, riid, ppvObj); + return IHlink_QueryInterface(&This->IHlink_iface, riid, ppvObj); } static ULONG WINAPI IDataObject_fnAddRef (IDataObject* iface) { - HlinkImpl *This = HlinkImpl_from_IDataObject(iface); + HlinkImpl *This = impl_from_IDataObject(iface); TRACE("%p\n", This); - return IHlink_AddRef((IHlink*)This); + return IHlink_AddRef(&This->IHlink_iface); } static ULONG WINAPI IDataObject_fnRelease (IDataObject* iface) { - HlinkImpl *This = HlinkImpl_from_IDataObject(iface); + HlinkImpl *This = impl_from_IDataObject(iface); TRACE("%p\n", This); - return IHlink_Release((IHlink*)This); + return IHlink_Release(&This->IHlink_iface); } static HRESULT WINAPI IDataObject_fnGetData(IDataObject* iface, @@ -667,29 +652,29 @@ static const IDataObjectVtbl dovt = static HRESULT WINAPI IPersistStream_fnQueryInterface(IPersistStream* iface, REFIID riid, LPVOID *ppvObj) { - HlinkImpl *This = HlinkImpl_from_IPersistStream(iface); + HlinkImpl *This = impl_from_IPersistStream(iface); TRACE("(%p)\n", This); - return IHlink_QueryInterface((IHlink*)This, riid, ppvObj); + return IHlink_QueryInterface(&This->IHlink_iface, riid, ppvObj); } static ULONG WINAPI IPersistStream_fnAddRef (IPersistStream* iface) { - HlinkImpl *This = HlinkImpl_from_IPersistStream(iface); + HlinkImpl *This = impl_from_IPersistStream(iface); TRACE("(%p)\n", This); - return IHlink_AddRef((IHlink*)This); + return IHlink_AddRef(&This->IHlink_iface); } static ULONG WINAPI IPersistStream_fnRelease (IPersistStream* iface) { - HlinkImpl *This = HlinkImpl_from_IPersistStream(iface); + HlinkImpl *This = impl_from_IPersistStream(iface); TRACE("(%p)\n", This); - return IHlink_Release((IHlink*)This); + return IHlink_Release(&This->IHlink_iface); } static HRESULT WINAPI IPersistStream_fnGetClassID(IPersistStream* iface, CLSID* pClassID) { - HlinkImpl *This = HlinkImpl_from_IPersistStream(iface); + HlinkImpl *This = impl_from_IPersistStream(iface); TRACE("(%p)\n", This); *pClassID = CLSID_StdHlink; return S_OK; @@ -763,7 +748,7 @@ static HRESULT WINAPI IPersistStream_fnLoad(IPersistStream* iface, HRESULT r; DWORD hdr[2]; DWORD read; - HlinkImpl *This = HlinkImpl_from_IPersistStream(iface); + HlinkImpl *This = impl_from_IPersistStream(iface); r = IStream_Read(pStm, hdr, sizeof(hdr), &read); if (read != sizeof(hdr) || (hdr[0] != HLINK_SAVE_MAGIC)) @@ -816,7 +801,7 @@ static HRESULT WINAPI IPersistStream_fnSave(IPersistStream* iface, IStream* pStm, BOOL fClearDirty) { HRESULT r; - HlinkImpl *This = HlinkImpl_from_IPersistStream(iface); + HlinkImpl *This = impl_from_IPersistStream(iface); DWORD hdr[2]; IMoniker *moniker; @@ -887,7 +872,7 @@ static HRESULT WINAPI IPersistStream_fnGetSizeMax(IPersistStream* iface, ULARGE_INTEGER* pcbSize) { HRESULT r; - HlinkImpl *This = HlinkImpl_from_IPersistStream(iface); + HlinkImpl *This = impl_from_IPersistStream(iface); IMoniker *moniker; TRACE("(%p) Moniker(%p)\n", This, This->Moniker); @@ -937,3 +922,26 @@ static const IPersistStreamVtbl psvt = IPersistStream_fnSave, IPersistStream_fnGetSizeMax, }; + +HRESULT HLink_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv) +{ + HlinkImpl * hl; + + TRACE("unkOut=%p riid=%s\n", pUnkOuter, debugstr_guid(riid)); + *ppv = NULL; + + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + hl = heap_alloc_zero(sizeof(HlinkImpl)); + if (!hl) + return E_OUTOFMEMORY; + + hl->ref = 1; + hl->IHlink_iface.lpVtbl = &hlvt; + hl->IPersistStream_iface.lpVtbl = &psvt; + hl->IDataObject_iface.lpVtbl = &dovt; + + *ppv = hl; + return S_OK; +} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index afeb16ce695..8b061f247cd 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -63,7 +63,7 @@ reactos/dll/win32/dwmapi # Synced to Wine-1.3.37 reactos/dll/win32/fusion # Synced to Wine-1.3.37 reactos/dll/win32/gdiplus # Autosync reactos/dll/win32/hhctrl.ocx # Autosync -reactos/dll/win32/hlink # Autosync +reactos/dll/win32/hlink # Synced to Wine-1.3.37 reactos/dll/win32/hnetcfg # Autosync reactos/dll/win32/httpapi # Synced to Wine-1.3.37 reactos/dll/win32/iccvid # Autosync From 2d45672a9daef0983f829bdfcebd90a52ecb45d9 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 12:14:09 +0000 Subject: [PATCH 113/289] [HLINK_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55237 --- rostests/winetests/hlink/browse_ctx.c | 14 +- rostests/winetests/hlink/hlink.c | 473 ++++++++++++++++++++++++-- 2 files changed, 449 insertions(+), 38 deletions(-) diff --git a/rostests/winetests/hlink/browse_ctx.c b/rostests/winetests/hlink/browse_ctx.c index e25333d849c..e9293d1e4ad 100644 --- a/rostests/winetests/hlink/browse_ctx.c +++ b/rostests/winetests/hlink/browse_ctx.c @@ -24,16 +24,6 @@ #include "wine/test.h" -/* 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)); -} - static void test_SetInitialHlink(void) { IHlinkBrowseContext *bc; @@ -68,7 +58,7 @@ static void test_SetInitialHlink(void) hres = IMoniker_GetDisplayName(found_moniker, bindctx, NULL, &found_name); ok(hres == S_OK, "GetDisplayName failed: 0x%08x\n", hres); - ok(!strcmp_ww(found_name, exp_name), "Found display name should have been %s, was: %s\n", wine_dbgstr_w(exp_name), wine_dbgstr_w(found_name)); + ok(!lstrcmpW(found_name, exp_name), "Found display name should have been %s, was: %s\n", wine_dbgstr_w(exp_name), wine_dbgstr_w(found_name)); CoTaskMemFree(exp_name); CoTaskMemFree(found_name); @@ -124,6 +114,8 @@ static void test_BrowseWindowInfo(void) hres = IHlinkBrowseContext_GetBrowseWindowInfo(bc, &bwinfo_get); ok(hres == S_OK, "GetBrowseWindowInfo failed: 0x%08x\n", hres); ok(!memcmp(&bwinfo_set, &bwinfo_get, sizeof(HLBWINFO)), "Set and Get differ\n"); + + IHlinkBrowseContext_Release(bc); } START_TEST(browse_ctx) diff --git a/rostests/winetests/hlink/hlink.c b/rostests/winetests/hlink/hlink.c index cf031f5c9c7..15191dfe6da 100644 --- a/rostests/winetests/hlink/hlink.c +++ b/rostests/winetests/hlink/hlink.c @@ -57,6 +57,14 @@ DEFINE_EXPECT(IsSystemMoniker); DEFINE_EXPECT(BindToStorage); DEFINE_EXPECT(GetDisplayName); +DEFINE_EXPECT(ComposeWith); +DEFINE_EXPECT(OnNavigationComplete); +DEFINE_EXPECT(Enum); +DEFINE_EXPECT(Reduce); + +DEFINE_EXPECT(GetClassID); +DEFINE_EXPECT(Save); + static const char *debugstr_guid(REFIID riid) { static char buf[50]; @@ -347,7 +355,6 @@ static void test_persist_save_data(const char *testname, IHlink *lnk, const unsigned char *data; DWORD i; BOOL same; - unsigned int expected_data_win9x_size = 0; hr = IHlink_QueryInterface(lnk, &IID_IPersistStream, (void **)&ps); ok(hr == S_OK, "IHlink_QueryInterface failed with error 0x%08x\n", hr); @@ -365,13 +372,9 @@ static void test_persist_save_data(const char *testname, IHlink *lnk, data = GlobalLock(hglobal); - if (expected_data_size % 4) - expected_data_win9x_size = 4 * ((expected_data_size / 4) + 1); - /* first check we have the right amount of data */ ok((data_size == expected_data_size) || - (data_size == expected_data_alt_size) || - broken(data_size == expected_data_win9x_size), /* Win9x and WinMe */ + (data_size == expected_data_alt_size), "%s: Size of saved data differs (expected %d or %d, actual %d)\n", testname, expected_data_size, expected_data_alt_size, data_size); @@ -437,9 +440,9 @@ static void test_persist(void) hr = HlinkCreateFromString(url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinkCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); if (!lnk) { - skip("Can't create lnk, skipping test_persist. Was wineprefixcreate run properly?\n"); + skip("Can't create lnk, skipping test_persist.\n"); return; } test_persist_save_data("url only", lnk, @@ -449,7 +452,7 @@ static void test_persist(void) hr = HlinkCreateFromString(url, NULL, friendly_name, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("url + friendly name", lnk, expected_hlink_data2, sizeof(expected_hlink_data2), expected_hlink_data2_ie7, sizeof(expected_hlink_data2_ie7)); @@ -457,7 +460,7 @@ static void test_persist(void) hr = HlinkCreateFromString(url, location, friendly_name, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("url + friendly_name + location", lnk, expected_hlink_data3, sizeof(expected_hlink_data3), expected_hlink_data3_ie7, sizeof(expected_hlink_data3_ie7)); @@ -465,7 +468,7 @@ static void test_persist(void) hr = HlinkCreateFromString(rel_url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("relative url", lnk, expected_hlink_data4, sizeof(expected_hlink_data4), expected_hlink_data4, sizeof(expected_hlink_data4)); @@ -473,7 +476,7 @@ static void test_persist(void) hr = HlinkCreateFromString(url, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); hr = IHlink_SetTargetFrameName(lnk, target_frame_name); ok(hr == S_OK, "IHlink_SetTargetFrameName failed with error 0x%08x\n", hr); test_persist_save_data("url + target frame name", lnk, @@ -483,7 +486,7 @@ static void test_persist(void) hr = HlinkCreateFromString(filename, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (LPVOID*) &lnk); - ok(hr == S_OK, "IHlinCreateFromString failed with error 0x%08x\n", hr); + ok(hr == S_OK, "HlinkCreateFromString failed with error 0x%08x\n", hr); test_persist_save_data("filename", lnk, expected_hlink_data6, sizeof(expected_hlink_data6), expected_hlink_data6, sizeof(expected_hlink_data6)); @@ -813,8 +816,9 @@ static ULONG WINAPI Moniker_Release(IMoniker *iface) static HRESULT WINAPI Moniker_GetClassID(IMoniker *iface, CLSID *pClassID) { - ok(0, "unexpected call\n"); - return E_NOTIMPL; + CHECK_EXPECT(GetClassID); + *pClassID = IID_IUnknown; /* not a valid CLSID */ + return S_OK; } static HRESULT WINAPI Moniker_IsDirty(IMoniker *iface) @@ -831,8 +835,8 @@ static HRESULT WINAPI Moniker_Load(IMoniker *iface, IStream *pStm) static HRESULT WINAPI Moniker_Save(IMoniker *iface, IStream *pStm, BOOL fClearDirty) { - ok(0, "unexpected call\n"); - return E_NOTIMPL; + CHECK_EXPECT(Save); + return S_OK; } static HRESULT WINAPI Moniker_GetSizeMax(IMoniker *iface, ULARGE_INTEGER *pcbSize) @@ -876,7 +880,7 @@ static HRESULT WINAPI Moniker_BindToStorage(IMoniker *iface, IBindCtx *pbc, IMon static HRESULT WINAPI Moniker_Reduce(IMoniker *iface, IBindCtx *pbc, DWORD dwReduceHowFar, IMoniker **ppmkToLeft, IMoniker **ppmkReduced) { - ok(0, "unexpected call\n"); + CHECK_EXPECT(Reduce); return E_NOTIMPL; } @@ -889,7 +893,7 @@ static HRESULT WINAPI Moniker_ComposeWith(IMoniker *iface, IMoniker *pmkRight, static HRESULT WINAPI Moniker_Enum(IMoniker *iface, BOOL fForwrd, IEnumMoniker **ppenumMoniker) { - ok(0, "unexpected call\n"); + CHECK_EXPECT(Enum); return E_NOTIMPL; } @@ -1056,6 +1060,7 @@ static void test_HlinkGetSetMonikerReference(void) ok(hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres); hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc); + ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres); ok(found_trgt == dummy, "Found target should've been %p, was: %p\n", dummy, found_trgt); ok(lstrcmpW(found_loc, two) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(two), wine_dbgstr_w(found_loc)); IMoniker_Release(found_trgt); @@ -1066,6 +1071,7 @@ static void test_HlinkGetSetMonikerReference(void) ok(hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres); hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc); + ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres); ok(found_trgt == dummy2, "Found target should've been %p, was: %p\n", dummy2, found_trgt); ok(lstrcmpW(found_loc, two) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(two), wine_dbgstr_w(found_loc)); IMoniker_Release(found_trgt); @@ -1076,6 +1082,7 @@ static void test_HlinkGetSetMonikerReference(void) ok(hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres); hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc); + ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres); ok(found_trgt == dummy, "Found target should've been %p, was: %p\n", dummy, found_trgt); ok(lstrcmpW(found_loc, one) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(found_loc)); IMoniker_Release(found_trgt); @@ -1086,17 +1093,19 @@ static void test_HlinkGetSetMonikerReference(void) ok(hres == E_INVALIDARG, "IHlink_SetMonikerReference should've failed with E_INVALIDARG (0x%08x), failed with 0x%08x\n", E_INVALIDARG, hres); hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc); + ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres); ok(found_trgt == dummy, "Found target should've been %p, was: %p\n", dummy, found_trgt); ok(lstrcmpW(found_loc, one) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(found_loc)); IMoniker_Release(found_trgt); CoTaskMemFree(found_loc); /* invalid HLINKSETF flags */ - hres = IHlink_SetMonikerReference(hlink, 12, dummy2, two); /* Windows returns garbage; on 32-bit it returns the flags probably because the compiler happened to store them in %eax at some point */ - if (0) ok(hres == 12, "IHlink_SetMonikerReference should've failed with 0x%08x, failed with 0x%08x\n", 12, hres); + if (0) + IHlink_SetMonikerReference(hlink, 12, dummy2, two); hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc); + ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres); ok(found_trgt == dummy, "Found target should've been %p, was: %p\n", dummy, found_trgt); ok(lstrcmpW(found_loc, one) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(found_loc)); IMoniker_Release(found_trgt); @@ -1107,6 +1116,7 @@ static void test_HlinkGetSetMonikerReference(void) ok(hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres); hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc); + ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres); ok(found_trgt == dummy2, "Found target should've been %p, was: %p\n", dummy2, found_trgt); ok(lstrcmpW(found_loc, one) == 0, "Found location should've been %s, was: %s\n", wine_dbgstr_w(one), wine_dbgstr_w(found_loc)); IMoniker_Release(found_trgt); @@ -1117,6 +1127,7 @@ static void test_HlinkGetSetMonikerReference(void) ok(hres == S_OK, "IHlink_SetMonikerReference failed: 0x%08x\n", hres); hres = IHlink_GetMonikerReference(hlink, HLINKGETREF_DEFAULT, &found_trgt, &found_loc); + ok(hres == S_OK, "IHlink_GetMonikerReference failed: 0x%08x\n", hres); ok(found_trgt == NULL, "Found target should've been %p, was: %p\n", NULL, found_trgt); ok(found_loc == NULL, "Found location should've been %s, was: %s\n", wine_dbgstr_w(NULL), wine_dbgstr_w(found_loc)); if(found_trgt) @@ -1244,12 +1255,12 @@ static void test_HlinkGetSetStringReference(void) CoTaskMemFree(fnd_tgt); CoTaskMemFree(fnd_loc); - hres = IHlink_SetStringReference(link, 4, NULL, NULL); - /* Windows returns garbage; on 32-bit it returns the flags probably because the compiler happened to store them in %eax at some point */ - if (0) ok(hres == 4, "IHlink_SetStringReference should have failed with 0x4, instead: 0x%08x\n", hres); - - hres = IHlink_SetStringReference(link, -4, NULL, NULL); - if (0) ok(hres == -4, "IHlink_SetStringReference should have failed with 0xFFFFFFFC, instead: 0x%08x\n", hres); + if (0) + { + /* Windows returns garbage; on 32-bit it returns the flags probably because the compiler happened to store them in %eax at some point */ + IHlink_SetStringReference(link, 4, NULL, NULL); + IHlink_SetStringReference(link, -4, NULL, NULL); + } IHlink_Release(link); } @@ -1442,6 +1453,411 @@ static void test_HashLink(void) } } +static WCHAR site_monikerW[] = {'S','I','T','E','_','M','O','N','I','K','E','R',0}; +static WCHAR ref_monikerW[] = {'R','E','F','_','M','O','N','I','K','E','R',0}; + +static HRESULT WINAPI hls_test_Moniker_BindToStorage(IMoniker *iface, + IBindCtx *pbc, IMoniker *toLeft, REFIID riid, void **obj) +{ + ok(0, "BTS: %p %p %p %p %p\n", iface, pbc, toLeft, riid, obj); + return E_NOTIMPL; +} + +static HRESULT WINAPI hls_site_Moniker_ComposeWith(IMoniker *iface, + IMoniker *right, BOOL onlyIfNotGeneric, IMoniker **composite) +{ + LPOLESTR rightName; + HRESULT hres; + + ok(onlyIfNotGeneric == 0, "Expected onlyIfNotGeneric to be FALSE\n"); + + CHECK_EXPECT(ComposeWith); + + hres = IMoniker_GetDisplayName(right, NULL, NULL, &rightName); + ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres); + ok(!lstrcmpW(rightName, ref_monikerW), + "Expected to get moniker set via SetMonikerReference, instead got: %s\n", + wine_dbgstr_w(rightName)); + CoTaskMemFree(rightName); + + *composite = NULL; + + /* unlikely error code to verify this return result is used */ + return E_OUTOFMEMORY; +} + +static HRESULT WINAPI hls_site_Moniker_GetDisplayName(IMoniker *iface, + IBindCtx *pbc, IMoniker *toLeft, LPOLESTR *displayName) +{ + *displayName = CoTaskMemAlloc(sizeof(site_monikerW)); + memcpy(*displayName, site_monikerW, sizeof(site_monikerW)); + return S_OK; +} + +static HRESULT WINAPI hls_ref_Moniker_GetDisplayName(IMoniker *iface, + IBindCtx *pbc, IMoniker *toLeft, LPOLESTR *displayName) +{ + *displayName = CoTaskMemAlloc(sizeof(ref_monikerW)); + memcpy(*displayName, ref_monikerW, sizeof(ref_monikerW)); + return S_OK; +} + +static HRESULT WINAPI hls_test_Moniker_IsSystemMoniker(IMoniker *iface, + DWORD *mksys) +{ + return S_FALSE; +} + +static IMonikerVtbl hls_site_MonikerVtbl = { + Moniker_QueryInterface, + Moniker_AddRef, + Moniker_Release, + Moniker_GetClassID, + Moniker_IsDirty, + Moniker_Load, + Moniker_Save, + Moniker_GetSizeMax, + Moniker_BindToObject, + hls_test_Moniker_BindToStorage, + Moniker_Reduce, + hls_site_Moniker_ComposeWith, + Moniker_Enum, + Moniker_IsEqual, + Moniker_Hash, + Moniker_IsRunning, + Moniker_GetTimeOfLastChange, + Moniker_Inverse, + Moniker_CommonPrefixWith, + Moniker_RelativePathTo, + hls_site_Moniker_GetDisplayName, + Moniker_ParseDisplayName, + hls_test_Moniker_IsSystemMoniker +}; + +static IMonikerVtbl hls_ref_MonikerVtbl = { + Moniker_QueryInterface, + Moniker_AddRef, + Moniker_Release, + Moniker_GetClassID, + Moniker_IsDirty, + Moniker_Load, + Moniker_Save, + Moniker_GetSizeMax, + Moniker_BindToObject, + hls_test_Moniker_BindToStorage, + Moniker_Reduce, + Moniker_ComposeWith, + Moniker_Enum, + Moniker_IsEqual, + Moniker_Hash, + Moniker_IsRunning, + Moniker_GetTimeOfLastChange, + Moniker_Inverse, + Moniker_CommonPrefixWith, + Moniker_RelativePathTo, + hls_ref_Moniker_GetDisplayName, + Moniker_ParseDisplayName, + hls_test_Moniker_IsSystemMoniker +}; + +static IMoniker hls_site_Moniker = { &hls_site_MonikerVtbl }; +static IMoniker hls_ref_Moniker = { &hls_ref_MonikerVtbl }; + +static HRESULT WINAPI hls_QueryInterface(IHlinkSite *iface, REFGUID iid, + void **obj) +{ + ok(0, "QI: %p %s %p\n", iface, debugstr_guid(iid), obj); + return E_NOTIMPL; +} + +static ULONG WINAPI hls_AddRef(IHlinkSite *iface) +{ + return 2; +} + +static ULONG WINAPI hls_Release(IHlinkSite *iface) +{ + return 1; +} + +static HRESULT WINAPI hls_QueryService(IHlinkSite *iface, DWORD siteData, + REFGUID service, REFIID riid, IUnknown **punk) +{ + ok(0, "QS: %p %x %s %s %p\n", iface, siteData, debugstr_guid(service), + debugstr_guid(riid), punk); + return E_NOTIMPL; +} + +static HRESULT WINAPI hls_GetMoniker(IHlinkSite *iface, DWORD siteData, + DWORD assign, DWORD which, IMoniker **pmk) +{ + ok(siteData == 17, "Expected siteData == 17, got: %d\n", siteData); + *pmk = &hls_site_Moniker; + return S_OK; +} + +static HRESULT WINAPI hls_ReadyToNavigate(IHlinkSite *iface, DWORD siteData, + DWORD reserved) +{ + ok(0, "RTN: %p %x %x\n", iface, siteData, reserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI hls_OnNavigationComplete(IHlinkSite *iface, + DWORD siteData, DWORD reserved, HRESULT error, LPCWSTR errorStr) +{ + CHECK_EXPECT(OnNavigationComplete); + ok(siteData == 17, "Expected siteData == 17, got: %d\n", siteData); + ok(error == E_OUTOFMEMORY, "Expected E_OUTOFMEMORY, got: %08x\n", error); + return E_NOTIMPL; +} + +static IHlinkSiteVtbl HlinkSiteVtbl = { + hls_QueryInterface, + hls_AddRef, + hls_Release, + hls_QueryService, + hls_GetMoniker, + hls_ReadyToNavigate, + hls_OnNavigationComplete +}; + +static IHlinkSite HlinkSite = { &HlinkSiteVtbl }; + +static void test_HlinkSite(void) +{ + IHlink *hl; + IMoniker *mon_ref; + IBindCtx *pbc; + HRESULT hres; + + hres = HlinkCreateFromString(NULL, NULL, NULL, NULL, 0, NULL, + &IID_IHlink, (LPVOID*)&hl); + ok(hres == S_OK, "HlinkCreateFromString failed: %08x\n", hres); + getMonikerRef(hl, NULL, NULL); + + hres = IHlink_SetHlinkSite(hl, &HlinkSite, 17); + ok(hres == S_OK, "SetHlinkSite failed: %08x\n", hres); + getMonikerRef(hl, NULL, NULL); + getStringRef(hl, NULL, NULL); + + hres = IHlink_GetMonikerReference(hl, HLINKGETREF_RELATIVE, &mon_ref, NULL); + ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres); + ok(mon_ref == NULL, "Didn't get expected moniker, instead: %p\n", mon_ref); + + hres = IHlink_GetMonikerReference(hl, HLINKGETREF_ABSOLUTE, &mon_ref, NULL); + ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres); + ok(mon_ref == &hls_site_Moniker, "Didn't get expected moniker, instead: %p\n", mon_ref); + + SET_EXPECT(Reduce); + SET_EXPECT(Enum); + hres = IHlink_SetMonikerReference(hl, HLINKSETF_TARGET, &hls_ref_Moniker, NULL); + ok(hres == S_OK, "SetMonikerReference failed: %08x\n", hres); + todo_wine CHECK_CALLED(Reduce); + todo_wine CHECK_CALLED(Enum); + + getMonikerRef(hl, &hls_ref_Moniker, NULL); + + SET_EXPECT(Enum); + getStringRef(hl, ref_monikerW, NULL); + todo_wine CHECK_CALLED(Enum); + + hres = IHlink_GetMonikerReference(hl, HLINKGETREF_RELATIVE, &mon_ref, NULL); + ok(hres == S_OK, "GetMonikerReference failed: %08x\n", hres); + ok(mon_ref == &hls_ref_Moniker, "Didn't get expected moniker, instead: %p\n", mon_ref); + IMoniker_Release(mon_ref); + + SET_EXPECT(ComposeWith); + hres = IHlink_GetMonikerReference(hl, HLINKGETREF_ABSOLUTE, &mon_ref, NULL); + ok(hres == E_OUTOFMEMORY, "Expected E_OUTOFMEMORY, got: %08x\n", hres); + ok(mon_ref == NULL, "Shouldn't have got a Moniker, got: %p\n", mon_ref); + CHECK_CALLED(ComposeWith); + + hres = CreateBindCtx(0, &pbc); + ok(hres == S_OK, "CreateBindCtx failed: %08x\n", hres); + + SET_EXPECT(ComposeWith); + SET_EXPECT(OnNavigationComplete); + hres = IHlink_Navigate(hl, 0, pbc, NULL, NULL); + ok(hres == E_OUTOFMEMORY, "Navigate should've failed: %08x\n", hres); + CHECK_CALLED(ComposeWith); + CHECK_CALLED(OnNavigationComplete); + + IBindCtx_Release(pbc); + IHlink_Release(hl); + + SET_EXPECT(Reduce); + SET_EXPECT(Enum); + hres = HlinkCreateFromMoniker(&hls_ref_Moniker, NULL, NULL, &HlinkSite, 17, + NULL, &IID_IHlink, (LPVOID*)&hl); + ok(hres == S_OK, "HlinkCreateFromMoniker failed: %08x\n", hres); + todo_wine CHECK_CALLED(Reduce); + todo_wine CHECK_CALLED(Enum); + getMonikerRef(hl, &hls_ref_Moniker, NULL); + IHlink_Release(hl); + + hres = HlinkCreateFromMoniker(NULL, NULL, NULL, &HlinkSite, 17, + NULL, &IID_IHlink, (LPVOID*)&hl); + ok(hres == S_OK, "HlinkCreateFromMoniker failed: %08x\n", hres); + getMonikerRef(hl, NULL, NULL); + IHlink_Release(hl); +} + +static void test_HlinkClone(void) +{ + HRESULT hres; + IHlink *hl, *cloned = NULL; + IMoniker *dummy, *fnd_mk; + IHlinkSite *fnd_site; + WCHAR *fnd_name; + DWORD fnd_data; + const WCHAR one[] = {'1',0}; + const WCHAR two[] = {'2',0}; + const WCHAR name[] = {'a',0}; + + hres = HlinkClone(NULL, NULL, NULL, 0, NULL); + ok(hres == E_INVALIDARG, "Got wrong failure code: %08x\n", hres); + + hres = HlinkCreateFromString(NULL, NULL, NULL, NULL, 0, NULL, + &IID_IHlink, (void**)&hl); + ok(hres == S_OK, "HlinkCreateFromString failed: %08x\n", hres); + + hres = HlinkClone(hl, &IID_IHlink, NULL, 0, NULL); + ok(hres == E_INVALIDARG, "Got wrong failure code: %08x\n", hres); + + if (0) + { + /* crash on Windows XP */ + HlinkClone(hl, NULL, NULL, 0, NULL); + + HlinkClone(hl, NULL, NULL, 0, (void**)&cloned); + } + + hres = HlinkClone(hl, &IID_IHlink, NULL, 0, (void**)&cloned); + ok(hres == S_OK, "HlinkClone failed: %08x\n", hres); + ok(cloned != NULL, "Didn't get a clone\n"); + getMonikerRef(cloned, NULL, NULL); + IHlink_Release(cloned); + + IHlink_Release(hl); + + SET_EXPECT(Reduce); + SET_EXPECT(Enum); + hres = HlinkCreateFromMoniker(&hls_ref_Moniker, two, NULL, NULL, 0, NULL, &IID_IHlink, (void**)&hl); + todo_wine CHECK_CALLED(Reduce); + todo_wine CHECK_CALLED(Enum); + ok(hres == S_OK, "HlinkCreateFromMoniker failed: 0x%08x\n", hres); + getMonikerRef(hl, &hls_ref_Moniker, two); + + SET_EXPECT(Save); + SET_EXPECT(GetClassID); + cloned = (IHlink*)0xdeadbeef; + hres = HlinkClone(hl, &IID_IHlink, NULL, 0, (void**)&cloned); + /* fails because of invalid CLSID given by Moniker_GetClassID */ + ok(hres == REGDB_E_CLASSNOTREG, "Wrong error code: %08x\n", hres); + ok(cloned == NULL, "Shouldn't have gotten a clone\n"); + CHECK_CALLED(Save); + CHECK_CALLED(GetClassID); + + IHlink_Release(hl); + + hres = CreateItemMoniker(one, one, &dummy); + ok(hres == S_OK, "CreateItemMoniker failed: 0x%08x\n", hres); + + hres = HlinkCreateFromMoniker(dummy, two, name, &HlinkSite, 17, NULL, &IID_IHlink, (void**)&hl); + ok(hres == S_OK, "HlinkCreateFromMoniker failed: 0x%08x\n", hres); + getMonikerRef(hl, dummy, two); + + cloned = NULL; + hres = HlinkClone(hl, &IID_IHlink, NULL, 0, (void**)&cloned); + ok(hres == S_OK, "HlinkClone failed: %08x\n", hres); + ok(cloned != NULL, "Should have gotten a clone\n"); + + fnd_mk = getMonikerRef(cloned, (IMoniker*)0xFFFFFFFF, two); + ok(fnd_mk != NULL, "Expected non-null Moniker\n"); + ok(fnd_mk != dummy, "Expected a new Moniker to be created\n"); + + fnd_name = NULL; + hres = IHlink_GetFriendlyName(cloned, HLFNAMEF_DEFAULT, &fnd_name); + ok(hres == S_OK, "GetFriendlyName failed: %08x\n", hres); + ok(fnd_name != NULL, "Expected friendly name to be non-NULL\n"); + ok(lstrcmpW(fnd_name, name) == 0, "Expected friendly name to be %s, was %s\n", + wine_dbgstr_w(name), wine_dbgstr_w(fnd_name)); + CoTaskMemFree(fnd_name); + + fnd_site = (IHlinkSite*)0xdeadbeef; + fnd_data = 4; + hres = IHlink_GetHlinkSite(cloned, &fnd_site, &fnd_data); + ok(hres == S_OK, "GetHlinkSite failed: %08x\n", hres); + ok(fnd_site == NULL, "Expected NULL site\n"); + ok(fnd_data == 4, "Expected site data to be 4, was: %d\n", fnd_data); + + IHlink_Release(cloned); + IHlink_Release(hl); + + hres = HlinkCreateFromMoniker(dummy, NULL, NULL, NULL, 0, NULL, &IID_IHlink, (void**)&hl); + ok(hres == S_OK, "HlinkCreateFromMoniker failed: 0x%08x\n", hres); + getMonikerRef(hl, dummy, NULL); + + cloned = NULL; + hres = HlinkClone(hl, &IID_IHlink, &HlinkSite, 17, (void**)&cloned); + ok(hres == S_OK, "HlinkClone failed: %08x\n", hres); + ok(cloned != NULL, "Should have gotten a clone\n"); + + fnd_mk = getMonikerRef(cloned, (IMoniker*)0xFFFFFFFF, NULL); + ok(fnd_mk != NULL, "Expected non-null Moniker\n"); + ok(fnd_mk != dummy, "Expected a new Moniker to be created\n"); + + fnd_site = (IHlinkSite*)0xdeadbeef; + fnd_data = 4; + hres = IHlink_GetHlinkSite(cloned, &fnd_site, &fnd_data); + ok(hres == S_OK, "GetHlinkSite failed: %08x\n", hres); + ok(fnd_site == &HlinkSite, "Expected found site to be HlinkSite, was: %p\n", fnd_site); + ok(fnd_data == 17, "Expected site data to be 17, was: %d\n", fnd_data); + + IHlink_Release(cloned); + IHlink_Release(hl); + + IMoniker_Release(dummy); +} + +static void test_StdHlink(void) +{ + IHlink *hlink; + WCHAR *str; + HRESULT hres; + + static const WCHAR testW[] = {'t','e','s','t',0}; + + hres = CoCreateInstance(&CLSID_StdHlink, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IHlink, (void**)&hlink); + ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres); + + str = (void*)0xdeadbeef; + hres = IHlink_GetTargetFrameName(hlink, &str); + ok(hres == S_FALSE, "GetTargetFrameName failed: %08x\n", hres); + ok(!str, "str = %s\n", wine_dbgstr_w(str)); + + hres = IHlink_SetTargetFrameName(hlink, testW); + ok(hres == S_OK, "SetTargetFrameName failed: %08x\n", hres); + + str = (void*)0xdeadbeef; + hres = IHlink_GetTargetFrameName(hlink, &str); + ok(hres == S_OK, "GetTargetFrameName failed: %08x\n", hres); + ok(!lstrcmpW(str, testW), "str = %s\n", wine_dbgstr_w(str)); + CoTaskMemFree(str); + + hres = IHlink_SetTargetFrameName(hlink, NULL); + ok(hres == S_OK, "SetTargetFrameName failed: %08x\n", hres); + + str = (void*)0xdeadbeef; + hres = IHlink_GetTargetFrameName(hlink, &str); + ok(hres == S_FALSE, "GetTargetFrameName failed: %08x\n", hres); + ok(!str, "str = %s\n", wine_dbgstr_w(str)); + + IHlink_Release(hlink); +} + START_TEST(hlink) { CoInitialize(NULL); @@ -1457,6 +1873,9 @@ START_TEST(hlink) test_HlinkGetSetStringReference(); test_HlinkMoniker(); test_HashLink(); + test_HlinkSite(); + test_HlinkClone(); + test_StdHlink(); CoUninitialize(); } From 1cb7059396412aa9e4f3a3a649e85b68017f9529 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 13:09:03 +0000 Subject: [PATCH 114/289] [HNETCFG] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55239 --- reactos/dll/win32/hnetcfg/CMakeLists.txt | 3 +- reactos/dll/win32/hnetcfg/apps.c | 18 +- reactos/dll/win32/hnetcfg/hnetcfg.c | 32 +- reactos/dll/win32/hnetcfg/hnetcfg.idl | 35 ++ reactos/dll/win32/hnetcfg/hnetcfg.rbuild | 2 +- reactos/dll/win32/hnetcfg/hnetcfg.rc | 1 + reactos/dll/win32/hnetcfg/hnetcfg.rgs | 27 ++ reactos/dll/win32/hnetcfg/hnetcfg_private.h | 14 +- reactos/dll/win32/hnetcfg/manager.c | 8 +- reactos/dll/win32/hnetcfg/policy.c | 8 +- reactos/dll/win32/hnetcfg/port.c | 16 +- reactos/dll/win32/hnetcfg/profile.c | 8 +- reactos/dll/win32/hnetcfg/regsvr.c | 430 -------------------- reactos/dll/win32/hnetcfg/service.c | 16 +- reactos/media/doc/README.WINE | 2 +- 15 files changed, 137 insertions(+), 483 deletions(-) create mode 100644 reactos/dll/win32/hnetcfg/hnetcfg.idl create mode 100644 reactos/dll/win32/hnetcfg/hnetcfg.rc create mode 100644 reactos/dll/win32/hnetcfg/hnetcfg.rgs delete mode 100644 reactos/dll/win32/hnetcfg/regsvr.c diff --git a/reactos/dll/win32/hnetcfg/CMakeLists.txt b/reactos/dll/win32/hnetcfg/CMakeLists.txt index 4f18dd6c391..ccba7e25607 100644 --- a/reactos/dll/win32/hnetcfg/CMakeLists.txt +++ b/reactos/dll/win32/hnetcfg/CMakeLists.txt @@ -6,6 +6,7 @@ add_definitions(-D_WIN32_WINNT=0x600) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +set_rc_compiler() spec2def(hnetcfg.dll hnetcfg.spec) list(APPEND SOURCE @@ -15,8 +16,8 @@ list(APPEND SOURCE policy.c port.c profile.c - regsvr.c service.c + hnetcfg.rc ${CMAKE_CURRENT_BINARY_DIR}/hnetcfg.def) add_library(hnetcfg SHARED ${SOURCE}) diff --git a/reactos/dll/win32/hnetcfg/apps.c b/reactos/dll/win32/hnetcfg/apps.c index fbd603cd610..90a18079019 100644 --- a/reactos/dll/win32/hnetcfg/apps.c +++ b/reactos/dll/win32/hnetcfg/apps.c @@ -36,13 +36,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); typedef struct fw_app { - const INetFwAuthorizedApplicationVtbl *vtbl; + INetFwAuthorizedApplication INetFwAuthorizedApplication_iface; LONG refs; } fw_app; static inline fw_app *impl_from_INetFwAuthorizedApplication( INetFwAuthorizedApplication *iface ) { - return (fw_app *)((char *)iface - FIELD_OFFSET( fw_app, vtbl )); + return CONTAINING_RECORD(iface, fw_app, INetFwAuthorizedApplication_iface); } static ULONG WINAPI fw_app_AddRef( @@ -262,7 +262,7 @@ static HRESULT WINAPI fw_app_put_Enabled( fw_app *This = impl_from_INetFwAuthorizedApplication( iface ); FIXME("%p, %d\n", This, enabled); - return E_NOTIMPL; + return S_OK; } static const struct INetFwAuthorizedApplicationVtbl fw_app_vtbl = @@ -297,23 +297,23 @@ HRESULT NetFwAuthorizedApplication_create( IUnknown *pUnkOuter, LPVOID *ppObj ) fa = HeapAlloc( GetProcessHeap(), 0, sizeof(*fa) ); if (!fa) return E_OUTOFMEMORY; - fa->vtbl = &fw_app_vtbl; + fa->INetFwAuthorizedApplication_iface.lpVtbl = &fw_app_vtbl; fa->refs = 1; - *ppObj = &fa->vtbl; + *ppObj = &fa->INetFwAuthorizedApplication_iface; TRACE("returning iface %p\n", *ppObj); return S_OK; } typedef struct fw_apps { - const INetFwAuthorizedApplicationsVtbl *vtbl; + INetFwAuthorizedApplications INetFwAuthorizedApplications_iface; LONG refs; } fw_apps; static inline fw_apps *impl_from_INetFwAuthorizedApplications( INetFwAuthorizedApplications *iface ) { - return (fw_apps *)((char *)iface - FIELD_OFFSET( fw_apps, vtbl )); + return CONTAINING_RECORD(iface, fw_apps, INetFwAuthorizedApplications_iface); } static ULONG WINAPI fw_apps_AddRef( @@ -490,10 +490,10 @@ HRESULT NetFwAuthorizedApplications_create( IUnknown *pUnkOuter, LPVOID *ppObj ) fa = HeapAlloc( GetProcessHeap(), 0, sizeof(*fa) ); if (!fa) return E_OUTOFMEMORY; - fa->vtbl = &fw_apps_vtbl; + fa->INetFwAuthorizedApplications_iface.lpVtbl = &fw_apps_vtbl; fa->refs = 1; - *ppObj = &fa->vtbl; + *ppObj = &fa->INetFwAuthorizedApplications_iface; TRACE("returning iface %p\n", *ppObj); return S_OK; diff --git a/reactos/dll/win32/hnetcfg/hnetcfg.c b/reactos/dll/win32/hnetcfg/hnetcfg.c index 3ecc8c23219..fe65a78a3f7 100644 --- a/reactos/dll/win32/hnetcfg/hnetcfg.c +++ b/reactos/dll/win32/hnetcfg/hnetcfg.c @@ -23,6 +23,7 @@ #include "windef.h" #include "winbase.h" #include "objbase.h" +#include "rpcproxy.h" #include "netfw.h" #include "wine/debug.h" @@ -30,17 +31,19 @@ WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); +static HINSTANCE instance; + typedef HRESULT (*fnCreateInstance)( IUnknown *pUnkOuter, LPVOID *ppObj ); typedef struct { - const struct IClassFactoryVtbl *vtbl; + IClassFactory IClassFactory_iface; fnCreateInstance pfnCreateInstance; } hnetcfg_cf; static inline hnetcfg_cf *impl_from_IClassFactory( IClassFactory *iface ) { - return (hnetcfg_cf *)((char *)iface - FIELD_OFFSET( hnetcfg_cf, vtbl )); + return CONTAINING_RECORD(iface, hnetcfg_cf, IClassFactory_iface); } static HRESULT WINAPI hnetcfg_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) @@ -107,8 +110,8 @@ static const struct IClassFactoryVtbl hnetcfg_cf_vtbl = hnetcfg_cf_LockServer }; -static hnetcfg_cf fw_manager_cf = { &hnetcfg_cf_vtbl, NetFwMgr_create }; -static hnetcfg_cf fw_app_cf = { &hnetcfg_cf_vtbl, NetFwAuthorizedApplication_create }; +static hnetcfg_cf fw_manager_cf = { { &hnetcfg_cf_vtbl }, NetFwMgr_create }; +static hnetcfg_cf fw_app_cf = { { &hnetcfg_cf_vtbl }, NetFwAuthorizedApplication_create }; BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) { @@ -118,6 +121,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) case DLL_WINE_PREATTACH: return FALSE; case DLL_PROCESS_ATTACH: + instance = hInstDLL; DisableThreadLibraryCalls(hInstDLL); break; case DLL_PROCESS_DETACH: @@ -134,11 +138,11 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) if (IsEqualGUID( rclsid, &CLSID_NetFwMgr )) { - cf = (IClassFactory *)&fw_manager_cf.vtbl; + cf = &fw_manager_cf.IClassFactory_iface; } else if (IsEqualGUID( rclsid, &CLSID_NetFwAuthorizedApplication )) { - cf = (IClassFactory *)&fw_app_cf.vtbl; + cf = &fw_app_cf.IClassFactory_iface; } if (!cf) return CLASS_E_CLASSNOTAVAILABLE; @@ -149,3 +153,19 @@ HRESULT WINAPI DllCanUnloadNow( void ) { return S_FALSE; } + +/*********************************************************************** + * DllRegisterServer (HNETCFG.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( instance ); +} + +/*********************************************************************** + * DllUnregisterServer (HNETCFG.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( instance ); +} diff --git a/reactos/dll/win32/hnetcfg/hnetcfg.idl b/reactos/dll/win32/hnetcfg/hnetcfg.idl new file mode 100644 index 00000000000..8603b72aa4d --- /dev/null +++ b/reactos/dll/win32/hnetcfg/hnetcfg.idl @@ -0,0 +1,35 @@ +/* + * COM Classes for hnetcfg + * + * Copyright 2010 Alexandre Julliard + * + * 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 + */ + +[ + helpstring("HNetCfg.FwMgr"), + progid("HNetCfg.FwMgr"), + threading(both), + uuid(304ce942-6e39-40d8-943a-b913c40c9cd4) +] +coclass NetFwMgr { interface INetFwMgr; } + +[ + helpstring("HNetCfg.FwAuthorizedApplication"), + progid("HNetCfg.FwAuthorizedApplication"), + threading(both), + uuid(ec9846b3-2762-4a6b-a214-6acb603462d2) +] +coclass NetFwAuthorizedApplication { interface INetFwAuthorizedApplications; } diff --git a/reactos/dll/win32/hnetcfg/hnetcfg.rbuild b/reactos/dll/win32/hnetcfg/hnetcfg.rbuild index 91c8fcb7b81..3277be816f9 100644 --- a/reactos/dll/win32/hnetcfg/hnetcfg.rbuild +++ b/reactos/dll/win32/hnetcfg/hnetcfg.rbuild @@ -14,6 +14,6 @@ policy.c port.c profile.c - regsvr.c service.c + hnetcfg.rc diff --git a/reactos/dll/win32/hnetcfg/hnetcfg.rc b/reactos/dll/win32/hnetcfg/hnetcfg.rc new file mode 100644 index 00000000000..a7ca4bc8891 --- /dev/null +++ b/reactos/dll/win32/hnetcfg/hnetcfg.rc @@ -0,0 +1 @@ +1 WINE_REGISTRY hnetcfg.rgs diff --git a/reactos/dll/win32/hnetcfg/hnetcfg.rgs b/reactos/dll/win32/hnetcfg/hnetcfg.rgs new file mode 100644 index 00000000000..623e2399510 --- /dev/null +++ b/reactos/dll/win32/hnetcfg/hnetcfg.rgs @@ -0,0 +1,27 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{304CE942-6E39-40D8-943A-B913C40C9CD4}' = s 'HNetCfg.FwMgr' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'HNetCfg.FwMgr' + } + '{EC9846B3-2762-4A6B-A214-6ACB603462D2}' = s 'HNetCfg.FwAuthorizedApplication' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'HNetCfg.FwAuthorizedApplication' + } + } + 'HNetCfg.FwMgr' = s 'HNetCfg.FwMgr' + { + CLSID = s '{304CE942-6E39-40D8-943A-B913C40C9CD4}' + } + 'HNetCfg.FwAuthorizedApplication' = s 'HNetCfg.FwAuthorizedApplication' + { + CLSID = s '{EC9846B3-2762-4A6B-A214-6ACB603462D2}' + } +} diff --git a/reactos/dll/win32/hnetcfg/hnetcfg_private.h b/reactos/dll/win32/hnetcfg/hnetcfg_private.h index c64bdc2820b..cc7519b23ea 100644 --- a/reactos/dll/win32/hnetcfg/hnetcfg_private.h +++ b/reactos/dll/win32/hnetcfg/hnetcfg_private.h @@ -16,10 +16,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -HRESULT NetFwMgr_create(IUnknown *, LPVOID *); -HRESULT NetFwPolicy_create(IUnknown *, LPVOID *); -HRESULT NetFwProfile_create(IUnknown *, LPVOID *); -HRESULT NetFwAuthorizedApplication_create(IUnknown *, LPVOID *); -HRESULT NetFwAuthorizedApplications_create(IUnknown *, LPVOID *); -HRESULT NetFwOpenPorts_create(IUnknown *, LPVOID *); -HRESULT NetFwServices_create(IUnknown *, LPVOID *); +HRESULT NetFwMgr_create(IUnknown *, LPVOID *) DECLSPEC_HIDDEN; +HRESULT NetFwPolicy_create(IUnknown *, LPVOID *) DECLSPEC_HIDDEN; +HRESULT NetFwProfile_create(IUnknown *, LPVOID *) DECLSPEC_HIDDEN; +HRESULT NetFwAuthorizedApplication_create(IUnknown *, LPVOID *) DECLSPEC_HIDDEN; +HRESULT NetFwAuthorizedApplications_create(IUnknown *, LPVOID *) DECLSPEC_HIDDEN; +HRESULT NetFwOpenPorts_create(IUnknown *, LPVOID *) DECLSPEC_HIDDEN; +HRESULT NetFwServices_create(IUnknown *, LPVOID *) DECLSPEC_HIDDEN; diff --git a/reactos/dll/win32/hnetcfg/manager.c b/reactos/dll/win32/hnetcfg/manager.c index 7d6a7a5f492..6192c2dd687 100644 --- a/reactos/dll/win32/hnetcfg/manager.c +++ b/reactos/dll/win32/hnetcfg/manager.c @@ -37,13 +37,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); typedef struct fw_manager { - const INetFwMgrVtbl *vtbl; + INetFwMgr INetFwMgr_iface; LONG refs; } fw_manager; static inline fw_manager *impl_from_INetFwMgr( INetFwMgr *iface ) { - return (fw_manager *)((char *)iface - FIELD_OFFSET( fw_manager, vtbl )); + return CONTAINING_RECORD(iface, fw_manager, INetFwMgr_iface); } static ULONG WINAPI fw_manager_AddRef( @@ -230,10 +230,10 @@ HRESULT NetFwMgr_create( IUnknown *pUnkOuter, LPVOID *ppObj ) fm = HeapAlloc( GetProcessHeap(), 0, sizeof(*fm) ); if (!fm) return E_OUTOFMEMORY; - fm->vtbl = &fw_manager_vtbl; + fm->INetFwMgr_iface.lpVtbl = &fw_manager_vtbl; fm->refs = 1; - *ppObj = &fm->vtbl; + *ppObj = &fm->INetFwMgr_iface; TRACE("returning iface %p\n", *ppObj); return S_OK; diff --git a/reactos/dll/win32/hnetcfg/policy.c b/reactos/dll/win32/hnetcfg/policy.c index cff89730b36..dd5a1fecc12 100644 --- a/reactos/dll/win32/hnetcfg/policy.c +++ b/reactos/dll/win32/hnetcfg/policy.c @@ -36,13 +36,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); typedef struct fw_policy { - const INetFwPolicyVtbl *vtbl; + INetFwPolicy INetFwPolicy_iface; LONG refs; } fw_policy; static inline fw_policy *impl_from_INetFwPolicy( INetFwPolicy *iface ) { - return (fw_policy *)((char *)iface - FIELD_OFFSET( fw_policy, vtbl )); + return CONTAINING_RECORD(iface, fw_policy, INetFwPolicy_iface); } static ULONG WINAPI fw_policy_AddRef( @@ -186,10 +186,10 @@ HRESULT NetFwPolicy_create( IUnknown *pUnkOuter, LPVOID *ppObj ) fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) ); if (!fp) return E_OUTOFMEMORY; - fp->vtbl = &fw_policy_vtbl; + fp->INetFwPolicy_iface.lpVtbl = &fw_policy_vtbl; fp->refs = 1; - *ppObj = &fp->vtbl; + *ppObj = &fp->INetFwPolicy_iface; TRACE("returning iface %p\n", *ppObj); return S_OK; diff --git a/reactos/dll/win32/hnetcfg/port.c b/reactos/dll/win32/hnetcfg/port.c index af821d6b0ba..b81456f6a93 100644 --- a/reactos/dll/win32/hnetcfg/port.c +++ b/reactos/dll/win32/hnetcfg/port.c @@ -36,13 +36,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); typedef struct fw_port { - const INetFwOpenPortVtbl *vtbl; + INetFwOpenPort INetFwOpenPort_iface; LONG refs; } fw_port; static inline fw_port *impl_from_INetFwOpenPort( INetFwOpenPort *iface ) { - return (fw_port *)((char *)iface - FIELD_OFFSET( fw_port, vtbl )); + return CONTAINING_RECORD(iface, fw_port, INetFwOpenPort_iface); } static ULONG WINAPI fw_port_AddRef( @@ -330,10 +330,10 @@ static HRESULT NetFwOpenPort_create( IUnknown *pUnkOuter, LPVOID *ppObj ) fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) ); if (!fp) return E_OUTOFMEMORY; - fp->vtbl = &fw_port_vtbl; + fp->INetFwOpenPort_iface.lpVtbl = &fw_port_vtbl; fp->refs = 1; - *ppObj = &fp->vtbl; + *ppObj = &fp->INetFwOpenPort_iface; TRACE("returning iface %p\n", *ppObj); return S_OK; @@ -341,13 +341,13 @@ static HRESULT NetFwOpenPort_create( IUnknown *pUnkOuter, LPVOID *ppObj ) typedef struct fw_ports { - const INetFwOpenPortsVtbl *vtbl; + INetFwOpenPorts INetFwOpenPorts_iface; LONG refs; } fw_ports; static inline fw_ports *impl_from_INetFwOpenPorts( INetFwOpenPorts *iface ) { - return (fw_ports *)((char *)iface - FIELD_OFFSET( fw_ports, vtbl )); + return CONTAINING_RECORD(iface, fw_ports, INetFwOpenPorts_iface); } static ULONG WINAPI fw_ports_AddRef( @@ -536,10 +536,10 @@ HRESULT NetFwOpenPorts_create( IUnknown *pUnkOuter, LPVOID *ppObj ) fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) ); if (!fp) return E_OUTOFMEMORY; - fp->vtbl = &fw_ports_vtbl; + fp->INetFwOpenPorts_iface.lpVtbl = &fw_ports_vtbl; fp->refs = 1; - *ppObj = &fp->vtbl; + *ppObj = &fp->INetFwOpenPorts_iface; TRACE("returning iface %p\n", *ppObj); return S_OK; diff --git a/reactos/dll/win32/hnetcfg/profile.c b/reactos/dll/win32/hnetcfg/profile.c index 8536bd7ce69..f1d724d74b1 100644 --- a/reactos/dll/win32/hnetcfg/profile.c +++ b/reactos/dll/win32/hnetcfg/profile.c @@ -36,13 +36,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); typedef struct fw_profile { - const INetFwProfileVtbl *vtbl; + INetFwProfile INetFwProfile_iface; LONG refs; } fw_profile; static inline fw_profile *impl_from_INetFwProfile( INetFwProfile *iface ) { - return (fw_profile *)((char *)iface - FIELD_OFFSET( fw_profile, vtbl )); + return CONTAINING_RECORD(iface, fw_profile, INetFwProfile_iface); } static ULONG WINAPI fw_profile_AddRef( @@ -319,10 +319,10 @@ HRESULT NetFwProfile_create( IUnknown *pUnkOuter, LPVOID *ppObj ) fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) ); if (!fp) return E_OUTOFMEMORY; - fp->vtbl = &fw_profile_vtbl; + fp->INetFwProfile_iface.lpVtbl = &fw_profile_vtbl; fp->refs = 1; - *ppObj = &fp->vtbl; + *ppObj = &fp->INetFwProfile_iface; TRACE("returning iface %p\n", *ppObj); return S_OK; diff --git a/reactos/dll/win32/hnetcfg/regsvr.c b/reactos/dll/win32/hnetcfg/regsvr.c deleted file mode 100644 index 829590a3f9a..00000000000 --- a/reactos/dll/win32/hnetcfg/regsvr.c +++ /dev/null @@ -1,430 +0,0 @@ -/* - * self-registerable dll functions for hnetcfg.dll - * - * Copyright (C) 2003 John K. Hohm - * - * 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 "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winreg.h" -#include "winerror.h" -#include "objbase.h" -#include "netfw.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); - -/* - * Near the bottom of this file are the exported DllRegisterServer and - * DllUnregisterServer, which make all this worthwhile. - */ - -/*********************************************************************** - * interface for self-registering - */ -struct regsvr_interface -{ - IID const *iid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - IID const *base_iid; /* can be NULL to omit */ - int num_methods; /* can be <0 to omit */ - CLSID const *ps_clsid; /* can be NULL to omit */ - CLSID const *ps_clsid32; /* can be NULL to omit */ -}; - -static HRESULT register_interfaces(struct regsvr_interface const *list); -static HRESULT unregister_interfaces(struct regsvr_interface const *list); - -struct regsvr_coclass -{ - CLSID const *clsid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - LPCSTR ips; /* can be NULL to omit */ - LPCSTR ips32; /* can be NULL to omit */ - LPCSTR ips32_tmodel; /* can be NULL to omit */ - LPCSTR clsid_str; /* can be NULL to omit */ - LPCSTR progid; /* can be NULL to omit */ -}; - -static HRESULT register_coclasses(struct regsvr_coclass const *list); -static HRESULT unregister_coclasses(struct regsvr_coclass const *list); - -/*********************************************************************** - * static string constants - */ -static WCHAR const interface_keyname[10] = { - 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; -static WCHAR const base_ifa_keyname[14] = { - 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', - 'e', 0 }; -static WCHAR const num_methods_keyname[11] = { - 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; -static WCHAR const ps_clsid_keyname[15] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', 0 }; -static WCHAR const ps_clsid32_keyname[17] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', '3', '2', 0 }; -static WCHAR const clsid_keyname[6] = { - 'C', 'L', 'S', 'I', 'D', 0 }; -static WCHAR const ips_keyname[13] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static WCHAR const ips32_keyname[15] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static WCHAR const progid_keyname[7] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static char const tmodel_valuename[] = "ThreadingModel"; - -/*********************************************************************** - * static helper functions - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); -static LONG register_key_defvalueW(HKEY base, WCHAR const *name, - WCHAR const *value); -static LONG register_key_defvalueA(HKEY base, WCHAR const *name, - char const *value); - -/*********************************************************************** - * register_interfaces - */ -static HRESULT register_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - HKEY iid_key; - - StringFromGUID2(list->iid, buf, 39); - res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_interface_key; - - if (list->name) { - res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->base_iid) { - res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (0 <= list->num_methods) { - static WCHAR const fmt[3] = { '%', 'd', 0 }; - HKEY key; - - res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - - sprintfW(buf, fmt, list->num_methods); - res = RegSetValueExW(key, NULL, 0, REG_SZ, - (CONST BYTE*)buf, - (lstrlenW(buf) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid) { - res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid32) { - res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - error_close_iid_key: - RegCloseKey(iid_key); - } - -error_close_interface_key: - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_interfaces - */ -static HRESULT unregister_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, - KEY_READ | KEY_WRITE, &interface_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->iid, buf, 39); - res = RegDeleteTreeW(interface_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - } - - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * register_coclasses - */ -static HRESULT register_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - HKEY clsid_key; - - StringFromGUID2(list->clsid, buf, 39); - res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->name) { - res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips) { - res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips32) { - HKEY ips32_key; - - res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &ips32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->ips32, - lstrlenA(list->ips32) + 1); - if (res == ERROR_SUCCESS && list->ips32_tmodel) - res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, - (CONST BYTE*)list->ips32_tmodel, - strlen(list->ips32_tmodel) + 1); - RegCloseKey(ips32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->clsid_str) { - res = register_key_defvalueA(clsid_key, clsid_keyname, - list->clsid_str); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->progid) { - HKEY progid_key; - - res = register_key_defvalueA(clsid_key, progid_keyname, - list->progid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegCreateKeyExA(HKEY_CLASSES_ROOT, list->progid, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &progid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_key_defvalueW(progid_key, clsid_keyname, buf); - RegCloseKey(progid_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - error_close_clsid_key: - RegCloseKey(clsid_key); - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_coclasses - */ -static HRESULT unregister_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, - KEY_READ | KEY_WRITE, &coclass_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->clsid, buf, 39); - res = RegDeleteTreeW(coclass_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->progid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * regsvr_key_guid - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) -{ - WCHAR buf[39]; - - StringFromGUID2(guid, buf, 39); - return register_key_defvalueW(base, name, buf); -} - -/*********************************************************************** - * regsvr_key_defvalueW - */ -static LONG register_key_defvalueW( - HKEY base, - WCHAR const *name, - WCHAR const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - (lstrlenW(value) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_key_defvalueA - */ -static LONG register_key_defvalueA( - HKEY base, - WCHAR const *name, - char const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - lstrlenA(value) + 1); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * coclass list - */ -static struct regsvr_coclass const coclass_list[] = { - { &CLSID_NetFwMgr, - "NetFwMgr", - NULL, - "hnetcfg.dll", - "Both" - }, - { &CLSID_NetFwAuthorizedApplication, - "NetFwAuthorizedApplication", - NULL, - "hnetcfg.dll", - "Both" - }, - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * interface list - */ -static struct regsvr_interface const interface_list[] = { - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * DllRegisterServer (HNETCFG.@) - */ -HRESULT WINAPI DllRegisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = register_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = register_interfaces(interface_list); - return hr; -} - -/*********************************************************************** - * DllUnregisterServer (HNETCFG.@) - */ -HRESULT WINAPI DllUnregisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = unregister_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = unregister_interfaces(interface_list); - return hr; -} diff --git a/reactos/dll/win32/hnetcfg/service.c b/reactos/dll/win32/hnetcfg/service.c index ecfc00cba25..fa214b67601 100644 --- a/reactos/dll/win32/hnetcfg/service.c +++ b/reactos/dll/win32/hnetcfg/service.c @@ -36,13 +36,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(hnetcfg); typedef struct fw_service { - const INetFwServiceVtbl *vtbl; + INetFwService INetFwService_iface; LONG refs; } fw_service; static inline fw_service *impl_from_INetFwService( INetFwService *iface ) { - return (fw_service *)((char *)iface - FIELD_OFFSET( fw_service, vtbl )); + return CONTAINING_RECORD(iface, fw_service, INetFwService_iface); } static ULONG WINAPI fw_service_AddRef( @@ -295,10 +295,10 @@ static HRESULT NetFwService_create( IUnknown *pUnkOuter, LPVOID *ppObj ) fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) ); if (!fp) return E_OUTOFMEMORY; - fp->vtbl = &fw_service_vtbl; + fp->INetFwService_iface.lpVtbl = &fw_service_vtbl; fp->refs = 1; - *ppObj = &fp->vtbl; + *ppObj = &fp->INetFwService_iface; TRACE("returning iface %p\n", *ppObj); return S_OK; @@ -306,13 +306,13 @@ static HRESULT NetFwService_create( IUnknown *pUnkOuter, LPVOID *ppObj ) typedef struct fw_services { - const INetFwServicesVtbl *vtbl; + INetFwServices INetFwServices_iface; LONG refs; } fw_services; static inline fw_services *impl_from_INetFwServices( INetFwServices *iface ) { - return (fw_services *)((char *)iface - FIELD_OFFSET( fw_services, vtbl )); + return CONTAINING_RECORD(iface, fw_services, INetFwServices_iface); } static ULONG WINAPI fw_services_AddRef( @@ -469,10 +469,10 @@ HRESULT NetFwServices_create( IUnknown *pUnkOuter, LPVOID *ppObj ) fp = HeapAlloc( GetProcessHeap(), 0, sizeof(*fp) ); if (!fp) return E_OUTOFMEMORY; - fp->vtbl = &fw_services_vtbl; + fp->INetFwServices_iface.lpVtbl = &fw_services_vtbl; fp->refs = 1; - *ppObj = &fp->vtbl; + *ppObj = &fp->INetFwServices_iface; TRACE("returning iface %p\n", *ppObj); return S_OK; diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 8b061f247cd..8e0dfeb304f 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -64,7 +64,7 @@ reactos/dll/win32/fusion # Synced to Wine-1.3.37 reactos/dll/win32/gdiplus # Autosync reactos/dll/win32/hhctrl.ocx # Autosync reactos/dll/win32/hlink # Synced to Wine-1.3.37 -reactos/dll/win32/hnetcfg # Autosync +reactos/dll/win32/hnetcfg # Synced to Wine-1.3.37 reactos/dll/win32/httpapi # Synced to Wine-1.3.37 reactos/dll/win32/iccvid # Autosync reactos/dll/win32/icmp # Synced to Wine-0_9_10 From 06e3fa71d53a558518d88bab3c9a3678f57fcfa7 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 13:43:48 +0000 Subject: [PATCH 115/289] [INSENG] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55240 --- reactos/dll/win32/inseng/CMakeLists.txt | 3 +- reactos/dll/win32/inseng/inseng.idl | 33 ++ reactos/dll/win32/inseng/inseng.rbuild | 2 +- reactos/dll/win32/inseng/inseng.rc | 1 + reactos/dll/win32/inseng/inseng.rgs | 17 + reactos/dll/win32/inseng/inseng_main.c | 23 ++ reactos/dll/win32/inseng/regsvr.c | 501 ------------------------ reactos/media/doc/README.WINE | 2 +- 8 files changed, 78 insertions(+), 504 deletions(-) create mode 100644 reactos/dll/win32/inseng/inseng.idl create mode 100644 reactos/dll/win32/inseng/inseng.rc create mode 100644 reactos/dll/win32/inseng/inseng.rgs delete mode 100644 reactos/dll/win32/inseng/regsvr.c diff --git a/reactos/dll/win32/inseng/CMakeLists.txt b/reactos/dll/win32/inseng/CMakeLists.txt index 69a69917248..3f94ff82bc4 100644 --- a/reactos/dll/win32/inseng/CMakeLists.txt +++ b/reactos/dll/win32/inseng/CMakeLists.txt @@ -6,11 +6,12 @@ add_definitions(-D_WIN32_WINNT=0x600) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +set_rc_compiler() spec2def(inseng.dll inseng.spec) list(APPEND SOURCE inseng_main.c - regsvr.c + inseng.rc ${CMAKE_CURRENT_BINARY_DIR}/inseng_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/inseng.def) diff --git a/reactos/dll/win32/inseng/inseng.idl b/reactos/dll/win32/inseng/inseng.idl new file mode 100644 index 00000000000..372d1333e58 --- /dev/null +++ b/reactos/dll/win32/inseng/inseng.idl @@ -0,0 +1,33 @@ +/* + * COM Classes for inseng + * + * Copyright 2010 Alexandre Julliard + * + * 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 + */ + +[ + helpstring("Microsoft Active Setup Engine"), + threading(apartment), + uuid(6e449686-c509-11cf-aafa-00aa00b6015c) +] +coclass ActiveSetupEng { } + +[ + helpstring("Download Site Manager"), + threading(apartment), + uuid(bfc880f1-7484-11d0-8309-00aa00b6015c) +] +coclass DLManager { } diff --git a/reactos/dll/win32/inseng/inseng.rbuild b/reactos/dll/win32/inseng/inseng.rbuild index 5434957a05c..ee667c189da 100644 --- a/reactos/dll/win32/inseng/inseng.rbuild +++ b/reactos/dll/win32/inseng/inseng.rbuild @@ -6,7 +6,7 @@ 0x600 inseng_main.c - regsvr.c + inseng.rc wine uuid ole32 diff --git a/reactos/dll/win32/inseng/inseng.rc b/reactos/dll/win32/inseng/inseng.rc new file mode 100644 index 00000000000..a7309272472 --- /dev/null +++ b/reactos/dll/win32/inseng/inseng.rc @@ -0,0 +1 @@ +1 WINE_REGISTRY inseng.rgs diff --git a/reactos/dll/win32/inseng/inseng.rgs b/reactos/dll/win32/inseng/inseng.rgs new file mode 100644 index 00000000000..3dce94dd7dc --- /dev/null +++ b/reactos/dll/win32/inseng/inseng.rgs @@ -0,0 +1,17 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{6E449686-C509-11CF-AAFA-00AA00B6015C}' = s 'Microsoft Active Setup Engine' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + '{BFC880F1-7484-11D0-8309-00AA00B6015C}' = s 'Download Site Manager' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + } +} diff --git a/reactos/dll/win32/inseng/inseng_main.c b/reactos/dll/win32/inseng/inseng_main.c index f1f148b4398..94e19101dff 100644 --- a/reactos/dll/win32/inseng/inseng_main.c +++ b/reactos/dll/win32/inseng/inseng_main.c @@ -28,12 +28,15 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" +#include "rpcproxy.h" #include "initguid.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(inseng); +static HINSTANCE instance; + BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) { switch(fdwReason) @@ -41,6 +44,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) case DLL_WINE_PREATTACH: return FALSE; /* prefer native version */ case DLL_PROCESS_ATTACH: + instance = hInstDLL; DisableThreadLibraryCalls(hInstDLL); break; case DLL_PROCESS_DETACH: @@ -59,11 +63,30 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) return CLASS_E_CLASSNOTAVAILABLE; } +/*********************************************************************** + * DllCanUnloadNow (INSENG.@) + */ HRESULT WINAPI DllCanUnloadNow(void) { return S_FALSE; } +/*********************************************************************** + * DllRegisterServer (INSENG.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( instance ); +} + +/*********************************************************************** + * DllUnregisterServer (INSENG.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( instance ); +} + BOOL WINAPI CheckTrustEx( LPVOID a, LPVOID b, LPVOID c, LPVOID d, LPVOID e ) { FIXME("%p %p %p %p %p\n", a, b, c, d, e ); diff --git a/reactos/dll/win32/inseng/regsvr.c b/reactos/dll/win32/inseng/regsvr.c deleted file mode 100644 index daa6a66da9b..00000000000 --- a/reactos/dll/win32/inseng/regsvr.c +++ /dev/null @@ -1,501 +0,0 @@ -/* - * self-registerable dll functions for inseng.dll - * - * Copyright (C) 2003 John K. Hohm - * Copyright (C) 2004 Steven Edwards for ReactOS - * - * 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 "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "wingdi.h" -#include "winreg.h" -#include "winerror.h" - -#include "objbase.h" -#include "initguid.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -WINE_DEFAULT_DEBUG_CHANNEL(inseng); - -DEFINE_GUID(CLSID_ActiveSetupEng, 0x6e449686,0xc509,0x11cf,0xaa,0xfa,0x00,0xaa,0x00,0xb6,0x01,0x5c ); -DEFINE_GUID(CLSID_DLManager, 0xBFC880F1,0x7484,0x11D0,0x83,0x09,0x00,0xAA,0x00,0xB6,0x01,0x5C); - -/* - * Near the bottom of this file are the exported DllRegisterServer and - * DllUnregisterServer, which make all this worthwhile. - */ - -/*********************************************************************** - * interface for self-registering - */ -struct regsvr_interface -{ - IID const *iid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - IID const *base_iid; /* can be NULL to omit */ - int num_methods; /* can be <0 to omit */ - CLSID const *ps_clsid; /* can be NULL to omit */ - CLSID const *ps_clsid32; /* can be NULL to omit */ -}; - -static HRESULT register_interfaces(struct regsvr_interface const *list); -static HRESULT unregister_interfaces(struct regsvr_interface const *list); - -struct regsvr_coclass -{ - CLSID const *clsid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - LPCSTR ips; /* can be NULL to omit */ - LPCSTR ips32; /* can be NULL to omit */ - LPCSTR ips32_tmodel; /* can be NULL to omit */ - LPCSTR progid; /* can be NULL to omit */ - LPCSTR viprogid; /* can be NULL to omit */ - LPCSTR progid_extra; /* can be NULL to omit */ -}; - -static HRESULT register_coclasses(struct regsvr_coclass const *list); -static HRESULT unregister_coclasses(struct regsvr_coclass const *list); - -/*********************************************************************** - * static string constants - */ -static WCHAR const interface_keyname[10] = { - 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; -static WCHAR const base_ifa_keyname[14] = { - 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', - 'e', 0 }; -static WCHAR const num_methods_keyname[11] = { - 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; -static WCHAR const ps_clsid_keyname[15] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', 0 }; -static WCHAR const ps_clsid32_keyname[17] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', '3', '2', 0 }; -static WCHAR const clsid_keyname[6] = { - 'C', 'L', 'S', 'I', 'D', 0 }; -static WCHAR const curver_keyname[7] = { - 'C', 'u', 'r', 'V', 'e', 'r', 0 }; -static WCHAR const ips_keyname[13] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static WCHAR const ips32_keyname[15] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static WCHAR const progid_keyname[7] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static WCHAR const viprogid_keyname[25] = { - 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p', - 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D', - 0 }; -static char const tmodel_valuename[] = "ThreadingModel"; - -/*********************************************************************** - * static helper functions - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); -static LONG register_key_defvalueW(HKEY base, WCHAR const *name, - WCHAR const *value); -static LONG register_key_defvalueA(HKEY base, WCHAR const *name, - char const *value); -static LONG register_progid(WCHAR const *clsid, - char const *progid, char const *curver_progid, - char const *name, char const *extra); - -/*********************************************************************** - * register_interfaces - */ -static HRESULT register_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - HKEY iid_key; - - StringFromGUID2(list->iid, buf, 39); - res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_interface_key; - - if (list->name) { - res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->base_iid) { - res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (0 <= list->num_methods) { - static WCHAR const fmt[3] = { '%', 'd', 0 }; - HKEY key; - - res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - - sprintfW(buf, fmt, list->num_methods); - res = RegSetValueExW(key, NULL, 0, REG_SZ, - (CONST BYTE*)buf, - (lstrlenW(buf) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid) { - res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid32) { - res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - error_close_iid_key: - RegCloseKey(iid_key); - } - -error_close_interface_key: - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_interfaces - */ -static HRESULT unregister_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, - KEY_READ | KEY_WRITE, &interface_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->iid, buf, 39); - res = RegDeleteTreeW(interface_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - } - - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * register_coclasses - */ -static HRESULT register_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - HKEY clsid_key; - - StringFromGUID2(list->clsid, buf, 39); - res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->name) { - res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips) { - res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips32) { - HKEY ips32_key; - - res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &ips32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->ips32, - lstrlenA(list->ips32) + 1); - if (res == ERROR_SUCCESS && list->ips32_tmodel) - res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, - (CONST BYTE*)list->ips32_tmodel, - strlen(list->ips32_tmodel) + 1); - RegCloseKey(ips32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->progid) { - res = register_key_defvalueA(clsid_key, progid_keyname, - list->progid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->progid, NULL, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->viprogid) { - res = register_key_defvalueA(clsid_key, viprogid_keyname, - list->viprogid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->viprogid, list->progid, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - error_close_clsid_key: - RegCloseKey(clsid_key); - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_coclasses - */ -static HRESULT unregister_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, - KEY_READ | KEY_WRITE, &coclass_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->clsid, buf, 39); - res = RegDeleteTreeW(coclass_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->progid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - - if (list->viprogid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * regsvr_key_guid - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) -{ - WCHAR buf[39]; - - StringFromGUID2(guid, buf, 39); - return register_key_defvalueW(base, name, buf); -} - -/*********************************************************************** - * regsvr_key_defvalueW - */ -static LONG register_key_defvalueW( - HKEY base, - WCHAR const *name, - WCHAR const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - (lstrlenW(value) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_key_defvalueA - */ -static LONG register_key_defvalueA( - HKEY base, - WCHAR const *name, - char const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - lstrlenA(value) + 1); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_progid - */ -static LONG register_progid( - WCHAR const *clsid, - char const *progid, - char const *curver_progid, - char const *name, - char const *extra) -{ - LONG res; - HKEY progid_key; - - res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &progid_key, NULL); - if (res != ERROR_SUCCESS) return res; - - if (name) { - res = RegSetValueExA(progid_key, NULL, 0, REG_SZ, - (CONST BYTE*)name, strlen(name) + 1); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (clsid) { - res = register_key_defvalueW(progid_key, clsid_keyname, clsid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (curver_progid) { - res = register_key_defvalueA(progid_key, curver_keyname, - curver_progid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (extra) { - HKEY extra_key; - - res = RegCreateKeyExA(progid_key, extra, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &extra_key, NULL); - if (res == ERROR_SUCCESS) - RegCloseKey(extra_key); - } - -error_close_progid_key: - RegCloseKey(progid_key); - return res; -} - -/*********************************************************************** - * coclass list - */ -static struct regsvr_coclass const coclass_list[] = { - { - &CLSID_ActiveSetupEng, - "Microsoft Active Setup Engine", - NULL, - "inseng.dll", - "Apartment" - }, - { - &CLSID_DLManager, - "Download Site Manager", - NULL, - "inseng.dll", - "Apartment" - }, - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * interface list - */ - -static struct regsvr_interface const interface_list[] = { - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * DllRegisterServer (INSENG.@) - */ -HRESULT WINAPI DllRegisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = register_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = register_interfaces(interface_list); - return hr; -} - -/*********************************************************************** - * DllUnregisterServer (INSENG.@) - */ -HRESULT WINAPI DllUnregisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = unregister_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = unregister_interfaces(interface_list); - return hr; -} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 8e0dfeb304f..ca1c455aa3e 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -74,7 +74,7 @@ reactos/dll/win32/imm32 # Autosync reactos/dll/win32/inetcomm # Autosync reactos/dll/win32/inetmib1 # Autosync reactos/dll/win32/initpki # Autosync -reactos/dll/win32/inseng # Autosync +reactos/dll/win32/inseng # Synced to Wine-1.3.37 reactos/dll/win32/iphlpapi # Out of sync reactos/dll/win32/itircl # Autosync reactos/dll/win32/itss # Autosync From 8f57857595e8a0099b417ef64b39000549d36b31 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 13:50:29 +0000 Subject: [PATCH 116/289] [MSG711.ACM] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55241 --- reactos/dll/win32/msg711.acm/msg711.c | 4 ++-- reactos/media/doc/README.WINE | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/msg711.acm/msg711.c b/reactos/dll/win32/msg711.acm/msg711.c index d527e91788c..db06905cbe7 100644 --- a/reactos/dll/win32/msg711.acm/msg711.c +++ b/reactos/dll/win32/msg711.acm/msg711.c @@ -131,7 +131,7 @@ static DWORD G711_GetFormatIndex(const WAVEFORMATEX *wfx) /*********************************************************************** * R16 * - * Read a 16 bit sample (correctly handles endianess) + * Read a 16 bit sample (correctly handles endianness) */ static inline short R16(const unsigned char* src) { @@ -141,7 +141,7 @@ static inline short R16(const unsigned char* src) /*********************************************************************** * W16 * - * Write a 16 bit sample (correctly handles endianess) + * Write a 16 bit sample (correctly handles endianness) */ static inline void W16(unsigned char* dst, short s) { diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index ca1c455aa3e..32ca11c41b5 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -98,7 +98,7 @@ reactos/dll/win32/mscms # Synced to Wine-1.3.37 reactos/dll/win32/mscoree # Autosync reactos/dll/win32/msctf # Autosync reactos/dll/win32/msftedit # Synced to Wine-1.3.37 -reactos/dll/win32/msg711.acm # Autosync +reactos/dll/win32/msg711.acm # Synced to Wine-1.3.37 reactos/dll/win32/msgsm32.acm # Autosync reactos/dll/win32/mshtml # Autosync reactos/dll/win32/msimg32 # Autosync From 8544ad6ea25b83cc79af3e065dafd98660641519 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 13:52:36 +0000 Subject: [PATCH 117/289] [DDK] * Update drmk.h annotations. svn path=/trunk/; revision=55242 --- reactos/include/ddk/drmk.h | 52 +++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/reactos/include/ddk/drmk.h b/reactos/include/ddk/drmk.h index 19659e34234..99f99157b11 100644 --- a/reactos/include/ddk/drmk.h +++ b/reactos/include/ddk/drmk.h @@ -32,50 +32,56 @@ typedef const DRMRIGHTS *PCDRMRIGHTS; extern "C" { #endif +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI DrmAddContentHandlers( - IN ULONG ContentId, - IN PVOID *paHandlers, - IN ULONG NumHandlers); + _In_ ULONG ContentId, + _In_reads_(NumHandlers) PVOID *paHandlers, + _In_ ULONG NumHandlers); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI DrmCreateContentMixed( - IN PULONG paContentId, - IN ULONG cContentId, - OUT PULONG pMixedContentId); + _In_ PULONG paContentId, + _In_ ULONG cContentId, + _Out_ PULONG pMixedContentId); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI DrmDestroyContent( - IN ULONG ContentId); + _In_ ULONG ContentId); NTSTATUS NTAPI DrmForwardContentToDeviceObject( - IN ULONG ContentId, - IN PVOID Reserved, - IN PCDRMFORWARD DrmForward); + _In_ ULONG ContentId, + _In_opt_ PVOID Reserved, + _In_ PCDRMFORWARD DrmForward); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI DrmForwardContentToFileObject( - IN ULONG ContentId, - IN PFILE_OBJECT FileObject); + _In_ ULONG ContentId, + _In_ PFILE_OBJECT FileObject); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI DrmForwardContentToInterface( - IN ULONG ContentId, - IN PUNKNOWN pUnknown, - IN ULONG NumMethods); + _In_ ULONG ContentId, + _In_ PUNKNOWN pUnknown, + _In_ ULONG NumMethods); +_IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS NTAPI DrmGetContentRights( - IN ULONG ContentId, - OUT PDRMRIGHTS DrmRights); + _In_ ULONG ContentId, + _Out_ PDRMRIGHTS DrmRights); #ifdef __cplusplus } @@ -89,14 +95,14 @@ DEFINE_GUID(IID_IDrmAudioStream, DECLARE_INTERFACE_(IDrmAudioStream, IUnknown) { STDMETHOD_(NTSTATUS, QueryInterface)(THIS_ - REFIID InterfaceId, - PVOID* Interface + _In_ REFIID InterfaceId, + _Out_ PVOID* Interface ) PURE; STDMETHOD_(ULONG,AddRef)(THIS) PURE; STDMETHOD_(ULONG,Release)(THIS) PURE; STDMETHOD_(NTSTATUS,SetContentId)(THIS_ - IN ULONG ContentId, - IN PCDRMRIGHTS DrmRights + _In_ ULONG ContentId, + _In_ PCDRMRIGHTS DrmRights ) PURE; }; @@ -104,7 +110,7 @@ typedef IDrmAudioStream *PDRMAUDIOSTREAM; #define IMP_IDrmAudioStream \ STDMETHODIMP_(NTSTATUS) SetContentId( \ - IN ULONG ContentId, \ - IN PCDRMRIGHTS DrmRights); + _In_ ULONG ContentId, \ + _In_ PCDRMRIGHTS DrmRights); #endif /* DRMK_H */ From 47ddfedeed2feb3e9fc27d9c7ee2e38c25dafb59 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 14:00:42 +0000 Subject: [PATCH 118/289] [PSDK] * Update wtsapi32.h from Wine. svn path=/trunk/; revision=55243 --- reactos/include/psdk/wtsapi32.h | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/reactos/include/psdk/wtsapi32.h b/reactos/include/psdk/wtsapi32.h index e2f6075381d..f4bab56635e 100644 --- a/reactos/include/psdk/wtsapi32.h +++ b/reactos/include/psdk/wtsapi32.h @@ -23,12 +23,12 @@ extern "C" { #endif -/* -* Current server information -*/ -#define WTS_CURRENT_SERVER ((HANDLE)NULL) -#define WTS_CURRENT_SERVER_HANDLE ((HANDLE)NULL) -#define WTS_CURRENT_SERVER_NAME (NULL) + +typedef enum _WTS_VIRTUAL_CLASS +{ + WTSVirtualClientData, + WTSVirtualFileHandle +} WTS_VIRTUAL_CLASS; typedef enum tagWTS_INFO_CLASS { @@ -136,6 +136,9 @@ DECL_WINELIB_TYPE_AW(WTS_SERVER_INFO) DECL_WINELIB_TYPE_AW(PWTS_SERVER_INFO) void WINAPI WTSCloseServer(HANDLE); +BOOL WINAPI WTSConnectSessionA(ULONG, ULONG, PSTR, BOOL); +BOOL WINAPI WTSConnectSessionW(ULONG, ULONG, PWSTR, BOOL); +#define WTSConnectSession WINELIB_NAME_AW(WTSConnectSession) BOOL WINAPI WTSDisconnectSession(HANDLE, DWORD, BOOL); BOOL WINAPI WTSEnumerateProcessesA(HANDLE, DWORD, DWORD, PWTS_PROCESS_INFOA *, DWORD *); BOOL WINAPI WTSEnumerateProcessesW(HANDLE, DWORD, DWORD, PWTS_PROCESS_INFOW *, DWORD *); @@ -158,8 +161,14 @@ BOOL WINAPI WTSQueryUserConfigW(LPWSTR,LPWSTR,WTS_CONFIG_CLASS,LPWSTR*,DWORD*); #define WTSQueryUserConfig WINELIB_NAME_AW(WTSQueryUserConfig) BOOL WINAPI WTSQueryUserToken(ULONG, PHANDLE); BOOL WINAPI WTSRegisterSessionNotification(HWND, DWORD); +BOOL WINAPI WTSRegisterSessionNotificationEx(HANDLE, HWND, DWORD); +BOOL WINAPI WTSStartRemoteControlSessionA(LPSTR, ULONG, BYTE, USHORT); +BOOL WINAPI WTSStartRemoteControlSessionW(LPWSTR, ULONG, BYTE, USHORT); +#define WTSStartRemoteControlSession WINELIB_NAME_AW(WTSStartRemoteControlSession) +BOOL WINAPI WTSStopRemoteControlSession(ULONG); BOOL WINAPI WTSTerminateProcess(HANDLE, DWORD, DWORD); BOOL WINAPI WTSUnRegisterSessionNotification(HWND); +BOOL WINAPI WTSUnRegisterSessionNotificationEx(HANDLE, HWND); BOOL WINAPI WTSWaitSystemEvent(HANDLE, DWORD, DWORD*); #ifdef __cplusplus From 46a657c5a3123b774fe2c02644601b46f9109655 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 14:39:25 +0000 Subject: [PATCH 119/289] [INETCOMM] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55245 --- reactos/dll/win32/inetcomm/CMakeLists.txt | 3 +- reactos/dll/win32/inetcomm/inetcomm.idl | 124 +++++ reactos/dll/win32/inetcomm/inetcomm.rbuild | 2 +- reactos/dll/win32/inetcomm/inetcomm.rc | 1 + reactos/dll/win32/inetcomm/inetcomm.rgs | 69 +++ reactos/dll/win32/inetcomm/inetcomm_main.c | 46 +- reactos/dll/win32/inetcomm/inetcomm_private.h | 44 +- reactos/dll/win32/inetcomm/mimeintl.c | 31 +- reactos/dll/win32/inetcomm/mimeole.c | 3 +- reactos/dll/win32/inetcomm/pop3transport.c | 41 +- reactos/dll/win32/inetcomm/regsvr.c | 512 ------------------ reactos/media/doc/README.WINE | 2 +- 12 files changed, 284 insertions(+), 594 deletions(-) create mode 100644 reactos/dll/win32/inetcomm/inetcomm.idl create mode 100644 reactos/dll/win32/inetcomm/inetcomm.rc create mode 100644 reactos/dll/win32/inetcomm/inetcomm.rgs delete mode 100644 reactos/dll/win32/inetcomm/regsvr.c diff --git a/reactos/dll/win32/inetcomm/CMakeLists.txt b/reactos/dll/win32/inetcomm/CMakeLists.txt index 0e0a1c7d589..0e93af8e56b 100644 --- a/reactos/dll/win32/inetcomm/CMakeLists.txt +++ b/reactos/dll/win32/inetcomm/CMakeLists.txt @@ -6,6 +6,7 @@ add_definitions(-D_WIN32_WINNT=0x600) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +set_rc_compiler() spec2def(inetcomm.dll inetcomm.spec) list(APPEND SOURCE @@ -15,8 +16,8 @@ list(APPEND SOURCE mimeintl.c mimeole.c pop3transport.c - regsvr.c smtptransport.c + inetcomm.rc ${CMAKE_CURRENT_BINARY_DIR}/inetcomm_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/inetcomm.def) diff --git a/reactos/dll/win32/inetcomm/inetcomm.idl b/reactos/dll/win32/inetcomm/inetcomm.idl new file mode 100644 index 00000000000..1fba558df5a --- /dev/null +++ b/reactos/dll/win32/inetcomm/inetcomm.idl @@ -0,0 +1,124 @@ +/* + * COM Classes for inetcomm + * + * Copyright 2010 Alexandre Julliard + * + * 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 + */ + +[ + helpstring("CLSID_IMimeBody"), + threading(both), + uuid(fd853cdb-7f86-11d0-8252-00c04fd85ab4) +] +coclass IMimeBody { interface IMimeBody; } + +[ + helpstring("CLSID_IMimeAllocator"), + threading(both), + uuid(fd853cdd-7f86-11d0-8252-00c04fd85ab4) +] +coclass IMimeAllocator { interface IMimeAllocator; } + +[ + helpstring("CLSID_IMimeSecurity"), + threading(both), + uuid(fd853cde-7f86-11d0-8252-00c04fd85ab4) +] +coclass IMimeSecurity { interface IMimeSecurity; } + +[ + helpstring("CLSID_IVirtualStream"), + threading(both), + uuid(fd853cdf-7f86-11d0-8252-00c04fd85ab4) +] +coclass IVirtualStream { interface IVirtualStream; } + +[ + helpstring("CLSID_IMimeMessage"), + threading(both), + uuid(fd853ce3-7f86-11d0-8252-00c04fd85ab4) +] +coclass IMimeMessage { interface IMimeMessage; } + +[ + helpstring("CLSID_ISMTPTransport"), + threading(both), + uuid(fd853ce6-7f86-11d0-8252-00c04fd85ab4) +] +coclass ISMTPTransport { interface ISMTPTransport; } + +[ + helpstring("CLSID_IPOP3Transport"), + threading(both), + uuid(fd853ce7-7f86-11d0-8252-00c04fd85ab4) +] +coclass IPOP3Transport { interface IPOP3Transport; } + +[ + helpstring("CLSID_INNTPTransport"), + threading(both), + uuid(fd853ce8-7f86-11d0-8252-00c04fd85ab4) +] +coclass INNTPTransport { interface INNTPTransport; } + +[ + helpstring("CLSID_IRASTransport"), + threading(both), + uuid(fd853ce9-7f86-11d0-8252-00c04fd85ab4) +] +coclass IRASTransport { interface IRASTransport; } + +[ + helpstring("CLSID_IRangeList"), + threading(both), + uuid(fd853cea-7f86-11d0-8252-00c04fd85ab4) +] +coclass IRangeList { interface IRangeList; } + +[ + helpstring("CLSID_IIMAPTransport"), + threading(both), + uuid(fd853ceb-7f86-11d0-8252-00c04fd85ab4) +] +coclass IIMAPTransport { interface IIMAPTransport; } + +[ + helpstring("CLSID_IHTTPMailTransport"), + threading(both), + uuid(5a580c11-e5eb-11d1-a86e-0000f8084f96) +] +coclass IHTTPMailTransport { interface IHTTPMailTransport; } + +[ + helpstring("CLSID_ISMTPTransport2"), + threading(both), + uuid(0df2c7ec-3435-11d0-81d0-00c04fd85ab4) +] +coclass ISMTPTransport2 { interface ISMTPTransport2; } + +[ + helpstring("CLSID_IPropFindRequest"), + threading(both), + uuid(bb847b8a-054a-11d2-a894-0000f8084f96) +] +coclass IPropFindRequest { interface IPropFindRequest; } + +[ + helpstring("CLSID_IPropPatchRequest"), + threading(both), + uuid(ea678830-235d-11d2-a8b6-0000f8084f96) +] +coclass IPropPatchRequest { interface IPropPatchRequest; } diff --git a/reactos/dll/win32/inetcomm/inetcomm.rbuild b/reactos/dll/win32/inetcomm/inetcomm.rbuild index 3de70d54a5f..e7fefbca667 100644 --- a/reactos/dll/win32/inetcomm/inetcomm.rbuild +++ b/reactos/dll/win32/inetcomm/inetcomm.rbuild @@ -14,8 +14,8 @@ mimeintl.c mimeole.c pop3transport.c - regsvr.c smtptransport.c + inetcomm.rc wine uuid ole32 diff --git a/reactos/dll/win32/inetcomm/inetcomm.rc b/reactos/dll/win32/inetcomm/inetcomm.rc new file mode 100644 index 00000000000..37729d27cf8 --- /dev/null +++ b/reactos/dll/win32/inetcomm/inetcomm.rc @@ -0,0 +1 @@ +1 WINE_REGISTRY inetcomm.rgs diff --git a/reactos/dll/win32/inetcomm/inetcomm.rgs b/reactos/dll/win32/inetcomm/inetcomm.rgs new file mode 100644 index 00000000000..ea6da6c3331 --- /dev/null +++ b/reactos/dll/win32/inetcomm/inetcomm.rgs @@ -0,0 +1,69 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{FD853CDB-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_IMimeBody' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{FD853CDD-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_IMimeAllocator' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{FD853CDE-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_IMimeSecurity' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{FD853CDF-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_IVirtualStream' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{FD853CE3-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_IMimeMessage' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{FD853CE6-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_ISMTPTransport' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{FD853CE7-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_IPOP3Transport' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{FD853CE8-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_INNTPTransport' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{FD853CE9-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_IRASTransport' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{FD853CEA-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_IRangeList' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{FD853CEB-7F86-11D0-8252-00C04FD85AB4}' = s 'CLSID_IIMAPTransport' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{5A580C11-E5EB-11D1-A86E-0000F8084F96}' = s 'CLSID_IHTTPMailTransport' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{0DF2C7EC-3435-11D0-81D0-00C04FD85AB4}' = s 'CLSID_ISMTPTransport2' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{BB847B8A-054A-11D2-A894-0000F8084F96}' = s 'CLSID_IPropFindRequest' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{EA678830-235D-11D2-A8B6-0000F8084F96}' = s 'CLSID_IPropPatchRequest' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + } +} diff --git a/reactos/dll/win32/inetcomm/inetcomm_main.c b/reactos/dll/win32/inetcomm/inetcomm_main.c index dac1a5c069d..8f5eca6ecc1 100644 --- a/reactos/dll/win32/inetcomm/inetcomm_main.c +++ b/reactos/dll/win32/inetcomm/inetcomm_main.c @@ -27,6 +27,9 @@ #include "winnt.h" #include "winuser.h" #include "ole2.h" +#include "ocidl.h" +#include "rpcproxy.h" +#include "initguid.h" #include "mimeole.h" #include "inetcomm_private.h" @@ -35,6 +38,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(inetcomm); +static HINSTANCE instance; + BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { static IMimeInternational *international; @@ -47,6 +52,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) return FALSE; case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hinstDLL); + instance = hinstDLL; if (!InternetTransport_RegisterClass(hinstDLL)) return FALSE; MimeInternational_Construct(&international); @@ -66,13 +72,13 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) */ typedef struct { - const struct IClassFactoryVtbl *lpVtbl; + IClassFactory IClassFactory_iface; HRESULT (*create_object)(IUnknown *, void **); } cf; static inline cf *impl_from_IClassFactory( IClassFactory *iface ) { - return (cf *)((char*)iface - FIELD_OFFSET(cf, lpVtbl)); + return CONTAINING_RECORD(iface, cf, IClassFactory_iface); } static HRESULT WINAPI cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) @@ -135,11 +141,11 @@ static const struct IClassFactoryVtbl cf_vtbl = cf_LockServer }; -static cf mime_body_cf = { &cf_vtbl, MimeBody_create }; -static cf mime_allocator_cf = { &cf_vtbl, MimeAllocator_create }; -static cf mime_message_cf = { &cf_vtbl, MimeMessage_create }; -static cf mime_security_cf = { &cf_vtbl, MimeSecurity_create }; -static cf virtual_stream_cf = { &cf_vtbl, VirtualStream_create }; +static cf mime_body_cf = { { &cf_vtbl }, MimeBody_create }; +static cf mime_allocator_cf = { { &cf_vtbl }, MimeAllocator_create }; +static cf mime_message_cf = { { &cf_vtbl }, MimeMessage_create }; +static cf mime_security_cf = { { &cf_vtbl }, MimeSecurity_create }; +static cf virtual_stream_cf = { { &cf_vtbl }, VirtualStream_create }; /*********************************************************************** * DllGetClassObject (INETCOMM.@) @@ -164,23 +170,23 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) if ( IsEqualCLSID( rclsid, &CLSID_IMimeSecurity )) { - cf = (IClassFactory*) &mime_security_cf.lpVtbl; + cf = &mime_security_cf.IClassFactory_iface; } else if( IsEqualCLSID( rclsid, &CLSID_IMimeMessage )) { - cf = (IClassFactory*) &mime_message_cf.lpVtbl; + cf = &mime_message_cf.IClassFactory_iface; } else if( IsEqualCLSID( rclsid, &CLSID_IMimeBody )) { - cf = (IClassFactory*) &mime_body_cf.lpVtbl; + cf = &mime_body_cf.IClassFactory_iface; } else if( IsEqualCLSID( rclsid, &CLSID_IMimeAllocator )) { - cf = (IClassFactory*) &mime_allocator_cf.lpVtbl; + cf = &mime_allocator_cf.IClassFactory_iface; } else if( IsEqualCLSID( rclsid, &CLSID_IVirtualStream )) { - cf = (IClassFactory*) &virtual_stream_cf.lpVtbl; + cf = &virtual_stream_cf.IClassFactory_iface; } if ( !cf ) @@ -199,3 +205,19 @@ HRESULT WINAPI DllCanUnloadNow(void) { return S_FALSE; } + +/*********************************************************************** + * DllRegisterServer (INETCOMM.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( instance ); +} + +/*********************************************************************** + * DllUnregisterServer (INETCOMM.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( instance ); +} diff --git a/reactos/dll/win32/inetcomm/inetcomm_private.h b/reactos/dll/win32/inetcomm/inetcomm_private.h index 533c92658df..55aaf47dc25 100644 --- a/reactos/dll/win32/inetcomm/inetcomm_private.h +++ b/reactos/dll/win32/inetcomm/inetcomm_private.h @@ -50,35 +50,35 @@ struct InternetTransport HWND hwnd; }; -HRESULT InternetTransport_Init(InternetTransport *This); -HRESULT InternetTransport_GetServerInfo(InternetTransport *This, LPINETSERVER pInetServer); +HRESULT InternetTransport_Init(InternetTransport *This) DECLSPEC_HIDDEN; +HRESULT InternetTransport_GetServerInfo(InternetTransport *This, LPINETSERVER pInetServer) DECLSPEC_HIDDEN; HRESULT InternetTransport_InetServerFromAccount(InternetTransport *This, - IImnAccount *pAccount, LPINETSERVER pInetServer); + IImnAccount *pAccount, LPINETSERVER pInetServer) DECLSPEC_HIDDEN; HRESULT InternetTransport_Connect(InternetTransport *This, - LPINETSERVER pInetServer, boolean fAuthenticate, boolean fCommandLogging); -HRESULT InternetTransport_HandsOffCallback(InternetTransport *This); -HRESULT InternetTransport_DropConnection(InternetTransport *This); + LPINETSERVER pInetServer, boolean fAuthenticate, boolean fCommandLogging) DECLSPEC_HIDDEN; +HRESULT InternetTransport_HandsOffCallback(InternetTransport *This) DECLSPEC_HIDDEN; +HRESULT InternetTransport_DropConnection(InternetTransport *This) DECLSPEC_HIDDEN; HRESULT InternetTransport_GetStatus(InternetTransport *This, - IXPSTATUS *pCurrentStatus); -HRESULT InternetTransport_ChangeStatus(InternetTransport *This, IXPSTATUS Status); + IXPSTATUS *pCurrentStatus) DECLSPEC_HIDDEN; +HRESULT InternetTransport_ChangeStatus(InternetTransport *This, IXPSTATUS Status) DECLSPEC_HIDDEN; HRESULT InternetTransport_ReadLine(InternetTransport *This, - INETXPORT_COMPLETION_FUNCTION fnCompletion); + INETXPORT_COMPLETION_FUNCTION fnCompletion) DECLSPEC_HIDDEN; HRESULT InternetTransport_Write(InternetTransport *This, const char *pvData, - int cbSize, INETXPORT_COMPLETION_FUNCTION fnCompletion); + int cbSize, INETXPORT_COMPLETION_FUNCTION fnCompletion) DECLSPEC_HIDDEN; HRESULT InternetTransport_DoCommand(InternetTransport *This, - LPCSTR pszCommand, INETXPORT_COMPLETION_FUNCTION fnCompletion); + LPCSTR pszCommand, INETXPORT_COMPLETION_FUNCTION fnCompletion) DECLSPEC_HIDDEN; -BOOL InternetTransport_RegisterClass(HINSTANCE hInstance); -void InternetTransport_UnregisterClass(HINSTANCE hInstance); +BOOL InternetTransport_RegisterClass(HINSTANCE hInstance) DECLSPEC_HIDDEN; +void InternetTransport_UnregisterClass(HINSTANCE hInstance) DECLSPEC_HIDDEN; -HRESULT MimeBody_create(IUnknown *outer, void **obj); -HRESULT MimeAllocator_create(IUnknown *outer, void **obj); -HRESULT MimeMessage_create(IUnknown *outer, void **obj); -HRESULT MimeSecurity_create(IUnknown *outer, void **obj); -HRESULT VirtualStream_create(IUnknown *outer, void **obj); +HRESULT MimeBody_create(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; +HRESULT MimeAllocator_create(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; +HRESULT MimeMessage_create(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; +HRESULT MimeSecurity_create(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; +HRESULT VirtualStream_create(IUnknown *outer, void **obj) DECLSPEC_HIDDEN; -HRESULT MimeInternational_Construct(IMimeInternational **internat); +HRESULT MimeInternational_Construct(IMimeInternational **internat) DECLSPEC_HIDDEN; -HRESULT SMTPTransportCF_Create(REFIID riid, LPVOID *ppv); -HRESULT IMAPTransportCF_Create(REFIID riid, LPVOID *ppv); -HRESULT POP3TransportCF_Create(REFIID riid, LPVOID *ppv); +HRESULT SMTPTransportCF_Create(REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN; +HRESULT IMAPTransportCF_Create(REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN; +HRESULT POP3TransportCF_Create(REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN; diff --git a/reactos/dll/win32/inetcomm/mimeintl.c b/reactos/dll/win32/inetcomm/mimeintl.c index 97b482ed3c7..07d3ae5f038 100644 --- a/reactos/dll/win32/inetcomm/mimeintl.c +++ b/reactos/dll/win32/inetcomm/mimeintl.c @@ -49,18 +49,18 @@ typedef struct typedef struct { - const IMimeInternationalVtbl *lpVtbl; + IMimeInternational IMimeInternational_iface; LONG refs; CRITICAL_SECTION cs; struct list charsets; LONG next_charset_handle; HCHARSET default_charset; -} internat; +} internat_impl; -static inline internat *impl_from_IMimeInternational( IMimeInternational *iface ) +static inline internat_impl *impl_from_IMimeInternational(IMimeInternational *iface) { - return (internat *)((char*)iface - FIELD_OFFSET(internat, lpVtbl)); + return CONTAINING_RECORD(iface, internat_impl, IMimeInternational_iface); } static inline HRESULT get_mlang(IMultiLanguage **ml) @@ -85,13 +85,13 @@ static HRESULT WINAPI MimeInternat_QueryInterface( IMimeInternational *iface, RE static ULONG WINAPI MimeInternat_AddRef( IMimeInternational *iface ) { - internat *This = impl_from_IMimeInternational( iface ); + internat_impl *This = impl_from_IMimeInternational( iface ); return InterlockedIncrement(&This->refs); } static ULONG WINAPI MimeInternat_Release( IMimeInternational *iface ) { - internat *This = impl_from_IMimeInternational( iface ); + internat_impl *This = impl_from_IMimeInternational( iface ); ULONG refs; refs = InterlockedDecrement(&This->refs); @@ -104,6 +104,8 @@ static ULONG WINAPI MimeInternat_Release( IMimeInternational *iface ) list_remove(&charset->entry); HeapFree(GetProcessHeap(), 0, charset); } + This->cs.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->cs); HeapFree(GetProcessHeap(), 0, This); } @@ -112,7 +114,7 @@ static ULONG WINAPI MimeInternat_Release( IMimeInternational *iface ) static HRESULT WINAPI MimeInternat_SetDefaultCharset(IMimeInternational *iface, HCHARSET hCharset) { - internat *This = impl_from_IMimeInternational( iface ); + internat_impl *This = impl_from_IMimeInternational( iface ); TRACE("(%p)->(%p)\n", iface, hCharset); @@ -126,7 +128,7 @@ static HRESULT WINAPI MimeInternat_SetDefaultCharset(IMimeInternational *iface, static HRESULT WINAPI MimeInternat_GetDefaultCharset(IMimeInternational *iface, LPHCHARSET phCharset) { - internat *This = impl_from_IMimeInternational( iface ); + internat_impl *This = impl_from_IMimeInternational( iface ); HRESULT hr = S_OK; TRACE("(%p)->(%p)\n", iface, phCharset); @@ -238,7 +240,7 @@ static HCHARSET add_charset(struct list *list, MIMECSETINFO *mlang_info, HCHARSE static HRESULT WINAPI MimeInternat_FindCharset(IMimeInternational *iface, LPCSTR pszCharset, LPHCHARSET phCharset) { - internat *This = impl_from_IMimeInternational( iface ); + internat_impl *This = impl_from_IMimeInternational( iface ); HRESULT hr = MIME_E_NOT_FOUND; charset_entry *charset; @@ -278,7 +280,7 @@ static HRESULT WINAPI MimeInternat_FindCharset(IMimeInternational *iface, LPCSTR static HRESULT WINAPI MimeInternat_GetCharsetInfo(IMimeInternational *iface, HCHARSET hCharset, LPINETCSETINFO pCsetInfo) { - internat *This = impl_from_IMimeInternational( iface ); + internat_impl *This = impl_from_IMimeInternational( iface ); HRESULT hr = MIME_E_INVALID_HANDLE; charset_entry *charset; @@ -519,20 +521,21 @@ static IMimeInternationalVtbl mime_internat_vtbl = MimeInternat_Rfc1522Encode }; -static internat *global_internat; +static internat_impl *global_internat; HRESULT MimeInternational_Construct(IMimeInternational **internat) { global_internat = HeapAlloc(GetProcessHeap(), 0, sizeof(*global_internat)); - global_internat->lpVtbl = &mime_internat_vtbl; + global_internat->IMimeInternational_iface.lpVtbl = &mime_internat_vtbl; global_internat->refs = 0; InitializeCriticalSection(&global_internat->cs); + global_internat->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": global_internat.cs"); list_init(&global_internat->charsets); global_internat->next_charset_handle = 0; global_internat->default_charset = NULL; - *internat = (IMimeInternational*)&global_internat->lpVtbl; + *internat = &global_internat->IMimeInternational_iface; IMimeInternational_AddRef(*internat); return S_OK; @@ -542,7 +545,7 @@ HRESULT WINAPI MimeOleGetInternat(IMimeInternational **internat) { TRACE("(%p)\n", internat); - *internat = (IMimeInternational *)&global_internat->lpVtbl; + *internat = &global_internat->IMimeInternational_iface; IMimeInternational_AddRef(*internat); return S_OK; } diff --git a/reactos/dll/win32/inetcomm/mimeole.c b/reactos/dll/win32/inetcomm/mimeole.c index f297c2973b4..8a1e3d4d266 100644 --- a/reactos/dll/win32/inetcomm/mimeole.c +++ b/reactos/dll/win32/inetcomm/mimeole.c @@ -2134,7 +2134,8 @@ static HRESULT WINAPI MimeMessage_IsContentType( { HRESULT hr; IMimeBody *mime_body; - TRACE("(%p)->(%p, %s, %s)\n", iface, hBody, pszPriType, pszSubType); + TRACE("(%p)->(%p, %s, %s)\n", iface, hBody, debugstr_a(pszPriType), + debugstr_a(pszSubType)); hr = IMimeMessage_BindToObject(iface, hBody, &IID_IMimeBody, (void**)&mime_body); if(FAILED(hr)) return hr; diff --git a/reactos/dll/win32/inetcomm/pop3transport.c b/reactos/dll/win32/inetcomm/pop3transport.c index b0e31df6449..af7d1bf91c5 100644 --- a/reactos/dll/win32/inetcomm/pop3transport.c +++ b/reactos/dll/win32/inetcomm/pop3transport.c @@ -63,7 +63,6 @@ static HRESULT parse_response(POP3Transport *This) switch (This->state) { case STATE_NONE: - { if (strlen(This->response) < 3) { WARN("parse error\n"); @@ -78,7 +77,7 @@ static HRESULT parse_response(POP3Transport *This) } This->state = STATE_DONE; return S_FALSE; - } + default: return S_OK; } } @@ -92,7 +91,6 @@ static HRESULT parse_uidl_response(POP3Transport *This, POP3UIDL *uidl) switch (This->state) { case STATE_OK: - { if (This->type == POP3CMD_GET_POPID) { if ((p = strchr(This->ptr, ' '))) @@ -111,9 +109,8 @@ static HRESULT parse_uidl_response(POP3Transport *This, POP3UIDL *uidl) } This->state = STATE_MULTILINE; return S_OK; - } + case STATE_MULTILINE: - { if (This->response[0] == '.' && !This->response[1]) { This->valid_info = FALSE; @@ -128,14 +125,12 @@ static HRESULT parse_uidl_response(POP3Transport *This, POP3UIDL *uidl) This->valid_info = TRUE; return S_OK; } - } + default: - { WARN("parse error\n"); This->state = STATE_DONE; return S_FALSE; } - } } static HRESULT parse_stat_response(POP3Transport *This, POP3STAT *stat) @@ -147,7 +142,6 @@ static HRESULT parse_stat_response(POP3Transport *This, POP3STAT *stat) switch (This->state) { case STATE_OK: - { if ((p = strchr(This->ptr, ' '))) { while (*p == ' ') p++; @@ -156,14 +150,12 @@ static HRESULT parse_stat_response(POP3Transport *This, POP3STAT *stat) This->state = STATE_DONE; return S_OK; } - } + default: - { WARN("parse error\n"); This->state = STATE_DONE; return S_FALSE; } - } } static HRESULT parse_list_response(POP3Transport *This, POP3LIST *list) @@ -175,7 +167,6 @@ static HRESULT parse_list_response(POP3Transport *This, POP3LIST *list) switch (This->state) { case STATE_OK: - { if (This->type == POP3CMD_GET_POPID) { if ((p = strchr(This->ptr, ' '))) @@ -189,9 +180,8 @@ static HRESULT parse_list_response(POP3Transport *This, POP3LIST *list) } This->state = STATE_MULTILINE; return S_OK; - } + case STATE_MULTILINE: - { if (This->response[0] == '.' && !This->response[1]) { This->valid_info = FALSE; @@ -206,14 +196,12 @@ static HRESULT parse_list_response(POP3Transport *This, POP3LIST *list) This->valid_info = TRUE; return S_OK; } - } + default: - { WARN("parse error\n"); This->state = STATE_DONE; return S_FALSE; } - } } static HRESULT parse_dele_response(POP3Transport *This, DWORD *dwPopId) @@ -221,18 +209,15 @@ static HRESULT parse_dele_response(POP3Transport *This, DWORD *dwPopId) switch (This->state) { case STATE_OK: - { *dwPopId = 0; /* FIXME */ This->state = STATE_DONE; return S_OK; - } + default: - { WARN("parse error\n"); This->state = STATE_DONE; return S_FALSE; } - } } static HRESULT parse_retr_response(POP3Transport *This, POP3RETR *retr) @@ -240,7 +225,6 @@ static HRESULT parse_retr_response(POP3Transport *This, POP3RETR *retr) switch (This->state) { case STATE_OK: - { retr->fHeader = FALSE; retr->fBody = FALSE; retr->dwPopId = This->msgid; @@ -251,7 +235,7 @@ static HRESULT parse_retr_response(POP3Transport *This, POP3RETR *retr) This->state = STATE_MULTILINE; This->valid_info = FALSE; return S_OK; - } + case STATE_MULTILINE: { int len; @@ -273,13 +257,12 @@ static HRESULT parse_retr_response(POP3Transport *This, POP3RETR *retr) This->valid_info = TRUE; return S_OK; } + default: - { WARN("parse error\n"); This->state = STATE_DONE; return S_FALSE; } - } } static HRESULT parse_top_response(POP3Transport *This, POP3TOP *top) @@ -287,7 +270,6 @@ static HRESULT parse_top_response(POP3Transport *This, POP3TOP *top) switch (This->state) { case STATE_OK: - { top->fHeader = FALSE; top->fBody = FALSE; top->dwPopId = This->msgid; @@ -299,7 +281,7 @@ static HRESULT parse_top_response(POP3Transport *This, POP3TOP *top) This->state = STATE_MULTILINE; This->valid_info = FALSE; return S_OK; - } + case STATE_MULTILINE: { int len; @@ -321,13 +303,12 @@ static HRESULT parse_top_response(POP3Transport *This, POP3TOP *top) This->valid_info = TRUE; return S_OK; } + default: - { WARN("parse error\n"); This->state = STATE_DONE; return S_FALSE; } - } } static void init_parser(POP3Transport *This, POP3COMMAND command, POP3CMDTYPE type) diff --git a/reactos/dll/win32/inetcomm/regsvr.c b/reactos/dll/win32/inetcomm/regsvr.c deleted file mode 100644 index 993e9ae9032..00000000000 --- a/reactos/dll/win32/inetcomm/regsvr.c +++ /dev/null @@ -1,512 +0,0 @@ -/* - * self-registerable dll functions for inetcomm.dll - * - * Copyright (C) 2003 John K. Hohm - * - * 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 "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winreg.h" -#include "winerror.h" -#include "objbase.h" -#include "ocidl.h" - -#include "initguid.h" -#include "mimeole.h" -#include "inetcomm_private.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -WINE_DEFAULT_DEBUG_CHANNEL(inetcomm); - -/* - * Near the bottom of this file are the exported DllRegisterServer and - * DllUnregisterServer, which make all this worthwhile. - */ - -/*********************************************************************** - * interface for self-registering - */ -struct regsvr_interface -{ - IID const *iid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - IID const *base_iid; /* can be NULL to omit */ - int num_methods; /* can be <0 to omit */ - CLSID const *ps_clsid; /* can be NULL to omit */ - CLSID const *ps_clsid32; /* can be NULL to omit */ -}; - -static HRESULT register_interfaces(struct regsvr_interface const *list); -static HRESULT unregister_interfaces(struct regsvr_interface const *list); - -struct regsvr_coclass -{ - CLSID const *clsid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - LPCSTR ips; /* can be NULL to omit */ - LPCSTR ips32; /* can be NULL to omit */ - LPCSTR ips32_tmodel; /* can be NULL to omit */ - LPCSTR clsid_str; /* can be NULL to omit */ - LPCSTR progid; /* can be NULL to omit */ -}; - -static HRESULT register_coclasses(struct regsvr_coclass const *list); -static HRESULT unregister_coclasses(struct regsvr_coclass const *list); - -/*********************************************************************** - * static string constants - */ -static WCHAR const interface_keyname[10] = { - 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; -static WCHAR const base_ifa_keyname[14] = { - 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', - 'e', 0 }; -static WCHAR const num_methods_keyname[11] = { - 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; -static WCHAR const ps_clsid_keyname[15] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', 0 }; -static WCHAR const ps_clsid32_keyname[17] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', '3', '2', 0 }; -static WCHAR const clsid_keyname[6] = { - 'C', 'L', 'S', 'I', 'D', 0 }; -static WCHAR const ips_keyname[13] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static WCHAR const ips32_keyname[15] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static WCHAR const progid_keyname[7] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static char const tmodel_valuename[] = "ThreadingModel"; - -/*********************************************************************** - * static helper functions - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); -static LONG register_key_defvalueW(HKEY base, WCHAR const *name, - WCHAR const *value); -static LONG register_key_defvalueA(HKEY base, WCHAR const *name, - char const *value); - -/*********************************************************************** - * register_interfaces - */ -static HRESULT register_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - HKEY iid_key; - - StringFromGUID2(list->iid, buf, 39); - res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_interface_key; - - if (list->name) { - res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->base_iid) { - res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (0 <= list->num_methods) { - static WCHAR const fmt[3] = { '%', 'd', 0 }; - HKEY key; - - res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - - sprintfW(buf, fmt, list->num_methods); - res = RegSetValueExW(key, NULL, 0, REG_SZ, - (CONST BYTE*)buf, - (lstrlenW(buf) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid) { - res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid32) { - res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - error_close_iid_key: - RegCloseKey(iid_key); - } - -error_close_interface_key: - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_interfaces - */ -static HRESULT unregister_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, - KEY_READ | KEY_WRITE, &interface_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->iid, buf, 39); - res = RegDeleteTreeW(interface_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - } - - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * register_coclasses - */ -static HRESULT register_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - HKEY clsid_key; - - StringFromGUID2(list->clsid, buf, 39); - res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->name) { - res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips) { - res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips32) { - HKEY ips32_key; - - res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &ips32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->ips32, - lstrlenA(list->ips32) + 1); - if (res == ERROR_SUCCESS && list->ips32_tmodel) - res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, - (CONST BYTE*)list->ips32_tmodel, - strlen(list->ips32_tmodel) + 1); - RegCloseKey(ips32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->clsid_str) { - res = register_key_defvalueA(clsid_key, clsid_keyname, - list->clsid_str); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->progid) { - HKEY progid_key; - - res = register_key_defvalueA(clsid_key, progid_keyname, - list->progid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegCreateKeyExA(HKEY_CLASSES_ROOT, list->progid, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &progid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_key_defvalueW(progid_key, clsid_keyname, buf); - RegCloseKey(progid_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - error_close_clsid_key: - RegCloseKey(clsid_key); - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_coclasses - */ -static HRESULT unregister_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, - KEY_READ | KEY_WRITE, &coclass_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->clsid, buf, 39); - res = RegDeleteTreeW(coclass_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->progid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * regsvr_key_guid - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) -{ - WCHAR buf[39]; - - StringFromGUID2(guid, buf, 39); - return register_key_defvalueW(base, name, buf); -} - -/*********************************************************************** - * regsvr_key_defvalueW - */ -static LONG register_key_defvalueW( - HKEY base, - WCHAR const *name, - WCHAR const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - (lstrlenW(value) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_key_defvalueA - */ -static LONG register_key_defvalueA( - HKEY base, - WCHAR const *name, - char const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - lstrlenA(value) + 1); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * coclass list - */ -static struct regsvr_coclass const coclass_list[] = { - { &CLSID_IHTTPMailTransport, - "CLSID_IHTTPMailTransport", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IPropFindRequest, - "CLSID_IPropFindRequest", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IPropPatchRequest, - "CLSID_IPropPatchRequest", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_ISMTPTransport, - "CLSID_ISMTPTransport", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_ISMTPTransport2, - "CLSID_ISMTPTransport2", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IPOP3Transport, - "CLSID_IPOP3Transport", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_INNTPTransport, - "CLSID_INNTPTransport", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IRASTransport, - "CLSID_IRASTransport", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IRangeList, - "CLSID_IRangeList", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IIMAPTransport, - "CLSID_IIMAPTransport", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IMimeBody, - "CLSID_IMimeBody", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IMimeAllocator, - "CLSID_IMimeAllocator", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IMimeMessage, - "CLSID_IMimeMessage", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IMimeSecurity, - "CLSID_IMimeSecurity", - NULL, - "inetcomm.dll", - "Both" - }, - { &CLSID_IVirtualStream, - "CLSID_IVirtualStream", - NULL, - "inetcomm.dll", - "Both" - }, - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * interface list - */ -static struct regsvr_interface const interface_list[] = { - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * DllRegisterServer (INETCOMM.@) - */ -HRESULT WINAPI DllRegisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = register_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = register_interfaces(interface_list); - return hr; -} - -/*********************************************************************** - * DllUnregisterServer (INETCOMM.@) - */ -HRESULT WINAPI DllUnregisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = unregister_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = unregister_interfaces(interface_list); - return hr; -} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 32ca11c41b5..dd021e88a42 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -71,7 +71,7 @@ reactos/dll/win32/icmp # Synced to Wine-0_9_10 reactos/dll/win32/imaadp32.acm # Synced to Wine-1.3.37 reactos/dll/win32/imagehlp # Autosync reactos/dll/win32/imm32 # Autosync -reactos/dll/win32/inetcomm # Autosync +reactos/dll/win32/inetcomm # Synced to Wine-1.3.37 reactos/dll/win32/inetmib1 # Autosync reactos/dll/win32/initpki # Autosync reactos/dll/win32/inseng # Synced to Wine-1.3.37 From ddd36eed48450462dbbc7f39177206c032a09f49 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 14:39:30 +0000 Subject: [PATCH 120/289] [INETCOMM_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55246 --- rostests/winetests/inetcomm/mimeintl.c | 1 - rostests/winetests/inetcomm/mimeole.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/rostests/winetests/inetcomm/mimeintl.c b/rostests/winetests/inetcomm/mimeintl.c index f64d7d93d23..09f9dae8d8c 100644 --- a/rostests/winetests/inetcomm/mimeintl.c +++ b/rostests/winetests/inetcomm/mimeintl.c @@ -31,7 +31,6 @@ #include "mlang.h" #include -#include #include "wine/test.h" diff --git a/rostests/winetests/inetcomm/mimeole.c b/rostests/winetests/inetcomm/mimeole.c index 7edef676f50..a53ab233f4f 100644 --- a/rostests/winetests/inetcomm/mimeole.c +++ b/rostests/winetests/inetcomm/mimeole.c @@ -29,7 +29,6 @@ #include "mimeole.h" #include -#include #include "wine/test.h" @@ -257,6 +256,7 @@ static void test_CreateMessage(void) IMimeBody_Release(body); hr = IMimeMessage_GetBody(msg, IBL_ROOT, NULL, &hbody); + ok(hr == S_OK, "ret %08x\n", hr); PropVariantInit(&prop); hr = IMimeMessage_GetBodyProp(msg, hbody, att_pritype, 0, &prop); From 75035a17dea441769c3c812364787e5ff0f50d09 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 15:24:58 +0000 Subject: [PATCH 121/289] [NTOSKRNL] * Laa-a-a-a-dies and gentlemen..... It was a deferred success. Move along mes chers, you make the place look crowded. svn path=/trunk/; revision=55247 --- reactos/ntoskrnl/include/internal/mm.h | 14 -------- reactos/ntoskrnl/ke/i386/thrdini.c | 3 -- reactos/ntoskrnl/ke/procobj.c | 9 ----- reactos/ntoskrnl/ke/thrdobj.c | 3 -- reactos/ntoskrnl/ke/thrdschd.c | 6 ---- reactos/ntoskrnl/mm/i386/page.c | 48 -------------------------- reactos/ntoskrnl/mm/mmfault.c | 35 ------------------- 7 files changed, 118 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 278b667f40e..09918a62af6 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -6,20 +6,6 @@ struct _EPROCESS; -/* ReactOS Mm Hacks */ -VOID -FASTCALL -MiSyncForProcessAttach( - IN PKTHREAD NextThread, - IN PEPROCESS Process -); - -VOID -FASTCALL -MiSyncForContextSwitch( - IN PKTHREAD Thread -); - extern PMMSUPPORT MmKernelAddressSpace; extern PFN_COUNT MiFreeSwapPages; extern PFN_COUNT MiUsedSwapPages; diff --git a/reactos/ntoskrnl/ke/i386/thrdini.c b/reactos/ntoskrnl/ke/i386/thrdini.c index cb120d39cb3..8ee631428d1 100644 --- a/reactos/ntoskrnl/ke/i386/thrdini.c +++ b/reactos/ntoskrnl/ke/i386/thrdini.c @@ -433,9 +433,6 @@ KiSwapContextEntry(IN PKSWITCHFRAME SwitchFrame, /* Get thread pointers */ OldThread = (PKTHREAD)(OldThreadAndApcFlag & ~3); NewThread = Pcr->PrcbData.CurrentThread; - - /* ReactOS Mm Hack */ - MiSyncForContextSwitch(NewThread); /* Get the old thread and set its kernel stack */ OldThread->KernelStack = SwitchFrame; diff --git a/reactos/ntoskrnl/ke/procobj.c b/reactos/ntoskrnl/ke/procobj.c index c8de4f05f43..7051c8241e1 100644 --- a/reactos/ntoskrnl/ke/procobj.c +++ b/reactos/ntoskrnl/ke/procobj.c @@ -97,9 +97,6 @@ KiAttachProcess(IN PKTHREAD Thread, /* Release lock */ KiReleaseApcLockFromDpcLevel(ApcLock); - /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncForProcessAttach(Thread, (PEPROCESS)Process); - /* Swap Processes */ KiSwapProcess(Process, SavedApcState->Process); @@ -618,9 +615,6 @@ KeDetachProcess(VOID) /* Release lock */ KiReleaseApcLockFromDpcLevel(&ApcLock); - /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncForProcessAttach(Thread, (PEPROCESS)Process); - /* Swap Processes */ KiSwapProcess(Thread->ApcState.Process, Process); @@ -788,9 +782,6 @@ KeUnstackDetachProcess(IN PRKAPC_STATE ApcState) /* Release lock */ KiReleaseApcLockFromDpcLevel(&ApcLock); - /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncForProcessAttach(Thread, (PEPROCESS)Process); - /* Swap Processes */ KiSwapProcess(Thread->ApcState.Process, Process); diff --git a/reactos/ntoskrnl/ke/thrdobj.c b/reactos/ntoskrnl/ke/thrdobj.c index 686fbbbe4ad..cfccf0de1b2 100644 --- a/reactos/ntoskrnl/ke/thrdobj.c +++ b/reactos/ntoskrnl/ke/thrdobj.c @@ -856,9 +856,6 @@ KeInitThread(IN OUT PKTHREAD Thread, Thread->StackBase = KernelStack; Thread->StackLimit = (ULONG_PTR)KernelStack - KERNEL_STACK_SIZE; Thread->KernelStackResident = TRUE; - - /* Make sure that we are in the right page directory (ReactOS Mm Hack) */ - MiSyncForProcessAttach(Thread, (PEPROCESS)Process); /* Enter SEH to avoid crashes due to user mode */ Status = STATUS_SUCCESS; diff --git a/reactos/ntoskrnl/ke/thrdschd.c b/reactos/ntoskrnl/ke/thrdschd.c index b9a063846d3..ee418c7e7ef 100644 --- a/reactos/ntoskrnl/ke/thrdschd.c +++ b/reactos/ntoskrnl/ke/thrdschd.c @@ -394,9 +394,6 @@ KiSwapThread(IN PKTHREAD CurrentThread, /* Save the wait IRQL */ WaitIrql = CurrentThread->WaitIrql; - /* REACTOS Mm Hack of Doom */ - MiSyncForContextSwitch(NextThread); - /* Swap contexts */ ApcState = KiSwapContext(WaitIrql, CurrentThread); @@ -793,9 +790,6 @@ NtYieldExecution(VOID) /* Sanity check */ ASSERT(OldIrql <= DISPATCH_LEVEL); - /* REACTOS Mm Hack of Doom */ - MiSyncForContextSwitch(NextThread); - /* Swap to new thread */ KiSwapContext(APC_LEVEL, Thread); Status = STATUS_SUCCESS; diff --git a/reactos/ntoskrnl/mm/i386/page.c b/reactos/ntoskrnl/mm/i386/page.c index 2b80afd0c4f..9ebf1bd2b93 100644 --- a/reactos/ntoskrnl/mm/i386/page.c +++ b/reactos/ntoskrnl/mm/i386/page.c @@ -1028,54 +1028,6 @@ MmGetPhysicalAddress(PVOID vaddr) return p; } -VOID -NTAPI -MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size) -{ - ULONG StartOffset, EndOffset, Offset; - PULONG Pde; - - // - // Check if the process isn't there anymore - // This is probably a bad sign, since it means the caller is setting cr3 to - // 0 or something... - // - if ((PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0]) == 0) && (Process != PsGetCurrentProcess())) - { - DPRINT1("Process: %16s is dead: %p\n", Process->ImageFileName, Process->Pcb.DirectoryTableBase[0]); - ASSERT(FALSE); - return; - } - - if (Address < MmSystemRangeStart) - { - KeBugCheck(MEMORY_MANAGEMENT); - } - - StartOffset = ADDR_TO_PDE_OFFSET(Address); - EndOffset = ADDR_TO_PDE_OFFSET((PVOID)((ULONG_PTR)Address + Size)); - - if (Process != NULL && Process != PsGetCurrentProcess()) - { - Pde = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0])); - } - else - { - Pde = (PULONG)PAGEDIRECTORY_MAP; - } - for (Offset = StartOffset; Offset <= EndOffset; Offset++) - { - if (Offset != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP)) - { - InterlockedCompareExchangePte(&Pde[Offset], MmGlobalKernelPageDirectory[Offset], 0); - } - } - if (Pde != (PULONG)PAGEDIRECTORY_MAP) - { - MmDeleteHyperspaceMapping(Pde); - } -} - VOID INIT_FUNCTION NTAPI diff --git a/reactos/ntoskrnl/mm/mmfault.c b/reactos/ntoskrnl/mm/mmfault.c index c749f187232..b8628a8db25 100644 --- a/reactos/ntoskrnl/mm/mmfault.c +++ b/reactos/ntoskrnl/mm/mmfault.c @@ -20,41 +20,6 @@ /* PRIVATE FUNCTIONS **********************************************************/ -VOID -FASTCALL -MiSyncForProcessAttach(IN PKTHREAD Thread, - IN PEPROCESS Process) -{ - PETHREAD Ethread = CONTAINING_RECORD(Thread, ETHREAD, Tcb); - //DPRINT1("Hack sync for process: %p and thread: %p\n", Process, Thread); - //DPRINT1("Thread stack hack: %p %d\n", Thread->StackLimit, Thread->LargeStack); - - /* Hack Sync because Mm is broken */ - MmUpdatePageDir(Process, Ethread, sizeof(ETHREAD)); - MmUpdatePageDir(Process, Ethread->ThreadsProcess, sizeof(EPROCESS)); - MmUpdatePageDir(Process, - (PVOID)Thread->StackLimit, - Thread->LargeStack ? - KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); -} - -VOID -FASTCALL -MiSyncForContextSwitch(IN PKTHREAD Thread) -{ - PVOID Process = PsGetCurrentProcess(); - PETHREAD Ethread = CONTAINING_RECORD(Thread, ETHREAD, Tcb); - //DPRINT1("Hack sync for thread: %p and process: %p\n", Thread, Process); - //DPRINT1("Thread stack hack: %p %d\n", Thread->StackLimit, Thread->LargeStack); - - /* Hack Sync because Mm is broken */ - MmUpdatePageDir(Process, Ethread->ThreadsProcess, sizeof(EPROCESS)); - MmUpdatePageDir(Process, - (PVOID)Thread->StackLimit, - Thread->LargeStack ? - KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); -} - NTSTATUS NTAPI MmpAccessFault(KPROCESSOR_MODE Mode, From dc4400d15d6ff0a5c5471c0589b53a44488d16e5 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 17:05:33 +0000 Subject: [PATCH 122/289] [ITSS] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55248 --- reactos/dll/win32/itss/chm_lib.h | 12 ++-- reactos/dll/win32/itss/itss.c | 110 +++++++++--------------------- reactos/dll/win32/itss/itss.idl | 55 +++++++++++++++ reactos/dll/win32/itss/itss.inf | 79 --------------------- reactos/dll/win32/itss/itss.rgs | 51 ++++++++++++++ reactos/dll/win32/itss/itss_r.rgs | 69 +++++++++++++++++++ reactos/dll/win32/itss/itsstor.h | 10 ++- reactos/dll/win32/itss/moniker.c | 42 +++++++----- reactos/dll/win32/itss/protocol.c | 83 +++++++++++----------- reactos/dll/win32/itss/rsrc.rc | 5 +- reactos/dll/win32/itss/storage.c | 73 ++++++++++++-------- reactos/media/doc/README.WINE | 2 +- 12 files changed, 334 insertions(+), 257 deletions(-) create mode 100644 reactos/dll/win32/itss/itss.idl delete mode 100644 reactos/dll/win32/itss/itss.inf create mode 100644 reactos/dll/win32/itss/itss.rgs create mode 100644 reactos/dll/win32/itss/itss_r.rgs diff --git a/reactos/dll/win32/itss/chm_lib.h b/reactos/dll/win32/itss/chm_lib.h index fcd17b50cbf..50264a52cf8 100644 --- a/reactos/dll/win32/itss/chm_lib.h +++ b/reactos/dll/win32/itss/chm_lib.h @@ -72,25 +72,25 @@ struct chmUnitInfo WCHAR path[CHM_MAX_PATHLEN+1]; }; -struct chmFile* chm_openW(const WCHAR *filename); -struct chmFile *chm_dup(struct chmFile *oldHandle); +struct chmFile* chm_openW(const WCHAR *filename) DECLSPEC_HIDDEN; +struct chmFile *chm_dup(struct chmFile *oldHandle) DECLSPEC_HIDDEN; /* close an ITS archive */ -void chm_close(struct chmFile *h); +void chm_close(struct chmFile *h) DECLSPEC_HIDDEN; /* resolve a particular object from the archive */ #define CHM_RESOLVE_SUCCESS (0) #define CHM_RESOLVE_FAILURE (1) int chm_resolve_object(struct chmFile *h, const WCHAR *objPath, - struct chmUnitInfo *ui); + struct chmUnitInfo *ui) DECLSPEC_HIDDEN; /* retrieve part of an object from the archive */ LONGINT64 chm_retrieve_object(struct chmFile *h, struct chmUnitInfo *ui, unsigned char *buf, LONGUINT64 addr, - LONGINT64 len); + LONGINT64 len) DECLSPEC_HIDDEN; /* enumerate the objects in the .chm archive */ typedef int (*CHM_ENUMERATOR)(struct chmFile *h, @@ -109,6 +109,6 @@ int chm_enumerate_dir(struct chmFile *h, const WCHAR *prefix, int what, CHM_ENUMERATOR e, - void *context); + void *context) DECLSPEC_HIDDEN; #endif /* INCLUDED_CHMLIB_H */ diff --git a/reactos/dll/win32/itss/itss.c b/reactos/dll/win32/itss/itss.c index 3ecab256fb2..fc2eb37d31c 100644 --- a/reactos/dll/win32/itss/itss.c +++ b/reactos/dll/win32/itss/itss.c @@ -33,6 +33,7 @@ #include "winuser.h" #include "winreg.h" #include "ole2.h" +#include "rpcproxy.h" #include "advpub.h" #include "wine/unicode.h" @@ -67,14 +68,19 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) * ITSS ClassFactory */ typedef struct { - const IClassFactoryVtbl *lpVtbl; + IClassFactory IClassFactory_iface; HRESULT (*pfnCreateInstance)(IUnknown *pUnkOuter, LPVOID *ppObj); } IClassFactoryImpl; +static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, IClassFactoryImpl, IClassFactory_iface); +} + static HRESULT WINAPI ITSSCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) { - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + IClassFactoryImpl *This = impl_from_IClassFactory(iface); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IClassFactory)) @@ -104,7 +110,7 @@ static ULONG WINAPI ITSSCF_Release(LPCLASSFACTORY iface) static HRESULT WINAPI ITSSCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pOuter, REFIID riid, LPVOID *ppobj) { - IClassFactoryImpl *This = (IClassFactoryImpl *)iface; + IClassFactoryImpl *This = impl_from_IClassFactory(iface); HRESULT hres; LPUNKNOWN punk; @@ -140,9 +146,9 @@ static const IClassFactoryVtbl ITSSCF_Vtbl = ITSSCF_LockServer }; -static const IClassFactoryImpl ITStorage_factory = { &ITSSCF_Vtbl, ITSS_create }; -static const IClassFactoryImpl MSITStore_factory = { &ITSSCF_Vtbl, ITS_IParseDisplayName_create }; -static const IClassFactoryImpl ITSProtocol_factory = { &ITSSCF_Vtbl, ITSProtocol_create }; +static const IClassFactoryImpl ITStorage_factory = { { &ITSSCF_Vtbl }, ITSS_create }; +static const IClassFactoryImpl MSITStore_factory = { { &ITSSCF_Vtbl }, ITS_IParseDisplayName_create }; +static const IClassFactoryImpl ITSProtocol_factory = { { &ITSSCF_Vtbl }, ITSProtocol_create }; /*********************************************************************** * DllGetClassObject (ITSS.@) @@ -171,17 +177,22 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) /*****************************************************************************/ typedef struct { - const IITStorageVtbl *vtbl_IITStorage; + IITStorage IITStorage_iface; LONG ref; } ITStorageImpl; +static inline ITStorageImpl *impl_from_IITStorage(IITStorage *iface) +{ + return CONTAINING_RECORD(iface, ITStorageImpl, IITStorage_iface); +} + static HRESULT WINAPI ITStorageImpl_QueryInterface( IITStorage* iface, REFIID riid, void** ppvObject) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IITStorage)) { @@ -197,7 +208,7 @@ static HRESULT WINAPI ITStorageImpl_QueryInterface( static ULONG WINAPI ITStorageImpl_AddRef( IITStorage* iface) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); TRACE("%p\n", This); return InterlockedIncrement(&This->ref); } @@ -205,7 +216,7 @@ static ULONG WINAPI ITStorageImpl_AddRef( static ULONG WINAPI ITStorageImpl_Release( IITStorage* iface) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); ULONG ref = InterlockedDecrement(&This->ref); if (ref == 0) { @@ -223,7 +234,7 @@ static HRESULT WINAPI ITStorageImpl_StgCreateDocfile( DWORD reserved, IStorage** ppstgOpen) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); TRACE("%p %s %u %u %p\n", This, debugstr_w(pwcsName), grfMode, reserved, ppstgOpen ); @@ -239,7 +250,7 @@ static HRESULT WINAPI ITStorageImpl_StgCreateDocfileOnILockBytes( DWORD reserved, IStorage** ppstgOpen) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); FIXME("%p\n", This); return E_NOTIMPL; } @@ -248,7 +259,7 @@ static HRESULT WINAPI ITStorageImpl_StgIsStorageFile( IITStorage* iface, const WCHAR* pwcsName) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); FIXME("%p\n", This); return E_NOTIMPL; } @@ -257,7 +268,7 @@ static HRESULT WINAPI ITStorageImpl_StgIsStorageILockBytes( IITStorage* iface, ILockBytes* plkbyt) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); FIXME("%p\n", This); return E_NOTIMPL; } @@ -271,7 +282,7 @@ static HRESULT WINAPI ITStorageImpl_StgOpenStorage( DWORD reserved, IStorage** ppstgOpen) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); TRACE("%p %s %p %d %p\n", This, debugstr_w( pwcsName ), pstgPriority, grfMode, snbExclude ); @@ -289,7 +300,7 @@ static HRESULT WINAPI ITStorageImpl_StgOpenStorageOnILockBytes( DWORD reserved, IStorage** ppstgOpen) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); FIXME("%p\n", This); return E_NOTIMPL; } @@ -301,7 +312,7 @@ static HRESULT WINAPI ITStorageImpl_StgSetTimes( const FILETIME* patime, const FILETIME* pmtime) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); FIXME("%p\n", This); return E_NOTIMPL; } @@ -310,7 +321,7 @@ static HRESULT WINAPI ITStorageImpl_SetControlData( IITStorage* iface, PITS_Control_Data pControlData) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); FIXME("%p\n", This); return E_NOTIMPL; } @@ -319,7 +330,7 @@ static HRESULT WINAPI ITStorageImpl_DefaultControlData( IITStorage* iface, PITS_Control_Data* ppControlData) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); FIXME("%p\n", This); return E_NOTIMPL; } @@ -329,7 +340,7 @@ static HRESULT WINAPI ITStorageImpl_Compact( const WCHAR* pwcsName, ECompactionLev iLev) { - ITStorageImpl *This = (ITStorageImpl *)iface; + ITStorageImpl *This = impl_from_IITStorage(iface); FIXME("%p\n", This); return E_NOTIMPL; } @@ -359,7 +370,7 @@ static HRESULT ITSS_create(IUnknown *pUnkOuter, LPVOID *ppObj) return CLASS_E_NOAGGREGATION; its = HeapAlloc( GetProcessHeap(), 0, sizeof(ITStorageImpl) ); - its->vtbl_IITStorage = &ITStorageImpl_Vtbl; + its->IITStorage_iface.lpVtbl = &ITStorageImpl_Vtbl; its->ref = 1; TRACE("-> %p\n", its); @@ -377,65 +388,12 @@ HRESULT WINAPI DllCanUnloadNow(void) return dll_count ? S_FALSE : S_OK; } -#define INF_SET_ID(id) \ - do \ - { \ - static CHAR name[] = #id; \ - \ - pse[i].pszName = name; \ - clsids[i++] = &id; \ - } while (0) - -#define INF_SET_CLSID(clsid) INF_SET_ID(CLSID_ ## clsid) - -static HRESULT register_server(BOOL do_register) -{ - HRESULT hres; - HMODULE hAdvpack; - HRESULT (WINAPI *pRegInstall)(HMODULE hm, LPCSTR pszSection, const STRTABLEA* pstTable); - STRTABLEA strtable; - STRENTRYA pse[4]; - static CLSID const *clsids[4]; - DWORD i = 0; - - static const WCHAR wszAdvpack[] = {'a','d','v','p','a','c','k','.','d','l','l',0}; - - INF_SET_CLSID(ITStorage); - INF_SET_CLSID(MSFSStore); - INF_SET_CLSID(MSITStore); - INF_SET_CLSID(ITSProtocol); - - strtable.cEntries = sizeof(pse)/sizeof(pse[0]); - strtable.pse = pse; - - for(i=0; i < strtable.cEntries; i++) { - pse[i].pszValue = HeapAlloc(GetProcessHeap(), 0, 39); - sprintf(pse[i].pszValue, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", - clsids[i]->Data1, clsids[i]->Data2, clsids[i]->Data3, clsids[i]->Data4[0], - clsids[i]->Data4[1], clsids[i]->Data4[2], clsids[i]->Data4[3], clsids[i]->Data4[4], - clsids[i]->Data4[5], clsids[i]->Data4[6], clsids[i]->Data4[7]); - } - - hAdvpack = LoadLibraryW(wszAdvpack); - pRegInstall = (void *)GetProcAddress(hAdvpack, "RegInstall"); - - hres = pRegInstall(hInst, do_register ? "RegisterDll" : "UnregisterDll", &strtable); - - for(i=0; i < sizeof(pse)/sizeof(pse[0]); i++) - HeapFree(GetProcessHeap(), 0, pse[i].pszValue); - - return hres; -} - -#undef INF_SET_CLSID -#undef INF_SET_ID - /*********************************************************************** * DllRegisterServer (ITSS.@) */ HRESULT WINAPI DllRegisterServer(void) { - return register_server(TRUE); + return __wine_register_resources( hInst ); } /*********************************************************************** @@ -443,5 +401,5 @@ HRESULT WINAPI DllRegisterServer(void) */ HRESULT WINAPI DllUnregisterServer(void) { - return register_server(FALSE); + return __wine_unregister_resources( hInst ); } diff --git a/reactos/dll/win32/itss/itss.idl b/reactos/dll/win32/itss/itss.idl new file mode 100644 index 00000000000..e3fac3a4689 --- /dev/null +++ b/reactos/dll/win32/itss/itss.idl @@ -0,0 +1,55 @@ +/* + * COM Classes for itss + * + * Copyright 2010 Alexandre Julliard + * + * 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 + */ + +[ + helpstring("Microsoft InfoTech Protocol for IE 3.0"), + threading(both), + progid("MSITFS1.0"), + vi_progid("MSITFS"), + uuid(9d148290-b9c8-11d0-a4cc-0000f80149f6) +] +coclass MSITStore { interface IParseDisplayName; } + +[ + helpstring("Microsoft InfoTech Protocol for IE 4.0"), + threading(both), + progid("MSITFS1.0"), + vi_progid("MSITFS"), + uuid(9d148291-b9c8-11d0-a4cc-0000f80149f6) +] +coclass ITSProtocol { interface IInternetProtocolInfo; } + +[ + helpstring("Microsoft InfoTech IStorage for Win32 Files"), + threading(both), + progid("MSITFS1.0"), + vi_progid("MSITFS"), + uuid(d54eee56-aaab-11d0-9e1d-00a0c922e6ec) +] +coclass MSFSStore { } + +[ + helpstring("Microsoft InfoTech IStorage System"), + threading(both), + progid("MSITFS1.0"), + vi_progid("MSITFS"), + uuid(5d02926a-212e-11d0-9df9-00a0c922e6ec) +] +coclass ITStorage { interface IITStorage; } diff --git a/reactos/dll/win32/itss/itss.inf b/reactos/dll/win32/itss/itss.inf deleted file mode 100644 index fcad4d1ae2f..00000000000 --- a/reactos/dll/win32/itss/itss.inf +++ /dev/null @@ -1,79 +0,0 @@ -[version] -Signature="$CHICAGO$" - - -[RegisterDll] -AddReg=Classes.Reg, Misc.Reg - - -[UnregisterDll] -DelReg=Classes.Reg, Misc.Reg - - -[Classes.Reg] - -;; ITStorage -HKCR,"CLSID\%CLSID_ITStorage%",,,"Microsoft InfoTech IStorage System" -HKCR,"CLSID\%CLSID_ITStorage%\InProcServer32",,,"itss.dll" -HKCR,"CLSID\%CLSID_ITStorage%\InProcServer32","ThreadingModel",,"Both" -HKCR,"CLSID\%CLSID_ITStorage%\NotInsertable",,16 -HKCR,"CLSID\%CLSID_ITStorage%\ProgID",,,"MSITFS1.0" -HKCR,"CLSID\%CLSID_ITStorage%\VersionIndependentProgID",,,"MSITFS" - -HKCR,"MSITFS",,,"Microsoft InfoTech IStorage System" -HKCR,"MSITFS\CLSID",,,"%CLSID_ITStorage%" -HKCR,"MSITFS\CurVer",,,"MSITFS1.0" - -;; ITSProtocol for IE 3.0 -HKCR,"CLSID\%CLSID_MSITStore%",,,"Microsoft InfoTech Protocol for IE 3.0" -HKCR,"CLSID\%CLSID_MSITStore%\InProcServer32",,,"itss.dll" -HKCR,"CLSID\%CLSID_MSITStore%\InProcServer32","ThreadingModel",,"Both" -HKCR,"CLSID\%CLSID_MSITStore%\NotInsertable",,16 -HKCR,"CLSID\%CLSID_MSITStore%\ProgID",,,"MSITFS1.0" -HKCR,"CLSID\%CLSID_MSITStore%\VersionIndependentProgID",,,"MSITFS" - -HKCR,"MSITStore",,,"Microsoft InfoTech Protocol for IE 3.0" -HKCR,"MSITStore\CLSID",,,"%CLSID_MSITStore%" -HKCR,"MSITStore\CurVer",,,"MSITStore1.0" - - -;; ITSProtocol for IE 4.0 -HKCR,"CLSID\%CLSID_ITSProtocol%",,,"Microsoft InfoTech Protocol for IE 4.0" -HKCR,"CLSID\%CLSID_ITSProtocol%\InProcServer32",,,"itss.dll" -HKCR,"CLSID\%CLSID_ITSProtocol%\InProcServer32","ThreadingModel",,"Both" -HKCR,"CLSID\%CLSID_ITSProtocol%\NotInsertable",,16 -HKCR,"CLSID\%CLSID_ITSProtocol%\ProgID",,,"MSITFS1.0" -HKCR,"CLSID\%CLSID_ITSProtocol%\VersionIndependentProgID",,,"MSITFS" - -HKCR,"ITSProtocol","Microsoft InfoTech Protocols for IE 4.0" -HKCR,"ITSProtocol\CLSID",,,"%CLSID_ITSProtocol%" -HKCR,"ITSProtocol\CurVer",,,"ITSProtocol1.0" - - -;; MSFSStore -HKCR,"CLSID\%CLSID_MSFSStore%",,,"Microsoft InfoTech IStorage for Win32 Files" -HKCR,"CLSID\%CLSID_MSFSStore%\InProcServer32",,,"itss.dll" -HKCR,"CLSID\%CLSID_MSFSStore%\InProcServer32","ThreadingModel",,"Both" -HKCR,"CLSID\%CLSID_MSFSStore%\NotInsertable",,16 -HKCR,"CLSID\%CLSID_MSFSStore%\ProgID",,,"MSITFS1.0" -HKCR,"CLSID\%CLSID_MSFSStore%\VersionIndependentProgID",,,"MSITFS" - -HKCR,"MSFSStore",,,"Microsoft InfoTech IStorage for Win32 Files" -HKCR,"MSFSStore\CLSID",,,"%CLSID_MSFSStore%" -HKCR,"MSFSStore\CurVer",,,"MSFSStore1.0" - - -[Misc.Reg] - -HKCR,".its",,,"ITS File" -HKCR,"ITS FILE",,,"Internet Document Set" -HKCR,"ITS FILE\DefaultIcon",,,"itss.dll,0" -;; HKCR "ITS FILE\shell\open\command",,,"FIXME" - -HKCR,"PROTOCOLS\Handler\its",,,"its: Asychronous Pluggable Protocol Handler" -HKCR,"PROTOCOLS\Handler\its","CLSID",,"%CLSID_ITSProtocol%" -HKCR,"PROTOCOLS\Handler\ms-its",,,"ms-its: Asychronous Pluggable Protocol Handler" -HKCR,"PROTOCOLS\Handler\ms-its","CLSID",,"%CLSID_ITSProtocol%" - -HKCR,"PROTOCOLS\Name-Space Handler\mk",,,"NameSpace Filter for MK:@MSITStore:..." -HKCR,"PROTOCOLS\Name-Space Handler\mk\*","CLSID",,"%CLSID_ITSProtocol%" diff --git a/reactos/dll/win32/itss/itss.rgs b/reactos/dll/win32/itss/itss.rgs new file mode 100644 index 00000000000..66079ad9287 --- /dev/null +++ b/reactos/dll/win32/itss/itss.rgs @@ -0,0 +1,51 @@ +HKCR +{ + ForceRemove '.its' = s 'ITS File' + ForceRemove 'ITS FILE' = s 'Internet Document Set' + { + DefaultIcon = s '%MODULE%,0' + } + ForceRemove MSITStore = s 'Microsoft InfoTech Protocol for IE 3.0' + { + CLSID = s '{9D148290-B9C8-11D0-A4CC-0000F80149F6}' + CurVer = s 'MSITStore1.0' + } + ForceRemove ITSProtocol = s 'Microsoft InfoTech Protocols for IE 4.0' + { + CLSID = s '{9D148291-B9C8-11D0-A4CC-0000F80149F6}' + CurVer = s 'ITSProtocol1.0' + } + ForceRemove MSFSStore = s 'Microsoft InfoTech IStorage for Win32 Files' + { + CLSID = s '{D54EEE56-AAAB-11D0-9E1D-00A0C922E6EC}' + CurVer = s 'MSFSStore1.0' + } + NoRemove PROTOCOLS + { + NoRemove Handler + { + ForceRemove its = s 'its: Asychronous Pluggable Protocol Handler' + { + val CLSID = s '{9D148291-B9C8-11D0-A4CC-0000F80149F6}' + } + ForceRemove ms-its = s 'ms-its: Asychronous Pluggable Protocol Handler' + { + val CLSID = s '{9D148291-B9C8-11D0-A4CC-0000F80149F6}' + } + } + NoRemove 'Name-Space Handler' + { + ForceRemove mk = s 'NameSpace Filter for MK:@MSITStore:...' + { + '*' { val CLSID = s '{9D148291-B9C8-11D0-A4CC-0000F80149F6}' } + } + } + } + NoRemove CLSID + { + '{5D02926A-212E-11D0-9DF9-00A0C922E6EC}' { NotInsertable } + '{9D148290-B9C8-11D0-A4CC-0000F80149F6}' { NotInsertable } + '{9D148291-B9C8-11D0-A4CC-0000F80149F6}' { NotInsertable } + '{D54EEE56-AAAB-11D0-9E1D-00A0C922E6EC}' { NotInsertable } + } +} diff --git a/reactos/dll/win32/itss/itss_r.rgs b/reactos/dll/win32/itss/itss_r.rgs new file mode 100644 index 00000000000..49ea9bfe881 --- /dev/null +++ b/reactos/dll/win32/itss/itss_r.rgs @@ -0,0 +1,69 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{9D148290-B9C8-11D0-A4CC-0000F80149F6}' = s 'Microsoft InfoTech Protocol for IE 3.0' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'MSITFS1.0' + VersionIndependentProgId = s 'MSITFS' + } + '{9D148291-B9C8-11D0-A4CC-0000F80149F6}' = s 'Microsoft InfoTech Protocol for IE 4.0' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'MSITFS1.0' + VersionIndependentProgId = s 'MSITFS' + } + '{D54EEE56-AAAB-11D0-9E1D-00A0C922E6EC}' = s 'Microsoft InfoTech IStorage for Win32 Files' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'MSITFS1.0' + VersionIndependentProgId = s 'MSITFS' + } + '{5D02926A-212E-11D0-9DF9-00A0C922E6EC}' = s 'Microsoft InfoTech IStorage System' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'MSITFS1.0' + VersionIndependentProgId = s 'MSITFS' + } + } + 'MSITFS1.0' = s 'Microsoft InfoTech Protocol for IE 3.0' + { + CLSID = s '{9D148290-B9C8-11D0-A4CC-0000F80149F6}' + } + 'MSITFS' = s 'Microsoft InfoTech Protocol for IE 3.0' + { + CLSID = s '{9D148290-B9C8-11D0-A4CC-0000F80149F6}' + CurVer = s 'MSITFS1.0' + } + 'MSITFS1.0' = s 'Microsoft InfoTech Protocol for IE 4.0' + { + CLSID = s '{9D148291-B9C8-11D0-A4CC-0000F80149F6}' + } + 'MSITFS' = s 'Microsoft InfoTech Protocol for IE 4.0' + { + CLSID = s '{9D148291-B9C8-11D0-A4CC-0000F80149F6}' + CurVer = s 'MSITFS1.0' + } + 'MSITFS1.0' = s 'Microsoft InfoTech IStorage for Win32 Files' + { + CLSID = s '{D54EEE56-AAAB-11D0-9E1D-00A0C922E6EC}' + } + 'MSITFS' = s 'Microsoft InfoTech IStorage for Win32 Files' + { + CLSID = s '{D54EEE56-AAAB-11D0-9E1D-00A0C922E6EC}' + CurVer = s 'MSITFS1.0' + } + 'MSITFS1.0' = s 'Microsoft InfoTech IStorage System' + { + CLSID = s '{5D02926A-212E-11D0-9DF9-00A0C922E6EC}' + } + 'MSITFS' = s 'Microsoft InfoTech IStorage System' + { + CLSID = s '{5D02926A-212E-11D0-9DF9-00A0C922E6EC}' + CurVer = s 'MSITFS1.0' + } +} diff --git a/reactos/dll/win32/itss/itsstor.h b/reactos/dll/win32/itss/itsstor.h index d134725406b..f4fa72b216b 100644 --- a/reactos/dll/win32/itss/itsstor.h +++ b/reactos/dll/win32/itss/itsstor.h @@ -29,18 +29,16 @@ extern HRESULT ITSS_StgOpenStorage( DWORD grfMode, SNB snbExclude, DWORD reserved, - IStorage** ppstgOpen); + IStorage** ppstgOpen) DECLSPEC_HIDDEN; extern HRESULT ITS_IParseDisplayName_create( IUnknown *pUnkOuter, - LPVOID *ppObj); + LPVOID *ppObj) DECLSPEC_HIDDEN; -extern HRESULT ITSProtocol_create(IUnknown *pUnkOuter, LPVOID *ppobj); +extern HRESULT ITSProtocol_create(IUnknown *pUnkOuter, LPVOID *ppobj) DECLSPEC_HIDDEN; -extern LONG dll_count; +extern LONG dll_count DECLSPEC_HIDDEN; static inline void ITSS_LockModule(void) { InterlockedIncrement(&dll_count); } static inline void ITSS_UnlockModule(void) { InterlockedDecrement(&dll_count); } -#define DEFINE_THIS(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,lp ## ifc ## Vtbl))) - #endif /* __WINE_ITS_STORAGE_PRIVATE__ */ diff --git a/reactos/dll/win32/itss/moniker.c b/reactos/dll/win32/itss/moniker.c index 76630cd518e..02edd49d268 100644 --- a/reactos/dll/win32/itss/moniker.c +++ b/reactos/dll/win32/itss/moniker.c @@ -43,19 +43,24 @@ WINE_DEFAULT_DEBUG_CHANNEL(itss); /*****************************************************************************/ typedef struct { - const IMonikerVtbl *vtbl_ITS_IMoniker; + IMoniker IMoniker_iface; LONG ref; LPWSTR szHtml; WCHAR szFile[1]; } ITS_IMonikerImpl; +static inline ITS_IMonikerImpl *impl_from_IMoniker(IMoniker *iface) +{ + return CONTAINING_RECORD(iface, ITS_IMonikerImpl, IMoniker_iface); +} + /*** IUnknown methods ***/ static HRESULT WINAPI ITS_IMonikerImpl_QueryInterface( IMoniker* iface, REFIID riid, void** ppvObject) { - ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface; + ITS_IMonikerImpl *This = impl_from_IMoniker(iface); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IParseDisplayName)) @@ -72,7 +77,7 @@ static HRESULT WINAPI ITS_IMonikerImpl_QueryInterface( static ULONG WINAPI ITS_IMonikerImpl_AddRef( IMoniker* iface) { - ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface; + ITS_IMonikerImpl *This = impl_from_IMoniker(iface); TRACE("%p\n", This); return InterlockedIncrement(&This->ref); } @@ -80,7 +85,7 @@ static ULONG WINAPI ITS_IMonikerImpl_AddRef( static ULONG WINAPI ITS_IMonikerImpl_Release( IMoniker* iface) { - ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface; + ITS_IMonikerImpl *This = impl_from_IMoniker(iface); ULONG ref = InterlockedDecrement(&This->ref); if (ref == 0) { @@ -96,7 +101,7 @@ static HRESULT WINAPI ITS_IMonikerImpl_GetClassID( IMoniker* iface, CLSID* pClassID) { - ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface; + ITS_IMonikerImpl *This = impl_from_IMoniker(iface); TRACE("%p %p\n", This, pClassID); *pClassID = CLSID_ITStorage; @@ -155,7 +160,7 @@ static HRESULT WINAPI ITS_IMonikerImpl_BindToStorage( REFIID riid, void** ppvObj) { - ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface; + ITS_IMonikerImpl *This = impl_from_IMoniker(iface); DWORD grfMode = STGM_SIMPLE | STGM_READ | STGM_SHARE_EXCLUSIVE; HRESULT r; IStorage *stg = NULL; @@ -279,7 +284,7 @@ static HRESULT WINAPI ITS_IMonikerImpl_GetDisplayName( IMoniker* pmkToLeft, LPOLESTR* ppszDisplayName) { - ITS_IMonikerImpl *This = (ITS_IMonikerImpl *)iface; + ITS_IMonikerImpl *This = impl_from_IMoniker(iface); static const WCHAR szFormat[] = { 'm','s','-','i','t','s',':','%','s',':',':','%','s',0 }; DWORD len = sizeof szFormat / sizeof(WCHAR); @@ -352,7 +357,7 @@ static HRESULT ITS_IMoniker_create( IMoniker **ppObj, LPCWSTR name, DWORD n ) sz = sizeof(ITS_IMonikerImpl) + strlenW( name )*sizeof(WCHAR); itsmon = HeapAlloc( GetProcessHeap(), 0, sz ); - itsmon->vtbl_ITS_IMoniker = &ITS_IMonikerImpl_Vtbl; + itsmon->IMoniker_iface.lpVtbl = &ITS_IMonikerImpl_Vtbl; itsmon->ref = 1; strcpyW( itsmon->szFile, name ); itsmon->szHtml = &itsmon->szFile[n]; @@ -362,7 +367,7 @@ static HRESULT ITS_IMoniker_create( IMoniker **ppObj, LPCWSTR name, DWORD n ) TRACE("-> %p %s %s\n", itsmon, debugstr_w(itsmon->szFile), debugstr_w(itsmon->szHtml) ); - *ppObj = (IMoniker*) itsmon; + *ppObj = &itsmon->IMoniker_iface; ITSS_LockModule(); return S_OK; @@ -371,16 +376,21 @@ static HRESULT ITS_IMoniker_create( IMoniker **ppObj, LPCWSTR name, DWORD n ) /*****************************************************************************/ typedef struct { - const IParseDisplayNameVtbl *vtbl_ITS_IParseDisplayName; + IParseDisplayName IParseDisplayName_iface; LONG ref; } ITS_IParseDisplayNameImpl; +static inline ITS_IParseDisplayNameImpl *impl_from_IParseDisplayName(IParseDisplayName *iface) +{ + return CONTAINING_RECORD(iface, ITS_IParseDisplayNameImpl, IParseDisplayName_iface); +} + static HRESULT WINAPI ITS_IParseDisplayNameImpl_QueryInterface( IParseDisplayName* iface, REFIID riid, void** ppvObject) { - ITS_IParseDisplayNameImpl *This = (ITS_IParseDisplayNameImpl *)iface; + ITS_IParseDisplayNameImpl *This = impl_from_IParseDisplayName(iface); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IParseDisplayName)) @@ -397,7 +407,7 @@ static HRESULT WINAPI ITS_IParseDisplayNameImpl_QueryInterface( static ULONG WINAPI ITS_IParseDisplayNameImpl_AddRef( IParseDisplayName* iface) { - ITS_IParseDisplayNameImpl *This = (ITS_IParseDisplayNameImpl *)iface; + ITS_IParseDisplayNameImpl *This = impl_from_IParseDisplayName(iface); TRACE("%p\n", This); return InterlockedIncrement(&This->ref); } @@ -405,7 +415,7 @@ static ULONG WINAPI ITS_IParseDisplayNameImpl_AddRef( static ULONG WINAPI ITS_IParseDisplayNameImpl_Release( IParseDisplayName* iface) { - ITS_IParseDisplayNameImpl *This = (ITS_IParseDisplayNameImpl *)iface; + ITS_IParseDisplayNameImpl *This = impl_from_IParseDisplayName(iface); ULONG ref = InterlockedDecrement(&This->ref); if (ref == 0) { @@ -428,12 +438,12 @@ static HRESULT WINAPI ITS_IParseDisplayNameImpl_ParseDisplayName( const DWORD prefix_len = (sizeof szPrefix/sizeof szPrefix[0])-1; DWORD n; - ITS_IParseDisplayNameImpl *This = (ITS_IParseDisplayNameImpl *)iface; + ITS_IParseDisplayNameImpl *This = impl_from_IParseDisplayName(iface); TRACE("%p %s %p %p\n", This, debugstr_w( pszDisplayName ), pchEaten, ppmkOut ); - if( strncmpW( pszDisplayName, szPrefix, prefix_len ) ) + if( strncmpiW( pszDisplayName, szPrefix, prefix_len ) ) return MK_E_SYNTAX; /* search backwards for a double colon */ @@ -469,7 +479,7 @@ HRESULT ITS_IParseDisplayName_create(IUnknown *pUnkOuter, LPVOID *ppObj) return CLASS_E_NOAGGREGATION; its = HeapAlloc( GetProcessHeap(), 0, sizeof(ITS_IParseDisplayNameImpl) ); - its->vtbl_ITS_IParseDisplayName = &ITS_IParseDisplayNameImpl_Vtbl; + its->IParseDisplayName_iface.lpVtbl = &ITS_IParseDisplayNameImpl_Vtbl; its->ref = 1; TRACE("-> %p\n", its); diff --git a/reactos/dll/win32/itss/protocol.c b/reactos/dll/win32/itss/protocol.c index 2991226ac48..fa2ad8bd5af 100644 --- a/reactos/dll/win32/itss/protocol.c +++ b/reactos/dll/win32/itss/protocol.c @@ -36,8 +36,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(itss); typedef struct { - const IInternetProtocolVtbl *lpInternetProtocolVtbl; - const IInternetProtocolInfoVtbl *lpInternetProtocolInfoVtbl; + IInternetProtocol IInternetProtocol_iface; + IInternetProtocolInfo IInternetProtocolInfo_iface; LONG ref; @@ -46,8 +46,15 @@ typedef struct { struct chmUnitInfo chm_object; } ITSProtocol; -#define PROTOCOL(x) ((IInternetProtocol*) &(x)->lpInternetProtocolVtbl) -#define PROTINFO(x) (&(x)->lpInternetProtocolInfoVtbl) +static inline ITSProtocol *impl_from_IInternetProtocol(IInternetProtocol *iface) +{ + return CONTAINING_RECORD(iface, ITSProtocol, IInternetProtocol_iface); +} + +static inline ITSProtocol *impl_from_IInternetProtocolInfo(IInternetProtocolInfo *iface) +{ + return CONTAINING_RECORD(iface, ITSProtocol, IInternetProtocolInfo_iface); +} static void release_chm(ITSProtocol *This) { @@ -58,25 +65,23 @@ static void release_chm(ITSProtocol *This) This->offset = 0; } -#define PROTOCOL_THIS(iface) DEFINE_THIS(ITSProtocol, InternetProtocol, iface) - static HRESULT WINAPI ITSProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); - *ppv = PROTOCOL(This); + *ppv = &This->IInternetProtocol_iface; }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); - *ppv = PROTOCOL(This); + *ppv = &This->IInternetProtocol_iface; }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); - *ppv = PROTOCOL(This); + *ppv = &This->IInternetProtocol_iface; }else if(IsEqualGUID(&IID_IInternetProtocolInfo, riid)) { TRACE("(%p)->(IID_IInternetProtocolInfo %p)\n", This, ppv); - *ppv = PROTINFO(This); + *ppv = &This->IInternetProtocolInfo_iface; } if(*ppv) { @@ -90,7 +95,7 @@ static HRESULT WINAPI ITSProtocol_QueryInterface(IInternetProtocol *iface, REFII static ULONG WINAPI ITSProtocol_AddRef(IInternetProtocol *iface) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); LONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); return ref; @@ -98,7 +103,7 @@ static ULONG WINAPI ITSProtocol_AddRef(IInternetProtocol *iface) static ULONG WINAPI ITSProtocol_Release(IInternetProtocol *iface) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); @@ -139,7 +144,7 @@ static HRESULT WINAPI ITSProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); BINDINFO bindinfo; DWORD bindf = 0, len; LPWSTR file_name, mime, object_name, p; @@ -252,7 +257,7 @@ static HRESULT WINAPI ITSProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, static HRESULT WINAPI ITSProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); FIXME("(%p)->(%p)\n", This, pProtocolData); return E_NOTIMPL; } @@ -260,14 +265,14 @@ static HRESULT WINAPI ITSProtocol_Continue(IInternetProtocol *iface, PROTOCOLDAT static HRESULT WINAPI ITSProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason, DWORD dwOptions) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions); return E_NOTIMPL; } static HRESULT WINAPI ITSProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); TRACE("(%p)->(%08x)\n", This, dwOptions); @@ -276,14 +281,14 @@ static HRESULT WINAPI ITSProtocol_Terminate(IInternetProtocol *iface, DWORD dwOp static HRESULT WINAPI ITSProtocol_Suspend(IInternetProtocol *iface) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); FIXME("(%p)\n", This); return E_NOTIMPL; } static HRESULT WINAPI ITSProtocol_Resume(IInternetProtocol *iface) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); FIXME("(%p)\n", This); return E_NOTIMPL; } @@ -291,7 +296,7 @@ static HRESULT WINAPI ITSProtocol_Resume(IInternetProtocol *iface) static HRESULT WINAPI ITSProtocol_Read(IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead); @@ -307,14 +312,14 @@ static HRESULT WINAPI ITSProtocol_Read(IInternetProtocol *iface, void *pv, static HRESULT WINAPI ITSProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition); return E_NOTIMPL; } static HRESULT WINAPI ITSProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); TRACE("(%p)->(%08x)\n", This, dwOptions); @@ -323,15 +328,13 @@ static HRESULT WINAPI ITSProtocol_LockRequest(IInternetProtocol *iface, DWORD dw static HRESULT WINAPI ITSProtocol_UnlockRequest(IInternetProtocol *iface) { - ITSProtocol *This = PROTOCOL_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocol(iface); TRACE("(%p)\n", This); return S_OK; } -#undef PROTOCOL_THIS - static const IInternetProtocolVtbl ITSProtocolVtbl = { ITSProtocol_QueryInterface, ITSProtocol_AddRef, @@ -348,32 +351,30 @@ static const IInternetProtocolVtbl ITSProtocolVtbl = { ITSProtocol_UnlockRequest }; -#define PROTINFO_THIS(iface) DEFINE_THIS(ITSProtocol, InternetProtocolInfo, iface) - static HRESULT WINAPI ITSProtocolInfo_QueryInterface(IInternetProtocolInfo *iface, REFIID riid, void **ppv) { - ITSProtocol *This = PROTINFO_THIS(iface); - return IInternetProtocol_QueryInterface(PROTOCOL(This), riid, ppv); + ITSProtocol *This = impl_from_IInternetProtocolInfo(iface); + return IInternetProtocol_QueryInterface(&This->IInternetProtocol_iface, riid, ppv); } static ULONG WINAPI ITSProtocolInfo_AddRef(IInternetProtocolInfo *iface) { - ITSProtocol *This = PROTINFO_THIS(iface); - return IInternetProtocol_AddRef(PROTOCOL(This)); + ITSProtocol *This = impl_from_IInternetProtocolInfo(iface); + return IInternetProtocol_AddRef(&This->IInternetProtocol_iface); } static ULONG WINAPI ITSProtocolInfo_Release(IInternetProtocolInfo *iface) { - ITSProtocol *This = PROTINFO_THIS(iface); - return IInternetProtocol_Release(PROTOCOL(This)); + ITSProtocol *This = impl_from_IInternetProtocolInfo(iface); + return IInternetProtocol_Release(&This->IInternetProtocol_iface); } static HRESULT WINAPI ITSProtocolInfo_ParseUrl(IInternetProtocolInfo *iface, LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved) { - ITSProtocol *This = PROTINFO_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocolInfo(iface); TRACE("(%p)->(%s %x %08x %p %d %p %d)\n", This, debugstr_w(pwzUrl), ParseAction, dwParseFlags, pwzResult, cchResult, pcchResult, dwReserved); @@ -396,7 +397,7 @@ static HRESULT WINAPI ITSProtocolInfo_CombineUrl(IInternetProtocolInfo *iface, LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags, LPWSTR pwzResult, DWORD cchResult, DWORD* pcchResult, DWORD dwReserved) { - ITSProtocol *This = PROTINFO_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocolInfo(iface); LPCWSTR base_end, ptr; DWORD rel_len; @@ -441,7 +442,7 @@ static HRESULT WINAPI ITSProtocolInfo_CombineUrl(IInternetProtocolInfo *iface, static HRESULT WINAPI ITSProtocolInfo_CompareUrl(IInternetProtocolInfo *iface, LPCWSTR pwzUrl1, LPCWSTR pwzUrl2, DWORD dwCompareFlags) { - ITSProtocol *This = PROTINFO_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocolInfo(iface); FIXME("%p)->(%s %s %08x)\n", This, debugstr_w(pwzUrl1), debugstr_w(pwzUrl2), dwCompareFlags); return E_NOTIMPL; } @@ -450,14 +451,12 @@ static HRESULT WINAPI ITSProtocolInfo_QueryInfo(IInternetProtocolInfo *iface, LP QUERYOPTION QueryOption, DWORD dwQueryFlags, LPVOID pBuffer, DWORD cbBuffer, DWORD* pcbBuf, DWORD dwReserved) { - ITSProtocol *This = PROTINFO_THIS(iface); + ITSProtocol *This = impl_from_IInternetProtocolInfo(iface); FIXME("(%p)->(%s %08x %08x %p %d %p %d)\n", This, debugstr_w(pwzUrl), QueryOption, dwQueryFlags, pBuffer, cbBuffer, pcbBuf, dwReserved); return E_NOTIMPL; } -#undef PROTINFO_THIS - static const IInternetProtocolInfoVtbl ITSProtocolInfoVtbl = { ITSProtocolInfo_QueryInterface, ITSProtocolInfo_AddRef, @@ -478,11 +477,11 @@ HRESULT ITSProtocol_create(IUnknown *pUnkOuter, LPVOID *ppobj) ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ITSProtocol)); - ret->lpInternetProtocolVtbl = &ITSProtocolVtbl; - ret->lpInternetProtocolInfoVtbl = &ITSProtocolInfoVtbl; + ret->IInternetProtocol_iface.lpVtbl = &ITSProtocolVtbl; + ret->IInternetProtocolInfo_iface.lpVtbl = &ITSProtocolInfoVtbl; ret->ref = 1; - *ppobj = PROTOCOL(ret); + *ppobj = &ret->IInternetProtocol_iface; return S_OK; } diff --git a/reactos/dll/win32/itss/rsrc.rc b/reactos/dll/win32/itss/rsrc.rc index 2b0edd8c700..889a5528c5c 100644 --- a/reactos/dll/win32/itss/rsrc.rc +++ b/reactos/dll/win32/itss/rsrc.rc @@ -16,5 +16,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -/* @makedep: itss.inf */ -REGINST REGINST itss.inf +/* @makedep: itss.rgs */ +1 WINE_REGISTRY itss.rgs +2 WINE_REGISTRY itss_r.rgs diff --git a/reactos/dll/win32/itss/storage.c b/reactos/dll/win32/itss/storage.c index 79c863a4bc2..4f687c6c7b4 100644 --- a/reactos/dll/win32/itss/storage.c +++ b/reactos/dll/win32/itss/storage.c @@ -45,7 +45,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(itss); typedef struct _ITSS_IStorageImpl { - const IStorageVtbl *vtbl_IStorage; + IStorage IStorage_iface; LONG ref; struct chmFile *chmfile; WCHAR dir[1]; @@ -59,20 +59,35 @@ struct enum_info typedef struct _IEnumSTATSTG_Impl { - const IEnumSTATSTGVtbl *vtbl_IEnumSTATSTG; + IEnumSTATSTG IEnumSTATSTG_iface; LONG ref; struct enum_info *first, *last, *current; } IEnumSTATSTG_Impl; typedef struct _IStream_Impl { - const IStreamVtbl *vtbl_IStream; + IStream IStream_iface; LONG ref; ITSS_IStorageImpl *stg; ULONGLONG addr; struct chmUnitInfo ui; } IStream_Impl; +static inline ITSS_IStorageImpl *impl_from_IStorage(IStorage *iface) +{ + return CONTAINING_RECORD(iface, ITSS_IStorageImpl, IStorage_iface); +} + +static inline IEnumSTATSTG_Impl *impl_from_IEnumSTATSTG(IEnumSTATSTG *iface) +{ + return CONTAINING_RECORD(iface, IEnumSTATSTG_Impl, IEnumSTATSTG_iface); +} + +static inline IStream_Impl *impl_from_IStream(IStream *iface) +{ + return CONTAINING_RECORD(iface, IStream_Impl, IStream_iface); +} + static HRESULT ITSS_create_chm_storage( struct chmFile *chmfile, const WCHAR *dir, IStorage** ppstgOpen ); static IStream_Impl* ITSS_create_stream( @@ -85,7 +100,7 @@ static HRESULT WINAPI ITSS_IEnumSTATSTG_QueryInterface( REFIID riid, void** ppvObject) { - IEnumSTATSTG_Impl *This = (IEnumSTATSTG_Impl *)iface; + IEnumSTATSTG_Impl *This = impl_from_IEnumSTATSTG(iface); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumSTATSTG)) @@ -102,14 +117,14 @@ static HRESULT WINAPI ITSS_IEnumSTATSTG_QueryInterface( static ULONG WINAPI ITSS_IEnumSTATSTG_AddRef( IEnumSTATSTG* iface) { - IEnumSTATSTG_Impl *This = (IEnumSTATSTG_Impl *)iface; + IEnumSTATSTG_Impl *This = impl_from_IEnumSTATSTG(iface); return InterlockedIncrement(&This->ref); } static ULONG WINAPI ITSS_IEnumSTATSTG_Release( IEnumSTATSTG* iface) { - IEnumSTATSTG_Impl *This = (IEnumSTATSTG_Impl *)iface; + IEnumSTATSTG_Impl *This = impl_from_IEnumSTATSTG(iface); ULONG ref = InterlockedDecrement(&This->ref); @@ -134,7 +149,7 @@ static HRESULT WINAPI ITSS_IEnumSTATSTG_Next( STATSTG* rgelt, ULONG* pceltFetched) { - IEnumSTATSTG_Impl *This = (IEnumSTATSTG_Impl *)iface; + IEnumSTATSTG_Impl *This = impl_from_IEnumSTATSTG(iface); DWORD len, n; struct enum_info *cur; @@ -186,7 +201,7 @@ static HRESULT WINAPI ITSS_IEnumSTATSTG_Skip( IEnumSTATSTG* iface, ULONG celt) { - IEnumSTATSTG_Impl *This = (IEnumSTATSTG_Impl *)iface; + IEnumSTATSTG_Impl *This = impl_from_IEnumSTATSTG(iface); DWORD n; struct enum_info *cur; @@ -210,7 +225,7 @@ static HRESULT WINAPI ITSS_IEnumSTATSTG_Skip( static HRESULT WINAPI ITSS_IEnumSTATSTG_Reset( IEnumSTATSTG* iface) { - IEnumSTATSTG_Impl *This = (IEnumSTATSTG_Impl *)iface; + IEnumSTATSTG_Impl *This = impl_from_IEnumSTATSTG(iface); TRACE("%p\n", This ); @@ -243,7 +258,7 @@ static IEnumSTATSTG_Impl *ITSS_create_enum( void ) IEnumSTATSTG_Impl *stgenum; stgenum = HeapAlloc( GetProcessHeap(), 0, sizeof (IEnumSTATSTG_Impl) ); - stgenum->vtbl_IEnumSTATSTG = &IEnumSTATSTG_vtbl; + stgenum->IEnumSTATSTG_iface.lpVtbl = &IEnumSTATSTG_vtbl; stgenum->ref = 1; stgenum->first = NULL; stgenum->last = NULL; @@ -262,7 +277,7 @@ static HRESULT WINAPI ITSS_IStorageImpl_QueryInterface( REFIID riid, void** ppvObject) { - ITSS_IStorageImpl *This = (ITSS_IStorageImpl *)iface; + ITSS_IStorageImpl *This = impl_from_IStorage(iface); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IStorage)) @@ -279,14 +294,14 @@ static HRESULT WINAPI ITSS_IStorageImpl_QueryInterface( static ULONG WINAPI ITSS_IStorageImpl_AddRef( IStorage* iface) { - ITSS_IStorageImpl *This = (ITSS_IStorageImpl *)iface; + ITSS_IStorageImpl *This = impl_from_IStorage(iface); return InterlockedIncrement(&This->ref); } static ULONG WINAPI ITSS_IStorageImpl_Release( IStorage* iface) { - ITSS_IStorageImpl *This = (ITSS_IStorageImpl *)iface; + ITSS_IStorageImpl *This = impl_from_IStorage(iface); ULONG ref = InterlockedDecrement(&This->ref); @@ -320,7 +335,7 @@ static HRESULT WINAPI ITSS_IStorageImpl_OpenStream( DWORD reserved2, IStream** ppstm) { - ITSS_IStorageImpl *This = (ITSS_IStorageImpl *)iface; + ITSS_IStorageImpl *This = impl_from_IStorage(iface); IStream_Impl *stm; DWORD len; struct chmUnitInfo ui; @@ -364,7 +379,7 @@ static HRESULT WINAPI ITSS_IStorageImpl_OpenStream( if( !stm ) return E_FAIL; - *ppstm = (IStream*) stm; + *ppstm = &stm->IStream_iface; return S_OK; } @@ -390,7 +405,7 @@ static HRESULT WINAPI ITSS_IStorageImpl_OpenStorage( DWORD reserved, IStorage** ppstg) { - ITSS_IStorageImpl *This = (ITSS_IStorageImpl *)iface; + ITSS_IStorageImpl *This = impl_from_IStorage(iface); static const WCHAR szRoot[] = { '/', 0 }; struct chmFile *chmfile; WCHAR *path, *p; @@ -498,7 +513,7 @@ static HRESULT WINAPI ITSS_IStorageImpl_EnumElements( DWORD reserved3, IEnumSTATSTG** ppenum) { - ITSS_IStorageImpl *This = (ITSS_IStorageImpl *)iface; + ITSS_IStorageImpl *This = impl_from_IStorage(iface); IEnumSTATSTG_Impl* stgenum; TRACE("%p %d %p %d %p\n", This, reserved1, reserved2, reserved3, ppenum ); @@ -515,7 +530,7 @@ static HRESULT WINAPI ITSS_IStorageImpl_EnumElements( stgenum->current = stgenum->first; - *ppenum = (IEnumSTATSTG*) stgenum; + *ppenum = &stgenum->IEnumSTATSTG_iface; return S_OK; } @@ -607,12 +622,12 @@ static HRESULT ITSS_create_chm_storage( len = strlenW( dir ) + 1; stg = HeapAlloc( GetProcessHeap(), 0, sizeof (ITSS_IStorageImpl) + len*sizeof(WCHAR) ); - stg->vtbl_IStorage = &ITSS_IStorageImpl_Vtbl; + stg->IStorage_iface.lpVtbl = &ITSS_IStorageImpl_Vtbl; stg->ref = 1; stg->chmfile = chmfile; strcpyW( stg->dir, dir ); - *ppstgOpen = (IStorage*) stg; + *ppstgOpen = &stg->IStorage_iface; ITSS_LockModule(); return S_OK; @@ -645,7 +660,7 @@ static HRESULT WINAPI ITSS_IStream_QueryInterface( REFIID riid, void** ppvObject) { - IStream_Impl *This = (IStream_Impl *)iface; + IStream_Impl *This = impl_from_IStream(iface); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ISequentialStream) @@ -663,20 +678,20 @@ static HRESULT WINAPI ITSS_IStream_QueryInterface( static ULONG WINAPI ITSS_IStream_AddRef( IStream* iface) { - IStream_Impl *This = (IStream_Impl *)iface; + IStream_Impl *This = impl_from_IStream(iface); return InterlockedIncrement(&This->ref); } static ULONG WINAPI ITSS_IStream_Release( IStream* iface) { - IStream_Impl *This = (IStream_Impl *)iface; + IStream_Impl *This = impl_from_IStream(iface); ULONG ref = InterlockedDecrement(&This->ref); if (ref == 0) { - IStorage_Release( (IStorage*) This->stg ); + IStorage_Release( &This->stg->IStorage_iface ); HeapFree(GetProcessHeap(), 0, This); ITSS_UnlockModule(); } @@ -690,7 +705,7 @@ static HRESULT WINAPI ITSS_IStream_Read( ULONG cb, ULONG* pcbRead) { - IStream_Impl *This = (IStream_Impl *)iface; + IStream_Impl *This = impl_from_IStream(iface); ULONG count; TRACE("%p %p %u %p\n", This, pv, cb, pcbRead); @@ -720,7 +735,7 @@ static HRESULT WINAPI ITSS_IStream_Seek( DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition) { - IStream_Impl *This = (IStream_Impl *)iface; + IStream_Impl *This = impl_from_IStream(iface); LONGLONG newpos; TRACE("%p %s %u %p\n", This, @@ -809,7 +824,7 @@ static HRESULT WINAPI ITSS_IStream_Stat( STATSTG* pstatstg, DWORD grfStatFlag) { - IStream_Impl *This = (IStream_Impl *)iface; + IStream_Impl *This = impl_from_IStream(iface); TRACE("%p %p %d\n", This, pstatstg, grfStatFlag); @@ -858,12 +873,12 @@ static IStream_Impl *ITSS_create_stream( IStream_Impl *stm; stm = HeapAlloc( GetProcessHeap(), 0, sizeof (IStream_Impl) ); - stm->vtbl_IStream = &ITSS_IStream_vtbl; + stm->IStream_iface.lpVtbl = &ITSS_IStream_vtbl; stm->ref = 1; stm->addr = 0; stm->ui = *ui; stm->stg = stg; - IStorage_AddRef( (IStorage*) stg ); + IStorage_AddRef( &stg->IStorage_iface ); ITSS_LockModule(); diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index dd021e88a42..262965c46ff 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -77,7 +77,7 @@ reactos/dll/win32/initpki # Autosync reactos/dll/win32/inseng # Synced to Wine-1.3.37 reactos/dll/win32/iphlpapi # Out of sync reactos/dll/win32/itircl # Autosync -reactos/dll/win32/itss # Autosync +reactos/dll/win32/itss # Synced to Wine-1.3.37 reactos/dll/win32/jscript # Autosync reactos/dll/win32/localspl # Autosync reactos/dll/win32/localui # Autosync From 617f816f1342dcbab525c194517c2e9a7a58f89d Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 17:05:41 +0000 Subject: [PATCH 123/289] [ITSS_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55249 --- rostests/winetests/itss/protocol.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rostests/winetests/itss/protocol.c b/rostests/winetests/itss/protocol.c index b52e3d32224..b7185025d65 100644 --- a/rostests/winetests/itss/protocol.c +++ b/rostests/winetests/itss/protocol.c @@ -62,7 +62,7 @@ DEFINE_EXPECT(GetBindInfo); DEFINE_EXPECT(ReportProgress_BEGINDOWNLOADDATA); DEFINE_EXPECT(ReportProgress_SENDINGREQUEST); DEFINE_EXPECT(ReportProgress_MIMETYPEAVAILABLE); -DEFINE_EXPECT(ReportProgress_CACHEFILENAMEAVAIABLE); +DEFINE_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); DEFINE_EXPECT(ReportProgress_DIRECTBIND); DEFINE_EXPECT(ReportData); DEFINE_EXPECT(ReportResult); @@ -149,7 +149,7 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, ok(!lstrcmpW(szStatusText, text_html), "unexpected szStatusText\n"); break; case BINDSTATUS_CACHEFILENAMEAVAILABLE: - CHECK_EXPECT(ReportProgress_CACHEFILENAMEAVAIABLE); + CHECK_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); ok(!lstrcmpW(szStatusText, cache_file), "unexpected szStatusText\n"); break; case BINDSTATUS_DIRECTBIND: @@ -294,7 +294,7 @@ static HRESULT _protocol_start(unsigned line, IInternetProtocol *protocol, LPCWS if(expect_mime) SET_EXPECT(ReportProgress_MIMETYPEAVAILABLE); if(test_protocol == MK_PROTOCOL) - SET_EXPECT(ReportProgress_CACHEFILENAMEAVAIABLE); + SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); SET_EXPECT(ReportData); if(test_protocol == ITS_PROTOCOL) SET_EXPECT(ReportProgress_BEGINDOWNLOADDATA); @@ -311,7 +311,7 @@ static HRESULT _protocol_start(unsigned line, IInternetProtocol *protocol, LPCWS if(expect_mime) SET_CALLED(ReportProgress_MIMETYPEAVAILABLE); if(test_protocol == MK_PROTOCOL) - SET_EXPECT(ReportProgress_CACHEFILENAMEAVAIABLE); + SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); SET_CALLED(ReportData); if(test_protocol == ITS_PROTOCOL) SET_CALLED(ReportProgress_BEGINDOWNLOADDATA); @@ -324,7 +324,7 @@ static HRESULT _protocol_start(unsigned line, IInternetProtocol *protocol, LPCWS if(expect_mime) CHECK_CALLED(ReportProgress_MIMETYPEAVAILABLE); if(test_protocol == MK_PROTOCOL) - SET_EXPECT(ReportProgress_CACHEFILENAMEAVAIABLE); + SET_EXPECT(ReportProgress_CACHEFILENAMEAVAILABLE); CHECK_CALLED(ReportData); if(test_protocol == ITS_PROTOCOL) CHECK_CALLED(ReportProgress_BEGINDOWNLOADDATA); From 839270d4f0678237c2e39b24b5fa4fd576735eaf Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 17:31:52 +0000 Subject: [PATCH 124/289] [MSCTF] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55250 --- reactos/dll/win32/msctf/CMakeLists.txt | 1 - reactos/dll/win32/msctf/categorymgr.c | 45 +++++----- reactos/dll/win32/msctf/compartmentmgr.c | 2 +- reactos/dll/win32/msctf/context.c | 2 +- reactos/dll/win32/msctf/displayattributemgr.c | 21 +++-- reactos/dll/win32/msctf/documentmgr.c | 86 +++++++++++-------- reactos/dll/win32/msctf/inputprocessor.c | 4 +- reactos/dll/win32/msctf/langbarmgr.c | 33 ++++--- reactos/dll/win32/msctf/msctf.c | 34 ++++++-- reactos/dll/win32/msctf/msctf.rbuild | 1 - reactos/dll/win32/msctf/msctf.rgs | 29 +++++++ reactos/dll/win32/msctf/msctf_classes.idl | 49 +++++++++++ reactos/dll/win32/msctf/msctf_internal.h | 58 ++++++------- reactos/dll/win32/msctf/range.c | 61 +++++++------ reactos/dll/win32/msctf/threadmgr.c | 4 +- reactos/dll/win32/msctf/version.rc | 2 + reactos/media/doc/README.WINE | 2 +- 17 files changed, 282 insertions(+), 152 deletions(-) create mode 100644 reactos/dll/win32/msctf/msctf.rgs create mode 100644 reactos/dll/win32/msctf/msctf_classes.idl diff --git a/reactos/dll/win32/msctf/CMakeLists.txt b/reactos/dll/win32/msctf/CMakeLists.txt index b4ec9dfdc3b..81fdeaa01ea 100644 --- a/reactos/dll/win32/msctf/CMakeLists.txt +++ b/reactos/dll/win32/msctf/CMakeLists.txt @@ -20,7 +20,6 @@ list(APPEND SOURCE langbarmgr.c msctf.c range.c - regsvr.c threadmgr.c version.rc ${CMAKE_CURRENT_BINARY_DIR}/msctf_stubs.c diff --git a/reactos/dll/win32/msctf/categorymgr.c b/reactos/dll/win32/msctf/categorymgr.c index b76bebbbd1e..a4874044884 100644 --- a/reactos/dll/win32/msctf/categorymgr.c +++ b/reactos/dll/win32/msctf/categorymgr.c @@ -41,10 +41,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(msctf); typedef struct tagCategoryMgr { - const ITfCategoryMgrVtbl *CategoryMgrVtbl; + ITfCategoryMgr ITfCategoryMgr_iface; LONG refCount; } CategoryMgr; +static inline CategoryMgr *impl_from_ITfCategoryMgr(ITfCategoryMgr *iface) +{ + return CONTAINING_RECORD(iface, CategoryMgr, ITfCategoryMgr_iface); +} + static void CategoryMgr_Destructor(CategoryMgr *This) { TRACE("destroying %p\n", This); @@ -53,7 +58,7 @@ static void CategoryMgr_Destructor(CategoryMgr *This) static HRESULT WINAPI CategoryMgr_QueryInterface(ITfCategoryMgr *iface, REFIID iid, LPVOID *ppvOut) { - CategoryMgr *This = (CategoryMgr *)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfCategoryMgr)) @@ -73,13 +78,13 @@ static HRESULT WINAPI CategoryMgr_QueryInterface(ITfCategoryMgr *iface, REFIID i static ULONG WINAPI CategoryMgr_AddRef(ITfCategoryMgr *iface) { - CategoryMgr *This = (CategoryMgr *)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI CategoryMgr_Release(ITfCategoryMgr *iface) { - CategoryMgr *This = (CategoryMgr *)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -100,7 +105,7 @@ static HRESULT WINAPI CategoryMgr_RegisterCategory ( ITfCategoryMgr *iface, WCHAR buf2[39]; ULONG res; HKEY tipkey,catkey,itmkey; - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); static const WCHAR ctg[] = {'C','a','t','e','g','o','r','y',0}; static const WCHAR itm[] = {'I','t','e','m',0}; @@ -148,7 +153,7 @@ static HRESULT WINAPI CategoryMgr_UnregisterCategory ( ITfCategoryMgr *iface, WCHAR buf[39]; WCHAR buf2[39]; HKEY tipkey; - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); static const WCHAR ctg[] = {'C','a','t','e','g','o','r','y',0}; static const WCHAR itm[] = {'I','t','e','m',0}; @@ -180,7 +185,7 @@ static HRESULT WINAPI CategoryMgr_UnregisterCategory ( ITfCategoryMgr *iface, static HRESULT WINAPI CategoryMgr_EnumCategoriesInItem ( ITfCategoryMgr *iface, REFGUID rguid, IEnumGUID **ppEnum) { - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -188,7 +193,7 @@ static HRESULT WINAPI CategoryMgr_EnumCategoriesInItem ( ITfCategoryMgr *iface, static HRESULT WINAPI CategoryMgr_EnumItemsInCategory ( ITfCategoryMgr *iface, REFGUID rcatid, IEnumGUID **ppEnum) { - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -198,12 +203,12 @@ static HRESULT WINAPI CategoryMgr_FindClosestCategory ( ITfCategoryMgr *iface, { static const WCHAR fmt[] = { '%','s','\\','%','s','\\','C','a','t','e','g','o','r','y','\\','I','t','e','m','\\','%','s',0}; - WCHAR fullkey[110]; + WCHAR fullkey[120]; WCHAR buf[39]; HKEY key; HRESULT hr = S_FALSE; INT index = 0; - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); TRACE("(%p)\n",This); @@ -263,7 +268,7 @@ static HRESULT WINAPI CategoryMgr_RegisterGUIDDescription ( ITfCategoryMgr *iface, REFCLSID rclsid, REFGUID rguid, const WCHAR *pchDesc, ULONG cch) { - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -271,7 +276,7 @@ static HRESULT WINAPI CategoryMgr_RegisterGUIDDescription ( static HRESULT WINAPI CategoryMgr_UnregisterGUIDDescription ( ITfCategoryMgr *iface, REFCLSID rclsid, REFGUID rguid) { - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -279,7 +284,7 @@ static HRESULT WINAPI CategoryMgr_UnregisterGUIDDescription ( static HRESULT WINAPI CategoryMgr_GetGUIDDescription ( ITfCategoryMgr *iface, REFGUID rguid, BSTR *pbstrDesc) { - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -287,7 +292,7 @@ static HRESULT WINAPI CategoryMgr_GetGUIDDescription ( ITfCategoryMgr *iface, static HRESULT WINAPI CategoryMgr_RegisterGUIDDWORD ( ITfCategoryMgr *iface, REFCLSID rclsid, REFGUID rguid, DWORD dw) { - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -295,7 +300,7 @@ static HRESULT WINAPI CategoryMgr_RegisterGUIDDWORD ( ITfCategoryMgr *iface, static HRESULT WINAPI CategoryMgr_UnregisterGUIDDWORD ( ITfCategoryMgr *iface, REFCLSID rclsid, REFGUID rguid) { - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -303,7 +308,7 @@ static HRESULT WINAPI CategoryMgr_UnregisterGUIDDWORD ( ITfCategoryMgr *iface, static HRESULT WINAPI CategoryMgr_GetGUIDDWORD ( ITfCategoryMgr *iface, REFGUID rguid, DWORD *pdw) { - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -315,7 +320,7 @@ static HRESULT WINAPI CategoryMgr_RegisterGUID ( ITfCategoryMgr *iface, DWORD index; GUID *checkguid; DWORD id; - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); TRACE("(%p) %s %p\n",This,debugstr_guid(rguid),pguidatom); @@ -350,7 +355,7 @@ static HRESULT WINAPI CategoryMgr_RegisterGUID ( ITfCategoryMgr *iface, static HRESULT WINAPI CategoryMgr_GetGUID ( ITfCategoryMgr *iface, TfGuidAtom guidatom, GUID *pguid) { - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); TRACE("(%p) %i\n",This,guidatom); @@ -368,7 +373,7 @@ static HRESULT WINAPI CategoryMgr_GetGUID ( ITfCategoryMgr *iface, static HRESULT WINAPI CategoryMgr_IsEqualTfGuidAtom ( ITfCategoryMgr *iface, TfGuidAtom guidatom, REFGUID rguid, BOOL *pfEqual) { - CategoryMgr *This = (CategoryMgr*)iface; + CategoryMgr *This = impl_from_ITfCategoryMgr(iface); TRACE("(%p) %i %s %p\n",This,guidatom,debugstr_guid(rguid),pfEqual); @@ -418,7 +423,7 @@ HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) if (This == NULL) return E_OUTOFMEMORY; - This->CategoryMgrVtbl= &CategoryMgr_CategoryMgrVtbl; + This->ITfCategoryMgr_iface.lpVtbl = &CategoryMgr_CategoryMgrVtbl; This->refCount = 1; TRACE("returning %p\n", This); diff --git a/reactos/dll/win32/msctf/compartmentmgr.c b/reactos/dll/win32/msctf/compartmentmgr.c index 4f6408d1e4b..bb55d69774a 100644 --- a/reactos/dll/win32/msctf/compartmentmgr.c +++ b/reactos/dll/win32/msctf/compartmentmgr.c @@ -284,7 +284,7 @@ HRESULT CompartmentMgr_Constructor(IUnknown *pUnkOuter, REFIID riid, IUnknown ** } /************************************************** - * IEnumGUID implementaion for ITfCompartmentMgr::EnumCompartments + * IEnumGUID implementation for ITfCompartmentMgr::EnumCompartments **************************************************/ static void CompartmentEnumGuid_Destructor(CompartmentEnumGuid *This) { diff --git a/reactos/dll/win32/msctf/context.c b/reactos/dll/win32/msctf/context.c index 79a9536fe12..c013cf96e20 100644 --- a/reactos/dll/win32/msctf/context.c +++ b/reactos/dll/win32/msctf/context.c @@ -262,7 +262,7 @@ static HRESULT WINAPI Context_RequestEditSession (ITfContext *iface, if (!This->pITextStoreACP) { - FIXME("No ITextStoreACP avaliable\n"); + FIXME("No ITextStoreACP available\n"); *phrSession = E_FAIL; return E_FAIL; } diff --git a/reactos/dll/win32/msctf/displayattributemgr.c b/reactos/dll/win32/msctf/displayattributemgr.c index 75248cd4393..44c61abf371 100644 --- a/reactos/dll/win32/msctf/displayattributemgr.c +++ b/reactos/dll/win32/msctf/displayattributemgr.c @@ -31,12 +31,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(msctf); typedef struct tagDisplayAttributeMgr { - const ITfDisplayAttributeMgrVtbl *DisplayAttributeMgrVtbl; + ITfDisplayAttributeMgr ITfDisplayAttributeMgr_iface; LONG refCount; } DisplayAttributeMgr; +static inline DisplayAttributeMgr *impl_from_ITfDisplayAttributeMgr(ITfDisplayAttributeMgr *iface) +{ + return CONTAINING_RECORD(iface, DisplayAttributeMgr, ITfDisplayAttributeMgr_iface); +} + static void DisplayAttributeMgr_Destructor(DisplayAttributeMgr *This) { TRACE("destroying %p\n", This); @@ -46,7 +51,7 @@ static void DisplayAttributeMgr_Destructor(DisplayAttributeMgr *This) static HRESULT WINAPI DisplayAttributeMgr_QueryInterface(ITfDisplayAttributeMgr *iface, REFIID iid, LPVOID *ppvOut) { - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfDisplayAttributeMgr)) @@ -66,13 +71,13 @@ static HRESULT WINAPI DisplayAttributeMgr_QueryInterface(ITfDisplayAttributeMgr static ULONG WINAPI DisplayAttributeMgr_AddRef(ITfDisplayAttributeMgr *iface) { - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI DisplayAttributeMgr_Release(ITfDisplayAttributeMgr *iface) { - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -87,7 +92,7 @@ static ULONG WINAPI DisplayAttributeMgr_Release(ITfDisplayAttributeMgr *iface) static HRESULT WINAPI DisplayAttributeMgr_OnUpdateInfo(ITfDisplayAttributeMgr *iface) { - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -95,7 +100,7 @@ static HRESULT WINAPI DisplayAttributeMgr_OnUpdateInfo(ITfDisplayAttributeMgr *i static HRESULT WINAPI DisplayAttributeMgr_EnumDisplayAttributeInfo(ITfDisplayAttributeMgr *iface, IEnumTfDisplayAttributeInfo **ppEnum) { - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -103,7 +108,7 @@ static HRESULT WINAPI DisplayAttributeMgr_EnumDisplayAttributeInfo(ITfDisplayAtt static HRESULT WINAPI DisplayAttributeMgr_GetDisplayAttributeInfo(ITfDisplayAttributeMgr *iface, REFGUID guid, ITfDisplayAttributeInfo **ppInfo, CLSID *pclsidOwner) { - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; + DisplayAttributeMgr *This = impl_from_ITfDisplayAttributeMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -130,7 +135,7 @@ HRESULT DisplayAttributeMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) if (This == NULL) return E_OUTOFMEMORY; - This->DisplayAttributeMgrVtbl= &DisplayAttributeMgr_DisplayAttributeMgrVtbl; + This->ITfDisplayAttributeMgr_iface.lpVtbl = &DisplayAttributeMgr_DisplayAttributeMgrVtbl; This->refCount = 1; TRACE("returning %p\n", This); diff --git a/reactos/dll/win32/msctf/documentmgr.c b/reactos/dll/win32/msctf/documentmgr.c index fec3de3786e..a1c9c935849 100644 --- a/reactos/dll/win32/msctf/documentmgr.c +++ b/reactos/dll/win32/msctf/documentmgr.c @@ -41,8 +41,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msctf); typedef struct tagDocumentMgr { - const ITfDocumentMgrVtbl *DocumentMgrVtbl; - const ITfSourceVtbl *SourceVtbl; + ITfDocumentMgr ITfDocumentMgr_iface; + ITfSource ITfSource_iface; LONG refCount; /* Aggregation */ @@ -53,7 +53,7 @@ typedef struct tagDocumentMgr { } DocumentMgr; typedef struct tagEnumTfContext { - const IEnumTfContextsVtbl *Vtbl; + IEnumTfContexts IEnumTfContexts_iface; LONG refCount; DWORD index; @@ -62,9 +62,19 @@ typedef struct tagEnumTfContext { static HRESULT EnumTfContext_Constructor(DocumentMgr* mgr, IEnumTfContexts **ppOut); -static inline DocumentMgr *impl_from_ITfSourceVtbl(ITfSource *iface) +static inline DocumentMgr *impl_from_ITfDocumentMgr(ITfDocumentMgr *iface) { - return (DocumentMgr *)((char *)iface - FIELD_OFFSET(DocumentMgr,SourceVtbl)); + return CONTAINING_RECORD(iface, DocumentMgr, ITfDocumentMgr_iface); +} + +static inline DocumentMgr *impl_from_ITfSource(ITfSource *iface) +{ + return CONTAINING_RECORD(iface, DocumentMgr, ITfSource_iface); +} + +static inline EnumTfContext *impl_from_IEnumTfContexts(IEnumTfContexts *iface)\ +{ + return CONTAINING_RECORD(iface, EnumTfContext, IEnumTfContexts_iface); } static void DocumentMgr_Destructor(DocumentMgr *This) @@ -73,7 +83,7 @@ static void DocumentMgr_Destructor(DocumentMgr *This) TRACE("destroying %p\n", This); TF_GetThreadMgr(&tm); - ThreadMgr_OnDocumentMgrDestruction(tm, (ITfDocumentMgr*)This); + ThreadMgr_OnDocumentMgrDestruction(tm, &This->ITfDocumentMgr_iface); if (This->contextStack[0]) ITfContext_Release(This->contextStack[0]); @@ -85,7 +95,7 @@ static void DocumentMgr_Destructor(DocumentMgr *This) static HRESULT WINAPI DocumentMgr_QueryInterface(ITfDocumentMgr *iface, REFIID iid, LPVOID *ppvOut) { - DocumentMgr *This = (DocumentMgr *)iface; + DocumentMgr *This = impl_from_ITfDocumentMgr(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfDocumentMgr)) @@ -94,7 +104,7 @@ static HRESULT WINAPI DocumentMgr_QueryInterface(ITfDocumentMgr *iface, REFIID i } else if (IsEqualIID(iid, &IID_ITfSource)) { - *ppvOut = &This->SourceVtbl; + *ppvOut = &This->ITfSource_iface; } else if (IsEqualIID(iid, &IID_ITfCompartmentMgr)) { @@ -113,13 +123,13 @@ static HRESULT WINAPI DocumentMgr_QueryInterface(ITfDocumentMgr *iface, REFIID i static ULONG WINAPI DocumentMgr_AddRef(ITfDocumentMgr *iface) { - DocumentMgr *This = (DocumentMgr *)iface; + DocumentMgr *This = impl_from_ITfDocumentMgr(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI DocumentMgr_Release(ITfDocumentMgr *iface) { - DocumentMgr *This = (DocumentMgr *)iface; + DocumentMgr *This = impl_from_ITfDocumentMgr(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -136,14 +146,14 @@ static HRESULT WINAPI DocumentMgr_CreateContext(ITfDocumentMgr *iface, DWORD dwFlags, IUnknown *punk, ITfContext **ppic, TfEditCookie *pecTextStore) { - DocumentMgr *This = (DocumentMgr *)iface; + DocumentMgr *This = impl_from_ITfDocumentMgr(iface); TRACE("(%p) 0x%x 0x%x %p %p %p\n",This,tidOwner,dwFlags,punk,ppic,pecTextStore); return Context_Constructor(tidOwner, punk, iface, ppic, pecTextStore); } static HRESULT WINAPI DocumentMgr_Push(ITfDocumentMgr *iface, ITfContext *pic) { - DocumentMgr *This = (DocumentMgr *)iface; + DocumentMgr *This = impl_from_ITfDocumentMgr(iface); ITfContext *check; TRACE("(%p) %p\n",This,pic); @@ -168,7 +178,7 @@ static HRESULT WINAPI DocumentMgr_Push(ITfDocumentMgr *iface, ITfContext *pic) static HRESULT WINAPI DocumentMgr_Pop(ITfDocumentMgr *iface, DWORD dwFlags) { - DocumentMgr *This = (DocumentMgr *)iface; + DocumentMgr *This = impl_from_ITfDocumentMgr(iface); TRACE("(%p) 0x%x\n",This,dwFlags); if (dwFlags == TF_POPF_ALL) @@ -210,7 +220,7 @@ static HRESULT WINAPI DocumentMgr_Pop(ITfDocumentMgr *iface, DWORD dwFlags) static HRESULT WINAPI DocumentMgr_GetTop(ITfDocumentMgr *iface, ITfContext **ppic) { - DocumentMgr *This = (DocumentMgr *)iface; + DocumentMgr *This = impl_from_ITfDocumentMgr(iface); TRACE("(%p)\n",This); if (!ppic) return E_INVALIDARG; @@ -225,7 +235,7 @@ static HRESULT WINAPI DocumentMgr_GetTop(ITfDocumentMgr *iface, ITfContext **ppi static HRESULT WINAPI DocumentMgr_GetBase(ITfDocumentMgr *iface, ITfContext **ppic) { - DocumentMgr *This = (DocumentMgr *)iface; + DocumentMgr *This = impl_from_ITfDocumentMgr(iface); ITfContext *tgt; TRACE("(%p)\n",This); @@ -247,7 +257,7 @@ static HRESULT WINAPI DocumentMgr_GetBase(ITfDocumentMgr *iface, ITfContext **pp static HRESULT WINAPI DocumentMgr_EnumContexts(ITfDocumentMgr *iface, IEnumTfContexts **ppEnum) { - DocumentMgr *This = (DocumentMgr *)iface; + DocumentMgr *This = impl_from_ITfDocumentMgr(iface); TRACE("(%p) %p\n",This,ppEnum); return EnumTfContext_Constructor(This, ppEnum); } @@ -269,20 +279,20 @@ static const ITfDocumentMgrVtbl DocumentMgr_DocumentMgrVtbl = static HRESULT WINAPI Source_QueryInterface(ITfSource *iface, REFIID iid, LPVOID *ppvOut) { - DocumentMgr *This = impl_from_ITfSourceVtbl(iface); - return DocumentMgr_QueryInterface((ITfDocumentMgr*)This, iid, *ppvOut); + DocumentMgr *This = impl_from_ITfSource(iface); + return DocumentMgr_QueryInterface(&This->ITfDocumentMgr_iface, iid, *ppvOut); } static ULONG WINAPI Source_AddRef(ITfSource *iface) { - DocumentMgr *This = impl_from_ITfSourceVtbl(iface); - return DocumentMgr_AddRef((ITfDocumentMgr*)This); + DocumentMgr *This = impl_from_ITfSource(iface); + return DocumentMgr_AddRef(&This->ITfDocumentMgr_iface); } static ULONG WINAPI Source_Release(ITfSource *iface) { - DocumentMgr *This = impl_from_ITfSourceVtbl(iface); - return DocumentMgr_Release((ITfDocumentMgr*)This); + DocumentMgr *This = impl_from_ITfSource(iface); + return DocumentMgr_Release(&This->ITfDocumentMgr_iface); } /***************************************************** @@ -291,14 +301,14 @@ static ULONG WINAPI Source_Release(ITfSource *iface) static HRESULT WINAPI DocumentMgrSource_AdviseSink(ITfSource *iface, REFIID riid, IUnknown *punk, DWORD *pdwCookie) { - DocumentMgr *This = impl_from_ITfSourceVtbl(iface); + DocumentMgr *This = impl_from_ITfSource(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } static HRESULT WINAPI DocumentMgrSource_UnadviseSink(ITfSource *iface, DWORD pdwCookie) { - DocumentMgr *This = impl_from_ITfSourceVtbl(iface); + DocumentMgr *This = impl_from_ITfSource(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -321,20 +331,20 @@ HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink *ThreadMgrSink, ITfDocumen if (This == NULL) return E_OUTOFMEMORY; - This->DocumentMgrVtbl= &DocumentMgr_DocumentMgrVtbl; - This->SourceVtbl = &DocumentMgr_SourceVtbl; + This->ITfDocumentMgr_iface.lpVtbl = &DocumentMgr_DocumentMgrVtbl; + This->ITfSource_iface.lpVtbl = &DocumentMgr_SourceVtbl; This->refCount = 1; This->ThreadMgrSink = ThreadMgrSink; CompartmentMgr_Constructor((IUnknown*)This, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr); TRACE("returning %p\n", This); - *ppOut = (ITfDocumentMgr*)This; + *ppOut = &This->ITfDocumentMgr_iface; return S_OK; } /************************************************** - * IEnumTfContexts implementaion + * IEnumTfContexts implementation **************************************************/ static void EnumTfContext_Destructor(EnumTfContext *This) { @@ -344,7 +354,7 @@ static void EnumTfContext_Destructor(EnumTfContext *This) static HRESULT WINAPI EnumTfContext_QueryInterface(IEnumTfContexts *iface, REFIID iid, LPVOID *ppvOut) { - EnumTfContext *This = (EnumTfContext *)iface; + EnumTfContext *This = impl_from_IEnumTfContexts(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IEnumTfContexts)) @@ -364,13 +374,13 @@ static HRESULT WINAPI EnumTfContext_QueryInterface(IEnumTfContexts *iface, REFII static ULONG WINAPI EnumTfContext_AddRef(IEnumTfContexts *iface) { - EnumTfContext *This = (EnumTfContext*)iface; + EnumTfContext *This = impl_from_IEnumTfContexts(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI EnumTfContext_Release(IEnumTfContexts *iface) { - EnumTfContext *This = (EnumTfContext *)iface; + EnumTfContext *This = impl_from_IEnumTfContexts(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -382,7 +392,7 @@ static ULONG WINAPI EnumTfContext_Release(IEnumTfContexts *iface) static HRESULT WINAPI EnumTfContext_Next(IEnumTfContexts *iface, ULONG ulCount, ITfContext **rgContext, ULONG *pcFetched) { - EnumTfContext *This = (EnumTfContext *)iface; + EnumTfContext *This = impl_from_IEnumTfContexts(iface); ULONG fetched = 0; TRACE("(%p)\n",This); @@ -411,7 +421,7 @@ static HRESULT WINAPI EnumTfContext_Next(IEnumTfContexts *iface, static HRESULT WINAPI EnumTfContext_Skip( IEnumTfContexts* iface, ULONG celt) { - EnumTfContext *This = (EnumTfContext *)iface; + EnumTfContext *This = impl_from_IEnumTfContexts(iface); TRACE("(%p)\n",This); This->index += celt; return S_OK; @@ -419,7 +429,7 @@ static HRESULT WINAPI EnumTfContext_Skip( IEnumTfContexts* iface, ULONG celt) static HRESULT WINAPI EnumTfContext_Reset( IEnumTfContexts* iface) { - EnumTfContext *This = (EnumTfContext *)iface; + EnumTfContext *This = impl_from_IEnumTfContexts(iface); TRACE("(%p)\n",This); This->index = 0; return S_OK; @@ -428,7 +438,7 @@ static HRESULT WINAPI EnumTfContext_Reset( IEnumTfContexts* iface) static HRESULT WINAPI EnumTfContext_Clone( IEnumTfContexts *iface, IEnumTfContexts **ppenum) { - EnumTfContext *This = (EnumTfContext *)iface; + EnumTfContext *This = impl_from_IEnumTfContexts(iface); HRESULT res; TRACE("(%p)\n",This); @@ -438,7 +448,7 @@ static HRESULT WINAPI EnumTfContext_Clone( IEnumTfContexts *iface, res = EnumTfContext_Constructor(This->docmgr, ppenum); if (SUCCEEDED(res)) { - EnumTfContext *new_This = (EnumTfContext *)*ppenum; + EnumTfContext *new_This = impl_from_IEnumTfContexts(*ppenum); new_This->index = This->index; } return res; @@ -463,11 +473,11 @@ static HRESULT EnumTfContext_Constructor(DocumentMgr *mgr, IEnumTfContexts **ppO if (This == NULL) return E_OUTOFMEMORY; - This->Vtbl= &IEnumTfContexts_Vtbl; + This->IEnumTfContexts_iface.lpVtbl = &IEnumTfContexts_Vtbl; This->refCount = 1; This->docmgr = mgr; TRACE("returning %p\n", This); - *ppOut = (IEnumTfContexts*)This; + *ppOut = &This->IEnumTfContexts_iface; return S_OK; } diff --git a/reactos/dll/win32/msctf/inputprocessor.c b/reactos/dll/win32/msctf/inputprocessor.c index d1b6bc60de8..5242f142fb0 100644 --- a/reactos/dll/win32/msctf/inputprocessor.c +++ b/reactos/dll/win32/msctf/inputprocessor.c @@ -782,7 +782,7 @@ HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut } /************************************************** - * IEnumGUID implementaion for ITfInputProcessorProfiles::EnumInputProcessorInfo + * IEnumGUID implementation for ITfInputProcessorProfiles::EnumInputProcessorInfo **************************************************/ static void ProfilesEnumGuid_Destructor(ProfilesEnumGuid *This) { @@ -935,7 +935,7 @@ static HRESULT ProfilesEnumGuid_Constructor(IEnumGUID **ppOut) } /************************************************** - * IEnumTfLanguageProfiles implementaion + * IEnumTfLanguageProfiles implementation **************************************************/ static void EnumTfLanguageProfiles_Destructor(EnumTfLanguageProfiles *This) { diff --git a/reactos/dll/win32/msctf/langbarmgr.c b/reactos/dll/win32/msctf/langbarmgr.c index 272a8168727..5e814a73bec 100644 --- a/reactos/dll/win32/msctf/langbarmgr.c +++ b/reactos/dll/win32/msctf/langbarmgr.c @@ -31,12 +31,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(msctf); typedef struct tagLangBarMgr { - const ITfLangBarMgrVtbl *LangBarMgrVtbl; + ITfLangBarMgr ITfLangBarMgr_iface; LONG refCount; } LangBarMgr; +static inline LangBarMgr *impl_from_ITfLangBarMgr(ITfLangBarMgr *iface) +{ + return CONTAINING_RECORD(iface, LangBarMgr, ITfLangBarMgr_iface); +} + static void LangBarMgr_Destructor(LangBarMgr *This) { TRACE("destroying %p\n", This); @@ -46,7 +51,7 @@ static void LangBarMgr_Destructor(LangBarMgr *This) static HRESULT WINAPI LangBarMgr_QueryInterface(ITfLangBarMgr *iface, REFIID iid, LPVOID *ppvOut) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfLangBarMgr)) @@ -66,13 +71,13 @@ static HRESULT WINAPI LangBarMgr_QueryInterface(ITfLangBarMgr *iface, REFIID iid static ULONG WINAPI LangBarMgr_AddRef(ITfLangBarMgr *iface) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI LangBarMgr_Release(ITfLangBarMgr *iface) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -87,7 +92,7 @@ static ULONG WINAPI LangBarMgr_Release(ITfLangBarMgr *iface) static HRESULT WINAPI LangBarMgr_AdviseEventSink( ITfLangBarMgr* iface, ITfLangBarEventSink *pSink, HWND hwnd, DWORD dwflags, DWORD *pdwCookie) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -95,7 +100,7 @@ static HRESULT WINAPI LangBarMgr_AdviseEventSink( ITfLangBarMgr* iface, ITfLangB static HRESULT WINAPI LangBarMgr_UnAdviseEventSink( ITfLangBarMgr* iface, DWORD dwCookie) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -103,7 +108,7 @@ static HRESULT WINAPI LangBarMgr_UnAdviseEventSink( ITfLangBarMgr* iface, DWORD static HRESULT WINAPI LangBarMgr_GetThreadMarshalInterface( ITfLangBarMgr* iface, DWORD dwThreadId, DWORD dwType, REFIID riid, IUnknown **ppunk) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -111,7 +116,7 @@ static HRESULT WINAPI LangBarMgr_GetThreadMarshalInterface( ITfLangBarMgr* iface static HRESULT WINAPI LangBarMgr_GetThreadLangBarItemMgr( ITfLangBarMgr* iface, DWORD dwThreadId, ITfLangBarItemMgr **pplbi, DWORD *pdwThreadid) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -119,7 +124,7 @@ static HRESULT WINAPI LangBarMgr_GetThreadLangBarItemMgr( ITfLangBarMgr* iface, static HRESULT WINAPI LangBarMgr_GetInputProcessorProfiles( ITfLangBarMgr* iface, DWORD dwThreadId, ITfInputProcessorProfiles **ppaip, DWORD *pdwThreadid) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -127,7 +132,7 @@ static HRESULT WINAPI LangBarMgr_GetInputProcessorProfiles( ITfLangBarMgr* iface static HRESULT WINAPI LangBarMgr_RestoreLastFocus( ITfLangBarMgr* iface, DWORD *dwThreadId, BOOL fPrev) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -135,7 +140,7 @@ static HRESULT WINAPI LangBarMgr_RestoreLastFocus( ITfLangBarMgr* iface, DWORD * static HRESULT WINAPI LangBarMgr_SetModalInput( ITfLangBarMgr* iface, ITfLangBarEventSink *pSink, DWORD dwThreadId, DWORD dwFlags) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -143,7 +148,7 @@ static HRESULT WINAPI LangBarMgr_SetModalInput( ITfLangBarMgr* iface, ITfLangBar static HRESULT WINAPI LangBarMgr_ShowFloating( ITfLangBarMgr* iface, DWORD dwFlags) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -151,7 +156,7 @@ static HRESULT WINAPI LangBarMgr_ShowFloating( ITfLangBarMgr* iface, DWORD dwFla static HRESULT WINAPI LangBarMgr_GetShowFloatingStatus( ITfLangBarMgr* iface, DWORD *pdwFlags) { - LangBarMgr *This = (LangBarMgr *)iface; + LangBarMgr *This = impl_from_ITfLangBarMgr(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; @@ -184,7 +189,7 @@ HRESULT LangBarMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) if (This == NULL) return E_OUTOFMEMORY; - This->LangBarMgrVtbl= &LangBarMgr_LangBarMgrVtbl; + This->ITfLangBarMgr_iface.lpVtbl = &LangBarMgr_LangBarMgrVtbl; This->refCount = 1; TRACE("returning %p\n", This); diff --git a/reactos/dll/win32/msctf/msctf.c b/reactos/dll/win32/msctf/msctf.c index 759fe7ec579..bc12a296359 100644 --- a/reactos/dll/win32/msctf/msctf.c +++ b/reactos/dll/win32/msctf/msctf.c @@ -33,6 +33,7 @@ #include "shlwapi.h" #include "shlguid.h" #include "comcat.h" +#include "rpcproxy.h" #include "msctf.h" #include "msctf_internal.h" @@ -94,11 +95,16 @@ static const struct { typedef struct tagClassFactory { - const IClassFactoryVtbl *vtbl; + IClassFactory IClassFactory_iface; LONG ref; LPFNCONSTRUCTOR ctor; } ClassFactory; +static inline ClassFactory *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, ClassFactory, IClassFactory_iface); +} + static void ClassFactory_Destructor(ClassFactory *This) { TRACE("Destroying class factory %p\n", This); @@ -121,13 +127,13 @@ static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID r static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) { - ClassFactory *This = (ClassFactory *)iface; + ClassFactory *This = impl_from_IClassFactory(iface); return InterlockedIncrement(&This->ref); } static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) { - ClassFactory *This = (ClassFactory *)iface; + ClassFactory *This = impl_from_IClassFactory(iface); ULONG ret = InterlockedDecrement(&This->ref); if (ret == 0) @@ -137,7 +143,7 @@ static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *punkOuter, REFIID iid, LPVOID *ppvOut) { - ClassFactory *This = (ClassFactory *)iface; + ClassFactory *This = impl_from_IClassFactory(iface); HRESULT ret; IUnknown *obj; @@ -152,7 +158,7 @@ static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) { - ClassFactory *This = (ClassFactory *)iface; + ClassFactory *This = impl_from_IClassFactory(iface); TRACE("(%p)->(%x)\n", This, fLock); @@ -178,7 +184,7 @@ static const IClassFactoryVtbl ClassFactoryVtbl = { static HRESULT ClassFactory_Constructor(LPFNCONSTRUCTOR ctor, LPVOID *ppvOut) { ClassFactory *This = HeapAlloc(GetProcessHeap(),0,sizeof(ClassFactory)); - This->vtbl = &ClassFactoryVtbl; + This->IClassFactory_iface.lpVtbl = &ClassFactoryVtbl; This->ref = 1; This->ctor = ctor; *ppvOut = This; @@ -553,6 +559,22 @@ HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *ppvOut) return CLASS_E_CLASSNOTAVAILABLE; } +/*********************************************************************** + * DllRegisterServer (MSCTF.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( MSCTF_hinstance ); +} + +/*********************************************************************** + * DllUnregisterServer (MSCTF.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( MSCTF_hinstance ); +} + /*********************************************************************** * TF_CreateThreadMgr (MSCTF.@) */ diff --git a/reactos/dll/win32/msctf/msctf.rbuild b/reactos/dll/win32/msctf/msctf.rbuild index cb072f676e7..6a678f0e329 100644 --- a/reactos/dll/win32/msctf/msctf.rbuild +++ b/reactos/dll/win32/msctf/msctf.rbuild @@ -17,7 +17,6 @@ langbarmgr.c msctf.c range.c - regsvr.c threadmgr.c version.rc wine diff --git a/reactos/dll/win32/msctf/msctf.rgs b/reactos/dll/win32/msctf/msctf.rgs new file mode 100644 index 00000000000..f90ed72aa30 --- /dev/null +++ b/reactos/dll/win32/msctf/msctf.rgs @@ -0,0 +1,29 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{529A9E6B-6587-4F23-AB9E-9C7D683E3C50}' = s 'TF_ThreadMgr' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + '{33C53A50-F456-4884-B049-85FD643ECFED}' = s 'TF_InputProcessorProfiles' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + '{A4B544A1-438D-4B41-9325-869523E2D6C7}' = s 'TF_CategoryMgr' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + '{EBB08C45-6C4A-4FDC-AE53-4EB8C4C7DB8E}' = s 'TF_LangBarMgr' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + '{3CE74DE4-53D3-4D74-8B83-431B3828BA53}' = s 'TF_DisplayAttributeMgr' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + } +} diff --git a/reactos/dll/win32/msctf/msctf_classes.idl b/reactos/dll/win32/msctf/msctf_classes.idl new file mode 100644 index 00000000000..805e1544ef4 --- /dev/null +++ b/reactos/dll/win32/msctf/msctf_classes.idl @@ -0,0 +1,49 @@ +/* + * COM Classes for msctf + * + * Copyright 2010 Alexandre Julliard + * + * 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 + */ + +[ + threading(apartment), + uuid(529a9e6b-6587-4f23-ab9e-9c7d683e3c50) +] +coclass TF_ThreadMgr { interface ITfThreadMgr; } + +[ + threading(apartment), + uuid(33c53a50-f456-4884-b049-85fd643ecfed) +] +coclass TF_InputProcessorProfiles { interface ITfInputProcessorProfiles; } + +[ + threading(apartment), + uuid(a4b544a1-438d-4b41-9325-869523e2d6c7) +] +coclass TF_CategoryMgr { interface ITfCategoryMgr; } + +[ + threading(apartment), + uuid(ebb08c45-6c4a-4fdc-ae53-4eb8c4c7db8e) +] +coclass TF_LangBarMgr { interface ITfLangBarMgr; } + +[ + threading(apartment), + uuid(3ce74de4-53d3-4d74-8b83-431b3828ba53) +] +coclass TF_DisplayAttributeMgr { interface ITfDisplayAttributeMgr; } diff --git a/reactos/dll/win32/msctf/msctf_internal.h b/reactos/dll/win32/msctf/msctf_internal.h index 9aaaad0fb1b..5dd823fe33e 100644 --- a/reactos/dll/win32/msctf/msctf_internal.h +++ b/reactos/dll/win32/msctf/msctf_internal.h @@ -28,42 +28,42 @@ #define COOKIE_MAGIC_EDITCOOKIE 0x0050 #define COOKIE_MAGIC_COMPARTMENTSINK 0x0060 -extern DWORD tlsIndex; -extern TfClientId processId; -extern ITfCompartmentMgr *globalCompartmentMgr; +extern DWORD tlsIndex DECLSPEC_HIDDEN; +extern TfClientId processId DECLSPEC_HIDDEN; +extern ITfCompartmentMgr *globalCompartmentMgr DECLSPEC_HIDDEN; -extern HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); -extern HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink*, ITfDocumentMgr **ppOut); -extern HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfDocumentMgr *mgr, ITfContext **ppOut, TfEditCookie *pecTextStore); -extern HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); -extern HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); -extern HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, DWORD lockType, DWORD anchorStart, DWORD anchorEnd, ITfRange **ppOut); -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 ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) DECLSPEC_HIDDEN; +extern HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink*, ITfDocumentMgr **ppOut) DECLSPEC_HIDDEN; +extern HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfDocumentMgr *mgr, ITfContext **ppOut, TfEditCookie *pecTextStore) DECLSPEC_HIDDEN; +extern HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) DECLSPEC_HIDDEN; +extern HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) DECLSPEC_HIDDEN; +extern HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, DWORD lockType, DWORD anchorStart, DWORD anchorEnd, ITfRange **ppOut) DECLSPEC_HIDDEN; +extern HRESULT CompartmentMgr_Constructor(IUnknown *pUnkOuter, REFIID riid, IUnknown **ppOut) DECLSPEC_HIDDEN; +extern HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *This) DECLSPEC_HIDDEN; +extern HRESULT LangBarMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) DECLSPEC_HIDDEN; +extern HRESULT DisplayAttributeMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) DECLSPEC_HIDDEN; -extern HRESULT Context_Initialize(ITfContext *cxt, ITfDocumentMgr *manager); -extern HRESULT Context_Uninitialize(ITfContext *cxt); -extern void ThreadMgr_OnDocumentMgrDestruction(ITfThreadMgr *tm, ITfDocumentMgr *mgr); -extern HRESULT TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION *tf, TS_SELECTION_ACP *tsAcp); +extern HRESULT Context_Initialize(ITfContext *cxt, ITfDocumentMgr *manager) DECLSPEC_HIDDEN; +extern HRESULT Context_Uninitialize(ITfContext *cxt) DECLSPEC_HIDDEN; +extern void ThreadMgr_OnDocumentMgrDestruction(ITfThreadMgr *tm, ITfDocumentMgr *mgr) DECLSPEC_HIDDEN; +extern HRESULT TF_SELECTION_to_TS_SELECTION_ACP(const TF_SELECTION *tf, TS_SELECTION_ACP *tsAcp) DECLSPEC_HIDDEN; /* cookie function */ -extern DWORD generate_Cookie(DWORD magic, LPVOID data); -extern DWORD get_Cookie_magic(DWORD id); -extern LPVOID get_Cookie_data(DWORD id); -extern LPVOID remove_Cookie(DWORD id); -extern DWORD enumerate_Cookie(DWORD magic, DWORD *index); +extern DWORD generate_Cookie(DWORD magic, LPVOID data) DECLSPEC_HIDDEN; +extern DWORD get_Cookie_magic(DWORD id) DECLSPEC_HIDDEN; +extern LPVOID get_Cookie_data(DWORD id) DECLSPEC_HIDDEN; +extern LPVOID remove_Cookie(DWORD id) DECLSPEC_HIDDEN; +extern DWORD enumerate_Cookie(DWORD magic, DWORD *index) DECLSPEC_HIDDEN; /* activated text services functions */ -extern HRESULT add_active_textservice(TF_LANGUAGEPROFILE *lp); -extern BOOL get_active_textservice(REFCLSID rclsid, TF_LANGUAGEPROFILE *lp); -extern HRESULT activate_textservices(ITfThreadMgr *tm); -extern HRESULT deactivate_textservices(void); +extern HRESULT add_active_textservice(TF_LANGUAGEPROFILE *lp) DECLSPEC_HIDDEN; +extern BOOL get_active_textservice(REFCLSID rclsid, TF_LANGUAGEPROFILE *lp) DECLSPEC_HIDDEN; +extern HRESULT activate_textservices(ITfThreadMgr *tm) DECLSPEC_HIDDEN; +extern HRESULT deactivate_textservices(void) DECLSPEC_HIDDEN; -extern CLSID get_textservice_clsid(TfClientId tid); -extern HRESULT get_textservice_sink(TfClientId tid, REFCLSID iid, IUnknown** sink); -extern HRESULT set_textservice_sink(TfClientId tid, REFCLSID iid, IUnknown* sink); +extern CLSID get_textservice_clsid(TfClientId tid) DECLSPEC_HIDDEN; +extern HRESULT get_textservice_sink(TfClientId tid, REFCLSID iid, IUnknown** sink) DECLSPEC_HIDDEN; +extern HRESULT set_textservice_sink(TfClientId tid, REFCLSID iid, IUnknown* sink) DECLSPEC_HIDDEN; extern const WCHAR szwSystemTIPKey[]; extern const WCHAR szwSystemCTFKey[]; diff --git a/reactos/dll/win32/msctf/range.c b/reactos/dll/win32/msctf/range.c index dc9eae15c60..3412954aece 100644 --- a/reactos/dll/win32/msctf/range.c +++ b/reactos/dll/win32/msctf/range.c @@ -41,7 +41,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msctf); typedef struct tagRange { - const ITfRangeVtbl *RangeVtbl; + ITfRange ITfRange_iface; /* const ITfRangeACPVtb *RangeACPVtbl; */ LONG refCount; @@ -54,6 +54,11 @@ typedef struct tagRange { } Range; +static inline Range *impl_from_ITfRange(ITfRange *iface) +{ + return CONTAINING_RECORD(iface, Range, ITfRange_iface); +} + static void Range_Destructor(Range *This) { TRACE("destroying %p\n", This); @@ -62,7 +67,7 @@ static void Range_Destructor(Range *This) static HRESULT WINAPI Range_QueryInterface(ITfRange *iface, REFIID iid, LPVOID *ppvOut) { - Range *This = (Range*)iface; + Range *This = impl_from_ITfRange(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfRange)) @@ -82,13 +87,13 @@ static HRESULT WINAPI Range_QueryInterface(ITfRange *iface, REFIID iid, LPVOID * static ULONG WINAPI Range_AddRef(ITfRange *iface) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI Range_Release(ITfRange *iface) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -104,7 +109,7 @@ static ULONG WINAPI Range_Release(ITfRange *iface) static HRESULT WINAPI Range_GetText(ITfRange *iface, TfEditCookie ec, DWORD dwFlags, WCHAR *pchText, ULONG cchMax, ULONG *pcch) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -112,7 +117,7 @@ static HRESULT WINAPI Range_GetText(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_SetText(ITfRange *iface, TfEditCookie ec, DWORD dwFlags, const WCHAR *pchText, LONG cch) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -120,7 +125,7 @@ static HRESULT WINAPI Range_SetText(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_GetFormattedText(ITfRange *iface, TfEditCookie ec, IDataObject **ppDataObject) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -128,7 +133,7 @@ static HRESULT WINAPI Range_GetFormattedText(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_GetEmbedded(ITfRange *iface, TfEditCookie ec, REFGUID rguidService, REFIID riid, IUnknown **ppunk) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -136,7 +141,7 @@ static HRESULT WINAPI Range_GetEmbedded(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_InsertEmbedded(ITfRange *iface, TfEditCookie ec, DWORD dwFlags, IDataObject *pDataObject) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -144,7 +149,7 @@ static HRESULT WINAPI Range_InsertEmbedded(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_ShiftStart(ITfRange *iface, TfEditCookie ec, LONG cchReq, LONG *pcch, const TF_HALTCOND *pHalt) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -152,7 +157,7 @@ static HRESULT WINAPI Range_ShiftStart(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_ShiftEnd(ITfRange *iface, TfEditCookie ec, LONG cchReq, LONG *pcch, const TF_HALTCOND *pHalt) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -160,7 +165,7 @@ static HRESULT WINAPI Range_ShiftEnd(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_ShiftStartToRange(ITfRange *iface, TfEditCookie ec, ITfRange *pRange, TfAnchor aPos) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -168,7 +173,7 @@ static HRESULT WINAPI Range_ShiftStartToRange(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_ShiftEndToRange(ITfRange *iface, TfEditCookie ec, ITfRange *pRange, TfAnchor aPos) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -176,7 +181,7 @@ static HRESULT WINAPI Range_ShiftEndToRange(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_ShiftStartRegion(ITfRange *iface, TfEditCookie ec, TfShiftDir dir, BOOL *pfNoRegion) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -184,7 +189,7 @@ static HRESULT WINAPI Range_ShiftStartRegion(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_ShiftEndRegion(ITfRange *iface, TfEditCookie ec, TfShiftDir dir, BOOL *pfNoRegion) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -192,7 +197,7 @@ static HRESULT WINAPI Range_ShiftEndRegion(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_IsEmpty(ITfRange *iface, TfEditCookie ec, BOOL *pfEmpty) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -200,7 +205,7 @@ static HRESULT WINAPI Range_IsEmpty(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_Collapse(ITfRange *iface, TfEditCookie ec, TfAnchor aPos) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); TRACE("(%p) %i %i\n",This,ec,aPos); switch (aPos) @@ -221,7 +226,7 @@ static HRESULT WINAPI Range_Collapse(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_IsEqualStart(ITfRange *iface, TfEditCookie ec, ITfRange *pWith, TfAnchor aPos, BOOL *pfEqual) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -229,7 +234,7 @@ static HRESULT WINAPI Range_IsEqualStart(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_IsEqualEnd(ITfRange *iface, TfEditCookie ec, ITfRange *pWith, TfAnchor aPos, BOOL *pfEqual) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -237,7 +242,7 @@ static HRESULT WINAPI Range_IsEqualEnd(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_CompareStart(ITfRange *iface, TfEditCookie ec, ITfRange *pWith, TfAnchor aPos, LONG *plResult) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -245,7 +250,7 @@ static HRESULT WINAPI Range_CompareStart(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_CompareEnd(ITfRange *iface, TfEditCookie ec, ITfRange *pWith, TfAnchor aPos, LONG *plResult) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -253,7 +258,7 @@ static HRESULT WINAPI Range_CompareEnd(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_AdjustForInsert(ITfRange *iface, TfEditCookie ec, ULONG cchInsert, BOOL *pfInsertOk) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -261,7 +266,7 @@ static HRESULT WINAPI Range_AdjustForInsert(ITfRange *iface, TfEditCookie ec, static HRESULT WINAPI Range_GetGravity(ITfRange *iface, TfGravity *pgStart, TfGravity *pgEnd) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } @@ -269,21 +274,21 @@ static HRESULT WINAPI Range_GetGravity(ITfRange *iface, static HRESULT WINAPI Range_SetGravity(ITfRange *iface, TfEditCookie ec, TfGravity gStart, TfGravity gEnd) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } static HRESULT WINAPI Range_Clone(ITfRange *iface, ITfRange **ppClone) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); FIXME("STUB:(%p)\n",This); return E_NOTIMPL; } static HRESULT WINAPI Range_GetContext(ITfRange *iface, ITfContext **ppContext) { - Range *This = (Range *)iface; + Range *This = impl_from_ITfRange(iface); TRACE("(%p)\n",This); if (!ppContext) return E_INVALIDARG; @@ -331,7 +336,7 @@ HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, DWORD l TRACE("(%p) %p %p\n",This, context, textstore); - This->RangeVtbl= &Range_RangeVtbl; + This->ITfRange_iface.lpVtbl = &Range_RangeVtbl; This->refCount = 1; This->pITfContext = context; This->pITextStoreACP = textstore; @@ -339,7 +344,7 @@ HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, DWORD l This->anchorStart = anchorStart; This->anchorEnd = anchorEnd; - *ppOut = (ITfRange*)This; + *ppOut = &This->ITfRange_iface; TRACE("returning %p\n", This); return S_OK; diff --git a/reactos/dll/win32/msctf/threadmgr.c b/reactos/dll/win32/msctf/threadmgr.c index 5f3a90abb5a..af3ebbf4a6e 100644 --- a/reactos/dll/win32/msctf/threadmgr.c +++ b/reactos/dll/win32/msctf/threadmgr.c @@ -1313,7 +1313,7 @@ HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) } /************************************************** - * IEnumTfDocumentMgrs implementaion + * IEnumTfDocumentMgrs implementation **************************************************/ static void EnumTfDocumentMgr_Destructor(EnumTfDocumentMgr *This) { @@ -1470,5 +1470,5 @@ void ThreadMgr_OnDocumentMgrDestruction(ITfThreadMgr *tm, ITfDocumentMgr *mgr) return; } } - FIXME("ITfDocumenMgr %p not found in this thread\n",mgr); + FIXME("ITfDocumentMgr %p not found in this thread\n",mgr); } diff --git a/reactos/dll/win32/msctf/version.rc b/reactos/dll/win32/msctf/version.rc index 8bd8ff3671f..549f58380a6 100644 --- a/reactos/dll/win32/msctf/version.rc +++ b/reactos/dll/win32/msctf/version.rc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +1 WINE_REGISTRY msctf.rgs + #define WINE_FILEDESCRIPTION_STR "Wine Msctf" #define WINE_FILENAME_STR "msctf.dll" #define WINE_FILEVERSION 5,1,2600,3319 diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 262965c46ff..c0e1101a448 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -96,7 +96,7 @@ reactos/dll/win32/msadp32.acm # Synced to Wine-1.3.37 reactos/dll/win32/mscat32 # Autosync reactos/dll/win32/mscms # Synced to Wine-1.3.37 reactos/dll/win32/mscoree # Autosync -reactos/dll/win32/msctf # Autosync +reactos/dll/win32/msctf # Synced to Wine-1.3.37 reactos/dll/win32/msftedit # Synced to Wine-1.3.37 reactos/dll/win32/msg711.acm # Synced to Wine-1.3.37 reactos/dll/win32/msgsm32.acm # Autosync From db610e682b1094db1f5309d2d852e5df6eb7f8b2 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 17:32:46 +0000 Subject: [PATCH 125/289] [MSCTF_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55251 --- rostests/winetests/msctf/inputprocessor.c | 268 ++++++++++++++++------ 1 file changed, 195 insertions(+), 73 deletions(-) diff --git a/rostests/winetests/msctf/inputprocessor.c b/rostests/winetests/msctf/inputprocessor.c index c445b41b01e..8f409c35c23 100644 --- a/rostests/winetests/msctf/inputprocessor.c +++ b/rostests/winetests/msctf/inputprocessor.c @@ -21,6 +21,7 @@ #include #define COBJMACROS +#define CONST_VTABLE #include "wine/test.h" #include "winuser.h" #include "initguid.h" @@ -45,6 +46,7 @@ static ITextStoreACPSink *ACPSink; #define SINK_FIRED 2 #define SINK_IGNORE 3 #define SINK_OPTIONAL 4 +#define SINK_SAVE 5 #define SINK_ACTION_MASK 0xff #define SINK_OPTION_MASK 0xff00 @@ -53,6 +55,7 @@ static ITextStoreACPSink *ACPSink; #define SINK_OPTION_TODO 0x0100 #define FOCUS_IGNORE (ITfDocumentMgr*)0xffffffff +#define FOCUS_SAVE (ITfDocumentMgr*)0xfffffffe static BOOL test_ShouldActivate = FALSE; static BOOL test_ShouldDeactivate = FALSE; @@ -62,6 +65,8 @@ static DWORD tmSinkRefCount; static DWORD documentStatus; static ITfDocumentMgr *test_CurrentFocus = NULL; static ITfDocumentMgr *test_PrevFocus = NULL; +static ITfDocumentMgr *test_LastCurrentFocus = FOCUS_SAVE; +static ITfDocumentMgr *test_FirstPrevFocus = FOCUS_SAVE; static INT test_OnSetFocus = SINK_UNEXPECTED; static INT test_OnInitDocumentMgr = SINK_UNEXPECTED; static INT test_OnPushContext = SINK_UNEXPECTED; @@ -107,6 +112,10 @@ static inline void _sink_fire_ok(INT *sink, const CHAR* name) case SINK_IGNORE: winetest_trace("Ignoring %s\n",name); return; + case SINK_SAVE: + count = expected_count(sink) + 1; + *sink = (*sink & ~SINK_EXPECTED_COUNT_MASK) + (count << 16); + return; default: if (todo) todo_wine winetest_ok(0, "Unexpected %s sink\n",name); @@ -122,6 +131,7 @@ static inline void _sink_check_ok(INT *sink, const CHAR* name) { int action = *sink & SINK_ACTION_MASK; int todo = *sink & SINK_OPTION_TODO; + int count = expected_count(sink); switch (action) { @@ -132,6 +142,10 @@ static inline void _sink_check_ok(INT *sink, const CHAR* name) break; case SINK_IGNORE: return; + case SINK_SAVE: + if (count == 0 && winetest_interactive) + winetest_trace("optional sink %s not fired\n",name); + break; default: if (todo) todo_wine winetest_ok(0, "%s not fired as expected, in state %x\n",name,*sink); @@ -143,16 +157,35 @@ static inline void _sink_check_ok(INT *sink, const CHAR* name) #define sink_check_ok(a,b) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _sink_check_ok(a,b) +static inline void _sink_check_saved(INT *sink, ITfDocumentMgr *PrevFocus, ITfDocumentMgr *CurrentFocus, const CHAR* name) +{ + int count = expected_count(sink); + _sink_check_ok(sink, name); + if (PrevFocus != FOCUS_IGNORE && count != 0) + winetest_ok(PrevFocus == test_FirstPrevFocus, "%s expected prev focus %p got %p\n", name, PrevFocus, test_FirstPrevFocus); + if (CurrentFocus != FOCUS_IGNORE && count != 0) + winetest_ok(CurrentFocus == test_LastCurrentFocus, "%s expected current focus %p got %p\n", name, CurrentFocus, test_LastCurrentFocus); + test_FirstPrevFocus = FOCUS_SAVE; + test_LastCurrentFocus = FOCUS_SAVE; +} + +#define sink_check_saved(s,p,c,n) (winetest_set_location(__FILE__,__LINE__), 0) ? 0 : _sink_check_saved(s,p,c,n) + /********************************************************************** * ITextStoreACP **********************************************************************/ typedef struct tagTextStoreACP { - const ITextStoreACPVtbl *TextStoreACPVtbl; + ITextStoreACP ITextStoreACP_iface; LONG refCount; } TextStoreACP; +static inline TextStoreACP *impl_from_ITextStoreACP(ITextStoreACP *iface) +{ + return CONTAINING_RECORD(iface, TextStoreACP, ITextStoreACP_iface); +} + static void TextStoreACP_Destructor(TextStoreACP *This) { HeapFree(GetProcessHeap(),0,This); @@ -160,7 +193,7 @@ static void TextStoreACP_Destructor(TextStoreACP *This) static HRESULT WINAPI TextStoreACP_QueryInterface(ITextStoreACP *iface, REFIID iid, LPVOID *ppvOut) { - TextStoreACP *This = (TextStoreACP *)iface; + TextStoreACP *This = impl_from_ITextStoreACP(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITextStoreACP)) @@ -179,13 +212,13 @@ static HRESULT WINAPI TextStoreACP_QueryInterface(ITextStoreACP *iface, REFIID i static ULONG WINAPI TextStoreACP_AddRef(ITextStoreACP *iface) { - TextStoreACP *This = (TextStoreACP *)iface; + TextStoreACP *This = impl_from_ITextStoreACP(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI TextStoreACP_Release(ITextStoreACP *iface) { - TextStoreACP *This = (TextStoreACP *)iface; + TextStoreACP *This = impl_from_ITextStoreACP(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -421,7 +454,7 @@ static HRESULT TextStoreACP_Constructor(IUnknown **ppOut) if (This == NULL) return E_OUTOFMEMORY; - This->TextStoreACPVtbl = &TextStoreACP_TextStoreACPVtbl; + This->ITextStoreACP_iface.lpVtbl = &TextStoreACP_TextStoreACPVtbl; This->refCount = 1; *ppOut = (IUnknown *)This; @@ -433,10 +466,15 @@ static HRESULT TextStoreACP_Constructor(IUnknown **ppOut) **********************************************************************/ typedef struct tagThreadMgrEventSink { - const ITfThreadMgrEventSinkVtbl *ThreadMgrEventSinkVtbl; + ITfThreadMgrEventSink ITfThreadMgrEventSink_iface; LONG refCount; } ThreadMgrEventSink; +static inline ThreadMgrEventSink *impl_from_ITfThreadMgrEventSink(ITfThreadMgrEventSink *iface) +{ + return CONTAINING_RECORD(iface, ThreadMgrEventSink, ITfThreadMgrEventSink_iface); +} + static void ThreadMgrEventSink_Destructor(ThreadMgrEventSink *This) { HeapFree(GetProcessHeap(),0,This); @@ -444,7 +482,7 @@ static void ThreadMgrEventSink_Destructor(ThreadMgrEventSink *This) static HRESULT WINAPI ThreadMgrEventSink_QueryInterface(ITfThreadMgrEventSink *iface, REFIID iid, LPVOID *ppvOut) { - ThreadMgrEventSink *This = (ThreadMgrEventSink *)iface; + ThreadMgrEventSink *This = impl_from_ITfThreadMgrEventSink(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfThreadMgrEventSink)) @@ -463,14 +501,14 @@ static HRESULT WINAPI ThreadMgrEventSink_QueryInterface(ITfThreadMgrEventSink *i static ULONG WINAPI ThreadMgrEventSink_AddRef(ITfThreadMgrEventSink *iface) { - ThreadMgrEventSink *This = (ThreadMgrEventSink *)iface; + ThreadMgrEventSink *This = impl_from_ITfThreadMgrEventSink(iface); ok (tmSinkRefCount == This->refCount,"ThreadMgrEventSink refcount off %i vs %i\n",This->refCount,tmSinkRefCount); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI ThreadMgrEventSink_Release(ITfThreadMgrEventSink *iface) { - ThreadMgrEventSink *This = (ThreadMgrEventSink *)iface; + ThreadMgrEventSink *This = impl_from_ITfThreadMgrEventSink(iface); ULONG ret; ok (tmSinkRefCount == This->refCount,"ThreadMgrEventSink refcount off %i vs %i\n",This->refCount,tmSinkRefCount); @@ -498,9 +536,16 @@ static HRESULT WINAPI ThreadMgrEventSink_OnSetFocus(ITfThreadMgrEventSink *iface ITfDocumentMgr *pdimFocus, ITfDocumentMgr *pdimPrevFocus) { sink_fire_ok(&test_OnSetFocus,"ThreadMgrEventSink_OnSetFocus"); - if (test_CurrentFocus != FOCUS_IGNORE) + if (test_CurrentFocus == FOCUS_SAVE) + test_LastCurrentFocus = pdimFocus; + else if (test_CurrentFocus != FOCUS_IGNORE) ok(pdimFocus == test_CurrentFocus,"Sink reports wrong focus\n"); - if (test_PrevFocus != FOCUS_IGNORE) + if (test_PrevFocus == FOCUS_SAVE) + { + if (test_FirstPrevFocus == FOCUS_SAVE) + test_FirstPrevFocus = pdimPrevFocus; + } + else if (test_PrevFocus != FOCUS_IGNORE) ok(pdimPrevFocus == test_PrevFocus,"Sink reports wrong previous focus\n"); return S_OK; } @@ -513,7 +558,7 @@ ITfContext *pic) ITfContext *test; hr = ITfContext_GetDocumentMgr(pic,&docmgr); - ok(SUCCEEDED(hr),"GetDocumenMgr failed\n"); + ok(SUCCEEDED(hr),"GetDocumentMgr failed\n"); test = (ITfContext*)0xdeadbeef; ITfDocumentMgr_Release(docmgr); hr = ITfDocumentMgr_GetTop(docmgr,&test); @@ -534,7 +579,7 @@ ITfContext *pic) ITfContext *test; hr = ITfContext_GetDocumentMgr(pic,&docmgr); - ok(SUCCEEDED(hr),"GetDocumenMgr failed\n"); + ok(SUCCEEDED(hr),"GetDocumentMgr failed\n"); ITfDocumentMgr_Release(docmgr); test = (ITfContext*)0xdeadbeef; hr = ITfDocumentMgr_GetTop(docmgr,&test); @@ -568,7 +613,7 @@ static HRESULT ThreadMgrEventSink_Constructor(IUnknown **ppOut) if (This == NULL) return E_OUTOFMEMORY; - This->ThreadMgrEventSinkVtbl = &ThreadMgrEventSink_ThreadMgrEventSinkVtbl; + This->ITfThreadMgrEventSink_iface.lpVtbl = &ThreadMgrEventSink_ThreadMgrEventSinkVtbl; This->refCount = 1; *ppOut = (IUnknown *)This; @@ -588,17 +633,27 @@ typedef HRESULT (*LPFNCONSTRUCTOR)(IUnknown *pUnkOuter, IUnknown **ppvOut); typedef struct tagClassFactory { - const IClassFactoryVtbl *vtbl; + IClassFactory IClassFactory_iface; LONG ref; LPFNCONSTRUCTOR ctor; } ClassFactory; +static inline ClassFactory *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, ClassFactory, IClassFactory_iface); +} + typedef struct tagTextService { - const ITfTextInputProcessorVtbl *TextInputProcessorVtbl; + ITfTextInputProcessor ITfTextInputProcessor_iface; LONG refCount; } TextService; +static inline TextService *impl_from_ITfTextInputProcessor(ITfTextInputProcessor *iface) +{ + return CONTAINING_RECORD(iface, TextService, ITfTextInputProcessor_iface); +} + static void ClassFactory_Destructor(ClassFactory *This) { HeapFree(GetProcessHeap(),0,This); @@ -620,13 +675,13 @@ static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID r static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) { - ClassFactory *This = (ClassFactory *)iface; + ClassFactory *This = impl_from_IClassFactory(iface); return InterlockedIncrement(&This->ref); } static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) { - ClassFactory *This = (ClassFactory *)iface; + ClassFactory *This = impl_from_IClassFactory(iface); ULONG ret = InterlockedDecrement(&This->ref); if (ret == 0) @@ -636,7 +691,7 @@ static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *punkOuter, REFIID iid, LPVOID *ppvOut) { - ClassFactory *This = (ClassFactory *)iface; + ClassFactory *This = impl_from_IClassFactory(iface); HRESULT ret; IUnknown *obj; @@ -672,7 +727,7 @@ static const IClassFactoryVtbl ClassFactoryVtbl = { static HRESULT ClassFactory_Constructor(LPFNCONSTRUCTOR ctor, LPVOID *ppvOut) { ClassFactory *This = HeapAlloc(GetProcessHeap(),0,sizeof(ClassFactory)); - This->vtbl = &ClassFactoryVtbl; + This->IClassFactory_iface.lpVtbl = &ClassFactoryVtbl; This->ref = 1; This->ctor = ctor; *ppvOut = (LPVOID)This; @@ -687,7 +742,7 @@ static void TextService_Destructor(TextService *This) static HRESULT WINAPI TextService_QueryInterface(ITfTextInputProcessor *iface, REFIID iid, LPVOID *ppvOut) { - TextService *This = (TextService *)iface; + TextService *This = impl_from_ITfTextInputProcessor(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfTextInputProcessor)) @@ -706,13 +761,13 @@ static HRESULT WINAPI TextService_QueryInterface(ITfTextInputProcessor *iface, R static ULONG WINAPI TextService_AddRef(ITfTextInputProcessor *iface) { - TextService *This = (TextService *)iface; + TextService *This = impl_from_ITfTextInputProcessor(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI TextService_Release(ITfTextInputProcessor *iface) { - TextService *This = (TextService *)iface; + TextService *This = impl_from_ITfTextInputProcessor(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -757,7 +812,7 @@ static HRESULT TextService_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) if (This == NULL) return E_OUTOFMEMORY; - This->TextInputProcessorVtbl= &TextService_TextInputProcessorVtbl; + This->ITfTextInputProcessor_iface.lpVtbl = &TextService_TextInputProcessorVtbl; This->refCount = 1; *ppOut = (IUnknown *)This; @@ -970,7 +1025,7 @@ static void test_ThreadMgrAdviseSinks(void) 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 + /* Advising the sink adds a ref, Releasing here lets the object be deleted when unadvised */ tmSinkRefCount = 2; IUnknown_Release(sink); @@ -998,10 +1053,15 @@ static void test_ThreadMgrUnadviseSinks(void) **********************************************************************/ typedef struct tagKeyEventSink { - const ITfKeyEventSinkVtbl *KeyEventSinkVtbl; + ITfKeyEventSink ITfKeyEventSink_iface; LONG refCount; } KeyEventSink; +static inline KeyEventSink *impl_from_ITfKeyEventSink(ITfKeyEventSink *iface) +{ + return CONTAINING_RECORD(iface, KeyEventSink, ITfKeyEventSink_iface); +} + static void KeyEventSink_Destructor(KeyEventSink *This) { HeapFree(GetProcessHeap(),0,This); @@ -1009,7 +1069,7 @@ static void KeyEventSink_Destructor(KeyEventSink *This) static HRESULT WINAPI KeyEventSink_QueryInterface(ITfKeyEventSink *iface, REFIID iid, LPVOID *ppvOut) { - KeyEventSink *This = (KeyEventSink *)iface; + KeyEventSink *This = impl_from_ITfKeyEventSink(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfKeyEventSink)) @@ -1028,13 +1088,13 @@ static HRESULT WINAPI KeyEventSink_QueryInterface(ITfKeyEventSink *iface, REFIID static ULONG WINAPI KeyEventSink_AddRef(ITfKeyEventSink *iface) { - KeyEventSink *This = (KeyEventSink *)iface; + KeyEventSink *This = impl_from_ITfKeyEventSink(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI KeyEventSink_Release(ITfKeyEventSink *iface) { - KeyEventSink *This = (KeyEventSink *)iface; + KeyEventSink *This = impl_from_ITfKeyEventSink(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -1107,10 +1167,10 @@ static HRESULT KeyEventSink_Constructor(ITfKeyEventSink **ppOut) if (This == NULL) return E_OUTOFMEMORY; - This->KeyEventSinkVtbl = &KeyEventSink_KeyEventSinkVtbl; + This->ITfKeyEventSink_iface.lpVtbl = &KeyEventSink_KeyEventSinkVtbl; This->refCount = 1; - *ppOut = (ITfKeyEventSink*)This; + *ppOut = &This->ITfKeyEventSink_iface; return S_OK; } @@ -1175,8 +1235,10 @@ static void test_Activate(void) { HRESULT hr; + test_ShouldActivate = TRUE; /* Win7 */ hr = ITfInputProcessorProfiles_ActivateLanguageProfile(g_ipp,&CLSID_FakeService,gLangid,&CLSID_FakeService); ok(SUCCEEDED(hr),"Failed to Activate text service\n"); + test_ShouldActivate = FALSE; } @@ -1253,10 +1315,15 @@ static inline int check_context_refcount(ITfContext *iface) **********************************************************************/ typedef struct tagTextEditSink { - const ITfTextEditSinkVtbl *TextEditSinkVtbl; + ITfTextEditSink ITfTextEditSink_iface; LONG refCount; } TextEditSink; +static inline TextEditSink *impl_from_ITfTextEditSink(ITfTextEditSink *iface) +{ + return CONTAINING_RECORD(iface, TextEditSink, ITfTextEditSink_iface); +} + static void TextEditSink_Destructor(TextEditSink *This) { HeapFree(GetProcessHeap(),0,This); @@ -1264,7 +1331,7 @@ static void TextEditSink_Destructor(TextEditSink *This) static HRESULT WINAPI TextEditSink_QueryInterface(ITfTextEditSink *iface, REFIID iid, LPVOID *ppvOut) { - TextEditSink *This = (TextEditSink *)iface; + TextEditSink *This = impl_from_ITfTextEditSink(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfTextEditSink)) @@ -1283,13 +1350,13 @@ static HRESULT WINAPI TextEditSink_QueryInterface(ITfTextEditSink *iface, REFIID static ULONG WINAPI TextEditSink_AddRef(ITfTextEditSink *iface) { - TextEditSink *This = (TextEditSink *)iface; + TextEditSink *This = impl_from_ITfTextEditSink(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI TextEditSink_Release(ITfTextEditSink *iface) { - TextEditSink *This = (TextEditSink *)iface; + TextEditSink *This = impl_from_ITfTextEditSink(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -1323,10 +1390,10 @@ static HRESULT TextEditSink_Constructor(ITfTextEditSink **ppOut) if (This == NULL) return E_OUTOFMEMORY; - This->TextEditSinkVtbl = &TextEditSink_TextEditSinkVtbl; + This->ITfTextEditSink_iface.lpVtbl = &TextEditSink_TextEditSinkVtbl; This->refCount = 1; - *ppOut = (ITfTextEditSink*)This; + *ppOut = &This->ITfTextEditSink_iface; return S_OK; } @@ -1377,7 +1444,7 @@ static void test_startSession(void) test_CurrentFocus = g_dm; test_PrevFocus = NULL; - test_OnSetFocus = SINK_EXPECTED; + test_OnSetFocus = SINK_OPTIONAL; /* Doesn't always fire on Win7 */ hr = ITfThreadMgr_SetFocus(g_tm,g_dm); ok(SUCCEEDED(hr),"SetFocus Failed\n"); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); @@ -1386,18 +1453,19 @@ static void test_startSession(void) 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); + ITfDocumentMgr_Release(g_dm); 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 = TextStoreACP_Constructor((IUnknown**)&ts); + if (SUCCEEDED(hr)) + { + 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"); @@ -1522,7 +1590,7 @@ static void test_endSession(void) test_ShouldDeactivate = TRUE; test_CurrentFocus = NULL; test_PrevFocus = g_dm; - test_OnSetFocus = SINK_EXPECTED; + test_OnSetFocus = SINK_OPTIONAL; /* Doesn't fire on Win7 */ hr = ITfThreadMgr_Deactivate(g_tm); ok(SUCCEEDED(hr),"Failed to Deactivate\n"); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); @@ -1603,10 +1671,15 @@ static void test_ClientId(void) **********************************************************************/ typedef struct tagEditSession { - const ITfEditSessionVtbl *EditSessionVtbl; + ITfEditSession ITfEditSession_iface; LONG refCount; } EditSession; +static inline EditSession *impl_from_ITfEditSession(ITfEditSession *iface) +{ + return CONTAINING_RECORD(iface, EditSession, ITfEditSession_iface); +} + static void EditSession_Destructor(EditSession *This) { HeapFree(GetProcessHeap(),0,This); @@ -1614,7 +1687,7 @@ static void EditSession_Destructor(EditSession *This) static HRESULT WINAPI EditSession_QueryInterface(ITfEditSession *iface, REFIID iid, LPVOID *ppvOut) { - EditSession *This = (EditSession *)iface; + EditSession *This = impl_from_ITfEditSession(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfEditSession)) @@ -1633,13 +1706,13 @@ static HRESULT WINAPI EditSession_QueryInterface(ITfEditSession *iface, REFIID i static ULONG WINAPI EditSession_AddRef(ITfEditSession *iface) { - EditSession *This = (EditSession *)iface; + EditSession *This = impl_from_ITfEditSession(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI EditSession_Release(ITfEditSession *iface) { - EditSession *This = (EditSession *)iface; + EditSession *This = impl_from_ITfEditSession(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -1734,6 +1807,7 @@ TfEditCookie ec) selection.style.fInterimChar = FALSE; test_ACP_SetSelection = SINK_EXPECTED; hr = ITfContext_SetSelection(cxt, ec, 1, &selection); + ok(SUCCEEDED(hr),"ITfContext_SetSelection failed\n"); sink_check_ok(&test_ACP_SetSelection,"SetSelection"); ITfRange_Release(range); @@ -1760,10 +1834,10 @@ static HRESULT EditSession_Constructor(ITfEditSession **ppOut) if (This == NULL) return E_OUTOFMEMORY; - This->EditSessionVtbl = &EditSession_EditSessionVtbl; + This->ITfEditSession_iface.lpVtbl = &EditSession_EditSessionVtbl; This->refCount = 1; - *ppOut = (ITfEditSession*)This; + *ppOut = &This->ITfEditSession_iface; return S_OK; } @@ -1792,7 +1866,7 @@ static void test_TStoApplicationText(void) } hrSession = 0xfeedface; - /* Test no premissions flags */ + /* Test no permissions 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); @@ -1919,9 +1993,20 @@ static void test_Compartments(void) static void processPendingMessages(void) { MSG msg; - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - DispatchMessage(&msg); + int diff = 200; + int min_timeout = 100; + DWORD time = GetTickCount() + diff; + + while (diff > 0) + { + if (MsgWaitForMultipleObjects(0, NULL, FALSE, min_timeout, QS_ALLINPUT) == WAIT_TIMEOUT) + break; + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + diff = time - GetTickCount(); } } @@ -1934,9 +2019,12 @@ static void test_AssociateFocus(void) ITfThreadMgr_GetFocus(g_tm, &dmorig); test_CurrentFocus = NULL; test_PrevFocus = dmorig; - test_OnSetFocus = SINK_EXPECTED; + test_OnSetFocus = SINK_OPTIONAL; /* Doesn't always fire on Win7 */ + test_ACP_GetStatus = SINK_OPTIONAL; hr = ITfThreadMgr_SetFocus(g_tm,NULL); + ok(SUCCEEDED(hr),"ITfThreadMgr_SetFocus failed\n"); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_ACP_GetStatus = SINK_UNEXPECTED; ITfDocumentMgr_Release(dmorig); hr = ITfThreadMgr_CreateDocumentMgr(g_tm,&dm1); @@ -1956,30 +2044,52 @@ static void test_AssociateFocus(void) test_OnInitDocumentMgr = SINK_OPTIONAL; /* Vista and greater */ test_OnPushContext = SINK_OPTIONAL; /* Vista and greater */ + test_OnSetFocus = SINK_OPTIONAL; /* Win7 */ + test_PrevFocus = NULL; + test_CurrentFocus = FOCUS_IGNORE; ShowWindow(wnd1,SW_SHOWNORMAL); + test_OnSetFocus = SINK_UNEXPECTED; SetFocus(wnd1); sink_check_ok(&test_OnInitDocumentMgr,"OnInitDocumentMgr"); sink_check_ok(&test_OnPushContext,"OnPushContext"); test_OnSetFocus = SINK_OPTIONAL; /* Vista and greater */ + test_ACP_RequestLock = SINK_OPTIONAL; /* Win7 x64 */ + test_ACP_GetSelection = SINK_OPTIONAL; /* Win7 x64 */ ITfThreadMgr_GetFocus(g_tm, &test_PrevFocus); test_CurrentFocus = FOCUS_IGNORE; /* This is a default system context */ processPendingMessages(); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_ACP_RequestLock = SINK_UNEXPECTED; + test_ACP_GetSelection = SINK_UNEXPECTED; test_CurrentFocus = dm1; test_PrevFocus = FOCUS_IGNORE; - test_OnSetFocus = SINK_EXPECTED; + test_OnSetFocus = SINK_OPTIONAL; + test_ShouldDeactivate = SINK_OPTIONAL; hr = ITfThreadMgr_AssociateFocus(g_tm,wnd1,dm1,&olddm); ok(SUCCEEDED(hr),"AssociateFocus failed\n"); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_ShouldDeactivate = SINK_UNEXPECTED; processPendingMessages(); ITfThreadMgr_GetFocus(g_tm, &dmcheck); - ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); - ITfDocumentMgr_Release(dmcheck); + if (dmcheck != NULL) + { + ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); + ITfDocumentMgr_Release(dmcheck); + } + else + { + /* Sometimes we need to explicitly set focus on Win7 */ + test_CurrentFocus = dm1; + test_PrevFocus = FOCUS_IGNORE; + test_OnSetFocus = SINK_EXPECTED; + ITfThreadMgr_SetFocus(g_tm, dm1); + sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + } hr = ITfThreadMgr_AssociateFocus(g_tm,wnd2,dm2,&olddm); ok(SUCCEEDED(hr),"AssociateFocus failed\n"); @@ -1995,12 +2105,12 @@ static void test_AssociateFocus(void) ok(dmcheck == dm1, "Expected DocumentMgr not focused\n"); ITfDocumentMgr_Release(dmcheck); - test_CurrentFocus = dm2; - test_PrevFocus = dm1; - test_OnSetFocus = SINK_OPTIONAL; /* wine and Winxp */ + test_CurrentFocus = FOCUS_SAVE; + test_PrevFocus = FOCUS_SAVE; + test_OnSetFocus = SINK_SAVE; ShowWindow(wnd2,SW_SHOWNORMAL); SetFocus(wnd2); - sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + sink_check_saved(&test_OnSetFocus,dm1,dm2,"OnSetFocus"); test_CurrentFocus = FOCUS_IGNORE; /* occasional wine race */ test_PrevFocus = FOCUS_IGNORE; /* occasional wine race */ test_OnSetFocus = SINK_IGNORE; /* occasional wine race */ @@ -2010,12 +2120,12 @@ static void test_AssociateFocus(void) SetFocus(wnd3); processPendingMessages(); - test_CurrentFocus = dm1; - test_PrevFocus = dm2; - test_OnSetFocus = SINK_EXPECTED; + test_CurrentFocus = FOCUS_SAVE; + test_PrevFocus = FOCUS_SAVE; + test_OnSetFocus = SINK_SAVE; SetFocus(wnd1); processPendingMessages(); - sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + sink_check_saved(&test_OnSetFocus,dm2,dm1,"OnSetFocus"); hr = ITfThreadMgr_AssociateFocus(g_tm,wnd3,NULL,&olddm); ok(SUCCEEDED(hr),"AssociateFocus failed\n"); @@ -2025,16 +2135,16 @@ static void test_AssociateFocus(void) test_CurrentFocus = dmorig; test_PrevFocus = dm1; test_OnSetFocus = SINK_EXPECTED; - test_ACP_GetStatus = SINK_EXPECTED; + test_ACP_GetStatus = SINK_IGNORE; 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; + test_CurrentFocus = FOCUS_SAVE; + test_PrevFocus = FOCUS_SAVE; + test_OnSetFocus = SINK_SAVE; SetFocus(wnd3); processPendingMessages(); - sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + sink_check_saved(&test_OnSetFocus,dmorig,FOCUS_IGNORE,"OnSetFocus"); /* CurrentFocus NULL on XP, system default on Vista */ hr = ITfThreadMgr_AssociateFocus(g_tm,wnd2,NULL,&olddm); ok(SUCCEEDED(hr),"AssociateFocus failed\n"); @@ -2045,28 +2155,38 @@ static void test_AssociateFocus(void) ok(olddm == dm1, "incorrect old DocumentMgr returned\n"); ITfDocumentMgr_Release(olddm); + test_OnSetFocus = SINK_IGNORE; /* OnSetFocus fires a couple of times on Win7 */ + test_CurrentFocus = FOCUS_IGNORE; + test_PrevFocus = FOCUS_IGNORE; SetFocus(wnd2); processPendingMessages(); SetFocus(wnd1); processPendingMessages(); + test_OnSetFocus = SINK_UNEXPECTED; ITfDocumentMgr_Release(dm1); ITfDocumentMgr_Release(dm2); test_CurrentFocus = dmorig; test_PrevFocus = FOCUS_IGNORE; - test_OnSetFocus = SINK_EXPECTED; + test_OnSetFocus = SINK_OPTIONAL; test_ACP_GetStatus = SINK_IGNORE; ITfThreadMgr_SetFocus(g_tm,dmorig); sink_check_ok(&test_OnSetFocus,"OnSetFocus"); + test_OnSetFocus = SINK_IGNORE; /* OnSetFocus fires a couple of times on Win7 */ + test_CurrentFocus = FOCUS_IGNORE; + test_PrevFocus = FOCUS_IGNORE; DestroyWindow(wnd1); DestroyWindow(wnd2); + test_OnSetFocus = SINK_UNEXPECTED; test_OnPopContext = SINK_OPTIONAL; /* Vista and greater */ test_OnSetFocus = SINK_OPTIONAL; /* Vista and greater */ ITfThreadMgr_GetFocus(g_tm, &test_PrevFocus); test_CurrentFocus = NULL; + test_ShouldDeactivate = TRUE; /* Win7 */ DestroyWindow(wnd3); + test_ShouldDeactivate = FALSE; sink_check_ok(&test_OnSetFocus,"OnSetFocus"); sink_check_ok(&test_OnPopContext,"OnPopContext"); } @@ -2077,6 +2197,8 @@ START_TEST(inputprocessor) { test_Register(); test_RegisterCategory(); + Sleep(2000); /* Win7 needs some time before the registrations become active */ + processPendingMessages(); test_EnumLanguageProfiles(); test_EnumInputProcessorInfo(); test_Enable(); From dcacccd06bb49b5f9d5dd7655e023ab1c4c61fd1 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 17:34:49 +0000 Subject: [PATCH 126/289] [DDK] * Update csq.h annotations. svn path=/trunk/; revision=55252 --- reactos/include/ddk/csq.h | 82 +++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/reactos/include/ddk/csq.h b/reactos/include/ddk/csq.h index 83bfa347f5e..d7b4a59e151 100644 --- a/reactos/include/ddk/csq.h +++ b/reactos/include/ddk/csq.h @@ -112,8 +112,8 @@ typedef struct _IO_CSQ_IRP_CONTEXT { */ typedef VOID (NTAPI IO_CSQ_INSERT_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp); typedef IO_CSQ_INSERT_IRP *PIO_CSQ_INSERT_IRP; /* @@ -130,8 +130,8 @@ typedef IO_CSQ_INSERT_IRP *PIO_CSQ_INSERT_IRP; */ typedef VOID (NTAPI IO_CSQ_REMOVE_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp); typedef IO_CSQ_REMOVE_IRP *PIO_CSQ_REMOVE_IRP; /* @@ -155,9 +155,9 @@ typedef IO_CSQ_REMOVE_IRP *PIO_CSQ_REMOVE_IRP; */ typedef PIRP (NTAPI IO_CSQ_PEEK_NEXT_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp, - IN PVOID PeekContext); + _In_ struct _IO_CSQ *Csq, + _In_opt_ PIRP Irp, + _In_opt_ PVOID PeekContext); typedef IO_CSQ_PEEK_NEXT_IRP *PIO_CSQ_PEEK_NEXT_IRP; /* @@ -175,8 +175,8 @@ typedef IO_CSQ_PEEK_NEXT_IRP *PIO_CSQ_PEEK_NEXT_IRP; */ typedef VOID (NTAPI IO_CSQ_ACQUIRE_LOCK)( - IN struct _IO_CSQ *Csq, - OUT PKIRQL Irql); + _In_ struct _IO_CSQ *Csq, + _Out_ PKIRQL Irql); typedef IO_CSQ_ACQUIRE_LOCK *PIO_CSQ_ACQUIRE_LOCK; /* @@ -191,8 +191,8 @@ typedef IO_CSQ_ACQUIRE_LOCK *PIO_CSQ_ACQUIRE_LOCK; */ typedef VOID (NTAPI IO_CSQ_RELEASE_LOCK)( - IN struct _IO_CSQ *Csq, - IN KIRQL Irql); + _In_ struct _IO_CSQ *Csq, + _In_ KIRQL Irql); typedef IO_CSQ_RELEASE_LOCK *PIO_CSQ_RELEASE_LOCK; /* @@ -212,8 +212,8 @@ typedef IO_CSQ_RELEASE_LOCK *PIO_CSQ_RELEASE_LOCK; */ typedef VOID (NTAPI IO_CSQ_COMPLETE_CANCELED_IRP)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp); typedef IO_CSQ_COMPLETE_CANCELED_IRP *PIO_CSQ_COMPLETE_CANCELED_IRP; /* @@ -253,9 +253,9 @@ typedef struct _IO_CSQ { */ typedef NTSTATUS (NTAPI IO_CSQ_INSERT_IRP_EX)( - IN struct _IO_CSQ *Csq, - IN PIRP Irp, - IN PVOID InsertContext); + _In_ struct _IO_CSQ *Csq, + _In_ PIRP Irp, + _In_ PVOID InsertContext); typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX; #endif /* IO_TYPE_CSQ_EX */ @@ -275,13 +275,13 @@ typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX; * there are no IRQL restrictions. */ NTKERNELAPI -NTSTATUS NTAPI IoCsqInitialize(PIO_CSQ Csq, - PIO_CSQ_INSERT_IRP CsqInsertIrp, - PIO_CSQ_REMOVE_IRP CsqRemoveIrp, - PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, - PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, - PIO_CSQ_RELEASE_LOCK CsqReleaseLock, - PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); +NTSTATUS NTAPI IoCsqInitialize(_In_ PIO_CSQ Csq, + _In_ PIO_CSQ_INSERT_IRP 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); /* * Same as above, except you provide a CsqInsertIrpEx routine instead of @@ -289,45 +289,45 @@ NTSTATUS NTAPI IoCsqInitialize(PIO_CSQ Csq, * information for use with the queue. */ NTKERNELAPI -NTSTATUS NTAPI IoCsqInitializeEx(PIO_CSQ Csq, - PIO_CSQ_INSERT_IRP_EX CsqInsertIrpEx, - PIO_CSQ_REMOVE_IRP CsqRemoveIrp, - PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp, - PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock, - PIO_CSQ_RELEASE_LOCK CsqReleaseLock, - PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp); +NTSTATUS NTAPI IoCsqInitializeEx(_In_ PIO_CSQ Csq, + _In_ PIO_CSQ_INSERT_IRP_EX CsqInsertIrpEx, + _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); /* * Insert an IRP into the queue */ NTKERNELAPI -VOID NTAPI IoCsqInsertIrp(PIO_CSQ Csq, - PIRP Irp, - PIO_CSQ_IRP_CONTEXT Context); +VOID NTAPI IoCsqInsertIrp(_In_ PIO_CSQ Csq, + _In_ PIRP Irp, + _In_opt_ PIO_CSQ_IRP_CONTEXT Context); /* * Insert an IRP into the queue, with special context maintained that * makes it easy to find IRPs in the queue */ NTKERNELAPI -NTSTATUS NTAPI IoCsqInsertIrpEx(PIO_CSQ Csq, - PIRP Irp, - PIO_CSQ_IRP_CONTEXT Context, - PVOID InsertContext); +NTSTATUS NTAPI IoCsqInsertIrpEx(_In_ PIO_CSQ Csq, + _In_ PIRP Irp, + _In_opt_ PIO_CSQ_IRP_CONTEXT Context, + _In_opt_ PVOID InsertContext); /* * Remove a particular IRP from the queue */ NTKERNELAPI -PIRP NTAPI IoCsqRemoveIrp(PIO_CSQ Csq, - PIO_CSQ_IRP_CONTEXT Context); +PIRP NTAPI IoCsqRemoveIrp(_In_ PIO_CSQ Csq, + _In_ PIO_CSQ_IRP_CONTEXT Context); /* * Remove the next IRP from the queue */ NTKERNELAPI -PIRP NTAPI IoCsqRemoveNextIrp(PIO_CSQ Csq, - PVOID PeekContext); +PIRP NTAPI IoCsqRemoveNextIrp(_In_ PIO_CSQ Csq, + _In_opt_ PVOID PeekContext); #ifdef __cplusplus } From 4365081a5aae9af17d0de2793823e9a84bb89d1a Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 27 Jan 2012 18:25:24 +0000 Subject: [PATCH 127/289] [ComCtl32] - Partial sync to wine 1.3.37 without the ComCtl32 diff applied. This fixes the hangs and the exceptions during testing. Researching DrawFocusRect issues. Please Developers, note any information for the diff other than what is posted on svn, also this is open to anyone to be synced. svn path=/trunk/; revision=55254 --- reactos/dll/win32/comctl32/CMakeLists.txt | 2 +- reactos/dll/win32/comctl32/comctl32.rbuild | 1 + reactos/dll/win32/comctl32/imagelist.c | 472 +++++++++++---------- reactos/dll/win32/comctl32/imagelist.h | 80 ---- reactos/dll/win32/comctl32/propsheet.c | 76 ++-- reactos/dll/win32/comctl32/status.c | 26 +- 6 files changed, 289 insertions(+), 368 deletions(-) delete mode 100644 reactos/dll/win32/comctl32/imagelist.h diff --git a/reactos/dll/win32/comctl32/CMakeLists.txt b/reactos/dll/win32/comctl32/CMakeLists.txt index 6f073bde8b2..ee594835a4c 100644 --- a/reactos/dll/win32/comctl32/CMakeLists.txt +++ b/reactos/dll/win32/comctl32/CMakeLists.txt @@ -56,7 +56,7 @@ list(APPEND SOURCE add_library(comctl32 SHARED ${SOURCE}) set_module_type(comctl32 win32dll UNICODE) -target_link_libraries(comctl32 uuid wine) +target_link_libraries(comctl32 uuid wine ${PSEH_LIB}) add_delay_importlibs(comctl32 winmm uxtheme) add_importlibs(comctl32 diff --git a/reactos/dll/win32/comctl32/comctl32.rbuild b/reactos/dll/win32/comctl32/comctl32.rbuild index 62f5c14f13b..652832a7f71 100644 --- a/reactos/dll/win32/comctl32/comctl32.rbuild +++ b/reactos/dll/win32/comctl32/comctl32.rbuild @@ -57,5 +57,6 @@ winmm uxtheme ntdll + pseh diff --git a/reactos/dll/win32/comctl32/imagelist.c b/reactos/dll/win32/comctl32/imagelist.c index 66cd03d6eb4..ccc594f09f6 100644 --- a/reactos/dll/win32/comctl32/imagelist.c +++ b/reactos/dll/win32/comctl32/imagelist.c @@ -52,14 +52,63 @@ #include "commctrl.h" #include "comctl32.h" #include "commoncontrols.h" -#include "imagelist.h" #include "wine/debug.h" +#include "wine/exception.h" WINE_DEFAULT_DEBUG_CHANNEL(imagelist); - #define MAX_OVERLAYIMAGE 15 +struct _IMAGELIST +{ + const struct IImageListVtbl *lpVtbl; /* 00: IImageList vtable */ + + INT cCurImage; /* 04: ImageCount */ + INT cMaxImage; /* 08: maximages */ + INT cGrow; /* 0C: cGrow */ + INT cx; /* 10: cx */ + INT cy; /* 14: cy */ + DWORD x4; + UINT flags; /* 1C: flags */ + COLORREF clrFg; /* 20: foreground color */ + COLORREF clrBk; /* 24: background color */ + + + HBITMAP hbmImage; /* 28: images Bitmap */ + HBITMAP hbmMask; /* 2C: masks Bitmap */ + HDC hdcImage; /* 30: images MemDC */ + HDC hdcMask; /* 34: masks MemDC */ + INT nOvlIdx[MAX_OVERLAYIMAGE]; /* 38: overlay images index */ + + /* not yet found out */ + HBRUSH hbrBlend25; + HBRUSH hbrBlend50; + INT cInitial; + UINT uBitsPixel; + char *has_alpha; + + LONG ref; /* reference count */ +}; + +#define IMAGELIST_MAGIC 0x53414D58 + +/* Header used by ImageList_Read() and ImageList_Write() */ +#include "pshpack2.h" +typedef struct _ILHEAD +{ + USHORT usMagic; + USHORT usVersion; + WORD cCurImage; + WORD cMaxImage; + WORD cGrow; + WORD cx; + WORD cy; + COLORREF bkcolor; + WORD flags; + SHORT ovls[4]; +} ILHEAD; +#include "poppack.h" + /* internal image list data used for Drag & Drop operations */ typedef struct { @@ -113,6 +162,17 @@ static inline void imagelist_get_bitmap_size( HIMAGELIST himl, UINT count, SIZE sz->cy = imagelist_height( count ) * himl->cy; } +static inline int get_dib_stride( int width, int bpp ) +{ + return ((width * bpp + 31) >> 3) & ~3; +} + +static inline int get_dib_image_size( const BITMAPINFO *info ) +{ + return get_dib_stride( info->bmiHeader.biWidth, info->bmiHeader.biBitCount ) + * abs( info->bmiHeader.biHeight ); +} + /* * imagelist_copy_images() * @@ -138,6 +198,56 @@ static inline void imagelist_copy_images( HIMAGELIST himl, HDC hdcSrc, HDC hdcDe } } +static void add_dib_bits( HIMAGELIST himl, int pos, int count, int width, int height, + BITMAPINFO *info, BITMAPINFO *mask_info, DWORD *bits, BYTE *mask_bits ) +{ + int i, j, n; + POINT pt; + int stride = info->bmiHeader.biWidth; + int mask_stride = (info->bmiHeader.biWidth + 31) / 32 * 4; + + for (n = 0; n < count; n++) + { + int has_alpha = 0; + + imagelist_point_from_index( himl, pos + n, &pt ); + + /* check if bitmap has an alpha channel */ + for (i = 0; i < height && !has_alpha; i++) + for (j = n * width; j < (n + 1) * width; j++) + if ((has_alpha = ((bits[i * stride + j] & 0xff000000) != 0))) break; + + if (!has_alpha) /* generate alpha channel from the mask */ + { + for (i = 0; i < height; i++) + for (j = n * width; j < (n + 1) * width; j++) + if (!mask_info || !((mask_bits[i * mask_stride + j / 8] << (j % 8)) & 0x80)) + bits[i * stride + j] |= 0xff000000; + else + bits[i * stride + j] = 0; + } + else + { + himl->has_alpha[pos + n] = 1; + + if (mask_info && himl->hbmMask) /* generate the mask from the alpha channel */ + { + for (i = 0; i < height; i++) + for (j = n * width; j < (n + 1) * width; j++) + if ((bits[i * stride + j] >> 24) > 25) /* more than 10% alpha */ + mask_bits[i * mask_stride + j / 8] &= ~(0x80 >> (j % 8)); + else + mask_bits[i * mask_stride + j / 8] |= 0x80 >> (j % 8); + } + } + StretchDIBits( himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy, + n * width, 0, width, height, bits, info, DIB_RGB_COLORS, SRCCOPY ); + if (mask_info) + StretchDIBits( himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy, + n * width, 0, width, height, mask_bits, mask_info, DIB_RGB_COLORS, SRCCOPY ); + } +} + /* add images with an alpha channel when the image list is 32 bpp */ static BOOL add_with_alpha( HIMAGELIST himl, HDC hdc, int pos, int count, int width, int height, HBITMAP hbmImage, HBITMAP hbmMask ) @@ -147,8 +257,6 @@ static BOOL add_with_alpha( HIMAGELIST himl, HDC hdc, int pos, int count, BITMAPINFO *info, *mask_info = NULL; DWORD *bits = NULL; BYTE *mask_bits = NULL; - int i, j, n; - POINT pt; DWORD mask_width; if (!GetObjectW( hbmImage, sizeof(bm), &bm )) return FALSE; @@ -187,46 +295,7 @@ static BOOL add_with_alpha( HIMAGELIST himl, HDC hdc, int pos, int count, if (!GetDIBits( hdc, hbmMask, 0, height, mask_bits, mask_info, DIB_RGB_COLORS )) goto done; } - for (n = 0; n < count; n++) - { - int has_alpha = 0; - - imagelist_point_from_index( himl, pos + n, &pt ); - - /* check if bitmap has an alpha channel */ - for (i = 0; i < height && !has_alpha; i++) - for (j = n * width; j < (n + 1) * width; j++) - if ((has_alpha = ((bits[i * bm.bmWidth + j] & 0xff000000) != 0))) break; - - if (!has_alpha) /* generate alpha channel from the mask */ - { - for (i = 0; i < height; i++) - for (j = n * width; j < (n + 1) * width; j++) - if (!mask_bits || !((mask_bits[i * mask_width + j / 8] << (j % 8)) & 0x80)) - bits[i * bm.bmWidth + j] |= 0xff000000; - else - bits[i * bm.bmWidth + j] = 0; - } - else - { - himl->has_alpha[pos + n] = 1; - - if (mask_info && himl->hbmMask) /* generate the mask from the alpha channel */ - { - for (i = 0; i < height; i++) - for (j = n * width; j < (n + 1) * width; j++) - if ((bits[i * bm.bmWidth + j] >> 24) > 25) /* more than 10% alpha */ - mask_bits[i * mask_width + j / 8] &= ~(0x80 >> (j % 8)); - else - mask_bits[i * mask_width + j / 8] |= 0x80 >> (j % 8); - } - } - StretchDIBits( himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy, - n * width, 0, width, height, bits, info, DIB_RGB_COLORS, SRCCOPY ); - if (mask_info) - StretchDIBits( himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy, - n * width, 0, width, height, mask_bits, mask_info, DIB_RGB_COLORS, SRCCOPY ); - } + add_dib_bits( himl, pos, count, width, height, info, mask_info, bits, mask_bits ); ret = TRUE; done: @@ -474,8 +543,6 @@ ImageList_AddMasked (HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask) SetBkColor (hdcBitmap, bkColor); BitBlt (hdcMask, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcBitmap, 0, 0, SRCCOPY); - SetBkColor(hdcBitmap, RGB(255,255,255)); - /* * Remove the background from the image * @@ -489,7 +556,11 @@ ImageList_AddMasked (HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask) * * Blt mode 0x220326 is NOTSRCAND */ - BitBlt(hdcBitmap, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcMask, 0, 0, 0x220326); + if (bmp.bmBitsPixel > 8) /* NOTSRCAND can't work with palettes */ + { + SetBkColor(hdcBitmap, RGB(255,255,255)); + BitBlt(hdcBitmap, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcMask, 0, 0, 0x220326); + } DeleteDC(hdcBitmap); DeleteDC(hdcMask); @@ -700,7 +771,14 @@ ImageList_Create (INT cx, INT cy, UINT flags, if (FAILED(ImageListImpl_CreateInstance(NULL, &IID_IImageList, (void **)&himl))) return NULL; - cGrow = (cGrow < 4) ? 4 : (cGrow + 3) & ~3; + cGrow = (WORD)((max( cGrow, 1 ) + 3) & ~3); + + if (cGrow > 256) + { + /* Windows doesn't limit the size here, but X11 doesn't let us allocate such huge bitmaps */ + WARN( "grow %d too large, limiting to 256\n", cGrow ); + cGrow = 256; + } himl->cx = cx; himl->cy = cy; @@ -727,7 +805,10 @@ ImageList_Create (INT cx, INT cy, UINT flags, /* Default to ILC_COLOR4 if none of the ILC_COLOR* flags are specified */ if (ilc == ILC_COLOR) + { ilc = ILC_COLOR4; + himl->flags |= ILC_COLOR4; + } if (ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) himl->uBitsPixel = ilc; @@ -1225,6 +1306,14 @@ static BOOL alpha_blend_image( HIMAGELIST himl, HDC dest_dc, int dest_x, int des /* generate alpha channel from the mask */ info->bmiHeader.biBitCount = 1; info->bmiHeader.biSizeImage = width_bytes * cy; + info->bmiColors[0].rgbRed = 0; + info->bmiColors[0].rgbGreen = 0; + info->bmiColors[0].rgbBlue = 0; + info->bmiColors[0].rgbReserved = 0; + info->bmiColors[1].rgbRed = 0xff; + info->bmiColors[1].rgbGreen = 0xff; + info->bmiColors[1].rgbBlue = 0xff; + info->bmiColors[1].rgbReserved = 0; if (!(mask = CreateDIBSection( himl->hdcMask, info, DIB_RGB_COLORS, &mask_bits, 0, 0 ))) goto done; SelectObject( hdc, mask ); @@ -2060,66 +2149,24 @@ ImageList_Merge (HIMAGELIST himl1, INT i1, HIMAGELIST himl2, INT i2, } -/*********************************************************************** - * DIB_GetDIBWidthBytes - * - * Return the width of a DIB bitmap in bytes. DIB bitmap data is 32-bit aligned. - */ -static int DIB_GetDIBWidthBytes( int width, int depth ) -{ - int words; - - switch(depth) - { - case 1: words = (width + 31) / 32; break; - case 4: words = (width + 7) / 8; break; - case 8: words = (width + 3) / 4; break; - case 15: - case 16: words = (width + 1) / 2; break; - case 24: words = (width * 3 + 3)/4; break; - - default: - WARN("(%d): Unsupported depth\n", depth ); - /* fall through */ - case 32: - words = width; - break; - } - return 4 * words; -} - -/*********************************************************************** - * DIB_GetDIBImageBytes - * - * Return the number of bytes used to hold the image in a DIB bitmap. - */ -static int DIB_GetDIBImageBytes( int width, int height, int depth ) -{ - return DIB_GetDIBWidthBytes( width, depth ) * abs( height ); -} - - /* helper for ImageList_Read, see comments below */ -static BOOL _read_bitmap(HDC hdcIml, LPSTREAM pstm) +static void *read_bitmap(LPSTREAM pstm, BITMAPINFO *bmi) { BITMAPFILEHEADER bmfh; int bitsperpixel, palspace; - char bmi_buf[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256]; - LPBITMAPINFO bmi = (LPBITMAPINFO)bmi_buf; - int result = FALSE; - LPBYTE bits = NULL; + void *bits; if (FAILED(IStream_Read ( pstm, &bmfh, sizeof(bmfh), NULL))) - return FALSE; + return NULL; if (bmfh.bfType != (('M'<<8)|'B')) - return FALSE; + return NULL; if (FAILED(IStream_Read ( pstm, &bmi->bmiHeader, sizeof(bmi->bmiHeader), NULL))) - return FALSE; + return NULL; if ((bmi->bmiHeader.biSize != sizeof(bmi->bmiHeader))) - return FALSE; + return NULL; TRACE("width %u, height %u, planes %u, bpp %u\n", bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, @@ -2131,27 +2178,21 @@ static BOOL _read_bitmap(HDC hdcIml, LPSTREAM pstm) else palspace = 0; - bmi->bmiHeader.biSizeImage = DIB_GetDIBImageBytes(bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, bitsperpixel); + bmi->bmiHeader.biSizeImage = get_dib_image_size( bmi ); /* read the palette right after the end of the bitmapinfoheader */ if (palspace && FAILED(IStream_Read(pstm, bmi->bmiColors, palspace, NULL))) - goto error; + return NULL; bits = Alloc(bmi->bmiHeader.biSizeImage); - if (!bits) - goto error; + if (!bits) return NULL; + if (FAILED(IStream_Read(pstm, bits, bmi->bmiHeader.biSizeImage, NULL))) - goto error; - - if (!StretchDIBits(hdcIml, 0, 0, bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, - 0, 0, bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, - bits, bmi, DIB_RGB_COLORS, SRCCOPY)) - goto error; - result = TRUE; - -error: - Free(bits); - return result; + { + Free(bits); + return NULL; + } + return bits; } /************************************************************************* @@ -2187,6 +2228,11 @@ error: */ HIMAGELIST WINAPI ImageList_Read (LPSTREAM pstm) { + char image_buf[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256]; + char mask_buf[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256]; + BITMAPINFO *image_info = (BITMAPINFO *)image_buf; + BITMAPINFO *mask_info = (BITMAPINFO *)mask_buf; + void *image_bits, *mask_bits = NULL; ILHEAD ilHead; HIMAGELIST himl; int i; @@ -2207,19 +2253,56 @@ HIMAGELIST WINAPI ImageList_Read (LPSTREAM pstm) if (!himl) return NULL; - if (!_read_bitmap(himl->hdcImage, pstm)) + if (!(image_bits = read_bitmap(pstm, image_info))) { WARN("failed to read bitmap from stream\n"); return NULL; } if (ilHead.flags & ILC_MASK) { - if (!_read_bitmap(himl->hdcMask, pstm)) + if (!(mask_bits = read_bitmap(pstm, mask_info))) { WARN("failed to read mask bitmap from stream\n"); return NULL; } } + else mask_info = NULL; + + if (himl->has_alpha && image_info->bmiHeader.biBitCount == 32) + { + DWORD *ptr = image_bits; + BYTE *mask_ptr = mask_bits; + int stride = himl->cy * image_info->bmiHeader.biWidth; + + if (image_info->bmiHeader.biHeight > 0) /* bottom-up */ + { + ptr += image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride; + mask_ptr += (image_info->bmiHeader.biHeight * image_info->bmiHeader.biWidth - stride) / 8; + stride = -stride; + image_info->bmiHeader.biHeight = himl->cy; + } + else image_info->bmiHeader.biHeight = -himl->cy; + + for (i = 0; i < ilHead.cCurImage; i += TILE_COUNT) + { + add_dib_bits( himl, i, min( ilHead.cCurImage - i, TILE_COUNT ), + himl->cx, himl->cy, image_info, mask_info, ptr, mask_ptr ); + ptr += stride; + mask_ptr += stride / 8; + } + } + else + { + StretchDIBits( himl->hdcImage, 0, 0, image_info->bmiHeader.biWidth, image_info->bmiHeader.biHeight, + 0, 0, image_info->bmiHeader.biWidth, image_info->bmiHeader.biHeight, + image_bits, image_info, DIB_RGB_COLORS, SRCCOPY); + if (mask_info) + StretchDIBits( himl->hdcMask, 0, 0, mask_info->bmiHeader.biWidth, mask_info->bmiHeader.biHeight, + 0, 0, mask_info->bmiHeader.biWidth, mask_info->bmiHeader.biHeight, + mask_bits, mask_info, DIB_RGB_COLORS, SRCCOPY); + } + Free( image_bits ); + Free( mask_bits ); himl->cCurImage = ilHead.cCurImage; himl->cMaxImage = ilHead.cMaxImage; @@ -2276,7 +2359,7 @@ ImageList_Remove (HIMAGELIST himl, INT i) return TRUE; } - himl->cMaxImage = himl->cInitial + himl->cGrow - 1; + himl->cMaxImage = himl->cGrow; himl->cCurImage = 0; for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++) himl->nOvlIdx[nCount] = -1; @@ -2455,7 +2538,6 @@ done: INT WINAPI ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon) { - HDC hdcImage; HICON hBestFitIcon; ICONINFO ii; BITMAP bmp; @@ -2487,38 +2569,19 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon) if (!hBestFitIcon) return -1; - ret = GetIconInfo (hBestFitIcon, &ii); - if (!ret) { - DestroyIcon(hBestFitIcon); - return -1; - } - - ret = GetObjectW (ii.hbmMask, sizeof(BITMAP), &bmp); - if (!ret) { - ERR("couldn't get mask bitmap info\n"); - if (ii.hbmColor) - DeleteObject (ii.hbmColor); - if (ii.hbmMask) - DeleteObject (ii.hbmMask); - DestroyIcon(hBestFitIcon); - return -1; - } - if (nIndex == -1) { - if (himl->cCurImage + 1 > himl->cMaxImage) + if (himl->cCurImage + 1 >= himl->cMaxImage) IMAGELIST_InternalExpandBitmaps(himl, 1); nIndex = himl->cCurImage; himl->cCurImage++; } - hdcImage = CreateCompatibleDC (0); - TRACE("hdcImage=%p\n", hdcImage); - if (hdcImage == 0) - ERR("invalid hdcImage!\n"); - - if (himl->has_alpha) + if (himl->has_alpha && GetIconInfo (hBestFitIcon, &ii)) { + HDC hdcImage = CreateCompatibleDC( 0 ); + GetObjectW (ii.hbmMask, sizeof(BITMAP), &bmp); + if (!ii.hbmColor) { UINT height = bmp.bmHeight / 2; @@ -2530,48 +2593,38 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon) ret = add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, height, color, ii.hbmMask ); DeleteDC( hdcMask ); DeleteObject( color ); - if (ret) goto done; } - else if (add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, bmp.bmHeight, - ii.hbmColor, ii.hbmMask )) goto done; + else ret = add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, bmp.bmHeight, + ii.hbmColor, ii.hbmMask ); + + DeleteDC( hdcImage ); + DeleteObject (ii.hbmMask); + if (ii.hbmColor) DeleteObject (ii.hbmColor); + if (ret) goto done; } imagelist_point_from_index(himl, nIndex, &pt); - SetTextColor(himl->hdcImage, RGB(0,0,0)); - SetBkColor (himl->hdcImage, RGB(255,255,255)); - - if (ii.hbmColor) + if (himl->hbmMask) { - SelectObject (hdcImage, ii.hbmColor); - StretchBlt (himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy, - hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); - if (himl->hbmMask) - { - SelectObject (hdcImage, ii.hbmMask); - StretchBlt (himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy, - hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY); - } + DrawIconEx( himl->hdcImage, pt.x, pt.y, hBestFitIcon, himl->cx, himl->cy, 0, 0, DI_IMAGE ); + PatBlt( himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy, WHITENESS ); + DrawIconEx( himl->hdcMask, pt.x, pt.y, hBestFitIcon, himl->cx, himl->cy, 0, 0, DI_MASK ); } else { - UINT height = bmp.bmHeight / 2; - SelectObject (hdcImage, ii.hbmMask); - StretchBlt (himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy, - hdcImage, 0, height, bmp.bmWidth, height, SRCCOPY); - if (himl->hbmMask) - StretchBlt (himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy, - hdcImage, 0, 0, bmp.bmWidth, height, SRCCOPY); + COLORREF color = himl->clrBk != CLR_NONE ? himl->clrBk : comctl32_color.clrWindow; + HBRUSH brush = CreateSolidBrush( GetNearestColor( himl->hdcImage, color )); + + SelectObject( himl->hdcImage, brush ); + PatBlt( himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy, PATCOPY ); + SelectObject( himl->hdcImage, GetStockObject(BLACK_BRUSH) ); + DeleteObject( brush ); + DrawIconEx( himl->hdcImage, pt.x, pt.y, hBestFitIcon, himl->cx, himl->cy, 0, 0, DI_NORMAL ); } done: DestroyIcon(hBestFitIcon); - if (hdcImage) - DeleteDC (hdcImage); - if (ii.hbmColor) - DeleteObject (ii.hbmColor); - if (ii.hbmMask) - DeleteObject (ii.hbmMask); TRACE("Insert index = %d, himl->cCurImage = %d\n", nIndex, himl->cCurImage); return nIndex; @@ -2802,14 +2855,8 @@ ImageList_SetImageCount (HIMAGELIST himl, UINT iImageCount) if (!is_valid(himl)) return FALSE; - if (himl->cMaxImage > iImageCount) - { - himl->cCurImage = iImageCount; - /* TODO: shrink the bitmap when cMaxImage-cCurImage>cGrow ? */ - return TRUE; - } - nNewCount = iImageCount + himl->cGrow; + nNewCount = iImageCount + 1; nCopyCount = min(himl->cCurImage, iImageCount); hdcBitmap = CreateCompatibleDC (0); @@ -2920,11 +2967,11 @@ _write_bitmap(HBITMAP hBitmap, LPSTREAM pstm) if (!GetObjectW(hBitmap, sizeof(BITMAP), &bm)) return FALSE; - bitCount = bm.bmBitsPixel == 1 ? 1 : 24; - sizeImage = DIB_GetDIBImageBytes(bm.bmWidth, bm.bmHeight, bitCount); + bitCount = bm.bmBitsPixel; + sizeImage = get_dib_stride(bm.bmWidth, bitCount) * bm.bmHeight; totalSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); - if(bitCount != 24) + if(bitCount <= 8) totalSize += (1 << bitCount) * sizeof(RGBQUAD); offBits = totalSize; totalSize += sizeImage; @@ -2964,13 +3011,6 @@ _write_bitmap(HBITMAP hBitmap, LPSTREAM pstm) bmih->biWidth, bmih->biHeight, bmih->biPlanes, bmih->biBitCount); - if(bitCount == 1) { - /* Hack. */ - LPBITMAPINFO inf = (LPBITMAPINFO)bmih; - inf->bmiColors[0].rgbRed = inf->bmiColors[0].rgbGreen = inf->bmiColors[0].rgbBlue = 0; - inf->bmiColors[1].rgbRed = inf->bmiColors[1].rgbGreen = inf->bmiColors[1].rgbBlue = 0xff; - } - if(FAILED(IStream_Write(pstm, data, totalSize, NULL))) goto failed; @@ -3054,54 +3094,28 @@ static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count) if ((ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) || ilc == ILC_COLOR) { - VOID* bits; - BITMAPINFO *bmi; + char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )]; + BITMAPINFO *bmi = (BITMAPINFO *)buffer; TRACE("Creating DIBSection %d x %d, %d Bits per Pixel\n", sz.cx, sz.cy, himl->uBitsPixel); - if (himl->uBitsPixel <= ILC_COLOR8) - { - LPPALETTEENTRY pal; - ULONG i, colors; - BYTE temp; - - colors = 1 << himl->uBitsPixel; - bmi = Alloc(sizeof(BITMAPINFOHEADER) + - sizeof(PALETTEENTRY) * colors); - - pal = (LPPALETTEENTRY)bmi->bmiColors; - GetPaletteEntries(GetStockObject(DEFAULT_PALETTE), 0, colors, pal); - - /* Swap colors returned by GetPaletteEntries so we can use them for - * CreateDIBSection call. */ - for (i = 0; i < colors; i++) - { - temp = pal[i].peBlue; - bmi->bmiColors[i].rgbRed = pal[i].peRed; - bmi->bmiColors[i].rgbBlue = temp; - } - } - else - { - bmi = Alloc(sizeof(BITMAPINFOHEADER)); - } - + memset( buffer, 0, sizeof(buffer) ); bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi->bmiHeader.biWidth = sz.cx; bmi->bmiHeader.biHeight = sz.cy; bmi->bmiHeader.biPlanes = 1; bmi->bmiHeader.biBitCount = himl->uBitsPixel; bmi->bmiHeader.biCompression = BI_RGB; - bmi->bmiHeader.biSizeImage = 0; - bmi->bmiHeader.biXPelsPerMeter = 0; - bmi->bmiHeader.biYPelsPerMeter = 0; - bmi->bmiHeader.biClrUsed = 0; - bmi->bmiHeader.biClrImportant = 0; - hbmNewBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, &bits, 0, 0); - - Free (bmi); + if (himl->uBitsPixel <= ILC_COLOR8) + { + /* retrieve the default color map */ + HBITMAP tmp = CreateBitmap( 1, 1, 1, 1, NULL ); + GetDIBits( hdc, tmp, 0, 0, NULL, bmi, DIB_RGB_COLORS ); + DeleteObject( tmp ); + } + hbmNewBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, NULL, 0, 0); } else /*if (ilc == ILC_COLORDDB)*/ { @@ -3613,9 +3627,19 @@ static const IImageListVtbl ImageListImpl_Vtbl = { ImageListImpl_GetOverlayImage }; -static inline BOOL is_valid(HIMAGELIST himl) +static BOOL is_valid(HIMAGELIST himl) { - return himl && himl->lpVtbl == &ImageListImpl_Vtbl; + BOOL valid; + __TRY + { + valid = himl && himl->lpVtbl == &ImageListImpl_Vtbl; + } + __EXCEPT_PAGE_FAULT + { + valid = FALSE; + } + __ENDTRY + return valid; } /************************************************************************* diff --git a/reactos/dll/win32/comctl32/imagelist.h b/reactos/dll/win32/comctl32/imagelist.h deleted file mode 100644 index f6f1d1b9e71..00000000000 --- a/reactos/dll/win32/comctl32/imagelist.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * ImageList definitions - * - * Copyright 1998 Eric Kohl - * - * 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_IMAGELIST_H -#define __WINE_IMAGELIST_H - -#include - -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" - -struct _IMAGELIST -{ - const struct IImageListVtbl *lpVtbl; /* 00: IImageList vtable */ - - INT cCurImage; /* 04: ImageCount */ - INT cMaxImage; /* 08: maximages */ - INT cGrow; /* 0C: cGrow */ - INT cx; /* 10: cx */ - INT cy; /* 14: cy */ - DWORD x4; - UINT flags; /* 1C: flags */ - COLORREF clrFg; /* 20: foreground color */ - COLORREF clrBk; /* 24: background color */ - - - HBITMAP hbmImage; /* 28: images Bitmap */ - HBITMAP hbmMask; /* 2C: masks Bitmap */ - HDC hdcImage; /* 30: images MemDC */ - HDC hdcMask; /* 34: masks MemDC */ - INT nOvlIdx[15]; /* 38: overlay images index */ - - /* not yet found out */ - HBRUSH hbrBlend25; - HBRUSH hbrBlend50; - INT cInitial; - UINT uBitsPixel; - char *has_alpha; - - LONG ref; /* reference count */ -}; - -#define IMAGELIST_MAGIC 0x53414D58 - -/* Header used by ImageList_Read() and ImageList_Write() */ -#include "pshpack2.h" -typedef struct _ILHEAD -{ - USHORT usMagic; - USHORT usVersion; - WORD cCurImage; - WORD cMaxImage; - WORD cGrow; - WORD cx; - WORD cy; - COLORREF bkcolor; - WORD flags; - SHORT ovls[4]; -} ILHEAD; -#include "poppack.h" - -#endif /* __WINE_IMAGELIST_H */ diff --git a/reactos/dll/win32/comctl32/propsheet.c b/reactos/dll/win32/comctl32/propsheet.c index 2172a8507ad..6f620c6c973 100644 --- a/reactos/dll/win32/comctl32/propsheet.c +++ b/reactos/dll/win32/comctl32/propsheet.c @@ -543,7 +543,6 @@ static BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEW lppsp, /* Extract the caption */ psInfo->proppage[index].pszText = p; TRACE("Tab %d %s\n",index,debugstr_w( p )); - p += lstrlenW( p ) + 1; if (dwFlags & PSP_USETITLE) { @@ -2412,28 +2411,6 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg, return FALSE; } -BOOL CALLBACK -EnumChildProc(HWND hwnd, LPARAM lParam) -{ - WCHAR szType[20]; - RealGetWindowClassW(hwnd, szType, 20); - - if (strcmpW(szType, WC_EDITW) == 0) - { - if (IsWindowEnabled(hwnd) && IsWindowVisible(hwnd)) - { - SetFocus(hwnd); - return FALSE; - } - } - else - { - EnumChildWindows(hwnd, EnumChildProc, 0); - } - - return TRUE; -} - /****************************************************************************** * PROPSHEET_SetWizButtons * @@ -2455,6 +2432,17 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags) EnableWindow(hwndNext, FALSE); EnableWindow(hwndFinish, FALSE); + /* set the default pushbutton to an enabled button */ + if (((dwFlags & PSWIZB_FINISH) || psInfo->hasFinish) && !(dwFlags & PSWIZB_DISABLEDFINISH)) + SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0); + else if (dwFlags & PSWIZB_NEXT) + SendMessageW(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0); + else if (dwFlags & PSWIZB_BACK) + SendMessageW(hwndDlg, DM_SETDEFID, IDC_BACK_BUTTON, 0); + else + SendMessageW(hwndDlg, DM_SETDEFID, IDCANCEL, 0); + + if (dwFlags & PSWIZB_BACK) EnableWindow(hwndBack, TRUE); @@ -2484,31 +2472,6 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags) } else if (!(dwFlags & PSWIZB_DISABLEDFINISH)) EnableWindow(hwndFinish, TRUE); - - /* set the default pushbutton to an enabled button and give it focus */ - if (((dwFlags & PSWIZB_FINISH) || psInfo->hasFinish) && !(dwFlags & PSWIZB_DISABLEDFINISH)) - { - SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0); - SetFocus(hwndFinish); - } - else if (dwFlags & PSWIZB_NEXT) - { - SendMessageW(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0); - SetFocus(hwndNext); - } - else if (dwFlags & PSWIZB_BACK) - { - SendMessageW(hwndDlg, DM_SETDEFID, IDC_BACK_BUTTON, 0); - SetFocus(hwndBack); - } - else - { - SendMessageW(hwndDlg, DM_SETDEFID, IDCANCEL, 0); - SetFocus(GetDlgItem(hwndDlg, IDCANCEL)); - } - - /* Now try to find an edit control that deserves focus */ - EnumChildWindows(PropSheet_GetCurrentPageHwnd(hwndDlg), EnumChildProc, 0); } /****************************************************************************** @@ -3100,6 +3063,12 @@ BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage) if ((psp->dwFlags & PSP_USETITLE) && !IS_INTRESOURCE( psp->pszTitle )) Free ((LPVOID)psp->pszTitle); + if ((psp->dwFlags & PSP_USEHEADERTITLE) && !IS_INTRESOURCE( psp->pszHeaderTitle )) + Free ((LPVOID)psp->pszHeaderTitle); + + if ((psp->dwFlags & PSP_USEHEADERSUBTITLE) && !IS_INTRESOURCE( psp->pszHeaderSubTitle )) + Free ((LPVOID)psp->pszHeaderSubTitle); + Free(hPropPage); return TRUE; @@ -3238,17 +3207,20 @@ static LRESULT PROPSHEET_Paint(HWND hwnd, HDC hdcParam) WCHAR szBuffer[256]; int nLength; - if (psInfo->active_page < 0) return 1; hdc = hdcParam ? hdcParam : BeginPaint(hwnd, &ps); if (!hdc) return 1; hdcSrc = CreateCompatibleDC(0); - ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[psInfo->active_page].hpage; if (psInfo->ppshheader.dwFlags & PSH_USEHPLWATERMARK) hOldPal = SelectPalette(hdc, psInfo->ppshheader.hplWatermark, FALSE); - if ( (!(ppshpage->dwFlags & PSP_HIDEHEADER)) && + if (psInfo->active_page < 0) + ppshpage = NULL; + else + ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[psInfo->active_page].hpage; + + if ( (ppshpage && !(ppshpage->dwFlags & PSP_HIDEHEADER)) && (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) && (psInfo->ppshheader.dwFlags & PSH_HEADER) ) { @@ -3355,7 +3327,7 @@ static LRESULT PROPSHEET_Paint(HWND hwnd, HDC hdcParam) SelectObject(hdcSrc, hbmp); } - if ( (ppshpage->dwFlags & PSP_HIDEHEADER) && + if ( (ppshpage && (ppshpage->dwFlags & PSP_HIDEHEADER)) && (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) && (psInfo->ppshheader.dwFlags & PSH_WATERMARK) ) { diff --git a/reactos/dll/win32/comctl32/status.c b/reactos/dll/win32/comctl32/status.c index eeaf299f6b3..2830d615e84 100644 --- a/reactos/dll/win32/comctl32/status.c +++ b/reactos/dll/win32/comctl32/status.c @@ -52,6 +52,7 @@ #include "commctrl.h" #include "comctl32.h" #include "uxtheme.h" +//#include "vssym32.h" #include "tmschema.h" #include "wine/debug.h" @@ -207,6 +208,7 @@ STATUSBAR_DrawPart (const STATUS_INFO *infoPtr, HDC hdc, const STATUSWINDOWPART UINT border = BDR_SUNKENOUTER; HTHEME theme = GetWindowTheme (infoPtr->Self); int themePart = SP_PANE; + int x = 0; TRACE("part bound %s\n", wine_dbgstr_rect(&r)); if (part->style & SBT_POPOUT) @@ -224,6 +226,12 @@ STATUSBAR_DrawPart (const STATUS_INFO *infoPtr, HDC hdc, const STATUSWINDOWPART else DrawEdge(hdc, &r, border, BF_RECT|BF_ADJUST); + if (part->hIcon) { + INT cy = r.bottom - r.top; + DrawIconEx (hdc, r.left + 2, r.top, part->hIcon, cy, cy, 0, 0, DI_NORMAL); + x = 2 + cy; + } + if (part->style & SBT_OWNERDRAW) { DRAWITEMSTRUCT dis; @@ -233,15 +241,9 @@ STATUSBAR_DrawPart (const STATUS_INFO *infoPtr, HDC hdc, const STATUSWINDOWPART dis.hDC = hdc; dis.rcItem = r; dis.itemData = (ULONG_PTR)part->text; - SendMessageW (infoPtr->Notify, WM_DRAWITEM, dis.CtlID, (LPARAM)&dis); + SendMessageW (infoPtr->Notify, WM_DRAWITEM, dis.CtlID, (LPARAM)&dis); } else { - if (part->hIcon) { - INT cy = r.bottom - r.top; - - r.left += 2; - DrawIconEx (hdc, r.left, r.top, part->hIcon, cy, cy, 0, 0, DI_NORMAL); - r.left += cy; - } + r.left += x; DrawStatusTextW (hdc, &r, part->text, SBT_NOBORDERS); } } @@ -661,10 +663,12 @@ static BOOL STATUSBAR_SetParts (STATUS_INFO *infoPtr, INT count, LPINT parts) { STATUSWINDOWPART *tmp; - UINT i, oldNumParts; + INT i, oldNumParts; TRACE("(%d,%p)\n", count, parts); + if(!count) return FALSE; + oldNumParts = infoPtr->numParts; infoPtr->numParts = count; if (oldNumParts > infoPtr->numParts) { @@ -693,7 +697,7 @@ STATUSBAR_SetParts (STATUS_INFO *infoPtr, INT count, LPINT parts) infoPtr->parts[i].x = parts[i]; if (infoPtr->hwndToolTip) { - UINT nTipCount; + INT nTipCount; TTTOOLINFOW ti; ZeroMemory (&ti, sizeof(TTTOOLINFOW)); @@ -1281,7 +1285,7 @@ StatusWindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) return STATUSBAR_WMGetText (infoPtr, (INT)wParam, (LPWSTR)lParam); case WM_GETTEXTLENGTH: - return STATUSBAR_GetTextLength (infoPtr, 0); + return LOWORD(STATUSBAR_GetTextLength (infoPtr, 0)); case WM_LBUTTONDBLCLK: return STATUSBAR_SendMouseNotify(infoPtr, NM_DBLCLK, msg, wParam, lParam); From 04c708b1b0d62ae169f76db7fd84694d40fd9fc0 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 18:48:31 +0000 Subject: [PATCH 128/289] [MSTASK] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55257 --- reactos/dll/win32/mstask/factory.c | 17 ++++- reactos/dll/win32/mstask/mstask.inf | 16 ---- reactos/dll/win32/mstask/mstask.rgs | 17 +++++ reactos/dll/win32/mstask/mstask_main.c | 93 +---------------------- reactos/dll/win32/mstask/mstask_private.h | 41 ++-------- reactos/dll/win32/mstask/rsrc.rc | 21 +---- reactos/dll/win32/mstask/task.c | 58 +++++++++----- reactos/dll/win32/mstask/task_scheduler.c | 23 ++++-- reactos/dll/win32/mstask/task_trigger.c | 28 +++++-- reactos/media/doc/README.WINE | 2 +- 10 files changed, 118 insertions(+), 198 deletions(-) delete mode 100644 reactos/dll/win32/mstask/mstask.inf create mode 100644 reactos/dll/win32/mstask/mstask.rgs diff --git a/reactos/dll/win32/mstask/factory.c b/reactos/dll/win32/mstask/factory.c index 8906d922359..9dc1e2932db 100644 --- a/reactos/dll/win32/mstask/factory.c +++ b/reactos/dll/win32/mstask/factory.c @@ -21,12 +21,23 @@ WINE_DEFAULT_DEBUG_CHANNEL(mstask); +struct ClassFactoryImpl +{ + IClassFactory IClassFactory_iface; + LONG ref; +}; + +static inline ClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, ClassFactoryImpl, IClassFactory_iface); +} + static HRESULT WINAPI MSTASK_IClassFactory_QueryInterface( LPCLASSFACTORY iface, REFIID riid, LPVOID *ppvObj) { - ClassFactoryImpl *This = (ClassFactoryImpl *)iface; + ClassFactoryImpl *This = impl_from_IClassFactory(iface); TRACE("IID: %s\n",debugstr_guid(riid)); if (ppvObj == NULL) @@ -35,7 +46,7 @@ static HRESULT WINAPI MSTASK_IClassFactory_QueryInterface( if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IClassFactory)) { - *ppvObj = &This->lpVtbl; + *ppvObj = &This->IClassFactory_iface; IClassFactory_AddRef(iface); return S_OK; } @@ -105,4 +116,4 @@ static const IClassFactoryVtbl IClassFactory_Vtbl = MSTASK_IClassFactory_LockServer }; -ClassFactoryImpl MSTASK_ClassFactory = { &IClassFactory_Vtbl }; +ClassFactoryImpl MSTASK_ClassFactory = { { &IClassFactory_Vtbl } }; diff --git a/reactos/dll/win32/mstask/mstask.inf b/reactos/dll/win32/mstask/mstask.inf deleted file mode 100644 index 10560933fdf..00000000000 --- a/reactos/dll/win32/mstask/mstask.inf +++ /dev/null @@ -1,16 +0,0 @@ -[version] -Signature="$CHICAGO$" - -[RegisterDll] -AddReg=Classes.Reg - -[UnregisterDll] -DelReg=Classes.Reg - -[Classes.Reg] -HKCR,"CLSID\%CLSID_CTaskScheduler%",,,"CTaskScheduler" -HKCR,"CLSID\%CLSID_CTaskScheduler%\InProcServer32",,,"mstask.dll" -HKCR,"CLSID\%CLSID_CTaskScheduler%\InProcServer32","ThreadingModel",,"Both" -HKCR,"CLSID\%CLSID_CTask%",,,"CTask" -HKCR,"CLSID\%CLSID_CTask%\InProcServer32",,,"mstask.dll" -HKCR,"CLSID\%CLSID_CTask%\InProcServer32","ThreadingModel",,"Both" diff --git a/reactos/dll/win32/mstask/mstask.rgs b/reactos/dll/win32/mstask/mstask.rgs new file mode 100644 index 00000000000..f9532e7b3c4 --- /dev/null +++ b/reactos/dll/win32/mstask/mstask.rgs @@ -0,0 +1,17 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{148BD52A-A2AB-11CE-B11F-00AA00530503}' = s 'CTaskScheduler' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{148BD520-A2AB-11CE-B11F-00AA00530503}' = s 'CTask' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + } +} diff --git a/reactos/dll/win32/mstask/mstask_main.c b/reactos/dll/win32/mstask/mstask_main.c index df1f1d8c5e6..2a13bae6e75 100644 --- a/reactos/dll/win32/mstask/mstask_main.c +++ b/reactos/dll/win32/mstask/mstask_main.c @@ -19,8 +19,8 @@ #include #include "mstask_private.h" -#include "winreg.h" -#include "advpub.h" +#include "objbase.h" +#include "rpcproxy.h" #include "wine/debug.h" @@ -66,97 +66,12 @@ HRESULT WINAPI DllCanUnloadNow(void) return dll_ref != 0 ? S_FALSE : S_OK; } -static inline char *mstask_strdup(const char *s) -{ - size_t n = strlen(s) + 1; - char *d = HeapAlloc(GetProcessHeap(), 0, n); - return d ? memcpy(d, s, n) : NULL; -} - -static HRESULT init_register_strtable(STRTABLEA *strtable) -{ -#define CLSID_EXPANSION_ENTRY(id) { "CLSID_" #id, &CLSID_ ## id } - static const struct - { - const char *name; - const CLSID *clsid; - } - expns[] = - { - CLSID_EXPANSION_ENTRY(CTaskScheduler), - CLSID_EXPANSION_ENTRY(CTask) - }; -#undef CLSID_EXPANSION_ENTRY - static STRENTRYA pse[sizeof expns / sizeof expns[0]]; - unsigned int i; - - strtable->cEntries = sizeof pse / sizeof pse[0]; - strtable->pse = pse; - for (i = 0; i < strtable->cEntries; i++) - { - static const char dummy_sample[] = - "{12345678-1234-1234-1234-123456789012}"; - const CLSID *clsid = expns[i].clsid; - pse[i].pszName = mstask_strdup(expns[i].name); - pse[i].pszValue = HeapAlloc(GetProcessHeap(), 0, sizeof dummy_sample); - if (!pse[i].pszName || !pse[i].pszValue) - return E_OUTOFMEMORY; - sprintf(pse[i].pszValue, - "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", - clsid->Data1, clsid->Data2, clsid->Data3, clsid->Data4[0], - clsid->Data4[1], clsid->Data4[2], clsid->Data4[3], - clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], - clsid->Data4[7]); - } - - return S_OK; -} - -static void cleanup_register_strtable(STRTABLEA *strtable) -{ - unsigned int i; - for (i = 0; i < strtable->cEntries; i++) - { - HeapFree(GetProcessHeap(), 0, strtable->pse[i].pszName); - HeapFree(GetProcessHeap(), 0, strtable->pse[i].pszValue); - if (!strtable->pse[i].pszName || !strtable->pse[i].pszValue) - return; - } -} - -static HRESULT register_mstask(BOOL do_register) -{ - HRESULT hr; - STRTABLEA strtable; - HMODULE hAdvpack; - HRESULT (WINAPI *pRegInstall)(HMODULE hm, - LPCSTR pszSection, const STRTABLEA* pstTable); - static const WCHAR wszAdvpack[] = - {'a','d','v','p','a','c','k','.','d','l','l',0}; - - TRACE("(%x)\n", do_register); - - hAdvpack = LoadLibraryW(wszAdvpack); - pRegInstall = (void *)GetProcAddress(hAdvpack, "RegInstall"); - - hr = init_register_strtable(&strtable); - if (SUCCEEDED(hr)) - hr = pRegInstall(hInst, do_register ? "RegisterDll" : "UnregisterDll", - &strtable); - cleanup_register_strtable(&strtable); - - if (FAILED(hr)) - WINE_ERR("RegInstall failed: %08x\n", hr); - - return hr; -} - HRESULT WINAPI DllRegisterServer(void) { - return register_mstask(TRUE); + return __wine_register_resources( hInst ); } HRESULT WINAPI DllUnregisterServer(void) { - return register_mstask(FALSE); + return __wine_unregister_resources( hInst ); } diff --git a/reactos/dll/win32/mstask/mstask_private.h b/reactos/dll/win32/mstask/mstask_private.h index eb3ecf856f2..17c20fee432 100644 --- a/reactos/dll/win32/mstask/mstask_private.h +++ b/reactos/dll/win32/mstask/mstask_private.h @@ -29,42 +29,13 @@ #include "ole2.h" #include "mstask.h" -extern LONG dll_ref; +extern LONG dll_ref DECLSPEC_HIDDEN; -typedef struct -{ - const IClassFactoryVtbl *lpVtbl; - LONG ref; -} ClassFactoryImpl; -extern ClassFactoryImpl MSTASK_ClassFactory; +typedef struct ClassFactoryImpl ClassFactoryImpl; +extern ClassFactoryImpl MSTASK_ClassFactory DECLSPEC_HIDDEN; -typedef struct -{ - const ITaskTriggerVtbl *lpVtbl; - LONG ref; - TASK_TRIGGER triggerCond; -} TaskTriggerImpl; -extern HRESULT TaskTriggerConstructor(LPVOID *ppObj); - -typedef struct -{ - const ITaskSchedulerVtbl *lpVtbl; - LONG ref; -} TaskSchedulerImpl; -extern HRESULT TaskSchedulerConstructor(LPVOID *ppObj); - -typedef struct -{ - const ITaskVtbl *lpVtbl; - const IPersistFileVtbl *persistVtbl; - LONG ref; - LPWSTR taskName; - LPWSTR applicationName; - LPWSTR parameters; - LPWSTR comment; - DWORD maxRunTime; - LPWSTR accountName; -} TaskImpl; -extern HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj); +extern HRESULT TaskTriggerConstructor(LPVOID *ppObj) DECLSPEC_HIDDEN; +extern HRESULT TaskSchedulerConstructor(LPVOID *ppObj) DECLSPEC_HIDDEN; +extern HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj) DECLSPEC_HIDDEN; #endif /* __MSTASK_PRIVATE_H__ */ diff --git a/reactos/dll/win32/mstask/rsrc.rc b/reactos/dll/win32/mstask/rsrc.rc index 9915e028c48..8a22d31633f 100644 --- a/reactos/dll/win32/mstask/rsrc.rc +++ b/reactos/dll/win32/mstask/rsrc.rc @@ -1,20 +1 @@ -/* - * Copyright 2008 Google (Roy Shea) - * - * 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 - */ - -/* @makedep: mstask.inf */ -REGINST REGINST mstask.inf +1 WINE_REGISTRY mstask.rgs diff --git a/reactos/dll/win32/mstask/task.c b/reactos/dll/win32/mstask/task.c index 3815b19747f..97ae8b7b671 100644 --- a/reactos/dll/win32/mstask/task.c +++ b/reactos/dll/win32/mstask/task.c @@ -21,9 +21,27 @@ WINE_DEFAULT_DEBUG_CHANNEL(mstask); +typedef struct +{ + ITask ITask_iface; + IPersistFile IPersistFile_iface; + LONG ref; + LPWSTR taskName; + LPWSTR applicationName; + LPWSTR parameters; + LPWSTR comment; + DWORD maxRunTime; + LPWSTR accountName; +} TaskImpl; + +static inline TaskImpl *impl_from_ITask(ITask *iface) +{ + return CONTAINING_RECORD(iface, TaskImpl, ITask_iface); +} + static inline TaskImpl *impl_from_IPersistFile( IPersistFile *iface ) { - return (TaskImpl*) ((char*)(iface) - FIELD_OFFSET(TaskImpl, persistVtbl)); + return CONTAINING_RECORD(iface, TaskImpl, IPersistFile_iface); } static void TaskDestructor(TaskImpl *This) @@ -42,7 +60,7 @@ static HRESULT WINAPI MSTASK_ITask_QueryInterface( REFIID riid, void **ppvObject) { - TaskImpl * This = (TaskImpl *)iface; + TaskImpl * This = impl_from_ITask(iface); TRACE("IID: %s\n", debugstr_guid(riid)); if (ppvObject == NULL) @@ -51,13 +69,13 @@ static HRESULT WINAPI MSTASK_ITask_QueryInterface( if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ITask)) { - *ppvObject = &This->lpVtbl; + *ppvObject = &This->ITask_iface; ITask_AddRef(iface); return S_OK; } else if (IsEqualGUID(riid, &IID_IPersistFile)) { - *ppvObject = &This->persistVtbl; + *ppvObject = &This->IPersistFile_iface; ITask_AddRef(iface); return S_OK; } @@ -70,7 +88,7 @@ static HRESULT WINAPI MSTASK_ITask_QueryInterface( static ULONG WINAPI MSTASK_ITask_AddRef( ITask* iface) { - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); ULONG ref; TRACE("\n"); ref = InterlockedIncrement(&This->ref); @@ -80,7 +98,7 @@ static ULONG WINAPI MSTASK_ITask_AddRef( static ULONG WINAPI MSTASK_ITask_Release( ITask* iface) { - TaskImpl * This = (TaskImpl *)iface; + TaskImpl * This = impl_from_ITask(iface); ULONG ref; TRACE("\n"); ref = InterlockedDecrement(&This->ref); @@ -222,7 +240,7 @@ static HRESULT WINAPI MSTASK_ITask_SetComment( LPCWSTR pwszComment) { DWORD n; - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); LPWSTR tmp_comment; TRACE("(%p, %s)\n", iface, debugstr_w(pwszComment)); @@ -252,7 +270,7 @@ static HRESULT WINAPI MSTASK_ITask_GetComment( LPWSTR *ppwszComment) { DWORD n; - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); TRACE("(%p, %p)\n", iface, ppwszComment); @@ -357,7 +375,7 @@ static HRESULT WINAPI MSTASK_ITask_SetAccountInformation( LPCWSTR pwszPassword) { DWORD n; - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); LPWSTR tmp_account_name; TRACE("(%p, %s, %s): partial stub\n", iface, debugstr_w(pwszAccountName), @@ -381,7 +399,7 @@ static HRESULT WINAPI MSTASK_ITask_GetAccountInformation( LPWSTR *ppwszAccountName) { DWORD n; - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); TRACE("(%p, %p): partial stub\n", iface, ppwszAccountName); @@ -403,7 +421,7 @@ static HRESULT WINAPI MSTASK_ITask_SetApplicationName( LPCWSTR pwszApplicationName) { DWORD n; - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); LPWSTR tmp_name; TRACE("(%p, %s)\n", iface, debugstr_w(pwszApplicationName)); @@ -450,7 +468,7 @@ static HRESULT WINAPI MSTASK_ITask_GetApplicationName( LPWSTR *ppwszApplicationName) { DWORD n; - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); TRACE("(%p, %p)\n", iface, ppwszApplicationName); @@ -472,7 +490,7 @@ static HRESULT WINAPI MSTASK_ITask_SetParameters( LPCWSTR pwszParameters) { DWORD n; - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); LPWSTR tmp_parameters; TRACE("(%p, %s)\n", iface, debugstr_w(pwszParameters)); @@ -501,7 +519,7 @@ static HRESULT WINAPI MSTASK_ITask_GetParameters( LPWSTR *ppwszParameters) { DWORD n; - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); TRACE("(%p, %p)\n", iface, ppwszParameters); @@ -570,7 +588,7 @@ static HRESULT WINAPI MSTASK_ITask_SetMaxRunTime( ITask* iface, DWORD dwMaxRunTime) { - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); TRACE("(%p, %d)\n", iface, dwMaxRunTime); @@ -582,7 +600,7 @@ static HRESULT WINAPI MSTASK_ITask_GetMaxRunTime( ITask* iface, DWORD *pdwMaxRunTime) { - TaskImpl *This = (TaskImpl *)iface; + TaskImpl *This = impl_from_ITask(iface); TRACE("(%p, %p)\n", iface, pdwMaxRunTime); @@ -597,7 +615,7 @@ static HRESULT WINAPI MSTASK_IPersistFile_QueryInterface( { TaskImpl *This = impl_from_IPersistFile(iface); TRACE("(%p, %s, %p)\n", iface, debugstr_guid(riid), ppvObject); - return ITask_QueryInterface((ITask *) This, riid, ppvObject); + return ITask_QueryInterface(&This->ITask_iface, riid, ppvObject); } static ULONG WINAPI MSTASK_IPersistFile_AddRef( @@ -746,8 +764,8 @@ HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj) if (!This) return E_OUTOFMEMORY; - This->lpVtbl = &MSTASK_ITaskVtbl; - This->persistVtbl = &MSTASK_IPersistFileVtbl; + This->ITask_iface.lpVtbl = &MSTASK_ITaskVtbl; + This->IPersistFile_iface.lpVtbl = &MSTASK_IPersistFileVtbl; This->ref = 1; n = (lstrlenW(pwszTaskName) + 1) * sizeof(WCHAR); This->taskName = HeapAlloc(GetProcessHeap(), 0, n); @@ -765,7 +783,7 @@ HRESULT TaskConstructor(LPCWSTR pwszTaskName, LPVOID *ppObj) /* Default time is 3 days = 259200000 ms */ This->maxRunTime = 259200000; - *ppObj = &This->lpVtbl; + *ppObj = &This->ITask_iface; InterlockedIncrement(&dll_ref); return S_OK; } diff --git a/reactos/dll/win32/mstask/task_scheduler.c b/reactos/dll/win32/mstask/task_scheduler.c index 5efa0869b2e..1d2ac219cf8 100644 --- a/reactos/dll/win32/mstask/task_scheduler.c +++ b/reactos/dll/win32/mstask/task_scheduler.c @@ -22,6 +22,17 @@ WINE_DEFAULT_DEBUG_CHANNEL(mstask); +typedef struct +{ + ITaskScheduler ITaskScheduler_iface; + LONG ref; +} TaskSchedulerImpl; + +static inline TaskSchedulerImpl *impl_from_ITaskScheduler(ITaskScheduler *iface) +{ + return CONTAINING_RECORD(iface, TaskSchedulerImpl, ITaskScheduler_iface); +} + static void TaskSchedulerDestructor(TaskSchedulerImpl *This) { TRACE("%p\n", This); @@ -34,14 +45,14 @@ static HRESULT WINAPI MSTASK_ITaskScheduler_QueryInterface( REFIID riid, void **ppvObject) { - TaskSchedulerImpl * This = (TaskSchedulerImpl *)iface; + TaskSchedulerImpl * This = impl_from_ITaskScheduler(iface); TRACE("IID: %s\n", debugstr_guid(riid)); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ITaskScheduler)) { - *ppvObject = &This->lpVtbl; + *ppvObject = &This->ITaskScheduler_iface; ITaskScheduler_AddRef(iface); return S_OK; } @@ -53,7 +64,7 @@ static HRESULT WINAPI MSTASK_ITaskScheduler_QueryInterface( static ULONG WINAPI MSTASK_ITaskScheduler_AddRef( ITaskScheduler* iface) { - TaskSchedulerImpl *This = (TaskSchedulerImpl *)iface; + TaskSchedulerImpl *This = impl_from_ITaskScheduler(iface); TRACE("\n"); return InterlockedIncrement(&This->ref); } @@ -61,7 +72,7 @@ static ULONG WINAPI MSTASK_ITaskScheduler_AddRef( static ULONG WINAPI MSTASK_ITaskScheduler_Release( ITaskScheduler* iface) { - TaskSchedulerImpl * This = (TaskSchedulerImpl *)iface; + TaskSchedulerImpl * This = impl_from_ITaskScheduler(iface); ULONG ref; TRACE("\n"); ref = InterlockedDecrement(&This->ref); @@ -178,10 +189,10 @@ HRESULT TaskSchedulerConstructor(LPVOID *ppObj) if (!This) return E_OUTOFMEMORY; - This->lpVtbl = &MSTASK_ITaskSchedulerVtbl; + This->ITaskScheduler_iface.lpVtbl = &MSTASK_ITaskSchedulerVtbl; This->ref = 1; - *ppObj = &This->lpVtbl; + *ppObj = &This->ITaskScheduler_iface; InterlockedIncrement(&dll_ref); return S_OK; } diff --git a/reactos/dll/win32/mstask/task_trigger.c b/reactos/dll/win32/mstask/task_trigger.c index 3823ee79649..307a60540b5 100644 --- a/reactos/dll/win32/mstask/task_trigger.c +++ b/reactos/dll/win32/mstask/task_trigger.c @@ -23,12 +23,24 @@ WINE_DEFAULT_DEBUG_CHANNEL(mstask); +typedef struct +{ + ITaskTrigger ITaskTrigger_iface; + LONG ref; + TASK_TRIGGER triggerCond; +} TaskTriggerImpl; + +static inline TaskTriggerImpl *impl_from_ITaskTrigger(ITaskTrigger *iface) +{ + return CONTAINING_RECORD(iface, TaskTriggerImpl, ITaskTrigger_iface); +} + static HRESULT WINAPI MSTASK_ITaskTrigger_QueryInterface( ITaskTrigger* iface, REFIID riid, void **ppvObject) { - TaskTriggerImpl *This = (TaskTriggerImpl *)iface; + TaskTriggerImpl *This = impl_from_ITaskTrigger(iface); TRACE("IID: %s\n", debugstr_guid(riid)); if (ppvObject == NULL) @@ -37,7 +49,7 @@ static HRESULT WINAPI MSTASK_ITaskTrigger_QueryInterface( if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ITaskTrigger)) { - *ppvObject = &This->lpVtbl; + *ppvObject = &This->ITaskTrigger_iface; ITaskTrigger_AddRef(iface); return S_OK; } @@ -50,7 +62,7 @@ static HRESULT WINAPI MSTASK_ITaskTrigger_QueryInterface( static ULONG WINAPI MSTASK_ITaskTrigger_AddRef( ITaskTrigger* iface) { - TaskTriggerImpl *This = (TaskTriggerImpl *)iface; + TaskTriggerImpl *This = impl_from_ITaskTrigger(iface); ULONG ref; TRACE("\n"); ref = InterlockedIncrement(&This->ref); @@ -60,7 +72,7 @@ static ULONG WINAPI MSTASK_ITaskTrigger_AddRef( static ULONG WINAPI MSTASK_ITaskTrigger_Release( ITaskTrigger* iface) { - TaskTriggerImpl *This = (TaskTriggerImpl *)iface; + TaskTriggerImpl *This = impl_from_ITaskTrigger(iface); ULONG ref; TRACE("\n"); ref = InterlockedDecrement(&This->ref); @@ -76,7 +88,7 @@ static HRESULT WINAPI MSTASK_ITaskTrigger_SetTrigger( ITaskTrigger* iface, const PTASK_TRIGGER pTrigger) { - TaskTriggerImpl * This = (TaskTriggerImpl *)iface; + TaskTriggerImpl * This = impl_from_ITaskTrigger(iface); TIME_FIELDS field_time; LARGE_INTEGER sys_time; TASK_TRIGGER tmp_trigger_cond; @@ -187,7 +199,7 @@ static HRESULT WINAPI MSTASK_ITaskTrigger_GetTrigger( ITaskTrigger* iface, PTASK_TRIGGER pTrigger) { - TaskTriggerImpl * This = (TaskTriggerImpl *)iface; + TaskTriggerImpl * This = impl_from_ITaskTrigger(iface); TRACE("(%p, %p)\n", iface, pTrigger); @@ -274,7 +286,7 @@ HRESULT TaskTriggerConstructor(LPVOID *ppObj) if (!This) return E_OUTOFMEMORY; - This->lpVtbl = &MSTASK_ITaskTriggerVtbl; + This->ITaskTrigger_iface.lpVtbl = &MSTASK_ITaskTriggerVtbl; This->ref = 1; /* Most fields of triggerCond default to zero. Initialize other @@ -291,7 +303,7 @@ HRESULT TaskTriggerConstructor(LPVOID *ppObj) This->triggerCond.TriggerType = TASK_TIME_TRIGGER_DAILY, This->triggerCond.Type.Daily.DaysInterval = 1; - *ppObj = &This->lpVtbl; + *ppObj = &This->ITaskTrigger_iface; InterlockedIncrement(&dll_ref); return S_OK; } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index c0e1101a448..4d255369afb 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -110,7 +110,7 @@ reactos/dll/win32/msnet32 # Autosync reactos/dll/win32/msrle32 # Autosync reactos/dll/win32/mssign32 # Autosync reactos/dll/win32/mssip32 # Autosync -reactos/dll/win32/mstask # Autosync +reactos/dll/win32/mstask # Synced to Wine-1.3.37 reactos/dll/win32/msvcrt20 # Autosync reactos/dll/win32/msvfw32 # Autosync reactos/dll/win32/msvidc32 # Autosync From 7d0b56b9e1ec812aef5ccbe53f1678c078de6d7a Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 18:48:41 +0000 Subject: [PATCH 129/289] [MSTASK_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55258 --- rostests/winetests/mstask/task_trigger.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rostests/winetests/mstask/task_trigger.c b/rostests/winetests/mstask/task_trigger.c index 7f1c57799be..c64e1c535f1 100644 --- a/rostests/winetests/mstask/task_trigger.c +++ b/rostests/winetests/mstask/task_trigger.c @@ -224,6 +224,7 @@ static void test_SetTrigger_GetTrigger(void) memset(&trigger_state, 0xcf, sizeof(trigger_state)); trigger_state.cbTriggerSize = sizeof(trigger_state); hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + ok(hres == S_OK, "Expected S_OK: 0x%08x\n", hres); ok(trigger_state.Reserved1 == 0 && trigger_state.Reserved2 == 0, "Reserved fields should be set to zero\n"); normal_trigger_state.Reserved1 = 0; @@ -261,6 +262,7 @@ static void test_SetTrigger_GetTrigger(void) memset(&trigger_state, 0xcf, sizeof(trigger_state)); trigger_state.cbTriggerSize = sizeof(trigger_state); hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + ok(hres == S_OK, "Expected S_OK: 0x%08x\n", hres); ok(trigger_state.wEndYear == 0, "End year should be 0: %d\n", trigger_state.wEndYear); ok(trigger_state.wEndMonth == 200, "End month should be 200: %d\n", @@ -328,6 +330,7 @@ static void test_SetTrigger_GetTrigger(void) memset(&trigger_state, 0xcf, sizeof(trigger_state)); trigger_state.cbTriggerSize = sizeof(trigger_state); hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + ok(hres == S_OK, "Expected S_OK: 0x%08x\n", hres); ok(trigger_state.Type.Weekly.WeeksInterval == 0xcfcf, "Expected WeeksInterval set remain untouched: %d\n", trigger_state.Type.Weekly.WeeksInterval); @@ -337,6 +340,7 @@ static void test_SetTrigger_GetTrigger(void) normal_trigger_state.TriggerType = TASK_TIME_TRIGGER_DAILY; normal_trigger_state.Type.Daily.DaysInterval = 1; hres = ITaskTrigger_SetTrigger(test_trigger, &normal_trigger_state); + ok(hres == S_OK, "Expected S_OK: 0x%08x\n", hres); /* Test setting trigger with set wRandomMinutesInterval */ normal_trigger_state.wRandomMinutesInterval = 5; @@ -345,6 +349,7 @@ static void test_SetTrigger_GetTrigger(void) memset(&trigger_state, 0xcf, sizeof(trigger_state)); trigger_state.cbTriggerSize = sizeof(trigger_state); hres = ITaskTrigger_GetTrigger(test_trigger, &trigger_state); + ok(hres == S_OK, "Expected S_OK: 0x%08x\n", hres); ok(trigger_state.wRandomMinutesInterval == 0, "wRandomMinutesInterval should be set to zero\n"); normal_trigger_state.wRandomMinutesInterval = 0; From f6aa73bd075483dee0e99bb5c5e32fee7541db54 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 19:22:05 +0000 Subject: [PATCH 130/289] [COMCTL32] * Sync more of header.c with Wine 1.3.37. Fixes build. svn path=/trunk/; revision=55259 --- reactos/dll/win32/comctl32/header.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/reactos/dll/win32/comctl32/header.c b/reactos/dll/win32/comctl32/header.c index 603d0a33e08..c6d24aff54c 100644 --- a/reactos/dll/win32/comctl32/header.c +++ b/reactos/dll/win32/comctl32/header.c @@ -39,7 +39,6 @@ #include "winnls.h" #include "commctrl.h" #include "comctl32.h" -#include "imagelist.h" #include "tmschema.h" #include "uxtheme.h" #include "wine/debug.h" @@ -384,6 +383,7 @@ HEADER_DrawItem (HEADER_INFO *infoPtr, HDC hdc, INT iItem, BOOL bHotTrack, LRESU /* cnt,txt,img,bmp */ UINT cx, tx, ix, bx, cw, tw, iw, bw; + INT img_cx, img_cy; BITMAP bmp; HEADER_PrepareCallbackItems(infoPtr, iItem, HDI_TEXT|HDI_IMAGE); @@ -400,8 +400,8 @@ HEADER_DrawItem (HEADER_INFO *infoPtr, HDC hdc, INT iItem, BOOL bHotTrack, LRESU cw = textRect.right - textRect.left + 2 * infoPtr->iMargin; } - if ((phdi->fmt & HDF_IMAGE) && (infoPtr->himl)) { - iw = infoPtr->himl->cx + 2 * infoPtr->iMargin; + if ((phdi->fmt & HDF_IMAGE) && ImageList_GetIconSize( infoPtr->himl, &img_cx, &img_cy )) { + iw = img_cx + 2 * infoPtr->iMargin; x = &ix; w = &iw; } @@ -474,8 +474,8 @@ HEADER_DrawItem (HEADER_INFO *infoPtr, HDC hdc, INT iItem, BOOL bHotTrack, LRESU if (iw) { ImageList_DrawEx (infoPtr->himl, phdi->iImage, hClipDC, - ix, r.top + ((INT)rh - infoPtr->himl->cy) / 2, - infoPtr->himl->cx, infoPtr->himl->cy, CLR_DEFAULT, CLR_DEFAULT, 0); + ix, r.top + ((INT)rh - img_cy) / 2, + img_cx, img_cy, CLR_DEFAULT, CLR_DEFAULT, 0); } DeleteObject(hClipRgn); @@ -1539,9 +1539,6 @@ HEADER_NCDestroy (HEADER_INFO *infoPtr) Free(infoPtr->order); - if (infoPtr->himl) - ImageList_Destroy (infoPtr->himl); - SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0); Free (infoPtr); From 889ed6d3384dc63593416ccaac346a6c196642a4 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 20:21:06 +0000 Subject: [PATCH 131/289] [NDDEAPI] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55260 --- reactos/dll/win32/nddeapi/nddeapi.c | 305 ++++++++++++++++++++++++- reactos/dll/win32/nddeapi/nddeapi.spec | 53 ++--- reactos/media/doc/README.WINE | 2 +- 3 files changed, 329 insertions(+), 31 deletions(-) diff --git a/reactos/dll/win32/nddeapi/nddeapi.c b/reactos/dll/win32/nddeapi/nddeapi.c index 998a62886ff..84c636affb0 100644 --- a/reactos/dll/win32/nddeapi/nddeapi.c +++ b/reactos/dll/win32/nddeapi/nddeapi.c @@ -26,15 +26,228 @@ WINE_DEFAULT_DEBUG_CHANNEL(nddeapi); +/* Network DDE functionality was removed in Windows Vista, so the functions are silent stubs. + * Since the corresponding header is no longer available in the Windows SDK, a required definition + * is replicated here. */ +#define NDDE_NOT_IMPLEMENTED 14 + +/*********************************************************************** + * NDdeShareAddA (NDDEAPI.@) + * + */ +UINT WINAPI NDdeShareAddA(LPSTR lpszServer, UINT nLevel, PSECURITY_DESCRIPTOR pSD, + LPBYTE lpBuffer, DWORD cBufSize) +{ + TRACE("(%s, %u, %p, %p, %u)\n", debugstr_a(lpszServer), nLevel, pSD, lpBuffer, cBufSize); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeShareDelA (NDDEAPI.@) + * + */ +UINT WINAPI NDdeShareDelA(LPSTR lpszServer, LPSTR lpszShareName, UINT wReserved) +{ + TRACE("(%s, %s, %u)\n", debugstr_a(lpszServer), debugstr_a(lpszShareName), wReserved); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeShareEnumA (NDDEAPI.@) + * + */ +UINT WINAPI NDdeShareEnumA(LPSTR lpszServer, UINT nLevel, LPBYTE lpBuffer, DWORD cBufSize, + LPDWORD lpnEntriesRead, LPDWORD lpcbTotalAvailable) +{ + TRACE("(%s, %u, %p, %u, %p, %p)\n", debugstr_a(lpszServer), nLevel, lpBuffer, cBufSize, + lpnEntriesRead, lpcbTotalAvailable); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeShareGetInfoA (NDDEAPI.@) + * + */ +UINT WINAPI NDdeShareGetInfoA(LPSTR lpszServer, LPSTR lpszShareName, UINT nLevel, LPBYTE lpBuffer, + DWORD cBufSize, LPDWORD lpnTotalAvailable, LPWORD lpnItems) +{ + TRACE("(%s, %s, %u, %p, %u, %p, %p)\n", debugstr_a(lpszServer), debugstr_a(lpszShareName), nLevel, + lpBuffer, cBufSize, lpnTotalAvailable, lpnItems); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeShareSetInfoA (NDDEAPI.@) + * + */ +UINT WINAPI NDdeShareSetInfoA(LPSTR lpszServer, LPSTR lpszShareName, UINT nLevel, LPBYTE lpBuffer, + DWORD cBufSize, WORD sParmNum) +{ + TRACE("(%s, %s, %u, %p, %u, %u)\n", debugstr_a(lpszServer), debugstr_a(lpszShareName), nLevel, + lpBuffer, cBufSize, sParmNum); + + return NDDE_NOT_IMPLEMENTED; +} + /*********************************************************************** * NDdeGetErrorStringA (NDDEAPI.@) * */ UINT WINAPI NDdeGetErrorStringA(UINT uErrorCode, LPSTR lpszErrorString, DWORD cBufSize) { - FIXME("(%u, %s, %d): stub!\n",uErrorCode,debugstr_a(lpszErrorString), cBufSize); + TRACE("(%u, %p, %d)\n", uErrorCode, lpszErrorString, cBufSize); - return E_NOTIMPL; + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeIsValidShareNameA (NDDEAPI.@) + * + */ +BOOL WINAPI NDdeIsValidShareNameA(LPSTR shareName) +{ + TRACE("(%s)\n", debugstr_a(shareName)); + + return FALSE; +} + +/*********************************************************************** + * NDdeIsValidAppTopicListA (NDDEAPI.@) + * + */ +BOOL WINAPI NDdeIsValidAppTopicListA(LPSTR targetTopic) +{ + TRACE("(%s)\n", debugstr_a(targetTopic)); + + return FALSE; +} + +/*********************************************************************** + * NDdeGetShareSecurityA (NDDEAPI.@) + * + */ +UINT WINAPI NDdeGetShareSecurityA(LPSTR lpszServer, LPSTR lpszShareName, SECURITY_INFORMATION si, + PSECURITY_DESCRIPTOR pSD, DWORD cbSD, LPDWORD lpcbsdRequired) +{ + TRACE("(%s, %s, %u, %p, %u, %p)\n", debugstr_a(lpszServer), debugstr_a(lpszShareName), + si, pSD, cbSD, lpcbsdRequired); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeSetShareSecurityA (NDDEAPI.@) + * + */ +UINT WINAPI NDdeSetShareSecurityA(LPSTR lpszServer, LPSTR lpszShareName, SECURITY_INFORMATION si, + PSECURITY_DESCRIPTOR pSD) +{ + TRACE("(%s, %s, %u, %p)\n", debugstr_a(lpszServer), debugstr_a(lpszShareName), si, pSD); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeGetTrustedShareA (NDDEAPI.@) + * + */ +UINT WINAPI NDdeGetTrustedShareA(LPSTR lpszServer, LPSTR lpszShareName, LPDWORD lpdwTrustOptions, + LPDWORD lpdwShareModId0, LPDWORD lpdwShareModId1) +{ + TRACE("(%s, %s, %p, %p, %p)\n", debugstr_a(lpszServer), debugstr_a(lpszShareName), lpdwTrustOptions, + lpdwShareModId0, lpdwShareModId1); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeSetTrustedShareA (NDDEAPI.@) + * + */ +UINT WINAPI NDdeSetTrustedShareA(LPSTR lpszServer, LPSTR lpszShareName, DWORD dwTrustOptions) +{ + TRACE("(%s, %s, 0x%08x)\n", debugstr_a(lpszServer), debugstr_a(lpszShareName), dwTrustOptions); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeTrustedShareEnumA (NDDEAPI.@) + * + */ +UINT WINAPI NDdeTrustedShareEnumA(LPSTR lpszServer, UINT nLevel, LPBYTE lpBuffer, DWORD cBufSize, + LPDWORD lpnEntriesRead, LPDWORD lpcbTotalAvailable) +{ + TRACE("(%s, %u, %p, %u, %p, %p)\n", debugstr_a(lpszServer), nLevel, lpBuffer, cBufSize, + lpnEntriesRead, lpcbTotalAvailable); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeShareAddW (NDDEAPI.@) + * + */ +UINT WINAPI NDdeShareAddW(LPWSTR lpszServer, UINT nLevel, PSECURITY_DESCRIPTOR pSD, + LPBYTE lpBuffer, DWORD cBufSize) +{ + TRACE("(%s, %u, %p, %p, %u)\n", debugstr_w(lpszServer), nLevel, pSD, lpBuffer, cBufSize); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeShareDelW (NDDEAPI.@) + * + */ +UINT WINAPI NDdeShareDelW(LPWSTR lpszServer, LPWSTR lpszShareName, UINT wReserved) +{ + TRACE("(%s, %s, %u)\n", debugstr_w(lpszServer), debugstr_w(lpszShareName), wReserved); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeShareEnumW (NDDEAPI.@) + * + */ +UINT WINAPI NDdeShareEnumW(LPWSTR lpszServer, UINT nLevel, LPBYTE lpBuffer, DWORD cBufSize, + LPDWORD lpnEntriesRead, LPDWORD lpcbTotalAvailable) +{ + TRACE("(%s, %u, %p, %u, %p, %p)\n", debugstr_w(lpszServer), nLevel, lpBuffer, cBufSize, + lpnEntriesRead, lpcbTotalAvailable); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeShareGetInfoW (NDDEAPI.@) + * + */ +UINT WINAPI NDdeShareGetInfoW(LPWSTR lpszServer, LPWSTR lpszShareName, UINT nLevel, LPBYTE lpBuffer, + DWORD cBufSize, LPDWORD lpnTotalAvailable, LPWORD lpnItems) +{ + TRACE("(%s, %s, %u, %p, %u, %p, %p)\n", debugstr_w(lpszServer), debugstr_w(lpszShareName), nLevel, + lpBuffer, cBufSize, lpnTotalAvailable, lpnItems); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeShareSetInfoW (NDDEAPI.@) + * + */ +UINT WINAPI NDdeShareSetInfoW(LPWSTR lpszServer, LPWSTR lpszShareName, UINT nLevel, LPBYTE lpBuffer, + DWORD cBufSize, WORD sParmNum) +{ + TRACE("(%s, %s, %u, %p, %u, %u)\n", debugstr_w(lpszServer), debugstr_w(lpszShareName), nLevel, + lpBuffer, cBufSize, sParmNum); + + return NDDE_NOT_IMPLEMENTED; } /*********************************************************************** @@ -43,7 +256,91 @@ UINT WINAPI NDdeGetErrorStringA(UINT uErrorCode, LPSTR lpszErrorString, DWORD cB */ UINT WINAPI NDdeGetErrorStringW(UINT uErrorCode, LPWSTR lpszErrorString, DWORD cBufSize) { - FIXME("(%u, %s, %d): stub!\n",uErrorCode,debugstr_w(lpszErrorString), cBufSize); + FIXME("(%u, %p, %d): stub!\n", uErrorCode, lpszErrorString, cBufSize); - return E_NOTIMPL; + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeIsValidShareNameW (NDDEAPI.@) + * + */ +BOOL WINAPI NDdeIsValidShareNameW(LPWSTR shareName) +{ + TRACE("(%s)\n", debugstr_w(shareName)); + + return FALSE; +} + +/*********************************************************************** + * NDdeIsValidAppTopicListW (NDDEAPI.@) + * + */ +BOOL WINAPI NDdeIsValidAppTopicListW(LPWSTR targetTopic) +{ + TRACE("(%s)\n", debugstr_w(targetTopic)); + + return FALSE; +} + +/*********************************************************************** + * NDdeGetShareSecurityW (NDDEAPI.@) + * + */ +UINT WINAPI NDdeGetShareSecurityW(LPWSTR lpszServer, LPWSTR lpszShareName, SECURITY_INFORMATION si, + PSECURITY_DESCRIPTOR pSD, DWORD cbSD, LPDWORD lpcbsdRequired) +{ + TRACE("(%s, %s, %u, %p, %u, %p)\n", debugstr_w(lpszServer), debugstr_w(lpszShareName), + si, pSD, cbSD, lpcbsdRequired); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeSetShareSecurityW (NDDEAPI.@) + * + */ +UINT WINAPI NDdeSetShareSecurityW(LPWSTR lpszServer, LPWSTR lpszShareName, SECURITY_INFORMATION si, + PSECURITY_DESCRIPTOR pSD) +{ + TRACE("(%s, %s, %u, %p)\n", debugstr_w(lpszServer), debugstr_w(lpszShareName), si, pSD); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeGetTrustedShareW (NDDEAPI.@) + * + */ +UINT WINAPI NDdeGetTrustedShareW(LPWSTR lpszServer, LPWSTR lpszShareName, LPDWORD lpdwTrustOptions, + LPDWORD lpdwShareModId0, LPDWORD lpdwShareModId1) +{ + TRACE("(%s, %s, %p, %p, %p)\n", debugstr_w(lpszServer), debugstr_w(lpszShareName), lpdwTrustOptions, + lpdwShareModId0, lpdwShareModId1); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeSetTrustedShareW (NDDEAPI.@) + * + */ +UINT WINAPI NDdeSetTrustedShareW(LPWSTR lpszServer, LPWSTR lpszShareName, DWORD dwTrustOptions) +{ + TRACE("(%s, %s, 0x%08x)\n", debugstr_w(lpszServer), debugstr_w(lpszShareName), dwTrustOptions); + + return NDDE_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * NDdeTrustedShareEnumW (NDDEAPI.@) + * + */ +UINT WINAPI NDdeTrustedShareEnumW(LPWSTR lpszServer, UINT nLevel, LPBYTE lpBuffer, DWORD cBufSize, + LPDWORD lpnEntriesRead, LPDWORD lpcbTotalAvailable) +{ + TRACE("(%s, %u, %p, %u, %p, %p)\n", debugstr_w(lpszServer), nLevel, lpBuffer, cBufSize, + lpnEntriesRead, lpcbTotalAvailable); + + return NDDE_NOT_IMPLEMENTED; } diff --git a/reactos/dll/win32/nddeapi/nddeapi.spec b/reactos/dll/win32/nddeapi/nddeapi.spec index f839a55acd0..15cd3bd8c9c 100644 --- a/reactos/dll/win32/nddeapi/nddeapi.spec +++ b/reactos/dll/win32/nddeapi/nddeapi.spec @@ -1,28 +1,29 @@ -@ stdcall NDdeGetErrorStringA(long str long) -@ stdcall NDdeGetErrorStringW(long wstr long) -@ stub NDdeGetShareSecurityA -@ stub NDdeGetShareSecurityW -@ stub NDdeGetTrustedShareA -@ stub NDdeGetTrustedShareW -@ stub NDdeIsValidAppTopicListA -@ stub NDdeIsValidAppTopicListW -@ stub NDdeIsValidShareNameA -@ stub NDdeIsValidShareNameW -@ stub NDdeSetShareSecurityA -@ stub NDdeSetShareSecurityW -@ stub NDdeSetTrustedShareA -@ stub NDdeSetTrustedShareW -@ stub NDdeShareAddA -@ stub NDdeShareAddW -@ stub NDdeShareDelA -@ stub NDdeShareDelW -@ stub NDdeShareEnumA -@ stub NDdeShareEnumW -@ stub NDdeShareGetInfoA -@ stub NDdeShareGetInfoW -@ stub NDdeShareSetInfoA -@ stub NDdeShareSetInfoW +500 stdcall NDdeShareAddA(str long ptr ptr long) +501 stdcall NDdeShareDelA(str str long) +502 stdcall NDdeShareEnumA(str long ptr long ptr ptr) +503 stdcall NDdeShareGetInfoA(str str long ptr long ptr ptr) +504 stdcall NDdeShareSetInfoA(str str long ptr long long) +505 stdcall NDdeGetErrorStringA(long ptr long) +506 stdcall NDdeIsValidShareNameA(str) +507 stdcall NDdeIsValidAppTopicListA(str) +509 stdcall NDdeGetShareSecurityA(str str long ptr long ptr) +510 stdcall NDdeSetShareSecurityA(ptr ptr long ptr) +511 stdcall NDdeGetTrustedShareA(str str ptr ptr ptr) +512 stdcall NDdeSetTrustedShareA(str str long) +513 stdcall NDdeTrustedShareEnumA(str long ptr long ptr ptr) +600 stdcall NDdeShareAddW(wstr long ptr ptr long) +601 stdcall NDdeShareDelW(wstr wstr long) +602 stdcall NDdeShareEnumW(wstr long ptr long ptr ptr) +603 stdcall NDdeShareGetInfoW(wstr wstr long ptr long ptr ptr) +604 stdcall NDdeShareSetInfoW(wstr wstr long ptr long long) +605 stdcall NDdeGetErrorStringW(long wstr long) +606 stdcall NDdeIsValidShareNameW(wstr) +607 stdcall NDdeIsValidAppTopicListW(wstr) +609 stdcall NDdeGetShareSecurityW(wstr wstr long ptr long ptr) +610 stdcall NDdeSetShareSecurityW(ptr ptr long ptr) +611 stdcall NDdeGetTrustedShareW(wstr wstr ptr ptr ptr) +612 stdcall NDdeSetTrustedShareW(wstr wstr long) +613 stdcall NDdeTrustedShareEnumW(wstr long ptr long ptr ptr) + @ stub NDdeSpecialCommandA @ stub NDdeSpecialCommandW -@ stub NDdeTrustedShareEnumA -@ stub NDdeTrustedShareEnumW diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 4d255369afb..730ddf82c2c 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -115,7 +115,7 @@ reactos/dll/win32/msvcrt20 # Autosync reactos/dll/win32/msvfw32 # Autosync reactos/dll/win32/msvidc32 # Autosync reactos/dll/win32/msxml3 # Autosync -reactos/dll/win32/nddeapi # Autosync +reactos/dll/win32/nddeapi # Synced to Wine-1.3.37 reactos/dll/win32/netapi32 # Autosync reactos/dll/win32/ntdsapi # Autosync reactos/dll/win32/ntprint # Autosync From e70779e6933a213a5e18e54a314be8f2005648a7 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 21:09:57 +0000 Subject: [PATCH 132/289] [SDK/UUID] * Add atliface.idl for the MSVC build. Dedicated to Thomas. svn path=/trunk/; revision=55262 --- reactos/lib/sdk/uuid/CMakeLists.txt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/reactos/lib/sdk/uuid/CMakeLists.txt b/reactos/lib/sdk/uuid/CMakeLists.txt index ed842a4f3e4..87bc8244e91 100644 --- a/reactos/lib/sdk/uuid/CMakeLists.txt +++ b/reactos/lib/sdk/uuid/CMakeLists.txt @@ -174,11 +174,14 @@ list(APPEND IDL_SOURCES ctfutb.idl xmllite.idl) -if(NOT MSVC) - list(APPEND IDL_SOURCES - wbemcli.idl - wincodec.idl - wuapi.idl) +if(MSVC) + list(APPEND IDL_SOURCES + atliface.idl) +else() + list(APPEND IDL_SOURCES + wbemcli.idl + wincodec.idl + wuapi.idl) endif() foreach(IDL_FILE ${IDL_SOURCES}) From d07efed2e71acabf1436955fafd20621e4710646 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 27 Jan 2012 21:20:03 +0000 Subject: [PATCH 133/289] [USP10] - Fix MSVC build. Sent and applied upstream. svn path=/trunk/; revision=55263 --- reactos/dll/win32/usp10/shape.c | 45 +++++++++++++++------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/reactos/dll/win32/usp10/shape.c b/reactos/dll/win32/usp10/shape.c index 5f71d6cff19..a893f7e7eb2 100644 --- a/reactos/dll/win32/usp10/shape.c +++ b/reactos/dll/win32/usp10/shape.c @@ -357,9 +357,6 @@ static const char* required_khmer_features[] = NULL }; -static OPENTYPE_FEATURE_RECORD no_features[] = -{ }; - static OPENTYPE_FEATURE_RECORD ethiopic_features[] = { { MS_MAKE_TAG('c','c','m','p'), 1}, @@ -441,31 +438,31 @@ static const ScriptShapeData ShapingData[] = {{ standard_features, 2}, NULL, 0, NULL, NULL}, {{ khmer_features, 5}, required_khmer_features, 0, ContextualShape_Khmer, ShapeCharGlyphProp_Khmer}, {{ khmer_features, 5}, required_khmer_features, 0, ContextualShape_Khmer, ShapeCharGlyphProp_Khmer}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, {{ ethiopic_features, 4}, NULL, 0, NULL, NULL}, {{ ethiopic_features, 4}, NULL, 0, NULL, NULL}, {{ mongolian_features, 4}, NULL, 0, ContextualShape_Mongolian, NULL}, {{ mongolian_features, 4}, NULL, 0, ContextualShape_Mongolian, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, - {{ no_features, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, + {{ NULL, 0}, NULL, 0, NULL, NULL}, {{ hebrew_features, 1}, NULL, 0, NULL, NULL}, {{ latin_features, 2}, NULL, 0, NULL, NULL}, {{ thai_features, 1}, NULL, 0, NULL, ShapeCharGlyphProp_Thai}, From 6f457079476da4d5cf60e57c7b2edfbe685130f2 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 21:27:13 +0000 Subject: [PATCH 134/289] [DDK] * Update dmusicks.h annotations. svn path=/trunk/; revision=55264 --- reactos/include/ddk/dmusicks.h | 145 +++++++++++++++++---------------- 1 file changed, 73 insertions(+), 72 deletions(-) diff --git a/reactos/include/ddk/dmusicks.h b/reactos/include/ddk/dmusicks.h index c5586e44019..a2ccfb4f05f 100644 --- a/reactos/include/ddk/dmusicks.h +++ b/reactos/include/ddk/dmusicks.h @@ -46,15 +46,15 @@ DECLARE_INTERFACE_(IMasterClock,IUnknown) { DEFINE_ABSTRACT_UNKNOWN() STDMETHOD_(NTSTATUS,GetTime)( THIS_ - OUT REFERENCE_TIME *pTime + _Out_ REFERENCE_TIME *pTime ) PURE; }; typedef IMasterClock *PMASTERCLOCK; -#define IMP_IMasterClock \ - STDMETHODIMP_(NTSTATUS) GetTime( \ - OUT REFERENCE_TIME *pTime \ +#define IMP_IMasterClock \ + STDMETHODIMP_(NTSTATUS) GetTime( \ + _Out_ REFERENCE_TIME *pTime \ ) /* =============================================================== @@ -67,29 +67,29 @@ typedef IMasterClock *PMASTERCLOCK; struct IMXF; typedef struct IMXF *PMXF; -#define DEFINE_ABSTRACT_IMXF() \ - STDMETHOD_(NTSTATUS,SetState)(THIS_ \ - IN KSSTATE State \ - ) PURE; \ - STDMETHOD_(NTSTATUS,PutMessage)(THIS_ \ - IN PDMUS_KERNEL_EVENT pDMKEvt \ - ) PURE; \ - STDMETHOD_(NTSTATUS,ConnectOutput)(THIS_ \ - IN PMXF sinkMXF \ - ) PURE; \ - STDMETHOD_(NTSTATUS,DisconnectOutput)(THIS_ \ - IN PMXF sinkMXF \ +#define DEFINE_ABSTRACT_IMXF() \ + STDMETHOD_(NTSTATUS,SetState)(THIS_ \ + _In_ KSSTATE State \ + ) PURE; \ + STDMETHOD_(NTSTATUS,PutMessage)(THIS_ \ + _In_ PDMUS_KERNEL_EVENT pDMKEvt \ + ) PURE; \ + STDMETHOD_(NTSTATUS,ConnectOutput)(THIS_ \ + _In_ PMXF sinkMXF \ + ) PURE; \ + STDMETHOD_(NTSTATUS,DisconnectOutput)(THIS_ \ + _In_ PMXF sinkMXF \ ) PURE; -#define IMP_IMXF \ - STDMETHODIMP_(NTSTATUS) SetState ( \ - IN KSSTATE State); \ - STDMETHODIMP_(NTSTATUS) PutMessage (THIS_ \ - IN PDMUS_KERNEL_EVENT pDMKEvt); \ - STDMETHODIMP_(NTSTATUS) ConnectOutput (THIS_ \ - IN PMXF sinkMXF); \ - STDMETHODIMP_(NTSTATUS) DisconnectOutput (THIS_ \ - IN PMXF sinkMXF) +#define IMP_IMXF \ + STDMETHODIMP_(NTSTATUS) SetState ( \ + _In_ KSSTATE State); \ + STDMETHODIMP_(NTSTATUS) PutMessage (THIS_ \ + _In_ PDMUS_KERNEL_EVENT pDMKEvt); \ + STDMETHODIMP_(NTSTATUS) ConnectOutput (THIS_ \ + _In_ PMXF sinkMXF); \ + STDMETHODIMP_(NTSTATUS) DisconnectOutput (THIS_ \ + _In_ PMXF sinkMXF) DECLARE_INTERFACE_(IMXF,IUnknown) { DEFINE_ABSTRACT_UNKNOWN() @@ -118,32 +118,33 @@ DECLARE_INTERFACE_(IAllocatorMXF, IMXF) { DEFINE_ABSTRACT_IMXF() STDMETHOD_(NTSTATUS,GetMessage)(THIS_ - OUT PDMUS_KERNEL_EVENT *ppDMKEvt + _Out_ PDMUS_KERNEL_EVENT *ppDMKEvt ) PURE; STDMETHOD_(USHORT,GetBufferSize)(THIS) PURE; STDMETHOD_(NTSTATUS,GetBuffer)(THIS_ - OUT PBYTE *ppBuffer + _Outptr_result_bytebuffer_(_Inexpressible_(GetBufferSize bytes)) PBYTE *ppBuffer )PURE; STDMETHOD_(NTSTATUS,PutBuffer)(THIS_ - IN PBYTE pBuffer + _In_ PBYTE pBuffer ) PURE; }; -#define IMP_IAllocatorMXF \ - IMP_IMXF; \ - STDMETHODIMP_(NTSTATUS) GetMessage( \ - OUT PDMUS_KERNEL_EVENT *ppDMKEvt); \ - \ - STDMETHODIMP_(USHORT) GetBufferSize(void); \ - \ - STDMETHODIMP_(NTSTATUS) GetBuffer( \ - OUT PBYTE *ppBuffer); \ - \ - STDMETHODIMP_(NTSTATUS) PutBuffer( \ - IN PBYTE pBuffer) +#define IMP_IAllocatorMXF \ + IMP_IMXF; \ + STDMETHODIMP_(NTSTATUS) GetMessage( \ + _Out_ PDMUS_KERNEL_EVENT *ppDMKEvt); \ + \ + STDMETHODIMP_(USHORT) GetBufferSize(void); \ + \ + STDMETHODIMP_(NTSTATUS) GetBuffer( \ + _Outptr_result_bytebuffer_(_Inexpressible_(GetBufferSize bytes)) \ + PBYTE *ppBuffer); \ + \ + STDMETHODIMP_(NTSTATUS) PutBuffer( \ + _In_ PBYTE pBuffer) #undef INTERFACE #define INTERFACE IPortDMus @@ -157,11 +158,11 @@ DECLARE_INTERFACE_(IPortDMus, IPort) { DEFINE_ABSTRACT_PORT() STDMETHOD_(void,Notify)(THIS_ - IN PSERVICEGROUP ServiceGroup OPTIONAL + _In_opt_ PSERVICEGROUP ServiceGroup ) PURE; STDMETHOD_(void,RegisterServiceGroup)(THIS_ - IN PSERVICEGROUP ServiceGroup + _In_ PSERVICEGROUP ServiceGroup ) PURE; }; typedef IPortDMus *PPORTDMUS; @@ -169,10 +170,10 @@ typedef IPortDMus *PPORTDMUS; #define IMP_IPortDMus \ IMP_IPort; \ STDMETHODIMP_(void) Notify( \ - IN PSERVICEGROUP ServiceGroup OPTIONAL); \ + _In_opt_ PSERVICEGROUP ServiceGroup); \ \ STDMETHODIMP_(void) RegisterServiceGroup( \ - IN PSERVICEGROUP ServiceGroup) + _In_ PSERVICEGROUP ServiceGroup) #undef INTERFACE #define INTERFACE IMiniportDMus @@ -185,25 +186,25 @@ DECLARE_INTERFACE_(IMiniportDMus, IMiniport) { DEFINE_ABSTRACT_MINIPORT() STDMETHOD_(NTSTATUS,Init)(THIS_ - IN PUNKNOWN UnknownAdapter, - IN PRESOURCELIST ResourceList, - IN PPORTDMUS Port, - OUT PSERVICEGROUP *ServiceGroup + _In_opt_ PUNKNOWN UnknownAdapter, + _In_ PRESOURCELIST ResourceList, + _In_ PPORTDMUS Port, + _Out_ PSERVICEGROUP *ServiceGroup ) PURE; STDMETHOD_(void,Service)(THIS) PURE; STDMETHOD_(NTSTATUS,NewStream)(THIS_ - OUT PMXF *MXF, - IN PUNKNOWN OuterUnknown OPTIONAL, - IN POOL_TYPE PoolType, - IN ULONG PinID, - IN DMUS_STREAM_TYPE StreamType, - IN PKSDATAFORMAT DataFormat, - OUT PSERVICEGROUP *ServiceGroup, - IN PAllocatorMXF AllocatorMXF, - IN PMASTERCLOCK MasterClock, - OUT PULONGLONG SchedulePreFetch + _Out_ PMXF *MXF, + _In_opt_ PUNKNOWN OuterUnknown, + _In_ POOL_TYPE PoolType, + _In_ ULONG PinID, + _In_ DMUS_STREAM_TYPE StreamType, + _In_ PKSDATAFORMAT DataFormat, + _Out_ PSERVICEGROUP *ServiceGroup, + _In_ PAllocatorMXF AllocatorMXF, + _In_ PMASTERCLOCK MasterClock, + _Out_ PULONGLONG SchedulePreFetch ) PURE; }; @@ -213,24 +214,24 @@ typedef IMiniportDMus *PMINIPORTDMUS; #define IMP_IMiniportDMus \ IMP_IMiniport; \ STDMETHODIMP_(NTSTATUS) Init( \ - IN PUNKNOWN UnknownAdapter, \ - IN PRESOURCELIST ResourceList, \ - IN PPORTDMUS Port, \ - OUT PSERVICEGROUP *ServiceGroup); \ + _In_opt_ PUNKNOWN UnknownAdapter, \ + _In_ PRESOURCELIST ResourceList, \ + _In_ PPORTDMUS Port, \ + _Out_ PSERVICEGROUP *ServiceGroup); \ \ STDMETHODIMP_(void) Service(THIS); \ \ STDMETHODIMP_(NTSTATUS) NewStream( \ - OUT PMXF *MXF, \ - IN PUNKNOWN OuterUnknown, \ - IN POOL_TYPE PoolType, \ - IN ULONG PinID, \ - IN DMUS_STREAM_TYPE StreamType, \ - IN PKSDATAFORMAT DataFormat, \ - OUT PSERVICEGROUP *ServiceGroup, \ - IN PAllocatorMXF AllocatorMXF, \ - IN PMASTERCLOCK MasterClock, \ - OUT PULONGLONG SchedulePreFetch) + _Out_ PMXF *MXF, \ + _In_opt_ PUNKNOWN OuterUnknown, \ + _In_ POOL_TYPE PoolType, \ + _In_ ULONG PinID, \ + _In_ DMUS_STREAM_TYPE StreamType, \ + _In_ PKSDATAFORMAT DataFormat, \ + _Out_ PSERVICEGROUP *ServiceGroup, \ + _In_ PAllocatorMXF AllocatorMXF, \ + _In_ PMASTERCLOCK MasterClock, \ + _Out_ PULONGLONG SchedulePreFetch) #define STATIC_KSAUDFNAME_DMUSIC_MPU_OUT\ From cea69723581e04638b8a01636da03f454a163d44 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 22:24:01 +0000 Subject: [PATCH 135/289] [OBJSEL] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55267 --- reactos/dll/win32/objsel/CMakeLists.txt | 2 +- reactos/dll/win32/objsel/factory.c | 11 +- reactos/dll/win32/objsel/objsel.c | 36 +- reactos/dll/win32/objsel/objsel.rbuild | 1 - reactos/dll/win32/objsel/objsel.rc | 2 + reactos/dll/win32/objsel/objsel.rgs | 13 + reactos/dll/win32/objsel/objsel_classes.idl | 25 + reactos/dll/win32/objsel/objsel_private.h | 10 +- reactos/dll/win32/objsel/regsvr.c | 508 -------------------- reactos/media/doc/README.WINE | 2 +- 10 files changed, 85 insertions(+), 525 deletions(-) create mode 100644 reactos/dll/win32/objsel/objsel.rgs create mode 100644 reactos/dll/win32/objsel/objsel_classes.idl delete mode 100644 reactos/dll/win32/objsel/regsvr.c diff --git a/reactos/dll/win32/objsel/CMakeLists.txt b/reactos/dll/win32/objsel/CMakeLists.txt index 413a0dc47e3..7a57f53d328 100644 --- a/reactos/dll/win32/objsel/CMakeLists.txt +++ b/reactos/dll/win32/objsel/CMakeLists.txt @@ -6,12 +6,12 @@ add_definitions(-D_WIN32_WINNT=0x600) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +set_rc_compiler() spec2def(objsel.dll objsel.spec) list(APPEND SOURCE factory.c objsel.c - regsvr.c objsel.rc ${CMAKE_CURRENT_BINARY_DIR}/objsel.def) diff --git a/reactos/dll/win32/objsel/factory.c b/reactos/dll/win32/objsel/factory.c index 090c1266a42..cb0fb491cb4 100644 --- a/reactos/dll/win32/objsel/factory.c +++ b/reactos/dll/win32/objsel/factory.c @@ -26,6 +26,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(objsel); +static inline ClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, ClassFactoryImpl, IClassFactory_iface); +} + /********************************************************************** * OBJSEL_IClassFactory_QueryInterface (also IUnknown) */ @@ -60,7 +65,7 @@ static HRESULT WINAPI OBJSEL_IClassFactory_QueryInterface( */ static ULONG WINAPI OBJSEL_IClassFactory_AddRef(LPCLASSFACTORY iface) { - ClassFactoryImpl *This = (ClassFactoryImpl *)iface; + ClassFactoryImpl *This = impl_from_IClassFactory(iface); ULONG ref; TRACE("\n"); @@ -83,7 +88,7 @@ static ULONG WINAPI OBJSEL_IClassFactory_AddRef(LPCLASSFACTORY iface) */ static ULONG WINAPI OBJSEL_IClassFactory_Release(LPCLASSFACTORY iface) { - ClassFactoryImpl *This = (ClassFactoryImpl *)iface; + ClassFactoryImpl *This = impl_from_IClassFactory(iface); ULONG ref; TRACE("\n"); @@ -160,4 +165,4 @@ static IClassFactoryVtbl IClassFactory_Vtbl = * static ClassFactory instance */ -ClassFactoryImpl OBJSEL_ClassFactory = { &IClassFactory_Vtbl, 0 }; +ClassFactoryImpl OBJSEL_ClassFactory = { { &IClassFactory_Vtbl }, 0 }; diff --git a/reactos/dll/win32/objsel/objsel.c b/reactos/dll/win32/objsel/objsel.c index 8179ce5e583..83a845dc8eb 100644 --- a/reactos/dll/win32/objsel/objsel.c +++ b/reactos/dll/win32/objsel/objsel.c @@ -19,6 +19,7 @@ */ #include "objsel_private.h" +#include "rpcproxy.h" #include "wine/debug.h" @@ -53,7 +54,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) *ppv = NULL; if (IsEqualGUID(rclsid, &CLSID_DsObjectPicker)) - return IClassFactory_QueryInterface((IClassFactory*)&OBJSEL_ClassFactory, iid, ppv); + return IClassFactory_QueryInterface(&OBJSEL_ClassFactory.IClassFactory_iface, iid, ppv); FIXME("CLSID: %s, IID: %s\n", debugstr_guid(rclsid), debugstr_guid(iid)); return CLASS_E_CLASSNOTAVAILABLE; @@ -69,6 +70,24 @@ HRESULT WINAPI DllCanUnloadNow(void) } +/*********************************************************************** + * DllRegisterServer (OBJSEL.@) + */ +HRESULT WINAPI DllRegisterServer(void) +{ + return __wine_register_resources( hInstance ); +} + + +/*********************************************************************** + * DllUnregisterServer (OBJSEL.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( hInstance ); +} + + /********************************************************************** * OBJSEL_IDsObjectPicker_Destroy (also IUnknown) */ @@ -80,12 +99,17 @@ static VOID OBJSEL_IDsObjectPicker_Destroy(IDsObjectPickerImpl *This) } +static inline IDsObjectPickerImpl *impl_from_IDsObjectPicker(IDsObjectPicker *iface) +{ + return CONTAINING_RECORD(iface, IDsObjectPickerImpl, IDsObjectPicker_iface); +} + /********************************************************************** * OBJSEL_IDsObjectPicker_AddRef (also IUnknown) */ static ULONG WINAPI OBJSEL_IDsObjectPicker_AddRef(IDsObjectPicker * iface) { - IDsObjectPickerImpl *This = (IDsObjectPickerImpl *)iface; + IDsObjectPickerImpl *This = impl_from_IDsObjectPicker(iface); ULONG ref; TRACE("\n"); @@ -108,7 +132,7 @@ static ULONG WINAPI OBJSEL_IDsObjectPicker_AddRef(IDsObjectPicker * iface) */ static ULONG WINAPI OBJSEL_IDsObjectPicker_Release(IDsObjectPicker * iface) { - IDsObjectPickerImpl *This = (IDsObjectPickerImpl *)iface; + IDsObjectPickerImpl *This = impl_from_IDsObjectPicker(iface); ULONG ref; TRACE("\n"); @@ -200,9 +224,9 @@ HRESULT WINAPI OBJSEL_IDsObjectPicker_Create(LPVOID *ppvObj) sizeof(IDsObjectPickerImpl)); if (Instance != NULL) { - Instance->lpVtbl = &IDsObjectPicker_Vtbl; - OBJSEL_IDsObjectPicker_AddRef((IDsObjectPicker *)Instance); - + Instance->IDsObjectPicker_iface.lpVtbl = &IDsObjectPicker_Vtbl; + OBJSEL_IDsObjectPicker_AddRef(&Instance->IDsObjectPicker_iface); + *ppvObj = Instance; return S_OK; } diff --git a/reactos/dll/win32/objsel/objsel.rbuild b/reactos/dll/win32/objsel/objsel.rbuild index bec0a5b3260..21254087886 100644 --- a/reactos/dll/win32/objsel/objsel.rbuild +++ b/reactos/dll/win32/objsel/objsel.rbuild @@ -16,7 +16,6 @@ ntdll factory.c objsel.c - regsvr.c objsel.rc objsel_private.h diff --git a/reactos/dll/win32/objsel/objsel.rc b/reactos/dll/win32/objsel/objsel.rc index 304186809c8..fe6b5f0cf04 100644 --- a/reactos/dll/win32/objsel/objsel.rc +++ b/reactos/dll/win32/objsel/objsel.rc @@ -23,6 +23,8 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +1 WINE_REGISTRY objsel.rgs + #define WINE_FILENAME_STR "objsel.dll" #include "wine/wine_common_ver.rc" diff --git a/reactos/dll/win32/objsel/objsel.rgs b/reactos/dll/win32/objsel/objsel.rgs new file mode 100644 index 00000000000..df7357854ff --- /dev/null +++ b/reactos/dll/win32/objsel/objsel.rgs @@ -0,0 +1,13 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{17D6CCD8-3B7B-11D2-B9E0-00C04FD8DBF7}' = s 'DsObjectPicker' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + } +} diff --git a/reactos/dll/win32/objsel/objsel_classes.idl b/reactos/dll/win32/objsel/objsel_classes.idl new file mode 100644 index 00000000000..0bd05bbf9bb --- /dev/null +++ b/reactos/dll/win32/objsel/objsel_classes.idl @@ -0,0 +1,25 @@ +/* + * COM Classes for objsel + * + * Copyright 2010 Alexandre Julliard + * + * 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 + */ + +[ + threading(both), + uuid(17d6ccd8-3b7b-11d2-b9e0-00c04fd8dbf7) +] +coclass DsObjectPicker { interface IDsObjectPicker; } diff --git a/reactos/dll/win32/objsel/objsel_private.h b/reactos/dll/win32/objsel/objsel_private.h index 8c9a3c85ae4..f6e6baa0df1 100644 --- a/reactos/dll/win32/objsel/objsel_private.h +++ b/reactos/dll/win32/objsel/objsel_private.h @@ -42,23 +42,23 @@ * Dll lifetime tracking declaration for objsel.dll */ -extern LONG dll_refs; +extern LONG dll_refs DECLSPEC_HIDDEN; /********************************************************************** * ClassFactory declaration for objsel.dll */ typedef struct { - IClassFactoryVtbl *lpVtbl; + IClassFactory IClassFactory_iface; LONG ref; } ClassFactoryImpl; typedef struct { - IDsObjectPickerVtbl *lpVtbl; + IDsObjectPicker IDsObjectPicker_iface; LONG ref; } IDsObjectPickerImpl; -HRESULT WINAPI OBJSEL_IDsObjectPicker_Create(LPVOID *ppvObj); +HRESULT WINAPI OBJSEL_IDsObjectPicker_Create(LPVOID *ppvObj) DECLSPEC_HIDDEN; -extern ClassFactoryImpl OBJSEL_ClassFactory; +extern ClassFactoryImpl OBJSEL_ClassFactory DECLSPEC_HIDDEN; diff --git a/reactos/dll/win32/objsel/regsvr.c b/reactos/dll/win32/objsel/regsvr.c deleted file mode 100644 index 439b798fdc0..00000000000 --- a/reactos/dll/win32/objsel/regsvr.c +++ /dev/null @@ -1,508 +0,0 @@ -/* - * self-registerable dll functions for objsel.dll - * - * Copyright (C) 2004 Raphael Junqueira - * - * 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 -#include - -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "winreg.h" -#include "winerror.h" - -#include "objbase.h" -#include "unknwn.h" -#include "objsel.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -#include "initguid.h" - -WINE_DEFAULT_DEBUG_CHANNEL(objsel); - -/* - * Near the bottom of this file are the exported DllRegisterServer and - * DllUnregisterServer, which make all this worthwhile. - */ - -/*********************************************************************** - * interface for self-registering - */ -struct regsvr_interface { - IID const *iid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - IID const *base_iid; /* can be NULL to omit */ - int num_methods; /* can be <0 to omit */ - CLSID const *ps_clsid; /* can be NULL to omit */ - CLSID const *ps_clsid32; /* can be NULL to omit */ -}; - -static HRESULT register_interfaces(struct regsvr_interface const *list); -static HRESULT unregister_interfaces(struct regsvr_interface const *list); - -/** - * @todo: maybe adding typelibs support here - * [Software\\Classes\\CLSID\\{000C1090-0000-0000-C000-000000000046}\\TypeLib] 1080380217 - * @="{000C1092-0000-0000-C000-000000000046}" - */ -struct regsvr_coclass { - CLSID const *clsid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - LPCSTR iph32; /* can be NULL to omit */ - LPCSTR ips; /* can be NULL to omit */ - LPCSTR ips32; /* can be NULL to omit */ - LPCSTR ips32_tmodel; /* can be NULL to omit, if apartment, iph32 must be set */ - LPCSTR progid; /* can be NULL to omit */ - LPCSTR viprogid; /* can be NULL to omit */ - LPCSTR progid_extra; /* can be NULL to omit */ -}; - -static HRESULT register_coclasses(struct regsvr_coclass const *list); -static HRESULT unregister_coclasses(struct regsvr_coclass const *list); - -/*********************************************************************** - * static string constants - */ -static WCHAR const interface_keyname[10] = { - 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; -static WCHAR const base_ifa_keyname[14] = { - 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', - 'e', 0 }; -static WCHAR const num_methods_keyname[11] = { - 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; -static WCHAR const ps_clsid_keyname[15] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', 0 }; -static WCHAR const ps_clsid32_keyname[17] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', '3', '2', 0 }; -static WCHAR const clsid_keyname[6] = { - 'C', 'L', 'S', 'I', 'D', 0 }; -static WCHAR const curver_keyname[7] = { - 'C', 'u', 'r', 'V', 'e', 'r', 0 }; -static WCHAR const iph32_keyname[] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'H', 'a', 'n', 'd', 'l', 'e', 'r', - '3', '2', 0 }; -static WCHAR const ips_keyname[13] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static WCHAR const ips32_keyname[15] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static WCHAR const progid_keyname[7] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static WCHAR const viprogid_keyname[25] = { - 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p', - 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D', - 0 }; -static char const tmodel_valuename[] = "ThreadingModel"; - -/*********************************************************************** - * static helper functions - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); -static LONG register_key_defvalueW(HKEY base, WCHAR const *name, - WCHAR const *value); -static LONG register_key_defvalueA(HKEY base, WCHAR const *name, - char const *value); -static LONG register_progid(WCHAR const *clsid, - char const *progid, char const *curver_progid, - char const *name, char const *extra); - -/*********************************************************************** - * register_interfaces - */ -static HRESULT register_interfaces(struct regsvr_interface const *list) { - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - HKEY iid_key; - - StringFromGUID2(list->iid, buf, 39); - res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_interface_key; - - if (list->name) { - res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->base_iid) { - res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (0 <= list->num_methods) { - static WCHAR const fmt[3] = { '%', 'd', 0 }; - HKEY key; - - res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - - sprintfW(buf, fmt, list->num_methods); - res = RegSetValueExW(key, NULL, 0, REG_SZ, - (CONST BYTE*)buf, - (lstrlenW(buf) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid) { - res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid32) { - res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - error_close_iid_key: - RegCloseKey(iid_key); - } - -error_close_interface_key: - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_interfaces - */ -static HRESULT unregister_interfaces(struct regsvr_interface const *list) { - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, - KEY_READ | KEY_WRITE, &interface_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->iid, buf, 39); - res = RegDeleteTreeW(interface_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - } - - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * register_coclasses - */ -static HRESULT register_coclasses(struct regsvr_coclass const *list) { - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - HKEY clsid_key; - - StringFromGUID2(list->clsid, buf, 39); - res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->name) { - res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->iph32) { - HKEY iph32_key; - - res = RegCreateKeyExW(clsid_key, iph32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &iph32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(iph32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->iph32, - lstrlenA(list->iph32) + 1); - RegCloseKey(iph32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips) { - res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips32) { - HKEY ips32_key; - - res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &ips32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->ips32, - lstrlenA(list->ips32) + 1); - if (res == ERROR_SUCCESS && list->ips32_tmodel) - res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, - (CONST BYTE*)list->ips32_tmodel, - strlen(list->ips32_tmodel) + 1); - RegCloseKey(ips32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->progid) { - res = register_key_defvalueA(clsid_key, progid_keyname, - list->progid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->progid, NULL, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->viprogid) { - res = register_key_defvalueA(clsid_key, viprogid_keyname, - list->viprogid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->viprogid, list->progid, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - error_close_clsid_key: - RegCloseKey(clsid_key); - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_coclasses - */ -static HRESULT unregister_coclasses(struct regsvr_coclass const *list) { - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, - KEY_READ | KEY_WRITE, &coclass_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->clsid, buf, 39); - res = RegDeleteTreeW(coclass_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->progid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - - if (list->viprogid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * regsvr_key_guid - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) { - WCHAR buf[39]; - - StringFromGUID2(guid, buf, 39); - return register_key_defvalueW(base, name, buf); -} - -/*********************************************************************** - * regsvr_key_defvalueW - */ -static LONG register_key_defvalueW( - HKEY base, - WCHAR const *name, - WCHAR const *value) { - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - (lstrlenW(value) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_key_defvalueA - */ -static LONG register_key_defvalueA( - HKEY base, - WCHAR const *name, - char const *value) { - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - lstrlenA(value) + 1); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_progid - */ -static LONG register_progid( - WCHAR const *clsid, - char const *progid, - char const *curver_progid, - char const *name, - char const *extra) { - LONG res; - HKEY progid_key; - - res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &progid_key, NULL); - if (res != ERROR_SUCCESS) return res; - - if (name) { - res = RegSetValueExA(progid_key, NULL, 0, REG_SZ, - (CONST BYTE*)name, strlen(name) + 1); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (clsid) { - res = register_key_defvalueW(progid_key, clsid_keyname, clsid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (curver_progid) { - res = register_key_defvalueA(progid_key, curver_keyname, - curver_progid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (extra) { - HKEY extra_key; - - res = RegCreateKeyExA(progid_key, extra, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &extra_key, NULL); - if (res == ERROR_SUCCESS) - RegCloseKey(extra_key); - } - -error_close_progid_key: - RegCloseKey(progid_key); - return res; -} - -/*********************************************************************** - * coclass list - */ -static struct regsvr_coclass const coclass_list[] = { - { - &CLSID_DsObjectPicker, - "DsObjectPicker", - NULL, - NULL, - "objsel.dll", - "Both", - NULL, - NULL - }, - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * interface list - */ -static struct regsvr_interface const interface_list[] = { - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * DllRegisterServer - */ -HRESULT WINAPI DllRegisterServer(void) { - HRESULT hr; - - TRACE("\n"); - - hr = register_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = register_interfaces(interface_list); - return hr; -} - -/*********************************************************************** - * DllUnregisterServer - */ -HRESULT WINAPI DllUnregisterServer(void) { - HRESULT hr; - - TRACE("\n"); - - hr = unregister_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = unregister_interfaces(interface_list); - return hr; -} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 730ddf82c2c..8ce7cb5f4ff 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -119,7 +119,7 @@ reactos/dll/win32/nddeapi # Synced to Wine-1.3.37 reactos/dll/win32/netapi32 # Autosync reactos/dll/win32/ntdsapi # Autosync reactos/dll/win32/ntprint # Autosync -reactos/dll/win32/objsel # Autosync +reactos/dll/win32/objsel # Synced to Wine-1.3.37 reactos/dll/win32/odbc32 # Out of sync. Depends on port of Linux ODBC. reactos/dll/win32/odbccp32 # Autosync reactos/dll/win32/ole32 # Autosync From a56d039edf1cda80cd500320c70ed9112b8bc9e3 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 27 Jan 2012 23:08:50 +0000 Subject: [PATCH 136/289] [MSISIP] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55268 --- reactos/dll/win32/msisip/main.c | 34 +++++++++++++++++++-------------- reactos/media/doc/README.WINE | 2 +- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/reactos/dll/win32/msisip/main.c b/reactos/dll/win32/msisip/main.c index cea0398e91b..98a57437aad 100644 --- a/reactos/dll/win32/msisip/main.c +++ b/reactos/dll/win32/msisip/main.c @@ -24,6 +24,7 @@ #include "mssip.h" #define COBJMACROS #include "objbase.h" +#include "initguid.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(msisip); @@ -217,34 +218,39 @@ end: return ret; } +DEFINE_GUID(CLSID_MsiTransform, 0x000c1082,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); +DEFINE_GUID(CLSID_MsiDatabase, 0x000c1084,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); +DEFINE_GUID(CLSID_MsiPatch, 0x000c1086,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); + /*********************************************************************** * MsiSIPIsMyTypeOfFile (MSISIP.@) */ BOOL WINAPI MsiSIPIsMyTypeOfFile(WCHAR *name, GUID *subject) { - static const WCHAR msi[] = { '.','m','s','i',0 }; - static const WCHAR msp[] = { '.','m','s','p',0 }; BOOL ret = FALSE; + IStorage *stg = NULL; + HRESULT r; TRACE("(%s, %p)\n", debugstr_w(name), subject); - if (lstrlenW(name) < lstrlenW(msi)) - return FALSE; - else if (lstrcmpiW(name + lstrlenW(name) - lstrlenW(msi), msi) && - lstrcmpiW(name + lstrlenW(name) - lstrlenW(msp), msp)) - return FALSE; - else + r = StgOpenStorage(name, NULL, STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE, + NULL, 0, &stg); + if (SUCCEEDED(r)) { - IStorage *stg = NULL; - HRESULT r = StgOpenStorage(name, NULL, - STGM_DIRECT|STGM_READ|STGM_SHARE_DENY_WRITE, NULL, 0, &stg); + STATSTG stat; + r = IStorage_Stat(stg, &stat, STATFLAG_NONAME); if (SUCCEEDED(r)) { - IStorage_Release(stg); - *subject = mySubject; - ret = TRUE; + if (IsEqualGUID(&stat.clsid, &CLSID_MsiDatabase) || + IsEqualGUID(&stat.clsid, &CLSID_MsiPatch) || + IsEqualGUID(&stat.clsid, &CLSID_MsiTransform)) + { + ret = TRUE; + *subject = mySubject; + } } + IStorage_Release(stg); } return ret; } diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 8ce7cb5f4ff..ef7de752f1f 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -104,7 +104,7 @@ reactos/dll/win32/mshtml # Autosync reactos/dll/win32/msimg32 # Autosync reactos/dll/win32/msi # Autosync reactos/dll/win32/msimtf # Autosync -reactos/dll/win32/msisip # Autosync +reactos/dll/win32/msisip # Synced to Wine-1.3.37 reactos/dll/win32/msisys.ocx # Autosync reactos/dll/win32/msnet32 # Autosync reactos/dll/win32/msrle32 # Autosync From 2801c84858ed8662474ec0ad63c04f57fb7d24ad Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 10:29:40 +0000 Subject: [PATCH 137/289] [NTPRINT] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55270 --- reactos/dll/win32/ntprint/ntprint.c | 2 +- reactos/dll/win32/ntprint/ntprint.rc | 3 --- reactos/media/doc/README.WINE | 2 +- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/ntprint/ntprint.c b/reactos/dll/win32/ntprint/ntprint.c index e7779ba6b1b..b8166661854 100644 --- a/reactos/dll/win32/ntprint/ntprint.c +++ b/reactos/dll/win32/ntprint/ntprint.c @@ -36,7 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(ntprint); -HINSTANCE NTPRINT_hInstance = NULL; +static HINSTANCE NTPRINT_hInstance = NULL; typedef struct { LPMONITOR_INFO_2W mi2; /* Buffer for installed Monitors */ diff --git a/reactos/dll/win32/ntprint/ntprint.rc b/reactos/dll/win32/ntprint/ntprint.rc index ca56d3f093e..272f15159e6 100644 --- a/reactos/dll/win32/ntprint/ntprint.rc +++ b/reactos/dll/win32/ntprint/ntprint.rc @@ -19,9 +19,6 @@ * */ -#include "windef.h" -#include "winbase.h" -#include "winuser.h" #include "winver.h" #define WINE_FILENAME_STR "ntprint.dll" diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index ef7de752f1f..45572fd9fb8 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -118,7 +118,7 @@ reactos/dll/win32/msxml3 # Autosync reactos/dll/win32/nddeapi # Synced to Wine-1.3.37 reactos/dll/win32/netapi32 # Autosync reactos/dll/win32/ntdsapi # Autosync -reactos/dll/win32/ntprint # Autosync +reactos/dll/win32/ntprint # Synced to Wine-1.3.37 reactos/dll/win32/objsel # Synced to Wine-1.3.37 reactos/dll/win32/odbc32 # Out of sync. Depends on port of Linux ODBC. reactos/dll/win32/odbccp32 # Autosync From 140671d476272cc297960552599d752f93f235c8 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 10:29:55 +0000 Subject: [PATCH 138/289] [NTPRINT_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55271 --- rostests/winetests/ntprint/ntprint.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/rostests/winetests/ntprint/ntprint.c b/rostests/winetests/ntprint/ntprint.c index fca7b8d4848..cf9853d58de 100644 --- a/rostests/winetests/ntprint/ntprint.c +++ b/rostests/winetests/ntprint/ntprint.c @@ -214,14 +214,7 @@ static void test_PSetupEnumMonitor(VOID) START_TEST(ntprint) { - LPCSTR ptr; - - /* ntprint.dll does not exist on win9x */ - ptr = load_functions(); - if (ptr) { - skip("%s not found\n", ptr); - return; - } + load_functions(); test_PSetupCreateMonitorInfo(); test_PSetupDestroyMonitorInfo(); From 1b4f459fccb755c4b2943fd299a2ad18d82ecc94 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 11:58:18 +0000 Subject: [PATCH 139/289] [PSDK] * Import cor.idl, cordebug.idl and metahost.idl from Wine. * Remove the now unneeded cor.h. * Update corerror.h, corhdr.h, mscoree.idl and winsxs.idl from Wine. * Update the cmake and rbuild files to reflect the changes. svn path=/trunk/; revision=55272 --- reactos/include/psdk/CMakeLists.txt | 3 + reactos/include/psdk/cor.h | 43 -- reactos/include/psdk/cor.idl | 108 +++ reactos/include/psdk/cordebug.idl | 1041 +++++++++++++++++++++++++++ reactos/include/psdk/corerror.h | 149 ++-- reactos/include/psdk/corhdr.h | 72 ++ reactos/include/psdk/metahost.idl | 131 ++++ reactos/include/psdk/mscoree.idl | 14 + reactos/include/psdk/psdk.rbuild | 4 + reactos/include/psdk/winsxs.idl | 1 + 10 files changed, 1450 insertions(+), 116 deletions(-) delete mode 100644 reactos/include/psdk/cor.h create mode 100644 reactos/include/psdk/cor.idl create mode 100644 reactos/include/psdk/cordebug.idl create mode 100644 reactos/include/psdk/metahost.idl diff --git a/reactos/include/psdk/CMakeLists.txt b/reactos/include/psdk/CMakeLists.txt index e685e80d4f8..039460c9b2b 100644 --- a/reactos/include/psdk/CMakeLists.txt +++ b/reactos/include/psdk/CMakeLists.txt @@ -21,6 +21,8 @@ list(APPEND SOURCE comcat.idl commoncontrols.idl control.idl + cor.idl + cordebug.idl # crtrow.idl ctxtcall.idl # dbccmd.idl @@ -44,6 +46,7 @@ list(APPEND SOURCE imnact.idl imnxport.idl indexsrv.idl + metahost.idl mimeinfo.idl mimeole.idl mlang.idl diff --git a/reactos/include/psdk/cor.h b/reactos/include/psdk/cor.h deleted file mode 100644 index cdf89dd88ec..00000000000 --- a/reactos/include/psdk/cor.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2007 Francois Gouget - * - * 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_COR_H -#define __WINE_COR_H - -#include "ole2.h" -/* FIXME: #include "specstrings.h" */ -/* FIXME: #include "corerror.h" */ -/* FIXME: #include "corhdr.h" */ - -#ifdef __cplusplus -extern "C" { -#endif - -BOOL WINAPI _CorDllMain(HINSTANCE,DWORD,LPVOID); -__int32 WINAPI _CorExeMain(void); -__int32 WINAPI _CorExeMain2(PBYTE,DWORD,LPWSTR,LPWSTR,LPWSTR); -VOID WINAPI _CorImageUnloading(PVOID); -HRESULT WINAPI _CorValidateImage(PVOID*,LPCWSTR); -HRESULT WINAPI CoInitializeCor(DWORD); -void WINAPI CoUninitializeCor(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __WINE_COR_H */ diff --git a/reactos/include/psdk/cor.idl b/reactos/include/psdk/cor.idl new file mode 100644 index 00000000000..7c731d60c98 --- /dev/null +++ b/reactos/include/psdk/cor.idl @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2007 Francois Gouget + * + * 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 "propidl.idl"; + +cpp_quote("#include ") +/* FIXME: #include "specstrings.h" */ +cpp_quote("#include ") +cpp_quote("#include ") + +cpp_quote("DEFINE_GUID(CLSID_CorMetaDataDispenser, 0xe5cb7a31,0x7512,0x11d2,0x89,0xce,0x00,0x80,0xc7,0x92,0xe5,0xd8);") +cpp_quote("DEFINE_GUID(CLSID_CorMetaDataDispenserRuntime, 0x1ec2de53,0x75cc,0x11d2,0x97,0x75,0x00,0xa0,0xc9,0xb4,0xd5,0x0c);") + +[ + object, + local, + uuid(809c652e-7396-11d2-9771-00a0c9b4d50c) +] +interface IMetaDataDispenser : IUnknown +{ + HRESULT DefineScope( + [in] REFCLSID rclsid, + [in] DWORD dwCreateFlags, + [in] REFIID riid, + [out] IUnknown **ppIUnk); + + HRESULT OpenScope( + [in] LPCWSTR szScope, + [in] DWORD dwOpenFlags, + [in] REFIID riid, + [out] IUnknown **ppIUnk); + + HRESULT OpenScopeOnMemory( + [in] const void *pData, + [in] ULONG cbData, + [in] DWORD dwOpenFlags, + [in] REFIID riid, + [out] IUnknown **ppIUnk); +} + +[ + object, + local, + uuid(31bcfce2-dafb-11d2-9f81-00c04f79a0a3) +] +interface IMetaDataDispenserEx : IMetaDataDispenser +{ + HRESULT SetOption( + [in] REFGUID optionid, + [in] const VARIANT *value); + + HRESULT GetOption( + [in] REFGUID optionid, + [out] VARIANT *pvalue); + + HRESULT OpenScopeOnITypeInfo( + [in] ITypeInfo *pITI, + [in] DWORD dwOpenFlags, + [in] REFIID riid, + [out] IUnknown **ppIUnk); + + HRESULT GetCORSystemDirectory( + [out, size_is(cchBuffer)] LPWSTR szBuffer, + [in] DWORD cchBuffer, + [out] DWORD *pchBuffer); + + HRESULT FindAssembly( + [in] LPCWSTR szAppBase, + [in] LPCWSTR szPrivateBin, + [in] LPCWSTR szGlobalBin, + [in] LPCWSTR szAssemblyName, + [out, size_is(cchName)] LPWSTR szName, + [in] ULONG cchName, + [out] ULONG *pcName); + + HRESULT FindAssemblyModule( + [in] LPCWSTR szAppBase, + [in] LPCWSTR szPrivateBin, + [in] LPCWSTR szGlobalBin, + [in] LPCWSTR szAssemblyName, + [in] LPCWSTR szModuleName, + [out, size_is(cchName)] LPWSTR szName, + [in] ULONG cchName, + [out] ULONG *pcName); +} + +cpp_quote("BOOL WINAPI _CorDllMain(HINSTANCE,DWORD,LPVOID);") +cpp_quote("__int32 WINAPI _CorExeMain(void);") +cpp_quote("__int32 WINAPI _CorExeMain2(PBYTE,DWORD,LPWSTR,LPWSTR,LPWSTR);") +cpp_quote("VOID WINAPI _CorImageUnloading(PVOID);") +cpp_quote("HRESULT WINAPI _CorValidateImage(PVOID*,LPCWSTR);") +cpp_quote("HRESULT WINAPI CoInitializeCor(DWORD);") +cpp_quote("void WINAPI CoUninitializeCor(void);") diff --git a/reactos/include/psdk/cordebug.idl b/reactos/include/psdk/cordebug.idl new file mode 100644 index 00000000000..0488fd9c1b7 --- /dev/null +++ b/reactos/include/psdk/cordebug.idl @@ -0,0 +1,1041 @@ +/* + * Copyright (C) 2011 Alistair Leslie-Hughes + * + * 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 "unknwn.idl"; +import "objidl.idl"; + +cpp_quote("#ifdef WINE_NO_UNICODE_MACROS") +cpp_quote("#undef CreateProcess") +cpp_quote("#endif") + +interface ICorDebugAppDomain; +interface ICorDebugAppDomainEnum; +interface ICorDebugAssembly; +interface ICorDebugAssemblyEnum; +interface ICorDebugBreakpoint; +interface ICorDebugBreakpointEnum; +interface ICorDebugChain; +interface ICorDebugChainEnum; +interface ICorDebugClass; +interface ICorDebugCode; +interface ICorDebugContext; +interface ICorDebugEditAndContinueSnapshot; +interface ICorDebugEditAndContinueErrorInfo; +interface ICorDebugEnum; +interface ICorDebugErrorInfoEnum; +interface ICorDebugEval; +interface ICorDebugFrame; +interface ICorDebugFrameEnum; +interface ICorDebugFunction; +interface ICorDebugFunctionBreakpoint; +interface ICorDebugManagedCallback; +interface ICorDebugManagedCallback2; +interface ICorDebugMDA; +interface ICorDebugModule; +interface ICorDebugModuleBreakpoint; +interface ICorDebugModuleEnum; +interface ICorDebugObjectEnum; +interface ICorDebugObjectValue; +interface ICorDebugProcess; +interface ICorDebugProcessEnum; +interface ICorDebugRegisterSet; +interface ICorDebugStepper; +interface ICorDebugStepperEnum; +interface ICorDebugThreadEnum; +interface ICorDebugUnmanagedCallback; +interface ICorDebugValue; +interface ICorDebugValueBreakpoint; + + +typedef [wire_marshal(unsigned long)] void *HPROCESS; +typedef [wire_marshal(unsigned long)] void *HTHREAD; + +/* These are defined in corhrd.idl but used here. */ +cpp_quote("#if 0") + +typedef UINT32 mdToken; +typedef mdToken mdModule; +typedef SIZE_T mdScope; +typedef mdToken mdTypeDef; +typedef mdToken mdSourceFile; +typedef mdToken mdMemberRef; +typedef mdToken mdMethodDef; +typedef mdToken mdFieldDef; +typedef mdToken mdSignature; +typedef ULONG CorElementType; +typedef SIZE_T PCCOR_SIGNATURE; + +typedef SIZE_T LPDEBUG_EVENT; + +typedef SIZE_T LPSTARTUPINFOW; +typedef SIZE_T LPPROCESS_INFORMATION; + +cpp_quote("#endif") + +typedef ULONG64 CORDB_ADDRESS; +typedef ULONG64 CORDB_REGISTER; + +typedef UINT64 TASKID; +typedef DWORD CONNID; + + +cpp_quote("#ifndef _COR_IL_MAP") +cpp_quote("#define _COR_IL_MAP") + +typedef struct _COR_IL_MAP +{ + ULONG32 oldOffset; + ULONG32 newOffset; + BOOL fAccurate; +} COR_IL_MAP; + +cpp_quote("#endif /* _COR_IL_MAP */") + +cpp_quote("#ifndef _COR_DEBUG_IL_TO_NATIVE_MAP_") +cpp_quote("#define _COR_DEBUG_IL_TO_NATIVE_MAP_") + +typedef enum CorDebugIlToNativeMappingTypes +{ + NO_MAPPING = -1, + PROLOG = -2, + EPILOG = -3 +} CorDebugIlToNativeMappingTypes; + +typedef struct COR_DEBUG_IL_TO_NATIVE_MAP +{ + ULONG32 ilOffset; + ULONG32 nativeStartOffset; + ULONG32 nativeEndOffset; +} COR_DEBUG_IL_TO_NATIVE_MAP; + +cpp_quote("#endif /* _COR_DEBUG_IL_TO_NATIVE_MAP_ */") + + +typedef enum CorDebugThreadState +{ + THREAD_RUN, + THREAD_SUSPEND +} CorDebugThreadState; + +typedef enum CorDebugCreateProcessFlags +{ + DEBUG_NO_SPECIAL_OPTIONS = 0x0000 +} CorDebugCreateProcessFlags; + +[ + object, + local, + uuid(CC7BCAF7-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugValue : IUnknown +{ + HRESULT GetType([out] CorElementType *pType); + HRESULT GetSize([out] ULONG32 *pSize); + HRESULT GetAddress([out] CORDB_ADDRESS *pAddress); + HRESULT CreateBreakpoint([out] ICorDebugValueBreakpoint **ppBreakpoint); +}; + +[ + object, + local, + uuid(938c6d66-7fb6-4f69-b389-425b8987329b), + pointer_default(unique) +] +interface ICorDebugThread : IUnknown +{ + HRESULT GetProcess([out] ICorDebugProcess **ppProcess); + HRESULT GetID([out] DWORD *pdwThreadId); + HRESULT GetHandle([out] HTHREAD *phThreadHandle); + HRESULT GetAppDomain([out] ICorDebugAppDomain **ppAppDomain); + HRESULT SetDebugState([in] CorDebugThreadState state); + HRESULT GetDebugState([out] CorDebugThreadState *pState); + + typedef enum CorDebugUserState + { + USER_STOP_REQUESTED = 0x01, + USER_SUSPEND_REQUESTED = 0x02, + USER_BACKGROUND = 0x04, + USER_UNSTARTED = 0x08, + USER_STOPPED = 0x10, + USER_WAIT_SLEEP_JOIN = 0x20, + USER_SUSPENDED = 0x40, + + USER_UNSAFE_POINT = 0x80, + } CorDebugUserState; + + HRESULT GetUserState([out] CorDebugUserState *pState); + HRESULT GetCurrentException([out] ICorDebugValue **ppExceptionObject); + HRESULT ClearCurrentException(); + HRESULT CreateStepper([out] ICorDebugStepper **ppStepper); + HRESULT EnumerateChains([out] ICorDebugChainEnum **ppChains); + HRESULT GetActiveChain([out] ICorDebugChain **ppChain); + HRESULT GetActiveFrame([out] ICorDebugFrame **ppFrame); + HRESULT GetRegisterSet([out] ICorDebugRegisterSet **ppRegisters); + HRESULT CreateEval([out] ICorDebugEval **ppEval); + HRESULT GetObject([out] ICorDebugValue **ppObject); +}; + +[ + object, + local, + uuid(3d6f5f62-7538-11d3-8d5b-00104b35e7ef), + pointer_default(unique) +] + +interface ICorDebugController : IUnknown +{ + HRESULT Stop([in] DWORD dwTimeoutIgnored); + HRESULT Continue([in] BOOL fIsOutOfBand); + HRESULT IsRunning([out] BOOL *pbRunning); + HRESULT HasQueuedCallbacks([in] ICorDebugThread *pThread, + [out] BOOL *pbQueued); + HRESULT EnumerateThreads([out] ICorDebugThreadEnum **ppThreads); + HRESULT SetAllThreadsDebugState([in] CorDebugThreadState state, + [in] ICorDebugThread *pExceptThisThread); + HRESULT Detach(); + HRESULT Terminate([in] UINT exitCode); + HRESULT CanCommitChanges([in] ULONG cSnapshots, + [in] ICorDebugEditAndContinueSnapshot *pSnapshots[], + [out] ICorDebugErrorInfoEnum **pError); + HRESULT CommitChanges([in] ULONG cSnapshots, + [in] ICorDebugEditAndContinueSnapshot *pSnapshots[], + [out] ICorDebugErrorInfoEnum **pError); +}; + +[ + object, + local, + uuid(3d6f5f64-7538-11d3-8d5b-00104b35e7ef), + pointer_default(unique) +] +interface ICorDebugProcess : ICorDebugController +{ + HRESULT GetID([out] DWORD *pdwProcessId); + HRESULT GetHandle([out] HPROCESS *phProcessHandle); + HRESULT GetThread([in] DWORD dwThreadId, [out] ICorDebugThread **ppThread); + HRESULT EnumerateObjects([out] ICorDebugObjectEnum **ppObjects); + HRESULT IsTransitionStub([in] CORDB_ADDRESS address, [out] BOOL *pbTransitionStub); + HRESULT IsOSSuspended([in] DWORD threadID, [out] BOOL *pbSuspended); + HRESULT GetThreadContext([in] DWORD threadID, [in] ULONG32 contextSize, + [in, out] BYTE context[]); + HRESULT SetThreadContext([in] DWORD threadID, [in] ULONG32 contextSize, [in] BYTE context[]); + HRESULT ReadMemory([in] CORDB_ADDRESS address, [in] DWORD size, [out] BYTE buffer[], [out] SIZE_T *read); + HRESULT WriteMemory([in] CORDB_ADDRESS address, [in] DWORD size, [in] BYTE buffer[], [out] SIZE_T *written); + HRESULT ClearCurrentException([in] DWORD threadID); + HRESULT EnableLogMessages([in]BOOL fOnOff); + HRESULT ModifyLogSwitch([in] WCHAR *pLogSwitchName, + [in]LONG lLevel); + HRESULT EnumerateAppDomains([out] ICorDebugAppDomainEnum **ppAppDomains); + HRESULT GetObject([out] ICorDebugValue **ppObject); + HRESULT ThreadForFiberCookie([in] DWORD fiberCookie, [out] ICorDebugThread **ppThread); + HRESULT GetHelperThreadID([out] DWORD *pThreadID); +}; + +[ + object, + local, + uuid(3d6f5f63-7538-11d3-8d5b-00104b35e7ef), + pointer_default(unique) +] +interface ICorDebugAppDomain : ICorDebugController +{ + HRESULT GetProcess([out] ICorDebugProcess **ppProcess); + HRESULT EnumerateAssemblies([out] ICorDebugAssemblyEnum **ppAssemblies); + HRESULT GetModuleFromMetaDataInterface([in] IUnknown *pIMetaData, + [out] ICorDebugModule **ppModule); + HRESULT EnumerateBreakpoints([out] ICorDebugBreakpointEnum **ppBreakpoints); + HRESULT EnumerateSteppers([out] ICorDebugStepperEnum **ppSteppers); + HRESULT IsAttached([out] BOOL *pbAttached); + HRESULT GetName([in] ULONG32 cchName, [out] ULONG32 *pcchName, [out] WCHAR szName[]); + HRESULT GetObject([out] ICorDebugValue **ppObject); + HRESULT Attach(); + HRESULT GetID([out] ULONG32 *pId); +}; + +[ + object, + local, + uuid(3d6f5f60-7538-11d3-8d5b-00104b35e7ef), + pointer_default(unique) +] +interface ICorDebugManagedCallback : IUnknown +{ + HRESULT Breakpoint([in] ICorDebugAppDomain *pAppDomain, + [in] ICorDebugThread *pThread, + [in] ICorDebugBreakpoint *pBreakpoint); + + typedef enum CorDebugStepReason + { + STEP_NORMAL, + STEP_RETURN, + STEP_CALL, + STEP_EXCEPTION_FILTER, + STEP_EXCEPTION_HANDLER, + STEP_INTERCEPT, + STEP_EXIT + } CorDebugStepReason; + + HRESULT StepComplete([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread, + [in] ICorDebugStepper *pStepper, [in] CorDebugStepReason reason); + HRESULT Break([in] ICorDebugAppDomain *pAppDomain, + [in] ICorDebugThread *thread); + HRESULT Exception([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread, + [in] BOOL unhandled); + HRESULT EvalComplete([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread, + [in] ICorDebugEval *pEval); + HRESULT EvalException([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread, + [in] ICorDebugEval *pEval); + HRESULT CreateProcess([in] ICorDebugProcess *pProcess); + HRESULT ExitProcess([in] ICorDebugProcess *pProcess); + HRESULT CreateThread([in] ICorDebugAppDomain *pAppDomain,[in] ICorDebugThread *thread); + HRESULT ExitThread([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *thread); + HRESULT LoadModule([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugModule *pModule); + HRESULT UnloadModule([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugModule *pModule); + HRESULT LoadClass([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugClass *c); + HRESULT UnloadClass([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugClass *c); + HRESULT DebuggerError([in] ICorDebugProcess *pProcess, [in] HRESULT errorHR, + [in] DWORD errorCode); + + typedef enum LoggingLevelEnum + { + LTraceLevel0 = 0, + LTraceLevel1, + LTraceLevel2, + LTraceLevel3, + LTraceLevel4, + LStatusLevel0 = 20, + LStatusLevel1, + LStatusLevel2, + LStatusLevel3, + LStatusLevel4, + LWarningLevel = 40, + LErrorLevel = 50, + LPanicLevel = 100 + } LoggingLevelEnum; + + typedef enum LogSwitchCallReason + { + SWITCH_CREATE, + SWITCH_MODIFY, + SWITCH_DELETE + } LogSwitchCallReason; + + HRESULT LogMessage([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread, + [in] LONG lLevel, [in] WCHAR *pLogSwitchName, [in] WCHAR *pMessage); + HRESULT LogSwitch([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread, + [in] LONG lLevel, [in] ULONG ulReason, [in] WCHAR *pLogSwitchName, + [in] WCHAR *pParentName); + HRESULT CreateAppDomain([in] ICorDebugProcess *pProcess, [in] ICorDebugAppDomain *pAppDomain); + HRESULT ExitAppDomain([in] ICorDebugProcess *pProcess, [in] ICorDebugAppDomain *pAppDomain); + HRESULT LoadAssembly([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugAssembly *pAssembly); + HRESULT UnloadAssembly([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugAssembly *pAssembly); + HRESULT ControlCTrap([in] ICorDebugProcess *pProcess); + HRESULT NameChange([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread); + HRESULT UpdateModuleSymbols([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugModule *pModule, + [in] IStream *pSymbolStream); + HRESULT EditAndContinueRemap([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread, + [in] ICorDebugFunction *pFunction, [in] BOOL fAccurate); + + HRESULT BreakpointSetError([in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread, + [in] ICorDebugBreakpoint *pBreakpoint, [in] DWORD dwError); +}; + +[ + object, + local, + uuid(250E5EEA-DB5C-4C76-B6F3-8C46F12E3203), + pointer_default(unique) +] +interface ICorDebugManagedCallback2 : IUnknown +{ + HRESULT FunctionRemapOpportunity([in] ICorDebugAppDomain *pAppDomain, + [in] ICorDebugThread *pThread, [in] ICorDebugFunction *pOldFunction, + [in] ICorDebugFunction *pNewFunction, [in] ULONG32 oldILOffset); + + HRESULT CreateConnection([in] ICorDebugProcess *pProcess, [in] CONNID dwConnectionId, + [in] WCHAR *pConnName); + + HRESULT ChangeConnection([in] ICorDebugProcess *pProcess, [in] CONNID dwConnectionId ); + + HRESULT DestroyConnection([in] ICorDebugProcess *pProcess, [in] CONNID dwConnectionId ); + + + typedef enum CorDebugExceptionCallbackType + { + DEBUG_EXCEPTION_FIRST_CHANCE = 1, + DEBUG_EXCEPTION_USER_FIRST_CHANCE = 2, + DEBUG_EXCEPTION_CATCH_HANDLER_FOUND = 3, + DEBUG_EXCEPTION_UNHANDLED = 4 + } CorDebugExceptionCallbackType; + + typedef enum CorDebugExceptionFlags + { + DEBUG_EXCEPTION_CAN_BE_INTERCEPTED = 0x0001 + } CorDebugExceptionFlags; + + HRESULT Exception( [in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread, + [in] ICorDebugFrame *pFrame, [in] ULONG32 nOffset, + [in] CorDebugExceptionCallbackType dwEventType, [in] DWORD dwFlags ); + + typedef enum CorDebugExceptionUnwindCallbackType + { + DEBUG_EXCEPTION_UNWIND_BEGIN = 1, + DEBUG_EXCEPTION_INTERCEPTED = 2 + } CorDebugExceptionUnwindCallbackType; + + HRESULT ExceptionUnwind( [in] ICorDebugAppDomain *pAppDomain, [in] ICorDebugThread *pThread, + [in] CorDebugExceptionUnwindCallbackType dwEventType, + [in] DWORD dwFlags ); + + HRESULT FunctionRemapComplete([in] ICorDebugAppDomain *pAppDomain, + [in] ICorDebugThread *pThread, [in] ICorDebugFunction *pFunction); + + HRESULT MDANotification([in] ICorDebugController * pController, + [in] ICorDebugThread *pThread, [in] ICorDebugMDA * pMDA + ); + +}; +[ + object, + local, + uuid(3d6f5f61-7538-11d3-8d5b-00104b35e7ef), + pointer_default(unique) +] +interface ICorDebug : IUnknown +{ + HRESULT Initialize(); + HRESULT Terminate(); + HRESULT SetManagedHandler([in] ICorDebugManagedCallback *pCallback); + HRESULT SetUnmanagedHandler([in] ICorDebugUnmanagedCallback *pCallback); + HRESULT CreateProcess([in] LPCWSTR lpApplicationName, [in] LPWSTR lpCommandLine, + [in] LPSECURITY_ATTRIBUTES lpProcessAttributes, + [in] LPSECURITY_ATTRIBUTES lpThreadAttributes, + [in] BOOL bInheritHandles, [in] DWORD dwCreationFlags, + [in] PVOID lpEnvironment, [in] LPCWSTR lpCurrentDirectory, + [in] LPSTARTUPINFOW lpStartupInfo, + [in] LPPROCESS_INFORMATION lpProcessInformation, + [in] CorDebugCreateProcessFlags debuggingFlags, + [out] ICorDebugProcess **ppProcess); + + HRESULT DebugActiveProcess([in] DWORD id, [in] BOOL win32Attach, + [out] ICorDebugProcess **ppProcess); + HRESULT EnumerateProcesses([out] ICorDebugProcessEnum **ppProcess); + HRESULT GetProcess([in] DWORD dwProcessId, [out] ICorDebugProcess **ppProcess); + HRESULT CanLaunchOrAttach([in] DWORD dwProcessId, [in] BOOL win32DebuggingEnabled); +}; + + +[ + object, + local, + uuid(CC7BCAE8-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugBreakpoint : IUnknown +{ + HRESULT Activate([in] BOOL bActive); + HRESULT IsActive([out] BOOL *pbActive); +}; + +[ + object, + local, + uuid(CC7BCAE9-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugFunctionBreakpoint : ICorDebugBreakpoint +{ + HRESULT GetFunction([out] ICorDebugFunction **ppFunction); + HRESULT GetOffset([out] ULONG32 *pnOffset); +}; + +[ + object, + local, + uuid(CC7BCAEA-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugModuleBreakpoint : ICorDebugBreakpoint +{ + HRESULT GetModule([out] ICorDebugModule **ppModule); +}; + +[ + object, + local, + uuid(CC7BCAEB-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugValueBreakpoint : ICorDebugBreakpoint +{ + HRESULT GetValue([out] ICorDebugValue **ppValue); +}; + +[ + object, + local, + uuid(CC7BCAEC-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugStepper : IUnknown +{ + HRESULT IsActive([out] BOOL *pbActive); + HRESULT Deactivate(); + + typedef enum CorDebugIntercept + { + INTERCEPT_NONE = 0x0 , + INTERCEPT_CLASS_INIT = 0x01, + INTERCEPT_EXCEPTION_FILTER = 0x02, + INTERCEPT_SECURITY = 0x04, + INTERCEPT_CONTEXT_POLICY = 0x08, + INTERCEPT_INTERCEPTION = 0x10, + INTERCEPT_ALL = 0xffff + } CorDebugIntercept; + + HRESULT SetInterceptMask([in] CorDebugIntercept mask); + + typedef enum CorDebugUnmappedStop + { + STOP_NONE = 0x0, + STOP_PROLOG = 0x01, + STOP_EPILOG = 0x02, + STOP_NO_MAPPING_INFO = 0x04, + STOP_OTHER_UNMAPPED = 0x08, + STOP_UNMANAGED = 0x10, + + STOP_ALL = 0xffff, + + } CorDebugUnmappedStop; + + HRESULT SetUnmappedStopMask([in] CorDebugUnmappedStop mask); + HRESULT Step([in] BOOL bStepIn); + + typedef struct COR_DEBUG_STEP_RANGE + { + ULONG32 startOffset, endOffset; + } COR_DEBUG_STEP_RANGE; + + HRESULT StepRange([in] BOOL bStepIn, [in] COR_DEBUG_STEP_RANGE ranges[], [in] ULONG32 cRangeCount); + HRESULT StepOut(); + HRESULT SetRangeIL([in] BOOL bIL); +}; + +[ + object, + local, + uuid(CC7BCB01-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugEnum : IUnknown +{ + HRESULT Skip([in] ULONG celt); + HRESULT Reset(); + HRESULT Clone([out] ICorDebugEnum **ppEnum); + HRESULT GetCount([out] ULONG *pcelt); +}; + +[ + object, + local, + uuid(63ca1b24-4359-4883-bd57-13f815f58744), + pointer_default(unique) +] + +interface ICorDebugAppDomainEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] ICorDebugAppDomain *values[], [out] ULONG *pceltFetched); + +}; + +[ + object, + local, + uuid(4a2a1ec9-85ec-4bfb-9f15-a89fdfe0fe83), + pointer_default(unique) +] +interface ICorDebugAssemblyEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] ICorDebugAssembly *values[], [out] ULONG *pceltFetched); + +}; + +[ + object, + local, + uuid(CC7BCB03-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugBreakpointEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] ICorDebugBreakpoint *breakpoints[], [out] ULONG *pceltFetched); +}; + +[ + object, + local, + uuid(CC7BCB08-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugChainEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] ICorDebugChain *chains[], [out] ULONG *pceltFetched); +}; + +[ + object, + local, + uuid(F0E18809-72B5-11d2-976F-00A0C9B4D50C), + pointer_default(unique) +] +interface ICorDebugErrorInfoEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] ICorDebugEditAndContinueErrorInfo *errors[], + [out] ULONG *pceltFetched); +}; + +[ + object, + local, + uuid(CC7BCB07-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugFrameEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] ICorDebugFrame *frames[], [out] ULONG *pceltFetched); +}; + +[ + object, + local, + uuid(CC7BCB09-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugModuleEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] ICorDebugModule *modules[], [out] ULONG *pceltFetched); +}; + +[ + object, + local, + uuid(CC7BCB02-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugObjectEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] CORDB_ADDRESS objects[], [out] ULONG *pceltFetched); +}; + +[ + object, + local, + uuid(CC7BCB05-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugProcessEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] ICorDebugProcess *processes[], [out] ULONG *pceltFetched); +}; + +[ + object, + local, + uuid(CC7BCB04-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugStepperEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] ICorDebugStepper *steppers[], [out] ULONG *pceltFetched); +}; + +[ + object, + local, + uuid(CC7BCB06-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugThreadEnum : ICorDebugEnum +{ + HRESULT Next([in] ULONG celt, [out] ICorDebugThread *threads[], [out] ULONG *pceltFetched); +}; + +[ + object, + local, + uuid(CC7BCAEE-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugChain : IUnknown +{ + HRESULT GetThread([out] ICorDebugThread **ppThread); + HRESULT GetStackRange([out] CORDB_ADDRESS *pStart, [out] CORDB_ADDRESS *pEnd); + HRESULT GetContext([out] ICorDebugContext **ppContext); + HRESULT GetCaller([out] ICorDebugChain **ppChain); + HRESULT GetCallee([out] ICorDebugChain **ppChain); + HRESULT GetPrevious([out] ICorDebugChain **ppChain); + HRESULT GetNext([out] ICorDebugChain **ppChain); + HRESULT IsManaged([out] BOOL *pManaged); + HRESULT EnumerateFrames([out] ICorDebugFrameEnum **ppFrames); + HRESULT GetActiveFrame([out] ICorDebugFrame **ppFrame); + HRESULT GetRegisterSet([out] ICorDebugRegisterSet **ppRegisters); + typedef enum CorDebugChainReason + { + CHAIN_NONE = 0x000, + CHAIN_CLASS_INIT = 0x001, + CHAIN_EXCEPTION_FILTER = 0x002, + CHAIN_SECURITY = 0x004, + CHAIN_CONTEXT_POLICY = 0x008, + CHAIN_INTERCEPTION = 0x010, + CHAIN_PROCESS_START = 0x020, + CHAIN_THREAD_START = 0x040, + CHAIN_ENTER_MANAGED = 0x080, + CHAIN_ENTER_UNMANAGED = 0x100, + CHAIN_DEBUGGER_EVAL = 0x200, + CHAIN_CONTEXT_SWITCH = 0x400, + CHAIN_FUNC_EVAL = 0x800, + } CorDebugChainReason; + + HRESULT GetReason([out] CorDebugChainReason *pReason); +}; + +[ + object, + local, + uuid(CC7BCAEF-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugFrame : IUnknown +{ + HRESULT GetChain([out] ICorDebugChain **ppChain); + HRESULT GetCode([out] ICorDebugCode **ppCode); + HRESULT GetFunction([out] ICorDebugFunction **ppFunction); + HRESULT GetFunctionToken([out] mdMethodDef *pToken); + HRESULT GetStackRange([out] CORDB_ADDRESS *pStart, [out] CORDB_ADDRESS *pEnd); + HRESULT GetCaller([out] ICorDebugFrame **ppFrame); + HRESULT GetCallee([out] ICorDebugFrame **ppFrame); + HRESULT CreateStepper([out] ICorDebugStepper **ppStepper); +}; + + +[ + object, + local, + uuid(CC7BCB0B-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugRegisterSet : IUnknown +{ + typedef enum CorDebugRegister + { + REGISTER_INSTRUCTION_POINTER = 0, + REGISTER_STACK_POINTER, + REGISTER_FRAME_POINTER, + + REGISTER_X86_EIP = 0, + REGISTER_X86_ESP, + REGISTER_X86_EBP, + + REGISTER_X86_EAX, + REGISTER_X86_ECX, + REGISTER_X86_EDX, + REGISTER_X86_EBX, + + REGISTER_X86_ESI, + REGISTER_X86_EDI, + + REGISTER_X86_FPSTACK_0, + REGISTER_X86_FPSTACK_1, + REGISTER_X86_FPSTACK_2, + REGISTER_X86_FPSTACK_3, + REGISTER_X86_FPSTACK_4, + REGISTER_X86_FPSTACK_5, + REGISTER_X86_FPSTACK_6, + REGISTER_X86_FPSTACK_7, + + REGISTER_AMD64_RIP = 0, + REGISTER_AMD64_RSP, + REGISTER_AMD64_RBP, + + REGISTER_AMD64_RAX, + REGISTER_AMD64_RCX, + REGISTER_AMD64_RDX, + REGISTER_AMD64_RBX, + + REGISTER_AMD64_RSI, + REGISTER_AMD64_RDI, + + REGISTER_AMD64_R8, + REGISTER_AMD64_R9, + REGISTER_AMD64_R10, + REGISTER_AMD64_R11, + REGISTER_AMD64_R12, + REGISTER_AMD64_R13, + REGISTER_AMD64_R14, + REGISTER_AMD64_R15, + + REGISTER_AMD64_XMM0, + REGISTER_AMD64_XMM1, + REGISTER_AMD64_XMM2, + REGISTER_AMD64_XMM3, + REGISTER_AMD64_XMM4, + REGISTER_AMD64_XMM5, + REGISTER_AMD64_XMM6, + REGISTER_AMD64_XMM7, + REGISTER_AMD64_XMM8, + REGISTER_AMD64_XMM9, + REGISTER_AMD64_XMM10, + REGISTER_AMD64_XMM11, + REGISTER_AMD64_XMM12, + REGISTER_AMD64_XMM13, + REGISTER_AMD64_XMM14, + REGISTER_AMD64_XMM15, + + REGISTER_IA64_BSP = REGISTER_FRAME_POINTER, + + REGISTER_IA64_R0 = REGISTER_IA64_BSP + 1, + REGISTER_IA64_F0 = REGISTER_IA64_R0 + 128, + + } CorDebugRegister; + + HRESULT GetRegistersAvailable([out] ULONG64 *pAvailable); + + HRESULT GetRegisters([in] ULONG64 mask, [in] ULONG32 regCount, + [out] CORDB_REGISTER regBuffer[]); + HRESULT SetRegisters([in] ULONG64 mask, [in] ULONG32 regCount, + [in] CORDB_REGISTER regBuffer[]); + HRESULT GetThreadContext([in] ULONG32 contextSize, [in, out] BYTE context[]); + HRESULT SetThreadContext([in] ULONG32 contextSize, [in] BYTE context[]); +} + +[ + object, + local, + uuid(CC7BCAF6-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugEval : IUnknown +{ + HRESULT CallFunction([in] ICorDebugFunction *pFunction, [in] ULONG32 nArgs, + [in] ICorDebugValue *ppArgs[]); + HRESULT NewObject([in] ICorDebugFunction *pConstructor, [in] ULONG32 nArgs, + [in] ICorDebugValue *ppArgs[]); + HRESULT NewObjectNoConstructor([in] ICorDebugClass *pClass); + HRESULT NewString([in] LPCWSTR string); + HRESULT NewArray([in] CorElementType elementType, [in] ICorDebugClass *pElementClass, + [in] ULONG32 rank, [in] ULONG32 dims[], [in] ULONG32 lowBounds[]); + HRESULT IsActive([out] BOOL *pbActive); + HRESULT Abort(); + HRESULT GetResult([out] ICorDebugValue **ppResult); + HRESULT GetThread([out] ICorDebugThread **ppThread); + HRESULT CreateValue([in] CorElementType elementType, [in] ICorDebugClass *pElementClass, + [out] ICorDebugValue **ppValue); +}; + +[ + object, + local, + uuid(6DC3FA01-D7CB-11d2-8A95-0080C792E5D8), + pointer_default(unique) +] +interface ICorDebugEditAndContinueSnapshot : IUnknown +{ + HRESULT CopyMetaData([in] IStream *pIStream, [out] GUID *pMvid); + HRESULT GetMvid([out] GUID *pMvid); + HRESULT GetRoDataRVA([out] ULONG32 *pRoDataRVA); + HRESULT GetRwDataRVA([out] ULONG32 *pRwDataRVA); + HRESULT SetPEBytes([in] IStream *pIStream); + HRESULT SetILMap([in] mdToken mdFunction, [in] ULONG cMapSize, [in] COR_IL_MAP map[]); + HRESULT SetPESymbolBytes([in] IStream *pIStream); +}; + +[ + object, + local, + uuid(dba2d8c1-e5c5-4069-8c13-10a7c6abf43d), + pointer_default(unique) +] +interface ICorDebugModule : IUnknown +{ + HRESULT GetProcess([out] ICorDebugProcess **ppProcess); + HRESULT GetBaseAddress([out] CORDB_ADDRESS *pAddress); + HRESULT GetAssembly([out] ICorDebugAssembly **ppAssembly); + HRESULT GetName([in] ULONG32 cchName, [out] ULONG32 *pcchName, [out] WCHAR szName[]); + HRESULT EnableJITDebugging([in] BOOL bTrackJITInfo, [in] BOOL bAllowJitOpts); + HRESULT EnableClassLoadCallbacks([in] BOOL bClassLoadCallbacks); + HRESULT GetFunctionFromToken([in] mdMethodDef methodDef, [out] ICorDebugFunction **ppFunction); + HRESULT GetFunctionFromRVA([in] CORDB_ADDRESS rva, [out] ICorDebugFunction **ppFunction); + HRESULT GetClassFromToken([in] mdTypeDef typeDef, [out] ICorDebugClass **ppClass); + HRESULT CreateBreakpoint([out] ICorDebugModuleBreakpoint **ppBreakpoint); + HRESULT GetEditAndContinueSnapshot([out] ICorDebugEditAndContinueSnapshot **ppEditAndContinueSnapshot); + HRESULT GetMetaDataInterface([in] REFIID riid, [out] IUnknown **ppObj); + HRESULT GetToken([out] mdModule *pToken); + HRESULT IsDynamic([out] BOOL *pDynamic); + HRESULT GetGlobalVariableValue([in] mdFieldDef fieldDef, [out] ICorDebugValue **ppValue); + HRESULT GetSize([out] ULONG32 *pcBytes); + HRESULT IsInMemory([out] BOOL *pInMemory); +}; + +[ + object, + local, + uuid(CC7BCAF5-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugClass : IUnknown +{ + HRESULT GetModule([out] ICorDebugModule **pModule); + HRESULT GetToken([out] mdTypeDef *pTypeDef); + HRESULT GetStaticFieldValue([in] mdFieldDef fieldDef, [in] ICorDebugFrame *pFrame, + [out] ICorDebugValue **ppValue); +}; + +[ + object, + local, + uuid(df59507c-d47a-459e-bce2-6427eac8fd06), + pointer_default(unique) +] +interface ICorDebugAssembly : IUnknown +{ + HRESULT GetProcess([out] ICorDebugProcess **ppProcess); + HRESULT GetAppDomain([out] ICorDebugAppDomain **ppAppDomain); + HRESULT EnumerateModules([out] ICorDebugModuleEnum **ppModules); + HRESULT GetCodeBase([in] ULONG32 cchName, [out] ULONG32 *pcchName, [out] WCHAR szName[]); + HRESULT GetName([in] ULONG32 cchName, [out] ULONG32 *pcchName, [out] WCHAR szName[]); +}; + + +[ + object, + local, + uuid(CC7BCAF3-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugFunction : IUnknown +{ + HRESULT GetModule([out] ICorDebugModule **ppModule); + HRESULT GetClass([out] ICorDebugClass **ppClass); + HRESULT GetToken([out] mdMethodDef *pMethodDef); + HRESULT GetILCode([out] ICorDebugCode **ppCode); + HRESULT GetNativeCode([out] ICorDebugCode **ppCode); + HRESULT CreateBreakpoint([out] ICorDebugFunctionBreakpoint **ppBreakpoint); + HRESULT GetLocalVarSigToken([out] mdSignature *pmdSig); + HRESULT GetCurrentVersionNumber([out] ULONG32 *pnCurrentVersion); +}; + +[ + object, + local, + uuid(5263E909-8CB5-11d3-BD2F-0000F80849BD), + pointer_default(unique) +] +interface ICorDebugUnmanagedCallback : IUnknown +{ + HRESULT DebugEvent([in] LPDEBUG_EVENT pDebugEvent, [in] BOOL fOutOfBand); +}; + +[ + object, + local, + uuid(8D600D41-F4F6-4cb3-B7EC-7BD164944036), + pointer_default(unique) +] +interface ICorDebugEditAndContinueErrorInfo : IUnknown +{ + HRESULT GetModule([out] ICorDebugModule **ppModule); + HRESULT GetToken([out]mdToken *pToken); + HRESULT GetErrorCode([out]HRESULT *pHr); + HRESULT GetString([in] ULONG32 cchString, [out] ULONG32 *pcchString, + [out] WCHAR szString[]); +} + +[ + object, + local, + uuid(18AD3D6E-B7D2-11d2-BD04-0000F80849BD), + pointer_default(unique) +] +interface ICorDebugObjectValue : ICorDebugValue +{ + HRESULT GetClass([out] ICorDebugClass **ppClass); + HRESULT GetFieldValue([in] ICorDebugClass *pClass, [in] mdFieldDef fieldDef, + [out] ICorDebugValue **ppValue); + HRESULT GetVirtualMethod([in] mdMemberRef memberRef, [out] ICorDebugFunction **ppFunction); + HRESULT GetContext([out] ICorDebugContext **ppContext); + HRESULT IsValueClass([out] BOOL *pbIsValueClass); + HRESULT GetManagedCopy([out] IUnknown **ppObject); + HRESULT SetFromManagedCopy([in] IUnknown *pObject); +}; + +[ + object, + local, + uuid(CC7BCB00-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugContext : ICorDebugObjectValue +{ +}; + +[ + object, + local, + uuid(CC7BCAF4-8A68-11d2-983C-0000F808342D), + pointer_default(unique) +] +interface ICorDebugCode : IUnknown +{ + HRESULT IsIL([out] BOOL *pbIL); + HRESULT GetFunction([out] ICorDebugFunction **ppFunction); + HRESULT GetAddress([out] CORDB_ADDRESS *pStart); + HRESULT GetSize([out] ULONG32 *pcBytes); + HRESULT CreateBreakpoint([in] ULONG32 offset, [out] ICorDebugFunctionBreakpoint **ppBreakpoint); + HRESULT GetCode([in] ULONG32 startOffset, [in] ULONG32 endOffset, + [in] ULONG32 cBufferAlloc, [out] BYTE buffer[], [out] ULONG32 *pcBufferSize); + HRESULT GetVersionNumber([out] ULONG32 *nVersion); + HRESULT GetILToNativeMapping([in] ULONG32 cMap, [out] ULONG32 *pcMap, + [out] COR_DEBUG_IL_TO_NATIVE_MAP map[]); + HRESULT GetEnCRemapSequencePoints([in] ULONG32 cMap,[out] ULONG32 *pcMap, + [out] ULONG32 offsets[]); +}; + +[ + object, + local, + uuid(CC726F2F-1DB7-459b-B0EC-05F01D841B42), + pointer_default(unique) +] +interface ICorDebugMDA : IUnknown +{ + HRESULT GetName([in] ULONG32 cchName, [out] ULONG32 * pcchName, [out] WCHAR szName[]); + + HRESULT GetDescription([in] ULONG32 cchName, [out] ULONG32 * pcchName, [out] WCHAR szName[]); + + HRESULT GetXML([in] ULONG32 cchName, [out] ULONG32 * pcchName, [out] WCHAR szName[]); + + typedef enum CorDebugMDAFlags + { + MDA_FLAG_SLIP = 0x2 + } CorDebugMDAFlags; + + HRESULT GetFlags([in] CorDebugMDAFlags * pFlags); + + HRESULT GetOSThreadId([out] DWORD * pOsTid); +}; diff --git a/reactos/include/psdk/corerror.h b/reactos/include/psdk/corerror.h index 892fc28c75f..1537f93e2cd 100644 --- a/reactos/include/psdk/corerror.h +++ b/reactos/include/psdk/corerror.h @@ -44,83 +44,86 @@ #define COR_E_DIRECTORYNOTFOUND HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) #define COR_E_PATHTOOLONG HRESULT_FROM_WIN32(ERROR_FILENAME_EXCED_RANGE) -#define COR_E_AMBIGUOUSMATCH _HRESULT_TYPEDEF_(0x8000211DL) -#define COR_E_TARGETPARAMCOUNT _HRESULT_TYPEDEF_(0x8002000EL) -#define COR_E_DIVIDEBYZERO _HRESULT_TYPEDEF_(0x80020012L) -#define COR_E_BADIMAGEFORMAT _HRESULT_TYPEDEF_(0x8007000BL) +#define COR_E_AMBIGUOUSMATCH _HRESULT_TYPEDEF_(0x8000211D) +#define COR_E_TARGETPARAMCOUNT _HRESULT_TYPEDEF_(0x8002000E) +#define COR_E_DIVIDEBYZERO _HRESULT_TYPEDEF_(0x80020012) +#define COR_E_BADIMAGEFORMAT _HRESULT_TYPEDEF_(0x8007000B) -#define COR_E_ASSEMBLYEXPECTED EMAKEHR(0x1018L) -#define COR_E_TYPEUNLOADED EMAKEHR(0x1013L) -#define COR_E_EXCEPTION EMAKEHR(0x1500L) -#define COR_E_SYSTEM EMAKEHR(0x1501L) -#define COR_E_ARGUMENTOUTOFRANGE EMAKEHR(0x1502L) -#define COR_E_ARRAYTYPEMISMATCH EMAKEHR(0x1503L) -#define COR_E_CONTEXTMARSHAL EMAKEHR(0x1504L) -#define COR_E_TIMEOUT EMAKEHR(0x1505L) -#define COR_E_EXECUTIONENGINE EMAKEHR(0x1506L) -#define COR_E_FIELDACCESS EMAKEHR(0x1507L) -#define COR_E_INDEXOUTOFRANGE EMAKEHR(0x1508L) -#define COR_E_INVALIDOPERATION EMAKEHR(0x1509L) -#define COR_E_SECURITY EMAKEHR(0x150AL) -#define COR_E_REMOTING EMAKEHR(0x150BL) -#define COR_E_SERIALIZATION EMAKEHR(0x150CL) -#define COR_E_VERIFICATION EMAKEHR(0x150DL) -#define COR_E_SERVER EMAKEHR(0x150EL) -#define COR_E_SERVICEDCOMPONENT EMAKEHR(0x150FL) -#define COR_E_METHODACCESS EMAKEHR(0x1510L) -#define COR_E_MISSINGFIELD EMAKEHR(0x1511L) -#define COR_E_MISSINGMEMBER EMAKEHR(0x1512L) -#define COR_E_MISSINGMETHOD EMAKEHR(0x1513L) -#define COR_E_MULTICASTNOTSUPPORTED EMAKEHR(0x1514L) -#define COR_E_NOTSUPPORTED EMAKEHR(0x1515L) -#define COR_E_OVERFLOW EMAKEHR(0x1516L) -#define COR_E_RANK EMAKEHR(0x1517L) -#define COR_E_SYNCHRONIZATIONLOCK EMAKEHR(0x1518L) -#define COR_E_THREADINTERRUPTED EMAKEHR(0x1519L) -#define COR_E_MEMBERACCESS EMAKEHR(0x151AL) -#define COR_E_THREADSTATE EMAKEHR(0x1520L) -#define COR_E_THREADSTOP EMAKEHR(0x1521L) -#define COR_E_TYPELOAD EMAKEHR(0x1522L) -#define COR_E_ENTRYPOINTNOTFOUND EMAKEHR(0x1523L) -#define COR_E_DLLNOTFOUND EMAKEHR(0x1524L) -#define COR_E_THREADSTART EMAKEHR(0x1525L) -#define COR_E_INVALIDCOMOBJECT EMAKEHR(0x1527L) -#define COR_E_NOTFINITENUMBER EMAKEHR(0x1528L) -#define COR_E_DUPLICATEWAITOBJECT EMAKEHR(0x1529L) -#define COR_E_SEMAPHOREFULL EMAKEHR(0x152BL) -#define COR_E_WAITHANDLECANNOTBEOPENED EMAKEHR(0x152CL) -#define COR_E_ABANDONEDMUTEX EMAKEHR(0x152DL) -#define COR_E_INVALIDOLEVARIANTTYPE EMAKEHR(0x1531L) -#define COR_E_MISSINGMANIFESTRESOURCE EMAKEHR(0x1532L) -#define COR_E_SAFEARRAYTYPEMISMATCH EMAKEHR(0x1533L) -#define COR_E_TYPEINITIALIZATION EMAKEHR(0x1534L) -#define COR_E_MARSHALDIRECTIVE EMAKEHR(0x1535L) -#define COR_E_MISSINGSATELLITEASSEMBLY EMAKEHR(0x1536L) -#define COR_E_FORMAT EMAKEHR(0x1537L) -#define COR_E_SAFEARRAYRANKMISMATCH EMAKEHR(0x1538L) -#define COR_E_PLATFORMNOTSUPPORTED EMAKEHR(0x1539L) -#define COR_E_INVALIDPROGRAM EMAKEHR(0x153AL) -#define COR_E_OPERATIONCANCELED EMAKEHR(0x153BL) -#define COR_E_INSUFFICIENTMEMORY EMAKEHR(0x153DL) -#define COR_E_RUNTIMEWRAPPED EMAKEHR(0x153EL) -#define COR_E_DEVICESNOTSUPPORTED EMAKEHR(0x1540L) -#define COR_E_DATAMISALIGNED EMAKEHR(0x1541L) -#define COR_E_KEYNOTFOUND EMAKEHR(0x1577L) -#define COR_E_APPLICATION EMAKEHR(0x1600L) -#define COR_E_INVALIDFILTERCRITERIA EMAKEHR(0x1601L) -#define COR_E_REFLECTIONTYPELOAD EMAKEHR(0x1602L) -#define COR_E_TARGET EMAKEHR(0x1603L) -#define COR_E_TARGETINVOCATION EMAKEHR(0x1604L) -#define COR_E_CUSTOMATTRIBUTEFORMAT EMAKEHR(0x1605L) -#define COR_E_IO EMAKEHR(0x1620L) -#define COR_E_FILELOAD EMAKEHR(0x1621L) -#define COR_E_OBJECTDISPOSED EMAKEHR(0x1622L) -#define COR_E_FAILFAST EMAKEHR(0x1623L) -#define COR_E_HOSTPROTECTION EMAKEHR(0x1640L) -#define COR_E_ILLEGAL_REENTRANCY EMAKEHR(0x1641L) +#define COR_E_ASSEMBLYEXPECTED EMAKEHR(0x1018) +#define COR_E_TYPEUNLOADED EMAKEHR(0x1013) +#define COR_E_EXCEPTION EMAKEHR(0x1500) +#define COR_E_SYSTEM EMAKEHR(0x1501) +#define COR_E_ARGUMENTOUTOFRANGE EMAKEHR(0x1502) +#define COR_E_ARRAYTYPEMISMATCH EMAKEHR(0x1503) +#define COR_E_CONTEXTMARSHAL EMAKEHR(0x1504) +#define COR_E_TIMEOUT EMAKEHR(0x1505) +#define COR_E_EXECUTIONENGINE EMAKEHR(0x1506) +#define COR_E_FIELDACCESS EMAKEHR(0x1507) +#define COR_E_INDEXOUTOFRANGE EMAKEHR(0x1508) +#define COR_E_INVALIDOPERATION EMAKEHR(0x1509) +#define COR_E_SECURITY EMAKEHR(0x150A) +#define COR_E_REMOTING EMAKEHR(0x150B) +#define COR_E_SERIALIZATION EMAKEHR(0x150C) +#define COR_E_VERIFICATION EMAKEHR(0x150D) +#define COR_E_SERVER EMAKEHR(0x150E) +#define COR_E_SERVICEDCOMPONENT EMAKEHR(0x150F) +#define COR_E_METHODACCESS EMAKEHR(0x1510) +#define COR_E_MISSINGFIELD EMAKEHR(0x1511) +#define COR_E_MISSINGMEMBER EMAKEHR(0x1512) +#define COR_E_MISSINGMETHOD EMAKEHR(0x1513) +#define COR_E_MULTICASTNOTSUPPORTED EMAKEHR(0x1514) +#define COR_E_NOTSUPPORTED EMAKEHR(0x1515) +#define COR_E_OVERFLOW EMAKEHR(0x1516) +#define COR_E_RANK EMAKEHR(0x1517) +#define COR_E_SYNCHRONIZATIONLOCK EMAKEHR(0x1518) +#define COR_E_THREADINTERRUPTED EMAKEHR(0x1519) +#define COR_E_MEMBERACCESS EMAKEHR(0x151A) +#define COR_E_THREADSTATE EMAKEHR(0x1520) +#define COR_E_THREADSTOP EMAKEHR(0x1521) +#define COR_E_TYPELOAD EMAKEHR(0x1522) +#define COR_E_ENTRYPOINTNOTFOUND EMAKEHR(0x1523) +#define COR_E_DLLNOTFOUND EMAKEHR(0x1524) +#define COR_E_THREADSTART EMAKEHR(0x1525) +#define COR_E_INVALIDCOMOBJECT EMAKEHR(0x1527) +#define COR_E_NOTFINITENUMBER EMAKEHR(0x1528) +#define COR_E_DUPLICATEWAITOBJECT EMAKEHR(0x1529) +#define COR_E_SEMAPHOREFULL EMAKEHR(0x152B) +#define COR_E_WAITHANDLECANNOTBEOPENED EMAKEHR(0x152C) +#define COR_E_ABANDONEDMUTEX EMAKEHR(0x152D) +#define COR_E_INVALIDOLEVARIANTTYPE EMAKEHR(0x1531) +#define COR_E_MISSINGMANIFESTRESOURCE EMAKEHR(0x1532) +#define COR_E_SAFEARRAYTYPEMISMATCH EMAKEHR(0x1533) +#define COR_E_TYPEINITIALIZATION EMAKEHR(0x1534) +#define COR_E_MARSHALDIRECTIVE EMAKEHR(0x1535) +#define COR_E_MISSINGSATELLITEASSEMBLY EMAKEHR(0x1536) +#define COR_E_FORMAT EMAKEHR(0x1537) +#define COR_E_SAFEARRAYRANKMISMATCH EMAKEHR(0x1538) +#define COR_E_PLATFORMNOTSUPPORTED EMAKEHR(0x1539) +#define COR_E_INVALIDPROGRAM EMAKEHR(0x153A) +#define COR_E_OPERATIONCANCELED EMAKEHR(0x153B) +#define COR_E_INSUFFICIENTMEMORY EMAKEHR(0x153D) +#define COR_E_RUNTIMEWRAPPED EMAKEHR(0x153E) +#define COR_E_DEVICESNOTSUPPORTED EMAKEHR(0x1540) +#define COR_E_DATAMISALIGNED EMAKEHR(0x1541) +#define COR_E_KEYNOTFOUND EMAKEHR(0x1577) +#define COR_E_APPLICATION EMAKEHR(0x1600) +#define COR_E_INVALIDFILTERCRITERIA EMAKEHR(0x1601) +#define COR_E_REFLECTIONTYPELOAD EMAKEHR(0x1602) +#define COR_E_TARGET EMAKEHR(0x1603) +#define COR_E_TARGETINVOCATION EMAKEHR(0x1604) +#define COR_E_CUSTOMATTRIBUTEFORMAT EMAKEHR(0x1605) +#define COR_E_IO EMAKEHR(0x1620) +#define COR_E_FILELOAD EMAKEHR(0x1621) +#define COR_E_OBJECTDISPOSED EMAKEHR(0x1622) +#define COR_E_FAILFAST EMAKEHR(0x1623) +#define COR_E_HOSTPROTECTION EMAKEHR(0x1640) +#define COR_E_ILLEGAL_REENTRANCY EMAKEHR(0x1641) #define FUSION_E_INVALID_NAME EMAKEHR(0x1047) #define CLDB_E_FILE_OLDVER EMAKEHR(0x1107) +#define CLR_E_SHIM_RUNTIME EMAKEHR(0x1700) +#define CLR_E_SHIM_RUNTIMEEXPORT EMAKEHR(0x1701) + #endif /* __WINE_CORERROR_H */ diff --git a/reactos/include/psdk/corhdr.h b/reactos/include/psdk/corhdr.h index 4064efd6067..5ca84fe9363 100644 --- a/reactos/include/psdk/corhdr.h +++ b/reactos/include/psdk/corhdr.h @@ -49,10 +49,82 @@ typedef enum CorTokenType mdtBaseType = 0x72000000, } CorTokenType; +typedef enum CorElementType +{ + ELEMENT_TYPE_END = 0x00, + ELEMENT_TYPE_VOID = 0x01, + ELEMENT_TYPE_BOOLEAN = 0x02, + ELEMENT_TYPE_CHAR = 0x03, + ELEMENT_TYPE_I1 = 0x04, + ELEMENT_TYPE_U1 = 0x05, + ELEMENT_TYPE_I2 = 0x06, + ELEMENT_TYPE_U2 = 0x07, + ELEMENT_TYPE_I4 = 0x08, + ELEMENT_TYPE_U4 = 0x09, + ELEMENT_TYPE_I8 = 0x0a, + ELEMENT_TYPE_U8 = 0x0b, + ELEMENT_TYPE_R4 = 0x0c, + ELEMENT_TYPE_R8 = 0x0d, + ELEMENT_TYPE_STRING = 0x0e, + ELEMENT_TYPE_PTR = 0x0f, + ELEMENT_TYPE_BYREF = 0x10, + ELEMENT_TYPE_VALUETYPE = 0x11, + ELEMENT_TYPE_CLASS = 0x12, + ELEMENT_TYPE_VAR = 0x13, + ELEMENT_TYPE_ARRAY = 0x14, + ELEMENT_TYPE_GENERICINST = 0x15, + ELEMENT_TYPE_TYPEDBYREF = 0x16, + ELEMENT_TYPE_I = 0x18, + ELEMENT_TYPE_U = 0x19, + ELEMENT_TYPE_FNPTR = 0x1b, + ELEMENT_TYPE_OBJECT = 0x1c, + ELEMENT_TYPE_SZARRAY = 0x1d, + ELEMENT_TYPE_MVAR = 0x1e, + ELEMENT_TYPE_CMOD_REQD = 0x1f, + ELEMENT_TYPE_CMOD_OPT = 0x20, + ELEMENT_TYPE_INTERNAL = 0x21, + ELEMENT_TYPE_MAX = 0x22, + ELEMENT_TYPE_MODIFIER = 0x40, + ELEMENT_TYPE_SENTINEL = 0x01 | ELEMENT_TYPE_MODIFIER, + ELEMENT_TYPE_PINNED = 0x05 | ELEMENT_TYPE_MODIFIER, + ELEMENT_TYPE_R4_HFA = 0x06 | ELEMENT_TYPE_MODIFIER, + ELEMENT_TYPE_R8_HFA = 0x07 | ELEMENT_TYPE_MODIFIER, + +} CorElementType; + #define RidToToken(rid,tktype) ((rid) |= (tktype)) #define TokenFromRid(rid,tktype) ((rid) | (tktype)) #define RidFromToken(tk) ((RID)((tk) & 0x00ffffff)) #define TypeFromToken(tk) ((ULONG32)((tk) & 0xff000000)) #define IsNilToken(tk) ((RidFromToken(tk)) == 0) +typedef LPVOID mdScope; +typedef ULONG32 mdToken; + +typedef mdToken mdModule; +typedef mdToken mdTypeRef; +typedef mdToken mdTypeDef; +typedef mdToken mdFieldDef; +typedef mdToken mdMethodDef; +typedef mdToken mdParamDef; +typedef mdToken mdInterfaceImpl; +typedef mdToken mdMemberRef; +typedef mdToken mdCustomAttribute; +typedef mdToken mdPermission; +typedef mdToken mdSignature; +typedef mdToken mdEvent; +typedef mdToken mdProperty; +typedef mdToken mdModuleRef; +typedef mdToken mdAssembly; +typedef mdToken mdAssemblyRef; +typedef mdToken mdFile; +typedef mdToken mdExportedType; +typedef mdToken mdManifestResource; +typedef mdToken mdTypeSpec; +typedef mdToken mdGenericParam; +typedef mdToken mdMethodSpec; +typedef mdToken mdGenericParamConstraint; +typedef mdToken mdString; +typedef mdToken mdCPToken; + #endif /* __WINE_CORHDR_H */ diff --git a/reactos/include/psdk/metahost.idl b/reactos/include/psdk/metahost.idl new file mode 100644 index 00000000000..51cd78415be --- /dev/null +++ b/reactos/include/psdk/metahost.idl @@ -0,0 +1,131 @@ +/* + * 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 + */ + +import "unknwn.idl"; +import "oaidl.idl"; +import "ocidl.idl"; +import "mscoree.idl"; + +cpp_quote("#ifdef WINE_NO_UNICODE_MACROS") +cpp_quote("#undef LoadLibrary") +cpp_quote("#endif") + +[ + object, + local, + uuid(bd39d1d2-ba2f-486a-89b0-b4b0cb466891) +] +interface ICLRRuntimeInfo : IUnknown +{ + HRESULT GetVersionString( + [out, size_is(*pcchBuffer)] LPWSTR pwzBuffer, + [in, out] DWORD *pcchBuffer); + + HRESULT GetRuntimeDirectory( + [out, size_is(*pcchBuffer)] LPWSTR pwzBuffer, + [in, out] DWORD *pcchBuffer); + + HRESULT IsLoaded( + [in] HANDLE hndProcess, + [out, retval] BOOL *pbLoaded); + + HRESULT LoadErrorString( + [in] UINT iResourceID, + [out, size_is(*pcchBuffer)] LPWSTR pwzBuffer, + [in, out] DWORD *pcchBuffer, + [in] LONG iLocaleid); + + HRESULT LoadLibrary( + [in] LPCWSTR pwzDllName, + [out, retval] HMODULE *phndModule); + + HRESULT GetProcAddress( + [in] LPCSTR pszProcName, + [out, retval] LPVOID *ppProc); + + HRESULT GetInterface( + [in] REFCLSID rclsid, + [in] REFIID riid, + [out, iid_is(riid), retval] LPVOID *ppUnk); + + HRESULT IsLoadable( + [out, retval] BOOL *pbLoadable); + + HRESULT SetDefaultStartupFlags( + [in] DWORD dwStartupFlags, + [in] LPCWSTR pwzHostConfigFile); + + HRESULT GetDefaultStartupFlags( + [out] DWORD *pdwStartupFlags, + [out, size_is(*pcchHostConfigFile)] LPWSTR pwzHostConfigFile, + [in, out] DWORD *pcchHostConfigFile); + + HRESULT BindAsLegacyV2Runtime(); + + HRESULT IsStarted( + [out] BOOL *pbStarted, + [out] DWORD *pdwStartupFlags); +}; + +typedef HRESULT (__stdcall *CallbackThreadSetFnPtr)(); +typedef HRESULT (__stdcall *CallbackThreadUnsetFnPtr)(); + +typedef void (__stdcall *RuntimeLoadedCallbackFnPtr)( + ICLRRuntimeInfo *pRuntimeInfo, + CallbackThreadSetFnPtr pfnCallbackThreadSet, + CallbackThreadUnsetFnPtr pfnCallbackThreadUnset); + +cpp_quote("DEFINE_GUID(CLSID_CLRDebuggingLegacy, 0xDF8395B5,0xA4BA,0x450b,0xA7,0x7C,0xA9,0xA4,0x77,0x62,0xC5,0x20);") +cpp_quote("DEFINE_GUID(CLSID_CLRMetaHost, 0x9280188d,0x0e8e,0x4867,0xb3,0x0c,0x7f,0xa8,0x38,0x84,0xe8,0xde);") + +[ + object, + local, + uuid(d332db9e-b9b3-4125-8207-a14884f53216) +] +interface ICLRMetaHost : IUnknown +{ + HRESULT GetRuntime( + [in] LPCWSTR pwzVersion, + [in] REFIID iid, + [out, iid_is(iid), retval] LPVOID *ppRuntime); + + HRESULT GetVersionFromFile( + [in] LPCWSTR pwzFilePath, + [out, size_is(*pcchBuffer)] LPWSTR pwzBuffer, + [in, out] DWORD *pcchBuffer); + + HRESULT EnumerateInstalledRuntimes( + [out, retval] IEnumUnknown **ppEnumerator); + + HRESULT EnumerateLoadedRuntimes( + [in] HANDLE hndProcess, + [out, retval] IEnumUnknown **ppEnumerator); + + HRESULT RequestRuntimeLoadedNotification( + [in] RuntimeLoadedCallbackFnPtr pCallbackFunction); + + HRESULT QueryLegacyV2RuntimeBinding( + [in] REFIID riid, + [out, iid_is(riid), retval] LPVOID *ppUnk); + + HRESULT ExitProcess( + [in] INT32 iExitCode); +}; + +cpp_quote("HRESULT WINAPI CLRCreateInstance(REFCLSID clsid, REFIID riid, LPVOID *ppInterface);") diff --git a/reactos/include/psdk/mscoree.idl b/reactos/include/psdk/mscoree.idl index f8698cbe729..41602649cf1 100644 --- a/reactos/include/psdk/mscoree.idl +++ b/reactos/include/psdk/mscoree.idl @@ -224,3 +224,17 @@ interface ICLRRuntimeHost : IUnknown [in] LPCWSTR pwzArgument, [out] DWORD *pReturnValue); } + +[ + uuid(C3FCC19E-A970-11d2-8B5A-00A0C9B7C9C4), + local, + object +] +interface IManagedObject : IUnknown +{ + HRESULT GetSerializedBuffer([out] BSTR *pBSTR); + + HRESULT GetObjectIdentity([out] BSTR *pBSTRGUID, + [out] int *AppDomainID, + [out] int *pCCW); +} diff --git a/reactos/include/psdk/psdk.rbuild b/reactos/include/psdk/psdk.rbuild index a7b84928817..97de25f9ea3 100644 --- a/reactos/include/psdk/psdk.rbuild +++ b/reactos/include/psdk/psdk.rbuild @@ -13,6 +13,8 @@ bits.idl commoncontrols.idl control.idl + cor.idl + cordebug.idl ctfutb.idl ctxtcall.idl dimm.idl @@ -27,8 +29,10 @@ imnact.idl imnxport.idl indexsrv.idl + metahost.idl mimeinfo.idl mlang.idl + mscoree.idl msctf.idl msdadc.idl mshtml.idl diff --git a/reactos/include/psdk/winsxs.idl b/reactos/include/psdk/winsxs.idl index c2c38f2a6bf..202b91f5c59 100644 --- a/reactos/include/psdk/winsxs.idl +++ b/reactos/include/psdk/winsxs.idl @@ -17,6 +17,7 @@ */ import "objidl.idl"; +import "oleidl.idl"; interface IAssemblyCache; interface IAssemblyCacheItem; From 97dfbce665c8977c1a99c8844e4e6ec45730f3fe Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 17:11:55 +0000 Subject: [PATCH 140/289] [MLANG] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55273 --- reactos/dll/win32/mlang/CMakeLists.txt | 9 +- reactos/dll/win32/mlang/mlang.c | 108 +++-- reactos/dll/win32/mlang/mlang.rbuild | 3 +- reactos/dll/win32/mlang/mlang.rc | 1 + reactos/dll/win32/mlang/mlang.rgs | 21 + reactos/dll/win32/mlang/mlang.spec | 2 +- reactos/dll/win32/mlang/mlang_classes.idl | 40 ++ reactos/dll/win32/mlang/regsvr.c | 510 ---------------------- reactos/include/psdk/mlang.idl | 2 +- reactos/media/doc/README.WINE | 2 +- 10 files changed, 139 insertions(+), 559 deletions(-) create mode 100644 reactos/dll/win32/mlang/mlang.rc create mode 100644 reactos/dll/win32/mlang/mlang.rgs create mode 100644 reactos/dll/win32/mlang/mlang_classes.idl delete mode 100644 reactos/dll/win32/mlang/regsvr.c diff --git a/reactos/dll/win32/mlang/CMakeLists.txt b/reactos/dll/win32/mlang/CMakeLists.txt index ba1a39846fb..5b53d924975 100644 --- a/reactos/dll/win32/mlang/CMakeLists.txt +++ b/reactos/dll/win32/mlang/CMakeLists.txt @@ -1,21 +1,24 @@ -add_definitions(-D__WINESRC__) +add_definitions( + -D__WINESRC__ + -DCOM_NO_WINDOWS_H) remove_definitions(-D_WIN32_WINNT=0x502) add_definitions(-D_WIN32_WINNT=0x600) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +set_rc_compiler() spec2def(mlang.dll mlang.spec) list(APPEND SOURCE mlang.c - regsvr.c + mlang.rc ${CMAKE_CURRENT_BINARY_DIR}/mlang_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/mlang.def) add_library(mlang SHARED ${SOURCE}) -set_module_type(mlang win32dll ENTRYPOINT 0 ) +set_module_type(mlang win32dll ENTRYPOINT 0) target_link_libraries(mlang uuid wine) add_delay_importlibs(mlang oleaut32) diff --git a/reactos/dll/win32/mlang/mlang.c b/reactos/dll/win32/mlang/mlang.c index 47b1745215a..2c6e6f748c7 100644 --- a/reactos/dll/win32/mlang/mlang.c +++ b/reactos/dll/win32/mlang/mlang.c @@ -33,6 +33,8 @@ #include "wingdi.h" #include "winuser.h" #include "ole2.h" +#include "objbase.h" +#include "rpcproxy.h" #include "mlang.h" #include "wine/unicode.h" @@ -47,6 +49,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mlang); static HRESULT MultiLanguage_create(IUnknown *pUnkOuter, LPVOID *ppObj); static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum); +static HINSTANCE instance; static DWORD MLANG_tls_index; /* to store various per thead data */ /* FIXME: @@ -879,6 +882,7 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) { switch(fdwReason) { case DLL_PROCESS_ATTACH: + instance = hInstDLL; MLANG_tls_index = TlsAlloc(); DisableThreadLibraryCalls(hInstDLL); break; @@ -1417,11 +1421,11 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) typedef struct tagMLang_impl { - const IMLangFontLinkVtbl *vtbl_IMLangFontLink; - const IMultiLanguageVtbl *vtbl_IMultiLanguage; - const IMultiLanguage3Vtbl *vtbl_IMultiLanguage3; - const IMLangFontLink2Vtbl *vtbl_IMLangFontLink2; - const IMLangLineBreakConsoleVtbl *vtbl_IMLangLineBreakConsole; + IMLangFontLink IMLangFontLink_iface; + IMultiLanguage IMultiLanguage_iface; + IMultiLanguage3 IMultiLanguage3_iface; + IMLangFontLink2 IMLangFontLink2_iface; + IMLangLineBreakConsole IMLangLineBreakConsole_iface; LONG ref; DWORD total_cp, total_scripts; } MLang_impl; @@ -1459,7 +1463,7 @@ static HRESULT MLang_QueryInterface( { MLang_AddRef(This); TRACE("Returning IID_IMLangFontLink %p ref = %d\n", This, This->ref); - *ppvObject = &(This->vtbl_IMLangFontLink); + *ppvObject = &This->IMLangFontLink_iface; return S_OK; } @@ -1467,7 +1471,7 @@ static HRESULT MLang_QueryInterface( { MLang_AddRef(This); TRACE("Returning IID_IMLangFontLink2 %p ref = %d\n", This, This->ref); - *ppvObject = &(This->vtbl_IMLangFontLink2); + *ppvObject = &This->IMLangFontLink2_iface; return S_OK; } @@ -1475,14 +1479,14 @@ static HRESULT MLang_QueryInterface( { MLang_AddRef(This); TRACE("Returning IID_IMultiLanguage %p ref = %d\n", This, This->ref); - *ppvObject = &(This->vtbl_IMultiLanguage); + *ppvObject = &This->IMultiLanguage_iface; return S_OK; } if (IsEqualGUID(riid, &IID_IMultiLanguage2) ) { MLang_AddRef(This); - *ppvObject = &(This->vtbl_IMultiLanguage3); + *ppvObject = &This->IMultiLanguage3_iface; TRACE("Returning IID_IMultiLanguage2 %p ref = %d\n", This, This->ref); return S_OK; } @@ -1490,7 +1494,7 @@ static HRESULT MLang_QueryInterface( if (IsEqualGUID(riid, &IID_IMultiLanguage3) ) { MLang_AddRef(This); - *ppvObject = &(This->vtbl_IMultiLanguage3); + *ppvObject = &This->IMultiLanguage3_iface; TRACE("Returning IID_IMultiLanguage3 %p ref = %d\n", This, This->ref); return S_OK; } @@ -1499,7 +1503,7 @@ static HRESULT MLang_QueryInterface( { MLang_AddRef(This); TRACE("Returning IID_IMLangLineBreakConsole %p ref = %d\n", This, This->ref); - *ppvObject = &(This->vtbl_IMLangLineBreakConsole); + *ppvObject = &This->IMLangLineBreakConsole_iface; return S_OK; } @@ -1512,7 +1516,7 @@ static HRESULT MLang_QueryInterface( typedef struct tagEnumCodePage_impl { - const IEnumCodePageVtbl *vtbl_IEnumCodePage; + IEnumCodePage IEnumCodePage_iface; LONG ref; MIMECPINFO *cpinfo; DWORD total, pos; @@ -1520,7 +1524,7 @@ typedef struct tagEnumCodePage_impl static inline EnumCodePage_impl *impl_from_IEnumCodePage( IEnumCodePage *iface ) { - return CONTAINING_RECORD( iface, EnumCodePage_impl, vtbl_IEnumCodePage ); + return CONTAINING_RECORD( iface, EnumCodePage_impl, IEnumCodePage_iface ); } static HRESULT WINAPI fnIEnumCodePage_QueryInterface( @@ -1537,7 +1541,7 @@ static HRESULT WINAPI fnIEnumCodePage_QueryInterface( { IEnumCodePage_AddRef(iface); TRACE("Returning IID_IEnumCodePage %p ref = %d\n", This, This->ref); - *ppvObject = &(This->vtbl_IEnumCodePage); + *ppvObject = &This->IEnumCodePage_iface; return S_OK; } @@ -1668,7 +1672,7 @@ static HRESULT EnumCodePage_create( MLang_impl* mlang, DWORD grfFlags, grfFlags = MIMECONTF_MIME_LATEST; ecp = HeapAlloc( GetProcessHeap(), 0, sizeof (EnumCodePage_impl) ); - ecp->vtbl_IEnumCodePage = &IEnumCodePage_vtbl; + ecp->IEnumCodePage_iface.lpVtbl = &IEnumCodePage_vtbl; ecp->ref = 1; ecp->pos = 0; ecp->total = 0; @@ -1696,7 +1700,7 @@ static HRESULT EnumCodePage_create( MLang_impl* mlang, DWORD grfFlags, TRACE("enumerated %d codepages with flags %08x\n", ecp->total, grfFlags); - *ppEnumCodePage = (IEnumCodePage*) ecp; + *ppEnumCodePage = &ecp->IEnumCodePage_iface; return S_OK; } @@ -1705,7 +1709,7 @@ static HRESULT EnumCodePage_create( MLang_impl* mlang, DWORD grfFlags, typedef struct tagEnumScript_impl { - const IEnumScriptVtbl *vtbl_IEnumScript; + IEnumScript IEnumScript_iface; LONG ref; SCRIPTINFO *script_info; DWORD total, pos; @@ -1713,7 +1717,7 @@ typedef struct tagEnumScript_impl static inline EnumScript_impl *impl_from_IEnumScript( IEnumScript *iface ) { - return CONTAINING_RECORD( iface, EnumScript_impl, vtbl_IEnumScript ); + return CONTAINING_RECORD( iface, EnumScript_impl, IEnumScript_iface ); } static HRESULT WINAPI fnIEnumScript_QueryInterface( @@ -1730,7 +1734,7 @@ static HRESULT WINAPI fnIEnumScript_QueryInterface( { IEnumScript_AddRef(iface); TRACE("Returning IID_IEnumScript %p ref = %d\n", This, This->ref); - *ppvObject = &(This->vtbl_IEnumScript); + *ppvObject = &This->IEnumScript_iface; return S_OK; } @@ -1845,7 +1849,7 @@ static HRESULT EnumScript_create( MLang_impl* mlang, DWORD dwFlags, dwFlags = SCRIPTCONTF_SCRIPT_USER | SCRIPTCONTF_SCRIPT_HIDE | SCRIPTCONTF_SCRIPT_SYSTEM; es = HeapAlloc( GetProcessHeap(), 0, sizeof (EnumScript_impl) ); - es->vtbl_IEnumScript = &IEnumScript_vtbl; + es->IEnumScript_iface.lpVtbl = &IEnumScript_vtbl; es->ref = 1; es->pos = 0; /* do not enumerate unicode flavours */ @@ -1866,7 +1870,7 @@ static HRESULT EnumScript_create( MLang_impl* mlang, DWORD dwFlags, TRACE("enumerated %d scripts with flags %08x\n", es->total, dwFlags); - *ppEnumScript = (IEnumScript *)es; + *ppEnumScript = &es->IEnumScript_iface; return S_OK; } @@ -1875,7 +1879,7 @@ static HRESULT EnumScript_create( MLang_impl* mlang, DWORD dwFlags, static inline MLang_impl *impl_from_IMLangFontLink( IMLangFontLink *iface ) { - return CONTAINING_RECORD( iface, MLang_impl, vtbl_IMLangFontLink ); + return CONTAINING_RECORD( iface, MLang_impl, IMLangFontLink_iface ); } static HRESULT WINAPI fnIMLangFontLink_QueryInterface( @@ -2113,7 +2117,7 @@ static const IMLangFontLinkVtbl IMLangFontLink_vtbl = static inline MLang_impl *impl_from_IMultiLanguage( IMultiLanguage *iface ) { - return CONTAINING_RECORD( iface, MLang_impl, vtbl_IMultiLanguage ); + return CONTAINING_RECORD( iface, MLang_impl, IMultiLanguage_iface ); } static HRESULT WINAPI fnIMultiLanguage_QueryInterface( @@ -2128,13 +2132,13 @@ static HRESULT WINAPI fnIMultiLanguage_QueryInterface( static ULONG WINAPI fnIMultiLanguage_AddRef( IMultiLanguage* iface ) { MLang_impl *This = impl_from_IMultiLanguage( iface ); - return IMLangFontLink_AddRef( ((IMLangFontLink*)This) ); + return IMLangFontLink_AddRef( &This->IMLangFontLink_iface ); } static ULONG WINAPI fnIMultiLanguage_Release( IMultiLanguage* iface ) { MLang_impl *This = impl_from_IMultiLanguage( iface ); - return IMLangFontLink_Release( ((IMLangFontLink*)This) ); + return IMLangFontLink_Release( &This->IMLangFontLink_iface ); } static HRESULT WINAPI fnIMultiLanguage_GetNumberOfCodePageInfo( @@ -2202,7 +2206,7 @@ static HRESULT WINAPI fnIMultiLanguage_GetCharsetInfo( PMIMECSETINFO pCharsetInfo) { MLang_impl *This = impl_from_IMultiLanguage( iface ); - return IMultiLanguage3_GetCharsetInfo((IMultiLanguage3*)&This->vtbl_IMultiLanguage3, Charset, pCharsetInfo); + return IMultiLanguage3_GetCharsetInfo( &This->IMultiLanguage3_iface, Charset, pCharsetInfo ); } static HRESULT WINAPI fnIMultiLanguage_IsConvertible( @@ -2306,7 +2310,7 @@ static HRESULT WINAPI fnIMultiLanguage_GetLcidFromRfc1766( typedef struct tagEnumRfc1766_impl { - const IEnumRfc1766Vtbl *vtbl_IEnumRfc1766; + IEnumRfc1766 IEnumRfc1766_iface; LONG ref; RFC1766INFO *info; DWORD total, pos; @@ -2314,7 +2318,7 @@ typedef struct tagEnumRfc1766_impl static inline EnumRfc1766_impl *impl_from_IEnumRfc1766( IEnumRfc1766 *iface ) { - return CONTAINING_RECORD( iface, EnumRfc1766_impl, vtbl_IEnumRfc1766 ); + return CONTAINING_RECORD( iface, EnumRfc1766_impl, IEnumRfc1766_iface ); } static HRESULT WINAPI fnIEnumRfc1766_QueryInterface( @@ -2331,7 +2335,7 @@ static HRESULT WINAPI fnIEnumRfc1766_QueryInterface( { IEnumRfc1766_AddRef(iface); TRACE("Returning IID_IEnumRfc1766 %p ref = %d\n", This, This->ref); - *ppvObject = &(This->vtbl_IEnumRfc1766); + *ppvObject = &This->IEnumRfc1766_iface; return S_OK; } @@ -2490,7 +2494,7 @@ static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum) TRACE("%04x, %p\n", LangId, ppEnum); rfc = HeapAlloc( GetProcessHeap(), 0, sizeof(EnumRfc1766_impl) ); - rfc->vtbl_IEnumRfc1766 = &IEnumRfc1766_vtbl; + rfc->IEnumRfc1766_iface.lpVtbl = &IEnumRfc1766_vtbl; rfc->ref = 1; rfc->pos = 0; rfc->total = 0; @@ -2520,7 +2524,7 @@ static HRESULT EnumRfc1766_create(LANGID LangId, IEnumRfc1766 **ppEnum) rfc->info = data.info; rfc->total = data.total; - *ppEnum = (IEnumRfc1766 *)rfc; + *ppEnum = &rfc->IEnumRfc1766_iface; return S_OK; } @@ -2614,7 +2618,7 @@ static const IMultiLanguageVtbl IMultiLanguage_vtbl = static inline MLang_impl *impl_from_IMultiLanguage3( IMultiLanguage3 *iface ) { - return CONTAINING_RECORD( iface, MLang_impl, vtbl_IMultiLanguage3 ); + return CONTAINING_RECORD( iface, MLang_impl, IMultiLanguage3_iface ); } static HRESULT WINAPI fnIMultiLanguage2_QueryInterface( @@ -2936,7 +2940,7 @@ static HRESULT WINAPI fnIMultiLanguage2_GetRfc1766Info( if ((PRIMARYLANGID(LangId) != LANG_ENGLISH) && (last_lang != LangId)) { - FIXME("Only english names supported (requested: 0x%04x)\n", LangId); + FIXME("Only English names supported (requested: 0x%04x)\n", LangId); last_lang = LangId; } @@ -3275,7 +3279,7 @@ static const IMultiLanguage3Vtbl IMultiLanguage3_vtbl = static inline MLang_impl *impl_from_IMLangFontLink2( IMLangFontLink2 *iface ) { - return CONTAINING_RECORD( iface, MLang_impl, vtbl_IMLangFontLink2 ); + return CONTAINING_RECORD( iface, MLang_impl, IMLangFontLink2_iface ); } static HRESULT WINAPI fnIMLangFontLink2_QueryInterface( @@ -3464,7 +3468,7 @@ static const IMLangFontLink2Vtbl IMLangFontLink2_vtbl = static inline MLang_impl *impl_from_IMLangLineBreakConsole( IMLangLineBreakConsole *iface ) { - return CONTAINING_RECORD( iface, MLang_impl, vtbl_IMLangLineBreakConsole ); + return CONTAINING_RECORD( iface, MLang_impl, IMLangLineBreakConsole_iface ); } static HRESULT WINAPI fnIMLangLineBreakConsole_QueryInterface( @@ -3558,11 +3562,11 @@ static HRESULT MultiLanguage_create(IUnknown *pUnkOuter, LPVOID *ppObj) return CLASS_E_NOAGGREGATION; mlang = HeapAlloc( GetProcessHeap(), 0, sizeof (MLang_impl) ); - mlang->vtbl_IMLangFontLink = &IMLangFontLink_vtbl; - mlang->vtbl_IMultiLanguage = &IMultiLanguage_vtbl; - mlang->vtbl_IMultiLanguage3 = &IMultiLanguage3_vtbl; - mlang->vtbl_IMLangFontLink2 = &IMLangFontLink2_vtbl; - mlang->vtbl_IMLangLineBreakConsole = &IMLangLineBreakConsole_vtbl; + mlang->IMLangFontLink_iface.lpVtbl = &IMLangFontLink_vtbl; + mlang->IMultiLanguage_iface.lpVtbl = &IMultiLanguage_vtbl; + mlang->IMultiLanguage3_iface.lpVtbl = &IMultiLanguage3_vtbl; + mlang->IMLangFontLink2_iface.lpVtbl = &IMLangFontLink2_vtbl; + mlang->IMLangLineBreakConsole_iface.lpVtbl = &IMLangLineBreakConsole_vtbl; mlang->total_cp = 0; for (i = 0; i < sizeof(mlang_data)/sizeof(mlang_data[0]); i++) @@ -3587,8 +3591,28 @@ HRESULT WINAPI DllCanUnloadNow(void) return dll_count == 0 ? S_OK : S_FALSE; } -HRESULT WINAPI GetGlobalFontLinkObject(void) + +/*********************************************************************** + * DllRegisterServer (MLANG.@) + */ +HRESULT WINAPI DllRegisterServer(void) { - FIXME("\n"); + return __wine_register_resources( instance ); +} + +/*********************************************************************** + * DllUnregisterServer (MLANG.@) + */ +HRESULT WINAPI DllUnregisterServer(void) +{ + return __wine_unregister_resources( instance ); +} + +HRESULT WINAPI GetGlobalFontLinkObject(void **unknown) +{ + if (!unknown) return E_INVALIDARG; + + FIXME("%p: stub\n", unknown); + return S_FALSE; } diff --git a/reactos/dll/win32/mlang/mlang.rbuild b/reactos/dll/win32/mlang/mlang.rbuild index 168c31a664b..646a9b13add 100644 --- a/reactos/dll/win32/mlang/mlang.rbuild +++ b/reactos/dll/win32/mlang/mlang.rbuild @@ -7,9 +7,10 @@ . include/reactos/wine + 0x600 mlang.c - regsvr.c + mlang.rc wine ole32 user32 diff --git a/reactos/dll/win32/mlang/mlang.rc b/reactos/dll/win32/mlang/mlang.rc new file mode 100644 index 00000000000..e8bfd64b5c4 --- /dev/null +++ b/reactos/dll/win32/mlang/mlang.rc @@ -0,0 +1 @@ +1 WINE_REGISTRY mlang.rgs diff --git a/reactos/dll/win32/mlang/mlang.rgs b/reactos/dll/win32/mlang/mlang.rgs new file mode 100644 index 00000000000..603b4121e9c --- /dev/null +++ b/reactos/dll/win32/mlang/mlang.rgs @@ -0,0 +1,21 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{275C23E2-3747-11D0-9FEA-00AA003F8646}' = s 'Multi Language Support' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{C04D65CF-B70D-11D0-B188-00AA0038C969}' = s 'Multi Language String' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + '{D66D6F99-CDAA-11D0-B822-00C04FC9B31F}' = s 'Multi Language ConvertCharset' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + } + } +} diff --git a/reactos/dll/win32/mlang/mlang.spec b/reactos/dll/win32/mlang/mlang.spec index dc9630ac903..fd683a93103 100644 --- a/reactos/dll/win32/mlang/mlang.spec +++ b/reactos/dll/win32/mlang/mlang.spec @@ -12,4 +12,4 @@ @ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer() -@ stdcall GetGlobalFontLinkObject() +@ stdcall GetGlobalFontLinkObject(ptr) diff --git a/reactos/dll/win32/mlang/mlang_classes.idl b/reactos/dll/win32/mlang/mlang_classes.idl new file mode 100644 index 00000000000..1832e2b0527 --- /dev/null +++ b/reactos/dll/win32/mlang/mlang_classes.idl @@ -0,0 +1,40 @@ +/* + * COM Classes for mlang + * + * Copyright 2010 Alexandre Julliard + * + * 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 + */ + +[ + helpstring("Multi Language Support"), + threading(both), + uuid(275c23e2-3747-11d0-9fea-00aa003f8646) +] +coclass CMultiLanguage { interface IMultiLanguage; } + +[ + helpstring("Multi Language String"), + threading(both), + uuid(c04d65cf-b70d-11d0-b188-00aa0038c969) +] +coclass CMLangString { interface IMultiLanguage; } + +[ + helpstring("Multi Language ConvertCharset"), + threading(both), + uuid(d66d6f99-cdaa-11d0-b822-00c04fc9b31f) +] +coclass CMLangConvertCharset { interface IMultiLanguage; } diff --git a/reactos/dll/win32/mlang/regsvr.c b/reactos/dll/win32/mlang/regsvr.c deleted file mode 100644 index eb6cbd4cc78..00000000000 --- a/reactos/dll/win32/mlang/regsvr.c +++ /dev/null @@ -1,510 +0,0 @@ -/* - * self-registerable dll functions for mlang.dll - * - * Copyright (C) 2003 John K. Hohm - * Copyright (C) 2004 Steven Edwards for ReactOS - * - * 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 "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "wingdi.h" -#include "winreg.h" -#include "winerror.h" - -#include "objbase.h" -#include "mlang.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -#include "initguid.h" - -WINE_DEFAULT_DEBUG_CHANNEL(mlang); - -/* This one should probably be defined in mlang.idl but MSDN claims it is no longer supported */ -DEFINE_GUID(CLSID_CMLangString, 0xc04d65cf, 0xb70d, 0x11d0, 0xb1,0x88, 0x00,0xaa,0x00,0x38,0xc9,0x69); - -/* - * Near the bottom of this file are the exported DllRegisterServer and - * DllUnregisterServer, which make all this worthwhile. - */ - -/*********************************************************************** - * interface for self-registering - */ -struct regsvr_interface -{ - IID const *iid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - IID const *base_iid; /* can be NULL to omit */ - int num_methods; /* can be <0 to omit */ - CLSID const *ps_clsid; /* can be NULL to omit */ - CLSID const *ps_clsid32; /* can be NULL to omit */ -}; - -static HRESULT register_interfaces(struct regsvr_interface const *list); -static HRESULT unregister_interfaces(struct regsvr_interface const *list); - -struct regsvr_coclass -{ - CLSID const *clsid; /* NULL for end of list */ - LPCSTR name; /* can be NULL to omit */ - LPCSTR ips; /* can be NULL to omit */ - LPCSTR ips32; /* can be NULL to omit */ - LPCSTR ips32_tmodel; /* can be NULL to omit */ - LPCSTR progid; /* can be NULL to omit */ - LPCSTR viprogid; /* can be NULL to omit */ - LPCSTR progid_extra; /* can be NULL to omit */ -}; - -static HRESULT register_coclasses(struct regsvr_coclass const *list); -static HRESULT unregister_coclasses(struct regsvr_coclass const *list); - -/*********************************************************************** - * static string constants - */ -static WCHAR const interface_keyname[10] = { - 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e', 0 }; -static WCHAR const base_ifa_keyname[14] = { - 'B', 'a', 's', 'e', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', - 'e', 0 }; -static WCHAR const num_methods_keyname[11] = { - 'N', 'u', 'm', 'M', 'e', 't', 'h', 'o', 'd', 's', 0 }; -static WCHAR const ps_clsid_keyname[15] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', 0 }; -static WCHAR const ps_clsid32_keyname[17] = { - 'P', 'r', 'o', 'x', 'y', 'S', 't', 'u', 'b', 'C', 'l', 's', - 'i', 'd', '3', '2', 0 }; -static WCHAR const clsid_keyname[6] = { - 'C', 'L', 'S', 'I', 'D', 0 }; -static WCHAR const curver_keyname[7] = { - 'C', 'u', 'r', 'V', 'e', 'r', 0 }; -static WCHAR const ips_keyname[13] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - 0 }; -static WCHAR const ips32_keyname[15] = { - 'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r', - '3', '2', 0 }; -static WCHAR const progid_keyname[7] = { - 'P', 'r', 'o', 'g', 'I', 'D', 0 }; -static WCHAR const viprogid_keyname[25] = { - 'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p', - 'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D', - 0 }; -static char const tmodel_valuename[] = "ThreadingModel"; - -/*********************************************************************** - * static helper functions - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid); -static LONG register_key_defvalueW(HKEY base, WCHAR const *name, - WCHAR const *value); -static LONG register_key_defvalueA(HKEY base, WCHAR const *name, - char const *value); -static LONG register_progid(WCHAR const *clsid, - char const *progid, char const *curver_progid, - char const *name, char const *extra); - -/*********************************************************************** - * register_interfaces - */ -static HRESULT register_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &interface_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - HKEY iid_key; - - StringFromGUID2(list->iid, buf, 39); - res = RegCreateKeyExW(interface_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &iid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_interface_key; - - if (list->name) { - res = RegSetValueExA(iid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->base_iid) { - res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (0 <= list->num_methods) { - static WCHAR const fmt[3] = { '%', 'd', 0 }; - HKEY key; - - res = RegCreateKeyExW(iid_key, num_methods_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - - sprintfW(buf, fmt, list->num_methods); - res = RegSetValueExW(key, NULL, 0, REG_SZ, - (CONST BYTE*)buf, - (lstrlenW(buf) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid) { - res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - if (list->ps_clsid32) { - res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); - if (res != ERROR_SUCCESS) goto error_close_iid_key; - } - - error_close_iid_key: - RegCloseKey(iid_key); - } - -error_close_interface_key: - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_interfaces - */ -static HRESULT unregister_interfaces(struct regsvr_interface const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY interface_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, interface_keyname, 0, - KEY_READ | KEY_WRITE, &interface_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->iid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->iid, buf, 39); - res = RegDeleteTreeW(interface_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - } - - RegCloseKey(interface_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * register_coclasses - */ -static HRESULT register_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegCreateKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &coclass_key, NULL); - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - HKEY clsid_key; - - StringFromGUID2(list->clsid, buf, 39); - res = RegCreateKeyExW(coclass_key, buf, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &clsid_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->name) { - res = RegSetValueExA(clsid_key, NULL, 0, REG_SZ, - (CONST BYTE*)(list->name), - strlen(list->name) + 1); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips) { - res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->ips32) { - HKEY ips32_key; - - res = RegCreateKeyExW(clsid_key, ips32_keyname, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, - &ips32_key, NULL); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = RegSetValueExA(ips32_key, NULL, 0, REG_SZ, - (CONST BYTE*)list->ips32, - lstrlenA(list->ips32) + 1); - if (res == ERROR_SUCCESS && list->ips32_tmodel) - res = RegSetValueExA(ips32_key, tmodel_valuename, 0, REG_SZ, - (CONST BYTE*)list->ips32_tmodel, - strlen(list->ips32_tmodel) + 1); - RegCloseKey(ips32_key); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->progid) { - res = register_key_defvalueA(clsid_key, progid_keyname, - list->progid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->progid, NULL, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - if (list->viprogid) { - res = register_key_defvalueA(clsid_key, viprogid_keyname, - list->viprogid); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - - res = register_progid(buf, list->viprogid, list->progid, - list->name, list->progid_extra); - if (res != ERROR_SUCCESS) goto error_close_clsid_key; - } - - error_close_clsid_key: - RegCloseKey(clsid_key); - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * unregister_coclasses - */ -static HRESULT unregister_coclasses(struct regsvr_coclass const *list) -{ - LONG res = ERROR_SUCCESS; - HKEY coclass_key; - - res = RegOpenKeyExW(HKEY_CLASSES_ROOT, clsid_keyname, 0, - KEY_READ | KEY_WRITE, &coclass_key); - if (res == ERROR_FILE_NOT_FOUND) return S_OK; - if (res != ERROR_SUCCESS) goto error_return; - - for (; res == ERROR_SUCCESS && list->clsid; ++list) { - WCHAR buf[39]; - - StringFromGUID2(list->clsid, buf, 39); - res = RegDeleteTreeW(coclass_key, buf); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - - if (list->progid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - - if (list->viprogid) { - res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->viprogid); - if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; - if (res != ERROR_SUCCESS) goto error_close_coclass_key; - } - } - -error_close_coclass_key: - RegCloseKey(coclass_key); -error_return: - return res != ERROR_SUCCESS ? HRESULT_FROM_WIN32(res) : S_OK; -} - -/*********************************************************************** - * regsvr_key_guid - */ -static LONG register_key_guid(HKEY base, WCHAR const *name, GUID const *guid) -{ - WCHAR buf[39]; - - StringFromGUID2(guid, buf, 39); - return register_key_defvalueW(base, name, buf); -} - -/*********************************************************************** - * regsvr_key_defvalueW - */ -static LONG register_key_defvalueW( - HKEY base, - WCHAR const *name, - WCHAR const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExW(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - (lstrlenW(value) + 1) * sizeof(WCHAR)); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_key_defvalueA - */ -static LONG register_key_defvalueA( - HKEY base, - WCHAR const *name, - char const *value) -{ - LONG res; - HKEY key; - - res = RegCreateKeyExW(base, name, 0, NULL, 0, - KEY_READ | KEY_WRITE, NULL, &key, NULL); - if (res != ERROR_SUCCESS) return res; - res = RegSetValueExA(key, NULL, 0, REG_SZ, (CONST BYTE*)value, - lstrlenA(value) + 1); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * regsvr_progid - */ -static LONG register_progid( - WCHAR const *clsid, - char const *progid, - char const *curver_progid, - char const *name, - char const *extra) -{ - LONG res; - HKEY progid_key; - - res = RegCreateKeyExA(HKEY_CLASSES_ROOT, progid, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &progid_key, NULL); - if (res != ERROR_SUCCESS) return res; - - if (name) { - res = RegSetValueExA(progid_key, NULL, 0, REG_SZ, - (CONST BYTE*)name, strlen(name) + 1); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (clsid) { - res = register_key_defvalueW(progid_key, clsid_keyname, clsid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (curver_progid) { - res = register_key_defvalueA(progid_key, curver_keyname, - curver_progid); - if (res != ERROR_SUCCESS) goto error_close_progid_key; - } - - if (extra) { - HKEY extra_key; - - res = RegCreateKeyExA(progid_key, extra, 0, - NULL, 0, KEY_READ | KEY_WRITE, NULL, - &extra_key, NULL); - if (res == ERROR_SUCCESS) - RegCloseKey(extra_key); - } - -error_close_progid_key: - RegCloseKey(progid_key); - return res; -} - -/*********************************************************************** - * coclass list - */ -static struct regsvr_coclass const coclass_list[] = { - { - &CLSID_CMultiLanguage, - "Multi Language Support", - NULL, - "mlang.dll", - "Both" - }, - { - &CLSID_CMLangString, - "Multi Language String", - NULL, - "mlang.dll", - "Both" - }, - { - &CLSID_CMLangConvertCharset, - "Multi Language ConvertCharset", - NULL, - "mlang.dll", - "Both" - }, - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * interface list - */ - -static struct regsvr_interface const interface_list[] = { - { NULL } /* list terminator */ -}; - -/*********************************************************************** - * DllRegisterServer (MLANG.@) - */ -HRESULT WINAPI DllRegisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = register_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = register_interfaces(interface_list); - return hr; -} - -/*********************************************************************** - * DllUnregisterServer (MLANG.@) - */ -HRESULT WINAPI DllUnregisterServer(void) -{ - HRESULT hr; - - TRACE("\n"); - - hr = unregister_coclasses(coclass_list); - if (SUCCEEDED(hr)) - hr = unregister_interfaces(interface_list); - return hr; -} diff --git a/reactos/include/psdk/mlang.idl b/reactos/include/psdk/mlang.idl index bb7b7700f0e..87805a49baf 100644 --- a/reactos/include/psdk/mlang.idl +++ b/reactos/include/psdk/mlang.idl @@ -750,7 +750,7 @@ cpp_quote("STDAPI Rfc1766ToLcidA(LCID *, LPCSTR);") cpp_quote("STDAPI Rfc1766ToLcidW(LCID *, LPCWSTR);") cpp_quote("#define Rfc1766ToLcid WINELIB_NAME_AW(Rfc1766ToLcid)") -cpp_quote("STDAPI GetGlobalFontLinkObject(void);") +cpp_quote("STDAPI GetGlobalFontLinkObject(void **unknown);") cpp_quote("STDAPI IsConvertINetStringAvailable(DWORD, DWORD);") cpp_quote("STDAPI ConvertINetString(LPDWORD, DWORD, DWORD, LPCSTR, LPINT, LPSTR, LPINT);") cpp_quote("STDAPI ConvertINetMultiByteToUnicode(LPDWORD, DWORD, LPCSTR, LPINT, LPWSTR, LPINT);") diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 45572fd9fb8..29eeccb583e 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -88,7 +88,7 @@ reactos/dll/win32/mcicda # Synced to Wine-1.3.37 reactos/dll/win32/mciqtz32 # Autosync reactos/dll/win32/mciseq # Synced to Wine-1.3.37 reactos/dll/win32/mciwave # Synced to Wine-1.3.37 -reactos/dll/win32/mlang # Autosync +reactos/dll/win32/mlang # Synced to Wine-1.3.37 reactos/dll/win32/mpr # Autosync reactos/dll/win32/mprapi # Autosync reactos/dll/win32/msacm32 # Autosync From b20df129444658d619e62f6f60c208e2355849e6 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 17:12:03 +0000 Subject: [PATCH 141/289] [MLANG_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55274 --- rostests/winetests/mlang/CMakeLists.txt | 2 +- rostests/winetests/mlang/mlang.c | 83 ++++++++++--------------- rostests/winetests/mlang/mlang.rbuild | 1 + 3 files changed, 35 insertions(+), 51 deletions(-) diff --git a/rostests/winetests/mlang/CMakeLists.txt b/rostests/winetests/mlang/CMakeLists.txt index 49345f66e8a..7fe5dc6dad2 100644 --- a/rostests/winetests/mlang/CMakeLists.txt +++ b/rostests/winetests/mlang/CMakeLists.txt @@ -6,5 +6,5 @@ add_definitions( add_executable(mlang_winetest mlang.c testlist.c) target_link_libraries(mlang_winetest wine uuid) set_module_type(mlang_winetest win32cui) -add_importlibs(mlang_winetest oleaut32 ole32 gdi32 msvcrt kernel32 ntdll) +add_importlibs(mlang_winetest mlang oleaut32 ole32 gdi32 msvcrt kernel32 ntdll) add_cd_file(TARGET mlang_winetest DESTINATION reactos/bin FOR all) diff --git a/rostests/winetests/mlang/mlang.c b/rostests/winetests/mlang/mlang.c index 2c4e0c17678..7ff4ec37727 100644 --- a/rostests/winetests/mlang/mlang.c +++ b/rostests/winetests/mlang/mlang.c @@ -254,28 +254,6 @@ static BOOL init_function_ptrs(void) ok(0, (format), string1, string2); \ } -/* lstrcmpW is not supported on Win9x! */ -static int mylstrcmpW(const WCHAR* str1, const WCHAR* str2) -{ - if (!str2) return 1; - while (*str1 && *str1==*str2) { - str1++; - str2++; - } - return *str1-*str2; -} - -/* lstrcpyW is not supported on Win95 */ -static void mylstrcpyW(WCHAR* str1, const WCHAR* str2) -{ - while (str2 && *str2) { - *str1 = *str2; - str1++; - str2++; - } - *str1 = '\0'; -} - static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) { /* these APIs are broken regarding constness of the input buffer */ @@ -586,8 +564,6 @@ static void test_EnumCodePages(IMultiLanguage2 *iML2, DWORD flags) #ifdef DUMP_CP_INFO trace("%u: codepage %u family %u\n", i, cpinfo[i].uiCodePage, cpinfo[i].uiFamilyCodePage); #endif - /* Win95 does not support UTF-7 */ - if (cpinfo[i].uiCodePage == CP_UTF7) continue; /* support files for some codepages might be not installed, or * the codepage is just an alias. @@ -773,7 +749,6 @@ static void test_EnumScripts(IMultiLanguage2 *iML2, DWORD flags) if (!flags) { ok(n == total, "IEnumScript_Next: expected %u, got %u\n", total, n); - flags = SCRIPTCONTF_SCRIPT_USER | SCRIPTCONTF_SCRIPT_HIDE | SCRIPTCONTF_SCRIPT_SYSTEM; } total = n; @@ -834,7 +809,7 @@ static void IMLangFontLink_Test(IMLangFontLink* iMLFL) DWORD dwCodePages, dwManyCodePages; DWORD dwCmpCodePages; UINT CodePage; - static const WCHAR str[3] = { 'd', 0x0436, 0xff90 }; + static const WCHAR str[] = { 'd', 0x0436, 0xff90 }; LONG processed; HRESULT ret; @@ -1227,28 +1202,32 @@ static void test_GetRfc1766Info(IMultiLanguage2 *iML2) ok(!lstrcmpA(rfc1766A, info_table[i].rfc1766), "#%02d: got '%s' (expected '%s')\n", i, rfc1766A, info_table[i].rfc1766); - /* Some IE versions truncate an oversized name one character to short */ - mylstrcpyW(short_broken_name, info_table[i].broken_name); - short_broken_name[MAX_LOCALE_NAME - 2] = '\0'; + /* Some IE versions truncate an oversized name one character too short */ + if (info_table[i].broken_name) { + lstrcpyW(short_broken_name, info_table[i].broken_name); + short_broken_name[MAX_LOCALE_NAME - 2] = 0; + } if (info_table[i].todo & TODO_NAME) { todo_wine - ok( (!mylstrcmpW(prfc->wszLocaleName, info_table[i].localename)) || - broken(!mylstrcmpW(prfc->wszLocaleName, info_table[i].broken_name)) || /* IE < 6.0 */ - broken(!mylstrcmpW(prfc->wszLocaleName, short_broken_name)), + ok( (!lstrcmpW(prfc->wszLocaleName, info_table[i].localename)) || + (info_table[i].broken_name && ( + broken(!lstrcmpW(prfc->wszLocaleName, info_table[i].broken_name)) || /* IE < 6.0 */ + broken(!lstrcmpW(prfc->wszLocaleName, short_broken_name)))), "#%02d: got %s (expected %s)\n", i, wine_dbgstr_w(prfc->wszLocaleName), wine_dbgstr_w(info_table[i].localename)); } else - ok( (!mylstrcmpW(prfc->wszLocaleName, info_table[i].localename)) || - broken(!mylstrcmpW(prfc->wszLocaleName, info_table[i].broken_name)) || /* IE < 6.0 */ - broken(!mylstrcmpW(prfc->wszLocaleName, short_broken_name)), + ok( (!lstrcmpW(prfc->wszLocaleName, info_table[i].localename)) || + (info_table[i].broken_name && ( + broken(!lstrcmpW(prfc->wszLocaleName, info_table[i].broken_name)) || /* IE < 6.0 */ + broken(!lstrcmpW(prfc->wszLocaleName, short_broken_name)))), "#%02d: got %s (expected %s)\n", i, wine_dbgstr_w(prfc->wszLocaleName), wine_dbgstr_w(info_table[i].localename)); } - /* SUBLANG_NEUTRAL only allowed for english, arabic, chinese */ + /* SUBLANG_NEUTRAL only allowed for English, Arabic, Chinese */ ret = IMultiLanguage2_GetRfc1766Info(iML2, MAKELANGID(LANG_GERMAN, SUBLANG_NEUTRAL), LANG_ENGLISH, prfc); ok(ret == E_FAIL, "got 0x%x (expected E_FAIL)\n", ret); @@ -1903,20 +1882,6 @@ static void test_IsCodePageInstallable(IMultiLanguage2 *ml2) UINT i; HRESULT hr; - SetLastError(0xdeadbeef); - lstrcmpW(NULL, NULL); - if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - { - /* This corruption leads (sometimes) to test failures in oleaut32 but also - * to the inability to use the Regional Settings. - * This only seems to be an issue with Win98 and IE6 (mlang version 6.0.2800.1106). - * - * A reboot restores the codepages again. - */ - win_skip("IsCodePageInstallable could mess up the codepages on Win98\n"); - return; - } - for (i = 0; i < 0xffff; i++) { hr = IMultiLanguage2_IsCodePageInstallable(ml2, i); @@ -1932,6 +1897,23 @@ static void test_IsCodePageInstallable(IMultiLanguage2 *ml2) } } +static void test_GetGlobalFontLinkObject(void) +{ + HRESULT ret; + void *unknown; + + ret = GetGlobalFontLinkObject(NULL); + ok(ret == E_INVALIDARG, "expected E_INVALIDARG got %#x\n", ret); + + unknown = (void *)0xdeadbeef; + ret = GetGlobalFontLinkObject(&unknown); +todo_wine { + ok(ret == S_OK, "expected S_OK got %#x\n", ret); + ok(unknown != NULL && unknown != (void *)0xdeadbeef, + "GetGlobalFontLinkObject() returned %p\n", unknown); + } +} + START_TEST(mlang) { IMultiLanguage *iML = NULL; @@ -1950,6 +1932,7 @@ START_TEST(mlang) test_ConvertINetUnicodeToMultiByte(); test_JapaneseConversion(); + test_GetGlobalFontLinkObject(); trace("IMultiLanguage\n"); ret = CoCreateInstance(&CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER, diff --git a/rostests/winetests/mlang/mlang.rbuild b/rostests/winetests/mlang/mlang.rbuild index 05d515cedbe..3426763e41a 100644 --- a/rostests/winetests/mlang/mlang.rbuild +++ b/rostests/winetests/mlang/mlang.rbuild @@ -8,6 +8,7 @@ testlist.c wine uuid + mlang oleaut32 ole32 gdi32 From 5f4ae9949c4f925b0c0809a32756b63ff6707b5e Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 17:21:07 +0000 Subject: [PATCH 142/289] [WINEMP3.ACM] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55275 --- reactos/dll/win32/winemp3.acm/mpegl3.c | 79 +++++++++++++++++++------- reactos/media/doc/README.WINE | 2 +- 2 files changed, 61 insertions(+), 20 deletions(-) diff --git a/reactos/dll/win32/winemp3.acm/mpegl3.c b/reactos/dll/win32/winemp3.acm/mpegl3.c index 1e09c10463c..21962b4e42d 100644 --- a/reactos/dll/win32/winemp3.acm/mpegl3.c +++ b/reactos/dll/win32/winemp3.acm/mpegl3.c @@ -29,7 +29,7 @@ #include #ifdef HAVE_MPG123_H -# include "mpg123.h" +# include #else # ifdef HAVE_COREAUDIO_COREAUDIO_H # include @@ -106,6 +106,7 @@ static DWORD MPEG3_GetFormatIndex(LPWAVEFORMATEX wfx) hi = NUM_PCM_FORMATS; fmts = PCM_Formats; break; + case WAVE_FORMAT_MPEG: case WAVE_FORMAT_MPEGLAYER3: hi = NUM_MPEG3_FORMATS; fmts = MPEG3_Formats; @@ -192,7 +193,7 @@ static void mp3_horse(PACMDRVSTREAMINSTANCE adsi, TRACE("New format: %li Hz, %i channels, encoding value %i\n", rate, channels, enc); } dpos += size; - if (dpos > *ndst) break; + if (dpos >= *ndst) break; } while (ret != MPG123_ERR && ret != MPG123_NEED_MORE); *ndst = dpos; } @@ -233,7 +234,8 @@ static LRESULT MPEG3_StreamOpen(PACMDRVSTREAMINSTANCE adsi) { goto theEnd; } - else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 && + else if ((adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 || + adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEG) && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) { /* resampling or mono <=> stereo not available @@ -290,7 +292,7 @@ static const unsigned short Mp3SampleRates[2][4] = typedef struct tagAcmMpeg3Data { - LRESULT (*convert)(PACMDRVSTREAMINSTANCE adsi, const unsigned char*, + LRESULT (*convert)(PACMDRVSTREAMINSTANCE adsi, unsigned char*, LPDWORD, unsigned char*, LPDWORD); AudioConverterRef acr; AudioStreamBasicDescription in,out; @@ -395,7 +397,7 @@ static SInt32 Mp3GetPacketLength(const unsigned char* src) and *nsrc to the length of the unwanted data and return no error. */ static LRESULT mp3_leopard_horse(PACMDRVSTREAMINSTANCE adsi, - const unsigned char* src, LPDWORD nsrc, + unsigned char* src, LPDWORD nsrc, unsigned char* dst, LPDWORD ndst) { OSStatus err; @@ -406,7 +408,7 @@ static LRESULT mp3_leopard_horse(PACMDRVSTREAMINSTANCE adsi, TRACE("ndst %u %p <- %u %p\n", *ndst, dst, *nsrc, src); - TRACE("First 16 bytes to input: %s\n", wine_dbgstr_an(src, 16)); + TRACE("First 16 bytes to input: %s\n", wine_dbgstr_an((const char *)src, 16)); /* Parse ID3 tag */ if (!memcmp(src, "ID3", 3) && amd->tagBytesLeft == -1) @@ -429,7 +431,7 @@ static LRESULT mp3_leopard_horse(PACMDRVSTREAMINSTANCE adsi, { src += amd->tagBytesLeft; *nsrc -= amd->tagBytesLeft; - TRACE("Skipping %d for ID3 tag\n", amd->tagBytesLeft); + TRACE("Skipping %ld for ID3 tag\n", amd->tagBytesLeft); } /* @@ -460,7 +462,7 @@ static LRESULT mp3_leopard_horse(PACMDRVSTREAMINSTANCE adsi, syncSkip = psrc - src; src += syncSkip; *nsrc -= syncSkip; - TRACE("Skipping %d for frame sync\n", syncSkip); + TRACE("Skipping %ld for frame sync\n", syncSkip); } break; } @@ -583,7 +585,8 @@ static LRESULT MPEG3_StreamOpen(PACMDRVSTREAMINSTANCE adsi) adsi->dwDriver = (DWORD_PTR)aad; - if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 && + if ((adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 || + adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEG) && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) { OSStatus err; @@ -660,7 +663,7 @@ static LRESULT MPEG3_DriverDetails(PACMDRIVERDETAILSW add) add->vdwACM = 0x01000000; add->vdwDriver = 0x01000000; add->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC; - add->cFormatTags = 2; /* PCM, MPEG3 */ + add->cFormatTags = 3; /* PCM, MPEG3 */ add->cFilterTags = 0; add->hicon = NULL; MultiByteToWideChar( CP_ACP, 0, "WINE-MPEG3", -1, @@ -684,16 +687,17 @@ static LRESULT MPEG3_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery) { static const WCHAR szPcm[]={'P','C','M',0}; static const WCHAR szMpeg3[]={'M','P','e','g','3',0}; + static const WCHAR szMpeg[]={'M','P','e','g',0}; switch (dwQuery) { case ACM_FORMATTAGDETAILSF_INDEX: - if (aftd->dwFormatTagIndex >= 2) return ACMERR_NOTPOSSIBLE; + if (aftd->dwFormatTagIndex > 2) return ACMERR_NOTPOSSIBLE; break; case ACM_FORMATTAGDETAILSF_LARGESTSIZE: if (aftd->dwFormatTag == WAVE_FORMAT_UNKNOWN) { - aftd->dwFormatTagIndex = 1; /* WAVE_FORMAT_MPEGLAYER3 is bigger than PCM */ + aftd->dwFormatTagIndex = 2; /* WAVE_FORMAT_MPEG is biggest */ break; } /* fall thru */ @@ -702,6 +706,7 @@ static LRESULT MPEG3_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery) { case WAVE_FORMAT_PCM: aftd->dwFormatTagIndex = 0; break; case WAVE_FORMAT_MPEGLAYER3: aftd->dwFormatTagIndex = 1; break; + case WAVE_FORMAT_MPEG: aftd->dwFormatTagIndex = 2; break; default: return ACMERR_NOTPOSSIBLE; } break; @@ -725,11 +730,17 @@ static LRESULT MPEG3_FormatTagDetails(PACMFORMATTAGDETAILSW aftd, DWORD dwQuery) aftd->cStandardFormats = NUM_MPEG3_FORMATS; lstrcpyW(aftd->szFormatTag, szMpeg3); break; + case 2: + aftd->dwFormatTag = WAVE_FORMAT_MPEG; + aftd->cbFormatSize = sizeof(MPEG1WAVEFORMAT); + aftd->cStandardFormats = NUM_MPEG3_FORMATS; + lstrcpyW(aftd->szFormatTag, szMpeg); + break; } return MMSYSERR_NOERROR; } -static void fill_in_wfx(unsigned cbwfx, WAVEFORMATEX* wfx, unsigned bit_rate) +static void fill_in_mp3(unsigned cbwfx, WAVEFORMATEX* wfx, unsigned bit_rate) { MPEGLAYER3WAVEFORMAT* mp3wfx = (MPEGLAYER3WAVEFORMAT*)wfx; @@ -746,6 +757,24 @@ static void fill_in_wfx(unsigned cbwfx, WAVEFORMATEX* wfx, unsigned bit_rate) } } +static void fill_in_mpeg(unsigned cbwfx, WAVEFORMATEX* wfx, unsigned bit_rate) +{ + MPEG1WAVEFORMAT* mp3wfx = (MPEG1WAVEFORMAT*)wfx; + + wfx->nAvgBytesPerSec = bit_rate / 8; + if (cbwfx >= sizeof(WAVEFORMATEX)) + wfx->cbSize = sizeof(MPEG1WAVEFORMAT) - sizeof(WAVEFORMATEX); + if (cbwfx >= sizeof(MPEG1WAVEFORMAT)) + { + mp3wfx->fwHeadLayer = ACM_MPEG_LAYER3; + mp3wfx->dwHeadBitrate = wfx->nAvgBytesPerSec * 8; + mp3wfx->fwHeadMode = ACM_MPEG_JOINTSTEREO; + mp3wfx->fwHeadModeExt = 0xf; + mp3wfx->wHeadEmphasis = 1; + mp3wfx->fwHeadFlags = ACM_MPEG_ID_MPEG1; + } +} + /*********************************************************************** * MPEG3_FormatDetails * @@ -775,12 +804,16 @@ static LRESULT MPEG3_FormatDetails(PACMFORMATDETAILSW afd, DWORD dwQuery) afd->pwfx->nSamplesPerSec * afd->pwfx->nBlockAlign; break; case WAVE_FORMAT_MPEGLAYER3: + case WAVE_FORMAT_MPEG: if (afd->dwFormatIndex >= NUM_MPEG3_FORMATS) return ACMERR_NOTPOSSIBLE; afd->pwfx->nChannels = MPEG3_Formats[afd->dwFormatIndex].nChannels; afd->pwfx->nSamplesPerSec = MPEG3_Formats[afd->dwFormatIndex].rate; afd->pwfx->wBitsPerSample = MPEG3_Formats[afd->dwFormatIndex].nBits; afd->pwfx->nBlockAlign = 1; - fill_in_wfx(afd->cbwfx, afd->pwfx, 192000); + if (afd->dwFormatTag == WAVE_FORMAT_MPEGLAYER3) + fill_in_mp3(afd->cbwfx, afd->pwfx, 192000); + else + fill_in_mpeg(afd->cbwfx, afd->pwfx, 192000); break; default: WARN("Unsupported tag %08x\n", afd->dwFormatTag); @@ -840,9 +873,13 @@ static LRESULT MPEG3_FormatSuggest(PACMDRVFORMATSUGGEST adfs) adfs->pwfxDst->nBlockAlign = (adfs->pwfxDst->nChannels * adfs->pwfxDst->wBitsPerSample) / 8; adfs->pwfxDst->nAvgBytesPerSec = adfs->pwfxDst->nSamplesPerSec * adfs->pwfxDst->nBlockAlign; break; + case WAVE_FORMAT_MPEG: + adfs->pwfxDst->nBlockAlign = 1; + fill_in_mpeg(adfs->cbwfxDst, adfs->pwfxDst, 192000); + break; case WAVE_FORMAT_MPEGLAYER3: adfs->pwfxDst->nBlockAlign = 1; - fill_in_wfx(adfs->cbwfxDst, adfs->pwfxDst, 192000); + fill_in_mp3(adfs->cbwfxDst, adfs->pwfxDst, 192000); break; default: FIXME("\n"); @@ -865,14 +902,16 @@ static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE ad case ACM_STREAMSIZEF_DESTINATION: /* cbDstLength => cbSrcLength */ if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && - adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) + (adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3 || + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEG)) { nblocks = (adss->cbDstLength - 3000) / (DWORD)(adsi->pwfxDst->nAvgBytesPerSec * 1152 / adsi->pwfxDst->nSamplesPerSec + 0.5); if (nblocks == 0) return ACMERR_NOTPOSSIBLE; adss->cbSrcLength = nblocks * 1152 * adsi->pwfxSrc->nBlockAlign; } - else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 && + else if ((adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 || + adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEG) && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) { nblocks = adss->cbDstLength / (adsi->pwfxDst->nBlockAlign * 1152); @@ -888,7 +927,8 @@ static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE ad case ACM_STREAMSIZEF_SOURCE: /* cbSrcLength => cbDstLength */ if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_PCM && - adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3) + (adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEGLAYER3 || + adsi->pwfxDst->wFormatTag == WAVE_FORMAT_MPEG)) { nblocks = adss->cbSrcLength / (adsi->pwfxSrc->nBlockAlign * 1152); if (nblocks == 0) @@ -898,7 +938,8 @@ static LRESULT MPEG3_StreamSize(PACMDRVSTREAMINSTANCE adsi, PACMDRVSTREAMSIZE ad nblocks++; adss->cbDstLength = 3000 + nblocks * (DWORD)(adsi->pwfxDst->nAvgBytesPerSec * 1152 / adsi->pwfxDst->nSamplesPerSec + 0.5); } - else if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 && + else if ((adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3 || + adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEG) && adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM) { nblocks = adss->cbSrcLength / (DWORD)(adsi->pwfxSrc->nAvgBytesPerSec * 1152 / adsi->pwfxSrc->nSamplesPerSec); diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 29eeccb583e..aa98d95ed3c 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -170,7 +170,7 @@ reactos/dll/win32/uxtheme # Autosync reactos/dll/win32/version # Autosync reactos/dll/win32/wer # Autosync reactos/dll/win32/windowscodecs # Autosync -reactos/dll/win32/winemp3.acm # Autosync +reactos/dll/win32/winemp3.acm # Synced to Wine-1.3.37 reactos/dll/win32/wininet # Autosync reactos/dll/win32/winhttp # Autosync reactos/dll/win32/winmm # Forked at Wine-20050628 From 53d0c6b010e0458877199836ada1941c8bda5080 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 17:34:24 +0000 Subject: [PATCH 143/289] [MSCOREE] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55276 --- reactos/dll/win32/mscoree/CMakeLists.txt | 14 +- reactos/dll/win32/mscoree/assembly.c | 250 ++++ reactos/dll/win32/mscoree/config.c | 472 +++++++ reactos/dll/win32/mscoree/cordebug.c | 786 +++++++++++ reactos/dll/win32/mscoree/corruntimehost.c | 703 +++++++++- reactos/dll/win32/mscoree/metadata.c | 205 +++ reactos/dll/win32/mscoree/metahost.c | 1341 +++++++++++++++++++ reactos/dll/win32/mscoree/mscoree.rbuild | 9 + reactos/dll/win32/mscoree/mscoree.rc | 1 + reactos/dll/win32/mscoree/mscoree.rgs | 84 ++ reactos/dll/win32/mscoree/mscoree.spec | 11 +- reactos/dll/win32/mscoree/mscoree_main.c | 519 +++---- reactos/dll/win32/mscoree/mscoree_private.h | 170 ++- reactos/lib/sdk/uuid/CMakeLists.txt | 5 +- reactos/media/doc/README.WINE | 2 +- 15 files changed, 4287 insertions(+), 285 deletions(-) create mode 100644 reactos/dll/win32/mscoree/assembly.c create mode 100644 reactos/dll/win32/mscoree/config.c create mode 100644 reactos/dll/win32/mscoree/cordebug.c create mode 100644 reactos/dll/win32/mscoree/metadata.c create mode 100644 reactos/dll/win32/mscoree/metahost.c create mode 100644 reactos/dll/win32/mscoree/mscoree.rc create mode 100644 reactos/dll/win32/mscoree/mscoree.rgs diff --git a/reactos/dll/win32/mscoree/CMakeLists.txt b/reactos/dll/win32/mscoree/CMakeLists.txt index 75d41f63ddb..1aab2a671ac 100644 --- a/reactos/dll/win32/mscoree/CMakeLists.txt +++ b/reactos/dll/win32/mscoree/CMakeLists.txt @@ -2,11 +2,18 @@ add_definitions(-D__WINESRC__) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) +set_rc_compiler() spec2def(mscoree.dll mscoree.spec) list(APPEND SOURCE + assembly.c + config.c + cordebug.c corruntimehost.c + metadata.c + metahost.c mscoree_main.c + mscoree.rc ${CMAKE_CURRENT_BINARY_DIR}/mscoree_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/mscoree.def) @@ -14,5 +21,10 @@ add_library(mscoree SHARED ${SOURCE}) set_module_type(mscoree win32dll) target_link_libraries(mscoree wine uuid) -add_importlibs(mscoree advapi32 shell32 msvcrt kernel32 ntdll) + +if(MSVC) + target_link_libraries(mscoree xml_uuids) +endif() + +add_importlibs(mscoree dbghelp advapi32 shell32 ole32 shlwapi msvcrt kernel32 ntdll) add_cd_file(TARGET mscoree DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/mscoree/assembly.c b/reactos/dll/win32/mscoree/assembly.c new file mode 100644 index 00000000000..07723f9edb7 --- /dev/null +++ b/reactos/dll/win32/mscoree/assembly.c @@ -0,0 +1,250 @@ +/* + * assembly parser + * + * Copyright 2008 James Hawkins + * + * 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 "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winver.h" +#include "dbghelp.h" +#include "ole2.h" +#include "mscoree.h" +#include "corhdr.h" +#include "metahost.h" +#include "cordebug.h" +#include "wine/list.h" +#include "mscoree_private.h" + +#include "wine/debug.h" +#include "wine/unicode.h" + +typedef struct +{ + ULONG Signature; + USHORT MajorVersion; + USHORT MinorVersion; + ULONG Reserved; + ULONG VersionLength; + LPSTR Version; + BYTE Flags; + WORD Streams; +} METADATAHDR; + +typedef struct +{ + DWORD Offset; + DWORD Size; +} METADATASTREAMHDR; + +typedef struct tagCLRTABLE +{ + INT rows; + DWORD offset; +} CLRTABLE; + +struct tagASSEMBLY +{ + LPWSTR path; + + HANDLE hfile; + HANDLE hmap; + BYTE *data; + + IMAGE_NT_HEADERS *nthdr; + IMAGE_COR20_HEADER *corhdr; + + METADATAHDR *metadatahdr; +}; + +static inline LPWSTR strdupW(LPCWSTR src) +{ + LPWSTR dest; + + if (!src) + return NULL; + + dest = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(src) + 1) * sizeof(WCHAR)); + if (dest) + lstrcpyW(dest, src); + + return dest; +} + +static HRESULT parse_metadata_header(ASSEMBLY *assembly, DWORD *hdrsz) +{ + METADATAHDR *metadatahdr; + BYTE *ptr, *dest; + DWORD size, ofs; + ULONG rva; + + rva = assembly->corhdr->MetaData.VirtualAddress; + ptr = ImageRvaToVa(assembly->nthdr, assembly->data, rva, NULL); + if (!ptr) + return E_FAIL; + + metadatahdr = (METADATAHDR *)ptr; + + assembly->metadatahdr = HeapAlloc(GetProcessHeap(), 0, sizeof(METADATAHDR)); + if (!assembly->metadatahdr) + return E_OUTOFMEMORY; + + size = FIELD_OFFSET(METADATAHDR, Version); + memcpy(assembly->metadatahdr, metadatahdr, size); + + assembly->metadatahdr->Version = (LPSTR)&metadatahdr->Version; + + ofs = FIELD_OFFSET(METADATAHDR, Flags); + ptr += FIELD_OFFSET(METADATAHDR, Version) + metadatahdr->VersionLength + 1; + dest = (BYTE *)assembly->metadatahdr + ofs; + memcpy(dest, ptr, sizeof(METADATAHDR) - ofs); + + *hdrsz = sizeof(METADATAHDR) - sizeof(LPSTR) + metadatahdr->VersionLength + 1; + + return S_OK; +} + +static HRESULT parse_clr_metadata(ASSEMBLY *assembly) +{ + HRESULT hr; + DWORD hdrsz; + + hr = parse_metadata_header(assembly, &hdrsz); + if (FAILED(hr)) + return hr; + + return S_OK; +} + +static HRESULT parse_pe_header(ASSEMBLY *assembly) +{ + IMAGE_DATA_DIRECTORY *datadirs; + + assembly->nthdr = ImageNtHeader(assembly->data); + if (!assembly->nthdr) + return E_FAIL; + + if (assembly->nthdr->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) + { + IMAGE_OPTIONAL_HEADER64 *opthdr = + (IMAGE_OPTIONAL_HEADER64 *)&assembly->nthdr->OptionalHeader; + datadirs = opthdr->DataDirectory; + } + else + { + IMAGE_OPTIONAL_HEADER32 *opthdr = + (IMAGE_OPTIONAL_HEADER32 *)&assembly->nthdr->OptionalHeader; + datadirs = opthdr->DataDirectory; + } + + if (!datadirs) + return E_FAIL; + + if (!datadirs[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress || + !datadirs[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].Size) + { + return E_FAIL; + } + + assembly->corhdr = ImageRvaToVa(assembly->nthdr, assembly->data, + datadirs[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress, NULL); + if (!assembly->corhdr) + return E_FAIL; + + return S_OK; +} + +HRESULT assembly_create(ASSEMBLY **out, LPCWSTR file) +{ + ASSEMBLY *assembly; + HRESULT hr; + + *out = NULL; + + assembly = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ASSEMBLY)); + if (!assembly) + return E_OUTOFMEMORY; + + assembly->path = strdupW(file); + if (!assembly->path) + { + hr = E_OUTOFMEMORY; + goto failed; + } + + assembly->hfile = CreateFileW(file, GENERIC_READ, FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (assembly->hfile == INVALID_HANDLE_VALUE) + { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto failed; + } + + assembly->hmap = CreateFileMappingW(assembly->hfile, NULL, PAGE_READONLY, + 0, 0, NULL); + if (!assembly->hmap) + { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto failed; + } + + assembly->data = MapViewOfFile(assembly->hmap, FILE_MAP_READ, 0, 0, 0); + if (!assembly->data) + { + hr = HRESULT_FROM_WIN32(GetLastError()); + goto failed; + } + + hr = parse_pe_header(assembly); + if (FAILED(hr)) goto failed; + + hr = parse_clr_metadata(assembly); + if (FAILED(hr)) goto failed; + + *out = assembly; + return S_OK; + +failed: + assembly_release(assembly); + return hr; +} + +HRESULT assembly_release(ASSEMBLY *assembly) +{ + if (!assembly) + return S_OK; + + HeapFree(GetProcessHeap(), 0, assembly->metadatahdr); + HeapFree(GetProcessHeap(), 0, assembly->path); + UnmapViewOfFile(assembly->data); + CloseHandle(assembly->hmap); + CloseHandle(assembly->hfile); + HeapFree(GetProcessHeap(), 0, assembly); + + return S_OK; +} + +HRESULT assembly_get_runtime_version(ASSEMBLY *assembly, LPSTR *version) +{ + *version = assembly->metadatahdr->Version; + + return S_OK; +} diff --git a/reactos/dll/win32/mscoree/config.c b/reactos/dll/win32/mscoree/config.c new file mode 100644 index 00000000000..02c11b1adf5 --- /dev/null +++ b/reactos/dll/win32/mscoree/config.c @@ -0,0 +1,472 @@ +/* + * Configuration file parsing + * + * Copyright 2010 Vincent Povirk + * + * 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 + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "ole2.h" +#include "msxml2.h" +#include "mscoree.h" +#include "corhdr.h" +#include "metahost.h" +#include "cordebug.h" +#include "wine/list.h" +#include "mscoree_private.h" +#include "shlwapi.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL( mscoree ); + +enum parse_state +{ + STATE_ROOT, + STATE_CONFIGURATION, + STATE_STARTUP, + STATE_UNKNOWN +}; + +typedef struct ConfigFileHandler +{ + ISAXContentHandler ISAXContentHandler_iface; + ISAXErrorHandler ISAXErrorHandler_iface; + LONG ref; + enum parse_state states[16]; + int statenum; + parsed_config_file *result; +} ConfigFileHandler; + +static inline ConfigFileHandler *impl_from_ISAXContentHandler(ISAXContentHandler *iface) +{ + return CONTAINING_RECORD(iface, ConfigFileHandler, ISAXContentHandler_iface); +} + +static inline ConfigFileHandler *impl_from_ISAXErrorHandler(ISAXErrorHandler *iface) +{ + return CONTAINING_RECORD(iface, ConfigFileHandler, ISAXErrorHandler_iface); +} + +static HRESULT WINAPI ConfigFileHandler_QueryInterface(ISAXContentHandler *iface, + REFIID riid, void **ppvObject) +{ + if (IsEqualGUID(riid, &IID_ISAXContentHandler) || + IsEqualGUID(riid, &IID_IUnknown)) + { + *ppvObject = iface; + } + else + { + WARN("Unsupported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + ISAXContentHandler_AddRef(iface); + + return S_OK; +} + +static ULONG WINAPI ConfigFileHandler_AddRef(ISAXContentHandler *iface) +{ + ConfigFileHandler *This = impl_from_ISAXContentHandler(iface); + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI ConfigFileHandler_Release(ISAXContentHandler *iface) +{ + ConfigFileHandler *This = impl_from_ISAXContentHandler(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +static HRESULT WINAPI ConfigFileHandler_putDocumentLocator(ISAXContentHandler *iface, + ISAXLocator *pLocator) +{ + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_startDocument(ISAXContentHandler *iface) +{ + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_endDocument(ISAXContentHandler *iface) +{ + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_startPrefixMapping(ISAXContentHandler *iface, + const WCHAR *pPrefix, int nPrefix, const WCHAR *pUri, int nUri) +{ + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_endPrefixMapping(ISAXContentHandler *iface, + const WCHAR *pPrefix, int nPrefix) +{ + return S_OK; +} + +static HRESULT parse_startup(ConfigFileHandler *This, ISAXAttributes *pAttr) +{ + static const WCHAR legacy[] = {'u','s','e','L','e','g','a','c','y','V','2','R','u','n','t','i','m','e','A','c','t','i','v','a','t','i','o','n','P','o','l','i','c','y',0}; + static const WCHAR empty[] = {0}; + LPCWSTR value; + int value_size; + HRESULT hr; + + hr = ISAXAttributes_getValueFromName(pAttr, empty, 0, legacy, lstrlenW(legacy), &value, &value_size); + if (SUCCEEDED(hr)) + FIXME("useLegacyV2RuntimeActivationPolicy=%s not implemented\n", debugstr_wn(value, value_size)); + hr = S_OK; + + return hr; +} + +static HRESULT parse_supported_runtime(ConfigFileHandler *This, ISAXAttributes *pAttr) +{ + static const WCHAR version[] = {'v','e','r','s','i','o','n',0}; + static const WCHAR sku[] = {'s','k','u',0}; + static const WCHAR empty[] = {0}; + LPCWSTR value; + int value_size; + HRESULT hr; + supported_runtime *entry; + + hr = ISAXAttributes_getValueFromName(pAttr, empty, 0, version, lstrlenW(version), &value, &value_size); + if (SUCCEEDED(hr)) + { + TRACE("%s\n", debugstr_wn(value, value_size)); + entry = HeapAlloc(GetProcessHeap(), 0, sizeof(supported_runtime)); + if (entry) + { + entry->version = HeapAlloc(GetProcessHeap(), 0, (value_size + 1) * sizeof(WCHAR)); + if (entry->version) + { + lstrcpyW(entry->version, value); + list_add_tail(&This->result->supported_runtimes, &entry->entry); + } + else + { + HeapFree(GetProcessHeap(), 0, entry); + hr = E_OUTOFMEMORY; + } + } + else + hr = E_OUTOFMEMORY; + } + else + WARN("Missing version attribute\n"); + + if (SUCCEEDED(hr)) + { + hr = ISAXAttributes_getValueFromName(pAttr, empty, 0, sku, lstrlenW(sku), &value, &value_size); + if (SUCCEEDED(hr)) + FIXME("sku=%s not implemented\n", debugstr_wn(value, value_size)); + hr = S_OK; + } + + return hr; +} + +static HRESULT WINAPI ConfigFileHandler_startElement(ISAXContentHandler *iface, + const WCHAR *pNamespaceUri, int nNamespaceUri, const WCHAR *pLocalName, + int nLocalName, const WCHAR *pQName, int nQName, ISAXAttributes *pAttr) +{ + ConfigFileHandler *This = impl_from_ISAXContentHandler(iface); + static const WCHAR configuration[] = {'c','o','n','f','i','g','u','r','a','t','i','o','n',0}; + static const WCHAR startup[] = {'s','t','a','r','t','u','p',0}; + static const WCHAR supportedRuntime[] = {'s','u','p','p','o','r','t','e','d','R','u','n','t','i','m','e',0}; + HRESULT hr = S_OK; + + TRACE("%s %s %s\n", debugstr_wn(pNamespaceUri,nNamespaceUri), + debugstr_wn(pLocalName,nLocalName), debugstr_wn(pQName,nQName)); + + if (This->statenum == sizeof(This->states) / sizeof(This->states[0]) - 1) + { + ERR("file has too much nesting\n"); + return E_FAIL; + } + + switch (This->states[This->statenum]) + { + case STATE_ROOT: + if (nLocalName == sizeof(configuration)/sizeof(WCHAR)-1 && + lstrcmpW(pLocalName, configuration) == 0) + { + This->states[++This->statenum] = STATE_CONFIGURATION; + break; + } + else + goto unknown; + case STATE_CONFIGURATION: + if (nLocalName == sizeof(startup)/sizeof(WCHAR)-1 && + lstrcmpW(pLocalName, startup) == 0) + { + hr = parse_startup(This, pAttr); + This->states[++This->statenum] = STATE_STARTUP; + break; + } + else + goto unknown; + case STATE_STARTUP: + if (nLocalName == sizeof(supportedRuntime)/sizeof(WCHAR)-1 && + lstrcmpW(pLocalName, supportedRuntime) == 0) + { + hr = parse_supported_runtime(This, pAttr); + This->states[++This->statenum] = STATE_UNKNOWN; + break; + } + else + goto unknown; + default: + goto unknown; + } + + return hr; + +unknown: + FIXME("Unknown element %s in state %u\n", debugstr_wn(pLocalName,nLocalName), + This->states[This->statenum]); + + This->states[++This->statenum] = STATE_UNKNOWN; + + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_endElement(ISAXContentHandler *iface, + const WCHAR *pNamespaceUri, int nNamespaceUri, const WCHAR *pLocalName, + int nLocalName, const WCHAR *pQName, int nQName) +{ + ConfigFileHandler *This = impl_from_ISAXContentHandler(iface); + + TRACE("%s %s %s\n", debugstr_wn(pNamespaceUri,nNamespaceUri), + debugstr_wn(pLocalName,nLocalName), debugstr_wn(pQName,nQName)); + + if (This->statenum > 0) + { + This->statenum--; + } + else + { + ERR("element end does not match a start\n"); + return E_FAIL; + } + + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_characters(ISAXContentHandler *iface, + const WCHAR *pChars, int nChars) +{ + TRACE("%s\n", debugstr_wn(pChars,nChars)); + + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_ignorableWhitespace(ISAXContentHandler *iface, + const WCHAR *pChars, int nChars) +{ + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_processingInstruction(ISAXContentHandler *iface, + const WCHAR *pTarget, int nTarget, const WCHAR *pData, int nData) +{ + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_skippedEntity(ISAXContentHandler *iface, + const WCHAR * pName, int nName) +{ + TRACE("%s\n", debugstr_wn(pName,nName)); + return S_OK; +} + +static const struct ISAXContentHandlerVtbl ConfigFileHandlerVtbl = +{ + ConfigFileHandler_QueryInterface, + ConfigFileHandler_AddRef, + ConfigFileHandler_Release, + ConfigFileHandler_putDocumentLocator, + ConfigFileHandler_startDocument, + ConfigFileHandler_endDocument, + ConfigFileHandler_startPrefixMapping, + ConfigFileHandler_endPrefixMapping, + ConfigFileHandler_startElement, + ConfigFileHandler_endElement, + ConfigFileHandler_characters, + ConfigFileHandler_ignorableWhitespace, + ConfigFileHandler_processingInstruction, + ConfigFileHandler_skippedEntity +}; + +static HRESULT WINAPI ConfigFileHandler_Error_QueryInterface(ISAXErrorHandler *iface, + REFIID riid, void **ppvObject) +{ + if (IsEqualGUID(riid, &IID_ISAXErrorHandler) || + IsEqualGUID(riid, &IID_IUnknown)) + { + *ppvObject = iface; + } + else + { + WARN("Unsupported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + ISAXErrorHandler_AddRef(iface); + + return S_OK; +} + +static ULONG WINAPI ConfigFileHandler_Error_AddRef(ISAXErrorHandler *iface) +{ + ConfigFileHandler *This = impl_from_ISAXErrorHandler(iface); + return IUnknown_AddRef((IUnknown*)This); +} + +static ULONG WINAPI ConfigFileHandler_Error_Release(ISAXErrorHandler *iface) +{ + ConfigFileHandler *This = impl_from_ISAXErrorHandler(iface); + return IUnknown_Release((IUnknown*)This); +} + +static HRESULT WINAPI ConfigFileHandler_error(ISAXErrorHandler *iface, + ISAXLocator * pLocator, const WCHAR * pErrorMessage, HRESULT hrErrorCode) +{ + WARN("%s,%x\n", debugstr_w(pErrorMessage), hrErrorCode); + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_fatalError(ISAXErrorHandler *iface, + ISAXLocator * pLocator, const WCHAR * pErrorMessage, HRESULT hrErrorCode) +{ + WARN("%s,%x\n", debugstr_w(pErrorMessage), hrErrorCode); + return S_OK; +} + +static HRESULT WINAPI ConfigFileHandler_ignorableWarning(ISAXErrorHandler *iface, + ISAXLocator * pLocator, const WCHAR * pErrorMessage, HRESULT hrErrorCode) +{ + WARN("%s,%x\n", debugstr_w(pErrorMessage), hrErrorCode); + return S_OK; +} + +static const struct ISAXErrorHandlerVtbl ConfigFileHandlerErrorVtbl = +{ + ConfigFileHandler_Error_QueryInterface, + ConfigFileHandler_Error_AddRef, + ConfigFileHandler_Error_Release, + ConfigFileHandler_error, + ConfigFileHandler_fatalError, + ConfigFileHandler_ignorableWarning +}; + +static void init_config(parsed_config_file *config) +{ + list_init(&config->supported_runtimes); +} + +static HRESULT parse_config(VARIANT input, parsed_config_file *result) +{ + ISAXXMLReader *reader; + ConfigFileHandler *handler; + HRESULT hr; + + handler = HeapAlloc(GetProcessHeap(), 0, sizeof(ConfigFileHandler)); + if (!handler) + return E_OUTOFMEMORY; + + handler->ISAXContentHandler_iface.lpVtbl = &ConfigFileHandlerVtbl; + handler->ISAXErrorHandler_iface.lpVtbl = &ConfigFileHandlerErrorVtbl; + handler->ref = 1; + handler->states[0] = STATE_ROOT; + handler->statenum = 0; + handler->result = result; + + hr = CoCreateInstance(&CLSID_SAXXMLReader, NULL, CLSCTX_INPROC_SERVER, + &IID_ISAXXMLReader, (LPVOID*)&reader); + + if (SUCCEEDED(hr)) + { + hr = ISAXXMLReader_putContentHandler(reader, &handler->ISAXContentHandler_iface); + + if (SUCCEEDED(hr)) + hr = ISAXXMLReader_putErrorHandler(reader, &handler->ISAXErrorHandler_iface); + + if (SUCCEEDED(hr)) + hr = ISAXXMLReader_parse(reader, input); + + ISAXXMLReader_Release(reader); + } + + IUnknown_Release((IUnknown*)handler); + + return S_OK; +} + +HRESULT parse_config_file(LPCWSTR filename, parsed_config_file *result) +{ + IStream *stream; + VARIANT var; + HRESULT hr; + HRESULT initresult; + + init_config(result); + + initresult = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + + hr = SHCreateStreamOnFileW(filename, STGM_SHARE_DENY_WRITE | STGM_READ | STGM_FAILIFTHERE, &stream); + + if (SUCCEEDED(hr)) + { + V_VT(&var) = VT_UNKNOWN|VT_DISPATCH; + V_UNKNOWN(&var) = (IUnknown*)stream; + + hr = parse_config(var, result); + + IStream_Release(stream); + } + + if (SUCCEEDED(initresult)) + CoUninitialize(); + + return hr; +} + +void free_parsed_config_file(parsed_config_file *file) +{ + supported_runtime *cursor, *cursor2; + + LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, &file->supported_runtimes, supported_runtime, entry) + { + HeapFree(GetProcessHeap(), 0, cursor->version); + list_remove(&cursor->entry); + HeapFree(GetProcessHeap(), 0, cursor); + } +} diff --git a/reactos/dll/win32/mscoree/cordebug.c b/reactos/dll/win32/mscoree/cordebug.c new file mode 100644 index 00000000000..da06f49e04b --- /dev/null +++ b/reactos/dll/win32/mscoree/cordebug.c @@ -0,0 +1,786 @@ +/* + * + * Copyright 2011 Alistair Leslie-Hughes + * + * 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 + +#include "windef.h" +#include "winbase.h" + +#include "winuser.h" +#include "winnls.h" +#include "winreg.h" +#include "ole2.h" +#include "shellapi.h" +#include "mscoree.h" +#include "corhdr.h" +#include "metahost.h" +#include "cordebug.h" +#include "wine/list.h" +#include "mscoree_private.h" +#include "wine/debug.h" + + +WINE_DEFAULT_DEBUG_CHANNEL( mscoree ); + +typedef struct DebugProcess +{ + ICorDebugProcess ICorDebugProcess_iface; + + CorDebug *cordebug; + + DWORD dwProcessID; + HANDLE handle; + HANDLE thread; + + LONG ref; +} DebugProcess; + +static inline CorDebug *impl_from_ICorDebug( ICorDebug *iface ) +{ + return CONTAINING_RECORD(iface, CorDebug, ICorDebug_iface); +} + +static inline CorDebug *impl_from_ICorDebugProcessEnum( ICorDebugProcessEnum *iface ) +{ + return CONTAINING_RECORD(iface, CorDebug, ICorDebugProcessEnum_iface); +} + +static inline DebugProcess *impl_from_ICorDebugProcess( ICorDebugProcess *iface ) +{ + return CONTAINING_RECORD(iface, DebugProcess, ICorDebugProcess_iface); +} + +/* ICorDebugProcess Interface */ +static HRESULT WINAPI cordebugprocess_QueryInterface(ICorDebugProcess *iface, + REFIID riid, void **ppvObject) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + + TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject); + + if ( IsEqualGUID( riid, &IID_ICorDebugProcess ) || + IsEqualGUID( riid, &IID_ICorDebugController ) || + IsEqualGUID( riid, &IID_IUnknown ) ) + { + *ppvObject = &This->ICorDebugProcess_iface; + } + else + { + FIXME("Unsupported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + ICorDebug_AddRef(iface); + + return S_OK; +} + +static ULONG WINAPI cordebugprocess_AddRef(ICorDebugProcess *iface) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("%p ref=%u\n", This, ref); + + return ref; +} + +static ULONG WINAPI cordebugprocess_Release(ICorDebugProcess *iface) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("%p ref=%u\n", This, ref); + + if (ref == 0) + { + if(This->handle) + CloseHandle(This->handle); + + if(This->thread) + CloseHandle(This->thread); + + if(This->cordebug) + ICorDebug_Release(&This->cordebug->ICorDebug_iface); + + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI cordebugprocess_Stop(ICorDebugProcess *iface, DWORD dwTimeoutIgnored) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_Continue(ICorDebugProcess *iface, BOOL fIsOutOfBand) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + TRACE("%p\n", This); + + if(This->thread) + ResumeThread(This->thread); + + return S_OK; +} + +static HRESULT WINAPI cordebugprocess_IsRunning(ICorDebugProcess *iface, BOOL *pbRunning) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_HasQueuedCallbacks(ICorDebugProcess *iface, + ICorDebugThread *pThread, BOOL *pbQueued) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_EnumerateThreads(ICorDebugProcess *iface, + ICorDebugThreadEnum **ppThreads) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_SetAllThreadsDebugState(ICorDebugProcess *iface, + CorDebugThreadState state, ICorDebugThread *pExceptThisThread) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_Detach(ICorDebugProcess *iface) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_Terminate(ICorDebugProcess *iface, UINT exitCode) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + BOOL ret = TRUE; + + TRACE("%p\n", This); + + if(This->handle) + { + ret = TerminateProcess(This->handle, exitCode); + CloseHandle(This->handle); + This->handle = NULL; + } + return ret ? S_OK : E_FAIL; +} + +static HRESULT WINAPI cordebugprocess_CanCommitChanges(ICorDebugProcess *iface, + ULONG cSnapshots, ICorDebugEditAndContinueSnapshot * pSnapshots[], + ICorDebugErrorInfoEnum **pError) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_CommitChanges(ICorDebugProcess *iface, + ULONG cSnapshots, ICorDebugEditAndContinueSnapshot * pSnapshots[], + ICorDebugErrorInfoEnum **pError) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_GetID(ICorDebugProcess *iface, DWORD *pdwProcessId) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + TRACE("%p\n", This); + + if(!pdwProcessId) + return E_INVALIDARG; + + *pdwProcessId = This->dwProcessID; + + return S_OK; +} + +static HRESULT WINAPI cordebugprocess_GetHandle(ICorDebugProcess *iface, HPROCESS *phProcessHandle) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + TRACE("%p\n", This); + + if(!phProcessHandle) + return E_INVALIDARG; + + *phProcessHandle = This->handle; + + return S_OK; +} + +static HRESULT WINAPI cordebugprocess_GetThread(ICorDebugProcess *iface, DWORD dwThreadId, + ICorDebugThread **ppThread) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_EnumerateObjects(ICorDebugProcess *iface, + ICorDebugObjectEnum **ppObjects) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_IsTransitionStub(ICorDebugProcess *iface, + CORDB_ADDRESS address, BOOL *pbTransitionStub) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_IsOSSuspended(ICorDebugProcess *iface, + DWORD threadID, BOOL *pbSuspended) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_GetThreadContext(ICorDebugProcess *iface, + DWORD threadID, ULONG32 contextSize, BYTE context[]) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_SetThreadContext(ICorDebugProcess *iface, + DWORD threadID, ULONG32 contextSize, BYTE context[]) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_ReadMemory(ICorDebugProcess *iface, + CORDB_ADDRESS address, DWORD size, BYTE buffer[], + SIZE_T *read) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_WriteMemory(ICorDebugProcess *iface, + CORDB_ADDRESS address, DWORD size, BYTE buffer[], + SIZE_T *written) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_ClearCurrentException(ICorDebugProcess *iface, + DWORD threadID) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_EnableLogMessages(ICorDebugProcess *iface, + BOOL fOnOff) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_ModifyLogSwitch(ICorDebugProcess *iface, + WCHAR *pLogSwitchName, LONG lLevel) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_EnumerateAppDomains(ICorDebugProcess *iface, + ICorDebugAppDomainEnum **ppAppDomains) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_GetObject(ICorDebugProcess *iface, + ICorDebugValue **ppObject) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_ThreadForFiberCookie(ICorDebugProcess *iface, + DWORD fiberCookie, ICorDebugThread **ppThread) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI cordebugprocess_GetHelperThreadID(ICorDebugProcess *iface, + DWORD *pThreadID) +{ + DebugProcess *This = impl_from_ICorDebugProcess(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + + +/***************************************/ +static const ICorDebugProcessVtbl cordebugprocessVtbl = { + cordebugprocess_QueryInterface, + cordebugprocess_AddRef, + cordebugprocess_Release, + cordebugprocess_Stop, + cordebugprocess_Continue, + cordebugprocess_IsRunning, + cordebugprocess_HasQueuedCallbacks, + cordebugprocess_EnumerateThreads, + cordebugprocess_SetAllThreadsDebugState, + cordebugprocess_Detach, + cordebugprocess_Terminate, + cordebugprocess_CanCommitChanges, + cordebugprocess_CommitChanges, + cordebugprocess_GetID, + cordebugprocess_GetHandle, + cordebugprocess_GetThread, + cordebugprocess_EnumerateObjects, + cordebugprocess_IsTransitionStub, + cordebugprocess_IsOSSuspended, + cordebugprocess_GetThreadContext, + cordebugprocess_SetThreadContext, + cordebugprocess_ReadMemory, + cordebugprocess_WriteMemory, + cordebugprocess_ClearCurrentException, + cordebugprocess_EnableLogMessages, + cordebugprocess_ModifyLogSwitch, + cordebugprocess_EnumerateAppDomains, + cordebugprocess_GetObject, + cordebugprocess_ThreadForFiberCookie, + cordebugprocess_GetHelperThreadID +}; + + +static HRESULT CorDebugProcess_Create(CorDebug *cordebug, IUnknown** ppUnk, LPPROCESS_INFORMATION lpProcessInformation) +{ + DebugProcess *This; + + This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + if ( !This ) + return E_OUTOFMEMORY; + + if(!DuplicateHandle(GetCurrentProcess(), lpProcessInformation->hProcess, + GetCurrentProcess(), &This->handle, 0, FALSE, DUPLICATE_SAME_ACCESS)) + { + ERR("Failed to duplicate process handle\n"); + HeapFree(GetProcessHeap(), 0, This); + return E_FAIL; + } + if(!DuplicateHandle(GetCurrentProcess(), lpProcessInformation->hThread, + GetCurrentProcess(), &This->thread, 0, FALSE, DUPLICATE_SAME_ACCESS)) + { + CloseHandle(This->handle); + + ERR("Failed to duplicate thread handle\n"); + HeapFree(GetProcessHeap(), 0, This); + return E_FAIL; + } + + This->ICorDebugProcess_iface.lpVtbl = &cordebugprocessVtbl; + This->ref = 1; + This->cordebug = cordebug; + This->dwProcessID = lpProcessInformation->dwProcessId; + + if(This->cordebug) + ICorDebug_AddRef(&This->cordebug->ICorDebug_iface); + + *ppUnk = (IUnknown*)This; + + return S_OK; +} + +/* ICorDebugProcessEnum Interface */ +static HRESULT WINAPI process_enum_QueryInterface(ICorDebugProcessEnum *iface, REFIID riid, void **ppvObject) +{ + CorDebug *This = impl_from_ICorDebugProcessEnum(iface); + + TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject); + + if ( IsEqualGUID( riid, &IID_ICorDebugProcessEnum ) || + IsEqualGUID( riid, &IID_ICorDebugEnum ) || + IsEqualGUID( riid, &IID_IUnknown ) ) + { + *ppvObject = &This->ICorDebugProcessEnum_iface; + } + else + { + FIXME("Unsupported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + ICorDebug_AddRef(iface); + + return S_OK; +} + +static ULONG WINAPI process_enum_AddRef(ICorDebugProcessEnum *iface) +{ + CorDebug *This = impl_from_ICorDebugProcessEnum(iface); + TRACE("%p ref=%u\n", This, This->ref); + + return ICorDebug_AddRef(&This->ICorDebug_iface); +} + +static ULONG WINAPI process_enum_Release(ICorDebugProcessEnum *iface) +{ + CorDebug *This = impl_from_ICorDebugProcessEnum(iface); + TRACE("%p ref=%u\n", This, This->ref); + + return ICorDebug_Release(&This->ICorDebug_iface); +} + +static HRESULT WINAPI process_enum_Skip(ICorDebugProcessEnum *iface, ULONG celt) +{ + CorDebug *This = impl_from_ICorDebugProcessEnum(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI process_enum_Reset(ICorDebugProcessEnum *iface) +{ + CorDebug *This = impl_from_ICorDebugProcessEnum(iface); + FIXME("stub %p\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI process_enum_Clone(ICorDebugProcessEnum *iface, ICorDebugEnum **ppEnum) +{ + CorDebug *This = impl_from_ICorDebugProcessEnum(iface); + FIXME("stub %p %p\n", This, ppEnum); + return E_NOTIMPL; +} + +static HRESULT WINAPI process_enum_GetCount(ICorDebugProcessEnum *iface, ULONG *pcelt) +{ + CorDebug *This = impl_from_ICorDebugProcessEnum(iface); + TRACE("stub %p %p\n", This, pcelt); + + if(!pcelt) + return E_INVALIDARG; + + *pcelt = list_count(&This->processes); + + return S_OK; +} + +static HRESULT WINAPI process_enum_Next(ICorDebugProcessEnum *iface, ULONG celt, + ICorDebugProcess * processes[], ULONG *pceltFetched) +{ + CorDebug *This = impl_from_ICorDebugProcessEnum(iface); + FIXME("stub %p %d %p %p\n", This, celt, processes, pceltFetched); + return E_NOTIMPL; +} + +static const struct ICorDebugProcessEnumVtbl processenum_vtbl = +{ + process_enum_QueryInterface, + process_enum_AddRef, + process_enum_Release, + process_enum_Skip, + process_enum_Reset, + process_enum_Clone, + process_enum_GetCount, + process_enum_Next +}; + +/*** IUnknown methods ***/ +static HRESULT WINAPI CorDebug_QueryInterface(ICorDebug *iface, REFIID riid, void **ppvObject) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + + TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject); + + if ( IsEqualGUID( riid, &IID_ICorDebug ) || + IsEqualGUID( riid, &IID_IUnknown ) ) + { + *ppvObject = &This->ICorDebug_iface; + } + else + { + FIXME("Unsupported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + ICorDebug_AddRef( iface ); + + return S_OK; +} + +static ULONG WINAPI CorDebug_AddRef(ICorDebug *iface) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("%p ref=%u\n", This, ref); + + return ref; +} + +static ULONG WINAPI CorDebug_Release(ICorDebug *iface) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("%p ref=%u\n", This, ref); + + if (ref == 0) + { + if(!list_empty(&This->processes)) + ERR("Processes haven't been removed Correctly\n"); + + if(This->runtimehost) + ICLRRuntimeHost_Release(This->runtimehost); + + if(This->pCallback) + ICorDebugManagedCallback2_Release(This->pCallback2); + + if(This->pCallback) + ICorDebugManagedCallback_Release(This->pCallback); + + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +/*** ICorDebug methods ***/ +static HRESULT WINAPI CorDebug_Initialize(ICorDebug *iface) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + FIXME("stub %p\n", This); + return S_OK; +} + +static HRESULT WINAPI CorDebug_Terminate(ICorDebug *iface) +{ + struct CorProcess *cursor, *cursor2; + CorDebug *This = impl_from_ICorDebug( iface ); + TRACE("stub %p\n", This); + + LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, &This->processes, struct CorProcess, entry) + { + if(cursor->pProcess) + { + ICorDebugProcess_Terminate(cursor->pProcess, 0); + ICorDebugProcess_Release(cursor->pProcess); + } + + list_remove(&cursor->entry); + HeapFree(GetProcessHeap(), 0, cursor); + } + + return S_OK; +} + +static HRESULT WINAPI CorDebug_SetManagedHandler(ICorDebug *iface, ICorDebugManagedCallback *pCallback) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + HRESULT hr; + ICorDebugManagedCallback2 *pCallback2; + + TRACE("%p (%p)\n", This, pCallback); + + if(!pCallback) + return E_INVALIDARG; + + hr = ICorDebugManagedCallback_QueryInterface(pCallback, &IID_ICorDebugManagedCallback2, (void**)&pCallback2); + if(hr == S_OK) + { + if(This->pCallback2) + ICorDebugManagedCallback2_Release(This->pCallback2); + + if(This->pCallback) + ICorDebugManagedCallback_Release(This->pCallback); + + This->pCallback = pCallback; + This->pCallback2 = pCallback2; + + ICorDebugManagedCallback_AddRef(This->pCallback); + } + else + { + WARN("Debugging without interface ICorDebugManagedCallback2 is currently not supported.\n"); + } + + return hr; +} + +static HRESULT WINAPI CorDebug_SetUnmanagedHandler(ICorDebug *iface, ICorDebugUnmanagedCallback *pCallback) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + FIXME("stub %p %p\n", This, pCallback); + return E_NOTIMPL; +} + +static HRESULT WINAPI CorDebug_CreateProcess(ICorDebug *iface, LPCWSTR lpApplicationName, + LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, + LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, + DWORD dwCreationFlags, PVOID lpEnvironment,LPCWSTR lpCurrentDirectory, + LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation, + CorDebugCreateProcessFlags debuggingFlags, ICorDebugProcess **ppProcess) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + ICorDebugProcess *pDebugProcess; + HRESULT hr; + + TRACE("stub %p %s %s %p %p %d %d %p %s %p %p %d %p\n", This, debugstr_w(lpApplicationName), + debugstr_w(lpCommandLine), lpProcessAttributes, lpThreadAttributes, + bInheritHandles, dwCreationFlags, lpEnvironment, debugstr_w(lpCurrentDirectory), + lpStartupInfo, lpProcessInformation, debuggingFlags, ppProcess); + + if(CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, + bInheritHandles, dwCreationFlags | CREATE_SUSPENDED, lpEnvironment, lpCurrentDirectory, + lpStartupInfo, lpProcessInformation)) + { + hr = CorDebugProcess_Create(This, (IUnknown**)&pDebugProcess, lpProcessInformation); + if(hr == S_OK) + { + struct CorProcess *new_process = HeapAlloc( GetProcessHeap(), 0, sizeof(CorProcess) ); + + new_process->pProcess = pDebugProcess; + list_add_tail(&This->processes, &new_process->entry); + + ICorDebugProcess_AddRef(pDebugProcess); + *ppProcess = pDebugProcess; + + if(This->pCallback) + ICorDebugManagedCallback_CreateProcess(This->pCallback, pDebugProcess); + } + else + { + TerminateProcess(lpProcessInformation->hProcess, 0); + } + } + else + hr = E_FAIL; + + return hr; +} + +static HRESULT WINAPI CorDebug_DebugActiveProcess(ICorDebug *iface, DWORD id, BOOL win32Attach, + ICorDebugProcess **ppProcess) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + FIXME("stub %p %d %d %p\n", This, id, win32Attach, ppProcess); + return E_NOTIMPL; +} + +static HRESULT WINAPI CorDebug_EnumerateProcesses( ICorDebug *iface, ICorDebugProcessEnum **ppProcess) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + TRACE("stub %p %p\n", This, ppProcess); + + if(!ppProcess) + return E_INVALIDARG; + + *ppProcess = &This->ICorDebugProcessEnum_iface; + ICorDebugProcessEnum_AddRef(*ppProcess); + + return S_OK; +} + +static HRESULT WINAPI CorDebug_GetProcess(ICorDebug *iface, DWORD dwProcessId, ICorDebugProcess **ppProcess) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + FIXME("stub %p %d %p\n", This, dwProcessId, ppProcess); + return E_NOTIMPL; +} + +static HRESULT WINAPI CorDebug_CanLaunchOrAttach(ICorDebug *iface, DWORD dwProcessId, + BOOL win32DebuggingEnabled) +{ + CorDebug *This = impl_from_ICorDebug( iface ); + FIXME("stub %p %d %d\n", This, dwProcessId, win32DebuggingEnabled); + return S_OK; +} + +static const struct ICorDebugVtbl cordebug_vtbl = +{ + CorDebug_QueryInterface, + CorDebug_AddRef, + CorDebug_Release, + CorDebug_Initialize, + CorDebug_Terminate, + CorDebug_SetManagedHandler, + CorDebug_SetUnmanagedHandler, + CorDebug_CreateProcess, + CorDebug_DebugActiveProcess, + CorDebug_EnumerateProcesses, + CorDebug_GetProcess, + CorDebug_CanLaunchOrAttach +}; + +HRESULT CorDebug_Create(ICLRRuntimeHost *runtimehost, IUnknown** ppUnk) +{ + CorDebug *This; + + This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); + if ( !This ) + return E_OUTOFMEMORY; + + This->ICorDebug_iface.lpVtbl = &cordebug_vtbl; + This->ICorDebugProcessEnum_iface.lpVtbl = &processenum_vtbl; + This->ref = 1; + This->pCallback = NULL; + This->pCallback2 = NULL; + This->runtimehost = runtimehost; + + list_init(&This->processes); + + if(This->runtimehost) + ICLRRuntimeHost_AddRef(This->runtimehost); + + *ppUnk = (IUnknown*)This; + + return S_OK; +} diff --git a/reactos/dll/win32/mscoree/corruntimehost.c b/reactos/dll/win32/mscoree/corruntimehost.c index 9de9bf5497b..5042f203d71 100644 --- a/reactos/dll/win32/mscoree/corruntimehost.c +++ b/reactos/dll/win32/mscoree/corruntimehost.c @@ -24,25 +24,185 @@ #include "windef.h" #include "winbase.h" #include "winuser.h" +#include "winnls.h" #include "winreg.h" #include "ole2.h" +#include "shellapi.h" #include "cor.h" #include "mscoree.h" +#include "metahost.h" +#include "corhdr.h" +#include "cordebug.h" +#include "wine/list.h" +#include "mscoree_private.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL( mscoree ); -typedef struct _corruntimehost -{ - const struct ICorRuntimeHostVtbl *lpVtbl; - LONG ref; -} corruntimehost; +#include "initguid.h" -static inline corruntimehost *impl_from_ICorRuntimeHost( ICorRuntimeHost *iface ) +DEFINE_GUID(IID__AppDomain, 0x05f696dc,0x2b29,0x3663,0xad,0x8b,0xc4,0x38,0x9c,0xf2,0xa7,0x13); + +struct DomainEntry { - return (corruntimehost *)((char*)iface - FIELD_OFFSET(corruntimehost, lpVtbl)); + struct list entry; + MonoDomain *domain; +}; + +static HRESULT RuntimeHost_AddDomain(RuntimeHost *This, MonoDomain **result) +{ + struct DomainEntry *entry; + char *mscorlib_path; + HRESULT res=S_OK; + + EnterCriticalSection(&This->lock); + + entry = HeapAlloc(GetProcessHeap(), 0, sizeof(*entry)); + if (!entry) + { + res = E_OUTOFMEMORY; + goto end; + } + + mscorlib_path = WtoA(This->version->mscorlib_path); + if (!mscorlib_path) + { + HeapFree(GetProcessHeap(), 0, entry); + res = E_OUTOFMEMORY; + goto end; + } + + entry->domain = This->mono->mono_jit_init(mscorlib_path); + + HeapFree(GetProcessHeap(), 0, mscorlib_path); + + if (!entry->domain) + { + HeapFree(GetProcessHeap(), 0, entry); + res = E_FAIL; + goto end; + } + + This->mono->is_started = TRUE; + + list_add_tail(&This->domains, &entry->entry); + + *result = entry->domain; + +end: + LeaveCriticalSection(&This->lock); + + return res; +} + +static HRESULT RuntimeHost_GetDefaultDomain(RuntimeHost *This, MonoDomain **result) +{ + HRESULT res=S_OK; + + EnterCriticalSection(&This->lock); + + if (This->default_domain) goto end; + + res = RuntimeHost_AddDomain(This, &This->default_domain); + +end: + *result = This->default_domain; + + LeaveCriticalSection(&This->lock); + + return res; +} + +static void RuntimeHost_DeleteDomain(RuntimeHost *This, MonoDomain *domain) +{ + struct DomainEntry *entry; + + EnterCriticalSection(&This->lock); + + LIST_FOR_EACH_ENTRY(entry, &This->domains, struct DomainEntry, entry) + { + if (entry->domain == domain) + { + list_remove(&entry->entry); + if (This->default_domain == domain) + This->default_domain = NULL; + HeapFree(GetProcessHeap(), 0, entry); + break; + } + } + + LeaveCriticalSection(&This->lock); +} + +static HRESULT RuntimeHost_GetIUnknownForDomain(RuntimeHost *This, MonoDomain *domain, IUnknown **punk) +{ + HRESULT hr; + void *args[1]; + MonoAssembly *assembly; + MonoImage *image; + MonoClass *klass; + MonoMethod *method; + MonoObject *appdomain_object; + IUnknown *unk; + + assembly = This->mono->mono_domain_assembly_open(domain, "mscorlib"); + if (!assembly) + { + ERR("Cannot load mscorlib\n"); + return E_FAIL; + } + + image = This->mono->mono_assembly_get_image(assembly); + if (!image) + { + ERR("Couldn't get assembly image\n"); + return E_FAIL; + } + + klass = This->mono->mono_class_from_name(image, "System", "AppDomain"); + if (!klass) + { + ERR("Couldn't get class from image\n"); + return E_FAIL; + } + + method = This->mono->mono_class_get_method_from_name(klass, "get_CurrentDomain", 0); + if (!method) + { + ERR("Couldn't get method from class\n"); + return E_FAIL; + } + + args[0] = NULL; + appdomain_object = This->mono->mono_runtime_invoke(method, NULL, args, NULL); + if (!appdomain_object) + { + ERR("Couldn't get result pointer\n"); + return E_FAIL; + } + + hr = RuntimeHost_GetIUnknownForObject(This, appdomain_object, &unk); + + if (SUCCEEDED(hr)) + { + hr = IUnknown_QueryInterface(unk, &IID__AppDomain, (void**)punk); + + IUnknown_Release(unk); + } + + return hr; +} + +static inline RuntimeHost *impl_from_ICLRRuntimeHost( ICLRRuntimeHost *iface ) +{ + return CONTAINING_RECORD(iface, RuntimeHost, ICLRRuntimeHost_iface); +} + +static inline RuntimeHost *impl_from_ICorRuntimeHost( ICorRuntimeHost *iface ) +{ + return CONTAINING_RECORD(iface, RuntimeHost, ICorRuntimeHost_iface); } /*** IUnknown methods ***/ @@ -50,7 +210,7 @@ static HRESULT WINAPI corruntimehost_QueryInterface(ICorRuntimeHost* iface, REFIID riid, void **ppvObject) { - corruntimehost *This = impl_from_ICorRuntimeHost( iface ); + RuntimeHost *This = impl_from_ICorRuntimeHost( iface ); TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject); if ( IsEqualGUID( riid, &IID_ICorRuntimeHost ) || @@ -71,20 +231,17 @@ static HRESULT WINAPI corruntimehost_QueryInterface(ICorRuntimeHost* iface, static ULONG WINAPI corruntimehost_AddRef(ICorRuntimeHost* iface) { - corruntimehost *This = impl_from_ICorRuntimeHost( iface ); + RuntimeHost *This = impl_from_ICorRuntimeHost( iface ); + return InterlockedIncrement( &This->ref ); } static ULONG WINAPI corruntimehost_Release(ICorRuntimeHost* iface) { - corruntimehost *This = impl_from_ICorRuntimeHost( iface ); + RuntimeHost *This = impl_from_ICorRuntimeHost( iface ); ULONG ref; ref = InterlockedDecrement( &This->ref ); - if ( ref == 0 ) - { - HeapFree( GetProcessHeap(), 0, This ); - } return ref; } @@ -149,7 +306,7 @@ static HRESULT WINAPI corruntimehost_Start( ICorRuntimeHost* iface) { FIXME("stub %p\n", iface); - return E_NOTIMPL; + return S_OK; } static HRESULT WINAPI corruntimehost_Stop( @@ -173,8 +330,20 @@ static HRESULT WINAPI corruntimehost_GetDefaultDomain( ICorRuntimeHost* iface, IUnknown **pAppDomain) { - FIXME("stub %p\n", iface); - return E_NOTIMPL; + RuntimeHost *This = impl_from_ICorRuntimeHost( iface ); + HRESULT hr; + MonoDomain *domain; + + TRACE("(%p)\n", iface); + + hr = RuntimeHost_GetDefaultDomain(This, &domain); + + if (SUCCEEDED(hr)) + { + hr = RuntimeHost_GetIUnknownForDomain(This, domain, pAppDomain); + } + + return hr; } static HRESULT WINAPI corruntimehost_EnumDomains( @@ -271,18 +440,506 @@ static const struct ICorRuntimeHostVtbl corruntimehost_vtbl = corruntimehost_CurrentDomain }; -IUnknown* create_corruntimehost(void) +static HRESULT WINAPI CLRRuntimeHost_QueryInterface(ICLRRuntimeHost* iface, + REFIID riid, + void **ppvObject) { - corruntimehost *This; + RuntimeHost *This = impl_from_ICLRRuntimeHost( iface ); + TRACE("%p %s %p\n", This, debugstr_guid(riid), ppvObject); + + if ( IsEqualGUID( riid, &IID_ICLRRuntimeHost ) || + IsEqualGUID( riid, &IID_IUnknown ) ) + { + *ppvObject = iface; + } + else + { + FIXME("Unsupported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + ICLRRuntimeHost_AddRef( iface ); + + return S_OK; +} + +static ULONG WINAPI CLRRuntimeHost_AddRef(ICLRRuntimeHost* iface) +{ + RuntimeHost *This = impl_from_ICLRRuntimeHost( iface ); + return ICorRuntimeHost_AddRef(&This->ICorRuntimeHost_iface); +} + +static ULONG WINAPI CLRRuntimeHost_Release(ICLRRuntimeHost* iface) +{ + RuntimeHost *This = impl_from_ICLRRuntimeHost( iface ); + return ICorRuntimeHost_Release(&This->ICorRuntimeHost_iface); +} + +static HRESULT WINAPI CLRRuntimeHost_Start(ICLRRuntimeHost* iface) +{ + FIXME("(%p)\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeHost_Stop(ICLRRuntimeHost* iface) +{ + FIXME("(%p)\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeHost_SetHostControl(ICLRRuntimeHost* iface, + IHostControl *pHostControl) +{ + FIXME("(%p,%p)\n", iface, pHostControl); + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeHost_GetCLRControl(ICLRRuntimeHost* iface, + ICLRControl **pCLRControl) +{ + FIXME("(%p,%p)\n", iface, pCLRControl); + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeHost_UnloadAppDomain(ICLRRuntimeHost* iface, + DWORD dwAppDomainId, BOOL fWaitUntilDone) +{ + FIXME("(%p,%u,%i)\n", iface, dwAppDomainId, fWaitUntilDone); + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeHost_ExecuteInAppDomain(ICLRRuntimeHost* iface, + DWORD dwAppDomainId, FExecuteInAppDomainCallback pCallback, void *cookie) +{ + FIXME("(%p,%u,%p,%p)\n", iface, dwAppDomainId, pCallback, cookie); + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeHost_GetCurrentAppDomainId(ICLRRuntimeHost* iface, + DWORD *pdwAppDomainId) +{ + FIXME("(%p,%p)\n", iface, pdwAppDomainId); + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeHost_ExecuteApplication(ICLRRuntimeHost* iface, + LPCWSTR pwzAppFullName, DWORD dwManifestPaths, LPCWSTR *ppwzManifestPaths, + DWORD dwActivationData, LPCWSTR *ppwzActivationData, int *pReturnValue) +{ + FIXME("(%p,%s,%u,%u)\n", iface, debugstr_w(pwzAppFullName), dwManifestPaths, dwActivationData); + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeHost_ExecuteInDefaultAppDomain(ICLRRuntimeHost* iface, + LPCWSTR pwzAssemblyPath, LPCWSTR pwzTypeName, LPCWSTR pwzMethodName, + LPCWSTR pwzArgument, DWORD *pReturnValue) +{ + RuntimeHost *This = impl_from_ICLRRuntimeHost( iface ); + HRESULT hr; + MonoDomain *domain; + MonoAssembly *assembly; + MonoImage *image; + MonoClass *klass; + MonoMethod *method; + MonoObject *result; + MonoString *str; + void *args[2]; + char *filenameA = NULL, *classA = NULL, *methodA = NULL; + char *argsA = NULL, *ns; + + TRACE("(%p,%s,%s,%s,%s)\n", iface, debugstr_w(pwzAssemblyPath), + debugstr_w(pwzTypeName), debugstr_w(pwzMethodName), debugstr_w(pwzArgument)); + + hr = RuntimeHost_GetDefaultDomain(This, &domain); + if(hr != S_OK) + { + ERR("Couldn't get Default Domain\n"); + return hr; + } + + hr = E_FAIL; + + filenameA = WtoA(pwzAssemblyPath); + assembly = This->mono->mono_domain_assembly_open(domain, filenameA); + if (!assembly) + { + ERR("Cannot open assembly %s\n", filenameA); + goto cleanup; + } + + image = This->mono->mono_assembly_get_image(assembly); + if (!image) + { + ERR("Couldn't get assembly image\n"); + goto cleanup; + } + + classA = WtoA(pwzTypeName); + ns = strrchr(classA, '.'); + *ns = '\0'; + klass = This->mono->mono_class_from_name(image, classA, ns+1); + if (!klass) + { + ERR("Couldn't get class from image\n"); + goto cleanup; + } + + methodA = WtoA(pwzMethodName); + method = This->mono->mono_class_get_method_from_name(klass, methodA, 1); + if (!method) + { + ERR("Couldn't get method from class\n"); + goto cleanup; + } + + /* The .NET function we are calling has the following declaration + * public static int functionName(String param) + */ + argsA = WtoA(pwzArgument); + str = This->mono->mono_string_new(domain, argsA); + args[0] = str; + args[1] = NULL; + result = This->mono->mono_runtime_invoke(method, NULL, args, NULL); + if (!result) + ERR("Couldn't get result pointer\n"); + else + { + *pReturnValue = *(DWORD*)This->mono->mono_object_unbox(result); + hr = S_OK; + } + +cleanup: + if(filenameA) + HeapFree(GetProcessHeap(), 0, filenameA); + if(classA) + HeapFree(GetProcessHeap(), 0, classA); + if(argsA) + HeapFree(GetProcessHeap(), 0, argsA); + if(methodA) + HeapFree(GetProcessHeap(), 0, methodA); + + return hr; +} + +static const struct ICLRRuntimeHostVtbl CLRHostVtbl = +{ + CLRRuntimeHost_QueryInterface, + CLRRuntimeHost_AddRef, + CLRRuntimeHost_Release, + CLRRuntimeHost_Start, + CLRRuntimeHost_Stop, + CLRRuntimeHost_SetHostControl, + CLRRuntimeHost_GetCLRControl, + CLRRuntimeHost_UnloadAppDomain, + CLRRuntimeHost_ExecuteInAppDomain, + CLRRuntimeHost_GetCurrentAppDomainId, + CLRRuntimeHost_ExecuteApplication, + CLRRuntimeHost_ExecuteInDefaultAppDomain +}; + +/* Create an instance of a type given its name, by calling its constructor with + * no arguments. Note that result MUST be in the stack, or the garbage + * collector may free it prematurely. */ +HRESULT RuntimeHost_CreateManagedInstance(RuntimeHost *This, LPCWSTR name, + MonoDomain *domain, MonoObject **result) +{ + HRESULT hr=S_OK; + char *nameA=NULL; + MonoType *type; + MonoClass *klass; + MonoObject *obj; + + if (!domain) + hr = RuntimeHost_GetDefaultDomain(This, &domain); + + if (SUCCEEDED(hr)) + { + nameA = WtoA(name); + if (!nameA) + hr = E_OUTOFMEMORY; + } + + if (SUCCEEDED(hr)) + { + type = This->mono->mono_reflection_type_from_name(nameA, NULL); + if (!type) + { + ERR("Cannot find type %s\n", debugstr_w(name)); + hr = E_FAIL; + } + } + + if (SUCCEEDED(hr)) + { + klass = This->mono->mono_class_from_mono_type(type); + if (!klass) + { + ERR("Cannot convert type %s to a class\n", debugstr_w(name)); + hr = E_FAIL; + } + } + + if (SUCCEEDED(hr)) + { + obj = This->mono->mono_object_new(domain, klass); + if (!obj) + { + ERR("Cannot allocate object of type %s\n", debugstr_w(name)); + hr = E_FAIL; + } + } + + if (SUCCEEDED(hr)) + { + /* FIXME: Detect exceptions from the constructor? */ + This->mono->mono_runtime_object_init(obj); + *result = obj; + } + + HeapFree(GetProcessHeap(), 0, nameA); + + return hr; +} + +/* Get an IUnknown pointer for a Mono object. + * + * This is just a "light" wrapper around + * System.Runtime.InteropServices.Marshal:GetIUnknownForObject + * + * NOTE: The IUnknown* is created with a reference to the object. + * Until they have a reference, objects must be in the stack to prevent the + * garbage collector from freeing them. */ +HRESULT RuntimeHost_GetIUnknownForObject(RuntimeHost *This, MonoObject *obj, + IUnknown **ppUnk) +{ + MonoDomain *domain; + MonoAssembly *assembly; + MonoImage *image; + MonoClass *klass; + MonoMethod *method; + MonoObject *result; + void *args[2]; + + domain = This->mono->mono_object_get_domain(obj); + + assembly = This->mono->mono_domain_assembly_open(domain, "mscorlib"); + if (!assembly) + { + ERR("Cannot load mscorlib\n"); + return E_FAIL; + } + + image = This->mono->mono_assembly_get_image(assembly); + if (!image) + { + ERR("Couldn't get assembly image\n"); + return E_FAIL; + } + + klass = This->mono->mono_class_from_name(image, "System.Runtime.InteropServices", "Marshal"); + if (!klass) + { + ERR("Couldn't get class from image\n"); + return E_FAIL; + } + + method = This->mono->mono_class_get_method_from_name(klass, "GetIUnknownForObject", 1); + if (!method) + { + ERR("Couldn't get method from class\n"); + return E_FAIL; + } + + args[0] = obj; + args[1] = NULL; + result = This->mono->mono_runtime_invoke(method, NULL, args, NULL); + if (!result) + { + ERR("Couldn't get result pointer\n"); + return E_FAIL; + } + + *ppUnk = *(IUnknown**)This->mono->mono_object_unbox(result); + if (!*ppUnk) + { + ERR("GetIUnknownForObject returned 0\n"); + return E_FAIL; + } + + return S_OK; +} + +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) +{ + int exit_code; + int argc; + char **argv; + MonoDomain *domain; + MonoAssembly *assembly; + WCHAR filename[MAX_PATH]; + char *filenameA; + ICLRRuntimeInfo *info; + RuntimeHost *host; + HRESULT hr; + int i; + + get_utf8_args(&argc, &argv); + + GetModuleFileNameW(NULL, filename, MAX_PATH); + + TRACE("%s", debugstr_w(filename)); + for (i=0; imono->mono_domain_assembly_open(domain, filenameA); + + exit_code = host->mono->mono_jit_exec(domain, assembly, argc, argv); + + RuntimeHost_DeleteDomain(host, domain); + } + else + exit_code = -1; + + ICLRRuntimeInfo_Release(info); + } + else + exit_code = -1; + + HeapFree(GetProcessHeap(), 0, argv); + + unload_all_runtimes(); + + return exit_code; +} + +HRESULT RuntimeHost_Construct(const CLRRuntimeInfo *runtime_version, + loaded_mono *loaded_mono, RuntimeHost** result) +{ + RuntimeHost *This; This = HeapAlloc( GetProcessHeap(), 0, sizeof *This ); if ( !This ) - return NULL; + return E_OUTOFMEMORY; + + This->ICorRuntimeHost_iface.lpVtbl = &corruntimehost_vtbl; + This->ICLRRuntimeHost_iface.lpVtbl = &CLRHostVtbl; - This->lpVtbl = &corruntimehost_vtbl; This->ref = 1; + This->version = runtime_version; + This->mono = loaded_mono; + list_init(&This->domains); + This->default_domain = NULL; + InitializeCriticalSection(&This->lock); + This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": RuntimeHost.lock"); - FIXME("return iface %p\n", This); + *result = This; - return (IUnknown*) &This->lpVtbl; + return S_OK; +} + +HRESULT RuntimeHost_GetInterface(RuntimeHost *This, REFCLSID clsid, REFIID riid, void **ppv) +{ + IUnknown *unk; + HRESULT hr; + + if (IsEqualGUID(clsid, &CLSID_CorRuntimeHost)) + { + unk = (IUnknown*)&This->ICorRuntimeHost_iface; + IUnknown_AddRef(unk); + } + else if (IsEqualGUID(clsid, &CLSID_CLRRuntimeHost)) + { + unk = (IUnknown*)&This->ICLRRuntimeHost_iface; + IUnknown_AddRef(unk); + } + else if (IsEqualGUID(clsid, &CLSID_CorMetaDataDispenser) || + IsEqualGUID(clsid, &CLSID_CorMetaDataDispenserRuntime)) + { + hr = MetaDataDispenser_CreateInstance(&unk); + if (FAILED(hr)) + return hr; + } + else if (IsEqualGUID(clsid, &CLSID_CLRDebuggingLegacy)) + { + hr = CorDebug_Create(&This->ICLRRuntimeHost_iface, &unk); + if (FAILED(hr)) + return hr; + } + else + unk = NULL; + + if (unk) + { + hr = IUnknown_QueryInterface(unk, riid, ppv); + + IUnknown_Release(unk); + + return hr; + } + else + FIXME("not implemented for class %s\n", debugstr_guid(clsid)); + + return CLASS_E_CLASSNOTAVAILABLE; +} + +HRESULT RuntimeHost_Destroy(RuntimeHost *This) +{ + struct DomainEntry *cursor, *cursor2; + + This->lock.DebugInfo->Spare[0] = 0; + DeleteCriticalSection(&This->lock); + + LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, &This->domains, struct DomainEntry, entry) + { + list_remove(&cursor->entry); + HeapFree(GetProcessHeap(), 0, cursor); + } + + HeapFree( GetProcessHeap(), 0, This ); + return S_OK; } diff --git a/reactos/dll/win32/mscoree/metadata.c b/reactos/dll/win32/mscoree/metadata.c new file mode 100644 index 00000000000..9ca0d933b55 --- /dev/null +++ b/reactos/dll/win32/mscoree/metadata.c @@ -0,0 +1,205 @@ +/* + * IMetaDataDispenserEx - dynamic creation/editing of assemblies + * + * 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 +#include +#include + +#define COBJMACROS + +#include "wine/library.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "ole2.h" +#include "cor.h" +#include "mscoree.h" +#include "corhdr.h" +#include "cordebug.h" +#include "metahost.h" +#include "wine/list.h" +#include "mscoree_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL( mscoree ); + +typedef struct MetaDataDispenser +{ + IMetaDataDispenserEx IMetaDataDispenserEx_iface; + LONG ref; +} MetaDataDispenser; + +static inline MetaDataDispenser *impl_from_IMetaDataDispenserEx(IMetaDataDispenserEx *iface) +{ + return CONTAINING_RECORD(iface, MetaDataDispenser, IMetaDataDispenserEx_iface); +} + +static HRESULT WINAPI MetaDataDispenser_QueryInterface(IMetaDataDispenserEx* iface, + REFIID riid, void **ppvObject) +{ + TRACE("%p %s %p\n", iface, debugstr_guid(riid), ppvObject); + + if (IsEqualGUID(riid, &IID_IMetaDataDispenserEx) || + IsEqualGUID(riid, &IID_IMetaDataDispenser) || + IsEqualGUID(riid, &IID_IUnknown)) + { + *ppvObject = iface; + } + else + { + FIXME("Unsupported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IMetaDataDispenserEx_AddRef( iface ); + + return S_OK; +} + +static ULONG WINAPI MetaDataDispenser_AddRef(IMetaDataDispenserEx* iface) +{ + MetaDataDispenser *This = impl_from_IMetaDataDispenserEx(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("%p ref=%u\n", This, ref); + + return ref; +} + +static ULONG WINAPI MetaDataDispenser_Release(IMetaDataDispenserEx* iface) +{ + MetaDataDispenser *This = impl_from_IMetaDataDispenserEx(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("%p ref=%u\n", This, ref); + + if (ref == 0) + { + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI MetaDataDispenser_DefineScope(IMetaDataDispenserEx* iface, + REFCLSID rclsid, DWORD dwCreateFlags, REFIID riid, IUnknown **ppIUnk) +{ + FIXME("%p %s %x %s %p\n", iface, debugstr_guid(rclsid), dwCreateFlags, + debugstr_guid(riid), ppIUnk); + return E_NOTIMPL; +} + +static HRESULT WINAPI MetaDataDispenser_OpenScope(IMetaDataDispenserEx* iface, + LPCWSTR szScope, DWORD dwOpenFlags, REFIID riid, IUnknown **ppIUnk) +{ + FIXME("%p %s %x %s %p\n", iface, debugstr_w(szScope), dwOpenFlags, + debugstr_guid(riid), ppIUnk); + return E_NOTIMPL; +} + +static HRESULT WINAPI MetaDataDispenser_OpenScopeOnMemory(IMetaDataDispenserEx* iface, + const void *pData, ULONG cbData, DWORD dwOpenFlags, REFIID riid, IUnknown **ppIUnk) +{ + FIXME("%p %p %u %x %s %p\n", iface, pData, cbData, dwOpenFlags, + debugstr_guid(riid), ppIUnk); + return E_NOTIMPL; +} + +static HRESULT WINAPI MetaDataDispenser_SetOption(IMetaDataDispenserEx* iface, + REFGUID optionid, const VARIANT *value) +{ + FIXME("%p %s\n", iface, debugstr_guid(optionid)); + return E_NOTIMPL; +} + +static HRESULT WINAPI MetaDataDispenser_GetOption(IMetaDataDispenserEx* iface, + REFGUID optionid, VARIANT *pvalue) +{ + FIXME("%p %s\n", iface, debugstr_guid(optionid)); + return E_NOTIMPL; +} + +static HRESULT WINAPI MetaDataDispenser_OpenScopeOnITypeInfo(IMetaDataDispenserEx* iface, + ITypeInfo *pITI, DWORD dwOpenFlags, REFIID riid, IUnknown **ppIUnk) +{ + FIXME("%p %p %u %s %p\n", iface, pITI, dwOpenFlags, debugstr_guid(riid), ppIUnk); + return E_NOTIMPL; +} + +static HRESULT WINAPI MetaDataDispenser_GetCORSystemDirectory(IMetaDataDispenserEx* iface, + LPWSTR szBuffer, DWORD cchBuffer, DWORD *pchBuffer) +{ + FIXME("%p %p %u %p\n", iface, szBuffer, cchBuffer, pchBuffer); + return E_NOTIMPL; +} + +static HRESULT WINAPI MetaDataDispenser_FindAssembly(IMetaDataDispenserEx* iface, + LPCWSTR szAppBase, LPCWSTR szPrivateBin, LPCWSTR szGlobalBin, LPCWSTR szAssemblyName, + LPWSTR szName, ULONG cchName, ULONG *pcName) +{ + FIXME("%p %s %s %s %s %p %u %p\n", iface, debugstr_w(szAppBase), + debugstr_w(szPrivateBin), debugstr_w(szGlobalBin), + debugstr_w(szAssemblyName), szName, cchName, pcName); + return E_NOTIMPL; +} + +static HRESULT WINAPI MetaDataDispenser_FindAssemblyModule(IMetaDataDispenserEx* iface, + LPCWSTR szAppBase, LPCWSTR szPrivateBin, LPCWSTR szGlobalBin, LPCWSTR szAssemblyName, + LPCWSTR szModuleName, LPWSTR szName, ULONG cchName, ULONG *pcName) +{ + FIXME("%p %s %s %s %s %s %p %u %p\n", iface, debugstr_w(szAppBase), + debugstr_w(szPrivateBin), debugstr_w(szGlobalBin), debugstr_w(szAssemblyName), + debugstr_w(szModuleName), szName, cchName, pcName); + return E_NOTIMPL; +} + +static const struct IMetaDataDispenserExVtbl MetaDataDispenserVtbl = +{ + MetaDataDispenser_QueryInterface, + MetaDataDispenser_AddRef, + MetaDataDispenser_Release, + MetaDataDispenser_DefineScope, + MetaDataDispenser_OpenScope, + MetaDataDispenser_OpenScopeOnMemory, + MetaDataDispenser_SetOption, + MetaDataDispenser_GetOption, + MetaDataDispenser_OpenScopeOnITypeInfo, + MetaDataDispenser_GetCORSystemDirectory, + MetaDataDispenser_FindAssembly, + MetaDataDispenser_FindAssemblyModule +}; + +HRESULT MetaDataDispenser_CreateInstance(IUnknown **ppUnk) +{ + MetaDataDispenser *This; + + This = HeapAlloc(GetProcessHeap(), 0, sizeof(MetaDataDispenser)); + + if (!This) + return E_OUTOFMEMORY; + + This->IMetaDataDispenserEx_iface.lpVtbl = &MetaDataDispenserVtbl; + This->ref = 1; + + *ppUnk = (IUnknown*)This; + + return S_OK; +} diff --git a/reactos/dll/win32/mscoree/metahost.c b/reactos/dll/win32/mscoree/metahost.c new file mode 100644 index 00000000000..49fb0ee5460 --- /dev/null +++ b/reactos/dll/win32/mscoree/metahost.c @@ -0,0 +1,1341 @@ +/* + * ICLRMetaHost - discovery and management of available .NET runtimes + * + * 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 +#include +#include + +#define COBJMACROS + +#include "wine/unicode.h" +#include "wine/library.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "ole2.h" + +#include "corerror.h" +#include "cor.h" +#include "mscoree.h" +#include "corhdr.h" +#include "cordebug.h" +#include "metahost.h" +#include "fusion.h" +#include "wine/list.h" +#include "mscoree_private.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL( mscoree ); + +static const WCHAR net_11_subdir[] = {'1','.','0',0}; +static const WCHAR net_20_subdir[] = {'2','.','0',0}; +static const WCHAR net_40_subdir[] = {'4','.','0',0}; + +static const struct ICLRRuntimeInfoVtbl CLRRuntimeInfoVtbl; + +#define NUM_RUNTIMES 3 + +static struct CLRRuntimeInfo runtimes[NUM_RUNTIMES] = { + {{&CLRRuntimeInfoVtbl}, net_11_subdir, 1, 1, 4322, 0}, + {{&CLRRuntimeInfoVtbl}, net_20_subdir, 2, 0, 50727, 0}, + {{&CLRRuntimeInfoVtbl}, net_40_subdir, 4, 0, 30319, 0} +}; + +static int runtimes_initialized; + +static CRITICAL_SECTION runtime_list_cs; +static CRITICAL_SECTION_DEBUG runtime_list_cs_debug = +{ + 0, 0, &runtime_list_cs, + { &runtime_list_cs_debug.ProcessLocksList, + &runtime_list_cs_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": runtime_list_cs") } +}; +static CRITICAL_SECTION runtime_list_cs = { &runtime_list_cs_debug, -1, 0, 0, 0, 0 }; + +#define NUM_ABI_VERSIONS 2 + +static loaded_mono loaded_monos[NUM_ABI_VERSIONS]; + +static BOOL find_mono_dll(LPCWSTR path, LPWSTR dll_path, int abi_version); + +static MonoAssembly* mono_assembly_search_hook_fn(MonoAssemblyName *aname, char **assemblies_path, void *user_data); + +static void mono_shutdown_callback_fn(MonoProfiler *prof); + +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 void CDECL do_nothing(void) +{ +} + +static void missing_runtime_message(const CLRRuntimeInfo *This) +{ + if (This->major == 1) + MESSAGE("wine: Install Mono 2.6 for Windows to run .NET 1.1 applications.\n"); + else if (This->major == 2) + MESSAGE("wine: Install Mono for Windows to run .NET 2.0 applications.\n"); + else if (This->major == 4) + MESSAGE("wine: Install Mono 2.8 or greater for Windows to run .NET 4.0 applications.\n"); +} + +static HRESULT load_mono(CLRRuntimeInfo *This, loaded_mono **result) +{ + static const WCHAR bin[] = {'\\','b','i','n',0}; + static const WCHAR lib[] = {'\\','l','i','b',0}; + static const WCHAR etc[] = {'\\','e','t','c',0}; + static const WCHAR glibdll[] = {'l','i','b','g','l','i','b','-','2','.','0','-','0','.','d','l','l',0}; + WCHAR 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]; + int trace_size; + char trace_setting[256]; + + if (This->mono_abi_version <= 0 || This->mono_abi_version > NUM_ABI_VERSIONS) + { + missing_runtime_message(This); + return E_FAIL; + } + + *result = &loaded_monos[This->mono_abi_version-1]; + + if ((*result)->is_shutdown) + { + ERR("Cannot load Mono after it has been shut down.\n"); + *result = NULL; + return E_FAIL; + } + + if (!(*result)->mono_handle) + { + strcpyW(mono_bin_path, This->mono_path); + strcatW(mono_bin_path, bin); + set_environment(mono_bin_path); + + strcpyW(mono_lib_path, This->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, This->mono_path); + strcatW(mono_etc_path, etc); + WideCharToMultiByte(CP_UTF8, 0, mono_etc_path, -1, mono_etc_path_a, MAX_PATH, NULL, NULL); + + if (!find_mono_dll(This->mono_path, mono_dll_path, This->mono_abi_version)) goto fail; + + (*result)->mono_handle = LoadLibraryW(mono_dll_path); + + if (!(*result)->mono_handle) goto fail; + +#define LOAD_MONO_FUNCTION(x) do { \ + (*result)->x = (void*)GetProcAddress((*result)->mono_handle, #x); \ + if (!(*result)->x) { \ + goto fail; \ + } \ +} while (0); + + LOAD_MONO_FUNCTION(mono_assembly_get_image); + LOAD_MONO_FUNCTION(mono_assembly_open); + LOAD_MONO_FUNCTION(mono_config_parse); + LOAD_MONO_FUNCTION(mono_class_from_mono_type); + LOAD_MONO_FUNCTION(mono_class_from_name); + LOAD_MONO_FUNCTION(mono_class_get_method_from_name); + LOAD_MONO_FUNCTION(mono_domain_assembly_open); + LOAD_MONO_FUNCTION(mono_install_assembly_preload_hook); + LOAD_MONO_FUNCTION(mono_jit_exec); + LOAD_MONO_FUNCTION(mono_jit_init); + LOAD_MONO_FUNCTION(mono_jit_set_trace_options); + LOAD_MONO_FUNCTION(mono_object_get_domain); + LOAD_MONO_FUNCTION(mono_object_new); + LOAD_MONO_FUNCTION(mono_object_unbox); + LOAD_MONO_FUNCTION(mono_profiler_install); + LOAD_MONO_FUNCTION(mono_reflection_type_from_name); + LOAD_MONO_FUNCTION(mono_runtime_invoke); + LOAD_MONO_FUNCTION(mono_runtime_object_init); + LOAD_MONO_FUNCTION(mono_runtime_quit); + LOAD_MONO_FUNCTION(mono_set_dirs); + LOAD_MONO_FUNCTION(mono_stringify_assembly_name); + LOAD_MONO_FUNCTION(mono_string_new); + + /* GLib imports obsoleted by the 2.0 ABI */ + if (This->mono_abi_version == 1) + { + (*result)->glib_handle = LoadLibraryW(glibdll); + if (!(*result)->glib_handle) goto fail; + + (*result)->mono_free = (void*)GetProcAddress((*result)->glib_handle, "g_free"); + if (!(*result)->mono_free) goto fail; + } + else + { + LOAD_MONO_FUNCTION(mono_free); + } + +#undef LOAD_MONO_FUNCTION + +#define LOAD_OPT_VOID_MONO_FUNCTION(x) do { \ + (*result)->x = (void*)GetProcAddress((*result)->mono_handle, #x); \ + if (!(*result)->x) { \ + (*result)->x = do_nothing; \ + } \ +} while (0); + + LOAD_OPT_VOID_MONO_FUNCTION(mono_runtime_set_shutting_down); + LOAD_OPT_VOID_MONO_FUNCTION(mono_thread_pool_cleanup); + LOAD_OPT_VOID_MONO_FUNCTION(mono_thread_suspend_all_other_threads); + LOAD_OPT_VOID_MONO_FUNCTION(mono_threads_set_shutting_down); + +#undef LOAD_OPT_VOID_MONO_FUNCTION + + (*result)->mono_profiler_install((MonoProfiler*)*result, mono_shutdown_callback_fn); + + (*result)->mono_set_dirs(mono_lib_path_a, mono_etc_path_a); + + (*result)->mono_config_parse(NULL); + + (*result)->mono_install_assembly_preload_hook(mono_assembly_search_hook_fn, *result); + + trace_size = GetEnvironmentVariableA("WINE_MONO_TRACE", trace_setting, sizeof(trace_setting)); + + if (trace_size) + { + (*result)->mono_jit_set_trace_options(trace_setting); + } + } + + return S_OK; + +fail: + ERR("Could not load Mono into this process\n"); + FreeLibrary((*result)->mono_handle); + FreeLibrary((*result)->glib_handle); + (*result)->mono_handle = NULL; + (*result)->glib_handle = NULL; + return E_FAIL; +} + +static void mono_shutdown_callback_fn(MonoProfiler *prof) +{ + loaded_mono *mono = (loaded_mono*)prof; + + mono->is_shutdown = TRUE; +} + +static HRESULT CLRRuntimeInfo_GetRuntimeHost(CLRRuntimeInfo *This, RuntimeHost **result) +{ + HRESULT hr = S_OK; + loaded_mono *ploaded_mono; + + if (This->loaded_runtime) + { + *result = This->loaded_runtime; + return hr; + } + + EnterCriticalSection(&runtime_list_cs); + + hr = load_mono(This, &ploaded_mono); + + if (SUCCEEDED(hr)) + hr = RuntimeHost_Construct(This, ploaded_mono, &This->loaded_runtime); + + LeaveCriticalSection(&runtime_list_cs); + + if (SUCCEEDED(hr)) + *result = This->loaded_runtime; + + return hr; +} + +void unload_all_runtimes(void) +{ + int i; + + for (i=0; imono_handle && mono->is_started && !mono->is_shutdown) + { + /* Copied from Mono's ves_icall_System_Environment_Exit */ + mono->mono_threads_set_shutting_down(); + mono->mono_runtime_set_shutting_down(); + mono->mono_thread_pool_cleanup(); + mono->mono_thread_suspend_all_other_threads(); + mono->mono_runtime_quit(); + } + } + + for (i=0; imono_handle && mono->is_started && !mono->is_shutdown) + { + ERR("Process exited with a Mono runtime loaded.\n"); + return; + } + } +} + +static inline CLRRuntimeInfo *impl_from_ICLRRuntimeInfo(ICLRRuntimeInfo *iface) +{ + return CONTAINING_RECORD(iface, CLRRuntimeInfo, ICLRRuntimeInfo_iface); +} + +static HRESULT WINAPI CLRRuntimeInfo_QueryInterface(ICLRRuntimeInfo* iface, + REFIID riid, + void **ppvObject) +{ + TRACE("%p %s %p\n", iface, debugstr_guid(riid), ppvObject); + + if ( IsEqualGUID( riid, &IID_ICLRRuntimeInfo ) || + IsEqualGUID( riid, &IID_IUnknown ) ) + { + *ppvObject = iface; + } + else + { + FIXME("Unsupported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + ICLRRuntimeInfo_AddRef( iface ); + + return S_OK; +} + +static ULONG WINAPI CLRRuntimeInfo_AddRef(ICLRRuntimeInfo* iface) +{ + return 2; +} + +static ULONG WINAPI CLRRuntimeInfo_Release(ICLRRuntimeInfo* iface) +{ + return 1; +} + +static HRESULT WINAPI CLRRuntimeInfo_GetVersionString(ICLRRuntimeInfo* iface, + LPWSTR pwzBuffer, DWORD *pcchBuffer) +{ + struct CLRRuntimeInfo *This = impl_from_ICLRRuntimeInfo(iface); + DWORD buffer_size = *pcchBuffer; + HRESULT hr = S_OK; + char version[11]; + DWORD size; + + TRACE("%p %p %p\n", iface, pwzBuffer, pcchBuffer); + + size = snprintf(version, sizeof(version), "v%u.%u.%u", This->major, This->minor, This->build); + + assert(size <= sizeof(version)); + + *pcchBuffer = MultiByteToWideChar(CP_UTF8, 0, version, -1, NULL, 0); + + if (pwzBuffer) + { + if (buffer_size >= *pcchBuffer) + MultiByteToWideChar(CP_UTF8, 0, version, -1, pwzBuffer, buffer_size); + else + hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + return hr; +} + +static BOOL get_install_root(LPWSTR install_dir) +{ + const WCHAR dotnet_key[] = {'S','O','F','T','W','A','R','E','\\','M','i','c','r','o','s','o','f','t','\\','.','N','E','T','F','r','a','m','e','w','o','r','k','\\',0}; + const WCHAR install_root[] = {'I','n','s','t','a','l','l','R','o','o','t',0}; + + DWORD len; + HKEY key; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, dotnet_key, 0, KEY_READ, &key)) + return FALSE; + + len = MAX_PATH; + if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)install_dir, &len)) + { + RegCloseKey(key); + return FALSE; + } + RegCloseKey(key); + + return TRUE; +} + +static HRESULT WINAPI CLRRuntimeInfo_GetRuntimeDirectory(ICLRRuntimeInfo* iface, + LPWSTR pwzBuffer, DWORD *pcchBuffer) +{ + static const WCHAR slash[] = {'\\',0}; + DWORD buffer_size = *pcchBuffer; + WCHAR system_dir[MAX_PATH]; + WCHAR version[MAX_PATH]; + DWORD version_size, size; + HRESULT hr = S_OK; + + TRACE("%p %p %p\n", iface, pwzBuffer, pcchBuffer); + + if (!get_install_root(system_dir)) + { + ERR("error reading registry key for installroot\n"); + return E_FAIL; + } + else + { + version_size = MAX_PATH; + ICLRRuntimeInfo_GetVersionString(iface, version, &version_size); + lstrcatW(system_dir, version); + lstrcatW(system_dir, slash); + size = lstrlenW(system_dir) + 1; + } + + *pcchBuffer = size; + + if (pwzBuffer) + { + if (buffer_size >= size) + strcpyW(pwzBuffer, system_dir); + else + hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + + return hr; +} + +static HRESULT WINAPI CLRRuntimeInfo_IsLoaded(ICLRRuntimeInfo* iface, + HANDLE hndProcess, BOOL *pbLoaded) +{ + FIXME("%p %p %p\n", iface, hndProcess, pbLoaded); + + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeInfo_LoadErrorString(ICLRRuntimeInfo* iface, + UINT iResourceID, LPWSTR pwzBuffer, DWORD *pcchBuffer, LONG iLocaleid) +{ + FIXME("%p %u %p %p %x\n", iface, iResourceID, pwzBuffer, pcchBuffer, iLocaleid); + + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeInfo_LoadLibrary(ICLRRuntimeInfo* iface, + LPCWSTR pwzDllName, HMODULE *phndModule) +{ + WCHAR version[MAX_PATH]; + HRESULT hr; + DWORD cchBuffer; + + TRACE("%p %s %p\n", iface, debugstr_w(pwzDllName), phndModule); + + cchBuffer = MAX_PATH; + hr = ICLRRuntimeInfo_GetVersionString(iface, version, &cchBuffer); + if (FAILED(hr)) return hr; + + return LoadLibraryShim(pwzDllName, version, NULL, phndModule); +} + +static HRESULT WINAPI CLRRuntimeInfo_GetProcAddress(ICLRRuntimeInfo* iface, + LPCSTR pszProcName, LPVOID *ppProc) +{ + FIXME("%p %s %p\n", iface, debugstr_a(pszProcName), ppProc); + + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeInfo_GetInterface(ICLRRuntimeInfo* iface, + REFCLSID rclsid, REFIID riid, LPVOID *ppUnk) +{ + struct CLRRuntimeInfo *This = impl_from_ICLRRuntimeInfo(iface); + RuntimeHost *host; + HRESULT hr; + + TRACE("%p %s %s %p\n", iface, debugstr_guid(rclsid), debugstr_guid(riid), ppUnk); + + hr = CLRRuntimeInfo_GetRuntimeHost(This, &host); + + if (SUCCEEDED(hr)) + hr = RuntimeHost_GetInterface(host, rclsid, riid, ppUnk); + + return hr; +} + +static HRESULT WINAPI CLRRuntimeInfo_IsLoadable(ICLRRuntimeInfo* iface, + BOOL *pbLoadable) +{ + FIXME("%p %p\n", iface, pbLoadable); + + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeInfo_SetDefaultStartupFlags(ICLRRuntimeInfo* iface, + DWORD dwStartupFlags, LPCWSTR pwzHostConfigFile) +{ + FIXME("%p %x %s\n", iface, dwStartupFlags, debugstr_w(pwzHostConfigFile)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeInfo_GetDefaultStartupFlags(ICLRRuntimeInfo* iface, + DWORD *pdwStartupFlags, LPWSTR pwzHostConfigFile, DWORD *pcchHostConfigFile) +{ + FIXME("%p %p %p %p\n", iface, pdwStartupFlags, pwzHostConfigFile, pcchHostConfigFile); + + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeInfo_BindAsLegacyV2Runtime(ICLRRuntimeInfo* iface) +{ + FIXME("%p\n", iface); + + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRRuntimeInfo_IsStarted(ICLRRuntimeInfo* iface, + BOOL *pbStarted, DWORD *pdwStartupFlags) +{ + FIXME("%p %p %p\n", iface, pbStarted, pdwStartupFlags); + + return E_NOTIMPL; +} + +static const struct ICLRRuntimeInfoVtbl CLRRuntimeInfoVtbl = { + CLRRuntimeInfo_QueryInterface, + CLRRuntimeInfo_AddRef, + CLRRuntimeInfo_Release, + CLRRuntimeInfo_GetVersionString, + CLRRuntimeInfo_GetRuntimeDirectory, + CLRRuntimeInfo_IsLoaded, + CLRRuntimeInfo_LoadErrorString, + CLRRuntimeInfo_LoadLibrary, + CLRRuntimeInfo_GetProcAddress, + CLRRuntimeInfo_GetInterface, + CLRRuntimeInfo_IsLoadable, + CLRRuntimeInfo_SetDefaultStartupFlags, + CLRRuntimeInfo_GetDefaultStartupFlags, + CLRRuntimeInfo_BindAsLegacyV2Runtime, + CLRRuntimeInfo_IsStarted +}; + +HRESULT ICLRRuntimeInfo_GetRuntimeHost(ICLRRuntimeInfo *iface, RuntimeHost **result) +{ + struct CLRRuntimeInfo *This = impl_from_ICLRRuntimeInfo(iface); + + assert(This->ICLRRuntimeInfo_iface.lpVtbl == &CLRRuntimeInfoVtbl); + + return CLRRuntimeInfo_GetRuntimeHost(This, result); +} + +static BOOL find_mono_dll(LPCWSTR path, LPWSTR dll_path, int abi_version) +{ + 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 mono2_dll[] = {'\\','b','i','n','\\','m','o','n','o','-','2','.','0','.','d','l','l',0}; + static const WCHAR libmono2_dll[] = {'\\','b','i','n','\\','l','i','b','m','o','n','o','-','2','.','0','.','d','l','l',0}; + DWORD attributes=INVALID_FILE_ATTRIBUTES; + + if (abi_version == 1) + { + strcpyW(dll_path, path); + strcatW(dll_path, mono_dll); + attributes = GetFileAttributesW(dll_path); + + if (attributes == INVALID_FILE_ATTRIBUTES) + { + strcpyW(dll_path, path); + strcatW(dll_path, libmono_dll); + attributes = GetFileAttributesW(dll_path); + } + } + else if (abi_version == 2) + { + strcpyW(dll_path, path); + strcatW(dll_path, mono2_dll); + attributes = GetFileAttributesW(dll_path); + + if (attributes == INVALID_FILE_ATTRIBUTES) + { + strcpyW(dll_path, path); + strcatW(dll_path, libmono2_dll); + attributes = GetFileAttributesW(dll_path); + } + } + + return (attributes != INVALID_FILE_ATTRIBUTES); +} + +static BOOL get_mono_path_from_registry(LPWSTR path, int abi_version) +{ + 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]; + DWORD len; + HKEY key; + WCHAR dll_path[MAX_PATH]; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, mono_key, 0, KEY_READ, &key)) + return FALSE; + + len = sizeof(version); + if (RegQueryValueExW(key, defaul_clr, 0, NULL, (LPBYTE)version, &len)) + { + RegCloseKey(key); + return FALSE; + } + RegCloseKey(key); + + lstrcpyW(version_key, mono_key); + lstrcatW(version_key, slash); + lstrcatW(version_key, version); + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, version_key, 0, KEY_READ, &key)) + return FALSE; + + len = sizeof(WCHAR) * MAX_PATH; + if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)path, &len)) + { + RegCloseKey(key); + return FALSE; + } + RegCloseKey(key); + + return find_mono_dll(path, dll_path, abi_version); +} + +static BOOL get_mono_path_from_folder(LPCWSTR folder, LPWSTR mono_path, int abi_version) +{ + static const WCHAR mono_one_dot_zero[] = {'\\','m','o','n','o','-','1','.','0', 0}; + static const WCHAR mono_two_dot_zero[] = {'\\','m','o','n','o','-','2','.','0', 0}; + WCHAR mono_dll_path[MAX_PATH]; + BOOL found = FALSE; + + strcpyW(mono_path, folder); + + if (abi_version == 1) + strcatW(mono_path, mono_one_dot_zero); + else if (abi_version == 2) + strcatW(mono_path, mono_two_dot_zero); + + found = find_mono_dll(mono_path, mono_dll_path, abi_version); + + return found; +} + +static BOOL get_mono_path(LPWSTR path, int abi_version) +{ + static const WCHAR subdir_mono[] = {'\\','m','o','n','o',0}; + static const WCHAR sibling_mono[] = {'\\','.','.','\\','m','o','n','o',0}; + WCHAR base_path[MAX_PATH]; + const char *unix_data_dir; + WCHAR *dos_data_dir; + int build_tree=0; + static WCHAR* (CDECL *wine_get_dos_file_name)(const char*); + + /* First try c:\windows\mono */ + GetWindowsDirectoryW(base_path, MAX_PATH); + strcatW(base_path, subdir_mono); + + if (get_mono_path_from_folder(base_path, path, abi_version)) + return TRUE; + + /* Next: /usr/share/wine/mono */ + unix_data_dir = wine_get_data_dir(); + + if (!unix_data_dir) + { + unix_data_dir = wine_get_build_dir(); + build_tree = 1; + } + + if (unix_data_dir) + { + if (!wine_get_dos_file_name) + wine_get_dos_file_name = (void*)GetProcAddress(GetModuleHandleA("kernel32"), "wine_get_dos_file_name"); + + if (wine_get_dos_file_name) + { + dos_data_dir = wine_get_dos_file_name(unix_data_dir); + + if (dos_data_dir) + { + strcpyW(base_path, dos_data_dir); + strcatW(base_path, build_tree ? sibling_mono : subdir_mono); + + HeapFree(GetProcessHeap(), 0, dos_data_dir); + + if (get_mono_path_from_folder(base_path, path, abi_version)) + return TRUE; + } + } + } + + /* Last: the registry */ + return get_mono_path_from_registry(path, abi_version); +} + +static void find_runtimes(void) +{ + int abi_version, i; + static const WCHAR libmono[] = {'\\','l','i','b','\\','m','o','n','o','\\',0}; + static const WCHAR mscorlib[] = {'\\','m','s','c','o','r','l','i','b','.','d','l','l',0}; + WCHAR mono_path[MAX_PATH], lib_path[MAX_PATH]; + BOOL any_runtimes_found = FALSE; + + if (runtimes_initialized) return; + + EnterCriticalSection(&runtime_list_cs); + + if (runtimes_initialized) goto end; + + for (abi_version=NUM_ABI_VERSIONS; abi_version>0; abi_version--) + { + if (!get_mono_path(mono_path, abi_version)) + continue; + + for (i=0; iref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + return ref; +} + +static ULONG WINAPI InstalledRuntimeEnum_Release(IEnumUnknown* iface) +{ + struct InstalledRuntimeEnum *This = impl_from_IEnumUnknown(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + if (ref == 0) + { + HeapFree(GetProcessHeap(), 0, This); + } + + return ref; +} + +static HRESULT WINAPI InstalledRuntimeEnum_Next(IEnumUnknown *iface, ULONG celt, + IUnknown **rgelt, ULONG *pceltFetched) +{ + struct InstalledRuntimeEnum *This = impl_from_IEnumUnknown(iface); + int num_fetched = 0; + HRESULT hr=S_OK; + IUnknown *item; + + TRACE("(%p,%u,%p,%p)\n", iface, celt, rgelt, pceltFetched); + + while (num_fetched < celt) + { + if (This->pos >= NUM_RUNTIMES) + { + hr = S_FALSE; + break; + } + if (runtimes[This->pos].mono_abi_version) + { + item = (IUnknown*)&runtimes[This->pos].ICLRRuntimeInfo_iface; + IUnknown_AddRef(item); + rgelt[num_fetched] = item; + num_fetched++; + } + This->pos++; + } + + if (pceltFetched) + *pceltFetched = num_fetched; + + return hr; +} + +static HRESULT WINAPI InstalledRuntimeEnum_Skip(IEnumUnknown *iface, ULONG celt) +{ + struct InstalledRuntimeEnum *This = impl_from_IEnumUnknown(iface); + int num_fetched = 0; + HRESULT hr=S_OK; + + TRACE("(%p,%u)\n", iface, celt); + + while (num_fetched < celt) + { + if (This->pos >= NUM_RUNTIMES) + { + hr = S_FALSE; + break; + } + if (runtimes[This->pos].mono_abi_version) + { + num_fetched++; + } + This->pos++; + } + + return hr; +} + +static HRESULT WINAPI InstalledRuntimeEnum_Reset(IEnumUnknown *iface) +{ + struct InstalledRuntimeEnum *This = impl_from_IEnumUnknown(iface); + + TRACE("(%p)\n", iface); + + This->pos = 0; + + return S_OK; +} + +static HRESULT WINAPI InstalledRuntimeEnum_Clone(IEnumUnknown *iface, IEnumUnknown **ppenum) +{ + struct InstalledRuntimeEnum *This = impl_from_IEnumUnknown(iface); + struct InstalledRuntimeEnum *new_enum; + + TRACE("(%p)\n", iface); + + new_enum = HeapAlloc(GetProcessHeap(), 0, sizeof(*new_enum)); + if (!new_enum) + return E_OUTOFMEMORY; + + new_enum->IEnumUnknown_iface.lpVtbl = &InstalledRuntimeEnum_Vtbl; + new_enum->ref = 1; + new_enum->pos = This->pos; + + *ppenum = &new_enum->IEnumUnknown_iface; + + return S_OK; +} + +static const struct IEnumUnknownVtbl InstalledRuntimeEnum_Vtbl = { + InstalledRuntimeEnum_QueryInterface, + InstalledRuntimeEnum_AddRef, + InstalledRuntimeEnum_Release, + InstalledRuntimeEnum_Next, + InstalledRuntimeEnum_Skip, + InstalledRuntimeEnum_Reset, + InstalledRuntimeEnum_Clone +}; + +struct CLRMetaHost +{ + ICLRMetaHost ICLRMetaHost_iface; +}; + +static struct CLRMetaHost GlobalCLRMetaHost; + +static HRESULT WINAPI CLRMetaHost_QueryInterface(ICLRMetaHost* iface, + REFIID riid, + void **ppvObject) +{ + TRACE("%s %p\n", debugstr_guid(riid), ppvObject); + + if ( IsEqualGUID( riid, &IID_ICLRMetaHost ) || + IsEqualGUID( riid, &IID_IUnknown ) ) + { + *ppvObject = iface; + } + else + { + FIXME("Unsupported interface %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + ICLRMetaHost_AddRef( iface ); + + return S_OK; +} + +static ULONG WINAPI CLRMetaHost_AddRef(ICLRMetaHost* iface) +{ + return 2; +} + +static ULONG WINAPI CLRMetaHost_Release(ICLRMetaHost* iface) +{ + return 1; +} + +static BOOL parse_runtime_version(LPCWSTR version, DWORD *major, DWORD *minor, DWORD *build) +{ + *major = 0; + *minor = 0; + *build = 0; + + if (version[0] == 'v') + { + version++; + if (!isdigit(*version)) + return FALSE; + + while (isdigit(*version)) + *major = *major * 10 + (*version++ - '0'); + + if (*version == 0) + return TRUE; + + if (*version++ != '.' || !isdigit(*version)) + return FALSE; + + while (isdigit(*version)) + *minor = *minor * 10 + (*version++ - '0'); + + if (*version == 0) + return TRUE; + + if (*version++ != '.' || !isdigit(*version)) + return FALSE; + + while (isdigit(*version)) + *build = *build * 10 + (*version++ - '0'); + + return *version == 0; + } + else + return FALSE; +} + +HRESULT WINAPI CLRMetaHost_GetRuntime(ICLRMetaHost* iface, + LPCWSTR pwzVersion, REFIID iid, LPVOID *ppRuntime) +{ + int i; + DWORD major, minor, build; + + TRACE("%s %s %p\n", debugstr_w(pwzVersion), debugstr_guid(iid), ppRuntime); + + if (!pwzVersion) + return E_POINTER; + + if (!parse_runtime_version(pwzVersion, &major, &minor, &build)) + { + ERR("Cannot parse %s\n", debugstr_w(pwzVersion)); + return CLR_E_SHIM_RUNTIME; + } + + find_runtimes(); + + for (i=0; i= *pcchBuffer) + MultiByteToWideChar(CP_UTF8, 0, version, -1, pwzBuffer, buffer_size); + else + hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + } + } + + assembly_release(assembly); + } + + return hr; +} + +static HRESULT WINAPI CLRMetaHost_EnumerateInstalledRuntimes(ICLRMetaHost* iface, + IEnumUnknown **ppEnumerator) +{ + struct InstalledRuntimeEnum *new_enum; + + TRACE("%p\n", ppEnumerator); + + find_runtimes(); + + new_enum = HeapAlloc(GetProcessHeap(), 0, sizeof(*new_enum)); + if (!new_enum) + return E_OUTOFMEMORY; + + new_enum->IEnumUnknown_iface.lpVtbl = &InstalledRuntimeEnum_Vtbl; + new_enum->ref = 1; + new_enum->pos = 0; + + *ppEnumerator = &new_enum->IEnumUnknown_iface; + + return S_OK; +} + +static HRESULT WINAPI CLRMetaHost_EnumerateLoadedRuntimes(ICLRMetaHost* iface, + HANDLE hndProcess, IEnumUnknown **ppEnumerator) +{ + FIXME("%p %p\n", hndProcess, ppEnumerator); + + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRMetaHost_RequestRuntimeLoadedNotification(ICLRMetaHost* iface, + RuntimeLoadedCallbackFnPtr pCallbackFunction) +{ + FIXME("%p\n", pCallbackFunction); + + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRMetaHost_QueryLegacyV2RuntimeBinding(ICLRMetaHost* iface, + REFIID riid, LPVOID *ppUnk) +{ + FIXME("%s %p\n", debugstr_guid(riid), ppUnk); + + return E_NOTIMPL; +} + +static HRESULT WINAPI CLRMetaHost_ExitProcess(ICLRMetaHost* iface, INT32 iExitCode) +{ + FIXME("%i: stub\n", iExitCode); + + ExitProcess(iExitCode); +} + +static const struct ICLRMetaHostVtbl CLRMetaHost_vtbl = +{ + CLRMetaHost_QueryInterface, + CLRMetaHost_AddRef, + CLRMetaHost_Release, + CLRMetaHost_GetRuntime, + CLRMetaHost_GetVersionFromFile, + CLRMetaHost_EnumerateInstalledRuntimes, + CLRMetaHost_EnumerateLoadedRuntimes, + CLRMetaHost_RequestRuntimeLoadedNotification, + CLRMetaHost_QueryLegacyV2RuntimeBinding, + CLRMetaHost_ExitProcess +}; + +static struct CLRMetaHost GlobalCLRMetaHost = { + { &CLRMetaHost_vtbl } +}; + +HRESULT CLRMetaHost_CreateInstance(REFIID riid, void **ppobj) +{ + return ICLRMetaHost_QueryInterface(&GlobalCLRMetaHost.ICLRMetaHost_iface, riid, ppobj); +} + +static MonoAssembly* mono_assembly_search_hook_fn(MonoAssemblyName *aname, char **assemblies_path, void *user_data) +{ + loaded_mono *mono = user_data; + HRESULT hr=S_OK; + MonoAssembly *result=NULL; + char *stringname=NULL; + LPWSTR stringnameW; + int stringnameW_size; + IAssemblyCache *asmcache; + ASSEMBLY_INFO info; + WCHAR path[MAX_PATH]; + char *pathA; + MonoImageOpenStatus stat; + static WCHAR fusiondll[] = {'f','u','s','i','o','n',0}; + HMODULE hfusion=NULL; + static HRESULT (WINAPI *pCreateAssemblyCache)(IAssemblyCache**,DWORD); + + stringname = mono->mono_stringify_assembly_name(aname); + + TRACE("%s\n", debugstr_a(stringname)); + + if (!stringname) return NULL; + + /* FIXME: We should search the given paths before the GAC. */ + + if (!pCreateAssemblyCache) + { + hr = LoadLibraryShim(fusiondll, NULL, NULL, &hfusion); + + if (SUCCEEDED(hr)) + { + pCreateAssemblyCache = (void*)GetProcAddress(hfusion, "CreateAssemblyCache"); + if (!pCreateAssemblyCache) + hr = E_FAIL; + } + } + + if (SUCCEEDED(hr)) + hr = pCreateAssemblyCache(&asmcache, 0); + + if (SUCCEEDED(hr)) + { + stringnameW_size = MultiByteToWideChar(CP_UTF8, 0, stringname, -1, NULL, 0); + + stringnameW = HeapAlloc(GetProcessHeap(), 0, stringnameW_size * sizeof(WCHAR)); + if (stringnameW) + MultiByteToWideChar(CP_UTF8, 0, stringname, -1, stringnameW, stringnameW_size); + else + hr = E_OUTOFMEMORY; + + if (SUCCEEDED(hr)) + { + info.cbAssemblyInfo = sizeof(info); + info.pszCurrentAssemblyPathBuf = path; + info.cchBuf = MAX_PATH; + path[0] = 0; + + hr = IAssemblyCache_QueryAssemblyInfo(asmcache, 0, stringnameW, &info); + } + + HeapFree(GetProcessHeap(), 0, stringnameW); + + IAssemblyCache_Release(asmcache); + } + + if (SUCCEEDED(hr)) + { + TRACE("found: %s\n", debugstr_w(path)); + + pathA = WtoA(path); + + if (pathA) + { + result = mono->mono_assembly_open(pathA, &stat); + + if (!result) + ERR("Failed to load %s, status=%u\n", debugstr_w(path), stat); + + HeapFree(GetProcessHeap(), 0, pathA); + } + } + + mono->mono_free(stringname); + + return result; +} + +HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file, + DWORD startup_flags, DWORD runtimeinfo_flags, BOOL legacy, ICLRRuntimeInfo **result) +{ + static const WCHAR dotconfig[] = {'.','c','o','n','f','i','g',0}; + static const DWORD supported_startup_flags = 0; + static const DWORD supported_runtime_flags = RUNTIME_INFO_UPGRADE_VERSION; + int i; + WCHAR local_version[MAX_PATH]; + ULONG local_version_size = MAX_PATH; + WCHAR local_config_file[MAX_PATH]; + HRESULT hr; + parsed_config_file parsed_config; + + if (startup_flags & ~supported_startup_flags) + FIXME("unsupported startup flags %x\n", startup_flags & ~supported_startup_flags); + + if (runtimeinfo_flags & ~supported_runtime_flags) + FIXME("unsupported runtimeinfo flags %x\n", runtimeinfo_flags & ~supported_runtime_flags); + + if (exefile && !config_file) + { + strcpyW(local_config_file, exefile); + strcatW(local_config_file, dotconfig); + + config_file = local_config_file; + } + + if (config_file) + { + int found=0; + hr = parse_config_file(config_file, &parsed_config); + + if (SUCCEEDED(hr)) + { + supported_runtime *entry; + LIST_FOR_EACH_ENTRY(entry, &parsed_config.supported_runtimes, supported_runtime, entry) + { + hr = CLRMetaHost_GetRuntime(0, entry->version, &IID_ICLRRuntimeInfo, (void**)result); + if (SUCCEEDED(hr)) + { + found = 1; + break; + } + } + } + else + { + WARN("failed to parse config file %s, hr=%x\n", debugstr_w(config_file), hr); + } + + free_parsed_config_file(&parsed_config); + + if (found) + return S_OK; + } + + if (exefile && !version) + { + hr = CLRMetaHost_GetVersionFromFile(0, exefile, local_version, &local_version_size); + + version = local_version; + + if (FAILED(hr)) return hr; + } + + if (version) + { + return CLRMetaHost_GetRuntime(0, version, &IID_ICLRRuntimeInfo, (void**)result); + } + + if (runtimeinfo_flags & RUNTIME_INFO_UPGRADE_VERSION) + { + find_runtimes(); + + if (legacy) + i = 2; + else + i = NUM_RUNTIMES; + + while (i--) + { + if (runtimes[i].mono_abi_version) + return ICLRRuntimeInfo_QueryInterface(&runtimes[i].ICLRRuntimeInfo_iface, + &IID_ICLRRuntimeInfo, (void **)result); + } + + if (legacy) + missing_runtime_message(&runtimes[1]); + else + missing_runtime_message(&runtimes[NUM_RUNTIMES-1]); + + return CLR_E_SHIM_RUNTIME; + } + + return CLR_E_SHIM_RUNTIME; +} diff --git a/reactos/dll/win32/mscoree/mscoree.rbuild b/reactos/dll/win32/mscoree/mscoree.rbuild index a014334a962..1c67d5e41d3 100644 --- a/reactos/dll/win32/mscoree/mscoree.rbuild +++ b/reactos/dll/win32/mscoree/mscoree.rbuild @@ -4,9 +4,18 @@ include/reactos/wine wine + dbghelp advapi32 shell32 + ole32 + shlwapi uuid + assembly.c + config.c + cordebug.c corruntimehost.c + metadata.c + metahost.c mscoree_main.c + mscoree.rc diff --git a/reactos/dll/win32/mscoree/mscoree.rc b/reactos/dll/win32/mscoree/mscoree.rc new file mode 100644 index 00000000000..88714379f29 --- /dev/null +++ b/reactos/dll/win32/mscoree/mscoree.rc @@ -0,0 +1 @@ +1 WINE_REGISTRY mscoree.rgs diff --git a/reactos/dll/win32/mscoree/mscoree.rgs b/reactos/dll/win32/mscoree/mscoree.rgs new file mode 100644 index 00000000000..3730c5455b7 --- /dev/null +++ b/reactos/dll/win32/mscoree/mscoree.rgs @@ -0,0 +1,84 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{90F1A06E-7712-4762-86B5-7A5EBA6BDB01}' = s 'Microsoft Common Language Runtime Host V2' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'CLRMetaData.CLRRuntimeHost.1' + VersionIndependentProgId = s 'CLRMetaData.CLRRuntimeHost' + } + '{90F1A06E-7712-4762-86B5-7A5EBA6BDB02}' = s 'Microsoft Common Language Runtime Host V2' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'CLRMetaData.CLRRuntimeHost.2' + VersionIndependentProgId = s 'CLRMetaData.CLRRuntimeHost' + } + '{E5CB7A31-7512-11D2-89CE-0080C792E5D8}' = s 'Microsoft Common Language Runtime Meta Data' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'CLRMetaData.CorMetaDataDispenser.2' + VersionIndependentProgId = s 'CLRMetaData.CorMetaDataDispenser' + } + '{1EC2DE53-75CC-11D2-9775-00A0C9B4D50C}' = s 'Microsoft Common Language Runtime Meta Data' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'CLRMetaData.CorMetaDataDispenserRuntime.2' + VersionIndependentProgId = s 'CLRMetaData.CorMetaDataDispenserRuntime' + } + '{CB2F6723-AB3A-11D2-9C40-00C04FA30A3E}' = s 'Microsoft Common Language Runtime Host' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Both' } + ProgId = s 'CLRMetaData.CorRuntimeHost.2' + VersionIndependentProgId = s 'CLRMetaData.CorRuntimeHost' + } + } + 'CLRMetaData.CLRRuntimeHost.1' = s 'Microsoft Common Language Runtime Host V2' + { + CLSID = s '{90F1A06E-7712-4762-86B5-7A5EBA6BDB01}' + } + 'CLRMetaData.CLRRuntimeHost' = s 'Microsoft Common Language Runtime Host V2' + { + CLSID = s '{90F1A06E-7712-4762-86B5-7A5EBA6BDB01}' + CurVer = s 'CLRMetaData.CLRRuntimeHost.1' + } + 'CLRMetaData.CLRRuntimeHost.2' = s 'Microsoft Common Language Runtime Host V2' + { + CLSID = s '{90F1A06E-7712-4762-86B5-7A5EBA6BDB02}' + } + 'CLRMetaData.CLRRuntimeHost' = s 'Microsoft Common Language Runtime Host V2' + { + CLSID = s '{90F1A06E-7712-4762-86B5-7A5EBA6BDB02}' + CurVer = s 'CLRMetaData.CLRRuntimeHost.2' + } + 'CLRMetaData.CorMetaDataDispenser.2' = s 'Microsoft Common Language Runtime Meta Data' + { + CLSID = s '{E5CB7A31-7512-11D2-89CE-0080C792E5D8}' + } + 'CLRMetaData.CorMetaDataDispenser' = s 'Microsoft Common Language Runtime Meta Data' + { + CLSID = s '{E5CB7A31-7512-11D2-89CE-0080C792E5D8}' + CurVer = s 'CLRMetaData.CorMetaDataDispenser.2' + } + 'CLRMetaData.CorMetaDataDispenserRuntime.2' = s 'Microsoft Common Language Runtime Meta Data' + { + CLSID = s '{1EC2DE53-75CC-11D2-9775-00A0C9B4D50C}' + } + 'CLRMetaData.CorMetaDataDispenserRuntime' = s 'Microsoft Common Language Runtime Meta Data' + { + CLSID = s '{1EC2DE53-75CC-11D2-9775-00A0C9B4D50C}' + CurVer = s 'CLRMetaData.CorMetaDataDispenserRuntime.2' + } + 'CLRMetaData.CorRuntimeHost.2' = s 'Microsoft Common Language Runtime Host' + { + CLSID = s '{CB2F6723-AB3A-11D2-9C40-00C04FA30A3E}' + } + 'CLRMetaData.CorRuntimeHost' = s 'Microsoft Common Language Runtime Host' + { + CLSID = s '{CB2F6723-AB3A-11D2-9C40-00C04FA30A3E}' + CurVer = s 'CLRMetaData.CorRuntimeHost.2' + } +} diff --git a/reactos/dll/win32/mscoree/mscoree.spec b/reactos/dll/win32/mscoree/mscoree.spec index 8e25cec2b7d..b2f72cd211a 100644 --- a/reactos/dll/win32/mscoree/mscoree.spec +++ b/reactos/dll/win32/mscoree/mscoree.spec @@ -7,6 +7,7 @@ @ stub CallFunctionShim @ stub CloseCtrs +@ stdcall CLRCreateInstance(ptr ptr ptr) @ stdcall ClrCreateManagedInstance(wstr ptr ptr) @ stub CoEEShutDownCOM @ stdcall CoInitializeCor(long) @@ -27,8 +28,8 @@ @ stub CorIsLatestSvc @ stub CorMarkThreadInThreadPool @ stub CorTickleSvc -@ stub CreateConfigStream -@ stub CreateDebuggingInterfaceFromVersion +@ stdcall CreateConfigStream(wstr ptr) +@ stdcall CreateDebuggingInterfaceFromVersion(long wstr ptr) @ stdcall -private DllCanUnloadNow() @ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllRegisterServer() @@ -42,7 +43,7 @@ @ stdcall GetCORSystemDirectory(ptr long ptr) @ stdcall GetCORVersion(ptr long ptr) @ stub GetCompileInfo -@ stub GetFileVersion +@ stdcall GetFileVersion(wstr ptr long ptr) @ stub GetHashFromAssemblyFile @ stub GetHashFromAssemblyFileW @ stub GetHashFromBlob @@ -56,9 +57,9 @@ @ stub GetPermissionRequests @ stub GetPrivateContextsPerfCounters @ stub GetProcessExecutableHeap -@ stub GetRealProcAddress +@ stdcall GetRealProcAddress(str ptr) @ stdcall GetRequestedRuntimeInfo(wstr wstr wstr long long ptr long ptr ptr long ptr) -@ stub GetRequestedRuntimeVersion +@ stdcall GetRequestedRuntimeVersion(wstr ptr long ptr) @ stub GetRequestedRuntimeVersionForCLSID @ stub GetStartupFlags @ stub GetTargetForVTableEntry diff --git a/reactos/dll/win32/mscoree/mscoree_main.c b/reactos/dll/win32/mscoree/mscoree_main.c index 0e6f25204cc..8b72ec83c08 100644 --- a/reactos/dll/win32/mscoree/mscoree_main.c +++ b/reactos/dll/win32/mscoree/mscoree_main.c @@ -21,55 +21,65 @@ #include +#define COBJMACROS #include "wine/unicode.h" +#include "wine/library.h" #include "windef.h" #include "winbase.h" #include "winuser.h" #include "winnls.h" #include "winreg.h" #include "ole2.h" +#include "ocidl.h" #include "shellapi.h" #include "initguid.h" +#include "msxml2.h" +#include "corerror.h" #include "cor.h" #include "mscoree.h" +#include "corhdr.h" +#include "cordebug.h" +#include "metahost.h" +#include "fusion.h" +#include "wine/list.h" #include "mscoree_private.h" +#include "rpcproxy.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL( mscoree ); -static BOOL get_mono_path(LPWSTR path) -{ - 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}; +static HINSTANCE MSCOREE_hInstance; + +char *WtoA(LPCWSTR wstr) +{ + int length; + char *result; + + length = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL); + + result = HeapAlloc(GetProcessHeap(), 0, length); + + if (result) + WideCharToMultiByte(CP_UTF8, 0, wstr, -1, result, length, NULL, NULL); + + return result; +} + +static BOOL get_install_root(LPWSTR install_dir) +{ + const WCHAR dotnet_key[] = {'S','O','F','T','W','A','R','E','\\','M','i','c','r','o','s','o','f','t','\\','.','N','E','T','F','r','a','m','e','w','o','r','k','\\',0}; + const WCHAR install_root[] = {'I','n','s','t','a','l','l','R','o','o','t',0}; - WCHAR version[64], version_key[MAX_PATH]; DWORD len; HKEY key; - if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, mono_key, 0, KEY_READ, &key)) + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, dotnet_key, 0, KEY_READ, &key)) return FALSE; - len = sizeof(version); - if (RegQueryValueExW(key, defaul_clr, 0, NULL, (LPBYTE)version, &len)) - { - RegCloseKey(key); - return FALSE; - } - RegCloseKey(key); - - lstrcpyW(version_key, mono_key); - lstrcatW(version_key, slash); - lstrcatW(version_key, version); - - if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, version_key, 0, KEY_READ, &key)) - return FALSE; - - len = sizeof(WCHAR) * MAX_PATH; - if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)path, &len)) + len = MAX_PATH; + if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)install_dir, &len)) { RegCloseKey(key); return FALSE; @@ -79,140 +89,38 @@ static BOOL get_mono_path(LPWSTR path) return TRUE; } -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 }; - -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, LPCWSTR pwszHostConfigFile, VOID *pReserved, DWORD startupFlags, REFCLSID rclsid, REFIID riid, LPVOID *ppv) { - FIXME("(%s, %s, %s, %p, %d, %s, %s, %p): semi-stub!\n", debugstr_w(pwszVersion), + HRESULT ret; + ICLRRuntimeInfo *info; + + TRACE("(%s, %s, %s, %p, %d, %s, %s, %p)\n", debugstr_w(pwszVersion), debugstr_w(pwszBuildFlavor), debugstr_w(pwszHostConfigFile), pReserved, startupFlags, debugstr_guid(rclsid), debugstr_guid(riid), ppv); - if (!get_mono_path(NULL)) + *ppv = NULL; + + ret = get_runtime_info(NULL, pwszVersion, pwszHostConfigFile, startupFlags, 0, TRUE, &info); + + if (SUCCEEDED(ret)) { - MESSAGE("wine: Install the Windows version of Mono to run .NET executables\n"); - return E_FAIL; + ret = ICLRRuntimeInfo_GetInterface(info, rclsid, riid, ppv); + + ICLRRuntimeInfo_Release(info); } - return S_OK; + return ret; } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("(%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); + MSCOREE_hInstance = hinstDLL; + switch (fdwReason) { case DLL_WINE_PREATTACH: @@ -221,6 +129,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) DisableThreadLibraryCalls(hinstDLL); break; case DLL_PROCESS_DETACH: + expect_no_runtimes(); break; } return TRUE; @@ -241,75 +150,6 @@ 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) -{ - int exit_code; - int trace_size; - char trace_setting[256]; - int argc; - char **argv; - MonoDomain *domain; - MonoAssembly *assembly; - char filename[MAX_PATH]; - - if (!load_mono()) - { - return -1; - } - - get_utf8_args(&argc, &argv); - - trace_size = GetEnvironmentVariableA("WINE_MONO_TRACE", trace_setting, sizeof(trace_setting)); - - if (trace_size) - { - mono_jit_set_trace_options(trace_setting); - } - - GetModuleFileNameA(NULL, filename, MAX_PATH); - - domain = mono_jit_init(filename); - - assembly = mono_domain_assembly_open(domain, filename); - - exit_code = mono_jit_exec(domain, assembly, argc, argv); - - mono_jit_cleanup(domain); - - HeapFree(GetProcessHeap(), 0, argv); - - return exit_code; -} - __int32 WINAPI _CorExeMain2(PBYTE ptrMemory, DWORD cntMemory, LPWSTR imageName, LPWSTR loaderName, LPWSTR cmdLine) { TRACE("(%p, %u, %s, %s, %s)\n", ptrMemory, cntMemory, debugstr_w(imageName), debugstr_w(loaderName), debugstr_w(cmdLine)); @@ -319,7 +159,8 @@ __int32 WINAPI _CorExeMain2(PBYTE ptrMemory, DWORD cntMemory, LPWSTR imageName, void WINAPI CorExitProcess(int exitCode) { - FIXME("(%x) stub\n", exitCode); + TRACE("(%x)\n", exitCode); + unload_all_runtimes(); ExitProcess(exitCode); } @@ -336,52 +177,150 @@ HRESULT WINAPI _CorValidateImage(PVOID* imageBase, LPCWSTR imageName) HRESULT WINAPI GetCORSystemDirectory(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwLength) { - FIXME("(%p, %d, %p): stub!\n", pbuffer, cchBuffer, dwLength); + ICLRRuntimeInfo *info; + HRESULT ret; - if (!dwLength) + TRACE("(%p, %d, %p)!\n", pbuffer, cchBuffer, dwLength); + + if (!dwLength || !pbuffer) return E_POINTER; - *dwLength = 0; + ret = get_runtime_info(NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); - return S_OK; + if (SUCCEEDED(ret)) + { + *dwLength = cchBuffer; + ret = ICLRRuntimeInfo_GetRuntimeDirectory(info, pbuffer, dwLength); + + ICLRRuntimeInfo_Release(info); + } + + return ret; } HRESULT WINAPI GetCORVersion(LPWSTR pbuffer, DWORD cchBuffer, DWORD *dwLength) { - static const WCHAR version[] = {'v','1','.','1','.','4','3','2','2',0}; + ICLRRuntimeInfo *info; + HRESULT ret; - FIXME("(%p, %d, %p): semi-stub!\n", pbuffer, cchBuffer, dwLength); + TRACE("(%p, %d, %p)!\n", pbuffer, cchBuffer, dwLength); - if (!dwLength) + if (!dwLength || !pbuffer) return E_POINTER; - *dwLength = lstrlenW(version); + ret = get_runtime_info(NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); - if (cchBuffer < *dwLength) - return ERROR_INSUFFICIENT_BUFFER; + if (SUCCEEDED(ret)) + { + *dwLength = cchBuffer; + ret = ICLRRuntimeInfo_GetVersionString(info, pbuffer, dwLength); - if (pbuffer) - lstrcpyW(pbuffer, version); + ICLRRuntimeInfo_Release(info); + } - return S_OK; + return ret; } HRESULT WINAPI GetRequestedRuntimeInfo(LPCWSTR pExe, LPCWSTR pwszVersion, LPCWSTR pConfigurationFile, DWORD startupFlags, DWORD runtimeInfoFlags, LPWSTR pDirectory, DWORD dwDirectory, DWORD *dwDirectoryLength, LPWSTR pVersion, DWORD cchBuffer, DWORD *dwlength) { - FIXME("(%s, %s, %s, 0x%08x, 0x%08x, %p, 0x%08x, %p, %p, 0x%08x, %p) stub\n", debugstr_w(pExe), + HRESULT ret; + ICLRRuntimeInfo *info; + DWORD length_dummy; + + TRACE("(%s, %s, %s, 0x%08x, 0x%08x, %p, 0x%08x, %p, %p, 0x%08x, %p)\n", debugstr_w(pExe), debugstr_w(pwszVersion), debugstr_w(pConfigurationFile), startupFlags, runtimeInfoFlags, pDirectory, dwDirectory, dwDirectoryLength, pVersion, cchBuffer, dwlength); - return GetCORVersion(pVersion, cchBuffer, dwlength); + + if (!dwDirectoryLength) dwDirectoryLength = &length_dummy; + + if (!dwlength) dwlength = &length_dummy; + + ret = get_runtime_info(pExe, pwszVersion, pConfigurationFile, startupFlags, runtimeInfoFlags, TRUE, &info); + + if (SUCCEEDED(ret)) + { + *dwlength = cchBuffer; + ret = ICLRRuntimeInfo_GetVersionString(info, pVersion, dwlength); + + if (SUCCEEDED(ret)) + { + *dwDirectoryLength = dwDirectory; + ret = ICLRRuntimeInfo_GetRuntimeDirectory(info, pDirectory, dwDirectoryLength); + } + + ICLRRuntimeInfo_Release(info); + } + + return ret; +} + +HRESULT WINAPI GetRequestedRuntimeVersion(LPWSTR pExe, LPWSTR pVersion, DWORD cchBuffer, DWORD *dwlength) +{ + TRACE("(%s, %p, %d, %p)\n", debugstr_w(pExe), debugstr_w(pExe), cchBuffer, dwlength); + + if(!dwlength) + return E_POINTER; + + return GetRequestedRuntimeInfo(pExe, NULL, NULL, 0, 0, NULL, 0, NULL, pVersion, cchBuffer, dwlength); +} + +HRESULT WINAPI GetRealProcAddress(LPCSTR procname, void **ppv) +{ + FIXME("(%s, %p)\n", debugstr_a(procname), ppv); + return CLR_E_SHIM_RUNTIMEEXPORT; +} + +HRESULT WINAPI GetFileVersion(LPCWSTR szFilename, LPWSTR szBuffer, DWORD cchBuffer, DWORD *dwLength) +{ + TRACE("(%s, %p, %d, %p)\n", debugstr_w(szFilename), szBuffer, cchBuffer, dwLength); + + if (!szFilename || !dwLength) + return E_POINTER; + + *dwLength = cchBuffer; + return CLRMetaHost_GetVersionFromFile(0, szFilename, szBuffer, dwLength); } HRESULT WINAPI LoadLibraryShim( LPCWSTR szDllName, LPCWSTR szVersion, LPVOID pvReserved, HMODULE * phModDll) { - FIXME("(%p %s, %p, %p, %p): semi-stub\n", szDllName, debugstr_w(szDllName), szVersion, pvReserved, phModDll); + HRESULT ret=S_OK; + WCHAR dll_filename[MAX_PATH]; + WCHAR version[MAX_PATH]; + static const WCHAR default_version[] = {'v','1','.','1','.','4','3','2','2',0}; + static const WCHAR slash[] = {'\\',0}; + DWORD dummy; - if (phModDll) *phModDll = LoadLibraryW(szDllName); - return S_OK; + TRACE("(%p %s, %p, %p, %p)\n", szDllName, debugstr_w(szDllName), szVersion, pvReserved, phModDll); + + if (!szDllName || !phModDll) + return E_POINTER; + + if (!get_install_root(dll_filename)) + { + ERR("error reading registry key for installroot\n"); + dll_filename[0] = 0; + } + else + { + if (!szVersion) + { + ret = GetCORVersion(version, MAX_PATH, &dummy); + if (SUCCEEDED(ret)) + szVersion = version; + else + szVersion = default_version; + } + strcatW(dll_filename, szVersion); + strcatW(dll_filename, slash); + } + + strcatW(dll_filename, szDllName); + + *phModDll = LoadLibraryW(dll_filename); + + return *phModDll ? S_OK : E_HANDLE; } HRESULT WINAPI LockClrVersion(FLockClrVersionCallback hostCallback, FLockClrVersionCallback *pBeginHostSetup, FLockClrVersionCallback *pEndHostSetup) @@ -433,16 +372,24 @@ HRESULT WINAPI LoadStringRC(UINT resId, LPWSTR pBuffer, int iBufLen, int bQuiet) HRESULT WINAPI CorBindToRuntimeEx(LPWSTR szVersion, LPWSTR szBuildFlavor, DWORD nflags, REFCLSID rslsid, REFIID riid, LPVOID *ppv) { - FIXME("%s %s %d %s %s %p\n", debugstr_w(szVersion), debugstr_w(szBuildFlavor), nflags, debugstr_guid( rslsid ), + HRESULT ret; + ICLRRuntimeInfo *info; + + TRACE("%s %s %d %s %s %p\n", debugstr_w(szVersion), debugstr_w(szBuildFlavor), nflags, debugstr_guid( rslsid ), debugstr_guid( riid ), ppv); - if(IsEqualGUID( riid, &IID_ICorRuntimeHost )) - { - *ppv = create_corruntimehost(); - return S_OK; - } *ppv = NULL; - return E_NOTIMPL; + + ret = get_runtime_info(NULL, szVersion, NULL, nflags, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); + + if (SUCCEEDED(ret)) + { + ret = ICLRRuntimeInfo_GetInterface(info, rslsid, riid, ppv); + + ICLRRuntimeInfo_Release(info); + } + + return ret; } HRESULT WINAPI CorBindToCurrentRuntime(LPCWSTR filename, REFCLSID rclsid, REFIID riid, LPVOID *ppv) @@ -453,8 +400,37 @@ HRESULT WINAPI CorBindToCurrentRuntime(LPCWSTR filename, REFCLSID rclsid, REFIID STDAPI ClrCreateManagedInstance(LPCWSTR pTypeName, REFIID riid, void **ppObject) { - FIXME("(%s,%s,%p)\n", debugstr_w(pTypeName), debugstr_guid(riid), ppObject); - return E_NOTIMPL; + HRESULT ret; + ICLRRuntimeInfo *info; + RuntimeHost *host; + MonoObject *obj; + IUnknown *unk; + + TRACE("(%s,%s,%p)\n", debugstr_w(pTypeName), debugstr_guid(riid), ppObject); + + /* FIXME: How to determine which runtime version to use? */ + ret = get_runtime_info(NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, TRUE, &info); + + if (SUCCEEDED(ret)) + { + ret = ICLRRuntimeInfo_GetRuntimeHost(info, &host); + + ICLRRuntimeInfo_Release(info); + } + + if (SUCCEEDED(ret)) + ret = RuntimeHost_CreateManagedInstance(host, pTypeName, NULL, &obj); + + if (SUCCEEDED(ret)) + ret = RuntimeHost_GetIUnknownForObject(host, obj, &unk); + + if (SUCCEEDED(ret)) + { + ret = IUnknown_QueryInterface(unk, riid, ppObject); + IUnknown_Release(unk); + } + + return ret; } BOOL WINAPI StrongNameSignatureVerification(LPCWSTR filename, DWORD inFlags, DWORD* pOutFlags) @@ -469,6 +445,63 @@ BOOL WINAPI StrongNameSignatureVerificationEx(LPCWSTR filename, BOOL forceVerifi return FALSE; } +HRESULT WINAPI CreateConfigStream(LPCWSTR filename, IStream **stream) +{ + FIXME("(%s, %p): stub\n", debugstr_w(filename), stream); + return E_NOTIMPL; +} + +HRESULT WINAPI CreateDebuggingInterfaceFromVersion(int nDebugVersion, LPCWSTR version, IUnknown **ppv) +{ + const WCHAR v2_0[] = {'v','2','.','0','.','5','0','7','2','7',0}; + HRESULT hr = E_FAIL; + ICLRRuntimeInfo *runtimeinfo; + + if(nDebugVersion < 1 || nDebugVersion > 4) + return E_INVALIDARG; + + TRACE("(%d %s, %p): stub\n", nDebugVersion, debugstr_w(version), ppv); + + if(!ppv) + return E_INVALIDARG; + + *ppv = NULL; + + if(strcmpW(version, v2_0) != 0) + { + FIXME("Currently .NET Version '%s' not support.\n", debugstr_w(version)); + return E_INVALIDARG; + } + + if(nDebugVersion != 3) + return E_INVALIDARG; + + hr = CLRMetaHost_GetRuntime(0, version, &IID_ICLRRuntimeInfo, (void**)&runtimeinfo); + if(hr == S_OK) + { + hr = ICLRRuntimeInfo_GetInterface(runtimeinfo, &CLSID_CLRDebuggingLegacy, &IID_ICorDebug, (void**)ppv); + + ICLRRuntimeInfo_Release(runtimeinfo); + } + + if(!*ppv) + return E_FAIL; + + return hr; +} + +HRESULT WINAPI CLRCreateInstance(REFCLSID clsid, REFIID riid, LPVOID *ppInterface) +{ + TRACE("(%s,%s,%p)\n", debugstr_guid(clsid), debugstr_guid(riid), ppInterface); + + if (IsEqualGUID(clsid, &CLSID_CLRMetaHost)) + return CLRMetaHost_CreateInstance(riid, ppInterface); + + FIXME("not implemented for class %s\n", debugstr_guid(clsid)); + + return CLASS_E_CLASSNOTAVAILABLE; +} + HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { FIXME("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); @@ -480,19 +513,17 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) HRESULT WINAPI DllRegisterServer(void) { - FIXME("\n"); - return S_OK; + return __wine_register_resources( MSCOREE_hInstance ); } HRESULT WINAPI DllUnregisterServer(void) { - FIXME("\n"); - return S_OK; + return __wine_unregister_resources( MSCOREE_hInstance ); } HRESULT WINAPI DllCanUnloadNow(VOID) { - return S_OK; + return S_FALSE; } INT WINAPI ND_RU1( const void *ptr, INT offset ) diff --git a/reactos/dll/win32/mscoree/mscoree_private.h b/reactos/dll/win32/mscoree/mscoree_private.h index f14da1d15cd..a45a4052e9d 100644 --- a/reactos/dll/win32/mscoree/mscoree_private.h +++ b/reactos/dll/win32/mscoree/mscoree_private.h @@ -20,20 +20,170 @@ #ifndef __MSCOREE_PRIVATE__ #define __MSCOREE_PRIVATE__ -extern IUnknown* create_corruntimehost(void); +extern char *WtoA(LPCWSTR wstr) DECLSPEC_HIDDEN; -/* Mono 2.6 embedding */ +extern HRESULT CLRMetaHost_CreateInstance(REFIID riid, void **ppobj) DECLSPEC_HIDDEN; + +extern HRESULT WINAPI CLRMetaHost_GetVersionFromFile(ICLRMetaHost* iface, + LPCWSTR pwzFilePath, LPWSTR pwzBuffer, DWORD *pcchBuffer) DECLSPEC_HIDDEN; + +typedef struct tagASSEMBLY ASSEMBLY; + +HRESULT assembly_create(ASSEMBLY **out, LPCWSTR file) DECLSPEC_HIDDEN; +HRESULT assembly_release(ASSEMBLY *assembly) DECLSPEC_HIDDEN; +HRESULT assembly_get_runtime_version(ASSEMBLY *assembly, LPSTR *version) DECLSPEC_HIDDEN; + +/* Mono embedding */ typedef struct _MonoDomain MonoDomain; typedef struct _MonoAssembly MonoAssembly; +typedef struct _MonoAssemblyName MonoAssemblyName; +typedef struct _MonoType MonoType; +typedef struct _MonoImage MonoImage; +typedef struct _MonoClass MonoClass; +typedef struct _MonoObject MonoObject; +typedef struct _MonoString MonoString; +typedef struct _MonoMethod MonoMethod; +typedef struct _MonoProfiler MonoProfiler; -extern HMODULE mono_handle; +typedef struct loaded_mono loaded_mono; +typedef struct RuntimeHost RuntimeHost; -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); +typedef struct CLRRuntimeInfo +{ + ICLRRuntimeInfo ICLRRuntimeInfo_iface; + LPCWSTR mono_libdir; + DWORD major; + DWORD minor; + DWORD build; + int mono_abi_version; + WCHAR mono_path[MAX_PATH]; + WCHAR mscorlib_path[MAX_PATH]; + struct RuntimeHost *loaded_runtime; +} CLRRuntimeInfo; + +struct RuntimeHost +{ + ICorRuntimeHost ICorRuntimeHost_iface; + ICLRRuntimeHost ICLRRuntimeHost_iface; + const CLRRuntimeInfo *version; + loaded_mono *mono; + struct list domains; + MonoDomain *default_domain; + CRITICAL_SECTION lock; + LONG ref; +}; + +typedef struct CorProcess +{ + struct list entry; + ICorDebugProcess *pProcess; +} CorProcess; + +typedef struct CorDebug +{ + ICorDebug ICorDebug_iface; + ICorDebugProcessEnum ICorDebugProcessEnum_iface; + LONG ref; + + ICLRRuntimeHost *runtimehost; + + /* ICorDebug Callback */ + ICorDebugManagedCallback *pCallback; + ICorDebugManagedCallback2 *pCallback2; + + /* Debug Processes */ + struct list processes; +} CorDebug; + +extern HRESULT get_runtime_info(LPCWSTR exefile, LPCWSTR version, LPCWSTR config_file, + DWORD startup_flags, DWORD runtimeinfo_flags, BOOL legacy, ICLRRuntimeInfo **result) DECLSPEC_HIDDEN; + +extern HRESULT ICLRRuntimeInfo_GetRuntimeHost(ICLRRuntimeInfo *iface, RuntimeHost **result) DECLSPEC_HIDDEN; + +extern HRESULT MetaDataDispenser_CreateInstance(IUnknown **ppUnk) DECLSPEC_HIDDEN; + +typedef struct parsed_config_file +{ + struct list supported_runtimes; +} parsed_config_file; + +typedef struct supported_runtime +{ + struct list entry; + LPWSTR version; +} supported_runtime; + +extern HRESULT parse_config_file(LPCWSTR filename, parsed_config_file *result) DECLSPEC_HIDDEN; + +extern void free_parsed_config_file(parsed_config_file *file) DECLSPEC_HIDDEN; + +typedef enum { + MONO_IMAGE_OK, + MONO_IMAGE_ERROR_ERRNO, + MONO_IMAGE_MISSING_ASSEMBLYREF, + MONO_IMAGE_IMAGE_INVALID +} MonoImageOpenStatus; + +typedef MonoAssembly* (*MonoAssemblyPreLoadFunc)(MonoAssemblyName *aname, char **assemblies_path, void *user_data); + +typedef void (*MonoProfileFunc)(MonoProfiler *prof); + +struct loaded_mono +{ + HMODULE mono_handle; + HMODULE glib_handle; + + BOOL is_started; + BOOL is_shutdown; + + MonoImage* (CDECL *mono_assembly_get_image)(MonoAssembly *assembly); + MonoAssembly* (CDECL *mono_assembly_open)(const char *filename, MonoImageOpenStatus *status); + MonoClass* (CDECL *mono_class_from_mono_type)(MonoType *type); + MonoClass* (CDECL *mono_class_from_name)(MonoImage *image, const char* name_space, const char *name); + MonoMethod* (CDECL *mono_class_get_method_from_name)(MonoClass *klass, const char *name, int param_count); + void (CDECL *mono_config_parse)(const char *filename); + MonoAssembly* (CDECL *mono_domain_assembly_open) (MonoDomain *domain, const char *name); + void (CDECL *mono_free)(void *); + void (CDECL *mono_install_assembly_preload_hook)(MonoAssemblyPreLoadFunc func, void *user_data); + int (CDECL *mono_jit_exec)(MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]); + MonoDomain* (CDECL *mono_jit_init)(const char *file); + int (CDECL *mono_jit_set_trace_options)(const char* options); + MonoDomain* (CDECL *mono_object_get_domain)(MonoObject *obj); + MonoObject* (CDECL *mono_object_new)(MonoDomain *domain, MonoClass *klass); + void* (CDECL *mono_object_unbox)(MonoObject *obj); + void (CDECL *mono_profiler_install)(MonoProfiler *prof, MonoProfileFunc shutdown_callback); + MonoType* (CDECL *mono_reflection_type_from_name)(char *name, MonoImage *image); + MonoObject* (CDECL *mono_runtime_invoke)(MonoMethod *method, void *obj, void **params, MonoObject **exc); + void (CDECL *mono_runtime_object_init)(MonoObject *this_obj); + void (CDECL *mono_runtime_quit)(void); + void (CDECL *mono_runtime_set_shutting_down)(void); + void (CDECL *mono_set_dirs)(const char *assembly_dir, const char *config_dir); + char* (CDECL *mono_stringify_assembly_name)(MonoAssemblyName *aname); + void (CDECL *mono_thread_pool_cleanup)(void); + void (CDECL *mono_thread_suspend_all_other_threads)(void); + void (CDECL *mono_threads_set_shutting_down)(void); + MonoString* (CDECL *mono_string_new)(MonoDomain *domain, const char *str); +}; + +/* loaded runtime interfaces */ +extern void unload_all_runtimes(void) DECLSPEC_HIDDEN; + +extern void expect_no_runtimes(void) DECLSPEC_HIDDEN; + +extern HRESULT RuntimeHost_Construct(const CLRRuntimeInfo *runtime_version, + loaded_mono *loaded_mono, RuntimeHost** result) DECLSPEC_HIDDEN; + +extern HRESULT RuntimeHost_GetInterface(RuntimeHost *This, REFCLSID clsid, REFIID riid, void **ppv) DECLSPEC_HIDDEN; + +extern HRESULT RuntimeHost_GetIUnknownForObject(RuntimeHost *This, MonoObject *obj, IUnknown **ppUnk) DECLSPEC_HIDDEN; + +extern HRESULT RuntimeHost_CreateManagedInstance(RuntimeHost *This, LPCWSTR name, + MonoDomain *domain, MonoObject **result) DECLSPEC_HIDDEN; + +extern HRESULT RuntimeHost_Destroy(RuntimeHost *This) DECLSPEC_HIDDEN; + +HRESULT WINAPI CLRMetaHost_GetRuntime(ICLRMetaHost* iface, LPCWSTR pwzVersion, REFIID iid, LPVOID *ppRuntime) DECLSPEC_HIDDEN; + +extern HRESULT CorDebug_Create(ICLRRuntimeHost *runtimehost, IUnknown** ppUnk) DECLSPEC_HIDDEN; #endif /* __MSCOREE_PRIVATE__ */ diff --git a/reactos/lib/sdk/uuid/CMakeLists.txt b/reactos/lib/sdk/uuid/CMakeLists.txt index 87bc8244e91..8b2dd887b09 100644 --- a/reactos/lib/sdk/uuid/CMakeLists.txt +++ b/reactos/lib/sdk/uuid/CMakeLists.txt @@ -176,7 +176,10 @@ list(APPEND IDL_SOURCES if(MSVC) list(APPEND IDL_SOURCES - atliface.idl) + atliface.idl + cor.idl + cordebug.idl + metahost.idl) else() list(APPEND IDL_SOURCES wbemcli.idl diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index aa98d95ed3c..bc832c3547f 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -95,7 +95,7 @@ reactos/dll/win32/msacm32 # Autosync reactos/dll/win32/msadp32.acm # Synced to Wine-1.3.37 reactos/dll/win32/mscat32 # Autosync reactos/dll/win32/mscms # Synced to Wine-1.3.37 -reactos/dll/win32/mscoree # Autosync +reactos/dll/win32/mscoree # Synced to Wine-1.3.37 reactos/dll/win32/msctf # Synced to Wine-1.3.37 reactos/dll/win32/msftedit # Synced to Wine-1.3.37 reactos/dll/win32/msg711.acm # Synced to Wine-1.3.37 From e1632d9cd810663524dee6b737dd8b75e37d57b2 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 17:34:42 +0000 Subject: [PATCH 144/289] [MSCOREE_WINETEST] * Add mscoree winetest from Wine 1.3.37. svn path=/trunk/; revision=55277 --- rostests/winetests/CMakeLists.txt | 1 + rostests/winetests/directory.rbuild | 3 + rostests/winetests/mscoree/CMakeLists.txt | 15 + rostests/winetests/mscoree/debugging.c | 507 ++++++++++++++++++++++ rostests/winetests/mscoree/metahost.c | 155 +++++++ rostests/winetests/mscoree/mscoree.c | 356 +++++++++++++++ rostests/winetests/mscoree/mscoree.rbuild | 13 + rostests/winetests/mscoree/testlist.c | 17 + 8 files changed, 1067 insertions(+) create mode 100644 rostests/winetests/mscoree/CMakeLists.txt create mode 100644 rostests/winetests/mscoree/debugging.c create mode 100644 rostests/winetests/mscoree/metahost.c create mode 100644 rostests/winetests/mscoree/mscoree.c create mode 100644 rostests/winetests/mscoree/mscoree.rbuild create mode 100644 rostests/winetests/mscoree/testlist.c diff --git a/rostests/winetests/CMakeLists.txt b/rostests/winetests/CMakeLists.txt index 4866549724f..7468a5ee6dc 100644 --- a/rostests/winetests/CMakeLists.txt +++ b/rostests/winetests/CMakeLists.txt @@ -43,6 +43,7 @@ add_subdirectory(mapi32) add_subdirectory(mlang) add_subdirectory(msacm32) add_subdirectory(mscms) +add_subdirectory(mscoree) add_subdirectory(msctf) if(NOT MSVC) # FIXME: msvc build. diff --git a/rostests/winetests/directory.rbuild b/rostests/winetests/directory.rbuild index 76eab73420d..c4152b4bd5d 100644 --- a/rostests/winetests/directory.rbuild +++ b/rostests/winetests/directory.rbuild @@ -112,6 +112,9 @@ + + + diff --git a/rostests/winetests/mscoree/CMakeLists.txt b/rostests/winetests/mscoree/CMakeLists.txt new file mode 100644 index 00000000000..9e5dd183cbe --- /dev/null +++ b/rostests/winetests/mscoree/CMakeLists.txt @@ -0,0 +1,15 @@ + +add_definitions( + -D__ROS_LONG64__ + -D_DLL -D__USE_CRTIMP) + +add_executable(mscoree_winetest + debugging.c + metahost.c + mscoree.c + testlist.c) + +target_link_libraries(mscoree_winetest wine uuid) +set_module_type(mscoree_winetest win32cui) +add_importlibs(mscoree_winetest ole32 shlwapi msvcrt kernel32 ntdll) +add_cd_file(TARGET mscoree_winetest DESTINATION reactos/bin FOR all) diff --git a/rostests/winetests/mscoree/debugging.c b/rostests/winetests/mscoree/debugging.c new file mode 100644 index 00000000000..bd961edc5d4 --- /dev/null +++ b/rostests/winetests/mscoree/debugging.c @@ -0,0 +1,507 @@ +/* + * Copyright 2011 Alistair Leslie-Hughes + * + * 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 + +#include "windows.h" +#include "ole2.h" +#include "corerror.h" +#include "mscoree.h" +#include "corhdr.h" + +#include "wine/test.h" + +#include "initguid.h" +#include "cordebug.h" + +static HMODULE hmscoree; + +static HRESULT (WINAPI *pCreateDebuggingInterfaceFromVersion)(int, LPCWSTR, IUnknown **); + +const WCHAR v2_0[] = {'v','2','.','0','.','5','0','7','2','7',0}; + +static const char *debugstr_guid(REFIID riid) +{ + static char buf[50]; + + if(!riid) + return "(null)"; + + sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], + riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], + riid->Data4[5], riid->Data4[6], riid->Data4[7]); + + return buf; +} + +static HRESULT WINAPI ManagedCallback2_QueryInterface(ICorDebugManagedCallback2 *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ICorDebugManagedCallback2, riid)) + { + *ppv = iface; + return S_OK; + } + + ok(0, "unexpected riid (%s)\n", debugstr_guid(riid)); + + *ppv = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI ManagedCallback2_AddRef(ICorDebugManagedCallback2 *iface) +{ + return 2; +} + +static ULONG WINAPI ManagedCallback2_Release(ICorDebugManagedCallback2 *iface) +{ + return 1; +} + +static HRESULT WINAPI ManagedCallback2_FunctionRemapOpportunity(ICorDebugManagedCallback2 *iface, + ICorDebugAppDomain *pAppDomain, ICorDebugThread *pThread, + ICorDebugFunction *pOldFunction, ICorDebugFunction *pNewFunction, + ULONG32 oldILOffset) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback2_CreateConnection(ICorDebugManagedCallback2 *iface, + ICorDebugProcess *pProcess, CONNID dwConnectionId, WCHAR *pConnName) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback2_ChangeConnection(ICorDebugManagedCallback2 *iface, + ICorDebugProcess *pProcess, CONNID dwConnectionId) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback2_DestroyConnection(ICorDebugManagedCallback2 *iface, + ICorDebugProcess *pProcess, CONNID dwConnectionId) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback2_Exception(ICorDebugManagedCallback2 *iface, + ICorDebugAppDomain *pAppDomain, ICorDebugThread *pThread, + ICorDebugFrame *pFrame, ULONG32 nOffset, + CorDebugExceptionCallbackType dwEventType, DWORD dwFlags) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback2_ExceptionUnwind(ICorDebugManagedCallback2 *iface, + ICorDebugAppDomain *pAppDomain, ICorDebugThread *pThread, + CorDebugExceptionUnwindCallbackType dwEventType, DWORD dwFlags) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback2_FunctionRemapComplete(ICorDebugManagedCallback2 *iface, + ICorDebugAppDomain *pAppDomain, ICorDebugThread *pThread, + ICorDebugFunction *pFunction) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback2_MDANotification(ICorDebugManagedCallback2 *iface, + ICorDebugController *pController, ICorDebugThread *pThread, + ICorDebugMDA *pMDA) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static struct ICorDebugManagedCallback2Vtbl managedCallback2Vtbl = { + ManagedCallback2_QueryInterface, + ManagedCallback2_AddRef, + ManagedCallback2_Release, + ManagedCallback2_FunctionRemapOpportunity, + ManagedCallback2_CreateConnection, + ManagedCallback2_ChangeConnection, + ManagedCallback2_DestroyConnection, + ManagedCallback2_Exception, + ManagedCallback2_ExceptionUnwind, + ManagedCallback2_FunctionRemapComplete, + ManagedCallback2_MDANotification +}; + +static ICorDebugManagedCallback2 ManagedCallback2 = { &managedCallback2Vtbl }; + +static HRESULT WINAPI ManagedCallback_QueryInterface(ICorDebugManagedCallback *iface, REFIID riid, void **ppv) +{ + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ICorDebugManagedCallback, riid)) + { + *ppv = iface; + return S_OK; + } + else if(IsEqualGUID(&IID_ICorDebugManagedCallback2, riid)) + { + *ppv = (void**)&ManagedCallback2; + return S_OK; + } + + ok(0, "unexpected riid (%s)\n", debugstr_guid(riid)); + *ppv = NULL; + return E_NOINTERFACE; +} + +static ULONG WINAPI ManagedCallback_AddRef(ICorDebugManagedCallback *iface) +{ + return 2; +} + +static ULONG WINAPI ManagedCallback_Release(ICorDebugManagedCallback *iface) +{ + return 1; +} + +static HRESULT WINAPI ManagedCallback_Breakpoint(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *pThread, ICorDebugBreakpoint *pBreakpoint) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_StepComplete(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *pThread, ICorDebugStepper *pStepper, CorDebugStepReason reason) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_Break(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *thread) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_Exception(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *pThread, BOOL unhandled) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_EvalComplete(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *pThread, ICorDebugEval *pEval) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_EvalException(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *pThread, ICorDebugEval *pEval) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_CreateProcess(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_ExitProcess(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_CreateThread(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *thread) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_ExitThread(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *thread) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_LoadModule(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugModule *pModule) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_UnloadModule(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugModule *pModule) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_LoadClass(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugClass *c) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_UnloadClass(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugClass *c) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_DebuggerError(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess, + HRESULT errorHR, DWORD errorCode) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_LogMessage(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *pThread, LONG lLevel, WCHAR *pLogSwitchName, WCHAR *pMessage) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_LogSwitch(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *pThread, LONG lLevel, ULONG ulReason, + WCHAR *pLogSwitchName, WCHAR *pParentName) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_CreateAppDomain(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess, + ICorDebugAppDomain *pAppDomain) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_ExitAppDomain(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess, + ICorDebugAppDomain *pAppDomain) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_LoadAssembly(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugAssembly *pAssembly) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_UnloadAssembly(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugAssembly *pAssembly) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_ControlCTrap(ICorDebugManagedCallback *iface, ICorDebugProcess *pProcess) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_NameChange(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *pThread) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_UpdateModuleSymbols(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugModule *pModule, IStream *pSymbolStream) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_EditAndContinueRemap(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *pThread, ICorDebugFunction *pFunction, BOOL fAccurate) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ManagedCallback_BreakpointSetError(ICorDebugManagedCallback *iface, ICorDebugAppDomain *pAppDomain, + ICorDebugThread *pThread, ICorDebugBreakpoint *pBreakpoint, DWORD dwError) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static ICorDebugManagedCallbackVtbl managedCallbackVtbl = { + ManagedCallback_QueryInterface, + ManagedCallback_AddRef, + ManagedCallback_Release, + ManagedCallback_Breakpoint, + ManagedCallback_StepComplete, + ManagedCallback_Break, + ManagedCallback_Exception, + ManagedCallback_EvalComplete, + ManagedCallback_EvalException, + ManagedCallback_CreateProcess, + ManagedCallback_ExitProcess, + ManagedCallback_CreateThread, + ManagedCallback_ExitThread, + ManagedCallback_LoadModule, + ManagedCallback_UnloadModule, + ManagedCallback_LoadClass, + ManagedCallback_UnloadClass, + ManagedCallback_DebuggerError, + ManagedCallback_LogMessage, + ManagedCallback_LogSwitch, + ManagedCallback_CreateAppDomain, + ManagedCallback_ExitAppDomain, + ManagedCallback_LoadAssembly, + ManagedCallback_UnloadAssembly, + ManagedCallback_ControlCTrap, + ManagedCallback_NameChange, + ManagedCallback_UpdateModuleSymbols, + ManagedCallback_EditAndContinueRemap, + ManagedCallback_BreakpointSetError +}; + +static ICorDebugManagedCallback ManagedCallback = { &managedCallbackVtbl }; + +static BOOL init_functionpointers(void) +{ + hmscoree = LoadLibraryA("mscoree.dll"); + + if (!hmscoree) + { + win_skip("mscoree.dll not available\n"); + return FALSE; + } + + pCreateDebuggingInterfaceFromVersion = (void *)GetProcAddress(hmscoree, "CreateDebuggingInterfaceFromVersion"); + + if (!pCreateDebuggingInterfaceFromVersion) + { + win_skip("functions not available\n"); + FreeLibrary(hmscoree); + return FALSE; + } + + return TRUE; +} + +#define check_process_enum(core, e) _check_process_enum(__LINE__, core, e) +static void _check_process_enum(unsigned line, ICorDebug *pCorDebug, ULONG nExpected) +{ + HRESULT hr; + ICorDebugProcessEnum *pProcessEnum = NULL; + + hr = ICorDebug_EnumerateProcesses(pCorDebug, NULL); + ok_(__FILE__,line) (hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr); + + hr = ICorDebug_EnumerateProcesses(pCorDebug, &pProcessEnum); + ok_(__FILE__,line) (hr == S_OK, "expected S_OK got %08x\n", hr); + if(hr == S_OK) + { + ULONG cnt; + + hr = ICorDebugProcessEnum_GetCount(pProcessEnum, &cnt); + ok_(__FILE__,line) (hr == S_OK, "expected S_OK got %08x\n", hr); + ok_(__FILE__,line) (cnt == nExpected, "expected %d got %d\n", nExpected, cnt); + + ICorDebugProcessEnum_Release(pProcessEnum); + } +} + +static void test_createDebugger(void) +{ + HRESULT hr; + IUnknown *pUnk; + ICorDebug *pCorDebug; + + hr = pCreateDebuggingInterfaceFromVersion(0, v2_0, &pUnk); + ok(hr == E_INVALIDARG, "CreateDebuggingInterfaceFromVersion returned %08x\n", hr); + + hr = pCreateDebuggingInterfaceFromVersion(1, v2_0, &pUnk); + ok(hr == E_INVALIDARG, "CreateDebuggingInterfaceFromVersion returned %08x\n", hr); + + hr = pCreateDebuggingInterfaceFromVersion(2, v2_0, &pUnk); + ok(hr == E_INVALIDARG, "CreateDebuggingInterfaceFromVersion returned %08x\n", hr); + + hr = pCreateDebuggingInterfaceFromVersion(4, v2_0, &pUnk); + ok(hr == E_INVALIDARG, "CreateDebuggingInterfaceFromVersion returned %08x\n", hr); + + hr = pCreateDebuggingInterfaceFromVersion(3, v2_0, NULL); + ok(hr == E_INVALIDARG, "CreateDebuggingInterfaceFromVersion returned %08x\n", hr); + + hr = pCreateDebuggingInterfaceFromVersion(3, v2_0, &pUnk); + if(hr == S_OK) + { + hr = IUnknown_QueryInterface(pUnk, &IID_ICorDebug, (void**)&pCorDebug); + ok(hr == S_OK, "expected S_OK got %08x\n", hr); + if(hr == S_OK) + { + hr = ICorDebug_Initialize(pCorDebug); + ok(hr == S_OK, "expected S_OK got %08x\n", hr); + if(hr == S_OK) + { + hr = ICorDebug_SetManagedHandler(pCorDebug, NULL); + ok(hr == E_INVALIDARG, "expected E_INVALIDARG got %08x\n", hr); + + hr = ICorDebug_SetManagedHandler(pCorDebug, &ManagedCallback); + ok(hr == S_OK, "expected S_OK got %08x\n", hr); + + /* We should have no processes */ + check_process_enum(pCorDebug, 0); + } + + ICorDebug_Release(pCorDebug); + } + IUnknown_Release(pUnk); + } + else + { + skip(".NET 2.0 or mono not installed.\n"); + } +} + +START_TEST(debugging) +{ + CoInitialize(NULL); + + if (!init_functionpointers()) + return; + + test_createDebugger(); + + FreeLibrary(hmscoree); + CoUninitialize(); +} diff --git a/rostests/winetests/mscoree/metahost.c b/rostests/winetests/mscoree/metahost.c new file mode 100644 index 00000000000..a9872f0f388 --- /dev/null +++ b/rostests/winetests/mscoree/metahost.c @@ -0,0 +1,155 @@ +/* + * Copyright 2010 Vincent Povirk + * + * 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 + +#include "windef.h" +#include "ole2.h" + +#include "corerror.h" +#include "ocidl.h" +#include "initguid.h" +#include "metahost.h" +#include "wine/test.h" + +static HMODULE hmscoree; + +static HRESULT (WINAPI *pCLRCreateInstance)(REFCLSID clsid, REFIID riid, LPVOID *ppInterface); + +static ICLRMetaHost *metahost; + +static BOOL init_pointers(void) +{ + HRESULT hr = E_FAIL; + + hmscoree = LoadLibraryA("mscoree.dll"); + + if (hmscoree) + pCLRCreateInstance = (void *)GetProcAddress(hmscoree, "CLRCreateInstance"); + + if (pCLRCreateInstance) + hr = pCLRCreateInstance(&CLSID_CLRMetaHost, &IID_ICLRMetaHost, (void**)&metahost); + + if (FAILED(hr)) + { + win_skip(".NET 4 is not installed\n"); + FreeLibrary(hmscoree); + return FALSE; + } + + return TRUE; +} + +static void cleanup(void) +{ + ICLRMetaHost_Release(metahost); + + FreeLibrary(hmscoree); +} + +static void test_enumruntimes(void) +{ + IEnumUnknown *runtime_enum; + IUnknown *unk; + DWORD count; + ICLRRuntimeInfo *runtime_info; + HRESULT hr; + WCHAR buf[MAX_PATH]; + + hr = ICLRMetaHost_EnumerateInstalledRuntimes(metahost, &runtime_enum); + ok(hr == S_OK, "EnumerateInstalledRuntimes returned %x\n", hr); + if (FAILED(hr)) return; + + while ((hr = IEnumUnknown_Next(runtime_enum, 1, &unk, &count)) == S_OK) + { + hr = IUnknown_QueryInterface(unk, &IID_ICLRRuntimeInfo, (void**)&runtime_info); + ok(hr == S_OK, "QueryInterface returned %x\n", hr); + + count = 1; + hr = ICLRRuntimeInfo_GetVersionString(runtime_info, buf, &count); + ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "GetVersionString returned %x\n", hr); + ok(count > 1, "GetVersionString returned count %u\n", count); + + count = 0xdeadbeef; + hr = ICLRRuntimeInfo_GetVersionString(runtime_info, NULL, &count); + ok(hr == S_OK, "GetVersionString returned %x\n", hr); + ok(count > 1 && count != 0xdeadbeef, "GetVersionString returned count %u\n", count); + + count = MAX_PATH; + hr = ICLRRuntimeInfo_GetVersionString(runtime_info, buf, &count); + ok(hr == S_OK, "GetVersionString returned %x\n", hr); + ok(count > 1, "GetVersionString returned count %u\n", count); + + trace("runtime found: %s\n", wine_dbgstr_w(buf)); + + ICLRRuntimeInfo_Release(runtime_info); + + IUnknown_Release(unk); + } + + ok(hr == S_FALSE, "IEnumUnknown_Next returned %x\n", hr); + + IEnumUnknown_Release(runtime_enum); +} + +static void test_getruntime(void) +{ + static const WCHAR twodotzero[] = {'v','2','.','0','.','5','0','7','2','7',0}; + static const WCHAR twodotzerodotzero[] = {'v','2','.','0','.','0',0}; + HRESULT hr; + ICLRRuntimeInfo *info; + DWORD count; + WCHAR buf[MAX_PATH]; + + hr = ICLRMetaHost_GetRuntime(metahost, NULL, &IID_ICLRRuntimeInfo, (void**)&info); + ok(hr == E_POINTER, "GetVersion failed, hr=%x\n", hr); + + hr = ICLRMetaHost_GetRuntime(metahost, twodotzero, &IID_ICLRRuntimeInfo, (void**)&info); + if (hr == CLR_E_SHIM_RUNTIME) + /* FIXME: Get Mono properly packaged so we can fail here. */ + todo_wine ok(hr == S_OK, "GetVersion failed, hr=%x\n", hr); + else + ok(hr == S_OK, "GetVersion failed, hr=%x\n", hr); + if (hr != S_OK) return; + + count = MAX_PATH; + hr = ICLRRuntimeInfo_GetVersionString(info, buf, &count); + ok(hr == S_OK, "GetVersionString returned %x\n", hr); + ok(count == lstrlenW(buf)+1, "GetVersionString returned count %u but string of length %u\n", count, lstrlenW(buf)+1); + ok(lstrcmpW(buf, twodotzero) == 0, "got unexpected version %s\n", wine_dbgstr_w(buf)); + + ICLRRuntimeInfo_Release(info); + + /* Versions must match exactly. */ + hr = ICLRMetaHost_GetRuntime(metahost, twodotzerodotzero, &IID_ICLRRuntimeInfo, (void**)&info); + ok(hr == CLR_E_SHIM_RUNTIME, "GetVersion failed, hr=%x\n", hr); +} + +START_TEST(metahost) +{ + if (!init_pointers()) + return; + + test_enumruntimes(); + + test_getruntime(); + + cleanup(); +} diff --git a/rostests/winetests/mscoree/mscoree.c b/rostests/winetests/mscoree/mscoree.c new file mode 100644 index 00000000000..56351c371d4 --- /dev/null +++ b/rostests/winetests/mscoree/mscoree.c @@ -0,0 +1,356 @@ +/* + * Copyright 2010 Louis Lenders + * Copyright 2011 André Hentschel + * + * 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 "corerror.h" +#include "mscoree.h" +#include "shlwapi.h" +#include "wine/test.h" + +static HMODULE hmscoree; + +static HRESULT (WINAPI *pGetCORVersion)(LPWSTR, DWORD, DWORD*); +static HRESULT (WINAPI *pGetCORSystemDirectory)(LPWSTR, DWORD, DWORD*); +static HRESULT (WINAPI *pGetRequestedRuntimeInfo)(LPCWSTR, LPCWSTR, LPCWSTR, DWORD, DWORD, LPWSTR, DWORD, DWORD*, LPWSTR, DWORD, DWORD*); +static HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR, LPCWSTR, LPVOID, HMODULE*); +static HRESULT (WINAPI *pCreateConfigStream)(LPCWSTR, IStream**); + +static BOOL init_functionpointers(void) +{ + hmscoree = LoadLibraryA("mscoree.dll"); + + if (!hmscoree) + { + win_skip("mscoree.dll not available\n"); + return FALSE; + } + + pGetCORVersion = (void *)GetProcAddress(hmscoree, "GetCORVersion"); + pGetCORSystemDirectory = (void *)GetProcAddress(hmscoree, "GetCORSystemDirectory"); + pGetRequestedRuntimeInfo = (void *)GetProcAddress(hmscoree, "GetRequestedRuntimeInfo"); + pLoadLibraryShim = (void *)GetProcAddress(hmscoree, "LoadLibraryShim"); + pCreateConfigStream = (void *)GetProcAddress(hmscoree, "CreateConfigStream"); + + if (!pGetCORVersion || !pGetCORSystemDirectory || !pGetRequestedRuntimeInfo || !pLoadLibraryShim) + { + win_skip("functions not available\n"); + FreeLibrary(hmscoree); + return FALSE; + } + + return TRUE; +} + +static void test_versioninfo(void) +{ + const WCHAR v2_0[] = {'v','2','.','0','.','5','0','7','2','7',0}; + const WCHAR v1_1[] = {'v','1','.','1','.','4','3','2','2',0}; + + WCHAR version[MAX_PATH]; + WCHAR path[MAX_PATH]; + DWORD size, path_len; + HRESULT hr; + + if (0) /* crashes on <= w2k3 */ + { + hr = pGetCORVersion(NULL, MAX_PATH, &size); + ok(hr == E_POINTER,"GetCORVersion returned %08x\n", hr); + } + + hr = pGetCORVersion(version, 1, &size); + if (hr == CLR_E_SHIM_RUNTIME) + { + /* FIXME: Get Mono packaged properly so we can fail here. */ + todo_wine ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),"GetCORVersion returned %08x\n", hr); + skip("No .NET runtimes are installed\n"); + return; + } + + ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER),"GetCORVersion returned %08x\n", hr); + + hr = pGetCORVersion(version, MAX_PATH, &size); + ok(hr == S_OK,"GetCORVersion returned %08x\n", hr); + + trace("latest installed .net runtime: %s\n", wine_dbgstr_w(version)); + + hr = pGetCORSystemDirectory(path, MAX_PATH , &size); + ok(hr == S_OK, "GetCORSystemDirectory returned %08x\n", hr); + /* size includes terminating null-character */ + ok(size == (lstrlenW(path) + 1),"size is %d instead of %d\n", size, (lstrlenW(path) + 1)); + + path_len = size; + + hr = pGetCORSystemDirectory(path, path_len-1 , &size); + ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "GetCORSystemDirectory returned %08x\n", hr); + + if (0) /* crashes on <= w2k3 */ + { + hr = pGetCORSystemDirectory(NULL, MAX_PATH , &size); + ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "GetCORSystemDirectory returned %08x\n", hr); + } + + hr = pGetCORSystemDirectory(path, MAX_PATH , NULL); + ok(hr == E_POINTER,"GetCORSystemDirectory returned %08x\n", hr); + + trace("latest installed .net installed in directory: %s\n", wine_dbgstr_w(path)); + + /* test GetRequestedRuntimeInfo, first get info about different versions of runtime */ + hr = pGetRequestedRuntimeInfo( NULL, v2_0, NULL, 0, 0, path, MAX_PATH, &path_len, version, MAX_PATH, &size); + + if(hr == CLR_E_SHIM_RUNTIME) return; /* skipping rest of tests on win2k as .net 2.0 not installed */ + + ok(hr == S_OK, "GetRequestedRuntimeInfo returned %08x\n", hr); + trace(" installed in directory %s is .net version %s\n", wine_dbgstr_w(path), wine_dbgstr_w(version)); + + hr = pGetRequestedRuntimeInfo( NULL, v1_1, NULL, 0, 0, path, MAX_PATH, &path_len, version, MAX_PATH, &size); + ok(hr == S_OK || hr == CLR_E_SHIM_RUNTIME /*v1_1 not installed*/, "GetRequestedRuntimeInfo returned %08x\n", hr); + if(hr == S_OK) + trace(" installed in directory %s is .net version %s\n", wine_dbgstr_w(path), wine_dbgstr_w(version)); + /* version number NULL not allowed without RUNTIME_INFO_UPGRADE_VERSION flag */ + hr = pGetRequestedRuntimeInfo( NULL, NULL, NULL, 0, 0, path, MAX_PATH, &path_len, version, MAX_PATH, &size); + ok(hr == CLR_E_SHIM_RUNTIME, "GetRequestedRuntimeInfo returned %08x\n", hr); + /* with RUNTIME_INFO_UPGRADE_VERSION flag and version number NULL, latest installed version is returned */ + hr = pGetRequestedRuntimeInfo( NULL, NULL, NULL, 0, RUNTIME_INFO_UPGRADE_VERSION, path, MAX_PATH, &path_len, version, MAX_PATH, &size); + ok(hr == S_OK, "GetRequestedRuntimeInfo returned %08x\n", hr); + + hr = pGetRequestedRuntimeInfo( NULL, v2_0, NULL, 0, 0, path, 1, &path_len, version, MAX_PATH, &size); + ok(hr == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER), "GetRequestedRuntimeInfo returned %08x\n", hr); + + /* if one of the buffers is NULL, the other one is still happily filled */ + memset(version, 0, sizeof(version)); + hr = pGetRequestedRuntimeInfo( NULL, v2_0, NULL, 0, 0, NULL, MAX_PATH, &path_len, version, MAX_PATH, &size); + ok(hr == S_OK, "GetRequestedRuntimeInfo returned %08x\n", hr); + ok(!winetest_strcmpW(version, v2_0), "version is %s , expected %s\n", wine_dbgstr_w(version), wine_dbgstr_w(v2_0)); + /* With NULL-pointer for bufferlength, the buffer itself still gets filled with correct string */ + memset(version, 0, sizeof(version)); + hr = pGetRequestedRuntimeInfo( NULL, v2_0, NULL, 0, 0, path, MAX_PATH, &path_len, version, MAX_PATH, NULL); + ok(hr == S_OK, "GetRequestedRuntimeInfo returned %08x\n", hr); + ok(!winetest_strcmpW(version, v2_0), "version is %s , expected %s\n", wine_dbgstr_w(version), wine_dbgstr_w(v2_0)); +} + +static void test_loadlibraryshim(void) +{ + const WCHAR v4_0[] = {'v','4','.','0','.','3','0','3','1','9',0}; + const WCHAR v2_0[] = {'v','2','.','0','.','5','0','7','2','7',0}; + const WCHAR v1_1[] = {'v','1','.','1','.','4','3','2','2',0}; + const WCHAR vbogus[] = {'v','b','o','g','u','s',0}; + const WCHAR fusion[] = {'f','u','s','i','o','n',0}; + const WCHAR fusiondll[] = {'f','u','s','i','o','n','.','d','l','l',0}; + const WCHAR nosuchdll[] = {'j','n','v','n','l','.','d','l','l',0}; + const WCHAR gdidll[] = {'g','d','i','3','2','.','d','l','l',0}; + HRESULT hr; + const WCHAR *latest = NULL; + CHAR latestA[MAX_PATH]; + HMODULE hdll; + CHAR dllpath[MAX_PATH]; + + hr = pLoadLibraryShim(fusion, v1_1, NULL, &hdll); + ok(hr == S_OK || hr == E_HANDLE, "LoadLibraryShim failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + { + latest = v1_1; + + GetModuleFileNameA(hdll, dllpath, MAX_PATH); + + todo_wine ok(StrStrIA(dllpath, "v1.1.4322") != 0, "incorrect fusion.dll path %s\n", dllpath); + ok(StrStrIA(dllpath, "fusion.dll") != 0, "incorrect fusion.dll path %s\n", dllpath); + + FreeLibrary(hdll); + } + + hr = pLoadLibraryShim(fusion, v2_0, NULL, &hdll); + ok(hr == S_OK || hr == E_HANDLE, "LoadLibraryShim failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + { + latest = v2_0; + + GetModuleFileNameA(hdll, dllpath, MAX_PATH); + + todo_wine ok(StrStrIA(dllpath, "v2.0.50727") != 0, "incorrect fusion.dll path %s\n", dllpath); + ok(StrStrIA(dllpath, "fusion.dll") != 0, "incorrect fusion.dll path %s\n", dllpath); + + FreeLibrary(hdll); + } + + hr = pLoadLibraryShim(fusion, v4_0, NULL, &hdll); + ok(hr == S_OK || hr == E_HANDLE, "LoadLibraryShim failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + { + /* LoadLibraryShim with a NULL version prefers 2.0 and earlier */ + if (!latest) + latest = v4_0; + + GetModuleFileNameA(hdll, dllpath, MAX_PATH); + + todo_wine ok(StrStrIA(dllpath, "v4.0.30319") != 0, "incorrect fusion.dll path %s\n", dllpath); + ok(StrStrIA(dllpath, "fusion.dll") != 0, "incorrect fusion.dll path %s\n", dllpath); + + FreeLibrary(hdll); + } + + hr = pLoadLibraryShim(fusion, vbogus, NULL, &hdll); + todo_wine ok(hr == E_HANDLE, "LoadLibraryShim failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + FreeLibrary(hdll); + + WideCharToMultiByte(CP_ACP, 0, latest, -1, latestA, MAX_PATH, NULL, NULL); + + hr = pLoadLibraryShim(fusion, NULL, NULL, &hdll); + ok(hr == S_OK, "LoadLibraryShim failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + { + GetModuleFileNameA(hdll, dllpath, MAX_PATH); + + if (latest) + todo_wine ok(StrStrIA(dllpath, latestA) != 0, "incorrect fusion.dll path %s\n", dllpath); + ok(StrStrIA(dllpath, "fusion.dll") != 0, "incorrect fusion.dll path %s\n", dllpath); + + FreeLibrary(hdll); + } + + hr = pLoadLibraryShim(fusiondll, NULL, NULL, &hdll); + ok(hr == S_OK, "LoadLibraryShim failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + { + GetModuleFileNameA(hdll, dllpath, MAX_PATH); + + if (latest) + todo_wine ok(StrStrIA(dllpath, latestA) != 0, "incorrect fusion.dll path %s\n", dllpath); + ok(StrStrIA(dllpath, "fusion.dll") != 0, "incorrect fusion.dll path %s\n", dllpath); + + FreeLibrary(hdll); + } + + hr = pLoadLibraryShim(nosuchdll, latest, NULL, &hdll); + ok(hr == E_HANDLE, "LoadLibraryShim failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + FreeLibrary(hdll); + + hr = pLoadLibraryShim(gdidll, latest, NULL, &hdll); + todo_wine ok(hr == E_HANDLE, "LoadLibraryShim failed, hr=%x\n", hr); + if (SUCCEEDED(hr)) + FreeLibrary(hdll); +} + +static const char xmldata[] = + "\n" + "\n" + "\n" + " Test\n" + " 1234\n" + ""; + +static void create_xml_file(LPCWSTR filename) +{ + DWORD dwNumberOfBytesWritten; + HANDLE hfile = CreateFileW(filename, GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + ok(hfile != INVALID_HANDLE_VALUE, "File creation failed\n"); + WriteFile(hfile, xmldata, sizeof(xmldata) - 1, &dwNumberOfBytesWritten, NULL); + CloseHandle(hfile); +} + +static void test_createconfigstream(void) +{ + IStream *stream = NULL; + WCHAR file[] = {'c', 'o', 'n', 'f', '.', 'x', 'm', 'l', 0}; + WCHAR nonexistent[] = {'n', 'o', 'n', 'e', 'x', 'i', 's', 't', '.', 'x', 'm', 'l', 0}; + WCHAR path[MAX_PATH]; + HRESULT hr; + char buffer[256] = {0}; + + if (!pCreateConfigStream) + { + win_skip("CreateConfigStream not available\n"); + return; + } + + create_xml_file(file); + GetFullPathNameW(file, MAX_PATH, path, NULL); + + hr = pCreateConfigStream(NULL, &stream); + todo_wine ok(hr == E_FAIL || + broken(hr == HRESULT_FROM_WIN32(ERROR_PROC_NOT_FOUND)) || /* some WinXP, Win2K3 and Win7 */ + broken(hr == S_OK && !stream), /* some Win2K3 */ + "CreateConfigStream returned %x\n", hr); + + hr = pCreateConfigStream(path, NULL); + todo_wine ok(hr == COR_E_NULLREFERENCE, "CreateConfigStream returned %x\n", hr); + + hr = pCreateConfigStream(NULL, NULL); + todo_wine ok(hr == COR_E_NULLREFERENCE, "CreateConfigStream returned %x\n", hr); + + hr = pCreateConfigStream(nonexistent, &stream); + todo_wine ok(hr == COR_E_FILENOTFOUND, "CreateConfigStream returned %x\n", hr); + ok(stream == NULL, "Expected stream to be NULL\n"); + + hr = pCreateConfigStream(path, &stream); + todo_wine ok(hr == S_OK, "CreateConfigStream failed, hr=%x\n", hr); + todo_wine ok(stream != NULL, "Expected non-NULL stream\n"); + + if (stream) + { + DWORD count; + LARGE_INTEGER pos; + ULARGE_INTEGER size; + IStream *stream2 = NULL; + + hr = IStream_Read(stream, buffer, strlen(xmldata), &count); + ok(hr == S_OK, "IStream_Read failed, hr=%x\n", hr); + ok(count == strlen(xmldata), "wrong count: %u\n", count); + ok(!strcmp(buffer, xmldata), "Strings do not match\n"); + + hr = IStream_Write(stream, xmldata, strlen(xmldata), &count); + ok(hr == E_FAIL, "IStream_Write returned hr=%x\n", hr); + + pos.QuadPart = strlen(xmldata); + hr = IStream_Seek(stream, pos, STREAM_SEEK_SET, NULL); + ok(hr == E_NOTIMPL, "IStream_Seek returned hr=%x\n", hr); + + size.QuadPart = strlen(xmldata); + hr = IStream_SetSize(stream, size); + ok(hr == E_NOTIMPL, "IStream_SetSize returned hr=%x\n", hr); + + hr = IStream_Clone(stream, &stream2); + ok(hr == E_NOTIMPL, "IStream_Clone returned hr=%x\n", hr); + + hr = IStream_Commit(stream, STGC_DEFAULT); + ok(hr == E_NOTIMPL, "IStream_Commit returned hr=%x\n", hr); + + hr = IStream_Revert(stream); + ok(hr == E_NOTIMPL, "IStream_Revert returned hr=%x\n", hr); + + hr = IStream_Release(stream); + ok(hr == S_OK, "IStream_Release returned hr=%x\n", hr); + } + DeleteFileW(file); +} + +START_TEST(mscoree) +{ + if (!init_functionpointers()) + return; + + test_versioninfo(); + test_loadlibraryshim(); + test_createconfigstream(); + + FreeLibrary(hmscoree); +} diff --git a/rostests/winetests/mscoree/mscoree.rbuild b/rostests/winetests/mscoree/mscoree.rbuild new file mode 100644 index 00000000000..d8d939d1692 --- /dev/null +++ b/rostests/winetests/mscoree/mscoree.rbuild @@ -0,0 +1,13 @@ + + . + + debugging.c + metahost.c + mscoree.c + testlist.c + wine + uuid + ole32 + shlwapi + ntdll + diff --git a/rostests/winetests/mscoree/testlist.c b/rostests/winetests/mscoree/testlist.c new file mode 100644 index 00000000000..6c7c5401224 --- /dev/null +++ b/rostests/winetests/mscoree/testlist.c @@ -0,0 +1,17 @@ +#define WIN32_LEAN_AND_MEAN +#include + +#define STANDALONE +#include "wine/test.h" + +extern void func_debugging(void); +extern void func_metahost(void); +extern void func_mscoree(void); + +const struct test winetest_testlist[] = +{ + { "debugging", func_debugging }, + { "metahost", func_metahost }, + { "mscoree", func_mscoree }, + { 0, 0 } +}; From 9b2103620b2b4ae3bd6e1683ddeab14d75b703eb Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 28 Jan 2012 20:15:41 +0000 Subject: [PATCH 145/289] [EVENTLOG] - Log files which are opened when the eventlog service is started are permanent files and will only be closed when the service is stopped. Other log files are closed when their handle is closed. - Opening a non existing backup log file must fail. - Opening an existing backup log files opens the file for reading only. svn path=/trunk/; revision=55279 --- reactos/base/services/eventlog/eventlog.c | 2 +- reactos/base/services/eventlog/eventlog.h | 9 +++++++-- reactos/base/services/eventlog/file.c | 20 +++++++++++++++----- reactos/base/services/eventlog/rpc.c | 8 ++++---- 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/reactos/base/services/eventlog/eventlog.c b/reactos/base/services/eventlog/eventlog.c index 0f3927a63e8..288dcf65286 100644 --- a/reactos/base/services/eventlog/eventlog.c +++ b/reactos/base/services/eventlog/eventlog.c @@ -327,7 +327,7 @@ PLOGFILE LoadLogFile(HKEY hKey, WCHAR * LogName) DPRINT("%S -> %S\n", Buf, Expanded); - Status = LogfCreate(&pLogf, LogName, &FileName); + Status = LogfCreate(&pLogf, LogName, &FileName, TRUE, FALSE); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to create %S! (Status %08lx)\n", Expanded, Status); diff --git a/reactos/base/services/eventlog/eventlog.h b/reactos/base/services/eventlog/eventlog.h index 9966b0aa5a9..613998f933b 100644 --- a/reactos/base/services/eventlog/eventlog.h +++ b/reactos/base/services/eventlog/eventlog.h @@ -92,6 +92,7 @@ typedef struct _LOGFILE PEVENT_OFFSET_INFO OffsetInfo; ULONG OffsetInfoSize; ULONG OffsetInfoNext; + BOOL Permanent; LIST_ENTRY ListEntry; } LOGFILE, *PLOGFILE; @@ -157,9 +158,13 @@ LogfBackupFile(PLOGFILE LogFile, NTSTATUS LogfCreate(PLOGFILE *Logfile, WCHAR * LogName, - PUNICODE_STRING FileName); + PUNICODE_STRING FileName, + BOOL Permanent, + BOOL Backup); -VOID LogfClose(PLOGFILE LogFile); +VOID +LogfClose(PLOGFILE LogFile, + BOOL ForceClose); VOID LogfCloseAll(VOID); diff --git a/reactos/base/services/eventlog/file.c b/reactos/base/services/eventlog/file.c index f4933b92fd1..30d935e05de 100644 --- a/reactos/base/services/eventlog/file.c +++ b/reactos/base/services/eventlog/file.c @@ -292,7 +292,9 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) NTSTATUS LogfCreate(PLOGFILE *LogFile, WCHAR * LogName, - PUNICODE_STRING FileName) + PUNICODE_STRING FileName, + BOOL Permanent, + BOOL Backup) { OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK IoStatusBlock; @@ -314,13 +316,13 @@ LogfCreate(PLOGFILE *LogFile, NULL); Status = NtCreateFile(&pLogFile->hFile, - GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, + Backup ? (GENERIC_READ | SYNCHRONIZE) : (GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE), &ObjectAttributes, &IoStatusBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, - FILE_OPEN_IF, + Backup ? FILE_OPEN : FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0); @@ -371,6 +373,8 @@ LogfCreate(PLOGFILE *LogFile, pLogFile->OffsetInfoSize = 64; + pLogFile->Permanent = Permanent; + if (bCreateNew) bResult = LogfInitializeNew(pLogFile); else @@ -411,11 +415,17 @@ LogfCreate(PLOGFILE *LogFile, return Status; } -VOID LogfClose(PLOGFILE LogFile) +VOID +LogfClose(PLOGFILE LogFile, + BOOL ForceClose) { if (LogFile == NULL) return; + if ((ForceClose == FALSE) && + (LogFile->Permanent == TRUE)) + return; + RtlAcquireResourceExclusive(&LogFile->Lock, TRUE); FlushFileBuffers(LogFile->hFile); @@ -436,7 +446,7 @@ VOID LogfCloseAll(VOID) { while (!IsListEmpty(&LogFileListHead)) { - LogfClose(LogfListHead()); + LogfClose(LogfListHead(), TRUE); } DeleteCriticalSection(&LogFileListCs); diff --git a/reactos/base/services/eventlog/rpc.c b/reactos/base/services/eventlog/rpc.c index 4185463f61e..73088d95e20 100644 --- a/reactos/base/services/eventlog/rpc.c +++ b/reactos/base/services/eventlog/rpc.c @@ -158,7 +158,9 @@ ElfCreateBackupLogHandle(PLOGHANDLE *LogHandle, /* Create the log file */ Status = LogfCreate(&lpLogHandle->LogFile, NULL, - FileName); + FileName, + FALSE, + TRUE); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to create the log file! (Status 0x%08lx)\n", Status); @@ -210,9 +212,7 @@ ElfDeleteEventLogHandle(IELF_HANDLE EventLogHandle) if (!ElfGetLogHandleEntryByHandle(lpLogHandle)) return STATUS_INVALID_HANDLE; - /* Close the log file if it is a backup file */ - if (lpLogHandle->Flags & LOG_HANDLE_BACKUP_FILE) - LogfClose(lpLogHandle->LogFile); + LogfClose(lpLogHandle->LogFile, FALSE); RemoveEntryList(&lpLogHandle->LogHandleListEntry); HeapFree(GetProcessHeap(),0,lpLogHandle); From eaad3df7dc781984315ad477f7f2908ac9a1a975 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 21:04:16 +0000 Subject: [PATCH 146/289] * Add mscoree winetest to the rbuild build too. svn path=/trunk/; revision=55280 --- reactos/boot/bootdata/packages/reactos.dff | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index a9aba361659..912a1c72b74 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -821,6 +821,7 @@ modules\rostests\winetests\mapi32\mapi32_winetest.exe 7 o modules\rostests\winetests\mlang\mlang_winetest.exe 7 optional modules\rostests\winetests\msacm32\msacm32_winetest.exe 7 optional modules\rostests\winetests\mscms\mscms_winetest.exe 7 optional +modules\rostests\winetests\mscoree\mscoree_winetest.exe 7 optional modules\rostests\winetests\msctf\msctf_winetest.exe 7 optional modules\rostests\winetests\mshtml\mshtml_winetest.exe 7 optional modules\rostests\winetests\msi\msi_winetest.exe 7 optional From 2b498df22fd67078c76d29381c8e05daeb330864 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 21:08:43 +0000 Subject: [PATCH 147/289] [STDOLE2.TLB] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55281 --- reactos/dll/win32/stdole2.tlb/CMakeLists.txt | 1 + reactos/dll/win32/stdole2.tlb/rsrc.rc | 2 + reactos/dll/win32/stdole2.tlb/stdole2.tlb.rgs | 38 +++++++++++++++++++ reactos/dll/win32/stdole32.tlb/std_ole_v1.idl | 1 + reactos/media/doc/README.WINE | 4 +- 5 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 reactos/dll/win32/stdole2.tlb/stdole2.tlb.rgs diff --git a/reactos/dll/win32/stdole2.tlb/CMakeLists.txt b/reactos/dll/win32/stdole2.tlb/CMakeLists.txt index a1c27d553d2..2abd2ebe981 100644 --- a/reactos/dll/win32/stdole2.tlb/CMakeLists.txt +++ b/reactos/dll/win32/stdole2.tlb/CMakeLists.txt @@ -4,6 +4,7 @@ include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) add_typelib(std_ole_v2.idl) +set_rc_compiler() spec2def(stdole2.tlb stdole2.tlb.spec) list(APPEND SOURCE diff --git a/reactos/dll/win32/stdole2.tlb/rsrc.rc b/reactos/dll/win32/stdole2.tlb/rsrc.rc index d50667f2378..dc5d264abcd 100644 --- a/reactos/dll/win32/stdole2.tlb/rsrc.rc +++ b/reactos/dll/win32/stdole2.tlb/rsrc.rc @@ -29,3 +29,5 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* @makedep: std_ole_v2.tlb */ 1 TYPELIB std_ole_v2.tlb + +2 WINE_REGISTRY stdole2.tlb.rgs diff --git a/reactos/dll/win32/stdole2.tlb/stdole2.tlb.rgs b/reactos/dll/win32/stdole2.tlb/stdole2.tlb.rgs new file mode 100644 index 00000000000..ce2225b9fd2 --- /dev/null +++ b/reactos/dll/win32/stdole2.tlb/stdole2.tlb.rgs @@ -0,0 +1,38 @@ +HKCR +{ + NoRemove Typelib + { + NoRemove '{00020430-0000-0000-C000-000000000046}' + { + '2.0' = s 'OLE Automation' + { + '0' { win32 = s '%MODULE%' } + FLAGS = s '0' + } + } + } + NoRemove Interface + { + '{BEF6E003-A874-101A-8BBA-00AA00300CAB}' = s 'Font' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{00020430-0000-0000-C000-000000000046}' { val Version = s '2.0' } + } + '{7BF80981-BF32-101A-8BBB-00AA00300CAB}' = s 'Picture' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{00020430-0000-0000-C000-000000000046}' { val Version = s '2.0' } + } + '{4EF6100A-AF88-11D0-9846-00C04FC29993}' = s 'FontEvents' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{00020430-0000-0000-C000-000000000046}' { val Version = s '2.0' } + } + } + NoRemove CLSID + { + } +} diff --git a/reactos/dll/win32/stdole32.tlb/std_ole_v1.idl b/reactos/dll/win32/stdole32.tlb/std_ole_v1.idl index bf9cb7e2011..45fb3d50aed 100644 --- a/reactos/dll/win32/stdole32.tlb/std_ole_v1.idl +++ b/reactos/dll/win32/stdole32.tlb/std_ole_v1.idl @@ -20,6 +20,7 @@ [ uuid(00020430-0000-0000-C000-000000000046), + restricted, version(1.0), helpstring("OLE Automation") ] diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index bc832c3547f..b5969c06357 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -117,7 +117,7 @@ reactos/dll/win32/msvidc32 # Autosync reactos/dll/win32/msxml3 # Autosync reactos/dll/win32/nddeapi # Synced to Wine-1.3.37 reactos/dll/win32/netapi32 # Autosync -reactos/dll/win32/ntdsapi # Autosync +reactos/dll/win32/ntdsapi # Synced to Wine-1.3.37 reactos/dll/win32/ntprint # Synced to Wine-1.3.37 reactos/dll/win32/objsel # Synced to Wine-1.3.37 reactos/dll/win32/odbc32 # Out of sync. Depends on port of Linux ODBC. @@ -156,7 +156,7 @@ reactos/dll/win32/shlwapi # Autosync reactos/dll/win32/slbcsp # Autosync reactos/dll/win32/softpub # Autosync reactos/dll/win32/spoolss # Autosync -reactos/dll/win32/stdole2.tlb # Autosync +reactos/dll/win32/stdole2.tlb # Synced to Wine-1.3.37 reactos/dll/win32/sti # Autosync reactos/dll/win32/sxs # Autosync reactos/dll/win32/tapi32 # Autosync From f96ae418aaf53b09857333a69facdffe40b157f6 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 22:07:27 +0000 Subject: [PATCH 148/289] [NTDSAPI] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55282 --- reactos/dll/win32/ntdsapi/ntdsapi.c | 35 ++++++++++++++++++++++++++ reactos/dll/win32/ntdsapi/ntdsapi.spec | 6 ++--- reactos/include/psdk/ntdsapi.h | 21 ++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/ntdsapi/ntdsapi.c b/reactos/dll/win32/ntdsapi/ntdsapi.c index 01acda05e56..1ffbd9d390b 100644 --- a/reactos/dll/win32/ntdsapi/ntdsapi.c +++ b/reactos/dll/win32/ntdsapi/ntdsapi.c @@ -150,3 +150,38 @@ DWORD WINAPI DsMakeSpnA(LPCSTR svc_class, LPCSTR svc_name, return ERROR_CALL_NOT_IMPLEMENTED; } + +/*********************************************************************** + * DsMakeSpnA (NTDSAPI.@) + */ +DWORD WINAPI DsGetSpnA(DS_SPN_NAME_TYPE ServType, LPCSTR Servlass, LPCSTR ServName, + USHORT InstPort, USHORT nInstanceNames, + LPCSTR *pInstanceNames, const USHORT *pInstancePorts, + DWORD *pSpn, LPSTR **pszSpn) +{ + FIXME("(%d,%s,%s,%d,%d,%p,%p,%p,%p): stub!\n", ServType, + debugstr_a(Servlass), debugstr_a(ServName), InstPort, + nInstanceNames, pInstanceNames, pInstancePorts, pSpn, pszSpn); + + return ERROR_CALL_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * DsServerRegisterSpnA (NTDSAPI.@) + */ +DWORD WINAPI DsServerRegisterSpnA(DS_SPN_WRITE_OP operation, LPCSTR ServiceClass, LPCSTR UserObjectDN) +{ + FIXME("(%d,%s,%s): stub!\n", operation, + debugstr_a(ServiceClass), debugstr_a(UserObjectDN)); + return ERROR_CALL_NOT_IMPLEMENTED; +} + +/*********************************************************************** + * DsServerRegisterSpnW (NTDSAPI.@) + */ +DWORD WINAPI DsServerRegisterSpnW(DS_SPN_WRITE_OP operation, LPCWSTR ServiceClass, LPCWSTR UserObjectDN) +{ + FIXME("(%d,%s,%s): stub!\n", operation, + debugstr_w(ServiceClass), debugstr_w(UserObjectDN)); + return ERROR_CALL_NOT_IMPLEMENTED; +} diff --git a/reactos/dll/win32/ntdsapi/ntdsapi.spec b/reactos/dll/win32/ntdsapi/ntdsapi.spec index a9607caf2fd..f4ae6f89932 100644 --- a/reactos/dll/win32/ntdsapi/ntdsapi.spec +++ b/reactos/dll/win32/ntdsapi/ntdsapi.spec @@ -29,7 +29,7 @@ @ stub DsGetDomainControllerInfoA @ stub DsGetDomainControllerInfoW @ stub DsGetRdnW -@ stub DsGetSpnA +@ stdcall DsGetSpnA(long str str long long ptr ptr ptr ptr) @ stub DsGetSpnW @ stub DsInheritSecurityIdentityA @ stub DsInheritSecurityIdentityW @@ -80,8 +80,8 @@ @ stub DsReplicaUpdateRefsW @ stub DsReplicaVerifyObjectsA @ stub DsReplicaVerifyObjectsW -@ stub DsServerRegisterSpnA -@ stub DsServerRegisterSpnW +@ stdcall DsServerRegisterSpnA(long str str) +@ stdcall DsServerRegisterSpnW(long wstr wstr) @ stub DsUnBindA @ stub DsUnBindW @ stub DsUnquoteRdnValueA diff --git a/reactos/include/psdk/ntdsapi.h b/reactos/include/psdk/ntdsapi.h index 23f14938be4..6d2902f3971 100644 --- a/reactos/include/psdk/ntdsapi.h +++ b/reactos/include/psdk/ntdsapi.h @@ -29,6 +29,27 @@ DWORD WINAPI DsMakeSpnA(LPCSTR, LPCSTR, LPCSTR, USHORT, LPCSTR, DWORD*, LPSTR); DWORD WINAPI DsMakeSpnW(LPCWSTR, LPCWSTR, LPCWSTR, USHORT, LPCWSTR, DWORD*, LPWSTR); #define DsMakeSpn WINELIB_NAME_AW(DsMakeSpn) +typedef enum +{ + DS_SPN_DNS_HOST = 0, + DS_SPN_DN_HOST = 1, + DS_SPN_NB_HOST = 2, + DS_SPN_DOMAIN = 3, + DS_SPN_NB_DOMAIN = 4, + DS_SPN_SERVICE = 5 +} DS_SPN_NAME_TYPE; + +typedef enum +{ + DS_SPN_ADD_SPN_OP = 0, + DS_SPN_REPLACE_SPN_OP = 1, + DS_SPN_DELETE_SPN_OP = 2 +} DS_SPN_WRITE_OP; + +DWORD WINAPI DsServerRegisterSpnA(DS_SPN_WRITE_OP operation, LPCSTR ServiceClass, LPCSTR UserObjectDN); +DWORD WINAPI DsServerRegisterSpnW(DS_SPN_WRITE_OP operation, LPCWSTR ServiceClass, LPCWSTR UserObjectDN); +#define DsServerRegisterSpn WINELIB_NAME_AW(DsServerRegisterSpn) + #ifdef __cplusplus } #endif From 34ad19014ea6ed6082f9fa1fb34b0b1f2fc2b11a Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 22:22:11 +0000 Subject: [PATCH 149/289] [STDOLE32.TLB] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55283 --- reactos/dll/win32/stdole32.tlb/CMakeLists.txt | 5 ++--- reactos/dll/win32/stdole32.tlb/rsrc.rc | 2 ++ .../dll/win32/stdole32.tlb/stdole32.tlb.rgs | 20 +++++++++++++++++++ reactos/media/doc/README.WINE | 1 + 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 reactos/dll/win32/stdole32.tlb/stdole32.tlb.rgs diff --git a/reactos/dll/win32/stdole32.tlb/CMakeLists.txt b/reactos/dll/win32/stdole32.tlb/CMakeLists.txt index 85cdaf11e04..25a390d460c 100644 --- a/reactos/dll/win32/stdole32.tlb/CMakeLists.txt +++ b/reactos/dll/win32/stdole32.tlb/CMakeLists.txt @@ -4,17 +4,16 @@ include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) add_typelib(std_ole_v1.idl) +set_rc_compiler() spec2def(stdole32.tlb stdole32.tlb.spec) list(APPEND SOURCE rsrc.rc ${CMAKE_CURRENT_BINARY_DIR}/stdole32.def) - + set_source_files_properties(rsrc.rc PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/std_ole_v1.tlb) add_library(stdole32.tlb SHARED ${SOURCE}) - set_module_type(stdole32.tlb module) set_target_properties(stdole32.tlb PROPERTIES SUFFIX "") - add_cd_file(TARGET stdole32.tlb DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/stdole32.tlb/rsrc.rc b/reactos/dll/win32/stdole32.tlb/rsrc.rc index d75d804b0b7..9926dc7ec47 100644 --- a/reactos/dll/win32/stdole32.tlb/rsrc.rc +++ b/reactos/dll/win32/stdole32.tlb/rsrc.rc @@ -29,3 +29,5 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* @makedep: std_ole_v1.tlb */ 1 TYPELIB std_ole_v1.tlb + +2 WINE_REGISTRY stdole32.tlb.rgs diff --git a/reactos/dll/win32/stdole32.tlb/stdole32.tlb.rgs b/reactos/dll/win32/stdole32.tlb/stdole32.tlb.rgs new file mode 100644 index 00000000000..7725ae17ea4 --- /dev/null +++ b/reactos/dll/win32/stdole32.tlb/stdole32.tlb.rgs @@ -0,0 +1,20 @@ +HKCR +{ + NoRemove Typelib + { + NoRemove '{00020430-0000-0000-C000-000000000046}' + { + '1.0' = s 'OLE Automation' + { + '0' { win32 = s '%MODULE%' } + FLAGS = s '1' + } + } + } + NoRemove Interface + { + } + NoRemove CLSID + { + } +} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index b5969c06357..7b3beac7524 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -157,6 +157,7 @@ reactos/dll/win32/slbcsp # Autosync reactos/dll/win32/softpub # Autosync reactos/dll/win32/spoolss # Autosync reactos/dll/win32/stdole2.tlb # Synced to Wine-1.3.37 +reactos/dll/win32/stdole32.tlb # Synced to Wine-1.3.37 reactos/dll/win32/sti # Autosync reactos/dll/win32/sxs # Autosync reactos/dll/win32/tapi32 # Autosync From 9beddcf6f589d770c6b63448d5f4a4b7f3b4fd88 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 22:42:14 +0000 Subject: [PATCH 150/289] [MSIMTF] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55284 --- reactos/dll/win32/msimtf/activeimmapp.c | 18 ++++--- reactos/dll/win32/msimtf/main.c | 65 +++++-------------------- reactos/dll/win32/msimtf/msimtf.idl | 38 +++++++++++++++ reactos/dll/win32/msimtf/msimtf.inf | 26 ---------- reactos/dll/win32/msimtf/msimtf.rgs | 21 ++++++++ reactos/dll/win32/msimtf/rsrc.rc | 21 +------- reactos/media/doc/README.WINE | 2 +- 7 files changed, 83 insertions(+), 108 deletions(-) create mode 100644 reactos/dll/win32/msimtf/msimtf.idl delete mode 100644 reactos/dll/win32/msimtf/msimtf.inf create mode 100644 reactos/dll/win32/msimtf/msimtf.rgs diff --git a/reactos/dll/win32/msimtf/activeimmapp.c b/reactos/dll/win32/msimtf/activeimmapp.c index d8446267893..835e5ff8f3c 100644 --- a/reactos/dll/win32/msimtf/activeimmapp.c +++ b/reactos/dll/win32/msimtf/activeimmapp.c @@ -31,7 +31,6 @@ #include "winuser.h" #include "winerror.h" #include "objbase.h" -#include "advpub.h" #include "dimm.h" #include "imm.h" @@ -42,10 +41,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(msimtf); typedef struct tagActiveIMMApp { - const IActiveIMMAppVtbl *vtbl; + IActiveIMMApp IActiveIMMApp_iface; LONG refCount; } ActiveIMMApp; +static inline ActiveIMMApp *impl_from_IActiveIMMApp(IActiveIMMApp *iface) +{ + return CONTAINING_RECORD(iface, ActiveIMMApp, IActiveIMMApp_iface); +} + static void ActiveIMMApp_Destructor(ActiveIMMApp* This) { TRACE("\n"); @@ -55,7 +59,7 @@ static void ActiveIMMApp_Destructor(ActiveIMMApp* This) static HRESULT WINAPI ActiveIMMApp_QueryInterface (IActiveIMMApp* iface, REFIID iid, LPVOID *ppvOut) { - ActiveIMMApp *This = (ActiveIMMApp*)iface; + ActiveIMMApp *This = impl_from_IActiveIMMApp(iface); *ppvOut = NULL; if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IActiveIMMApp)) @@ -75,13 +79,13 @@ static HRESULT WINAPI ActiveIMMApp_QueryInterface (IActiveIMMApp* iface, static ULONG WINAPI ActiveIMMApp_AddRef(IActiveIMMApp* iface) { - ActiveIMMApp *This = (ActiveIMMApp*)iface; + ActiveIMMApp *This = impl_from_IActiveIMMApp(iface); return InterlockedIncrement(&This->refCount); } static ULONG WINAPI ActiveIMMApp_Release(IActiveIMMApp* iface) { - ActiveIMMApp *This = (ActiveIMMApp*)iface; + ActiveIMMApp *This = impl_from_IActiveIMMApp(iface); ULONG ret; ret = InterlockedDecrement(&This->refCount); @@ -808,7 +812,7 @@ static const IActiveIMMAppVtbl ActiveIMMAppVtbl = ActiveIMMApp_EnumInputContext }; -HRESULT ActiveIMMApp_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) +DECLSPEC_HIDDEN HRESULT ActiveIMMApp_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) { ActiveIMMApp *This; if (pUnkOuter) @@ -818,7 +822,7 @@ HRESULT ActiveIMMApp_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) if (This == NULL) return E_OUTOFMEMORY; - This->vtbl = &ActiveIMMAppVtbl; + This->IActiveIMMApp_iface.lpVtbl = &ActiveIMMAppVtbl; This->refCount = 1; TRACE("returning %p\n",This); diff --git a/reactos/dll/win32/msimtf/main.c b/reactos/dll/win32/msimtf/main.c index 6b8957ba391..cfd7443a709 100644 --- a/reactos/dll/win32/msimtf/main.c +++ b/reactos/dll/win32/msimtf/main.c @@ -27,9 +27,8 @@ #include "winbase.h" #include "wingdi.h" #include "winuser.h" -#include "winreg.h" -#include "advpub.h" #include "ole2.h" +#include "rpcproxy.h" #include "dimm.h" #include "wine/debug.h" @@ -60,11 +59,16 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) } typedef struct { - const IClassFactoryVtbl *lpClassFactoryVtbl; + IClassFactory IClassFactory_iface; HRESULT (*cf)(IUnknown*,IUnknown**); } ClassFactory; +static inline ClassFactory *impl_from_IClassFactory(IClassFactory *iface) +{ + return CONTAINING_RECORD(iface, ClassFactory, IClassFactory_iface); +} + static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) { @@ -100,7 +104,7 @@ static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppv) { - ClassFactory *This = (ClassFactory*)iface; + ClassFactory *This = impl_from_IClassFactory(iface); HRESULT ret; IUnknown *obj; TRACE("(%p, %p, %s, %p)\n", iface, pOuter, debugstr_guid(riid), ppv); @@ -135,7 +139,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) { if(IsEqualGUID(&CLSID_CActiveIMM, rclsid)) { static ClassFactory cf = { - &ClassFactoryVtbl, + { &ClassFactoryVtbl }, ActiveIMMApp_Constructor, }; @@ -154,59 +158,12 @@ HRESULT WINAPI DllCanUnloadNow(void) return S_FALSE; } -#define INF_SET_CLSID(clsid) \ - do \ - { \ - static CHAR name[] = "CLSID_" #clsid; \ - \ - pse[i].pszName = name; \ - clsids[i++] = &CLSID_ ## clsid; \ - } while (0) - -static HRESULT register_server(BOOL doregister) -{ - HRESULT hres; - HMODULE hAdvpack; - HRESULT (WINAPI *pRegInstall)(HMODULE hm, LPCSTR pszSection, const STRTABLEA* pstTable); - STRTABLEA strtable; - STRENTRYA pse[1]; - static CLSID const *clsids[34]; - unsigned int i = 0; - - static const WCHAR wszAdvpack[] = {'a','d','v','p','a','c','k','.','d','l','l',0}; - - INF_SET_CLSID(CActiveIMM); - - for(i = 0; i < sizeof(pse)/sizeof(pse[0]); i++) { - pse[i].pszValue = HeapAlloc(GetProcessHeap(), 0, 39); - sprintf(pse[i].pszValue, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", - clsids[i]->Data1, clsids[i]->Data2, clsids[i]->Data3, clsids[i]->Data4[0], - clsids[i]->Data4[1], clsids[i]->Data4[2], clsids[i]->Data4[3], clsids[i]->Data4[4], - clsids[i]->Data4[5], clsids[i]->Data4[6], clsids[i]->Data4[7]); - } - - strtable.cEntries = sizeof(pse)/sizeof(pse[0]); - strtable.pse = pse; - - hAdvpack = LoadLibraryW(wszAdvpack); - pRegInstall = (void *)GetProcAddress(hAdvpack, "RegInstall"); - - hres = pRegInstall(msimtf_instance, doregister ? "RegisterDll" : "UnregisterDll", &strtable); - - for(i=0; i < sizeof(pse)/sizeof(pse[0]); i++) - HeapFree(GetProcessHeap(), 0, pse[i].pszValue); - - return hres; -} - -#undef INF_SET_CLSID - /*********************************************************************** * DllRegisterServer (msimtf.@) */ HRESULT WINAPI DllRegisterServer(void) { - return register_server(TRUE); + return __wine_register_resources( msimtf_instance ); } /*********************************************************************** @@ -214,5 +171,5 @@ HRESULT WINAPI DllRegisterServer(void) */ HRESULT WINAPI DllUnregisterServer(void) { - return register_server(FALSE); + return __wine_unregister_resources( msimtf_instance ); } diff --git a/reactos/dll/win32/msimtf/msimtf.idl b/reactos/dll/win32/msimtf/msimtf.idl new file mode 100644 index 00000000000..388222e9222 --- /dev/null +++ b/reactos/dll/win32/msimtf/msimtf.idl @@ -0,0 +1,38 @@ +/* + * COM Classes for msimtf + * + * Copyright 2010 Alexandre Julliard + * + * 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 + */ + +[ + helpstring("CActiveIMMApp"), + threading(apartment), + uuid(4955dd33-b159-11d0-8fcf-00aa006bcc59) +] +coclass CActiveIMM { interface IActiveIMMApp; } + +[ + threading(apartment), + uuid(c1ee01f2-b3b6-4a6a-9ddd-e988c088ec82) +] +coclass CActiveIMMAppEx { interface IActiveIMMApp; } + +[ + threading(apartment), + uuid(50d5107a-d278-4871-8989-f4ceaaf59cfc) +] +coclass CActiveIMMAppEx_Trident { interface IActiveIMMApp; } diff --git a/reactos/dll/win32/msimtf/msimtf.inf b/reactos/dll/win32/msimtf/msimtf.inf deleted file mode 100644 index 2bc57852495..00000000000 --- a/reactos/dll/win32/msimtf/msimtf.inf +++ /dev/null @@ -1,26 +0,0 @@ -[version] -Signature="$CHICAGO$" - - -[RegisterDll] -AddReg=Classes.Reg - - -[UnregisterDll] -DelReg=Classes.Reg - - -[Classes.Reg] -HKCR,"CLSID\%CLSID_CActiveIMM%",,,"CActiveIMMApp" -HKCR,"CLSID\%CLSID_CActiveIMM%\InProcServer32",,,"msimtf.dll" -HKCR,"CLSID\%CLSID_CActiveIMM%\InProcServer32","ThreadingModel",,"Apartment" -HKCR,"CLSID\%CLSID_CActiveIMMAppEx_Trident%",,,"CActiveIMMAppEx_Trident" -HKCR,"CLSID\%CLSID_CActiveIMMAppEx_Trident%\InProcServer32",,,"msimtf.dll" -HKCR,"CLSID\%CLSID_CActiveIMMAppEx_Trident%\InProcServer32","ThreadingModel",,"Apartment" -HKCR,"CLSID\%CLSID_CActiveIMMAppEx%",,,"CActiveIMMAppEx" -HKCR,"CLSID\%CLSID_CActiveIMMAppEx%\InProcServer32",,,"msimtf.dll" -HKCR,"CLSID\%CLSID_CActiveIMMAppEx%\InProcServer32","ThreadingModel",,"Apartment" - -[Strings] -CLSID_CActiveIMMAppEx_Trident={50D5107A-D278-4871-8989-F4CEAAF59CFC} -CLSID_CActiveIMMAppEx="{C1EE01F2-B3B6-4A6A-9DDD-E988C088EC82}" diff --git a/reactos/dll/win32/msimtf/msimtf.rgs b/reactos/dll/win32/msimtf/msimtf.rgs new file mode 100644 index 00000000000..111e5effb96 --- /dev/null +++ b/reactos/dll/win32/msimtf/msimtf.rgs @@ -0,0 +1,21 @@ +HKCR +{ + NoRemove Interface + { + } + NoRemove CLSID + { + '{4955DD33-B159-11D0-8FCF-00AA006BCC59}' = s 'CActiveIMMApp' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + '{C1EE01F2-B3B6-4A6A-9DDD-E988C088EC82}' = s 'CActiveIMMAppEx' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + '{50D5107A-D278-4871-8989-F4CEAAF59CFC}' = s 'CActiveIMMAppEx_Trident' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + } + } +} diff --git a/reactos/dll/win32/msimtf/rsrc.rc b/reactos/dll/win32/msimtf/rsrc.rc index 361feee27cc..ab81c2b7dd1 100644 --- a/reactos/dll/win32/msimtf/rsrc.rc +++ b/reactos/dll/win32/msimtf/rsrc.rc @@ -1,20 +1 @@ -/* - * Copyright 2007 Jacek 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 - * 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 - */ - -/* @makedep: msimtf.inf */ -REGINST REGINST msimtf.inf +1 WINE_REGISTRY msimtf.rgs diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 7b3beac7524..3d6b0df06b9 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -103,7 +103,7 @@ reactos/dll/win32/msgsm32.acm # Autosync reactos/dll/win32/mshtml # Autosync reactos/dll/win32/msimg32 # Autosync reactos/dll/win32/msi # Autosync -reactos/dll/win32/msimtf # Autosync +reactos/dll/win32/msimtf # Synced to Wine-1.3.37 reactos/dll/win32/msisip # Synced to Wine-1.3.37 reactos/dll/win32/msisys.ocx # Autosync reactos/dll/win32/msnet32 # Autosync From 93e3e8cf843b9bdc15a3a1b7327498ab11041d49 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 23:15:03 +0000 Subject: [PATCH 151/289] [ODBCCP32] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55285 --- reactos/dll/win32/odbccp32/odbccp32.c | 30 +++++++++++++++--------- reactos/dll/win32/odbccp32/odbccp32.spec | 4 ++-- reactos/media/doc/README.WINE | 2 +- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/reactos/dll/win32/odbccp32/odbccp32.c b/reactos/dll/win32/odbccp32/odbccp32.c index 0d4662bb724..fb4ea2c7ea1 100644 --- a/reactos/dll/win32/odbccp32/odbccp32.c +++ b/reactos/dll/win32/odbccp32/odbccp32.c @@ -522,9 +522,13 @@ BOOL WINAPI SQLInstallDriverManagerW(LPWSTR lpszPath, WORD cbPathMax, UINT len; WCHAR path[MAX_PATH]; - clear_errors(); TRACE("(%p %d %p)\n", lpszPath, cbPathMax, pcbPathOut); + if (cbPathMax < MAX_PATH) + return FALSE; + + clear_errors(); + len = GetSystemDirectoryW(path, MAX_PATH); if (pcbPathOut) @@ -545,9 +549,13 @@ BOOL WINAPI SQLInstallDriverManager(LPSTR lpszPath, WORD cbPathMax, WORD len, cbOut = 0; WCHAR path[MAX_PATH]; - clear_errors(); TRACE("(%p %d %p)\n", lpszPath, cbPathMax, pcbPathOut); + if (cbPathMax < MAX_PATH) + return FALSE; + + clear_errors(); + ret = SQLInstallDriverManagerW(path, MAX_PATH, &cbOut); if (ret) { @@ -836,26 +844,26 @@ BOOL WINAPI SQLRemoveDriverW(LPCWSTR lpszDriver, BOOL fRemoveDSN, LPDWORD lpdwUsageCount) { clear_errors(); - FIXME("\n"); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + FIXME("stub\n"); + if (lpdwUsageCount) *lpdwUsageCount = 1; + return TRUE; } BOOL WINAPI SQLRemoveDriver(LPCSTR lpszDriver, BOOL fRemoveDSN, LPDWORD lpdwUsageCount) { clear_errors(); - FIXME("\n"); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + FIXME("stub\n"); + if (lpdwUsageCount) *lpdwUsageCount = 1; + return TRUE; } BOOL WINAPI SQLRemoveDriverManager(LPDWORD pdwUsageCount) { clear_errors(); - FIXME("\n"); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + FIXME("stub\n"); + if (pdwUsageCount) *pdwUsageCount = 1; + return TRUE; } BOOL WINAPI SQLRemoveDSNFromIniW(LPCWSTR lpszDSN) diff --git a/reactos/dll/win32/odbccp32/odbccp32.spec b/reactos/dll/win32/odbccp32/odbccp32.spec index e01da6ae661..3d85d758b9d 100644 --- a/reactos/dll/win32/odbccp32/odbccp32.spec +++ b/reactos/dll/win32/odbccp32/odbccp32.spec @@ -1,6 +1,6 @@ @ stdcall ODBCCPlApplet( long long ptr ptr) -@ stdcall SQLConfigDataSource(ptr long wstr wstr) -@ stdcall SQLConfigDataSourceW(ptr long str str) +@ stdcall SQLConfigDataSource(ptr long str str) +@ stdcall SQLConfigDataSourceW(ptr long wstr wstr) @ stdcall SQLConfigDriver(ptr long str str ptr long ptr) @ stdcall SQLConfigDriverW(ptr long wstr wstr ptr long ptr) @ stdcall SQLCreateDataSource(ptr str) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 3d6b0df06b9..c9e5ba9280f 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -121,7 +121,7 @@ reactos/dll/win32/ntdsapi # Synced to Wine-1.3.37 reactos/dll/win32/ntprint # Synced to Wine-1.3.37 reactos/dll/win32/objsel # Synced to Wine-1.3.37 reactos/dll/win32/odbc32 # Out of sync. Depends on port of Linux ODBC. -reactos/dll/win32/odbccp32 # Autosync +reactos/dll/win32/odbccp32 # Synced to Wine-1.3.37 reactos/dll/win32/ole32 # Autosync reactos/dll/win32/oleacc # Autosync reactos/dll/win32/oleaut32 # Autosync From 4252262d8b23cd2bfd63a150ee68d5beb70f6278 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 28 Jan 2012 23:15:16 +0000 Subject: [PATCH 152/289] [ODBCCP32_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55286 --- rostests/winetests/odbccp32/misc.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/rostests/winetests/odbccp32/misc.c b/rostests/winetests/odbccp32/misc.c index 044846cc7d4..40846e5c9ef 100644 --- a/rostests/winetests/odbccp32/misc.c +++ b/rostests/winetests/odbccp32/misc.c @@ -86,28 +86,23 @@ static void test_SQLInstallDriverManager(void) bool_ret = SQLInstallDriverManager(NULL, 0, NULL); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); ok(!bool_ret, "SQLInstallDriverManager unexpectedly succeeded\n"); - todo_wine ok(sql_ret == SQL_SUCCESS_WITH_INFO && error_code == ODBC_ERROR_INVALID_BUFF_LEN, "Expected SQLInstallDriverManager to fail with ODBC_ERROR_INVALID_BUFF_LEN\n"); /* Length smaller than MAX_PATH */ bool_ret = SQLInstallDriverManager(target_path, MAX_PATH / 2, NULL); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); - todo_wine { ok(!bool_ret, "SQLInstallDriverManager unexpectedly succeeded\n"); ok(sql_ret == SQL_SUCCESS_WITH_INFO && error_code == ODBC_ERROR_INVALID_BUFF_LEN, "Expected SQLInstallDriverManager to fail with ODBC_ERROR_INVALID_BUFF_LEN\n"); - } path_out = 0xcafe; bool_ret = SQLInstallDriverManager(target_path, MAX_PATH / 2, &path_out); sql_ret = SQLInstallerErrorW(1, &error_code, NULL, 0, NULL); - todo_wine { ok(!bool_ret, "SQLInstallDriverManager unexpectedly succeeded\n"); ok(sql_ret == SQL_SUCCESS_WITH_INFO && error_code == ODBC_ERROR_INVALID_BUFF_LEN, "Expected SQLInstallDriverManager to fail with ODBC_ERROR_INVALID_BUFF_LEN\n"); ok(path_out == 0xcafe, "Expected path_out to not have changed\n"); - } /* Length OK */ bool_ret = SQLInstallDriverManager(target_path, MAX_PATH, NULL); From 7b6ae5355ec008b58d20f2eb0e2a30503a7802e5 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sun, 29 Jan 2012 03:28:39 +0000 Subject: [PATCH 153/289] - uxtheme is forked. svn path=/trunk/; revision=55287 --- reactos/media/doc/README.WINE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index c9e5ba9280f..fdc19619814 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -167,7 +167,7 @@ reactos/dll/win32/updspapi # Autosync reactos/dll/win32/url # Autosync reactos/dll/win32/urlmon # Autosync reactos/dll/win32/usp10 # Synced to Wine-1.3.37 -reactos/dll/win32/uxtheme # Autosync +reactos/dll/win32/uxtheme # Forked reactos/dll/win32/version # Autosync reactos/dll/win32/wer # Autosync reactos/dll/win32/windowscodecs # Autosync From 2bf1a41895315b3a25f05f08e289b96b94bef468 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 29 Jan 2012 10:32:59 +0000 Subject: [PATCH 154/289] [win32k] - Show some error messages in case NtUserSystemParametersInfo fails svn path=/trunk/; revision=55288 --- reactos/subsystems/win32/win32k/ntuser/sysparams.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/sysparams.c b/reactos/subsystems/win32/win32k/ntuser/sysparams.c index 649e7e0a49a..c878b3e47e3 100644 --- a/reactos/subsystems/win32/win32k/ntuser/sysparams.c +++ b/reactos/subsystems/win32/win32k/ntuser/sysparams.c @@ -27,6 +27,7 @@ PWINSTATION_OBJECT gpwinstaCurrent = NULL; #define REQ_INTERACTIVE_WINSTA(err) \ if (gpwinstaCurrent != InputWindowStation) \ { \ + ERR("NtUserSystemParametersInfo requires interactive window station\n"); \ EngSetLastError(err); \ return 0; \ } @@ -422,7 +423,7 @@ SpiMemCopy(PVOID pvDst, PVOID pvSrc, ULONG cbSize, BOOL bProtect, BOOL bToUser) if (!NT_SUCCESS(Status)) { SetLastNtError(Status); - TRACE("SpiMemCopy failed, pvDst=%p, pvSrc=%p, bProtect=%d, bToUser=%d\n", pvDst, pvSrc, bProtect, bToUser); + ERR("SpiMemCopy failed, pvDst=%p, pvSrc=%p, bProtect=%d, bToUser=%d\n", pvDst, pvSrc, bProtect, bToUser); } return NT_SUCCESS(Status); } @@ -1536,6 +1537,7 @@ UserSystemParametersInfo( if (!gbSpiInitialized) { KeRosDumpStackFrames(NULL, 20); + //ASSERT(FALSE); return FALSE; } @@ -1545,7 +1547,8 @@ UserSystemParametersInfo( if (!gpwinstaCurrent) { ERR("UserSystemParametersInfo called without active windowstation.\n"); - //KeRosDumpStackFrames(NULL, 0); + //ASSERT(FALSE); + //return FALSE; } /* Do the actual operation */ From 07155c928c6e28f7246ef61ec7938ce81e03bc16 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 29 Jan 2012 11:13:07 +0000 Subject: [PATCH 155/289] [user32] - don't use DbgPrint for error messages svn path=/trunk/; revision=55289 --- reactos/dll/win32/user32/windows/menu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/user32/windows/menu.c b/reactos/dll/win32/user32/windows/menu.c index 70fb4f60ea5..1d2cdc7c35e 100644 --- a/reactos/dll/win32/user32/windows/menu.c +++ b/reactos/dll/win32/user32/windows/menu.c @@ -2168,14 +2168,14 @@ MenuInit(VOID) ncm.cbSize = sizeof(ncm); if(!SystemParametersInfoW(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)) { - DbgPrint("MenuInit(): SystemParametersInfoW(SPI_GETNONCLIENTMETRICS) failed!\n"); + ERR("MenuInit(): SystemParametersInfoW(SPI_GETNONCLIENTMETRICS) failed!\n"); return FALSE; } hMenuFont = CreateFontIndirectW(&ncm.lfMenuFont); if(hMenuFont == NULL) { - DbgPrint("MenuInit(): CreateFontIndirectW(hMenuFont) failed!\n"); + ERR("MenuInit(): CreateFontIndirectW(hMenuFont) failed!\n"); return FALSE; } @@ -2183,7 +2183,7 @@ MenuInit(VOID) hMenuFontBold = CreateFontIndirectW(&ncm.lfMenuFont); if(hMenuFontBold == NULL) { - DbgPrint("MenuInit(): CreateFontIndirectW(hMenuFontBold) failed!\n"); + ERR("MenuInit(): CreateFontIndirectW(hMenuFontBold) failed!\n"); DeleteObject(hMenuFont); hMenuFont = NULL; return FALSE; From bb0bb575b68758dbc21b24c00c614d95f2c03d5a Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Sun, 29 Jan 2012 17:16:01 +0000 Subject: [PATCH 156/289] [SMSS]: Add a new header which precisely documents the SB and SM packet structure and protocol. These match the Server 2003 SP1 definitions and sizes and would allow a ReactOS SMSS to talk to a Windows CSRSS and vice-versa. svn path=/trunk/; revision=55290 --- reactos/include/reactos/subsys/sm/smmsg.h | 207 ++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 reactos/include/reactos/subsys/sm/smmsg.h diff --git a/reactos/include/reactos/subsys/sm/smmsg.h b/reactos/include/reactos/subsys/sm/smmsg.h new file mode 100644 index 00000000000..5c30ff24cc3 --- /dev/null +++ b/reactos/include/reactos/subsys/sm/smmsg.h @@ -0,0 +1,207 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: include/reactos/subsystems/sm/smmsg.h + * PURPOSE: SMSS (SB and SM) Message Format + * PROGRAMMERS: Alex Ionescu + */ + +// +// There are the APIs that a Client (such as CSRSS) can send to the SMSS Server. +// +// These are called "SM" APIs. +// +// The exact names are not known, but we are basing them on the SmpApiName array +// in the checked build of SMSS, which is probably a close approximation. We add +// "p" to use the similar nomenclature seen/leaked out in the Base CSRSS APIs. +// +// +typedef enum _SMSRV_API_NUMBER +{ + SmpCreateForeignSession, + SmpSessionComplete, + SmpTerminateForeignSession, + SmpExecPgm, + SmpLoadDeferedSubsystem, + SmpStartCsr, + SmpStopCsr, + SmpMaxApiNumber // Based on BasepMaxApiNumber, UserpMaxApiNumber... +} SMSRV_API_NUMBER; + +// +// These are the structures making up the SM_API_MSG packet structure defined +// below. Each one corresponds to an equivalent API from the list above. +// +typedef struct _SM_CREATE_FOREIGN_SESSION_MSG +{ + ULONG NotImplemented; +} SM_CREATE_FOREIGN_SESSION_MSG, *PSM_CREATE_FOREIGN_SESSION_MSG; + +typedef struct _SM_SESSION_COMPLETE_MSG +{ + ULONG SessionId; + NTSTATUS Status; +} SM_SESSION_COMPLETE_MSG, *PSM_SESSION_COMPLETE_MSG; + +typedef struct _SM_TERMINATE_FOREIGN_SESSION_MSG +{ + ULONG NotImplemented; +} SM_TERMINATE_FOREIGN_SESSION_MSG, *PSM_TERMINATE_FOREIGN_SESSION_MSG; + +typedef struct _SM_EXEC_PGM_MSG +{ + RTL_USER_PROCESS_INFORMATION ProcessInformation; + BOOLEAN DebugFlag; +} SM_EXEC_PGM_MSG, *PM_EXEC_PGM_MSG; + +typedef struct _SM_LOAD_DEFERED_SUBSYSTEM_MSG +{ + ULONG Length; + WCHAR Buffer[32]; +} SM_LOAD_DEFERED_SUBSYSTEM_MSG, *PSM_LOAD_DEFERED_SUBSYSTEM_MSG; + +typedef struct _SM_START_CSR_MSG +{ + ULONG MuSessionId; + ULONG Length; + WCHAR Buffer[128]; + HANDLE WindowsSubSysProcessId; + HANDLE SmpInitialCommandProcessId; +} SM_START_CSR_MSG, *PSM_START_CSR_MSG; + +typedef struct _SM_STOP_CSR_MSG +{ + ULONG MuSessionId; +} SM_STOP_CSR_MSG, *PSM_STOP_CSR_MSG; + +// +// This is the actual packet structure sent over LCP to the \SmApiPort +// +typedef struct _SM_API_MSG +{ + PORT_MESSAGE h; + SMSRV_API_NUMBER ApiNumber; + NTSTATUS ReturnValue; + union + { + SM_CREATE_FOREIGN_SESSION_MSG CreateForeignSession; + SM_SESSION_COMPLETE_MSG SessionComplete; + SM_TERMINATE_FOREIGN_SESSION_MSG TerminateForeignComplete; + SM_EXEC_PGM_MSG ExecPgm; + SM_LOAD_DEFERED_SUBSYSTEM_MSG LoadDefered; + SM_START_CSR_MSG StartCsr; + SM_STOP_CSR_MSG StopCsr; + } u; +} SM_API_MSG, *PSM_API_MSG; + +// +// This is the size that Server 2003 SP1 SMSS expects, so make sure we conform. +// +C_ASSERT(sizeof(SM_API_MSG) == 0x130); + +// +// There are the APIs that the SMSS Serve can send to a client (such as CSRSS) +// +// These are called "SB" APIs. +// +// The exact names are unknown but we are basing them on the CsrServerSbApiName +// array in the checked build of CSRSRV which is probably a close approximation. +// We add "p" to use the similar nomenclature seen/leaked out in the Base CSRSS +// APIs. +// +// +typedef enum _SB_API_NUMBER +{ + SbpCreateSession, + SbpTerminateSession, + SbpForeignSessionComplete, + SbpCreateProcess, + SbpMaxApiNumber // Based on BasepMaxApiNumber, UserpMaxApiNumber... +} SB_API_NUMBER; + +// +// These are the structures making up the SB_API_MSG packet structure defined +// below. Each one corresponds to an equivalent API from the list above. +// +typedef struct _SB_CREATE_SESSION_MSG +{ + ULONG SessionId; + RTL_USER_PROCESS_INFORMATION ProcessInfo; +} SB_CREATE_SESSION_MSG, *PSB_CREATE_SESSION_MSG; + +typedef struct _SB_TERMINATE_SESSION_MSG +{ + ULONG SessionId; +} SB_TERMINATE_SESSION_MSG, *PSB_TERMINATE_SESSION_MSG; + +typedef struct _SB_FOREIGN_SESSION_COMPLETE_MSG +{ + ULONG SessionId; +} SB_FOREIGN_SESSION_COMPLETE_MSG, *PSB_FOREIGN_SESSION_COMPLETE_MSG; + +#define SB_PROCESS_FLAGS_DEBUG 0x1 +#define SB_PROCESS_FLAGS_WAIT_ON_THREAD 0x2 +#define SB_PROCESS_FLAGS_RESERVE_1MB 0x8 +#define SB_PROCESS_FLAGS_SKIP_CHECKS 0x20 +typedef struct _SB_CREATE_PROCESS_MSG +{ + union + { + struct + { + PUNICODE_STRING ImageName; + PUNICODE_STRING CurrentDirectory; + PUNICODE_STRING CommandLine; + PUNICODE_STRING DllPath; + ULONG Flags; + ULONG DebugFlags; + } In; + struct + { + HANDLE ProcessHandle; + HANDLE ThreadHandle; + ULONG SubsystemType; + CLIENT_ID ClientId; + } Out; + }; +} SB_CREATE_PROCESS_MSG, *PSB_CREATE_PROCESS_MSG; + +// +// When the server connects to a client, this structure is exchanged +// +typedef struct _SB_CONNECTION_INFO +{ + ULONG SubsystemType; + WCHAR SbApiPortName[120]; +} SB_CONNECTION_INFO, *PSB_CONNECTION_INFO; + +// +// This is the actual packet structure sent over LCP to the \SbApiPort +// +typedef struct _SB_API_MSG +{ + PORT_MESSAGE Header; + union + { + SB_CONNECTION_INFO ConnectionInfo; + struct + { + SB_API_NUMBER ApiNumber; + NTSTATUS ReturnValue; + union + { + SB_CREATE_SESSION_MSG CreateSession; + SB_TERMINATE_SESSION_MSG TerminateSession; + SB_FOREIGN_SESSION_COMPLETE_MSG ForeignSessionComplete; + SB_CREATE_PROCESS_MSG CreateProcess; + }; + }; + }; +} SB_API_MSG, *PSB_API_MSG; + +// +// This is the size that Server 2003 SP1 SMSS expects, so make sure we conform. +// +C_ASSERT(sizeof(SB_CONNECTION_INFO) == 0xF4); +C_ASSERT(sizeof(SB_API_MSG) == 0x110); + From c43966f688d3fa3be561f05592db5ea9af28baa2 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 29 Jan 2012 21:29:40 +0000 Subject: [PATCH 157/289] [WTSAPI32] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55295 --- reactos/dll/win32/wtsapi32/wtsapi32.c | 249 ++++++++++++++++++++++- reactos/dll/win32/wtsapi32/wtsapi32.spec | 44 ++-- reactos/media/doc/README.WINE | 2 +- 3 files changed, 268 insertions(+), 27 deletions(-) diff --git a/reactos/dll/win32/wtsapi32/wtsapi32.c b/reactos/dll/win32/wtsapi32/wtsapi32.c index 604752aa297..875cfb5186a 100644 --- a/reactos/dll/win32/wtsapi32/wtsapi32.c +++ b/reactos/dll/win32/wtsapi32/wtsapi32.c @@ -55,6 +55,24 @@ void WINAPI WTSCloseServer(HANDLE hServer) FIXME("Stub %p\n", hServer); } +/************************************************************ + * WTSConnectSessionA (WTSAPI32.@) + */ +BOOL WINAPI WTSConnectSessionA(ULONG LogonId, ULONG TargetLogonId, PSTR pPassword, BOOL bWait) +{ + FIXME("Stub %d %d (%s) %d\n", LogonId, TargetLogonId, debugstr_a(pPassword), bWait); + return TRUE; +} + +/************************************************************ + * WTSConnectSessionW (WTSAPI32.@) + */ +BOOL WINAPI WTSConnectSessionW(ULONG LogonId, ULONG TargetLogonId, PWSTR pPassword, BOOL bWait) +{ + FIXME("Stub %d %d (%s) %d\n", LogonId, TargetLogonId, debugstr_w(pPassword), bWait); + return TRUE; +} + /************************************************************ * WTSDisconnectSession (WTSAPI32.@) */ @@ -98,6 +116,25 @@ BOOL WINAPI WTSEnumerateProcessesW(HANDLE hServer, DWORD Reserved, DWORD Version return TRUE; } +/************************************************************ + * WTSEnumerateServersA (WTSAPI32.@) + */ +BOOL WINAPI WTSEnumerateServersA(LPSTR pDomainName, DWORD Reserved, DWORD Version, PWTS_SERVER_INFOA *ppServerInfo, DWORD *pCount) +{ + FIXME("Stub %s 0x%08x 0x%08x %p %p\n", debugstr_a(pDomainName), Reserved, Version, ppServerInfo, pCount); + return FALSE; +} + +/************************************************************ + * WTSEnumerateServersW (WTSAPI32.@) + */ +BOOL WINAPI WTSEnumerateServersW(LPWSTR pDomainName, DWORD Reserved, DWORD Version, PWTS_SERVER_INFOW *ppServerInfo, DWORD *pCount) +{ + FIXME("Stub %s 0x%08x 0x%08x %p %p\n", debugstr_w(pDomainName), Reserved, Version, ppServerInfo, pCount); + return FALSE; +} + + /************************************************************ * WTSEnumerateEnumerateSessionsA (WTSAPI32.@) */ @@ -138,7 +175,6 @@ BOOL WINAPI WTSEnumerateSessionsW(HANDLE hServer, DWORD Reserved, DWORD Version, void WINAPI WTSFreeMemory(PVOID pMemory) { FIXME("Stub %p\n", pMemory); - return; } /************************************************************ @@ -206,24 +242,137 @@ BOOL WINAPI WTSQuerySessionInformationW( } /************************************************************ - * WTSWaitSystemEvent (WTSAPI32.@) + * WTSQueryUserToken (WTSAPI32.@) */ -BOOL WINAPI WTSWaitSystemEvent(HANDLE hServer, DWORD Mask, DWORD* Flags) +BOOL WINAPI WTSQueryUserToken(ULONG session_id, PHANDLE token) { - /* FIXME: Forward request to winsta.dll::WinStationWaitSystemEvent */ - FIXME("Stub %p 0x%08x %p\n", hServer, Mask, Flags); + FIXME("%u %p\n", session_id, token); return FALSE; } +/************************************************************ + * WTSQueryUserConfigA (WTSAPI32.@) + */ +BOOL WINAPI WTSQueryUserConfigA(LPSTR pServerName, LPSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPSTR *ppBuffer, DWORD *pBytesReturned) +{ + FIXME("Stub (%s) (%s) 0x%08x %p %p\n", debugstr_a(pServerName), debugstr_a(pUserName), WTSConfigClass, + ppBuffer, pBytesReturned); + return FALSE; +} + +/************************************************************ + * WTSQueryUserConfigW (WTSAPI32.@) + */ +BOOL WINAPI WTSQueryUserConfigW(LPWSTR pServerName, LPWSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPWSTR *ppBuffer, DWORD *pBytesReturned) +{ + FIXME("Stub (%s) (%s) 0x%08x %p %p\n", debugstr_w(pServerName), debugstr_w(pUserName), WTSConfigClass, + ppBuffer, pBytesReturned); + return FALSE; +} + + /************************************************************ * WTSRegisterSessionNotification (WTSAPI32.@) */ BOOL WINAPI WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags) { FIXME("Stub %p 0x%08x\n", hWnd, dwFlags); + return TRUE; +} + +/************************************************************ + * WTSRegisterSessionNotification (WTSAPI32.@) + */ +BOOL WINAPI WTSRegisterSessionNotificationEx(HANDLE hServer, HWND hWnd, DWORD dwFlags) +{ + FIXME("Stub %p %p 0x%08x\n", hServer, hWnd, dwFlags); return FALSE; } + +/************************************************************ + * WTSSendMessageA (WTSAPI32.@) + */ +BOOL WINAPI WTSSendMessageA(HANDLE hServer, DWORD SessionId, LPSTR pTitle, DWORD TitleLength, LPSTR pMessage, + DWORD MessageLength, DWORD Style, DWORD Timeout, DWORD *pResponse, BOOL bWait) +{ + FIXME("Stub %p 0x%08x (%s) %d (%s) %d 0x%08x %d %p %d\n", hServer, SessionId, debugstr_a(pTitle), TitleLength, debugstr_a(pMessage), MessageLength, Style, Timeout, pResponse, bWait); + return FALSE; +} + +/************************************************************ + * WTSSendMessageW (WTSAPI32.@) + */ +BOOL WINAPI WTSSendMessageW(HANDLE hServer, DWORD SessionId, LPWSTR pTitle, DWORD TitleLength, LPWSTR pMessage, + DWORD MessageLength, DWORD Style, DWORD Timeout, DWORD *pResponse, BOOL bWait) +{ + FIXME("Stub %p 0x%08x (%s) %d (%s) %d 0x%08x %d %p %d\n", hServer, SessionId, debugstr_w(pTitle), TitleLength, debugstr_w(pMessage), MessageLength, Style, Timeout, pResponse, bWait); + return FALSE; +} + +/************************************************************ + * WTSSetUserConfigA (WTSAPI32.@) + */ +BOOL WINAPI WTSSetUserConfigA(LPSTR pServerName, LPSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPSTR pBuffer, DWORD DataLength) +{ + FIXME("Stub (%s) (%s) 0x%08x %p %d\n", debugstr_a(pServerName), debugstr_a(pUserName), WTSConfigClass,pBuffer, DataLength); + return FALSE; +} + +/************************************************************ + * WTSSetUserConfigW (WTSAPI32.@) + */ +BOOL WINAPI WTSSetUserConfigW(LPWSTR pServerName, LPWSTR pUserName, WTS_CONFIG_CLASS WTSConfigClass, LPWSTR pBuffer, DWORD DataLength) +{ + FIXME("Stub (%s) (%s) 0x%08x %p %d\n", debugstr_w(pServerName), debugstr_w(pUserName), WTSConfigClass,pBuffer, DataLength); + return FALSE; +} + +/************************************************************ + * WTSShutdownSystem (WTSAPI32.@) + */ +BOOL WINAPI WTSShutdownSystem(HANDLE hServer, DWORD ShutdownFlag) +{ + FIXME("Stub %p 0x%08x\n", hServer,ShutdownFlag); + return FALSE; +} + +/************************************************************ + * WTSStartRemoteControlSessionA (WTSAPI32.@) + */ +BOOL WINAPI WTSStartRemoteControlSessionA(LPSTR pTargetServerName, ULONG TargetLogonId, BYTE HotkeyVk, USHORT HotkeyModifiers) +{ + FIXME("Stub (%s) %d %d %d\n", debugstr_a(pTargetServerName), TargetLogonId, HotkeyVk, HotkeyModifiers); + return FALSE; +} + +/************************************************************ + * WTSStartRemoteControlSessionW (WTSAPI32.@) + */ +BOOL WINAPI WTSStartRemoteControlSessionW(LPWSTR pTargetServerName, ULONG TargetLogonId, BYTE HotkeyVk, USHORT HotkeyModifiers) +{ + FIXME("Stub (%s) %d %d %d\n", debugstr_w(pTargetServerName), TargetLogonId, HotkeyVk, HotkeyModifiers); + return FALSE; +} + +/************************************************************ + * WTSStopRemoteControlSession (WTSAPI32.@) + */ +BOOL WINAPI WTSStopRemoteControlSession(ULONG LogonId) +{ + FIXME("Stub %d\n", LogonId); + return FALSE; +} + +/************************************************************ + * WTSTerminateProcess (WTSAPI32.@) + */ +BOOL WINAPI WTSTerminateProcess(HANDLE hServer, DWORD ProcessId, DWORD ExitCode) +{ + FIXME("Stub %p %d %d\n", hServer, ProcessId, ExitCode); + return FALSE; +} + /************************************************************ * WTSUnRegisterSessionNotification (WTSAPI32.@) */ @@ -234,10 +383,94 @@ BOOL WINAPI WTSUnRegisterSessionNotification(HWND hWnd) } /************************************************************ - * WTSQueryUserToken (WTSAPI32.@) + * WTSUnRegisterSessionNotification (WTSAPI32.@) */ -BOOL WINAPI WTSQueryUserToken(ULONG session_id, PHANDLE token) +BOOL WINAPI WTSUnRegisterSessionNotificationEx(HANDLE hServer, HWND hWnd) { - FIXME("%u %p\n", session_id, token); + FIXME("Stub %p %p\n", hServer, hWnd); + return FALSE; +} + + +/************************************************************ + * WTSVirtualChannelClose (WTSAPI32.@) + */ +BOOL WINAPI WTSVirtualChannelClose(HANDLE hChannelHandle) +{ + FIXME("Stub %p\n", hChannelHandle); + return FALSE; +} + +/************************************************************ + * WTSVirtualChannelOpen (WTSAPI32.@) + */ +HANDLE WINAPI WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId, LPSTR pVirtualName) +{ + FIXME("Stub %p %d (%s)\n", hServer, SessionId, debugstr_a(pVirtualName)); + return NULL; +} + +/************************************************************ + * WTSVirtualChannelOpen (WTSAPI32.@) + */ +HANDLE WINAPI WTSVirtualChannelOpenEx(DWORD SessionId, LPSTR pVirtualName, DWORD flags) +{ + FIXME("Stub %d (%s) %d\n", SessionId, debugstr_a(pVirtualName), flags); + return NULL; +} + +/************************************************************ + * WTSVirtualChannelPurgeInput (WTSAPI32.@) + */ +BOOL WINAPI WTSVirtualChannelPurgeInput(HANDLE hChannelHandle) +{ + FIXME("Stub %p\n", hChannelHandle); + return FALSE; +} + +/************************************************************ + * WTSVirtualChannelPurgeOutput (WTSAPI32.@) + */ +BOOL WINAPI WTSVirtualChannelPurgeOutput(HANDLE hChannelHandle) +{ + FIXME("Stub %p\n", hChannelHandle); + return FALSE; +} + + +/************************************************************ + * WTSVirtualChannelQuery (WTSAPI32.@) + */ +BOOL WINAPI WTSVirtualChannelQuery(HANDLE hChannelHandle, WTS_VIRTUAL_CLASS WtsVirtualClass, PVOID *ppBuffer, DWORD *pBytesReturned) +{ + FIXME("Stub %p %d %p %p\n", hChannelHandle, WtsVirtualClass, ppBuffer, pBytesReturned); + return FALSE; +} + +/************************************************************ + * WTSVirtualChannelRead (WTSAPI32.@) + */ +BOOL WINAPI WTSVirtualChannelRead(HANDLE hChannelHandle, ULONG TimeOut, PCHAR Buffer, ULONG BufferSize, PULONG pBytesRead) +{ + FIXME("Stub %p %d %p %d %p\n", hChannelHandle, TimeOut, Buffer, BufferSize, pBytesRead); + return FALSE; +} + +/************************************************************ + * WTSVirtualChannelWrite (WTSAPI32.@) + */ +BOOL WINAPI WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer, ULONG Length, PULONG pBytesWritten) +{ + FIXME("Stub %p %p %d %p\n", hChannelHandle, Buffer, Length, pBytesWritten); + return FALSE; +} + +/************************************************************ + * WTSWaitSystemEvent (WTSAPI32.@) + */ +BOOL WINAPI WTSWaitSystemEvent(HANDLE hServer, DWORD Mask, DWORD* Flags) +{ + /* FIXME: Forward request to winsta.dll::WinStationWaitSystemEvent */ + FIXME("Stub %p 0x%08x %p\n", hServer, Mask, Flags); return FALSE; } diff --git a/reactos/dll/win32/wtsapi32/wtsapi32.spec b/reactos/dll/win32/wtsapi32/wtsapi32.spec index f20bbe206b6..d94ef889f29 100644 --- a/reactos/dll/win32/wtsapi32/wtsapi32.spec +++ b/reactos/dll/win32/wtsapi32/wtsapi32.spec @@ -1,35 +1,43 @@ @ stdcall WTSCloseServer(long) +@ stdcall WTSConnectSessionA(long long ptr long) +@ stdcall WTSConnectSessionW(long long ptr long) @ stdcall WTSDisconnectSession(long long long) @ stdcall WTSEnumerateProcessesA(long long long ptr ptr) @ stdcall WTSEnumerateProcessesW(long long long ptr ptr) -@ stub WTSEnumerateServersA -@ stub WTSEnumerateServersW +@ stdcall WTSEnumerateServersA(ptr long long ptr ptr) +@ stdcall WTSEnumerateServersW(ptr long long ptr ptr) @ stdcall WTSEnumerateSessionsA(long long long ptr ptr) @ stdcall WTSEnumerateSessionsW(long long long ptr ptr) @ stdcall WTSFreeMemory(ptr) -@ stdcall WTSLogoffSession(ptr long long) +@ stdcall WTSLogoffSession(long long long) @ stdcall WTSOpenServerA(ptr) @ stdcall WTSOpenServerW(ptr) @ stdcall WTSQuerySessionInformationA(long long long ptr ptr) @ stdcall WTSQuerySessionInformationW(long long long ptr ptr) -@ stub WTSQueryUserConfigA -@ stub WTSQueryUserConfigW +@ stdcall WTSQueryUserConfigA(ptr ptr long ptr ptr) +@ stdcall WTSQueryUserConfigW(ptr ptr long ptr ptr) @ stdcall WTSQueryUserToken(long ptr) @ stdcall WTSRegisterSessionNotification(long long) -@ stub WTSSendMessageA -@ stub WTSSendMessageW +@ stdcall WTSRegisterSessionNotificationEx(long long long) +@ stdcall WTSSendMessageA(long long ptr long ptr long long long ptr long) +@ stdcall WTSSendMessageW(long long ptr long ptr long long long ptr long) @ stub WTSSetSessionInformationA @ stub WTSSetSessionInformationW -@ stub WTSSetUserConfigA -@ stub WTSSetUserConfigW -@ stub WTSShutdownSystem -@ stub WTSTerminateProcess +@ stdcall WTSSetUserConfigA(ptr ptr long ptr long) +@ stdcall WTSSetUserConfigW(ptr ptr long ptr long) +@ stdcall WTSShutdownSystem(long long) +@ stdcall WTSStartRemoteControlSessionA(ptr long long long) +@ stdcall WTSStartRemoteControlSessionW(ptr long long long) +@ stdcall WTSStopRemoteControlSession(long) +@ stdcall WTSTerminateProcess(long long long) @ stdcall WTSUnRegisterSessionNotification(long) -@ stub WTSVirtualChannelClose -@ stub WTSVirtualChannelOpen -@ stub WTSVirtualChannelPurgeInput -@ stub WTSVirtualChannelPurgeOutput -@ stub WTSVirtualChannelQuery -@ stub WTSVirtualChannelRead -@ stub WTSVirtualChannelWrite +@ stdcall WTSUnRegisterSessionNotificationEx(long long) +@ stdcall WTSVirtualChannelClose(long) +@ stdcall WTSVirtualChannelOpen(long long ptr) +@ stdcall WTSVirtualChannelOpenEx(long ptr long) +@ stdcall WTSVirtualChannelPurgeInput(long) +@ stdcall WTSVirtualChannelPurgeOutput(long) +@ stdcall WTSVirtualChannelQuery(long long ptr ptr) +@ stdcall WTSVirtualChannelRead(long long ptr long ptr) +@ stdcall WTSVirtualChannelWrite(long ptr long ptr) @ stdcall WTSWaitSystemEvent(long long ptr) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index fdc19619814..82f693ef149 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -180,7 +180,7 @@ reactos/dll/win32/winmm/wavemap # Forked at Wine-20050628 reactos/dll/win32/wintrust # Autosync reactos/dll/win32/wldap32 # Autosync reactos/dll/win32/wmi # Autosync -reactos/dll/win32/wtsapi32 # Forked +reactos/dll/win32/wtsapi32 # Synced to Wine-1.3.37 reactos/dll/win32/wuapi # Autosync reactos/dll/win32/xinput1_1 # Autosync reactos/dll/win32/xinput1_2 # Autosync From 2d57ba729446ceb85b4ac3b9f0736db3d2249296 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 29 Jan 2012 21:39:30 +0000 Subject: [PATCH 158/289] [PRINTUI] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55296 --- reactos/dll/win32/printui/printui.c | 2 +- reactos/dll/win32/printui/printui.rc | 3 --- reactos/dll/win32/printui/printui_private.h | 6 ------ reactos/media/doc/README.WINE | 2 +- 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/reactos/dll/win32/printui/printui.c b/reactos/dll/win32/printui/printui.c index c25aadb14cc..7a2b466d411 100644 --- a/reactos/dll/win32/printui/printui.c +++ b/reactos/dll/win32/printui/printui.c @@ -38,7 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(printui); -HINSTANCE PRINTUI_hInstance = NULL; +static HINSTANCE PRINTUI_hInstance = NULL; /* ################################# */ diff --git a/reactos/dll/win32/printui/printui.rc b/reactos/dll/win32/printui/printui.rc index d8d0d4bde30..bfbae9820a7 100644 --- a/reactos/dll/win32/printui/printui.rc +++ b/reactos/dll/win32/printui/printui.rc @@ -19,9 +19,6 @@ * */ -#include "windef.h" -#include "winbase.h" -#include "winuser.h" #include "winver.h" #define WINE_FILENAME_STR "printui.dll" diff --git a/reactos/dll/win32/printui/printui_private.h b/reactos/dll/win32/printui/printui_private.h index 56143b77874..fc63c752146 100644 --- a/reactos/dll/win32/printui/printui_private.h +++ b/reactos/dll/win32/printui/printui_private.h @@ -63,10 +63,4 @@ typedef struct tag_context { LPWSTR options[OPT_MAX]; BOOL flags[FLAG_MAX]; } context_t; - - -/* ## DLL-wide Globals ## */ -extern HINSTANCE PRINTUI_hInstance; - - #endif diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 82f693ef149..3e5e27d0025 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -133,7 +133,7 @@ reactos/dll/win32/olethk32 # Autosync reactos/dll/win32/pdh # Autosync reactos/dll/win32/pidgen # Autosync reactos/dll/win32/powrprof # Forked at Wine-1.0rc5 -reactos/dll/win32/printui # Autosync +reactos/dll/win32/printui # Synced to Wine-1.3.37 reactos/dll/win32/pstorec # Autosync reactos/dll/win32/query # Autosync reactos/dll/win32/rasapi32 # Autosync From 15fb0aecc1f0362517068026d3e9cbd258c67e2e Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 29 Jan 2012 22:24:35 +0000 Subject: [PATCH 159/289] [PSTOREC] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55297 --- reactos/dll/win32/pstorec/pstorec.c | 15 ++++++++++----- reactos/dll/win32/pstorec/pstorec.rgs | 20 ++++++++++++++++++++ reactos/dll/win32/pstorec/rsrc.rc | 2 ++ reactos/media/doc/README.WINE | 2 +- 4 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 reactos/dll/win32/pstorec/pstorec.rgs diff --git a/reactos/dll/win32/pstorec/pstorec.c b/reactos/dll/win32/pstorec/pstorec.c index 493501f10a5..b2e729babda 100644 --- a/reactos/dll/win32/pstorec/pstorec.c +++ b/reactos/dll/win32/pstorec/pstorec.c @@ -33,10 +33,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(pstores); typedef struct { - const IPStoreVtbl *lpVtbl; + IPStore IPStore_iface; LONG ref; } PStore_impl; +static inline PStore_impl *impl_from_IPStore(IPStore *iface) +{ + return CONTAINING_RECORD(iface, PStore_impl, IPStore_iface); +} + BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad) { TRACE("%p %x %p\n", hinst, fdwReason, fImpLoad); @@ -62,7 +67,7 @@ static HRESULT WINAPI PStore_fnQueryInterface( REFIID riid, LPVOID *ppvObj) { - PStore_impl *This = (PStore_impl *)iface; + PStore_impl *This = impl_from_IPStore(iface); TRACE("%p %s\n",This,debugstr_guid(riid)); @@ -87,7 +92,7 @@ static HRESULT WINAPI PStore_fnQueryInterface( */ static ULONG WINAPI PStore_fnAddRef(IPStore* iface) { - PStore_impl *This = (PStore_impl *)iface; + PStore_impl *This = impl_from_IPStore(iface); TRACE("%p %u\n", This, This->ref); @@ -99,7 +104,7 @@ static ULONG WINAPI PStore_fnAddRef(IPStore* iface) */ static ULONG WINAPI PStore_fnRelease(IPStore* iface) { - PStore_impl *This = (PStore_impl *)iface; + PStore_impl *This = impl_from_IPStore(iface); LONG ref; TRACE("%p %u\n", This, This->ref); @@ -359,7 +364,7 @@ HRESULT WINAPI PStoreCreateInstance( IPStore** ppProvider, if( !ips ) return E_OUTOFMEMORY; - ips->lpVtbl = &pstores_vtbl; + ips->IPStore_iface.lpVtbl = &pstores_vtbl; ips->ref = 1; *ppProvider = (IPStore*) ips; diff --git a/reactos/dll/win32/pstorec/pstorec.rgs b/reactos/dll/win32/pstorec/pstorec.rgs new file mode 100644 index 00000000000..72013d3c447 --- /dev/null +++ b/reactos/dll/win32/pstorec/pstorec.rgs @@ -0,0 +1,20 @@ +HKCR +{ + NoRemove Typelib + { + NoRemove '{5A6F1EBD-2DB1-11D0-8C39-00C04FD9126B}' + { + '1.0' = s 'PStore 1.0 Type Library' + { + '0' { win32 = s '%MODULE%' } + FLAGS = s '0' + } + } + } + NoRemove Interface + { + } + NoRemove CLSID + { + } +} diff --git a/reactos/dll/win32/pstorec/rsrc.rc b/reactos/dll/win32/pstorec/rsrc.rc index 80dc7816e8f..7c60321b43b 100644 --- a/reactos/dll/win32/pstorec/rsrc.rc +++ b/reactos/dll/win32/pstorec/rsrc.rc @@ -27,3 +27,5 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL /* @makedep: pstorec_tlb.tlb */ 1 TYPELIB pstorec_tlb.tlb + +2 WINE_REGISTRY pstorec.rgs diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 3e5e27d0025..7df7115da54 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -134,7 +134,7 @@ reactos/dll/win32/pdh # Autosync reactos/dll/win32/pidgen # Autosync reactos/dll/win32/powrprof # Forked at Wine-1.0rc5 reactos/dll/win32/printui # Synced to Wine-1.3.37 -reactos/dll/win32/pstorec # Autosync +reactos/dll/win32/pstorec # Synced to Wine-1.3.37 reactos/dll/win32/query # Autosync reactos/dll/win32/rasapi32 # Autosync reactos/dll/win32/resutils # Autosync From 503dee91c9f2284cd830acf89a7daa0efc21800f Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 29 Jan 2012 22:39:18 +0000 Subject: [PATCH 160/289] [QUERY] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55298 --- reactos/dll/win32/query/CMakeLists.txt | 4 +++- reactos/dll/win32/query/query.rbuild | 1 + reactos/dll/win32/query/query.spec | 2 +- reactos/dll/win32/query/query_main.c | 7 +++++++ reactos/media/doc/README.WINE | 2 +- 5 files changed, 13 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/query/CMakeLists.txt b/reactos/dll/win32/query/CMakeLists.txt index 3574784cccc..ba2169d92aa 100644 --- a/reactos/dll/win32/query/CMakeLists.txt +++ b/reactos/dll/win32/query/CMakeLists.txt @@ -1,6 +1,8 @@ include_directories(${REACTOS_SOURCE_DIR}/include/reactos/wine) -add_definitions(-D__WINESRC__) +add_definitions( + -D__WINESRC__ + -DCOM_NO_WINDOWS_H) spec2def(query.dll query.spec) diff --git a/reactos/dll/win32/query/query.rbuild b/reactos/dll/win32/query/query.rbuild index a1f718a0d4d..8360231e473 100644 --- a/reactos/dll/win32/query/query.rbuild +++ b/reactos/dll/win32/query/query.rbuild @@ -4,6 +4,7 @@ . include/reactos/wine + query_main.c wine uuid diff --git a/reactos/dll/win32/query/query.spec b/reactos/dll/win32/query/query.spec index 612ea2d1337..71b987492fb 100644 --- a/reactos/dll/win32/query/query.spec +++ b/reactos/dll/win32/query/query.spec @@ -33,7 +33,7 @@ @ stub InitializeFILTERPerformanceData @ stub _LoadBHIFilter@16 @ stub LoadBinaryFilter -@ stub LoadIFilter +@ stdcall LoadIFilter(wstr ptr ptr) @ stub LoadTextFilter @ stub LocateCatalogs @ stdcall LocateCatalogsA(str long ptr ptr ptr ptr) diff --git a/reactos/dll/win32/query/query_main.c b/reactos/dll/win32/query/query_main.c index 2d4e4ae3043..3414aecb2b7 100644 --- a/reactos/dll/win32/query/query_main.c +++ b/reactos/dll/win32/query/query_main.c @@ -98,3 +98,10 @@ HRESULT WINAPI LocateCatalogsW(WCHAR const *pwszScope, ULONG iBm, iBm, pwszMachine, pcMachine, pwszCat, pcCat); return CI_E_NOT_RUNNING; } + +HRESULT WINAPI LoadIFilter(WCHAR const *pwcsPath, IUnknown *pUnkOuter, void **ppIUnk) +{ + FIXME("%s %p %p\n", debugstr_w(pwcsPath), pUnkOuter, ppIUnk); + *ppIUnk = NULL; + return E_NOTIMPL; +} diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 7df7115da54..9e45fdd153f 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -135,7 +135,7 @@ reactos/dll/win32/pidgen # Autosync reactos/dll/win32/powrprof # Forked at Wine-1.0rc5 reactos/dll/win32/printui # Synced to Wine-1.3.37 reactos/dll/win32/pstorec # Synced to Wine-1.3.37 -reactos/dll/win32/query # Autosync +reactos/dll/win32/query # Synced to Wine-1.3.37 reactos/dll/win32/rasapi32 # Autosync reactos/dll/win32/resutils # Autosync reactos/dll/win32/riched20 # Autosync From 7dbc8a9586b412e3523a8770d783212357dde843 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 29 Jan 2012 23:00:39 +0000 Subject: [PATCH 161/289] [RASAPI32] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55300 --- reactos/dll/win32/rasapi32/rasapi.c | 4 ++++ reactos/dll/win32/rasapi32/rasapi32.spec | 2 +- reactos/media/doc/README.WINE | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/rasapi32/rasapi.c b/reactos/dll/win32/rasapi32/rasapi.c index 704a8bcfe1e..2184a2204fa 100644 --- a/reactos/dll/win32/rasapi32/rasapi.c +++ b/reactos/dll/win32/rasapi32/rasapi.c @@ -250,6 +250,10 @@ DWORD WINAPI RasEnumDevicesA(LPRASDEVINFOA lpRasDevinfo, LPDWORD lpcb, LPDWORD l return ERROR_INVALID_PARAMETER; FIXME("(%p,%p,%p),stub!\n",lpRasDevinfo,lpcb,lpcDevices); + + if(lpRasDevinfo && lpRasDevinfo->dwSize != sizeof(RASDEVINFOA)) + return ERROR_INVALID_SIZE; + if (!lpRasDevinfo || (*lpcb < sizeof(RASDEVINFOA))) { *lpcb = sizeof(RASDEVINFOA); return ERROR_BUFFER_TOO_SMALL; diff --git a/reactos/dll/win32/rasapi32/rasapi32.spec b/reactos/dll/win32/rasapi32/rasapi32.spec index 6aacbbf42b9..08c750ee6b0 100644 --- a/reactos/dll/win32/rasapi32/rasapi32.spec +++ b/reactos/dll/win32/rasapi32/rasapi32.spec @@ -21,7 +21,7 @@ @ stdcall RasEnumDevicesA(ptr ptr ptr) @ stdcall RasEnumDevicesW(ptr ptr ptr) @ stdcall RasEnumEntriesA(str str ptr ptr ptr) -@ stdcall RasEnumEntriesW(str str ptr ptr ptr) +@ stdcall RasEnumEntriesW(wstr wstr ptr ptr ptr) @ stub RasEnumEntriesWow @ stdcall RasGetAutodialAddressA(str ptr ptr ptr ptr) @ stdcall RasGetAutodialAddressW(wstr ptr ptr ptr ptr) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 9e45fdd153f..6ea252a9260 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -136,7 +136,7 @@ reactos/dll/win32/powrprof # Forked at Wine-1.0rc5 reactos/dll/win32/printui # Synced to Wine-1.3.37 reactos/dll/win32/pstorec # Synced to Wine-1.3.37 reactos/dll/win32/query # Synced to Wine-1.3.37 -reactos/dll/win32/rasapi32 # Autosync +reactos/dll/win32/rasapi32 # Synced to Wine-1.3.37 reactos/dll/win32/resutils # Autosync reactos/dll/win32/riched20 # Autosync reactos/dll/win32/riched32 # Autosync From ed317865e383328ef342fde0740a4eb3005b3462 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 29 Jan 2012 23:00:48 +0000 Subject: [PATCH 162/289] [RASAPI32_WINETEST] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55301 --- rostests/winetests/rasapi32/rasapi.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/rostests/winetests/rasapi32/rasapi.c b/rostests/winetests/rasapi32/rasapi.c index d25c7411301..e0ff25f8578 100644 --- a/rostests/winetests/rasapi32/rasapi.c +++ b/rostests/winetests/rasapi32/rasapi.c @@ -85,7 +85,6 @@ static void test_rasenum(void) rasDevInfo[0].dwSize = 0; cb = bufsize; result = pRasEnumDevicesA(rasDevInfo, &cb, &cDevices); - todo_wine ok(result == ERROR_INVALID_SIZE || result == ERROR_INVALID_USER_BUFFER, /* win98 */ "Expected ERROR_INVALID_SIZE, got %08d\n", result); @@ -93,7 +92,6 @@ static void test_rasenum(void) rasDevInfo[0].dwSize = sizeof(RASDEVINFOA) -1; cb = bufsize; result = pRasEnumDevicesA(rasDevInfo, &cb, &cDevices); - todo_wine ok(result == ERROR_INVALID_SIZE || result == ERROR_INVALID_USER_BUFFER, /* win98 */ "Expected ERROR_INVALID_SIZE, got %08d\n", result); @@ -101,7 +99,6 @@ static void test_rasenum(void) rasDevInfo[0].dwSize = sizeof(RASDEVINFOA) +1; cb = bufsize; result = pRasEnumDevicesA(rasDevInfo, &cb, &cDevices); - todo_wine ok(result == ERROR_INVALID_SIZE || result == ERROR_INVALID_USER_BUFFER, /* win98 */ "Expected ERROR_INVALID_SIZE, got %08d\n", result); @@ -151,7 +148,6 @@ static void test_rasenum(void) cb = 0; rasDevInfo[0].dwSize = 0; result = pRasEnumDevicesA(rasDevInfo, &cb, &cDevices); - todo_wine ok(result == ERROR_INVALID_SIZE || broken(result == ERROR_BUFFER_TOO_SMALL), /* win98 */ "Expected ERROR_INVALID_SIZE, got %08d\n", result); From 4d623fd54755a567eb94c7e46a8d90cb8de94c7e Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 29 Jan 2012 23:23:23 +0000 Subject: [PATCH 163/289] [RICHED20] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55303 --- reactos/dll/win32/riched20/caret.c | 7 +- reactos/dll/win32/riched20/clipboard.c | 56 ++- reactos/dll/win32/riched20/editor.c | 129 ++--- reactos/dll/win32/riched20/editor.h | 338 ++++++------- reactos/dll/win32/riched20/editstr.h | 5 - reactos/dll/win32/riched20/paint.c | 26 +- reactos/dll/win32/riched20/para.c | 2 +- reactos/dll/win32/riched20/res.h | 2 +- reactos/dll/win32/riched20/richole.c | 655 +++++++++---------------- reactos/dll/win32/riched20/rtf.h | 44 +- reactos/dll/win32/riched20/run.c | 90 ++-- reactos/dll/win32/riched20/style.c | 20 +- reactos/dll/win32/riched20/table.c | 8 +- reactos/dll/win32/riched20/txthost.c | 187 +++---- reactos/dll/win32/riched20/txtsrv.c | 173 +++---- reactos/dll/win32/riched20/undo.c | 8 +- reactos/dll/win32/riched20/wrap.c | 76 ++- reactos/dll/win32/riched20/writer.c | 6 +- reactos/media/doc/README.WINE | 2 +- 19 files changed, 778 insertions(+), 1056 deletions(-) diff --git a/reactos/dll/win32/riched20/caret.c b/reactos/dll/win32/riched20/caret.c index 5750db9ce7d..093bd20aa6b 100644 --- a/reactos/dll/win32/riched20/caret.c +++ b/reactos/dll/win32/riched20/caret.c @@ -579,10 +579,8 @@ void ME_InsertTextFromCursor(ME_TextEditor *editor, int nCursor, } p = &editor->pCursors[nCursor]; - if (p->nOffset) { - ME_SplitRunSimple(editor, p->pRun, p->nOffset); - p = &editor->pCursors[nCursor]; - } + if (p->nOffset) + ME_SplitRunSimple(editor, p); tmp_style = ME_GetInsertStyle(editor, nCursor); /* ME_SplitParagraph increases style refcount */ tp = ME_SplitParagraph(editor, p->pRun, p->pRun->member.run.style, eol_str, 0); @@ -1201,7 +1199,6 @@ static ME_DisplayItem *ME_FindRunInRow(ME_TextEditor *editor, ME_DisplayItem *pR ME_DisplayItem *pNext, *pLastRun; pNext = ME_FindItemFwd(pRow, diRunOrStartRow); assert(pNext->type == diRun); - pLastRun = pNext; if (pbCaretAtEnd) *pbCaretAtEnd = FALSE; if (pOffset) *pOffset = 0; do { diff --git a/reactos/dll/win32/riched20/clipboard.c b/reactos/dll/win32/riched20/clipboard.c index 15ce97b943f..f7514a2ad85 100644 --- a/reactos/dll/win32/riched20/clipboard.c +++ b/reactos/dll/win32/riched20/clipboard.c @@ -25,7 +25,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(richedit); static UINT cfRTF = 0; typedef struct DataObjectImpl { - const IDataObjectVtbl *lpVtbl; + IDataObject IDataObject_iface; LONG ref; FORMATETC *fmtetc; @@ -36,7 +36,7 @@ typedef struct DataObjectImpl { } DataObjectImpl; typedef struct EnumFormatImpl { - const IEnumFORMATETCVtbl *lpVtbl; + IEnumFORMATETC IEnumFORMATETC_iface; LONG ref; FORMATETC *fmtetc; @@ -47,9 +47,19 @@ typedef struct EnumFormatImpl { static HRESULT EnumFormatImpl_Create(const FORMATETC *fmtetc, UINT size, LPENUMFORMATETC *lplpformatetc); +static inline DataObjectImpl *impl_from_IDataObject(IDataObject *iface) +{ + return CONTAINING_RECORD(iface, DataObjectImpl, IDataObject_iface); +} + +static inline EnumFormatImpl *impl_from_IEnumFORMATETC(IEnumFORMATETC *iface) +{ + return CONTAINING_RECORD(iface, EnumFormatImpl, IEnumFORMATETC_iface); +} + static HRESULT WINAPI EnumFormatImpl_QueryInterface(IEnumFORMATETC *iface, REFIID riid, LPVOID *ppvObj) { - EnumFormatImpl *This = (EnumFormatImpl*)iface; + EnumFormatImpl *This = impl_from_IEnumFORMATETC(iface); TRACE("%p %s\n", This, debugstr_guid(riid)); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumFORMATETC)) { @@ -63,7 +73,7 @@ static HRESULT WINAPI EnumFormatImpl_QueryInterface(IEnumFORMATETC *iface, REFII static ULONG WINAPI EnumFormatImpl_AddRef(IEnumFORMATETC *iface) { - EnumFormatImpl *This = (EnumFormatImpl*)iface; + EnumFormatImpl *This = impl_from_IEnumFORMATETC(iface); LONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); return ref; @@ -71,7 +81,7 @@ static ULONG WINAPI EnumFormatImpl_AddRef(IEnumFORMATETC *iface) static ULONG WINAPI EnumFormatImpl_Release(IEnumFORMATETC *iface) { - EnumFormatImpl *This = (EnumFormatImpl*)iface; + EnumFormatImpl *This = impl_from_IEnumFORMATETC(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); @@ -86,7 +96,7 @@ static ULONG WINAPI EnumFormatImpl_Release(IEnumFORMATETC *iface) static HRESULT WINAPI EnumFormatImpl_Next(IEnumFORMATETC *iface, ULONG celt, FORMATETC *rgelt, ULONG *pceltFetched) { - EnumFormatImpl *This = (EnumFormatImpl*)iface; + EnumFormatImpl *This = impl_from_IEnumFORMATETC(iface); ULONG count = 0; TRACE("(%p)->(%d %p %p)\n", This, celt, rgelt, pceltFetched); @@ -105,7 +115,7 @@ static HRESULT WINAPI EnumFormatImpl_Next(IEnumFORMATETC *iface, ULONG celt, static HRESULT WINAPI EnumFormatImpl_Skip(IEnumFORMATETC *iface, ULONG celt) { - EnumFormatImpl *This = (EnumFormatImpl*)iface; + EnumFormatImpl *This = impl_from_IEnumFORMATETC(iface); ULONG count = 0; TRACE("(%p)->(%d)\n", This, celt); @@ -116,7 +126,7 @@ static HRESULT WINAPI EnumFormatImpl_Skip(IEnumFORMATETC *iface, ULONG celt) static HRESULT WINAPI EnumFormatImpl_Reset(IEnumFORMATETC *iface) { - EnumFormatImpl *This = (EnumFormatImpl*)iface; + EnumFormatImpl *This = impl_from_IEnumFORMATETC(iface); TRACE("(%p)\n", This); This->cur = 0; @@ -125,7 +135,7 @@ static HRESULT WINAPI EnumFormatImpl_Reset(IEnumFORMATETC *iface) static HRESULT WINAPI EnumFormatImpl_Clone(IEnumFORMATETC *iface, IEnumFORMATETC **ppenum) { - EnumFormatImpl *This = (EnumFormatImpl*)iface; + EnumFormatImpl *This = impl_from_IEnumFORMATETC(iface); HRESULT hr; TRACE("(%p)->(%p)\n", This, ppenum); @@ -153,7 +163,7 @@ static HRESULT EnumFormatImpl_Create(const FORMATETC *fmtetc, UINT fmtetc_cnt, I TRACE("\n"); ret = heap_alloc(sizeof(EnumFormatImpl)); - ret->lpVtbl = &VT_EnumFormatImpl; + ret->IEnumFORMATETC_iface.lpVtbl = &VT_EnumFormatImpl; ret->ref = 1; ret->cur = 0; ret->fmtetc_cnt = fmtetc_cnt; @@ -165,7 +175,7 @@ static HRESULT EnumFormatImpl_Create(const FORMATETC *fmtetc, UINT fmtetc_cnt, I static HRESULT WINAPI DataObjectImpl_QueryInterface(IDataObject *iface, REFIID riid, LPVOID *ppvObj) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); TRACE("(%p)->(%s)\n", This, debugstr_guid(riid)); if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDataObject)) { @@ -179,7 +189,7 @@ static HRESULT WINAPI DataObjectImpl_QueryInterface(IDataObject *iface, REFIID r static ULONG WINAPI DataObjectImpl_AddRef(IDataObject* iface) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); return ref; @@ -187,7 +197,7 @@ static ULONG WINAPI DataObjectImpl_AddRef(IDataObject* iface) static ULONG WINAPI DataObjectImpl_Release(IDataObject* iface) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n",This, ref); @@ -203,7 +213,7 @@ static ULONG WINAPI DataObjectImpl_Release(IDataObject* iface) static HRESULT WINAPI DataObjectImpl_GetData(IDataObject* iface, FORMATETC *pformatetc, STGMEDIUM *pmedium) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); TRACE("(%p)->(fmt=0x%08x tym=0x%08x)\n", This, pformatetc->cfFormat, pformatetc->tymed); if(pformatetc->lindex != -1) @@ -227,14 +237,14 @@ static HRESULT WINAPI DataObjectImpl_GetData(IDataObject* iface, FORMATETC *pfor static HRESULT WINAPI DataObjectImpl_GetDataHere(IDataObject* iface, FORMATETC *pformatetc, STGMEDIUM *pmedium) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); FIXME("(%p): stub\n", This); return E_NOTIMPL; } static HRESULT WINAPI DataObjectImpl_QueryGetData(IDataObject* iface, FORMATETC *pformatetc) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); UINT i; BOOL foundFormat = FALSE; TRACE("(%p)->(fmt=0x%08x tym=0x%08x)\n", This, pformatetc->cfFormat, pformatetc->tymed); @@ -255,7 +265,7 @@ static HRESULT WINAPI DataObjectImpl_QueryGetData(IDataObject* iface, FORMATETC static HRESULT WINAPI DataObjectImpl_GetCanonicalFormatEtc(IDataObject* iface, FORMATETC *pformatetcIn, FORMATETC *pformatetcOut) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); TRACE("(%p)->(%p,%p)\n", This, pformatetcIn, pformatetcOut); if(pformatetcOut) { @@ -268,7 +278,7 @@ static HRESULT WINAPI DataObjectImpl_GetCanonicalFormatEtc(IDataObject* iface, F static HRESULT WINAPI DataObjectImpl_SetData(IDataObject* iface, FORMATETC *pformatetc, STGMEDIUM *pmedium, BOOL fRelease) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); FIXME("(%p): stub\n", This); return E_NOTIMPL; } @@ -276,7 +286,7 @@ static HRESULT WINAPI DataObjectImpl_SetData(IDataObject* iface, FORMATETC *pfor static HRESULT WINAPI DataObjectImpl_EnumFormatEtc(IDataObject* iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); TRACE("(%p)->(%d)\n", This, dwDirection); if(dwDirection != DATADIR_GET) { @@ -291,21 +301,21 @@ static HRESULT WINAPI DataObjectImpl_EnumFormatEtc(IDataObject* iface, DWORD dwD static HRESULT WINAPI DataObjectImpl_DAdvise(IDataObject* iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); FIXME("(%p): stub\n", This); return E_NOTIMPL; } static HRESULT WINAPI DataObjectImpl_DUnadvise(IDataObject* iface, DWORD dwConnection) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); FIXME("(%p): stub\n", This); return E_NOTIMPL; } static HRESULT WINAPI DataObjectImpl_EnumDAdvise(IDataObject* iface, IEnumSTATDATA **ppenumAdvise) { - DataObjectImpl *This = (DataObjectImpl*)iface; + DataObjectImpl *This = impl_from_IDataObject(iface); FIXME("(%p): stub\n", This); return E_NOTIMPL; } @@ -399,7 +409,7 @@ HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start, if(cfRTF == 0) cfRTF = RegisterClipboardFormatA("Rich Text Format"); - obj->lpVtbl = &VT_DataObjectImpl; + obj->IDataObject_iface.lpVtbl = &VT_DataObjectImpl; obj->ref = 1; obj->unicode = get_unicode_text(editor, start, nChars); obj->rtf = NULL; diff --git a/reactos/dll/win32/riched20/editor.c b/reactos/dll/win32/riched20/editor.c index 14ae16b88b9..5dda1ea3c0b 100644 --- a/reactos/dll/win32/riched20/editor.c +++ b/reactos/dll/win32/riched20/editor.c @@ -285,9 +285,10 @@ static LRESULT ME_StreamInText(ME_TextEditor *editor, DWORD dwFormat, ME_InStrea { WCHAR wszText[STREAMIN_BUFFER_SIZE+1]; WCHAR *pText; - + LRESULT total_bytes_read = 0; + TRACE("%08x %p\n", dwFormat, stream); - + do { LONG nWideChars = 0; @@ -298,8 +299,9 @@ static LRESULT ME_StreamInText(ME_TextEditor *editor, DWORD dwFormat, ME_InStrea break; if (!stream->dwSize) break; + total_bytes_read += stream->dwSize; } - + if (!(dwFormat & SF_UNICODE)) { /* FIXME? this is doomed to fail on true MBCS like UTF-8, luckily they're unlikely to be used as CP_ACP */ @@ -311,15 +313,13 @@ static LRESULT ME_StreamInText(ME_TextEditor *editor, DWORD dwFormat, ME_InStrea nWideChars = stream->dwSize >> 1; pText = (WCHAR *)stream->buffer; } - + ME_InsertTextFromCursor(editor, 0, pText, nWideChars, style); if (stream->dwSize == 0) break; stream->dwSize = 0; } while(1); - ME_CommitUndo(editor); - ME_UpdateRepaint(editor); - return 0; + return total_bytes_read; } static void ME_ApplyBorderProperties(RTF_Info *info, @@ -666,6 +666,7 @@ void ME_RTFParAttrHook(RTF_Info *info) fmt.dyLineSpacing = info->rtfParam; fmt.bLineSpacingRule = 4; } + break; case rtfSpaceMultiply: fmt.dwMask = PFM_LINESPACING; fmt.dyLineSpacing = info->rtfParam * 20; @@ -1391,6 +1392,7 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre ME_InStream inStream; BOOL invalidRTF = FALSE; ME_Cursor *selStart, *selEnd; + LRESULT num_read = 0; /* bytes read for SF_TEXT, non-control chars inserted for SF_RTF */ TRACE("stream==%p editor==%p format==0x%X\n", stream, editor, format); editor->nEventMask = 0; @@ -1468,6 +1470,8 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre if (!invalidRTF && !inStream.editstream->dwError) { if (format & SF_RTF) { + from = ME_GetCursorOfs(&editor->pCursors[0]); + /* setup the RTF parser */ memset(&parser, 0, sizeof parser); RTFSetEditStream(&parser, &inStream); @@ -1561,11 +1565,13 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre } } } + to = ME_GetCursorOfs(&editor->pCursors[0]); + num_read = to - from; style = parser.style; } else if (format & SF_TEXT) - ME_StreamInText(editor, format, &inStream, style); + num_read = ME_StreamInText(editor, format, &inStream, style); else ERR("EM_STREAMIN without SF_TEXT or SF_RTF\n"); /* put the cursor at the top */ @@ -1585,7 +1591,7 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre ME_ReleaseStyle(style); editor->nEventMask = nEventMask; - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); if (!(format & SFF_SELECTION)) { ME_ClearTempStyle(editor); } @@ -1595,7 +1601,7 @@ static LRESULT ME_StreamIn(ME_TextEditor *editor, DWORD format, EDITSTREAM *stre ME_SendSelChange(editor); ME_SendRequestResize(editor, FALSE); - return 0; + return num_read; } @@ -2139,7 +2145,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey) return TRUE; ME_MoveCursorFromTableRowStartParagraph(editor); ME_UpdateSelectionLinkAttribute(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); ME_SendRequestResize(editor, FALSE); return TRUE; case VK_RETURN: @@ -2195,7 +2201,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey) editor->pCursors[1] = editor->pCursors[0]; ME_CommitUndo(editor); ME_CheckTablesForCorruption(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return TRUE; } else if (para == editor->pCursors[1].pPara && @@ -2220,7 +2226,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey) para->member.para.next_para->member.para.nFlags |= MEPF_ROWSTART; ME_CommitCoalescingUndo(editor); ME_CheckTablesForCorruption(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return TRUE; } } else { /* v1.0 - 3.0 */ @@ -2237,7 +2243,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey) editor->pCursors[0].nOffset = 0; editor->pCursors[1] = editor->pCursors[0]; ME_CommitCoalescingUndo(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return TRUE; } } else { @@ -2264,7 +2270,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey) editor->pCursors[1] = editor->pCursors[0]; } ME_CommitCoalescingUndo(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return TRUE; } } @@ -2282,7 +2288,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey) SetCursor(NULL); ME_UpdateSelectionLinkAttribute(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); } return TRUE; } @@ -2321,7 +2327,7 @@ ME_KeyDown(ME_TextEditor *editor, WORD nKey) { ME_InternalDeleteText(editor, selStart, nChars, FALSE); ME_CommitUndo(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, TRUE); } return result; } @@ -2451,7 +2457,7 @@ static LRESULT ME_Char(ME_TextEditor *editor, WPARAM charCode, } ME_UpdateSelectionLinkAttribute(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); } return 0; } @@ -3301,7 +3307,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, editor->nModifyStep = oldModify; ME_EmptyUndoStack(editor); } - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return len; } case EM_SETBKGNDCOLOR: @@ -3361,26 +3367,27 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, BOOL bRepaint = TRUE; p = ME_ToCF2W(&buf, (CHARFORMAT2W *)lParam); if (p == NULL) return 0; - if (!wParam) - ME_SetDefaultCharFormat(editor, p); - else if (wParam == (SCF_WORD | SCF_SELECTION)) { - FIXME("EM_SETCHARFORMAT: word selection not supported\n"); - return 0; - } else if (wParam == SCF_ALL) { - if (editor->mode & TM_PLAINTEXT) + if (wParam & SCF_ALL) { + if (editor->mode & TM_PLAINTEXT) { ME_SetDefaultCharFormat(editor, p); - else { + } else { ME_Cursor start; ME_SetCursorToStart(editor, &start); ME_SetCharFormat(editor, &start, NULL, p); editor->nModifyStep = 1; } - } else if (editor->mode & TM_PLAINTEXT) { - return 0; - } else { + } else if (wParam & SCF_SELECTION) { + if (editor->mode & TM_PLAINTEXT) + return 0; + if (wParam & SCF_WORD) { + FIXME("EM_SETCHARFORMAT: word selection not supported\n"); + return 0; + } bRepaint = ME_IsSelection(editor); ME_SetSelectionCharFormat(editor, p); if (bRepaint) editor->nModifyStep = 1; + } else { /* SCF_DEFAULT */ + ME_SetDefaultCharFormat(editor, p); } ME_CommitUndo(editor); if (bRepaint) @@ -3462,7 +3469,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, int nStartCursor = ME_GetSelectionOfs(editor, &from, &to); ME_InternalDeleteText(editor, &editor->pCursors[nStartCursor], to-from, FALSE); ME_CommitUndo(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, TRUE); return 0; } case EM_REPLACESEL: @@ -3490,7 +3497,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, ME_UpdateSelectionLinkAttribute(editor); if (!wParam) ME_EmptyUndoStack(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return len; } case EM_SCROLLCARET: @@ -3568,7 +3575,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, editor->nModifyStep = 0; ME_CommitUndo(editor); ME_EmptyUndoStack(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return 1; } case EM_CANPASTE: @@ -3594,7 +3601,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, { ME_InternalDeleteText(editor, selStart, nChars, FALSE); ME_CommitUndo(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, TRUE); } return 0; } @@ -4248,7 +4255,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, editor->imeStartIndex=ME_GetCursorOfs(&editor->pCursors[0]); ME_DeleteSelection(editor); ME_CommitUndo(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return 0; } case WM_IME_COMPOSITION: @@ -4280,7 +4287,7 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, } ME_ReleaseStyle(style); ME_CommitUndo(editor); - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return 0; } case WM_IME_ENDCOMPOSITION: @@ -4318,35 +4325,37 @@ LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, return editor->mode; case EM_SETTEXTMODE: { - LRESULT ret; int mask = 0; int changes = 0; - GETTEXTLENGTHEX how; - /* CR/LF conversion required in 2.0 mode, verbatim in 1.0 mode */ - how.flags = GTL_CLOSE | (editor->bEmulateVersion10 ? 0 : GTL_USECRLF) | GTL_NUMCHARS; - how.codepage = unicode ? 1200 : CP_ACP; - ret = ME_GetTextLengthEx(editor, &how); - if (!ret) + if (ME_GetTextLength(editor) || editor->pUndoStack || editor->pRedoStack) + return E_UNEXPECTED; + + /* Check for mutually exclusive flags in adjacent bits of wParam */ + if ((wParam & (TM_RICHTEXT | TM_MULTILEVELUNDO | TM_MULTICODEPAGE)) & + (wParam & (TM_PLAINTEXT | TM_SINGLELEVELUNDO | TM_SINGLECODEPAGE)) << 1) + return E_INVALIDARG; + + if (wParam & (TM_RICHTEXT | TM_PLAINTEXT)) { - /*Check for valid wParam*/ - if ((((wParam & TM_RICHTEXT) && ((wParam & TM_PLAINTEXT) << 1))) || - (((wParam & TM_MULTILEVELUNDO) && ((wParam & TM_SINGLELEVELUNDO) << 1))) || - (((wParam & TM_MULTICODEPAGE) && ((wParam & TM_SINGLECODEPAGE) << 1)))) - return 1; - else - { - if (wParam & (TM_RICHTEXT | TM_PLAINTEXT)) - { - mask |= (TM_RICHTEXT | TM_PLAINTEXT); - changes |= (wParam & (TM_RICHTEXT | TM_PLAINTEXT)); - } - /*FIXME: Currently no support for undo level and code page options*/ - editor->mode = (editor->mode & (~mask)) | changes; - return 0; + mask |= TM_RICHTEXT | TM_PLAINTEXT; + changes |= wParam & (TM_RICHTEXT | TM_PLAINTEXT); + if (wParam & TM_PLAINTEXT) { + /* Clear selection since it should be possible to select the + * end of text run for rich text */ + ME_InvalidateSelection(editor); + ME_SetCursorToStart(editor, &editor->pCursors[0]); + editor->pCursors[1] = editor->pCursors[0]; + /* plain text can only have the default style. */ + ME_ClearTempStyle(editor); + ME_AddRefStyle(editor->pBuffer->pDefaultStyle); + ME_ReleaseStyle(editor->pCursors[0].pRun->member.run.style); + editor->pCursors[0].pRun->member.run.style = editor->pBuffer->pDefaultStyle; } } - return ret; + /* FIXME: Currently no support for undo level and code page options */ + editor->mode = (editor->mode & ~mask) | changes; + return 0; } case EM_SETPASSWORDCHAR: { @@ -4421,6 +4430,8 @@ static LRESULT RichEditWndProc_common(HWND hWnd, UINT msg, WPARAM wParam, PAINTSTRUCT ps; hDC = BeginPaint(editor->hWnd, &ps); + if (!editor->bEmulateVersion10 || (editor->nEventMask & ENM_UPDATE)) + ME_SendOldNotify(editor, EN_UPDATE); /* Erase area outside of the formatting rectangle */ if (ps.rcPaint.top < editor->rcFormat.top) { diff --git a/reactos/dll/win32/riched20/editor.h b/reactos/dll/win32/riched20/editor.h index 9739eeab95b..8cded5110a6 100644 --- a/reactos/dll/win32/riched20/editor.h +++ b/reactos/dll/win32/riched20/editor.h @@ -23,7 +23,7 @@ struct _RTF_Info; -extern HANDLE me_heap; +extern HANDLE me_heap DECLSPEC_HIDDEN; static inline void * __WINE_ALLOC_SIZE(1) heap_alloc( size_t len ) { @@ -57,51 +57,51 @@ static inline void * __WINE_ALLOC_SIZE(2) heap_realloc( void *ptr, size_t len ) }; /* style.c */ -ME_Style *ME_MakeStyle(CHARFORMAT2W *style); -void ME_AddRefStyle(ME_Style *item); -void ME_ReleaseStyle(ME_Style *item); -ME_Style *ME_GetInsertStyle(ME_TextEditor *editor, int nCursor); -ME_Style *ME_ApplyStyle(ME_Style *sSrc, CHARFORMAT2W *style); -HFONT ME_SelectStyleFont(ME_Context *c, ME_Style *s); -void ME_UnselectStyleFont(ME_Context *c, ME_Style *s, HFONT hOldFont); -void ME_InitCharFormat2W(CHARFORMAT2W *pFmt); -void ME_SaveTempStyle(ME_TextEditor *editor); -void ME_ClearTempStyle(ME_TextEditor *editor); -void ME_DumpStyleToBuf(CHARFORMAT2W *pFmt, char buf[2048]); -void ME_DumpStyle(ME_Style *s); -CHARFORMAT2W *ME_ToCF2W(CHARFORMAT2W *to, CHARFORMAT2W *from); -void ME_CopyToCFAny(CHARFORMAT2W *to, CHARFORMAT2W *from); -void ME_CopyCharFormat(CHARFORMAT2W *pDest, const CHARFORMAT2W *pSrc); /* only works with 2W structs */ -void ME_CharFormatFromLogFont(HDC hDC, const LOGFONTW *lf, CHARFORMAT2W *fmt); /* ditto */ +ME_Style *ME_MakeStyle(CHARFORMAT2W *style) DECLSPEC_HIDDEN; +void ME_AddRefStyle(ME_Style *item) DECLSPEC_HIDDEN; +void ME_ReleaseStyle(ME_Style *item) DECLSPEC_HIDDEN; +ME_Style *ME_GetInsertStyle(ME_TextEditor *editor, int nCursor) DECLSPEC_HIDDEN; +ME_Style *ME_ApplyStyle(ME_Style *sSrc, CHARFORMAT2W *style) DECLSPEC_HIDDEN; +HFONT ME_SelectStyleFont(ME_Context *c, ME_Style *s) DECLSPEC_HIDDEN; +void ME_UnselectStyleFont(ME_Context *c, ME_Style *s, HFONT hOldFont) DECLSPEC_HIDDEN; +void ME_InitCharFormat2W(CHARFORMAT2W *pFmt) DECLSPEC_HIDDEN; +void ME_SaveTempStyle(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_ClearTempStyle(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_DumpStyleToBuf(CHARFORMAT2W *pFmt, char buf[2048]) DECLSPEC_HIDDEN; +void ME_DumpStyle(ME_Style *s) DECLSPEC_HIDDEN; +CHARFORMAT2W *ME_ToCF2W(CHARFORMAT2W *to, CHARFORMAT2W *from) DECLSPEC_HIDDEN; +void ME_CopyToCFAny(CHARFORMAT2W *to, CHARFORMAT2W *from) DECLSPEC_HIDDEN; +void ME_CopyCharFormat(CHARFORMAT2W *pDest, const CHARFORMAT2W *pSrc) DECLSPEC_HIDDEN; /* only works with 2W structs */ +void ME_CharFormatFromLogFont(HDC hDC, const LOGFONTW *lf, CHARFORMAT2W *fmt) DECLSPEC_HIDDEN; /* ditto */ /* list.c */ -void ME_InsertBefore(ME_DisplayItem *diWhere, ME_DisplayItem *diWhat); -void ME_Remove(ME_DisplayItem *diWhere); -BOOL ME_NextRun(ME_DisplayItem **para, ME_DisplayItem **run); -BOOL ME_PrevRun(ME_DisplayItem **para, ME_DisplayItem **run); -ME_DisplayItem *ME_FindItemBack(ME_DisplayItem *di, ME_DIType nTypeOrClass); -ME_DisplayItem *ME_FindItemFwd(ME_DisplayItem *di, ME_DIType nTypeOrClass); -ME_DisplayItem *ME_FindItemBackOrHere(ME_DisplayItem *di, ME_DIType nTypeOrClass); -ME_DisplayItem *ME_MakeDI(ME_DIType type); -void ME_DestroyDisplayItem(ME_DisplayItem *item); -void ME_DumpDocument(ME_TextBuffer *buffer); -const char *ME_GetDITypeName(ME_DIType type); +void ME_InsertBefore(ME_DisplayItem *diWhere, ME_DisplayItem *diWhat) DECLSPEC_HIDDEN; +void ME_Remove(ME_DisplayItem *diWhere) DECLSPEC_HIDDEN; +BOOL ME_NextRun(ME_DisplayItem **para, ME_DisplayItem **run) DECLSPEC_HIDDEN; +BOOL ME_PrevRun(ME_DisplayItem **para, ME_DisplayItem **run) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_FindItemBack(ME_DisplayItem *di, ME_DIType nTypeOrClass) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_FindItemFwd(ME_DisplayItem *di, ME_DIType nTypeOrClass) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_FindItemBackOrHere(ME_DisplayItem *di, ME_DIType nTypeOrClass) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_MakeDI(ME_DIType type) DECLSPEC_HIDDEN; +void ME_DestroyDisplayItem(ME_DisplayItem *item) DECLSPEC_HIDDEN; +void ME_DumpDocument(ME_TextBuffer *buffer) DECLSPEC_HIDDEN; +const char *ME_GetDITypeName(ME_DIType type) DECLSPEC_HIDDEN; /* string.c */ -ME_String *ME_MakeStringN(LPCWSTR szText, int nMaxChars); -ME_String *ME_MakeStringR(WCHAR cRepeat, int nMaxChars); -ME_String *ME_StrDup(const ME_String *s); -void ME_DestroyString(ME_String *s); -void ME_AppendString(ME_String *s1, const ME_String *s2); -ME_String *ME_VSplitString(ME_String *orig, int nVPos); -int ME_IsWhitespaces(const ME_String *s); -int ME_IsSplitable(const ME_String *s); -int ME_FindNonWhitespaceV(const ME_String *s, int nVChar); -int ME_CallWordBreakProc(ME_TextEditor *editor, ME_String *str, INT start, INT code); -void ME_StrDeleteV(ME_String *s, int nVChar, int nChars); +ME_String *ME_MakeStringN(LPCWSTR szText, int nMaxChars) DECLSPEC_HIDDEN; +ME_String *ME_MakeStringR(WCHAR cRepeat, int nMaxChars) DECLSPEC_HIDDEN; +ME_String *ME_StrDup(const ME_String *s) DECLSPEC_HIDDEN; +void ME_DestroyString(ME_String *s) DECLSPEC_HIDDEN; +void ME_AppendString(ME_String *s1, const ME_String *s2) DECLSPEC_HIDDEN; +ME_String *ME_VSplitString(ME_String *orig, int nVPos) DECLSPEC_HIDDEN; +int ME_IsWhitespaces(const ME_String *s) DECLSPEC_HIDDEN; +int ME_IsSplitable(const ME_String *s) DECLSPEC_HIDDEN; +int ME_FindNonWhitespaceV(const ME_String *s, int nVChar) DECLSPEC_HIDDEN; +int ME_CallWordBreakProc(ME_TextEditor *editor, ME_String *str, INT start, INT code) DECLSPEC_HIDDEN; +void ME_StrDeleteV(ME_String *s, int nVChar, int nChars) DECLSPEC_HIDDEN; /* smart helpers for A<->W conversions, they reserve/free memory and call MultiByte<->WideChar functions */ -LPWSTR ME_ToUnicode(BOOL unicode, LPVOID psz); -void ME_EndToUnicode(BOOL unicode, LPVOID psz); +LPWSTR ME_ToUnicode(BOOL unicode, LPVOID psz) DECLSPEC_HIDDEN; +void ME_EndToUnicode(BOOL unicode, LPVOID psz) DECLSPEC_HIDDEN; static inline int ME_IsWSpace(WCHAR ch) { @@ -115,162 +115,162 @@ static inline int ME_CharCompare(WCHAR a, WCHAR b, int caseSensitive) /* note: those two really return the first matching offset (starting from EOS)+1 * in other words, an offset of the first trailing white/black */ -int ME_ReverseFindNonWhitespaceV(const ME_String *s, int nVChar); -int ME_ReverseFindWhitespaceV(const ME_String *s, int nVChar); +int ME_ReverseFindNonWhitespaceV(const ME_String *s, int nVChar) DECLSPEC_HIDDEN; +int ME_ReverseFindWhitespaceV(const ME_String *s, int nVChar) DECLSPEC_HIDDEN; /* row.c */ -ME_DisplayItem *ME_RowStart(ME_DisplayItem *item); +ME_DisplayItem *ME_RowStart(ME_DisplayItem *item) DECLSPEC_HIDDEN; /* ME_DisplayItem *ME_RowEnd(ME_DisplayItem *item); */ -ME_DisplayItem *ME_FindRowWithNumber(ME_TextEditor *editor, int nRow); -int ME_RowNumberFromCharOfs(ME_TextEditor *editor, int nOfs); +ME_DisplayItem *ME_FindRowWithNumber(ME_TextEditor *editor, int nRow) DECLSPEC_HIDDEN; +int ME_RowNumberFromCharOfs(ME_TextEditor *editor, int nOfs) DECLSPEC_HIDDEN; /* run.c */ -ME_DisplayItem *ME_MakeRun(ME_Style *s, ME_String *strData, int nFlags); +ME_DisplayItem *ME_MakeRun(ME_Style *s, ME_String *strData, int nFlags) DECLSPEC_HIDDEN; ME_DisplayItem *ME_InsertRunAtCursor(ME_TextEditor *editor, ME_Cursor *cursor, - ME_Style *style, const WCHAR *str, int len, int flags); -void ME_CheckCharOffsets(ME_TextEditor *editor); -void ME_PropagateCharOffset(ME_DisplayItem *p, int shift); -int ME_CharFromPoint(ME_Context *c, int cx, ME_Run *run); + ME_Style *style, const WCHAR *str, int len, int flags) DECLSPEC_HIDDEN; +void ME_CheckCharOffsets(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_PropagateCharOffset(ME_DisplayItem *p, int shift) DECLSPEC_HIDDEN; +int ME_CharFromPoint(ME_Context *c, int cx, ME_Run *run) DECLSPEC_HIDDEN; /* this one accounts for 1/2 char tolerance */ -int ME_CharFromPointCursor(ME_TextEditor *editor, int cx, ME_Run *run); -int ME_PointFromChar(ME_TextEditor *editor, ME_Run *pRun, int nOffset); -int ME_CanJoinRuns(const ME_Run *run1, const ME_Run *run2); -void ME_JoinRuns(ME_TextEditor *editor, ME_DisplayItem *p); -ME_DisplayItem *ME_SplitRun(ME_WrapContext *wc, ME_DisplayItem *item, int nChar); -ME_DisplayItem *ME_SplitRunSimple(ME_TextEditor *editor, ME_DisplayItem *item, int nChar); -void ME_UpdateRunFlags(ME_TextEditor *editor, ME_Run *run); -void ME_CalcRunExtent(ME_Context *c, const ME_Paragraph *para, int startx, ME_Run *run); -SIZE ME_GetRunSize(ME_Context *c, const ME_Paragraph *para, ME_Run *run, int nLen, int startx); -void ME_CursorFromCharOfs(ME_TextEditor *editor, int nCharOfs, ME_Cursor *pCursor); -void ME_RunOfsFromCharOfs(ME_TextEditor *editor, int nCharOfs, ME_DisplayItem **ppPara, ME_DisplayItem **ppRun, int *pOfs); -int ME_CharOfsFromRunOfs(ME_TextEditor *editor, const ME_DisplayItem *pPara, const ME_DisplayItem *pRun, int nOfs); -void ME_SkipAndPropagateCharOffset(ME_DisplayItem *p, int shift); -void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, CHARFORMAT2W *pFmt); -void ME_SetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt); +int ME_CharFromPointCursor(ME_TextEditor *editor, int cx, ME_Run *run) DECLSPEC_HIDDEN; +int ME_PointFromChar(ME_TextEditor *editor, ME_Run *pRun, int nOffset) DECLSPEC_HIDDEN; +int ME_CanJoinRuns(const ME_Run *run1, const ME_Run *run2) DECLSPEC_HIDDEN; +void ME_JoinRuns(ME_TextEditor *editor, ME_DisplayItem *p) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_SplitRun(ME_WrapContext *wc, ME_DisplayItem *item, int nChar) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_SplitRunSimple(ME_TextEditor *editor, ME_Cursor *cursor) DECLSPEC_HIDDEN; +void ME_UpdateRunFlags(ME_TextEditor *editor, ME_Run *run) DECLSPEC_HIDDEN; +void ME_CalcRunExtent(ME_Context *c, const ME_Paragraph *para, int startx, ME_Run *run) DECLSPEC_HIDDEN; +SIZE ME_GetRunSize(ME_Context *c, const ME_Paragraph *para, ME_Run *run, int nLen, int startx) DECLSPEC_HIDDEN; +void ME_CursorFromCharOfs(ME_TextEditor *editor, int nCharOfs, ME_Cursor *pCursor) DECLSPEC_HIDDEN; +void ME_RunOfsFromCharOfs(ME_TextEditor *editor, int nCharOfs, ME_DisplayItem **ppPara, ME_DisplayItem **ppRun, int *pOfs) DECLSPEC_HIDDEN; +int ME_CharOfsFromRunOfs(ME_TextEditor *editor, const ME_DisplayItem *pPara, const ME_DisplayItem *pRun, int nOfs) DECLSPEC_HIDDEN; +void ME_SkipAndPropagateCharOffset(ME_DisplayItem *p, int shift) DECLSPEC_HIDDEN; +void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, CHARFORMAT2W *pFmt) DECLSPEC_HIDDEN; +void ME_SetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt) DECLSPEC_HIDDEN; void ME_GetCharFormat(ME_TextEditor *editor, const ME_Cursor *from, - const ME_Cursor *to, CHARFORMAT2W *pFmt); -void ME_GetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt); -void ME_GetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt); -void ME_SetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *mod); + const ME_Cursor *to, CHARFORMAT2W *pFmt) DECLSPEC_HIDDEN; +void ME_GetSelectionCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt) DECLSPEC_HIDDEN; +void ME_GetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *pFmt) DECLSPEC_HIDDEN; +void ME_SetDefaultCharFormat(ME_TextEditor *editor, CHARFORMAT2W *mod) DECLSPEC_HIDDEN; /* caret.c */ -void ME_SetCursorToStart(ME_TextEditor *editor, ME_Cursor *cursor); -int ME_SetSelection(ME_TextEditor *editor, int from, int to); -void ME_HideCaret(ME_TextEditor *ed); -void ME_ShowCaret(ME_TextEditor *ed); -void ME_MoveCaret(ME_TextEditor *ed); -BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y, ME_Cursor *cursor, BOOL *isExact); -void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum); -void ME_MouseMove(ME_TextEditor *editor, int x, int y); -BOOL ME_DeleteTextAtCursor(ME_TextEditor *editor, int nCursor, int nChars); +void ME_SetCursorToStart(ME_TextEditor *editor, ME_Cursor *cursor) DECLSPEC_HIDDEN; +int ME_SetSelection(ME_TextEditor *editor, int from, int to) DECLSPEC_HIDDEN; +void ME_HideCaret(ME_TextEditor *ed) DECLSPEC_HIDDEN; +void ME_ShowCaret(ME_TextEditor *ed) DECLSPEC_HIDDEN; +void ME_MoveCaret(ME_TextEditor *ed) DECLSPEC_HIDDEN; +BOOL ME_CharFromPos(ME_TextEditor *editor, int x, int y, ME_Cursor *cursor, BOOL *isExact) DECLSPEC_HIDDEN; +void ME_LButtonDown(ME_TextEditor *editor, int x, int y, int clickNum) DECLSPEC_HIDDEN; +void ME_MouseMove(ME_TextEditor *editor, int x, int y) DECLSPEC_HIDDEN; +BOOL ME_DeleteTextAtCursor(ME_TextEditor *editor, int nCursor, int nChars) DECLSPEC_HIDDEN; void ME_InsertTextFromCursor(ME_TextEditor *editor, int nCursor, - const WCHAR *str, int len, ME_Style *style); -void ME_InsertEndRowFromCursor(ME_TextEditor *editor, int nCursor); -int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs); -BOOL ME_ArrowKey(ME_TextEditor *ed, int nVKey, BOOL extend, BOOL ctrl); + const WCHAR *str, int len, ME_Style *style) DECLSPEC_HIDDEN; +void ME_InsertEndRowFromCursor(ME_TextEditor *editor, int nCursor) DECLSPEC_HIDDEN; +int ME_MoveCursorChars(ME_TextEditor *editor, ME_Cursor *cursor, int nRelOfs) DECLSPEC_HIDDEN; +BOOL ME_ArrowKey(ME_TextEditor *ed, int nVKey, BOOL extend, BOOL ctrl) DECLSPEC_HIDDEN; -int ME_GetCursorOfs(const ME_Cursor *cursor); -int ME_GetSelectionOfs(ME_TextEditor *editor, int *from, int *to); -int ME_GetSelection(ME_TextEditor *editor, ME_Cursor **from, ME_Cursor **to); -BOOL ME_IsSelection(ME_TextEditor *editor); -void ME_DeleteSelection(ME_TextEditor *editor); -void ME_SendSelChange(ME_TextEditor *editor); -void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCursor); -BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start, int nChars, BOOL bForce); -int ME_GetTextLength(ME_TextEditor *editor); -int ME_GetTextLengthEx(ME_TextEditor *editor, const GETTEXTLENGTHEX *how); -ME_Style *ME_GetSelectionInsertStyle(ME_TextEditor *editor); +int ME_GetCursorOfs(const ME_Cursor *cursor) DECLSPEC_HIDDEN; +int ME_GetSelectionOfs(ME_TextEditor *editor, int *from, int *to) DECLSPEC_HIDDEN; +int ME_GetSelection(ME_TextEditor *editor, ME_Cursor **from, ME_Cursor **to) DECLSPEC_HIDDEN; +BOOL ME_IsSelection(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_DeleteSelection(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_SendSelChange(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_InsertOLEFromCursor(ME_TextEditor *editor, const REOBJECT* reo, int nCursor) DECLSPEC_HIDDEN; +BOOL ME_InternalDeleteText(ME_TextEditor *editor, ME_Cursor *start, int nChars, BOOL bForce) DECLSPEC_HIDDEN; +int ME_GetTextLength(ME_TextEditor *editor) DECLSPEC_HIDDEN; +int ME_GetTextLengthEx(ME_TextEditor *editor, const GETTEXTLENGTHEX *how) DECLSPEC_HIDDEN; +ME_Style *ME_GetSelectionInsertStyle(ME_TextEditor *editor) DECLSPEC_HIDDEN; /* context.c */ -void ME_InitContext(ME_Context *c, ME_TextEditor *editor, HDC hDC); -void ME_DestroyContext(ME_Context *c); +void ME_InitContext(ME_Context *c, ME_TextEditor *editor, HDC hDC) DECLSPEC_HIDDEN; +void ME_DestroyContext(ME_Context *c) DECLSPEC_HIDDEN; /* wrap.c */ -BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor); -void ME_InvalidateMarkedParagraphs(ME_TextEditor *editor); -void ME_SendRequestResize(ME_TextEditor *editor, BOOL force); +BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_InvalidateMarkedParagraphs(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_SendRequestResize(ME_TextEditor *editor, BOOL force) DECLSPEC_HIDDEN; /* para.c */ -ME_DisplayItem *ME_GetParagraph(ME_DisplayItem *run); -void ME_GetSelectionParas(ME_TextEditor *editor, ME_DisplayItem **para, ME_DisplayItem **para_end); -void ME_MakeFirstParagraph(ME_TextEditor *editor); -ME_DisplayItem *ME_SplitParagraph(ME_TextEditor *editor, ME_DisplayItem *rp, ME_Style *style, ME_String *eol_str, int paraFlags); +ME_DisplayItem *ME_GetParagraph(ME_DisplayItem *run) DECLSPEC_HIDDEN; +void ME_GetSelectionParas(ME_TextEditor *editor, ME_DisplayItem **para, ME_DisplayItem **para_end) DECLSPEC_HIDDEN; +void ME_MakeFirstParagraph(ME_TextEditor *editor) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_SplitParagraph(ME_TextEditor *editor, ME_DisplayItem *rp, ME_Style *style, ME_String *eol_str, int paraFlags) DECLSPEC_HIDDEN; ME_DisplayItem *ME_JoinParagraphs(ME_TextEditor *editor, ME_DisplayItem *tp, - BOOL keepFirstParaFormat); -void ME_DumpParaStyle(ME_Paragraph *s); -void ME_DumpParaStyleToBuf(const PARAFORMAT2 *pFmt, char buf[2048]); -BOOL ME_SetSelectionParaFormat(ME_TextEditor *editor, const PARAFORMAT2 *pFmt); -void ME_GetSelectionParaFormat(ME_TextEditor *editor, PARAFORMAT2 *pFmt); + BOOL keepFirstParaFormat) DECLSPEC_HIDDEN; +void ME_DumpParaStyle(ME_Paragraph *s) DECLSPEC_HIDDEN; +void ME_DumpParaStyleToBuf(const PARAFORMAT2 *pFmt, char buf[2048]) DECLSPEC_HIDDEN; +BOOL ME_SetSelectionParaFormat(ME_TextEditor *editor, const PARAFORMAT2 *pFmt) DECLSPEC_HIDDEN; +void ME_GetSelectionParaFormat(ME_TextEditor *editor, PARAFORMAT2 *pFmt) DECLSPEC_HIDDEN; /* marks from first up to (but not including) last */ -void ME_MarkForPainting(ME_TextEditor *editor, ME_DisplayItem *first, const ME_DisplayItem *last); -void ME_MarkAllForWrapping(ME_TextEditor *editor); -void ME_SetDefaultParaFormat(PARAFORMAT2 *pFmt); +void ME_MarkForPainting(ME_TextEditor *editor, ME_DisplayItem *first, const ME_DisplayItem *last) DECLSPEC_HIDDEN; +void ME_MarkAllForWrapping(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_SetDefaultParaFormat(PARAFORMAT2 *pFmt) DECLSPEC_HIDDEN; /* paint.c */ -void ME_PaintContent(ME_TextEditor *editor, HDC hDC, BOOL bOnlyNew, const RECT *rcUpdate); -void ME_Repaint(ME_TextEditor *editor); -void ME_RewrapRepaint(ME_TextEditor *editor); -void ME_UpdateRepaint(ME_TextEditor *editor); -void ME_EnsureVisible(ME_TextEditor *editor, ME_Cursor *pCursor); -void ME_InvalidateSelection(ME_TextEditor *editor); -BOOL ME_SetZoom(ME_TextEditor *editor, int numerator, int denominator); -int ME_twips2pointsX(ME_Context *c, int x); -int ME_twips2pointsY(ME_Context *c, int y); +void ME_PaintContent(ME_TextEditor *editor, HDC hDC, BOOL bOnlyNew, const RECT *rcUpdate) DECLSPEC_HIDDEN; +void ME_Repaint(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_RewrapRepaint(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_UpdateRepaint(ME_TextEditor *editor, BOOL update_now) DECLSPEC_HIDDEN; +void ME_EnsureVisible(ME_TextEditor *editor, ME_Cursor *pCursor) DECLSPEC_HIDDEN; +void ME_InvalidateSelection(ME_TextEditor *editor) DECLSPEC_HIDDEN; +BOOL ME_SetZoom(ME_TextEditor *editor, int numerator, int denominator) DECLSPEC_HIDDEN; +int ME_twips2pointsX(const ME_Context *c, int x) DECLSPEC_HIDDEN; +int ME_twips2pointsY(const ME_Context *c, int y) DECLSPEC_HIDDEN; /* scroll functions in paint.c */ -void ME_ScrollAbs(ME_TextEditor *editor, int x, int y); -void ME_HScrollAbs(ME_TextEditor *editor, int x); -void ME_VScrollAbs(ME_TextEditor *editor, int y); -void ME_ScrollUp(ME_TextEditor *editor, int cy); -void ME_ScrollDown(ME_TextEditor *editor, int cy); -void ME_ScrollLeft(ME_TextEditor *editor, int cx); -void ME_ScrollRight(ME_TextEditor *editor, int cx); -void ME_UpdateScrollBar(ME_TextEditor *editor); +void ME_ScrollAbs(ME_TextEditor *editor, int x, int y) DECLSPEC_HIDDEN; +void ME_HScrollAbs(ME_TextEditor *editor, int x) DECLSPEC_HIDDEN; +void ME_VScrollAbs(ME_TextEditor *editor, int y) DECLSPEC_HIDDEN; +void ME_ScrollUp(ME_TextEditor *editor, int cy) DECLSPEC_HIDDEN; +void ME_ScrollDown(ME_TextEditor *editor, int cy) DECLSPEC_HIDDEN; +void ME_ScrollLeft(ME_TextEditor *editor, int cx) DECLSPEC_HIDDEN; +void ME_ScrollRight(ME_TextEditor *editor, int cx) DECLSPEC_HIDDEN; +void ME_UpdateScrollBar(ME_TextEditor *editor) DECLSPEC_HIDDEN; /* other functions in paint.c */ -int ME_GetParaBorderWidth(ME_Context *c, int flags); +int ME_GetParaBorderWidth(const ME_Context *c, int flags) DECLSPEC_HIDDEN; /* richole.c */ -LRESULT CreateIRichEditOle(ME_TextEditor *editor, LPVOID *); -void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run* run, ME_Paragraph *para, BOOL selected); -void ME_GetOLEObjectSize(ME_Context *c, ME_Run *run, SIZE *pSize); -void ME_CopyReObject(REOBJECT* dst, const REOBJECT* src); -void ME_DeleteReObject(REOBJECT* reo); +LRESULT CreateIRichEditOle(ME_TextEditor *editor, LPVOID *) DECLSPEC_HIDDEN; +void ME_DrawOLE(ME_Context *c, int x, int y, ME_Run* run, ME_Paragraph *para, BOOL selected) DECLSPEC_HIDDEN; +void ME_GetOLEObjectSize(const ME_Context *c, ME_Run *run, SIZE *pSize) DECLSPEC_HIDDEN; +void ME_CopyReObject(REOBJECT* dst, const REOBJECT* src) DECLSPEC_HIDDEN; +void ME_DeleteReObject(REOBJECT* reo) DECLSPEC_HIDDEN; /* editor.c */ -ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10); +ME_TextEditor *ME_MakeEditor(ITextHost *texthost, BOOL bEmulateVersion10) DECLSPEC_HIDDEN; LRESULT ME_HandleMessage(ME_TextEditor *editor, UINT msg, WPARAM wParam, - LPARAM lParam, BOOL unicode, HRESULT* phresult); -void ME_SendOldNotify(ME_TextEditor *editor, int nCode); + LPARAM lParam, BOOL unicode, HRESULT* phresult) DECLSPEC_HIDDEN; +void ME_SendOldNotify(ME_TextEditor *editor, int nCode) DECLSPEC_HIDDEN; int ME_GetTextW(ME_TextEditor *editor, WCHAR *buffer, int buflen, - const ME_Cursor *start, int srcChars, BOOL bCRLF); -void ME_RTFCharAttrHook(struct _RTF_Info *info); -void ME_RTFParAttrHook(struct _RTF_Info *info); -void ME_RTFTblAttrHook(struct _RTF_Info *info); -void ME_RTFSpecialCharHook(struct _RTF_Info *info); -void ME_StreamInFill(ME_InStream *stream); -extern int me_debug; + const ME_Cursor *start, int srcChars, BOOL bCRLF) DECLSPEC_HIDDEN; +void ME_RTFCharAttrHook(struct _RTF_Info *info) DECLSPEC_HIDDEN; +void ME_RTFParAttrHook(struct _RTF_Info *info) DECLSPEC_HIDDEN; +void ME_RTFTblAttrHook(struct _RTF_Info *info) DECLSPEC_HIDDEN; +void ME_RTFSpecialCharHook(struct _RTF_Info *info) DECLSPEC_HIDDEN; +void ME_StreamInFill(ME_InStream *stream) DECLSPEC_HIDDEN; +extern int me_debug DECLSPEC_HIDDEN; /* table.c */ -BOOL ME_IsInTable(ME_DisplayItem *pItem); -ME_DisplayItem *ME_InsertTableRowStartFromCursor(ME_TextEditor *editor); +BOOL ME_IsInTable(ME_DisplayItem *pItem) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_InsertTableRowStartFromCursor(ME_TextEditor *editor) DECLSPEC_HIDDEN; ME_DisplayItem *ME_InsertTableRowStartAtParagraph(ME_TextEditor *editor, - ME_DisplayItem *para); -ME_DisplayItem *ME_InsertTableCellFromCursor(ME_TextEditor *editor); -ME_DisplayItem *ME_InsertTableRowEndFromCursor(ME_TextEditor *editor); -ME_DisplayItem *ME_GetTableRowEnd(ME_DisplayItem *para); -ME_DisplayItem *ME_GetTableRowStart(ME_DisplayItem *para); -void ME_CheckTablesForCorruption(ME_TextEditor *editor); -void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nChars); -ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, ME_DisplayItem *table_row); -void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow); -void ME_MoveCursorFromTableRowStartParagraph(ME_TextEditor *editor); -struct RTFTable *ME_MakeTableDef(ME_TextEditor *editor); -void ME_InitTableDef(ME_TextEditor *editor, struct RTFTable *tableDef); + ME_DisplayItem *para) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_InsertTableCellFromCursor(ME_TextEditor *editor) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_InsertTableRowEndFromCursor(ME_TextEditor *editor) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_GetTableRowEnd(ME_DisplayItem *para) DECLSPEC_HIDDEN; +ME_DisplayItem *ME_GetTableRowStart(ME_DisplayItem *para) DECLSPEC_HIDDEN; +void ME_CheckTablesForCorruption(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_ProtectPartialTableDeletion(ME_TextEditor *editor, ME_Cursor *c, int *nChars) DECLSPEC_HIDDEN; +ME_DisplayItem* ME_AppendTableRow(ME_TextEditor *editor, ME_DisplayItem *table_row) DECLSPEC_HIDDEN; +void ME_TabPressedInTable(ME_TextEditor *editor, BOOL bSelectedRow) DECLSPEC_HIDDEN; +void ME_MoveCursorFromTableRowStartParagraph(ME_TextEditor *editor) DECLSPEC_HIDDEN; +struct RTFTable *ME_MakeTableDef(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_InitTableDef(ME_TextEditor *editor, struct RTFTable *tableDef) DECLSPEC_HIDDEN; /* txthost.c */ -ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion10); +ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion10) DECLSPEC_HIDDEN; #ifdef __i386__ /* Use wrappers to perform thiscall on i386 */ #define TXTHOST_VTABLE(This) (&itextHostStdcallVtbl) #else /* __i386__ */ @@ -318,17 +318,17 @@ ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion1 #define ITextHost_TxGetSelectionBarWidth(This,a) TXTHOST_VTABLE(This)->TxGetSelectionBarWidth(This,a) /* undo.c */ -ME_UndoItem *ME_AddUndoItem(ME_TextEditor *editor, ME_DIType type, const ME_DisplayItem *pdi); -void ME_CommitUndo(ME_TextEditor *editor); -void ME_ContinueCoalescingTransaction(ME_TextEditor *editor); -void ME_CommitCoalescingUndo(ME_TextEditor *editor); -BOOL ME_Undo(ME_TextEditor *editor); -BOOL ME_Redo(ME_TextEditor *editor); -void ME_EmptyUndoStack(ME_TextEditor *editor); +ME_UndoItem *ME_AddUndoItem(ME_TextEditor *editor, ME_DIType type, const ME_DisplayItem *pdi) DECLSPEC_HIDDEN; +void ME_CommitUndo(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_ContinueCoalescingTransaction(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_CommitCoalescingUndo(ME_TextEditor *editor) DECLSPEC_HIDDEN; +BOOL ME_Undo(ME_TextEditor *editor) DECLSPEC_HIDDEN; +BOOL ME_Redo(ME_TextEditor *editor) DECLSPEC_HIDDEN; +void ME_EmptyUndoStack(ME_TextEditor *editor) DECLSPEC_HIDDEN; /* writer.c */ -LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, const ME_Cursor *start, int nChars, EDITSTREAM *stream); -LRESULT ME_StreamOut(ME_TextEditor *editor, DWORD dwFormat, EDITSTREAM *stream); +LRESULT ME_StreamOutRange(ME_TextEditor *editor, DWORD dwFormat, const ME_Cursor *start, int nChars, EDITSTREAM *stream) DECLSPEC_HIDDEN; +LRESULT ME_StreamOut(ME_TextEditor *editor, DWORD dwFormat, EDITSTREAM *stream) DECLSPEC_HIDDEN; /* clipboard.c */ -HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start, int nChars, LPDATAOBJECT *lplpdataobj); +HRESULT ME_GetDataObject(ME_TextEditor *editor, const ME_Cursor *start, int nChars, LPDATAOBJECT *lplpdataobj) DECLSPEC_HIDDEN; diff --git a/reactos/dll/win32/riched20/editstr.h b/reactos/dll/win32/riched20/editstr.h index 9b8d645199e..5b5afaebce2 100644 --- a/reactos/dll/win32/riched20/editstr.h +++ b/reactos/dll/win32/riched20/editstr.h @@ -118,10 +118,6 @@ typedef enum { #define MERF_ENDWHITE 0x004000 /* run is completely made of whitespaces */ #define MERF_WHITESPACE 0x008000 -/* run is a last (dummy) run in the paragraph */ -#define MERF_SKIPPED 0x010000 -/* flags that are calculated during text wrapping */ -#define MERF_CALCBYWRAP 0x0F0000 /* the "end of paragraph" run, contains 1 character */ #define MERF_ENDPARA 0x100000 /* forcing the "end of row" run, contains 1 character */ @@ -414,7 +410,6 @@ typedef struct tagME_WrapContext ME_DisplayItem *pRowStart; ME_DisplayItem *pLastSplittableRun; - POINT ptLastSplittableRun; } ME_WrapContext; #endif diff --git a/reactos/dll/win32/riched20/paint.c b/reactos/dll/win32/riched20/paint.c index fc52afb62d3..6b13fb52ddf 100644 --- a/reactos/dll/win32/riched20/paint.c +++ b/reactos/dll/win32/riched20/paint.c @@ -73,7 +73,7 @@ void ME_PaintContent(ME_TextEditor *editor, HDC hDC, BOOL bOnlyNew, const RECT * if (!bOnlyNew || (item->member.para.nFlags & MEPF_REPAINT)) { - /* Draw the pargraph if any of the paragraph is in the update region. */ + /* Draw the paragraph if any of the paragraph is in the update region. */ if (ys < rcUpdate->bottom && ye > rcUpdate->top) { ME_DrawParagraph(&c, item); @@ -129,12 +129,10 @@ void ME_Repaint(ME_TextEditor *editor) ME_UpdateScrollBar(editor); FIXME("ME_Repaint had to call ME_WrapMarkedParagraphs\n"); } - if (!editor->bEmulateVersion10 || (editor->nEventMask & ENM_UPDATE)) - ME_SendOldNotify(editor, EN_UPDATE); ITextHost_TxViewChange(editor->texthost, TRUE); } -void ME_UpdateRepaint(ME_TextEditor *editor) +void ME_UpdateRepaint(ME_TextEditor *editor, BOOL update_now) { /* Should be called whenever the contents of the control have changed */ BOOL wrappedParagraphs; @@ -146,6 +144,8 @@ void ME_UpdateRepaint(ME_TextEditor *editor) /* Ensure that the cursor is visible */ ME_EnsureVisible(editor, &editor->pCursors[0]); + ITextHost_TxViewChange(editor->texthost, update_now); + ME_SendSelChange(editor); /* send EN_CHANGE if the event mask asks for it */ @@ -155,7 +155,6 @@ void ME_UpdateRepaint(ME_TextEditor *editor) ME_SendOldNotify(editor, EN_CHANGE); editor->nEventMask |= ENM_CHANGE; } - ME_Repaint(editor); } void @@ -170,7 +169,7 @@ ME_RewrapRepaint(ME_TextEditor *editor) ME_Repaint(editor); } -int ME_twips2pointsX(ME_Context *c, int x) +int ME_twips2pointsX(const ME_Context *c, int x) { if (c->editor->nZoomNumerator == 0) return x * c->dpi.cx / 1440; @@ -178,7 +177,7 @@ int ME_twips2pointsX(ME_Context *c, int x) return x * c->dpi.cx * c->editor->nZoomNumerator / 1440 / c->editor->nZoomDenominator; } -int ME_twips2pointsY(ME_Context *c, int y) +int ME_twips2pointsY(const ME_Context *c, int y) { if (c->editor->nZoomNumerator == 0) return y * c->dpi.cy / 1440; @@ -490,7 +489,7 @@ static const COLORREF pen_colors[16] = { /* Dark gray */ RGB(0x80, 0x80, 0x80), /* Light gray */ RGB(0xc0, 0xc0, 0xc0), }; -static int ME_GetBorderPenWidth(ME_Context* c, int idx) +static int ME_GetBorderPenWidth(const ME_Context* c, int idx) { int width = border_details[idx].width; @@ -503,7 +502,7 @@ static int ME_GetBorderPenWidth(ME_Context* c, int idx) return width; } -int ME_GetParaBorderWidth(ME_Context* c, int flags) +int ME_GetParaBorderWidth(const ME_Context* c, int flags) { int idx = (flags >> 8) & 0xF; int width; @@ -958,12 +957,9 @@ static void ME_DrawParagraph(ME_Context *c, ME_DisplayItem *paragraph) rc.left = c->pt.x + run->pt.x; rc.right = rc.left + run->nWidth; rc.top = c->pt.y + para->pt.y + run->pt.y; - rc.bottom = rc.bottom + height; + rc.bottom = rc.top + height; TRACE("rc = (%d, %d, %d, %d)\n", rc.left, rc.top, rc.right, rc.bottom); - if (run->nFlags & MERF_SKIPPED) - DrawFocusRect(c->hDC, &rc); - else - FrameRect(c->hDC, &rc, GetSysColorBrush(COLOR_GRAYTEXT)); + FrameRect(c->hDC, &rc, GetSysColorBrush(COLOR_GRAYTEXT)); } if (visible) ME_DrawRun(c, c->pt.x + run->pt.x, @@ -1096,7 +1092,7 @@ void ME_ScrollRight(ME_TextEditor *editor, int cx) ME_HScrollAbs(editor, editor->horz_si.nPos + cx); } -/* Calculates the visiblity after a call to SetScrollRange or +/* Calculates the visibility after a call to SetScrollRange or * SetScrollInfo with SIF_RANGE. */ static BOOL ME_PostSetScrollRangeVisibility(SCROLLINFO *si) { diff --git a/reactos/dll/win32/riched20/para.c b/reactos/dll/win32/riched20/para.c index b6319e73aa2..efd3d042e7d 100644 --- a/reactos/dll/win32/riched20/para.c +++ b/reactos/dll/win32/riched20/para.c @@ -475,7 +475,7 @@ void ME_DumpParaStyleToBuf(const PARAFORMAT2 *pFmt, char buf[2048]) /* we take for granted that PFE_xxx is the hiword of the corresponding PFM_xxx */ #define DUMP_EFFECT(mask, name) \ - p += sprintf(p, "%-22s%s\n", name, (pFmt->dwMask & (mask)) ? ((pFmt->wEffects & ((mask) >> 8)) ? "yes" : "no") : "N/A"); + p += sprintf(p, "%-22s%s\n", name, (pFmt->dwMask & (mask)) ? ((pFmt->wEffects & ((mask) >> 16)) ? "yes" : "no") : "N/A"); DUMP(PFM_NUMBERING, "Numbering:", "%u", wNumbering); DUMP_EFFECT(PFM_DONOTHYPHEN, "Disable auto-hyphen:"); diff --git a/reactos/dll/win32/riched20/res.h b/reactos/dll/win32/riched20/res.h index 8f329d1fb5a..aaf12221aff 100644 --- a/reactos/dll/win32/riched20/res.h +++ b/reactos/dll/win32/riched20/res.h @@ -18,4 +18,4 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#define OCR_REVERSE 32768 +#define OCR_REVERSE 107 diff --git a/reactos/dll/win32/riched20/richole.c b/reactos/dll/win32/riched20/richole.c index 5b6b2b666f7..8e902049cb0 100644 --- a/reactos/dll/win32/riched20/richole.c +++ b/reactos/dll/win32/riched20/richole.c @@ -39,14 +39,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(richedit); /* there is no way to be consistent across different sets of headers - mingw, Wine, Win32 SDK*/ -/* FIXME: the next 6 lines should be in textserv.h */ #include "initguid.h" -#define TEXTSERV_GUID(name, l, w1, w2, b1, b2) \ - DEFINE_GUID(name, l, w1, w2, b1, b2, 0x00, 0xaa, 0x00, 0x6c, 0xad, 0xc5) - -TEXTSERV_GUID(IID_ITextServices, 0x8d33f740, 0xcf58, 0x11ce, 0xa8, 0x9d); -TEXTSERV_GUID(IID_ITextHost, 0xc5bdd8d0, 0xd26e, 0x11ce, 0xa8, 0x9e); -TEXTSERV_GUID(IID_ITextHost2, 0xc5bdd8d0, 0xd26e, 0x11ce, 0xa8, 0x9e); +DEFINE_GUID(IID_ITextServices, 0x8d33f740, 0xcf58, 0x11ce, 0xa8, 0x9d, 0x00, 0xaa, 0x00, 0x6c, 0xad, 0xc5); +DEFINE_GUID(IID_ITextHost, 0x13e670f4,0x1a5a,0x11cf,0xab,0xeb,0x00,0xaa,0x00,0xb6,0x5e,0xa1); +DEFINE_GUID(IID_ITextHost2, 0x13e670f5,0x1a5a,0x11cf,0xab,0xeb,0x00,0xaa,0x00,0xb6,0x5e,0xa1); DEFINE_GUID(IID_ITextDocument, 0x8cc497c0, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa, 0x00, 0x47, 0xbe, 0x5d); DEFINE_GUID(IID_ITextRange, 0x8cc497c2, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa, 0x00, 0x47, 0xbe, 0x5d); DEFINE_GUID(IID_ITextSelection, 0x8cc497c1, 0xa1df, 0x11ce, 0x80, 0x98, 0x00, 0xaa, 0x00, 0x47, 0xbe, 0x5d); @@ -55,8 +51,8 @@ typedef struct ITextSelectionImpl ITextSelectionImpl; typedef struct IOleClientSiteImpl IOleClientSiteImpl; typedef struct IRichEditOleImpl { - const IRichEditOleVtbl *lpRichEditOleVtbl; - const ITextDocumentVtbl *lpTextDocumentVtbl; + IRichEditOle IRichEditOle_iface; + ITextDocument ITextDocument_iface; LONG ref; ME_TextEditor *editor; @@ -65,14 +61,14 @@ typedef struct IRichEditOleImpl { } IRichEditOleImpl; struct ITextSelectionImpl { - const ITextSelectionVtbl *lpVtbl; + ITextSelection ITextSelection_iface; LONG ref; IRichEditOleImpl *reOle; }; struct IOleClientSiteImpl { - const IOleClientSiteVtbl *lpVtbl; + IOleClientSite IOleClientSite_iface; LONG ref; IRichEditOleImpl *reOle; @@ -80,12 +76,12 @@ struct IOleClientSiteImpl { static inline IRichEditOleImpl *impl_from_IRichEditOle(IRichEditOle *iface) { - return (IRichEditOleImpl *)((BYTE*)iface - FIELD_OFFSET(IRichEditOleImpl, lpRichEditOleVtbl)); + return CONTAINING_RECORD(iface, IRichEditOleImpl, IRichEditOle_iface); } static inline IRichEditOleImpl *impl_from_ITextDocument(ITextDocument *iface) { - return (IRichEditOleImpl *)((BYTE*)iface - FIELD_OFFSET(IRichEditOleImpl, lpTextDocumentVtbl)); + return CONTAINING_RECORD(iface, IRichEditOleImpl, ITextDocument_iface); } static HRESULT WINAPI @@ -98,9 +94,9 @@ IRichEditOle_fnQueryInterface(IRichEditOle *me, REFIID riid, LPVOID *ppvObj) *ppvObj = NULL; if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IRichEditOle)) - *ppvObj = &This->lpRichEditOleVtbl; + *ppvObj = &This->IRichEditOle_iface; else if (IsEqualGUID(riid, &IID_ITextDocument)) - *ppvObj = &This->lpTextDocumentVtbl; + *ppvObj = &This->ITextDocument_iface; if (*ppvObj) { IRichEditOle_AddRef(me); @@ -134,8 +130,8 @@ IRichEditOle_fnRelease(IRichEditOle *me) { TRACE ("Destroying %p\n", This); This->txtSel->reOle = NULL; - ITextSelection_Release((ITextSelection *) This->txtSel); - IOleClientSite_Release((IOleClientSite *) This->clientSite); + ITextSelection_Release(&This->txtSel->ITextSelection_iface); + IOleClientSite_Release(&This->clientSite->IOleClientSite_iface); heap_free(This); } return ref; @@ -166,6 +162,11 @@ IRichEditOle_fnConvertObject(IRichEditOle *me, LONG iob, return E_NOTIMPL; } +static inline IOleClientSiteImpl *impl_from_IOleClientSite(IOleClientSite *iface) +{ + return CONTAINING_RECORD(iface, IOleClientSiteImpl, IOleClientSite_iface); +} + static HRESULT WINAPI IOleClientSite_fnQueryInterface(IOleClientSite *me, REFIID riid, LPVOID *ppvObj) { @@ -185,88 +186,81 @@ IOleClientSite_fnQueryInterface(IOleClientSite *me, REFIID riid, LPVOID *ppvObj) return E_NOINTERFACE; } -static ULONG WINAPI -IOleClientSite_fnAddRef(IOleClientSite *me) +static ULONG WINAPI IOleClientSite_fnAddRef(IOleClientSite *iface) { - IOleClientSiteImpl *This = (IOleClientSiteImpl *) me; + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); return InterlockedIncrement(&This->ref); } -static ULONG WINAPI -IOleClientSite_fnRelease(IOleClientSite *me) +static ULONG WINAPI IOleClientSite_fnRelease(IOleClientSite *iface) { - IOleClientSiteImpl *This = (IOleClientSiteImpl *) me; + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); ULONG ref = InterlockedDecrement(&This->ref); if (ref == 0) heap_free(This); return ref; } -static HRESULT WINAPI -IOleClientSite_fnSaveObject(IOleClientSite *me) +static HRESULT WINAPI IOleClientSite_fnSaveObject(IOleClientSite *iface) { - IOleClientSiteImpl *This = (IOleClientSiteImpl *) me; + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); if (!This->reOle) return CO_E_RELEASED; - FIXME("stub %p\n",me); + FIXME("stub %p\n", iface); return E_NOTIMPL; } -static HRESULT WINAPI -IOleClientSite_fnGetMoniker(IOleClientSite *me, DWORD dwAssign, DWORD dwWhichMoniker, - IMoniker **ppmk) +static HRESULT WINAPI IOleClientSite_fnGetMoniker(IOleClientSite *iface, DWORD dwAssign, + DWORD dwWhichMoniker, IMoniker **ppmk) { - IOleClientSiteImpl *This = (IOleClientSiteImpl *) me; + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); if (!This->reOle) return CO_E_RELEASED; - FIXME("stub %p\n",me); + FIXME("stub %p\n", iface); return E_NOTIMPL; } -static HRESULT WINAPI -IOleClientSite_fnGetContainer(IOleClientSite *me, IOleContainer **ppContainer) +static HRESULT WINAPI IOleClientSite_fnGetContainer(IOleClientSite *iface, + IOleContainer **ppContainer) { - IOleClientSiteImpl *This = (IOleClientSiteImpl *) me; + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); if (!This->reOle) return CO_E_RELEASED; - FIXME("stub %p\n",me); + FIXME("stub %p\n", iface); return E_NOTIMPL; } -static HRESULT WINAPI -IOleClientSite_fnShowObject(IOleClientSite *me) +static HRESULT WINAPI IOleClientSite_fnShowObject(IOleClientSite *iface) { - IOleClientSiteImpl *This = (IOleClientSiteImpl *) me; + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); if (!This->reOle) return CO_E_RELEASED; - FIXME("stub %p\n",me); + FIXME("stub %p\n", iface); return E_NOTIMPL; } -static HRESULT WINAPI -IOleClientSite_fnOnShowWindow(IOleClientSite *me, BOOL fShow) +static HRESULT WINAPI IOleClientSite_fnOnShowWindow(IOleClientSite *iface, BOOL fShow) { - IOleClientSiteImpl *This = (IOleClientSiteImpl *) me; + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); if (!This->reOle) return CO_E_RELEASED; - FIXME("stub %p\n",me); + FIXME("stub %p\n", iface); return E_NOTIMPL; } -static HRESULT WINAPI -IOleClientSite_fnRequestNewObjectLayout(IOleClientSite *me) +static HRESULT WINAPI IOleClientSite_fnRequestNewObjectLayout(IOleClientSite *iface) { - IOleClientSiteImpl *This = (IOleClientSiteImpl *) me; + IOleClientSiteImpl *This = impl_from_IOleClientSite(iface); if (!This->reOle) return CO_E_RELEASED; - FIXME("stub %p\n",me); + FIXME("stub %p\n", iface); return E_NOTIMPL; } @@ -289,7 +283,7 @@ CreateOleClientSite(IRichEditOleImpl *reOle) if (!clientSite) return NULL; - clientSite->lpVtbl = &ocst; + clientSite->IOleClientSite_iface.lpVtbl = &ocst; clientSite->ref = 1; clientSite->reOle = reOle; return clientSite; @@ -305,7 +299,7 @@ IRichEditOle_fnGetClientSite(IRichEditOle *me, if(!lplpolesite) return E_INVALIDARG; - *lplpolesite = (IOleClientSite *) This->clientSite; + *lplpolesite = &This->clientSite->IOleClientSite_iface; IOleClientSite_fnAddRef(*lplpolesite); return S_OK; } @@ -391,7 +385,7 @@ IRichEditOle_fnInsertObject(IRichEditOle *me, REOBJECT *reo) ME_InsertOLEFromCursor(This->editor, reo, 0); ME_CommitUndo(This->editor); - ME_UpdateRepaint(This->editor); + ME_UpdateRepaint(This->editor, FALSE); return S_OK; } @@ -454,22 +448,21 @@ ITextDocument_fnQueryInterface(ITextDocument* me, REFIID riid, void** ppvObject) { IRichEditOleImpl *This = impl_from_ITextDocument(me); - return IRichEditOle_fnQueryInterface((IRichEditOle*)&This->lpRichEditOleVtbl, - riid, ppvObject); + return IRichEditOle_fnQueryInterface(&This->IRichEditOle_iface, riid, ppvObject); } static ULONG WINAPI ITextDocument_fnAddRef(ITextDocument* me) { IRichEditOleImpl *This = impl_from_ITextDocument(me); - return IRichEditOle_fnAddRef((IRichEditOle*)&This->lpRichEditOleVtbl); + return IRichEditOle_fnAddRef(&This->IRichEditOle_iface); } static ULONG WINAPI ITextDocument_fnRelease(ITextDocument* me) { IRichEditOleImpl *This = impl_from_ITextDocument(me); - return IRichEditOle_fnRelease((IRichEditOle*)&This->lpRichEditOleVtbl); + return IRichEditOle_fnRelease(&This->IRichEditOle_iface); } static HRESULT WINAPI @@ -522,7 +515,7 @@ ITextDocument_fnGetSelection(ITextDocument* me, ITextSelection** ppSel) { IRichEditOleImpl *This = impl_from_ITextDocument(me); TRACE("(%p)\n", me); - *ppSel = (ITextSelection *) This->txtSel; + *ppSel = &This->txtSel->ITextSelection_iface; ITextSelection_AddRef(*ppSel); return S_OK; } @@ -697,6 +690,11 @@ static const ITextDocumentVtbl tdvt = { ITextDocument_fnRangeFromPoint }; +static inline ITextSelectionImpl *impl_from_ITextSelection(ITextSelection *iface) +{ + return CONTAINING_RECORD(iface, ITextSelectionImpl, ITextSelection_iface); +} + static HRESULT WINAPI ITextSelection_fnQueryInterface( ITextSelection *me, REFIID riid, @@ -716,28 +714,24 @@ static HRESULT WINAPI ITextSelection_fnQueryInterface( return E_NOINTERFACE; } -static ULONG WINAPI ITextSelection_fnAddRef( - ITextSelection *me) +static ULONG WINAPI ITextSelection_fnAddRef(ITextSelection *me) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); return InterlockedIncrement(&This->ref); } -static ULONG WINAPI ITextSelection_fnRelease( - ITextSelection *me) +static ULONG WINAPI ITextSelection_fnRelease(ITextSelection *me) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); ULONG ref = InterlockedDecrement(&This->ref); if (ref == 0) heap_free(This); return ref; } -static HRESULT WINAPI ITextSelection_fnGetTypeInfoCount( - ITextSelection *me, - UINT *pctinfo) +static HRESULT WINAPI ITextSelection_fnGetTypeInfoCount(ITextSelection *me, UINT *pctinfo) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -745,13 +739,10 @@ static HRESULT WINAPI ITextSelection_fnGetTypeInfoCount( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetTypeInfo( - ITextSelection *me, - UINT iTInfo, - LCID lcid, +static HRESULT WINAPI ITextSelection_fnGetTypeInfo(ITextSelection *me, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -759,15 +750,10 @@ static HRESULT WINAPI ITextSelection_fnGetTypeInfo( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetIDsOfNames( - ITextSelection *me, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId) +static HRESULT WINAPI ITextSelection_fnGetIDsOfNames(ITextSelection *me, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -791,11 +777,9 @@ static HRESULT WINAPI ITextSelection_fnInvoke( } /*** ITextRange methods ***/ -static HRESULT WINAPI ITextSelection_fnGetText( - ITextSelection *me, - BSTR *pbstr) +static HRESULT WINAPI ITextSelection_fnGetText(ITextSelection *me, BSTR *pbstr) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -803,11 +787,9 @@ static HRESULT WINAPI ITextSelection_fnGetText( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetText( - ITextSelection *me, - BSTR bstr) +static HRESULT WINAPI ITextSelection_fnSetText(ITextSelection *me, BSTR bstr) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -815,11 +797,9 @@ static HRESULT WINAPI ITextSelection_fnSetText( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetChar( - ITextSelection *me, - LONG *pch) +static HRESULT WINAPI ITextSelection_fnGetChar(ITextSelection *me, LONG *pch) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -827,11 +807,9 @@ static HRESULT WINAPI ITextSelection_fnGetChar( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetChar( - ITextSelection *me, - LONG ch) +static HRESULT WINAPI ITextSelection_fnSetChar(ITextSelection *me, LONG ch) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -839,11 +817,9 @@ static HRESULT WINAPI ITextSelection_fnSetChar( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetDuplicate( - ITextSelection *me, - ITextRange **ppRange) +static HRESULT WINAPI ITextSelection_fnGetDuplicate(ITextSelection *me, ITextRange **ppRange) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -851,11 +827,9 @@ static HRESULT WINAPI ITextSelection_fnGetDuplicate( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetFormattedText( - ITextSelection *me, - ITextRange **ppRange) +static HRESULT WINAPI ITextSelection_fnGetFormattedText(ITextSelection *me, ITextRange **ppRange) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -863,11 +837,9 @@ static HRESULT WINAPI ITextSelection_fnGetFormattedText( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetFormattedText( - ITextSelection *me, - ITextRange *pRange) +static HRESULT WINAPI ITextSelection_fnSetFormattedText(ITextSelection *me, ITextRange *pRange) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -875,11 +847,9 @@ static HRESULT WINAPI ITextSelection_fnSetFormattedText( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetStart( - ITextSelection *me, - LONG *pcpFirst) +static HRESULT WINAPI ITextSelection_fnGetStart(ITextSelection *me, LONG *pcpFirst) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -887,11 +857,9 @@ static HRESULT WINAPI ITextSelection_fnGetStart( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetStart( - ITextSelection *me, - LONG cpFirst) +static HRESULT WINAPI ITextSelection_fnSetStart(ITextSelection *me, LONG cpFirst) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -899,11 +867,9 @@ static HRESULT WINAPI ITextSelection_fnSetStart( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetEnd( - ITextSelection *me, - LONG *pcpLim) +static HRESULT WINAPI ITextSelection_fnGetEnd(ITextSelection *me, LONG *pcpLim) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -911,11 +877,9 @@ static HRESULT WINAPI ITextSelection_fnGetEnd( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetEnd( - ITextSelection *me, - LONG cpLim) +static HRESULT WINAPI ITextSelection_fnSetEnd(ITextSelection *me, LONG cpLim) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -923,11 +887,9 @@ static HRESULT WINAPI ITextSelection_fnSetEnd( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetFont( - ITextSelection *me, - ITextFont **pFont) +static HRESULT WINAPI ITextSelection_fnGetFont(ITextSelection *me, ITextFont **pFont) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -935,11 +897,9 @@ static HRESULT WINAPI ITextSelection_fnGetFont( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetFont( - ITextSelection *me, - ITextFont *pFont) +static HRESULT WINAPI ITextSelection_fnSetFont(ITextSelection *me, ITextFont *pFont) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -947,11 +907,9 @@ static HRESULT WINAPI ITextSelection_fnSetFont( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetPara( - ITextSelection *me, - ITextPara **ppPara) +static HRESULT WINAPI ITextSelection_fnGetPara(ITextSelection *me, ITextPara **ppPara) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -959,11 +917,9 @@ static HRESULT WINAPI ITextSelection_fnGetPara( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetPara( - ITextSelection *me, - ITextPara *pPara) +static HRESULT WINAPI ITextSelection_fnSetPara(ITextSelection *me, ITextPara *pPara) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -971,11 +927,9 @@ static HRESULT WINAPI ITextSelection_fnSetPara( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetStoryLength( - ITextSelection *me, - LONG *pcch) +static HRESULT WINAPI ITextSelection_fnGetStoryLength(ITextSelection *me, LONG *pcch) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -983,11 +937,9 @@ static HRESULT WINAPI ITextSelection_fnGetStoryLength( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetStoryType( - ITextSelection *me, - LONG *pValue) +static HRESULT WINAPI ITextSelection_fnGetStoryType(ITextSelection *me, LONG *pValue) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -995,11 +947,9 @@ static HRESULT WINAPI ITextSelection_fnGetStoryType( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnCollapse( - ITextSelection *me, - LONG bStart) +static HRESULT WINAPI ITextSelection_fnCollapse(ITextSelection *me, LONG bStart) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1007,12 +957,9 @@ static HRESULT WINAPI ITextSelection_fnCollapse( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnExpand( - ITextSelection *me, - LONG Unit, - LONG *pDelta) +static HRESULT WINAPI ITextSelection_fnExpand(ITextSelection *me, LONG Unit, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1020,12 +967,9 @@ static HRESULT WINAPI ITextSelection_fnExpand( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetIndex( - ITextSelection *me, - LONG Unit, - LONG *pIndex) +static HRESULT WINAPI ITextSelection_fnGetIndex(ITextSelection *me, LONG Unit, LONG *pIndex) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1033,13 +977,10 @@ static HRESULT WINAPI ITextSelection_fnGetIndex( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetIndex( - ITextSelection *me, - LONG Unit, - LONG Index, +static HRESULT WINAPI ITextSelection_fnSetIndex(ITextSelection *me, LONG Unit, LONG Index, LONG Extend) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1047,12 +988,9 @@ static HRESULT WINAPI ITextSelection_fnSetIndex( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetRange( - ITextSelection *me, - LONG cpActive, - LONG cpOther) +static HRESULT WINAPI ITextSelection_fnSetRange(ITextSelection *me, LONG cpActive, LONG cpOther) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1060,12 +998,9 @@ static HRESULT WINAPI ITextSelection_fnSetRange( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnInRange( - ITextSelection *me, - ITextRange *pRange, - LONG *pb) +static HRESULT WINAPI ITextSelection_fnInRange(ITextSelection *me, ITextRange *pRange, LONG *pb) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1073,12 +1008,9 @@ static HRESULT WINAPI ITextSelection_fnInRange( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnInStory( - ITextSelection *me, - ITextRange *pRange, - LONG *pb) +static HRESULT WINAPI ITextSelection_fnInStory(ITextSelection *me, ITextRange *pRange, LONG *pb) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1086,12 +1018,9 @@ static HRESULT WINAPI ITextSelection_fnInStory( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnIsEqual( - ITextSelection *me, - ITextRange *pRange, - LONG *pb) +static HRESULT WINAPI ITextSelection_fnIsEqual(ITextSelection *me, ITextRange *pRange, LONG *pb) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1099,10 +1028,9 @@ static HRESULT WINAPI ITextSelection_fnIsEqual( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSelect( - ITextSelection *me) +static HRESULT WINAPI ITextSelection_fnSelect(ITextSelection *me) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1110,13 +1038,10 @@ static HRESULT WINAPI ITextSelection_fnSelect( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnStartOf( - ITextSelection *me, - LONG Unit, - LONG Extend, +static HRESULT WINAPI ITextSelection_fnStartOf(ITextSelection *me, LONG Unit, LONG Extend, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1124,13 +1049,10 @@ static HRESULT WINAPI ITextSelection_fnStartOf( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnEndOf( - ITextSelection *me, - LONG Unit, - LONG Extend, +static HRESULT WINAPI ITextSelection_fnEndOf(ITextSelection *me, LONG Unit, LONG Extend, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1138,13 +1060,20 @@ static HRESULT WINAPI ITextSelection_fnEndOf( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMove( - ITextSelection *me, - LONG Unit, - LONG Count, +static HRESULT WINAPI ITextSelection_fnMove(ITextSelection *me, LONG Unit, LONG Count, LONG *pDelta) +{ + ITextSelectionImpl *This = impl_from_ITextSelection(me); + if (!This->reOle) + return CO_E_RELEASED; + + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ITextSelection_fnMoveStart(ITextSelection *me, LONG Unit, LONG Count, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1152,13 +1081,10 @@ static HRESULT WINAPI ITextSelection_fnMove( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveStart( - ITextSelection *me, - LONG Unit, - LONG Count, +static HRESULT WINAPI ITextSelection_fnMoveEnd(ITextSelection *me, LONG Unit, LONG Count, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1166,13 +1092,10 @@ static HRESULT WINAPI ITextSelection_fnMoveStart( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveEnd( - ITextSelection *me, - LONG Unit, - LONG Count, +static HRESULT WINAPI ITextSelection_fnMoveWhile(ITextSelection *me, VARIANT *Cset, LONG Count, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1180,13 +1103,10 @@ static HRESULT WINAPI ITextSelection_fnMoveEnd( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveWhile( - ITextSelection *me, - VARIANT *Cset, - LONG Count, +static HRESULT WINAPI ITextSelection_fnMoveStartWhile(ITextSelection *me, VARIANT *Cset, LONG Count, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1194,13 +1114,10 @@ static HRESULT WINAPI ITextSelection_fnMoveWhile( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveStartWhile( - ITextSelection *me, - VARIANT *Cset, - LONG Count, +static HRESULT WINAPI ITextSelection_fnMoveEndWhile(ITextSelection *me, VARIANT *Cset, LONG Count, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1208,13 +1125,10 @@ static HRESULT WINAPI ITextSelection_fnMoveStartWhile( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveEndWhile( - ITextSelection *me, - VARIANT *Cset, - LONG Count, +static HRESULT WINAPI ITextSelection_fnMoveUntil(ITextSelection *me, VARIANT *Cset, LONG Count, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1222,13 +1136,10 @@ static HRESULT WINAPI ITextSelection_fnMoveEndWhile( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveUntil( - ITextSelection *me, - VARIANT *Cset, - LONG Count, +static HRESULT WINAPI ITextSelection_fnMoveStartUntil(ITextSelection *me, VARIANT *Cset, LONG Count, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1236,13 +1147,10 @@ static HRESULT WINAPI ITextSelection_fnMoveUntil( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveStartUntil( - ITextSelection *me, - VARIANT *Cset, - LONG Count, +static HRESULT WINAPI ITextSelection_fnMoveEndUntil(ITextSelection *me, VARIANT *Cset, LONG Count, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1250,28 +1158,10 @@ static HRESULT WINAPI ITextSelection_fnMoveStartUntil( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveEndUntil( - ITextSelection *me, - VARIANT *Cset, - LONG Count, - LONG *pDelta) -{ - ITextSelectionImpl *This = (ITextSelectionImpl *) me; - if (!This->reOle) - return CO_E_RELEASED; - - FIXME("not implemented\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI ITextSelection_fnFindText( - ITextSelection *me, - BSTR bstr, - LONG cch, - LONG Flags, +static HRESULT WINAPI ITextSelection_fnFindText(ITextSelection *me, BSTR bstr, LONG cch, LONG Flags, LONG *pLength) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1279,14 +1169,10 @@ static HRESULT WINAPI ITextSelection_fnFindText( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnFindTextStart( - ITextSelection *me, - BSTR bstr, - LONG cch, - LONG Flags, - LONG *pLength) +static HRESULT WINAPI ITextSelection_fnFindTextStart(ITextSelection *me, BSTR bstr, LONG cch, + LONG Flags, LONG *pLength) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1294,14 +1180,10 @@ static HRESULT WINAPI ITextSelection_fnFindTextStart( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnFindTextEnd( - ITextSelection *me, - BSTR bstr, - LONG cch, - LONG Flags, - LONG *pLength) +static HRESULT WINAPI ITextSelection_fnFindTextEnd(ITextSelection *me, BSTR bstr, LONG cch, + LONG Flags, LONG *pLength) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1309,13 +1191,10 @@ static HRESULT WINAPI ITextSelection_fnFindTextEnd( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnDelete( - ITextSelection *me, - LONG Unit, - LONG Count, +static HRESULT WINAPI ITextSelection_fnDelete(ITextSelection *me, LONG Unit, LONG Count, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1323,11 +1202,9 @@ static HRESULT WINAPI ITextSelection_fnDelete( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnCut( - ITextSelection *me, - VARIANT *pVar) +static HRESULT WINAPI ITextSelection_fnCut(ITextSelection *me, VARIANT *pVar) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1335,11 +1212,9 @@ static HRESULT WINAPI ITextSelection_fnCut( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnCopy( - ITextSelection *me, - VARIANT *pVar) +static HRESULT WINAPI ITextSelection_fnCopy(ITextSelection *me, VARIANT *pVar) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1347,12 +1222,9 @@ static HRESULT WINAPI ITextSelection_fnCopy( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnPaste( - ITextSelection *me, - VARIANT *pVar, - LONG Format) +static HRESULT WINAPI ITextSelection_fnPaste(ITextSelection *me, VARIANT *pVar, LONG Format) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1360,13 +1232,10 @@ static HRESULT WINAPI ITextSelection_fnPaste( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnCanPaste( - ITextSelection *me, - VARIANT *pVar, - LONG Format, +static HRESULT WINAPI ITextSelection_fnCanPaste(ITextSelection *me, VARIANT *pVar, LONG Format, LONG *pb) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1374,11 +1243,9 @@ static HRESULT WINAPI ITextSelection_fnCanPaste( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnCanEdit( - ITextSelection *me, - LONG *pb) +static HRESULT WINAPI ITextSelection_fnCanEdit(ITextSelection *me, LONG *pb) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1386,11 +1253,9 @@ static HRESULT WINAPI ITextSelection_fnCanEdit( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnChangeCase( - ITextSelection *me, - LONG Type) +static HRESULT WINAPI ITextSelection_fnChangeCase(ITextSelection *me, LONG Type) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1398,13 +1263,9 @@ static HRESULT WINAPI ITextSelection_fnChangeCase( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetPoint( - ITextSelection *me, - LONG Type, - LONG *cx, - LONG *cy) +static HRESULT WINAPI ITextSelection_fnGetPoint(ITextSelection *me, LONG Type, LONG *cx, LONG *cy) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1412,14 +1273,10 @@ static HRESULT WINAPI ITextSelection_fnGetPoint( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetPoint( - ITextSelection *me, - LONG x, - LONG y, - LONG Type, +static HRESULT WINAPI ITextSelection_fnSetPoint(ITextSelection *me, LONG x, LONG y, LONG Type, LONG Extend) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1427,11 +1284,9 @@ static HRESULT WINAPI ITextSelection_fnSetPoint( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnScrollIntoView( - ITextSelection *me, - LONG Value) +static HRESULT WINAPI ITextSelection_fnScrollIntoView(ITextSelection *me, LONG Value) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1439,11 +1294,9 @@ static HRESULT WINAPI ITextSelection_fnScrollIntoView( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetEmbeddedObject( - ITextSelection *me, - IUnknown **ppv) +static HRESULT WINAPI ITextSelection_fnGetEmbeddedObject(ITextSelection *me, IUnknown **ppv) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1452,11 +1305,9 @@ static HRESULT WINAPI ITextSelection_fnGetEmbeddedObject( } /*** ITextSelection methods ***/ -static HRESULT WINAPI ITextSelection_fnGetFlags( - ITextSelection *me, - LONG *pFlags) +static HRESULT WINAPI ITextSelection_fnGetFlags(ITextSelection *me, LONG *pFlags) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1464,11 +1315,9 @@ static HRESULT WINAPI ITextSelection_fnGetFlags( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnSetFlags( - ITextSelection *me, - LONG Flags) +static HRESULT WINAPI ITextSelection_fnSetFlags(ITextSelection *me, LONG Flags) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1476,11 +1325,9 @@ static HRESULT WINAPI ITextSelection_fnSetFlags( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnGetType( - ITextSelection *me, - LONG *pType) +static HRESULT WINAPI ITextSelection_fnGetType(ITextSelection *me, LONG *pType) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1488,14 +1335,54 @@ static HRESULT WINAPI ITextSelection_fnGetType( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveLeft( - ITextSelection *me, - LONG Unit, - LONG Count, - LONG Extend, +static HRESULT WINAPI ITextSelection_fnMoveLeft(ITextSelection *me, LONG Unit, LONG Count, + LONG Extend, LONG *pDelta) +{ + ITextSelectionImpl *This = impl_from_ITextSelection(me); + if (!This->reOle) + return CO_E_RELEASED; + + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ITextSelection_fnMoveRight(ITextSelection *me, LONG Unit, LONG Count, + LONG Extend, LONG *pDelta) +{ + ITextSelectionImpl *This = impl_from_ITextSelection(me); + if (!This->reOle) + return CO_E_RELEASED; + + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ITextSelection_fnMoveUp(ITextSelection *me, LONG Unit, LONG Count, + LONG Extend, LONG *pDelta) +{ + ITextSelectionImpl *This = impl_from_ITextSelection(me); + if (!This->reOle) + return CO_E_RELEASED; + + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ITextSelection_fnMoveDown(ITextSelection *me, LONG Unit, LONG Count, + LONG Extend, LONG *pDelta) +{ + ITextSelectionImpl *This = impl_from_ITextSelection(me); + if (!This->reOle) + return CO_E_RELEASED; + + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ITextSelection_fnHomeKey(ITextSelection *me, LONG Unit, LONG Extend, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1503,14 +1390,10 @@ static HRESULT WINAPI ITextSelection_fnMoveLeft( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveRight( - ITextSelection *me, - LONG Unit, - LONG Count, - LONG Extend, +static HRESULT WINAPI ITextSelection_fnEndKey(ITextSelection *me, LONG Unit, LONG Extend, LONG *pDelta) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1518,69 +1401,9 @@ static HRESULT WINAPI ITextSelection_fnMoveRight( return E_NOTIMPL; } -static HRESULT WINAPI ITextSelection_fnMoveUp( - ITextSelection *me, - LONG Unit, - LONG Count, - LONG Extend, - LONG *pDelta) +static HRESULT WINAPI ITextSelection_fnTypeText(ITextSelection *me, BSTR bstr) { - ITextSelectionImpl *This = (ITextSelectionImpl *) me; - if (!This->reOle) - return CO_E_RELEASED; - - FIXME("not implemented\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI ITextSelection_fnMoveDown( - ITextSelection *me, - LONG Unit, - LONG Count, - LONG Extend, - LONG *pDelta) -{ - ITextSelectionImpl *This = (ITextSelectionImpl *) me; - if (!This->reOle) - return CO_E_RELEASED; - - FIXME("not implemented\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI ITextSelection_fnHomeKey( - ITextSelection *me, - LONG Unit, - LONG Extend, - LONG *pDelta) -{ - ITextSelectionImpl *This = (ITextSelectionImpl *) me; - if (!This->reOle) - return CO_E_RELEASED; - - FIXME("not implemented\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI ITextSelection_fnEndKey( - ITextSelection *me, - LONG Unit, - LONG Extend, - LONG *pDelta) -{ - ITextSelectionImpl *This = (ITextSelectionImpl *) me; - if (!This->reOle) - return CO_E_RELEASED; - - FIXME("not implemented\n"); - return E_NOTIMPL; -} - -static HRESULT WINAPI ITextSelection_fnTypeText( - ITextSelection *me, - BSTR bstr) -{ - ITextSelectionImpl *This = (ITextSelectionImpl *) me; + ITextSelectionImpl *This = impl_from_ITextSelection(me); if (!This->reOle) return CO_E_RELEASED; @@ -1666,7 +1489,7 @@ CreateTextSelection(IRichEditOleImpl *reOle) if (!txtSel) return NULL; - txtSel->lpVtbl = &tsvt; + txtSel->ITextSelection_iface.lpVtbl = &tsvt; txtSel->ref = 1; txtSel->reOle = reOle; return txtSel; @@ -1680,8 +1503,8 @@ LRESULT CreateIRichEditOle(ME_TextEditor *editor, LPVOID *ppObj) if (!reo) return 0; - reo->lpRichEditOleVtbl = &revt; - reo->lpTextDocumentVtbl = &tdvt; + reo->IRichEditOle_iface.lpVtbl = &revt; + reo->ITextDocument_iface.lpVtbl = &tdvt; reo->ref = 1; reo->editor = editor; reo->txtSel = CreateTextSelection(reo); @@ -1693,7 +1516,7 @@ LRESULT CreateIRichEditOle(ME_TextEditor *editor, LPVOID *ppObj) reo->clientSite = CreateOleClientSite(reo); if (!reo->txtSel) { - ITextSelection_Release((ITextSelection *) reo->txtSel); + ITextSelection_Release(&reo->txtSel->ITextSelection_iface); heap_free(reo); return 0; } @@ -1703,7 +1526,7 @@ LRESULT CreateIRichEditOle(ME_TextEditor *editor, LPVOID *ppObj) return 1; } -static void convert_sizel(ME_Context *c, const SIZEL* szl, SIZE* sz) +static void convert_sizel(const ME_Context *c, const SIZEL* szl, SIZE* sz) { /* sizel is in .01 millimeters, sz in pixels */ sz->cx = MulDiv(szl->cx, c->dpi.cx, 2540); @@ -1715,7 +1538,7 @@ static void convert_sizel(ME_Context *c, const SIZEL* szl, SIZE* sz) * * Sets run extent for OLE objects. */ -void ME_GetOLEObjectSize(ME_Context *c, ME_Run *run, SIZE *pSize) +void ME_GetOLEObjectSize(const ME_Context *c, ME_Run *run, SIZE *pSize) { IDataObject* ido; FORMATETC fmt; diff --git a/reactos/dll/win32/riched20/rtf.h b/reactos/dll/win32/riched20/rtf.h index 4bff33120f3..9f3822fa5b7 100644 --- a/reactos/dll/win32/riched20/rtf.h +++ b/reactos/dll/win32/riched20/rtf.h @@ -1186,31 +1186,31 @@ struct _RTF_Info { * Public RTF reader routines */ -void RTFInit (RTF_Info *); -void RTFDestroy(RTF_Info *info); -void RTFSetDestinationCallback (RTF_Info *, int, RTFFuncPtr); -void RTFRead (RTF_Info *); -int RTFGetToken (RTF_Info *); /* writer should rarely need this */ -void RTFSetReadHook (RTF_Info *, RTFFuncPtr); -void RTFRouteToken (RTF_Info *); -void RTFSkipGroup (RTF_Info *); -void RTFReadGroup (RTF_Info *); -int RTFCheckCM (const RTF_Info *, int, int); -int RTFCheckCMM (const RTF_Info *, int, int, int); -int RTFCheckMM (const RTF_Info *, int, int); -RTFFont *RTFGetFont (const RTF_Info *, int); -RTFColor *RTFGetColor (const RTF_Info *, int); -int RTFCharToHex ( char); +void RTFInit (RTF_Info *) DECLSPEC_HIDDEN; +void RTFDestroy(RTF_Info *info) DECLSPEC_HIDDEN; +void RTFSetDestinationCallback (RTF_Info *, int, RTFFuncPtr) DECLSPEC_HIDDEN; +void RTFRead (RTF_Info *) DECLSPEC_HIDDEN; +int RTFGetToken (RTF_Info *) DECLSPEC_HIDDEN; /* writer should rarely need this */ +void RTFSetReadHook (RTF_Info *, RTFFuncPtr) DECLSPEC_HIDDEN; +void RTFRouteToken (RTF_Info *) DECLSPEC_HIDDEN; +void RTFSkipGroup (RTF_Info *) DECLSPEC_HIDDEN; +void RTFReadGroup (RTF_Info *) DECLSPEC_HIDDEN; +int RTFCheckCM (const RTF_Info *, int, int) DECLSPEC_HIDDEN; +int RTFCheckCMM (const RTF_Info *, int, int, int) DECLSPEC_HIDDEN; +int RTFCheckMM (const RTF_Info *, int, int) DECLSPEC_HIDDEN; +RTFFont *RTFGetFont (const RTF_Info *, int) DECLSPEC_HIDDEN; +RTFColor *RTFGetColor (const RTF_Info *, int) DECLSPEC_HIDDEN; +int RTFCharToHex ( char) DECLSPEC_HIDDEN; -void RTFFlushOutputBuffer( RTF_Info *info ); -void RTFSetEditStream(RTF_Info *info, ME_InStream *stream); +void RTFFlushOutputBuffer( RTF_Info *info ) DECLSPEC_HIDDEN; +void RTFSetEditStream(RTF_Info *info, ME_InStream *stream) DECLSPEC_HIDDEN; -void WriterInit (RTF_Info *); -int BeginFile (RTF_Info *); +void WriterInit (RTF_Info *) DECLSPEC_HIDDEN; +int BeginFile (RTF_Info *) DECLSPEC_HIDDEN; -int RTFCharSetToCodePage(RTF_Info *info, int charset); +int RTFCharSetToCodePage(RTF_Info *info, int charset) DECLSPEC_HIDDEN; -void LookupInit (void); -void LookupCleanup (void); +void LookupInit (void) DECLSPEC_HIDDEN; +void LookupCleanup (void) DECLSPEC_HIDDEN; #endif diff --git a/reactos/dll/win32/riched20/run.c b/reactos/dll/win32/riched20/run.c index da5553b0de5..8a1f91fa926 100644 --- a/reactos/dll/win32/riched20/run.c +++ b/reactos/dll/win32/riched20/run.c @@ -251,9 +251,9 @@ void ME_JoinRuns(ME_TextEditor *editor, ME_DisplayItem *p) ME_DisplayItem *ME_SplitRun(ME_WrapContext *wc, ME_DisplayItem *item, int nVChar) { ME_TextEditor *editor = wc->context->editor; - ME_DisplayItem *item2 = NULL; ME_Run *run, *run2; - ME_Paragraph *para = &ME_GetParagraph(item)->member.para; + ME_Paragraph *para = &wc->pPara->member.para; + ME_Cursor cursor = {wc->pPara, item, nVChar}; assert(item->member.run.nCharOfs != -1); if(TRACE_ON(richedit)) @@ -268,12 +268,11 @@ ME_DisplayItem *ME_SplitRun(ME_WrapContext *wc, ME_DisplayItem *item, int nVChar TRACE("Before split: %s(%d, %d)\n", debugstr_w(run->strText->szData), run->pt.x, run->pt.y); - item2 = ME_SplitRunSimple(editor, item, nVChar); + ME_SplitRunSimple(editor, &cursor); - run2 = &item2->member.run; + run2 = &cursor.pRun->member.run; ME_CalcRunExtent(wc->context, para, wc->nRow ? wc->nLeftMargin : wc->nFirstMargin, run); - ME_CalcRunExtent(wc->context, para, wc->nRow ? wc->nLeftMargin : wc->nFirstMargin, run2); run2->pt.x = run->pt.x+run->nWidth; run2->pt.y = run->pt.y; @@ -288,46 +287,45 @@ ME_DisplayItem *ME_SplitRun(ME_WrapContext *wc, ME_DisplayItem *item, int nVChar debugstr_w(run2->strText->szData), run2->pt.x, run2->pt.y); } - return item2; + return cursor.pRun; } /****************************************************************************** * ME_SplitRunSimple - * + * * Does the most basic job of splitting a run into two - it does not - * update the positions and extents. - */ -ME_DisplayItem *ME_SplitRunSimple(ME_TextEditor *editor, ME_DisplayItem *item, int nVChar) + * update the positions and extents. + */ +ME_DisplayItem *ME_SplitRunSimple(ME_TextEditor *editor, ME_Cursor *cursor) { - ME_Run *run = &item->member.run; - ME_DisplayItem *item2; - ME_Run *run2; + ME_DisplayItem *run = cursor->pRun; + ME_DisplayItem *new_run; int i; - assert(nVChar > 0 && nVChar < run->strText->nLen); - assert(item->type == diRun); - assert(!(item->member.run.nFlags & MERF_NONTEXT)); - assert(item->member.run.nCharOfs != -1); + int nOffset = cursor->nOffset; - item2 = ME_MakeRun(run->style, - ME_VSplitString(run->strText, nVChar), run->nFlags&MERF_SPLITMASK); + assert(!(run->member.run.nFlags & MERF_NONTEXT)); - item2->member.run.nCharOfs = item->member.run.nCharOfs + nVChar; + new_run = ME_MakeRun(run->member.run.style, + ME_VSplitString(run->member.run.strText, nOffset), + run->member.run.nFlags & MERF_SPLITMASK); - run2 = &item2->member.run; - ME_InsertBefore(item->next, item2); + new_run->member.run.nCharOfs = run->member.run.nCharOfs + nOffset; + cursor->pRun = new_run; + cursor->nOffset = 0; - ME_UpdateRunFlags(editor, run); - ME_UpdateRunFlags(editor, run2); - for (i=0; inCursors; i++) { - if (editor->pCursors[i].pRun == item && - editor->pCursors[i].nOffset >= nVChar) { - assert(item2->type == diRun); - editor->pCursors[i].pRun = item2; - editor->pCursors[i].nOffset -= nVChar; + ME_InsertBefore(run->next, new_run); + + ME_UpdateRunFlags(editor, &run->member.run); + ME_UpdateRunFlags(editor, &new_run->member.run); + for (i = 0; i < editor->nCursors; i++) { + if (editor->pCursors[i].pRun == run && + editor->pCursors[i].nOffset >= nOffset) { + editor->pCursors[i].pRun = new_run; + editor->pCursors[i].nOffset -= nOffset; } } - ME_GetParagraph(item)->member.para.nFlags |= MEPF_REWRAP; - return item2; + cursor->pPara->member.para.nFlags |= MEPF_REWRAP; + return run; } /****************************************************************************** @@ -361,12 +359,8 @@ ME_InsertRunAtCursor(ME_TextEditor *editor, ME_Cursor *cursor, ME_Style *style, ME_DisplayItem *pDI; ME_UndoItem *pUI; - if (cursor->nOffset) { - /* We're inserting at the middle of the existing run, which means that - * that run must be split. It isn't always necessary, but */ - cursor->pRun = ME_SplitRunSimple(editor, cursor->pRun, cursor->nOffset); - cursor->nOffset = 0; - } + if (cursor->nOffset) + ME_SplitRunSimple(editor, cursor); pUI = ME_AddUndoItem(editor, diUndoDeleteRun, NULL); if (pUI) { @@ -756,10 +750,8 @@ void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, C { /* SplitRunSimple may or may not update the cursors, depending on whether they * are selection cursors, but we need to make sure they are valid. */ - ME_DisplayItem *split_run = start->pRun; int split_offset = start->nOffset; - start->pRun = ME_SplitRunSimple(editor, split_run, split_offset); - start->nOffset = 0; + ME_DisplayItem *split_run = ME_SplitRunSimple(editor, start); if (end && end->pRun == split_run) { end->pRun = start->pRun; @@ -768,12 +760,8 @@ void ME_SetCharFormat(ME_TextEditor *editor, ME_Cursor *start, ME_Cursor *end, C } if (end && end->nOffset) - { - end_run = end->pRun = ME_SplitRunSimple(editor, end->pRun, end->nOffset); - end->nOffset = 0; - } else if (end) { - end_run = end->pRun; - } + ME_SplitRunSimple(editor, end); + end_run = end ? end->pRun : NULL; run = start->pRun; para = start->pPara; @@ -906,8 +894,8 @@ void ME_GetCharFormat(ME_TextEditor *editor, const ME_Cursor *from, do { /* FIXME add more style feature comparisons */ - int nAttribs = CFM_SIZE | CFM_FACE | CFM_COLOR | CFM_UNDERLINETYPE; - int nEffects = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_STRIKEOUT | CFM_PROTECTED | CFM_LINK | CFM_SUPERSCRIPT; + DWORD dwAttribs = CFM_SIZE | CFM_FACE | CFM_COLOR | CFM_UNDERLINETYPE; + DWORD dwEffects = CFM_BOLD | CFM_ITALIC | CFM_UNDERLINE | CFM_STRIKEOUT | CFM_PROTECTED | CFM_LINK | CFM_SUPERSCRIPT; run = ME_FindItemFwd(run, diRun); @@ -915,7 +903,7 @@ void ME_GetCharFormat(ME_TextEditor *editor, const ME_Cursor *from, tmp.cbSize = sizeof(tmp); ME_GetRunCharFormat(editor, run, &tmp); - assert((tmp.dwMask & nAttribs) == nAttribs); + assert((tmp.dwMask & dwAttribs) == dwAttribs); /* reset flags that differ */ if (pFmt->yHeight != tmp.yHeight) @@ -941,7 +929,7 @@ void ME_GetCharFormat(ME_TextEditor *editor, const ME_Cursor *from, } } - pFmt->dwMask &= ~((pFmt->dwEffects ^ tmp.dwEffects) & nEffects); + pFmt->dwMask &= ~((pFmt->dwEffects ^ tmp.dwEffects) & dwEffects); pFmt->dwEffects = tmp.dwEffects; } while(run != run_end); diff --git a/reactos/dll/win32/riched20/style.c b/reactos/dll/win32/riched20/style.c index bb2f808954a..605faeb92f0 100644 --- a/reactos/dll/win32/riched20/style.c +++ b/reactos/dll/win32/riched20/style.c @@ -139,21 +139,16 @@ void ME_CopyToCFAny(CHARFORMAT2W *to, CHARFORMAT2W *from) CopyMemory(to, from, to->cbSize); } -ME_Style *ME_MakeStyle(CHARFORMAT2W *style) { - CHARFORMAT2W styledata; +ME_Style *ME_MakeStyle(CHARFORMAT2W *style) +{ ME_Style *s = ALLOC_OBJ(ME_Style); - - style = ME_ToCF2W(&styledata, style); - memset(s, 0, sizeof(ME_Style)); - if (style->cbSize <= sizeof(CHARFORMAT2W)) - CopyMemory(&s->fmt, style, style->cbSize); - else - s->fmt = *style; - s->fmt.cbSize = sizeof(CHARFORMAT2W); + assert(style->cbSize == sizeof(CHARFORMAT2W)); + s->fmt = *style; s->nSequence = -2; s->nRefs = 1; s->hFont = NULL; + memset(&s->tm, 0, sizeof(s->tm)); s->tm.tmAscent = -1; all_refs++; TRACE_(richedit_style)("ME_MakeStyle %p, total refs=%d\n", s, all_refs); @@ -171,7 +166,7 @@ ME_Style *ME_MakeStyle(CHARFORMAT2W *style) { s->fmt.dwMask |= mask;\ CopyMemory(s->fmt.member, style->member, sizeof(style->member));\ } - + void ME_InitCharFormat2W(CHARFORMAT2W *pFmt) { ZeroMemory(pFmt, sizeof(CHARFORMAT2W)); @@ -180,9 +175,8 @@ void ME_InitCharFormat2W(CHARFORMAT2W *pFmt) ME_Style *ME_ApplyStyle(ME_Style *sSrc, CHARFORMAT2W *style) { - CHARFORMAT2W styledata; ME_Style *s = ME_MakeStyle(&sSrc->fmt); - style = ME_ToCF2W(&styledata, style); + assert(style->cbSize == sizeof(CHARFORMAT2W)); COPY_STYLE_ITEM(CFM_ANIMATION, bAnimation); COPY_STYLE_ITEM(CFM_BACKCOLOR, crBackColor); COPY_STYLE_ITEM(CFM_CHARSET, bCharSet); diff --git a/reactos/dll/win32/riched20/table.c b/reactos/dll/win32/riched20/table.c index cbfa2b3f771..053bedf553a 100644 --- a/reactos/dll/win32/riched20/table.c +++ b/reactos/dll/win32/riched20/table.c @@ -64,10 +64,8 @@ static ME_DisplayItem* ME_InsertEndParaFromCursor(ME_TextEditor *editor, ME_Style *pStyle = ME_GetInsertStyle(editor, nCursor); ME_DisplayItem *tp; ME_Cursor* cursor = &editor->pCursors[nCursor]; - if (cursor->nOffset) { - ME_SplitRunSimple(editor, cursor->pRun, cursor->nOffset); - cursor = &editor->pCursors[nCursor]; - } + if (cursor->nOffset) + ME_SplitRunSimple(editor, cursor); tp = ME_SplitParagraph(editor, cursor->pRun, pStyle, eol_str, paraFlags); ME_ReleaseStyle(pStyle); @@ -249,7 +247,7 @@ void ME_CheckTablesForCorruption(ME_TextEditor *editor) { assert(!(p->member.para.nFlags & (MEPF_ROWSTART|MEPF_ROWEND|MEPF_CELL))); assert(p->member.para.pFmt->dwMask & PFM_TABLE); - assert(!(p->member.para.pFmt->wEffects & PFM_TABLEROWDELIMITER)); + assert(!(p->member.para.pFmt->wEffects & PFE_TABLEROWDELIMITER)); assert(!p->member.para.pCell); p = p->member.para.next_para; } diff --git a/reactos/dll/win32/riched20/txthost.c b/reactos/dll/win32/riched20/txthost.c index 68f44372659..bc96588abdf 100644 --- a/reactos/dll/win32/riched20/txthost.c +++ b/reactos/dll/win32/riched20/txthost.c @@ -36,7 +36,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(richedit); typedef struct ITextHostImpl { - const ITextHostVtbl *lpVtbl; + ITextHost ITextHost_iface; LONG ref; HWND hWnd; BOOL bEmulateVersion10; @@ -52,12 +52,12 @@ ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion1 { ME_TextEditor *editor; - texthost->lpVtbl = &textHostVtbl; + texthost->ITextHost_iface.lpVtbl = &textHostVtbl; texthost->ref = 1; texthost->hWnd = hwnd; texthost->bEmulateVersion10 = bEmulateVersion10; - editor = ME_MakeEditor((ITextHost*)texthost, bEmulateVersion10); + editor = ME_MakeEditor(&texthost->ITextHost_iface, bEmulateVersion10); editor->exStyleFlags = GetWindowLongW(hwnd, GWL_EXSTYLE); editor->styleFlags |= GetWindowLongW(hwnd, GWL_STYLE) & ES_WANTRETURN; editor->hWnd = hwnd; /* FIXME: Remove editor's dependence on hWnd */ @@ -65,14 +65,17 @@ ITextHost *ME_CreateTextHost(HWND hwnd, CREATESTRUCTW *cs, BOOL bEmulateVersion1 SetWindowLongPtrW(hwnd, 0, (LONG_PTR)editor); } - return (ITextHost*)texthost; + return &texthost->ITextHost_iface; } -static HRESULT WINAPI ITextHostImpl_QueryInterface(ITextHost *iface, - REFIID riid, - LPVOID *ppvObject) +static inline ITextHostImpl *impl_from_ITextHost(ITextHost *iface) { - ITextHostImpl *This = (ITextHostImpl *)iface; + return CONTAINING_RECORD(iface, ITextHostImpl, ITextHost_iface); +} + +static HRESULT WINAPI ITextHostImpl_QueryInterface(ITextHost *iface, REFIID riid, void **ppvObject) +{ + ITextHostImpl *This = impl_from_ITextHost(iface); if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_ITextHost)) { *ppvObject = This; @@ -86,14 +89,14 @@ static HRESULT WINAPI ITextHostImpl_QueryInterface(ITextHost *iface, static ULONG WINAPI ITextHostImpl_AddRef(ITextHost *iface) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); ULONG ref = InterlockedIncrement(&This->ref); return ref; } static ULONG WINAPI ITextHostImpl_Release(ITextHost *iface) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); ULONG ref = InterlockedDecrement(&This->ref); if (!ref) @@ -104,182 +107,155 @@ static ULONG WINAPI ITextHostImpl_Release(ITextHost *iface) return ref; } -HDC WINAPI ITextHostImpl_TxGetDC(ITextHost *iface) +DECLSPEC_HIDDEN HDC WINAPI ITextHostImpl_TxGetDC(ITextHost *iface) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); return GetDC(This->hWnd); } -INT WINAPI ITextHostImpl_TxReleaseDC(ITextHost *iface, - HDC hdc) +DECLSPEC_HIDDEN INT WINAPI ITextHostImpl_TxReleaseDC(ITextHost *iface, HDC hdc) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); return ReleaseDC(This->hWnd, hdc); } -BOOL WINAPI ITextHostImpl_TxShowScrollBar(ITextHost *iface, - INT fnBar, - BOOL fShow) +DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxShowScrollBar(ITextHost *iface, INT fnBar, BOOL fShow) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); return ShowScrollBar(This->hWnd, fnBar, fShow); } -BOOL WINAPI ITextHostImpl_TxEnableScrollBar(ITextHost *iface, - INT fuSBFlags, - INT fuArrowflags) +DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxEnableScrollBar(ITextHost *iface, INT fuSBFlags, INT fuArrowflags) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); return EnableScrollBar(This->hWnd, fuSBFlags, fuArrowflags); } -BOOL WINAPI ITextHostImpl_TxSetScrollRange(ITextHost *iface, - INT fnBar, - LONG nMinPos, - INT nMaxPos, +DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetScrollRange(ITextHost *iface, INT fnBar, LONG nMinPos, INT nMaxPos, BOOL fRedraw) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); return SetScrollRange(This->hWnd, fnBar, nMinPos, nMaxPos, fRedraw); } -BOOL WINAPI ITextHostImpl_TxSetScrollPos(ITextHost *iface, - INT fnBar, - INT nPos, - BOOL fRedraw) +DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetScrollPos(ITextHost *iface, INT fnBar, INT nPos, BOOL fRedraw) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); int pos = SetScrollPos(This->hWnd, fnBar, nPos, fRedraw); return (pos ? TRUE : FALSE); } -void WINAPI ITextHostImpl_TxInvalidateRect(ITextHost *iface, - LPCRECT prc, - BOOL fMode) +DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxInvalidateRect(ITextHost *iface, LPCRECT prc, BOOL fMode) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); InvalidateRect(This->hWnd, prc, fMode); } -void WINAPI ITextHostImpl_TxViewChange(ITextHost *iface, - BOOL fUpdate) +DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxViewChange(ITextHost *iface, BOOL fUpdate) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); if (fUpdate) UpdateWindow(This->hWnd); } -BOOL WINAPI ITextHostImpl_TxCreateCaret(ITextHost *iface, - HBITMAP hbmp, - INT xWidth, INT yHeight) +DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxCreateCaret(ITextHost *iface, HBITMAP hbmp, INT xWidth, INT yHeight) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); return CreateCaret(This->hWnd, hbmp, xWidth, yHeight); } -BOOL WINAPI ITextHostImpl_TxShowCaret(ITextHost *iface, BOOL fShow) +DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxShowCaret(ITextHost *iface, BOOL fShow) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); if (fShow) return ShowCaret(This->hWnd); else return HideCaret(This->hWnd); } -BOOL WINAPI ITextHostImpl_TxSetCaretPos(ITextHost *iface, +DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetCaretPos(ITextHost *iface, INT x, INT y) { return SetCaretPos(x, y); } -BOOL WINAPI ITextHostImpl_TxSetTimer(ITextHost *iface, - UINT idTimer, UINT uTimeout) +DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxSetTimer(ITextHost *iface, UINT idTimer, UINT uTimeout) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); return SetTimer(This->hWnd, idTimer, uTimeout, NULL) != 0; } -void WINAPI ITextHostImpl_TxKillTimer(ITextHost *iface, - UINT idTimer) +DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxKillTimer(ITextHost *iface, UINT idTimer) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); KillTimer(This->hWnd, idTimer); } -void WINAPI ITextHostImpl_TxScrollWindowEx(ITextHost *iface, - INT dx, INT dy, - LPCRECT lprcScroll, - LPCRECT lprcClip, - HRGN hRgnUpdate, - LPRECT lprcUpdate, +DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxScrollWindowEx(ITextHost *iface, INT dx, INT dy, LPCRECT lprcScroll, + LPCRECT lprcClip, HRGN hRgnUpdate, LPRECT lprcUpdate, UINT fuScroll) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); ScrollWindowEx(This->hWnd, dx, dy, lprcScroll, lprcClip, hRgnUpdate, lprcUpdate, fuScroll); } -void WINAPI ITextHostImpl_TxSetCapture(ITextHost *iface, - BOOL fCapture) +DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxSetCapture(ITextHost *iface, BOOL fCapture) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); if (fCapture) SetCapture(This->hWnd); else ReleaseCapture(); } -void WINAPI ITextHostImpl_TxSetFocus(ITextHost *iface) +DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxSetFocus(ITextHost *iface) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); SetFocus(This->hWnd); } -void WINAPI ITextHostImpl_TxSetCursor(ITextHost *iface, +DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxSetCursor(ITextHost *iface, HCURSOR hcur, BOOL fText) { SetCursor(hcur); } -BOOL WINAPI ITextHostImpl_TxScreenToClient(ITextHost *iface, - LPPOINT lppt) +DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxScreenToClient(ITextHost *iface, LPPOINT lppt) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); return ScreenToClient(This->hWnd, lppt); } -BOOL WINAPI ITextHostImpl_TxClientToScreen(ITextHost *iface, - LPPOINT lppt) +DECLSPEC_HIDDEN BOOL WINAPI ITextHostImpl_TxClientToScreen(ITextHost *iface, LPPOINT lppt) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); return ClientToScreen(This->hWnd, lppt); } -HRESULT WINAPI ITextHostImpl_TxActivate(ITextHost *iface, - LONG *plOldState) +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxActivate(ITextHost *iface, LONG *plOldState) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); *plOldState = HandleToLong(SetActiveWindow(This->hWnd)); return (*plOldState ? S_OK : E_FAIL); } -HRESULT WINAPI ITextHostImpl_TxDeactivate(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxDeactivate(ITextHost *iface, LONG lNewState) { HWND ret = SetActiveWindow(LongToHandle(lNewState)); return (ret ? S_OK : E_FAIL); } -HRESULT WINAPI ITextHostImpl_TxGetClientRect(ITextHost *iface, - LPRECT prc) +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetClientRect(ITextHost *iface, LPRECT prc) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); int ret = GetClientRect(This->hWnd, prc); return (ret ? S_OK : E_FAIL); } -HRESULT WINAPI ITextHostImpl_TxGetViewInset(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetViewInset(ITextHost *iface, LPRECT prc) { prc->top = 0; @@ -289,42 +265,41 @@ HRESULT WINAPI ITextHostImpl_TxGetViewInset(ITextHost *iface, return S_OK; } -HRESULT WINAPI ITextHostImpl_TxGetCharFormat(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetCharFormat(ITextHost *iface, const CHARFORMATW **ppCF) { return E_NOTIMPL; } -HRESULT WINAPI ITextHostImpl_TxGetParaFormat(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetParaFormat(ITextHost *iface, const PARAFORMAT **ppPF) { return E_NOTIMPL; } -COLORREF WINAPI ITextHostImpl_TxGetSysColor(ITextHost *iface, +DECLSPEC_HIDDEN COLORREF WINAPI ITextHostImpl_TxGetSysColor(ITextHost *iface, int nIndex) { return GetSysColor(nIndex); } -HRESULT WINAPI ITextHostImpl_TxGetBackStyle(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetBackStyle(ITextHost *iface, TXTBACKSTYLE *pStyle) { *pStyle = TXTBACK_OPAQUE; return S_OK; } -HRESULT WINAPI ITextHostImpl_TxGetMaxLength(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetMaxLength(ITextHost *iface, DWORD *pLength) { *pLength = INFINITE; return S_OK; } -HRESULT WINAPI ITextHostImpl_TxGetScrollBars(ITextHost *iface, - DWORD *pdwScrollBar) +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetScrollBars(ITextHost *iface, DWORD *pdwScrollBar) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); ME_TextEditor *editor = (ME_TextEditor*)GetWindowLongPtrW(This->hWnd, 0); const DWORD mask = WS_VSCROLL| WS_HSCROLL| @@ -345,43 +320,41 @@ HRESULT WINAPI ITextHostImpl_TxGetScrollBars(ITextHost *iface, return S_OK; } -HRESULT WINAPI ITextHostImpl_TxGetPasswordChar(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetPasswordChar(ITextHost *iface, WCHAR *pch) { *pch = '*'; return S_OK; } -HRESULT WINAPI ITextHostImpl_TxGetAcceleratorPos(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetAcceleratorPos(ITextHost *iface, LONG *pch) { *pch = -1; return S_OK; } -HRESULT WINAPI ITextHostImpl_TxGetExtent(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetExtent(ITextHost *iface, LPSIZEL lpExtent) { return E_NOTIMPL; } -HRESULT WINAPI ITextHostImpl_OnTxCharFormatChange(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_OnTxCharFormatChange(ITextHost *iface, const CHARFORMATW *pcf) { return S_OK; } -HRESULT WINAPI ITextHostImpl_OnTxParaFormatChange(ITextHost *iface, +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_OnTxParaFormatChange(ITextHost *iface, const PARAFORMAT *ppf) { return S_OK; } -HRESULT WINAPI ITextHostImpl_TxGetPropertyBits(ITextHost *iface, - DWORD dwMask, - DWORD *pdwBits) +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetPropertyBits(ITextHost *iface, DWORD dwMask, DWORD *pdwBits) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); ME_TextEditor *editor = (ME_TextEditor *)GetWindowLongPtrW(This->hWnd, 0); DWORD style; DWORD dwBits = 0; @@ -445,11 +418,9 @@ HRESULT WINAPI ITextHostImpl_TxGetPropertyBits(ITextHost *iface, return S_OK; } -HRESULT WINAPI ITextHostImpl_TxNotify(ITextHost *iface, - DWORD iNotify, - void *pv) +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxNotify(ITextHost *iface, DWORD iNotify, void *pv) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); ME_TextEditor *editor = (ME_TextEditor*)GetWindowLongPtrW(This->hWnd, 0); HWND hwnd = This->hWnd; UINT id; @@ -505,23 +476,21 @@ HRESULT WINAPI ITextHostImpl_TxNotify(ITextHost *iface, return S_OK; } -HIMC WINAPI ITextHostImpl_TxImmGetContext(ITextHost *iface) +DECLSPEC_HIDDEN HIMC WINAPI ITextHostImpl_TxImmGetContext(ITextHost *iface) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); return ImmGetContext(This->hWnd); } -void WINAPI ITextHostImpl_TxImmReleaseContext(ITextHost *iface, - HIMC himc) +DECLSPEC_HIDDEN void WINAPI ITextHostImpl_TxImmReleaseContext(ITextHost *iface, HIMC himc) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); ImmReleaseContext(This->hWnd, himc); } -HRESULT WINAPI ITextHostImpl_TxGetSelectionBarWidth(ITextHost *iface, - LONG *lSelBarWidth) +DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetSelectionBarWidth(ITextHost *iface, LONG *lSelBarWidth) { - ITextHostImpl *This = (ITextHostImpl *)iface; + ITextHostImpl *This = impl_from_ITextHost(iface); ME_TextEditor *editor = (ME_TextEditor *)GetWindowLongPtrW(This->hWnd, 0); DWORD style = editor ? editor->styleFlags diff --git a/reactos/dll/win32/riched20/txtsrv.c b/reactos/dll/win32/riched20/txtsrv.c index 8db45e8e24d..a2fe8dc3a70 100644 --- a/reactos/dll/win32/riched20/txtsrv.c +++ b/reactos/dll/win32/riched20/txtsrv.c @@ -54,7 +54,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(richedit); typedef struct ITextServicesImpl { - const ITextServicesVtbl *lpVtbl; + ITextServices ITextServices_iface; ITextHost *pMyHost; LONG ref; CRITICAL_SECTION csTxtSrv; @@ -85,13 +85,14 @@ HRESULT WINAPI CreateTextServices(IUnknown * pUnkOuter, ITextImpl->ref = 1; ITextHost_AddRef(pITextHost); ITextImpl->pMyHost = pITextHost; - ITextImpl->lpVtbl = &textservices_Vtbl; + ITextImpl->ITextServices_iface.lpVtbl = &textservices_Vtbl; ITextImpl->editor = ME_MakeEditor(pITextHost, FALSE); ITextImpl->editor->exStyleFlags = 0; ITextImpl->editor->rcFormat.left = 0; ITextImpl->editor->rcFormat.top = 0; ITextImpl->editor->rcFormat.right = 0; ITextImpl->editor->rcFormat.bottom = 0; + ME_HandleMessage(ITextImpl->editor, WM_CREATE, 0, 0, TRUE, &hres); if (pUnkOuter) @@ -100,18 +101,19 @@ HRESULT WINAPI CreateTextServices(IUnknown * pUnkOuter, return CLASS_E_NOAGGREGATION; } - *ppUnk = (IUnknown *)ITextImpl; + *ppUnk = (IUnknown *)&ITextImpl->ITextServices_iface; return S_OK; } -#define ICOM_THIS_MULTI(impl,field,iface) \ - impl* const This=(impl*)((char*)(iface) - offsetof(impl,field)) - -static HRESULT WINAPI fnTextSrv_QueryInterface(ITextServices * iface, - REFIID riid, - LPVOID * ppv) +static inline ITextServicesImpl *impl_from_ITextServices(ITextServices *iface) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + return CONTAINING_RECORD(iface, ITextServicesImpl, ITextServices_iface); +} + +static HRESULT WINAPI fnTextSrv_QueryInterface(ITextServices *iface, REFIID riid, void **ppv) +{ + ITextServicesImpl *This = impl_from_ITextServices(iface); + TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv); *ppv = NULL; if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_ITextServices)) @@ -129,7 +131,7 @@ static HRESULT WINAPI fnTextSrv_QueryInterface(ITextServices * iface, static ULONG WINAPI fnTextSrv_AddRef(ITextServices *iface) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); DWORD ref = InterlockedIncrement(&This->ref); TRACE("(%p/%p)->() AddRef from %d\n", This, iface, ref - 1); @@ -138,7 +140,7 @@ static ULONG WINAPI fnTextSrv_AddRef(ITextServices *iface) static ULONG WINAPI fnTextSrv_Release(ITextServices *iface) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); DWORD ref = InterlockedDecrement(&This->ref); TRACE("(%p/%p)->() Release from %d\n", This, iface, ref + 1); @@ -153,13 +155,10 @@ static ULONG WINAPI fnTextSrv_Release(ITextServices *iface) return ref; } -HRESULT WINAPI fnTextSrv_TxSendMessage(ITextServices *iface, - UINT msg, - WPARAM wparam, - LPARAM lparam, - LRESULT* plresult) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxSendMessage(ITextServices *iface, UINT msg, WPARAM wparam, + LPARAM lparam, LRESULT *plresult) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); HRESULT hresult; LRESULT lresult; @@ -168,34 +167,22 @@ HRESULT WINAPI fnTextSrv_TxSendMessage(ITextServices *iface, return hresult; } -HRESULT WINAPI fnTextSrv_TxDraw(ITextServices *iface, - DWORD dwDrawAspect, - LONG lindex, - void* pvAspect, - DVTARGETDEVICE* ptd, - HDC hdcDraw, - HDC hdcTargetDev, - LPCRECTL lprcBounds, - LPCRECTL lprcWBounds, - LPRECT lprcUpdate, - BOOL (CALLBACK * pfnContinue)(DWORD), - DWORD dwContinue, +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxDraw(ITextServices *iface, DWORD dwDrawAspect, LONG lindex, + void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw, HDC hdcTargetDev, + LPCRECTL lprcBounds, LPCRECTL lprcWBounds, LPRECT lprcUpdate, + BOOL (CALLBACK * pfnContinue)(DWORD), DWORD dwContinue, LONG lViewId) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_TxGetHScroll(ITextServices *iface, - LONG* plMin, - LONG* plMax, - LONG* plPos, - LONG* plPage, - BOOL* pfEnabled) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetHScroll(ITextServices *iface, LONG *plMin, LONG *plMax, LONG *plPos, + LONG *plPage, BOOL *pfEnabled) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); *plMin = This->editor->horz_si.nMin; *plMax = This->editor->horz_si.nMax; @@ -205,14 +192,10 @@ HRESULT WINAPI fnTextSrv_TxGetHScroll(ITextServices *iface, return S_OK; } -HRESULT WINAPI fnTextSrv_TxGetVScroll(ITextServices *iface, - LONG* plMin, - LONG* plMax, - LONG* plPos, - LONG* plPage, - BOOL* pfEnabled) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetVScroll(ITextServices *iface, LONG *plMin, LONG *plMax, LONG *plPos, + LONG *plPage, BOOL *pfEnabled) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); *plMin = This->editor->vert_si.nMin; *plMax = This->editor->vert_si.nMax; @@ -222,76 +205,62 @@ HRESULT WINAPI fnTextSrv_TxGetVScroll(ITextServices *iface, return S_OK; } -HRESULT WINAPI fnTextSrv_OnTxSetCursor(ITextServices *iface, - DWORD dwDrawAspect, - LONG lindex, - void* pvAspect, - DVTARGETDEVICE* ptd, - HDC hdcDraw, - HDC hicTargetDev, - LPCRECT lprcClient, - INT x, INT y) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxSetCursor(ITextServices *iface, DWORD dwDrawAspect, LONG lindex, + void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw, + HDC hicTargetDev, LPCRECT lprcClient, INT x, INT y) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_TxQueryHitPoint(ITextServices *iface, - DWORD dwDrawAspect, - LONG lindex, - void* pvAspect, - DVTARGETDEVICE* ptd, - HDC hdcDraw, - HDC hicTargetDev, - LPCRECT lprcClient, - INT x, INT y, - DWORD* pHitResult) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxQueryHitPoint(ITextServices *iface, DWORD dwDrawAspect, LONG lindex, + void *pvAspect, DVTARGETDEVICE *ptd, HDC hdcDraw, + HDC hicTargetDev, LPCRECT lprcClient, INT x, INT y, + DWORD *pHitResult) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_OnTxInplaceActivate(ITextServices *iface, - LPCRECT prcClient) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxInplaceActivate(ITextServices *iface, LPCRECT prcClient) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_OnTxInplaceDeactivate(ITextServices *iface) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxInplaceDeactivate(ITextServices *iface) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_OnTxUIActivate(ITextServices *iface) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxUIActivate(ITextServices *iface) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_OnTxUIDeactivate(ITextServices *iface) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxUIDeactivate(ITextServices *iface) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_TxGetText(ITextServices *iface, - BSTR* pbstrText) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetText(ITextServices *iface, BSTR *pbstrText) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); int length; length = ME_GetTextLength(This->editor); @@ -313,10 +282,9 @@ HRESULT WINAPI fnTextSrv_TxGetText(ITextServices *iface, return S_OK; } -HRESULT WINAPI fnTextSrv_TxSetText(ITextServices *iface, - LPCWSTR pszText) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxSetText(ITextServices *iface, LPCWSTR pszText) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); ME_Cursor cursor; ME_SetCursorToStart(This->editor, &cursor); @@ -328,69 +296,56 @@ HRESULT WINAPI fnTextSrv_TxSetText(ITextServices *iface, This->editor->nModifyStep = 0; OleFlushClipboard(); ME_EmptyUndoStack(This->editor); - ME_UpdateRepaint(This->editor); + ME_UpdateRepaint(This->editor, FALSE); return S_OK; } -HRESULT WINAPI fnTextSrv_TxGetCurrentTargetX(ITextServices *iface, - LONG* x) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetCurrentTargetX(ITextServices *iface, LONG *x) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_TxGetBaseLinePos(ITextServices *iface, - LONG* x) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetBaseLinePos(ITextServices *iface, LONG *x) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_TxGetNaturalSize(ITextServices *iface, - DWORD dwAspect, - HDC hdcDraw, - HDC hicTargetDev, - DVTARGETDEVICE* ptd, - DWORD dwMode, - const SIZEL* psizelExtent, - LONG* pwidth, - LONG* pheight) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetNaturalSize(ITextServices *iface, DWORD dwAspect, HDC hdcDraw, + HDC hicTargetDev, DVTARGETDEVICE *ptd, DWORD dwMode, + const SIZEL *psizelExtent, LONG *pwidth, LONG *pheight) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_TxGetDropTarget(ITextServices *iface, - IDropTarget** ppDropTarget) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetDropTarget(ITextServices *iface, IDropTarget **ppDropTarget) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_OnTxPropertyBitsChange(ITextServices *iface, - DWORD dwMask, - DWORD dwBits) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_OnTxPropertyBitsChange(ITextServices *iface, DWORD dwMask, DWORD dwBits) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; } -HRESULT WINAPI fnTextSrv_TxGetCachedSize(ITextServices *iface, - DWORD* pdwWidth, - DWORD* pdwHeight) +DECLSPEC_HIDDEN HRESULT WINAPI fnTextSrv_TxGetCachedSize(ITextServices *iface, DWORD *pdwWidth, DWORD *pdwHeight) { - ICOM_THIS_MULTI(ITextServicesImpl, lpVtbl, iface); + ITextServicesImpl *This = impl_from_ITextServices(iface); FIXME("%p: STUB\n", This); return E_NOTIMPL; diff --git a/reactos/dll/win32/riched20/undo.c b/reactos/dll/win32/riched20/undo.c index 8dab8fef8c4..a101cc178c6 100644 --- a/reactos/dll/win32/riched20/undo.c +++ b/reactos/dll/win32/riched20/undo.c @@ -206,7 +206,7 @@ void ME_CommitUndo(ME_TextEditor *editor) { } /** - * Groups supsequent changes with previous ones for an undo if coalescing. + * Groups subsequent changes with previous ones for an undo if coalescing. * * Has no effect if the previous changes were followed by a ME_CommitUndo. This * function will only have an affect if the previous changes were followed by @@ -336,7 +336,7 @@ static void ME_PlayUndoItem(ME_TextEditor *editor, ME_DisplayItem *pItem) int paraFlags = pItem->member.para.nFlags & (MEPF_ROWSTART|MEPF_CELL|MEPF_ROWEND); ME_CursorFromCharOfs(editor, pUItem->nStart, &tmp); if (tmp.nOffset) - tmp.pRun = ME_SplitRunSimple(editor, tmp.pRun, tmp.nOffset); + ME_SplitRunSimple(editor, &tmp); assert(pUItem->eol_str); this_para = tmp.pPara; bFixRowStart = this_para->member.para.nFlags & MEPF_ROWSTART; @@ -402,7 +402,7 @@ BOOL ME_Undo(ME_TextEditor *editor) { ME_CheckTablesForCorruption(editor); editor->nUndoStackSize--; editor->nUndoMode = nMode; - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return TRUE; } @@ -438,6 +438,6 @@ BOOL ME_Redo(ME_TextEditor *editor) { ME_AddUndoItem(editor, diUndoEndTransaction, NULL); ME_CheckTablesForCorruption(editor); editor->nUndoMode = nMode; - ME_UpdateRepaint(editor); + ME_UpdateRepaint(editor, FALSE); return TRUE; } diff --git a/reactos/dll/win32/riched20/wrap.c b/reactos/dll/win32/riched20/wrap.c index 8d75b7fbf97..cca2cb12fbe 100644 --- a/reactos/dll/win32/riched20/wrap.c +++ b/reactos/dll/win32/riched20/wrap.c @@ -271,7 +271,7 @@ static ME_DisplayItem *ME_SplitByBacktracking(ME_WrapContext *wc, ME_DisplayItem { if (wc->pLastSplittableRun->member.run.nFlags & (MERF_GRAPHICS|MERF_TAB)) { - wc->pt = wc->ptLastSplittableRun; + wc->pt = wc->pLastSplittableRun->member.run.pt; return wc->pLastSplittableRun; } else if (wc->pLastSplittableRun->member.run.nFlags & MERF_SPLITTABLE) @@ -299,7 +299,7 @@ static ME_DisplayItem *ME_SplitByBacktracking(ME_WrapContext *wc, ME_DisplayItem else { /* restart from the first run beginning with spaces */ - wc->pt = wc->ptLastSplittableRun; + wc->pt = wc->pLastSplittableRun->member.run.pt; return wc->pLastSplittableRun; } } @@ -349,7 +349,6 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p) return p->next; if (run->nFlags & MERF_WHITESPACE) { - p->member.run.nFlags |= MERF_SKIPPED; wc->pt.x += run->nWidth; /* skip runs consisting of only whitespaces */ return p->next; @@ -362,7 +361,9 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p) if (black) { wc->bOverflown = FALSE; pp = ME_SplitRun(wc, p, black); - p->member.run.nFlags |= MERF_SKIPPED; + ME_CalcRunExtent(wc->context, &wc->pPara->member.para, + wc->nRow ? wc->nLeftMargin : wc->nFirstMargin, + &pp->member.run); ME_InsertRowStart(wc, pp); return pp; } @@ -451,7 +452,6 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p) || ((run->nFlags & (MERF_GRAPHICS|MERF_TAB)) && (p != wc->pRowStart))) { wc->pLastSplittableRun = p; - wc->ptLastSplittableRun = wc->pt; } wc->pt.x += run->nWidth; return p->next; @@ -480,7 +480,32 @@ static int ME_GetParaLineSpace(ME_Context* c, ME_Paragraph* para) return sp * c->editor->nZoomNumerator / c->editor->nZoomDenominator; } -static void ME_PrepareParagraphForWrapping(ME_Context *c, ME_DisplayItem *tp); +static void ME_PrepareParagraphForWrapping(ME_Context *c, ME_DisplayItem *tp) { + ME_DisplayItem *p; + + tp->member.para.nWidth = 0; + /* remove row start items as they will be reinserted by the + * paragraph wrapper anyway */ + tp->member.para.nRows = 0; + for (p = tp->next; p != tp->member.para.next_para; p = p->next) { + if (p->type == diStartRow) { + ME_DisplayItem *pRow = p; + p = p->prev; + ME_Remove(pRow); + ME_DestroyDisplayItem(pRow); + } + } + /* join runs that can be joined */ + for (p = tp->next; p != tp->member.para.next_para; p = p->next) { + assert(p->type != diStartRow); /* should have been deleted above */ + if (p->type == diRun) { + while (p->next->type == diRun && /* FIXME */ + ME_CanJoinRuns(&p->member.run, &p->next->member.run)) { + ME_JoinRuns(c->editor, p); + } + } + } +} static void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp) { ME_DisplayItem *p; @@ -558,45 +583,6 @@ static void ME_WrapTextParagraph(ME_Context *c, ME_DisplayItem *tp) { tp->member.para.nRows = wc.nRow; } - -static void ME_PrepareParagraphForWrapping(ME_Context *c, ME_DisplayItem *tp) { - ME_DisplayItem *p, *pRow; - - tp->member.para.nWidth = 0; - /* remove all items that will be reinserted by paragraph wrapper anyway */ - tp->member.para.nRows = 0; - for (p = tp->next; p!=tp->member.para.next_para; p = p->next) { - switch(p->type) { - case diStartRow: - pRow = p; - p = p->prev; - ME_Remove(pRow); - ME_DestroyDisplayItem(pRow); - break; - default: - break; - } - } - /* join runs that can be joined, set up flags */ - for (p = tp->next; p!=tp->member.para.next_para; p = p->next) { - switch(p->type) { - case diStartRow: assert(0); break; /* should have deleted it */ - case diRun: - while (p->next->type == diRun) { /* FIXME */ - if (ME_CanJoinRuns(&p->member.run, &p->next->member.run)) { - ME_JoinRuns(c->editor, p); - } - else - break; - } - p->member.run.nFlags &= ~MERF_CALCBYWRAP; - break; - default: - break; - } - } -} - BOOL ME_WrapMarkedParagraphs(ME_TextEditor *editor) { ME_DisplayItem *item; diff --git a/reactos/dll/win32/riched20/writer.c b/reactos/dll/win32/riched20/writer.c index 8c8714504b8..a5e5d509cb3 100644 --- a/reactos/dll/win32/riched20/writer.c +++ b/reactos/dll/win32/riched20/writer.c @@ -54,7 +54,7 @@ ME_StreamOutFlush(ME_OutStream *pStream) LONG nRemaining = 0; EDITSTREAM *stream = pStream->stream; - do { + while (nStart < pStream->pos) { TRACE("sending %u bytes\n", pStream->pos - nStart); /* Some apps seem not to set *pcb unless a problem arises, relying on initial random nWritten value, which is usually >STREAMOUT_BUFFER_SIZE */ @@ -72,7 +72,7 @@ ME_StreamOutFlush(ME_OutStream *pStream) return FALSE; pStream->written += nWritten; nStart += nWritten; - } while (nStart < pStream->pos); + } pStream->pos = 0; return TRUE; } @@ -927,7 +927,7 @@ static BOOL ME_StreamOutText(ME_TextEditor *editor, ME_OutStream *pStream, if (!editor->bEmulateVersion10 && cursor.pRun->member.run.nFlags & MERF_ENDPARA) { - static const WCHAR szEOL[2] = { '\r', '\n' }; + static const WCHAR szEOL[] = { '\r', '\n' }; /* richedit 2.0 - all line breaks are \r\n */ if (dwFormat & SF_UNICODE) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 6ea252a9260..6dd937d1a1a 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -138,7 +138,7 @@ reactos/dll/win32/pstorec # Synced to Wine-1.3.37 reactos/dll/win32/query # Synced to Wine-1.3.37 reactos/dll/win32/rasapi32 # Synced to Wine-1.3.37 reactos/dll/win32/resutils # Autosync -reactos/dll/win32/riched20 # Autosync +reactos/dll/win32/riched20 # Synced to Wine-1.3.37 reactos/dll/win32/riched32 # Autosync reactos/dll/win32/rpcrt4 # Synced to Wine-1.3.26 reactos/dll/win32/rsabase # Autosync From 1aac8171b03668626c4cfb28c1a147503bdb665b Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 29 Jan 2012 23:30:22 +0000 Subject: [PATCH 164/289] [COMCTL32] - Fix MSVC build. Already sent upstream svn path=/trunk/; revision=55306 --- reactos/dll/win32/comctl32/imagelist.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/comctl32/imagelist.c b/reactos/dll/win32/comctl32/imagelist.c index ccc594f09f6..61cfbe3aaee 100644 --- a/reactos/dll/win32/comctl32/imagelist.c +++ b/reactos/dll/win32/comctl32/imagelist.c @@ -3094,13 +3094,13 @@ static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count) if ((ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) || ilc == ILC_COLOR) { - char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )]; - BITMAPINFO *bmi = (BITMAPINFO *)buffer; + BITMAPINFO *bmi = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, FIELD_OFFSET( BITMAPINFO, bmiColors[256] )); + if (bmi == NULL) + return NULL; TRACE("Creating DIBSection %d x %d, %d Bits per Pixel\n", sz.cx, sz.cy, himl->uBitsPixel); - memset( buffer, 0, sizeof(buffer) ); bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi->bmiHeader.biWidth = sz.cx; bmi->bmiHeader.biHeight = sz.cy; @@ -3116,6 +3116,7 @@ static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count) DeleteObject( tmp ); } hbmNewBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, NULL, 0, 0); + HeapFree( GetProcessHeap(), 0, bmi ); } else /*if (ilc == ILC_COLORDDB)*/ { From 64cab884948d228a1ff52748fc521c87aa38f8f4 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 00:12:38 +0000 Subject: [PATCH 165/289] [SMLIB]: Add NT-compatible SmConnectToSm and SmExecPgm functions to smlib, which CSRSS and other subsystems can use to talk to SMSS (and SMSS when it talks to itself). Not yet used. svn path=/trunk/; revision=55308 --- reactos/lib/smlib/CMakeLists.txt | 3 +- reactos/lib/smlib/smclient.c | 130 +++++++++++++++++++++++++++++++ 2 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 reactos/lib/smlib/smclient.c diff --git a/reactos/lib/smlib/CMakeLists.txt b/reactos/lib/smlib/CMakeLists.txt index 2bcda9d48c8..f9ea37c41fe 100644 --- a/reactos/lib/smlib/CMakeLists.txt +++ b/reactos/lib/smlib/CMakeLists.txt @@ -5,7 +5,8 @@ list(APPEND SOURCE compses.c connect.c execpgm.c - lookupss.c) + lookupss.c + smclient.c) add_library(smlib ${SOURCE}) add_pch(smlib precomp.h) diff --git a/reactos/lib/smlib/smclient.c b/reactos/lib/smlib/smclient.c new file mode 100644 index 00000000000..b8f4ef3326b --- /dev/null +++ b/reactos/lib/smlib/smclient.c @@ -0,0 +1,130 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: lib/smlib/smclient.c + * PURPOSE: SMSS Client Library Stubs for calling SM APIs from a client + * PROGRAMMERS: Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include "precomp.h" +#include "sm/smmsg.h" // To go in precomp.h after +#define NDEBUG +#include "debug.h" + +/* FUNCTIONS ******************************************************************/ + +NTSTATUS +NTAPI +SmExecPgm(IN HANDLE SmApiPort, + IN PRTL_USER_PROCESS_INFORMATION ProcessInformation, + IN BOOLEAN DebugFlag) +{ + NTSTATUS Status; + SM_API_MSG SmApiMsg; + +#ifdef _WIN64 // You can take care of this Timo + /* 64-bit SMSS needs to talk to 32-bit processes so do the LPC conversion */ + if (SmpIsWow64Process()) + { + return SmpWow64ExecPgm(SmApiPort, ProcessInformation, DebugFlag); + } +#endif + + /* Initialize the generic LPC header */ + SmApiMsg.h.u2.ZeroInit = 0; + SmApiMsg.h.u1.s1.DataLength = sizeof(SM_EXEC_PGM_MSG) + 8; + SmApiMsg.h.u1.s1.TotalLength = sizeof(SmApiMsg); + + /* Initalize this specific API's parameters */ + SmApiMsg.ApiNumber = SmpExecPgm; + RtlCopyMemory(&SmApiMsg.u.ExecPgm.ProcessInformation, + ProcessInformation, + sizeof(SmApiMsg.u.ExecPgm.ProcessInformation)); + SmApiMsg.u.ExecPgm.DebugFlag = DebugFlag; + + /* Send the message to SMSS */ + Status = NtRequestWaitReplyPort(SmApiPort, &SmApiMsg.h, &SmApiMsg.h); + if (!NT_SUCCESS(Status)) + { + DbgPrint("SmExecPgm: NtRequestWaitReply Failed %lx\n", Status); + } + else + { + /* Upon success, we use the API's return value */ + Status = SmApiMsg.ReturnValue; + } + + /* Close the handles that the parent passed in and return status */ + NtClose(ProcessInformation->ProcessHandle); + NtClose(ProcessInformation->ThreadHandle); + return Status; +} + +NTSTATUS +NTAPI +SmConnectToSm(IN PUNICODE_STRING SbApiPortName, + IN HANDLE SbApiPort, + IN ULONG ImageType, + IN HANDLE SmApiPort) +{ + NTSTATUS Status; + SB_CONNECTION_INFO ConnectInfo; + UNICODE_STRING DestinationString; + SECURITY_QUALITY_OF_SERVICE SecurityQos; + ULONG ConnectInfoLength = sizeof(ConnectInfo); + + /* Setup the QoS structure */ + SecurityQos.ImpersonationLevel = SecurityIdentification; + SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; + SecurityQos.EffectiveOnly = TRUE; + + /* Set the SM API port name */ + RtlInitUnicodeString(&DestinationString, L"\\SmApiPort"); + + /* Check if this is a client connecting to SMSS, or SMSS to itself */ + if (SbApiPortName) + { + /* A client SB port as well as an image type must be present */ + if (!(SbApiPort) || !(ImageType)) return STATUS_INVALID_PARAMETER_MIX; + + /* Copy the client port name, and NULL-terminate it */ + RtlCopyMemory(ConnectInfo.SbApiPortName, + SbApiPortName->Buffer, + SbApiPortName->Length); + ConnectInfo.SbApiPortName[SbApiPortName->Length / + sizeof(WCHAR)] = UNICODE_NULL; + + /* Save the subsystem type */ + ConnectInfo.SubsystemType = ImageType; + } + else + { + /* No client port, and the subsystem type is not set */ + ConnectInfo.SbApiPortName[0] = UNICODE_NULL; + ConnectInfo.SubsystemType = IMAGE_SUBSYSTEM_UNKNOWN; + } + + /* Connect to SMSS and exchange connection information */ + Status = NtConnectPort(SmApiPort, + &DestinationString, + &SecurityQos, + NULL, + NULL, + NULL, + &ConnectInfo, + &ConnectInfoLength); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SmConnectToSm: Connect to Sm failed %lx\n", Status); + } + else + { + /* Treat a warning or informational status as success */ + Status = STATUS_SUCCESS; + } + + /* Return if the connection was successful or not */ + return Status; +} From 4e3bf71826025d90fe1b6255f2ec04f138e0c3fd Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 01:14:33 +0000 Subject: [PATCH 166/289] [RTL]: Document, define, implement, and export RtlSetThreadIsCritical. svn path=/trunk/; revision=55310 --- reactos/dll/ntdll/def/ntdll.pspec | 2 +- reactos/dll/ntdll/def/ntdll.spec | 2 +- reactos/include/ndk/rtlfuncs.h | 9 +++++ reactos/include/reactos/subsys/sm/smmsg.h | 1 + reactos/lib/rtl/process.c | 11 +++--- reactos/lib/rtl/thread.c | 42 +++++++++++++++++++++++ 6 files changed, 61 insertions(+), 6 deletions(-) diff --git a/reactos/dll/ntdll/def/ntdll.pspec b/reactos/dll/ntdll/def/ntdll.pspec index d1ae0cbd155..7eb3e5519e9 100644 --- a/reactos/dll/ntdll/def/ntdll.pspec +++ b/reactos/dll/ntdll/def/ntdll.pspec @@ -895,7 +895,7 @@ @ stdcall RtlSetSecurityObject(long ptr ptr ptr ptr) //@ stdcall RtlSetSecurityObjectEx //@ stdcall RtlSetThreadErrorMode -//@ stdcall RtlSetThreadIsCritical +@ stdcall RtlSetThreadIsCritical(long ptr long) //@ stdcall RtlSetThreadPoolStartFunc @ stdcall RtlSetTimeZoneInformation(ptr) //@ stdcall RtlSetTimer diff --git a/reactos/dll/ntdll/def/ntdll.spec b/reactos/dll/ntdll/def/ntdll.spec index d1026472f2d..ec779e88411 100644 --- a/reactos/dll/ntdll/def/ntdll.spec +++ b/reactos/dll/ntdll/def/ntdll.spec @@ -895,7 +895,7 @@ @ stdcall RtlSetSecurityObject(long ptr ptr ptr ptr) ;@ stdcall RtlSetSecurityObjectEx ;@ stdcall RtlSetThreadErrorMode -;@ stdcall RtlSetThreadIsCritical +@ stdcall RtlSetThreadIsCritical(long ptr long) ;@ stdcall RtlSetThreadPoolStartFunc @ stdcall RtlSetTimeZoneInformation(ptr) ;@ stdcall RtlSetTimer diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 50b2a0bd3b3..081027cc763 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -2406,6 +2406,15 @@ RtlSetProcessIsCritical( IN BOOLEAN NeedBreaks ); +NTSYSAPI +NTSTATUS +NTAPI +RtlSetThreadIsCritical( + IN BOOLEAN NewValue, + OUT PBOOLEAN OldValue OPTIONAL, + IN BOOLEAN NeedBreaks +); + NTSYSAPI ULONG NTAPI diff --git a/reactos/include/reactos/subsys/sm/smmsg.h b/reactos/include/reactos/subsys/sm/smmsg.h index 5c30ff24cc3..cf60d8871bc 100644 --- a/reactos/include/reactos/subsys/sm/smmsg.h +++ b/reactos/include/reactos/subsys/sm/smmsg.h @@ -53,6 +53,7 @@ typedef struct _SM_EXEC_PGM_MSG RTL_USER_PROCESS_INFORMATION ProcessInformation; BOOLEAN DebugFlag; } SM_EXEC_PGM_MSG, *PM_EXEC_PGM_MSG; +C_ASSERT(sizeof(SM_EXEC_PGM_MSG) == 0x48); typedef struct _SM_LOAD_DEFERED_SUBSYSTEM_MSG { diff --git a/reactos/lib/rtl/process.c b/reactos/lib/rtl/process.c index ae91e2423f7..1a23086d16d 100644 --- a/reactos/lib/rtl/process.c +++ b/reactos/lib/rtl/process.c @@ -362,16 +362,19 @@ RtlSetProcessIsCritical(IN BOOLEAN NewValue, OUT PBOOLEAN OldValue OPTIONAL, IN BOOLEAN NeedBreaks) { - ULONG BreakOnTermination = FALSE; + ULONG BreakOnTermination; - if (OldValue) - *OldValue = FALSE; + /* Initialize to FALSE */ + if (OldValue) *OldValue = FALSE; /* Fail, if the critical breaks flag is required but is not set */ - if (NeedBreaks == TRUE && + if ((NeedBreaks) && !(NtCurrentPeb()->NtGlobalFlag & FLG_ENABLE_SYSTEM_CRIT_BREAKS)) + { return STATUS_UNSUCCESSFUL; + } + /* Check if the caller wants the old value */ if (OldValue) { /* Query and return the old break on termination flag for the process */ diff --git a/reactos/lib/rtl/thread.c b/reactos/lib/rtl/thread.c index 3213b338e64..717cdb2e45c 100644 --- a/reactos/lib/rtl/thread.c +++ b/reactos/lib/rtl/thread.c @@ -150,6 +150,48 @@ RtlpFreeUserStack(IN HANDLE Process, /* FUNCTIONS ***************************************************************/ + +/* + * @implemented + */ +NTSTATUS +NTAPI +RtlSetThreadIsCritical(IN BOOLEAN NewValue, + OUT PBOOLEAN OldValue OPTIONAL, + IN BOOLEAN NeedBreaks) +{ + ULONG BreakOnTermination; + + /* Initialize to FALSE */ + if (OldValue) *OldValue = FALSE; + + /* Fail, if the critical breaks flag is required but is not set */ + if ((NeedBreaks) && + !(NtCurrentPeb()->NtGlobalFlag & FLG_ENABLE_SYSTEM_CRIT_BREAKS)) + { + return STATUS_UNSUCCESSFUL; + } + + /* Check if the caller wants the old value */ + if (OldValue) + { + /* Query and return the old break on termination flag for the process */ + ZwQueryInformationThread(NtCurrentThread(), + ThreadBreakOnTermination, + &BreakOnTermination, + sizeof(ULONG), + NULL); + *OldValue = (BOOLEAN)BreakOnTermination; + } + + /* Set the break on termination flag for the process */ + BreakOnTermination = NewValue; + return ZwSetInformationThread(NtCurrentThread(), + ThreadBreakOnTermination, + &BreakOnTermination, + sizeof(ULONG)); +} + /* @implemented */ From 88cd0f38130e668a2c14f4cdd5fcd7b6c6cf6e30 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 02:10:39 +0000 Subject: [PATCH 167/289] [SMSS2]: Flesh out the _main function in the new SMSS, including the SEH filter and SmpTerminate support. Instead of launching Winlogon (The "initial command", we launch the ReactOS SMSS for now -- and kill the system if it is ever terminated, as we should). We use the right priority, set the right critical flags, use the correct debug parameters, and acquire/release the correct privileges. Only thing not supported is launching ntsd if the "Debug Initial Command" global flag is set. I promise to implement that once someone implements ntsd ;-) svn path=/trunk/; revision=55311 --- reactos/base/system/smss2/CMakeLists.txt | 14 +- reactos/base/system/smss2/crashdmp.c | 17 ++ reactos/base/system/smss2/pagefile.c | 17 ++ reactos/base/system/smss2/sminit.c | 25 +++ reactos/base/system/smss2/smloop.c | 17 ++ reactos/base/system/smss2/smsbapi.c | 17 ++ reactos/base/system/smss2/smsessn.c | 17 ++ reactos/base/system/smss2/smss.c | 260 +++++++++++++++++++---- reactos/base/system/smss2/smss.h | 51 ++++- reactos/base/system/smss2/smsubsys.c | 19 ++ reactos/base/system/smss2/smutil.c | 141 ++++++++++++ 11 files changed, 549 insertions(+), 46 deletions(-) create mode 100644 reactos/base/system/smss2/crashdmp.c create mode 100644 reactos/base/system/smss2/pagefile.c create mode 100644 reactos/base/system/smss2/sminit.c create mode 100644 reactos/base/system/smss2/smloop.c create mode 100644 reactos/base/system/smss2/smsbapi.c create mode 100644 reactos/base/system/smss2/smsessn.c create mode 100644 reactos/base/system/smss2/smsubsys.c create mode 100644 reactos/base/system/smss2/smutil.c diff --git a/reactos/base/system/smss2/CMakeLists.txt b/reactos/base/system/smss2/CMakeLists.txt index 273e5c8c9b6..dfffa88aa0c 100644 --- a/reactos/base/system/smss2/CMakeLists.txt +++ b/reactos/base/system/smss2/CMakeLists.txt @@ -2,12 +2,20 @@ include_directories(${REACTOS_SOURCE_DIR}/include/reactos/subsys) list(APPEND SOURCE - smss.c - smss.rc) + crashdmp.c + pagefile.c + sminit.c + smloop.c + smsbapi.c + smsessn.c + smsubsys.c + smutil.c + smss.c + smss.rc) add_executable(smss2 WIN32 ${SOURCE}) -target_link_libraries(smss2 nt) +target_link_libraries(smss2 nt pseh) add_pch(smss2 smss.h) diff --git a/reactos/base/system/smss2/crashdmp.c b/reactos/base/system/smss2/crashdmp.c new file mode 100644 index 00000000000..8678afa43b2 --- /dev/null +++ b/reactos/base/system/smss2/crashdmp.c @@ -0,0 +1,17 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: base/system/smss/smss.c + * PURPOSE: Main SMSS Code + * PROGRAMMERS: Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include "smss.h" +#define NDEBUG +#include "debug.h" + +/* GLOBALS ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ diff --git a/reactos/base/system/smss2/pagefile.c b/reactos/base/system/smss2/pagefile.c new file mode 100644 index 00000000000..8678afa43b2 --- /dev/null +++ b/reactos/base/system/smss2/pagefile.c @@ -0,0 +1,17 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: base/system/smss/smss.c + * PURPOSE: Main SMSS Code + * PROGRAMMERS: Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include "smss.h" +#define NDEBUG +#include "debug.h" + +/* GLOBALS ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c new file mode 100644 index 00000000000..d0350b9cf22 --- /dev/null +++ b/reactos/base/system/smss2/sminit.c @@ -0,0 +1,25 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: base/system/smss/smss.c + * PURPOSE: Main SMSS Code + * PROGRAMMERS: Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include "smss.h" +#define NDEBUG +#include "debug.h" + +/* GLOBALS ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +NTSTATUS +NTAPI +SmpInit(IN PUNICODE_STRING InitialCommand, + OUT PHANDLE ProcessHandle) +{ + return STATUS_SUCCESS; +} diff --git a/reactos/base/system/smss2/smloop.c b/reactos/base/system/smss2/smloop.c new file mode 100644 index 00000000000..8678afa43b2 --- /dev/null +++ b/reactos/base/system/smss2/smloop.c @@ -0,0 +1,17 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: base/system/smss/smss.c + * PURPOSE: Main SMSS Code + * PROGRAMMERS: Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include "smss.h" +#define NDEBUG +#include "debug.h" + +/* GLOBALS ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ diff --git a/reactos/base/system/smss2/smsbapi.c b/reactos/base/system/smss2/smsbapi.c new file mode 100644 index 00000000000..8678afa43b2 --- /dev/null +++ b/reactos/base/system/smss2/smsbapi.c @@ -0,0 +1,17 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: base/system/smss/smss.c + * PURPOSE: Main SMSS Code + * PROGRAMMERS: Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include "smss.h" +#define NDEBUG +#include "debug.h" + +/* GLOBALS ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ diff --git a/reactos/base/system/smss2/smsessn.c b/reactos/base/system/smss2/smsessn.c new file mode 100644 index 00000000000..8678afa43b2 --- /dev/null +++ b/reactos/base/system/smss2/smsessn.c @@ -0,0 +1,17 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: base/system/smss/smss.c + * PURPOSE: Main SMSS Code + * PROGRAMMERS: Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include "smss.h" +#define NDEBUG +#include "debug.h" + +/* GLOBALS ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ diff --git a/reactos/base/system/smss2/smss.c b/reactos/base/system/smss2/smss.c index c880a174c8b..2be1f0c40c6 100644 --- a/reactos/base/system/smss2/smss.c +++ b/reactos/base/system/smss2/smss.c @@ -28,6 +28,9 @@ ULONG NtInitialUserProcessBufferType = REG_SZ; UNICODE_STRING NtSystemRoot; +ULONG AttachedSessionId = -1; +BOOLEAN SmpDebug; + /* FUNCTIONS ******************************************************************/ NTSTATUS @@ -176,7 +179,7 @@ ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, (USHORT)Size); /* Append the DLL path to it */ - RtlAppendUnicodeToString(&Environment, L"Path=" ); + RtlAppendUnicodeToString(&Environment, L"Path="); RtlAppendUnicodeStringToString(&Environment, &ProcessParams->DllPath); RtlAppendUnicodeStringToString(&Environment, &NullString); @@ -246,19 +249,20 @@ ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, NTSTATUS NTAPI -LaunchOldSmss(VOID) +LaunchOldSmss(OUT PHANDLE Handles) { PINIT_BUFFER InitBuffer; PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL; PRTL_USER_PROCESS_INFORMATION ProcessInfo; - LARGE_INTEGER Timeout; NTSTATUS Status; PCHAR Environment; - SIZE_T Size; - + + /* No handles at first */ + Handles[0] = Handles[1] = NULL; + /* Setup system root */ RtlInitUnicodeString(&NtSystemRoot, SharedUserData->NtSystemRoot); - + /* Allocate the initialization buffer */ InitBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(INIT_BUFFER)); if (!InitBuffer) @@ -266,7 +270,7 @@ LaunchOldSmss(VOID) /* Bugcheck */ return STATUS_NO_MEMORY; } - + /* Launch initial process */ ProcessInfo = &InitBuffer->ProcessInfo; Status = ExpLoadInitialProcess(InitBuffer, &ProcessParameters, &Environment); @@ -277,51 +281,223 @@ LaunchOldSmss(VOID) return Status; } - /* Wait 5 seconds for initial process to initialize */ - Timeout.QuadPart = Int32x32To64(5, -10000000); - Status = ZwWaitForSingleObject(ProcessInfo->ProcessHandle, FALSE, &Timeout); - if (Status == STATUS_SUCCESS) - { - /* Failed, display error */ - DPRINT1("INIT: Session Manager terminated.\n"); - return STATUS_UNSUCCESSFUL; - } - - /* Close process handles */ - ZwClose(ProcessInfo->ThreadHandle); - ZwClose(ProcessInfo->ProcessHandle); - - /* Free the initial process environment */ - Size = 0; - ZwFreeVirtualMemory(NtCurrentProcess(), - (PVOID*)&Environment, - &Size, - MEM_RELEASE); - - /* Free the initial process parameters */ - Size = 0; - ZwFreeVirtualMemory(NtCurrentProcess(), - (PVOID*)&ProcessParameters, - &Size, - MEM_RELEASE); - return STATUS_SUCCESS; + /* Return the handle and status */ + Handles[0] = ProcessInfo->ProcessHandle; + Handles[1] = ProcessInfo->ProcessHandle; + return Status; +} + +NTSTATUS +NTAPI +SmpTerminate(IN PULONG_PTR Parameters, + IN ULONG ParameterMask, + IN ULONG ParameterCount) +{ + NTSTATUS Status; + BOOLEAN Old; + ULONG Response; + + /* Give the shutdown privilege to the thread */ + if (RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, TRUE, TRUE, &Old) == + STATUS_NO_TOKEN) + { + /* Thread doesn't have a token, give it to the entire process */ + RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, TRUE, FALSE, &Old); + } + + /* Take down the process/machine with a hard error */ + Status = NtRaiseHardError(STATUS_SYSTEM_PROCESS_TERMINATED, + ParameterCount, + ParameterMask, + Parameters, + OptionShutdownSystem, + &Response); + + /* Terminate the process if the hard error didn't already */ + return NtTerminateProcess(NtCurrentProcess(), Status); +} + +LONG +SmpUnhandledExceptionFilter(IN PEXCEPTION_POINTERS ExceptionInfo) +{ + ULONG_PTR Parameters[4]; + UNICODE_STRING DestinationString; + + /* Print and breakpoint into the debugger */ + DbgPrint("SMSS: Unhandled exception - Status == %x IP == %x\n", + ExceptionInfo->ExceptionRecord->ExceptionCode, + ExceptionInfo->ExceptionRecord->ExceptionAddress); + DbgPrint(" Memory Address: %x Read/Write: %x\n", + ExceptionInfo->ExceptionRecord->ExceptionInformation[0], + ExceptionInfo->ExceptionRecord->ExceptionInformation[1]); + DbgBreakPoint(); + + /* Build the hard error and terminate */ + RtlInitUnicodeString(&DestinationString, L"Unhandled Exception in Session Manager"); + Parameters[0] = (ULONG_PTR)&DestinationString; + Parameters[1] = ExceptionInfo->ExceptionRecord->ExceptionCode; + Parameters[2] = (ULONG_PTR)ExceptionInfo->ExceptionRecord->ExceptionAddress; + Parameters[3] = (ULONG_PTR)ExceptionInfo->ContextRecord; + SmpTerminate(Parameters, 1, RTL_NUMBER_OF(Parameters)); + + /* We hould never get here */ + ASSERT(FALSE); + return EXCEPTION_EXECUTE_HANDLER; } NTSTATUS -__cdecl _main(IN INT argc, IN PCHAR argv[], IN PCHAR envp[], IN ULONG DebugFlag) { NTSTATUS Status; - - /* Launch the original SMSS */ - DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); - Status = LaunchOldSmss(); + KPRIORITY SetBasePriority; + ULONG_PTR Parameters[4]; + HANDLE Handles[2]; + PVOID State; + ULONG Flags; + PROCESS_BASIC_INFORMATION ProcessInfo; + UNICODE_STRING DbgString, InitialCommand; - /* Terminate this SMSS for now, later we'll have an LPC thread running */ - return NtTerminateThread(NtCurrentThread(), Status); + /* Make us critical */ + RtlSetProcessIsCritical(TRUE, NULL, FALSE); + RtlSetThreadIsCritical(TRUE, NULL, FALSE); + + /* Raise our priority */ + SetBasePriority = 11; + Status = NtSetInformationProcess(NtCurrentProcess(), + ProcessBasePriority, + (PVOID)&SetBasePriority, + sizeof(SetBasePriority)); + ASSERT(NT_SUCCESS(Status)); + + /* Save the debug flag if it was passed */ + if (DebugFlag) SmpDebug = DebugFlag; + + /* Build the hard error parameters */ + Parameters[0] = (ULONG_PTR)&DbgString; + Parameters[1] = Parameters[2] = Parameters[3] = 0; + + /* Enter SEH so we can terminate correctly if anything goes wrong */ + _SEH2_TRY + { + /* Initialize SMSS */ + Status = SmpInit(&InitialCommand, Handles); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: SmpInit return failure - Status == %x\n"); + RtlInitUnicodeString(&DbgString, L"Session Manager Initialization"); + Parameters[1] = Status; + _SEH2_LEAVE; + } + + /* Get the global flags */ + Status = NtQuerySystemInformation(SystemFlagsInformation, + &Flags, + sizeof(Flags), + NULL); + ASSERT(NT_SUCCESS(Status)); + + /* Before executing the initial command check if the debug flag is on */ + if (Flags & (FLG_DEBUG_INITIAL_COMMAND | FLG_DEBUG_INITIAL_COMMAND_EX)) + { + /* SMSS should launch ntsd with a few parameters at this point */ + DPRINT1("Global Flags Set to SMSS Debugging: Not yet supported\n"); + } + +#if 0 + /* Execute the initial command (Winlogon.exe) */ + Status = SmpExecuteInitialCommand(0, &InitialCommand, &Handles[1], NULL); +#else + /* Launch the original SMSS */ + DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); + Status = LaunchOldSmss(Handles); +#endif + if (!NT_SUCCESS(Status)) + { + /* Fail and raise a hard error */ + DPRINT1("SMSS: Execute Initial Command failed\n"); + RtlInitUnicodeString(&DbgString, + L"Session Manager ExecuteInitialCommand"); + Parameters[1] = Status; + _SEH2_LEAVE; + } + + /* Check if we're already attached to a session */ + Status = SmpAcquirePrivilege(SE_LOAD_DRIVER_PRIVILEGE, &State); + if (AttachedSessionId != -1) + { + /* Detach from it, we should be in no session right now */ + Status = NtSetSystemInformation(SystemSessionDetach, + &AttachedSessionId, + sizeof(AttachedSessionId)); + ASSERT(NT_SUCCESS(Status)); + AttachedSessionId = -1; + } + SmpReleasePrivilege(State); + + /* Wait on either CSRSS or Winlogon to die */ + Status = NtWaitForMultipleObjects(RTL_NUMBER_OF(Handles), + Handles, + WaitAny, + FALSE, + NULL); + if (Status == STATUS_WAIT_0) + { + /* CSRSS is dead, get exit code and prepare for the hard error */ + RtlInitUnicodeString(&DbgString, L"Windows SubSystem"); + Status = NtQueryInformationProcess(Handles[0], + ProcessBasicInformation, + &ProcessInfo, + sizeof(ProcessInfo), + NULL); + DPRINT1("SMSS: Windows subsystem terminated when it wasn't supposed to.\n"); + } + else + { + /* The initial command is dead or we have another failure */ + RtlInitUnicodeString(&DbgString, L"Windows Logon Process"); + if (Status == STATUS_WAIT_1) + { + /* Winlogon.exe got terminated, get its exit code */ + Status = NtQueryInformationProcess(Handles[1], + ProcessBasicInformation, + &ProcessInfo, + sizeof(ProcessInfo), + NULL); + } + else + { + /* Something else satisfied our wait, so set the wait status */ + ProcessInfo.ExitStatus = Status; + Status = STATUS_SUCCESS; + } + DPRINT1("SMSS: Initial command '%wZ' terminated when it wasn't supposed to.\n", + &InitialCommand); + } + + /* Check if NtQueryInformationProcess was successful */ + if (NT_SUCCESS(Status)) + { + /* Then we must have a valid exit status in the structure, use it */ + Parameters[1] = ProcessInfo.ExitStatus; + } + else + { + /* We really don't know what happened, so set a generic error */ + Parameters[1] = STATUS_UNSUCCESSFUL; + } + } + _SEH2_EXCEPT(SmpUnhandledExceptionFilter(_SEH2_GetExceptionInformation())) + { + /* The filter should never return here */ + ASSERT(FALSE); + } + _SEH2_END; + + /* Something in the init loop failed, terminate SMSS */ + return SmpTerminate(Parameters, 1, RTL_NUMBER_OF(Parameters)); } /* EOF */ diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index 9fc8944ded7..61843994bee 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -1,4 +1,53 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: base/system/smss/smss.h + * PURPOSE: Main SMSS Header + * PROGRAMMERS: Alex Ionescu + */ + +/* DEPENDENCIES ***************************************************************/ + +// +// Native Headers +// #define WIN32_NO_STATUS -#include +#include // Should just be using ntdef.h I think +#define RTL_NUMBER_OF_V1(A) (sizeof(A)/sizeof((A)[0])) +#define RTL_NUMBER_OF_V2(A) RTL_NUMBER_OF_V1(A) +#ifdef ENABLE_RTL_NUMBER_OF_V2 +#define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V2(A) +#else +#define RTL_NUMBER_OF(A) RTL_NUMBER_OF_V1(A) +#endif #define NTOS_MODE_USER #include + +// +// SM Protocol Header +// +#include "sm/smmsg.h" + +/* DEFINES ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +NTSTATUS +NTAPI +SmpInit( + IN PUNICODE_STRING InitialCommand, + OUT PHANDLE ProcessHandle +); + +NTSTATUS +NTAPI +SmpAcquirePrivilege( + IN ULONG Privilege, + OUT PVOID *PrivilegeStat +); + +VOID +NTAPI +SmpReleasePrivilege( + IN PVOID State +); diff --git a/reactos/base/system/smss2/smsubsys.c b/reactos/base/system/smss2/smsubsys.c new file mode 100644 index 00000000000..4ad4fe75429 --- /dev/null +++ b/reactos/base/system/smss2/smsubsys.c @@ -0,0 +1,19 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: base/system/smss/smss.c + * PURPOSE: Main SMSS Code + * PROGRAMMERS: Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include "smss.h" +#define NDEBUG +#include "debug.h" + +/* GLOBALS ********************************************************************/ + +/* FUNCTIONS ******************************************************************/ + +/* EOF */ diff --git a/reactos/base/system/smss2/smutil.c b/reactos/base/system/smss2/smutil.c new file mode 100644 index 00000000000..5d4dfa8ba56 --- /dev/null +++ b/reactos/base/system/smss2/smutil.c @@ -0,0 +1,141 @@ +/* + * PROJECT: ReactOS Windows-Compatible Session Manager + * LICENSE: BSD 2-Clause License + * FILE: base/system/smss/smss.c + * PURPOSE: Main SMSS Code + * PROGRAMMERS: Alex Ionescu + */ + +/* INCLUDES *******************************************************************/ + +#include "smss.h" +#define NDEBUG +#include "debug.h" + +/* GLOBALS ********************************************************************/ + +typedef struct _SMP_PRIVILEGE_STATE +{ + HANDLE TokenHandle; + PTOKEN_PRIVILEGES OldPrivileges; + PTOKEN_PRIVILEGES NewPrivileges; + UCHAR OldBuffer[1024]; + TOKEN_PRIVILEGES NewBuffer; +} SMP_PRIVILEGE_STATE, *PSMP_PRIVILEGE_STATE; + +/* FUNCTIONS ******************************************************************/ + +NTSTATUS +NTAPI +SmpAcquirePrivilege(IN ULONG Privilege, + OUT PVOID *PrivilegeState) +{ + PSMP_PRIVILEGE_STATE State; + ULONG Size; + NTSTATUS Status; + + /* Assume failure */ + *PrivilegeState = NULL; + + /* Acquire the state structure to hold everything we need */ + State = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + sizeof(SMP_PRIVILEGE_STATE) + + sizeof(TOKEN_PRIVILEGES) + + sizeof(LUID_AND_ATTRIBUTES)); + if (!State) return STATUS_NO_MEMORY; + + /* Open our token */ + Status = NtOpenProcessToken(NtCurrentProcess(), + TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, + &State->TokenHandle); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + RtlFreeHeap(RtlGetProcessHeap(), 0, State); + return Status; + } + + /* Set one privilege in the enabled state */ + State->NewPrivileges = &State->NewBuffer; + State->OldPrivileges = (PTOKEN_PRIVILEGES)&State->OldBuffer; + State->NewPrivileges->PrivilegeCount = 1; + State->NewPrivileges->Privileges[0].Luid = RtlConvertUlongToLuid(Privilege); + State->NewPrivileges->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + + /* Adjust the privileges in the token */ + Size = sizeof(State->OldBuffer); + Status = NtAdjustPrivilegesToken(State->TokenHandle, + FALSE, + State->NewPrivileges, + Size, + State->OldPrivileges, + &Size); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + /* Our static buffer is not big enough, allocate a bigger one */ + State->OldPrivileges = RtlAllocateHeap(RtlGetProcessHeap(), 0, Size); + if (!State->OldPrivileges) + { + /* Out of memory, fail */ + Status = STATUS_NO_MEMORY; + goto Quickie; + } + + /* Now try again */ + Status = NtAdjustPrivilegesToken(State->TokenHandle, + FALSE, + State->NewPrivileges, + Size, + State->OldPrivileges, + &Size); + } + + /* Normalize failure code and check for success */ + if (Status == STATUS_NOT_ALL_ASSIGNED) Status = STATUS_PRIVILEGE_NOT_HELD; + if (NT_SUCCESS(Status)) + { + /* We got the privilege, return */ + *PrivilegeState = State; + return STATUS_SUCCESS; + } + +Quickie: + /* Check if we used a dynamic buffer */ + if (State->OldPrivileges != (PTOKEN_PRIVILEGES)&State->OldBuffer) + { + /* Free it */ + RtlFreeHeap(RtlGetProcessHeap(), 0, State->OldPrivileges); + } + + /* Close the token handle and free the state structure */ + NtClose(State->TokenHandle); + RtlFreeHeap(RtlGetProcessHeap(), 0, State); + return Status; +} + +VOID +NTAPI +SmpReleasePrivilege(IN PVOID PrivState) +{ + PSMP_PRIVILEGE_STATE State = (PSMP_PRIVILEGE_STATE)PrivState; + + /* Adjust the privileges in the token */ + NtAdjustPrivilegesToken(State->TokenHandle, + FALSE, + State->OldPrivileges, + 0, + NULL, + NULL); + + /* Check if we used a dynamic buffer */ + if (State->OldPrivileges != (PTOKEN_PRIVILEGES)&State->OldBuffer) + { + /* Free it */ + RtlFreeHeap(RtlGetProcessHeap(), 0, State->OldPrivileges); + } + + /* Close the token handle and free the state structure */ + NtClose(State->TokenHandle); + RtlFreeHeap(RtlGetProcessHeap(), 0, State); +} From df41abd4012d6a9746d92fc53f31a180dbb94906 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 02:49:16 +0000 Subject: [PATCH 168/289] [SMSS2]: Oh, right, rbuild. svn path=/trunk/; revision=55312 --- reactos/base/system/smss2/smss2.rbuild | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/reactos/base/system/smss2/smss2.rbuild b/reactos/base/system/smss2/smss2.rbuild index a48cc561d3a..7c01ba71e53 100644 --- a/reactos/base/system/smss2/smss2.rbuild +++ b/reactos/base/system/smss2/smss2.rbuild @@ -5,10 +5,19 @@ . include/reactos/subsys nt + pseh ntdll smss.h smss.c + crashdmp.c + pagefile.c + sminit.c + smloop.c + smsbapi.c + smsessn.c + smsubsys.c + smutil.c smss.rc From 4459aa9ea37e696fe3482d8282dfe52b104891d6 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 03:16:47 +0000 Subject: [PATCH 169/289] [SMSS]: Oh, right, compilation units. I had forgotten how much I hate rbuild. svn path=/trunk/; revision=55313 --- reactos/include/reactos/subsys/sm/smmsg.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/include/reactos/subsys/sm/smmsg.h b/reactos/include/reactos/subsys/sm/smmsg.h index cf60d8871bc..6395fb89751 100644 --- a/reactos/include/reactos/subsys/sm/smmsg.h +++ b/reactos/include/reactos/subsys/sm/smmsg.h @@ -5,6 +5,9 @@ * PURPOSE: SMSS (SB and SM) Message Format * PROGRAMMERS: Alex Ionescu */ +#pragma once +#ifndef _SM_MSG_ +#define _SM_MSG_ // // There are the APIs that a Client (such as CSRSS) can send to the SMSS Server. @@ -205,4 +208,4 @@ typedef struct _SB_API_MSG // C_ASSERT(sizeof(SB_CONNECTION_INFO) == 0xF4); C_ASSERT(sizeof(SB_API_MSG) == 0x110); - +#endif From bbaf1702fec26d245c1042532fabedaab9b3abb9 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 03:44:27 +0000 Subject: [PATCH 170/289] [SMSS2]: Create the VolumesSafeForWriteAccess and Sm2ApiPort. Create all the required security descriptors. Create the two API threads. Initialize a bunch of other stuff needed for later. Initialize tag heap and enable hard errors. Api loop waits on the LPC port but nothing should be going through there for now. svn path=/trunk/; revision=55314 --- reactos/base/system/smss2/sminit.c | 448 ++++++++++++++++++++++++++- reactos/base/system/smss2/smloop.c | 22 ++ reactos/base/system/smss2/smsessn.c | 6 + reactos/base/system/smss2/smss.h | 17 + reactos/base/system/smss2/smsubsys.c | 4 + 5 files changed, 496 insertions(+), 1 deletion(-) diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index d0350b9cf22..06b35bf8891 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -14,12 +14,458 @@ /* GLOBALS ********************************************************************/ +UNICODE_STRING SmpSubsystemName, PosixName, Os2Name; +LIST_ENTRY NativeProcessList; +ULONG SmBaseTag; +PVOID SmpHeap; +HANDLE SmpDebugPort; +ULONG SmpInitProgressByLine; +NTSTATUS SmpInitReturnStatus; +PVOID SmpInitLastCall; +SECURITY_DESCRIPTOR SmpPrimarySDBody, SmpLiberalSDBody, SmpKnownDllsSDBody; +SECURITY_DESCRIPTOR SmpApiPortSDBody; +PSECURITY_DESCRIPTOR SmpPrimarySecurityDescriptor, SmpLiberalSecurityDescriptor; +PSECURITY_DESCRIPTOR SmpKnownDllsSecurityDescriptor, SmpApiPortSecurityDescriptor; +ULONG SmpProtectionMode = 1; + +#define SMSS_CHECKPOINT(x, y) \ +{ \ + SmpInitProgressByLine = __LINE__; \ + SmpInitReturnStatus = (y); \ + SmpInitLastCall = (x); \ +} + /* FUNCTIONS ******************************************************************/ +NTSTATUS +NTAPI +SmpCreateSecurityDescriptors(IN BOOLEAN InitialCall) +{ + NTSTATUS Status; + PSID WorldSid = NULL, AdminSid = NULL, SystemSid = NULL; + PSID RestrictedSid = NULL, OwnerSid = NULL; + SID_IDENTIFIER_AUTHORITY WorldAuthority = {SECURITY_WORLD_SID_AUTHORITY}; + SID_IDENTIFIER_AUTHORITY NtAuthority = {SECURITY_NT_AUTHORITY}; + SID_IDENTIFIER_AUTHORITY CreatorAuthority = {SECURITY_CREATOR_SID_AUTHORITY}; + ULONG AclLength, SidLength; + PACL Acl; + PACE_HEADER Ace; + BOOLEAN ProtectionRequired = FALSE; + + /* Check if this is the first call */ + if (InitialCall) + { + /* Create and set the primary descriptor */ + SmpPrimarySecurityDescriptor = &SmpPrimarySDBody; + Status = RtlCreateSecurityDescriptor(SmpPrimarySecurityDescriptor, + SECURITY_DESCRIPTOR_REVISION); + ASSERT(NT_SUCCESS(Status)); + Status = RtlSetDaclSecurityDescriptor(SmpPrimarySecurityDescriptor, + TRUE, + NULL, + FALSE); + ASSERT(NT_SUCCESS(Status)); + + /* Create and set the liberal descriptor */ + SmpLiberalSecurityDescriptor = &SmpLiberalSDBody; + Status = RtlCreateSecurityDescriptor(SmpLiberalSecurityDescriptor, + SECURITY_DESCRIPTOR_REVISION); + ASSERT(NT_SUCCESS(Status)); + Status = RtlSetDaclSecurityDescriptor(SmpLiberalSecurityDescriptor, + TRUE, + NULL, + FALSE); + ASSERT(NT_SUCCESS(Status)); + + /* Create and set the \KnownDlls descriptor */ + SmpKnownDllsSecurityDescriptor = &SmpKnownDllsSDBody; + Status = RtlCreateSecurityDescriptor(SmpKnownDllsSecurityDescriptor, + SECURITY_DESCRIPTOR_REVISION); + ASSERT(NT_SUCCESS(Status)); + Status = RtlSetDaclSecurityDescriptor(SmpKnownDllsSecurityDescriptor, + TRUE, + NULL, + FALSE); + ASSERT(NT_SUCCESS(Status)); + + /* Create and Set the \ApiPort descriptor */ + SmpApiPortSecurityDescriptor = &SmpApiPortSDBody; + Status = RtlCreateSecurityDescriptor(SmpApiPortSecurityDescriptor, + SECURITY_DESCRIPTOR_REVISION); + ASSERT(NT_SUCCESS(Status)); + Status = RtlSetDaclSecurityDescriptor(SmpApiPortSecurityDescriptor, + TRUE, + NULL, + FALSE); + ASSERT(NT_SUCCESS(Status)); + } + + /* Check if protection was requested in the registry (on by default) */ + if (SmpProtectionMode & 1) ProtectionRequired = TRUE; + + /* Exit if there's nothing to do */ + if (!(InitialCall || ProtectionRequired)) return STATUS_SUCCESS; + + /* Build the world SID */ + Status = RtlAllocateAndInitializeSid(&WorldAuthority, 1, + SECURITY_WORLD_RID, + 0, 0, 0, 0, 0, 0, 0, + &WorldSid); + if (!NT_SUCCESS(Status)) + { + WorldSid = NULL; + goto Quickie; + } + + /* Build the admin SID */ + Status = RtlAllocateAndInitializeSid(&NtAuthority, 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, + &AdminSid); + if (!NT_SUCCESS(Status)) + { + AdminSid = NULL; + goto Quickie; + } + + /* Build the owner SID */ + Status = RtlAllocateAndInitializeSid(&CreatorAuthority, 1, + SECURITY_CREATOR_OWNER_RID, + 0, 0, 0, 0, 0, 0, 0, + &OwnerSid); + if (!NT_SUCCESS(Status)) + { + OwnerSid = NULL; + goto Quickie; + } + + /* Build the restricted SID */ + Status = RtlAllocateAndInitializeSid(&NtAuthority, 1, + SECURITY_RESTRICTED_CODE_RID, + 0, 0, 0, 0, 0, 0, 0, + &RestrictedSid); + if (!NT_SUCCESS(Status)) + { + RestrictedSid = NULL; + goto Quickie; + } + + /* Build the system SID */ + Status = RtlAllocateAndInitializeSid(&NtAuthority, 1, + SECURITY_LOCAL_SYSTEM_RID, + 0, 0, 0, 0, 0, 0, 0, + &SystemSid); + if (!NT_SUCCESS(Status)) + { + SystemSid = NULL; + goto Quickie; + } + + /* Now check if we're creating the core descriptors */ + if (!InitialCall) + { + /* We're skipping NextAcl so we have to do this here */ + SidLength = RtlLengthSid(WorldSid) + RtlLengthSid(RestrictedSid) + RtlLengthSid(AdminSid); + SidLength *= 2; + goto NotInitial; + } + + /* Allocate an ACL with two ACEs with two SIDs each */ + SidLength = RtlLengthSid(SystemSid) + RtlLengthSid(AdminSid); + AclLength = sizeof(ACL) + 2 * sizeof(ACCESS_ALLOWED_ACE) + SidLength; + Acl = RtlAllocateHeap(RtlGetProcessHeap(), 0, AclLength); + if (!Acl) Status = STATUS_NO_MEMORY; + if (!NT_SUCCESS(Status)) goto NextAcl; + + /* Now build the ACL and add the two ACEs */ + Status = RtlCreateAcl(Acl, AclLength, ACL_REVISION2); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_ALL, AdminSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_ALL, SystemSid); + ASSERT(NT_SUCCESS(Status)); + + /* Set this as the DACL */ + Status = RtlSetDaclSecurityDescriptor(SmpApiPortSecurityDescriptor, + TRUE, + Acl, + FALSE); + ASSERT(NT_SUCCESS(Status)); + +NextAcl: + /* Allocate an ACL with 6 ACEs, two ACEs per SID */ + SidLength = RtlLengthSid(WorldSid) + RtlLengthSid(RestrictedSid) + RtlLengthSid(AdminSid); + SidLength *= 2; + AclLength = sizeof(ACL) + 6 * sizeof(ACCESS_ALLOWED_ACE) + SidLength; + Acl = RtlAllocateHeap(RtlGetProcessHeap(), 0, AclLength); + if (!Acl) Status = STATUS_NO_MEMORY; + if (!NT_SUCCESS(Status)) goto NotInitial; + + /* Now build the ACL and add the six ACEs */ + Status = RtlCreateAcl(Acl, AclLength, ACL_REVISION2); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE, WorldSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE, RestrictedSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_ALL, AdminSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE | GENERIC_READ | GENERIC_WRITE, WorldSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE | GENERIC_READ | GENERIC_WRITE, RestrictedSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_ALL, AdminSid); + ASSERT(NT_SUCCESS(Status)); + + /* Now edit the last three ACEs and make them inheritable */ + Status = RtlGetAce(Acl, 3, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + Status = RtlGetAce(Acl, 4, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + Status = RtlGetAce(Acl, 5, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + + /* Set this as the DACL */ + Status = RtlSetDaclSecurityDescriptor(SmpKnownDllsSecurityDescriptor, + TRUE, + Acl, + FALSE); + ASSERT(NT_SUCCESS(Status)); + +NotInitial: + /* The initial ACLs have been created, are we also protecting objects? */ + if (!ProtectionRequired) goto Quickie; + + /* Allocate an ACL with 7 ACEs, two ACEs per SID, and one final owner ACE */ + SidLength += RtlLengthSid(OwnerSid); + AclLength = sizeof(ACL) + 7 * sizeof (ACCESS_ALLOWED_ACE) + 2 * SidLength; + Acl = RtlAllocateHeap(RtlGetProcessHeap(), 0, AclLength); + if (!Acl) Status = STATUS_NO_MEMORY; + if (!NT_SUCCESS(Status)) goto Quickie; + + /* Build the ACL and add the seven ACEs */ + Status = RtlCreateAcl(Acl, AclLength, ACL_REVISION2); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE | GENERIC_READ, WorldSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE | GENERIC_READ, RestrictedSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_ALL, AdminSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE | GENERIC_READ, WorldSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE | GENERIC_READ, RestrictedSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_ALL, AdminSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_ALL, OwnerSid); + ASSERT(NT_SUCCESS(Status)); + + /* Edit the last 4 ACEs to make then inheritable */ + Status = RtlGetAce(Acl, 3, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + Status = RtlGetAce(Acl, 4, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + Status = RtlGetAce(Acl, 5, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + Status = RtlGetAce(Acl, 6, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + + /* Set this as the DACL for the primary SD */ + Status = RtlSetDaclSecurityDescriptor(SmpPrimarySecurityDescriptor, + TRUE, + Acl, + FALSE); + ASSERT(NT_SUCCESS(Status)); + + /* Allocate an ACL with 7 ACEs, two ACEs per SID, and one final owner ACE */ + AclLength = sizeof(ACL) + 7 * sizeof (ACCESS_ALLOWED_ACE) + 2 * SidLength; + Acl = RtlAllocateHeap(RtlGetProcessHeap(), 0, AclLength); + if (!Acl) Status = STATUS_NO_MEMORY; + if (!NT_SUCCESS(Status)) goto Quickie; + + /* Build the ACL and add the seven ACEs */ + Status = RtlCreateAcl(Acl, AclLength, ACL_REVISION2); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE | GENERIC_READ | GENERIC_WRITE, WorldSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE | GENERIC_READ | GENERIC_WRITE, RestrictedSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_ALL, AdminSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE | GENERIC_READ | GENERIC_WRITE, WorldSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_EXECUTE | GENERIC_READ | GENERIC_WRITE, RestrictedSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_ALL, AdminSid); + ASSERT(NT_SUCCESS(Status)); + Status = RtlAddAccessAllowedAce(Acl, ACL_REVISION2, GENERIC_ALL, OwnerSid); + ASSERT(NT_SUCCESS(Status)); + + /* Edit the last 4 ACEs to make then inheritable */ + Status = RtlGetAce(Acl, 3, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + Status = RtlGetAce(Acl, 4, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + Status = RtlGetAce(Acl, 5, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + Status = RtlGetAce(Acl, 6, (PVOID)&Ace); + ASSERT(NT_SUCCESS(Status)); + Ace->AceFlags = OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE | INHERIT_ONLY_ACE; + + /* Now set this as the DACL for the liberal SD */ + Status = RtlSetDaclSecurityDescriptor(SmpLiberalSecurityDescriptor, + TRUE, + Acl, + FALSE); + ASSERT(NT_SUCCESS(Status)); + +Quickie: + /* Cleanup the SIDs */ + if (OwnerSid) RtlFreeHeap(RtlGetProcessHeap(), 0, OwnerSid); + if (AdminSid) RtlFreeHeap(RtlGetProcessHeap(), 0, AdminSid); + if (WorldSid) RtlFreeHeap(RtlGetProcessHeap(), 0, WorldSid); + if (SystemSid) RtlFreeHeap(RtlGetProcessHeap(), 0, SystemSid); + if (RestrictedSid) RtlFreeHeap(RtlGetProcessHeap(), 0, RestrictedSid); + return Status; +} + +NTSTATUS +NTAPI +SmpLoadDataFromRegistry(OUT PUNICODE_STRING InitialCommand) +{ + return STATUS_SUCCESS; +} + NTSTATUS NTAPI SmpInit(IN PUNICODE_STRING InitialCommand, OUT PHANDLE ProcessHandle) { - return STATUS_SUCCESS; + NTSTATUS Status, Status2; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING PortName, EventName; + HANDLE EventHandle, PortHandle; + ULONG HardErrorMode; + + /* Create the SMSS Heap */ + SmBaseTag = RtlCreateTagHeap(RtlGetProcessHeap(), + 0, + L"SMSS!", + L"INIT"); + SmpHeap = RtlGetProcessHeap(); + + /* Enable hard errors */ + HardErrorMode = TRUE; + NtSetInformationProcess(NtCurrentProcess(), + ProcessDefaultHardErrorMode, + &HardErrorMode, + sizeof(HardErrorMode)); + + /* Initialize the subsystem list and the session list, plus their locks */ + RtlInitializeCriticalSection(&SmpKnownSubSysLock); + InitializeListHead(&SmpKnownSubSysHead); + RtlInitializeCriticalSection(&SmpSessionListLock); + InitializeListHead(&SmpSessionListHead); + + /* Initialize the process list */ + InitializeListHead(&NativeProcessList); + + /* Initialize session parameters */ + SmpNextSessionId = 1; + SmpNextSessionIdScanMode = 0; + SmpDbgSsLoaded = FALSE; + + /* Create the initial security descriptors */ + Status = SmpCreateSecurityDescriptors(TRUE); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + SMSS_CHECKPOINT(SmpCreateSecurityDescriptors, Status); + return Status; + } + + /* Initialize subsystem names */ + RtlInitUnicodeString(&SmpSubsystemName, L"NT-Session Manager"); + RtlInitUnicodeString(&PosixName, L"POSIX"); + RtlInitUnicodeString(&Os2Name, L"OS2"); + + /* Create the SM API Port */ + RtlInitUnicodeString(&PortName, L"\\Sm2ApiPort"); + InitializeObjectAttributes(&ObjectAttributes, &PortName, 0, NULL, NULL); + Status = NtCreatePort(&PortHandle, + &ObjectAttributes, + sizeof(SB_CONNECTION_INFO), + sizeof(SM_API_MSG), + sizeof(SB_API_MSG) * 32); + ASSERT(NT_SUCCESS(Status)); + SmpDebugPort = PortHandle; + + /* Create two SM API threads */ + Status = RtlCreateUserThread(NtCurrentProcess(), + NULL, + FALSE, + 0, + 0, + 0, + SmpApiLoop, + PortHandle, + NULL, + NULL); + ASSERT(NT_SUCCESS(Status)); + Status = RtlCreateUserThread(NtCurrentProcess(), + NULL, + FALSE, + 0, + 0, + 0, + SmpApiLoop, + PortHandle, + NULL, + NULL); + ASSERT(NT_SUCCESS(Status)); + + /* Create the write event that autochk can set after running */ + RtlInitUnicodeString(&EventName, L"\\Device\\VolumesSafeForWriteAccess"); + InitializeObjectAttributes(&ObjectAttributes, + &EventName, + OBJ_PERMANENT, + NULL, + NULL); + Status2 = NtCreateEvent(&EventHandle, + EVENT_ALL_ACCESS, + &ObjectAttributes, + 0, + 0); + if (!NT_SUCCESS(Status2)) + { + /* Should never really fail */ + DPRINT1("SMSS: Unable to create %wZ event - Status == %lx\n", + &EventName, Status2); + ASSERT(NT_SUCCESS(Status2)); + } + + /* Now initialize everything else based on the registry parameters */ + Status = SmpLoadDataFromRegistry(InitialCommand); + if (NT_SUCCESS(Status)) + { + /* Autochk should've run now. Set the event and save the CSRSS handle */ + *ProcessHandle = SmpWindowsSubSysProcess; + NtSetEvent(EventHandle, 0); + NtClose(EventHandle); + } + + /* All done */ + return Status; } diff --git a/reactos/base/system/smss2/smloop.c b/reactos/base/system/smss2/smloop.c index 8678afa43b2..574d7e8821e 100644 --- a/reactos/base/system/smss2/smloop.c +++ b/reactos/base/system/smss2/smloop.c @@ -15,3 +15,25 @@ /* GLOBALS ********************************************************************/ /* FUNCTIONS ******************************************************************/ + +ULONG +NTAPI +SmpApiLoop(IN PVOID Parameter) +{ + HANDLE SmApiPort = (HANDLE)Parameter; + NTSTATUS Status; + PVOID ClientContext; + PSM_API_MSG RequestMsg = NULL; + SM_API_MSG ReplyMsg; + + DPRINT1("API Loop: %p\n", SmApiPort); + while (TRUE) + { + Status = NtReplyWaitReceivePort(SmApiPort, + &ClientContext, + &RequestMsg->h, + &ReplyMsg.h); + DPRINT1("API loop returned: %lx\n", Status); + } + return STATUS_SUCCESS; +} diff --git a/reactos/base/system/smss2/smsessn.c b/reactos/base/system/smss2/smsessn.c index 8678afa43b2..5f511f8f041 100644 --- a/reactos/base/system/smss2/smsessn.c +++ b/reactos/base/system/smss2/smsessn.c @@ -14,4 +14,10 @@ /* GLOBALS ********************************************************************/ +RTL_CRITICAL_SECTION SmpSessionListLock; +LIST_ENTRY SmpSessionListHead; +ULONG SmpNextSessionId; +ULONG SmpNextSessionIdScanMode; +BOOLEAN SmpDbgSsLoaded; + /* FUNCTIONS ******************************************************************/ diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index 61843994bee..a700103d960 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -30,6 +30,17 @@ /* DEFINES ********************************************************************/ +/* EXTERNALS ******************************************************************/ + +extern RTL_CRITICAL_SECTION SmpKnownSubSysLock; +extern LIST_ENTRY SmpKnownSubSysHead; +extern RTL_CRITICAL_SECTION SmpSessionListLock; +extern LIST_ENTRY SmpSessionListHead; +extern ULONG SmpNextSessionId; +extern ULONG SmpNextSessionIdScanMode; +extern BOOLEAN SmpDbgSsLoaded; +extern HANDLE SmpWindowsSubSysProcess; + /* FUNCTIONS ******************************************************************/ NTSTATUS @@ -51,3 +62,9 @@ NTAPI SmpReleasePrivilege( IN PVOID State ); + +ULONG +NTAPI +SmpApiLoop( + IN PVOID Parameter +); diff --git a/reactos/base/system/smss2/smsubsys.c b/reactos/base/system/smss2/smsubsys.c index 4ad4fe75429..dd0eabb5577 100644 --- a/reactos/base/system/smss2/smsubsys.c +++ b/reactos/base/system/smss2/smsubsys.c @@ -14,6 +14,10 @@ /* GLOBALS ********************************************************************/ +RTL_CRITICAL_SECTION SmpKnownSubSysLock; +LIST_ENTRY SmpKnownSubSysHead; +HANDLE SmpWindowsSubSysProcess; + /* FUNCTIONS ******************************************************************/ /* EOF */ From ddeb8354e491e7e66caa8b7844efc9a457c2d866 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 05:32:34 +0000 Subject: [PATCH 171/289] [SMSS2]: Initialize a bunch more internal stuff, and start parsing the registry for settings. Right now just ProtectionMode and AllowProtectedRenames are parsed. Stub functions needed for the rest of initialization. Create the \Sessions directory. Hack to work under setup. Loop BootExecute and PageFile entries. Create SMSS environment. Detect MiniNT mode (PE/LiveCD). Delete SAFEBOOT_OPTION if found. svn path=/trunk/; revision=55317 --- reactos/base/system/smss2/pagefile.c | 26 +++ reactos/base/system/smss2/sminit.c | 328 ++++++++++++++++++++++++++- reactos/base/system/smss2/smsessn.c | 1 + reactos/base/system/smss2/smss.c | 13 +- reactos/base/system/smss2/smss.h | 46 +++- reactos/base/system/smss2/smsubsys.c | 12 +- 6 files changed, 418 insertions(+), 8 deletions(-) diff --git a/reactos/base/system/smss2/pagefile.c b/reactos/base/system/smss2/pagefile.c index 8678afa43b2..52a88672c58 100644 --- a/reactos/base/system/smss2/pagefile.c +++ b/reactos/base/system/smss2/pagefile.c @@ -14,4 +14,30 @@ /* GLOBALS ********************************************************************/ +LIST_ENTRY SmpPagingFileDescriptorList, SmpVolumeDescriptorList; + /* FUNCTIONS ******************************************************************/ + +VOID +NTAPI +SmpPagingFileInitialize(VOID) +{ + /* Initialize the two lists */ + InitializeListHead(&SmpPagingFileDescriptorList); + InitializeListHead(&SmpVolumeDescriptorList); +} + +NTSTATUS +NTAPI +SmpCreatePagingFileDescriptor(IN PUNICODE_STRING PageFileToken) +{ + DPRINT1("New pagefile data: %wZ\n", PageFileToken); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpCreatePagingFiles(VOID) +{ + return STATUS_SUCCESS; +} diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index 06b35bf8891..23a45ca8c95 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -14,19 +14,37 @@ /* GLOBALS ********************************************************************/ +typedef struct _SMP_REGISTRY_VALUE +{ + LIST_ENTRY Entry; + UNICODE_STRING Name; + UNICODE_STRING Value; + PCHAR AnsiValue; +} SMP_REGISTRY_VALUE, *PSMP_REGISTRY_VALUE; + UNICODE_STRING SmpSubsystemName, PosixName, Os2Name; -LIST_ENTRY NativeProcessList; +UNICODE_STRING SmpDebugKeyword, SmpASyncKeyword, SmpAutoChkKeyword; +LIST_ENTRY SmpBootExecuteList, SmpSetupExecuteList, SmpPagingFileList; +LIST_ENTRY SmpDosDevicesList, SmpFileRenameList, SmpKnownDllsList; +LIST_ENTRY SmpExcludeKnownDllsList, SmpSubSystemList, SmpSubSystemsToLoad; +LIST_ENTRY SmpSubSystemsToDefer, SmpExecuteList, NativeProcessList; + ULONG SmBaseTag; -PVOID SmpHeap; HANDLE SmpDebugPort; +PVOID SmpHeap; +PWCHAR SmpDefaultEnvironment; + ULONG SmpInitProgressByLine; NTSTATUS SmpInitReturnStatus; PVOID SmpInitLastCall; + SECURITY_DESCRIPTOR SmpPrimarySDBody, SmpLiberalSDBody, SmpKnownDllsSDBody; SECURITY_DESCRIPTOR SmpApiPortSDBody; PSECURITY_DESCRIPTOR SmpPrimarySecurityDescriptor, SmpLiberalSecurityDescriptor; PSECURITY_DESCRIPTOR SmpKnownDllsSecurityDescriptor, SmpApiPortSecurityDescriptor; -ULONG SmpProtectionMode = 1; + +ULONG SmpAllowProtectedRenames, SmpProtectionMode = 1; +BOOLEAN MiniNTBoot; #define SMSS_CHECKPOINT(x, y) \ { \ @@ -35,6 +53,84 @@ ULONG SmpProtectionMode = 1; SmpInitLastCall = (x); \ } +/* REGISTRY CONFIGURATION *****************************************************/ + +NTSTATUS +NTAPI +SmpConfigureProtectionMode(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + /* Make sure the value is valid */ + if (ValueLength == sizeof(ULONG)) + { + /* Read it */ + SmpProtectionMode = *(PULONG)ValueData; + } + else + { + /* Default is to protect stuff */ + SmpProtectionMode = 1; + } + + /* Recreate the security descriptors to take into account security mode */ + SmpCreateSecurityDescriptors(FALSE); + DPRINT1("SmpProtectionMode: %d\n", SmpProtectionMode); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpConfigureAllowProtectedRenames(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + /* Make sure the value is valid */ + if (ValueLength == sizeof(ULONG)) + { + /* Read it */ + SmpAllowProtectedRenames = *(PULONG)ValueData; + } + else + { + /* Default is to not allow protected renames */ + SmpAllowProtectedRenames = 0; + } + + DPRINT1("SmpAllowProtectedRenames: %d\n", SmpAllowProtectedRenames); + return STATUS_SUCCESS; +} + +RTL_QUERY_REGISTRY_TABLE +SmpRegistryConfigurationTable[] = +{ + { + SmpConfigureProtectionMode, + 0, + L"ProtectionMode", + NULL, + REG_DWORD, + NULL, + 0 + }, + { + SmpConfigureAllowProtectedRenames, + RTL_QUERY_REGISTRY_DELETE, + L"AllowProtectedRenames", + NULL, + REG_DWORD, + NULL, + 0 + }, + {0}, +}; + /* FUNCTIONS ******************************************************************/ NTSTATUS @@ -343,11 +439,233 @@ Quickie: NTSTATUS NTAPI -SmpLoadDataFromRegistry(OUT PUNICODE_STRING InitialCommand) +SmpInitializeDosDevices(VOID) { return STATUS_SUCCESS; } +NTSTATUS +NTAPI +SmpInitializeKnownDlls(VOID) +{ + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpCreateDynamicEnvironmentVariables(VOID) +{ + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpProcessFileRenames(VOID) +{ + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpLoadDataFromRegistry(OUT PUNICODE_STRING InitialCommand) +{ + NTSTATUS Status; + PLIST_ENTRY Head, NextEntry; + PSMP_REGISTRY_VALUE RegEntry; + PVOID OriginalEnvironment; + ULONG MuSessionId = 0; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE KeyHandle; + UNICODE_STRING DestinationString; + + /* Initialize the keywords we'll be looking for */ + RtlInitUnicodeString(&SmpDebugKeyword, L"debug"); + RtlInitUnicodeString(&SmpASyncKeyword, L"async"); + RtlInitUnicodeString(&SmpAutoChkKeyword, L"autocheck"); + + /* Initialize all the registry-associated list heads */ + InitializeListHead(&SmpBootExecuteList); + InitializeListHead(&SmpSetupExecuteList); + InitializeListHead(&SmpPagingFileList); + InitializeListHead(&SmpDosDevicesList); + InitializeListHead(&SmpFileRenameList); + InitializeListHead(&SmpKnownDllsList); + InitializeListHead(&SmpExcludeKnownDllsList); + InitializeListHead(&SmpSubSystemList); + InitializeListHead(&SmpSubSystemsToLoad); + InitializeListHead(&SmpSubSystemsToDefer); + InitializeListHead(&SmpExecuteList); + SmpPagingFileInitialize(); + + /* Initialize the SMSS environment */ + Status = RtlCreateEnvironment(TRUE, &SmpDefaultEnvironment); + if (!NT_SUCCESS(Status)) + { + /* Fail if there was a problem */ + DPRINT1("SMSS: Unable to allocate default environment - Status == %X\n", + Status); + SMSS_CHECKPOINT(RtlCreateEnvironment, Status); + return Status; + } + + /* Check if we were booted in PE mode (LiveCD should have this) */ + RtlInitUnicodeString(&DestinationString, + L"\\Registry\\Machine\\System\\CurrentControlSet\\" + "Control\\MiniNT"); + InitializeObjectAttributes(&ObjectAttributes, + &DestinationString, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, KEY_ALL_ACCESS, &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* If the key exists, we were */ + NtClose(KeyHandle); + MiniNTBoot = TRUE; + } + + /* Print out if this is the case */ + if (MiniNTBoot) DPRINT1("SMSS: !!! MiniNT Boot !!!\n"); + + /* Open the environment key to see if we are booted in safe mode */ + RtlInitUnicodeString(&DestinationString, + L"\\Registry\\Machine\\System\\CurrentControlSet\\" + "Control\\Session Manager\\Environment"); + InitializeObjectAttributes(&ObjectAttributes, + &DestinationString, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, KEY_ALL_ACCESS, &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* Delete the value if we found it */ + RtlInitUnicodeString(&DestinationString, L"SAFEBOOT_OPTION"); + NtDeleteValueKey(KeyHandle, &DestinationString); + NtClose(KeyHandle); + } + + /* Switch environments, then query the registry for all needed settings */ + OriginalEnvironment = NtCurrentPeb()->ProcessParameters->Environment; + NtCurrentPeb()->ProcessParameters->Environment = SmpDefaultEnvironment; + Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, + L"Session Manager", + SmpRegistryConfigurationTable, + NULL, + NULL); + SmpDefaultEnvironment = NtCurrentPeb()->ProcessParameters->Environment; + NtCurrentPeb()->ProcessParameters->Environment = OriginalEnvironment; + if (!NT_SUCCESS(Status)) + { + /* We failed somewhere in registry initialization, which is bad... */ + DPRINT1("SMSS: RtlQueryRegistryValues failed - Status == %lx\n", Status); + SMSS_CHECKPOINT(RtlQueryRegistryValues, Status); + return Status; + } + + /* Now we can start acting on the registry settings. First to DOS devices */ + Status = SmpInitializeDosDevices(); + if (!NT_SUCCESS(Status)) + { + /* Failed */ + DPRINT1("SMSS: Unable to initialize DosDevices configuration - Status == %lx\n", + Status); + SMSS_CHECKPOINT(SmpInitializeDosDevices, Status); + return Status; + } + + /* Next create the session directory... */ + RtlInitUnicodeString(&DestinationString, L"\\Sessions"); + InitializeObjectAttributes(&ObjectAttributes, + &DestinationString, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_PERMANENT, + NULL, + SmpPrimarySecurityDescriptor); + Status = NtCreateDirectoryObject(&SmpSessionsObjectDirectory, + DIRECTORY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + DPRINT1("SMSS: Unable to create %wZ object directory - Status == %lx\n", + &DestinationString, Status); + SMSS_CHECKPOINT(NtCreateDirectoryObject, Status); + return Status; + } + + /* Next loop all the boot execute binaries */ + Head = &SmpBootExecuteList; + while (!IsListEmpty(Head)) + { + /* Remove each one from the list */ + NextEntry = RemoveHeadList(Head); + + /* Execute it */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + SmpExecuteCommand(&RegEntry->Name, 0, NULL, 0); + + /* And free it */ + if (RegEntry->AnsiValue) RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->AnsiValue); + if (RegEntry->Value.Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->Value.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry); + } + + /* Now do any pending file rename operations... */ + if (!MiniNTBoot) SmpProcessFileRenames(); + + /* And initialize known DLLs... */ + Status = SmpInitializeKnownDlls(); + if (!NT_SUCCESS(Status)) + { + /* Fail if that didn't work */ + DPRINT1("SMSS: Unable to initialize KnownDll configuration - Status == %lx\n", + Status); + SMSS_CHECKPOINT(SmpInitializeKnownDlls, Status); + return Status; + } + + /* Loop every page file */ + Head = &SmpPagingFileList; + while (!IsListEmpty(Head)) + { + /* Remove each one from the list */ + NextEntry = RemoveHeadList(Head); + + /* Create the descriptor for it */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + SmpCreatePagingFileDescriptor(&RegEntry->Name); + + /* And free it */ + if (RegEntry->AnsiValue) RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->AnsiValue); + if (RegEntry->Value.Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->Value.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry); + } + + /* Now create all the paging files for the descriptors that we have */ + SmpCreatePagingFiles(); + + /* Tell Cm it's now safe to fully enable write access to the registry */ + // NtInitializeRegistry(FALSE); Later... + + /* Create all the system-based environment variables for later inheriting */ + Status = SmpCreateDynamicEnvironmentVariables(); + if (!NT_SUCCESS(Status)) + { + /* Handle failure */ + SMSS_CHECKPOINT(SmpCreateDynamicEnvironmentVariables, Status); + return Status; + } + + /* And finally load all the subsytems for our first session! */ + Status = SmpLoadSubSystemsForMuSession(&MuSessionId, + &SmpWindowsSubSysProcessId, + InitialCommand); + ASSERT(MuSessionId == 0); + if (!NT_SUCCESS(Status)) SMSS_CHECKPOINT(SmpLoadSubSystemsForMuSession, Status); + return Status; +} + NTSTATUS NTAPI SmpInit(IN PUNICODE_STRING InitialCommand, @@ -386,7 +704,7 @@ SmpInit(IN PUNICODE_STRING InitialCommand, SmpNextSessionId = 1; SmpNextSessionIdScanMode = 0; SmpDbgSsLoaded = FALSE; - + /* Create the initial security descriptors */ Status = SmpCreateSecurityDescriptors(TRUE); if (!NT_SUCCESS(Status)) diff --git a/reactos/base/system/smss2/smsessn.c b/reactos/base/system/smss2/smsessn.c index 5f511f8f041..2b9cd9bad45 100644 --- a/reactos/base/system/smss2/smsessn.c +++ b/reactos/base/system/smss2/smsessn.c @@ -19,5 +19,6 @@ LIST_ENTRY SmpSessionListHead; ULONG SmpNextSessionId; ULONG SmpNextSessionIdScanMode; BOOLEAN SmpDbgSsLoaded; +HANDLE SmpSessionsObjectDirectory; /* FUNCTIONS ******************************************************************/ diff --git a/reactos/base/system/smss2/smss.c b/reactos/base/system/smss2/smss.c index 2be1f0c40c6..8ccb9b12ef3 100644 --- a/reactos/base/system/smss2/smss.c +++ b/reactos/base/system/smss2/smss.c @@ -33,6 +33,17 @@ BOOLEAN SmpDebug; /* FUNCTIONS ******************************************************************/ +NTSTATUS +NTAPI +SmpExecuteCommand(IN PUNICODE_STRING CommandLine, + IN ULONG MuSessionId, + OUT PULONG ProcessId, + IN ULONG Flags) +{ + DPRINT1("Should run: %wZ for session %d\n", CommandLine, MuSessionId); + return STATUS_SUCCESS; +} + NTSTATUS NTAPI ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, @@ -389,7 +400,7 @@ _main(IN INT argc, DPRINT1("SMSS: SmpInit return failure - Status == %x\n"); RtlInitUnicodeString(&DbgString, L"Session Manager Initialization"); Parameters[1] = Status; - _SEH2_LEAVE; + //_SEH2_LEAVE; Hack so that setup can work. will go away later } /* Get the global flags */ diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index a700103d960..430fe748c0e 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -40,9 +40,17 @@ extern ULONG SmpNextSessionId; extern ULONG SmpNextSessionIdScanMode; extern BOOLEAN SmpDbgSsLoaded; extern HANDLE SmpWindowsSubSysProcess; - +extern HANDLE SmpSessionsObjectDirectory; +extern HANDLE SmpWindowsSubSysProcessId; + /* FUNCTIONS ******************************************************************/ +NTSTATUS +NTAPI +SmpCreateSecurityDescriptors( + IN BOOLEAN InitialCall +); + NTSTATUS NTAPI SmpInit( @@ -68,3 +76,39 @@ NTAPI SmpApiLoop( IN PVOID Parameter ); + +NTSTATUS +NTAPI +SmpExecuteCommand( + IN PUNICODE_STRING CommandLine, + IN ULONG MuSessionId, + OUT PULONG ProcessId, + IN ULONG Flags +); + +NTSTATUS +NTAPI +SmpLoadSubSystemsForMuSession( + IN PULONG MuSessionId, + OUT PHANDLE ProcessId, + IN PUNICODE_STRING InitialCommand +); + +VOID +NTAPI +SmpPagingFileInitialize( + VOID +); + +NTSTATUS +NTAPI +SmpCreatePagingFileDescriptor( + IN PUNICODE_STRING PageFileToken +); + +NTSTATUS +NTAPI +SmpCreatePagingFiles( + VOID +); + diff --git a/reactos/base/system/smss2/smsubsys.c b/reactos/base/system/smss2/smsubsys.c index dd0eabb5577..ab5ae67ade2 100644 --- a/reactos/base/system/smss2/smsubsys.c +++ b/reactos/base/system/smss2/smsubsys.c @@ -17,7 +17,17 @@ RTL_CRITICAL_SECTION SmpKnownSubSysLock; LIST_ENTRY SmpKnownSubSysHead; HANDLE SmpWindowsSubSysProcess; +HANDLE SmpWindowsSubSysProcessId; /* FUNCTIONS ******************************************************************/ -/* EOF */ +NTSTATUS +NTAPI +SmpLoadSubSystemsForMuSession(IN PULONG MuSessionId, + OUT PHANDLE ProcessId, + IN PUNICODE_STRING InitialCommand) +{ + DPRINT1("Should start subsystems for Session: %lx\n", *MuSessionId); + return STATUS_SUCCESS; +} + From bb3783a5244b4817bc7b27979cdd03266187bd4b Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 07:48:49 +0000 Subject: [PATCH 172/289] =?UTF-8?q?[NTOSKRNL]:=20hubris=20[=CB=88hju=CB=90?= =?UTF-8?q?br=C9=AAs],=20hybris=20n.=201.=20Belief=20that=20Ob=20is=20perf?= =?UTF-8?q?ect.=20Fix=20a=20major=20bug=20which=20allowed=20user-mode=20ap?= =?UTF-8?q?plications=20to=20get=20kernel=20handles=20if=20they=20so=20req?= =?UTF-8?q?uested=20--=20of=20course,=20they=20woudl=20then=20be=20complet?= =?UTF-8?q?ely=20unable=20to=20use=20such=20handles.=20This=20pattern=20is?= =?UTF-8?q?=20seen=20in=20Rtl=20code=20which=20we=20share,=20and=20where?= =?UTF-8?q?=20the=20intent=20is=20to=20give=20kernel=20kernel=20handles,?= =?UTF-8?q?=20and=20user=20user=20handles,=20so=20OBJ=5FKERNEL=5FHANDLE=20?= =?UTF-8?q?is=20unconditionally=20used,=20which=20in=20NT=20had=20the=20ri?= =?UTF-8?q?ght=20effect.=20For=20us=20though,=20it=20gave=20unusable=20use?= =?UTF-8?q?r-handles.=20This=20had=20the=20direct=20effect=20of=20complete?= =?UTF-8?q?ly=20breaking=20RtlQueryRegistryValues=20from=20user-mode=20if?= =?UTF-8?q?=20the=20TOPKEY=20or=20SUBKEY=20flags=20were=20used.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=55318 --- reactos/ntoskrnl/include/internal/ob.h | 1 + reactos/ntoskrnl/ob/obhandle.c | 1 + reactos/ntoskrnl/ob/oblife.c | 15 +++++++++------ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ob.h b/reactos/ntoskrnl/include/internal/ob.h index 3c8ad1edf3d..cc9ff526cca 100644 --- a/reactos/ntoskrnl/include/internal/ob.h +++ b/reactos/ntoskrnl/include/internal/ob.h @@ -559,6 +559,7 @@ NTAPI ObpCaptureObjectCreateInformation( IN POBJECT_ATTRIBUTES ObjectAttributes, IN KPROCESSOR_MODE AccessMode, + IN KPROCESSOR_MODE CreatorMode, IN BOOLEAN AllocateFromLookaside, IN POBJECT_CREATE_INFORMATION ObjectCreateInfo, OUT PUNICODE_STRING ObjectName diff --git a/reactos/ntoskrnl/ob/obhandle.c b/reactos/ntoskrnl/ob/obhandle.c index 346ea5bd4b0..6dfa67607d9 100644 --- a/reactos/ntoskrnl/ob/obhandle.c +++ b/reactos/ntoskrnl/ob/obhandle.c @@ -2456,6 +2456,7 @@ ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes, /* Capture all the info */ Status = ObpCaptureObjectCreateInformation(ObjectAttributes, + AccessMode, AccessMode, TRUE, &TempBuffer->ObjectCreateInfo, diff --git a/reactos/ntoskrnl/ob/oblife.c b/reactos/ntoskrnl/ob/oblife.c index 724c7f57696..5b4727483f9 100644 --- a/reactos/ntoskrnl/ob/oblife.c +++ b/reactos/ntoskrnl/ob/oblife.c @@ -442,10 +442,11 @@ ObpCaptureObjectName(IN OUT PUNICODE_STRING CapturedName, NTSTATUS NTAPI ObpCaptureObjectCreateInformation(IN POBJECT_ATTRIBUTES ObjectAttributes, - IN KPROCESSOR_MODE AccessMode, - IN BOOLEAN AllocateFromLookaside, - IN POBJECT_CREATE_INFORMATION ObjectCreateInfo, - OUT PUNICODE_STRING ObjectName) + IN KPROCESSOR_MODE AccessMode, + IN KPROCESSOR_MODE CreatorMode, + IN BOOLEAN AllocateFromLookaside, + IN POBJECT_CREATE_INFORMATION ObjectCreateInfo, + OUT PUNICODE_STRING ObjectName) { NTSTATUS Status = STATUS_SUCCESS; PSECURITY_DESCRIPTOR SecurityDescriptor; @@ -479,9 +480,10 @@ ObpCaptureObjectCreateInformation(IN POBJECT_ATTRIBUTES ObjectAttributes, _SEH2_YIELD(return STATUS_INVALID_PARAMETER); } - /* Set some Create Info */ + /* Set some Create Info and do not allow user-mode kernel handles */ ObjectCreateInfo->RootDirectory = ObjectAttributes->RootDirectory; - ObjectCreateInfo->Attributes = ObjectAttributes->Attributes; + ObjectCreateInfo->Attributes = ObjectAttributes->Attributes & OBJ_VALID_ATTRIBUTES; + if (CreatorMode != KernelMode) ObjectCreateInfo->Attributes &= ~OBJ_KERNEL_HANDLE; LocalObjectName = ObjectAttributes->ObjectName; SecurityDescriptor = ObjectAttributes->SecurityDescriptor; SecurityQos = ObjectAttributes->SecurityQualityOfService; @@ -942,6 +944,7 @@ ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL, /* Capture all the info */ Status = ObpCaptureObjectCreateInformation(ObjectAttributes, ProbeMode, + AccessMode, FALSE, ObjectCreateInfo, &ObjectName); From b42b421bea6bb369e7323902f10c6e32e85f73be Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 08:02:17 +0000 Subject: [PATCH 173/289] [SMSS]: Co-exist with SMSS2 by using OBJ_OPENIF when creating object directories and sections, in case SMSS2 has already done so (which now it probably will). [SMSS2]: Implement all the required registry configuration parsing functions. KnownDLLs, DosDevices, PageFiles, Subsystems, ExcludedKnownDLLs, PendingFileRenameOperations, ObjectDirectories, Environment keys are all processed and put into lists. Other than creating the object directories and setting the environment variables, though, no other work happens -- but we do DPRINT1 what should happen. svn path=/trunk/; revision=55319 --- reactos/base/system/smss/initdosdev.c | 2 +- reactos/base/system/smss/initobdir.c | 2 +- reactos/base/system/smss/initwkdll.c | 2 +- reactos/base/system/smss2/sminit.c | 666 +++++++++++++++++++++++++- reactos/base/system/smss2/smss.h | 1 + reactos/base/system/smss2/smsubsys.c | 1 + 6 files changed, 668 insertions(+), 6 deletions(-) diff --git a/reactos/base/system/smss/initdosdev.c b/reactos/base/system/smss/initdosdev.c index 3d4699eb425..a8ed20adfb7 100644 --- a/reactos/base/system/smss/initdosdev.c +++ b/reactos/base/system/smss/initdosdev.c @@ -50,7 +50,7 @@ SmpDosDevicesQueryRoutine(PWSTR ValueName, /* create symbolic link */ InitializeObjectAttributes(&ObjectAttributes, &LinkName, - OBJ_PERMANENT|OBJ_CASE_INSENSITIVE, + OBJ_PERMANENT|OBJ_CASE_INSENSITIVE|OBJ_OPENIF, NULL, NULL); Status = NtCreateSymbolicLinkObject(&LinkHandle, diff --git a/reactos/base/system/smss/initobdir.c b/reactos/base/system/smss/initobdir.c index 38b797bd3f7..f90d973d7db 100644 --- a/reactos/base/system/smss/initobdir.c +++ b/reactos/base/system/smss/initobdir.c @@ -37,7 +37,7 @@ SmpObjectDirectoryQueryRoutine(PWSTR ValueName, InitializeObjectAttributes(&ObjectAttributes, &UnicodeString, - 0, + OBJ_OPENIF, NULL, NULL); diff --git a/reactos/base/system/smss/initwkdll.c b/reactos/base/system/smss/initwkdll.c index 0b3d7981c55..ba73626ee48 100644 --- a/reactos/base/system/smss/initwkdll.c +++ b/reactos/base/system/smss/initwkdll.c @@ -82,7 +82,7 @@ SmpKnownDllsQueryRoutine(PWSTR ValueName, InitializeObjectAttributes(&ObjectAttributes, &ImageName, - OBJ_CASE_INSENSITIVE | OBJ_PERMANENT, + OBJ_CASE_INSENSITIVE | OBJ_PERMANENT | OBJ_OPENIF, (HANDLE)EntryContext, NULL); Status = NtCreateSection(&SectionHandle, diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index 23a45ca8c95..4285035b198 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -32,7 +32,9 @@ LIST_ENTRY SmpSubSystemsToDefer, SmpExecuteList, NativeProcessList; ULONG SmBaseTag; HANDLE SmpDebugPort; PVOID SmpHeap; -PWCHAR SmpDefaultEnvironment; +PWCHAR SmpDefaultEnvironment, SmpDefaultLibPathBuffer; +UNICODE_STRING SmpKnownDllPath, SmpDefaultLibPath; +ULONG SmpCalledConfigEnv; ULONG SmpInitProgressByLine; NTSTATUS SmpInitReturnStatus; @@ -55,6 +57,174 @@ BOOLEAN MiniNTBoot; /* REGISTRY CONFIGURATION *****************************************************/ +NTSTATUS +NTAPI +SmpSaveRegistryValue(IN PLIST_ENTRY ListAddress, + IN PWSTR Name, + IN PWCHAR Value, + IN BOOLEAN Flags) +{ + PSMP_REGISTRY_VALUE RegEntry; + UNICODE_STRING NameString, ValueString; + ANSI_STRING AnsiValueString; + PLIST_ENTRY NextEntry; + + /* Convert to unicode strings */ + RtlInitUnicodeString(&NameString, Name); + RtlInitUnicodeString(&ValueString, Value); + + /* Check if we should do a duplicat echeck */ + if (Flags) + { + /* Loop the current list */ + NextEntry = ListAddress->Flink; + while (NextEntry != ListAddress) + { + /* Get each entry */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + + /* Check if the value name matches */ + if (!RtlCompareUnicodeString(&RegEntry->Name, &NameString, TRUE)) + { + /* Check if the value is the exact same thing */ + if (((Value) && + (RtlCompareUnicodeString(&RegEntry->Value, &ValueString, TRUE))) || + (!(Value) && !(RegEntry->Value.Buffer))) + { + /* Fail -- the same setting is being set twice */ + return STATUS_OBJECT_NAME_EXISTS; + } + + /* We found the list, and this isn't a duplicate value */ + break; + } + + /* This wasn't a match, keep going */ + NextEntry = NextEntry->Flink; + RegEntry = NULL; + } + } + else + { + /* This should be the first value, so initialize a new list/structure */ + RegEntry = NULL; + } + + /* Are we adding on, or creating a new entry */ + if (!RegEntry) + { + /* A new entry -- allocate it */ + RegEntry = RtlAllocateHeap(RtlGetProcessHeap(), + SmBaseTag, + NameString.MaximumLength + + sizeof(SMP_REGISTRY_VALUE)); + if (!RegEntry) return STATUS_NO_MEMORY; + + /* Initialize the list and set all values to NULL */ + InitializeListHead(&RegEntry->Entry); + RegEntry->AnsiValue = NULL; + RegEntry->Value.Buffer = NULL; + + /* Copy and initialize the value name */ + RegEntry->Name.Buffer = (PWCHAR)(RegEntry + 1); + RegEntry->Name.Length = NameString.Length; + RegEntry->Name.MaximumLength = NameString.MaximumLength; + RtlCopyMemory(RegEntry->Name.Buffer, + NameString.Buffer, + NameString.MaximumLength); + + /* Add this entry into the list */ + InsertTailList(ListAddress, &RegEntry->Entry); + } + + /* Did we have an old value buffer? */ + if (RegEntry->Value.Buffer) + { + /* Free it */ + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->Value.Buffer); + } + + /* Is there no value associated? */ + if (!Value) + { + /* We're done here */ + RtlInitUnicodeString(&RegEntry->Value, NULL); + return STATUS_SUCCESS; + } + + /* There is a value, so allocate a buffer for it */ + RegEntry->Value.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), + SmBaseTag, + ValueString.MaximumLength); + if (!RegEntry->Value.Buffer) + { + /* Out of memory, undo */ + RemoveEntryList(&RegEntry->Entry); + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry); + return STATUS_NO_MEMORY; + } + + /* Copy the value into the entry */ + RegEntry->Value.Length = ValueString.Length; + RegEntry->Value.MaximumLength = ValueString.MaximumLength; + RtlCopyMemory(RegEntry->Value.Buffer, + ValueString.Buffer, + ValueString.MaximumLength); + + /* Now allocate memory for an ANSI copy of it */ + RegEntry->AnsiValue = RtlAllocateHeap(RtlGetProcessHeap(), + SmBaseTag, + (ValueString.Length / sizeof(WCHAR)) + + sizeof(ANSI_NULL)); + if (!RegEntry->AnsiValue) + { + /* Out of memory, undo */ + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->Value.Buffer); + RemoveEntryList(&RegEntry->Entry); + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry); + return STATUS_NO_MEMORY; + } + + /* Convert the Unicode value string and return success */ + RtlInitEmptyAnsiString(&AnsiValueString, + RegEntry->AnsiValue, + (ValueString.Length / sizeof(WCHAR)) + + sizeof(ANSI_NULL)); + RtlUnicodeStringToAnsiString(&AnsiValueString, &ValueString, FALSE); + return STATUS_SUCCESS; +} + +PSMP_REGISTRY_VALUE +NTAPI +SmpFindRegistryValue(IN PLIST_ENTRY List, + IN PWSTR ValueName) +{ + PSMP_REGISTRY_VALUE RegEntry; + UNICODE_STRING ValueString; + PLIST_ENTRY NextEntry; + + /* Initialize the value name sting */ + RtlInitUnicodeString(&ValueString, ValueName); + + /* Loop the list */ + NextEntry = List->Flink; + while (NextEntry != List) + { + /* Get each entry */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + + /* Check if the value name matches */ + if (!RtlCompareUnicodeString(&RegEntry->Name, &ValueString, TRUE)) break; + + /* It doesn't, move on */ + NextEntry = NextEntry->Flink; + } + + /* If we looped back, return NULL, otherwise return the entry we found */ + if (NextEntry == List) RegEntry = NULL; + return RegEntry; +} + NTSTATUS NTAPI SmpConfigureProtectionMode(IN PWSTR ValueName, @@ -107,6 +277,334 @@ SmpConfigureAllowProtectedRenames(IN PWSTR ValueName, return STATUS_SUCCESS; } +NTSTATUS +NTAPI +SmpConfigureObjectDirectories(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + PISECURITY_DESCRIPTOR SecDescriptor; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE DirHandle; + UNICODE_STRING RpcString, WindowsString, SearchString; + PWCHAR SourceString = ValueData; + + /* Initialize the two strings we will be looking for */ + RtlInitUnicodeString(&RpcString, L"\\RPC Control"); + RtlInitUnicodeString(&WindowsString, L"\\Windows"); + + /* Loop the registry data we received */ + while (*SourceString) + { + /* Assume primary SD for most objects */ + RtlInitUnicodeString(&SearchString, SourceString); + SecDescriptor = SmpPrimarySecurityDescriptor; + + /* But for these two always set the liberal descriptor */ + if ((RtlEqualUnicodeString(&SearchString, &RpcString, TRUE)) || + (RtlEqualUnicodeString(&SearchString, &WindowsString, TRUE))) + { + SecDescriptor = SmpLiberalSecurityDescriptor; + } + + /* Create the requested directory with the requested descriptor */ + InitializeObjectAttributes(&ObjectAttributes, + &SearchString, + OBJ_CASE_INSENSITIVE | + OBJ_OPENIF | + OBJ_PERMANENT, + NULL, + SecDescriptor); + DPRINT1("Creating: %wZ directory\n", &SearchString); + Status = NtCreateDirectoryObject(&DirHandle, + DIRECTORY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + /* Failure case */ + DPRINT1("SMSS: Unable to create %wZ object directory - Status == %lx\n", + &SearchString, Status); + } + else + { + /* It worked, now close the handle */ + NtClose(DirHandle); + } + + /* Move to the next requested object */ + while (*SourceString++); + } + + /* All done */ + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpConfigureMemoryMgmt(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + /* Save this is into a list */ + DPRINT1("PageFile or Execute Entry: %S-%S\n", ValueName, ValueData); + return SmpSaveRegistryValue(EntryContext, ValueData, NULL, TRUE); +} + +NTSTATUS +NTAPI +SmpConfigureFileRenames(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + NTSTATUS Status; + static PWCHAR Canary; + + /* Check if this is the second call */ + if (Canary) + { + /* Save the data into the list */ + DPRINT1("Renamed file: %S-%S\n", Canary, ValueData); + Status = SmpSaveRegistryValue(EntryContext, Canary, ValueData, FALSE); + Canary = 0; + } + else + { + /* This it the first call, do nothing until we get the second call */ + Canary = ValueData; + Status = STATUS_SUCCESS; + } + + /* Return the status */ + return Status; +} + +NTSTATUS +NTAPI +SmpConfigureExcludeKnownDlls(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + PWCHAR DllName; + NTSTATUS Status; + + /* Make sure the value type is valid */ + if ((ValueType == REG_MULTI_SZ) || (ValueType == REG_SZ)) + { + /* Keep going for each DLL in the list */ + DllName = ValueData; + while (*DllName) + { + /* Add this to the linked list */ + DPRINT1("Excluded DLL: %S\n", DllName); + Status = SmpSaveRegistryValue(EntryContext, DllName, NULL, TRUE); + + /* Bail out on failure or if only one DLL name was present */ + if (!(NT_SUCCESS(Status)) || (ValueType == REG_SZ)) return Status; + + /* Otherwise, move to the next DLL name */ + while (*DllName++); + } + } + + /* All done */ + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpConfigureDosDevices(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + /* Save into linked list */ + DPRINT1("DOS Device: %S-%S\n", ValueName, ValueData); + return SmpSaveRegistryValue(EntryContext, ValueName, ValueData, TRUE); +} + +NTSTATUS +NTAPI +SmpInitializeKnownDllPath(IN PUNICODE_STRING DllPath, + IN PWCHAR Buffer, + IN ULONG Length) +{ + NTSTATUS Status; + + /* Allocate the buffer */ + DllPath->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), SmBaseTag, Length); + if (DllPath->Buffer) + { + /* Fill out the rest of the string */ + DllPath->MaximumLength = Length; + DllPath->Length = Length - sizeof(UNICODE_NULL); + + /* Copy the actual path and return success */ + RtlCopyMemory(DllPath->Buffer, Buffer, Length); + Status = STATUS_SUCCESS; + } + else + { + /* Fail with out of memory code */ + Status = STATUS_NO_MEMORY; + } + + /* Return result */ + return Status; +} + +NTSTATUS +NTAPI +SmpConfigureKnownDlls(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + /* Check which value is being set */ + if (_wcsicmp(ValueName, L"DllDirectory")) + { + /* Add to the linked list -- this is a file */ + DPRINT1("KnownDll: %S-%S\n", ValueName, ValueData); + return SmpSaveRegistryValue(EntryContext, ValueName, ValueData, TRUE); + } + + /* This is the directory, initialize it */ + DPRINT1("KnownDll Path: %S\n", ValueData); + return SmpInitializeKnownDllPath(&SmpKnownDllPath, ValueData, ValueLength); +} + +NTSTATUS +NTAPI +SmpConfigureEnvironment(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + NTSTATUS Status; + UNICODE_STRING ValueString, DataString; + + /* Convert the strings into UNICODE_STRING and set the variable defined */ + RtlInitUnicodeString(&ValueString, ValueName); + RtlInitUnicodeString(&DataString, ValueData); + DPRINT1("Setting %wZ = %wZ\n", &ValueString, &DataString); + Status = RtlSetEnvironmentVariable(0, &ValueString, &DataString); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: 'SET %wZ = %wZ' failed - Status == %lx\n", + &ValueString, &DataString, Status); + return Status; + } + + /* Check if the path is being set, and wait for the second instantiation */ + if (!(_wcsicmp(ValueName, L"Path")) && (++SmpCalledConfigEnv == 2)) + { + /* Allocate the path buffer */ + SmpDefaultLibPathBuffer = RtlAllocateHeap(RtlGetProcessHeap(), + SmBaseTag, + ValueLength); + if (!SmpDefaultLibPathBuffer) return STATUS_NO_MEMORY; + + /* Copy the data into it and create the UNICODE_STRING to hold it */ + RtlCopyMemory(SmpDefaultLibPathBuffer, ValueData, ValueLength); + RtlInitUnicodeString(&SmpDefaultLibPath, SmpDefaultLibPathBuffer); + } + + /* All good */ + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpConfigureSubSystems(IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +{ + PSMP_REGISTRY_VALUE RegEntry; + PWCHAR SubsystemName; + + /* Is this a required or optional subsystem */ + if ((_wcsicmp(ValueName, L"Required")) && + (_wcsicmp(ValueName, L"Optional"))) + { + /* It isn't, is this the PSI flag? */ + if ((_wcsicmp(ValueName, L"PosixSingleInstance")) || + (ValueType != REG_DWORD)) + { + /* It isn't, must be a subsystem entry, add it to the list */ + DPRINT1("Subsystem entry: %S-%S\n", ValueName, ValueData); + return SmpSaveRegistryValue(EntryContext, ValueName, ValueData, TRUE); + } + + /* This was the PSI flag, save it and exit */ + RegPosixSingleInstance = TRUE; + return STATUS_SUCCESS; + } + + /* This should be one of the required/optional lists. Is the type valid? */ + if (ValueType == REG_MULTI_SZ) + { + /* It is, get the first subsystem */ + SubsystemName = ValueData; + while (*SubsystemName) + { + /* We should have already put it into the list when we found it */ + DPRINT1("Found subsystem: %S\n", SubsystemName); + RegEntry = SmpFindRegistryValue(EntryContext, SubsystemName); + if (!RegEntry) + { + /* This subsystem doesn't exist, so skip it */ + DPRINT1("SMSS: Invalid subsystem name - %ws\n", SubsystemName); + } + else + { + /* Found it -- remove it from the main list */ + RemoveEntryList(&RegEntry->Entry); + + /* Figure out which list to put it in */ + if (_wcsicmp(ValueName, L"Required")) + { + /* Put it into the optional list */ + DPRINT1("Optional\n"); + InsertTailList(&SmpSubSystemsToDefer, &RegEntry->Entry); + } + else + { + /* Put it into the required list */ + DPRINT1("Required\n"); + InsertTailList(&SmpSubSystemsToLoad, &RegEntry->Entry); + } + } + + /* Move to the next name */ + while (*SubsystemName++); + } + } + + /* All done! */ + return STATUS_SUCCESS; +} + RTL_QUERY_REGISTRY_TABLE SmpRegistryConfigurationTable[] = { @@ -119,15 +617,177 @@ SmpRegistryConfigurationTable[] = NULL, 0 }, + { SmpConfigureAllowProtectedRenames, - RTL_QUERY_REGISTRY_DELETE, + 0, //RTL_QUERY_REGISTRY_DELETE, L"AllowProtectedRenames", NULL, REG_DWORD, NULL, 0 }, + + { + SmpConfigureObjectDirectories, + 0, + L"ObjectDirectories", + NULL, + REG_MULTI_SZ, + L"\\Windows\0\\RPC Control\0", + 0 + }, + + { + SmpConfigureMemoryMgmt, + 0, + L"BootExecute", + &SmpBootExecuteList, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureMemoryMgmt, + RTL_QUERY_REGISTRY_TOPKEY, + L"SetupExecute", + &SmpSetupExecuteList, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureFileRenames, + 0, //RTL_QUERY_REGISTRY_DELETE, + L"PendingFileRenameOperations", + &SmpFileRenameList, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureFileRenames, + 0, //RTL_QUERY_REGISTRY_DELETE, + L"PendingFileRenameOperations2", + &SmpFileRenameList, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureExcludeKnownDlls, + 0, + L"ExcludeFromKnownDlls", + &SmpExcludeKnownDllsList, + REG_MULTI_SZ, + L"\0", + 0 + }, + + { + NULL, + RTL_QUERY_REGISTRY_SUBKEY, + L"Memory Management", + NULL, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureMemoryMgmt, + 0, + L"PagingFiles", + &SmpPagingFileList, + REG_MULTI_SZ, + L"?:\\pagefile.sys\0", + 0 + }, + + { + SmpConfigureDosDevices, + RTL_QUERY_REGISTRY_SUBKEY, + L"DOS Devices", + &SmpDosDevicesList, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureKnownDlls, + RTL_QUERY_REGISTRY_SUBKEY, + L"KnownDlls", + &SmpKnownDllsList, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureEnvironment, + RTL_QUERY_REGISTRY_SUBKEY, + L"Environment", + NULL, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureSubSystems, + RTL_QUERY_REGISTRY_SUBKEY, + L"SubSystems", + &SmpSubSystemList, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureSubSystems, + RTL_QUERY_REGISTRY_NOEXPAND, + L"Required", + &SmpSubSystemList, + REG_MULTI_SZ, + L"Debug\0Windows\0", + 0 + }, + + { + SmpConfigureSubSystems, + RTL_QUERY_REGISTRY_NOEXPAND, + L"Optional", + &SmpSubSystemList, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureSubSystems, + 0, + L"Kmode", + &SmpSubSystemList, + REG_NONE, + NULL, + 0 + }, + + { + SmpConfigureMemoryMgmt, + RTL_QUERY_REGISTRY_TOPKEY, + L"Execute", + &SmpExecuteList, + REG_NONE, + NULL, + 0 + }, + {0}, }; @@ -477,7 +1137,7 @@ SmpLoadDataFromRegistry(OUT PUNICODE_STRING InitialCommand) OBJECT_ATTRIBUTES ObjectAttributes; HANDLE KeyHandle; UNICODE_STRING DestinationString; - + /* Initialize the keywords we'll be looking for */ RtlInitUnicodeString(&SmpDebugKeyword, L"debug"); RtlInitUnicodeString(&SmpASyncKeyword, L"async"); diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index 430fe748c0e..b7af1d6f108 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -42,6 +42,7 @@ extern BOOLEAN SmpDbgSsLoaded; extern HANDLE SmpWindowsSubSysProcess; extern HANDLE SmpSessionsObjectDirectory; extern HANDLE SmpWindowsSubSysProcessId; +extern BOOLEAN RegPosixSingleInstance; /* FUNCTIONS ******************************************************************/ diff --git a/reactos/base/system/smss2/smsubsys.c b/reactos/base/system/smss2/smsubsys.c index ab5ae67ade2..f45374bab8a 100644 --- a/reactos/base/system/smss2/smsubsys.c +++ b/reactos/base/system/smss2/smsubsys.c @@ -18,6 +18,7 @@ RTL_CRITICAL_SECTION SmpKnownSubSysLock; LIST_ENTRY SmpKnownSubSysHead; HANDLE SmpWindowsSubSysProcess; HANDLE SmpWindowsSubSysProcessId; +BOOLEAN RegPosixSingleInstance; /* FUNCTIONS ******************************************************************/ From 3c2b7f8a5b69e2c5245f2b327614d1b7732977ba Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 09:42:47 +0000 Subject: [PATCH 174/289] [NTOSKRNL]: One of my favorite bugfixes to date: While working on SMSS2, I notice that Win32->NT path conversion is failing and %SystemRoot% is not being translated. Yet, this is supposed to be part of the core environment that the kernel sends to SMSS! I analyze the old SMSS, and in there, it works. Puzzled, I DPRINT1 out the environment only to see that it is empty. I do the same in the kernel -- empty! The old SMSS is currently manually regenerating its critical environment, as if the kernel never sent it (which perfectly hid the bug that our kernel...actually did never send it!). But why were we sending no environment? It turns out our environment string was 0x10000 bytes, just one byte longer than MAX_USHORT and overflowing back to zero -- hence our Appends were all silently failing. But why was our environment string 0x10000, when we allocate 0x1000 bytes only? And here comes the Mm bug. When you allocate virtual memory in Windows you are forced to use 64K alignment, and Windows internally will align the VAD on a 64K boundary. In ReactOS however, we actually allocate, map, and reserve a full 64K memory area, as well as actually modify the region size that the caller has sent, returning the caller a 64K-aligned size no matter what (whereas Windows would return the original 4KB size). I've thus added a simple hack which still allocates a full 64K memory area (who knows what would break if not), but only aligns the region size to a page size -- less swap pages are reserved, and the caller only receives a page-aligned region, instead of 64K. This now fixes ExpLoadInitialProcess and anyone else that was requesting a 4KB page and getting 64KB in exchange... svn path=/trunk/; revision=55320 --- reactos/ntoskrnl/mm/anonmem.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index 88ca97b8277..782cc30f366 100644 --- a/reactos/ntoskrnl/mm/anonmem.c +++ b/reactos/ntoskrnl/mm/anonmem.c @@ -874,9 +874,15 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, return(Status); } +#if 0 MemoryAreaLength = (ULONG_PTR)MemoryArea->EndingAddress - (ULONG_PTR)MemoryArea->StartingAddress; - +#else + ULONG_PTR EndingAddress; + EndingAddress = ((ULONG_PTR)MemoryArea->StartingAddress + RegionSize - 1) | (PAGE_SIZE - 1); + MemoryAreaLength = (ULONG_PTR)EndingAddress - (ULONG_PTR)MemoryArea->StartingAddress + 1; +#endif + MmInitializeRegion(&MemoryArea->Data.VirtualMemoryData.RegionListHead, MemoryAreaLength, Type, Protect); From 25c5926fcbdb4d45e51df63b2d4013c483bda96b Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 09:43:24 +0000 Subject: [PATCH 175/289] [NDK]: LDR_CALLBACK's second parameter is a PCHAR. svn path=/trunk/; revision=55321 --- reactos/include/ndk/umfuncs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/ndk/umfuncs.h b/reactos/include/ndk/umfuncs.h index 3af7928823b..16b8f4620fe 100644 --- a/reactos/include/ndk/umfuncs.h +++ b/reactos/include/ndk/umfuncs.h @@ -304,7 +304,7 @@ LdrUnloadDll( IN PVOID BaseAddress ); -typedef VOID (NTAPI *PLDR_CALLBACK)(PVOID CallbackContext, PVOID Name); +typedef VOID (NTAPI *PLDR_CALLBACK)(PVOID CallbackContext, PCHAR Name); NTSTATUS NTAPI LdrVerifyImageMatchesChecksum( From 864a1bc6ae1012e5a79fb1cc83b2cdd0b60695bd Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 10:15:29 +0000 Subject: [PATCH 176/289] [NTOSKRNL]: Here's another gem. SMSS2 couldn't call LdrVerifyImageCheckSum, nor could it create Known DLL sections (of course, magically SMSS could). Turns out what Mm expects in terms of file access rights when you map a section has almost nothing to do with what it should expect. Added a new function to ARM3 (which had most of the code there already) so correctly determine which file access rights should be needed. One big change is that you can now map sections with PAGE_EXECUTE if you only have FILE_EXECUTE (FILE_READ_DATA no longer required), as things should be. svn path=/trunk/; revision=55323 --- reactos/ntoskrnl/mm/ARM3/section.c | 30 +++++++++++++++++++++++++++ reactos/ntoskrnl/mm/section.c | 33 +++++------------------------- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/section.c b/reactos/ntoskrnl/mm/ARM3/section.c index d5c33291042..c1a6dfe343b 100644 --- a/reactos/ntoskrnl/mm/ARM3/section.c +++ b/reactos/ntoskrnl/mm/ARM3/section.c @@ -29,6 +29,18 @@ ACCESS_MASK MmMakeSectionAccess[8] = SECTION_MAP_EXECUTE | SECTION_MAP_READ }; +ACCESS_MASK MmMakeFileAccess[8] = +{ + FILE_READ_DATA, + FILE_READ_DATA, + FILE_EXECUTE, + FILE_EXECUTE | FILE_READ_DATA, + FILE_WRITE_DATA | FILE_READ_DATA, + FILE_READ_DATA, + FILE_EXECUTE | FILE_WRITE_DATA | FILE_READ_DATA, + FILE_EXECUTE | FILE_READ_DATA +}; + CHAR MmUserProtectionToMask1[16] = { 0, @@ -73,6 +85,24 @@ MMSESSION MmSession; /* PRIVATE FUNCTIONS **********************************************************/ +ACCESS_MASK +NTAPI +MiArm3GetCorrectFileAccessMask(IN ACCESS_MASK SectionPageProtection) +{ + ULONG ProtectionMask; + + /* Calculate the protection mask and make sure it's valid */ + ProtectionMask = MiMakeProtectionMask(SectionPageProtection); + if (ProtectionMask == MM_INVALID_PROTECTION) + { + DPRINT1("Invalid protection mask\n"); + return STATUS_INVALID_PAGE_PROTECTION; + } + + /* Now convert it to the required file access */ + return MmMakeFileAccess[ProtectionMask & 0x7]; +} + ULONG NTAPI MiMakeProtectionMask(IN ULONG Protect) diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 71eef6cf33f..bde920327c8 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -150,6 +150,7 @@ static ULONG SectionCharacteristicsToProtect[16] = PAGE_EXECUTE_READWRITE, /* 15 = WRITABLE, READABLE, EXECUTABLE, SHARED */ }; +ACCESS_MASK NTAPI MiArm3GetCorrectFileAccessMask(IN ACCESS_MASK SectionPageProtection); static GENERIC_MAPPING MmpSectionMapping = { STANDARD_RIGHTS_READ | SECTION_MAP_READ | SECTION_QUERY, STANDARD_RIGHTS_WRITE | SECTION_MAP_WRITE, @@ -3011,23 +3012,11 @@ MmCreateDataFileSection(PROS_SECTION_OBJECT *SectionObject, Section->SectionPageProtection = SectionPageProtection; Section->AllocationAttributes = AllocationAttributes; - /* - * Check file access required - */ - if (SectionPageProtection & PAGE_READWRITE || - SectionPageProtection & PAGE_EXECUTE_READWRITE) - { - FileAccess = FILE_READ_DATA | FILE_WRITE_DATA; - } - else - { - FileAccess = FILE_READ_DATA; - } - /* * Reference the file handle */ - Status = ObReferenceObjectByHandle(FileHandle, + FileAccess = MiArm3GetCorrectFileAccessMask(SectionPageProtection); + Status = ObReferenceObjectByHandle(FileHandle, FileAccess, IoFileObjectType, ExGetPreviousMode(), @@ -3881,23 +3870,11 @@ MmCreateImageSection(PROS_SECTION_OBJECT *SectionObject, ULONG i; ULONG FileAccess = 0; - /* - * Check file access required - */ - if (SectionPageProtection & PAGE_READWRITE || - SectionPageProtection & PAGE_EXECUTE_READWRITE) - { - FileAccess = FILE_READ_DATA | FILE_WRITE_DATA; - } - else - { - FileAccess = FILE_READ_DATA; - } - /* * Reference the file handle */ - Status = ObReferenceObjectByHandle(FileHandle, + FileAccess = MiArm3GetCorrectFileAccessMask(SectionPageProtection); + Status = ObReferenceObjectByHandle(FileHandle, FileAccess, IoFileObjectType, ExGetPreviousMode(), From 9f51b3ff351764f84084c1d1671400b54ef5b9d2 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 10:22:21 +0000 Subject: [PATCH 177/289] [SMSS2]: Implement KnownDLL and DOSDevice initialization now that the kernel bugs are gone. Compared to SMSS, SMSS2 is smarter and uses a Ldr callback to manually add any imported DLLs of KnownDLLs to the KnownDLL list, which helps with long-term app launch performance. Next up will be environment and page file. svn path=/trunk/; revision=55324 --- reactos/base/system/smss2/sminit.c | 399 ++++++++++++++++++++++++++++- reactos/base/system/smss2/smss.h | 8 + 2 files changed, 399 insertions(+), 8 deletions(-) diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index 4285035b198..4c1471f9840 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -30,7 +30,7 @@ LIST_ENTRY SmpExcludeKnownDllsList, SmpSubSystemList, SmpSubSystemsToLoad; LIST_ENTRY SmpSubSystemsToDefer, SmpExecuteList, NativeProcessList; ULONG SmBaseTag; -HANDLE SmpDebugPort; +HANDLE SmpDebugPort, SmpDosDevicesObjectDirectory; PVOID SmpHeap; PWCHAR SmpDefaultEnvironment, SmpDefaultLibPathBuffer; UNICODE_STRING SmpKnownDllPath, SmpDefaultLibPath; @@ -42,8 +42,8 @@ PVOID SmpInitLastCall; SECURITY_DESCRIPTOR SmpPrimarySDBody, SmpLiberalSDBody, SmpKnownDllsSDBody; SECURITY_DESCRIPTOR SmpApiPortSDBody; -PSECURITY_DESCRIPTOR SmpPrimarySecurityDescriptor, SmpLiberalSecurityDescriptor; -PSECURITY_DESCRIPTOR SmpKnownDllsSecurityDescriptor, SmpApiPortSecurityDescriptor; +PISECURITY_DESCRIPTOR SmpPrimarySecurityDescriptor, SmpLiberalSecurityDescriptor; +PISECURITY_DESCRIPTOR SmpKnownDllsSecurityDescriptor, SmpApiPortSecurityDescriptor; ULONG SmpAllowProtectedRenames, SmpProtectionMode = 1; BOOLEAN MiniNTBoot; @@ -353,7 +353,6 @@ SmpConfigureMemoryMgmt(IN PWSTR ValueName, IN PVOID EntryContext) { /* Save this is into a list */ - DPRINT1("PageFile or Execute Entry: %S-%S\n", ValueName, ValueData); return SmpSaveRegistryValue(EntryContext, ValueData, NULL, TRUE); } @@ -433,7 +432,6 @@ SmpConfigureDosDevices(IN PWSTR ValueName, IN PVOID EntryContext) { /* Save into linked list */ - DPRINT1("DOS Device: %S-%S\n", ValueName, ValueData); return SmpSaveRegistryValue(EntryContext, ValueName, ValueData, TRUE); } @@ -480,7 +478,6 @@ SmpConfigureKnownDlls(IN PWSTR ValueName, if (_wcsicmp(ValueName, L"DllDirectory")) { /* Add to the linked list -- this is a file */ - DPRINT1("KnownDll: %S-%S\n", ValueName, ValueData); return SmpSaveRegistryValue(EntryContext, ValueName, ValueData, TRUE); } @@ -1101,14 +1098,400 @@ NTSTATUS NTAPI SmpInitializeDosDevices(VOID) { - return STATUS_SUCCESS; + NTSTATUS Status; + PSMP_REGISTRY_VALUE RegEntry; + SECURITY_DESCRIPTOR_CONTROL OldFlag = 0; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING DestinationString; + HANDLE DirHandle; + PLIST_ENTRY NextEntry, Head; + + /* Open the GLOBAL?? directory */ + RtlInitUnicodeString(&DestinationString, L"\\??"); + InitializeObjectAttributes(&ObjectAttributes, + &DestinationString, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_PERMANENT, + NULL, + NULL); + Status = NtOpenDirectoryObject(&SmpDosDevicesObjectDirectory, + DIRECTORY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Unable to open %wZ directory - Status == %lx\n", + &DestinationString, Status); + return Status; + } + + /* Loop the DOS devices */ + Head = &SmpDosDevicesList; + while (!IsListEmpty(Head)) + { + /* Get the entry and remove it */ + NextEntry = RemoveHeadList(Head); + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + + /* Initialize the attributes, and see which descriptor is being used */ + InitializeObjectAttributes(&ObjectAttributes, + &RegEntry->Name, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_PERMANENT, + SmpDosDevicesObjectDirectory, + SmpPrimarySecurityDescriptor); + if (SmpPrimarySecurityDescriptor) + { + /* Save the old flag and set it while we create this link */ + OldFlag = SmpPrimarySecurityDescriptor->Control; + SmpPrimarySecurityDescriptor->Control |= SE_DACL_DEFAULTED; + } + + /* Create the symbolic link */ + DPRINT1("Creating symlink for %wZ to %wZ\n", &RegEntry->Name, &RegEntry->Value); + Status = NtCreateSymbolicLinkObject(&DirHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + &RegEntry->Value); + if (Status == STATUS_OBJECT_NAME_EXISTS) + { + /* Make it temporary and get rid of the handle */ + NtMakeTemporaryObject(DirHandle); + NtClose(DirHandle); + + /* Treat this as success, and see if we got a name back */ + Status = STATUS_SUCCESS; + if (RegEntry->Value.Length) + { + /* Create it now with this name */ + ObjectAttributes.Attributes &= ~OBJ_OPENIF; + Status = NtCreateSymbolicLinkObject(&DirHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + &RegEntry->Value); + } + } + + /* If we were using a security descriptor, restore the non-defaulted flag */ + if (ObjectAttributes.SecurityDescriptor) + { + SmpPrimarySecurityDescriptor->Control = OldFlag; + } + + /* Print a failure if we failed to create the symbolic link */ + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Unable to create %wZ => %wZ symbolic link object - Status == 0x%lx\n", + &RegEntry->Name, + &RegEntry->Value, + Status); + break; + } + + /* Close the handle */ + NtClose(DirHandle); + + /* Free this entry */ + if (RegEntry->AnsiValue) RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->AnsiValue); + if (RegEntry->Value.Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->Value.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry); + } + + /* Return the status */ + return Status; +} + +VOID +NTAPI +SmpProcessModuleImports(IN PVOID Unused, + IN PCHAR ImportName) +{ + ULONG Length = 0, Chars; + WCHAR Buffer[MAX_PATH]; + PWCHAR DllName, DllValue; + ANSI_STRING ImportString; + UNICODE_STRING ImportUnicodeString; + NTSTATUS Status; + + /* Skip NTDLL since it's already always mapped */ + if (!_stricmp(ImportName, "ntdll.dll")) return; + + /* Initialize our strings */ + RtlInitAnsiString(&ImportString, ImportName); + RtlInitEmptyUnicodeString(&ImportUnicodeString, Buffer, sizeof(Buffer)); + Status = RtlAnsiStringToUnicodeString(&ImportUnicodeString, &ImportString, FALSE); + if (!NT_SUCCESS(Status)) return; + + /* Loop in case we find a forwarder */ + ImportUnicodeString.MaximumLength = ImportUnicodeString.Length + sizeof(UNICODE_NULL); + while (Length < ImportUnicodeString.Length) + { + if (ImportUnicodeString.Buffer[Length / sizeof(WCHAR)] == L'.') break; + Length += sizeof(WCHAR); + } + + /* Break up the values as needed */ + DllValue = ImportUnicodeString.Buffer; + DllName = &ImportUnicodeString.Buffer[ImportUnicodeString.MaximumLength / sizeof(WCHAR)]; + Chars = Length >> 1; + wcsncpy(DllName, ImportUnicodeString.Buffer, Chars); + DllName[Chars] = 0; + + /* Add the DLL to the list */ + SmpSaveRegistryValue(&SmpKnownDllsList, DllName, DllValue, TRUE); +} + +NTSTATUS +NTAPI +SmpInitializeKnownDllsInternal(IN PUNICODE_STRING Directory, + IN PUNICODE_STRING Path) +{ + HANDLE DirFileHandle, DirHandle, SectionHandle, FileHandle, LinkHandle; + UNICODE_STRING NtPath, DestinationString; + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status, Status1; + PLIST_ENTRY NextEntry; + PSMP_REGISTRY_VALUE RegEntry; + ULONG_PTR ErrorParameters[3]; + UNICODE_STRING ErrorResponse; + IO_STATUS_BLOCK IoStatusBlock; + ULONG OldFlag = 0; + USHORT ImageCharacteristics; + + /* Initialize to NULL */ + DirFileHandle = NULL; + DirHandle = NULL; + NtPath.Buffer = NULL; + + /* Create the \KnownDLLs directory */ + InitializeObjectAttributes(&ObjectAttributes, + Directory, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_PERMANENT, + NULL, + SmpKnownDllsSecurityDescriptor); + Status = NtCreateDirectoryObject(&DirHandle, + DIRECTORY_ALL_ACCESS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + /* Handle failure */ + DPRINT1("SMSS: Unable to create %wZ directory - Status == %lx\n", + Directory, Status); + return Status; + } + + /* Convert the path to native format */ + if (!RtlDosPathNameToNtPathName_U(Path->Buffer, &NtPath, NULL, NULL)) + { + /* Fail if this didn't work */ + DPRINT1("SMSS: Unable to to convert %wZ to an Nt path\n", Path); + Status = STATUS_OBJECT_NAME_INVALID; + goto Quickie; + } + + /* Open the path that was specified, which should be a directory */ + InitializeObjectAttributes(&ObjectAttributes, + &NtPath, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenFile(&DirFileHandle, + FILE_LIST_DIRECTORY | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) + { + /* Fail if we couldn't open it */ + DPRINT1("SMSS: Unable to open a handle to the KnownDll directory (%wZ)" + "- Status == %lx\n", + Path, + Status); + FileHandle = NULL; + goto Quickie; + } + + /* Temporarily hack the SD to use a default DACL for this symbolic link */ + if (SmpPrimarySecurityDescriptor) + { + OldFlag = SmpPrimarySecurityDescriptor->Control; + SmpPrimarySecurityDescriptor->Control |= SE_DACL_DEFAULTED; + } + + /* Create a symbolic link to the directory in the object manager */ + RtlInitUnicodeString(&DestinationString, L"KnownDllPath"); + InitializeObjectAttributes(&ObjectAttributes, + &DestinationString, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF | OBJ_PERMANENT, + DirHandle, + SmpPrimarySecurityDescriptor); + Status = NtCreateSymbolicLinkObject(&LinkHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes, + Path); + + /* Undo the hack */ + if (SmpPrimarySecurityDescriptor) SmpPrimarySecurityDescriptor->Control = OldFlag; + + /* Check if the symlink was created */ + if (!NT_SUCCESS(Status)) + { + /* It wasn't, so bail out since the OS needs it to exist */ + DPRINT1("SMSS: Unable to create %wZ symbolic link - Status == %lx\n", + &DestinationString, Status); + LinkHandle = NULL; + goto Quickie; + } + + /* We created it permanent, we can go ahead and close the handle now */ + Status1 = NtClose(LinkHandle); + ASSERT(NT_SUCCESS(Status1)); + + /* Now loop the known DLLs */ + NextEntry = SmpKnownDllsList.Flink; + while (NextEntry != &SmpKnownDllsList) + { + /* Get the entry and skip it if it's in the exluded list */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("Processing known DLL: %wZ-%wZ\n", &RegEntry->Name, &RegEntry->Value); + if ((SmpFindRegistryValue(&SmpExcludeKnownDllsList, + RegEntry->Name.Buffer)) || + (SmpFindRegistryValue(&SmpExcludeKnownDllsList, + RegEntry->Value.Buffer))) + { + continue; + } + + /* Open the actual file */ + InitializeObjectAttributes(&ObjectAttributes, + &RegEntry->Value, + OBJ_CASE_INSENSITIVE, + DirFileHandle, + NULL); + Status = NtOpenFile(&FileHandle, + SYNCHRONIZE | FILE_EXECUTE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ | FILE_SHARE_DELETE, + FILE_NON_DIRECTORY_FILE | + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) break; + + /* Checksum it */ + Status = LdrVerifyImageMatchesChecksum((HANDLE)((ULONG_PTR)FileHandle | 1), + SmpProcessModuleImports, + RegEntry, + &ImageCharacteristics); + if (!NT_SUCCESS(Status)) + { + /* Checksum failed, so don't even try going further -- kill SMSS */ + RtlInitUnicodeString(&ErrorResponse, + L"Verification of a KnownDLL failed."); + ErrorParameters[0] = (ULONG)&ErrorResponse; + ErrorParameters[1] = Status; + ErrorParameters[2] = (ULONG)&RegEntry->Value; + SmpTerminate(ErrorParameters, 5, RTL_NUMBER_OF(ErrorParameters)); + } + else if (!(ImageCharacteristics & IMAGE_FILE_DLL)) + { + /* An invalid known DLL entry will also kill SMSS */ + RtlInitUnicodeString(&ErrorResponse, + L"Non-DLL file included in KnownDLL list."); + ErrorParameters[0] = (ULONG)&ErrorResponse; + ErrorParameters[1] = STATUS_INVALID_IMPORT_OF_NON_DLL; + ErrorParameters[2] = (ULONG)&RegEntry->Value; + SmpTerminate(ErrorParameters, 5, RTL_NUMBER_OF(ErrorParameters)); + } + + /* Temporarily hack the SD to use a default DACL for this section */ + if (SmpLiberalSecurityDescriptor) + { + OldFlag = SmpLiberalSecurityDescriptor->Control; + SmpLiberalSecurityDescriptor->Control |= SE_DACL_DEFAULTED; + } + + /* Create the section for this known DLL */ + InitializeObjectAttributes(&ObjectAttributes, + &RegEntry->Value, + OBJ_PERMANENT, + DirHandle, + SmpLiberalSecurityDescriptor) + Status = NtCreateSection(&SectionHandle, + SECTION_ALL_ACCESS, + &ObjectAttributes, + 0, + PAGE_EXECUTE, + SEC_IMAGE, + FileHandle); + + /* Undo the hack */ + if (SmpLiberalSecurityDescriptor) SmpLiberalSecurityDescriptor->Control = OldFlag; + + /* Check if we created the section okay */ + if (NT_SUCCESS(Status)) + { + /* We can close it now, since it's marked permanent */ + Status1 = NtClose(SectionHandle); + ASSERT(NT_SUCCESS(Status1)); + } + else + { + /* If we couldn't make it "known", that's fine and keep going */ + DPRINT1("SMSS: CreateSection for KnownDll %wZ failed - Status == %lx\n", + &RegEntry->Value, Status); + } + + /* Close the file since we can move on to the next one */ + Status1 = NtClose(FileHandle); + ASSERT(NT_SUCCESS(Status1)); + + /* Go to the next entry */ + NextEntry = NextEntry->Flink; + } + +Quickie: + /* Close both handles and free the NT path buffer */ + if (DirHandle) + { + Status1 = NtClose(DirHandle); + ASSERT(NT_SUCCESS(Status1)); + } + if (DirFileHandle) + { + Status1 = NtClose(DirFileHandle); + ASSERT(NT_SUCCESS(Status1)); + } + if (NtPath.Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, NtPath.Buffer); + return Status; } NTSTATUS NTAPI SmpInitializeKnownDlls(VOID) { - return STATUS_SUCCESS; + NTSTATUS Status; + PSMP_REGISTRY_VALUE RegEntry; + UNICODE_STRING DestinationString; + PLIST_ENTRY Head, NextEntry; + + /* Call the internal function */ + RtlInitUnicodeString(&DestinationString, L"\\KnownDlls"); + Status = SmpInitializeKnownDllsInternal(&DestinationString, &SmpKnownDllPath); + + /* Wipe out the list regardless of success */ + Head = &SmpKnownDllsList; + while (!IsListEmpty(Head)) + { + /* Remove this entry */ + NextEntry = RemoveHeadList(Head); + + /* Free it */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->AnsiValue); + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->Value.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry); + } + + /* All done */ + return Status; } NTSTATUS diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index b7af1d6f108..f8c741a14dd 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -46,6 +46,14 @@ extern BOOLEAN RegPosixSingleInstance; /* FUNCTIONS ******************************************************************/ +NTSTATUS +NTAPI +SmpTerminate( + IN PULONG_PTR Parameters, + IN ULONG ParameterMask, + IN ULONG ParameterCount +); + NTSTATUS NTAPI SmpCreateSecurityDescriptors( From 51fe71aec32864ac909dce4315d3ac98c5af521b Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 17:19:14 +0000 Subject: [PATCH 178/289] [NTOSKRNL]: Keep doing the old region/swap work incorrectly, but at least return a correct size. Let's see if this fixes it. svn path=/trunk/; revision=55330 --- reactos/ntoskrnl/mm/anonmem.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index 782cc30f366..3b10e4c134c 100644 --- a/reactos/ntoskrnl/mm/anonmem.c +++ b/reactos/ntoskrnl/mm/anonmem.c @@ -874,14 +874,11 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, return(Status); } -#if 0 MemoryAreaLength = (ULONG_PTR)MemoryArea->EndingAddress - (ULONG_PTR)MemoryArea->StartingAddress; -#else ULONG_PTR EndingAddress; EndingAddress = ((ULONG_PTR)MemoryArea->StartingAddress + RegionSize - 1) | (PAGE_SIZE - 1); - MemoryAreaLength = (ULONG_PTR)EndingAddress - (ULONG_PTR)MemoryArea->StartingAddress + 1; -#endif + RegionSize = (ULONG_PTR)EndingAddress - (ULONG_PTR)MemoryArea->StartingAddress + 1; MmInitializeRegion(&MemoryArea->Data.VirtualMemoryData.RegionListHead, MemoryAreaLength, Type, Protect); @@ -898,7 +895,7 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, if (ProcessHandle != NtCurrentProcess()) ObDereferenceObject(Process); *UBaseAddress = BaseAddress; - *URegionSize = MemoryAreaLength; + *URegionSize = RegionSize; DPRINT("*UBaseAddress %x *URegionSize %x\n", BaseAddress, RegionSize); return(STATUS_SUCCESS); From 973a9360b242ebd01f702d75962c6f87264fd517 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 19:29:30 +0000 Subject: [PATCH 179/289] [SMSS2]: Implement command line and token parsing. Implement pagefile descriptor structure, format, flags, and parsing. They are now created as they should. Use SmpHeap instead of RtlGetProcessHeap() to keep code cleaner. Use SmpSystemRoot instead of NtSystemRoot now that it's being defined. "Environment" in registry should be parsed twice to handle nested expansions. svn path=/trunk/; revision=55333 --- reactos/base/system/smss2/pagefile.c | 176 +++++++++++++++- reactos/base/system/smss2/sminit.c | 13 +- reactos/base/system/smss2/smss.c | 13 +- reactos/base/system/smss2/smss.h | 20 ++ reactos/base/system/smss2/smutil.c | 287 ++++++++++++++++++++++++++- 5 files changed, 489 insertions(+), 20 deletions(-) diff --git a/reactos/base/system/smss2/pagefile.c b/reactos/base/system/smss2/pagefile.c index 52a88672c58..2dc4b8dfcb4 100644 --- a/reactos/base/system/smss2/pagefile.c +++ b/reactos/base/system/smss2/pagefile.c @@ -14,7 +14,30 @@ /* GLOBALS ********************************************************************/ +#define STANDARD_DRIVE_LETTER_OFFSET 4 + +#define SMP_PAGEFILE_CREATED 0x01 +#define SMP_PAGEFILE_DEFAULT 0x02 +#define SMP_PAGEFILE_SYSTEM_MANAGED 0x04 +#define SMP_PAGEFILE_WAS_TOO_BIG 0x08 +#define SMP_PAGEFILE_ON_ANY_DRIVE 0x10 +#define SMP_PAGEFILE_EMERGENCY 0x20 +#define SMP_PAGEFILE_DUMP_PROCESSED 0x40 +typedef struct _SMP_PAGEFILE_DESCRIPTOR +{ + LIST_ENTRY Entry; + UNICODE_STRING Name; + UNICODE_STRING Token; + LARGE_INTEGER MinSize; + LARGE_INTEGER MaxSize; + LARGE_INTEGER ActualMinSize; + LARGE_INTEGER ActualMaxSize; + ULONG Flags; +} SMP_PAGEFILE_DESCRIPTOR, *PSMP_PAGEFILE_DESCRIPTOR; + LIST_ENTRY SmpPagingFileDescriptorList, SmpVolumeDescriptorList; +BOOLEAN SmpRegistrySpecifierPresent; +ULONG SmpNumberOfPagingFiles; /* FUNCTIONS ******************************************************************/ @@ -31,8 +54,157 @@ NTSTATUS NTAPI SmpCreatePagingFileDescriptor(IN PUNICODE_STRING PageFileToken) { - DPRINT1("New pagefile data: %wZ\n", PageFileToken); - return STATUS_SUCCESS; + NTSTATUS Status; + ULONG MinSize = 0, MaxSize = 0; + BOOLEAN SystemManaged = FALSE, ZeroSize = TRUE; + PSMP_PAGEFILE_DESCRIPTOR Descriptor, ListDescriptor; + ULONG i; + WCHAR c; + PWCHAR p, ArgBuffer; + PLIST_ENTRY NextEntry; + UNICODE_STRING PageFileName, Arguments; + + /* Make sure we don't have too many */ + if (SmpNumberOfPagingFiles >= 16) + { + DPRINT1("SMSS:PFILE: Too many paging files specified - %d\n", + SmpNumberOfPagingFiles); + return STATUS_TOO_MANY_PAGING_FILES; + } + + /* Parse the specified and get the name and arguments out of it */ + DPRINT1("SMSS:PFILE: Paging file specifier `%wZ' \n", PageFileToken); + Status = SmpParseCommandLine(PageFileToken, + NULL, + &PageFileName, + NULL, + &Arguments); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + DPRINT1("SMSS:PFILE: SmpParseCommandLine(%wZ) failed with status %X \n", + PageFileToken, Status); + return Status; + } + + /* Set the variable to let everyone know we have a pagefile token */ + SmpRegistrySpecifierPresent = TRUE; + + /* Parse the arguments, if any */ + if (Arguments.Buffer) + { + /* Parse the pagefile size */ + for (i = 0; i < Arguments.Length / sizeof(WCHAR); i++) + { + /* Check if it's zero */ + c = Arguments.Buffer[i]; + if ((c != L' ') && (c != L'\t') && (c != L'0')) + { + /* It isn't, break out */ + ZeroSize = FALSE; + break; + } + } + } + + /* Was a pagefile not specified, or was it specified with no size? */ + if ((Arguments.Buffer) || (ZeroSize)) + { + /* In this case, the system will manage its size */ + SystemManaged = TRUE; + } + else + { + /* We do have a size, so convert the arguments into a number */ + Status = RtlUnicodeStringToInteger(&Arguments, 0, &MinSize); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + RtlFreeUnicodeString(&PageFileName); + RtlFreeUnicodeString(&Arguments); + return Status; + } + + /* Now advance to the next argument */ + ArgBuffer = Arguments.Buffer; + p = ArgBuffer; + while (*p++) + { + /* Which should be a space... */ + if (*p == L' ') + { + /* And use the rest of the arguments as a maximum size */ + Arguments.Length -= ((PCHAR)p - (PCHAR)ArgBuffer); + Arguments.Buffer = ArgBuffer; + Status = RtlUnicodeStringToInteger(&Arguments, 0, &MaxSize); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + RtlFreeUnicodeString(&PageFileName); + RtlFreeUnicodeString(&Arguments); + return Status; + } + + /* We have both min and max, restore argument buffer */ + Arguments.Buffer = ArgBuffer; // Actual Windows Bug in faillure case above. + break; + } + } + } + + /* We are done parsing arguments */ + RtlFreeUnicodeString(&Arguments); + + /* Now we can allocate our descriptor */ + Descriptor = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(SMP_PAGEFILE_DESCRIPTOR)); + if (!Descriptor) + { + /* Fail if we couldn't */ + RtlFreeUnicodeString(&PageFileName); + return STATUS_NO_MEMORY; + } + + /* Capture all our data into the descriptor */ + Descriptor->Token = *PageFileToken; + Descriptor->Name = PageFileName; + Descriptor->MinSize.QuadPart = MinSize * 0x100000; + Descriptor->MaxSize.QuadPart = MaxSize * 0x100000; + if (SystemManaged) Descriptor->Flags |= SMP_PAGEFILE_SYSTEM_MANAGED; + Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET] = + RtlUpcaseUnicodeChar(Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET]); + if (Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET] == '?') + { + Descriptor->Flags |= SMP_PAGEFILE_ON_ANY_DRIVE; + } + + /* Now loop the existing descriptors */ + NextEntry = SmpPagingFileDescriptorList.Flink; + do + { + /* Are there none, or have we looped back to the beginning? */ + if (NextEntry == &SmpPagingFileDescriptorList) + { + /* This means no duplicates exist, so insert our descriptor! */ + InsertTailList(&SmpPagingFileDescriptorList, &Descriptor->Entry); + SmpNumberOfPagingFiles++; + DPRINT1("SMSS:PFILE: Created descriptor for `%wZ' (`%wZ') \n", + PageFileToken, &Descriptor->Name); + return STATUS_SUCCESS; + } + + /* Keep going until we find a duplicate, unless we are in "any" mode */ + ListDescriptor = CONTAINING_RECORD(NextEntry, SMP_PAGEFILE_DESCRIPTOR, Entry); + NextEntry = NextEntry->Flink; + } while (!(ListDescriptor->Flags & SMP_PAGEFILE_ON_ANY_DRIVE) || + !(Descriptor->Flags & SMP_PAGEFILE_ON_ANY_DRIVE)); + + /* We found a duplicate, so skip this descriptor/pagefile and fail */ + DPRINT1("SMSS:PFILE: Skipping duplicate specifier `%wZ' \n", PageFileToken); + RtlFreeUnicodeString(&PageFileName); + RtlFreeHeap(RtlGetProcessHeap(), 0, Descriptor); + return STATUS_INVALID_PARAMETER; } NTSTATUS diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index 4c1471f9840..deffa1f710a 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -23,15 +23,14 @@ typedef struct _SMP_REGISTRY_VALUE } SMP_REGISTRY_VALUE, *PSMP_REGISTRY_VALUE; UNICODE_STRING SmpSubsystemName, PosixName, Os2Name; -UNICODE_STRING SmpDebugKeyword, SmpASyncKeyword, SmpAutoChkKeyword; LIST_ENTRY SmpBootExecuteList, SmpSetupExecuteList, SmpPagingFileList; LIST_ENTRY SmpDosDevicesList, SmpFileRenameList, SmpKnownDllsList; LIST_ENTRY SmpExcludeKnownDllsList, SmpSubSystemList, SmpSubSystemsToLoad; LIST_ENTRY SmpSubSystemsToDefer, SmpExecuteList, NativeProcessList; +PVOID SmpHeap; ULONG SmBaseTag; HANDLE SmpDebugPort, SmpDosDevicesObjectDirectory; -PVOID SmpHeap; PWCHAR SmpDefaultEnvironment, SmpDefaultLibPathBuffer; UNICODE_STRING SmpKnownDllPath, SmpDefaultLibPath; ULONG SmpCalledConfigEnv; @@ -735,6 +734,16 @@ SmpRegistryConfigurationTable[] = 0 }, + { + SmpConfigureEnvironment, + RTL_QUERY_REGISTRY_SUBKEY, + L"Environment", + NULL, + REG_NONE, + NULL, + 0 + }, + { SmpConfigureSubSystems, RTL_QUERY_REGISTRY_SUBKEY, diff --git a/reactos/base/system/smss2/smss.c b/reactos/base/system/smss2/smss.c index 8ccb9b12ef3..b13a2336f22 100644 --- a/reactos/base/system/smss2/smss.c +++ b/reactos/base/system/smss2/smss.c @@ -26,8 +26,7 @@ ULONG NtInitialUserProcessBufferLength = sizeof(NtInitialUserProcessBuffer) - sizeof(WCHAR); ULONG NtInitialUserProcessBufferType = REG_SZ; -UNICODE_STRING NtSystemRoot; - +UNICODE_STRING SmpSystemRoot; ULONG AttachedSessionId = -1; BOOLEAN SmpDebug; @@ -127,7 +126,7 @@ ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, /* Copy the DOS path */ RtlCopyUnicodeString(&ProcessParams->CurrentDirectory.DosPath, - &NtSystemRoot); + &SmpSystemRoot); /* Make a buffer for the DLL Path */ p = (PWSTR)((PCHAR)ProcessParams->CurrentDirectory.DosPath.Buffer + @@ -195,7 +194,7 @@ ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, RtlAppendUnicodeStringToString(&Environment, &NullString); /* Create the system drive string */ - SystemDriveString = NtSystemRoot; + SystemDriveString = SmpSystemRoot; SystemDriveString.Length = 2 * sizeof(WCHAR); /* Append it to the environment */ @@ -205,7 +204,7 @@ ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, /* Append the system root to the environment */ RtlAppendUnicodeToString(&Environment, L"SystemRoot="); - RtlAppendUnicodeStringToString(&Environment, &NtSystemRoot); + RtlAppendUnicodeStringToString(&Environment, &SmpSystemRoot); RtlAppendUnicodeStringToString(&Environment, &NullString); /* Create SMSS process */ @@ -271,8 +270,8 @@ LaunchOldSmss(OUT PHANDLE Handles) /* No handles at first */ Handles[0] = Handles[1] = NULL; - /* Setup system root */ - RtlInitUnicodeString(&NtSystemRoot, SharedUserData->NtSystemRoot); + /* Initialize the system root */ + RtlInitUnicodeString(&SmpSystemRoot, SharedUserData->NtSystemRoot); /* Allocate the initialization buffer */ InitBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(INIT_BUFFER)); diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index f8c741a14dd..f317c5bdfbb 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -30,6 +30,11 @@ /* DEFINES ********************************************************************/ +#define SMP_DEBUG_FLAG 0x01 +#define SMP_ASYNC_FLAG 0x02 +#define SMP_AUTOCHK_FLAG 0x04 +#define SMP_INVALID_PATH 0x10 + /* EXTERNALS ******************************************************************/ extern RTL_CRITICAL_SECTION SmpKnownSubSysLock; @@ -43,6 +48,12 @@ extern HANDLE SmpWindowsSubSysProcess; extern HANDLE SmpSessionsObjectDirectory; extern HANDLE SmpWindowsSubSysProcessId; extern BOOLEAN RegPosixSingleInstance; +extern UNICODE_STRING SmpDebugKeyword, SmpASyncKeyword, SmpAutoChkKeyword; +extern PVOID SmpHeap; +extern ULONG SmBaseTag; +extern UNICODE_STRING SmpSystemRoot; +extern PWCHAR SmpDefaultEnvironment; +extern UNICODE_STRING SmpDefaultLibPath; /* FUNCTIONS ******************************************************************/ @@ -121,3 +132,12 @@ SmpCreatePagingFiles( VOID ); +NTSTATUS +NTAPI +SmpParseCommandLine( + IN PUNICODE_STRING CommandLine, + OUT PULONG Flags, + OUT PUNICODE_STRING FileName, + OUT PUNICODE_STRING Directory, + OUT PUNICODE_STRING Arguments +); diff --git a/reactos/base/system/smss2/smutil.c b/reactos/base/system/smss2/smutil.c index 5d4dfa8ba56..9a323acd703 100644 --- a/reactos/base/system/smss2/smutil.c +++ b/reactos/base/system/smss2/smutil.c @@ -23,6 +23,8 @@ typedef struct _SMP_PRIVILEGE_STATE TOKEN_PRIVILEGES NewBuffer; } SMP_PRIVILEGE_STATE, *PSMP_PRIVILEGE_STATE; +UNICODE_STRING SmpDebugKeyword, SmpASyncKeyword, SmpAutoChkKeyword; + /* FUNCTIONS ******************************************************************/ NTSTATUS @@ -36,9 +38,9 @@ SmpAcquirePrivilege(IN ULONG Privilege, /* Assume failure */ *PrivilegeState = NULL; - + /* Acquire the state structure to hold everything we need */ - State = RtlAllocateHeap(RtlGetProcessHeap(), + State = RtlAllocateHeap(SmpHeap, 0, sizeof(SMP_PRIVILEGE_STATE) + sizeof(TOKEN_PRIVILEGES) + @@ -52,7 +54,7 @@ SmpAcquirePrivilege(IN ULONG Privilege, if (!NT_SUCCESS(Status)) { /* Fail */ - RtlFreeHeap(RtlGetProcessHeap(), 0, State); + RtlFreeHeap(SmpHeap, 0, State); return Status; } @@ -74,7 +76,7 @@ SmpAcquirePrivilege(IN ULONG Privilege, if (Status == STATUS_BUFFER_TOO_SMALL) { /* Our static buffer is not big enough, allocate a bigger one */ - State->OldPrivileges = RtlAllocateHeap(RtlGetProcessHeap(), 0, Size); + State->OldPrivileges = RtlAllocateHeap(SmpHeap, 0, Size); if (!State->OldPrivileges) { /* Out of memory, fail */ @@ -105,12 +107,12 @@ Quickie: if (State->OldPrivileges != (PTOKEN_PRIVILEGES)&State->OldBuffer) { /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, State->OldPrivileges); + RtlFreeHeap(SmpHeap, 0, State->OldPrivileges); } /* Close the token handle and free the state structure */ NtClose(State->TokenHandle); - RtlFreeHeap(RtlGetProcessHeap(), 0, State); + RtlFreeHeap(SmpHeap, 0, State); return Status; } @@ -119,7 +121,7 @@ NTAPI SmpReleasePrivilege(IN PVOID PrivState) { PSMP_PRIVILEGE_STATE State = (PSMP_PRIVILEGE_STATE)PrivState; - + /* Adjust the privileges in the token */ NtAdjustPrivilegesToken(State->TokenHandle, FALSE, @@ -132,10 +134,277 @@ SmpReleasePrivilege(IN PVOID PrivState) if (State->OldPrivileges != (PTOKEN_PRIVILEGES)&State->OldBuffer) { /* Free it */ - RtlFreeHeap(RtlGetProcessHeap(), 0, State->OldPrivileges); + RtlFreeHeap(SmpHeap, 0, State->OldPrivileges); } /* Close the token handle and free the state structure */ NtClose(State->TokenHandle); - RtlFreeHeap(RtlGetProcessHeap(), 0, State); + RtlFreeHeap(SmpHeap, 0, State); +} + +NTSTATUS +NTAPI +SmpParseToken(IN PUNICODE_STRING Input, + IN BOOLEAN SecondPass, + OUT PUNICODE_STRING Token) +{ + PWCHAR p, pp; + ULONG Length, TokenLength, InputLength; + + /* Initialize to NULL to start with */ + RtlInitUnicodeString(Token, NULL); + + /* Save the input length */ + InputLength = Input->Length; + + /* Parse the buffer until the first character */ + p = Input->Buffer; + Length = 0; + while (Length < InputLength) + { + if (*p > L' ' ) break; + ++p; + Length += sizeof(WCHAR); + } + + /* Are we being called for argument pick-up? */ + if (SecondPass) + { + /* Then assume everything else is an argument */ + TokenLength = InputLength - Length * sizeof(WCHAR); + pp = (PWSTR)((ULONG_PTR)p + TokenLength); + } + else + { + /* No -- so loop until the next space */ + pp = p; + while (Length < InputLength) + { + if (*pp <= L' ' ) break; + ++pp; + Length += sizeof(WCHAR); + } + + /* Now compute how long this token is, and loop until the next char */ + TokenLength = (ULONG_PTR)pp - (ULONG_PTR)p; + while (Length < InputLength) + { + if (*pp > L' ' ) break; + ++pp; + Length += sizeof(WCHAR); + } + } + + /* Did we find a token? */ + if (TokenLength) + { + /* Allocate a buffer for it */ + Token->Buffer = RtlAllocateHeap(SmpHeap, + SmBaseTag, + TokenLength + sizeof(UNICODE_NULL)); + if (!Token->Buffer) return STATUS_NO_MEMORY; + + /* Fill in the unicode string to hold it */ + Token->MaximumLength = TokenLength + sizeof(UNICODE_NULL); + Token->Length = TokenLength; + RtlCopyMemory(Token->Buffer, p, TokenLength); + Token->Buffer[TokenLength / sizeof(WCHAR)] = UNICODE_NULL; + } + + /* Modify the input string with the position of where the next token begins */ + Input->Length -= (ULONG_PTR)pp - (ULONG_PTR)Input->Buffer; + Input->Buffer = pp; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpParseCommandLine(IN PUNICODE_STRING CommandLine, + OUT PULONG Flags, + OUT PUNICODE_STRING FileName, + OUT PUNICODE_STRING Directory, + OUT PUNICODE_STRING Arguments) +{ + ULONG Length; + UNICODE_STRING EnvString, PathString, CmdLineCopy, Token; + WCHAR PathBuffer[MAX_PATH]; + PWCHAR FilePart; + NTSTATUS Status; + UNICODE_STRING FullPathString; + + /* Initialize output arguments to NULL */ + RtlInitUnicodeString(FileName, NULL); + RtlInitUnicodeString(Arguments, NULL); + if (Directory) RtlInitUnicodeString(Directory, NULL); + + /* Check if we haven't yet built a full default path or system root yet */ + if (!SmpSystemRoot.Length) + { + /* Initialize it based on shared user data string */ + RtlInitUnicodeString(&SmpSystemRoot, SharedUserData->NtSystemRoot); + + /* Allocate an empty string for the path */ + Length = SmpDefaultLibPath.MaximumLength + SmpSystemRoot.MaximumLength + + sizeof(L"\\system32;"); + RtlInitEmptyUnicodeString(&FullPathString, + RtlAllocateHeap(SmpHeap, SmBaseTag, Length), + Length); + if (FullPathString.Buffer) + { + /* Append the root, system32;, and then the current library path */ + RtlAppendUnicodeStringToString(&FullPathString, &SmpSystemRoot); + RtlAppendUnicodeToString(&FullPathString, L"\\system32;"); + RtlAppendUnicodeStringToString(&FullPathString, &SmpDefaultLibPath); + RtlFreeHeap(SmpHeap, 0, SmpDefaultLibPath.Buffer); + SmpDefaultLibPath = FullPathString; + } + } + + /* Consume the command line */ + CmdLineCopy = *CommandLine; + while (TRUE) + { + /* Parse the first token and check for modifiers/specifiers */ + Status = SmpParseToken(&CmdLineCopy, FALSE, &Token); + if (!(NT_SUCCESS(Status)) || !(Token.Buffer)) return STATUS_UNSUCCESSFUL; + if (!Flags) break; + + /* Debug requested? */ + if (RtlEqualUnicodeString(&Token, &SmpDebugKeyword, TRUE)) + { + /* Convert into a flag */ + *Flags |= SMP_DEBUG_FLAG; + } + else if (RtlEqualUnicodeString(&Token, &SmpASyncKeyword, TRUE)) + { + /* Asynch requested, convert into a flag */ + *Flags |= SMP_ASYNC_FLAG; + } + else if (RtlEqualUnicodeString(&Token, &SmpAutoChkKeyword, TRUE)) + { + /* Autochk requested, convert into a flag */ + *Flags |= SMP_AUTOCHK_FLAG; + } + else + { + /* No specifier found, keep going */ + break; + } + + /* Get rid of this token and get the next */ + RtlFreeHeap(SmpHeap, 0, Token.Buffer); + } + + /* Initialize a string to hold the current path */ + RtlInitUnicodeString(&EnvString, L"Path"); + Length = PAGE_SIZE; + RtlInitEmptyUnicodeString(&PathString, + RtlAllocateHeap(SmpHeap, SmBaseTag, Length), + Length); + if (!PathString.Buffer) + { + /* Fail if we have no memory for this */ + RtlFreeHeap(SmpHeap, 0, Token.Buffer); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Query the path from the environment */ + Status = RtlQueryEnvironmentVariable_U(SmpDefaultEnvironment, + &EnvString, + &PathString); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + /* Our buffer was too small, free it */ + RtlFreeHeap(SmpHeap, 0, PathString.Buffer); + + /* And allocate one big enough */ + Length = PathString.Length + sizeof(UNICODE_NULL); + RtlInitEmptyUnicodeString(&PathString, + RtlAllocateHeap(SmpHeap, SmBaseTag, Length), + Length); + if (!PathString.Buffer) + { + /* Fail if we have no memory for this */ + RtlFreeHeap(SmpHeap, 0, Token.Buffer); + return STATUS_INSUFFICIENT_RESOURCES; + } + + /* Now try again, this should work */ + Status = RtlQueryEnvironmentVariable_U(SmpDefaultEnvironment, + &EnvString, + &PathString); + } + if (!NT_SUCCESS(Status)) + { + /* Another failure means that the kernel hasn't passed the path correctly */ + DPRINT1("SMSS: %wZ environment variable not defined.\n", &EnvString); + Status = STATUS_OBJECT_NAME_NOT_FOUND; + } + else + { + /* Check if the caller expects any flags out of here */ + if (Flags) + { + /* We can return the image not found flag -- so does the image exist */ + if (!(RtlDosSearchPath_U(PathString.Buffer, + Token.Buffer, + L".exe", + sizeof(PathBuffer), + PathBuffer, + &FilePart)) && + !(RtlDosSearchPath_U(SmpDefaultLibPath.Buffer, + Token.Buffer, + L".exe", + sizeof(PathBuffer), + PathBuffer, + &FilePart))) + { + /* It doesn't, let the caller know about it and exit */ + *Flags |= SMP_INVALID_PATH; + *FileName = Token; + RtlFreeHeap(SmpHeap, 0, PathString.Buffer); + return STATUS_SUCCESS; + } + } + else + { + /* Caller doesn't want flags, probably wants the image itself */ + wcscpy(PathBuffer, Token.Buffer); + } + } + + /* Free tokens and such, all that's left is to convert the image name */ + RtlFreeHeap(SmpHeap, 0, Token.Buffer); + RtlFreeHeap(SmpHeap, 0, PathString.Buffer); + if (!NT_SUCCESS(Status)) return Status; + + /* Convert it and bail out if this failed */ + if (!RtlDosPathNameToNtPathName_U(PathBuffer, FileName, NULL, NULL)) + { + DPRINT1("SMSS: Unable to translate %ws into an NT File Name\n", + &PathBuffer); + Status = STATUS_OBJECT_PATH_INVALID; + } + if (!NT_SUCCESS(Status)) return Status; + + /* Finally, check if the caller also wanted the directory */ + if (Directory) + { + /* Is the file a relative name with no directory? */ + if (FilePart <= PathBuffer) + { + /* Clear it */ + RtlInitUnicodeString(Directory, NULL); + } + else + { + /* There is a directory, and a filename -- separate those two */ + FilePart -= sizeof(UNICODE_NULL); + *FilePart = UNICODE_NULL; + RtlCreateUnicodeString(Directory, PathBuffer); + } + } + + /* We are done -- move on to the second pass to get the arguments */ + return SmpParseToken(&CmdLineCopy, TRUE, Arguments); } From 2740865cc06b075078a4ff5197fc21f2833ca4ba Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Mon, 30 Jan 2012 20:29:12 +0000 Subject: [PATCH 180/289] [COMCTL32] - Fix the fix for MSVC build (r55306). This is the version accepted by Wine. svn path=/trunk/; revision=55334 --- reactos/dll/win32/comctl32/imagelist.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/comctl32/imagelist.c b/reactos/dll/win32/comctl32/imagelist.c index 61cfbe3aaee..bb4107ba2de 100644 --- a/reactos/dll/win32/comctl32/imagelist.c +++ b/reactos/dll/win32/comctl32/imagelist.c @@ -3094,13 +3094,13 @@ static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count) if ((ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) || ilc == ILC_COLOR) { - BITMAPINFO *bmi = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, FIELD_OFFSET( BITMAPINFO, bmiColors[256] )); - if (bmi == NULL) - return NULL; + char buffer[sizeof(BITMAPINFO) + (256 - 1) * sizeof(RGBQUAD)]; + BITMAPINFO *bmi = (BITMAPINFO *)buffer; TRACE("Creating DIBSection %d x %d, %d Bits per Pixel\n", sz.cx, sz.cy, himl->uBitsPixel); + memset( buffer, 0, sizeof(buffer) ); bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi->bmiHeader.biWidth = sz.cx; bmi->bmiHeader.biHeight = sz.cy; @@ -3116,7 +3116,6 @@ static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count) DeleteObject( tmp ); } hbmNewBitmap = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, NULL, 0, 0); - HeapFree( GetProcessHeap(), 0, bmi ); } else /*if (ilc == ILC_COLORDDB)*/ { From 51dbd93981dd7d894f1157c1f8633b010f839a36 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 21:28:48 +0000 Subject: [PATCH 181/289] [SMSS2]: Implement all the processing required for being able to create emergency, system, and manual-sized page files, on both fixed drives any "any" drives. Missing the code to build volume descriptors and to actually ask the kernel to create the file (right now, just prints what should be done and sizes). svn path=/trunk/; revision=55335 --- reactos/base/system/smss2/pagefile.c | 309 ++++++++++++++++++++++++++- 1 file changed, 307 insertions(+), 2 deletions(-) diff --git a/reactos/base/system/smss2/pagefile.c b/reactos/base/system/smss2/pagefile.c index 2dc4b8dfcb4..3d3de59c000 100644 --- a/reactos/base/system/smss2/pagefile.c +++ b/reactos/base/system/smss2/pagefile.c @@ -14,7 +14,11 @@ /* GLOBALS ********************************************************************/ -#define STANDARD_DRIVE_LETTER_OFFSET 4 +// +// Taken from ASSERTs +// +#define STANDARD_PAGING_FILE_NAME L"\\??\\?:\\pagefile.sys" +#define STANDARD_DRIVE_LETTER_OFFSET 4 #define SMP_PAGEFILE_CREATED 0x01 #define SMP_PAGEFILE_DEFAULT 0x02 @@ -209,7 +213,308 @@ SmpCreatePagingFileDescriptor(IN PUNICODE_STRING PageFileToken) NTSTATUS NTAPI -SmpCreatePagingFiles(VOID) +SmpCreatePagingFileOnFixedDrive(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, + IN PLARGE_INTEGER FuzzFactor, + IN PLARGE_INTEGER MinimumSize) +{ + DPRINT1("Should create fixed pagefile of sizes: %I64d %I64d\n", + FuzzFactor->QuadPart, MinimumSize->QuadPart); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpCreatePagingFileOnAnyDrive(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, + IN PLARGE_INTEGER FuzzFactor, + IN PLARGE_INTEGER MinimumSize) +{ + DPRINT1("Should create 'any' pagefile of sizes: %I64d %I64d\n", + FuzzFactor->QuadPart, MinimumSize->QuadPart); + return STATUS_SUCCESS; +} + +VOID +NTAPI +SmpMakeDefaultPagingFileDescriptor(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor) +{ + /* The default descriptor uses 128MB as a pagefile size */ + Descriptor->Flags |= SMP_PAGEFILE_DEFAULT; + Descriptor->MinSize.QuadPart = 0x8000000; + Descriptor->MaxSize.QuadPart = 0x8000000; +} + +VOID +NTAPI +SmpMakeSystemManagedPagingFileDescriptor(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor) +{ + NTSTATUS Status; + LONGLONG MinimumSize, MaximumSize, Ram; + SYSTEM_BASIC_INFORMATION BasicInfo; + + /* Query the page size of the system, and the amount of RAM */ + Status = NtQuerySystemInformation(SystemBasicInformation, + &BasicInfo, + sizeof(BasicInfo), + NULL); + if (!NT_SUCCESS(Status)) + { + /* If we failed, use defaults since we have no idea otherwise */ + DPRINT1("SMSS:PFILE: NtQuerySystemInformation failed with %x \n", Status); + SmpMakeDefaultPagingFileDescriptor(Descriptor); + return; + } + + /* Chekc how much RAM we have and set three times this amount as maximum */ + Ram = BasicInfo.NumberOfPhysicalPages * BasicInfo.PageSize; + MaximumSize = 3 * Ram; + + /* If we have more than 1GB, use that as minimum, otherwise, use 1.5X RAM */ + MinimumSize = (Ram >= 0x40000000) ? Ram : MaximumSize / 2; + + /* Write the new sizes in the descriptor and mark it as system managed */ + Descriptor->MinSize.QuadPart = MinimumSize; + Descriptor->MaxSize.QuadPart = MaximumSize; + Descriptor->Flags |= SMP_PAGEFILE_SYSTEM_MANAGED; +} + +NTSTATUS +NTAPI +SmpValidatePagingFileSizes(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor) +{ + NTSTATUS Status = STATUS_SUCCESS; + ULONGLONG MinSize, MaxSize; + BOOLEAN WasTooBig = FALSE; + + /* Capture the min and max */ + MinSize = Descriptor->MinSize.QuadPart; + MaxSize = Descriptor->MaxSize.QuadPart; + DPRINT1("SMSS:PFILE: Validating sizes for `%wZ' %I64X %I64X\n", + &Descriptor->Name, MinSize, MaxSize); + + /* Don't let minimum be bigger than maximum */ + if (MinSize > MaxSize) MaxSize = MinSize; + + /* On PAE we can have bigger pagefiles... */ + if (SharedUserData->ProcessorFeatures[PF_PAE_ENABLED]) + { + /* But we don't support that yet */ + DPRINT1("ReactOS does not support PAE yet... assuming sizes OK\n"); + } + else + { + /* Check if the minimum is more then 4095 MB */ + if (MinSize > 0xFFF00000) + { + /* Trim it, this isn't allowed */ + WasTooBig = TRUE; + MinSize = 0xFFF00000; + } + + /* Check if the maximum is more then 4095 MB */ + if (MaxSize > 0xFFF00000) + { + /* Trim it, this isn't allowed */ + WasTooBig = TRUE; + MaxSize = 0xFFF00000; + } + } + + /* Did we trim? */ + if (WasTooBig) + { + /* Notify debugger output and write a flag in the descriptor */ + DPRINT1("SMSS:PFILE: Trimmed size of `%wZ' to maximum allowed \n", + &Descriptor->Name); + Descriptor->Flags |= SMP_PAGEFILE_WAS_TOO_BIG; + } + + /* Now write the (possibly trimmed) sizes back */ + Descriptor->MinSize.QuadPart = MinSize; + Descriptor->MaxSize.QuadPart = MaxSize; + return Status; +} + +NTSTATUS +NTAPI +SmpCreateSystemManagedPagingFile(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, + IN BOOLEAN DecreaseSize) +{ + LARGE_INTEGER FuzzFactor, Size; + + /* Make sure there's at least 1 paging file and that we are system-managed */ + ASSERT(SmpNumberOfPagingFiles >= 1); + ASSERT(!IsListEmpty(&SmpPagingFileDescriptorList)); + ASSERT(Descriptor->Flags & SMP_PAGEFILE_SYSTEM_MANAGED); // Descriptor->SystemManaged == 1 in ASSERT. + + /* Keep decreasing the pagefile by this amount if we run out of space */ + FuzzFactor.QuadPart = 0x1000000; + + /* Create the descriptor for it (mainly the right sizes) and validate */ + SmpMakeSystemManagedPagingFileDescriptor(Descriptor); + SmpValidatePagingFileSizes(Descriptor); + + /* Use either the minimum size in the descriptor, or 16MB in minimal mode */ + Size.QuadPart = DecreaseSize ? 0x1000000 : Descriptor->MinSize.QuadPart; + + /* Check if this should be a fixed pagefile or an any pagefile*/ + if (Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET] == '?') + { + /* Find a disk for it */ + return SmpCreatePagingFileOnAnyDrive(Descriptor, &FuzzFactor, &Size); + } + + /* Use the disk that was given */ + return SmpCreatePagingFileOnFixedDrive(Descriptor, &FuzzFactor, &Size); +} + +NTSTATUS +NTAPI +SmpCreateEmergencyPagingFile(VOID) +{ + PSMP_PAGEFILE_DESCRIPTOR Descriptor; + ULONG Length; + WCHAR Buffer[32]; + + /* Allocate a descriptor */ + Descriptor = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(SMP_PAGEFILE_DESCRIPTOR)); + if (!Descriptor) return STATUS_NO_MEMORY; + + /* Initialize it */ + RtlInitUnicodeString(&Descriptor->Name, NULL); + RtlInitUnicodeString(&Descriptor->Token, NULL); + + /* Copy the default pagefile name */ + wcscpy(Buffer, STANDARD_PAGING_FILE_NAME); + Length = wcslen(Buffer) * sizeof(WCHAR); + ASSERT(sizeof(Buffer) > Length); + + /* Fill the rest of the descriptor out */ + Descriptor->Name.Buffer = Buffer; + Descriptor->Name.Length = Length; + Descriptor->Name.MaximumLength = Length + sizeof(UNICODE_NULL); + Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET] = '?'; + Descriptor->Flags |= SMP_PAGEFILE_SYSTEM_MANAGED | + SMP_PAGEFILE_EMERGENCY | + SMP_PAGEFILE_ON_ANY_DRIVE; + + /* Insert it into the descriptor list */ + InsertHeadList(&SmpPagingFileDescriptorList, &Descriptor->Entry); + SmpNumberOfPagingFiles++; + + /* Go ahead and create it now, with the minimal size possible */ + return SmpCreateSystemManagedPagingFile(Descriptor, TRUE); +} + +NTSTATUS +NTAPI +SmpCreateVolumeDescriptors(VOID) { return STATUS_SUCCESS; } + +NTSTATUS +NTAPI +SmpCreatePagingFiles(VOID) +{ + NTSTATUS Status; + PSMP_PAGEFILE_DESCRIPTOR Descriptor; + LARGE_INTEGER Size, FuzzFactor; + BOOLEAN Created = FALSE; + PLIST_ENTRY NextEntry; + + /* Check if no paging files were requested */ + if (!(SmpNumberOfPagingFiles) && !(SmpRegistrySpecifierPresent)) + { + /* The list should be empty -- nothign to do */ + ASSERT(IsListEmpty(&SmpPagingFileDescriptorList)); + DPRINT1("SMSS:PFILE: No paging file was requested \n"); + return STATUS_SUCCESS; + } + + /* Initialize the volume descriptors so we can know what's available */ + Status = SmpCreateVolumeDescriptors(); + if (!NT_SUCCESS(Status)) + { + /* We can't make decisions without this, so fail */ + DPRINT1("SMSS:PFILE: Failed to create volume descriptors (status %X)\n", + Status); + return Status; + } + + /* If we fail creating pagefiles, try to reduce by this much each time */ + FuzzFactor.QuadPart = 0x1000000; + + /* Loop the descriptor list */ + NextEntry = SmpPagingFileDescriptorList.Flink; + while (NextEntry != &SmpPagingFileDescriptorList) + { + /* Check what kind of descriptor this is */ + Descriptor = CONTAINING_RECORD(NextEntry, SMP_PAGEFILE_DESCRIPTOR, Entry); + if (Descriptor->Flags & SMP_PAGEFILE_SYSTEM_MANAGED) + { + /* This is a system-managed descriptor. Create the correct file */ + DPRINT1("SMSS:PFILE: Creating a system managed paging file (`%wZ')\n", + &Descriptor->Name); + Status = SmpCreateSystemManagedPagingFile(Descriptor, FALSE); + if (!NT_SUCCESS(Status)) + { + /* We failed -- try again, with size minimization this time */ + DPRINT1("SMSS:PFILE: Trying lower sizes for (`%wZ') \n", + &Descriptor->Name); + Status = SmpCreateSystemManagedPagingFile(Descriptor, TRUE); + } + } + else + { + /* This is a manually entered descriptor. Validate its size first */ + SmpValidatePagingFileSizes(Descriptor); + + /* Check if this is an ANY pagefile or a FIXED pagefile */ + DPRINT1("SMSS:PFILE: Creating a normal paging file (`%wZ') \n", + &Descriptor->Name); + if (Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET] == L'?') + { + /* It's an any pagefile, try to create it wherever possible */ + Size = Descriptor->MinSize; + Status = SmpCreatePagingFileOnAnyDrive(Descriptor, + &FuzzFactor, + &Size); + if (!NT_SUCCESS(Status)) + { + /* We failed to create it. Try again with a smaller size */ + DPRINT1("SMSS:PFILE: Trying lower sizes for (`%wZ') \n", + &Descriptor->Name); + Size.QuadPart = 0x1000000; + Status = SmpCreatePagingFileOnAnyDrive(Descriptor, + &FuzzFactor, + &Size); + } + } + else + { + /* It's a fixed pagefile: override the minimum and use ours */ + Size.QuadPart = 0x1000000; + Status = SmpCreatePagingFileOnFixedDrive(Descriptor, + &FuzzFactor, + &Size); + } + } + + /* Go to the next descriptor */ + if (NT_SUCCESS(Status)) Created = TRUE; + NextEntry = NextEntry->Flink; + } + + /* Check if none of the code in our loops above was able to create it */ + if (!Created) + { + /* Build an emergency pagefile ourselves */ + DPRINT1("SMSS:PFILE: Creating emergency paging file. \n"); + Status = SmpCreateEmergencyPagingFile(); + } + + /* All done */ + return Status; +} From 0f85c44176ff339f19f10aa89b0778586e162302 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 22:50:37 +0000 Subject: [PATCH 182/289] [SMSS2]: Create and define the volume descriptor structure, and go ahead and build some volume descriptors! svn path=/trunk/; revision=55340 --- reactos/base/system/smss2/pagefile.c | 196 ++++++++++++++++++++++++++- 1 file changed, 195 insertions(+), 1 deletion(-) diff --git a/reactos/base/system/smss2/pagefile.c b/reactos/base/system/smss2/pagefile.c index 3d3de59c000..0e3c9cf92e5 100644 --- a/reactos/base/system/smss2/pagefile.c +++ b/reactos/base/system/smss2/pagefile.c @@ -20,6 +20,9 @@ #define STANDARD_PAGING_FILE_NAME L"\\??\\?:\\pagefile.sys" #define STANDARD_DRIVE_LETTER_OFFSET 4 +// +// Structure and flags describing each pagefile +// #define SMP_PAGEFILE_CREATED 0x01 #define SMP_PAGEFILE_DEFAULT 0x02 #define SMP_PAGEFILE_SYSTEM_MANAGED 0x04 @@ -39,6 +42,20 @@ typedef struct _SMP_PAGEFILE_DESCRIPTOR ULONG Flags; } SMP_PAGEFILE_DESCRIPTOR, *PSMP_PAGEFILE_DESCRIPTOR; +// +// Structure and flags describing each volume +// +#define SMP_VOLUME_INSERTED 0x01 +#define SMP_VOLUME_IS_BOOT 0x08 +typedef struct _SMP_VOLUME_DESCRIPTOR +{ + LIST_ENTRY Entry; + ULONG Flags; + WCHAR DriveLetter; + LARGE_INTEGER FreeSpace; + FILE_FS_DEVICE_INFORMATION DeviceInfo; +} SMP_VOLUME_DESCRIPTOR, *PSMP_VOLUME_DESCRIPTOR; + LIST_ENTRY SmpPagingFileDescriptorList, SmpVolumeDescriptorList; BOOLEAN SmpRegistrySpecifierPresent; ULONG SmpNumberOfPagingFiles; @@ -411,7 +428,184 @@ NTSTATUS NTAPI SmpCreateVolumeDescriptors(VOID) { - return STATUS_SUCCESS; + NTSTATUS Status; + UNICODE_STRING VolumePath; + ULONG Length; + BOOLEAN BootVolumeFound = FALSE; + WCHAR StartChar, Drive, DriveDiff; + HANDLE VolumeHandle; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + PROCESS_DEVICEMAP_INFORMATION ProcessInformation; + FILE_FS_DEVICE_INFORMATION DeviceInfo; + FILE_FS_SIZE_INFORMATION SizeInfo; + PSMP_VOLUME_DESCRIPTOR Volume; + LARGE_INTEGER FreeSpace, FinalFreeSpace; + WCHAR Buffer[32]; + + /* We should be starting with an empty list */ + ASSERT(IsListEmpty(&SmpVolumeDescriptorList)); + + /* Query the device map so we can get the drive letters */ + Status = NtQueryInformationProcess(NtCurrentProcess(), + ProcessDeviceMap, + &ProcessInformation, + sizeof(ProcessInformation), + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS:PFILE: Query(ProcessDeviceMap) failed with status %X \n", + Status); + return Status; + } + + /* Build the volume string, starting with A: (we'll edit this in place) */ + wcscpy(Buffer, L"\\??\\A:\\"); + Length = wcslen(Buffer); + VolumePath.Buffer = Buffer; + VolumePath.Length = Length * sizeof(WCHAR); + VolumePath.MaximumLength = Length * sizeof(WCHAR) + sizeof(UNICODE_NULL); + + /* Start with the C drive except on weird Japanese NECs... */ + StartChar = SharedUserData->AlternativeArchitecture ? L'A' : L'C'; + for (Drive = StartChar, DriveDiff = StartChar - 'A'; Drive <= L'Z'; Drive++, DriveDiff++) + { + /* Skip the disk if it's not in the drive map */ + if (!((1 << DriveDiff) & ProcessInformation.Query.DriveMap)) continue; + + /* Write the drive letter and try to open the volume */ + VolumePath.Buffer[STANDARD_DRIVE_LETTER_OFFSET] = Drive; + InitializeObjectAttributes(&ObjectAttributes, + &VolumePath, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenFile(&VolumeHandle, + FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE); + if (!NT_SUCCESS(Status)) + { + /* Skip the volume if we failed */ + DPRINT1("SMSS:PFILE: Open volume `%wZ' failed with status %X \n", + &VolumePath, Status); + continue; + } + + /* Now query device information on the volume */ + Status = NtQueryVolumeInformationFile(VolumeHandle, + &IoStatusBlock, + &DeviceInfo, + sizeof(DeviceInfo), + FileFsDeviceInformation); + if (!NT_SUCCESS(Status)) + { + /* Move to the next volume if we failed */ + DPRINT1("SMSS:PFILE: Query volume `%wZ' (handle %p) for device info" + " failed with status %X \n", + &VolumePath, + VolumeHandle, + Status); + NtClose(VolumeHandle); + continue; + } + + /* Check if this is a fixed disk */ + if (DeviceInfo.Characteristics & (FILE_FLOPPY_DISKETTE | + FILE_READ_ONLY_DEVICE | + FILE_REMOTE_DEVICE | + FILE_REMOVABLE_MEDIA)) + { + /* It isn't, so skip it */ + DPRINT1("SMSS:PFILE: Volume `%wZ' (%X) cannot store a paging file \n", + &VolumePath, + DeviceInfo.Characteristics); + NtClose(VolumeHandle); + continue; + } + + /* We found a fixed volume, allocate a descriptor for it */ + Volume = RtlAllocateHeap(RtlGetProcessHeap(), + HEAP_ZERO_MEMORY, + sizeof(SMP_VOLUME_DESCRIPTOR)); + if (!Volume) + { + /* Failed to allocate memory, try the next disk */ + DPRINT1("SMSS:PFILE: Failed to allocate a volume descriptor (%u bytes) \n", + sizeof(SMP_VOLUME_DESCRIPTOR)); + NtClose(VolumeHandle); + continue; + } + + /* Save the drive letter and device information */ + Volume->DriveLetter = Drive; + Volume->DeviceInfo = DeviceInfo; + + /* Check if this is the boot volume */ + if (RtlUpcaseUnicodeChar(Drive) == + RtlUpcaseUnicodeChar(SharedUserData->NtSystemRoot[0])) + { + /* Save it */ + ASSERT(BootVolumeFound == FALSE); + Volume->Flags |= SMP_VOLUME_IS_BOOT; + BootVolumeFound = TRUE; + } + + /* Now get size information on the volume */ + Status = NtQueryVolumeInformationFile(VolumeHandle, + &IoStatusBlock, + &SizeInfo, + sizeof(SizeInfo), + FileFsSizeInformation); + if (!NT_SUCCESS(Status)) + { + /* We failed -- keep going */ + DPRINT1("SMSS:PFILE: Query volume `%wZ' (handle %p) for size failed" + " with status %X \n", + &VolumePath, + VolumeHandle, + Status); + RtlFreeHeap(RtlGetProcessHeap(), 0, Volume); + NtClose(VolumeHandle); + continue; + } + + /* Done querying volume information, close the handle */ + NtClose(VolumeHandle); + + /* Compute how much free space we have */ + FreeSpace.QuadPart = SizeInfo.AvailableAllocationUnits.QuadPart * + SizeInfo.SectorsPerAllocationUnit; + FinalFreeSpace.QuadPart = FreeSpace.QuadPart * SizeInfo.BytesPerSector; + Volume->FreeSpace = FinalFreeSpace; + + /* Check if there's less than 32MB free so we don't starve the disk */ + if (FinalFreeSpace.QuadPart <= 0x2000000) + { + /* In this case, act as if there's no free space */ + Volume->FreeSpace.QuadPart = 0; + } + else + { + /* Trim off 32MB to give the disk a bit of breathing room */ + Volume->FreeSpace.QuadPart = FinalFreeSpace.QuadPart - 0x2000000; + } + + /* All done, add this volume to our descriptor list */ + InsertTailList(&SmpVolumeDescriptorList, &Volume->Entry); + Volume->Flags |= SMP_VOLUME_INSERTED; + DPRINT1("SMSS:PFILE: Created volume descriptor for`%wZ' \n", &VolumePath); + } + + /* We must've found at least the boot volume */ + ASSERT(BootVolumeFound == TRUE); + ASSERT(!IsListEmpty(&SmpVolumeDescriptorList)); + if (!IsListEmpty(&SmpVolumeDescriptorList)) return STATUS_SUCCESS; + + /* Something is really messed up if we found no disks at all */ + return STATUS_UNEXPECTED_IO_ERROR; } NTSTATUS From 432f60ee68f64a1440bdf69f5a94c606fe9ee721 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 30 Jan 2012 22:55:24 +0000 Subject: [PATCH 183/289] [NDK]: D'oh. svn path=/trunk/; revision=55342 --- reactos/include/ndk/iotypes.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/reactos/include/ndk/iotypes.h b/reactos/include/ndk/iotypes.h index 7f1af4ed1c6..ad505742faa 100644 --- a/reactos/include/ndk/iotypes.h +++ b/reactos/include/ndk/iotypes.h @@ -122,7 +122,14 @@ extern POBJECT_TYPE NTSYSAPI IoDriverObjectType; // Device Charactertics // #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 // // File Object Flags From b12e5cfc77795b5ab031e0c049c3ce408d325ce6 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Tue, 31 Jan 2012 01:19:14 +0000 Subject: [PATCH 184/289] [SMSS2]: Implement SmpCreateDynamicEnvironmentVariables such that all the SMSS-generated variables are created. Compared to SMSS it has some bug fixes and also handles the safe-mode options key. Next step is to handle boot/setup/execute keys and get autochk running from SMSS2. [SMSS]: No longer initialize the registry, let SMSS2 do that now. svn path=/trunk/; revision=55343 --- reactos/base/system/autochk/autochk.c | 1 + reactos/base/system/smss/init.c | 2 +- reactos/base/system/smss2/sminit.c | 318 +++++++++++++++++++++++++- 3 files changed, 319 insertions(+), 2 deletions(-) diff --git a/reactos/base/system/autochk/autochk.c b/reactos/base/system/autochk/autochk.c index 101edbb8ff1..47bd733d54f 100644 --- a/reactos/base/system/autochk/autochk.c +++ b/reactos/base/system/autochk/autochk.c @@ -326,6 +326,7 @@ CheckVolume( NtDrivePath[wcslen(NtDrivePath)-1] = 0; RtlInitUnicodeString(&DrivePathU, NtDrivePath); + DPRINT1("AUTOCHK: Checking %wZ\n", &DrivePathU); Status = ChkdskFunc(&DrivePathU, TRUE, // FixErrors TRUE, // Verbose diff --git a/reactos/base/system/smss/init.c b/reactos/base/system/smss/init.c index 146a4418cf4..1ad50e33989 100644 --- a/reactos/base/system/smss/init.c +++ b/reactos/base/system/smss/init.c @@ -33,7 +33,7 @@ struct { {FALSE, SmUpdateEnvironment, "update environment variables"}, {FALSE, SmLoadKnownDlls, "preload system DLLs"}, {TRUE, SmCreatePagingFiles, "create paging files"}, - {TRUE, SmInitializeRegistry, "initialize the registry"}, +// {TRUE, SmInitializeRegistry, "initialize the registry"}, {TRUE, SmInitializeClientManagement, "initialize client management"}, {TRUE, SmLoadSubsystems, "load subsystems"} }; diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index deffa1f710a..8b8d80c12a7 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -1507,6 +1507,322 @@ NTSTATUS NTAPI SmpCreateDynamicEnvironmentVariables(VOID) { + NTSTATUS Status; + SYSTEM_BASIC_INFORMATION BasicInfo; + SYSTEM_PROCESSOR_INFORMATION ProcessorInfo; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING ValueName, DestinationString; + HANDLE KeyHandle, KeyHandle2; + ULONG ResultLength; + PWCHAR ArchName; + WCHAR ValueBuffer[512], ValueBuffer2[512]; + PKEY_VALUE_PARTIAL_INFORMATION PartialInfo = (PVOID)ValueBuffer; + PKEY_VALUE_PARTIAL_INFORMATION PartialInfo2 = (PVOID)ValueBuffer2; + + /* Get system basic information -- we'll need the CPU count */ + Status = NtQuerySystemInformation(SystemBasicInformation, + &BasicInfo, + sizeof(BasicInfo), + NULL); + if (!NT_SUCCESS(Status)) + { + /* Bail out on failure */ + DPRINT1("SMSS: Unable to query system basic information - %x\n", Status); + return Status; + } + + /* Get the processor information, we'll query a bunch of revision info */ + Status = NtQuerySystemInformation(SystemProcessorInformation, + &ProcessorInfo, + sizeof(ProcessorInfo), + NULL); + if (!NT_SUCCESS(Status)) + { + /* Bail out on failure */ + DPRINT1("SMSS: Unable to query system processor information - %x\n", Status); + return Status; + } + + /* We'll be writing all these environment variables over here */ + RtlInitUnicodeString(&DestinationString, + L"\\Registry\\Machine\\System\\CurrentControlSet\\" + "Control\\Session Manager\\Environment"); + InitializeObjectAttributes(&ObjectAttributes, + &DestinationString, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, GENERIC_WRITE, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + /* Bail out on failure */ + DPRINT1("SMSS: Unable to open %wZ - %x\n", &DestinationString, Status); + return Status; + } + + /* First let's write the OS variable */ + RtlInitUnicodeString(&ValueName, L"OS"); + DPRINT1("Setting %wZ to %S\n", &ValueName, L"Windows_NT"); + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + L"Windows_NT", + wcslen(L"Windows_NT") * sizeof(WCHAR) + sizeof(UNICODE_NULL)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Failed writing %wZ environment variable - %x\n", + &ValueName, Status); + NtClose(KeyHandle); + return Status; + } + + /* Next, let's write the CPU architecture variable */ + RtlInitUnicodeString(&ValueName, L"PROCESSOR_ARCHITECTURE"); + switch (ProcessorInfo.ProcessorArchitecture) + { + /* Pick the correct string that matches the architecture */ + case PROCESSOR_ARCHITECTURE_INTEL: + ArchName = L"x86"; + break; + + case PROCESSOR_ARCHITECTURE_AMD64: + ArchName = L"AMD64"; + break; + + case PROCESSOR_ARCHITECTURE_IA64: + ArchName = L"IA64"; + break; + + default: + ArchName = L"Unknown"; + break; + } + + /* Set it */ + DPRINT1("Setting %wZ to %S\n", &ValueName, ArchName); + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + ArchName, + wcslen(ArchName) * sizeof(WCHAR) + sizeof(UNICODE_NULL)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Failed writing %wZ environment variable - %x\n", + &ValueName, Status); + NtClose(KeyHandle); + return Status; + } + + /* And now let's write the processor level */ + RtlInitUnicodeString(&ValueName, L"PROCESSOR_LEVEL"); + swprintf(ValueBuffer, L"%u", ProcessorInfo.ProcessorLevel); + DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + ValueBuffer, + wcslen(ValueBuffer) * sizeof(WCHAR) + sizeof(UNICODE_NULL)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Failed writing %wZ environment variable - %x\n", + &ValueName, Status); + NtClose(KeyHandle); + return Status; + } + + /* Now open the hardware CPU key */ + RtlInitUnicodeString(&DestinationString, + L"\\Registry\\Machine\\Hardware\\Description\\System\\" + "CentralProcessor\\0"); + InitializeObjectAttributes(&ObjectAttributes, + &DestinationString, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle2, KEY_READ, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Unable to open %wZ - %x\n", &DestinationString, Status); + NtClose(KeyHandle); + return Status; + } + + /* So that we can read the identifier out of it... */ + RtlInitUnicodeString(&ValueName, L"Identifier"); + Status = NtQueryValueKey(KeyHandle2, + &ValueName, + KeyValuePartialInformation, + PartialInfo, + sizeof(ValueBuffer), + &ResultLength); + if (!NT_SUCCESS(Status)) + { + NtClose(KeyHandle2); + NtClose(KeyHandle); + DPRINT1("SMSS: Unable to read %wZ\\%wZ - %x\n", + &DestinationString, &ValueName, Status); + return Status; + } + + /* As well as the vendor... */ + RtlInitUnicodeString(&ValueName, L"VendorIdentifier"); + Status = NtQueryValueKey(KeyHandle2, + &ValueName, + KeyValuePartialInformation, + PartialInfo2, + sizeof(ValueBuffer2), + &ResultLength); + NtClose(KeyHandle2); + if (NT_SUCCESS(Status)) + { + /* To combine it into a single string */ + swprintf((PWCHAR)PartialInfo->Data + wcslen((PWCHAR)PartialInfo->Data), + L", %ws", + PartialInfo2->Data); + } + + /* So that we can set this as the PROCESSOR_IDENTIFIER variable */ + RtlInitUnicodeString(&ValueName, L"PROCESSOR_IDENTIFIER"); + DPRINT1("Setting %wZ to %S\n", &ValueName, PartialInfo->Data); + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + PartialInfo->Data, + wcslen((PWCHAR)PartialInfo->Data) * sizeof(WCHAR) + sizeof(UNICODE_NULL)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Failed writing %wZ environment variable - %x\n", + &ValueName, Status); + NtClose(KeyHandle); + return Status; + } + + /* Now let's get the processor architecture */ + RtlInitUnicodeString(&ValueName, L"PROCESSOR_REVISION"); + switch (ProcessorInfo.ProcessorArchitecture) + { + /* Check if this is an older Intel CPU */ + case PROCESSOR_ARCHITECTURE_INTEL: + if ((ProcessorInfo.ProcessorRevision >> 8) == 0xFF) + { + /* These guys used a revision + stepping, so get the rev only */ + swprintf(ValueBuffer, L"%02x", ProcessorInfo.ProcessorRevision & 0xFF); + _wcsupr(ValueBuffer); + break; + } + + /* Modern Intel, as well as 64-bit CPUs use a revision without stepping */ + case PROCESSOR_ARCHITECTURE_IA64: + case PROCESSOR_ARCHITECTURE_AMD64: + swprintf(ValueBuffer, L"%04x", ProcessorInfo.ProcessorRevision); + break; + + /* And anything else we'll just read the whole revision identifier */ + default: + swprintf(ValueBuffer, L"%u", ProcessorInfo.ProcessorRevision); + break; + } + + /* Write the revision to the registry */ + DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + ValueBuffer, + wcslen(ValueBuffer) * sizeof(WCHAR) + sizeof(UNICODE_NULL)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Failed writing %wZ environment variable - %x\n", + &ValueName, Status); + NtClose(KeyHandle); + return Status; + } + + /* And finally, write the number of CPUs */ + RtlInitUnicodeString(&ValueName, L"NUMBER_OF_PROCESSORS"); + swprintf(ValueBuffer, L"%u", BasicInfo.NumberOfProcessors); + DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + ValueBuffer, + wcslen(ValueBuffer) * sizeof(WCHAR) + sizeof(UNICODE_NULL)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Failed writing %wZ environment variable - %x\n", + &ValueName, Status); + NtClose(KeyHandle); + return Status; + } + + /* Now we need to write the safeboot option key in a different format */ + RtlInitUnicodeString(&DestinationString, + L"\\Registry\\Machine\\System\\CurrentControlSet\\" + "Control\\Safeboot\\Option"); + InitializeObjectAttributes(&ObjectAttributes, + &DestinationString, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle2, KEY_ALL_ACCESS, &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* This was indeed a safeboot, so check what kind of safeboot it was */ + RtlInitUnicodeString(&ValueName, L"OptionValue"); + Status = NtQueryValueKey(KeyHandle2, + &ValueName, + KeyValuePartialInformation, + PartialInfo, + sizeof(ValueBuffer), + &ResultLength); + NtClose(KeyHandle2); + if (NT_SUCCESS(Status)) + { + /* Convert from the integer value to the correct specifier */ + RtlInitUnicodeString(&ValueName, L"SAFEBOOT_OPTION"); + switch (*(PULONG)PartialInfo->Data) + { + case 1: + wcscpy(ValueBuffer, L"MINIMAL"); + break; + case 2: + wcscpy(ValueBuffer, L"NETWORK"); + break; + case 3: + wcscpy(ValueBuffer, L"DSREPAIR"); + break; + } + + /* And write it in the environment! */ + DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + ValueBuffer, + wcslen(ValueBuffer) * sizeof(WCHAR) + sizeof(UNICODE_NULL)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Failed writing %wZ environment variable - %x\n", + &ValueName, Status); + NtClose(KeyHandle); + return Status; + } + } + else + { + DPRINT1("SMSS: Failed querying safeboot option = %x\n", Status); + } + } + + /* We are all done now */ + NtClose(KeyHandle); return STATUS_SUCCESS; } @@ -1698,7 +2014,7 @@ SmpLoadDataFromRegistry(OUT PUNICODE_STRING InitialCommand) SmpCreatePagingFiles(); /* Tell Cm it's now safe to fully enable write access to the registry */ - // NtInitializeRegistry(FALSE); Later... + NtInitializeRegistry(CM_BOOT_FLAG_SMSS); /* Create all the system-based environment variables for later inheriting */ Status = SmpCreateDynamicEnvironmentVariables(); From 292010dcd6cd2af478fdf5fe7d5f67f050ea7764 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Tue, 31 Jan 2012 02:33:02 +0000 Subject: [PATCH 185/289] [NDK/RTL]: Fix RtlGetSetBootStatusData prototype and add the BSD Items that can be set with it. svn path=/trunk/; revision=55345 --- reactos/include/ndk/rtlfuncs.h | 12 ++++++------ reactos/include/ndk/rtltypes.h | 14 ++++++++++++++ reactos/lib/rtl/bootdata.c | 12 ++++++------ 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 081027cc763..38d2026824e 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -3877,12 +3877,12 @@ NTSYSAPI NTSTATUS NTAPI RtlGetSetBootStatusData( - HANDLE FileHandle, - BOOLEAN WriteMode, - DWORD DataClass, - PVOID Buffer, - ULONG BufferSize, - DWORD DataClass2 + IN HANDLE FileHandle, + IN BOOLEAN WriteMode, + IN RTL_BSD_ITEM_TYPE DataClass, + IN PVOID Buffer, + IN ULONG BufferSize, + OUT PULONG ReturnLength OPTIONAL ); NTSYSAPI diff --git a/reactos/include/ndk/rtltypes.h b/reactos/include/ndk/rtltypes.h index 6c566723991..198af634e52 100644 --- a/reactos/include/ndk/rtltypes.h +++ b/reactos/include/ndk/rtltypes.h @@ -367,6 +367,20 @@ extern BOOLEAN NTSYSAPI NLS_MB_OEM_CODE_PAGE_TAG; #ifdef NTOS_MODE_USER +// +// Boot Status Data Field Types +// +typedef enum _RTL_BSD_ITEM_TYPE +{ + RtlBsdItemVersionNumber, + RtlBsdItemProductType, + RtlBsdItemAabEnabled, + RtlBsdItemAabTimeout, + RtlBsdItemBootGood, + RtlBsdItemBootShutdown, + RtlBsdItemMax +} RTL_BSD_ITEM_TYPE, *PRTL_BSD_ITEM_TYPE; + // // Table and Compare result types // diff --git a/reactos/lib/rtl/bootdata.c b/reactos/lib/rtl/bootdata.c index afbe1af4c5d..3f38da8d490 100644 --- a/reactos/lib/rtl/bootdata.c +++ b/reactos/lib/rtl/bootdata.c @@ -686,12 +686,12 @@ RtlCreateBootStatusDataFile(VOID) */ NTSTATUS NTAPI -RtlGetSetBootStatusData(HANDLE Filehandle, - BOOLEAN WriteMode, - DWORD DataClass, - PVOID Buffer, - ULONG BufferSize, - DWORD DataClass2) +RtlGetSetBootStatusData(IN HANDLE Filehandle, + IN BOOLEAN WriteMode, + IN RTL_BSD_ITEM_TYPE DataClass, + IN PVOID Buffer, + IN ULONG BufferSize, + OUT PULONG ReturnLength) { UNIMPLEMENTED; return STATUS_NOT_IMPLEMENTED; From 5ebd3e62cf8b91ad0bdd883b73b947d35a4e10d5 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Tue, 31 Jan 2012 02:38:42 +0000 Subject: [PATCH 186/289] [SMSS2]: Implement helper functions for reading and writing to the BSD (What lets Windows know if this was a good boot/shutdown or a bad one, and to display the recovery settings or not (FreeLDR should do this...)). Implement the functions needed to launch native applications, and add support for launching autochk and any other bootexecute applications. Set the correct SessionID with the kernel by calling ProcessSessionInformation. Pending File Rename Operations are the last big thing left, plus actual pagefile creation. [SMSS2]: Fix a bug in SmpParseCommandLine. svn path=/trunk/; revision=55346 --- reactos/base/system/smss2/smsessn.c | 22 +++ reactos/base/system/smss2/smss.c | 260 ++++++++++++++++++++++++++- reactos/base/system/smss2/smss.h | 43 ++++- reactos/base/system/smss2/smsubsys.c | 12 ++ reactos/base/system/smss2/smutil.c | 144 ++++++++++++++- 5 files changed, 474 insertions(+), 7 deletions(-) diff --git a/reactos/base/system/smss2/smsessn.c b/reactos/base/system/smss2/smsessn.c index 2b9cd9bad45..4c12563cb2f 100644 --- a/reactos/base/system/smss2/smsessn.c +++ b/reactos/base/system/smss2/smsessn.c @@ -22,3 +22,25 @@ BOOLEAN SmpDbgSsLoaded; HANDLE SmpSessionsObjectDirectory; /* FUNCTIONS ******************************************************************/ + +NTSTATUS +NTAPI +SmpSetProcessMuSessionId(IN HANDLE ProcessHandle, + IN ULONG SessionId) +{ + NTSTATUS Status; + + /* Tell the kernel about our session ID */ + Status = NtSetInformationProcess(ProcessHandle, + ProcessSessionInformation, + &SessionId, + sizeof(SessionId)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: SetProcessMuSessionId, Process=%x, Status=%x\n", + ProcessHandle, Status); + } + + /* Return */ + return Status; +} diff --git a/reactos/base/system/smss2/smss.c b/reactos/base/system/smss2/smss.c index b13a2336f22..e661c123804 100644 --- a/reactos/base/system/smss2/smss.c +++ b/reactos/base/system/smss2/smss.c @@ -28,19 +28,271 @@ ULONG NtInitialUserProcessBufferType = REG_SZ; UNICODE_STRING SmpSystemRoot; ULONG AttachedSessionId = -1; -BOOLEAN SmpDebug; +BOOLEAN SmpDebug, SmpEnableDots; /* FUNCTIONS ******************************************************************/ +/* GCC's incompetence strikes again */ +VOID +sprintf_nt(IN PCHAR Buffer, + IN PCHAR Format, + IN ...) +{ + va_list ap; + va_start(ap, Format); + sprintf(Buffer, Format, ap); + va_end(ap); +} + +NTSTATUS +NTAPI +SmpExecuteImage(IN PUNICODE_STRING FileName, + IN PUNICODE_STRING Directory, + IN PUNICODE_STRING CommandLine, + IN ULONG MuSessionId, + IN ULONG Flags, + IN PRTL_USER_PROCESS_INFORMATION ProcessInformation) +{ + PRTL_USER_PROCESS_INFORMATION ProcessInfo; + NTSTATUS Status; + RTL_USER_PROCESS_INFORMATION LocalProcessInfo; + PRTL_USER_PROCESS_PARAMETERS ProcessParameters; + + /* Use the input process information if we have it, otherwise use local */ + ProcessInfo = ProcessInformation; + if (!ProcessInfo) ProcessInfo = &LocalProcessInfo; + + /* Create parameters for the target process */ + Status = RtlCreateProcessParameters(&ProcessParameters, + FileName, + SmpDefaultLibPath.Length ? + &SmpDefaultLibPath : NULL, + Directory, + CommandLine, + SmpDefaultEnvironment, + NULL, + NULL, + NULL, + 0); + if (!NT_SUCCESS(Status)) + { + /* This is a pretty bad failure. ASSERT on checked builds and exit */ + ASSERTMSG(NT_SUCCESS(Status), "RtlCreateProcessParameters"); + DPRINT1("SMSS: RtlCreateProcessParameters failed for %wZ - Status == %lx\n", + FileName, Status); + return Status; + } + + /* Set the size field as required */ + ProcessInfo->Size = sizeof(RTL_USER_PROCESS_INFORMATION); + + /* Check if the debug flag was requested */ + if (Flags & SMP_DEBUG_FLAG) + { + /* Write it in the process parameters */ + ProcessParameters->DebugFlags = 1; + } + else + { + /* Otherwise inherit the flag that was passed to SMSS itself */ + ProcessParameters->DebugFlags = SmpDebug; + } + + /* Subsystems get the first 1MB of memory reserved for DOS/IVT purposes */ + if (Flags & SMP_SUBSYSTEM_FLAG) + { + ProcessParameters->Flags |= RTL_USER_PROCESS_PARAMETERS_RESERVE_1MB; + } + + /* And always force NX for anything that SMSS launches */ + ProcessParameters->Flags |= RTL_USER_PROCESS_PARAMETERS_NX; + + /* Now create the process */ + Status = RtlCreateUserProcess(FileName, + OBJ_CASE_INSENSITIVE, + ProcessParameters, + NULL, + NULL, + NULL, + FALSE, + NULL, + NULL, + ProcessInfo); + RtlDestroyProcessParameters(ProcessParameters); + if (!NT_SUCCESS(Status)) + { + /* If we couldn't create it, fail back to the caller */ + DPRINT1("SMSS: Failed load of %wZ - Status == %lx\n", + FileName, Status); + return Status; + } + + /* Associate a session with this process */ + Status = SmpSetProcessMuSessionId(ProcessInfo->ProcessHandle, MuSessionId); + + /* If the application is deferred (suspended), there's nothing to do */ + if (Flags & SMP_DEFERRED_FLAG) return Status; + + /* Otherwise, get ready to start it, but make sure it's a native app */ + if (ProcessInfo->ImageInformation.SubSystemType == IMAGE_SUBSYSTEM_NATIVE) + { + /* Resume it */ + NtResumeThread(ProcessInfo->ThreadHandle, NULL); + if (!(Flags & SMP_ASYNC_FLAG)) + { + /* Block on it unless Async was requested */ + NtWaitForSingleObject(ProcessInfo->ThreadHandle, FALSE, NULL); + } + + /* It's up and running now, close our handles */ + NtClose(ProcessInfo->ThreadHandle); + NtClose(ProcessInfo->ProcessHandle); + } + else + { + /* This image is invalid, so kill it, close our handles, and fail */ + Status = STATUS_INVALID_IMAGE_FORMAT; + NtTerminateProcess(ProcessInfo->ProcessHandle, Status); + NtWaitForSingleObject(ProcessInfo->ThreadHandle, 0, 0); + NtClose(ProcessInfo->ThreadHandle); + NtClose(ProcessInfo->ProcessHandle); + DPRINT1("SMSS: Not an NT image - %wZ\n", FileName); + } + + /* Return the outcome of the process create */ + return Status; +} + +NTSTATUS +NTAPI +SmpInvokeAutoChk(IN PUNICODE_STRING FileName, + IN PUNICODE_STRING Directory, + IN PUNICODE_STRING Arguments, + IN ULONG Flags) +{ + ANSI_STRING DestinationString; + CHAR SourceString[256]; + UNICODE_STRING Destination; + WCHAR Buffer[1024]; + BOOLEAN BootState, BootOkay, ShutdownOkay; + + /* Check if autochk should show dots (if the user booted with /SOS) */ + if (SmpQueryRegistrySosOption()) SmpEnableDots = FALSE; + + /* Make sure autochk was actually found */ + if (Flags & SMP_INVALID_PATH) + { + /* It wasn't, so create an error message to print on the screen */ + sprintf_nt(SourceString, + "%wZ program not found - skipping AUTOCHECK\n", + FileName); + RtlInitAnsiString(&DestinationString, SourceString); + if (RtlAnsiStringToUnicodeString(&Destination, + &DestinationString, + TRUE)) + { + /* And show it */ + NtDisplayString(&Destination); + RtlFreeUnicodeString(&Destination); + } + } + else + { + /* Autochk is there, so record the BSD state */ + BootState = SmpSaveAndClearBootStatusData(&BootOkay, &ShutdownOkay); + + /* Build the path to autochk and place its arguments */ + RtlInitEmptyUnicodeString(&Destination, Buffer, sizeof(Buffer)); + RtlAppendUnicodeStringToString(&Destination, FileName); + RtlAppendUnicodeToString(&Destination, L" "); + RtlAppendUnicodeStringToString(&Destination, Arguments); + + /* Execute it */ + SmpExecuteImage(FileName, + Directory, + &Destination, + 0, + Flags & ~SMP_AUTOCHK_FLAG, + NULL); + + /* Restore the BSD state */ + if (BootState) SmpRestoreBootStatusData(BootOkay, ShutdownOkay); + } + + /* We're all done! */ + return STATUS_SUCCESS; +} + NTSTATUS NTAPI SmpExecuteCommand(IN PUNICODE_STRING CommandLine, IN ULONG MuSessionId, - OUT PULONG ProcessId, + OUT PHANDLE ProcessId, IN ULONG Flags) { - DPRINT1("Should run: %wZ for session %d\n", CommandLine, MuSessionId); - return STATUS_SUCCESS; + NTSTATUS Status; + UNICODE_STRING Arguments, Directory, FileName; + + /* There's no longer a debugging subsystem */ + if (Flags & SMP_DEBUG_FLAG) return STATUS_SUCCESS; + + /* Parse the command line to see what execution flags are requested */ + Status = SmpParseCommandLine(CommandLine, + &Flags, + &FileName, + &Directory, + &Arguments); + if (!NT_SUCCESS(Status)) + { + /* Fail if we couldn't do that */ + DPRINT1("SMSS: SmpParseCommand( %wZ ) failed - Status == %lx\n", + CommandLine, Status); + return Status; + } + + /* Check if autochk is requested */ + if (Flags & SMP_AUTOCHK_FLAG) + { + /* Run it */ + Status = SmpInvokeAutoChk(&FileName, &Directory, &Arguments, Flags); + } + else if (Flags & SMP_SUBSYSTEM_FLAG) + { + Status = SmpLoadSubSystem(&FileName, + &Directory, + CommandLine, + MuSessionId, + ProcessId); + } + else if (Flags & SMP_INVALID_PATH) + { + /* An invalid image was specified, fail */ + DPRINT1("SMSS: Image file (%wZ) not found\n", &FileName); + Status = STATUS_OBJECT_NAME_NOT_FOUND; + } + else + { + /* An actual image name was present -- execute it */ + Status = SmpExecuteImage(&FileName, + &Directory, + CommandLine, + MuSessionId, + Flags, + NULL); + } + + /* Free all the token parameters */ + if (FileName.Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, FileName.Buffer); + if (Directory.Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, Directory.Buffer); + if (Arguments.Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, Arguments.Buffer); + + /* Return to the caller */ + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Command '%wZ' failed - Status == %x\n", + CommandLine, Status); + } + return Status; } NTSTATUS diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index f317c5bdfbb..bd250f646bf 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -33,7 +33,9 @@ #define SMP_DEBUG_FLAG 0x01 #define SMP_ASYNC_FLAG 0x02 #define SMP_AUTOCHK_FLAG 0x04 +#define SMP_SUBSYSTEM_FLAG 0x08 #define SMP_INVALID_PATH 0x10 +#define SMP_DEFERRED_FLAG 0x20 /* EXTERNALS ******************************************************************/ @@ -102,7 +104,7 @@ NTAPI SmpExecuteCommand( IN PUNICODE_STRING CommandLine, IN ULONG MuSessionId, - OUT PULONG ProcessId, + OUT PHANDLE ProcessId, IN ULONG Flags ); @@ -141,3 +143,42 @@ SmpParseCommandLine( OUT PUNICODE_STRING Directory, OUT PUNICODE_STRING Arguments ); + +NTSTATUS +NTAPI +SmpLoadSubSystem( + IN PUNICODE_STRING FileName, + IN PUNICODE_STRING Directory, + IN PUNICODE_STRING CommandLine, + IN ULONG MuSessionId, + OUT PHANDLE ProcessId +); + +NTSTATUS +NTAPI +SmpSetProcessMuSessionId( + IN HANDLE ProcessHandle, + IN ULONG SessionId +); + +BOOLEAN +NTAPI +SmpQueryRegistrySosOption( + VOID +); + +BOOLEAN +NTAPI +SmpSaveAndClearBootStatusData( + OUT PBOOLEAN BootOkay, + OUT PBOOLEAN ShutdownOkay +); + +VOID +NTAPI +SmpRestoreBootStatusData( + IN BOOLEAN BootOkay, + IN BOOLEAN ShutdownOkay +); + + diff --git a/reactos/base/system/smss2/smsubsys.c b/reactos/base/system/smss2/smsubsys.c index f45374bab8a..01c637434c5 100644 --- a/reactos/base/system/smss2/smsubsys.c +++ b/reactos/base/system/smss2/smsubsys.c @@ -22,6 +22,18 @@ BOOLEAN RegPosixSingleInstance; /* FUNCTIONS ******************************************************************/ +NTSTATUS +NTAPI +SmpLoadSubSystem(IN PUNICODE_STRING FileName, + IN PUNICODE_STRING Directory, + IN PUNICODE_STRING CommandLine, + IN ULONG MuSessionId, + OUT PHANDLE ProcessId) +{ + DPRINT1("Should start subsystem %wZ for Session: %lx\n", FileName, MuSessionId); + return STATUS_SUCCESS; +} + NTSTATUS NTAPI SmpLoadSubSystemsForMuSession(IN PULONG MuSessionId, diff --git a/reactos/base/system/smss2/smutil.c b/reactos/base/system/smss2/smutil.c index 9a323acd703..af472c21b42 100644 --- a/reactos/base/system/smss2/smutil.c +++ b/reactos/base/system/smss2/smutil.c @@ -14,6 +14,11 @@ /* GLOBALS ********************************************************************/ +// +// Taken from an ASSERT +// +#define VALUE_BUFFER_SIZE (sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 512) + typedef struct _SMP_PRIVILEGE_STATE { HANDLE TokenHandle; @@ -399,8 +404,7 @@ SmpParseCommandLine(IN PUNICODE_STRING CommandLine, else { /* There is a directory, and a filename -- separate those two */ - FilePart -= sizeof(UNICODE_NULL); - *FilePart = UNICODE_NULL; + *--FilePart = UNICODE_NULL; RtlCreateUnicodeString(Directory, PathBuffer); } } @@ -408,3 +412,139 @@ SmpParseCommandLine(IN PUNICODE_STRING CommandLine, /* We are done -- move on to the second pass to get the arguments */ return SmpParseToken(&CmdLineCopy, TRUE, Arguments); } + +BOOLEAN +NTAPI +SmpQueryRegistrySosOption(VOID) +{ + NTSTATUS Status; + UNICODE_STRING KeyName, ValueName; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE KeyHandle; + WCHAR ValueBuffer[VALUE_BUFFER_SIZE]; + PKEY_VALUE_PARTIAL_INFORMATION PartialInfo = (PVOID)ValueBuffer; + ULONG Length; + + /* Open the key */ + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\System\\CurrentControlSet\\Control"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't open control key: 0x%x\n", Status); + return FALSE; + } + + /* Query the value */ + RtlInitUnicodeString(&ValueName, L"SystemStartOptions"); + Status = NtQueryValueKey(KeyHandle, + &ValueName, + KeyValuePartialInformation, + PartialInfo, + sizeof(ValueBuffer), + &Length); + ASSERT(Length < VALUE_BUFFER_SIZE); + NtClose(KeyHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't query value key: 0x%x\n", Status); + return FALSE; + } + + /* Check if it's set to SOS or sos */ + if (!(wcsstr((PWCHAR)PartialInfo->Data, L"SOS")) || + (wcsstr((PWCHAR)PartialInfo->Data, L"sos"))) + { + /* It's not set, return FALSE */ + return FALSE; + } + + /* It's set, return TRUE */ + return TRUE; +} + +BOOLEAN +NTAPI +SmpSaveAndClearBootStatusData(OUT PBOOLEAN BootOkay, + OUT PBOOLEAN ShutdownOkay) +{ + NTSTATUS Status; + BOOLEAN Value = TRUE; + PVOID BootStatusDataHandle; + + /* Assume failure */ + *BootOkay = FALSE; + *ShutdownOkay = FALSE; + + /* Lock the BSD and fail if we couldn't */ + Status = RtlLockBootStatusData(&BootStatusDataHandle); + if (!NT_SUCCESS(Status)) return FALSE; + + /* Read the old settings */ + RtlGetSetBootStatusData(BootStatusDataHandle, + TRUE, + RtlBsdItemBootGood, + BootOkay, + sizeof(BOOLEAN), + NULL); + RtlGetSetBootStatusData(BootStatusDataHandle, + TRUE, + RtlBsdItemBootShutdown, + ShutdownOkay, + sizeof(BOOLEAN), + NULL); + + /* Set new ones indicating we got at least this far */ + RtlGetSetBootStatusData(BootStatusDataHandle, + FALSE, + RtlBsdItemBootGood, + &Value, + sizeof(Value), + NULL); + RtlGetSetBootStatusData(BootStatusDataHandle, + FALSE, + RtlBsdItemBootShutdown, + &Value, + sizeof(Value), + NULL); + + /* Unlock the BSD and return */ + RtlUnlockBootStatusData(BootStatusDataHandle); + return TRUE; +} + +VOID +NTAPI +SmpRestoreBootStatusData(IN BOOLEAN BootOkay, + IN BOOLEAN ShutdownOkay) +{ + NTSTATUS Status; + PVOID BootState; + + /* Lock the BSD */ + Status = RtlLockBootStatusData(&BootState); + if (NT_SUCCESS(Status)) + { + /* Write the bootokay and bootshudown values */ + RtlGetSetBootStatusData(BootState, + FALSE, + RtlBsdItemBootGood, + &BootOkay, + sizeof(BootOkay), + NULL); + RtlGetSetBootStatusData(BootState, + FALSE, + RtlBsdItemBootShutdown, + &ShutdownOkay, + sizeof(ShutdownOkay), + NULL); + + /* Unlock the BSD and return */ + RtlUnlockBootStatusData(BootState); + } +} From 3d8783aa3542d9b04d0b261e0b3966e3b91efe81 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Tue, 31 Jan 2012 09:58:05 +0000 Subject: [PATCH 187/289] [user32_apitest] - Add a couple of tests for SPI_SETMOUSESPEED and SPI_GETMOUSESPEED - inspired by bug 905 svn path=/trunk/; revision=55347 --- .../apitests/user32/SystemParametersInfo.c | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/rostests/apitests/user32/SystemParametersInfo.c b/rostests/apitests/user32/SystemParametersInfo.c index 4e52cf9e2b8..16dec6f780d 100644 --- a/rostests/apitests/user32/SystemParametersInfo.c +++ b/rostests/apitests/user32/SystemParametersInfo.c @@ -134,6 +134,26 @@ static void Test_NonClientMetrics() COMPARE_CACHE(CaptionHeight_chain); } +static void Test_MouseSpeed() +{ + ULONG ulMouseSpeed, temp; + BOOL ret; + + ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &ulMouseSpeed, 0); + ok(ret, "SystemParametersInfo failed\n"); + ok(ulMouseSpeed >= 1 && ulMouseSpeed <=20, "Wrong mouse speed (%d)\n", (int)ulMouseSpeed); + + temp = 1; + ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)temp, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); + ok(ret, "SystemParametersInfo failed\n"); + ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &temp, 0); + ok(ret, "SystemParametersInfo failed\n"); + ok(temp == 1, "SPI_GETMOUSESPEED did not get value set by SPI_SETMOUSESPEED (%d instead of 1)\n", (int)temp); + + ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)ulMouseSpeed, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); + ok(ret, "SystemParametersInfo failed\n"); +} + START_TEST(SystemParametersInfo) { RegisterSimpleClass(SysParamsTestProc, L"sysparamstest"); @@ -144,6 +164,7 @@ START_TEST(SystemParametersInfo) 200, 200, 300, 300, NULL, NULL, 0, NULL); Test_NonClientMetrics(); + Test_MouseSpeed(); DestroyWindow(hWnd1); DestroyWindow(hWnd2); From 29a7102825970cf53183fa45bbd9602f10d8b593 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Tue, 31 Jan 2012 10:49:44 +0000 Subject: [PATCH 188/289] [user32_apitest] - Add some more tests svn path=/trunk/; revision=55349 --- .../apitests/user32/SystemParametersInfo.c | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/rostests/apitests/user32/SystemParametersInfo.c b/rostests/apitests/user32/SystemParametersInfo.c index 16dec6f780d..506ee89742d 100644 --- a/rostests/apitests/user32/SystemParametersInfo.c +++ b/rostests/apitests/user32/SystemParametersInfo.c @@ -150,6 +150,27 @@ static void Test_MouseSpeed() ok(ret, "SystemParametersInfo failed\n"); ok(temp == 1, "SPI_GETMOUSESPEED did not get value set by SPI_SETMOUSESPEED (%d instead of 1)\n", (int)temp); + temp = 20; + ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)temp, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); + ok(ret, "SystemParametersInfo failed\n"); + ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &temp, 0); + ok(ret, "SystemParametersInfo failed\n"); + ok(temp == 20, "SPI_GETMOUSESPEED did not get value set by SPI_SETMOUSESPEED (%d instead of 20)\n", (int)temp); + + temp = 21; + ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)temp, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); + ok(!ret, "expected SystemParametersInfo to fail\n"); + ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &temp, 0); + ok(ret, "SystemParametersInfo failed\n"); + ok(temp == 20, "SPI_GETMOUSESPEED got unexpected value (%d instead of 20)\n", (int)temp); + + temp = 0; + ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)temp, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); + ok(!ret, "expected SystemParametersInfo to fail\n"); + ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &temp, 0); + ok(ret, "SystemParametersInfo failed\n"); + ok(temp == 20, "SPI_GETMOUSESPEED got unexpected value (%d instead of 20)\n", (int)temp); + ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)ulMouseSpeed, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE); ok(ret, "SystemParametersInfo failed\n"); } From 86b5a7c90b58ff76995d6d2f52f51e6f08ee30e6 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Tue, 31 Jan 2012 20:53:40 +0000 Subject: [PATCH 189/289] [README.WINE] * Mark some modules, that are in sync with Wine 1.3.37, as such. svn path=/trunk/; revision=55358 --- reactos/media/doc/README.WINE | 60 ++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 6dd937d1a1a..debf51422cb 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -70,18 +70,18 @@ reactos/dll/win32/iccvid # Autosync reactos/dll/win32/icmp # Synced to Wine-0_9_10 reactos/dll/win32/imaadp32.acm # Synced to Wine-1.3.37 reactos/dll/win32/imagehlp # Autosync -reactos/dll/win32/imm32 # Autosync +reactos/dll/win32/imm32 # Synced to Wine-1.3.37 reactos/dll/win32/inetcomm # Synced to Wine-1.3.37 reactos/dll/win32/inetmib1 # Autosync -reactos/dll/win32/initpki # Autosync +reactos/dll/win32/initpki # Synced to Wine-1.3.37 reactos/dll/win32/inseng # Synced to Wine-1.3.37 reactos/dll/win32/iphlpapi # Out of sync -reactos/dll/win32/itircl # Autosync +reactos/dll/win32/itircl # Synced to Wine-1.3.37 reactos/dll/win32/itss # Synced to Wine-1.3.37 reactos/dll/win32/jscript # Autosync reactos/dll/win32/localspl # Autosync reactos/dll/win32/localui # Autosync -reactos/dll/win32/lz32 # Autosync +reactos/dll/win32/lz32 # Synced to Wine-1.3.37 reactos/dll/win32/mapi32 # Autosync reactos/dll/win32/mciavi32 # Synced to Wine-1.3.37 reactos/dll/win32/mcicda # Synced to Wine-1.3.37 @@ -90,26 +90,27 @@ reactos/dll/win32/mciseq # Synced to Wine-1.3.37 reactos/dll/win32/mciwave # Synced to Wine-1.3.37 reactos/dll/win32/mlang # Synced to Wine-1.3.37 reactos/dll/win32/mpr # Autosync -reactos/dll/win32/mprapi # Autosync +reactos/dll/win32/mprapi # Synced to Wine-1.3.37 reactos/dll/win32/msacm32 # Autosync reactos/dll/win32/msadp32.acm # Synced to Wine-1.3.37 -reactos/dll/win32/mscat32 # Autosync +reactos/dll/win32/mscat32 # Synced to Wine-1.3.37 reactos/dll/win32/mscms # Synced to Wine-1.3.37 reactos/dll/win32/mscoree # Synced to Wine-1.3.37 reactos/dll/win32/msctf # Synced to Wine-1.3.37 reactos/dll/win32/msftedit # Synced to Wine-1.3.37 reactos/dll/win32/msg711.acm # Synced to Wine-1.3.37 -reactos/dll/win32/msgsm32.acm # Autosync +reactos/dll/win32/msgsm32.acm # Synced to Wine-1.3.37 reactos/dll/win32/mshtml # Autosync -reactos/dll/win32/msimg32 # Autosync +reactos/dll/win32/mshtml.tlb # Autosync reactos/dll/win32/msi # Autosync +reactos/dll/win32/msimg32 # Synced to Wine-1.3.37 reactos/dll/win32/msimtf # Synced to Wine-1.3.37 reactos/dll/win32/msisip # Synced to Wine-1.3.37 -reactos/dll/win32/msisys.ocx # Autosync -reactos/dll/win32/msnet32 # Autosync +reactos/dll/win32/msisys.ocx # Synced to Wine-1.3.37 +reactos/dll/win32/msnet32 # Synced to Wine-1.3.37 reactos/dll/win32/msrle32 # Autosync -reactos/dll/win32/mssign32 # Autosync -reactos/dll/win32/mssip32 # Autosync +reactos/dll/win32/mssign32 # Synced to Wine-1.3.37 +reactos/dll/win32/mssip32 # Synced to Wine-1.3.37 reactos/dll/win32/mstask # Synced to Wine-1.3.37 reactos/dll/win32/msvcrt20 # Autosync reactos/dll/win32/msvfw32 # Autosync @@ -125,36 +126,37 @@ reactos/dll/win32/odbccp32 # Synced to Wine-1.3.37 reactos/dll/win32/ole32 # Autosync reactos/dll/win32/oleacc # Autosync reactos/dll/win32/oleaut32 # Autosync -reactos/dll/win32/olecli32 # Autosync +reactos/dll/win32/olecli32 # Synced to Wine-1.3.37 reactos/dll/win32/oledlg # Autosync reactos/dll/win32/olepro32 # Autosync -reactos/dll/win32/olesvr32 # Autosync -reactos/dll/win32/olethk32 # Autosync +reactos/dll/win32/olesvr32 # Synced to Wine-1.3.37 +reactos/dll/win32/olethk32 # Synced to Wine-1.3.37 reactos/dll/win32/pdh # Autosync -reactos/dll/win32/pidgen # Autosync +reactos/dll/win32/pidgen # Synced to Wine-1.3.37 reactos/dll/win32/powrprof # Forked at Wine-1.0rc5 reactos/dll/win32/printui # Synced to Wine-1.3.37 reactos/dll/win32/pstorec # Synced to Wine-1.3.37 reactos/dll/win32/query # Synced to Wine-1.3.37 reactos/dll/win32/rasapi32 # Synced to Wine-1.3.37 -reactos/dll/win32/resutils # Autosync +reactos/dll/win32/resutils # Synced to Wine-1.3.37 reactos/dll/win32/riched20 # Synced to Wine-1.3.37 -reactos/dll/win32/riched32 # Autosync +reactos/dll/win32/riched32 # Synced to Wine-1.3.37 reactos/dll/win32/rpcrt4 # Synced to Wine-1.3.26 reactos/dll/win32/rsabase # Autosync reactos/dll/win32/rsaenh # Autosync -reactos/dll/win32/sccbase # Autosync -reactos/dll/win32/schannel # Autosync +reactos/dll/win32/sccbase # Synced to Wine-1.3.37 +reactos/dll/win32/schannel # Synced to Wine-1.3.37 reactos/dll/win32/secur32 # Forked reactos/dll/win32/security # Forked (different .spec) -reactos/dll/win32/sensapi # Autosync +reactos/dll/win32/sensapi # Synced to Wine-1.3.37 reactos/dll/win32/setupapi # Forked at Wine-20050524 reactos/dll/win32/shell32 # Forked at Wine-20071011 reactos/dll/win32/shdocvw # Autosync reactos/dll/win32/shfolder # Autosync reactos/dll/win32/shlwapi # Autosync -reactos/dll/win32/slbcsp # Autosync -reactos/dll/win32/softpub # Autosync +reactos/dll/win32/slbcsp # Synced to Wine-1.3.37 +reactos/dll/win32/snmpapi # Synced to Wine-1.3.37 +reactos/dll/win32/softpub # Synced to Wine-1.3.37 reactos/dll/win32/spoolss # Autosync reactos/dll/win32/stdole2.tlb # Synced to Wine-1.3.37 reactos/dll/win32/stdole32.tlb # Synced to Wine-1.3.37 @@ -163,7 +165,7 @@ reactos/dll/win32/sxs # Autosync reactos/dll/win32/tapi32 # Autosync reactos/dll/win32/traffic # Autosync reactos/dll/win32/twain_32 # Out of sync -reactos/dll/win32/updspapi # Autosync +reactos/dll/win32/updspapi # Synced to Wine-1.3.37 reactos/dll/win32/url # Autosync reactos/dll/win32/urlmon # Autosync reactos/dll/win32/usp10 # Synced to Wine-1.3.37 @@ -172,20 +174,20 @@ reactos/dll/win32/version # Autosync reactos/dll/win32/wer # Autosync reactos/dll/win32/windowscodecs # Autosync reactos/dll/win32/winemp3.acm # Synced to Wine-1.3.37 -reactos/dll/win32/wininet # Autosync reactos/dll/win32/winhttp # Autosync +reactos/dll/win32/wininet # Autosync reactos/dll/win32/winmm # Forked at Wine-20050628 reactos/dll/win32/winmm/midimap # Forked at Wine-20050628 reactos/dll/win32/winmm/wavemap # Forked at Wine-20050628 reactos/dll/win32/wintrust # Autosync reactos/dll/win32/wldap32 # Autosync -reactos/dll/win32/wmi # Autosync +reactos/dll/win32/wmi # Synced to Wine-1.3.37 reactos/dll/win32/wtsapi32 # Synced to Wine-1.3.37 reactos/dll/win32/wuapi # Autosync -reactos/dll/win32/xinput1_1 # Autosync -reactos/dll/win32/xinput1_2 # Autosync +reactos/dll/win32/xinput1_1 # Synced to Wine-1.3.37 +reactos/dll/win32/xinput1_2 # Synced to Wine-1.3.37 reactos/dll/win32/xinput1_3 # Autosync -reactos/dll/win32/xinput9_1_0 # Autosync +reactos/dll/win32/xinput9_1_0 # Synced to Wine-1.3.37 reactos/dll/win32/xmllite # Autosync reactos/dll/cpl/inetcpl # Synced to Wine-1.3.21 From 75c818eefba4b61c5aa3ebfcf5230ee241fd72f9 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Wed, 1 Feb 2012 03:09:57 +0000 Subject: [PATCH 190/289] [User32] - Attempt to fix the font leak when switching applications. Tested with other applications other than Acrobat Reader since it crashes when installing. See bug 5314. svn path=/trunk/; revision=55362 --- reactos/dll/win32/user32/controls/appswitch.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/user32/controls/appswitch.c b/reactos/dll/win32/user32/controls/appswitch.c index f39c90f6d0b..6ff356c1f77 100644 --- a/reactos/dll/win32/user32/controls/appswitch.c +++ b/reactos/dll/win32/user32/controls/appswitch.c @@ -192,6 +192,7 @@ void OnPaint(HWND hWnd) int i; HBRUSH hBrush; HPEN hPen; + HFONT dcFont; COLORREF cr; int nch = GetWindowTextW(windowList[selectedWindow], windowText, 1023); @@ -230,7 +231,7 @@ void OnPaint(HWND hWnd) DrawIcon(dialogDC, xpos, ypos, hIcon); } - SelectObject(dialogDC, dialogFont); + dcFont = SelectObject(dialogDC, dialogFont); SetTextColor(dialogDC, GetSysColor(COLOR_BTNTEXT)); SetBkColor(dialogDC, GetSysColor(COLOR_BTNFACE)); @@ -239,6 +240,7 @@ void OnPaint(HWND hWnd) textRC.right = totalW - 8; textRC.bottom = totalH - 8; DrawTextW(dialogDC, windowText, nch, &textRC, DT_CENTER|DT_END_ELLIPSIS); + SelectObject(dialogDC, dcFont); } EndPaint(hWnd, &paint); } From 46ba8b17cc47d940f21cf4adb007887749309572 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 2 Feb 2012 20:45:49 +0000 Subject: [PATCH 191/289] [NTOSKRNL] * Fix MSVC build. svn path=/trunk/; revision=55383 --- reactos/ntoskrnl/mm/anonmem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/anonmem.c b/reactos/ntoskrnl/mm/anonmem.c index 3b10e4c134c..ce736078983 100644 --- a/reactos/ntoskrnl/mm/anonmem.c +++ b/reactos/ntoskrnl/mm/anonmem.c @@ -556,6 +556,7 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, KAPC_STATE ApcState; ULONG ProtectionMask; BOOLEAN Attached = FALSE; + ULONG_PTR EndingAddress; BoundaryAddressMultiple.QuadPart = 0; PAGED_CODE(); @@ -876,7 +877,6 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle, MemoryAreaLength = (ULONG_PTR)MemoryArea->EndingAddress - (ULONG_PTR)MemoryArea->StartingAddress; - ULONG_PTR EndingAddress; EndingAddress = ((ULONG_PTR)MemoryArea->StartingAddress + RegionSize - 1) | (PAGE_SIZE - 1); RegionSize = (ULONG_PTR)EndingAddress - (ULONG_PTR)MemoryArea->StartingAddress + 1; From 4895b9388ee1a8a0a13104ede02b16e7e27bb7a2 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 2 Feb 2012 20:50:22 +0000 Subject: [PATCH 192/289] [SMSS2] Fix MSVC build svn path=/trunk/; revision=55384 --- reactos/base/system/smss2/sminit.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index 8b8d80c12a7..77da15a2c3b 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -447,8 +447,8 @@ SmpInitializeKnownDllPath(IN PUNICODE_STRING DllPath, if (DllPath->Buffer) { /* Fill out the rest of the string */ - DllPath->MaximumLength = Length; - DllPath->Length = Length - sizeof(UNICODE_NULL); + DllPath->MaximumLength = (USHORT)Length; + DllPath->Length = (USHORT)Length - sizeof(UNICODE_NULL); /* Copy the actual path and return success */ RtlCopyMemory(DllPath->Buffer, Buffer, Length); @@ -1261,7 +1261,7 @@ SmpInitializeKnownDllsInternal(IN PUNICODE_STRING Directory, ULONG_PTR ErrorParameters[3]; UNICODE_STRING ErrorResponse; IO_STATUS_BLOCK IoStatusBlock; - ULONG OldFlag = 0; + SECURITY_DESCRIPTOR_CONTROL OldFlag = 0; USHORT ImageCharacteristics; /* Initialize to NULL */ @@ -1546,7 +1546,7 @@ SmpCreateDynamicEnvironmentVariables(VOID) /* We'll be writing all these environment variables over here */ RtlInitUnicodeString(&DestinationString, L"\\Registry\\Machine\\System\\CurrentControlSet\\" - "Control\\Session Manager\\Environment"); + L"Control\\Session Manager\\Environment"); InitializeObjectAttributes(&ObjectAttributes, &DestinationString, OBJ_CASE_INSENSITIVE, @@ -1636,7 +1636,7 @@ SmpCreateDynamicEnvironmentVariables(VOID) /* Now open the hardware CPU key */ RtlInitUnicodeString(&DestinationString, L"\\Registry\\Machine\\Hardware\\Description\\System\\" - "CentralProcessor\\0"); + L"CentralProcessor\\0"); InitializeObjectAttributes(&ObjectAttributes, &DestinationString, OBJ_CASE_INSENSITIVE, @@ -1764,7 +1764,7 @@ SmpCreateDynamicEnvironmentVariables(VOID) /* Now we need to write the safeboot option key in a different format */ RtlInitUnicodeString(&DestinationString, L"\\Registry\\Machine\\System\\CurrentControlSet\\" - "Control\\Safeboot\\Option"); + L"Control\\Safeboot\\Option"); InitializeObjectAttributes(&ObjectAttributes, &DestinationString, OBJ_CASE_INSENSITIVE, @@ -1879,7 +1879,7 @@ SmpLoadDataFromRegistry(OUT PUNICODE_STRING InitialCommand) /* Check if we were booted in PE mode (LiveCD should have this) */ RtlInitUnicodeString(&DestinationString, L"\\Registry\\Machine\\System\\CurrentControlSet\\" - "Control\\MiniNT"); + L"Control\\MiniNT"); InitializeObjectAttributes(&ObjectAttributes, &DestinationString, OBJ_CASE_INSENSITIVE, @@ -1899,7 +1899,7 @@ SmpLoadDataFromRegistry(OUT PUNICODE_STRING InitialCommand) /* Open the environment key to see if we are booted in safe mode */ RtlInitUnicodeString(&DestinationString, L"\\Registry\\Machine\\System\\CurrentControlSet\\" - "Control\\Session Manager\\Environment"); + L"Control\\Session Manager\\Environment"); InitializeObjectAttributes(&ObjectAttributes, &DestinationString, OBJ_CASE_INSENSITIVE, From 173b42e7cb4085137f45a7d72cb4c4863ef3d313 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 3 Feb 2012 11:21:15 +0000 Subject: [PATCH 193/289] [SMSS2] - Properly handle an empty list in SmpSaveRegistryValue - Compare the value string for equality, as the comment says, not inequality - This fixes a crash, although another solution may perhaps be better svn path=/trunk/; revision=55391 --- reactos/base/system/smss2/sminit.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index 77da15a2c3b..625de6a58be 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -72,7 +72,10 @@ SmpSaveRegistryValue(IN PLIST_ENTRY ListAddress, RtlInitUnicodeString(&NameString, Name); RtlInitUnicodeString(&ValueString, Value); - /* Check if we should do a duplicat echeck */ + /* In case this is the first value, initialize a new list/structure */ + RegEntry = NULL; + + /* Check if we should do a duplicate check */ if (Flags) { /* Loop the current list */ @@ -86,9 +89,7 @@ SmpSaveRegistryValue(IN PLIST_ENTRY ListAddress, if (!RtlCompareUnicodeString(&RegEntry->Name, &NameString, TRUE)) { /* Check if the value is the exact same thing */ - if (((Value) && - (RtlCompareUnicodeString(&RegEntry->Value, &ValueString, TRUE))) || - (!(Value) && !(RegEntry->Value.Buffer))) + if (!RtlCompareUnicodeString(&RegEntry->Value, &ValueString, TRUE)) { /* Fail -- the same setting is being set twice */ return STATUS_OBJECT_NAME_EXISTS; @@ -103,11 +104,6 @@ SmpSaveRegistryValue(IN PLIST_ENTRY ListAddress, RegEntry = NULL; } } - else - { - /* This should be the first value, so initialize a new list/structure */ - RegEntry = NULL; - } /* Are we adding on, or creating a new entry */ if (!RegEntry) @@ -140,6 +136,7 @@ SmpSaveRegistryValue(IN PLIST_ENTRY ListAddress, if (RegEntry->Value.Buffer) { /* Free it */ + ASSERT(RegEntry->Value.Length != 0); RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->Value.Buffer); } From 36a816a58410778104ecfb3f41421fe296e9321a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 3 Feb 2012 20:59:35 +0000 Subject: [PATCH 194/289] [NTOSKRNL] - Rewrite MmFindGapBottomUp and MmFindGapTopDown, the old versions were broken and were first checking the address range after the first memory area and only used the area below (above) the first memory are when nothing free was found. - Fix an ASSERT, that gets triggered now that the memory areas are created at the "right" locations - Create a memory are for the boot loaded images, which previously could be overwritten happily by new memory areas, which was only prevented by the brokenness of the code - Fix a few memory regions so that they are correct for amd64 builds as well svn path=/trunk/; revision=55397 --- reactos/ntoskrnl/ex/init.c | 2 +- reactos/ntoskrnl/include/internal/i386/mm.h | 1 + reactos/ntoskrnl/mm/marea.c | 237 +++++++++----------- reactos/ntoskrnl/mm/mminit.c | 35 ++- 4 files changed, 135 insertions(+), 140 deletions(-) diff --git a/reactos/ntoskrnl/ex/init.c b/reactos/ntoskrnl/ex/init.c index 5b16e200fdb..f8f2a7400bb 100644 --- a/reactos/ntoskrnl/ex/init.c +++ b/reactos/ntoskrnl/ex/init.c @@ -331,7 +331,7 @@ ExpInitNls(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } /* Copy the codepage data in its new location. */ - ASSERT(SectionBase > MmSystemRangeStart); + ASSERT(SectionBase >= MmSystemRangeStart); RtlCopyMemory(SectionBase, ExpNlsTableBase, ExpNlsTableSize); /* Free the previously allocated buffer and set the new location */ diff --git a/reactos/ntoskrnl/include/internal/i386/mm.h b/reactos/ntoskrnl/include/internal/i386/mm.h index 4d659d658be..72bbcec2552 100644 --- a/reactos/ntoskrnl/include/internal/i386/mm.h +++ b/reactos/ntoskrnl/include/internal/i386/mm.h @@ -30,6 +30,7 @@ PULONG MmGetPageDirectory(VOID); #define PDE_TOP 0xC0300FFF #define PTE_TOP 0xC03FFFFF #define HYPER_SPACE 0xC0400000 +#define HYPER_SPACE_END 0xC07FFFFF #define PTE_PER_PAGE 0x400 diff --git a/reactos/ntoskrnl/mm/marea.c b/reactos/ntoskrnl/mm/marea.c index 11d7649900a..fab2ce5b037 100644 --- a/reactos/ntoskrnl/mm/marea.c +++ b/reactos/ntoskrnl/mm/marea.c @@ -456,78 +456,68 @@ MmFindGapBottomUp( ULONG_PTR Length, ULONG_PTR Granularity) { - PVOID LowestAddress = MmGetAddressSpaceOwner(AddressSpace) ? MM_LOWEST_USER_ADDRESS : MmSystemRangeStart; - PVOID HighestAddress = MmGetAddressSpaceOwner(AddressSpace) ? - MmHighestUserAddress : (PVOID)MAXULONG_PTR; - PVOID AlignedAddress; - PMEMORY_AREA Node; - PMEMORY_AREA FirstNode; - PMEMORY_AREA PreviousNode; + ULONG_PTR LowestAddress, HighestAddress, Candidate; + PMEMORY_AREA Root, Node; - DPRINT("LowestAddress: %p HighestAddress: %p\n", - LowestAddress, HighestAddress); + /* Get the margins of the address space */ + if (MmGetAddressSpaceOwner(AddressSpace) != NULL) + { + LowestAddress = MM_LOWEST_USER_ADDRESS; + HighestAddress = (ULONG_PTR)MmHighestUserAddress; + } + else + { + LowestAddress = (ULONG_PTR)MmSystemRangeStart; + HighestAddress = MAXULONG_PTR; + } - AlignedAddress = MM_ROUND_UP(LowestAddress, Granularity); + /* Start with the lowest address */ + Candidate = LowestAddress; - /* Special case for empty tree. */ - if (AddressSpace->WorkingSetExpansionLinks.Flink == NULL) - { - if ((ULONG_PTR)HighestAddress - (ULONG_PTR)AlignedAddress >= Length) - { - DPRINT("MmFindGapBottomUp: %p\n", AlignedAddress); - return AlignedAddress; - } - DPRINT("MmFindGapBottomUp: 0\n"); - return 0; - } + /* Check for overflow */ + if ((Candidate + Length) < Candidate) return NULL; - /* Go to the node with lowest address in the tree. */ - FirstNode = Node = MmIterateFirstNode((PMEMORY_AREA)AddressSpace->WorkingSetExpansionLinks.Flink); + /* Get the root of the address space tree */ + Root = (PMEMORY_AREA)AddressSpace->WorkingSetExpansionLinks.Flink; - /* Traverse the tree from left to right. */ - PreviousNode = Node; - for (;;) - { - Node = MmIterateNextNode(Node); - if (Node == NULL) - break; + /* Go to the node with lowest address in the tree. */ + Node = Root ? MmIterateFirstNode(Root) : NULL; + while (Node && ((ULONG_PTR)Node->EndingAddress < LowestAddress)) + { + Node = MmIterateNextNode(Node); + } - AlignedAddress = MM_ROUND_UP(PreviousNode->EndingAddress, Granularity); - if (AlignedAddress >= LowestAddress) - { - if (Node->StartingAddress > AlignedAddress && - (ULONG_PTR)Node->StartingAddress - (ULONG_PTR)AlignedAddress >= Length) - { - DPRINT("MmFindGapBottomUp: %p\n", AlignedAddress); - ASSERT(AlignedAddress >= LowestAddress); - return AlignedAddress; - } - } - PreviousNode = Node; - } + /* Traverse the tree from low to high addresses */ + while (Node && ((ULONG_PTR)Node->EndingAddress < HighestAddress)) + { + /* Check if the memory area fits before the current node */ + if ((ULONG_PTR)Node->StartingAddress >= (Candidate + Length)) + { + DPRINT("MmFindGapBottomUp: %p\n", Candidate); + ASSERT(Candidate >= LowestAddress); + return (PVOID)Candidate; + } - /* Check if there is enough space after the last memory area. */ - AlignedAddress = MM_ROUND_UP(PreviousNode->EndingAddress, Granularity); - if ((ULONG_PTR)HighestAddress > (ULONG_PTR)AlignedAddress && - (ULONG_PTR)HighestAddress - (ULONG_PTR)AlignedAddress >= Length) - { - DPRINT("MmFindGapBottomUp: %p\n", AlignedAddress); - ASSERT(AlignedAddress >= LowestAddress); - return AlignedAddress; - } + /* Calculate next possible adress above this node */ + Candidate = ALIGN_UP_BY((ULONG_PTR)Node->EndingAddress, Granularity); - /* Check if there is enough space before the first memory area. */ - AlignedAddress = MM_ROUND_UP(LowestAddress, Granularity); - if (FirstNode->StartingAddress > AlignedAddress && - (ULONG_PTR)FirstNode->StartingAddress - (ULONG_PTR)AlignedAddress >= Length) - { - DPRINT("MmFindGapBottomUp: %p\n", AlignedAddress); - ASSERT(AlignedAddress >= LowestAddress); - return AlignedAddress; - } + /* Check for overflow */ + if ((Candidate + Length) < (ULONG_PTR)Node->EndingAddress) return NULL; - DPRINT("MmFindGapBottomUp: 0\n"); - return 0; + /* Go to the next higher node */ + Node = MmIterateNextNode(Node); + } + + /* Check if there is enough space after the last memory area. */ + if ((Candidate + Length) <= HighestAddress) + { + DPRINT("MmFindGapBottomUp: %p\n", Candidate); + ASSERT(Candidate >= LowestAddress); + return (PVOID)Candidate; + } + + DPRINT("MmFindGapBottomUp: 0\n"); + return NULL; } @@ -537,81 +527,68 @@ MmFindGapTopDown( ULONG_PTR Length, ULONG_PTR Granularity) { - PVOID LowestAddress = MmGetAddressSpaceOwner(AddressSpace) ? MM_LOWEST_USER_ADDRESS : MmSystemRangeStart; - PVOID HighestAddress = MmGetAddressSpaceOwner(AddressSpace) ? - (PVOID)((ULONG_PTR)MmSystemRangeStart - 1) : (PVOID)MAXULONG_PTR; - PVOID AlignedAddress; - PMEMORY_AREA Node; - PMEMORY_AREA PreviousNode; + ULONG_PTR LowestAddress, HighestAddress, Candidate; + PMEMORY_AREA Root, Node; - DPRINT("LowestAddress: %p HighestAddress: %p\n", - LowestAddress, HighestAddress); + /* Get the margins of the address space */ + if (MmGetAddressSpaceOwner(AddressSpace) != NULL) + { + LowestAddress = (ULONG_PTR)MM_LOWEST_USER_ADDRESS; + HighestAddress = (ULONG_PTR)MmHighestUserAddress; + } + else + { + LowestAddress = (ULONG_PTR)MmSystemRangeStart; + HighestAddress = MAXULONG_PTR; + } - AlignedAddress = MM_ROUND_DOWN((ULONG_PTR)HighestAddress - Length + 1, Granularity); + /* Calculate the highest candidate */ + Candidate = ALIGN_DOWN_BY(HighestAddress + 1 - Length, Granularity); - /* Check for overflow. */ - if (AlignedAddress > HighestAddress) - return NULL; + /* Check for overflow. */ + if (Candidate > HighestAddress) return NULL; - /* Special case for empty tree. */ - if (AddressSpace->WorkingSetExpansionLinks.Flink == NULL) - { - if (AlignedAddress >= LowestAddress) - { - DPRINT("MmFindGapTopDown: %p\n", AlignedAddress); - return AlignedAddress; - } - DPRINT("MmFindGapTopDown: 0\n"); - return 0; - } + /* Get the root of the address space tree */ + Root = (PMEMORY_AREA)AddressSpace->WorkingSetExpansionLinks.Flink; - /* Go to the node with highest address in the tree. */ - Node = MmIterateLastNode((PMEMORY_AREA)AddressSpace->WorkingSetExpansionLinks.Flink); + /* Go to the node with highest address in the tree. */ + Node = Root ? MmIterateLastNode(Root) : NULL; + while (Node && ((ULONG_PTR)Node->StartingAddress > HighestAddress)) + { + Node = MmIteratePrevNode(Node); + } - /* Check if there is enough space after the last memory area. */ - if (Node->EndingAddress <= AlignedAddress) - { - DPRINT("MmFindGapTopDown: %p\n", AlignedAddress); - return AlignedAddress; - } + /* Traverse the tree from high to low addresses */ + while (Node && ((ULONG_PTR)Node->StartingAddress > LowestAddress)) + { + /* Check if the memory area fits after the current node */ + if ((ULONG_PTR)Node->EndingAddress <= Candidate) + { + DPRINT("MmFindGapTopDown: %p\n", Candidate); + return (PVOID)Candidate; + } - /* Traverse the tree from left to right. */ - PreviousNode = Node; - for (;;) - { - Node = MmIteratePrevNode(Node); - if (Node == NULL) - break; + /* Calculate next possible adress below this node */ + Candidate = ALIGN_DOWN_BY((ULONG_PTR)Node->StartingAddress - Length, + Granularity); - AlignedAddress = MM_ROUND_DOWN((ULONG_PTR)PreviousNode->StartingAddress - Length + 1, Granularity); + /* Check for overflow. */ + if (Candidate > (ULONG_PTR)Node->StartingAddress) + return NULL; - /* Check for overflow. */ - if (AlignedAddress > PreviousNode->StartingAddress) - return NULL; + /* Go to the next lower node */ + Node = MmIteratePrevNode(Node); + } - if (Node->EndingAddress <= AlignedAddress) - { - DPRINT("MmFindGapTopDown: %p\n", AlignedAddress); - return AlignedAddress; - } + /* Check if the last candidate is inside the given range */ + if (Candidate >= LowestAddress) + { + DPRINT("MmFindGapTopDown: %p\n", Candidate); + return (PVOID)Candidate; + } - PreviousNode = Node; - } - - AlignedAddress = MM_ROUND_DOWN((ULONG_PTR)PreviousNode->StartingAddress - Length + 1, Granularity); - - /* Check for overflow. */ - if (AlignedAddress > PreviousNode->StartingAddress) - return NULL; - - if (AlignedAddress >= LowestAddress) - { - DPRINT("MmFindGapTopDown: %p\n", AlignedAddress); - return AlignedAddress; - } - - DPRINT("MmFindGapTopDown: 0\n"); - return 0; + DPRINT("MmFindGapTopDown: 0\n"); + return NULL; } @@ -887,7 +864,7 @@ MmCreateMemoryArea(PMMSUPPORT AddressSpace, ULONG_PTR tmpLength; PMEMORY_AREA MemoryArea; - DPRINT("MmCreateMemoryArea(Type %d, BaseAddress %p, " + DPRINT("MmCreateMemoryArea(Type 0x%lx, BaseAddress %p, " "*BaseAddress %p, Length %p, AllocationFlags %x, " "FixedAddress %x, Result %p)\n", Type, BaseAddress, *BaseAddress, Length, AllocationFlags, @@ -922,6 +899,7 @@ MmCreateMemoryArea(PMMSUPPORT AddressSpace, if (MmGetAddressSpaceOwner(AddressSpace) && (ULONG_PTR)(*BaseAddress) + tmpLength > (ULONG_PTR)MmSystemRangeStart) { + DPRINT("Memory area for user mode address space exceeds MmSystemRangeStart\n"); return STATUS_ACCESS_VIOLATION; } @@ -1026,8 +1004,9 @@ MmDeleteProcessAddressSpace(PEPROCESS Process) DPRINT("MmDeleteProcessAddressSpace(Process %x (%s))\n", Process, Process->ImageFileName); +#ifndef _M_AMD64 RemoveEntryList(&Process->MmProcessLinks); - +#endif MmLockAddressSpace(&Process->Vm); while ((MemoryArea = (PMEMORY_AREA)Process->Vm.WorkingSetExpansionLinks.Flink) != NULL) diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 6f386d25570..c2b09fd8285 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -1,4 +1,4 @@ -/* +/* * PROJECT: ReactOS Kernel * LICENSE: GPL - See COPYING in the top level directory * FILE: ntoskrnl/mm/mminit.c @@ -44,6 +44,21 @@ MiInitSystemMemoryAreas() NTSTATUS Status; BoundaryAddressMultiple.QuadPart = 0; + // + // Create the memory area to define the loader mappings + // + BaseAddress = (PVOID)KSEG0_BASE; + Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), + MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, + &BaseAddress, + MmBootImageSize, + PAGE_EXECUTE_READWRITE, + &MArea, + TRUE, + 0, + BoundaryAddressMultiple); + ASSERT(Status == STATUS_SUCCESS); + // // Create the memory area to define the PTE base // @@ -51,7 +66,7 @@ MiInitSystemMemoryAreas() Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, - 4 * 1024 * 1024, + PTE_TOP - PTE_BASE + 1, PAGE_READWRITE, &MArea, TRUE, @@ -66,7 +81,7 @@ MiInitSystemMemoryAreas() Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, - 4 * 1024 * 1024, + HYPER_SPACE_END - HYPER_SPACE + 1, PAGE_READWRITE, &MArea, TRUE, @@ -165,7 +180,7 @@ MiInitSystemMemoryAreas() 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); - +#ifndef _M_AMD64 // // Next, the KPCR // @@ -180,7 +195,7 @@ MiInitSystemMemoryAreas() 0, BoundaryAddressMultiple); ASSERT(Status == STATUS_SUCCESS); - +#endif // // Now the KUSER_SHARED_DATA // @@ -238,8 +253,8 @@ MiDbgDumpAddressSpace(VOID) // Print the memory layout // DPRINT1(" 0x%p - 0x%p\t%s\n", - MmSystemRangeStart, - (ULONG_PTR)MmSystemRangeStart + MmBootImageSize, + KSEG0_BASE, + (ULONG_PTR)KSEG0_BASE + MmBootImageSize, "Boot Loaded Image"); DPRINT1(" 0x%p - 0x%p\t%s\n", MmPfnDatabase, @@ -258,13 +273,13 @@ MiDbgDumpAddressSpace(VOID) MiSessionSpaceEnd, "Session Space"); DPRINT1(" 0x%p - 0x%p\t%s\n", - PTE_BASE, PDE_BASE, + PTE_BASE, PTE_TOP, "Page Tables"); DPRINT1(" 0x%p - 0x%p\t%s\n", - PDE_BASE, HYPER_SPACE, + PDE_BASE, PDE_TOP, "Page Directories"); DPRINT1(" 0x%p - 0x%p\t%s\n", - HYPER_SPACE, HYPER_SPACE + (4 * 1024 * 1024), + HYPER_SPACE, HYPER_SPACE_END, "Hyperspace"); DPRINT1(" 0x%p - 0x%p\t%s\n", MmPagedPoolStart, From b7f8e21b520006b39e8e1363ad0a9ae30b585ac8 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 3 Feb 2012 21:12:18 +0000 Subject: [PATCH 195/289] Fix gcc build svn path=/trunk/; revision=55398 --- reactos/ntoskrnl/mm/marea.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/marea.c b/reactos/ntoskrnl/mm/marea.c index fab2ce5b037..6e214395660 100644 --- a/reactos/ntoskrnl/mm/marea.c +++ b/reactos/ntoskrnl/mm/marea.c @@ -462,7 +462,7 @@ MmFindGapBottomUp( /* Get the margins of the address space */ if (MmGetAddressSpaceOwner(AddressSpace) != NULL) { - LowestAddress = MM_LOWEST_USER_ADDRESS; + LowestAddress = (ULONG_PTR)MM_LOWEST_USER_ADDRESS; HighestAddress = (ULONG_PTR)MmHighestUserAddress; } else From b1e15cc96d99f513688fe04f344d26b167780288 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Fri, 3 Feb 2012 23:11:28 +0000 Subject: [PATCH 196/289] [SMSS2]: Implement the rest of the code to create page files. All that's missing is the actual call to NtCreatePagingFile. svn path=/trunk/; revision=55400 --- reactos/base/system/smss2/crashdmp.c | 9 + reactos/base/system/smss2/pagefile.c | 399 ++++++++++++++++++++++++++- reactos/base/system/smss2/smss.h | 6 + 3 files changed, 407 insertions(+), 7 deletions(-) diff --git a/reactos/base/system/smss2/crashdmp.c b/reactos/base/system/smss2/crashdmp.c index 8678afa43b2..a956d8b338e 100644 --- a/reactos/base/system/smss2/crashdmp.c +++ b/reactos/base/system/smss2/crashdmp.c @@ -15,3 +15,12 @@ /* GLOBALS ********************************************************************/ /* FUNCTIONS ******************************************************************/ + +BOOLEAN +NTAPI +SmpCheckForCrashDump(IN PUNICODE_STRING FileName) +{ + return FALSE; +} + + \ No newline at end of file diff --git a/reactos/base/system/smss2/pagefile.c b/reactos/base/system/smss2/pagefile.c index 0e3c9cf92e5..f257963641a 100644 --- a/reactos/base/system/smss2/pagefile.c +++ b/reactos/base/system/smss2/pagefile.c @@ -46,11 +46,13 @@ typedef struct _SMP_PAGEFILE_DESCRIPTOR // Structure and flags describing each volume // #define SMP_VOLUME_INSERTED 0x01 +#define SMP_VOLUME_PAGEFILE_CREATED 0x04 #define SMP_VOLUME_IS_BOOT 0x08 typedef struct _SMP_VOLUME_DESCRIPTOR { LIST_ENTRY Entry; - ULONG Flags; + USHORT Flags; + USHORT PageFileCount; WCHAR DriveLetter; LARGE_INTEGER FreeSpace; FILE_FS_DEVICE_INFORMATION DeviceInfo; @@ -228,15 +230,371 @@ SmpCreatePagingFileDescriptor(IN PUNICODE_STRING PageFileToken) return STATUS_INVALID_PARAMETER; } +NTSTATUS +NTAPI +SmpGetPagingFileSize(IN PUNICODE_STRING FileName, + OUT PLARGE_INTEGER Size) +{ + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE FileHandle; + FILE_STANDARD_INFORMATION StandardInfo; + + DPRINT1("SMSS:PFILE: Trying to get size for `%wZ'\n", FileName); + Size->QuadPart = 0; + + InitializeObjectAttributes(&ObjectAttributes, + FileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenFile(&FileHandle, + FILE_READ_ATTRIBUTES | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) return Status; + + Status = NtQueryInformationFile(FileHandle, + &IoStatusBlock, + &StandardInfo, + sizeof(StandardInfo), + FileStandardInformation); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS:PFILE: Failed query for size potential pagefile `%wZ' with status %X \n", + FileName, Status); + NtClose(FileHandle); + return Status; + } + + NtClose(FileHandle); + Size->LowPart = StandardInfo.AllocationSize.LowPart; + Size->HighPart = StandardInfo.AllocationSize.HighPart; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpDeletePagingFile(IN PUNICODE_STRING FileName) +{ + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE FileHandle; + FILE_DISPOSITION_INFORMATION Disposition; + + /* Open the page file */ + InitializeObjectAttributes(&ObjectAttributes, + FileName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenFile(&FileHandle, + DELETE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_NON_DIRECTORY_FILE); + if (NT_SUCCESS(Status)) + { + /* Delete it */ + Disposition.DeleteFile = TRUE; + Status = NtSetInformationFile(FileHandle, + &IoStatusBlock, + &Disposition, + sizeof(Disposition), + FileDispositionInformation); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS:PFILE: Failed to delete page file `%wZ' (status %X)\n", + FileName, Status); + } + else + { + DPRINT1("SMSS:PFILE: Deleted stale paging file - %wZ\n", FileName); + } + + /* Close the handle */ + NtClose(FileHandle); + } + else + { + DPRINT1("SMSS:PFILE: Failed to open for deletion page file `%wZ' (status %X)\n", + FileName, Status); + } + + /* All done */ + return Status; +} + +NTSTATUS +NTAPI +SmpGetVolumeFreeSpace(IN PSMP_VOLUME_DESCRIPTOR Volume) +{ + NTSTATUS Status; + LARGE_INTEGER FreeSpace, FinalFreeSpace; + FILE_FS_SIZE_INFORMATION SizeInfo; + IO_STATUS_BLOCK IoStatusBlock; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING VolumeName; + HANDLE VolumeHandle; + WCHAR PathString[32]; + ASSERT(Volume->Flags & SMP_VOLUME_IS_BOOT); // ASSERT says "BootVolume == 1" + + /* Build the standard path */ + wcscpy(PathString, L"\\??\\A:\\"); + VolumeName.Buffer = PathString; + VolumeName.Length = wcslen(PathString) * sizeof(WCHAR); + VolumeName.MaximumLength = VolumeName.Length + sizeof(UNICODE_NULL); + VolumeName.Buffer[STANDARD_DRIVE_LETTER_OFFSET] = Volume->DriveLetter; + DPRINT1("SMSS:PFILE: Querying volume `%wZ' for free space \n", &VolumeName); + + /* Open the volume */ + InitializeObjectAttributes(&ObjectAttributes, + &VolumeName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenFile(&VolumeHandle, + FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS:PFILE: Open volume `%wZ' failed with status %X \n", &VolumeName, Status); + return Status; + } + + /* Now get size information on the volume */ + Status = NtQueryVolumeInformationFile(VolumeHandle, + &IoStatusBlock, + &SizeInfo, + sizeof(SizeInfo), + FileFsSizeInformation); + if (!NT_SUCCESS(Status)) + { + /* We failed -- keep going */ + DPRINT1("SMSS:PFILE: Query volume `%wZ' (handle %p) for size failed" + " with status %X \n", + &VolumeName, + VolumeHandle, + Status); + RtlFreeHeap(RtlGetProcessHeap(), 0, Volume); + NtClose(VolumeHandle); + return Status; + } + NtClose(VolumeHandle); + + /* Compute how much free space we have */ + FreeSpace.QuadPart = SizeInfo.AvailableAllocationUnits.QuadPart * + SizeInfo.SectorsPerAllocationUnit; + FinalFreeSpace.QuadPart = FreeSpace.QuadPart * SizeInfo.BytesPerSector; + Volume->FreeSpace = FinalFreeSpace; + + /* Check if there's less than 32MB free so we don't starve the disk */ + if (FinalFreeSpace.QuadPart <= 0x2000000) + { + /* In this case, act as if there's no free space */ + Volume->FreeSpace.QuadPart = 0; + } + else + { + /* Trim off 32MB to give the disk a bit of breathing room */ + Volume->FreeSpace.QuadPart = FinalFreeSpace.QuadPart - 0x2000000; + } + + return STATUS_SUCCESS; +} + +PSMP_VOLUME_DESCRIPTOR +NTAPI +SmpSearchVolumeDescriptor(IN WCHAR DriveLetter) +{ + WCHAR UpLetter; + PSMP_VOLUME_DESCRIPTOR Volume = NULL; + PLIST_ENTRY NextEntry; + + /* Use upper case to reduce differences */ + UpLetter = RtlUpcaseUnicodeChar(DriveLetter); + + /* Loop each volume */ + NextEntry = SmpVolumeDescriptorList.Flink; + while (NextEntry != &SmpVolumeDescriptorList) + { + /* Grab the entry */ + Volume = CONTAINING_RECORD(NextEntry, SMP_VOLUME_DESCRIPTOR, Entry); + + /* Make sure it's a valid entry with an uppcase drive letter */ + ASSERT(Volume->Flags & SMP_VOLUME_INSERTED); // Volume->Initialized in ASSERT + ASSERT(Volume->DriveLetter >= L'A' && Volume->DriveLetter <= L'Z'); + + /* Break if it matches, if not, keep going */ + if (Volume->DriveLetter == UpLetter) break; + NextEntry = NextEntry->Flink; + } + + /* Return the volume if one was found */ + if (NextEntry == &SmpVolumeDescriptorList) Volume = NULL; + return Volume; +} + +NTSTATUS +NTAPI +SmpCreatePagingFile(IN PUNICODE_STRING Name, + IN PLARGE_INTEGER MinSize, + IN PLARGE_INTEGER MaxSize, + IN ULONG Priority) +{ + NTSTATUS Status; + DPRINT1("Should request pagefile: %wZ with size %I64x and %I64x\n", Name, MinSize->QuadPart, MaxSize->QuadPart); + + /* Tell the kernel to create the pagefile */ + Status = STATUS_SUCCESS; + //Status = NtCreatePagingFile(Name, MinSize, MaxSize, Priority); + if (NT_SUCCESS(Status)) + { + DPRINT1("SMSS:PFILE: NtCreatePagingFile (%wZ, %I64X, %I64X) succeeded. \n", + Name, + MinSize->QuadPart, + MaxSize->QuadPart); + } + else + { + DPRINT1("SMSS:PFILE: NtCreatePagingFile (%wZ, %I64X, %I64X) failed with %X \n", + Name, + MinSize->QuadPart, + MaxSize->QuadPart, + Status); + } + + /* Return the status */ + return Status; +} + NTSTATUS NTAPI SmpCreatePagingFileOnFixedDrive(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, IN PLARGE_INTEGER FuzzFactor, IN PLARGE_INTEGER MinimumSize) { - DPRINT1("Should create fixed pagefile of sizes: %I64d %I64d\n", - FuzzFactor->QuadPart, MinimumSize->QuadPart); - return STATUS_SUCCESS; + PSMP_VOLUME_DESCRIPTOR Volume; + BOOLEAN ShouldDelete; + NTSTATUS Status; + LARGE_INTEGER PageFileSize; + ASSERT(Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET] != L'?'); + + /* Try to find the volume descriptor for this drive letter */ + ShouldDelete = FALSE; + Volume = SmpSearchVolumeDescriptor(Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET]); + if (!Volume) + { + /* Couldn't find it, fail */ + DPRINT1("SMSS:PFILE: No volume descriptor for `%wZ' \n", + &Descriptor->Name); + return STATUS_INVALID_PARAMETER; + } + + /* Check if this is the boot volume */ + if (Volume->Flags & SMP_VOLUME_IS_BOOT) + { + /* Check if we haven't yet processed a crash dump on this volume */ + if (!(Descriptor->Flags & SMP_PAGEFILE_DUMP_PROCESSED)) + { + /* Try to find a crash dump and extract it */ + DPRINT1("SMSS:PFILE: Checking for crash dump in `%wZ' on boot volume \n", + &Descriptor->Name); + SmpCheckForCrashDump(&Descriptor->Name); + + /* Update how much free space we have now that we extracted a dump */ + Status = SmpGetVolumeFreeSpace(Volume); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS:PFILE: Failed to query free space for boot volume `%wC'\n", + Volume->DriveLetter); + } + + /* Don't process crashdump on this volume anymore */ + Descriptor->Flags |= SMP_PAGEFILE_DUMP_PROCESSED; + } + } + else + { + /* Crashdumps can only be on the boot volume */ + DPRINT1("SMSS:PFILE: Skipping crash dump checking for `%wZ' on non boot" + "volume `%wC' \n", + &Descriptor->Name, + Volume->DriveLetter); + } + + /* Update the size after dump extraction */ + Descriptor->ActualMinSize = Descriptor->MinSize; + Descriptor->ActualMaxSize = Descriptor->MaxSize; + + /* Check how big we can make the pagefile */ + Status = SmpGetPagingFileSize(&Descriptor->Name, &PageFileSize); + if (PageFileSize.QuadPart > 0) ShouldDelete = TRUE; + DPRINT1("SMSS:PFILE: Detected size %I64X for future paging file `%wZ'\n", + PageFileSize, + &Descriptor->Name); + DPRINT1("SMSS:PFILE: Free space on volume `%wC' is %I64X \n", + Volume->DriveLetter, + Volume->FreeSpace.QuadPart); + + /* Now update our size and make sure none of these are too big */ + PageFileSize.QuadPart += Volume->FreeSpace.QuadPart; + if (Descriptor->ActualMinSize.QuadPart > PageFileSize.QuadPart) + { + Descriptor->ActualMinSize = PageFileSize; + } + if (Descriptor->ActualMaxSize.QuadPart > PageFileSize.QuadPart) + { + Descriptor->ActualMaxSize = PageFileSize; + } + DPRINT1("SMSS:PFILE: min %I64X, max %I64X, real min %I64X \n", + Descriptor->ActualMinSize.QuadPart, + Descriptor->ActualMaxSize.QuadPart, + MinimumSize->QuadPart); + + /* Keep going until we've created a pagefile of the right size */ + while (Descriptor->ActualMinSize.QuadPart >= MinimumSize->QuadPart) + { + /* Call NT to do it */ + Status = SmpCreatePagingFile(&Descriptor->Name, + &Descriptor->ActualMinSize, + &Descriptor->ActualMaxSize, + 0); + if (NT_SUCCESS(Status)) + { + /* We're done, update flags and increase the count */ + Descriptor->Flags |= SMP_PAGEFILE_CREATED; + Volume->Flags |= SMP_VOLUME_PAGEFILE_CREATED; + Volume->PageFileCount++; + break; + } + + /* We failed, try a slighly smaller pagefile */ + Descriptor->ActualMinSize.QuadPart -= FuzzFactor->QuadPart; + } + + /* Check if we weren't able to create it */ + if (Descriptor->ActualMinSize.QuadPart < MinimumSize->QuadPart) + { + /* Delete the current page file and fail */ + if (ShouldDelete) SmpDeletePagingFile(&Descriptor->Name); + DPRINT1("SMSS:PFILE: Failing for min %I64X, max %I64X, real min %I64X \n", + Descriptor->ActualMinSize.QuadPart, + Descriptor->ActualMaxSize.QuadPart, + MinimumSize->QuadPart); + Status = STATUS_DISK_FULL; + } + + /* Return the status */ + return Status; } NTSTATUS @@ -245,9 +603,36 @@ SmpCreatePagingFileOnAnyDrive(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, IN PLARGE_INTEGER FuzzFactor, IN PLARGE_INTEGER MinimumSize) { - DPRINT1("Should create 'any' pagefile of sizes: %I64d %I64d\n", - FuzzFactor->QuadPart, MinimumSize->QuadPart); - return STATUS_SUCCESS; + PSMP_VOLUME_DESCRIPTOR Volume; + NTSTATUS Status = STATUS_DISK_FULL; + PLIST_ENTRY NextEntry; + ASSERT(Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET] == L'?'); + + /* Loop the volume list */ + NextEntry = SmpVolumeDescriptorList.Flink; + while (NextEntry != &SmpVolumeDescriptorList) + { + /* Get the volume */ + Volume = CONTAINING_RECORD(NextEntry, SMP_VOLUME_DESCRIPTOR, Entry); + + /* Make sure it's inserted and on a valid drive letter */ + ASSERT(Volume->Flags & SMP_VOLUME_INSERTED); // Volume->Initialized in ASSERT + ASSERT(Volume->DriveLetter >= L'A' && Volume->DriveLetter <= L'Z'); + + /* Write the drive letter to try creating it on this volume */ + Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET] = Volume->DriveLetter; + Status = SmpCreatePagingFileOnFixedDrive(Descriptor, + FuzzFactor, + MinimumSize); + if (NT_SUCCESS(Status)) break; + + /* It didn't work, make it an any pagefile again and keep going */ + Descriptor->Name.Buffer[STANDARD_DRIVE_LETTER_OFFSET] = L'?'; + NextEntry = NextEntry->Flink; + } + + /* Return disk full or success */ + return Status; } VOID diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index bd250f646bf..d2e9604a841 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -181,4 +181,10 @@ SmpRestoreBootStatusData( IN BOOLEAN ShutdownOkay ); +BOOLEAN +NTAPI +SmpCheckForCrashDump( + IN PUNICODE_STRING FileName +); + From adffed162fddfe2879f6514a510a04225a5f1492 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Fri, 3 Feb 2012 23:43:42 +0000 Subject: [PATCH 197/289] [BOOTDATA] - Don't create paging files on livecd. Verified by Alex Ionescu. svn path=/trunk/; revision=55402 --- reactos/boot/bootdata/livecd.inf | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/boot/bootdata/livecd.inf b/reactos/boot/bootdata/livecd.inf index d1d9b96acac..cc7cfb413ea 100644 --- a/reactos/boot/bootdata/livecd.inf +++ b/reactos/boot/bootdata/livecd.inf @@ -37,6 +37,7 @@ HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders","Pe ; User Profile environment variables HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","USERPROFILE",0x00020000,"%SystemDrive%\Profiles\Default User" HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","ALLUSERSPROFILE",0x00020000,"%SystemDrive%\Profiles\All Users" +HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management","PagingFiles",0x00000000,"" ; Font Substitution HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\SysFontSubstitutes","Arial",0x00000000,"Liberation Sans" From 0fcb7d138dd82ad44892d5cc5f4001a46b307975 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 10:40:27 +0000 Subject: [PATCH 198/289] [NTOSKRNL/MM/AMD64] - Add MI_REAL_SYSTEM_RANGE_START, which is the canonical system space base address, while MmSystemRangeStart variable contains a broken value, like on Windows. - Define MmSystemRangeStart to MI_REAL_SYSTEM_RANGE_START, since on amd64 there is no dynamic system space start address and we don't want to use the broken address anywhere - Add some more address layout definitions - Add MiIsPteOnP*eBoundary() macro - Add MMPPE, MI_WRITE_VALID_PPE and ValidKernelPpe definitions - Fix initialization of PrototypePte - Add mappings for VAD bitmap and working set list to MiInitializePageTable - Fix calculations in MiBuildNonPagedPool - Improve MiBuildSystemPteSpace - Implement MiBuildPfnDatabase, MiAddDescriptorToDatabase, MiBuildPfnDatabaseFromPageTables, MiSetupPfnForPageTable all of these are written to be portable, yet they are untested on anything else than amd64 builds - Mostly finish MiInitMachineDependent svn path=/trunk/; revision=55403 --- reactos/ntoskrnl/include/internal/amd64/mm.h | 53 ++- reactos/ntoskrnl/mm/amd64/init.c | 405 ++++++++++++++++--- 2 files changed, 395 insertions(+), 63 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index fcada6d9e49..5a24de881a2 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -8,29 +8,39 @@ #define MI_HIGHEST_USER_ADDRESS (PVOID)0x000007FFFFFEFFFFULL #define MI_USER_PROBE_ADDRESS (PVOID)0x000007FFFFFF0000ULL #define MI_DEFAULT_SYSTEM_RANGE_START (PVOID)0xFFFF080000000000ULL +#define MI_REAL_SYSTEM_RANGE_START 0xFFFF800000000000ULL +#define MI_PAGE_TABLE_BASE 0xFFFFF68000000000ULL #define HYPER_SPACE 0xFFFFF70000000000ULL #define HYPER_SPACE_END 0xFFFFF77FFFFFFFFFULL -#define MI_SESSION_SPACE_MINIMUM (PVOID)0xFFFFF90000000000ULL -#define MI_SESSION_VIEW_END (PVOID)0xFFFFF97FFF000000ULL -#define MI_SESSION_SPACE_END (PVOID)0xFFFFF98000000000ULL -#define MI_SYSTEM_PTE_START (PVOID)0xFFFFFAA000000000ULL -#define MI_PAGED_POOL_START (PVOID)0xFFFFFA8000000000ULL -#define MI_NON_PAGED_SYSTEM_START_MIN 0xFFFFFAA000000000ULL -#define MI_PFN_DATABASE (PVOID)0xFFFFFAC000000000ULL -#define MI_NONPAGED_POOL_END (PVOID)0xFFFFFAE000000000ULL -#define MI_DEBUG_MAPPING (PVOID)0xFFFFFFFF80000000ULL // FIXME +#define MI_SHARED_SYSTEM_PAGE 0xFFFFF78000000000ULL +#define MI_SYSTEM_CACHE_WS_START 0xFFFFF78000001000ULL +#define MI_LOADER_MAPPINGS 0xFFFFF80000000000ULL +#define MI_PAGED_SYSTEM_START 0xFFFFF88000000000ULL +#define MI_PAGED_POOL_START (PVOID)0xFFFFF8A000000000ULL +#define MI_PAGED_POOL_END 0xFFFFF8BFFFFFFFFFULL +#define MI_SESSION_SPACE_START 0xFFFFF90000000000ULL +#define MI_SESSION_VIEW_END 0xFFFFF97FFF000000ULL +#define MI_SESSION_SPACE_END 0xFFFFF97FFFFFFFFFULL +#define MM_SYSTEM_SPACE_START 0xFFFFF98000000000ULL +#define MI_PFN_DATABASE 0xFFFFFA8000000000ULL #define MI_HIGHEST_SYSTEM_ADDRESS (PVOID)0xFFFFFFFFFFFFFFFFULL -#define MI_SYSTEM_CACHE_WS_START (PVOID)0xFFFFF78000001000ULL // CHECKME +/* WOW64 address definitions */ #define MM_HIGHEST_USER_ADDRESS_WOW64 0x7FFEFFFF #define MM_SYSTEM_RANGE_START_WOW64 0x80000000 - -#define MI_SYSTEM_PTE_END (PVOID)((ULONG64)MI_SYSTEM_PTE_START + MI_NUMBER_SYSTEM_PTES * PAGE_SIZE - 1) +#define MI_DEBUG_MAPPING (PVOID)0xFFFFFFFF80000000ULL // FIXME +#define MI_NON_PAGED_SYSTEM_START_MIN MM_SYSTEM_SPACE_START // FIXME +#define MI_SYSTEM_PTE_START MM_SYSTEM_SPACE_START +#define MI_SYSTEM_PTE_END (MI_SYSTEM_PTE_START + MI_NUMBER_SYSTEM_PTES * PAGE_SIZE - 1) #define MI_SYSTEM_PTE_BASE (PVOID)MiAddressToPte(KSEG0_BASE) #define MM_HIGHEST_VAD_ADDRESS (PVOID)((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - (16 * PAGE_SIZE)) -#define MI_MAPPING_RANGE_START (ULONG64)HYPER_SPACE +#define MI_MAPPING_RANGE_START HYPER_SPACE #define MI_MAPPING_RANGE_END (MI_MAPPING_RANGE_START + MI_HYPERSPACE_PTES * PAGE_SIZE) +#define MI_DUMMY_PTE (MI_MAPPING_RANGE_END + PAGE_SIZE) +#define MI_VAD_BITMAP (MI_DUMMY_PTE + PAGE_SIZE) +#define MI_WORKING_SET_LIST (MI_VAD_BITMAP + PAGE_SIZE) +#define MI_NONPAGED_POOL_END 0 /* Memory sizes */ #define MI_MIN_PAGES_FOR_NONPAGED_POOL_TUNING ((255*1024*1024) >> PAGE_SHIFT) @@ -55,6 +65,8 @@ MI_SESSION_IMAGE_SIZE + \ MI_SESSION_WORKING_SET_SIZE) +#define MmSystemRangeStart ((PVOID)MI_REAL_SYSTEM_RANGE_START) + /* Misc constants */ #define _MI_PAGING_LEVELS 4 #define MI_NUMBER_SYSTEM_PTES 22000 @@ -63,9 +75,6 @@ #define NR_SECTION_PAGE_ENTRIES 1024 #define MI_HYPERSPACE_PTES (256 - 1) #define MI_ZERO_PTES (32) -#define MI_DUMMY_PTE (PMMPTE)(MI_MAPPING_RANGE_END + PAGE_SIZE) -#define MI_VAD_BITMAP (PMMPTE)(MI_DUMMY_PTE + PAGE_SIZE) -#define MI_WORKING_SET_LIST (PMMPTE)(MI_VAD_BITMAP + PAGE_SIZE) /* FIXME - different architectures have different cache line sizes... */ #define MM_CACHE_LINE_SIZE 32 @@ -75,6 +84,13 @@ #define IS_ALIGNED(addr, align) (((ULONG64)(addr) & (align - 1)) == 0) #define IS_PAGE_ALIGNED(addr) IS_ALIGNED(addr, PAGE_SIZE) +#define MiIsPteOnPdeBoundary(PointerPte) \ + ((((ULONG_PTR)PointerPte) & (PAGE_SIZE - 1)) == 0) +#define MiIsPteOnPpeBoundary(PointerPte) \ + ((((ULONG_PTR)PointerPte) & (PDE_PER_PAGE * PAGE_SIZE - 1)) == 0) +#define MiIsPteOnPxeBoundary(PointerPte) \ + ((((ULONG_PTR)PointerPte) & (PPE_PER_PAGE * PDE_PER_PAGE * PAGE_SIZE - 1)) == 0) + /* MMPTE related defines */ #define MM_EMPTY_PTE_LIST ((ULONG64)0xFFFFFFFF) #define MM_EMPTY_LIST ((ULONG_PTR)-1) @@ -129,6 +145,11 @@ /* On x86, these two are the same */ #define MMPDE MMPTE #define PMMPDE PMMPTE +#define MMPPE MMPTE +#define PMMPPE PMMPTE +#define MI_WRITE_VALID_PPE MI_WRITE_VALID_PTE + +#define ValidKernelPpe ValidKernelPde PULONG64 FORCEINLINE diff --git a/reactos/ntoskrnl/mm/amd64/init.c b/reactos/ntoskrnl/mm/amd64/init.c index 2a6dfd5ee85..37e8d33c537 100644 --- a/reactos/ntoskrnl/mm/amd64/init.c +++ b/reactos/ntoskrnl/mm/amd64/init.c @@ -32,13 +32,12 @@ MMPTE DemandZeroPte = {{MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS}}; /* Template PTE for prototype page */ MMPTE PrototypePte = {{(MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | - PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << PAGE_SHIFT)}}; - -/* Sizes */ -SIZE_T MiNonPagedSystemSize; + PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << 32)}}; /* Address ranges */ PVOID MiSessionViewEnd; +PVOID MiSystemPteSpaceStart; +PVOID MiSystemPteSpaceEnd; ULONG64 MxPfnSizeInBytes; BOOLEAN MiIncludeType[LoaderMaximum]; @@ -69,7 +68,7 @@ MiInitializeSessionSpaceLayout() /* The view starts right below the session working set (itself below * the image area) */ - MiSessionViewEnd = MI_SESSION_VIEW_END; + MiSessionViewEnd = (PVOID)MI_SESSION_VIEW_END; MiSessionViewStart = (PCHAR)MiSessionViewEnd - MmSessionViewSize; ASSERT(IS_PAGE_ALIGNED(MiSessionViewStart)); @@ -110,7 +109,7 @@ MiMapPPEs( { /* No, map it! */ TmplPde.u.Hard.PageFrameNumber = MxGetNextPage(1); - *PointerPpe = TmplPde; + MI_WRITE_VALID_PTE(PointerPpe, TmplPde); /* Zero out the page table */ RtlZeroMemory(MiPteToAddress(PointerPpe), PAGE_SIZE); @@ -137,7 +136,7 @@ MiMapPDEs( { /* No, map it! */ TmplPde.u.Hard.PageFrameNumber = MxGetNextPage(1); - *PointerPde = TmplPde; + MI_WRITE_VALID_PTE(PointerPde, TmplPde); /* Zero out the page table */ RtlZeroMemory(MiPteToAddress(PointerPde), PAGE_SIZE); @@ -164,7 +163,10 @@ MiMapPTEs( { /* No, map it! */ TmplPte.u.Hard.PageFrameNumber = MxGetNextPage(1); - *PointerPte = TmplPte; + MI_WRITE_VALID_PTE(PointerPte, TmplPte); + + /* Zero out the page (FIXME: not always neccessary) */ + RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); } } } @@ -212,10 +214,10 @@ MiInitializePageTable() HyperTemplatePte = TmplPte; /* Create PDPTs (72 KB) for shared system address space, - * skip page tables and hyperspace */ + * skip page tables TODO: use global pages. */ /* Loop the PXEs */ - for (PointerPxe = MiAddressToPxe((PVOID)(HYPER_SPACE_END + 1)); + for (PointerPxe = MiAddressToPxe((PVOID)HYPER_SPACE); PointerPxe <= MiAddressToPxe(MI_HIGHEST_SYSTEM_ADDRESS); PointerPxe++) { @@ -231,8 +233,13 @@ MiInitializePageTable() } } - /* Setup the mapping PPEs and PDEs */ - MiMapPPEs((PVOID)MI_MAPPING_RANGE_START, (PVOID)MI_MAPPING_RANGE_END); + /* Map PPEs for paged pool */ + MiMapPPEs(MmPagedPoolStart, MmPagedPoolEnd); + + /* Setup 1 PPE for hyper space */ + MiMapPPEs((PVOID)HYPER_SPACE, (PVOID)HYPER_SPACE_END); + + /* Setup the mapping PDEs */ MiMapPDEs((PVOID)MI_MAPPING_RANGE_START, (PVOID)MI_MAPPING_RANGE_END); /* Setup the mapping PTEs */ @@ -246,6 +253,10 @@ MiInitializePageTable() MiMapPDEs((PVOID)MI_DEBUG_MAPPING, (PVOID)MI_DEBUG_MAPPING); MmDebugPte = MiAddressToPte((PVOID)MI_DEBUG_MAPPING); #endif + + /* Setup PDE and PTEs for VAD bitmap and working set list */ + MiMapPDEs((PVOID)MI_VAD_BITMAP, (PVOID)(MI_WORKING_SET_LIST + PAGE_SIZE - 1)); + MiMapPTEs((PVOID)MI_VAD_BITMAP, (PVOID)(MI_WORKING_SET_LIST + PAGE_SIZE - 1)); } VOID @@ -311,34 +322,31 @@ MiBuildNonPagedPool(VOID) MmMaximumNonPagedPoolInBytes = MI_MAX_NONPAGED_POOL_SIZE; } - /* Put non paged pool to the end of the region */ - MmNonPagedPoolStart = (PCHAR)MmNonPagedPoolEnd - MmMaximumNonPagedPoolInBytes; + /* Convert nonpaged pool size from bytes to pages */ + MmMaximumNonPagedPoolInPages = MmMaximumNonPagedPoolInBytes >> PAGE_SHIFT; - /* Make sure it doesn't collide with the PFN database */ - if ((PCHAR)MmNonPagedPoolStart < (PCHAR)MmPfnDatabase + MxPfnSizeInBytes) - { - /* Put non paged pool after the PFN database */ - MmNonPagedPoolStart = (PCHAR)MmPfnDatabase + MxPfnSizeInBytes; - MmMaximumNonPagedPoolInBytes = (ULONG64)MmNonPagedPoolEnd - - (ULONG64)MmNonPagedPoolStart; - } - - ASSERT(IS_PAGE_ALIGNED(MmNonPagedPoolStart)); + /* Non paged pool starts after the PFN database */ + MmNonPagedPoolStart = MmPfnDatabase + MxPfnAllocation * PAGE_SIZE; /* Calculate the nonpaged pool expansion start region */ MmNonPagedPoolExpansionStart = (PCHAR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes; ASSERT(IS_PAGE_ALIGNED(MmNonPagedPoolExpansionStart)); + /* And this is where the none paged pool ends */ + MmNonPagedPoolEnd = (PCHAR)MmNonPagedPoolStart + MmMaximumNonPagedPoolInBytes; + ASSERT(MmNonPagedPoolEnd < (PVOID)MM_HAL_VA_START); + /* Map PPEs and PDEs for non paged pool (including expansion) */ MiMapPPEs(MmNonPagedPoolStart, MmNonPagedPoolEnd); MiMapPDEs(MmNonPagedPoolStart, MmNonPagedPoolEnd); /* Map the nonpaged pool PTEs (without expansion) */ - MiMapPTEs(MmNonPagedPoolStart, (PUCHAR)MmNonPagedPoolExpansionStart - 1); + MiMapPTEs(MmNonPagedPoolStart, (PCHAR)MmNonPagedPoolExpansionStart - 1); /* Initialize the ARM3 nonpaged pool */ MiInitializeNonPagedPool(); + MiInitializeNonPagedPoolThresholds(); /* Initialize the nonpaged pool */ InitializePool(NonPagedPool, 0); @@ -353,32 +361,18 @@ MiBuildSystemPteSpace() /* Use the default numer of system PTEs */ MmNumberOfSystemPtes = MI_NUMBER_SYSTEM_PTES; - - /* System PTE pool is below the PFN database */ MiNonPagedSystemSize = (MmNumberOfSystemPtes + 1) * PAGE_SIZE; - MmNonPagedSystemStart = (PCHAR)MmPfnDatabase - MiNonPagedSystemSize; - MmNonPagedSystemStart = MM_ROUND_DOWN(MmNonPagedSystemStart, 512 * PAGE_SIZE); - /* Don't let it go below the minimum */ - if (MmNonPagedSystemStart < (PVOID)MI_NON_PAGED_SYSTEM_START_MIN) - { - /* This is a hard-coded limit in the Windows NT address space */ - MmNonPagedSystemStart = (PVOID)MI_NON_PAGED_SYSTEM_START_MIN; + /* Put system PTEs at the start of the system VA space */ + MiSystemPteSpaceStart = MmNonPagedSystemStart; + MiSystemPteSpaceEnd = (PUCHAR)MiSystemPteSpaceStart + MiNonPagedSystemSize; - /* Reduce the amount of system PTEs to reach this point */ - MmNumberOfSystemPtes = (ULONG)(((ULONG64)MmPfnDatabase - - (ULONG64)MmNonPagedSystemStart) >> - PAGE_SHIFT); - MmNumberOfSystemPtes--; - ASSERT(MmNumberOfSystemPtes > 1000); - } + /* Map the PPEs and PDEs for the system PTEs */ + MiMapPPEs(MiSystemPteSpaceStart, MiSystemPteSpaceEnd); + MiMapPDEs(MiSystemPteSpaceStart, MiSystemPteSpaceEnd); - /* Map the PDEs and PPEs for the system PTEs */ - MiMapPPEs(MI_SYSTEM_PTE_START, MI_SYSTEM_PTE_END); - MiMapPDEs(MI_SYSTEM_PTE_START, MI_SYSTEM_PTE_END); - - /* Create the system PTE space */ - PointerPte = MiAddressToPte(MI_SYSTEM_PTE_START); + /* Initialize the system PTE space */ + PointerPte = MiAddressToPte(MiSystemPteSpaceStart); MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace); /* Reserve system PTEs for zeroing PTEs and clear them */ @@ -389,13 +383,302 @@ MiBuildSystemPteSpace() MiFirstReservedZeroingPte->u.Hard.PageFrameNumber = MI_ZERO_PTES - 1; } +static +VOID +MiSetupPfnForPageTable( + PFN_NUMBER PageFrameIndex, + PMMPTE PointerPte) +{ + PMMPFN Pfn; + PMMPDE PointerPde; + + /* Get the pfn entry for this page */ + Pfn = MiGetPfnEntry(PageFrameIndex); + + /* Check if it's valid memory */ + if ((PageFrameIndex <= MmHighestPhysicalPage) && + (MmIsAddressValid(Pfn)) && + (Pfn->u3.e1.PageLocation == ActiveAndValid)) + { + /* Setup the PFN entry */ + Pfn->u1.WsIndex = 0; + Pfn->u2.ShareCount++; + Pfn->PteAddress = PointerPte; + Pfn->OriginalPte = *PointerPte; + Pfn->u3.e1.PageLocation = ActiveAndValid; + Pfn->u3.e1.CacheAttribute = MiNonCached; + Pfn->u3.e2.ReferenceCount = 1; + Pfn->u4.PteFrame = PFN_FROM_PTE(MiAddressToPte(PointerPte)); + } + + /* Increase the shared count of the PFN entry for the PDE */ + PointerPde = MiAddressToPde(MiPteToAddress(PointerPte)); + Pfn = MiGetPfnEntry(PFN_FROM_PTE(PointerPde)); + Pfn->u2.ShareCount++; +} + +VOID +NTAPI +MiBuildPfnDatabaseFromPageTables(VOID) +{ + PVOID Address = NULL; + PFN_NUMBER PageFrameIndex; + PMMPDE PointerPde; + PMMPTE PointerPte; + ULONG k, l; + PMMPFN Pfn; +#if (_MI_PAGING_LEVELS >= 3) + PMMPDE PointerPpe; + ULONG j; +#endif +#if (_MI_PAGING_LEVELS == 4) + PMMPDE PointerPxe; + ULONG i; +#endif + + /* Manual setup of the top level page directory */ +#if (_MI_PAGING_LEVELS == 4) + PageFrameIndex = PFN_FROM_PTE(MiAddressToPte(PXE_BASE)); +#elif (_MI_PAGING_LEVELS == 3) + PageFrameIndex = PFN_FROM_PTE(MiAddressToPte(PPE_BASE)); +#else + PageFrameIndex = PFN_FROM_PTE(MiAddressToPte(PDE_BASE)); +#endif + Pfn = MiGetPfnEntry(PageFrameIndex); + ASSERT(Pfn->u3.e1.PageLocation == ActiveAndValid); + Pfn->u1.WsIndex = 0; + Pfn->u2.ShareCount = 1; + Pfn->PteAddress = NULL; + Pfn->u3.e1.CacheAttribute = MiNonCached; + Pfn->u3.e2.ReferenceCount = 1; + Pfn->u4.PteFrame = 0; + +#if (_MI_PAGING_LEVELS == 4) + /* Loop all PXEs in the PML4 */ + PointerPxe = MiAddressToPxe(Address); + for (i = 0; i < PXE_PER_PAGE; i++, PointerPxe++) + { + /* Skip invalid PXEs */ + if (!PointerPxe->u.Hard.Valid) continue; + + /* Handle the PFN */ + PageFrameIndex = PFN_FROM_PXE(PointerPxe); + MiSetupPfnForPageTable(PageFrameIndex, PointerPxe); + + /* Get starting VA for this PXE */ + Address = MiPxeToAddress(PointerPxe); +#endif +#if (_MI_PAGING_LEVELS >= 3) + /* Loop all PPEs in this PDP */ + PointerPpe = MiAddressToPpe(Address); + for (j = 0; j < PPE_PER_PAGE; j++, PointerPpe++) + { + /* Skip invalid PPEs */ + if (!PointerPpe->u.Hard.Valid) continue; + + /* Handle the PFN */ + PageFrameIndex = PFN_FROM_PPE(PointerPpe); + MiSetupPfnForPageTable(PageFrameIndex, PointerPpe); + + /* Get starting VA for this PPE */ + Address = MiPpeToAddress(PointerPpe); +#endif + /* Loop all PDEs in this PD */ + PointerPde = MiAddressToPde(Address); + for (k = 0; k < PDE_PER_PAGE; k++, PointerPde++) + { + /* Skip invalid PDEs */ + if (!PointerPde->u.Hard.Valid) continue; + + /* Handle the PFN */ + PageFrameIndex = PFN_FROM_PDE(PointerPde); + MiSetupPfnForPageTable(PageFrameIndex, PointerPde); + + /* Get starting VA for this PDE */ + Address = MiPdeToAddress(PointerPde); + + /* Loop all PTEs in this PT */ + PointerPte = MiAddressToPte(Address); + for (l = 0; l < PTE_PER_PAGE; l++, PointerPte++) + { + /* Skip invalid PTEs */ + if (!PointerPte->u.Hard.Valid) continue; + + /* Handle the PFN */ + PageFrameIndex = PFN_FROM_PTE(PointerPte); + MiSetupPfnForPageTable(PageFrameIndex, PointerPte); + } + } +#if (_MI_PAGING_LEVELS >= 3) + } +#endif +#if (_MI_PAGING_LEVELS == 4) + } +#endif +} + +VOID +NTAPI +INIT_FUNCTION +MiAddDescriptorToDatabase( + PFN_NUMBER BasePage, + PFN_NUMBER PageCount, + TYPE_OF_MEMORY MemoryType) +{ + PMMPFN Pfn; + + ASSERT(!MiIsMemoryTypeInvisible(MemoryType)); + + /* Check if the memory is free */ + if (MiIsMemoryTypeFree(MemoryType)) + { + /* Get the last pfn of this descriptor. Note we loop backwards */ + Pfn = &MmPfnDatabase[BasePage + PageCount - 1]; + + /* Loop all pages */ + while (PageCount--) + { + /* Add it to the free list */ + Pfn->u3.e1.CacheAttribute = MiNonCached; + MiInsertPageInFreeList(BasePage + PageCount); + + /* Go to the previous page */ + Pfn--; + } + } + else if (MemoryType == LoaderXIPRom) + { + Pfn = &MmPfnDatabase[BasePage]; + while (PageCount--) + { + /* Make it a pseudo-I/O ROM mapping */ + Pfn->PteAddress = 0; + Pfn->u1.Flink = 0; + Pfn->u2.ShareCount = 0; + Pfn->u3.e1.PageLocation = 0; + Pfn->u3.e1.CacheAttribute = MiNonCached; + Pfn->u3.e1.Rom = 1; + Pfn->u3.e1.PrototypePte = 1; + Pfn->u3.e2.ReferenceCount = 0; + Pfn->u4.InPageError = 0; + Pfn->u4.PteFrame = 0; + + /* Advance one */ + Pfn++; + } + } + else if (MemoryType == LoaderBad) + { + // FIXME: later + ASSERT(FALSE); + } + else + { + /* For now skip it */ + DbgPrint("Skipping BasePage=0x%lx, PageCount=0x%lx, MemoryType=%lx\n", + BasePage, PageCount, MemoryType); + Pfn = &MmPfnDatabase[BasePage]; + while (PageCount--) + { + /* Make an active PFN */ + Pfn->u3.e1.PageLocation = ActiveAndValid; + + /* Advance one */ + Pfn++; + } + } +} + +VOID +NTAPI +INIT_FUNCTION +MiBuildPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock) +{ + PLIST_ENTRY ListEntry; + PMEMORY_ALLOCATION_DESCRIPTOR Descriptor; + PFN_NUMBER BasePage, PageCount; + + /* Map the PDEs and PPEs for the pfn database (ignore holes) */ +#if (_MI_PAGING_LEVELS >= 3) + MiMapPPEs(MmPfnDatabase, (PUCHAR)MmPfnDatabase + MxPfnAllocation - 1); +#endif + MiMapPDEs(MmPfnDatabase, (PUCHAR)MmPfnDatabase + MxPfnAllocation - 1); + + /* First initialize the color tables */ + MiInitializeColorTables(); + + /* Loop the memory descriptors */ + for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Flink; + ListEntry != &LoaderBlock->MemoryDescriptorListHead; + ListEntry = ListEntry->Flink) + { + /* Get the descriptor */ + Descriptor = CONTAINING_RECORD(ListEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry); + + /* Skip invisible memory */ + if (MiIsMemoryTypeInvisible(Descriptor->MemoryType)) continue; + + /* If this is the free descriptor, use the copy instead */ + if (Descriptor == MxFreeDescriptor) Descriptor = &MxOldFreeDescriptor; + + /* Get the range for this descriptor */ + BasePage = Descriptor->BasePage; + PageCount = Descriptor->PageCount; + + /* Map the pages for the database */ + MiMapPTEs(&MmPfnDatabase[BasePage], + (PUCHAR)(&MmPfnDatabase[BasePage + PageCount]) - 1); + + /* If this was the free descriptor, skip the next step */ + if (Descriptor == &MxOldFreeDescriptor) continue; + + /* Add this descriptor to the database */ + MiAddDescriptorToDatabase(BasePage, PageCount, Descriptor->MemoryType); + } + + /* At this point the whole pfn database is mapped. We are about to add the + pages from the free descriptor to the database, so from now on we cannot + use it anymore. */ + + /* Now add the free descriptor */ + BasePage = MxFreeDescriptor->BasePage; + PageCount = MxFreeDescriptor->PageCount; + MiAddDescriptorToDatabase(BasePage, PageCount, LoaderFree); + + /* And finally the memory we used */ + BasePage = MxOldFreeDescriptor.BasePage; + PageCount = MxFreeDescriptor->BasePage - BasePage; + MiAddDescriptorToDatabase(BasePage, PageCount, LoaderMemoryData); + + // Reset the descriptor back so we can create the correct memory blocks + *MxFreeDescriptor = MxOldFreeDescriptor; +} + NTSTATUS NTAPI INIT_FUNCTION MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { + KIRQL OldIrql; + ASSERT(MxPfnAllocation != 0); + + /* Set some hardcoded addresses */ MmHyperSpaceEnd = (PVOID)HYPER_SPACE_END; + MmNonPagedSystemStart = (PVOID)MM_SYSTEM_SPACE_START; + MmPfnDatabase = (PVOID)MI_PFN_DATABASE; + MmWorkingSetList = (PVOID)MI_WORKING_SET_LIST; + + +// PrototypePte.u.Proto.Valid = 1 +// PrototypePte.u.ReadOnly +// PrototypePte.u.Prototype +// PrototypePte.u.Protection = MM_READWRITE; +// PrototypePte.u.ProtoAddress + PrototypePte.u.Soft.PageFileHigh = MI_PTE_LOOKUP_NEEDED; + MiInitializePageTable(); @@ -403,5 +686,33 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) MiBuildSystemPteSpace(); + /* Need to be at DISPATCH_LEVEL for MiInsertPageInFreeList */ + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + + /* Map the PFN database pages */ + MiBuildPfnDatabase(LoaderBlock); + + /* Now process the page tables */ + MiBuildPfnDatabaseFromPageTables(); + + MiPfnsInitialized = TRUE; + + KeLowerIrql(OldIrql); + + /* Initialize the balancer */ + MmInitializeBalancer((ULONG)MmAvailablePages, 0); + + /* Make sure we have everything we need */ + ASSERT(MmPfnDatabase); + ASSERT(MmNonPagedSystemStart); + ASSERT(MmNonPagedPoolStart); + ASSERT(MmSizeOfNonPagedPoolInBytes); + ASSERT(MmMaximumNonPagedPoolInBytes); + ASSERT(MmNonPagedPoolExpansionStart); + ASSERT(MmHyperSpaceEnd); + ASSERT(MmNumberOfSystemPtes); + ASSERT(MiAddressToPde(MmNonPagedPoolStart)->u.Hard.Valid); + ASSERT(MiAddressToPte(MmNonPagedPoolStart)->u.Hard.Valid); + return STATUS_SUCCESS; } From de74279d5b1e045eeeddf43a414b003fffa5af17 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 11:01:19 +0000 Subject: [PATCH 199/289] [ASM/AMD64] - Add multiple amd64 asm constant and structure offset definitions - Add more unwind information to the amd64 trap entry code - Add IRQL check, APC check and segment sanitize code to trap entry/exit svn path=/trunk/; revision=55404 --- reactos/include/asm/genincdata.c | 10 +++ reactos/include/asm/ksamd64.template.h | 119 ++++++++++++++++--------- reactos/include/asm/trapamd64.inc | 61 ++++++++++--- 3 files changed, 133 insertions(+), 57 deletions(-) diff --git a/reactos/include/asm/genincdata.c b/reactos/include/asm/genincdata.c index 48577f1939b..2f55a40efd9 100644 --- a/reactos/include/asm/genincdata.c +++ b/reactos/include/asm/genincdata.c @@ -16,6 +16,16 @@ #include #include +#ifdef _M_AMD64 +enum +{ + P1Home = 1 * sizeof(PVOID), + P2Home = 2 * sizeof(PVOID), + P3Home = 3 * sizeof(PVOID), + P4Home = 4 * sizeof(PVOID), +}; +#endif + // FIXME: where to put this? typedef struct _FIBER /* Field offsets: */ { /* 32 bit 64 bit */ diff --git a/reactos/include/asm/ksamd64.template.h b/reactos/include/asm/ksamd64.template.h index 88b96633f11..2fa4e71fd40 100644 --- a/reactos/include/asm/ksamd64.template.h +++ b/reactos/include/asm/ksamd64.template.h @@ -112,10 +112,10 @@ CONSTANT(EXCEPTION_NPX_ERROR), CONSTANT(EXCEPTION_ALIGNMENT_CHECK), HEADER("Argument Home Address"), -OFFSET(P1Home, CONTEXT, P1Home), -OFFSET(P2Home, CONTEXT, P1Home), -OFFSET(P3Home, CONTEXT, P1Home), -OFFSET(P4Home, CONTEXT, P1Home), +CONSTANT(P1Home), +CONSTANT(P2Home), +CONSTANT(P3Home), +CONSTANT(P4Home), HEADER("CONTEXT"), OFFSET(CONTEXT_P1Home, CONTEXT, P1Home), @@ -377,53 +377,55 @@ OFFSET(PcHalReserved, KPCR, HalReserved), //OFFSET(PcNumber, KPCR, Number), //OFFSET(PcInterruptRequest, KPCR, InterruptRequest), //OFFSET(PcIdleHalt, KPCR, IdleHalt), -//OFFSET(PcCurrentThread, KPCR, CurrentThread), +OFFSET(PcCurrentThread, KIPCR, Prcb.CurrentThread), //OFFSET(PcNextThread, KPCR, NextThread), //OFFSET(PcIdleThread, KPCR, IdleThread), //OFFSET(PcIpiFrozen, KPCR, IpiFrozen), //OFFSET(PcNestingLevel, KPCR, NestingLevel), -//OFFSET(PcRspBase, KPCR, RspBase), +OFFSET(PcRspBase, KIPCR, Prcb.RspBase), //OFFSET(PcPrcbLock, KPCR, PrcbLock), +OFFSET(PcSetMember, KIPCR, Prcb.SetMember), #if 0 -OFFSET(PcSetMember, KPCR, SetMember), -OFFSET(PcCr0, KPCR, Cr0), -OFFSET(PcCr2, KPCR, Cr2), -OFFSET(PcCr3, KPCR, Cr3), -OFFSET(PcCr4, KPCR, Cr4), -OFFSET(PcKernelDr0, KPCR, KernelDr0), -OFFSET(PcKernelDr1, KPCR, KernelDr1), -OFFSET(PcKernelDr2, KPCR, KernelDr2), -OFFSET(PcKernelDr3, KPCR, KernelDr3), -OFFSET(PcKernelDr7, KPCR, KernelDr7), -OFFSET(PcGdtrLimit, KPCR, GdtrLimit), -OFFSET(PcGdtrBase, KPCR, GdtrBase), -OFFSET(PcIdtrLimit, KPCR, IdtrLimit), -OFFSET(PcIdtrBase, KPCR, IdtrBase), -OFFSET(PcTr, KPCR, Tr), -OFFSET(PcLdtr, KPCR, Ldtr), -OFFSET(PcDebugControl, KPCR, DebugControl), -OFFSET(PcLastBranchToRip, KPCR, LastBranchToRip), -OFFSET(PcLastBranchFromRip, KPCR, LastBranchFromRip), -OFFSET(PcLastExceptionToRip, KPCR, LastExceptionToRip), -OFFSET(PcLastExceptionFromRip, KPCR, LastExceptionFromRip), -OFFSET(PcCr8, KPCR, Cr8), -OFFSET(PcCpuType, KPCR, CpuType), -OFFSET(PcCpuID, KPCR, CpuID), -OFFSET(PcCpuStep, KPCR, CpuStep), -OFFSET(PcCpuVendor, KPCR, CpuVendor), -OFFSET(PcVirtualApicAssist, KPCR, VirtualApicAssist), -OFFSET(PcCFlushSize, KPCR, CFlushSize), -OFFSET(PcDeferredReadyListHead, KPCR, DeferredReadyListHead), -OFFSET(PcSystemCalls, KPCR, SystemCalls), -OFFSET(PcDpcRoutineActive, KPCR, DpcRoutineActive), -OFFSET(PcInterruptCount, KPCR, InterruptCount), -OFFSET(PcDebuggerSavedIRQL, KPCR, DebuggerSavedIRQL), -OFFSET(PcTickOffset, KPCR, TickOffset), -OFFSET(PcMasterOffset, KPCR, MasterOffset), -OFFSET(PcSkipTick, KPCR, SkipTick), -OFFSET(PcStartCycles, KPCR, StartCycles), -SIZE(ProcessorControlRegisterLength, KPCR), +OFFSET(PcCr0, KIPCR, Prcb.Cr0), +OFFSET(PcCr2, KIPCR, Prcb.Cr2), +OFFSET(PcCr3, KIPCR, Prcb.Cr3), +OFFSET(PcCr4, KIPCR, Prcb.Cr4), +OFFSET(PcKernelDr0, KIPCR, Prcb.KernelDr0), +OFFSET(PcKernelDr1, KIPCR, Prcb.KernelDr1), +OFFSET(PcKernelDr2, KIPCR, Prcb.KernelDr2), +OFFSET(PcKernelDr3, KIPCR, Prcb.KernelDr3), +OFFSET(PcKernelDr7, KIPCR, Prcb.KernelDr7), +OFFSET(PcGdtrLimit, KIPCR, Prcb.GdtrLimit), +OFFSET(PcGdtrBase, KIPCR, Prcb.GdtrBase), +OFFSET(PcIdtrLimit, KIPCR, IdtrLimit), +OFFSET(PcIdtrBase, KIPCR, IdtrBase), +OFFSET(PcTr, KIPCR, Tr), +OFFSET(PcLdtr, KIPCR, Ldtr), +OFFSET(PcDebugControl, KIPCR, DebugControl), +OFFSET(PcLastBranchToRip, KIPCR, LastBranchToRip), +OFFSET(PcLastBranchFromRip, KIPCR, LastBranchFromRip), +OFFSET(PcLastExceptionToRip, KIPCR, LastExceptionToRip), +OFFSET(PcLastExceptionFromRip, KIPCR, LastExceptionFromRip), +OFFSET(PcCr8, KIPCR, Cr8), #endif +OFFSET(PcCpuType, KIPCR, Prcb.CpuType), +OFFSET(PcCpuID, KIPCR, Prcb.CpuID), +OFFSET(PcCpuStep, KIPCR, Prcb.CpuStep), +OFFSET(PcCpuVendor, KIPCR, Prcb.CpuVendor), +OFFSET(PcCFlushSize, KIPCR, Prcb.CFlushSize), +OFFSET(PcDeferredReadyListHead, KIPCR, Prcb.DeferredReadyListHead), +OFFSET(PcSystemCalls, KIPCR, Prcb.KeSystemCalls), +OFFSET(PcDpcRoutineActive, KIPCR, Prcb.DpcRoutineActive), +OFFSET(PcInterruptCount, KIPCR, Prcb.InterruptCount), +OFFSET(PcDebuggerSavedIRQL, KIPCR, Prcb.DebuggerSavedIRQL), +OFFSET(PcTickOffset, KIPCR, Prcb.TickOffset), +OFFSET(PcMasterOffset, KIPCR, Prcb.MasterOffset), +OFFSET(PcSkipTick, KIPCR, Prcb.SkipTick), +#if (NTDDI_VERSION >= NTDDI_LONGHORN) +OFFSET(PcVirtualApicAssist, KIPCR, Prcb.VirtualApicAssist), +OFFSET(PcStartCycles, KIPCR, Prcb.StartCycles), +#endif +SIZE(ProcessorControlRegisterLength, KIPCR), HEADER("KPROCESSOR_STATE"), OFFSET(PsSpecialRegisters, KPROCESSOR_STATE, SpecialRegisters), @@ -578,4 +580,33 @@ OFFSET(EXCEPTION_RECORD_ExceptionAddress, EXCEPTION_RECORD, ExceptionAddress), OFFSET(EXCEPTION_RECORD_NumberParameters, EXCEPTION_RECORD, NumberParameters), OFFSET(EXCEPTION_RECORD_ExceptionInformation, EXCEPTION_RECORD, ExceptionInformation), +HEADER("KTHREAD"), OFFSET(KTHREAD_WAIT_IRQL, KTHREAD, WaitIrql), +OFFSET(KTHREAD_TrapFrame, KTHREAD, TrapFrame), +OFFSET(KTHREAD_PreviousMode, KTHREAD, PreviousMode), +OFFSET(KTHREAD_KernelStack, KTHREAD, KernelStack), +OFFSET(KTHREAD_UserApcPending, KTHREAD, ApcState.UserApcPending), + +HEADER("KINTERRUPT"), + +OFFSET(KINTERRUPT_Type, KINTERRUPT, Type), +OFFSET(KINTERRUPT_Size, KINTERRUPT, Size), +OFFSET(KINTERRUPT_InterruptListEntry, KINTERRUPT, InterruptListEntry), +OFFSET(KINTERRUPT_ServiceRoutine, KINTERRUPT, ServiceRoutine), +OFFSET(KINTERRUPT_ServiceContext, KINTERRUPT, ServiceContext), +OFFSET(KINTERRUPT_SpinLock, KINTERRUPT, SpinLock), +OFFSET(KINTERRUPT_TickCount, KINTERRUPT, TickCount), +OFFSET(KINTERRUPT_ActualLock, KINTERRUPT, ActualLock), +OFFSET(KINTERRUPT_DispatchAddress, KINTERRUPT, DispatchAddress), +OFFSET(KINTERRUPT_Vector, KINTERRUPT, Vector), +OFFSET(KINTERRUPT_Irql, KINTERRUPT, Irql), +OFFSET(KINTERRUPT_SynchronizeIrql, KINTERRUPT, SynchronizeIrql), +OFFSET(KINTERRUPT_FloatingSave, KINTERRUPT, FloatingSave), +OFFSET(KINTERRUPT_Connected, KINTERRUPT, Connected), +OFFSET(KINTERRUPT_Number, KINTERRUPT, Number), +OFFSET(KINTERRUPT_ShareVector, KINTERRUPT, ShareVector), +OFFSET(KINTERRUPT_Mode, KINTERRUPT, Mode), +OFFSET(KINTERRUPT_ServiceCount, KINTERRUPT, ServiceCount), +OFFSET(KINTERRUPT_DispatchCount, KINTERRUPT, DispatchCount), +OFFSET(KINTERRUPT_TrapFrame, KINTERRUPT, TrapFrame), +OFFSET(KINTERRUPT_DispatchCode, KINTERRUPT, DispatchCode), diff --git a/reactos/include/asm/trapamd64.inc b/reactos/include/asm/trapamd64.inc index 23df5b50930..86cc94a7216 100644 --- a/reactos/include/asm/trapamd64.inc +++ b/reactos/include/asm/trapamd64.inc @@ -11,6 +11,7 @@ TF_SAVE_ALL = (TF_VOLATILES OR TF_NONVOLATILES OR TF_XMM OR TF_SEGME TF_HAS_ERROR_CODE = HEX(40) TF_SEND_EOI = HEX(80) //TF_SYSTEMSERVICE = (TRAPFLAG_VOLATILES or TRAPFLAG_DEBUG) +TF_CHECKUSERAPC = HEX(100) /* * Stack Layout: @@ -28,7 +29,7 @@ TF_SEND_EOI = HEX(80) * EnterTrap - Allocate KTRAP_FRAME_LENGTH and save registers to it */ MACRO(EnterTrap, Flags) - LOCAL dont_swap + LOCAL kernel_mode_entry /* Save the trap flags for this trap */ CurrentTrapFlags = VAL(Flags) @@ -45,22 +46,29 @@ MACRO(EnterTrap, Flags) /* Make room for a KTRAP_FRAME */ sub rsp, (KTRAP_FRAME_LENGTH - SIZE_INITIAL_FRAME) .allocstack (KTRAP_FRAME_LENGTH - SIZE_INITIAL_FRAME) - .endprolog /* Save rbp and rax */ mov [rsp + KTRAP_FRAME_Rbp], rbp + .savereg rbp, KTRAP_FRAME_Rbp mov [rsp + KTRAP_FRAME_Rax], rax + .savereg rax, KTRAP_FRAME_Rax /* Point rbp to the KTRAP_FRAME */ lea rbp, [rsp] + .setframe rbp, 0 if (Flags AND TF_NONVOLATILES) /* Save non-volatile registers */ mov [rbp + KTRAP_FRAME_Rbx], rbx + .savereg rbx, KTRAP_FRAME_Rbx mov [rbp + KTRAP_FRAME_Rdi], rdi + .savereg rdi, KTRAP_FRAME_Rdi mov [rbp + KTRAP_FRAME_Rsi], rsi + .savereg rsi, KTRAP_FRAME_Rsi endif + .endprolog + if (Flags AND TF_VOLATILES) /* Save volatile registers */ mov [rbp + KTRAP_FRAME_Rcx], rcx @@ -89,19 +97,25 @@ MACRO(EnterTrap, Flags) mov [rbp + KTRAP_FRAME_SegGs], gs endif - /* Save previous mode and swap gs when it was UserMode */ + /* Save previous mode and check if it was user mode */ mov ax, [rbp + KTRAP_FRAME_SegCs] and al, 1 mov [rbp + KTRAP_FRAME_PreviousMode], al - jz dont_swap - swapgs -dont_swap: + jz kernel_mode_entry - if (Flags AND TF_IRQL) + /* Set sane segments */ + mov ax, (KGDT64_R3_DATA or RPL_MASK) + mov ds, ax + mov es, ax + swapgs + +kernel_mode_entry: + +// if (Flags AND TF_IRQL) /* Save previous irql */ mov rax, cr8 mov [rbp + KTRAP_FRAME_PreviousIrql], al - endif +// endif if (Flags AND TF_DEBUG) /* Save debug registers */ @@ -127,7 +141,16 @@ ENDM * ExitTrap - Restore registers and free stack space */ MACRO(ExitTrap, Flags) - LOCAL dont_swap_back + LOCAL kernel_mode_return + +#if DBG + /* Check previous irql */ + mov rax, cr8 + cmp [rbp + KTRAP_FRAME_PreviousIrql], al + je .irql_ok + int 3 + .irql_ok: +#endif if (Flags AND TF_SEGMENTS) /* Restore segment selectors */ @@ -142,10 +165,22 @@ MACRO(ExitTrap, Flags) mov cr8, rax endif - test byte ptr [rbp + KTRAP_FRAME_PreviousMode], 1 - jz dont_swap_back + /* Check if we came from user mode */ + test byte ptr [rbp + KTRAP_FRAME_SegCs], 1 + jz kernel_mode_return + + if (Flags AND TF_CHECKUSERAPC) + /* Load current thread into r10 */ + mov r10, gs:[PcCurrentThread] + cmp byte ptr [r10 + KTHREAD_UserApcPending], 0 + jne KiExitToUserApc + + endif + + /* Swap gs to user mode */ swapgs -dont_swap_back: + +kernel_mode_return: if (Flags AND TF_NONVOLATILES) /* Restore non-volatile registers */ @@ -204,6 +239,6 @@ MACRO(TRAP_ENTRY, Trap, Flags) /* Leave */ ExitTrap Flags - ENDFUNC &Trap + ENDFUNC ENDM From 597c1403707403ce85dbefd51121027554fa77b4 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 11:32:13 +0000 Subject: [PATCH 200/289] [NTOSKRNL/KE/AMD64] - Fix stack alignment in KiSwitchToBootStack - Handle ExceptionFrame == NULL in KeContextToTrapFrame and KeTrapFrameToContext - Implement KiSwapContextInternal - Fix KiSwapContext and KiThreadStartup - Implement dispatching of user mode exceptions including in-paging of module data used by the kernel-debugger - Implement KeInitializeInterrupt, KeConnectInterrupt, KeSynchronizeExecution - Don't zero more than the actual PCR size in KiInitializePcr - Add asm function KiInitializeSegments to initialize the segment selectors to proper values - Initialize system call entrypoints in KiInitializeCpu - Implement KiDpcInterruptHandler, KiIdleLoop, KiInitializeUserApc, KiSwapProcess, KiSystemCallHandler, KiInitializeContextThread, KiSwapContextResume - Implement asm functions KiRetireDpcList, KiInterruptDispatch, KiSystemCallEntry64, KiZwSystemService svn path=/trunk/; revision=55405 --- reactos/ntoskrnl/ke/amd64/boot.S | 4 +- reactos/ntoskrnl/ke/amd64/context.c | 86 +++--- reactos/ntoskrnl/ke/amd64/ctxswitch.S | 273 +++++++++++------- reactos/ntoskrnl/ke/amd64/except.c | 209 +++++++++++++- reactos/ntoskrnl/ke/amd64/interrupt.c | 152 +++++++++- reactos/ntoskrnl/ke/amd64/kiinit.c | 39 ++- reactos/ntoskrnl/ke/amd64/stubs.c | 390 ++++++++++++++++++++++---- reactos/ntoskrnl/ke/amd64/thrdini.c | 189 +++++++------ reactos/ntoskrnl/ke/amd64/trap.S | 334 ++++++++++++++++++++-- 9 files changed, 1354 insertions(+), 322 deletions(-) diff --git a/reactos/ntoskrnl/ke/amd64/boot.S b/reactos/ntoskrnl/ke/amd64/boot.S index 2c77c51781b..99f02bee271 100644 --- a/reactos/ntoskrnl/ke/amd64/boot.S +++ b/reactos/ntoskrnl/ke/amd64/boot.S @@ -31,7 +31,9 @@ PUBLIC KiSwitchToBootStack mov ax, HEX(18) mov ss, ax mov rsp, rcx - sub rsp, HEX(300) // FIXME + // Note: 8 bytes extra to compensate for the missing return address on + // the stack. On function entry the stack is unaligned by 8!! + sub rsp, HEX(308) // FIXME .ENDPROLOG jmp KiSystemStartupBootStack diff --git a/reactos/ntoskrnl/ke/amd64/context.c b/reactos/ntoskrnl/ke/amd64/context.c index 239a697e660..ec20efa4d45 100644 --- a/reactos/ntoskrnl/ke/amd64/context.c +++ b/reactos/ntoskrnl/ke/amd64/context.c @@ -24,12 +24,16 @@ KeContextToTrapFrame(IN PCONTEXT Context, { KIRQL OldIrql; + /* Make sure we have an amd64 context, then remove the flag */ + ASSERT(ContextFlags & CONTEXT_AMD64); + ContextFlags &= ~CONTEXT_AMD64; + /* Do this at APC_LEVEL */ OldIrql = KeGetCurrentIrql(); if (OldIrql < APC_LEVEL) KeRaiseIrql(APC_LEVEL, &OldIrql); /* Handle integer registers */ - if ((Context->ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER) + if (ContextFlags & CONTEXT_INTEGER) { TrapFrame->Rax = Context->Rax; TrapFrame->Rbx = Context->Rbx; @@ -42,15 +46,18 @@ KeContextToTrapFrame(IN PCONTEXT Context, TrapFrame->R9 = Context->R9; TrapFrame->R10 = Context->R10; TrapFrame->R11 = Context->R11; - ExceptionFrame->R12 = Context->R12; - ExceptionFrame->R13 = Context->R13; - ExceptionFrame->R14 = Context->R14; - ExceptionFrame->R15 = Context->R15; + if (ExceptionFrame) + { + ExceptionFrame->R12 = Context->R12; + ExceptionFrame->R13 = Context->R13; + ExceptionFrame->R14 = Context->R14; + ExceptionFrame->R15 = Context->R15; + } } /* Handle floating point registers */ - if (((Context->ContextFlags & CONTEXT_FLOATING_POINT) == - CONTEXT_FLOATING_POINT) && (Context->SegCs & MODE_MASK)) + if ((ContextFlags & CONTEXT_FLOATING_POINT) && + (Context->SegCs & MODE_MASK)) { TrapFrame->Xmm0 = Context->Xmm0; TrapFrame->Xmm1 = Context->Xmm1; @@ -58,20 +65,23 @@ KeContextToTrapFrame(IN PCONTEXT Context, TrapFrame->Xmm3 = Context->Xmm3; TrapFrame->Xmm4 = Context->Xmm4; TrapFrame->Xmm5 = Context->Xmm5; - ExceptionFrame->Xmm6 = Context->Xmm6; - ExceptionFrame->Xmm7 = Context->Xmm7; - ExceptionFrame->Xmm8 = Context->Xmm8; - ExceptionFrame->Xmm9 = Context->Xmm9; - ExceptionFrame->Xmm10 = Context->Xmm10; - ExceptionFrame->Xmm11 = Context->Xmm11; - ExceptionFrame->Xmm12 = Context->Xmm12; - ExceptionFrame->Xmm13 = Context->Xmm13; - ExceptionFrame->Xmm14 = Context->Xmm14; - ExceptionFrame->Xmm15 = Context->Xmm15; + if (ExceptionFrame) + { + ExceptionFrame->Xmm6 = Context->Xmm6; + ExceptionFrame->Xmm7 = Context->Xmm7; + ExceptionFrame->Xmm8 = Context->Xmm8; + ExceptionFrame->Xmm9 = Context->Xmm9; + ExceptionFrame->Xmm10 = Context->Xmm10; + ExceptionFrame->Xmm11 = Context->Xmm11; + ExceptionFrame->Xmm12 = Context->Xmm12; + ExceptionFrame->Xmm13 = Context->Xmm13; + ExceptionFrame->Xmm14 = Context->Xmm14; + ExceptionFrame->Xmm15 = Context->Xmm15; + } } /* Handle control registers */ - if ((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL) + if (ContextFlags & CONTEXT_CONTROL) { /* Check if this was a Kernel Trap */ if (Context->SegCs == KGDT64_R0_CODE) @@ -94,7 +104,7 @@ KeContextToTrapFrame(IN PCONTEXT Context, } /* Handle segment selectors */ - if ((Context->ContextFlags & CONTEXT_SEGMENTS) == CONTEXT_SEGMENTS) + if (ContextFlags & CONTEXT_SEGMENTS) { /* Check if this was a Kernel Trap */ if (Context->SegCs == KGDT64_R0_CODE) @@ -116,8 +126,7 @@ KeContextToTrapFrame(IN PCONTEXT Context, } /* Handle debug registers */ - if ((Context->ContextFlags & CONTEXT_DEBUG_REGISTERS) == - CONTEXT_DEBUG_REGISTERS) + if (ContextFlags & CONTEXT_DEBUG_REGISTERS) { /* Copy the debug registers */ TrapFrame->Dr0 = Context->Dr0; @@ -158,10 +167,14 @@ KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, Context->R9 = TrapFrame->R9; Context->R10 = TrapFrame->R10; Context->R11 = TrapFrame->R11; - Context->R12 = ExceptionFrame->R12; - Context->R13 = ExceptionFrame->R13; - Context->R14 = ExceptionFrame->R14; - Context->R15 = ExceptionFrame->R15; + + if (ExceptionFrame) + { + Context->R12 = ExceptionFrame->R12; + Context->R13 = ExceptionFrame->R13; + Context->R14 = ExceptionFrame->R14; + Context->R15 = ExceptionFrame->R15; + } } /* Handle floating point registers */ @@ -174,16 +187,19 @@ KeTrapFrameToContext(IN PKTRAP_FRAME TrapFrame, Context->Xmm3 = TrapFrame->Xmm3; Context->Xmm4 = TrapFrame->Xmm4; Context->Xmm5 = TrapFrame->Xmm5; - Context->Xmm6 = ExceptionFrame->Xmm6; - Context->Xmm7 = ExceptionFrame->Xmm7; - Context->Xmm8 = ExceptionFrame->Xmm8; - Context->Xmm9 = ExceptionFrame->Xmm9; - Context->Xmm10 = ExceptionFrame->Xmm10; - Context->Xmm11 = ExceptionFrame->Xmm11; - Context->Xmm12 = ExceptionFrame->Xmm12; - Context->Xmm13 = ExceptionFrame->Xmm13; - Context->Xmm14 = ExceptionFrame->Xmm14; - Context->Xmm15 = ExceptionFrame->Xmm15; + if (ExceptionFrame) + { + Context->Xmm6 = ExceptionFrame->Xmm6; + Context->Xmm7 = ExceptionFrame->Xmm7; + Context->Xmm8 = ExceptionFrame->Xmm8; + Context->Xmm9 = ExceptionFrame->Xmm9; + Context->Xmm10 = ExceptionFrame->Xmm10; + Context->Xmm11 = ExceptionFrame->Xmm11; + Context->Xmm12 = ExceptionFrame->Xmm12; + Context->Xmm13 = ExceptionFrame->Xmm13; + Context->Xmm14 = ExceptionFrame->Xmm14; + Context->Xmm15 = ExceptionFrame->Xmm15; + } } /* Handle control registers */ diff --git a/reactos/ntoskrnl/ke/amd64/ctxswitch.S b/reactos/ntoskrnl/ke/amd64/ctxswitch.S index b0c52c233bc..b91f314ced9 100644 --- a/reactos/ntoskrnl/ke/amd64/ctxswitch.S +++ b/reactos/ntoskrnl/ke/amd64/ctxswitch.S @@ -3,7 +3,7 @@ * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/amd64/ctxswitch.S * PURPOSE: Thread Context Switching - * + * * PROGRAMMER: Timo kreuzer (timo.kreuzer@reactos.org) */ @@ -12,46 +12,66 @@ #include #include +EXTERN KiSwapContextResume:PROC + /* FUNCTIONS ****************************************************************/ .code64 -/*++ - * KiThreadStartup +/*! + * \name KiThreadStartup * + * \brief * The KiThreadStartup routine is the beginning of any thread. * - * Params: - * SystemRoutine - Pointer to the System Startup Routine. Either - * PspUserThreadStartup or PspSystemThreadStartup + * VOID + * KiThreadStartup( + * IN PKSTART_ROUTINE StartRoutine, + * IN PVOID StartContext, + * IN PVOID P3, + * IN PVOID P4, + * IN PVOID SystemRoutine); * - * StartRoutine - For Kernel Threads only, specifies the starting execution - * point of the new thread. + * \param StartRoutine + * For Kernel Threads only, specifies the starting execution point + * of the new thread. * - * StartContext - For Kernel Threads only, specifies a pointer to variable - * context data to be sent to the StartRoutine above. + * \param StartContext + * For Kernel Threads only, specifies a pointer to variable + * context data to be sent to the StartRoutine above. * - * UserThread - Indicates whether or not this is a user thread. This tells - * us if the thread has a context or not. + * \param P3, P4 - not used atm * - * TrapFrame - Pointer to the KTHREAD to which the caller wishes to - * switch from. + * \param SystemRoutine + * Pointer to the System Startup Routine. + * Either PspUserThreadStartup or PspSystemThreadStartup * - * Returns: + * \return * Should never return for a system thread. Returns through the System Call * Exit Dispatcher for a user thread. * - * Remarks: + * \remarks * If a return from a system thread is detected, a bug check will occur. * *--*/ PUBLIC KiThreadStartup -KiThreadStartup: - - /* - * Clear all the non-volatile registers, so the thread won't be tempted to - * expect any static data (like some badly coded usermode/win9x apps do) +.PROC KiThreadStartup + /* KSTART_FRAME is already on the stack when we enter here. + * The virtual prolog looks like this: + * sub rsp, 5 * 8 + * mov [rsp + SfP1Home], rcx + * mov [rsp + SfP2Home], rdx + * mov [rsp + SfP3Home], r8 + * mov [rsp + SfP4Home], r9 */ + + /* Terminate the unwind chain, by setting rbp as frame pointer, + which contains 0 */ + .setframe rbp, 0 + .endprolog + + /* Clear all the non-volatile registers, so the thread won't be tempted to + * expect any static data (like some badly coded usermode/win9x apps do) */ xor rbx, rbx xor rsi, rsi xor rdi, rdi @@ -67,73 +87,107 @@ KiThreadStartup: mov rax, APC_LEVEL mov cr8, rax - /* - * Call the System Routine which is right on our stack now. - * After we pop the pointer, the Start Routine/Context is on the - * stack, we pop it as parameters to the System Routine into rcx - */ - pop rax - pop rcx - call rax + /* We have the KSTART_FRAME on the stack, P1Home and P2Home are preloaded + * with the parameters for the system routine. The address of the system + * routine is stored in P4Home. */ + mov rcx, [rsp + SfP1Home] /* StartRoutine */ + mov rdx, [rsp + SfP2Home] /* StartContext */ + mov r8, [rsp + SfP3Home] /* ? */ + call qword ptr [rsp + SfP4Home] /* SystemRoutine */ - /* The thread returned... was it a user-thread? */ - pop rcx + /* The thread returned. If it was a user-thread, we have a return address + and all is well, otherwise this is very bad. */ + mov rcx, [rsp + SfReturn] or rcx, rcx - jz BadThread - - /* Yes it was, set our trapframe for the System Call Exit Dispatcher */ - mov ebp, esp - - /* Exit back to user-mode */ -// jmp _KiServiceExit2 -UNIMPLEMENTED KiThreadStartup_KiServiceExit2 - -BadThread: + jnz .leave /* A system thread returned...this is very bad! */ int 3 +.leave: + /* It was a user thread, set our trapframe for the System Call Exit Dispatcher */ + lea rcx, [rsp + 6 * 8 + KEXCEPTION_FRAME_LENGTH] -/*++ - * KiSwapContextInternal + /* Return to the trap exit code */ + add rsp, 5 * 8 + ret +.ENDP + +/*! + * \name KiSwapContextInternal * + * \brief * The KiSwapContextInternal routine switches context to another thread. * - * Params: - * ESI - Pointer to the KTHREAD to which the caller wishes to - * switch to. - * EDI - Pointer to the KTHREAD to which the caller wishes to - * switch from. + * \param rcx + * Pointer to the KTHREAD to which the caller wishes to switch to. * - * Returns: + * \param rdx + * Pointer to the KTHREAD to which the caller wishes to switch from. + * + * \param r8b + * APC bypass + * + * \return * None. * - * Remarks: - * Absolutely all registers except ESP can be trampled here for maximum code flexibility. + * \remarks + * ... * *--*/ PUBLIC KiSwapContextInternal -KiSwapContextInternal: - UNIMPLEMENTED KiSwapContextInternal +.PROC KiSwapContextInternal + + push rbp + .pushreg rbp + sub rsp, 6 * 8 + .allocstack 6 * 8 + .endprolog + + /* Save APC bypass */ + mov [rsp + SwApcBypass], r8b + + /* Save kernel stack of old thread */ + mov [rdx + KTHREAD_KernelStack], rsp + + /* Save new thread in rbp */ + mov rbp, rcx + + //call KiSwapContextSuspend + + /* Load stack of new thread */ + mov rsp, [rbp + KTHREAD_KernelStack] + + /* Reload APC bypass */ + mov r8b, [rsp + SwApcBypass] + + call KiSwapContextResume + + /* Cleanup and return */ + add rsp, 6 * 8 + pop rbp ret +.ENDP -/** + + +/*! * KiSwapContext * * \brief * The KiSwapContext routine switches context to another thread. * * BOOLEAN - * KiSwapContext(PKTHREAD CurrentThread, PKTHREAD TargetThread); + * KiSwapContext(KIRQL WaitIrql, PKTHREAD CurrentThread); * - * \param CurrentThread + * \param WaitIrql + * ... + * + * \param CurrentThread * Pointer to the KTHREAD of the current thread. - * - * \param TargetThread - * Pointer to the KTHREAD to which the caller wishes to switch to. * - * \returns + * \return * The WaitStatus of the Target Thread. * * \remarks @@ -141,59 +195,74 @@ KiSwapContextInternal: * non-volatile registers so that the Internal function can use all of * them. It will also save the old current thread and set the new one. * - * The calling thread does not return after KiSwapContextInternal until + * The calling thread does not return after KiSwapContextInternal until * another thread switches to IT. * *--*/ PUBLIC KiSwapContext -KiSwapContext: +.PROC KiSwapContext - /* Save 10 registers */ - sub rsp, 10 * 8 + /* Allocate a KEXCEPTION_FRAME on the stack (+8 for proper alignment) */ + sub rsp, KEXCEPTION_FRAME_LENGTH + 8 + .allocstack KEXCEPTION_FRAME_LENGTH + 8 - /* Save all the non-volatile ones */ - mov [rsp+72], r15 - mov [rsp+64], r14 - mov [rsp+56], r13 - mov [rsp+48], r12 - mov [rsp+40], r11 - mov [rsp+32], r10 - - mov [rsp+24], rbx - mov [rsp+16], rsi - mov [rsp+8], rdi - mov [rsp+0], rbp - - /* Get the PCR */ - mov rbx, gs:[PcSelf] - - /* Get the current thread */ - mov rdi, rcx - - /* Get the New Thread */ - mov rsi, rdx - - /* Get the wait IRQL */ - movzx ecx, byte ptr [edi+KTHREAD_WAIT_IRQL] + /* save non-volatiles in KEXCEPTION_FRAME */ + mov [rsp + KEXCEPTION_FRAME_Rbp], rbp + .savereg rbp, KEXCEPTION_FRAME_Rbp + mov [rsp + KEXCEPTION_FRAME_Rbx], rbx + .savereg rbx, KEXCEPTION_FRAME_Rbx + mov [rsp + KEXCEPTION_FRAME_Rdi], rdi + .savereg rdi, KEXCEPTION_FRAME_Rdi + mov [rsp + KEXCEPTION_FRAME_Rsi], rsi + .savereg rsi, KEXCEPTION_FRAME_Rsi + mov [rsp + KEXCEPTION_FRAME_R12], r12 + .savereg r12, KEXCEPTION_FRAME_R12 + mov [rsp + KEXCEPTION_FRAME_R13], r13 + .savereg r13, KEXCEPTION_FRAME_R13 + mov [rsp + KEXCEPTION_FRAME_R14], r14 + .savereg r14, KEXCEPTION_FRAME_R14 + mov [rsp + KEXCEPTION_FRAME_R15], r15 + .savereg r15, KEXCEPTION_FRAME_R15 + movdqa [rsp + KEXCEPTION_FRAME_Xmm6], xmm6 + movdqa [rsp + KEXCEPTION_FRAME_Xmm7], xmm7 + movdqa [rsp + KEXCEPTION_FRAME_Xmm8], xmm8 + movdqa [rsp + KEXCEPTION_FRAME_Xmm9], xmm9 + movdqa [rsp + KEXCEPTION_FRAME_Xmm10], xmm10 + movdqa [rsp + KEXCEPTION_FRAME_Xmm11], xmm11 + movdqa [rsp + KEXCEPTION_FRAME_Xmm12], xmm12 + movdqa [rsp + KEXCEPTION_FRAME_Xmm13], xmm13 + movdqa [rsp + KEXCEPTION_FRAME_Xmm14], xmm14 + movdqa [rsp + KEXCEPTION_FRAME_Xmm15], xmm15 + // KEXCEPTION_FRAME_MxCsr + .endprolog /* Do the swap with the registers correctly setup */ + mov rcx, gs:[PcCurrentThread] /* Pointer to the new thread */ call KiSwapContextInternal - /* Restore the registers */ - mov rbp, [rsp+0] - mov rdi, [rsp+8] - mov rsi, [rsp+16] - mov rbx, [rsp+24] + /* restore non-volatile registers */ + mov rbp, [rsp + KEXCEPTION_FRAME_Rbp] + mov rbx, [rsp + KEXCEPTION_FRAME_Rbx] + mov rdi, [rsp + KEXCEPTION_FRAME_Rdi] + mov rsi, [rsp + KEXCEPTION_FRAME_Rsi] + mov r12, [rsp + KEXCEPTION_FRAME_R12] + mov r13, [rsp + KEXCEPTION_FRAME_R13] + mov r14, [rsp + KEXCEPTION_FRAME_R14] + mov r15, [rsp + KEXCEPTION_FRAME_R15] + movdqa xmm6, [rsp + KEXCEPTION_FRAME_Xmm6] + movdqa xmm7, [rsp + KEXCEPTION_FRAME_Xmm7] + movdqa xmm8, [rsp + KEXCEPTION_FRAME_Xmm8] + movdqa xmm9, [rsp + KEXCEPTION_FRAME_Xmm9] + movdqa xmm10, [rsp + KEXCEPTION_FRAME_Xmm10] + movdqa xmm11, [rsp + KEXCEPTION_FRAME_Xmm11] + movdqa xmm12, [rsp + KEXCEPTION_FRAME_Xmm12] + movdqa xmm13, [rsp + KEXCEPTION_FRAME_Xmm13] + movdqa xmm14, [rsp + KEXCEPTION_FRAME_Xmm14] + movdqa xmm15, [rsp + KEXCEPTION_FRAME_Xmm15] - mov r10, [rsp+32] - mov r11, [rsp+40] - mov r12, [rsp+48] - mov r13, [rsp+56] - mov r14, [rsp+64] - mov r15, [rsp+72] - - /* Clean stack */ - add esp, 10 * 8 + /* Clean stack and return */ + add rsp, KEXCEPTION_FRAME_LENGTH + 8 ret +.ENDP END diff --git a/reactos/ntoskrnl/ke/amd64/except.c b/reactos/ntoskrnl/ke/amd64/except.c index 8925d563168..2cdda75b9ba 100644 --- a/reactos/ntoskrnl/ke/amd64/except.c +++ b/reactos/ntoskrnl/ke/amd64/except.c @@ -13,7 +13,7 @@ #define NDEBUG #include -extern ULONG64 InterruptDispatchTable[256]; +extern KI_INTERRUPT_DISPATCH_ENTRY KiUnexpectedRange[256]; /* GLOBALS *******************************************************************/ @@ -74,7 +74,7 @@ KeInitExceptions(VOID) } else { - Offset = (ULONG64)&InterruptDispatchTable[i]; + Offset = (ULONG64)&KiUnexpectedRange[i]._Op_push; KiIdt[i].Dpl = 0; KiIdt[i].IstIndex = 0; } @@ -92,6 +92,146 @@ KeInitExceptions(VOID) __lidt(&KiIdtDescriptor.Limit); } +static +VOID +KiDispatchExceptionToUser( + IN PKTRAP_FRAME TrapFrame, + IN PCONTEXT Context, + IN PEXCEPTION_RECORD ExceptionRecord) +{ + EXCEPTION_RECORD LocalExceptRecord; + ULONG Size; + ULONG64 UserRsp; + PCONTEXT UserContext; + PEXCEPTION_RECORD UserExceptionRecord; + + /* Make sure we have a valid SS */ + if (TrapFrame->SegSs != (KGDT64_R3_DATA | RPL_MASK)) + { + /* Raise an access violation instead */ + LocalExceptRecord.ExceptionCode = STATUS_ACCESS_VIOLATION; + LocalExceptRecord.ExceptionFlags = 0; + LocalExceptRecord.NumberParameters = 0; + ExceptionRecord = &LocalExceptRecord; + } + + /* Calculate the size of the exception record */ + Size = FIELD_OFFSET(EXCEPTION_RECORD, ExceptionInformation) + + ExceptionRecord->NumberParameters * sizeof(ULONG64); + + /* Get new stack pointer and align it to 16 bytes */ + UserRsp = (Context->Rsp - Size - sizeof(CONTEXT)) & ~15; + + /* Get pointers to the usermode context and exception record */ + UserContext = (PVOID)UserRsp; + UserExceptionRecord = (PVOID)(UserRsp + sizeof(CONTEXT)); + + /* Set up the user-stack */ + _SEH2_TRY + { + /* Probe stack and copy Context */ + ProbeForWrite(UserContext, sizeof(CONTEXT), sizeof(ULONG64)); + *UserContext = *Context; + + /* Probe stack and copy exception record */ + ProbeForWrite(UserExceptionRecord, Size, sizeof(ULONG64)); + *UserExceptionRecord = *ExceptionRecord; + } + _SEH2_EXCEPT((LocalExceptRecord = *_SEH2_GetExceptionInformation()->ExceptionRecord), + EXCEPTION_EXECUTE_HANDLER) + { + // FIXNE: handle stack overflow + + /* Nothing we can do here */ + _SEH2_YIELD(return); + } + _SEH2_END; + + /* Now set the two params for the user-mode dispatcher */ + TrapFrame->Rcx = (ULONG64)UserContext; + TrapFrame->Rdx = (ULONG64)UserExceptionRecord; + + /* Set new Stack Pointer */ + TrapFrame->Rsp = UserRsp; + + /* Force correct segments */ + TrapFrame->SegCs = KGDT64_R3_CODE | RPL_MASK; + TrapFrame->SegDs = KGDT64_R3_DATA | RPL_MASK; + TrapFrame->SegEs = KGDT64_R3_DATA | RPL_MASK; + TrapFrame->SegFs = KGDT64_R3_CMTEB | RPL_MASK; + TrapFrame->SegGs = KGDT64_R3_DATA | RPL_MASK; + TrapFrame->SegSs = KGDT64_R3_DATA | RPL_MASK; + + /* Set RIP to the User-mode Dispatcher */ + TrapFrame->Rip = (ULONG64)KeUserExceptionDispatcher; + + /* Exit to usermode */ + KiServiceExit2(TrapFrame); +} + +static +VOID +KiPageInDirectory(PVOID ImageBase, USHORT Directory) +{ + volatile CHAR *Pointer; + ULONG Size; + + /* Get a pointer to the debug directory */ + Pointer = RtlImageDirectoryEntryToData(ImageBase, 1, Directory, &Size); + if (!Pointer) return; + + /* Loop all pages */ + while ((LONG)Size > 0) + { + /* Touch it, to page it in */ + (void)*Pointer; + Pointer += PAGE_SIZE; + Size -= PAGE_SIZE; + } +} + +VOID +KiPrepareUserDebugData(void) +{ + PLDR_DATA_TABLE_ENTRY LdrEntry; + PPEB_LDR_DATA PebLdr; + PLIST_ENTRY ListEntry; + PTEB Teb; + + /* Get the Teb for this process */ + Teb = KeGetCurrentThread()->Teb; + if (!Teb) return; + + _SEH2_TRY + { + /* Get a pointer to the loader data */ + PebLdr = Teb->ProcessEnvironmentBlock->Ldr; + if (!PebLdr) _SEH2_YIELD(return); + + /* Now loop all entries in the module list */ + for (ListEntry = PebLdr->InLoadOrderModuleList.Flink; + ListEntry != &PebLdr->InLoadOrderModuleList; + ListEntry = ListEntry->Flink) + { + /* Get the loader entry */ + LdrEntry = CONTAINING_RECORD(ListEntry, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); + + KiPageInDirectory((PVOID)LdrEntry->DllBase, + IMAGE_DIRECTORY_ENTRY_DEBUG); + + KiPageInDirectory((PVOID)LdrEntry->DllBase, + IMAGE_DIRECTORY_ENTRY_EXCEPTION); + } + + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + } + _SEH2_END +} + VOID NTAPI KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, @@ -102,9 +242,6 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, { CONTEXT Context; -// FrLdrDbgPrint("KiDispatchException(%p, %p, %p, %d, %d)\n", -// ExceptionRecord, ExceptionFrame, TrapFrame, PreviousMode, FirstChance); - /* Increase number of Exception Dispatches */ KeGetCurrentPrcb()->KeExceptionDispatchCount++; @@ -179,8 +316,66 @@ KiDispatchException(IN PEXCEPTION_RECORD ExceptionRecord, } else { - /* FIXME: user-mode exception handling unimplemented */ - ASSERT(FALSE); + /* User mode exception, was it first-chance? */ + if (FirstChance) + { + /* + * Break into the kernel debugger unless a user mode debugger + * is present or user mode exceptions are ignored, except if this + * is a debug service which we must always pass to KD + */ + if ((!(PsGetCurrentProcess()->DebugPort) && + !(KdIgnoreUmExceptions)) || + (KdIsThisAKdTrap(ExceptionRecord, &Context, PreviousMode))) + { + /* Make sure the debugger can access debug directories */ + KiPrepareUserDebugData(); + + /* Call the kernel debugger */ + if (KiDebugRoutine(TrapFrame, + ExceptionFrame, + ExceptionRecord, + &Context, + PreviousMode, + FALSE)) + { + /* Exception was handled */ + goto Handled; + } + } + + /* Forward exception to user mode debugger */ + if (DbgkForwardException(ExceptionRecord, TRUE, FALSE)) return; + + //KiDispatchExceptionToUser() + __debugbreak(); + } + + /* Try second chance */ + if (DbgkForwardException(ExceptionRecord, TRUE, TRUE)) + { + /* Handled, get out */ + return; + } + else if (DbgkForwardException(ExceptionRecord, FALSE, TRUE)) + { + /* Handled, get out */ + return; + } + + /* 3rd strike, kill the process */ + DPRINT1("Kill %.16s, ExceptionCode: %lx, ExceptionAddress: %lx, BaseAddress: %lx\n", + PsGetCurrentProcess()->ImageFileName, + ExceptionRecord->ExceptionCode, + ExceptionRecord->ExceptionAddress, + PsGetCurrentProcess()->SectionBaseAddress); + + ZwTerminateProcess(NtCurrentProcess(), ExceptionRecord->ExceptionCode); + KeBugCheckEx(KMODE_EXCEPTION_NOT_HANDLED, + ExceptionRecord->ExceptionCode, + (ULONG_PTR)ExceptionRecord->ExceptionAddress, + (ULONG_PTR)TrapFrame, + 0); } Handled: diff --git a/reactos/ntoskrnl/ke/amd64/interrupt.c b/reactos/ntoskrnl/ke/amd64/interrupt.c index a38dcf18881..0d5c34c4231 100644 --- a/reactos/ntoskrnl/ke/amd64/interrupt.c +++ b/reactos/ntoskrnl/ke/amd64/interrupt.c @@ -6,7 +6,8 @@ * for the purpopses of connecting, disconnecting and setting * up ISRs for drivers. The backend behind the Io* Interrupt * routines. - * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@web.de) + * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org) + * Alex Ionescu (alex.ionescu@reactos.org) */ /* INCLUDES *****************************************************************/ @@ -15,30 +16,151 @@ #define NDEBUG #include +extern UCHAR KiInterruptDispatchTemplate[16]; +extern UCHAR KiUnexpectedRange[]; +extern UCHAR KiUnexpectedRangeEnd[]; +void KiInterruptDispatch(void); + + /* FUNCTIONS ****************************************************************/ +VOID +NTAPI +KeInitializeInterrupt( + IN PKINTERRUPT Interrupt, + IN PKSERVICE_ROUTINE ServiceRoutine, + IN PVOID ServiceContext, + IN PKSPIN_LOCK SpinLock, + IN ULONG Vector, + IN KIRQL Irql, + IN KIRQL SynchronizeIrql, + IN KINTERRUPT_MODE InterruptMode, + IN BOOLEAN ShareVector, + IN CHAR ProcessorNumber, + IN BOOLEAN FloatingSave) +{ + + /* Initialize the header */ + Interrupt->Type = InterruptObject; + Interrupt->Size = sizeof(KINTERRUPT); + + /* If no Spinlock is given, use the internal */ + if (!SpinLock) SpinLock = &Interrupt->SpinLock; + KeInitializeSpinLock(&Interrupt->SpinLock); + + /* Set the given parameters */ + Interrupt->ServiceRoutine = ServiceRoutine; + Interrupt->ServiceContext = ServiceContext; + Interrupt->ActualLock = SpinLock; + Interrupt->Vector = Vector; + Interrupt->Irql = Irql; + Interrupt->SynchronizeIrql = SynchronizeIrql; + Interrupt->Mode = InterruptMode; + Interrupt->ShareVector = ShareVector; + Interrupt->Number = ProcessorNumber; + Interrupt->FloatingSave = FloatingSave; + + /* Set initial values */ + Interrupt->TickCount = 0; + Interrupt->Connected = FALSE; + Interrupt->ServiceCount = 0; + Interrupt->DispatchCount = 0; + Interrupt->TrapFrame = NULL; + Interrupt->Reserved = 0; + + /* Copy the dispatch code (its location independent, no need to patch it) */ + RtlCopyMemory(Interrupt->DispatchCode, + KiInterruptDispatchTemplate, + sizeof(Interrupt->DispatchCode)); + + Interrupt->DispatchAddress = 0; +} + +BOOLEAN +NTAPI +KeConnectInterrupt(IN PKINTERRUPT Interrupt) +{ + PVOID CurrentHandler; + + ASSERT(Interrupt->Vector <= MAXIMUM_IDTVECTOR); + ASSERT(Interrupt->Number < KeNumberProcessors); + ASSERT(Interrupt->Irql <= HIGH_LEVEL); + + /* Check if its already connected */ + if (Interrupt->Connected) return TRUE; + + /* Query the current handler */ + CurrentHandler = KeQueryInterruptHandler(Interrupt->Vector); + + /* Check if the vector is already unused */ + if ((CurrentHandler >= (PVOID)KiUnexpectedRange) && + (CurrentHandler <= (PVOID)KiUnexpectedRangeEnd)) + { + /* Initialize the list for chained interrupts */ + InitializeListHead(&Interrupt->InterruptListEntry); + + /* Set normal dispatch address */ + Interrupt->DispatchAddress = KiInterruptDispatch; + + /* Set the new handler */ + KeRegisterInterruptHandler(Interrupt->Vector, + Interrupt->DispatchCode); + + if (!HalEnableSystemInterrupt(Interrupt->Vector, + Interrupt->Irql, + Interrupt->Mode)) + { + /* Didn't work, restore old handler */ + DPRINT1("HalEnableSystemInterrupt failed\n"); + KeRegisterInterruptHandler(Interrupt->Vector, CurrentHandler); + return FALSE; + } + + /* Mark as connected */ + Interrupt->Connected = TRUE; + } + else + { + // later + __debugbreak(); + } + + return TRUE; +} + BOOLEAN NTAPI KeDisconnectInterrupt(IN PKINTERRUPT Interrupt) { UNIMPLEMENTED; + __debugbreak(); return FALSE; } -VOID +BOOLEAN NTAPI -KeInitializeInterrupt(IN PKINTERRUPT Interrupt, - IN PKSERVICE_ROUTINE ServiceRoutine, - IN PVOID ServiceContext, - IN PKSPIN_LOCK SpinLock, - IN ULONG Vector, - IN KIRQL Irql, - IN KIRQL SynchronizeIrql, - IN KINTERRUPT_MODE InterruptMode, - IN BOOLEAN ShareVector, - IN CHAR ProcessorNumber, - IN BOOLEAN FloatingSave) +KeSynchronizeExecution(IN OUT PKINTERRUPT Interrupt, + IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, + IN PVOID SynchronizeContext OPTIONAL) { - UNIMPLEMENTED; -} + BOOLEAN Success; + KIRQL OldIrql; + /* Raise IRQL */ + OldIrql = KfRaiseIrql(Interrupt->SynchronizeIrql); + + /* Acquire interrupt spinlock */ + KeAcquireSpinLockAtDpcLevel(Interrupt->ActualLock); + + /* Call the routine */ + Success = SynchronizeRoutine(SynchronizeContext); + + /* Release lock */ + KeReleaseSpinLockFromDpcLevel(Interrupt->ActualLock); + + /* Lower IRQL */ + KeLowerIrql(OldIrql); + + /* Return status */ + return Success; +} diff --git a/reactos/ntoskrnl/ke/amd64/kiinit.c b/reactos/ntoskrnl/ke/amd64/kiinit.c index a10fd6509c5..76cb3711f61 100644 --- a/reactos/ntoskrnl/ke/amd64/kiinit.c +++ b/reactos/ntoskrnl/ke/amd64/kiinit.c @@ -33,6 +33,10 @@ UCHAR DECLSPEC_ALIGN(16) KiDoubleFaultStackData[KERNEL_STACK_SIZE] = {0}; ULONG_PTR P0BootStack = (ULONG_PTR)&P0BootStackData[KERNEL_STACK_SIZE]; ULONG_PTR KiDoubleFaultStack = (ULONG_PTR)&KiDoubleFaultStackData[KERNEL_STACK_SIZE]; +void KiInitializeSegments(); +void KiSystemCallEntry64(); +void KiSystemCallEntry32(); + /* FUNCTIONS *****************************************************************/ VOID @@ -91,7 +95,7 @@ KiInitializePcr(IN PKIPCR Pcr, USHORT Tr = 0; /* Zero out the PCR */ - RtlZeroMemory(Pcr, PAGE_SIZE); + RtlZeroMemory(Pcr, sizeof(KIPCR)); /* Set pointers to ourselves */ Pcr->Self = (PKPCR)Pcr; @@ -152,18 +156,21 @@ KiInitializePcr(IN PKIPCR Pcr, /* Start us out at PASSIVE_LEVEL */ Pcr->Irql = PASSIVE_LEVEL; KeSetCurrentIrql(PASSIVE_LEVEL); - - /* Set GS base */ - __writemsr(X86_MSR_GSBASE, (ULONG64)Pcr); - __writemsr(X86_MSR_KERNEL_GSBASE, (ULONG64)Pcr); } VOID NTAPI -KiInitializeCpu(PKPRCB Prcb) +KiInitializeCpu(PKIPCR Pcr) { ULONG FeatureBits; + /* Initialize gs */ + KiInitializeSegments(); + + /* Set GS base */ + __writemsr(MSR_GS_BASE, (ULONG64)Pcr); + __writemsr(MSR_GS_SWAP, (ULONG64)Pcr); + /* Detect and set the CPU Type */ KiSetProcessorType(); @@ -184,7 +191,7 @@ KiInitializeCpu(PKPRCB Prcb) FeatureBits |= KF_NX_ENABLED; /* Save feature bits */ - Prcb->FeatureBits = FeatureBits; + Pcr->Prcb.FeatureBits = FeatureBits; /* Enable fx save restore support */ __writecr4(__readcr4() | CR4_FXSR); @@ -203,6 +210,19 @@ KiInitializeCpu(PKPRCB Prcb) /* LDT is unused */ __lldt(0); + + /* Set the systemcall entry points */ + __writemsr(MSR_LSTAR, (ULONG64)KiSystemCallEntry64); + __writemsr(MSR_CSTAR, (ULONG64)KiSystemCallEntry32); + + __writemsr(MSR_STAR, ((ULONG64)KGDT64_R0_CODE << 32) | + ((ULONG64)(KGDT64_R3_CMCODE|RPL_MASK) << 48)); + + /* Set the flags to be cleared when doing a syscall */ + __writemsr(MSR_SYSCALL_MASK, EFLAGS_IF_MASK | EFLAGS_TF | EFLAGS_DF); + + /* Enable syscall instruction */ + __writemsr(MSR_EFER, __readmsr(MSR_EFER) | MSR_SCE); } VOID @@ -339,7 +359,7 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* HACK */ FrLdrDbgPrint = LoaderBlock->u.I386.CommonDataArea; - FrLdrDbgPrint("Hello from KiSystemStartup!!!\n"); + //FrLdrDbgPrint("Hello from KiSystemStartup!!!\n"); /* Save the loader block */ KeLoaderBlock = LoaderBlock; @@ -350,7 +370,6 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* LoaderBlock initialization for Cpu 0 */ if (Cpu == 0) { - FrLdrDbgPrint("LoaderBlock->Prcb=%p\n", LoaderBlock->Prcb); /* Set the initial stack, idle thread and process */ LoaderBlock->KernelStack = (ULONG_PTR)P0BootStack; LoaderBlock->Thread = (ULONG_PTR)&KiInitialThread; @@ -378,7 +397,7 @@ KiSystemStartup(IN PLOADER_PARAMETER_BLOCK LoaderBlock) KiInitializePcr(Pcr, Cpu, InitialThread, (PVOID)KiDoubleFaultStack); /* Initialize the CPU features */ - KiInitializeCpu(&Pcr->Prcb); + KiInitializeCpu(Pcr); /* Initial setup for the boot CPU */ if (Cpu == 0) diff --git a/reactos/ntoskrnl/ke/amd64/stubs.c b/reactos/ntoskrnl/ke/amd64/stubs.c index ae21d7411e9..34d637db985 100644 --- a/reactos/ntoskrnl/ke/amd64/stubs.c +++ b/reactos/ntoskrnl/ke/amd64/stubs.c @@ -12,14 +12,71 @@ #define NDEBUG #include +VOID +KiRetireDpcListInDpcStack( + PKPRCB Prcb, + PVOID DpcStack); + VOID NTAPI -KiDispatchInterrupt(VOID) +KiDpcInterruptHandler(VOID) { - UNIMPLEMENTED; - __debugbreak(); + PKPRCB Prcb = KeGetCurrentPrcb(); + PKTHREAD NewThread, OldThread; + KIRQL OldIrql; + + /* Raise to DISPATCH_LEVEL */ + OldIrql = KfRaiseIrql(DISPATCH_LEVEL); + + /* Send an EOI */ + KiSendEOI(); + + /* Check for pending timers, pending DPCs, or pending ready threads */ + if ((Prcb->DpcData[0].DpcQueueDepth) || + (Prcb->TimerRequest) || + (Prcb->DeferredReadyListHead.Next)) + { + /* Retire DPCs while under the DPC stack */ + KiRetireDpcListInDpcStack(Prcb, Prcb->DpcStack); + } + + /* Enable interrupts */ + _enable(); + + /* Check for quantum end */ + if (Prcb->QuantumEnd) + { + /* Handle quantum end */ + Prcb->QuantumEnd = FALSE; + KiQuantumEnd(); + } + else if (Prcb->NextThread) + { + /* Capture current thread data */ + OldThread = Prcb->CurrentThread; + NewThread = Prcb->NextThread; + + /* Set new thread data */ + Prcb->NextThread = NULL; + Prcb->CurrentThread = NewThread; + + /* The thread is now running */ + NewThread->State = Running; + OldThread->WaitReason = WrDispatchInt; + + /* Make the old thread ready */ + KxQueueReadyThread(OldThread, Prcb); + + /* Swap to the new thread */ + KiSwapContext(APC_LEVEL, OldThread); + } + + /* Go back to old irql and disable interrupts */ + KeLowerIrql(OldIrql); + _disable(); } + VOID FASTCALL KeZeroPages(IN PVOID Address, @@ -29,52 +86,13 @@ KeZeroPages(IN PVOID Address, RtlZeroMemory(Address, Size); } -VOID -FASTCALL -DECLSPEC_NORETURN -KiServiceExit(IN PKTRAP_FRAME TrapFrame, - IN NTSTATUS Status) -{ - UNIMPLEMENTED; - __debugbreak(); -} - -VOID -FASTCALL -DECLSPEC_NORETURN -KiServiceExit2(IN PKTRAP_FRAME TrapFrame) -{ - UNIMPLEMENTED; - __debugbreak(); -} - -BOOLEAN -NTAPI -KeConnectInterrupt(IN PKINTERRUPT Interrupt) -{ - UNIMPLEMENTED; - __debugbreak(); - return FALSE; -} - PVOID NTAPI KeSwitchKernelStack(PVOID StackBase, PVOID StackLimit) -{ - UNIMPLEMENTED; - return NULL; -} - -BOOLEAN -NTAPI -KeSynchronizeExecution( - IN OUT PKINTERRUPT Interrupt, - IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine, - IN PVOID SynchronizeContext) { UNIMPLEMENTED; __debugbreak(); - return FALSE; + return NULL; } NTSTATUS @@ -91,12 +109,101 @@ KeUserModeCallback(IN ULONG RoutineIndex, } VOID -KiIdleLoop() +FASTCALL +KiIdleLoop(VOID) { - UNIMPLEMENTED; - for(;;); + PKPRCB Prcb = KeGetCurrentPrcb(); + PKTHREAD OldThread, NewThread; + + /* Initialize the idle loop: disable interrupts */ + _enable(); + YieldProcessor(); + YieldProcessor(); + _disable(); + + /* Now loop forever */ + while (TRUE) + { + /* Check for pending timers, pending DPCs, or pending ready threads */ + if ((Prcb->DpcData[0].DpcQueueDepth) || + (Prcb->TimerRequest) || + (Prcb->DeferredReadyListHead.Next)) + { + /* Quiesce the DPC software interrupt */ + HalClearSoftwareInterrupt(DISPATCH_LEVEL); + + /* Handle it */ + KiRetireDpcList(Prcb); + } + + /* Check if a new thread is scheduled for execution */ + if (Prcb->NextThread) + { + /* Enable interupts */ + _enable(); + + /* Capture current thread data */ + OldThread = Prcb->CurrentThread; + NewThread = Prcb->NextThread; + + /* Set new thread data */ + Prcb->NextThread = NULL; + Prcb->CurrentThread = NewThread; + + /* The thread is now running */ + NewThread->State = Running; + + /* Do the swap at SYNCH_LEVEL */ + KfRaiseIrql(SYNCH_LEVEL); + + /* Switch away from the idle thread */ + KiSwapContext(APC_LEVEL, OldThread); + + /* Go back to DISPATCH_LEVEL */ + KeLowerIrql(DISPATCH_LEVEL); + + /* We are back in the idle thread -- disable interrupts again */ + _enable(); + YieldProcessor(); + YieldProcessor(); + _disable(); + } + else + { + /* Continue staying idle. Note the HAL returns with interrupts on */ + Prcb->PowerState.IdleFunction(&Prcb->PowerState); + } + } } + +/*! \name KiInitializeUserApc + * + * \brief + * Prepares the current trap frame (which must have come from user mode) + * with the ntdll.KiUserApcDispatcher entrypoint, copying a CONTEXT + * record with the context from the old trap frame to the threads user + * mode stack. + * + * \param ExceptionFrame + * \param TrapFrame + * \param NormalRoutine + * \param NormalContext + * \param SystemArgument1 + * \param SystemArgument2 + * + * \remarks + * This function is called from KiDeliverApc, when the trap frame came + * from user mode. This happens before a systemcall or interrupt exits back + * to usermode or when a thread is started from PspUserThreadstartup. + * The trap exit code will then leave to KiUserApcDispatcher which in turn + * calls the NormalRoutine, passing NormalContext, SystemArgument1 and + * SystemArgument2 as parameters. When that function returns, it calls + * NtContinue to return back to the kernel, where the old context that was + * saved on the usermode stack is restored and execution is transferred + * back to usermode, where the original trap originated from. + * + *--*/ VOID NTAPI KiInitializeUserApc(IN PKEXCEPTION_FRAME ExceptionFrame, @@ -106,8 +213,69 @@ KiInitializeUserApc(IN PKEXCEPTION_FRAME ExceptionFrame, IN PVOID SystemArgument1, IN PVOID SystemArgument2) { - UNIMPLEMENTED; - __debugbreak(); + CONTEXT Context; + ULONG64 AlignedRsp, Stack; + EXCEPTION_RECORD SehExceptRecord; + + /* Sanity check, that the trap frame is from user mode */ + ASSERT((TrapFrame->SegCs & MODE_MASK) != KernelMode); + + /* Convert the current trap frame to a context */ + Context.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; + KeTrapFrameToContext(TrapFrame, ExceptionFrame, &Context); + + /* We jump to KiUserApcDispatcher in ntdll */ + TrapFrame->Rip = (ULONG64)KeUserApcDispatcher; + + /* Setup Ring 3 segments */ + TrapFrame->SegCs = KGDT64_R3_CODE | RPL_MASK; + TrapFrame->SegDs = KGDT64_R3_DATA | RPL_MASK; + TrapFrame->SegEs = KGDT64_R3_DATA | RPL_MASK; + TrapFrame->SegFs = KGDT64_R3_CMTEB | RPL_MASK; + TrapFrame->SegGs = KGDT64_R3_DATA | RPL_MASK; + TrapFrame->SegSs = KGDT64_R3_DATA | RPL_MASK; + + /* Sanitize EFLAGS, enable interrupts */ + TrapFrame->EFlags = (Context.EFlags & EFLAGS_USER_SANITIZE); + TrapFrame->EFlags |= EFLAGS_INTERRUPT_MASK; + + /* Set parameters for KiUserApcDispatcher */ + Context.P1Home = (ULONG64)NormalContext; + Context.P2Home = (ULONG64)SystemArgument1; + Context.P3Home = (ULONG64)SystemArgument2; + Context.P4Home = (ULONG64)NormalRoutine; + + /* Check if thread has IOPL and force it enabled if so */ + //if (KeGetCurrentThread()->Iopl) TrapFrame->EFlags |= EFLAGS_IOPL; + + /* Align Stack to 16 bytes and allocate space */ + AlignedRsp = Context.Rsp & ~15; + Stack = AlignedRsp - sizeof(CONTEXT); + TrapFrame->Rsp = Stack; + + /* The stack must be 16 byte aligned for KiUserApcDispatcher */ + ASSERT((Stack & 15) == 0); + + /* Protect with SEH */ + _SEH2_TRY + { + /* Probe the stack */ + ProbeForWrite((PCONTEXT)Stack, sizeof(CONTEXT), 8); + + /* Copy the context */ + RtlCopyMemory((PCONTEXT)Stack, &Context, sizeof(CONTEXT)); + } + _SEH2_EXCEPT((RtlCopyMemory(&SehExceptRecord, _SEH2_GetExceptionInformation()->ExceptionRecord, sizeof(EXCEPTION_RECORD)), EXCEPTION_EXECUTE_HANDLER)) + { + /* Dispatch the exception */ + SehExceptRecord.ExceptionAddress = (PVOID)TrapFrame->Rip; + KiDispatchException(&SehExceptRecord, + ExceptionFrame, + TrapFrame, + UserMode, + TRUE); + } + _SEH2_END; } VOID @@ -115,10 +283,126 @@ NTAPI KiSwapProcess(IN PKPROCESS NewProcess, IN PKPROCESS OldProcess) { - UNIMPLEMENTED; - __debugbreak(); + PKIPCR Pcr = (PKIPCR)KeGetPcr(); +#ifdef CONFIG_SMP + LONG SetMember; + + /* Update active processor mask */ + SetMember = (LONG)Pcr->SetMember; + InterlockedXor((PLONG)&NewProcess->ActiveProcessors, SetMember); + InterlockedXor((PLONG)&OldProcess->ActiveProcessors, SetMember); +#endif + + /* Update CR3 */ + __writecr3(NewProcess->DirectoryTableBase[0]); + + /* Update IOPM offset */ + Pcr->TssBase->IoMapBase = NewProcess->IopmOffset; } +#define MAX_SYSCALL_PARAMS 16 + +NTSTATUS +NtSyscallFailure(void) +{ + /* This is the failure function */ + return STATUS_ACCESS_VIOLATION; +} + +PVOID +KiSystemCallHandler( + IN PKTRAP_FRAME TrapFrame, + IN ULONG64 P2, + IN ULONG64 P3, + IN ULONG64 P4) +{ + PKSERVICE_TABLE_DESCRIPTOR DescriptorTable; + PKTHREAD Thread; + PULONG64 KernelParams, UserParams; + ULONG ServiceNumber, Offset, Count; + ULONG64 UserRsp; + + DPRINT("Syscall #%ld\n", TrapFrame->Rax); + //__debugbreak(); + + /* Increase system call count */ + __addgsdword(FIELD_OFFSET(KIPCR, Prcb.KeSystemCalls), 1); + + /* Get the current thread */ + Thread = KeGetCurrentThread(); + + /* Set previous mode */ + Thread->PreviousMode = TrapFrame->PreviousMode = UserMode; + + /* Save the old trap frame and set the new */ + TrapFrame->TrapFrame = (ULONG64)Thread->TrapFrame; + Thread->TrapFrame = TrapFrame; + + /* Before enabling interrupts get the user rsp from the KPCR */ + UserRsp = __readgsqword(FIELD_OFFSET(KIPCR, UserRsp)); + TrapFrame->Rsp = UserRsp; + + /* Enable interrupts */ + _enable(); + + /* If the usermode rsp was not a usermode address, prepare an exception */ + if (UserRsp > MmUserProbeAddress) UserRsp = MmUserProbeAddress; + + /* Get the address of the usermode and kernelmode parameters */ + UserParams = (PULONG64)UserRsp + 1; + KernelParams = (PULONG64)TrapFrame - MAX_SYSCALL_PARAMS; + + /* Get the system call number from the trap frame and decode it */ + ServiceNumber = (ULONG)TrapFrame->Rax; + Offset = (ServiceNumber >> SERVICE_TABLE_SHIFT) & SERVICE_TABLE_MASK; + ServiceNumber &= SERVICE_NUMBER_MASK; + + /* Get descriptor table */ + DescriptorTable = (PVOID)((ULONG_PTR)Thread->ServiceTable + Offset); + + /* Get stack bytes and calculate argument count */ + Count = DescriptorTable->Number[ServiceNumber] / 8; + + __try + { + switch (Count) + { + case 16: KernelParams[15] = UserParams[15]; + case 15: KernelParams[14] = UserParams[14]; + case 14: KernelParams[13] = UserParams[13]; + case 13: KernelParams[12] = UserParams[12]; + case 12: KernelParams[11] = UserParams[11]; + case 11: KernelParams[10] = UserParams[10]; + case 10: KernelParams[9] = UserParams[9]; + case 9: KernelParams[8] = UserParams[8]; + case 8: KernelParams[7] = UserParams[7]; + case 7: KernelParams[6] = UserParams[6]; + case 6: KernelParams[5] = UserParams[5]; + case 5: KernelParams[4] = UserParams[4]; + case 4: KernelParams[3] = P4; + case 3: KernelParams[2] = P3; + case 2: KernelParams[1] = P2; + case 1: KernelParams[0] = TrapFrame->R10; + case 0: + break; + + default: + __debugbreak(); + break; + } + } + __except(1) + { + TrapFrame->Rax = _SEH2_GetExceptionCode(); + return (PVOID)NtSyscallFailure; + } + + + return (PVOID)DescriptorTable->Base[ServiceNumber]; +} + + +// FIXME: we need to VOID KiSystemService(IN PKTHREAD Thread, IN PKTRAP_FRAME TrapFrame, @@ -145,6 +429,7 @@ NtSetLdtEntries (ULONG Selector1, LDT_ENTRY LdtEntry1, ULONG Selector2, LDT_ENTRY LdtEntry2) { UNIMPLEMENTED; + __debugbreak(); return STATUS_UNSUCCESSFUL; } @@ -153,9 +438,8 @@ NTAPI NtVdmControl(IN ULONG ControlCode, IN PVOID ControlData) { - UNIMPLEMENTED; - __debugbreak(); - return STATUS_UNSUCCESSFUL; + /* Not supported */ + return STATUS_NOT_IMPLEMENTED; } NTSTATUS diff --git a/reactos/ntoskrnl/ke/amd64/thrdini.c b/reactos/ntoskrnl/ke/amd64/thrdini.c index 058f34dd9de..b55daf86655 100644 --- a/reactos/ntoskrnl/ke/amd64/thrdini.c +++ b/reactos/ntoskrnl/ke/amd64/thrdini.c @@ -2,8 +2,9 @@ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/ke/i386/thread.c - * PURPOSE: i386 Thread Context Creation - * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + * PURPOSE: amd64 Thread Context Creation + * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + * Alex Ionescu (alex@relsoft.net) */ /* INCLUDES ******************************************************************/ @@ -16,6 +17,7 @@ typedef struct _KUINIT_FRAME { KSWITCH_FRAME CtxSwitchFrame; KSTART_FRAME StartFrame; + KEXCEPTION_FRAME ExceptionFrame; KTRAP_FRAME TrapFrame; //FX_SAVE_AREA FxSaveArea; } KUINIT_FRAME, *PKUINIT_FRAME; @@ -35,74 +37,52 @@ KiInitializeContextThread(IN PKTHREAD Thread, IN PKSYSTEM_ROUTINE SystemRoutine, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext, - IN PCONTEXT ContextPointer) + IN PCONTEXT Context) { //PFX_SAVE_AREA FxSaveArea; //PFXSAVE_FORMAT FxSaveFormat; PKSTART_FRAME StartFrame; PKSWITCH_FRAME CtxSwitchFrame; PKTRAP_FRAME TrapFrame; - CONTEXT LocalContext; - PCONTEXT Context = NULL; ULONG ContextFlags; /* Check if this is a With-Context Thread */ - if (ContextPointer) + if (Context) { - /* Set up the Initial Frame */ PKUINIT_FRAME InitFrame; - InitFrame = (PKUINIT_FRAME)((ULONG_PTR)Thread->InitialStack - - sizeof(KUINIT_FRAME)); - /* Copy over the context we got */ - RtlCopyMemory(&LocalContext, ContextPointer, sizeof(CONTEXT)); - Context = &LocalContext; - ContextFlags = CONTEXT_CONTROL; + /* Set up the Initial Frame */ + InitFrame = ((PKUINIT_FRAME)Thread->InitialStack) - 1; + StartFrame = &InitFrame->StartFrame; + CtxSwitchFrame = &InitFrame->CtxSwitchFrame; - /* Zero out the trap frame and save area */ - RtlZeroMemory(&InitFrame->TrapFrame, - KTRAP_FRAME_LENGTH); + /* Save back the new value of the kernel stack. */ + Thread->KernelStack = (PVOID)InitFrame; - /* Setup the Fx Area */ - //FxSaveArea = &InitFrame->FxSaveArea; + /* Tell the thread it will run in User Mode */ + Thread->PreviousMode = UserMode; -// /* Get the FX Save Format Area */ -// FxSaveFormat = (PFXSAVE_FORMAT)Context->ExtendedRegisters; -// -// /* Set an initial state */ -// FxSaveFormat->ControlWord = 0x27F; -// FxSaveFormat->StatusWord = 0; -// FxSaveFormat->TagWord = 0; -// FxSaveFormat->ErrorOffset = 0; -// FxSaveFormat->ErrorSelector = 0; -// FxSaveFormat->DataOffset = 0; -// FxSaveFormat->DataSelector = 0; -// FxSaveFormat->MXCsr = 0x1F80; - - /* Set an intial NPX State */ - //Context->FloatSave.Cr0NpxState = 0; - //FxSaveArea->Cr0NpxState = 0; - //FxSaveArea->NpxSavedCpu = 0; - - /* Now set the context flags depending on XMM support */ - //ContextFlags |= (KeI386FxsrPresent) ? CONTEXT_EXTENDED_REGISTERS : - // CONTEXT_FLOATING_POINT; + // FIXME Setup the Fx Area /* Set the Thread's NPX State */ Thread->NpxState = 0xA; Thread->Header.NpxIrql = PASSIVE_LEVEL; - /* Disable any debug regiseters */ - Context->ContextFlags &= ~CONTEXT_DEBUG_REGISTERS; + /* Make sure, we have control registers, disable debug registers */ + ASSERT((Context->ContextFlags & CONTEXT_CONTROL) == CONTEXT_CONTROL); + ContextFlags = Context->ContextFlags & ~CONTEXT_DEBUG_REGISTERS; /* Setup the Trap Frame */ TrapFrame = &InitFrame->TrapFrame; + /* Zero out the trap frame */ + RtlZeroMemory(TrapFrame, sizeof(KTRAP_FRAME)); + /* Set up a trap frame from the context. */ KeContextToTrapFrame(Context, NULL, TrapFrame, - Context->ContextFlags | ContextFlags, + CONTEXT_AMD64 | ContextFlags, UserMode); /* Set SS, DS, ES's RPL Mask properly */ @@ -117,60 +97,109 @@ KiInitializeContextThread(IN PKTHREAD Thread, /* Terminate the Exception Handler List */ TrapFrame->ExceptionFrame = 0; - /* Setup the Stack for KiThreadStartup and Context Switching */ - StartFrame = &InitFrame->StartFrame; - CtxSwitchFrame = &InitFrame->CtxSwitchFrame; - - /* Tell the thread it will run in User Mode */ - Thread->PreviousMode = UserMode; - - /* Tell KiThreadStartup of that too */ -// StartFrame->UserThread = TRUE; + /* We return to ... */ + StartFrame->Return = (ULONG64)KiServiceExit2; } else { - /* Set up the Initial Frame for the system thread */ PKKINIT_FRAME InitFrame; - InitFrame = (PKKINIT_FRAME)((ULONG_PTR)Thread->InitialStack - - sizeof(KKINIT_FRAME)); - /* Setup the Fx Area */ - //FxSaveArea = &InitFrame->FxSaveArea; - //RtlZeroMemory(FxSaveArea, sizeof(FX_SAVE_AREA)); - - /* Check if we have Fxsr support */ - DPRINT1("FxsrPresent but did nothing\n"); -// /* Set the stub FX area */ -// FxSaveArea->U.FxArea.ControlWord = 0x27F; -// FxSaveArea->U.FxArea.MXCsr = 0x1F80; - - /* No NPX State */ - Thread->NpxState = 0xA; - - /* Setup the Stack for KiThreadStartup and Context Switching */ + /* Set up the Initial Frame for the system thread */ + InitFrame = ((PKKINIT_FRAME)Thread->InitialStack) - 1; StartFrame = &InitFrame->StartFrame; CtxSwitchFrame = &InitFrame->CtxSwitchFrame; + /* Save back the new value of the kernel stack. */ + Thread->KernelStack = (PVOID)InitFrame; + /* Tell the thread it will run in Kernel Mode */ Thread->PreviousMode = KernelMode; - /* Tell KiThreadStartup of that too */ -// StartFrame->UserThread = FALSE; + // FIXME Setup the Fx Area + + /* No NPX State */ + Thread->NpxState = 0xA; + + /* We have no return address! */ + StartFrame->Return = 0; } - /* Now setup the remaining data for KiThreadStartup */ -// StartFrame->StartContext = StartContext; -// StartFrame->StartRoutine = StartRoutine; -// StartFrame->SystemRoutine = SystemRoutine; + /* Set up the Context Switch Frame */ + CtxSwitchFrame->Return = (ULONG64)KiThreadStartup; + CtxSwitchFrame->ApcBypass = FALSE; - /* And set up the Context Switch Frame */ -// CtxSwitchFrame->RetAddr = KiThreadStartup; -// CtxSwitchFrame->ApcBypassDisable = TRUE; -// CtxSwitchFrame->ExceptionList = EXCEPTION_CHAIN_END;; + StartFrame->P1Home = (ULONG64)StartRoutine; + StartFrame->P2Home = (ULONG64)StartContext; + StartFrame->P3Home = 0; + StartFrame->P4Home = (ULONG64)SystemRoutine; + StartFrame->P5Home = 0; - /* Save back the new value of the kernel stack. */ - Thread->KernelStack = (PVOID)CtxSwitchFrame; +} +BOOLEAN +KiSwapContextResume( + IN PKTHREAD NewThread, + IN PKTHREAD OldThread, + IN BOOLEAN ApcBypass) +{ + PKIPCR Pcr = (PKIPCR)KeGetPcr(); + PKPROCESS OldProcess, NewProcess; + + /* Setup ring 0 stack pointer */ + Pcr->TssBase->Rsp0 = (ULONG64)NewThread->InitialStack; // FIXME: NPX save area? + Pcr->Prcb.RspBase = Pcr->TssBase->Rsp0; + + /* Now we are the new thread. Check if it's in a new process */ + OldProcess = OldThread->ApcState.Process; + NewProcess = NewThread->ApcState.Process; + if (OldProcess != NewProcess) + { + /* Switch address space and flush TLB */ + __writecr3(NewProcess->DirectoryTableBase[0]); + + /* Set new TSS fields */ + //Pcr->TssBase->IoMapBase = NewProcess->IopmOffset; + } + + /* Set TEB pointer and GS base */ + Pcr->NtTib.Self = (PVOID)NewThread->Teb; + if (NewThread->Teb) + { + /* This will switch the usermode gs */ + __writemsr(MSR_GS_SWAP, (ULONG64)NewThread->Teb); + } + + /* Increase context switch count */ + Pcr->ContextSwitches++; + NewThread->ContextSwitches++; + + /* DPCs shouldn't be active */ + if (Pcr->Prcb.DpcRoutineActive) + { + /* Crash the machine */ + KeBugCheckEx(ATTEMPTED_SWITCH_FROM_DPC, + (ULONG_PTR)OldThread, + (ULONG_PTR)NewThread, + (ULONG_PTR)OldThread->InitialStack, + 0); + } + + /* Kernel APCs may be pending */ + if (NewThread->ApcState.KernelApcPending) + { + /* Are APCs enabled? */ + if (!NewThread->SpecialApcDisable) + { + /* Request APC delivery */ + if (!ApcBypass) + HalRequestSoftwareInterrupt(APC_LEVEL); + else + return TRUE; + } + } + + /* Return stating that no kernel APCs are pending*/ + return FALSE; } /* EOF */ diff --git a/reactos/ntoskrnl/ke/amd64/trap.S b/reactos/ntoskrnl/ke/amd64/trap.S index 42db568b35b..a5330ffb5f9 100644 --- a/reactos/ntoskrnl/ke/amd64/trap.S +++ b/reactos/ntoskrnl/ke/amd64/trap.S @@ -20,7 +20,7 @@ EXTERN KiNpxNotAvailableFaultHandler:PROC EXTERN KiGeneralProtectionFaultHandler:PROC EXTERN KiXmmExceptionHandler:PROC EXTERN KiDeliverApc:PROC -EXTERN KiDispatchInterrupt:PROC +EXTERN KiDpcInterruptHandler:PROC /* GLOBALS *******************************************************************/ @@ -56,15 +56,35 @@ ENDM ALIGN 8 -PUBLIC InterruptDispatchTable -InterruptDispatchTable: +MACRO(UnexpectedVectorStub, Vector) + /* This nop is to make the relative jmp address 4 bytes aligned and to + make the whole code 8 bytes long */ + nop + /* This is a push instruction with 8bit operand. Since the instruction + sign extends the value to 32 bits, we need to offset it */ +PUBLIC KxUnexpectedInterrupt&Vector +KxUnexpectedInterrupt&Vector: + push (Vector - 128) + jmp KiUnexpectedInterrupt +ENDM + +PUBLIC KiUnexpectedRange +KiUnexpectedRange: Vector = 0 REPEAT 256 - push Vector - jmp KiUnexpectedInterrupt - ALIGN 8 + UnexpectedVectorStub %Vector Vector = Vector+1 ENDR +PUBLIC KiUnexpectedRangeEnd +KiUnexpectedRangeEnd: + +PUBLIC KiInterruptDispatchTemplate +KiInterruptDispatchTemplate: + /* This instruction pushes the return address on the stack, which is the + address of the interrupt object's DispatchCode member, then jumps + to the address stored in the interrupt object's DispatchAddress member */ + call qword ptr KiInterruptDispatchTemplate[rip - KINTERRUPT_DispatchCode + KINTERRUPT_DispatchAddress] + // rbp = TrapFrame, eax = ExceptionCode, edx = NumParams, r9,r10,r11 = params .PROC InternalDispatchException @@ -138,7 +158,7 @@ ENDR .ENDP -/* SOFTWARE INTERRUPT SERVICES ***********************************************/ +/* CPU EXCEPTION HANDLERS ****************************************************/ PUBLIC KiDivideErrorFault FUNC KiDivideErrorFault @@ -195,6 +215,14 @@ FUNC KiBreakpointTrap /* Push pseudo error code */ EnterTrap TF_SAVE_ALL + /* Check if the frame was from kernelmode */ + test word ptr [rbp + KTRAP_FRAME_SegCs], 3 + jz KiBreakpointTrapKMode + + /* Enable interrupts for user-mode */ + sti + +KiBreakpointTrapKMode: /* Dispatch the exception */ DispatchException STATUS_BREAKPOINT, 3, 0, 0, 0 @@ -434,7 +462,7 @@ SpecialCode: PageFaultReturn: /* Return */ - ExitTrap TF_SAVE_ALL + ExitTrap (TF_SAVE_ALL or TF_CHECKUSERAPC) ENDFUNC @@ -495,6 +523,8 @@ KiXmmExit: ENDFUNC +/* SOFTWARE INTERRUPT SERVICES ***********************************************/ + PUBLIC KiRaiseAssertion FUNC KiRaiseAssertion /* We have an error code */ @@ -552,29 +582,43 @@ PUBLIC KiApcInterrupt /* Disable interrupts */ cli + /* Lower IRQL back to PASSIVE */ + mov rax, PASSIVE_LEVEL + mov cr8, rax + /* Return */ ExitTrap (TF_VOLATILES or TF_IRQL) .ENDP +EXTERN KiRetireDpcList:PROC +PUBLIC KiRetireDpcListInDpcStack +.PROC KiRetireDpcListInDpcStack + push rbp + .pushreg rbp + mov rbp, rsp + .setframe rbp, 0 + .endprolog + + /* Switch stack and call the function */ + mov rsp, rdx + sub rsp, 40 + call KiRetireDpcList + + /* Restore stack, cleanup and return */ + mov rsp, rbp + pop rbp + ret +.ENDP PUBLIC KiDpcInterrupt .PROC KiDpcInterrupt /* No error code */ EnterTrap (TF_VOLATILES or TF_IRQL) - /* Raise to DISPATCH_LEVEL */ - mov rax, DISPATCH_LEVEL - mov cr8, rax - - /* End the interrupt */ - mov dword ptr [APIC_EOI], 0 - /* Call the worker routine */ - sti - call KiDispatchInterrupt - cli + call KiDpcInterruptHandler - /* Return */ + /* Return, but don't send an EOI! */ ExitTrap (TF_VOLATILES or TF_IRQL) .ENDP @@ -618,6 +662,253 @@ FUNC KiUnexpectedInterrupt ExitTrap TF_SAVE_ALL ENDFUNC +PUBLIC KiInterruptDispatch +FUNC KiInterruptDispatch + /* The error code is a pointer to the interrupt object's code */ + EnterTrap (TF_HAS_ERROR_CODE or TF_SAVE_ALL or TF_IRQL) + + /* Increase interrupt count */ + inc dword ptr gs:[PcInterruptCount]; + + /* Load the address of the interrupt object into rcx */ + mov rcx, [rbp + KTRAP_FRAME_ErrorCode] + + /* Substract offset of the DispatchCode member plus 6 for the call instruction */ + sub rcx, KINTERRUPT_DispatchCode + 6 + + /* Raise IRQL to SynchronizeIrql */ + movzx rax, byte ptr [rcx + KINTERRUPT_SynchronizeIrql] + mov cr8, rax + +#ifdef CONFIG_SMP + /* Acquire interrupt lock */ + mov r8, [rcx + KINTERRUPT_ActualLock] + + //KxAcquireSpinLock(Interrupt->ActualLock); +#endif + + /* Call the ISR */ + mov rdx, [rcx + KINTERRUPT_ServiceContext] + call qword ptr [rcx + KINTERRUPT_ServiceRoutine] + +#ifdef CONFIG_SMP + /* Release interrupt lock */ + //KxReleaseSpinLock(Interrupt->ActualLock); +#endif + + /* Go back to old irql */ + movzx rax, byte ptr [rbp + KTRAP_FRAME_PreviousIrql] + mov cr8, rax + + /* Return */ + ExitTrap (TF_SAVE_ALL or TF_SEND_EOI) +ENDFUNC + + +#define MAX_SYSCALL_PARAM_SIZE (16 * 8) +#define HOME_SIZE 6*8 +#define SYSCALL_ALLOCATION (MAX_SYSCALL_PARAM_SIZE + HOME_SIZE) + +EXTERN KiSystemCallHandler:PROC + +/*! \name KiSystemCallEntry64 + * + * \brief This is the entrypoint for syscalls from 64bit user mode + * + * \param rax - The system call number + * \param rcx - User mode return address, set by the syscall instruction + * \param rdx,r8,r9 - Parameters 2-4 to the service function + * \param r10 - Parameter 1 to the service function + * \param r11 - RFLAGS saved by the syscall instruction + *--*/ +PUBLIC KiSystemCallEntry64 +.PROC KiSystemCallEntry64 + + /* Old stack pointer is in rcx, lie and say we saved it in rbp */ + .setframe rbp, 0 + .endprolog + + /* Swap gs to kernel, so we can access the PCR */ + swapgs + + /* Save the user mode rsp in the PCR */ + mov gs:[PcUserRsp], rsp + + /* Get the kernel stack from the PCR */ + mov rsp, gs:[PcRspBase] + + /* Allocate a TRAP_FRAME and space for parameters */ + sub rsp, (KTRAP_FRAME_LENGTH + MAX_SYSCALL_PARAM_SIZE + HOME_SIZE) +#if DBG + /* Save rbp and load it with the old stack pointer */ + mov [rsp + HOME_SIZE + MAX_SYSCALL_PARAM_SIZE + HOME_SIZE + KTRAP_FRAME_Rbp], rbp + mov rbp, gs:[PcUserRsp] +#endif + + /* Save important volatiles in the trap frame */ + mov [rsp + HOME_SIZE + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rax], rax + mov [rsp + HOME_SIZE + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rcx], rcx + mov [rsp + HOME_SIZE + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_R10], r10 + mov [rsp + HOME_SIZE + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_R11], r11 + + /* Set sane segments */ + mov ax, (KGDT64_R3_DATA or RPL_MASK) + mov ds, ax + mov es, ax + + /* Call the C-handler (will enable interrupts) */ + lea rcx, [rsp + SYSCALL_ALLOCATION] + call KiSystemCallHandler + + /* Deallocate the handlers home stack frame */ + add rsp, HOME_SIZE + + /* The return value is the address of the Nt-function */ + mov rcx, [rsp + 0] + mov rdx, [rsp + 8] + mov r8, [rsp + 16] + mov r9, [rsp + 24] + call rax + +#if DBG + /* Restore rbp */ + mov rbp, [rsp + SYSCALL_ALLOCATION + KTRAP_FRAME_Rbp] +#endif + + /* Disable interrupts for return */ + cli + + /* Restore old trap frame */ + mov rcx, gs:[PcCurrentThread] + mov rdx, [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_TrapFrame] + mov [rcx + KTHREAD_TrapFrame], rdx + + /* Prepare user mode return address (rcx) and eflags (r11) for sysret */ + mov rcx, [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rcx] + mov r11, [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_R11] + + /* Load user mode stack (It was copied to the trap frame) */ + mov rsp, [rsp + MAX_SYSCALL_PARAM_SIZE + KTRAP_FRAME_Rsp] + + /* Swap gs back to user */ + swapgs + + /* return to user mode */ + .byte HEX(48) // REX prefix to return to long mode + sysret +.ENDP + + +PUBLIC KiSystemCallEntry32 +KiSystemCallEntry32: + swapgs + int 3 + + +PUBLIC KiZwSystemService +FUNC KiZwSystemService + push rbp + .pushreg rbp + sub rsp, KTRAP_FRAME_LENGTH + .allocstack KTRAP_FRAME_LENGTH + mov [rsp + KTRAP_FRAME_Rsi], rsi + .savereg rsi, KTRAP_FRAME_Rsi + mov [rsp + KTRAP_FRAME_Rdi], rdi + .savereg rdi, KTRAP_FRAME_Rdi + mov rbp, rsp + .setframe rbp, 0 + .endprolog + + /* Get current thread */ + mov r11, gs:[PcCurrentThread] + + /* Save the old trap frame in TrapFrame.Rdx */ + mov rdi, [r11 + KTHREAD_TrapFrame] + mov [rbp + KTRAP_FRAME_Rdx], rdi + + /* Set the new trap frame and previous mode */ + mov [r11 + ThTrapFrame], rbp + mov byte ptr [r11 + KTHREAD_PreviousMode], 0 + + /* allocate space for parameters */ + sub rsp, r10 + and rsp, HEX(0fffffffffffffff0) + + /* Save rcx */ + mov [rbp + KTRAP_FRAME_Rcx], rcx + + /* copy parameters to the new location */ + lea rsi, [rbp + KTRAP_FRAME_LENGTH + 16] + lea rdi, [rsp] + mov rcx, r10 + shr rcx, 3 + rep movsq + + /* Restore rcx */ + mov rcx, [rbp + KTRAP_FRAME_Rcx] + + /* Call the service function */ + call rax + + /* Restore the old trap frame */ + mov r11, gs:[PcCurrentThread] + mov rsi, [rsp + KTRAP_FRAME_Rdx] + mov [r11 + KTHREAD_TrapFrame], rsi + + /* Restore rdi and rsi */ + mov rsi, [rbp + KTRAP_FRAME_Rsi] + mov rdi, [rbp + KTRAP_FRAME_Rdi] + + /* Cleanup the stack and return */ + lea rsp, [rbp + KTRAP_FRAME_LENGTH] + pop rbp + ret + +ENDFUNC + + +KiExitToUserApc: + int 3 + +/*! + * VOID + * DECLSPEC_NORETURN + * KiServiceExit(IN PKTRAP_FRAME TrapFrame, IN NTSTATUS Status)); + */ +PUBLIC KiServiceExit +KiServiceExit: + mov [rcx + KTRAP_FRAME_Rax], rdx + mov rbp, rcx + mov rsp, rcx + + /* Return */ + //ExitTrap TF_SAVE_ALL + +/*! + * VOID + * DECLSPEC_NORETURN + * KiServiceExit2(IN PKTRAP_FRAME TrapFrame); + */ +PUBLIC KiServiceExit2 +.PROC KiServiceExit2 + .ENDPROLOG + + mov rbp, rcx + mov rsp, rcx + + /* Return */ + ExitTrap TF_SAVE_ALL +.ENDP + +PUBLIC KiInitializeSegments +KiInitializeSegments: + mov ax, KGDT64_R3_DATA or RPL_MASK + mov gs, ax + swapgs + mov gs, ax + ret + + #ifdef _MSC_VER #undef lgdt #undef lidt @@ -658,6 +949,11 @@ __str: str word ptr [rcx] ret +PUBLIC __swapgs +__swapgs: + swapgs + ret + #endif END From 775cef8b4c6723fdff10a7c3e4db11e373c45026 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 4 Feb 2012 11:34:13 +0000 Subject: [PATCH 201/289] [EVENTLOG] - Change LogfInitializeNew and LogfInitializeExisting to return an NTSTATUS code instead of a BOOL value. - LogfInitializeExisting no longer calls LogfInitializeNew when reading a log file fails but returns a proper status code instead. svn path=/trunk/; revision=55406 --- reactos/base/services/eventlog/eventlog.h | 4 -- reactos/base/services/eventlog/file.c | 66 +++++++++++------------ 2 files changed, 33 insertions(+), 37 deletions(-) diff --git a/reactos/base/services/eventlog/eventlog.h b/reactos/base/services/eventlog/eventlog.h index 613998f933b..4f1059328ea 100644 --- a/reactos/base/services/eventlog/eventlog.h +++ b/reactos/base/services/eventlog/eventlog.h @@ -168,10 +168,6 @@ LogfClose(PLOGFILE LogFile, VOID LogfCloseAll(VOID); -BOOL LogfInitializeNew(PLOGFILE LogFile); - -BOOL LogfInitializeExisting(PLOGFILE LogFile); - DWORD LogfGetOldestRecord(PLOGFILE LogFile); DWORD LogfGetCurrentRecord(PLOGFILE LogFile); diff --git a/reactos/base/services/eventlog/file.c b/reactos/base/services/eventlog/file.c index 30d935e05de..306617d3ba9 100644 --- a/reactos/base/services/eventlog/file.c +++ b/reactos/base/services/eventlog/file.c @@ -18,7 +18,8 @@ static CRITICAL_SECTION LogFileListCs; /* FUNCTIONS ****************************************************************/ -BOOL LogfInitializeNew(PLOGFILE LogFile) +static NTSTATUS +LogfInitializeNew(PLOGFILE LogFile) { DWORD dwWritten; EVENTLOGEOF EofRec; @@ -46,7 +47,7 @@ BOOL LogfInitializeNew(PLOGFILE LogFile) NULL)) { DPRINT1("WriteFile failed:%d!\n", GetLastError()); - return FALSE; + return STATUS_UNSUCCESSFUL; } EofRec.Ones = 0x11111111; @@ -67,19 +68,21 @@ BOOL LogfInitializeNew(PLOGFILE LogFile) NULL)) { DPRINT1("WriteFile failed:%d!\n", GetLastError()); - return FALSE; + return STATUS_UNSUCCESSFUL; } if (!FlushFileBuffers(LogFile->hFile)) { DPRINT1("FlushFileBuffers failed:%d!\n", GetLastError()); - return FALSE; + return STATUS_UNSUCCESSFUL; } - return TRUE; + return STATUS_SUCCESS; } -BOOL LogfInitializeExisting(PLOGFILE LogFile) + +static NTSTATUS +LogfInitializeExisting(PLOGFILE LogFile) { DWORD dwRead; DWORD dwRecordsNumber = 0; @@ -94,7 +97,7 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) INVALID_SET_FILE_POINTER) { DPRINT1("SetFilePointer failed! %d\n", GetLastError()); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } if (!ReadFile(LogFile->hFile, @@ -104,34 +107,34 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) NULL)) { DPRINT1("ReadFile failed! %d\n", GetLastError()); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } if (dwRead != sizeof(EVENTLOGHEADER)) { DPRINT("EventLog: Invalid file %S.\n", LogFile->FileName); - return LogfInitializeNew(LogFile); + return STATUS_EVENTLOG_FILE_CORRUPT; } if (LogFile->Header.HeaderSize != sizeof(EVENTLOGHEADER) || LogFile->Header.EndHeaderSize != sizeof(EVENTLOGHEADER)) { DPRINT("EventLog: Invalid header size in %S.\n", LogFile->FileName); - return LogfInitializeNew(LogFile); + return STATUS_EVENTLOG_FILE_CORRUPT; } if (LogFile->Header.Signature != LOGFILE_SIGNATURE) { DPRINT("EventLog: Invalid signature %x in %S.\n", LogFile->Header.Signature, LogFile->FileName); - return LogfInitializeNew(LogFile); + return STATUS_EVENTLOG_FILE_CORRUPT; } if (LogFile->Header.EndOffset > GetFileSize(LogFile->hFile, NULL) + 1) { DPRINT("EventLog: Invalid eof offset %x in %S.\n", LogFile->Header.EndOffset, LogFile->FileName); - return LogfInitializeNew(LogFile); + return STATUS_EVENTLOG_FILE_CORRUPT; } /* Set the read location to the oldest record */ @@ -139,7 +142,7 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) if (dwFilePointer == INVALID_SET_FILE_POINTER) { DPRINT1("SetFilePointer failed! %d\n", GetLastError()); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } for (;;) @@ -149,7 +152,7 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) if (dwFilePointer == INVALID_SET_FILE_POINTER) { DPRINT1("SetFilePointer failed! %d\n", GetLastError()); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } /* If the EVENTLOGEOF info has been reached and the oldest record was not immediately after the Header */ @@ -167,7 +170,7 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) NULL)) { DPRINT1("ReadFile failed! %d\n", GetLastError()); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } if (dwRead != sizeof(dwRecSize)) @@ -180,7 +183,7 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) NULL)) { DPRINT1("ReadFile() failed! %d\n", GetLastError()); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } if (dwRead != sizeof(dwRecSize)) @@ -199,22 +202,21 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) FILE_CURRENT) == INVALID_SET_FILE_POINTER) { DPRINT1("SetFilePointer() failed! %d", GetLastError()); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } RecBuf = (PEVENTLOGRECORD) HeapAlloc(MyHeap, 0, dwRecSize); - - if (!RecBuf) + if (RecBuf == NULL) { DPRINT1("Can't allocate heap!\n"); - return FALSE; + return STATUS_NO_MEMORY; } if (!ReadFile(LogFile->hFile, RecBuf, dwRecSize, &dwRead, NULL)) { DPRINT1("ReadFile() failed! %d\n", GetLastError()); HeapFree(MyHeap, 0, RecBuf); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } if (dwRead != dwRecSize) @@ -248,7 +250,7 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) { DPRINT1("LogfAddOffsetInformation() failed!\n"); HeapFree(MyHeap, 0, RecBuf); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } HeapFree(MyHeap, 0, RecBuf); @@ -266,7 +268,7 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) INVALID_SET_FILE_POINTER) { DPRINT1("SetFilePointer() failed! %d\n", GetLastError()); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } if (!WriteFile(LogFile->hFile, @@ -276,16 +278,16 @@ BOOL LogfInitializeExisting(PLOGFILE LogFile) NULL)) { DPRINT1("WriteFile failed! %d\n", GetLastError()); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } if (!FlushFileBuffers(LogFile->hFile)) { DPRINT1("FlushFileBuffers failed! %d\n", GetLastError()); - return FALSE; + return STATUS_EVENTLOG_FILE_CORRUPT; } - return TRUE; + return STATUS_SUCCESS; } @@ -299,7 +301,7 @@ LogfCreate(PLOGFILE *LogFile, OBJECT_ATTRIBUTES ObjectAttributes; IO_STATUS_BLOCK IoStatusBlock; PLOGFILE pLogFile; - BOOL bResult, bCreateNew = FALSE; + BOOL bCreateNew = FALSE; NTSTATUS Status = STATUS_SUCCESS; pLogFile = (LOGFILE *) HeapAlloc(MyHeap, HEAP_ZERO_MEMORY, sizeof(LOGFILE)); @@ -376,15 +378,12 @@ LogfCreate(PLOGFILE *LogFile, pLogFile->Permanent = Permanent; if (bCreateNew) - bResult = LogfInitializeNew(pLogFile); + Status = LogfInitializeNew(pLogFile); else - bResult = LogfInitializeExisting(pLogFile); + Status = LogfInitializeExisting(pLogFile); - if (!bResult) - { - Status = STATUS_UNSUCCESSFUL; + if (!NT_SUCCESS(Status)) goto fail; - } RtlInitializeResource(&pLogFile->Lock); @@ -415,6 +414,7 @@ LogfCreate(PLOGFILE *LogFile, return Status; } + VOID LogfClose(PLOGFILE LogFile, BOOL ForceClose) From afd88373ce5abea17e7ded450c2b4952b4d28bb2 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 12:13:53 +0000 Subject: [PATCH 202/289] [NTOSKRNL/MM/AMD64] - Implement more of MmCreateProcessAddressSpace - Acquire pfn lock and use MiRemoveZeroPage in MiGetPteForProcess svn path=/trunk/; revision=55407 --- reactos/ntoskrnl/mm/amd64/page.c | 192 ++++++++++++++++++++++--------- 1 file changed, 139 insertions(+), 53 deletions(-) diff --git a/reactos/ntoskrnl/mm/amd64/page.c b/reactos/ntoskrnl/mm/amd64/page.c index 14000c83ca2..485919bffac 100644 --- a/reactos/ntoskrnl/mm/amd64/page.c +++ b/reactos/ntoskrnl/mm/amd64/page.c @@ -28,7 +28,7 @@ extern MMPTE HyperTemplatePte; /* GLOBALS *****************************************************************/ const -ULONG +ULONG64 MmProtectToPteMask[32] = { // @@ -151,37 +151,48 @@ MiGetPteForProcess( Process && Process != PsGetCurrentProcess()) { UNIMPLEMENTED; + __debugbreak(); return NULL; } else if (Create) { + KIRQL OldIrql; TmplPte.u.Long = 0; TmplPte.u.Flush.Valid = 1; TmplPte.u.Flush.Write = 1; + /* All page table levels of user pages are user owned */ + TmplPte.u.Flush.Owner = (Address < MmHighestUserAddress) ? 1 : 0; + + /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + /* Get the PXE */ Pte = MiAddressToPxe(Address); if (!Pte->u.Hard.Valid) { -// TmplPte.u.Hard.PageFrameNumber = MiAllocPage(TRUE); - InterlockedExchangePte(Pte, TmplPte); + TmplPte.u.Hard.PageFrameNumber = MiRemoveZeroPage(0); + MI_WRITE_VALID_PTE(Pte, TmplPte); } /* Get the PPE */ Pte = MiAddressToPpe(Address); if (!Pte->u.Hard.Valid) { -// TmplPte.u.Hard.PageFrameNumber = MiAllocPage(TRUE); - InterlockedExchangePte(Pte, TmplPte); + TmplPte.u.Hard.PageFrameNumber = MiRemoveZeroPage(1); + MI_WRITE_VALID_PTE(Pte, TmplPte); } /* Get the PDE */ Pte = MiAddressToPde(Address); if (!Pte->u.Hard.Valid) { -// TmplPte.u.Hard.PageFrameNumber = MiAllocPage(TRUE); - InterlockedExchangePte(Pte, TmplPte); + TmplPte.u.Hard.PageFrameNumber = MiRemoveZeroPage(2); + MI_WRITE_VALID_PTE(Pte, TmplPte); } + + /* Unlock PFN database */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); } else { @@ -529,6 +540,8 @@ MmCreateVirtualMappingUnsafe( TmplPte.u.Hard.Valid = 1; MiSetPteProtection(&TmplPte, PageProtection); + TmplPte.u.Flush.Owner = (Address < MmHighestUserAddress) ? 1 : 0; + //__debugbreak(); for (i = 0; i < PageCount; i++) @@ -537,7 +550,7 @@ MmCreateVirtualMappingUnsafe( Pte = MiGetPteForProcess(Process, Address, TRUE); -DPRINT1("MmCreateVirtualMappingUnsafe, Address=%p, TmplPte=%p, Pte=%p\n", +DPRINT("MmCreateVirtualMappingUnsafe, Address=%p, TmplPte=%p, Pte=%p\n", Address, TmplPte.u.Long, Pte); if (InterlockedExchangePte(Pte, TmplPte)) @@ -577,6 +590,44 @@ MmCreateVirtualMapping(PEPROCESS Process, return MmCreateVirtualMappingUnsafe(Process, Address, Protect, Pages, PageCount); } +static PMMPTE +MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) +{ + __debugbreak(); + return 0; +} + +BOOLEAN MmUnmapPageTable(PMMPTE Pt) +{ + ASSERT(FALSE); + return 0; +} + +static ULONG64 MmGetPageEntryForProcess(PEPROCESS Process, PVOID Address) +{ + MMPTE Pte, *PointerPte; + + PointerPte = MmGetPageTableForProcess(Process, Address, FALSE); + if (PointerPte) + { + Pte = *PointerPte; + MmUnmapPageTable(PointerPte); + return Pte.u.Long; + } + return 0; +} + +VOID +NTAPI +MmGetPageFileMapping( + PEPROCESS Process, + PVOID Address, + SWAPENTRY* SwapEntry) +{ + ULONG64 Entry = MmGetPageEntryForProcess(Process, Address); + *SwapEntry = Entry >> 1; +} + BOOLEAN NTAPI MmCreateProcessAddressSpace(IN ULONG MinWs, @@ -584,14 +635,19 @@ MmCreateProcessAddressSpace(IN ULONG MinWs, OUT PULONG_PTR DirectoryTableBase) { KIRQL OldIrql; - PFN_NUMBER TableBasePfn, HyperPfn; - PMMPTE PointerPte; + PFN_NUMBER TableBasePfn, HyperPfn, HyperPdPfn, HyperPtPfn, WorkingSetPfn; + PMMPTE SystemPte; MMPTE TempPte, PdePte; ULONG TableIndex; - PMMPTE SystemTable; + PMMPTE PageTablePointer; - /* No page colors yet */ - Process->NextPageColor = 0; + /* Make sure we don't already have a page directory setup */ + ASSERT(Process->Pcb.DirectoryTableBase[0] == 0); + ASSERT(Process->Pcb.DirectoryTableBase[1] == 0); + ASSERT(Process->WorkingSetPage == 0); + + /* Choose a process color */ + Process->NextPageColor = (USHORT)RtlRandom(&MmProcessColorSeed); /* Setup the hyperspace lock */ KeInitializeSpinLock(&Process->HyperSpaceLock); @@ -599,67 +655,97 @@ MmCreateProcessAddressSpace(IN ULONG MinWs, /* Lock PFN database */ OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - /* Get a page for the table base and for hyperspace */ - TableBasePfn = MiRemoveAnyPage(0); - HyperPfn = MiRemoveAnyPage(0); + /* Get a page for the table base and one for hyper space. The PFNs for + these pages will be initialized in MmInitializeProcessAddressSpace, + when we are already attached to the process. */ + TableBasePfn = MiRemoveAnyPage(MI_GET_NEXT_PROCESS_COLOR(Process)); + HyperPfn = MiRemoveAnyPage(MI_GET_NEXT_PROCESS_COLOR(Process)); + HyperPdPfn = MiRemoveAnyPage(MI_GET_NEXT_PROCESS_COLOR(Process)); + HyperPtPfn = MiRemoveAnyPage(MI_GET_NEXT_PROCESS_COLOR(Process)); + WorkingSetPfn = MiRemoveAnyPage(MI_GET_NEXT_PROCESS_COLOR(Process)); /* Release PFN lock */ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - /* Zero both pages */ - MiZeroPhysicalPage(TableBasePfn); + /* Zero pages */ /// FIXME: MiZeroPhysicalPage(HyperPfn); + MiZeroPhysicalPage(WorkingSetPfn); /* Set the base directory pointers */ + Process->WorkingSetPage = WorkingSetPfn; DirectoryTableBase[0] = TableBasePfn << PAGE_SHIFT; DirectoryTableBase[1] = HyperPfn << PAGE_SHIFT; - /* Make sure we don't already have a page directory setup */ - ASSERT(Process->Pcb.DirectoryTableBase[0] == 0); - - /* Insert us into the Mm process list */ - InsertTailList(&MmProcessList, &Process->MmProcessLinks); - /* Get a PTE to map the page directory */ - PointerPte = MiReserveSystemPtes(1, SystemPteSpace); - ASSERT(PointerPte != NULL); + SystemPte = MiReserveSystemPtes(1, SystemPteSpace); + ASSERT(SystemPte != NULL); - /* Build it */ - MI_MAKE_HARDWARE_PTE_KERNEL(&PdePte, - PointerPte, - MM_READWRITE, - TableBasePfn); + /* Get its address */ + PageTablePointer = MiPteToAddress(SystemPte); - /* Set it dirty and map it */ - PdePte.u.Hard.Dirty = TRUE; - MI_WRITE_VALID_PTE(PointerPte, PdePte); + /* Build the PTE for the page directory and map it */ + PdePte = ValidKernelPte; + PdePte.u.Hard.PageFrameNumber = TableBasePfn; + *SystemPte = PdePte; - /* Now get the page directory (which we'll double map, so call it a page table */ - SystemTable = MiPteToAddress(PointerPte); +/// architecture specific + //MiInitializePageDirectoryForProcess( - /* Copy all the kernel mappings */ - TableIndex = MiAddressToPxi(MmSystemRangeStart); - - RtlCopyMemory(&SystemTable[TableIndex], - MiAddressToPxe(MmSystemRangeStart), + /* Copy the kernel mappings and zero out the rest */ + TableIndex = PXE_PER_PAGE / 2; + RtlZeroMemory(PageTablePointer, TableIndex * sizeof(MMPTE)); + RtlCopyMemory(PageTablePointer + TableIndex, + MiAddressToPxe(0) + TableIndex, PAGE_SIZE - TableIndex * sizeof(MMPTE)); - /* Now write the PTE/PDE entry for hyperspace itself */ - TempPte = ValidKernelPte; - TempPte.u.Hard.PageFrameNumber = HyperPfn; - TableIndex = MiAddressToPxi((PVOID)HYPER_SPACE); - SystemTable[TableIndex] = TempPte; - /* Sanity check */ - ASSERT(MiAddressToPxi(MmHyperSpaceEnd) > TableIndex); + ASSERT(MiAddressToPxi(MmHyperSpaceEnd) >= TableIndex); - /* Now do the x86 trick of making the PDE a page table itself */ - TableIndex = MiAddressToPxi((PVOID)PTE_BASE); + /* Setup a PTE for the page directory mappings */ + TempPte = ValidKernelPte; + + /* Update the self mapping of the PML4 */ + TableIndex = MiAddressToPxi((PVOID)PXE_SELFMAP); TempPte.u.Hard.PageFrameNumber = TableBasePfn; - SystemTable[TableIndex] = TempPte; + PageTablePointer[TableIndex] = TempPte; - /* Let go of the system PTE */ - MiReleaseSystemPtes(PointerPte, 1, SystemPteSpace); + /* Write the PML4 entry for hyperspace */ + TableIndex = MiAddressToPxi((PVOID)HYPER_SPACE); + TempPte.u.Hard.PageFrameNumber = HyperPfn; + PageTablePointer[TableIndex] = TempPte; + + /* Map the hyperspace PDPT to the system PTE */ + PdePte.u.Hard.PageFrameNumber = HyperPfn; + *SystemPte = PdePte; + __invlpg(PageTablePointer); + + /* Write the hyperspace entry for the first PD */ + TempPte.u.Hard.PageFrameNumber = HyperPdPfn; + PageTablePointer[0] = TempPte; + + /* Map the hyperspace PD to the system PTE */ + PdePte.u.Hard.PageFrameNumber = HyperPdPfn; + *SystemPte = PdePte; + __invlpg(PageTablePointer); + + /* Write the hyperspace entry for the first PT */ + TempPte.u.Hard.PageFrameNumber = HyperPtPfn; + PageTablePointer[0] = TempPte; + + /* Map the hyperspace PT to the system PTE */ + PdePte.u.Hard.PageFrameNumber = HyperPtPfn; + *SystemPte = PdePte; + __invlpg(PageTablePointer); + + /* Write the hyperspace PTE for the working set list index */ + TempPte.u.Hard.PageFrameNumber = WorkingSetPfn; + TableIndex = MiAddressToPti(MmWorkingSetList); + PageTablePointer[TableIndex] = TempPte; + +/// end architecture specific + + /* Release the system PTE */ + MiReleaseSystemPtes(SystemPte, 1, SystemPteSpace); /* Switch to phase 1 initialization */ ASSERT(Process->AddressSpaceInitialized == 0); From 61a48a890eb4dd72252618dc333779e5a930f6dc Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 12:23:27 +0000 Subject: [PATCH 203/289] [CMLIB] Fix 64 bit / MSVC warnings svn path=/trunk/; revision=55408 --- reactos/lib/cmlib/cmdata.h | 2 +- reactos/lib/cmlib/cminit.c | 6 +++--- reactos/lib/cmlib/cmlib.h | 2 +- reactos/lib/cmlib/hivecell.c | 10 +++++----- reactos/lib/cmlib/hivewrt.c | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/reactos/lib/cmlib/cmdata.h b/reactos/lib/cmlib/cmdata.h index bce6e2aa80f..a717f73f50f 100644 --- a/reactos/lib/cmlib/cmdata.h +++ b/reactos/lib/cmlib/cmdata.h @@ -57,7 +57,7 @@ typedef struct _CM_VIEW_OF_FILE LIST_ENTRY PinViewList; ULONG FileOffset; ULONG Size; - PULONG ViewAddress; + PULONG_PTR ViewAddress; PVOID Bcb; ULONG UseCount; } CM_VIEW_OF_FILE, *PCM_VIEW_OF_FILE; diff --git a/reactos/lib/cmlib/cminit.c b/reactos/lib/cmlib/cminit.c index 1be9b656a80..f923bb4e54b 100644 --- a/reactos/lib/cmlib/cminit.c +++ b/reactos/lib/cmlib/cminit.c @@ -18,10 +18,10 @@ CmCreateRootNode( { PCM_KEY_NODE KeyCell; HCELL_INDEX RootCellIndex; - SIZE_T NameSize; + ULONG NameSize; /* Allocate the cell */ - NameSize = strlenW(Name) * sizeof(WCHAR); + NameSize = (ULONG)strlenW(Name) * sizeof(WCHAR); RootCellIndex = HvAllocateCell(Hive, FIELD_OFFSET(CM_KEY_NODE, Name) + NameSize, Stable, @@ -54,7 +54,7 @@ CmCreateRootNode( KeyCell->MaxClassLen = 0; KeyCell->MaxValueNameLen = 0; KeyCell->MaxValueDataLen = 0; - + /* Write the name */ KeyCell->NameLength = (USHORT)NameSize; memcpy(KeyCell->Name, Name, NameSize); diff --git a/reactos/lib/cmlib/cmlib.h b/reactos/lib/cmlib/cmlib.h index 5a4abbfeff9..ef14cc42b30 100644 --- a/reactos/lib/cmlib/cmlib.h +++ b/reactos/lib/cmlib/cmlib.h @@ -253,7 +253,7 @@ HvGetCellSize( HCELL_INDEX CMAPI HvAllocateCell( PHHIVE RegistryHive, - SIZE_T Size, + ULONG Size, HSTORAGE_TYPE Storage, IN HCELL_INDEX Vicinity); diff --git a/reactos/lib/cmlib/hivecell.c b/reactos/lib/cmlib/hivecell.c index 815165182a5..b0e35aa3d1c 100644 --- a/reactos/lib/cmlib/hivecell.c +++ b/reactos/lib/cmlib/hivecell.c @@ -337,7 +337,7 @@ HvpCreateHiveFreeCellList( HCELL_INDEX CMAPI HvAllocateCell( PHHIVE RegistryHive, - SIZE_T Size, + ULONG Size, HSTORAGE_TYPE Storage, HCELL_INDEX Vicinity) { @@ -546,7 +546,7 @@ HvTrackCellRef(PHV_TRACK_CELL_REF CellRef, CellRef->StaticCount++; return TRUE; } - + /* FIXME: TODO */ DPRINT1("ERROR: Too many references\n"); while (TRUE); @@ -562,10 +562,10 @@ HvReleaseFreeCellRefArray(PHV_TRACK_CELL_REF CellRef) /* Any references? */ if (CellRef->StaticCount > 0) - { + { /* Sanity check */ ASSERT(CellRef->StaticCount <= STATIC_CELL_PAIR_COUNT); - + /* Loop them */ for (i = 0; i < CellRef->StaticCount;i++) { @@ -577,4 +577,4 @@ HvReleaseFreeCellRefArray(PHV_TRACK_CELL_REF CellRef) /* Free again */ CellRef->StaticCount = 0; } -} \ No newline at end of file +} diff --git a/reactos/lib/cmlib/hivewrt.c b/reactos/lib/cmlib/hivewrt.c index 7ecadff2062..fb046fd22b8 100644 --- a/reactos/lib/cmlib/hivewrt.c +++ b/reactos/lib/cmlib/hivewrt.c @@ -14,8 +14,8 @@ HvpWriteLog( PHHIVE RegistryHive) { ULONG FileOffset; - SIZE_T BufferSize; - SIZE_T BitmapSize; + ULONG BufferSize; + ULONG BitmapSize; PUCHAR Buffer; PUCHAR Ptr; ULONG BlockIndex; From 5634a14cce174a06e2e3884b898ab4df6926db61 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 12:29:24 +0000 Subject: [PATCH 204/289] [ASM] Modify syscall stub macros to be compatible with the new amd64 stubs svn path=/trunk/; revision=55409 --- reactos/include/asm/syscalls.inc | 57 ++++++++++++++++---------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/reactos/include/asm/syscalls.inc b/reactos/include/asm/syscalls.inc index 44b1badebe7..c1d58ac9bfd 100644 --- a/reactos/include/asm/syscalls.inc +++ b/reactos/include/asm/syscalls.inc @@ -2,14 +2,16 @@ #ifdef _M_IX86 #define KUSER_SHARED_SYSCALL HEX(7ffe0300) #define KGDT_R0_CODE 8 -MACRO(STUBCODE_U, SyscallId, StackBytes) +MACRO(STUBCODE_U, Name, SyscallId, ArgCount) + StackBytes = 4 * ArgCount FPO 0, 0, 0, 0, 0, FRAME_FPO mov eax, SyscallId mov ecx, KUSER_SHARED_SYSCALL call dword ptr [ecx] ret StackBytes ENDM -MACRO(STUBCODE_K, SyscallId, StackBytes) +MACRO(STUBCODE_K, Name, SyscallId, ArgCount) + StackBytes = 4 * &ArgCount FPO 0, 0, 0, 0, 0, FRAME_FPO mov eax, SyscallId lea edx, [esp + 4] @@ -19,31 +21,32 @@ MACRO(STUBCODE_K, SyscallId, StackBytes) ret StackBytes ENDM #elif defined(_M_AMD64) -MACRO(STUBCODE_U, SyscallId, StackBytes) +MACRO(STUBCODE_U, Name, SyscallId, ArgCount) .ENDPROLOG mov eax, SyscallId mov r10, rcx syscall - ret StackBytes + ret ENDM -MACRO(STUBCODE_K, SyscallId, StackBytes) +MACRO(STUBCODE_K, Name, SyscallId, ArgCount) .ENDPROLOG - mov eax, SyscallId - call KiSystemService - ret StackBytes + EXTERN Nt&Name:PROC + lea rax, Nt&Name[rip] + mov r10, ArgCount * 8 + jmp KiZwSystemService ENDM #elif defined(_M_ARM) -MACRO(STUBCODE_U, SyscallId, StackBytes) +MACRO(STUBCODE_U, Name, SyscallId, ArgCount) swi #SyscallId bx lr ENDM -MACRO(STUBCODE_K, SyscallId, StackBytes) +MACRO(STUBCODE_K, Name, SyscallId, ArgCount) mov ip, lr swi #SyscallId bx ip ENDM #elif defined(_M_PPC) -MACRO(STUBCODE_U, SyscallId, StackBytes) +MACRO(STUBCODE_U, Name, SyscallId, ArgCount) stwu 1,-16(1) mflr 0 stw 0,0(1) @@ -56,13 +59,13 @@ MACRO(STUBCODE_U, SyscallId, StackBytes) ENDM #define STUBCODE_K STUBCODE_U #elif defined(_M_MIPS) -MACRO(STUBCODE_U, SyscallId, StackBytes) +MACRO(STUBCODE_U, Name, SyscallId, ArgCount) li $8, KUSER_SHARED_SYSCALL lw $8,0($8) j $8 nop ENDM -MACRO(STUBCODE_K, SyscallId, StackBytes) +MACRO(STUBCODE_K, Name, SyscallId, ArgCount) j KiSystemService nop ENDM @@ -71,38 +74,36 @@ ENDM #endif #ifdef _M_IX86 -MACRO(MAKE_LABEL, Name, Stackbytes) - PUBLIC _&Name&@&Stackbytes - _&Name&@&Stackbytes: +MACRO(MAKE_LABEL, Name, StackBytes) + PUBLIC _&Name&@&StackBytes + _&Name&@&StackBytes: ENDM -MACRO(START_PROC, Name, Stackbytes) - PUBLIC _&Name&@&Stackbytes - .PROC _&Name&@&Stackbytes +MACRO(START_PROC, Name, StackBytes) + PUBLIC _&Name&@&StackBytes + .PROC _&Name&@&StackBytes ENDM #else -MACRO(MAKE_LABEL, Name, Stackbytes) +MACRO(MAKE_LABEL, Name, StackBytes) PUBLIC &Name &Name: ENDM -MACRO(START_PROC, Name, Stackbytes) +MACRO(START_PROC, Name, StackBytes) PUBLIC &Name .PROC &Name ENDM #endif MACRO(STUB_U, Name, ArgCount) - Stackbytes = 4 * &ArgCount - MAKE_LABEL Zw&Name, %Stackbytes - START_PROC Nt&Name, %Stackbytes - STUBCODE_U SyscallId, %Stackbytes + MAKE_LABEL Zw&Name, %ArgCount * 4 + START_PROC Nt&Name, %ArgCount * 4 + STUBCODE_U Name, SyscallId, %ArgCount .ENDP SyscallId = SyscallId + 1 ENDM MACRO(STUB_K, Name, ArgCount) - Stackbytes = 4 * &ArgCount - START_PROC Zw&Name, %Stackbytes - STUBCODE_K SyscallId, %Stackbytes + START_PROC Zw&Name, %ArgCount * 4 + STUBCODE_K Name, SyscallId, %ArgCount .ENDP SyscallId = SyscallId + 1 ENDM From d5606434e4a819a8fe92e57cbfea503e7813829b Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sat, 4 Feb 2012 13:47:16 +0000 Subject: [PATCH 205/289] [RTL] - Work around Wine's misuse of critical section debug flags. Hopefully fixes KVM svn path=/trunk/; revision=55410 --- reactos/lib/rtl/critical.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/reactos/lib/rtl/critical.c b/reactos/lib/rtl/critical.c index 667fc3a2fb1..d640c0cd4d7 100644 --- a/reactos/lib/rtl/critical.c +++ b/reactos/lib/rtl/critical.c @@ -200,7 +200,7 @@ RtlpUnWaitCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) DPRINT1("Signaling Failed for: %p, %p, 0x%08lx\n", CriticalSection, CriticalSection->LockSemaphore, - Status); + Status); RtlRaiseStatus(Status); } } @@ -316,7 +316,7 @@ RtlpFreeDebugInfo(PRTL_CRITICAL_SECTION_DEBUG DebugInfo) NtCurrentTeb()->ClientId.UniqueProcess); RtlpDebugInfoFreeList[EntryId] = FALSE; - } else { + } else if (!DebugInfo->Flags) { /* It's a dynamic one, so free from the heap */ DPRINT("Freeing from Heap: %p inside Process: %p\n", @@ -324,6 +324,13 @@ RtlpFreeDebugInfo(PRTL_CRITICAL_SECTION_DEBUG DebugInfo) NtCurrentTeb()->ClientId.UniqueProcess); RtlFreeHeap(NtCurrentPeb()->ProcessHeap, 0, DebugInfo); + } else { + + /* Wine stores a section name pointer in the Flags member */ + DPRINT("Assuming static: %p inside Process: %p\n", + DebugInfo, + NtCurrentTeb()->ClientId.UniqueProcess); + } } @@ -365,7 +372,9 @@ RtlDeleteCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) { /* Remove it from the list */ RemoveEntryList(&CriticalSection->DebugInfo->ProcessLocksList); +#if 0 /* We need to preserve Flags for RtlpFreeDebugInfo */ RtlZeroMemory(CriticalSection->DebugInfo, sizeof(RTL_CRITICAL_SECTION_DEBUG)); +#endif } /* Unprotect */ @@ -546,6 +555,7 @@ RtlInitializeCriticalSectionAndSpinCount(PRTL_CRITICAL_SECTION CriticalSection, CritcalSectionDebugData->ContentionCount = 0; CritcalSectionDebugData->EntryCount = 0; CritcalSectionDebugData->CriticalSection = CriticalSection; + CritcalSectionDebugData->Flags = 0; CriticalSection->DebugInfo = CritcalSectionDebugData; /* From 85bb9f1bceaaffd43db805968b0f0909f58ffba3 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 17:29:34 +0000 Subject: [PATCH 206/289] [XDK] - fix ASSERTs in amd64 inline functions - fix definition of KWAIT_BLOCK These fixes are not critical, so I don't update wdm.h to avoid additional recompilation svn path=/trunk/; revision=55413 --- reactos/include/xdk/amd64/ke.h | 4 ++-- reactos/include/xdk/ketypes.h | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/reactos/include/xdk/amd64/ke.h b/reactos/include/xdk/amd64/ke.h index e72519dc98e..c863e71c551 100644 --- a/reactos/include/xdk/amd64/ke.h +++ b/reactos/include/xdk/amd64/ke.h @@ -73,7 +73,7 @@ FORCEINLINE VOID KeLowerIrql(IN KIRQL NewIrql) { - //ASSERT(KeGetCurrentIrql() >= NewIrql); + ASSERT((KIRQL)__readcr8() >= NewIrql); __writecr8(NewIrql); } @@ -84,7 +84,7 @@ KfRaiseIrql(IN KIRQL NewIrql) KIRQL OldIrql; OldIrql = (KIRQL)__readcr8(); - //ASSERT(OldIrql <= NewIrql); + ASSERT(OldIrql <= NewIrql); __writecr8(NewIrql); return OldIrql; } diff --git a/reactos/include/xdk/ketypes.h b/reactos/include/xdk/ketypes.h index 0508315f226..740ee737f7d 100644 --- a/reactos/include/xdk/ketypes.h +++ b/reactos/include/xdk/ketypes.h @@ -463,7 +463,11 @@ typedef struct _KWAIT_BLOCK { struct _KWAIT_BLOCK *NextWaitBlock; USHORT WaitKey; UCHAR WaitType; +#if (NTDDI_VERSION >= NTDDI_LONGHORN) volatile UCHAR BlockState; +#else + UCHAR SpareByte; +#endif #if defined(_WIN64) LONG SpareLong; #endif From cbee83498e7e34a2a17e785bdd0a7185a382e832 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 18:25:25 +0000 Subject: [PATCH 207/289] [NTDLL] - Implement amd64 version of LdrInitializeThunk and KiUserApcDispatcher - Export ExpInterlockedPopEntrySList* on amd64, too - Fix some 64 bit issues svn path=/trunk/; revision=55414 --- reactos/dll/ntdll/CMakeLists.txt | 2 +- reactos/dll/ntdll/def/ntdll.spec | 6 +- reactos/dll/ntdll/dispatch/amd64/dispatch.S | 75 +++++++++++++++++++++ reactos/dll/ntdll/ldr/ldrinit.c | 12 ++-- 4 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 reactos/dll/ntdll/dispatch/amd64/dispatch.S diff --git a/reactos/dll/ntdll/CMakeLists.txt b/reactos/dll/ntdll/CMakeLists.txt index 65e543bf66d..62069bb9986 100644 --- a/reactos/dll/ntdll/CMakeLists.txt +++ b/reactos/dll/ntdll/CMakeLists.txt @@ -27,7 +27,7 @@ list(APPEND SOURCE if(ARCH MATCHES i386) list(APPEND SOURCE dispatch/i386/dispatch.S) elseif(ARCH MATCHES amd64) - list(APPEND SOURCE dispatch/amd64/stubs.c) + list(APPEND SOURCE dispatch/amd64/dispatch.S) elseif(ARCH MATCHES arm) list(APPEND SOURCE dispatch/arm/stubs_asm.s) else() diff --git a/reactos/dll/ntdll/def/ntdll.spec b/reactos/dll/ntdll/def/ntdll.spec index ec779e88411..3464847710f 100644 --- a/reactos/dll/ntdll/def/ntdll.spec +++ b/reactos/dll/ntdll/def/ntdll.spec @@ -60,9 +60,9 @@ @ stdcall -arch=i386 KiFastSystemCall() @ stdcall -arch=i386 KiFastSystemCallRet() @ stdcall -arch=i386 KiIntSystemCall() -@ stdcall -arch=i386 ExpInterlockedPopEntrySListEnd() -@ stdcall -arch=i386 ExpInterlockedPopEntrySListFault() -@ stdcall -arch=i386 ExpInterlockedPopEntrySListResume() +@ stdcall -arch=i386,x86_64 ExpInterlockedPopEntrySListEnd() +@ stdcall -arch=i386,x86_64 ExpInterlockedPopEntrySListFault() +@ stdcall -arch=i386,x86_64 ExpInterlockedPopEntrySListResume() @ stdcall KiRaiseUserExceptionDispatcher() @ stdcall KiUserApcDispatcher(ptr ptr ptr ptr) @ stdcall KiUserCallbackDispatcher(ptr ptr long) ; CHECKME diff --git a/reactos/dll/ntdll/dispatch/amd64/dispatch.S b/reactos/dll/ntdll/dispatch/amd64/dispatch.S new file mode 100644 index 00000000000..f433c5fb22e --- /dev/null +++ b/reactos/dll/ntdll/dispatch/amd64/dispatch.S @@ -0,0 +1,75 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: ntdll/dispatch/amd64/dispatch.S + * PURPOSE: Usermode dispatcher stubs + * + * PROGRAMMER: Timo kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include +#include + +EXTERN NtContinue:PROC +EXTERN LdrpInit:PROC + +.code + +PUBLIC LdrInitializeThunk +.PROC LdrInitializeThunk + mov rbp, 0 + .setframe rbp, 0 + .endprolog + + /* First parameter is the APC context */ + mov rcx, r9 + jmp LdrpInit + +.ENDP + +PUBLIC KiUserApcDispatcher +.PROC KiUserApcDispatcher + .endprolog + /* We enter with a 16 byte aligned stack */ + + mov rcx, [rsp + CONTEXT_P1Home] /* NormalContext */ + mov rdx, [rsp + CONTEXT_P2Home] /* SystemArgument1 */ + mov r8, [rsp + CONTEXT_P3Home] /* SystemArgument2 */ + lea r9, [rsp] /* Context */ + call qword ptr [rsp + CONTEXT_P4Home] /* NormalRoutine */ + + /* NtContinue(Context, TRUE); */ + lea rcx, [rsp] + mov dl, 1 + call NtContinue + + nop + int 3 +.ENDP + + +PUBLIC KiRaiseUserExceptionDispatcher +.PROC KiRaiseUserExceptionDispatcher + .endprolog + int 3 + +.ENDP + +PUBLIC KiUserCallbackDispatcher +.PROC KiUserCallbackDispatcher + .endprolog + int 3 + +.ENDP + +PUBLIC KiUserExceptionDispatcher +.PROC KiUserExceptionDispatcher + .endprolog + int 3 + +.ENDP + +END + diff --git a/reactos/dll/ntdll/ldr/ldrinit.c b/reactos/dll/ntdll/ldr/ldrinit.c index fdf28f7fc46..240eea059b3 100644 --- a/reactos/dll/ntdll/ldr/ldrinit.c +++ b/reactos/dll/ntdll/ldr/ldrinit.c @@ -124,7 +124,7 @@ LdrOpenImageFileOptionsKey(IN PUNICODE_STRING SubKey, /* Setup the object attributes */ InitializeObjectAttributes(&ObjectAttributes, - Wow64 ? + Wow64 ? &Wow64OptionsString : &ImageExecOptionsString, OBJ_CASE_INSENSITIVE, NULL, @@ -441,7 +441,7 @@ LdrpInitSecurityCookie(PLDR_DATA_TABLE_ENTRY LdrEntry) { PULONG_PTR Cookie; LARGE_INTEGER Counter; - ULONG NewCookie; + ULONG_PTR NewCookie; /* Fetch address of the cookie */ Cookie = LdrpFetchAddressOfSecurityCookie(LdrEntry->DllBase, LdrEntry->SizeOfImage); @@ -536,7 +536,7 @@ LdrpInitializeThread(IN PCONTEXT Context) EntryPoint = LdrEntry->EntryPoint; /* Check if we are ready to call it */ - if ((EntryPoint) && + if ((EntryPoint) && (LdrEntry->Flags & LDRP_PROCESS_ATTACH_CALLED) && (LdrEntry->Flags & LDRP_IMAGE_DLL)) { @@ -939,7 +939,7 @@ LdrShutdownProcess(VOID) EntryPoint = LdrEntry->EntryPoint; /* Check if we are ready to call it */ - if (EntryPoint && + if (EntryPoint && (LdrEntry->Flags & LDRP_PROCESS_ATTACH_CALLED) && LdrEntry->Flags) { @@ -1212,7 +1212,7 @@ LdrpAllocateTls(VOID) PTEB Teb = NtCurrentTeb(); PLIST_ENTRY NextEntry, ListHead; PLDRP_TLS_DATA TlsData; - ULONG TlsDataSize; + SIZE_T TlsDataSize; PVOID *TlsVector; /* Check if we have any entries */ @@ -1236,7 +1236,7 @@ LdrpAllocateTls(VOID) NextEntry = NextEntry->Flink; /* Allocate this vector */ - TlsDataSize = TlsData->TlsDirectory.EndAddressOfRawData - + TlsDataSize = TlsData->TlsDirectory.EndAddressOfRawData - TlsData->TlsDirectory.StartAddressOfRawData; TlsVector[TlsData->TlsDirectory.Characteristics] = RtlAllocateHeap(RtlGetProcessHeap(), 0, From 9fa8f0915ef228c62bacf2f05e1064ea38fc981c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 18:35:56 +0000 Subject: [PATCH 208/289] [RTL] - Fix RtlLengthSecurityDescriptor - Implement amd64 version of Implement RtlInitializeContext - Add unwind info to amd64 debug asm functions - Fix 64 bit HEAP_COMMON_ENTRY structure The resulting version doesn't exactly match the original windows one, but its compatible, as every field, except the dummy fields - which are omitted - is at its correct position. svn path=/trunk/; revision=55415 --- reactos/lib/rtl/amd64/debug_asm.S | 19 ++++++++--- reactos/lib/rtl/amd64/stubs.c | 56 +++++++++++++++++++++++++++++-- reactos/lib/rtl/heap.h | 7 ++++ 3 files changed, 76 insertions(+), 6 deletions(-) diff --git a/reactos/lib/rtl/amd64/debug_asm.S b/reactos/lib/rtl/amd64/debug_asm.S index ca09236c566..b89ea57052c 100644 --- a/reactos/lib/rtl/amd64/debug_asm.S +++ b/reactos/lib/rtl/amd64/debug_asm.S @@ -22,20 +22,31 @@ PUBLIC RtlpBreakWithStatusInstruction .code64 -DbgBreakPointNoBugCheck: +.PROC DbgBreakPointNoBugCheck + .endprolog int 3 ret +.ENDP -DbgBreakPoint: DbgUserBreakPoint: +.PROC DbgBreakPoint + .endprolog int 3 ret +.ENDP -DbgBreakPointWithStatus: +.PROC DbgBreakPointWithStatus + .endprolog mov eax, ecx -RtlpBreakWithStatusInstruction: int 3 ret +.ENDP + +.PROC RtlpBreakWithStatusInstruction + .endprolog + int 3 + ret +.ENDP DebugService2: ret diff --git a/reactos/lib/rtl/amd64/stubs.c b/reactos/lib/rtl/amd64/stubs.c index 83060c77619..cd9412db2a0 100644 --- a/reactos/lib/rtl/amd64/stubs.c +++ b/reactos/lib/rtl/amd64/stubs.c @@ -11,6 +11,7 @@ #include #define NDEBUG #include +#include "amd64/ketypes.h" /* PUBLIC FUNCTIONS **********************************************************/ @@ -23,9 +24,60 @@ RtlInitializeContext(IN HANDLE ProcessHandle, OUT PCONTEXT ThreadContext, IN PVOID ThreadStartParam OPTIONAL, IN PTHREAD_START_ROUTINE ThreadStartAddress, - IN PINITIAL_TEB InitialTeb) + IN PINITIAL_TEB StackBase) { - UNIMPLEMENTED; + + ThreadContext->Rax = 0; + ThreadContext->Rbx = 0; + ThreadContext->Rcx = (ULONG64)ThreadStartParam; + ThreadContext->Rdx = 0; + ThreadContext->Rsi = 0; + ThreadContext->Rdi = 0; + ThreadContext->Rbp = 0; + ThreadContext->R8 = 0; + ThreadContext->R9 = 0; + ThreadContext->R10 = 0; + ThreadContext->R11 = 0; + ThreadContext->R12 = 0; + + /* Set the Selectors */ + if ((LONG64)ThreadStartAddress < 0) + { + /* Initialize kernel mode segments */ + ThreadContext->SegCs = KGDT64_R0_CODE; + ThreadContext->SegDs = KGDT64_R3_DATA; + ThreadContext->SegEs = KGDT64_R3_DATA; + ThreadContext->SegFs = KGDT64_R3_CMTEB; + ThreadContext->SegGs = KGDT64_R3_DATA; + ThreadContext->SegSs = KGDT64_R0_DATA; + } + else + { + /* Initialize user mode segments */ + ThreadContext->SegCs = KGDT64_R3_CODE | RPL_MASK; + ThreadContext->SegDs = KGDT64_R3_DATA | RPL_MASK; + ThreadContext->SegEs = KGDT64_R3_DATA | RPL_MASK; + ThreadContext->SegFs = KGDT64_R3_CMTEB | RPL_MASK; + ThreadContext->SegGs = KGDT64_R3_DATA | RPL_MASK; + ThreadContext->SegSs = KGDT64_R3_DATA | RPL_MASK; + } + + /* Enable Interrupts */ + ThreadContext->EFlags = EFLAGS_INTERRUPT_MASK; + + /* Settings passed */ + ThreadContext->Rip = (ULONG64)ThreadStartAddress; + ThreadContext->Rsp = (ULONG64)StackBase - 6 * sizeof(PVOID); + + /* Align stack by 16 and substract 8 (unaligned on function entry) */ + ThreadContext->Rsp &= ~15; + ThreadContext->Rsp -= 8; + + /* Only the basic Context is initialized */ + ThreadContext->ContextFlags = CONTEXT_CONTROL | + CONTEXT_INTEGER | + CONTEXT_SEGMENTS; + return; } diff --git a/reactos/lib/rtl/heap.h b/reactos/lib/rtl/heap.h index dc8892109f0..e76b742e3db 100644 --- a/reactos/lib/rtl/heap.h +++ b/reactos/lib/rtl/heap.h @@ -78,6 +78,9 @@ RtlpHeapIsSpecial(ULONG Flags) /* Heap structures */ struct _HEAP_COMMON_ENTRY { +#ifdef _M_AMD64 + PVOID PreviousBlockPrivateData; +#endif union { struct @@ -88,7 +91,11 @@ struct _HEAP_COMMON_ENTRY }; struct { +#ifndef _M_AMD64 PVOID SubSegmentCode; +#else + ULONG SubSegmentCodeDummy; +#endif USHORT PreviousSize; union { From 5a516701781c80c9288a9df3826fe2ec1ba7f748 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 4 Feb 2012 19:56:21 +0000 Subject: [PATCH 209/289] [ADVAPI32] Add or fix parameter checks. svn path=/trunk/; revision=55417 --- reactos/dll/win32/advapi32/service/eventlog.c | 59 ++++++++++++------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/reactos/dll/win32/advapi32/service/eventlog.c b/reactos/dll/win32/advapi32/service/eventlog.c index 58154b6ccbd..2788854c923 100644 --- a/reactos/dll/win32/advapi32/service/eventlog.c +++ b/reactos/dll/win32/advapi32/service/eventlog.c @@ -452,7 +452,7 @@ GetNumberOfEventLogRecords(IN HANDLE hEventLog, TRACE("%p, %p\n", hEventLog, NumberOfRecords); - if(!NumberOfRecords) + if (NumberOfRecords == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -497,7 +497,7 @@ GetOldestEventLogRecord(IN HANDLE hEventLog, TRACE("%p, %p\n", hEventLog, OldestRecord); - if(!OldestRecord) + if (OldestRecord == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; @@ -630,16 +630,15 @@ OpenBackupEventLogW(IN LPCWSTR lpUNCServerName, if (lpFileName == NULL) { - RtlInitUnicodeString(&FileNameW, NULL); + SetLastError(ERROR_INVALID_PARAMETER); + return NULL; } - else + + if (!RtlDosPathNameToNtPathName_U(lpFileName, &FileNameW, + NULL, NULL)) { - if (!RtlDosPathNameToNtPathName_U(lpFileName, &FileNameW, - NULL, NULL)) - { - SetLastError(ERROR_INVALID_PARAMETER); - return NULL; - } + SetLastError(ERROR_INVALID_PARAMETER); + return NULL; } RpcTryExcept @@ -802,22 +801,32 @@ ReadEventLogA(IN HANDLE hEventLog, { NTSTATUS Status; DWORD bytesRead, minNumberOfBytesNeeded; + DWORD dwFlags; TRACE("%p, %lu, %lu, %p, %lu, %p, %p\n", hEventLog, dwReadFlags, dwRecordOffset, lpBuffer, nNumberOfBytesToRead, pnBytesRead, pnMinNumberOfBytesNeeded); - if(!pnBytesRead || !pnMinNumberOfBytesNeeded) + if (lpBuffer == NULL || + pnBytesRead == NULL || + pnMinNumberOfBytesNeeded == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } - /* If buffer is NULL set nNumberOfBytesToRead to 0 to prevent rpcrt4 from - trying to access a null pointer */ - if (!lpBuffer) + dwFlags = dwReadFlags & (EVENTLOG_SEQUENTIAL_READ | EVENTLOG_SEEK_READ); + if (dwFlags == (EVENTLOG_SEQUENTIAL_READ | EVENTLOG_SEEK_READ)) { - nNumberOfBytesToRead = 0; + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + dwFlags = dwReadFlags & (EVENTLOG_FORWARDS_READ | EVENTLOG_BACKWARDS_READ); + if (dwFlags == (EVENTLOG_FORWARDS_READ | EVENTLOG_BACKWARDS_READ)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; } RpcTryExcept @@ -872,22 +881,32 @@ ReadEventLogW(IN HANDLE hEventLog, { NTSTATUS Status; DWORD bytesRead, minNumberOfBytesNeeded; + DWORD dwFlags; TRACE("%p, %lu, %lu, %p, %lu, %p, %p\n", hEventLog, dwReadFlags, dwRecordOffset, lpBuffer, nNumberOfBytesToRead, pnBytesRead, pnMinNumberOfBytesNeeded); - if(!pnBytesRead || !pnMinNumberOfBytesNeeded) + if (lpBuffer == NULL || + pnBytesRead == NULL || + pnMinNumberOfBytesNeeded == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } - /* If buffer is NULL set nNumberOfBytesToRead to 0 to prevent rpcrt4 from - trying to access a null pointer */ - if (!lpBuffer) + dwFlags = dwReadFlags & (EVENTLOG_SEQUENTIAL_READ | EVENTLOG_SEEK_READ); + if (dwFlags == (EVENTLOG_SEQUENTIAL_READ | EVENTLOG_SEEK_READ)) { - nNumberOfBytesToRead = 0; + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + dwFlags = dwReadFlags & (EVENTLOG_FORWARDS_READ | EVENTLOG_BACKWARDS_READ); + if (dwFlags == (EVENTLOG_FORWARDS_READ | EVENTLOG_BACKWARDS_READ)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; } RpcTryExcept From eb594c7610553192f5be5a3d9874829f78715b04 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 21:16:52 +0000 Subject: [PATCH 210/289] [NDK] Fix amd64 definitions of SYNCH_LEVEL, DISPATCH_LENGTH, KINTERRUPT, KTHREAD, KPROCESS, EPROCESS - add MM_SHARED_USER_DATA_VA - Add PsGetProcessSessionId prototype - Remove duplicated RtlWow64Get/SetThreadContext prototypes svn path=/trunk/; revision=55418 --- reactos/include/ddk/wdm.h | 8 ++- reactos/include/ndk/amd64/ketypes.h | 6 +- reactos/include/ndk/amd64/mmtypes.h | 5 ++ reactos/include/ndk/ketypes.h | 88 +++++++++++++++++++++++++---- reactos/include/ndk/psfuncs.h | 10 +++- reactos/include/ndk/pstypes.h | 28 +++++---- reactos/include/ndk/rtlfuncs.h | 21 +------ reactos/include/xdk/generate.bat | 8 +-- 8 files changed, 117 insertions(+), 57 deletions(-) diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index f83b06ac71a..a3bfa4b4b0e 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -1033,7 +1033,11 @@ typedef struct _KWAIT_BLOCK { struct _KWAIT_BLOCK *NextWaitBlock; USHORT WaitKey; UCHAR WaitType; +#if (NTDDI_VERSION >= NTDDI_LONGHORN) volatile UCHAR BlockState; +#else + UCHAR SpareByte; +#endif #if defined(_WIN64) LONG SpareLong; #endif @@ -1875,7 +1879,7 @@ FORCEINLINE VOID KeLowerIrql(IN KIRQL NewIrql) { - //ASSERT(KeGetCurrentIrql() >= NewIrql); + ASSERT((KIRQL)__readcr8() >= NewIrql); __writecr8(NewIrql); } @@ -1886,7 +1890,7 @@ KfRaiseIrql(IN KIRQL NewIrql) KIRQL OldIrql; OldIrql = (KIRQL)__readcr8(); - //ASSERT(OldIrql <= NewIrql); + ASSERT(OldIrql <= NewIrql); __writecr8(NewIrql); return OldIrql; } diff --git a/reactos/include/ndk/amd64/ketypes.h b/reactos/include/ndk/amd64/ketypes.h index 338442a7026..6b3f90a790d 100644 --- a/reactos/include/ndk/amd64/ketypes.h +++ b/reactos/include/ndk/amd64/ketypes.h @@ -184,11 +184,7 @@ Author: // // Synchronization-level IRQL // -#ifndef CONFIG_SMP -#define SYNCH_LEVEL DISPATCH_LEVEL -#else -#define SYNCH_LEVEL (IPI_LEVEL - 2) -#endif +#define SYNCH_LEVEL 12 #define NMI_STACK_SIZE 0x2000 diff --git a/reactos/include/ndk/amd64/mmtypes.h b/reactos/include/ndk/amd64/mmtypes.h index a9200786e78..cee1ce2a40c 100644 --- a/reactos/include/ndk/amd64/mmtypes.h +++ b/reactos/include/ndk/amd64/mmtypes.h @@ -33,6 +33,11 @@ Author: #define MM_ALLOCATION_GRANULARITY 0x10000 #define MM_ALLOCATION_GRANULARITY_SHIFT 16L +// +// Address of the shared user page +// +#define MM_SHARED_USER_DATA_VA 0x7FFE0000ULL + // // Sanity checks for Paging Macros // diff --git a/reactos/include/ndk/ketypes.h b/reactos/include/ndk/ketypes.h index cae815b6d2d..a9faf09efaf 100644 --- a/reactos/include/ndk/ketypes.h +++ b/reactos/include/ndk/ketypes.h @@ -112,7 +112,9 @@ Author: // // Number of dispatch codes supported by KINTERRUPT // -#if (NTDDI_VERSION >= NTDDI_LONGHORN) +#ifdef _M_AMD64 +#define DISPATCH_LENGTH 4 +#elif (NTDDI_VERSION >= NTDDI_LONGHORN) #define DISPATCH_LENGTH 135 #else #define DISPATCH_LENGTH 106 @@ -647,6 +649,10 @@ typedef struct _KINTERRUPT ULONG DispatchCount; #if (NTDDI_VERSION >= NTDDI_LONGHORN) ULONGLONG Rsvd1; +#endif +#ifdef _M_AMD64 + PKTRAP_FRAME TrapFrame; + PVOID Reserved; #endif ULONG DispatchCode[DISPATCH_LENGTH]; } KINTERRUPT; @@ -690,7 +696,7 @@ typedef struct _KTHREAD LIST_ENTRY MutantListHead; #endif PVOID InitialStack; - ULONG_PTR StackLimit; + ULONG_PTR StackLimit; // FIXME: PVOID PVOID KernelStack; KSPIN_LOCK ThreadLock; union @@ -698,7 +704,11 @@ typedef struct _KTHREAD KAPC_STATE ApcState; struct { +#ifdef _M_AMD64 + UCHAR ApcStateFill[43]; // 23 / 43 +#else UCHAR ApcStateFill[23]; +#endif UCHAR ApcQueueable; volatile UCHAR NextProcessor; volatile UCHAR DeferredProcessor; @@ -707,11 +717,13 @@ typedef struct _KTHREAD }; }; KSPIN_LOCK ApcQueueLock; +#ifndef _M_AMD64 ULONG ContextSwitches; volatile UCHAR State; UCHAR NpxState; KIRQL WaitIrql; KPROCESSOR_MODE WaitMode; +#endif LONG_PTR WaitStatus; union { @@ -749,6 +761,7 @@ typedef struct _KTHREAD SINGLE_LIST_ENTRY SwapListEntry; }; PKQUEUE Queue; +#ifndef _M_AMD64 ULONG WaitTime; union { @@ -759,13 +772,14 @@ typedef struct _KTHREAD }; ULONG CombinedApcDisable; }; +#endif struct _TEB *Teb; union { KTIMER Timer; struct { - UCHAR TimerFill[40]; + UCHAR TimerFill[FIELD_OFFSET(KTIMER, Period) + sizeof(LONG)]; // 40 / 60 union { struct @@ -790,7 +804,7 @@ typedef struct _KTHREAD KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1]; struct { - UCHAR WaitBlockFill0[23]; + UCHAR WaitBlockFill0[FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 32bit = 23, 64bit = 43 #if (NTDDI_VERSION >= NTDDI_LONGHORN) UCHAR IdealProcessor; #else @@ -799,19 +813,52 @@ typedef struct _KTHREAD }; struct { - UCHAR WaitBlockFill1[47]; + UCHAR WaitBlockFill1[1 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 47 / 91 CCHAR PreviousMode; }; struct { - UCHAR WaitBlockFill2[71]; + UCHAR WaitBlockFill2[2 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 71 / 139 UCHAR ResourceIndex; }; struct { - UCHAR WaitBlockFill3[95]; + UCHAR WaitBlockFill3[3 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareByte)]; // 95 / 187 UCHAR LargeStack; }; +#ifdef _M_AMD64 + struct + { + UCHAR WaitBlockFill4[FIELD_OFFSET(KWAIT_BLOCK, SpareLong)]; + ULONG ContextSwitches; + }; + struct + { + UCHAR WaitBlockFill5[1 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)]; + UCHAR State; + UCHAR NpxState; + UCHAR WaitIrql; + CHAR WaitMode; + }; + struct + { + UCHAR WaitBlockFill6[2 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)]; + ULONG WaitTime; + }; + struct + { + UCHAR WaitBlockFill7[3 * sizeof(KWAIT_BLOCK) + FIELD_OFFSET(KWAIT_BLOCK, SpareLong)]; + union + { + struct + { + SHORT KernelApcDisable; + SHORT SpecialApcDisable; + }; + ULONG CombinedApcDisable; + }; + }; +#endif }; LIST_ENTRY QueueListEntry; PKTRAP_FRAME TrapFrame; @@ -820,6 +867,9 @@ typedef struct _KTHREAD #endif PVOID CallbackStack; PVOID ServiceTable; +#ifdef _M_AMD64 + ULONG KernelLimit; +#endif UCHAR ApcStateIndex; #if (NTDDI_VERSION < NTDDI_LONGHORN) UCHAR IdealProcessor; @@ -829,6 +879,10 @@ typedef struct _KTHREAD BOOLEAN CalloutActive; #else BOOLEAN ProcessReadyQueue; +#ifdef _M_AMD64 + PVOID Win32kTable; + ULONG Win32kLimit; +#endif BOOLEAN KernelStackResident; #endif SCHAR BasePriority; @@ -847,7 +901,7 @@ typedef struct _KTHREAD KAPC_STATE SavedApcState; struct { - UCHAR SavedApcStateFill[23]; + UCHAR SavedApcStateFill[FIELD_OFFSET(KAPC_STATE, UserApcPending) + 1]; // 23 / 43 CCHAR FreezeCount; CCHAR SuspendCount; UCHAR UserIdealProcessor; @@ -890,7 +944,7 @@ typedef struct _KTHREAD }; struct { - UCHAR SuspendApcFill3[36]; + UCHAR SuspendApcFill3[FIELD_OFFSET(KAPC, SystemArgument1)]; #if (NTDDI_VERSION >= NTDDI_LONGHORN) PKPRCB WaitPrcb; #else @@ -899,12 +953,12 @@ typedef struct _KTHREAD }; struct { - UCHAR SuspendApcFill4[40]; + UCHAR SuspendApcFill4[FIELD_OFFSET(KAPC, SystemArgument2)]; // 40 / 72 PVOID LegoData; }; struct { - UCHAR SuspendApcFill5[47]; + UCHAR SuspendApcFill5[FIELD_OFFSET(KAPC, Inserted) + 1]; // 47 / 83 UCHAR PowerState; ULONG UserTime; }; @@ -914,7 +968,7 @@ typedef struct _KTHREAD KSEMAPHORE SuspendSemaphore; struct { - UCHAR SuspendSemaphorefill[20]; + UCHAR SuspendSemaphorefill[FIELD_OFFSET(KSEMAPHORE, Limit) + 4]; // 20 / 28 ULONG SListFaultCount; }; }; @@ -926,6 +980,14 @@ typedef struct _KTHREAD #if (NTDDI_VERSION >= NTDDI_LONGHORN) PVOID MdlForLockedteb; #endif +#ifdef _M_AMD64 + LONG64 ReadOperationCount; + LONG64 WriteOperationCount; + LONG64 OtherOperationCount; + LONG64 ReadTransferCount; + LONG64 WriteTransferCount; + LONG64 OtherTransferCount; +#endif } KTHREAD; #define ASSERT_THREAD(object) \ @@ -947,7 +1009,9 @@ typedef struct _KPROCESS #if defined(_M_IX86) KGDTENTRY LdtDescriptor; KIDTENTRY Int21Descriptor; +#endif USHORT IopmOffset; +#if defined(_M_IX86) UCHAR Iopl; UCHAR Unused; #endif diff --git a/reactos/include/ndk/psfuncs.h b/reactos/include/ndk/psfuncs.h index b90c3181e9d..ac2c8992b15 100644 --- a/reactos/include/ndk/psfuncs.h +++ b/reactos/include/ndk/psfuncs.h @@ -192,9 +192,15 @@ PsGetProcessExitStatus( PEPROCESS Process ); +HANDLE +NTAPI +PsGetProcessSessionId( + IN PEPROCESS Process +); + NTKERNELAPI -BOOLEAN -NTAPI +BOOLEAN +NTAPI PsGetProcessExitProcessCalled( PEPROCESS Process ); diff --git a/reactos/include/ndk/pstypes.h b/reactos/include/ndk/pstypes.h index 2a9c2842daa..a383921c3a6 100644 --- a/reactos/include/ndk/pstypes.h +++ b/reactos/include/ndk/pstypes.h @@ -1056,11 +1056,11 @@ typedef struct _EPROCESS EX_RUNDOWN_REF RundownProtect; HANDLE UniqueProcessId; LIST_ENTRY ActiveProcessLinks; - ULONG QuotaUsage[3]; /* 0=PagedPool, 1=NonPagedPool, 2=Pagefile */ - ULONG QuotaPeak[3]; /* ditto */ - ULONG CommitCharge; - ULONG PeakVirtualSize; - ULONG VirtualSize; + SIZE_T QuotaUsage[3]; /* 0=PagedPool, 1=NonPagedPool, 2=Pagefile */ + SIZE_T QuotaPeak[3]; /* ditto */ + SIZE_T CommitCharge; + SIZE_T PeakVirtualSize; + SIZE_T VirtualSize; LIST_ENTRY SessionProcessLinks; PVOID DebugPort; #if (NTDDI_VERSION >= NTDDI_LONGHORN) @@ -1075,7 +1075,7 @@ typedef struct _EPROCESS #endif PHANDLE_TABLE ObjectTable; EX_FAST_REF Token; - ULONG WorkingSetPage; + PFN_NUMBER WorkingSetPage; #if (NTDDI_VERSION >= NTDDI_LONGHORN) EX_PUSH_LOCK AddressCreationLock; PETHREAD RotateInProgress; @@ -1084,11 +1084,11 @@ typedef struct _EPROCESS KSPIN_LOCK HyperSpaceLock; #endif PETHREAD ForkInProgress; - ULONG HardwareTrigger; + ULONG_PTR HardwareTrigger; PMM_AVL_TABLE PhysicalVadRoot; PVOID CloneRoot; - ULONG NumberOfPrivatePages; - ULONG NumberOfLockedPages; + PFN_NUMBER NumberOfPrivatePages; + PFN_NUMBER NumberOfLockedPages; PVOID *Win32Process; struct _EJOB *Job; PVOID SectionObject; @@ -1112,7 +1112,7 @@ typedef struct _EPROCESS HARDWARE_PTE PageDirectoryPte; ULONGLONG Filler; }; - ULONG Session; + ULONG Session; // FIXME: PVOID CHAR ImageFileName[16]; LIST_ENTRY JobLinks; PVOID LockedPagesList; @@ -1135,12 +1135,16 @@ typedef struct _EPROCESS LARGE_INTEGER ReadTransferCount; LARGE_INTEGER WriteTransferCount; LARGE_INTEGER OtherTransferCount; - ULONG CommitChargeLimit; - ULONG CommitChargePeak; + SIZE_T CommitChargeLimit; + SIZE_T CommitChargePeak; PVOID AweInfo; SE_AUDIT_PROCESS_CREATION_INFO SeAuditProcessCreationInfo; MMSUPPORT Vm; +#ifdef _M_AMD64 + ULONG Spares[2]; +#else LIST_ENTRY MmProcessLinks; +#endif ULONG ModifiedPageCount; #if (NTDDI_VERSION >= NTDDI_LONGHORN) union diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 38d2026824e..a0b8a723a26 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -2090,25 +2090,6 @@ RtlPrefixString( BOOLEAN CaseInsensitive ); -#ifdef _M_X64 -NTSYSAPI -NTSTATUS -NTAPI -RtlWow64GetThreadContext( - IN HANDLE ThreadHandle, - IN OUT PWOW64_CONTEXT ThreadContext -); - - -NTSYSAPI -NTSTATUS -NTAPI -RtlWow64SetThreadContext( - IN HANDLE ThreadHandle, - IN PWOW64_CONTEXT ThreadContext -); -#endif - NTSYSAPI BOOLEAN NTAPI @@ -3907,7 +3888,7 @@ NTAPI RtlGUIDFromString( IN PUNICODE_STRING GuidString, OUT GUID *Guid); - + NTSYSAPI NTSTATUS NTAPI diff --git a/reactos/include/xdk/generate.bat b/reactos/include/xdk/generate.bat index 782f92f0acf..af0c9454ce5 100644 --- a/reactos/include/xdk/generate.bat +++ b/reactos/include/xdk/generate.bat @@ -1,6 +1,6 @@ -..\..\output-i386\tools\hpp\hpp.exe wdm.template.h wdm.h -..\..\output-i386\tools\hpp\hpp.exe ntddk.template.h ntddk.h -..\..\output-i386\tools\hpp\hpp.exe ntifs.template.h ntifs.h -..\..\output-i386\tools\hpp\hpp.exe devioctl.template.h devioctl.h +hpp.exe wdm.template.h wdm.h +hpp.exe ntddk.template.h ntddk.h +hpp.exe ntifs.template.h ntifs.h +hpp.exe devioctl.template.h devioctl.h From 98a73736a62462b933eb5c19f2b63726ad6f03fb Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Sat, 4 Feb 2012 21:42:22 +0000 Subject: [PATCH 211/289] [ADVAPI32] Don't export Vista+, unused and unimplemented APIs. Some apps / tests detect their presence and try to use them. svn path=/trunk/; revision=55419 --- reactos/dll/win32/advapi32/advapi32.spec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/advapi32/advapi32.spec b/reactos/dll/win32/advapi32/advapi32.spec index 249028013b2..83ac5825cf0 100644 --- a/reactos/dll/win32/advapi32/advapi32.spec +++ b/reactos/dll/win32/advapi32/advapi32.spec @@ -479,8 +479,8 @@ @ stdcall RegCreateKeyExW(long wstr long ptr long long ptr ptr ptr) @ stdcall RegCreateKeyW(long wstr ptr) @ stdcall RegDeleteKeyA(long str) -@ stdcall RegDeleteKeyExA(long str long long) -@ stdcall RegDeleteKeyExW(long wstr long long) +;@ stdcall RegDeleteKeyExA(long str long long) +;@ stdcall RegDeleteKeyExW(long wstr long long) @ stdcall RegDeleteKeyW(long wstr) @ stdcall RegDeleteKeyValueA(ptr str str) @ stdcall RegDeleteKeyValueW(ptr wstr wstr) From cb837e18a15959465b217103bde9da119ce42327 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 21:53:09 +0000 Subject: [PATCH 212/289] [FREELDR] - Don't map the low 1 MB into kernel space, it's pointless and leads to inconsistencies between reported memory type and what is found in the page tables. On x86 it works, because it uses an overcomplicated pfn initialization wih redundent checks. Anyway this memory, containing freeldr and real mode code, was simply wasted. - Silence some debug prints - Fix warnings svn path=/trunk/; revision=55421 --- reactos/boot/freeldr/freeldr/arch/amd64/winldr.c | 6 +++--- reactos/boot/freeldr/freeldr/windows/winldr.c | 3 ++- reactos/boot/freeldr/freeldr/windows/wlmemory.c | 7 +++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c b/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c index 299a491223b..14b4a2e062c 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c +++ b/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c @@ -236,7 +236,7 @@ WinLdrpMapApic() BOOLEAN WinLdrMapSpecialPages() { - PHARDWARE_PTE PpeBase, PdeBase, PteBase; + PHARDWARE_PTE PpeBase, PdeBase; /* Map the PCR page */ if (!MempMapSinglePage(KIP0PCRADDRESS, PcrBasePage * PAGE_SIZE)) @@ -308,7 +308,7 @@ Amd64SetupGdt(PVOID GdtBase, ULONG64 TssBase) /* Set the new Gdt */ __lgdt(&GdtDesc.Limit); - DbgPrint("Gdtr.Base = %p, num = %ld\n", GdtDesc.Base, NUM_GDT); + TRACE("Gdtr.Base = %p, num = %ld\n", GdtDesc.Base, NUM_GDT); } @@ -329,7 +329,7 @@ Amd64SetupIdt(PVOID IdtBase) /* Set the new IDT */ __lidt(&IdtDesc.Limit); - DbgPrint("Idtr.Base = %p\n", IdtDesc.Base); + TRACE("Idtr.Base = %p\n", IdtDesc.Base); } diff --git a/reactos/boot/freeldr/freeldr/windows/winldr.c b/reactos/boot/freeldr/freeldr/windows/winldr.c index 3218e1bcf6d..d13f28db468 100644 --- a/reactos/boot/freeldr/freeldr/windows/winldr.c +++ b/reactos/boot/freeldr/freeldr/windows/winldr.c @@ -91,7 +91,8 @@ WinLdrInitializePhase1(PLOADER_PARAMETER_BLOCK LoaderBlock, CHAR HalPath[] = "\\"; CHAR ArcBoot[256]; CHAR MiscFiles[256]; - ULONG i, PathSeparator; + ULONG i; + ULONG_PTR PathSeparator; PLOADER_PARAMETER_EXTENSION Extension; /* Construct SystemRoot and ArcBoot from SystemPath */ diff --git a/reactos/boot/freeldr/freeldr/windows/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/wlmemory.c index 1ae96bcc397..d5492a8376d 100644 --- a/reactos/boot/freeldr/freeldr/windows/wlmemory.c +++ b/reactos/boot/freeldr/freeldr/windows/wlmemory.c @@ -200,7 +200,7 @@ WinLdrSetupMemoryLayout(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock) PPAGE_LOOKUP_TABLE_ITEM MemoryMap; ULONG NoEntries; //PKTSS Tss; - BOOLEAN Status; + //BOOLEAN Status; // // Creating a suitable memory map for the Windows can be tricky, so let's @@ -241,7 +241,7 @@ WinLdrSetupMemoryLayout(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock) MemoryMapSizeInPages = (NoEntries * sizeof(PAGE_LOOKUP_TABLE_ITEM) + MM_PAGE_SIZE - 1) / MM_PAGE_SIZE; TRACE("Got memory map with %d entries\n", NoEntries); - +#if 0 // Always contiguously map low 1Mb of memory Status = MempSetupPaging(0, 0x100, FALSE); if (!Status) @@ -249,7 +249,7 @@ WinLdrSetupMemoryLayout(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock) ERR("Error during MempSetupPaging of low 1Mb\n"); return FALSE; } - +#endif // Construct a good memory map from what we've got, // but mark entries which the memory allocation bitmap takes // as free entries (this is done in order to have the ability @@ -412,4 +412,3 @@ WinLdrInsertDescriptor(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, return; } - From d7bdbf2152ed8e6ae7e813c3cfb8f8bc72d591fa Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 4 Feb 2012 23:08:20 +0000 Subject: [PATCH 213/289] [NTOSKRNL] - Fix a bug in CmpSetSystemValues, where an uninitialized handle would be closed in the failure path. - Add a hack on top of the MI_GET_ROS_DATA(x) hack so that we can squeeze a pointer into a 32 bit field. Make MmInitializeProcessAddressSpace amd64 ready and use a portable way to determine the page table base pfn in MiInitializeWorkingSetList - Make MmProbeAndLockPages ready for 3 and 4 level page tables add MiIsPteOnP*eBoundary macros - use these in MmProbeAndLockPages - Raise IRQL to SYNCH_LEVEL not DISPATCH_LEVEL in KiAcquireDispatcherLock - Add MiNonPagedSystemSize for all architectures - Fix amd64 definition of KERNEL_HANDLE_FLAG - Fix definition of PrototypePte - Fix KiGetLinkedTrapFrame() - Make MmProtectTpPteMask 64 bit wide - Fix definition of MI_PTE_LOOKUP_NEEDED for amd64 - Impllement KiSendEOI() to be able to send an EOI from C code. - Fix some MSVC/amd64 warnings svn path=/trunk/; revision=55423 --- reactos/ntoskrnl/config/cmsysini.c | 52 +++++++------- reactos/ntoskrnl/ex/zw.S | 2 + reactos/ntoskrnl/include/internal/amd64/ke.h | 24 ++++++- reactos/ntoskrnl/include/internal/ke_x.h | 68 +++++++++--------- reactos/ntoskrnl/include/internal/ob.h | 7 +- reactos/ntoskrnl/io/iomgr/irp.c | 3 +- reactos/ntoskrnl/mm/ARM3/i386/init.c | 3 +- reactos/ntoskrnl/mm/ARM3/mdlsup.c | 34 ++++++--- reactos/ntoskrnl/mm/ARM3/miarm.h | 16 ++++- reactos/ntoskrnl/mm/ARM3/mminit.c | 1 + reactos/ntoskrnl/mm/ARM3/procsup.c | 12 +++- reactos/ntoskrnl/mm/ARM3/special.c | 10 +-- reactos/ntoskrnl/ps/job.c | 5 +- reactos/ntoskrnl/ps/process.c | 3 +- reactos/ntoskrnl/ps/query.c | 74 ++++++++++---------- 15 files changed, 195 insertions(+), 119 deletions(-) diff --git a/reactos/ntoskrnl/config/cmsysini.c b/reactos/ntoskrnl/config/cmsysini.c index 93ab54bbfd6..b8dae163186 100644 --- a/reactos/ntoskrnl/config/cmsysini.c +++ b/reactos/ntoskrnl/config/cmsysini.c @@ -333,7 +333,7 @@ CmpSetSystemValues(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING KeyName, ValueName = { 0, 0, NULL }; - HANDLE KeyHandle; + HANDLE KeyHandle = NULL; NTSTATUS Status; ASSERT(LoaderBlock != NULL); @@ -374,7 +374,7 @@ Quickie: RtlFreeUnicodeString(&ValueName); /* Close the key and return */ - NtClose(KeyHandle); + if (KeyHandle) NtClose(KeyHandle); /* Return the status */ return (ExpInTextModeSetup ? STATUS_SUCCESS : Status); @@ -1098,7 +1098,8 @@ CmpLoadHiveThread(IN PVOID StartContext) { WCHAR FileBuffer[MAX_PATH], RegBuffer[MAX_PATH], ConfigPath[MAX_PATH]; UNICODE_STRING TempName, FileName, RegName; - ULONG FileStart, i, ErrorResponse, WorkerCount, Length; + ULONG i, ErrorResponse, WorkerCount, Length; + USHORT FileStart; //ULONG RegStart; ULONG PrimaryDisposition, SecondaryDisposition, ClusterSize; PCMHIVE CmHive; @@ -1259,7 +1260,8 @@ CmpInitializeHiveList(IN USHORT Flag) UNICODE_STRING TempName, FileName, RegName; HANDLE Thread; NTSTATUS Status; - ULONG RegStart, i; + ULONG i; + USHORT RegStart; PSECURITY_DESCRIPTOR SecurityDescriptor; PAGED_CODE(); @@ -1611,25 +1613,25 @@ CmpFreeDriverList(IN PHHIVE Hive, PLIST_ENTRY NextEntry, OldEntry; PBOOT_DRIVER_NODE DriverNode; PAGED_CODE(); - + /* Parse the current list */ NextEntry = DriverList->Flink; while (NextEntry != DriverList) { /* Get the driver node */ DriverNode = CONTAINING_RECORD(NextEntry, BOOT_DRIVER_NODE, ListEntry.Link); - + /* Get the next entry now, since we're going to free it later */ OldEntry = NextEntry; NextEntry = NextEntry->Flink; - + /* Was there a name? */ if (DriverNode->Name.Buffer) { /* Free it */ CmpFree(DriverNode->Name.Buffer, DriverNode->Name.Length); } - + /* Was there a registry path? */ if (DriverNode->ListEntry.RegistryPath.Buffer) { @@ -1637,7 +1639,7 @@ CmpFreeDriverList(IN PHHIVE Hive, CmpFree(DriverNode->ListEntry.RegistryPath.Buffer, DriverNode->ListEntry.RegistryPath.MaximumLength); } - + /* Was there a file path? */ if (DriverNode->ListEntry.FilePath.Buffer) { @@ -1645,7 +1647,7 @@ CmpFreeDriverList(IN PHHIVE Hive, CmpFree(DriverNode->ListEntry.FilePath.Buffer, DriverNode->ListEntry.FilePath.MaximumLength); } - + /* Now free the node, and move on */ CmpFree(OldEntry, sizeof(BOOT_DRIVER_NODE)); } @@ -1673,7 +1675,7 @@ CmGetSystemDriverList(VOID) /* Initialize the driver list */ InitializeListHead(&DriverList); - + /* Open the system hive key */ RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\System"); InitializeObjectAttributes(&ObjectAttributes, @@ -1683,7 +1685,7 @@ CmGetSystemDriverList(VOID) NULL); Status = NtOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes); if (!NT_SUCCESS(Status)) return NULL; - + /* Reference the key object to get the root hive/cell to access directly */ Status = ObReferenceObjectByHandle(KeyHandle, KEY_QUERY_VALUE, @@ -1697,38 +1699,38 @@ CmGetSystemDriverList(VOID) NtClose(KeyHandle); return NULL; } - + /* Do all this under the registry lock */ CmpLockRegistryExclusive(); - + /* Get the hive and key cell */ Hive = KeyBody->KeyControlBlock->KeyHive; RootCell = KeyBody->KeyControlBlock->KeyCell; - + /* Open the current control set key */ RtlInitUnicodeString(&KeyName, L"Current"); ControlCell = CmpFindControlSet(Hive, RootCell, &KeyName, &AutoSelect); if (ControlCell == HCELL_NIL) goto EndPath; - + /* Find all system drivers */ Success = CmpFindDrivers(Hive, ControlCell, SystemLoad, NULL, &DriverList); if (!Success) goto EndPath; - + /* Sort by group/tag */ if (!CmpSortDriverList(Hive, ControlCell, &DriverList)) goto EndPath; - + /* Remove circular dependencies (cycles) and sort */ if (!CmpResolveDriverDependencies(&DriverList)) goto EndPath; - + /* Loop the list to count drivers */ for (i = 0, NextEntry = DriverList.Flink; NextEntry != &DriverList; i++, NextEntry = NextEntry->Flink); - + /* Allocate the array */ ServicePath = ExAllocatePool(NonPagedPool, (i + 1) * sizeof(PUNICODE_STRING)); if (!ServicePath) KeBugCheckEx(CONFIG_INITIALIZATION_FAILED, 2, 1, 0, 0); - + /* Loop the driver list */ for (i = 0, NextEntry = DriverList.Flink; NextEntry != &DriverList; @@ -1743,17 +1745,17 @@ CmGetSystemDriverList(VOID) &DriverEntry->RegistryPath, ServicePath[i]); } - + /* Terminate the list */ ServicePath[i] = NULL; - + EndPath: /* Free the driver list if we had one */ if (!IsListEmpty(&DriverList)) CmpFreeDriverList(Hive, &DriverList); - + /* Unlock the registry */ CmpUnlockRegistry(); - + /* Close the key handle and dereference the object, then return the path */ ObDereferenceObject(KeyBody); NtClose(KeyHandle); diff --git a/reactos/ntoskrnl/ex/zw.S b/reactos/ntoskrnl/ex/zw.S index bacead4d752..87441ef7502 100644 --- a/reactos/ntoskrnl/ex/zw.S +++ b/reactos/ntoskrnl/ex/zw.S @@ -5,7 +5,9 @@ #ifdef _M_IX86 EXTERN _KiSystemService:PROC #elif defined(_M_AMD64) +#include EXTERN KiSystemService:PROC +EXTERN KiZwSystemService:PROC #endif .code diff --git a/reactos/ntoskrnl/include/internal/amd64/ke.h b/reactos/ntoskrnl/include/internal/amd64/ke.h index 54ee8767c7b..b01e9940899 100644 --- a/reactos/ntoskrnl/include/internal/amd64/ke.h +++ b/reactos/ntoskrnl/include/internal/amd64/ke.h @@ -56,6 +56,8 @@ #define AMD64_TSS 9 +#define APIC_EOI_REGISTER 0xFFFFFFFFFFFE00B0ULL + #ifndef __ASM__ #include "intrin_i.h" @@ -68,6 +70,17 @@ typedef struct _KIDT_INIT PVOID ServiceRoutine; } KIDT_INIT, *PKIDT_INIT; +#include +typedef struct _KI_INTERRUPT_DISPATCH_ENTRY +{ + UCHAR _Op_nop; + UCHAR _Op_push; + UCHAR _Vector; + UCHAR _Op_jmp; + ULONG RelativeAddress; +} KI_INTERRUPT_DISPATCH_ENTRY, *PKI_INTERRUPT_DISPATCH_ENTRY; +#include + extern ULONG Ke386CacheAlignment; extern ULONG KeI386NpxPresent; extern ULONG KeI386XMMIPresent; @@ -95,7 +108,7 @@ extern ULONG KeI386CpuStep; ((TrapFrame)->Rip) #define KiGetLinkedTrapFrame(x) \ - (PKTRAP_FRAME)((x)->Rdx) + (PKTRAP_FRAME)((x)->TrapFrame) #define KeGetContextReturnRegister(Context) \ ((Context)->Rax) @@ -233,6 +246,14 @@ KeQueryInterruptHandler(IN ULONG Vector) (ULONG64)Idt->OffsetLow); } +VOID +FORCEINLINE +KiSendEOI() +{ + /* Write 0 to the apic EOI register */ + *((volatile ULONG*)APIC_EOI_REGISTER) = 0; +} + VOID FORCEINLINE KiEndInterrupt(IN KIRQL Irql, @@ -240,6 +261,7 @@ KiEndInterrupt(IN KIRQL Irql, { /* Make sure this is from the clock handler */ ASSERT(TrapFrame->ErrorCode == 0xc10c4); + //KeLowerIrql(Irql); } BOOLEAN diff --git a/reactos/ntoskrnl/include/internal/ke_x.h b/reactos/ntoskrnl/include/internal/ke_x.h index 8b0ef980b23..def10d75fc3 100644 --- a/reactos/ntoskrnl/include/internal/ke_x.h +++ b/reactos/ntoskrnl/include/internal/ke_x.h @@ -127,8 +127,8 @@ FORCEINLINE KIRQL KiAcquireDispatcherLock(VOID) { - /* Raise to DPC level */ - return KeRaiseIrqlToDpcLevel(); + /* Raise to synch level */ + return KfRaiseIrql(SYNCH_LEVEL); } FORCEINLINE @@ -303,7 +303,7 @@ KiAcquireDispatcherObject(IN DISPATCHER_HEADER* Object) /* Let the CPU know that this is a loop */ YieldProcessor(); - } + } /* Try acquiring the lock now */ } while (InterlockedCompareExchange(&Object->Lock, @@ -902,7 +902,7 @@ KiRemoveEntryTimer(IN PKTIMER Timer) { ULONG Hand; PKTIMER_TABLE_ENTRY TableEntry; - + /* Remove the timer from the timer list and check if it's empty */ Hand = Timer->Header.Hand; if (RemoveEntryList(&Timer->TimerListEntry)) @@ -962,17 +962,17 @@ KiComputeDueTime(IN PKTIMER Timer, OUT PULONG Hand) { LARGE_INTEGER InterruptTime, SystemTime, DifferenceTime; - + /* Convert to relative time if needed */ Timer->Header.Absolute = FALSE; if (DueTime.HighPart >= 0) { /* Get System Time */ KeQuerySystemTime(&SystemTime); - + /* Do the conversion */ DifferenceTime.QuadPart = SystemTime.QuadPart - DueTime.QuadPart; - + /* Make sure it hasn't already expired */ Timer->Header.Absolute = TRUE; if (DifferenceTime.HighPart >= 0) @@ -984,17 +984,17 @@ KiComputeDueTime(IN PKTIMER Timer, *Hand = 0; return FALSE; } - + /* Set the time as Absolute */ DueTime = DifferenceTime; } - + /* Get the Interrupt Time */ InterruptTime.QuadPart = KeQueryInterruptTime(); - + /* Recalculate due time */ Timer->DueTime.QuadPart = InterruptTime.QuadPart - DueTime.QuadPart; - + /* Get the handle */ *Hand = KiComputeTimerTableIndex(Timer->DueTime.QuadPart); Timer->Header.Hand = (UCHAR)*Hand; @@ -1515,7 +1515,7 @@ _KeInitializeGuardedMutex(OUT PKGUARDED_MUTEX GuardedMutex) GuardedMutex->Count = GM_LOCK_BIT; GuardedMutex->Owner = NULL; GuardedMutex->Contention = 0; - + /* Initialize the Wait Gate */ KeInitializeGate(&GuardedMutex->Gate); } @@ -1525,21 +1525,21 @@ VOID _KeAcquireGuardedMutexUnsafe(IN OUT PKGUARDED_MUTEX GuardedMutex) { PKTHREAD Thread = KeGetCurrentThread(); - + /* Sanity checks */ ASSERT((KeGetCurrentIrql() == APC_LEVEL) || (Thread->SpecialApcDisable < 0) || (Thread->Teb == NULL) || (Thread->Teb >= (PTEB)MM_SYSTEM_RANGE_START)); ASSERT(GuardedMutex->Owner != Thread); - + /* Remove the lock */ if (!InterlockedBitTestAndReset(&GuardedMutex->Count, GM_LOCK_BIT_V)) { /* The Guarded Mutex was already locked, enter contented case */ KiAcquireGuardedMutex(GuardedMutex); } - + /* Set the Owner */ GuardedMutex->Owner = Thread; } @@ -1549,21 +1549,21 @@ VOID _KeReleaseGuardedMutexUnsafe(IN OUT PKGUARDED_MUTEX GuardedMutex) { LONG OldValue, NewValue; - + /* Sanity checks */ ASSERT((KeGetCurrentIrql() == APC_LEVEL) || (KeGetCurrentThread()->SpecialApcDisable < 0) || (KeGetCurrentThread()->Teb == NULL) || (KeGetCurrentThread()->Teb >= (PTEB)MM_SYSTEM_RANGE_START)); ASSERT(GuardedMutex->Owner == KeGetCurrentThread()); - + /* Destroy the Owner */ GuardedMutex->Owner = NULL; - + /* Add the Lock Bit */ OldValue = InterlockedExchangeAdd(&GuardedMutex->Count, GM_LOCK_BIT); ASSERT((OldValue & GM_LOCK_BIT) == 0); - + /* Check if it was already locked, but not woken */ if ((OldValue) && !(OldValue & GM_LOCK_WAITER_WOKEN)) { @@ -1573,7 +1573,7 @@ _KeReleaseGuardedMutexUnsafe(IN OUT PKGUARDED_MUTEX GuardedMutex) /* The mutex will be woken, minus one waiter */ NewValue = OldValue + GM_LOCK_WAITER_WOKEN - GM_LOCK_WAITER_INC; - + /* Remove the Woken bit */ if (InterlockedCompareExchange(&GuardedMutex->Count, NewValue, @@ -1590,21 +1590,21 @@ VOID _KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex) { PKTHREAD Thread = KeGetCurrentThread(); - + /* Sanity checks */ ASSERT(KeGetCurrentIrql() <= APC_LEVEL); ASSERT(GuardedMutex->Owner != Thread); - + /* Disable Special APCs */ KeEnterGuardedRegion(); - + /* Remove the lock */ if (!InterlockedBitTestAndReset(&GuardedMutex->Count, GM_LOCK_BIT_V)) { /* The Guarded Mutex was already locked, enter contented case */ KiAcquireGuardedMutex(GuardedMutex); } - + /* Set the Owner and Special APC Disable state */ GuardedMutex->Owner = Thread; GuardedMutex->SpecialApcDisable = Thread->SpecialApcDisable; @@ -1615,20 +1615,20 @@ VOID _KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex) { LONG OldValue, NewValue; - + /* Sanity checks */ ASSERT(KeGetCurrentIrql() <= APC_LEVEL); ASSERT(GuardedMutex->Owner == KeGetCurrentThread()); ASSERT(KeGetCurrentThread()->SpecialApcDisable == GuardedMutex->SpecialApcDisable); - + /* Destroy the Owner */ GuardedMutex->Owner = NULL; - + /* Add the Lock Bit */ OldValue = InterlockedExchangeAdd(&GuardedMutex->Count, GM_LOCK_BIT); ASSERT((OldValue & GM_LOCK_BIT) == 0); - + /* Check if it was already locked, but not woken */ if ((OldValue) && !(OldValue & GM_LOCK_WAITER_WOKEN)) { @@ -1638,7 +1638,7 @@ _KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex) /* The mutex will be woken, minus one waiter */ NewValue = OldValue + GM_LOCK_WAITER_WOKEN - GM_LOCK_WAITER_INC; - + /* Remove the Woken bit */ if (InterlockedCompareExchange(&GuardedMutex->Count, NewValue, @@ -1648,7 +1648,7 @@ _KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex) KeSignalGateBoostPriority(&GuardedMutex->Gate); } } - + /* Re-enable APCs */ KeLeaveGuardedRegion(); } @@ -1658,21 +1658,21 @@ BOOLEAN _KeTryToAcquireGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex) { PKTHREAD Thread = KeGetCurrentThread(); - + /* Block APCs */ KeEnterGuardedRegion(); - + /* Remove the lock */ if (!InterlockedBitTestAndReset(&GuardedMutex->Count, GM_LOCK_BIT_V)) { /* Re-enable APCs */ KeLeaveGuardedRegion(); YieldProcessor(); - + /* Return failure */ return FALSE; } - + /* Set the Owner and APC State */ GuardedMutex->Owner = Thread; GuardedMutex->SpecialApcDisable = Thread->SpecialApcDisable; diff --git a/reactos/ntoskrnl/include/internal/ob.h b/reactos/ntoskrnl/include/internal/ob.h index cc9ff526cca..dd1f375598b 100644 --- a/reactos/ntoskrnl/include/internal/ob.h +++ b/reactos/ntoskrnl/include/internal/ob.h @@ -56,8 +56,11 @@ // // Identifies a Kernel Handle // -#define KERNEL_HANDLE_FLAG \ - ((ULONG_PTR)1 << ((sizeof(HANDLE) * 8) - 1)) +#ifdef _WIN64 +#define KERNEL_HANDLE_FLAG 0xFFFFFFFF80000000ULL +#else +#define KERNEL_HANDLE_FLAG 0x80000000 +#endif #define ObIsKernelHandle(Handle, ProcessorMode) \ (((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) && \ ((ProcessorMode) == KernelMode)) diff --git a/reactos/ntoskrnl/io/iomgr/irp.c b/reactos/ntoskrnl/io/iomgr/irp.c index 91596bab657..97e9b192810 100644 --- a/reactos/ntoskrnl/io/iomgr/irp.c +++ b/reactos/ntoskrnl/io/iomgr/irp.c @@ -1650,7 +1650,8 @@ IoGetRequestorSessionId(IN PIRP Irp, /* Return the session */ if ((Process = IoGetRequestorProcess(Irp))) { - *pSessionId = Process->Session; + // FIXME: broken + *pSessionId = PtrToUlong(Process->Session); return STATUS_SUCCESS; } diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index d67b858461b..b8e161aeda6 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -281,8 +281,9 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // nonpaged pool expansion (above) and the system PTEs. Note that it is // then aligned to a PDE boundary (4MB). // + MiNonPagedSystemSize = (MmNumberOfSystemPtes + 1) * PAGE_SIZE; MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedPoolStart - - (MmNumberOfSystemPtes + 1) * PAGE_SIZE); + MiNonPagedSystemSize); MmNonPagedSystemStart = (PVOID)((ULONG_PTR)MmNonPagedSystemStart & ~(PDE_MAPPED_VA - 1)); diff --git a/reactos/ntoskrnl/mm/ARM3/mdlsup.c b/reactos/ntoskrnl/mm/ARM3/mdlsup.c index ede078ee183..3932c68b1cf 100644 --- a/reactos/ntoskrnl/mm/ARM3/mdlsup.c +++ b/reactos/ntoskrnl/mm/ARM3/mdlsup.c @@ -593,6 +593,12 @@ MmProbeAndLockPages(IN PMDL Mdl, NTSTATUS ProbeStatus; PMMPTE PointerPte, LastPte; PMMPDE PointerPde; +#if (_MI_PAGING_LEVELS >= 3) + PMMPDE PointerPpe; +#endif +#if (_MI_PAGING_LEVELS == 4) + PMMPDE PointerPxe; +#endif PFN_NUMBER PageFrameIndex; BOOLEAN UsePfnLock; KIRQL OldIrql; @@ -741,8 +747,10 @@ MmProbeAndLockPages(IN PMDL Mdl, PointerPte = MiAddressToPte(StartAddress); PointerPde = MiAddressToPde(StartAddress); #if (_MI_PAGING_LEVELS >= 3) - DPRINT1("PAE/x64 Not Implemented\n"); - ASSERT(FALSE); + PointerPpe = MiAddressToPpe(StartAddress); +#endif +#if (_MI_PAGING_LEVELS == 4) + PointerPxe = MiAddressToPxe(StartAddress); #endif // @@ -776,7 +784,7 @@ MmProbeAndLockPages(IN PMDL Mdl, // // Check if this came from kernel mode // - if (Base >= MM_HIGHEST_USER_ADDRESS) + if (Base > MM_HIGHEST_USER_ADDRESS) { // // We should not have a process @@ -834,11 +842,14 @@ MmProbeAndLockPages(IN PMDL Mdl, // Assume failure and check for non-mapped pages // *MdlPages = LIST_HEAD; -#if (_MI_PAGING_LEVELS >= 3) - /* Should be checking the PPE and PXE */ - ASSERT(FALSE); + while ( +#if (_MI_PAGING_LEVELS == 4) + (PointerPxe->u.Hard.Valid == 0) || #endif - while ((PointerPde->u.Hard.Valid == 0) || +#if (_MI_PAGING_LEVELS >= 3) + (PointerPpe->u.Hard.Valid == 0) || +#endif + (PointerPde->u.Hard.Valid == 0) || (PointerPte->u.Hard.Valid == 0)) { // @@ -1042,7 +1053,14 @@ MmProbeAndLockPages(IN PMDL Mdl, PointerPte++; /* Check if we're on a PDE boundary */ - if (!((ULONG_PTR)PointerPte & (PD_SIZE - 1))) PointerPde++; + if (MiIsPteOnPdeBoundary(PointerPte)) PointerPde++; +#if (_MI_PAGING_LEVELS >= 3) + if (MiIsPteOnPpeBoundary(PointerPte)) PointerPpe++; +#endif +#if (_MI_PAGING_LEVELS == 4) + if (MiIsPteOnPxeBoundary(PointerPte)) PointerPxe++; +#endif + } while (PointerPte <= LastPte); // diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 9fead56191f..5e0541e3a46 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -78,6 +78,8 @@ #define PDE_COUNT 1024 #define PTE_COUNT 1024 C_ASSERT(SYSTEM_PD_SIZE == PAGE_SIZE); +#define MiIsPteOnPdeBoundary(PointerPte) \ + ((((ULONG_PTR)PointerPte) & (PAGE_SIZE - 1)) == 0) #elif _M_ARM #define PD_COUNT 1 #define PDE_COUNT 4096 @@ -164,7 +166,7 @@ C_ASSERT(SYSTEM_PD_SIZE == PAGE_SIZE); #error Define these please! #endif -extern const ULONG MmProtectToPteMask[32]; +extern const ULONG_PTR MmProtectToPteMask[32]; extern const ULONG MmProtectToValue[32]; // @@ -262,7 +264,11 @@ extern const ULONG MmProtectToValue[32]; // // Prototype PTEs that don't yet have a pagefile association // +#ifdef _M_AMD64 +#define MI_PTE_LOOKUP_NEEDED 0xffffffffULL +#else #define MI_PTE_LOOKUP_NEEDED 0xFFFFF +#endif // // System views are binned into 64K chunks @@ -444,6 +450,7 @@ extern SIZE_T MmMaximumNonPagedPoolInBytes; extern PFN_NUMBER MmMaximumNonPagedPoolInPages; extern PFN_NUMBER MmSizeOfPagedPoolInPages; extern PVOID MmNonPagedSystemStart; +extern SIZE_T MiNonPagedSystemSize; extern PVOID MmNonPagedPoolStart; extern PVOID MmNonPagedPoolExpansionStart; extern PVOID MmNonPagedPoolEnd; @@ -1379,7 +1386,14 @@ MiRemoveZeroPageSafe(IN ULONG Color) // // New ARM3<->RosMM PAGE Architecture // +#ifdef _WIN64 +// HACK ON TOP OF HACK ALERT!!! +#define MI_GET_ROS_DATA(x) \ + (((x)->RosMmData == 0) ? NULL : ((PMMROSPFN)((ULONG64)(ULONG)((x)->RosMmData) | \ + ((ULONG64)MmNonPagedPoolStart & 0xffffffff00000000ULL)))) +#else #define MI_GET_ROS_DATA(x) ((PMMROSPFN)(x->RosMmData)) +#endif #define MI_IS_ROS_PFN(x) (((x)->u4.AweAllocation == TRUE) && (MI_GET_ROS_DATA(x) != NULL)) #define ASSERT_IS_ROS_PFN(x) ASSERT(MI_IS_ROS_PFN(x) == TRUE); typedef struct _MMROSPFN diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 7e932e64836..524f20e822f 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -93,6 +93,7 @@ ULONG MmMaxAdditionNonPagedPoolPerMb = 400 * 1024; // http://www.ditii.com/2007/09/28/windows-memory-management-x86-virtual-address-space/ // PVOID MmNonPagedSystemStart; +SIZE_T MiNonPagedSystemSize; PVOID MmNonPagedPoolStart; PVOID MmNonPagedPoolExpansionStart; PVOID MmNonPagedPoolEnd = MI_NONPAGED_POOL_END; diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index 1d7ba0aabaa..6356f933fa0 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -913,7 +913,7 @@ MiInitializeWorkingSetList(IN PEPROCESS CurrentProcess) MmWorkingSetList->LastInitializedWsle = 4; /* The rule is that the owner process is always in the FLINK of the PDE's PFN entry */ - Pfn1 = MiGetPfnEntry(MiAddressToPte(PDE_BASE)->u.Hard.PageFrameNumber); + Pfn1 = MiGetPfnEntry(CurrentProcess->Pcb.DirectoryTableBase[0] >> PAGE_SHIFT); ASSERT(Pfn1->u4.PteFrame == MiGetPfnEntryIndex(Pfn1)); Pfn1->u1.Event = (PKEVENT)CurrentProcess; } @@ -963,13 +963,23 @@ MmInitializeProcessAddressSpace(IN PEPROCESS Process, OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); /* Setup the PFN for the PDE base of this process */ +#ifdef _M_AMD64 + PointerPte = MiAddressToPte(PXE_BASE); +#else PointerPte = MiAddressToPte(PDE_BASE); +#endif PageFrameNumber = PFN_FROM_PTE(PointerPte); + ASSERT(Process->Pcb.DirectoryTableBase[0] == PageFrameNumber * PAGE_SIZE); MiInitializePfn(PageFrameNumber, PointerPte, TRUE); /* Do the same for hyperspace */ +#ifdef _M_AMD64 + PointerPde = MiAddressToPxe((PVOID)HYPER_SPACE); +#else PointerPde = MiAddressToPde(HYPER_SPACE); +#endif PageFrameNumber = PFN_FROM_PTE(PointerPde); + //ASSERT(Process->Pcb.DirectoryTableBase[0] == PageFrameNumber * PAGE_SIZE); // we're not lucky MiInitializePfn(PageFrameNumber, (PMMPTE)PointerPde, TRUE); /* Setup the PFN for the PTE for the working set */ diff --git a/reactos/ntoskrnl/mm/ARM3/special.c b/reactos/ntoskrnl/mm/ARM3/special.c index ad599428340..2aa97a48043 100644 --- a/reactos/ntoskrnl/mm/ARM3/special.c +++ b/reactos/ntoskrnl/mm/ARM3/special.c @@ -261,7 +261,7 @@ MmAllocateSpecialPool(SIZE_T NumberOfBytes, ULONG Tag, POOL_TYPE PoolType, ULONG RtlZeroMemory(Header, sizeof(POOL_HEADER)); /* Save allocation size there */ - Header->Ulong1 = NumberOfBytes; + Header->Ulong1 = (ULONG)NumberOfBytes; /* Make sure it's all good */ ASSERT((NumberOfBytes <= PAGE_SIZE - sizeof(POOL_HEADER)) && @@ -286,7 +286,7 @@ MmAllocateSpecialPool(SIZE_T NumberOfBytes, ULONG Tag, POOL_TYPE PoolType, ULONG That time will be used to check memory consistency within the allocated page. */ Header->PoolTag = Tag; - Header->BlockSize = TickCount.LowPart; + Header->BlockSize = (USHORT)TickCount.LowPart; DPRINT1("%p\n", Entry); return Entry; } @@ -305,7 +305,7 @@ MiSpecialPoolCheckPattern(PUCHAR P, PPOOL_HEADER Header) Ptr = P + BytesRequested; /* Calculate how many bytes to check */ - BytesToCheck = (PUCHAR)PAGE_ALIGN(P) + PAGE_SIZE - Ptr; + BytesToCheck = (ULONG)((PUCHAR)PAGE_ALIGN(P) + PAGE_SIZE - Ptr); /* Remove pool header size if we're catching underruns */ if (((ULONG_PTR)P & (PAGE_SIZE - 1)) == 0) @@ -335,7 +335,7 @@ MmFreeSpecialPool(PVOID P) KIRQL Irql = KeGetCurrentIrql(); POOL_TYPE PoolType; ULONG BytesRequested, BytesReal = 0; - ULONG_PTR PtrOffset; + ULONG PtrOffset; PUCHAR b; PMI_FREED_SPECIAL_POOL FreedHeader; LARGE_INTEGER TickCount; @@ -358,7 +358,7 @@ MmFreeSpecialPool(PVOID P) } /* Determine if it's a underruns or overruns pool pointer */ - PtrOffset = (ULONG_PTR)P & (PAGE_SIZE - 1); + PtrOffset = (ULONG)((ULONG_PTR)P & (PAGE_SIZE - 1)); if (PtrOffset) { /* Pool catches overruns */ diff --git a/reactos/ntoskrnl/ps/job.c b/reactos/ntoskrnl/ps/job.c index 7bded05b5ef..7f1ac67005e 100644 --- a/reactos/ntoskrnl/ps/job.c +++ b/reactos/ntoskrnl/ps/job.c @@ -165,7 +165,8 @@ NtAssignProcessToJobObject ( ExAcquireRundownProtection(&Process->RundownProtect); if(NT_SUCCESS(Status)) { - if(Process->Job == NULL && Process->Session == Job->SessionId) + // FIXME: This is broken + if(Process->Job == NULL && PtrToUlong(Process->Session) == Job->SessionId) { /* Just store the pointer to the job object in the process, we'll assign it later. The reason we can't do this here is that locking @@ -269,7 +270,7 @@ NtCreateJobObject ( /* setup the job object */ InitializeListHead(&Job->ProcessListHead); - Job->SessionId = CurrentProcess->Session; /* inherit the session id from the caller */ + Job->SessionId = PtrToUlong(CurrentProcess->Session); /* inherit the session id from the caller, FIXME: broken */ Status = ExInitializeResource(&Job->JobLock); if(!NT_SUCCESS(Status)) diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index ce5232d9546..a5ff7d14ab0 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -1113,7 +1113,8 @@ ULONG NTAPI PsGetCurrentProcessSessionId(VOID) { - return PsGetCurrentProcess()->Session; + // FIXME: this is broken! + return PtrToUlong(PsGetCurrentProcess()->Session); } /* diff --git a/reactos/ntoskrnl/ps/query.c b/reactos/ntoskrnl/ps/query.c index 15ec9123c1c..1fbf36a4be1 100644 --- a/reactos/ntoskrnl/ps/query.c +++ b/reactos/ntoskrnl/ps/query.c @@ -419,7 +419,7 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, _SEH2_TRY { /* Write back the Session ID */ - SessionInfo->SessionId = Process->Session; //MmGetSessionId(Process); + SessionInfo->SessionId = PtrToUlong(PsGetProcessSessionId(Process)); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -818,32 +818,32 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, } _SEH2_END; break; - + case ProcessImageInformation: DPRINT1("Image Information Query Not implemented: %lx\n", ProcessInformationClass); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessDebugObjectHandle: DPRINT1("Debug Object Query Not implemented: %lx\n", ProcessInformationClass); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessHandleTracing: DPRINT1("Handle tracing Not implemented: %lx\n", ProcessInformationClass); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessLUIDDeviceMapsEnabled: DPRINT1("LUID Device Maps Not implemented: %lx\n", ProcessInformationClass); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessExecuteFlags: DPRINT1("No execute Not implemented: %lx\n", ProcessInformationClass); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessWow64Information: case ProcessLdtInformation: case ProcessWx86Information: @@ -855,12 +855,12 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, DPRINT1("WS Watch Not implemented: %lx\n", ProcessInformationClass); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessPooledUsageAndLimits: DPRINT1("Pool limits Not implemented: %lx\n", ProcessInformationClass); Status = STATUS_NOT_IMPLEMENTED; break; - + /* Not supported by Server 2003 */ default: DPRINT1("Unsupported info class: %lx\n", ProcessInformationClass); @@ -978,7 +978,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, Status = STATUS_PRIVILEGE_NOT_HELD; break; } - + /* Get the LPC Port */ Status = ObReferenceObjectByHandle(PortHandle, 0, @@ -1050,10 +1050,10 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, _SEH2_YIELD(break); } _SEH2_END; - + /* Set the mode */ Process->DefaultHardErrorProcessing = DefaultHardErrorMode; - + /* Call Ke for the update */ if (DefaultHardErrorMode & SEM_NOALIGNMENTFAULTEXCEPT) { @@ -1219,7 +1219,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, PsProcessPriorityBackground); Status = STATUS_SUCCESS; break; - + case ProcessBasePriority: /* Validate input length */ @@ -1242,7 +1242,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, _SEH2_YIELD(break); } _SEH2_END; - + /* Extract the memory priority out of there */ if (BasePriority & 0x80000000) { @@ -1253,22 +1253,22 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, { MemoryPriority = MEMORY_PRIORITY_BACKGROUND; } - + /* Validate the number */ if ((BasePriority > HIGH_PRIORITY) || (BasePriority <= LOW_PRIORITY)) { return STATUS_INVALID_PARAMETER; } - + /* Check if the new base is higher */ if (BasePriority > Process->Pcb.BasePriority) { DPRINT1("Should check privilege\n"); } - + /* Call Ke */ KeSetPriorityAndQuantumProcess(&Process->Pcb, BasePriority, 0); - + /* Now set the memory priority */ MmSetMemoryPriorityProcess(Process, MemoryPriority); Status = STATUS_SUCCESS; @@ -1351,14 +1351,14 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, _SEH2_YIELD(break); } _SEH2_END; - + /* Setting 'break on termination' requires the SeDebugPrivilege */ if (!SeSinglePrivilegeCheck(SeDebugPrivilege, PreviousMode)) { Status = STATUS_PRIVILEGE_NOT_HELD; break; } - + /* Set or clear the flag */ if (Break) { @@ -1370,9 +1370,9 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, } break; - + case ProcessAffinityMask: - + /* Check buffer length */ if (ProcessInformationLength != sizeof(KAFFINITY)) { @@ -1393,7 +1393,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, _SEH2_YIELD(break); } _SEH2_END; - + /* Make sure it's valid for the CPUs present */ ValidAffinity = Affinity & KeActiveProcessors; if (!Affinity || (ValidAffinity != Affinity)) @@ -1435,7 +1435,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, Status = STATUS_PROCESS_IS_TERMINATING; } break; - + /* Priority Boosting status */ case ProcessPriorityBoost: @@ -1469,7 +1469,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, /* Call Ke to do the work */ KeSetDisableBoostProcess(&Process->Pcb, DisableBoost); - + /* Loop the threads too */ for (Next = Process->ThreadListHead.Flink; Next != &Process->ThreadListHead; @@ -1494,7 +1494,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, Status = STATUS_PROCESS_IS_TERMINATING; } break; - + case ProcessDebugFlags: /* Check buffer length */ @@ -1516,7 +1516,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, _SEH2_YIELD(break); } _SEH2_END; - + /* Set the mode */ if (DebugFlags & ~1) { @@ -1537,7 +1537,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, /* Done */ Status = STATUS_SUCCESS; break; - + case ProcessEnableAlignmentFaultFixup: /* Check buffer length */ @@ -1559,7 +1559,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, _SEH2_YIELD(break); } _SEH2_END; - + /* Set the mode */ if (EnableFixup) { @@ -1569,12 +1569,12 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, { Process->DefaultHardErrorProcessing &= ~SEM_NOALIGNMENTFAULTEXCEPT; } - + /* Call Ke for the update */ KeSetAutoAlignmentProcess(&Process->Pcb, FALSE); Status = STATUS_SUCCESS; break; - + /* We currently don't implement any of these */ case ProcessLdtInformation: case ProcessLdtSize: @@ -1584,32 +1584,32 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, DPRINT1("VDM/16-bit Request not implemented: %lx\n", ProcessInformationClass); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessQuotaLimits: DPRINT1("Quota Limits not implemented\n"); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessWorkingSetWatch: DPRINT1("WS watch not implemented\n"); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessDeviceMap: DPRINT1("Device map not implemented\n"); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessHandleTracing: DPRINT1("Handle tracing not implemented\n"); Status = STATUS_NOT_IMPLEMENTED; break; - + case ProcessExecuteFlags: DPRINT1("No execute support not implemented\n"); Status = STATUS_NOT_IMPLEMENTED; break; - + /* Anything else is invalid */ default: DPRINT1("Invalid Server 2003 Info Class: %lx\n", ProcessInformationClass); From a0f9dfe66d8e1f9f5028b691fe56ceed46a64587 Mon Sep 17 00:00:00 2001 From: Olaf Siejka Date: Sun, 5 Feb 2012 12:21:11 +0000 Subject: [PATCH 214/289] [TRANSLATION] - Bulgarian translation update of several modules (bug no. 6840), by CCTANEB, minor fixes by me; - Polish translation update of sysdm by me; svn path=/trunk/; revision=55424 --- reactos/base/applications/calc/lang/bg-BG.rc | 92 +-- .../base/applications/charmap/lang/bg-BG.rc | 15 +- .../base/applications/mplay32/lang/bg-BG.rc | 3 + .../base/applications/mspaint/lang/bg-BG.rc | 14 +- .../applications/network/ping/lang/bg-BG.rc | 41 ++ .../base/applications/network/ping/ping.rc | 1 + reactos/base/applications/rapps/lang/bg-BG.rc | 8 +- .../base/applications/regedit/lang/bg-BG.rc | 557 +++++++++--------- .../base/applications/regedit/lang/en-US.rc | 2 +- .../base/applications/sndvol32/lang/bg-BG.rc | 16 +- reactos/base/applications/write/Bg.rc | 38 ++ reactos/base/applications/write/rsrc.rc | 1 + reactos/base/setup/usetup/lang/bg-BG.h | 8 +- reactos/base/system/format/lang/bg-BG.rc | 8 +- reactos/base/system/subst/lang/bg-BG.rc | 21 + reactos/base/system/subst/rsrc.rc | 1 + reactos/dll/cpl/input/lang/bg-BG.rc | 378 ++++++------ reactos/dll/cpl/input/rsrc.rc | 2 +- reactos/dll/cpl/intl/lang/bg-BG.rc | 2 +- reactos/dll/cpl/sysdm/lang/bg-BG.rc | 24 +- reactos/dll/cpl/sysdm/lang/pl-PL.rc | 4 +- reactos/dll/win32/browseui/lang/bg-BG.rc | 4 +- reactos/dll/win32/kernel32/winnls/nls/bgr.nls | 36 +- reactos/dll/win32/msports/lang/bg-BG.rc | 24 + reactos/dll/win32/msports/msports.rc | 3 +- reactos/dll/win32/syssetup/lang/bg-BG.rc | 4 +- 26 files changed, 733 insertions(+), 574 deletions(-) create mode 100644 reactos/base/applications/network/ping/lang/bg-BG.rc create mode 100644 reactos/base/applications/write/Bg.rc create mode 100644 reactos/base/system/subst/lang/bg-BG.rc create mode 100644 reactos/dll/win32/msports/lang/bg-BG.rc diff --git a/reactos/base/applications/calc/lang/bg-BG.rc b/reactos/base/applications/calc/lang/bg-BG.rc index 2248b4fbfab..8fc04784f0a 100644 --- a/reactos/base/applications/calc/lang/bg-BG.rc +++ b/reactos/base/applications/calc/lang/bg-BG.rc @@ -1,4 +1,8 @@ -//Ðедовършен +/* Превод на БългарÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* LOCATION: \base\applications\calc\lang */ +/* Ðедовършен / Incomplete */ + LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT // Dialog @@ -134,11 +138,11 @@ BEGIN PUSHBUTTON "Дроб",IDC_BUTTON_F,286,140,24,18,BS_CENTER | BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP GROUPBOX "",IDC_STATIC,147,14,163,20 - CONTROL "Qword",IDC_RADIO_QWORD,"Button",BS_AUTORADIOBUTTON | + CONTROL "ЧДума",IDC_RADIO_QWORD,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,150,21,38,10 - CONTROL "Dword",IDC_RADIO_DWORD,"Button",BS_AUTORADIOBUTTON | + CONTROL "ДДума",IDC_RADIO_DWORD,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,190,21,38,10 - CONTROL "Word",IDC_RADIO_WORD,"Button",BS_AUTORADIOBUTTON | NOT + CONTROL "Дума",IDC_RADIO_WORD,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,230,21,38,10 CONTROL "Байт",IDC_RADIO_BYTE,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,270,21,38,10 @@ -205,7 +209,7 @@ BEGIN BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP PUSHBUTTON "+",IDC_BUTTON_ADD,114,105,24,18,BS_CENTER | BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP - PUSHBUTTON "Sqrt",IDC_BUTTON_SQRT,140,45,24,18,BS_CENTER | + PUSHBUTTON "Крн2",IDC_BUTTON_SQRT,144,48,24,17,BS_CENTER | BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP PUSHBUTTON "%",IDC_BUTTON_PERCENT,140,65,24,18,BS_CENTER | BS_VCENTER | BS_NOTIFY | BS_OWNERDRAW | WS_TABSTOP @@ -232,21 +236,21 @@ CAPTION "ИзчиÑлителÑÑ‚ на РеактОС" MENU IDR_MENU_STANDARD FONT 8, "MS Shell Dlg" BEGIN - PUSHBUTTON "Convert",IDC_BUTTON_CONVERT,35,105,76,17 + PUSHBUTTON "Преобразуване",IDC_BUTTON_CONVERT,35,105,76,17 COMBOBOX IDC_COMBO_CATEGORY,5,31,140,168,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | CBS_SORT - LTEXT "Category:",IDC_STATIC,5,20,56,8 - COMBOBOX IDC_COMBO_FROM,5,60,140,168,CBS_DROPDOWNLIST | + LTEXT "Раздел:",IDC_STATIC,4,20,56,8 + COMBOBOX IDC_COMBO_FROM,4,60,140,168,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | CBS_SORT - LTEXT "Convert from:",IDC_STATIC,5,49,56,8 - COMBOBOX IDC_COMBO_TO,5,87,140,168,CBS_DROPDOWNLIST | WS_VSCROLL | + LTEXT "Преобразуване от:",IDC_STATIC,4,49,56,8 + COMBOBOX IDC_COMBO_TO,4,87,140,168,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | CBS_SORT - LTEXT "Convert to:",IDC_STATIC,5,76,56,8 + LTEXT "Преобразуване в:",IDC_STATIC,4,76,56,8 CONTROL "C",IDC_BUTTON_CANC,"Button",BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,276,24,40,17 CONTROL "CE",IDC_BUTTON_CE,"Button",BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,232,24,40,17 - CONTROL "Back",IDC_BUTTON_BACK,"Button",BS_OWNERDRAW | + CONTROL "Ðазад",IDC_BUTTON_BACK,"Button",BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,188,24, 40,17 RTEXT "",IDC_TEXT_OUTPUT,5,1,312,14,SS_CENTERIMAGE, @@ -283,7 +287,7 @@ BEGIN BS_VCENTER | BS_NOTIFY | WS_TABSTOP,266,86,24,18 CONTROL "+",IDC_BUTTON_ADD,"Button",BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,266,105,24,18 - CONTROL "Sqrt",IDC_BUTTON_SQRT,"Button",BS_OWNERDRAW | BS_CENTER | + CONTROL "Крн2",IDC_BUTTON_SQRT,"Button",BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,292,48,24,18 CONTROL "%",IDC_BUTTON_PERCENT,"Button",BS_OWNERDRAW | BS_CENTER | BS_VCENTER | BS_NOTIFY | WS_TABSTOP,292,67,24,18 @@ -445,7 +449,7 @@ BEGIN IDS_CONV_CONSUMPTION "Потребление (двигатели)" IDS_CONV_CURRENCY "Парични единици" IDS_CONV_ENERGY "ЕнергиÑ" - IDS_CONV_LENGTH "Дължини" + IDS_CONV_LENGTH "Дължина" IDS_CONV_POWER "МощноÑÑ‚" IDS_CONV_PRESSURE "ÐалÑгане" IDS_CONV_TEMPERATURE "Температура" @@ -467,9 +471,9 @@ END STRINGTABLE DISCARDABLE BEGIN IDS_AREA_ACRES "Ðкри" - IDS_AREA_ACRES_BRAZIL "Ðкри (БразилÑки)" - IDS_AREA_ACRES_FRANCE "Ðкри (ФренÑки)" - IDS_AREA_ACRES_SCOTS "Ðкри (ШотландÑки)" + IDS_AREA_ACRES_BRAZIL "Ðкри (бразилÑки)" + IDS_AREA_ACRES_FRANCE "Ðкри (френÑки)" + IDS_AREA_ACRES_SCOTS "Ðкри (шотландÑки)" IDS_AREA_ACRES_US "Ðкри (СÐЩ)" IDS_AREA_ARES "Ðрове" IDS_AREA_CHOU "Chou" @@ -514,34 +518,34 @@ END // TYPES OF CURRENCIES STRINGTABLE DISCARDABLE BEGIN - IDS_CURRENCY_AUSTRIAN_SCHILLING "Austrian schilling" - IDS_CURRENCY_BELGIAN_FRANC "Belgian franc" - IDS_CURRENCY_CYPRIOT_POUND "Cypriot pound" + IDS_CURRENCY_AUSTRIAN_SCHILLING "ÐвÑтрийÑки шилинг" + IDS_CURRENCY_BELGIAN_FRANC "БелгийÑки франк" + IDS_CURRENCY_CYPRIOT_POUND "КипърÑка лира" IDS_CURRENCY_CZECH_KORUNA "Чешка крона" - IDS_CURRENCY_DEUTSCHE_MARK "Deutsche Mark" - IDS_CURRENCY_DUTCH_GUILDER "Dutch guilder" + IDS_CURRENCY_DEUTSCHE_MARK "ГерманÑка марка" + IDS_CURRENCY_DUTCH_GUILDER "ХоландÑки гулден" IDS_CURRENCY_EURO "Евро" - IDS_CURRENCY_FINNISH_MARKKA "Finnish markka" - IDS_CURRENCY_FRENCH_FRANC "French franc" - IDS_CURRENCY_GREEK_DRACHMA "Greek Drachma" - IDS_CURRENCY_IRISH_POUND "Irish pound" - IDS_CURRENCY_ITALIAN_LIRA "Italian lira" - IDS_CURRENCY_LUXEMBOURG_FRANC "Luxembourg franc" - IDS_CURRENCY_MALTESE_LIRA "Maltese lira" - IDS_CURRENCY_PORTOGUESE_ESCUDO "Portoguese escudo" - IDS_CURRENCY_SLOVAK_KORUNA "Slovak koruna" - IDS_CURRENCY_SLOVENIAN_TOLAR "Slovenian tolar" - IDS_CURRENCY_SPANISH_PESETA "Spanish peseta" + IDS_CURRENCY_FINNISH_MARKKA "ФинÑка марка" + IDS_CURRENCY_FRENCH_FRANC "ФренÑки франк" + IDS_CURRENCY_GREEK_DRACHMA "Гръцка драхма" + IDS_CURRENCY_IRISH_POUND "ИрландÑка лира" + IDS_CURRENCY_ITALIAN_LIRA "ИталианÑка лира" + IDS_CURRENCY_LUXEMBOURG_FRANC "ЛюкÑембургÑки франк" + IDS_CURRENCY_MALTESE_LIRA "МалтийÑка лира" + IDS_CURRENCY_PORTOGUESE_ESCUDO "ПортугалÑко еÑкудо" + IDS_CURRENCY_SLOVAK_KORUNA "Словашка крона" + IDS_CURRENCY_SLOVENIAN_TOLAR "СловенÑи толар" + IDS_CURRENCY_SPANISH_PESETA "ИÑпанÑка пеÑета" END // TYPES OF ENERGIES STRINGTABLE DISCARDABLE BEGIN - IDS_ENERGY_15_C_CALORIES "15-градуÑни калории" - IDS_ENERGY_BTUS "БританÑки термални единици" + IDS_ENERGY_15_C_CALORIES "15-градуÑови калории" + IDS_ENERGY_BTUS "БританÑки топлинни единици" IDS_ENERGY_ERGS "Ергове" IDS_ENERGY_EVS "Електронволти" - IDS_ENERGY_FOOT_POUNDS "Foot-Pounds" + IDS_ENERGY_FOOT_POUNDS "Стъпки-фунтове" IDS_ENERGY_IT_CALORIES "Международни таблични калории" IDS_ENERGY_IT_KILOCALORIES "Международни таблични килокалории" IDS_ENERGY_JOULES "Джаули" @@ -606,8 +610,8 @@ END // TYPES OF POWERS STRINGTABLE DISCARDABLE BEGIN - IDS_POWER_BTUS_PER_MINUTE "British Thermal Units per minute" - IDS_POWER_FPS_PER_MINUTE "Foot-Pounds per minute" + IDS_POWER_BTUS_PER_MINUTE "БританÑки топлинни единици в минута" + IDS_POWER_FPS_PER_MINUTE "Стъпки-фунтове в минута" IDS_POWER_HORSEPOWER "КонÑки Ñили" IDS_POWER_KILOWATTS "Киловатове" IDS_POWER_MEGAWATTS "Мегаватове" @@ -640,7 +644,7 @@ STRINGTABLE DISCARDABLE BEGIN IDS_TIME_DAYS "Дни" IDS_TIME_HOURS "ЧаÑи" - IDS_TIME_NANOSECONDS "Nanoseconds" + IDS_TIME_NANOSECONDS "ÐаноÑекунди" IDS_TIME_MICROSECONDS "МикроÑекунди" IDS_TIME_MILLISECONDS "МилиÑекунди" IDS_TIME_MINUTES "Минути" @@ -678,7 +682,7 @@ BEGIN IDS_VOLUME_DOE "Doe" IDS_VOLUME_FLUID_OUNCES_UK "Течни унции (ОК)" IDS_VOLUME_FLUID_OUNCES_US "Течни унции (СÐЩ)" - IDS_VOLUME_GALLONS_UK "Галони (UK)" + IDS_VOLUME_GALLONS_UK "Галони (ОК)" IDS_VOLUME_GALLONS_DRY_US "Галони, Ñухи (СÐЩ)" IDS_VOLUME_GALLONS_LIQUID_US "Галони, течни (СÐЩ)" IDS_VOLUME_GOU "Gou" @@ -712,13 +716,13 @@ BEGIN IDS_WEIGHT_GRAMS "Grams" IDS_WEIGHT_GWAN "Gwan" IDS_WEIGHT_HARB "Harb" - IDS_WEIGHT_JIN_CHINA "Джинове (Китай)" - IDS_WEIGHT_JIN_TAIWAN "Джинове (Тайван)" + IDS_WEIGHT_JIN_CHINA "Джинове (китайÑки)" + IDS_WEIGHT_JIN_TAIWAN "Джинове (тайванÑки)" IDS_WEIGHT_KAN "Kan" IDS_WEIGHT_KILOGRAMS "Килограми" IDS_WEIGHT_KIN "Kin" - IDS_WEIGHT_LIANG_CHINA "Liang (China)" - IDS_WEIGHT_LIANG_TAIWAN "Liang (Taiwan)" + IDS_WEIGHT_LIANG_CHINA "Liang (китайÑки)" + IDS_WEIGHT_LIANG_TAIWAN "Liang (тайванÑки)" IDS_WEIGHT_MONME "Monme" IDS_WEIGHT_OUNCES_AVOIRDUPOIS "Унции, avoirdupois" IDS_WEIGHT_OUNCES_TROY "Унции, трой" diff --git a/reactos/base/applications/charmap/lang/bg-BG.rc b/reactos/base/applications/charmap/lang/bg-BG.rc index 6f6fa36607a..13fadcfd082 100644 --- a/reactos/base/applications/charmap/lang/bg-BG.rc +++ b/reactos/base/applications/charmap/lang/bg-BG.rc @@ -1,3 +1,6 @@ +/* Превод на БългарÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ + LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT IDD_CHARMAP DIALOGEX 6, 6, 292, 224 @@ -12,21 +15,21 @@ BEGIN CONTROL "",IDC_TEXTBOX,RICHEDIT_CLASS,ES_AUTOHSCROLL | WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 74, 186, 114, 13 DEFPUSHBUTTON "Избор", IDC_SELECT, 194, 186, 44, 13 PUSHBUTTON "ЗапомнÑне", IDC_COPY, 242, 186, 44, 13, WS_DISABLED - CONTROL "Advanced view",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 + CONTROL "Разширен изглед",IDC_CHECK_ADVANCED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 8, 208, 95, 10 END IDD_ADVANCED DIALOGEX 0, 0, 292, 64 STYLE DS_SHELLFONT | WS_CHILD FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Charset:",IDC_STATIC,8,8,48,8 + LTEXT "Знаков набор:",IDC_STATIC,8,8,48,8 COMBOBOX IDC_COMBO_CHARSET,72,4,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Group by:",IDC_STATIC,8,28,50,8 + LTEXT "Сбиране по:",IDC_STATIC,8,28,50,8 COMBOBOX IDC_COMBO_GROUPBY,72,24,116,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "Search",IDC_BUTTON_SEARCH,200,44,50,14 + PUSHBUTTON "ТърÑене",IDC_BUTTON_SEARCH,200,44,50,14 EDITTEXT IDC_EDIT_SEARCH,72,44,116,14,ES_AUTOHSCROLL - LTEXT "Search for:",IDC_STATIC,8,48,42,8 - LTEXT "Unicode:",IDC_STATIC,200,8,30,8 + LTEXT "ТърÑене на:",IDC_STATIC,8,48,42,8 + LTEXT "Уникод:",IDC_STATIC,200,8,30,8 EDITTEXT IDC_EDIT_UNICODE,236,4,28,12,ES_AUTOHSCROLL END diff --git a/reactos/base/applications/mplay32/lang/bg-BG.rc b/reactos/base/applications/mplay32/lang/bg-BG.rc index ed440ff30fe..cb124363f53 100644 --- a/reactos/base/applications/mplay32/lang/bg-BG.rc +++ b/reactos/base/applications/mplay32/lang/bg-BG.rc @@ -1,3 +1,6 @@ +/* Превод на БългарÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* LOCATION:\base\applications\mplay32\lang */ LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT IDR_MAINMENU MENU diff --git a/reactos/base/applications/mspaint/lang/bg-BG.rc b/reactos/base/applications/mspaint/lang/bg-BG.rc index a1b324828fe..b7e9c792910 100644 --- a/reactos/base/applications/mspaint/lang/bg-BG.rc +++ b/reactos/base/applications/mspaint/lang/bg-BG.rc @@ -1,9 +1,9 @@ /* * PROJECT: PAINT for ReactOS * LICENSE: unknown (LGPL assumed) - * FILE: base/applications/mspaint/lang/bg-BG.rc - * PURPOSE: Bulgarian Language resource file - * TRANSLATORS: unknown + * Превод на БългарÑки/ Bulgarian translation + * http://www.reactos.org/wiki/Bulgarian_translation + * LOCATION: \base\applications\mspaint\lang */ LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT @@ -178,8 +178,8 @@ STRINGTABLE BEGIN IDS_PROGRAMNAME, "РиÑуване" IDS_WINDOWTITLE, "%s - риÑуване" - IDS_INFOTITLE, "РиÑунък (Paint) за РеактОС" - IDS_INFOTEXT, "РиÑунък (Paint) за РеактОС е доÑтъпен под GNU Lesser General Public License (LGPL) верÑÐ¸Ñ 3 (see www.gnu.org)" + IDS_INFOTITLE, "РиÑувач (Paint) за РеактОС" + IDS_INFOTEXT, "РиÑувач (Paint) за РеактОС е доÑтъпен под GNU Lesser General Public License (LGPL) верÑÐ¸Ñ 3 (see www.gnu.org)" IDS_SAVEPROMPTTEXT, "ИÑкате ли да запишете промените в %s?" IDS_DEFAULTFILENAME, "Без име.bmp" IDS_MINIATURETITLE, "Изображенийце" @@ -201,6 +201,6 @@ BEGIN IDS_TOOLTIP16, "Заоблен правоъгълник" IDS_OPENFILTER, "Файлове bitmap (*.bmp;*.dib)\1*.bmp;*.dib\1Ð’Ñички файлове (*.*)\1*.*\1" IDS_SAVEFILTER, "24 разрÑдни файлове bitmap (*.bmp;*.dib)\1*.bmp;*.dib\1" - IDS_FILESIZE, "%d bytes" - IDS_PRINTRES, "%d x %d pixels per meter" + IDS_FILESIZE, "%d разрÑда" + IDS_PRINTRES, "%d x %d точки на метър" END diff --git a/reactos/base/applications/network/ping/lang/bg-BG.rc b/reactos/base/applications/network/ping/lang/bg-BG.rc new file mode 100644 index 00000000000..5bcba1023bb --- /dev/null +++ b/reactos/base/applications/network/ping/lang/bg-BG.rc @@ -0,0 +1,41 @@ +/* + * Превод на БългарÑки/ Bulgarian translation + * http://www.reactos.org/wiki/Bulgarian_translation + * LOCATION: \base\applications\network\ping\lang + */ + +LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +BEGIN + IDS_USAGE "\nУпотреба: ping [-t] [-n пъти] [-l размер] [-w проÑрочване] целеви_приемник\n\n\ +ВъзможноÑти:\n\ + -t Прави пинг към ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð½Ð¸Ðº до прекъÑване.\n\ + За прекъÑване- натиÑнете Контрол+C.\n\ + -n пъти Колко пъти да бъдат подадени заÑвките.\n\ + -l размер Размер на Ð¸Ð·Ð¿Ñ€Ð°Ñ‰Ð°Ð½Ð¸Ñ Ð±ÑƒÑ„ÐµÑ€.\n\ + -w проÑрочване ПроÑрочване на чакането [милиÑекунди].\n\n\0" + + IDS_PING_WITH_BYTES "\nПрави пинг %1 [%2] Ñ %3!d! байта данни:\n\n\0" + IDS_PING_STATISTICS "\nСтатиÑтика за пинга за %1:\n\0" + IDS_PACKETS_SENT_RECEIVED_LOST " Пакети: пратени= %1!d!, получени= %2!d!, изгубени = %3!d! (%4!d!%% загуби),\n\0" + IDS_APPROXIMATE_ROUND_TRIP "Приблизителна времетраене на приемо-предаването:\n\0" + IDS_MIN_MAX_AVERAGE " Ðай-малко= %1, Ðай-голÑмо= %2, Средно= %3\n\0" + IDS_NOT_ENOUGH_RESOURCES "ÐÑма доÑтатъчно Ñвободни ÑредÑтва.\n\0" + IDS_UNKNOWN_HOST "ÐеизвеÑтен приемник %1.\n\0" + IDS_SETSOCKOPT_FAILED "Грешка при setsockopt (%1!d!).\n\0" + IDS_COULD_NOT_CREATE_SOCKET "Грешка при Ñъздаване на гнездо (#%1!d!).\n\0" + IDS_COULD_NOT_INIT_WINSOCK "Грешка при подкаравнето на библиотеката (dll) за winsock.\n\0" + IDS_DEST_MUST_BE_SPECIFIED "ТрÑбва да укажете името или IP адреÑа на целевиÑÑ‚ приемник.\n\0" + IDS_BAD_PARAMETER "Ðеправилен параметър %1.\n\0" + IDS_BAD_OPTION_FORMAT "Ðеправилно запиÑване на възможноÑтта %1.\n\0" + IDS_BAD_OPTION "Ðеправилна ÑтойноÑÑ‚ %1.\n\0" + IDS_BAD_VALUE_OPTION_L "Ðеправилна ÑтойноÑÑ‚ за -l, допуÑтимите Ñа от 0 до %1!d!.\n\0" + IDS_REPLY_FROM "Отговор от %1: байта=%2!d! време%3%4 ВЖ(TTL)=%5!d!\n\0" + IDS_DEST_UNREACHABLE "Ð¦ÐµÐ»ÐµÐ²Ð¸Ñ Ð¿Ñ€Ð¸ÐµÐ¼Ð½Ð¸Ðº е недоÑтижим.\n\0" + IDS_COULD_NOT_TRANSMIT "Грешка при предаване на данните (%1!d!).\n\0" + IDS_COULD_NOT_RECV "Грешка при получаване на данните (%1!d!).\n\0" + IDS_REQUEST_TIMEOUT "ЗаÑвката е проÑрочена.\n\0" + IDS_MS "мÑ\0" + IDS_1MS "1 мÑ\0" +END diff --git a/reactos/base/applications/network/ping/ping.rc b/reactos/base/applications/network/ping/ping.rc index 354e899072b..f54602fb425 100644 --- a/reactos/base/applications/network/ping/ping.rc +++ b/reactos/base/applications/network/ping/ping.rc @@ -9,6 +9,7 @@ // UTF-8 #pragma code_page(65001) +#include "lang/bg-BG.rc" #include "lang/cs-CZ.rc" #include "lang/de-DE.rc" #include "lang/en-US.rc" diff --git a/reactos/base/applications/rapps/lang/bg-BG.rc b/reactos/base/applications/rapps/lang/bg-BG.rc index 0d140c6db58..6dab7e2e344 100644 --- a/reactos/base/applications/rapps/lang/bg-BG.rc +++ b/reactos/base/applications/rapps/lang/bg-BG.rc @@ -1,3 +1,7 @@ +/* Превод на БългарÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* LOCATION: \base\applications\rapps\lang */ + LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT IDR_MAINMENU MENU @@ -185,8 +189,8 @@ BEGIN IDS_UPDATES "ОбновлениÑ" IDS_APPLICATIONS "ПриложениÑ" IDS_CHOOSE_FOLDER_TEXT "Изберете папка, в коÑто да Ñе ÑвалÑÑ‚ приложениÑта:" - IDS_CHOOSE_FOLDER_ERROR "Указали Ñте неÑÑŠÑшеÑтвуваща папка!" - IDS_USER_NOT_ADMIN "You should be administrator for start ""УправителÑÑ‚ за Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° РеактОС""!" + IDS_CHOOSE_FOLDER_ERROR "Указали Ñте неÑъщеÑтвуваща папка!" + IDS_USER_NOT_ADMIN "ТрÑбва да имате управничеÑки права, за да запуÑнете â€žÐ£Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»Ñ Ð·Ð° Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° РеактОС“!" IDS_APP_REG_REMOVE "Уверен ли Ñте, че иÑкате да изтриете данните за Ñложеното приложение от региÑтъра?" IDS_INFORMATION "СведениÑ" IDS_UNABLE_TO_REMOVE "Премахването на данните за приложението от региÑтъра е невъзможно!" diff --git a/reactos/base/applications/regedit/lang/bg-BG.rc b/reactos/base/applications/regedit/lang/bg-BG.rc index c6cd14fe47c..6fbce2fee8e 100644 --- a/reactos/base/applications/regedit/lang/bg-BG.rc +++ b/reactos/base/applications/regedit/lang/bg-BG.rc @@ -1,4 +1,3 @@ -//Ãĺäîâúđřĺí /* * Regedit resources * @@ -19,6 +18,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/* Превод на БългарÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* LOCATION: \svn\base\applications\regedit\lang */ +/* ÐЕДОВЪРШЕÐ/ INCOMPLETE */ + LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT ID_ACCEL ACCELERATORS @@ -36,82 +40,82 @@ END IDC_REGEDIT MENU DISCARDABLE BEGIN - POPUP "&Ôŕéë" + POPUP "&Файл" BEGIN - MENUITEM "Čç&őîä", ID_REGISTRY_EXIT + MENUITEM "Из&ход", ID_REGISTRY_EXIT END - POPUP "Ďîěî&ů" + POPUP "Помо&щ" BEGIN - MENUITEM "&Çŕ...", ID_HELP_ABOUT + MENUITEM "&За...", ID_HELP_ABOUT END END IDR_REGEDIT_MENU MENU DISCARDABLE BEGIN - POPUP "&Ôŕéë" + POPUP "&Файл" BEGIN - MENUITEM "&Âíîń...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "&ВноÑ...", ID_REGISTRY_IMPORTREGISTRYFILE - MENUITEM "&Čçíîń...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM "&ИзноÑ...", ID_REGISTRY_EXPORTREGISTRYFILE MENUITEM SEPARATOR - MENUITEM "Çŕđĺćäŕíĺ íŕ đîé...", ID_REGISTRY_LOADHIVE, GRAYED - MENUITEM "Čçîńňŕâ˙íĺ íŕ đîé...", ID_REGISTRY_UNLOADHIVE, GRAYED + MENUITEM "Зареждане на рой...", ID_REGISTRY_LOADHIVE, GRAYED + MENUITEM "ИзоÑтавÑне на рой...", ID_REGISTRY_UNLOADHIVE, GRAYED MENUITEM SEPARATOR - MENUITEM "&Ńâúđçâŕíĺ Å„ ěđĺćîâ đĺăÄńňúđ...", + MENUITEM "&Свързване Ñ Ð¼Ñ€ÐµÐ¶Ð¾Ð² региÑтър...", ID_REGISTRY_CONNECTNETWORKREGISTRY - MENUITEM "&Äŕçäĺë˙íĺ îň ěđĺćîâ đĺăÄńňúđ...", + MENUITEM "&РазделÑне от мрежов региÑтър...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY , GRAYED MENUITEM SEPARATOR - MENUITEM "Îň&Äĺ÷ŕňâŕíĺ\tCtrl+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM "От&печатване\tCtrl+P", ID_REGISTRY_PRINT, GRAYED MENUITEM SEPARATOR - MENUITEM "Čç&őîä", ID_REGISTRY_EXIT + MENUITEM "Из&ход", ID_REGISTRY_EXIT END - POPUP "&Îáđŕáîňęŕ" + POPUP "&Обработка" BEGIN - MENUITEM "&Ďđîě˙íŕ", ID_EDIT_MODIFY + MENUITEM "&ПромÑна", ID_EDIT_MODIFY MENUITEM SEPARATOR - POPUP "&Ãîâ" + POPUP "&Ðов" BEGIN - MENUITEM "&Ęëţ÷", ID_EDIT_NEW_KEY + MENUITEM "&Ключ", ID_EDIT_NEW_KEY MENUITEM SEPARATOR - MENUITEM "&ÃÄçîâŕ ńňîéíîńň", ID_EDIT_NEW_STRINGVALUE - MENUITEM "&ÄâîÄ÷íŕ ńňîéíîńň", ID_EDIT_NEW_BINARYVALUE - MENUITEM "&Ńňîéíîńň íŕ ääóěŕ (dword)", ID_EDIT_NEW_DWORDVALUE - MENUITEM "&ĚíîăîíÄçîâŕ ńňîéíîńň", ID_EDIT_NEW_MULTISTRINGVALUE - MENUITEM "&ÄŕçřÄđ˙ĺěŕ íÄçîâŕ ńňîéíîńň", ID_EDIT_NEW_EXPANDABLESTRINGVALUE + MENUITEM "&Ðизова ÑтойноÑÑ‚", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Двоична ÑтойноÑÑ‚", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&СтойноÑÑ‚ на ддума (dword)", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&Многонизова ÑтойноÑÑ‚", ID_EDIT_NEW_MULTISTRINGVALUE + MENUITEM "&РазширÑема низова ÑтойноÑÑ‚", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END MENUITEM SEPARATOR - MENUITEM "&Ďđŕâŕ...", ID_EDIT_PERMISSIONS + MENUITEM "&Права...", ID_EDIT_PERMISSIONS MENUITEM SEPARATOR - MENUITEM "Čç&ňđÄâŕíĺ\tDel", ID_EDIT_DELETE - MENUITEM "Ďđĺ&Äěĺíóâŕíĺ", ID_EDIT_RENAME + MENUITEM "Из&триване\tDel", ID_EDIT_DELETE + MENUITEM "Пре&именуване", ID_EDIT_RENAME MENUITEM SEPARATOR - MENUITEM "&ÇŕÄîěí˙íĺ íŕ ńňîéíîńňňŕ íŕ ęëţ÷ŕ", ID_EDIT_COPYKEYNAME + MENUITEM "&ЗапомнÑне на ÑтойноÑтта на ключа", ID_EDIT_COPYKEYNAME MENUITEM SEPARATOR - MENUITEM "&Ňúđńĺíĺ\tCtrl+F", ID_EDIT_FIND - MENUITEM "Ňúđńĺíĺ íŕ ńëĺäâŕ&ůî\tF3", ID_EDIT_FINDNEXT + MENUITEM "&ТърÑене\tCtrl+F", ID_EDIT_FIND + MENUITEM "ТърÑене на Ñледва&що\tF3", ID_EDIT_FINDNEXT END - POPUP "&Čçăëĺä" + POPUP "&Изглед" BEGIN - MENUITEM "&Ëĺíňŕ íŕ ńúńňî˙íÄĺňî", ID_VIEW_STATUSBAR + MENUITEM "&Лента на ÑÑŠÑтоÑнието", ID_VIEW_STATUSBAR MENUITEM SEPARATOR - MENUITEM "Äŕç&äĺëÄňĺë", ID_VIEW_SPLIT + MENUITEM "Раз&делител", ID_VIEW_SPLIT MENUITEM SEPARATOR - MENUITEM "ÃŽ&Äđĺńí˙âŕíĺ\tF5", ID_VIEW_REFRESH + MENUITEM "О&преÑнÑване\tF5", ID_VIEW_REFRESH END - POPUP "&ËţáÄěęÄ" + POPUP "&Любимки" BEGIN - MENUITEM "&Äîáŕâęŕ ęúě ëţáÄěęÄňĺ", ID_FAVOURITES_ADDTOFAVOURITES, GRAYED - MENUITEM "Ďđĺ&ěŕőâŕíĺ íŕ ëţáÄěęÄňĺ", ID_FAVOURITES_REMOVEFAVOURITE, GRAYED + MENUITEM "&ДобавÑне към любимките", ID_FAVOURITES_ADDTOFAVOURITES, GRAYED + MENUITEM "Пре&махване на любимките", ID_FAVOURITES_REMOVEFAVOURITE, GRAYED END - POPUP "Ďîěî&ů" + POPUP "Помо&щ" BEGIN - MENUITEM "&ŃúäúđćŕíÄĺ íŕ Äîěîůňŕ\tF1", ID_HELP_HELPTOPICS + MENUITEM "&Съдържание на помощта\tF1", ID_HELP_HELPTOPICS MENUITEM SEPARATOR - MENUITEM "&Çŕ đĺăÄńňúđíÄË™ îáđŕáîň÷ÄÄ™", ID_HELP_ABOUT + MENUITEM "&За региÑÑ‚ÑŠÑ€Ð½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸Ðº", ID_HELP_ABOUT END END @@ -119,56 +123,56 @@ IDR_POPUP_MENUS MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Ďđîě˙íŕ", ID_EDIT_MODIFY - MENUITEM "Ďđîě˙íŕ íŕ äâîÄÃ·Ã­Ä Ã¤Å•Ã­Ã­Ä", ID_EDIT_MODIFY_BIN + MENUITEM "&ПромÑна", ID_EDIT_MODIFY + MENUITEM "ПромÑна на двоични данни", ID_EDIT_MODIFY_BIN MENUITEM SEPARATOR - MENUITEM "Čç&ňđÄâŕíĺ\tDel", ID_EDIT_DELETE - MENUITEM "Ďđĺ&Äěĺíóâŕíĺ", ID_EDIT_RENAME + MENUITEM "Из&триване\tDel", ID_EDIT_DELETE + MENUITEM "Пре&именуване", ID_EDIT_RENAME END POPUP "" BEGIN - POPUP "&Ãîâ" + POPUP "&Ðов" BEGIN - MENUITEM "&Ęëţ÷", ID_EDIT_NEW_KEY + MENUITEM "&Ключ", ID_EDIT_NEW_KEY MENUITEM SEPARATOR - MENUITEM "&ÃÄçîâŕ ńňîéíîńň", ID_EDIT_NEW_STRINGVALUE - MENUITEM "&ÄâîÄ÷íŕ ńňîéíîńň", ID_EDIT_NEW_BINARYVALUE - MENUITEM "&Ńňîéíîńň íŕ äâîéíŕ äóěŕ", ID_EDIT_NEW_DWORDVALUE - MENUITEM "&ĚíîăîíÄçîâŕ ńňîéíîńň", ID_EDIT_NEW_MULTISTRINGVALUE - MENUITEM "&ÄŕçřÄÄ‘Äěŕ ěíîăîíÄçîâŕ ńňîéíîńň", ID_EDIT_NEW_EXPANDABLESTRINGVALUE + MENUITEM "&Ðизова ÑтойноÑÑ‚", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Двоична ÑтойноÑÑ‚", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&СтойноÑÑ‚ на двойна дума", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&Многонизова ÑтойноÑÑ‚", ID_EDIT_NEW_MULTISTRINGVALUE + MENUITEM "&Разширима многонизова ÑтойноÑÑ‚", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END END POPUP "" BEGIN - MENUITEM "Äŕçăđúůŕíĺ/ŃâÄâŕíĺ", ID_TREE_EXPANDBRANCH - POPUP "&Ãîâ" + MENUITEM "Разгръщане/Свиване", ID_TREE_EXPANDBRANCH + POPUP "&Ðов" BEGIN - MENUITEM "&Ęëţ÷", ID_EDIT_NEW_KEY + MENUITEM "&Ключ", ID_EDIT_NEW_KEY MENUITEM SEPARATOR - MENUITEM "&ÃÄçîâŕ ńňîéíîńň", ID_EDIT_NEW_STRINGVALUE - MENUITEM "&ÄâîÄ÷íŕ ńňîéíîńň", ID_EDIT_NEW_BINARYVALUE - MENUITEM "&Ńňîéíîńň íŕ äâîéíŕ äóěŕ", ID_EDIT_NEW_DWORDVALUE - MENUITEM "&ĚíîăîíÄçîâŕ ńňîéíîńň", ID_EDIT_NEW_MULTISTRINGVALUE - MENUITEM "&ÄŕçřÄÄ‘Äěŕ ěíîăîíÄçîâŕ ńňîéíîńň", ID_EDIT_NEW_EXPANDABLESTRINGVALUE + MENUITEM "&Ðизова ÑтойноÑÑ‚", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Двоична ÑтойноÑÑ‚", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&СтойноÑÑ‚ на двойна дума", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&Многонизова ÑтойноÑÑ‚", ID_EDIT_NEW_MULTISTRINGVALUE + MENUITEM "&Разширима многонизова ÑтойноÑÑ‚", ID_EDIT_NEW_EXPANDABLESTRINGVALUE END - MENUITEM "&Ňúđńĺíĺ", ID_EDIT_FIND + MENUITEM "&ТърÑене", ID_EDIT_FIND MENUITEM SEPARATOR - MENUITEM "&ČçňđÄâŕíĺ", ID_TREE_DELETE - MENUITEM "&ĎđĺÄěĺíóâŕíĺ", ID_TREE_RENAME + MENUITEM "&Изтриване", ID_TREE_DELETE + MENUITEM "&Преименуване", ID_TREE_RENAME MENUITEM SEPARATOR - MENUITEM "&Čçíîń", ID_TREE_EXPORT - MENUITEM "&Ďđŕâŕ...", ID_TREE_PERMISSIONS, GRAYED + MENUITEM "&ИзноÑ", ID_TREE_EXPORT + MENUITEM "&Права...", ID_TREE_PERMISSIONS, GRAYED MENUITEM SEPARATOR - MENUITEM "&ÇŕÄîěí˙íĺ ńňîéíîńňňŕ íŕ ęëţ÷ŕ", ID_EDIT_COPYKEYNAME + MENUITEM "&ЗапомнÑне ÑтойноÑтта на ключа", ID_EDIT_COPYKEYNAME END POPUP "" BEGIN - MENUITEM "C&ut", ID_HEXEDIT_CUT - MENUITEM "Çŕ&Äîěí˙íĺ", ID_HEXEDIT_COPY - MENUITEM "&Ďîńňŕâ˙íĺ", ID_HEXEDIT_PASTE - MENUITEM "Čç&ňđÄâŕíĺ", ID_HEXEDIT_DELETE + MENUITEM "От&Ñ€Ñзване", ID_HEXEDIT_CUT + MENUITEM "За&помнÑне", ID_HEXEDIT_COPY + MENUITEM "&ПоÑтавÑне", ID_HEXEDIT_PASTE + MENUITEM "Из&триване", ID_HEXEDIT_DELETE MENUITEM SEPARATOR - MENUITEM "Čçáîđ íŕ âńÄ&÷ęÄ", ID_HEXEDIT_SELECT_ALL + MENUITEM "Избор на вÑи&чки", ID_HEXEDIT_SELECT_ALL END END @@ -176,111 +180,121 @@ END /* * Dialog */ +IDD_LOADHIVE DIALOGEX DISCARDABLE 0, 0, 193, 34 +STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Зареждане на рой" +FONT 8, "Ms Shell Dlg" +{ + LTEXT "&Клавиш:", IDC_STATIC, 4, 4, 28, 8, SS_LEFT + EDITTEXT IDC_EDIT_KEY, 41, 2, 145, 13 + DEFPUSHBUTTON "Добре", IDOK, 140, 17, 50, 14 + PUSHBUTTON "Отказ", IDCANCEL, 89, 17, 50, 14 +} IDD_EDIT_STRING DIALOGEX 32, 24, 252, 84 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Ďđîě˙íŕ íŕ íÄçŕ" +CAPTION "ПромÑна на низа" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Čěĺ:",IDC_STATIC,6,6,134,8 + LTEXT "Име:",IDC_STATIC,6,6,134,8 EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY - LTEXT "&Ńňîéíîńň:",IDC_STATIC,6,35,161,8 + LTEXT "&СтойноÑÑ‚:",IDC_STATIC,6,35,161,8 EDITTEXT IDC_VALUE_DATA,6,46,240,12,ES_AUTOHSCROLL - DEFPUSHBUTTON "Äîáđĺ",IDOK,142,64,50,14 - PUSHBUTTON "Îňęŕç",IDCANCEL,196,64,50,14 + DEFPUSHBUTTON "Добре",IDOK,142,64,50,14 + PUSHBUTTON "Отказ",IDCANCEL,196,64,50,14 END IDD_EDIT_MULTI_STRING DIALOGEX 32, 24, 252, 174 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Ďđîě˙íŕ íŕ ěíîćĺńňâĺí íÄç" +CAPTION "ПромÑна на множеÑтвен низ" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Čěĺ:",IDC_STATIC,6,6,134,8 + LTEXT "&Име:",IDC_STATIC,6,6,134,8 EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY - LTEXT "&Ńňîéíîńň:",IDC_STATIC,6,35,161,8 + LTEXT "&СтойноÑÑ‚:",IDC_STATIC,6,35,161,8 EDITTEXT IDC_VALUE_DATA,6,46,240,102,ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN | ES_AUTOVSCROLL | WS_VSCROLL - DEFPUSHBUTTON "Äîáđĺ",IDOK,142,154,50,14 - PUSHBUTTON "Îňęŕç",IDCANCEL,196,154,50,14 + DEFPUSHBUTTON "Добре",IDOK,142,154,50,14 + PUSHBUTTON "Отказ",IDCANCEL,196,154,50,14 END IDD_EDIT_BIN_DATA DIALOGEX 32, 24, 252, 174 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Ďđîě˙íŕ íŕ äâîÄ÷íŕ ńňîéíîńň" +CAPTION "ПромÑна на двоична ÑтойноÑÑ‚" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Čěĺ:",IDC_STATIC,6,6,134,8 + LTEXT "&Име:",IDC_STATIC,6,6,134,8 EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY - LTEXT "&Ńňîéíîńň",IDC_STATIC,6,35,161,8 + LTEXT "&СтойноÑÑ‚:",IDC_STATIC,6,35,161,8 CONTROL "",IDC_VALUE_DATA,"HexEdit32",WS_VSCROLL | WS_BORDER | WS_TABSTOP,6,46,240,102 - DEFPUSHBUTTON "Äîáđĺ",IDOK,142,154,50,14 - PUSHBUTTON "Îňęŕç",IDCANCEL,196,154,50,14 + DEFPUSHBUTTON "Добре",IDOK,142,154,50,14 + PUSHBUTTON "Отказ",IDCANCEL,196,154,50,14 END IDD_EDIT_DWORD DIALOGEX 32, 24, 252, 104 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Ďđîě˙íŕ íŕ äâîéíŕ äóěŕ" +CAPTION "ПромÑна на двойна дума" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Čěĺ:",IDC_STATIC,6,6,134,8 + LTEXT "&Име:",IDC_STATIC,6,6,134,8 EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY - LTEXT "&Ńňîéíîńň:",IDC_STATIC,6,35,161,8 + LTEXT "&СтойноÑÑ‚:",IDC_STATIC,6,35,161,8 EDITTEXT IDC_VALUE_DATA,6,46,116,12,ES_AUTOHSCROLL - GROUPBOX "Îńíîâŕ",IDC_STATIC,130,35,116,39 - AUTORADIOBUTTON "&ŘĺńňíŕäĺńĺňÄ÷íŕ",IDC_FORMAT_HEX,141,46,95,10,WS_GROUP - AUTORADIOBUTTON "&ÄĺńĺňÄ÷íŕ",IDC_FORMAT_DEC,141,59,95,10 - DEFPUSHBUTTON "Äîáđĺ",IDOK,142,82,50,14 - PUSHBUTTON "Îňęŕç",IDCANCEL,196,82,50,14 + GROUPBOX "ОÑнова",IDC_STATIC,130,35,116,39 + AUTORADIOBUTTON "&ШеÑтнадеÑетична",IDC_FORMAT_HEX,141,46,95,10,WS_GROUP + AUTORADIOBUTTON "&ДеÑетична",IDC_FORMAT_DEC,141,59,95,10 + DEFPUSHBUTTON "Добре",IDOK,142,82,50,14 + PUSHBUTTON "Отказ",IDCANCEL,196,82,50,14 END IDD_EDIT_RESOURCE_LIST DIALOGEX 32, 24, 170, 120 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Resource List" +CAPTION "СпиÑък на реÑурÑите" FONT 8, "MS Shell Dlg" { CONTROL "", IDC_RESOURCE_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 10, 150, 75 - DEFPUSHBUTTON "OK", IDOK, 27, 100, 50, 14 - PUSHBUTTON "Show...", IDC_SHOW_RESOURCE, 93, 100, 50, 14, WS_DISABLED + DEFPUSHBUTTON "Добре", IDOK, 27, 100, 50, 14 + PUSHBUTTON "Показване...", IDC_SHOW_RESOURCE, 93, 100, 50, 14, WS_DISABLED } -IDD_EDIT_RESOURCE DIALOGEX 6, 18, 281, 283 +IDD_EDIT_RESOURCE DIALOGEX 6, 18, 381, 283 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Resources" +CAPTION "РеÑурÑи" FONT 8, "MS Shell Dlg" { LTEXT "DMA:", IDC_STATIC, 10, 5, 20, 8 - CONTROL "", IDC_DMA_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 15, 261, 31 - LTEXT "Interrupt:", IDC_STATIC, 10, 48, 35, 8 - CONTROL "", IDC_IRQ_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 58, 261, 31 - LTEXT "Memory:", IDC_STATIC, 10, 91, 32, 8 - CONTROL "", IDC_MEMORY_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 101, 261, 31 - LTEXT "Port:", IDC_STATIC, 10, 134, 38, 8 - CONTROL "", IDC_PORT_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 144, 261, 31 - LTEXT "Device specific data:", IDC_STATIC, 10, 177, 80, 8 - CONTROL "", IDC_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 188, 261, 31 - GROUPBOX "Usage", IDC_STATIC, 10, 219, 125, 39 - LTEXT "Undetermined", IDC_UNDETERMINED, 18, 230, 46, 8, WS_DISABLED - LTEXT "Shared", IDC_SHARED, 18, 240, 48, 8, WS_DISABLED - LTEXT "Device exclusive", IDC_DEVICE_EXCLUSIVE, 72, 230, 58, 8, WS_DISABLED - LTEXT "Driver exclusive", IDC_DRIVER_EXCLUSIVE, 72, 240, 54, 8, WS_DISABLED - RTEXT "Interface Type:", IDC_STATIC, 144, 220, 58, 8 - LTEXT "", IDC_INTERFACETYPE, 205, 220, 66, 8 - RTEXT "Bus Nummer:", IDC_STATIC, 151, 230, 51, 8 - LTEXT "", IDC_BUSNUMBER, 205, 230, 66, 8 - RTEXT "Version:", IDC_STATIC, 151, 240, 51, 8 - LTEXT "", IDC_VERSION, 205, 240, 66, 8 - RTEXT "Revision:", IDC_STATIC, 151, 250, 51, 8 - LTEXT "", IDC_REVISION, 205, 250, 66, 8 - DEFPUSHBUTTON "OK",IDOK, 92, 263, 40, 14 - PUSHBUTTON "&Data...", IDC_SHOW_RESOURCE_DATA, 148, 263, 40, 14, WS_DISABLED + CONTROL "", IDC_DMA_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 15, 361, 31 + LTEXT "ПрекъÑване:", IDC_STATIC, 10, 48, 200, 8 + CONTROL "", IDC_IRQ_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 58, 361, 31 + LTEXT "Памет:", IDC_STATIC, 10, 91, 32, 8 + CONTROL "", IDC_MEMORY_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 101, 361, 31 + LTEXT "Извод:", IDC_STATIC, 10, 134, 38, 8 + CONTROL "", IDC_PORT_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 144, 361, 31 + LTEXT "ОбоÑобени данни за уÑтройÑтвото:", IDC_STATIC, 10, 177, 200, 8 + CONTROL "", IDC_DEVICE_LIST, "SysListView32", LVS_REPORT | LVS_NOSORTHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 10, 188, 361, 31 + GROUPBOX "Употреба", IDC_STATIC, 10, 219, 179, 39 + LTEXT "ÐеуÑтановенa", IDC_UNDETERMINED, 18, 230, 50, 8, WS_DISABLED + LTEXT "Споделена", IDC_SHARED, 18, 240, 50, 8, WS_DISABLED + LTEXT "уÑтройÑтво, изключителна", IDC_DEVICE_EXCLUSIVE, 77, 230, 108, 8, WS_DISABLED + LTEXT "водач, изключителна", IDC_DRIVER_EXCLUSIVE, 77, 240, 108, 8, WS_DISABLED + RTEXT "Вид интерфейÑ:", IDC_STATIC, 190, 220, 71, 8 + LTEXT "", IDC_INTERFACETYPE, 275, 220, 86, 8 + RTEXT "Ðомер на шина:", IDC_STATIC, 190, 230, 71, 8 + LTEXT "", IDC_BUSNUMBER, 275, 230, 86, 8 + RTEXT "Издание:", IDC_STATIC, 190, 240, 71, 8 + LTEXT "", IDC_VERSION, 275, 240, 86, 8 + RTEXT "Разглеждане:", IDC_STATIC, 190, 250, 71, 8 + LTEXT "", IDC_REVISION, 275, 250, 86, 8 + DEFPUSHBUTTON "Добре",IDOK, 142, 263, 40, 14 + PUSHBUTTON "&Данни...", IDC_SHOW_RESOURCE_DATA, 198, 263, 40, 14, WS_DISABLED } @@ -290,187 +304,187 @@ FONT 8, "MS Shell Dlg" STRINGTABLE DISCARDABLE BEGIN - IDS_LIST_COLUMN_NAME "Čěĺ" - IDS_LIST_COLUMN_TYPE "ÂÄä" - IDS_LIST_COLUMN_DATA "ÄŕííÄ" + IDS_LIST_COLUMN_NAME "Име" + IDS_LIST_COLUMN_TYPE "Вид" + IDS_LIST_COLUMN_DATA "Данни" END STRINGTABLE DISCARDABLE BEGIN - IDS_APP_TITLE "ÄĺăÄńňúđĺí îáđŕáîň÷ÄÄ™" + IDS_APP_TITLE "РегиÑтърен обработчик" IDC_REGEDIT "REGEDIT" IDC_REGEDIT_FRAME "REGEDIT_FRAME" END STRINGTABLE DISCARDABLE BEGIN - ID_REGISTRY_MENU "Ńúäúđćŕ Ä™Ã®Ä›Å•Ã­Ã¤Ä Ã§Å• đŕáîňŕ Å„ öĺëÄË™ đĺăÄńňúđ" - ID_EDIT_MENU "Ńúäúđćŕ Ä™Ã®Ä›Å•Ã­Ã¤Ä Ã§Å• Äđîě˙íŕ íŕ Å„ÅˆÃ®Ã©Ã­Ã®Å„ÅˆÄ ÄÃ«Ä Ä™Ã«Å£Ã·Ã®Ã¢Äº" - ID_VIEW_MENU "Ńúäúđćŕ Ä™Ã®Ä›Å•Ã­Ã¤Ä Ã§Å• íŕăŕćäŕíĺ íŕ Äđîçîđĺöŕ" - ID_FAVOURITES_MENU "Ńúäúđćŕ Ä™Ã®Ä›Å•Ã­Ã¤Ä Ã§Å• Ã¤Ã®Å„ÅˆÃºÄ Ã¤Ã® ÷ĺńňî ÄçÄÃ®Ã«Ã§Ã¢Å•Ã­Ä Ä™Ã«Å£Ã·Ã®Ã¢Äº" - ID_HELP_MENU "Ńúäúđćŕ Ä™Ã®Ä›Å•Ã­Ã¤Ä Ã§Å• Äîęŕçâŕíĺ íŕ Äîěîů Ä Å„Ã¢ÄºÃ¤ÄºÃ­ÄË™ çŕ đĺăÄńňúđĺí îáđŕáîň÷ÄÄ™" - ID_EDIT_NEW_MENU "Ńúäúđćŕ Ä™Ã®Ä›Å•Ã­Ã¤Ä Ã§Å• ńúçäŕâŕíĺ íŕ Ã­Ã®Ã¢Ä Ä™Ã«Å£Ã·Ã®Ã¢Äº ÄÃ«Ä Å„ÅˆÃ®Ã©Ã­Ã®Å„ÅˆÄ" + ID_REGISTRY_MENU "Съдържа команди за работа Ñ Ñ†ÐµÐ»Ð¸Ñ Ñ€ÐµÐ³Ð¸Ñтър" + ID_EDIT_MENU "Съдържа команди за промÑна на ÑтойноÑти или ключове" + ID_VIEW_MENU "Съдържа команди за нагаждане на прозореца" + ID_FAVOURITES_MENU "Съдържа команди за доÑтъп до чеÑто използвани ключове" + ID_HELP_MENU "Съдържа команди за показване на помощ и ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð° региÑтърен обработчик" + ID_EDIT_NEW_MENU "Съдържа команди за Ñъздаване на нови ключове или ÑтойноÑти" END STRINGTABLE DISCARDABLE BEGIN - ID_EDIT_MODIFY "Ďđîěĺí˙ ńňîéíîńňňŕ" - ID_EDIT_NEW_KEY "Äîáŕâ˙ íîâ ęëţ÷" - ID_EDIT_NEW_STRINGVALUE "Äîáŕâ˙ íîâŕ íÄçîâŕ ńňîéíîńň" - ID_EDIT_NEW_BINARYVALUE "Äîáŕâ˙ íîâŕ äâîÄ÷íŕ ńňîéíîńň" - ID_EDIT_NEW_DWORDVALUE "Äîáŕâ˙ íîâ ńňîéíńîň çŕ äâîéíŕ äóěŕ" - ID_REGISTRY_IMPORTREGISTRYFILE "Âíŕń˙ ńëîâĺńĺí ôŕéë â đĺăÄńňúđŕ" + ID_EDIT_MODIFY "ÐŸÑ€Ð¾Ð¼ÐµÐ½Ñ ÑтойноÑтта" + ID_EDIT_NEW_KEY "Ð”Ð¾Ð±Ð°Ð²Ñ Ð½Ð¾Ð² ключ" + ID_EDIT_NEW_STRINGVALUE "Ð”Ð¾Ð±Ð°Ð²Ñ Ð½Ð¾Ð²Ð° низова ÑтойноÑÑ‚" + ID_EDIT_NEW_BINARYVALUE "Ð”Ð¾Ð±Ð°Ð²Ñ Ð½Ð¾Ð²Ð° двоична ÑтойноÑÑ‚" + ID_EDIT_NEW_DWORDVALUE "Ð”Ð¾Ð±Ð°Ð²Ñ Ð½Ð¾Ð²Ð° ÑтойноÑÑ‚ за двойна дума" + ID_REGISTRY_IMPORTREGISTRYFILE "ВнаÑÑ Ñе ÑловеÑен файл в региÑтъра" ID_REGISTRY_EXPORTREGISTRYFILE - "Čçíŕń˙ öĺëÄË™ đĺăÄńňúđ ÄÃ«Ä Ã·Å•Å„ÅˆÄ Ã®Åˆ íĺăî â ńëîâĺńĺí ôŕéë" + "ИзнаÑÑ Ñе Ñ†ÐµÐ»Ð¸Ñ Ñ€ÐµÐ³Ð¸Ñтър или чаÑти от него в ÑловеÑен файл" ID_REGISTRY_LOADHIVE - "Loads a hive file into the registry" + "Зарежда Ñе роеви файл в региÑтъра" ID_REGISTRY_UNLOADHIVE - "Unloads a hive from the registry" + "Ð˜Ð·Ñ…Ð²ÑŠÑ€Ð»Ñ Ñе рой от паметта" ID_REGISTRY_CONNECTNETWORKREGISTRY - "Ńâúđçâŕ ńĺ Å„ đĺăÄńňúđŕ íŕ äŕëĺ÷ĺí ęîěÄţňúđ" + "Свързва Ñе Ñ Ñ€ÐµÐ³Ð¸Ñтъра на далечен компютър" ID_REGISTRY_DISCONNECTNETWORKREGISTRY - "Äŕçęŕ÷ŕ ńĺ îň đĺăÄńňúđŕ íŕ îňäŕëĺ÷ĺí ęîěÄţňúđ" - ID_REGISTRY_PRINT "ÄŕçÄĺ÷ŕňâŕ đĺăÄńňúđŕ ÄÃ«Ä Ã·Å•Å„Åˆ îň íĺăî" -/* ID_HELP_HELPTOPICS "Îňâŕđ˙ Äîěîůňŕ çŕ đĺăÄńňúđĺí îáđŕáîň÷ÄÄ™" */ - ID_HELP_ABOUT "Ďîęŕçâŕ ńâĺäĺíÄË™ çŕ ÄÄ‘ÄëîćĺíÄĺňî, âĺđńÄË™ Ä Ã¢ÃºÃ§ÄđîÄÃ§Ã¢Ã®Ã¤Å„ÅˆÃ¢ÄºÃ­Ä Äđŕâŕ" + "Разкача Ñе от региÑтъра на отдалечен компютър" + ID_REGISTRY_PRINT "Разпечатва региÑтъра или чаÑÑ‚ от него" +/* ID_HELP_HELPTOPICS "ÐžÑ‚Ð²Ð°Ñ€Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° за региÑтърен обработчик" */ + ID_HELP_ABOUT "Показва ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð° приложението, верÑÐ¸Ñ Ð¸ възпроизводÑтвени права" END STRINGTABLE DISCARDABLE BEGIN - ID_REGISTRY_EXIT "Çŕňâŕđ˙ đĺăÄńňúđĺí îáđŕáîň÷ÄÄ™" - ID_FAVOURITES_ADDTOFAVOURITES "Äîáŕâ˙ ęëţ÷îâĺ â Å„ÄÄńúęŕ Å„ ëţáÄěęÄňĺ" - ID_FAVOURITES_REMOVEFAVOURITE "Ďđĺěŕőâŕ ęëţ÷îâĺ îň Å„ÄÄńúęŕ Å„ ëţáÄěęÄňĺ" - ID_VIEW_STATUSBAR "Ďîęŕçâŕ ÄÃ«Ä Å„Ä™Ä‘Äâŕ ëĺíňŕňŕ íŕ ńúńňî˙íÄĺňî" - ID_VIEW_SPLIT "Ďđîěĺí˙ đŕçÄîëîćĺíÄĺňî íŕ đŕçäĺëÄňĺë˙ ěĺćäó ęđÄëŕňŕ" - ID_VIEW_REFRESH "ÃŽÄđĺńí˙âŕ Äđîçîđĺöŕ" - ID_EDIT_DELETE "ČçňđÄâŕ Äçáđŕíîňî" - ID_EDIT_RENAME "ĎđĺÄěĺíóâŕ Äçáđŕíîňî" - ID_EDIT_COPYKEYNAME "ÇŕÄîěí˙ Äěĺňî íŕ ÄçáđŕíÄË™ ęëţ÷ â ęîříÄöŕňŕ (clipboard)" - ID_EDIT_FIND "ÃŕěÄđŕ ńëîâĺńĺí íÄç â ęëţ÷, ńňîéíîńň ÄÃ«Ä Ã¤Å•Ã­Ã­Ä" - ID_EDIT_FINDNEXT "ÃŕěÄđŕ ńëĺäâŕůŕ Äî˙âŕ íŕ óęŕçŕíÄË™ çŕ ÄđĺäÄříîňî ňúđńĺíĺ ňĺęńň" + ID_REGISTRY_EXIT "Ð—Ð°Ñ‚Ð²Ð°Ñ€Ñ Ñ€ÐµÐ³Ð¸ÑÑ‚ÑŠÑ€Ð½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸Ðº" + ID_FAVOURITES_ADDTOFAVOURITES "Ð”Ð¾Ð±Ð°Ð²Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ðµ в ÑпиÑъка Ñ Ð»ÑŽÐ±Ð¸Ð¼ÐºÐ¸Ñ‚Ðµ" + ID_FAVOURITES_REMOVEFAVOURITE "Премахва ключове от ÑпиÑъка Ñ Ð»ÑŽÐ±Ð¸Ð¼ÐºÐ¸Ñ‚Ðµ" + ID_VIEW_STATUSBAR "Показва или Ñкрива лентата на ÑÑŠÑтоÑнието" + ID_VIEW_SPLIT "ÐŸÑ€Ð¾Ð¼ÐµÐ½Ñ Ñ€Ð°Ð·Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÑ‚Ð¾ на Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ð¼ÐµÐ¶Ð´Ñƒ крилата" + ID_VIEW_REFRESH "ОпреÑнÑва прозореца" + ID_EDIT_DELETE "Изтрива избраното" + ID_EDIT_RENAME "Преименува избраното" + ID_EDIT_COPYKEYNAME "Ð—Ð°Ð¿Ð¾Ð¼Ð½Ñ Ð¸Ð¼ÐµÑ‚Ð¾ на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ в кошницата (clipboard)" + ID_EDIT_FIND "Ðамира ÑловеÑен низ в ключ, ÑтойноÑÑ‚ или данни" + ID_EDIT_FINDNEXT "Ðамира Ñледваща поÑва на ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð·Ð° предишното търÑене текÑÑ‚" END STRINGTABLE DISCARDABLE BEGIN - IDS_ERROR "Ăđĺřęŕ" - IDS_WARNING "ĎđĺäóÄđĺćäĺíÄĺ" - IDS_BAD_KEY "Ãĺâúçěîćíî ÄçâëÄ÷ŕíĺňî íŕ ęëţ÷ '%s'" - IDS_BAD_VALUE "Ãĺâúçěîćíî ÄçâëÄ÷ŕíĺňî íŕ ńňîéíîńň '%s'" - IDS_UNSUPPORTED_TYPE "Ďđîě˙íŕňŕ íŕ ęëţ÷îâĺ îň ÅˆÃ®Ã§Ä Ã¢Ää ĺ íĺâúçěîćíŕ (%ld)" - IDS_TOO_BIG_VALUE "Ńňîéíîńňňŕ ĺ ňâúđäĺ ăîë˙ěŕ (%ld)" - IDS_MULTI_SZ_EMPTY_STRING "ÄŕííÄňĺ îň âÄä REG_MULTI_SZ íĺ ěîăŕň äŕ ńúäúđćŕň ÄÄ‘Å•Ã§Ã­Ä Ã­Äçîâĺ.\nĎđŕçíÄňĺ íÄçîâĺ ůĺ áúäŕň ÄÄ‘ÄºÄ›Å•Å‘Ã­Å•ÅˆÄ Ã®Åˆ Å„ÄÄńúęŕ." - IDS_QUERY_DELETE_KEY_ONE "ŃÄăóđĺí Ã«Ä Å„ÅˆÄº, ÷ĺ Äńęŕňĺ äŕ ÄçňđÄĺňĺ ÅˆÃ®Ã§Ä Ä™Ã«Å£Ã·?" - IDS_QUERY_DELETE_KEY_MORE "ŃÄăóđĺí Ã«Ä Å„ÅˆÄº, ÷ĺ Äńęŕňĺ äŕ ÄçňđÄĺňĺ ÅˆÄºÃ§Ä Ä™Ã«Å£Ã·Ã®Ã¢Äº?" - IDS_QUERY_DELETE_KEY_CONFIRM "Ďîňâúđäĺňĺ ÄçňđÄâŕíĺ íŕ ęëţ÷ŕ" - IDS_QUERY_DELETE_ONE "ŃÄăóđĺí Ã«Ä Å„ÅˆÄº, ÷ĺ Äńęŕňĺ äŕ ÄçňđÄĺňĺ ÅˆÅ•Ã§Ä Å„ÅˆÃ®Ã©Ã­Ã®Å„Åˆ?" - IDS_QUERY_DELETE_MORE "ŃÄăóđĺí Ã«Ä Å„ÅˆÄº, ÷ĺ Äńęŕňĺ äŕ ÄçňđÄĺňĺ ÅˆÄºÃ§Ä Å„ÅˆÃ®Ã©Ã­Ã®Å„ÅˆÄ?" - IDS_QUERY_DELETE_CONFIRM "Ďîňâúđäĺňĺ ÄçňđÄâŕíĺ íŕ ńňîéíîńňÄňĺ" - IDS_ERR_DELVAL_CAPTION "Ăđĺřęŕ ÄÄ‘Ä ÄçňđÄâŕíĺ íŕ ńňîéíîńňÄňĺ" - IDS_ERR_DELETEVALUE "ČçňđÄâŕíĺňî íŕ âńÄÃ·Ä™Ä Ã³Ä™Å•Ã§Å•Ã­Ä Å„ÅˆÃ®Ã©Ã­Ã®Å„ÅˆÄ Äº íĺâúçěîćíî!" - IDS_ERR_RENVAL_CAPTION "Ăđĺřęŕ ÄÄ‘Ä ÄđĺÄěŕíĺóâŕíĺňî" - IDS_ERR_RENVAL_TOEMPTY "Ãĺ ěîăŕ äŕ ÄđĺÄěĺíóâŕě %s. Óęŕçŕíŕňŕ ńňîéíîńň íĺ ĺ Äđŕçíŕ. ÃŽÄÄňŕéňĺ îňíîâî Å„ äđóăî Äěĺ." - IDS_NEW_KEY "Ãîâ ęëţ÷ #%d" - IDS_NEW_VALUE "Ãîâŕ ńňîéíîńň #%d" + IDS_ERROR "Грешка" + IDS_WARNING "Предупреждение" + IDS_BAD_KEY "Ðевъзможно извличането на ключ '%s'" + IDS_BAD_VALUE "Ðевъзможно извличането на ÑтойноÑÑ‚ '%s'" + IDS_UNSUPPORTED_TYPE "ПромÑната на ключове от този вид е невъзможна (%ld)" + IDS_TOO_BIG_VALUE "СтойноÑтта е твърде голÑма (%ld)" + IDS_MULTI_SZ_EMPTY_STRING "Данните от вид REG_MULTI_SZ не могат да Ñъдържат празни низове.\nПразните низове ще бъдат премахнати от ÑпиÑъка." + IDS_QUERY_DELETE_KEY_ONE "Сигурен ли Ñте, че иÑкате да изтриете този ключ?" + IDS_QUERY_DELETE_KEY_MORE "Сигурен ли Ñте, че иÑкате да изтриете тези ключове?" + IDS_QUERY_DELETE_KEY_CONFIRM "Потвърдете изтриване на ключа" + IDS_QUERY_DELETE_ONE "Сигурен ли Ñте, че иÑкате да изтриете тази ÑтойноÑÑ‚?" + IDS_QUERY_DELETE_MORE "Сигурен ли Ñте, че иÑкате да изтриете тези ÑтойноÑти?" + IDS_QUERY_DELETE_CONFIRM "Потвърдете изтриване на ÑтойноÑтите" + IDS_ERR_DELVAL_CAPTION "Грешка при изтриване на ÑтойноÑтите" + IDS_ERR_DELETEVALUE "Изтриването на вÑички указани ÑтойноÑти е невъзможно!" + IDS_ERR_RENVAL_CAPTION "Грешка при преиманеуването" + IDS_ERR_RENVAL_TOEMPTY "ÐеуÑпешно преименуване на %s. Указаната ÑтойноÑÑ‚ не е празна. Опитайте отново Ñ Ð´Ñ€ÑƒÐ³Ð¾ име." + IDS_NEW_KEY "Ðов ключ #%d" + IDS_NEW_VALUE "Ðова ÑтойноÑÑ‚ #%d" END STRINGTABLE DISCARDABLE BEGIN - IDS_BINARY_EMPTY "(äâîÄ÷íŕ ńňîéíîńň Å„ íóëĺâŕ äúëćÄíŕ)" - IDS_DEFAULT_VALUE_NAME "(Ďîäđŕçáđŕíŕ)" - IDS_VALUE_NOT_SET "(íĺçŕäŕäĺíŕ ńňîéíîńň)" - IDS_UNKNOWN_TYPE "ÃĺÄçâĺńňĺí âÄä: (0x%lx)" - IDS_MY_COMPUTER "Ěî˙ň ęîěÄţňúđ" - IDS_IMPORT_REG_FILE "Âíîń íŕ đĺăÄńňúđĺí ôŕéë" - IDS_EXPORT_REG_FILE "Čçíîń íŕ đĺăÄńňúđĺí ôŕéë" - IDS_LOAD_HIVE "Load Hive" - IDS_UNLOAD_HIVE "Unload Hive" - IDS_INVALID_DWORD "(ńŕěîńňî˙ňĺëíŕ ńňîéíîńň íŕ äâîéíŕ äóěŕ)" + IDS_BINARY_EMPTY "(двоична ÑтойноÑÑ‚ Ñ Ð½ÑƒÐ»ÐµÐ²Ð° дължина)" + IDS_DEFAULT_VALUE_NAME "(Подразбрана)" + IDS_VALUE_NOT_SET "(незададена ÑтойноÑÑ‚)" + IDS_UNKNOWN_TYPE "ÐеизвеÑтен вид: (0x%lx)" + IDS_MY_COMPUTER "МоÑÑ‚ компютър" + IDS_IMPORT_REG_FILE "Ð’Ð½Ð¾Ñ Ð½Ð° региÑтърен файл" + IDS_EXPORT_REG_FILE "Ð˜Ð·Ð½Ð¾Ñ Ð½Ð° региÑтърен файл" + IDS_LOAD_HIVE "Зареждане на рой" + IDS_UNLOAD_HIVE "ИзхвърлÑне на рой" + IDS_INVALID_DWORD "(ÑамоÑтоÑтелна ÑтойноÑÑ‚ на двойна дума)" END STRINGTABLE DISCARDABLE BEGIN - IDS_FLT_REGFILE "ÂÄÄńâŕů ôŕéë" - IDS_FLT_REGFILES "ÂÄÄÅ„Ã¢Å•Å¯Ä (đĺăÄńňúđíÄ) ôŕéëîâĺ" + IDS_FLT_REGFILE "ВпиÑващ файл" + IDS_FLT_REGFILES "ВпиÑващи (региÑтърни) файлове" IDS_FLT_REGFILES_FLT "*.reg" - IDS_FLT_REGEDIT4 "Win9x/NT4 âÄÄÅ„Ã¢Å•Å¯Ä Ã´Å•Ã©Ã«Ã®Ã¢Äº (REGEDIT4)" + IDS_FLT_REGEDIT4 "Win9x/NT4 впиÑващи файлове (REGEDIT4)" IDS_FLT_REGEDIT4_FLT "*.reg" - IDS_FLT_ALLFILES "ÂńÄÃ·Ä™Ä Ã´Å•Ã©Ã«Ã®Ã¢Äº (*.*)" + IDS_FLT_ALLFILES "Ð’Ñички файлове (*.*)" IDS_FLT_ALLFILES_FLT "*.*" END STRINGTABLE DISCARDABLE BEGIN - IDS_ACCESS_FULLCONTROL "Ďúëĺí äîńňúÄ" - IDS_ACCESS_READ "×ĺňĺíĺ" - IDS_ACCESS_QUERYVALUE "ČçâëÄ÷ŕíĺ íŕ ńňîéíîńň" - IDS_ACCESS_SETVALUE "Çŕäŕâŕíĺ íŕ ńňîéíîńň" - IDS_ACCESS_CREATESUBKEY "Ńúçäŕâŕíĺ íŕ Äîäęëţ÷" - IDS_ACCESS_ENUMERATESUBKEYS "Îöĺíęŕ íŕ Äîäęëţ÷îâĺňĺ" - IDS_ACCESS_NOTIFY "Čçâĺńň˙âŕíĺ" - IDS_ACCESS_CREATELINK "Ńúçäŕâŕíĺ íŕ âđúçęŕ" - IDS_ACCESS_DELETE "ČçňđÄâŕíĺ" - IDS_ACCESS_WRITEDAC "Write DAC" - IDS_ACCESS_WRITEOWNER "ÇŕÄÄÅ„ íŕ ńîáńňâĺíÄęŕ" - IDS_ACCESS_READCONTROL "Ďđŕâî íŕ ÷ĺňĺíĺ" + IDS_ACCESS_FULLCONTROL "Пълен доÑтъп" + IDS_ACCESS_READ "Четене" + IDS_ACCESS_QUERYVALUE "Извличане на ÑтойноÑÑ‚" + IDS_ACCESS_SETVALUE "Задаване на ÑтойноÑÑ‚" + IDS_ACCESS_CREATESUBKEY "Създаване на подключ" + IDS_ACCESS_ENUMERATESUBKEYS "Оценка на подключовете" + IDS_ACCESS_NOTIFY "ИзвеÑÑ‚Ñване" + IDS_ACCESS_CREATELINK "Създаване на връзка" + IDS_ACCESS_DELETE "Изтриване" + IDS_ACCESS_WRITEDAC "ЗапиÑване на DAC" /* ÐеÑÑно */ + IDS_ACCESS_WRITEOWNER "Ð—Ð°Ð¿Ð¸Ñ Ð½Ð° ÑобÑтвеника" + IDS_ACCESS_READCONTROL "Право на четене" END STRINGTABLE DISCARDABLE BEGIN - IDS_INHERIT_THISKEYONLY "Ńŕěî ÅˆÃ®Ã§Ä Ä™Ã«Å£Ã·" - IDS_INHERIT_THISKEYANDSUBKEYS "Å‡Ã®Ã§Ä Ä™Ã«Å£Ã· Ä Äîäęëţ÷îâĺňĺ ěó" - IDS_INHERIT_SUBKEYSONLY "Ńŕěî Äîäęëţ÷îâĺňĺ" + IDS_INHERIT_THISKEYONLY "Само този ключ" + IDS_INHERIT_THISKEYANDSUBKEYS "Този ключ и подключовете му" + IDS_INHERIT_SUBKEYSONLY "Само подключовете" END STRINGTABLE DISCARDABLE BEGIN - IDS_EXPAND "&Äŕçăđúůŕíĺ" - IDS_COLLAPSE "&ŃâÄâŕíĺ" - IDS_GOTO_SUGGESTED_KEY "&ÎňÄâŕíĺ íŕ '%s'" - IDS_FINISHEDFIND "Ňúđńĺíĺňî â đĺăÄńňúđŕ ÄÄ‘Äęëţ÷Ä." + IDS_EXPAND "&Разгръщане" + IDS_COLLAPSE "&Свиване" + IDS_GOTO_SUGGESTED_KEY "&Отиване на '%s'" + IDS_FINISHEDFIND "ТърÑенето в региÑтъра приключи." END STRINGTABLE DISCARDABLE BEGIN - IDS_IMPORT_PROMPT "Add the data to the registry?" - IDS_IMPORTED_OK "Information added to the registry" + IDS_IMPORT_PROMPT "Да бъдат ли добавени данните в региÑтъра?" + IDS_IMPORTED_OK "СведениÑта Ñа добавени в региÑтъра" END STRINGTABLE DISCARDABLE BEGIN - IDS_BUSNUMBER "Bus Number" - IDS_INTERFACE "Interface" - IDS_DMA_CHANNEL "Channel" - IDS_DMA_PORT "Port" - IDS_INTERRUPT_VECTOR "Vector" - IDS_INTERRUPT_LEVEL "Level" - IDS_INTERRUPT_AFFINITY "Affinity" - IDS_INTERRUPT_TYPE "Type" - IDS_MEMORY_ADDRESS "Physical Address" - IDS_MEMORY_LENGTH "Length" - IDS_MEMORY_ACCESS "Access" - IDS_PORT_ADDRESS "Physical Address" - IDS_PORT_LENGTH "Length" - IDS_PORT_ACCESS "Access" - IDS_SPECIFIC_RESERVED1 "Reserved 1" + IDS_BUSNUMBER "Шина â„–" + IDS_INTERFACE "ИнтерфейÑ" + IDS_DMA_CHANNEL "Канал" + IDS_DMA_PORT "Извод" + IDS_INTERRUPT_VECTOR "Вектор" + IDS_INTERRUPT_LEVEL "Равнище" + IDS_INTERRUPT_AFFINITY "СродÑтво" + IDS_INTERRUPT_TYPE "Вид" + IDS_MEMORY_ADDRESS "ФизичеÑки адреÑ" + IDS_MEMORY_LENGTH "Дължина" + IDS_MEMORY_ACCESS "ДоÑтъп" + IDS_PORT_ADDRESS "ФизичеÑки адреÑ" + IDS_PORT_LENGTH "Дължина" + IDS_PORT_ACCESS "ДоÑтъп" + IDS_SPECIFIC_RESERVED1 "Reserved 1" /* I am not sure if this is to be translated */ IDS_SPECIFIC_RESERVED2 "Reserved 2" - IDS_SPECIFIC_DATASIZE "Data Size" + IDS_SPECIFIC_DATASIZE "Размер на данните" END STRINGTABLE DISCARDABLE BEGIN - IDS_PORT_PORT_IO "Port" - IDS_PORT_MEMORY_IO "Memory" - IDS_INTERRUPT_EDGE_SENSITIVE "Edge Sensitive" - IDS_INTERRUPT_LEVEL_SENSITIVE "Level Sensitive" - IDS_MEMORY_READ_ONLY "Read Only" - IDS_MEMORY_WRITE_ONLY "Write Only" - IDS_MEMORY_READ_WRITE "Read / Write" + IDS_PORT_PORT_IO "Извод" + IDS_PORT_MEMORY_IO "Памет" + IDS_INTERRUPT_EDGE_SENSITIVE "ЧувÑтвителноÑÑ‚ на нараÑтване" + IDS_INTERRUPT_LEVEL_SENSITIVE "ЧувÑтвителноÑÑ‚ по равнище" + IDS_MEMORY_READ_ONLY "Само за четене" + IDS_MEMORY_WRITE_ONLY "Само за запиÑ" + IDS_MEMORY_READ_WRITE "Четене/ запиÑ" END STRINGTABLE DISCARDABLE BEGIN - IDS_BUS_UNDEFINED "Undefined" - IDS_BUS_INTERNAL "Internal" + IDS_BUS_UNDEFINED "Ðеуказан" + IDS_BUS_INTERNAL "Вътрешен" IDS_BUS_ISA "ISA" IDS_BUS_EISA "EISA" IDS_BUS_MICROCHANNEL "MicroChannel" @@ -482,11 +496,11 @@ BEGIN IDS_BUS_CBUS "C-Bus" IDS_BUS_MPIBUS "MPI-Bus" IDS_BUS_MPSABUS "MPSA-Bus" - IDS_BUS_PROCESSORINTERNAL "Processor Internal" - IDS_BUS_INTERNALPOWERBUS "Internal Power Bus" - IDS_BUS_PNPISABUS "PnP-ISA Bus" - IDS_BUS_PNPBUS "PnP Bus" - IDS_BUS_UNKNOWNTYPE "Unknown Interface Type" + IDS_BUS_PROCESSORINTERNAL "ПроцеÑор вътрешен" + IDS_BUS_INTERNALPOWERBUS "Вътрешна захранваща шина" + IDS_BUS_PNPISABUS "Шина PnP-ISA" + IDS_BUS_PNPBUS "Шина PnP" + IDS_BUS_UNKNOWNTYPE "ÐеизвеÑтен вид интерфейÑ" END /*****************************************************************/ @@ -500,77 +514,66 @@ IDD_EXPORTRANGE DIALOGEX DISCARDABLE 50, 50, 370, 50 STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Îáëŕńň çŕ Äçíîń",IDC_STATIC,2,0,366,48 - CONTROL "ÂńÄ&÷ęÄ",IDC_EXPORT_ALL,"Button",BS_AUTORADIOBUTTON,10,10,50,11 - CONTROL "Čç&áđŕíÄË™ ęëîí",IDC_EXPORT_BRANCH,"Button",BS_AUTORADIOBUTTON,10,22, 100,11 + GROUPBOX "ОблаÑÑ‚ за изноÑ",IDC_STATIC,2,0,366,48 + CONTROL "Ð’Ñи&чки",IDC_EXPORT_ALL,"Button",BS_AUTORADIOBUTTON,10,10,50,11 + CONTROL "Из&Ð±Ñ€Ð°Ð½Ð¸Ñ ÐºÐ»Ð¾Ð½",IDC_EXPORT_BRANCH,"Button",BS_AUTORADIOBUTTON,10,22, 100,11 EDITTEXT IDC_EXPORT_BRANCH_TEXT,30,34,335,12 END -IDD_LOADHIVE DIALOGEX DISCARDABLE 0, 0, 193, 34 -STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Load Hive" -FONT 8, "Ms Shell Dlg" -{ - LTEXT "&ĘëŕâÄÅ™:", IDC_STATIC, 4, 4, 15, 8, SS_LEFT - EDITTEXT IDC_EDIT_KEY, 23, 2, 167, 13 - DEFPUSHBUTTON "Äîáđĺ", IDOK, 140, 17, 50, 14 - PUSHBUTTON "Îňęŕç", IDCANCEL, 89, 17, 50, 14 -} - IDD_ADDFAVORITES DIALOGEX DISCARDABLE 0, 0, 186, 46 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Äîáŕâ˙íĺ â ëţáÄěęÄňĺ" +CAPTION "ДобавÑне в любимките" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "Äîáđĺ",IDOK,129,7,50,14 - PUSHBUTTON "Îňęŕç",IDCANCEL,129,24,50,14 - LTEXT "&Čěĺ íŕ ëţáÄěęŕ:",IDC_STATIC,7,7,70,10 + DEFPUSHBUTTON "Добре",IDOK,129,7,50,14 + PUSHBUTTON "Отказ",IDCANCEL,129,24,50,14 + LTEXT "&Име на любимка:",IDC_STATIC,7,7,70,10 EDITTEXT IDC_FAVORITENAME,7,26,110,13,ES_AUTOHSCROLL END IDD_REMOVEFAVORITES DIALOGEX DISCARDABLE 0, 0, 164, 135 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ďđĺěŕőâŕíĺ íŕ ëţáÄěęÄ" +CAPTION "Премахване на любимки" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "Äîáđĺ",IDOK,107,114,50,14 - PUSHBUTTON "Îňęŕç",IDCANCEL,7,114,50,14 + DEFPUSHBUTTON "Добре",IDOK,107,114,50,14 + PUSHBUTTON "Отказ",IDCANCEL,7,114,50,14 CONTROL "List1",IDC_FAVORITESLIST,"SysListView32",LVS_LIST | WS_BORDER | WS_TABSTOP,7,20,150,90 - LTEXT "Čçáîđ íŕ ëţáÄěęÄ:",IDC_STATIC,7,7,99,12 + LTEXT "Избор на любимки:",IDC_STATIC,7,7,99,12 END IDD_FIND DIALOGEX DISCARDABLE 0, 0, 254, 82 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ňúđńĺíĺ" +CAPTION "ТърÑене" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Å‡ÃºÄ‘Å„Ä Ã®Å¯Äº",IDOK,197,7,50,14 - PUSHBUTTON "Îňęŕç",IDCANCEL,197,24,50,14 - GROUPBOX "Ňúđńĺíĺ â",IDC_STATIC,7,25,63,51 - LTEXT "&Ňúđńĺíĺ íŕ:",IDC_STATIC,7,8,37,10 + DEFPUSHBUTTON "&ТърÑи още",IDOK,197,7,50,14 + PUSHBUTTON "Отказ",IDCANCEL,197,24,50,14 + GROUPBOX "ТърÑене в",IDC_STATIC,7,25,63,51 + LTEXT "&ТърÑене на:",IDC_STATIC,7,8,37,10 EDITTEXT IDC_FINDWHAT,47,7,142,13,ES_AUTOHSCROLL - CONTROL "&Ęëţ÷îâĺ",IDC_LOOKAT_KEYS,"Button",BS_AUTOCHECKBOX | + CONTROL "&Ключове",IDC_LOOKAT_KEYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,36,55,8 - CONTROL "&ŃňîéíîńňÄ",IDC_LOOKAT_VALUES,"Button",BS_AUTOCHECKBOX | + CONTROL "&СтойноÑти",IDC_LOOKAT_VALUES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,48,55,8 - CONTROL "&ÄŕííÄ",IDC_LOOKAT_DATA,"Button",BS_AUTOCHECKBOX | + CONTROL "&Данни",IDC_LOOKAT_DATA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,60,55,8 - CONTROL "ŃúâÄŕäĺíÄĺ ńŕěî ÄÄ‘Ä &Ã¶ÄºÃ«Ä Ã­Äçîâĺ",IDC_MATCHSTRING,"Button", + CONTROL "Съвпадение Ñамо при &цели низове",IDC_MATCHSTRING,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,72,39,133,13 - CONTROL "Îň÷Äňŕíĺ íŕ &ăËŕâÃîŃŇňŕ",IDC_MATCHCASE,"Button",BS_AUTOCHECKBOX | + CONTROL "Отчитане на &гЛавÐоСТта",IDC_MATCHCASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,72,53,102,12 END IDD_FINDING DIALOGEX 0, 0, 145, 50 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Ňúđńĺíĺ" +CAPTION "ТърÑене" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN ICON IDI_REGEDIT,IDC_STATIC,7,7,20,20 - DEFPUSHBUTTON "&Îňęŕç",IDCANCEL,93,29,45,14 - LTEXT "Ďđĺňúđńâŕíĺ íŕ đĺăÄńňúđŕ...",IDC_STATIC,33,12,105,8 + DEFPUSHBUTTON "&Отказ",IDCANCEL,93,29,45,14 + LTEXT "ПретърÑване на региÑтъра...",IDC_STATIC,33,12,105,8 END /* @@ -591,8 +594,8 @@ END /* *STRINGTABLE DISCARDABLE *BEGIN - * ID_HELP_HELPTOPICS "Îňâŕđ˙ Äîěîůňŕ çŕ ÄĺăÄńňúđíÄË™ îáđŕáîň÷ÄÄ™." - * ID_HELP_ABOUT "Ďîęŕçâŕ ńâĺäĺíÄË™ çŕ ÄÄ‘ÄëîćĺíÄĺňî, âĺđńÄ˙ňŕ Ä Ã¢ÃºÃ§ÄđîÄçâîäńňâĺíîňî Äđŕâî." + * ID_HELP_HELPTOPICS "ÐžÑ‚Ð²Ð°Ñ€Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰Ñ‚Ð° за РегиÑÑ‚ÑŠÑ€Ð½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸Ðº." + * ID_HELP_ABOUT "Показва ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð° приложението, верÑиÑта и възпроизводÑтвеното право." *END */ diff --git a/reactos/base/applications/regedit/lang/en-US.rc b/reactos/base/applications/regedit/lang/en-US.rc index 80dc88d399d..2421d453d91 100644 --- a/reactos/base/applications/regedit/lang/en-US.rc +++ b/reactos/base/applications/regedit/lang/en-US.rc @@ -272,7 +272,7 @@ FONT 8, "MS Shell Dlg" LTEXT "Driver exclusive", IDC_DRIVER_EXCLUSIVE, 72, 240, 54, 8, WS_DISABLED RTEXT "Interface Type:", IDC_STATIC, 144, 220, 58, 8 LTEXT "", IDC_INTERFACETYPE, 205, 220, 66, 8 - RTEXT "Bus Nummer:", IDC_STATIC, 151, 230, 51, 8 + RTEXT "Bus Number:", IDC_STATIC, 151, 230, 51, 8 LTEXT "", IDC_BUSNUMBER, 205, 230, 66, 8 RTEXT "Version:", IDC_STATIC, 151, 240, 51, 8 LTEXT "", IDC_VERSION, 205, 240, 66, 8 diff --git a/reactos/base/applications/sndvol32/lang/bg-BG.rc b/reactos/base/applications/sndvol32/lang/bg-BG.rc index 7ee069c461d..a213084d30b 100644 --- a/reactos/base/applications/sndvol32/lang/bg-BG.rc +++ b/reactos/base/applications/sndvol32/lang/bg-BG.rc @@ -1,8 +1,12 @@ +/* Превод на БългарÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* LOCATION: \base\applications\sndvol32\lang */ + LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT IDM_MAINMENU MENU DISCARDABLE BEGIN - POPUP "Из&бори" + POPUP "Въз&можноÑти" BEGIN MENUITEM "С&войÑтва", IDC_PROPERTIES MENUITEM "&Разширени наÑтройки", IDC_ADVANCED_CONTROLS @@ -46,12 +50,12 @@ IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150 STYLE WS_POPUP | WS_BORDER FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15 + LTEXT "Обща", IDC_LINE_NAME, 4, 7, 100, 15 CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1 - LTEXT "Balance", -1, 4, 35, 80, 42 - LTEXT "Volume", -1, 4, 100, 77, 108 - CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30 + LTEXT "ЛÑво/ДÑÑно", -1, 10, 35, 80, 42 + LTEXT "Сила", -1, 30, 100, 45, 20 + CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 5, 55, 85, 30 CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70 - CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX + CHECKBOX "За&глушаване", IDC_LINE_SWITCH, 4, 190, 110, 16, BS_AUTOCHECKBOX CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200 END diff --git a/reactos/base/applications/write/Bg.rc b/reactos/base/applications/write/Bg.rc new file mode 100644 index 00000000000..03e6306cf88 --- /dev/null +++ b/reactos/base/applications/write/Bg.rc @@ -0,0 +1,38 @@ + /* + * Bulgarian language support + * + * Copyright (C) 2007 Mikolaj Zalewski + * + * 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 + */ + +/* Превод на БългарÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* LOCATION: \base\applications\write\lang */ + +/* WARNING */ +/* Do NOT save this file with BOM */ + +#include "resources.h" + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT + +STRINGTABLE +{ + IDS_FAILED, "ÐеуÑпешно пуÑкане на Тетрадката." +} diff --git a/reactos/base/applications/write/rsrc.rc b/reactos/base/applications/write/rsrc.rc index b1500b0cc1f..8e2e378fb92 100644 --- a/reactos/base/applications/write/rsrc.rc +++ b/reactos/base/applications/write/rsrc.rc @@ -30,6 +30,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Sv.rc" /* UTF-8 */ +#include "Bg.rc" #include "De.rc" #include "Es.rc" #include "Fr.rc" diff --git a/reactos/base/setup/usetup/lang/bg-BG.h b/reactos/base/setup/usetup/lang/bg-BG.h index 0bb6cad0638..1119bb9251e 100644 --- a/reactos/base/setup/usetup/lang/bg-BG.h +++ b/reactos/base/setup/usetup/lang/bg-BG.h @@ -840,7 +840,7 @@ static MUI_ENTRY bgBGSelectPartitionEntries[] = { 0, 0, - " ®ç ª ©â¥...", + " ®ç ª ©â¥...", /* ¥¤êâ ¤  ­¥ ᥠ¯à¥¢¥¦¤ , § é®â® ᯨáêªêâ á ¤ï«®¢¥â¥ é¥ á¥ à §¬¥á⨠*/ TEXT_TYPE_STATUS }, { @@ -995,13 +995,13 @@ static MUI_ENTRY bgBGBootLoaderEntries[] = { 8, 12, - "Install bootloader on the harddisk (MBR and VBR).", + "‘« £ ­¥ ­  § à¥¦¤ ç ­  â¢êà¤¨ï ¤¨áª (MBR ¨ VBR).", TEXT_STYLE_NORMAL }, { 8, 13, - "Install bootloader on the harddisk (VBR only).", + "‘« £ ­¥ ­  § à¥¦¤ ç ­  â¢êà¤¨ï ¤¨áª (á ¬® VBR).", TEXT_STYLE_NORMAL }, { @@ -1418,7 +1418,7 @@ MUI_ERROR bgBGErrorEntries[] = { //ERROR_INITIALIZE_REGISTRY, //There is something wrong with this line. - "¥ãᯥ譮 ®§­ ç ¢ ­¥ ­  ॣ¨áâêà .", + "¥ãᯥ譮 § ¤ ¢ ­¥ ­  ­ ç «­¨ á⮩­®á⨠­  ॣ¨áâêà .", "ENTER = १ ¯ã᪠­¥ ­  ª®¬¯îâêà " }, { diff --git a/reactos/base/system/format/lang/bg-BG.rc b/reactos/base/system/format/lang/bg-BG.rc index 7462a37503e..c070efcd1af 100644 --- a/reactos/base/system/format/lang/bg-BG.rc +++ b/reactos/base/system/format/lang/bg-BG.rc @@ -1,9 +1,13 @@ +/* Превод на БългарÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* LOCATION: \base\applications\format\lang */ + LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT STRINGTABLE DISCARDABLE BEGIN STRING_HELP, "Употреба: %s уÑтройÑтво: [-FS:файлова_ÑиÑтема] [-V:етикет] [-Q] [-A:размер] [-C]\n\n\ [drive:] Указва уÑтройÑтвото за оразмерÑване.\n\ - -FS:файлова_ÑиÑтема Указва вида на дайловата ÑиÑтема (%s).\n\ + -FS:файлова_ÑиÑтема Указва вида на файловата ÑиÑтема (%s).\n\ -V:етикет Указва етикет за тома.\n\ -Q Извършва бързо оразмерÑване (форматиране).\n\ -A:размер ПотиÑка Ð¿Ð¾Ð´Ñ€Ð°Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€ на чепката. Подразбраните наÑтройки\n\ @@ -15,7 +19,7 @@ STRING_HELP, "Употреба: %s уÑтройÑтво: [-FS:файлова_Ñ -C Файловете, Ñъздадени на Ð½Ð¾Ð²Ð¸Ñ Ñ‚Ð¾Ð¼ ще бъдат Ñбивани по\n\ подразбиране.\n\n" -STRING_COMPLETE "%lu на Ñто готови.\r" +STRING_COMPLETE "%lu% готови.\r" STRING_FORMAT_FAIL "FormatEx не завърши уÑпешно.\n\n" diff --git a/reactos/base/system/subst/lang/bg-BG.rc b/reactos/base/system/subst/lang/bg-BG.rc new file mode 100644 index 00000000000..63dfb0284c1 --- /dev/null +++ b/reactos/base/system/subst/lang/bg-BG.rc @@ -0,0 +1,21 @@ +/* Превод на БългарÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* LOCATION: \base\applications\subst\lang */ + +/* ÐЕДОВЪРШЕÐ- да Ñе провери за грешки */ +#include "resource.h" +LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT + +STRINGTABLE +BEGIN + IDS_INCORRECT_PARAMETER_COUNT "Ðеправилен брой ключове - %s\n" + IDS_INVALID_PARAMETER "Ðеправилен брой ключове - %s\n" + IDS_INVALID_PARAMETER2 "ÐедопуÑтим ключ - %s\n" + IDS_DRIVE_ALREAD_SUBSTED "УÑтройÑтвото вече е подложено на SUBST\n" + IDS_FAILED_WITH_ERROCODE "Грешка номер: 0x%x: %s\n" + IDS_USAGE "Обвързва път Ñ Ð¸Ð¼Ðµ на уÑтройÑтво (дÑл).\n\nSUBST [drive1: [drive2:]path]\nSUBST drive1: /D\n\n drive1: \ + Указва мнимото уÑтройÑтво и пъта, Ñ ÐºÐ¾Ð¹Ñ‚Ð¾ иÑкате да обвържете пътÑ.\n \ + [drive2:]path Указва дейÑтвително уÑтройÑтво и пътÑ, Ñ ÐºÐ¾Ð¹Ñ‚Ð¾ иÑкате да обвържете\n \ + мнимо уÑтройÑтво.\n /D \ + Изтрива замеÑтеното (мнимо) уÑтройÑтво.\n\nÐапишете „SUBST“ без ключове, за да Ñе изведе ÑпиÑък Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ‚Ðµ мними уÑтройÑтва.\n" +END diff --git a/reactos/base/system/subst/rsrc.rc b/reactos/base/system/subst/rsrc.rc index 9bc6428a248..5e4c4a41991 100644 --- a/reactos/base/system/subst/rsrc.rc +++ b/reactos/base/system/subst/rsrc.rc @@ -5,6 +5,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL // UTF-8 #pragma code_page(65001) +#include "lang/bg-BG.rc" #include "lang/en-US.rc" #include "lang/es-ES.rc" #include "lang/fr-FR.rc" diff --git a/reactos/dll/cpl/input/lang/bg-BG.rc b/reactos/dll/cpl/input/lang/bg-BG.rc index 0524dc8d95d..b2cabc3950b 100644 --- a/reactos/dll/cpl/input/lang/bg-BG.rc +++ b/reactos/dll/cpl/input/lang/bg-BG.rc @@ -1,241 +1,245 @@ +/* Превод на българÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* LOCATION: \dll\cpl\input\lang */ + LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT IDD_PROPPAGESETTINGS DIALOGEX 0, 0, 254, 228 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Íàñòðîéêè" +CAPTION "ÐаÑтройки" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Ïîñî÷åòå èçáðàíèòå îò âàñ óñëóãè çà âñåêè ïîñî÷åí â ñïèñúêà åçèê.\nÏðîìÿíàòà íà ñïèñúêà ñòàâà ñ „Ïðåìàõâàíå“ è „Äîáàâÿíå“.", -1, 9, 6, 238, 25 + LTEXT "ПоÑочете избраните от Ð²Ð°Ñ ÑƒÑлуги за вÑеки поÑочен в ÑпиÑъка език.\nПромÑната на ÑпиÑъка Ñтава Ñ â€žÐŸÑ€ÐµÐ¼Ð°Ñ…Ð²Ð°Ð½Ðµâ€œ и „ДобавÑне“.", -1, 9, 6, 238, 25 CONTROL "TEXT", IDC_KEYLAYOUT_LIST, "SYSLISTVIEW32", WS_BORDER | WS_VSCROLL | WS_TABSTOP | LVS_SORTASCENDING | LVS_REPORT | 0x0000808D, 8, 36, 237, 101 - PUSHBUTTON "&Ïðèëàãàíå íà ïîäðàçáèðàíèòå", IDC_SET_DEFAULT, 101, 159, 144, 14 - PUSHBUTTON "&Äîáàâÿíå...", IDC_ADD_BUTTON, 27, 142, 70, 14 - PUSHBUTTON "Ïðå&ìàõâàíå...", IDC_REMOVE_BUTTON, 101, 142, 70, 14 - PUSHBUTTON "&Ñâîéñòâà...", IDC_PROP_BUTTON, 175, 142, 70, 14 - GROUPBOX "Ïðåäïî÷èòàíèÿ", -1, 7, 185, 240, 36 - PUSHBUTTON "Íàñòðîéêà íà &êëàâèøèòå...", IDC_KEY_SET_BTN, 14, 198, 110, 14 + PUSHBUTTON "&Прилагане на подразбираните", IDC_SET_DEFAULT, 101, 159, 144, 14 + PUSHBUTTON "&ДобавÑне...", IDC_ADD_BUTTON, 27, 142, 70, 14 + PUSHBUTTON "Пре&махване...", IDC_REMOVE_BUTTON, 101, 142, 70, 14 + PUSHBUTTON "&СвойÑтва...", IDC_PROP_BUTTON, 175, 142, 70, 14 + GROUPBOX "ПредпочитаниÑ", -1, 7, 185, 240, 36 + PUSHBUTTON "ÐаÑтройка на &клавишите...", IDC_KEY_SET_BTN, 14, 198, 110, 14 END IDD_KEYSETTINGS DIALOGEX 0, 0, 272, 163 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Ðàçøèðåíèòå ñëîâåñíè óñëóãè" +CAPTION "Разширените ÑловеÑни уÑлуги" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Çà èçêëþ÷âàíå íà Caps Lock", -1, 7, 7, 258, 26 - AUTORADIOBUTTON "ñå íàòèñêà CAPS &LOCK", IDC_PRESS_CL_KEY_RB, 14, 17, 120, 11, WS_GROUP - AUTORADIOBUTTON "ñå íàòèñêà SHI&FT", IDC_PRESS_SHIFT_KEY_RB, 144, 17, 120, 11, NOT WS_TABSTOP - GROUPBOX "Áúðçè êëàâèøè çà åçèöèòå íà âúâåæäàíå", -1, 7, 37, 258, 95 - LTEXT "Äåéñòâèå", -1, 14, 47, 60, 9 - RTEXT "Êëàâèøíè &ñú÷åòàíèÿ", -1, 177, 47, 79, 9 + GROUPBOX "За изключване на Caps Lock", -1, 7, 7, 258, 26 + AUTORADIOBUTTON "Ñе натиÑка CAPS &LOCK", IDC_PRESS_CL_KEY_RB, 14, 17, 120, 11, WS_GROUP + AUTORADIOBUTTON "Ñе натиÑка SHI&FT", IDC_PRESS_SHIFT_KEY_RB, 144, 17, 120, 11, NOT WS_TABSTOP + GROUPBOX "Бързи клавиши за езиците на въвеждане", -1, 7, 37, 258, 95 + LTEXT "ДейÑтвие", -1, 14, 47, 60, 9 + RTEXT "Клавишни &ÑъчетаниÑ", -1, 177, 47, 79, 9 CONTROL "", IDC_KEY_LISTVIEW, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_AUTOARRANGE | LVS_SINGLESEL, 14, 57, 244, 52, WS_EX_CLIENTEDGE - PUSHBUTTON "Ïðî&ìÿíà íà êëàâèøíîòî ñú÷åòàíèå", IDC_CHANGE_KEY_SEQ_BTN, 128, 113, 130, 14, WS_GROUP - DEFPUSHBUTTON "Äîáðå", IDOK, 66, 140, 70, 14 - PUSHBUTTON "Îòêàç", IDCANCEL, 146, 140, 70, 14 + PUSHBUTTON "Про&мÑна на клавишното Ñъчетание", IDC_CHANGE_KEY_SEQ_BTN, 128, 113, 130, 14, WS_GROUP + DEFPUSHBUTTON "Добре", IDOK, 66, 140, 70, 14 + PUSHBUTTON "Отказ", IDCANCEL, 146, 140, 70, 14 END IDD_ADD DIALOGEX 20, 20, 227, 90 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Äîáàâÿíå åçèê íà ïèñàíå" +CAPTION "ДобавÑне език на пиÑане" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Åçèê íà &âúâåæäàíå:", -1, 7, 7, 90, 10 + LTEXT "Език на &въвеждане:", -1, 7, 7, 90, 10 COMBOBOX IDC_INPUT_LANG_COMBO, 7, 17, 212, 150, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL - LTEXT "Êëàâèàòóðíà ïîäðåäáà/IME:", -1, 7, 36, 110, 10 + LTEXT "Клавиатурна подредба/IME:", -1, 7, 36, 110, 10 COMBOBOX IDC_KEYBOARD_LO_COMBO, 7, 47, 212, 150, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL - DEFPUSHBUTTON "Äîáðå", IDOK, 116, 68, 50, 14 - PUSHBUTTON "Îòêàç", IDCANCEL, 169, 68, 50, 14 + DEFPUSHBUTTON "Добре", IDOK, 116, 68, 50, 14 + PUSHBUTTON "Отказ", IDCANCEL, 169, 68, 50, 14 END IDD_CHANGE_KEY_SEQ DIALOGEX 5, 100, 230, 125 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Ñìÿíà íà êëàâèøíîòî ñú÷åòàíèå" +CAPTION "СмÑна на клавишното Ñъчетание" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "", -1, 9, 5, 155, 110 - AUTOCHECKBOX "&Ñìÿíà åçèêà íà âúâåæäàíå", IDC_SWITCH_INPUT_LANG_CB, 15, 15, 105, 12 + AUTOCHECKBOX "&СмÑна езика на въвеждане", IDC_SWITCH_INPUT_LANG_CB, 15, 15, 105, 12 LTEXT "Shift", -1, 73, 37, 27, 12 CTEXT "+", -1, 62, 37, 8, 9 AUTORADIOBUTTON "&Ctrl", IDC_CTRL_LANG, 29, 31, 30, 11 - AUTORADIOBUTTON "Ëÿâ &ALT", IDC_LEFT_ALT_LANG, 29, 45, 46, 12 - AUTOCHECKBOX "Ñ&ìÿíà íà ïîäðåäáèòå", IDC_SWITCH_KBLAYOUTS_CB, 16, 65, 141, 12 + AUTORADIOBUTTON "ЛÑв &ALT", IDC_LEFT_ALT_LANG, 29, 45, 46, 12 + AUTOCHECKBOX "С&мÑна на подредбите", IDC_SWITCH_KBLAYOUTS_CB, 16, 65, 141, 12 LTEXT "Shift", -1, 74, 87, 27, 12 CTEXT "+", -1, 63, 87, 8, 9 AUTORADIOBUTTON "C&trl", IDC_CTRL_LAYOUT, 30, 81, 30, 11 - AUTORADIOBUTTON "Ëÿâ A<", IDC_LEFT_ALT_LAYOUT, 30, 95, 44, 12 - DEFPUSHBUTTON "Äîáðå", IDOK, 172, 9, 50, 14 - PUSHBUTTON "Îòêàç", IDCANCEL, 172, 27, 50, 14 + AUTORADIOBUTTON "ЛÑв A<", IDC_LEFT_ALT_LAYOUT, 30, 95, 44, 12 + DEFPUSHBUTTON "Добре", IDOK, 172, 9, 50, 14 + PUSHBUTTON "Отказ", IDCANCEL, 172, 27, 50, 14 END IDD_INPUT_LANG_PROP DIALOGEX 20, 20, 227, 75 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Ñâîéñòâà íà åçèêà íà âúâåæäàíå" +CAPTION "СвойÑтва на езика на въвеждане" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Åçèê íà ïèñàíå", -1, 7, 7, 55, 8 + LTEXT "Език на пиÑане", -1, 7, 7, 55, 8 LTEXT "", IDC_INPUT_LANG_STR, 73, 7, 129, 8 - LTEXT "Êëàâèàòóðíà ïîäðåäáà/IME:", -1, 7, 21, 110, 10 + LTEXT "Клавиатурна подредба/IME:", -1, 7, 21, 110, 10 COMBOBOX IDC_KB_LAYOUT_IME_COMBO, 7, 32, 212, 150, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL - DEFPUSHBUTTON "Äîáðå", IDOK, 116, 53, 52, 14 - PUSHBUTTON "Îòêàç", IDCANCEL, 169, 53, 52, 14 + DEFPUSHBUTTON "Добре", IDOK, 116, 53, 52, 14 + PUSHBUTTON "Отказ", IDCANCEL, 169, 53, 52, 14 END STRINGTABLE BEGIN - IDS_CPLSYSTEMNAME "Ñëîâåñíè óñëóãè è åçèöè íà âúâåæäàíå" - IDS_CPLSYSTEMDESCRIPTION "Íàãëàñÿâàíå íà íàñòðîéêèòå çà åçèöèòå íà âúâåæäàíå." - IDS_KEYBOARD "Êëàâèàòóðà" - IDS_NONE "(Íÿìà)" - IDS_UNKNOWN "(Íåèçâåñòíî)" - IDS_RESTART "Èñêàòå ëè äà ïðåçàïóñíåòå êîìïþòúðà îùå ñåãà?" - IDS_WHATS_THIS "Êàêâî å òîâà?" - IDS_LANGUAGE "Åçèê" - IDS_LAYOUT "Êëàâèàòóðíà ïîäðåäáà" - IDS_REM_QUESTION "Èñêàòå ëè äà ïðåìàõíåòå èçáðàíàòà ïîäðåäáà?" - IDS_CONFIRMATION "Ïîòâúðæäåíèå" - IDS_LAYOUT_EXISTS "Ïîäðåäáàòà âå÷å ñúùåñòâóâà." - IDS_LAYOUT_EXISTS2 "Ïîäðåäáàòà âå÷å ñúùåñòâóâà è íå ìîæå äà áúäå äîáàâåíà." + IDS_CPLSYSTEMNAME "СловеÑни уÑлуги и езици на въвеждане" + IDS_CPLSYSTEMDESCRIPTION "ÐаглаÑÑване на наÑтройките за езиците на въвеждане." + IDS_KEYBOARD "Клавиатура" + IDS_NONE "(ÐÑма)" + IDS_UNKNOWN "(ÐеизвеÑтно)" + IDS_RESTART "ИÑкате ли да презапуÑнете компютъра още Ñега?" + IDS_WHATS_THIS "Какво е това?" + IDS_LANGUAGE "Език" + IDS_LAYOUT "Клавиатурна подредба" + IDS_REM_QUESTION "ИÑкате ли да премахнете избраната подредба?" + IDS_CONFIRMATION "Потвърждение" + IDS_LAYOUT_EXISTS "Подредбата вече ÑъщеÑтвува." + IDS_LAYOUT_EXISTS2 "Подредбата вече ÑъщеÑтвува и не може да бъде добавена." IDS_CTRL_SHIFT "Ctrl+Shift" - IDS_LEFT_ALT_SHIFT "Ëÿâ Alt+Shift" - IDS_SWITCH_BET_INLANG "Ïðåâêëþ÷âàíå íà åçèöèòå çà âúâåæäàíå" + IDS_LEFT_ALT_SHIFT "ЛÑв Alt+Shift" + IDS_SWITCH_BET_INLANG "Превключване на езиците за въвеждане" END STRINGTABLE BEGIN - IDS_ALBANIAN_LAYOUT, "Àëáàíñêà" - IDS_ARABIC_101_LAYOUT, "Àðàáñêà (101)" - IDS_ARABIC_102_LAYOUT, "Àðàáñêà (102)" - IDS_ARABIC_102_AZERTY_LAYOUT, "Àðàáñêà (102) AZERTY" - IDS_ARMENIAN_EASTERN_LAYOUT, "Àðìåíñêà èçòî÷íà" - IDS_ARMENIAN_WESTERN_LAYOUT, "Àðìåíñêà çàïàäíà" - IDS_ASSAMESE_LAYOUT, "Àñàìñêà" - IDS_AZERI_CYRILLIC_LAYOUT, "Àçúðñêà êèðèëèöà" - IDS_AZERI_LATIN_LAYOUT, "Àçúðñêà ëàòèíèöà" - IDS_BELARUSIAN_LAYOUT, "Áåëîðóñêà" - IDS_BELGIAN_COMMA_LAYOUT, "Áåëãèéñêà (çàïåòàéêà)" - IDS_BELGIAN_FRENCH_LAYOUT, "Áåëãèéñêà çà ôðåíñêè" - IDS_BELGIAN_LAYOUT, "Áåëãèéñêà (òî÷êà)" - IDS_BENGALI_LAYOUT, "Áåíãàëñêà" - IDS_BULGARIAN_LAYOUT, "Áúëãàðñêà" - IDS_BULGARIAN_BDS_LAYOUT, "Áúëãàðñêà 5237-1978" - IDS_BULGARIAN_LATIN_LAYOUT, "Áúëãàðñêà (ëàòèíèöà)" - IDS_BULGARIAN_PHONETIC_BDS_LAYOUT, "Áúëãàðñêà רÅÐÒÚ" - IDS_BULGARIAN_PHONETIC_CLASSIC_LAYOUT, "Áúëãàðñêà ßÂÅÐÒÚ" - IDS_BURMESE_LAYOUT, "Áèðìàíñêà" - IDS_CANADIAN_FRENCH_LAYOUT, "Êàíàäñêà çà ôðåíñêè" - IDS_CANADIAN_FRENCH_LEGACY_LAYOUT, "Êàíàäñêà çà ôðåíñêè (çàâåùàíà)" - IDS_CANADIAN_MULTILINGUAL_STD_LAYOUT, "Êàíàäñêà ìíîãîåçè÷íà ñòàíäàðòíà" - IDS_CANTONESE_PHONETIC_LAYOUT, "Êàíòîíñêà ïîçâóêîâà" - IDS_CHINESE_SIMPLIFIED_MSPINYINIME30_LAYOUT, "Êèòàéñêà (òðàäèöèîííà)- Microsoft Pinyin IME 3.0" - IDS_CHINESE_SIMPLIFIED_NEIMA_LAYOUT, "Êèòàéñêà (îïðîñòåíà) - NeiMa" - IDS_CHINESE_SIMPLIFIED_QUANPIN_LAYOUT, "Êèòàéñêà (îïðîñòåíà) - QuanPin" - IDS_CHINESE_SIMPLIFIED_SHUANGPIN_LAYOUT, "Êèòàéñêà (îïðîñòåíà) - ShuangPin" - IDS_CHINESE_SIMPLIFIED_USKEYBOARD_LAYOUT, "Êèòàéñêà (îïðîñòåíà) - US Keyboard" - IDS_CHINESE_SIMPLIFIED_ZHENGMA_LAYOUT, "Êèòàéñêà (îïðîñòåíà) - ZhengMa" - IDS_CHINESE_TRADITIONAL_ALPHANUMERIC_LAYOUT, "Êèòàéñêà (òðàäèöèîííà) - Alphanumeric" - IDS_CHINESE_TRADITIONAL_ARRAY_LAYOUT, "Êèòàéñêà (òðàäèöèîííà) - óêðàñåíà" - IDS_CHINESE_TRADITIONAL_BIG5CODE_LAYOUT, "Êèòàéñêà (òðàäèöèîííà) - Big5 Code" - IDS_CHINESE_TRADITIONAL_CHANGJIE_LAYOUT, "Êèòàéñêà (òðàäèöèîííà) - ChangJie" - IDS_CHINESE_TRADITIONAL_DAYI_LAYOUT, "Êèòàéñêà (òðàäèöèîííà) - DaYi" - IDS_CHINESE_TRADITIONAL_NEWCHANGJIE_LAYOUT, "Êèòàéñêà (òðàäèöèîííà) - New ChangJie" - IDS_CHINESE_TRADITIONAL_NEWPHONETIC_LAYOUT, "Êèòàéñêà (òðàäèöèîííà)- íîâà ïîçâóêîâà" - IDS_CHINESE_TRADITIONAL_PHONETIC_LAYOUT, "Êèòàéñêà (òðàäèöèîííà) - Phonetic" - IDS_CHINESE_TRADITIONAL_QUICK_LAYOUT, "Êèòàéñêà (òðàäèöèîííà) - áúðçà" - IDS_CHINESE_TRADITIONAL_UNICODE_LAYOUT, "Êèòàéñêà (òðàäèöèîííà) - Unicode" - IDS_CHINESE_TRADITIONAL_USKEYBOARD_LAYOUT, "Êèòàéñêà (òðàäèöèîííà) - US Keyboard" - IDS_CROATIAN_LAYOUT, "Õúðâàòñêà" - IDS_CZECH_LAYOUT, "×åøêà" - IDS_CZECH_PROGRAMMERS_LAYOUT, "×åøêà çà ïðîãðàìèñòè" - IDS_CZECH_QWERTY_LAYOUT, "×åøêà (QWERTY)" - IDS_DANISH_LAYOUT, "Äàòñêà" - IDS_DEVANAGARI_INSCRIPT_LAYOUT, "Äåâàíàãàðè - INSCRIPT" - IDS_DIVEHI_PHONETIC_LAYOUT, "Äõèâåõñêà çâóêîâà" - IDS_DIVEHI_TYPEWRITER_LAYOUT, "Äõèâåõñêà ìàëòèéñêà" - IDS_DUTCH_LAYOUT, "Õîëàíäñêà" - IDS_ESTONIAN_LAYOUT, "Åñòîíñêà" - IDS_FAEROESE_LAYOUT, "Ôàðåðñêà" - IDS_FARSI_LAYOUT, "Ôàðñè" - IDS_FINNISH_LAYOUT, "Ôèíñêà" - IDS_FRENCH_LAYOUT, "Ôðåíñêà" - IDS_GAELIC_LAYOUT, "Èðëàíäñêà" - IDS_GEORGIAN_LAYOUT, "Ãðóçèíñêà" - IDS_GERMAN_LAYOUT, "Íåìñêà" - IDS_GERMAN_DE_ERGO_LAYOUT, "Íåìñêà (de_ergo)" - IDS_GERMAN_IBM_LAYOUT, "Íåìñêà" - IDS_GERMAN_NEO_11_LAYOUT, "Íåìñêà (NEO-1.1)" - IDS_GERMAN_RISTOME_LAYOUT, "Íåìñêà (RISTOME)" - IDS_GREEK_LAYOUT, "Ãðúöêà" - IDS_GREEK_220_LAYOUT, "Ãðúöêà (220)" - IDS_GREEK_220_LATIN_LAYOUT, "Ãðúöêà (220)" - IDS_GREEK_319_LAYOUT, "Ãðúöêà (319)" - IDS_GREEK_319_LATIN_LAYOUT, "Ãðúöêà (319)" - IDS_GREEK_LATIN_LAYOUT, "Ãðúöêà ëàòèíèöà" - IDS_GREEK_POLYTONIC_LAYOUT, "Ãðúöêà ìíîãîòîíîâà" - IDS_GUJARATI_LAYOUT, "Ãóäæàðàòñêà" - IDS_HEBREW_LAYOUT, "Èâðèò" - IDS_HINDI_TRADITIONAL_LAYOUT, "Õèíäè òðàäèöèîííà" - IDS_HUNGARIAN_LAYOUT, "Óíãàðñêà" - IDS_HUNGARIAN_101_KEY_LAYOUT, "Óíãàðñêà 101-êëàâèøà" - IDS_ICELANDIC_LAYOUT, "Èñëàíäñêà" - IDS_IRISH_LAYOUT, "Èðëàíäñêà" - IDS_ITALIAN_LAYOUT, "Èòàëèàíñêà" - IDS_ITALIAN_142_LAYOUT, "Èòàëèàíñêà (142)" - IDS_JAPANESE_LAYOUT, "ßïîíñêà" - IDS_JAPANESE_INPUT_SYSTEM_MSIME2002_LAYOUT, "ßïîíñêà óðåäáà çà âúâåæäàíå (MS-IME2002)" - IDS_KANNADA_LAYOUT, "Êàíàðèéñêà" - IDS_KAZAKH_LAYOUT, "Êàçàõñêà" - IDS_KOREAN_LAYOUT, "Êîðåéñêà" - IDS_KOREAN_INPUT_SYSTEM_MSIME2002_LAYOUT, "Korean Input System (MS-IME2002)" - IDS_KYRGYZ_CYRILLIC_LAYOUT, "Êèðçãèçêà êèðèëèöà" - IDS_LATIN_AMERICAN_LAYOUT, "Ëàòèíîàìåðèêàíñêà" - IDS_LATVIAN_LAYOUT, "Ëàòâèéñêà" - IDS_LATVIAN_QWERTY_LAYOUT, "Ëàòâèéñêà (QWERTY)" - IDS_LITHUANIAN_LAYOUT, "Ëèòîâñêà" - IDS_LITHUANIAN_IBM_LAYOUT, "Ëèòîâñêà IBM" + IDS_US_LAYOUT, "СÐЩ" + IDS_BELGIAN_LAYOUT, "БелгийÑка (точка)" + IDS_BELGIAN_FRENCH_LAYOUT, "БелгийÑка за френÑки" + IDS_PORTUGUESE_BRAZILIAN_ABNT_LAYOUT, "ПортугалÑка (БразилÑка ABNT)" + IDS_CANADIAN_FRENCH_LAYOUT, "КанадÑка за френÑки" + IDS_CANADIAN_FRENCH_LEGACY_LAYOUT, "КанадÑка за френÑки (завещана)" + IDS_DANISH_LAYOUT, "ДатÑка" + IDS_DUTCH_LAYOUT, "ХоландÑка" + IDS_FINNISH_LAYOUT, "ФинÑка" + IDS_FRENCH_LAYOUT, "ФренÑка" + IDS_GERMAN_LAYOUT, "ÐемÑка" + IDS_GERMAN_IBM_LAYOUT, "ÐемÑка" + IDS_ICELANDIC_LAYOUT, "ИÑландÑка" + IDS_IRISH_LAYOUT, "ИрландÑка" + IDS_ITALIAN_LAYOUT, "ИталианÑка" + IDS_ITALIAN_142_LAYOUT, "ИталианÑка (142)" + IDS_LATIN_AMERICAN_LAYOUT, "ЛатиноамериканÑка" + IDS_NORWEGIAN_LAYOUT, "Ðорвежка" + IDS_PORTUGUESE_LAYOUT, "ПортугалÑка" + IDS_SPANISH_LAYOUT, "ИÑпанÑка" + IDS_SPANISH_VARIANTION_LAYOUT, "ИÑпанÑка разновидноÑÑ‚" + IDS_SWEDISH_LAYOUT, "ШведÑка" + IDS_SWISS_FRENCH_LAYOUT, "ШвейцарÑка за френÑки" + IDS_SWISS_GERMAN_LAYOUT, "ШвейцарÑка за немÑки" + IDS_UNITED_KINGDOM_LAYOUT, "ÐнглийÑка" + IDS_UNITED_STATES_INTERNATIONAL_LAYOUT, "СÐЩ- международна" + IDS_UNITED_STATES_DVORAK_FOR_LEFT_HAND_LAYOUT, "СÐЩ- Дворак за лÑва ръка" + IDS_UNITED_STATES_DVORAK_FOR_RIGHT_HAND_LAYOUT, "СÐЩ- Дворак за дÑÑна ръка" + IDS_ALBANIAN_LAYOUT, "ÐлбанÑка" + IDS_CROATIAN_LAYOUT, "ХърватÑка" + IDS_CZECH_LAYOUT, "Чешка" + IDS_CZECH_QWERTY_LAYOUT, "Чешка (QWERTY)" + IDS_HUNGARIAN_LAYOUT, "УнгарÑка" + IDS_HUNGARIAN_101_KEY_LAYOUT, "УнгарÑка 101-клавиша" + IDS_POLISH_LAYOUT, "ПолÑка за програмиÑти" + IDS_POLISH_214_LAYOUT, "ПолÑка (214)" + IDS_ROMANIAN_LAYOUT, "РумънÑка" + IDS_SERBIAN_LATIN_LAYOUT, "СръбÑка (латиница)" + IDS_SLOVAK_LAYOUT, "Словашка" + IDS_SLOVAK_QWERTY_LAYOUT, "Словашка (QWERTY)" + IDS_SLOVENIAN_LAYOUT, "СловенÑка" + IDS_ESTONIAN_LAYOUT, "ЕÑтонÑка" + IDS_LATVIAN_LAYOUT, "ЛатвийÑка" + IDS_LATVIAN_QWERTY_LAYOUT, "ЛатвийÑка (QWERTY)" + IDS_LITHUANIAN_IBM_LAYOUT, "ЛитовÑка IBM" + IDS_GREEK_LAYOUT, "Гръцка" + IDS_GREEK_LATIN_LAYOUT, "Гръцка латиница" + IDS_GREEK_220_LAYOUT, "Гръцка (220)" + IDS_GREEK_319_LAYOUT, "Гръцка (319)" + IDS_GREEK_220_LATIN_LAYOUT, "Гръцка (220)" + IDS_GREEK_319_LATIN_LAYOUT, "Гръцка (319)" + IDS_BELARUSIAN_LAYOUT, "БелоруÑка" + IDS_BULGARIAN_LAYOUT, "БългарÑка" + IDS_BULGARIAN_LATIN_LAYOUT, "БългарÑка (латиница)" + IDS_RUSSIAN_LAYOUT, "РуÑка" + IDS_RUSSIAN_TYPEWRITER_LAYOUT, "РуÑка (машинопиÑна)" + IDS_SERBIAN_CYRILLIC_LAYOUT, "СръбÑка (кирилица)" + IDS_UKRAINIAN_LAYOUT, "УкраинÑка" + IDS_TURKISH_F_LAYOUT, "ТурÑка F" + IDS_TURKISH_Q_LAYOUT, "ТурÑка Q" + IDS_JAPANESE_LAYOUT, "ЯпонÑка" + IDS_JAPANESE_INPUT_SYSTEM_MSIME2002_LAYOUT, "ЯпонÑка уредба за въвеждане (MS-IME2002)" + IDS_KOREAN_LAYOUT, "КорейÑка" + IDS_KOREAN_INPUT_SYSTEM_MSIME2002_LAYOUT, "КорейÑка уредба за въвеждане (MS-IME2002)" + IDS_CHINESE_TRADITIONAL_USKEYBOARD_LAYOUT, "КитайÑка (традиционна) - клавиатура за СÐЩ" + IDS_CHINESE_TRADITIONAL_PHONETIC_LAYOUT, "КитайÑка (традиционна) - звукова" + IDS_CHINESE_TRADITIONAL_CHANGJIE_LAYOUT, "КитайÑка (традиционна) - ChangJie" + IDS_CHINESE_TRADITIONAL_BIG5CODE_LAYOUT, "КитайÑка (традиционна) - Big5 Code" + IDS_CHINESE_TRADITIONAL_DAYI_LAYOUT, "КитайÑка (традиционна) - DaYi" + IDS_CHINESE_TRADITIONAL_UNICODE_LAYOUT, "КитайÑка (традиционна) - уникод" + IDS_CHINESE_TRADITIONAL_ALPHANUMERIC_LAYOUT, "КитайÑка (традиционна) - буквено- цифрена" + IDS_CHINESE_SIMPLIFIED_USKEYBOARD_LAYOUT, "КитайÑка (опроÑтена) - клавиатура за СÐЩ" + IDS_CHINESE_SIMPLIFIED_QUANPIN_LAYOUT, "КитайÑка (опроÑтена) - QuanPin" + IDS_CHINESE_SIMPLIFIED_SHUANGPIN_LAYOUT, "КитайÑка (опроÑтена) - ShuangPin" + IDS_CHINESE_SIMPLIFIED_ZHENGMA_LAYOUT, "КитайÑка (опроÑтена) - ZhengMa" + IDS_CHINESE_SIMPLIFIED_NEIMA_LAYOUT, "КитайÑка (опроÑтена) - NeiMa" + IDS_THAI_KEDMANEE_LAYOUT, "ТайÑка Kedmanee" + IDS_THAI_PATTACHOTE_LAYOUT, "ТайÑка Pattachote" + IDS_THAI_KEDMANEE_NONSHIFTLOCK_LAYOUT, "ТайÑка Kedmanee (non-ShiftLock)" + IDS_THAI_PATTACHOTE_NONSHIFTLOCK_LAYOUT, "ТайÑка Pattachote (non-ShiftLock)" + IDS_HEBREW_LAYOUT, "Иврит" + IDS_ARABIC_101_LAYOUT, "ÐрабÑка (101)" + IDS_ARABIC_102_LAYOUT, "ÐрабÑка (102)" + IDS_ARABIC_102_AZERTY_LAYOUT, "ÐрабÑка (102) AZERTY" + IDS_CZECH_PROGRAMMERS_LAYOUT, "Чешка за програмиÑти" + IDS_LITHUANIAN_LAYOUT, "ЛитовÑка" + IDS_BELGIAN_COMMA_LAYOUT, "БелгийÑка (запетайка)" + IDS_CHINESE_TRADITIONAL_NEWPHONETIC_LAYOUT, "КитайÑка (традиционна)- нова позвукова" + IDS_CHINESE_SIMPLIFIED_MSPINYINIME30_LAYOUT, "КитайÑка (традиционна)- Microsoft Pinyin IME 3.0" + IDS_UNITED_STATES_DVIRAK_LAYOUT, "СÐЩ- Дворак" + IDS_CHINESE_TRADITIONAL_NEWCHANGJIE_LAYOUT, "КитайÑка (традиционна) - New ChangJie" + IDS_ASSAMESE_LAYOUT, "ÐÑамÑка" + IDS_BENGALI_LAYOUT, "БенгалÑка" + IDS_DEVANAGARI_INSCRIPT_LAYOUT, "Деванагари - INSCRIPT" + IDS_GUJARATI_LAYOUT, "ГуджаратÑка" + IDS_KANNADA_LAYOUT, "КанарийÑка" + IDS_MALAYALAM_LAYOUT, "МалаÑламÑка" + IDS_ORIYA_LAYOUT, "ОрийÑка" + IDS_PUNJABI_LAYOUT, "ПанджабÑка" + IDS_TAMIL_LAYOUT, "ТамилÑка" + IDS_TELUGU_LAYOUT, "ТелугуйÑка" + IDS_MARATHI_LAYOUT, "МаратхийÑка" + IDS_HINDI_TRADITIONAL_LAYOUT, "Хинди традиционна" + IDS_CANTONESE_PHONETIC_LAYOUT, "КантонÑка позвукова" + IDS_FAEROESE_LAYOUT, "ФарьорÑка" IDS_FYRO_MACEDONIAN_LAYOUT, "FYRO Macedonian" - IDS_MALAYALAM_LAYOUT, "Ìàëàÿëàìñêà" - IDS_MARATHI_LAYOUT, "Ìðàòõèéñêà" - IDS_MONGOLIAN_CYRILLIC_LAYOUT, "Ìîíãîëñêà" - IDS_NORWEGIAN_LAYOUT, "Íîðâåæêà" - IDS_ORIYA_LAYOUT, "Îðèéñêà" - IDS_POLISH_214_LAYOUT, "Ïîëñêà (214)" - IDS_POLISH_LAYOUT, "Ïîëñêà çà ïðîãðàìèñòè" - IDS_PORTUGUESE_LAYOUT, "Ïîðòóãàëñêà" - IDS_PORTUGUESE_BRAZILIAN_ABNT_LAYOUT, "Ïîðòóãàëñêà (Áðàçèëñêà ABNT)" - IDS_PORTUGUESE_BRAZIL_ABNT2_LAYOUT, "Ïîðòóãàëñêà (áðàçèëñêà ABNT2)" - IDS_PUNJABI_LAYOUT, "Ïàíäæàáñêà" - IDS_ROMANIAN_LAYOUT, "Ðóìúíñêà" - IDS_RUSSIAN_LAYOUT, "Ðóñêà" - IDS_RUSSIAN_TYPEWRITER_LAYOUT, "Ðóñêà (ìàøèíîïèñíà)" - IDS_SERBIAN_CYRILLIC_LAYOUT, "Ñðúáñêà (êèðèëèöà)" - IDS_SERBIAN_LATIN_LAYOUT, "Ñðúáñêà (ëàòèíèöà)" - IDS_SLOVAK_LAYOUT, "Ñëîâàøêà" - IDS_SLOVAK_QWERTY_LAYOUT, "Ñëîâàøêà (QWERTY)" - IDS_SLOVENIAN_LAYOUT, "Ñëîâåíñêà" - IDS_SPANISH_LAYOUT, "Èñïàíñêà" - IDS_SPANISH_VARIANTION_LAYOUT, "Èñïàíñêà ðàçíîâèäíîñò" - IDS_SWEDISH_LAYOUT, "Øâåäñêà" - IDS_SWISS_FRENCH_LAYOUT, "Øâåéöàðñêà çà ôðåíñêè" - IDS_SWISS_GERMAN_LAYOUT, "Øâåéöàðñêà çà íåìñêè" - IDS_SYRIAC_LAYOUT, "Ñèðèéñêà" - IDS_SYRIAC_PHONETIC_LAYOUT, "Ñèðèéñêà çâóêîâà" - IDS_TAMIL_LAYOUT, "Òàìèëñêà" - IDS_TATAR_LAYOUT, "Òàòàðñêà" - IDS_TELUGU_LAYOUT, "Òåëóãóéñêà" - IDS_THAI_KEDMANEE_LAYOUT, "Òàéñêà Kedmanee" - IDS_THAI_KEDMANEE_NONSHIFTLOCK_LAYOUT, "Òàéñêà Kedmanee (non-ShiftLock)" - IDS_THAI_PATTACHOTE_LAYOUT, "Òàéñêà Pattachote" - IDS_THAI_PATTACHOTE_NONSHIFTLOCK_LAYOUT, "Òàéñêà Pattachote (non-ShiftLock)" - IDS_TURKISH_F_LAYOUT, "Òóðñêà F" - IDS_TURKISH_Q_LAYOUT, "Òóðñêà Q" - IDS_UKRAINIAN_LAYOUT, "Óêðàèíñêà" - IDS_UKRAINIAN_STUDENT_LAYOUT, "Óêðàèíñêà (Student)" - IDS_UNITED_KINGDOM_LAYOUT, "Àíãëèéñêà" - IDS_UNITED_STATES_DVIRAK_LAYOUT, "ÑÀÙ- Äâîðàê" - IDS_UNITED_STATES_DVORAK_FOR_LEFT_HAND_LAYOUT, "ÑÀÙ- Äâîðàê çà ëÿâà ðúêà" - IDS_UNITED_STATES_DVORAK_FOR_RIGHT_HAND_LAYOUT, "ÑÀÙ- Äâîðàê çà äÿñíà ðúêà" - IDS_UNITED_STATES_INTERNATIONAL_LAYOUT, "ÑÀÙ- ìåæäóíàðîäíà" - IDS_URDU_LAYOUT, "Óðäó" - IDS_US_LAYOUT, "ÑÀÙ" - IDS_USENG_TABLE_IBM_ARABIC238L_LAYOUT, "Òàáëèöà çà ÑÀÙ àíãëèéñêè çà IBM àðàáñêà 238_L" - IDS_UZBEK_CYRILLIC_LAYOUT, "Óçáåêñêà êèðèëèöà" - IDS_VIETNAMESE_LAYOUT, "Âèåòíàìñêà" + IDS_CANADIAN_MULTILINGUAL_STD_LAYOUT, "КанадÑка многоезична Ñтандартна" + IDS_CHINESE_TRADITIONAL_QUICK_LAYOUT, "КитайÑка (традиционна) - бърза" + IDS_CHINESE_TRADITIONAL_ARRAY_LAYOUT, "КитайÑка (традиционна) - украÑена" + IDS_KAZAKH_LAYOUT, "КазахÑка" + IDS_UZBEK_CYRILLIC_LAYOUT, "УзбекÑка кирилица" + IDS_AZERI_CYRILLIC_LAYOUT, "ÐзърÑка кирилица" + IDS_TATAR_LAYOUT, "ТатарÑка" + IDS_AZERI_LATIN_LAYOUT, "ÐзърÑка латиница" + IDS_VIETNAMESE_LAYOUT, "ВиетнамÑка" + IDS_GEORGIAN_LAYOUT, "ГрузинÑка" + IDS_ARMENIAN_EASTERN_LAYOUT, "ÐрменÑка източна" + IDS_ARMENIAN_WESTERN_LAYOUT, "ÐрменÑка западна" + IDS_GREEK_POLYTONIC_LAYOUT, "Гръцка многотонова" + IDS_USENG_TABLE_IBM_ARABIC238L_LAYOUT, "Таблица за СÐЩ английÑки за IBM арабÑка 238_L" + IDS_FARSI_LAYOUT, "ФарÑи" + IDS_GAELIC_LAYOUT, "ИрландÑка" + IDS_PORTUGUESE_BRAZIL_ABNT2_LAYOUT, "ПортугалÑка (бразилÑка ABNT2)" + IDS_MONGOLIAN_CYRILLIC_LAYOUT, "МонголÑка" + IDS_KYRGYZ_CYRILLIC_LAYOUT, "Кирзгизка кирилица" + IDS_URDU_LAYOUT, "Урду" + IDS_SYRIAC_LAYOUT, "СирийÑка" + IDS_SYRIAC_PHONETIC_LAYOUT, "СирийÑка звукова" + IDS_DIVEHI_PHONETIC_LAYOUT, "ДхивехÑка звукова" + IDS_DIVEHI_TYPEWRITER_LAYOUT, "ДхивехÑка малтийÑка" + IDS_BULGARIAN_PHONETIC_CLASSIC_LAYOUT, "БългарÑка ЯВЕРТЪ" + IDS_BULGARIAN_PHONETIC_BDS_LAYOUT, "БългарÑка ЧШЕРТЪ" + IDS_BULGARIAN_BDS_LAYOUT, "БългарÑка 5237-1978" + IDS_GERMAN_RISTOME_LAYOUT, "ÐемÑка (RISTOME)" + IDS_GERMAN_NEO_11_LAYOUT, "ÐемÑка (NEO-1.1)" + IDS_GERMAN_DE_ERGO_LAYOUT, "ÐемÑка (de_ergo)" + IDS_BURMESE_LAYOUT, "БирманÑка" + IDS_UKRAINIAN_STUDENT_LAYOUT, "УкраинÑка (Student)" END diff --git a/reactos/dll/cpl/input/rsrc.rc b/reactos/dll/cpl/input/rsrc.rc index 3c2eb0e4311..f6b1cebd3f4 100644 --- a/reactos/dll/cpl/input/rsrc.rc +++ b/reactos/dll/cpl/input/rsrc.rc @@ -1,7 +1,6 @@ #include #include "resource.h" -#include "lang/bg-BG.rc" #include "lang/cs-CZ.rc" #include "lang/de-DE.rc" #include "lang/el-GR.rc" @@ -15,6 +14,7 @@ // UTF-8 #pragma code_page(65001) +#include "lang/bg-BG.rc" #include "lang/pl-PL.rc" #include "lang/ro-RO.rc" #include "lang/ru-RU.rc" diff --git a/reactos/dll/cpl/intl/lang/bg-BG.rc b/reactos/dll/cpl/intl/lang/bg-BG.rc index 17adc11693a..4f1c1a61c36 100644 --- a/reactos/dll/cpl/intl/lang/bg-BG.rc +++ b/reactos/dll/cpl/intl/lang/bg-BG.rc @@ -79,7 +79,7 @@ BEGIN COMBOBOX IDC_NUMBERSNNUMFORMAT, 142,145, 100, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL LTEXT "Âîäåùè &íóëè:", -1, 8, 166, 96, 10, WS_CHILD | WS_VISIBLE | WS_GROUP COMBOBOX IDC_NUMBERSDISPLEADZER, 142, 161, 100, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL - LTEXT "&Ñïèñúêîâ ðàçäåëèòå:", -1, 8, 181, 96, 10, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "&Ñïèñúêîâ ðàçäåëèòåë:", -1, 8, 181, 96, 10, WS_CHILD |WS_VISIBLE | WS_GROUP COMBOBOX IDC_NUMBERSLSEP, 142,177, 100, 83, CBS_DROPDOWN | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL LTEXT "&Ìåðíà óðåäáà:", -1, 8, 197, 96, 10, WS_CHILD | WS_VISIBLE | WS_GROUP COMBOBOX IDC_NUMBERSMEASSYS, 142, 193, 100, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL diff --git a/reactos/dll/cpl/sysdm/lang/bg-BG.rc b/reactos/dll/cpl/sysdm/lang/bg-BG.rc index 9e018ee9b00..a41cb5d5c5d 100644 --- a/reactos/dll/cpl/sysdm/lang/bg-BG.rc +++ b/reactos/dll/cpl/sysdm/lang/bg-BG.rc @@ -1,5 +1,7 @@ -// Location: dll/cpl/sysdm/lang/bg-BG.rc -// Ðедовършен +/* Превод на българÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* Location: \dll\cpl\sysdm\lang */ + LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT IDD_PROPPAGEGENERAL DIALOGEX 0, 0, 256, 218 @@ -72,12 +74,12 @@ END IDD_SYSSETTINGS DIALOGEX 0, 0, 221, 106 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION -CAPTION "System Settings" +CAPTION "ÐаÑтройки на уредбата" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN - GROUPBOX "Version Info",IDC_STATIC,6,3,210,73 - CONTROL "Report as Workstation",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10 - LTEXT "ReactOS is built as a server OS and reports as such. Check this box to change this for applications only.",IDC_STATIC,15,15,183,41 + GROUPBOX "Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð·Ð° верÑиÑта",IDC_STATIC,6,3,210,73 + CONTROL "Докладване като работна уÑтановка",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10 + LTEXT "РеактОС е Ñглобен като Ñървърна РУ и Ñе докладва като такава. Отметнете това поле, за да го промените Ñамо за това приложение.",IDC_STATIC,15,15,183,41 PUSHBUTTON "Добре",IDOK,166,83,50,14 END @@ -302,10 +304,10 @@ BEGIN IDS_USERPROFILE_TYPE "Вид" IDS_USERPROFILE_STATUS "СъÑтоÑние" IDS_USERPROFILE_MODIFIED "Изменен" - IDS_MESSAGEBOXTITLE "System control panel applet" - IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file." - IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file." - IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive." - IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive." + IDS_MESSAGEBOXTITLE "Приложение за таблото за управление на уредбата" + IDS_WARNINITIALSIZE "Въведете чиÑлена ÑтойноÑÑ‚ за Ð½Ð°Ñ‡Ð°Ð»Ð½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€ на ÑÑ‚Ñ€Ð°Ð½Ð¸Ñ€Ð°Ñ‰Ð¸Ñ Ñ„Ð°Ð¹Ð»." + IDS_WARNMAXIMUMSIZE "Въведете чиÑлена ÑтойноÑÑ‚ за Ð²ÑŠÑ€Ñ…Ð¾Ð²Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€ на ÑÑ‚Ñ€Ð°Ð½Ð¸Ñ€Ð°Ñ‰Ð¸Ñ Ñ„Ð°Ð¹Ð»." + IDS_WARNINITIALRANGE "ÐачалниÑÑ‚ размер на ÑÑ‚Ñ€Ð°Ð½Ð¸Ñ€Ð°Ñ‰Ð¸Ñ Ñ„Ð°Ð¹Ð» не трÑбва да е по-малък от 2 МБ и не трÑбва да Ð½Ð°Ð´Ñ…Ð²ÑŠÑ€Ð»Ñ Ñвободното проÑтранÑтво на избраното уÑтройÑтво." + IDS_WARNMAXIMUMRANGE "ВърховиÑÑ‚ размер на ÑÑ‚Ñ€Ð°Ð½Ð¸Ñ€Ð°Ñ‰Ð¸Ñ Ñ„Ð°Ð¹Ð» не трÑбва да е по-малък от Ð½Ð°Ñ‡Ð°Ð»Ð½Ð¸Ñ Ð¸ не трÑбва да надвишава Ñвободното проÑтранÑтво на избраното уÑтройÑтво" IDS_DEVS "\nReactOS Team\n\nProject Coordinator\n\nAleksey Bragin\n\nDevelopment Team\n\nAleksey Bragin\nAndrew Greenwood\nAndrey Korotaev\nArt Yerkes\nChristoph von Wittich\nColin Finck\nDaniel Reimer\nDmitry Chapyshev\nEric Kohl\nGed Murphy\nGregor Brunmar\nHervé Poussineau\nJames Tabor\nJeffrey Morlan\nJohannes Anderwald\nKJK::Hyperion\nMaarten Bosma\nMagnus Olsen\nMarc Piulachs\nMatthias Kupfer\nMike Nordell\nPeter Ward\nPierre Schweitzer\nSaveliy Tretiakov\nStefan Ginsberg\nSylvain Petreolle\nThomas Blümel\nTimo Kreuzer \n\nAlex Ionescu\nFilip Navara\nGunnar Dalsnes\nMartin Fuchs\nRoyce Mitchell III\nBrandon Turner\nBrian Palmer\nCasper Hornstrup\nDavid Welch\nEmanuele Aliberti\nGé van Geldorp\nGregor Anich\nJason Filby\nJens Collin\nMichael Wirth\nNathan Woods\nRobert Dickenson\nRex Jolliff\nVizzini \n\nRelease Engineers\n\nColin Finck\nZ98\n\nWebsite Team\n\nColin Finck\nJaix Bly\nKlemens Friedl\nZ98\n\nMedia Team\n\nMindflyer\nWierd_W\n\nfurther thanks go to\n\nall Contributers\nWine Team\n\n" END diff --git a/reactos/dll/cpl/sysdm/lang/pl-PL.rc b/reactos/dll/cpl/sysdm/lang/pl-PL.rc index 3c076d57812..4dd6f1d1036 100644 --- a/reactos/dll/cpl/sysdm/lang/pl-PL.rc +++ b/reactos/dll/cpl/sysdm/lang/pl-PL.rc @@ -71,7 +71,7 @@ BEGIN LTEXT "Informacje o uruchamianiu systemu, awariach systemu i debugowaniu.", IDC_STATIC, 16, 144, 210, 19 PUSHBUTTON "Us&tawienia", IDC_STAREC, 194, 162, 50, 14 - PUSHBUTTON "System Settings", IDC_SYSSETTINGS, 2, 192, 80, 15//FIXME + PUSHBUTTON "Ustawienia systemowe", IDC_SYSSETTINGS, 2, 192, 80, 15//FIXME PUSHBUTTON "Z&mienne Åšrodowiskowe", IDC_ENVVAR, 84, 192, 80, 14 PUSHBUTTON "&Raportowanie błędów", IDC_ERRORREPORT, 170, 192, 80, 14 END @@ -314,5 +314,5 @@ BEGIN IDS_WARNMAXIMUMSIZE "Wprowadź wielkość dla maksymalnego rozmiaru pliku stronicowania." IDS_WARNINITIALRANGE "PoczÄ…tkowy rozmiar pliku stronicowania nie może być mniejszy niż 2MB i nie może przekraczać dostÄ™pnej iloÅ›ci miejsca w wybranym napÄ™dzie." IDS_WARNMAXIMUMRANGE "Maksymalny rozmiar pliku stronicowania nie może być mniejszy niż jego rozmiar poczÄ…tkowy i nie może przekraczać dostÄ™pnej iloÅ›ci miejsca w wybranym napÄ™dzie." - IDS_DEVS "\nReactOS Team\n\nProject Coordinator\n\nAleksey Bragin\n\nDevelopment Team\n\nAleksey Bragin\nAndrew Greenwood\nAndrey Korotaev\nArt Yerkes\nChristoph von Wittich\nColin Finck\nDaniel Reimer\nDmitry Chapyshev\nEric Kohl\nGed Murphy\nGregor Brunmar\nHervé Poussineau\nJames Tabor\nJeffrey Morlan\nJohannes Anderwald\nKJK::Hyperion\nMaarten Bosma\nMagnus Olsen\nMarc Piulachs\nMatthias Kupfer\nMike Nordell\nPeter Ward\nPierre Schweitzer\nSaveliy Tretiakov\nStefan Ginsberg\nSylvain Petreolle\nThomas Blümel\nTimo Kreuzer \n\nAlex Ionescu\nFilip Navara\nGunnar Dalsnes\nMartin Fuchs\nRoyce Mitchell III\nBrandon Turner\nBrian Palmer\nCasper Hornstrup\nDavid Welch\nEmanuele Aliberti\nGé van Geldorp\nGregor Anich\nJason Filby\nJens Collin\nMichael Wirth\nNathan Woods\nRobert Dickenson\nRex Jolliff\nVizzini \n\nRelease Engineers\n\nColin Finck\nZ98\n\nWebsite Team\n\nColin Finck\nJaix Bly\nKlemens Friedl\nZ98\n\nMedia Team\n\nMindflyer\nWierd_W\n\nfurther thanks go to\n\nall Contributers\nWine Team\n\n"//FIXME + IDS_DEVS "\nEkipa ReactOS\n\nKoordynator Projektu\n\nAleksey Bragin\n\nEkipa Programistów\n\nAleksey Bragin\nAndrew Greenwood\nAndrey Korotaev\nArt Yerkes\nChristoph von Wittich\nColin Finck\nDaniel Reimer\nDmitry Chapyshev\nEric Kohl\nGed Murphy\nGregor Brunmar\nHervé Poussineau\nJames Tabor\nJeffrey Morlan\nJohannes Anderwald\nKJK::Hyperion\nMaarten Bosma\nMagnus Olsen\nMarc Piulachs\nMatthias Kupfer\nMike Nordell\nPeter Ward\nPierre Schweitzer\nSaveliy Tretiakov\nStefan Ginsberg\nSylvain Petreolle\nThomas Blümel\nTimo Kreuzer \n\nAlex Ionescu\nFilip Navara\nGunnar Dalsnes\nMartin Fuchs\nRoyce Mitchell III\nBrandon Turner\nBrian Palmer\nCasper Hornstrup\nDavid Welch\nEmanuele Aliberti\nGé van Geldorp\nGregor Anich\nJason Filby\nJens Collin\nMichael Wirth\nNathan Woods\nRobert Dickenson\nRex Jolliff\nVizzini \n\nInżynierowie WydaÅ„\n\nColin Finck\nZ98\n\nEkipa WWW\n\nColin Finck\nJaix Bly\nKlemens Friedl\nZ98\n\nEkipa PR\n\nMindflyer\nWierd_W\n\nPodziÄ™kowania dla\n\nwszystkich współpracowników\nEkipy Wine\n\n"//FIXME END diff --git a/reactos/dll/win32/browseui/lang/bg-BG.rc b/reactos/dll/win32/browseui/lang/bg-BG.rc index 7cab11cfb5e..16831a3d4a6 100644 --- a/reactos/dll/win32/browseui/lang/bg-BG.rc +++ b/reactos/dll/win32/browseui/lang/bg-BG.rc @@ -234,13 +234,13 @@ END STRINGTABLE BEGIN IDS_NOTEXTLABELS "ЛипÑват текÑтови етикети" - IDS_SELECTIVETEXTONRIGHT "Selective text on right" + IDS_SELECTIVETEXTONRIGHT "Избирателен текÑÑ‚ отдÑÑно" END STRINGTABLE BEGIN IDS_GOBUTTONLABEL "|Отиване||" - IDS_GOBUTTONTIPTEMPLATE "Отиване в""%s""" + IDS_GOBUTTONTIPTEMPLATE "Отиване в „%s“" END STRINGTABLE diff --git a/reactos/dll/win32/kernel32/winnls/nls/bgr.nls b/reactos/dll/win32/kernel32/winnls/nls/bgr.nls index 68eee438e88..99c44fcb476 100644 --- a/reactos/dll/win32/kernel32/winnls/nls/bgr.nls +++ b/reactos/dll/win32/kernel32/winnls/nls/bgr.nls @@ -101,7 +101,7 @@ STRINGTABLE LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT LOCALE_SENGCURRNAME "Bulgarian Lev" LOCALE_SENGLANGUAGE "Bulgarian" LOCALE_SGROUPING "3;0" - LOCALE_SINTLSYMBOL "BGL" + LOCALE_SINTLSYMBOL "BGN" LOCALE_SISO3166CTRYNAME "BG" LOCALE_SISO639LANGNAME "bg" LOCALE_SLANGUAGE "Bulgarian" @@ -138,21 +138,21 @@ STRINGTABLE LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT LOCALE_STIMEFORMAT "HH:mm:ss" LOCALE_SYEARMONTH "MMMM yyyy 'ã.'" - LGRPID_WESTERN_EUROPE+LGRPID_RES_BASE "Western Europe and United States" - LGRPID_CENTRAL_EUROPE+LGRPID_RES_BASE "Central Europe" - LGRPID_BALTIC+LGRPID_RES_BASE "Baltic" - LGRPID_GREEK+LGRPID_RES_BASE "Greek" - LGRPID_CYRILLIC+LGRPID_RES_BASE "Cyrillic" - LGRPID_TURKISH+LGRPID_RES_BASE "Turkic" - LGRPID_JAPANESE+LGRPID_RES_BASE "Japanese" - LGRPID_KOREAN+LGRPID_RES_BASE "Korean" - LGRPID_TRADITIONAL_CHINESE+LGRPID_RES_BASE "Traditional Chinese" - LGRPID_SIMPLIFIED_CHINESE+LGRPID_RES_BASE "Simplified Chinese" - LGRPID_THAI+LGRPID_RES_BASE "Thai" - LGRPID_HEBREW+LGRPID_RES_BASE "Hebrew" - LGRPID_ARABIC+LGRPID_RES_BASE "Arabic" - LGRPID_VIETNAMESE+LGRPID_RES_BASE "Vietnamese" - LGRPID_INDIC+LGRPID_RES_BASE "Indic" - LGRPID_GEORGIAN+LGRPID_RES_BASE "Georgian" - LGRPID_ARMENIAN+LGRPID_RES_BASE "Armenian" + LGRPID_WESTERN_EUROPE+LGRPID_RES_BASE "Çàïàäeí" + LGRPID_CENTRAL_EUROPE+LGRPID_RES_BASE "Öåíòðàëíîåâðîïåéñêè" + LGRPID_BALTIC+LGRPID_RES_BASE "Áàëòèéñêè" + LGRPID_GREEK+LGRPID_RES_BASE "Ãðúöêè" + LGRPID_CYRILLIC+LGRPID_RES_BASE "Êèðèëñêè" + LGRPID_TURKISH+LGRPID_RES_BASE "Òóðñêè" + LGRPID_JAPANESE+LGRPID_RES_BASE "ßïîíñêè" + LGRPID_KOREAN+LGRPID_RES_BASE "Êîðåéñêè" + LGRPID_TRADITIONAL_CHINESE+LGRPID_RES_BASE "Êèòàéñêè òðàäèöèîíåí" + LGRPID_SIMPLIFIED_CHINESE+LGRPID_RES_BASE "Êèòàéñêè îïðîñòåí" + LGRPID_THAI+LGRPID_RES_BASE "Òàéñêè" + LGRPID_HEBREW+LGRPID_RES_BASE "Èâðèò" + LGRPID_ARABIC+LGRPID_RES_BASE "Àðàáñêè" + LGRPID_VIETNAMESE+LGRPID_RES_BASE "Âèåòíàìñêè" + LGRPID_INDIC+LGRPID_RES_BASE "Èíäèéñêè" + LGRPID_GEORGIAN+LGRPID_RES_BASE "Ãðóçèíñêè" + LGRPID_ARMENIAN+LGRPID_RES_BASE "Àðìåíñêè" } diff --git a/reactos/dll/win32/msports/lang/bg-BG.rc b/reactos/dll/win32/msports/lang/bg-BG.rc new file mode 100644 index 00000000000..a195b9859f7 --- /dev/null +++ b/reactos/dll/win32/msports/lang/bg-BG.rc @@ -0,0 +1,24 @@ +/* Превод на БългарÑки/ Bulgarian translation */ +/* http://www.reactos.org/wiki/Bulgarian_translation */ +/* LOCATION: \dll\win32\msports\lang */ + +LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT + +IDD_SERIALSETTINGS DIALOGEX DISCARDABLE 0, 0, 252, 218 +STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "ÐаÑтройки на излаза (порта)" +FONT 8, "MS Shell Dlg" +BEGIN + RTEXT "&РазрÑда в Ñекунда", -1, 74, 19, 62, 8, WS_GROUP + COMBOBOX IDC_SERIAL_BITSPERSECOND, 139, 17, 106, 90, WS_TABSTOP | CBS_DROPDOWNLIST + RTEXT "Байта &данни:", -1, 74, 40, 62, 8 + COMBOBOX IDC_SERIAL_DATABITS, 139, 38, 106, 54, WS_TABSTOP | CBS_DROPDOWNLIST + RTEXT "&ЧетноÑÑ‚:", -1, 74, 61, 62, 8 + COMBOBOX IDC_SERIAL_PARITY, 139, 59, 106, 62, WS_TABSTOP | CBS_DROPDOWNLIST + RTEXT "&Спиращи разрÑди:", -1, 74, 82, 62, 8 + COMBOBOX IDC_SERIAL_STOPBITS, 139, 80, 106, 54, WS_TABSTOP | CBS_DROPDOWNLIST + RTEXT "Управление на &потока:", - 1, 74, 102, 62, 8 + COMBOBOX IDC_SERIAL_FLOWCONTROL, 139, 100, 106, 54, WS_TABSTOP | CBS_DROPDOWNLIST + PUSHBUTTON "Раз&ширени...",IDC_SERIAL_ADVANCED, 111, 130, 65, 14,WS_GROUP + PUSHBUTTON "&Връщане на под&разбираните",IDC_SERIAL_RESTORE, 180, 130, 65, 14, WS_GROUP +END diff --git a/reactos/dll/win32/msports/msports.rc b/reactos/dll/win32/msports/msports.rc index dd7c3f81ec2..bd87866b2ce 100644 --- a/reactos/dll/win32/msports/msports.rc +++ b/reactos/dll/win32/msports/msports.rc @@ -8,10 +8,11 @@ #include #include "lang/de-DE.rc" -#include "lang/en-US.rc" // UTF-8 #pragma code_page(65001) +#include "lang/bg-BG.rc" +#include "lang/en-US.rc" #include "lang/pl-PL.rc" #include "lang/ro-RO.rc" #include "lang/uk-UA.rc" diff --git a/reactos/dll/win32/syssetup/lang/bg-BG.rc b/reactos/dll/win32/syssetup/lang/bg-BG.rc index 06e1ebe4c99..185b1ce99f9 100644 --- a/reactos/dll/win32/syssetup/lang/bg-BG.rc +++ b/reactos/dll/win32/syssetup/lang/bg-BG.rc @@ -279,7 +279,7 @@ BEGIN IDS_SHORT_SNDREC32 "Çâóêîçàïèñâà÷.lnk" IDS_SHORT_DXDIAG "Ïðåãëåæäàíå íà ÐåàêòÕ.lnk" IDS_SHORT_PAINT "Ðèñóíúê.lnk" - IDS_SHORT_SPIDER "Ïàñèàíñ „Ïàÿê“.lnk" + IDS_SHORT_SPIDER "Ïàñèàíñ „Ïàÿê“.lnk" END @@ -289,7 +289,7 @@ BEGIN IDS_WZD_SETCOMPUTERNAME "Íàñòðîéêàòà íå óñïÿ äà çàäàäå èìå íà êîìïþòúðà." IDS_WZD_COMPUTERNAME "Íàñòðîéêàòà íå ìîæå äà ïðîäúëæè, äîêàòî íå âúâåäåòå èìåòî íà êîìïþòúðà." IDS_WZD_PASSWORDEMPTY "Òðÿáâà äà âúâåäåòå ïàðîëà!" - IDS_WZD_PASSWORDMATCH "Ïàðîëèòå, êîèòî ñòå âúâåëè íà ñúâïàäàò. Âúâåäåòå ãè îòíîâî." + IDS_WZD_PASSWORDMATCH "Ïàðîëèòå, êîèòî ñòå âúâåëè íå ñúâïàäàò. Âúâåäåòå ãè îòíîâî." IDS_WZD_PASSWORDCHAR "Ïàðîëàòà, êîÿòî ñòå âúâåëè ñúäúðæà çàáðàíåíè çíàöè. Âúâåäåòå èç÷èñòåíà ïàðîëà." IDS_WZD_LOCALTIME "Âúëøåáíèêúò íå óñïÿ äà çàäàäå ìåñòíîòî âðåìå." END From 8562446b0d397e2aa72ab6ce4443f3a0f879e4db Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 5 Feb 2012 13:43:04 +0000 Subject: [PATCH 215/289] - Add CMakeLists for wallpaper svn path=/trunk/; revision=55425 --- wallpaper/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 wallpaper/CMakeLists.txt diff --git a/wallpaper/CMakeLists.txt b/wallpaper/CMakeLists.txt new file mode 100644 index 00000000000..4f29a0c4331 --- /dev/null +++ b/wallpaper/CMakeLists.txt @@ -0,0 +1,2 @@ + +add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/Angelus_02_ROSWP.bmp DESTINATION reactos FOR all) From 0bb1f439a4d8bd48e09f20e1bb57c9ecf8ad48e0 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Sun, 5 Feb 2012 13:44:16 +0000 Subject: [PATCH 216/289] [CMAKE] - Add wallpaper optional module to CMake build svn path=/trunk/; revision=55426 --- reactos/modules/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/modules/CMakeLists.txt b/reactos/modules/CMakeLists.txt index f258bd6003f..22e0cfc6886 100644 --- a/reactos/modules/CMakeLists.txt +++ b/reactos/modules/CMakeLists.txt @@ -6,3 +6,7 @@ endif() if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/rosapps/) add_subdirectory(rosapps) endif() + +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/wallpaper/) +add_subdirectory(wallpaper) +endif() From 0c13e015cfc59d5e9cdd024bd5e89c79e4f3d3cf Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 5 Feb 2012 15:47:41 +0000 Subject: [PATCH 217/289] [CRT] - Fix multiple free in msvcrt_free_io. Fixes VLC Player crash on exit. Wine already has it right. svn path=/trunk/; revision=55430 --- reactos/lib/sdk/crt/stdio/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/sdk/crt/stdio/file.c b/reactos/lib/sdk/crt/stdio/file.c index 9c5a49df5f9..e3e4e2cd4de 100644 --- a/reactos/lib/sdk/crt/stdio/file.c +++ b/reactos/lib/sdk/crt/stdio/file.c @@ -966,7 +966,7 @@ void msvcrt_free_io(void) free(__pioinfo[i]); for(i=0; iSpare[0] = 0; DeleteCriticalSection(&file_cs); From 75a453ceba90f6af82b8d1b199812808e5efc356 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 5 Feb 2012 16:42:22 +0000 Subject: [PATCH 218/289] [NTOSKRNL/NEWCC] Fix MSVC build and warnings svn path=/trunk/; revision=55431 --- reactos/ntoskrnl/cache/cachesub.c | 18 ++++++++++-------- reactos/ntoskrnl/cache/fssup.c | 4 +++- reactos/ntoskrnl/cache/pinsup.c | 5 ++--- reactos/ntoskrnl/cache/section/fault.c | 7 ++++--- reactos/ntoskrnl/cache/section/newmm.h | 2 +- reactos/ntoskrnl/cache/section/sptab.c | 2 +- reactos/ntoskrnl/cache/section/swapout.c | 3 ++- reactos/ntoskrnl/mm/section.c | 5 +++-- 8 files changed, 26 insertions(+), 20 deletions(-) diff --git a/reactos/ntoskrnl/cache/cachesub.c b/reactos/ntoskrnl/cache/cachesub.c index 6f816cba0dd..b59af8f1f47 100644 --- a/reactos/ntoskrnl/cache/cachesub.c +++ b/reactos/ntoskrnl/cache/cachesub.c @@ -143,7 +143,7 @@ _CcpFlushCache(IN PNOCC_CACHE_MAP Map, PNOCC_BCB Bcb = NULL; LARGE_INTEGER LowerBound, UpperBound; PLIST_ENTRY ListEntry; - IO_STATUS_BLOCK IOSB = { }; + IO_STATUS_BLOCK IOSB = {0}; DPRINT1("CcFlushCache (while file) (%s:%d)\n", File, Line); @@ -164,7 +164,7 @@ _CcpFlushCache(IN PNOCC_CACHE_MAP Map, while (ListEntry != &Map->AssociatedBcb) { Bcb = CONTAINING_RECORD(ListEntry, NOCC_BCB, ThisFileList); - CcpReferenceCache(Bcb - CcCacheSections); + CcpReferenceCache((ULONG)(Bcb - CcCacheSections)); if (Bcb->FileOffset.QuadPart + Bcb->Length >= LowerBound.QuadPart && Bcb->FileOffset.QuadPart < UpperBound.QuadPart) @@ -186,7 +186,7 @@ _CcpFlushCache(IN PNOCC_CACHE_MAP Map, if (Delete && Bcb->RefCount < 2) { Bcb->RefCount = 1; - CcpDereferenceCache(Bcb - CcCacheSections, FALSE); + CcpDereferenceCache((ULONG)(Bcb - CcCacheSections), FALSE); } else CcpUnpinData(Bcb, TRUE); @@ -276,9 +276,10 @@ PVOID NTAPI CcRemapBcb(IN PVOID Bcb) { + ULONG Number = (ULONG)(((PNOCC_BCB)Bcb) - CcCacheSections); CcpLock(); - ASSERT(RtlTestBit(CcCacheBitmap, ((PNOCC_BCB)Bcb) - CcCacheSections)); - CcpReferenceCache(((PNOCC_BCB)Bcb) - CcCacheSections); + ASSERT(RtlTestBit(CcCacheBitmap, Number)); + CcpReferenceCache(Number); CcpUnlock(); return Bcb; } @@ -315,10 +316,11 @@ VOID NTAPI CcRepinBcb(IN PVOID Bcb) { + ULONG Number = (ULONG)(((PNOCC_BCB)Bcb) - CcCacheSections); CcpLock(); - ASSERT(RtlTestBit(CcCacheBitmap, ((PNOCC_BCB)Bcb) - CcCacheSections)); - DPRINT("CcRepinBcb(#%x)\n", ((PNOCC_BCB)Bcb) - CcCacheSections); - CcpReferenceCache(((PNOCC_BCB)Bcb) - CcCacheSections); + ASSERT(RtlTestBit(CcCacheBitmap, Number)); + DPRINT("CcRepinBcb(#%x)\n", Number); + CcpReferenceCache(Number); CcpUnlock(); } diff --git a/reactos/ntoskrnl/cache/fssup.c b/reactos/ntoskrnl/cache/fssup.c index 4af45ec85f1..a501c6e6fc5 100644 --- a/reactos/ntoskrnl/cache/fssup.c +++ b/reactos/ntoskrnl/cache/fssup.c @@ -297,9 +297,11 @@ CcSetFileSizes(IN PFILE_OBJECT FileObject, IN PCC_FILE_SIZES FileSizes) { PNOCC_CACHE_MAP Map = (PNOCC_CACHE_MAP)FileObject->SectionObjectPointer->SharedCacheMap; + PNOCC_BCB Bcb; + if (!Map) return; Map->FileSizes = *FileSizes; - PNOCC_BCB Bcb = Map->AssociatedBcb.Flink == &Map->AssociatedBcb ? + Bcb = Map->AssociatedBcb.Flink == &Map->AssociatedBcb ? NULL : CONTAINING_RECORD(Map->AssociatedBcb.Flink, NOCC_BCB, ThisFileList); if (!Bcb) return; MmExtendCacheSection(Bcb->SectionObject, &FileSizes->FileSize, FALSE); diff --git a/reactos/ntoskrnl/cache/pinsup.c b/reactos/ntoskrnl/cache/pinsup.c index c2a46398306..46605a7fade 100644 --- a/reactos/ntoskrnl/cache/pinsup.c +++ b/reactos/ntoskrnl/cache/pinsup.c @@ -318,6 +318,8 @@ CcpMapData PMM_CACHE_SECTION_SEGMENT SectionObject = NULL; NTSTATUS Status; PNOCC_CACHE_MAP Map = (PNOCC_CACHE_MAP)FileObject->SectionObjectPointer->SharedCacheMap; + ULONG SectionSize; + ULONG ViewSize = CACHE_STRIPE; if (!Map) { @@ -358,8 +360,6 @@ CcpMapData goto cleanup; } - ULONG SectionSize; - DPRINT("File size %08x%08x\n", Map->FileSizes.ValidDataLength.HighPart, Map->FileSizes.ValidDataLength.LowPart); if (Map->FileSizes.ValidDataLength.QuadPart) @@ -424,7 +424,6 @@ retry: } DPRINT("Selected BCB #%x\n", BcbHead); - ULONG ViewSize = CACHE_STRIPE; Bcb = &CcCacheSections[BcbHead]; Status = MmMapCacheViewInSystemSpaceAtOffset diff --git a/reactos/ntoskrnl/cache/section/fault.c b/reactos/ntoskrnl/cache/section/fault.c index 204c264b579..b655f0745df 100644 --- a/reactos/ntoskrnl/cache/section/fault.c +++ b/reactos/ntoskrnl/cache/section/fault.c @@ -266,12 +266,13 @@ MiCowCacheSectionPage Region->Protect == PAGE_EXECUTE_READWRITE) #endif { + ULONG Entry; DPRINTC("setting non-cow page %x %x:%x offset %x (%x) to writable\n", Segment, Process, PAddress, Offset.u.LowPart, MmGetPfnForProcess(Process, Address)); if (Segment->FileObject) { DPRINTC("file %wZ\n", &Segment->FileObject->FileName); } - ULONG Entry = MiGetPageEntryCacheSectionSegment(Segment, &Offset); + Entry = MiGetPageEntryCacheSectionSegment(Segment, &Offset); DPRINT("Entry %x\n", Entry); if (Entry && !IS_SWAP_FROM_SSE(Entry) && @@ -478,7 +479,7 @@ MmpSectionAccessFaultInner { if (Thread->ActiveFaultCount > 0) { - WORK_QUEUE_WITH_CONTEXT Context = { }; + WORK_QUEUE_WITH_CONTEXT Context = {0}; DPRINT("Already fault handling ... going to work item (%x)\n", Address); Context.AddressSpace = AddressSpace; Context.MemoryArea = MemoryArea; @@ -659,7 +660,7 @@ MmNotPresentFaultCacheSectionInner { if (Thread->ActiveFaultCount > 1) { - WORK_QUEUE_WITH_CONTEXT Context = { }; + WORK_QUEUE_WITH_CONTEXT Context = {0}; DPRINTC("Already fault handling ... going to work item (%x)\n", Address); Context.AddressSpace = AddressSpace; Context.MemoryArea = MemoryArea; diff --git a/reactos/ntoskrnl/cache/section/newmm.h b/reactos/ntoskrnl/cache/section/newmm.h index e11db95cf7d..f4671e324f0 100644 --- a/reactos/ntoskrnl/cache/section/newmm.h +++ b/reactos/ntoskrnl/cache/section/newmm.h @@ -19,7 +19,7 @@ #define MEMORY_AREA_CACHE (2) #define MM_SEGMENT_FINALIZE (0x40000000) -#define RMAP_SEGMENT_MASK ~0xff +#define RMAP_SEGMENT_MASK ~((ULONG_PTR)0xff) #define RMAP_IS_SEGMENT(x) (((ULONG_PTR)(x) & RMAP_SEGMENT_MASK) == RMAP_SEGMENT_MASK) #define MIN(x,y) (((x)<(y))?(x):(y)) diff --git a/reactos/ntoskrnl/cache/section/sptab.c b/reactos/ntoskrnl/cache/section/sptab.c index 0b71764b865..45098290360 100644 --- a/reactos/ntoskrnl/cache/section/sptab.c +++ b/reactos/ntoskrnl/cache/section/sptab.c @@ -107,7 +107,7 @@ MiSectionPageTableGetOrAllocate MiSectionPageTableGet(Table, FileOffset); if (!PageTableSlice) { - CACHE_SECTION_PAGE_TABLE SectionZeroPageTable = { }; + CACHE_SECTION_PAGE_TABLE SectionZeroPageTable = {0}; SearchFileOffset.QuadPart = ROUND_DOWN(FileOffset->QuadPart, ENTRIES_PER_ELEMENT * PAGE_SIZE); SectionZeroPageTable.FileOffset = SearchFileOffset; SectionZeroPageTable.Refcount = 1; diff --git a/reactos/ntoskrnl/cache/section/swapout.c b/reactos/ntoskrnl/cache/section/swapout.c index 691635dc58d..1e1cc9188e1 100644 --- a/reactos/ntoskrnl/cache/section/swapout.c +++ b/reactos/ntoskrnl/cache/section/swapout.c @@ -422,6 +422,8 @@ bail: if (Segment) { + ULONG RefCount; + DPRINTC("About to finalize section page %x (%x:%x) Status %x %s\n", Page, Segment, FileOffset.LowPart, Status, Dirty ? "dirty" : "clean"); if (!NT_SUCCESS(Status) || @@ -438,7 +440,6 @@ bail: } // Alas, we had the last reference - ULONG RefCount; if ((RefCount = InterlockedDecrementUL(&Segment->ReferenceCount)) == 0) MmFinalizeSegment(Segment); } diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index bde920327c8..00556d82fe9 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -1290,7 +1290,8 @@ MiReadPage(PMEMORY_AREA MemoryArea, * Page - Variable that receives a page contains the read data. */ { - MM_REQUIRED_RESOURCES Resources = { }; + MM_REQUIRED_RESOURCES Resources = {0}; + NTSTATUS Status; Resources.Context = MemoryArea->Data.SectionData.Section->FileObject; Resources.FileOffset.QuadPart = SegOffset + @@ -1300,7 +1301,7 @@ MiReadPage(PMEMORY_AREA MemoryArea, DPRINT1("%S, offset %x, len %d, page %x\n", ((PFILE_OBJECT)Resources.Context)->FileName.Buffer, Resources.FileOffset.LowPart, Resources.Amount, Resources.Page[0]); - NTSTATUS Status = MiReadFilePage(NULL, NULL, &Resources); + Status = MiReadFilePage(NULL, NULL, &Resources); *Page = Resources.Page[0]; return Status; } From 66ef59c6379cc1ddf4f5b5a2a839f9f151ef6f6a Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 5 Feb 2012 17:19:07 +0000 Subject: [PATCH 219/289] [PORTCLS] * Silence some debug info. svn path=/trunk/; revision=55432 --- reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp b/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp index 9e3250c4812..58089c245a4 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp @@ -6,7 +6,6 @@ * PROGRAMMER: Johannes Anderwald */ -#define YDEBUG #include "private.hpp" NTSTATUS @@ -762,7 +761,7 @@ PcCreateSubdeviceDescriptor( RtlCopyMemory(Descriptor->Interfaces, InterfaceGuids, sizeof(GUID) * InterfaceCount); Descriptor->InterfaceCount = InterfaceCount; - DumpFilterDescriptor(FilterDescription); + //DumpFilterDescriptor(FilterDescription); // are any property sets supported by the portcls if (FilterPropertiesCount) From 53b6f45505b0354af1e32b6d412b92c2f2d4c1f6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 5 Feb 2012 17:19:58 +0000 Subject: [PATCH 220/289] [NTOSKRNL] Handle _MI_PAGING_LEVELS >= 3 in MiBuildPagedPool and MmArmAccessFault svn path=/trunk/; revision=55433 --- reactos/ntoskrnl/mm/ARM3/mminit.c | 47 ++++++++++++++++-------- reactos/ntoskrnl/mm/ARM3/pagfault.c | 57 ++++++++++++++++------------- 2 files changed, 64 insertions(+), 40 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 524f20e822f..4ecb18f5cc7 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -1605,7 +1605,10 @@ MiBuildPagedPool(VOID) KIRQL OldIrql; SIZE_T Size; ULONG BitMapSize; -#if (_MI_PAGING_LEVELS == 2) +#if (_MI_PAGING_LEVELS >= 3) + MMPPE TempPpe = ValidKernelPpe; + PMMPPE PointerPpe; +#elif (_MI_PAGING_LEVELS == 2) MMPTE TempPte = ValidKernelPte; // @@ -1681,18 +1684,33 @@ MiBuildPagedPool(VOID) MmPagedPoolEnd = (PVOID)(((ULONG_PTR)MmPagedPoolStart + MmSizeOfPagedPoolInBytes) - 1); + // + // Lock the PFN database + // + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + +#if (_MI_PAGING_LEVELS >= 3) + /* On these systems, there's no double-mapping, so instead, the PPEs + * are setup to span the entire paged pool area, so there's no need for the + * system PD */ + for (PointerPpe = MiAddressToPpe(MmPagedPoolStart); + PointerPpe <= MiAddressToPpe(MmPagedPoolEnd); + PointerPpe++) + { + /* Check if the PPE is already valid */ + if (!PointerPpe->u.Hard.Valid) + { + /* It is not, so map a fresh zeroed page */ + TempPpe.u.Hard.PageFrameNumber = MiRemoveZeroPage(0); + MI_WRITE_VALID_PPE(PointerPpe, TempPpe); + } + } +#endif + // // So now get the PDE for paged pool and zero it out // PointerPde = MiAddressToPde(MmPagedPoolStart); - -#if (_MI_PAGING_LEVELS >= 3) - /* On these systems, there's no double-mapping, so instead, the PPE and PXEs - * are setup to span the entire paged pool area, so there's no need for the - * system PD */ - ASSERT(FALSE); -#endif - RtlZeroMemory(PointerPde, (1 + MiAddressToPde(MmPagedPoolEnd) - PointerPde) * sizeof(MMPDE)); @@ -1703,11 +1721,6 @@ MiBuildPagedPool(VOID) MmPagedPoolInfo.FirstPteForPagedPool = PointerPte; MmPagedPoolInfo.LastPteForPagedPool = MiAddressToPte(MmPagedPoolEnd); - // - // Lock the PFN database - // - OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - /* Allocate a page and map the first paged pool PDE */ MI_SET_USAGE(MI_USAGE_PAGED_POOL); MI_SET_PROCESS2("Kernel"); @@ -1717,7 +1730,11 @@ MiBuildPagedPool(VOID) #if (_MI_PAGING_LEVELS >= 3) /* Use the PPE of MmPagedPoolStart that was setup above */ // Bla = PFN_FROM_PTE(PpeAddress(MmPagedPool...)); - ASSERT(FALSE); + + /* Initialize the PFN entry for it */ + MiInitializePfnForOtherProcess(PageFrameIndex, + (PMMPTE)PointerPde, + PFN_FROM_PTE(MiAddressToPpe(MmPagedPoolStart))); #else /* Do it this way */ // Bla = MmSystemPageDirectory[(PointerPde - (PMMPTE)PDE_BASE) / PDE_COUNT] diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index 63372447fcc..a7c1841d63d 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -637,8 +637,15 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, IN PVOID TrapInformation) { KIRQL OldIrql = KeGetCurrentIrql(), LockIrql; - PMMPTE PointerPte, ProtoPte = NULL; - PMMPDE PointerPde; + PMMPTE ProtoPte = NULL; + PMMPTE PointerPte = MiAddressToPte(Address); + PMMPDE PointerPde = MiAddressToPde(Address); +#if (_MI_PAGING_LEVELS >= 3) + PMMPDE PointerPpe = MiAddressToPpe(Address); +#if (_MI_PAGING_LEVELS == 4) + PMMPDE PointerPxe = MiAddressToPxe(Address); +#endif +#endif MMPTE TempPte; PETHREAD CurrentThread; PEPROCESS CurrentProcess; @@ -648,17 +655,8 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, PMMVAD Vad; PFN_NUMBER PageFrameIndex; ULONG Color; - DPRINT("ARM3 FAULT AT: %p\n", Address); - // - // Get the PTE and PDE - // - PointerPte = MiAddressToPte(Address); - PointerPde = MiAddressToPde(Address); -#if (_MI_PAGING_LEVELS >= 3) - /* We need the PPE and PXE addresses */ - ASSERT(FALSE); -#endif + DPRINT("ARM3 FAULT AT: %p\n", Address); // // Check for dispatch-level snafu @@ -675,7 +673,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, } // - // Check for kernel fault + // Check for kernel fault address // while (Address >= MmSystemRangeStart) { @@ -685,8 +683,18 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, if (Mode == UserMode) return STATUS_ACCESS_VIOLATION; #if (_MI_PAGING_LEVELS >= 3) - /* Need to check PXE and PDE validity */ - ASSERT(FALSE); + if ( +#if (_MI_PAGING_LEVELS == 4) + (PointerPxe->u.Hard.Valid == 0) || +#endif + (PointerPpe->u.Hard.Valid == 0)) + { + KeBugCheckEx(PAGE_FAULT_IN_NONPAGED_AREA, + (ULONG_PTR)Address, + StoreInstruction, + (ULONG_PTR)TrapInformation, + 2); + } #endif // @@ -871,18 +879,21 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, return Status; } - /* This is a user fault */ +#if (_MI_PAGING_LEVELS == 4) + /* On these systems we have PXEs and PPEs ready for everything we need */ + if (PointerPxe->u.Hard.Valid == 0) return STATUS_ACCESS_VIOLATION; +#endif +#if (_MI_PAGING_LEVELS >= 3) + if (PointerPpe->u.Hard.Valid == 0) return STATUS_ACCESS_VIOLATION; +#endif + + /* This is a user fault (<- And this is a lie!) */ CurrentThread = PsGetCurrentThread(); CurrentProcess = PsGetCurrentProcess(); /* Lock the working set */ MiLockProcessWorkingSet(CurrentProcess, CurrentThread); -#if (_MI_PAGING_LEVELS >= 3) - /* Need to check/handle PPE and PXE validity too */ - ASSERT(FALSE); -#endif - /* First things first, is the PDE valid? */ ASSERT(PointerPde->u.Hard.LargePage == 0); if (PointerPde->u.Hard.Valid == 0) @@ -916,10 +927,6 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, #endif /* We should come back with APCs enabled, and with a valid PDE */ ASSERT(KeAreAllApcsDisabled() == TRUE); -#if (_MI_PAGING_LEVELS >= 3) - /* Need to check/handle PPE and PXE validity too */ - ASSERT(FALSE); -#endif ASSERT(PointerPde->u.Hard.Valid == 1); } From 78b0ef2aa4018607ee9a47a80bc71faa05c597a3 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 5 Feb 2012 17:57:34 +0000 Subject: [PATCH 221/289] [NTOSKRNL] - Rewrite SeCaptureSecurityDescriptor. The old code was mess and totally broken for 64 bit. - Many fixes to security descriptor code that was making wrong assumptions about the SECURITY_DESCRIPTOR structures svn path=/trunk/; revision=55437 --- reactos/ntoskrnl/se/sd.c | 804 ++++++++++++++++++--------------------- 1 file changed, 365 insertions(+), 439 deletions(-) diff --git a/reactos/ntoskrnl/se/sd.c b/reactos/ntoskrnl/se/sd.c index d58a6eab7ee..4276cdf848a 100644 --- a/reactos/ntoskrnl/se/sd.c +++ b/reactos/ntoskrnl/se/sd.c @@ -28,6 +28,78 @@ PSECURITY_DESCRIPTOR SeUnrestrictedSd = NULL; /* PRIVATE FUNCTIONS **********************************************************/ +PSID +FORCEINLINE +SepGetGroupFromDescriptor(PVOID _Descriptor) +{ + PISECURITY_DESCRIPTOR Descriptor = (PISECURITY_DESCRIPTOR)_Descriptor; + PISECURITY_DESCRIPTOR_RELATIVE SdRel; + + if (Descriptor->Control & SE_SELF_RELATIVE) + { + SdRel = (PISECURITY_DESCRIPTOR_RELATIVE)Descriptor; + return (PSID)((ULONG_PTR)Descriptor + SdRel->Group); + } + else + { + return Descriptor->Group; + } +} + +PSID +FORCEINLINE +SepGetOwnerFromDescriptor(PVOID _Descriptor) +{ + PISECURITY_DESCRIPTOR Descriptor = (PISECURITY_DESCRIPTOR)_Descriptor; + PISECURITY_DESCRIPTOR_RELATIVE SdRel; + + if (Descriptor->Control & SE_SELF_RELATIVE) + { + SdRel = (PISECURITY_DESCRIPTOR_RELATIVE)Descriptor; + return (PSID)((ULONG_PTR)Descriptor + SdRel->Owner); + } + else + { + return Descriptor->Owner; + } +} + +PACL +FORCEINLINE +SepGetDaclFromDescriptor(PVOID _Descriptor) +{ + PISECURITY_DESCRIPTOR Descriptor = (PISECURITY_DESCRIPTOR)_Descriptor; + PISECURITY_DESCRIPTOR_RELATIVE SdRel; + + if (Descriptor->Control & SE_SELF_RELATIVE) + { + SdRel = (PISECURITY_DESCRIPTOR_RELATIVE)Descriptor; + return (PACL)((ULONG_PTR)Descriptor + SdRel->Dacl); + } + else + { + return Descriptor->Dacl; + } +} + +PACL +FORCEINLINE +SepGetSaclFromDescriptor(PVOID _Descriptor) +{ + PISECURITY_DESCRIPTOR Descriptor = (PISECURITY_DESCRIPTOR)_Descriptor; + PISECURITY_DESCRIPTOR_RELATIVE SdRel; + + if (Descriptor->Control & SE_SELF_RELATIVE) + { + SdRel = (PISECURITY_DESCRIPTOR_RELATIVE)Descriptor; + return (PACL)((ULONG_PTR)Descriptor + SdRel->Sacl); + } + else + { + return Descriptor->Sacl; + } +} + BOOLEAN INIT_FUNCTION NTAPI @@ -120,7 +192,7 @@ SeSetWorldSecurityDescriptor(SECURITY_INFORMATION SecurityInformation, PISECURITY_DESCRIPTOR SecurityDescriptor, PULONG BufferLength) { - ULONG_PTR Current; + ULONG Current; ULONG SidSize; ULONG SdSize; NTSTATUS Status; @@ -160,29 +232,25 @@ SeSetWorldSecurityDescriptor(SECURITY_INFORMATION SecurityInformation, return Status; } - Current = (ULONG_PTR)(SdRel + 1); + Current = sizeof(SECURITY_DESCRIPTOR_RELATIVE); if (SecurityInformation & OWNER_SECURITY_INFORMATION) { - RtlCopyMemory((PVOID)Current, - SeWorldSid, - SidSize); - SdRel->Owner = (ULONG)((ULONG_PTR)Current - (ULONG_PTR)SdRel); + RtlCopyMemory((PUCHAR)SdRel + Current, SeWorldSid, SidSize); + SdRel->Owner = Current; Current += SidSize; } if (SecurityInformation & GROUP_SECURITY_INFORMATION) { - RtlCopyMemory((PVOID)Current, - SeWorldSid, - SidSize); - SdRel->Group = (ULONG)((ULONG_PTR)Current - (ULONG_PTR)SdRel); + RtlCopyMemory((PUCHAR)SdRel + Current, SeWorldSid, SidSize); + SdRel->Group = Current; Current += SidSize; } if (SecurityInformation & DACL_SECURITY_INFORMATION) { - PACL Dacl = (PACL)Current; + PACL Dacl = (PACL)((PUCHAR)SdRel + Current); SdRel->Control |= SE_DACL_PRESENT; Status = RtlCreateAcl(Dacl, @@ -198,7 +266,7 @@ SeSetWorldSecurityDescriptor(SECURITY_INFORMATION SecurityInformation, if (!NT_SUCCESS(Status)) return Status; - SdRel->Dacl = (ULONG)((ULONG_PTR)Current - (ULONG_PTR)SdRel); + SdRel->Dacl = Current; } if (SecurityInformation & SACL_SECURITY_INFORMATION) @@ -245,7 +313,7 @@ SepCaptureSecurityQualityOfService(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIO ProbeForRead(ObjectAttributes->SecurityQualityOfService, sizeof(SECURITY_QUALITY_OF_SERVICE), sizeof(ULONG)); - + if (((PSECURITY_QUALITY_OF_SERVICE)ObjectAttributes->SecurityQualityOfService)->Length == sizeof(SECURITY_QUALITY_OF_SERVICE)) { @@ -381,335 +449,239 @@ SepReleaseSecurityQualityOfService(IN PSECURITY_QUALITY_OF_SERVICE CapturedSecur /* PUBLIC FUNCTIONS ***********************************************************/ -/* - * @implemented - */ +static +ULONG +DetermineSIDSize( + PISID Sid, + PULONG OutSAC, + KPROCESSOR_MODE ProcessorMode) +{ + ULONG Size; + + if (!Sid) + { + *OutSAC = 0; + return 0; + } + + if (ProcessorMode != KernelMode) + { + /* Securely access the buffers! */ + *OutSAC = ProbeForReadUchar(&Sid->SubAuthorityCount); + Size = RtlLengthRequiredSid(*OutSAC); + ProbeForRead(Sid, Size, sizeof(ULONG)); + } + else + { + *OutSAC = Sid->SubAuthorityCount; + Size = RtlLengthRequiredSid(*OutSAC); + } + + return Size; +} + +static +ULONG +DetermineACLSize( + PACL Acl, + KPROCESSOR_MODE ProcessorMode) +{ + ULONG Size; + + if (!Acl) return 0; + + if (ProcessorMode == KernelMode) return Acl->AclSize; + + /* Probe the buffers! */ + Size = ProbeForReadUshort(&Acl->AclSize); + ProbeForRead(Acl, Size, sizeof(ULONG)); + + return Size; +} + NTSTATUS NTAPI -SeCaptureSecurityDescriptor(IN PSECURITY_DESCRIPTOR _OriginalSecurityDescriptor, - IN KPROCESSOR_MODE CurrentMode, - IN POOL_TYPE PoolType, - IN BOOLEAN CaptureIfKernel, - OUT PSECURITY_DESCRIPTOR *CapturedSecurityDescriptor) +SeCaptureSecurityDescriptor( + IN PSECURITY_DESCRIPTOR _OriginalSecurityDescriptor, + IN KPROCESSOR_MODE CurrentMode, + IN POOL_TYPE PoolType, + IN BOOLEAN CaptureIfKernel, + OUT PSECURITY_DESCRIPTOR *CapturedSecurityDescriptor) { - PISECURITY_DESCRIPTOR OriginalSecurityDescriptor = _OriginalSecurityDescriptor; + PISECURITY_DESCRIPTOR OriginalDescriptor = _OriginalSecurityDescriptor; SECURITY_DESCRIPTOR DescriptorCopy; - PISECURITY_DESCRIPTOR NewDescriptor; + PISECURITY_DESCRIPTOR_RELATIVE NewDescriptor; ULONG OwnerSAC = 0, GroupSAC = 0; ULONG OwnerSize = 0, GroupSize = 0; ULONG SaclSize = 0, DaclSize = 0; ULONG DescriptorSize = 0; - NTSTATUS Status; + ULONG Offset; - if (OriginalSecurityDescriptor != NULL) - { - if (CurrentMode != KernelMode) - { - RtlZeroMemory(&DescriptorCopy, sizeof(DescriptorCopy)); - - _SEH2_TRY - { - /* - * First only probe and copy until the control field of the descriptor - * to determine whether it's a self-relative descriptor - */ - DescriptorSize = FIELD_OFFSET(SECURITY_DESCRIPTOR, - Owner); - ProbeForRead(OriginalSecurityDescriptor, - DescriptorSize, - sizeof(ULONG)); - - if (OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) - { - _SEH2_YIELD(return STATUS_UNKNOWN_REVISION); - } - - /* Make a copy on the stack */ - DescriptorCopy.Revision = OriginalSecurityDescriptor->Revision; - DescriptorCopy.Sbz1 = OriginalSecurityDescriptor->Sbz1; - DescriptorCopy.Control = OriginalSecurityDescriptor->Control; - DescriptorSize = ((DescriptorCopy.Control & SE_SELF_RELATIVE) ? - sizeof(SECURITY_DESCRIPTOR_RELATIVE) : sizeof(SECURITY_DESCRIPTOR)); - - /* - * Probe and copy the entire security descriptor structure. The SIDs - * and ACLs will be probed and copied later though - */ - ProbeForRead(OriginalSecurityDescriptor, - DescriptorSize, - sizeof(ULONG)); - if (DescriptorCopy.Control & SE_SELF_RELATIVE) - { - PISECURITY_DESCRIPTOR_RELATIVE RelSD = (PISECURITY_DESCRIPTOR_RELATIVE)OriginalSecurityDescriptor; - - DescriptorCopy.Owner = (PSID)RelSD->Owner; - DescriptorCopy.Group = (PSID)RelSD->Group; - DescriptorCopy.Sacl = (PACL)RelSD->Sacl; - DescriptorCopy.Dacl = (PACL)RelSD->Dacl; - } - else - { - DescriptorCopy.Owner = OriginalSecurityDescriptor->Owner; - DescriptorCopy.Group = OriginalSecurityDescriptor->Group; - DescriptorCopy.Sacl = OriginalSecurityDescriptor->Sacl; - DescriptorCopy.Dacl = OriginalSecurityDescriptor->Dacl; - } - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; - } - else if (!CaptureIfKernel) - { - if (OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) - { - return STATUS_UNKNOWN_REVISION; - } - - *CapturedSecurityDescriptor = OriginalSecurityDescriptor; - return STATUS_SUCCESS; - } - else - { - if (OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) - { - return STATUS_UNKNOWN_REVISION; - } - - /* Make a copy on the stack */ - DescriptorCopy.Revision = OriginalSecurityDescriptor->Revision; - DescriptorCopy.Sbz1 = OriginalSecurityDescriptor->Sbz1; - DescriptorCopy.Control = OriginalSecurityDescriptor->Control; - DescriptorSize = ((DescriptorCopy.Control & SE_SELF_RELATIVE) ? - sizeof(SECURITY_DESCRIPTOR_RELATIVE) : sizeof(SECURITY_DESCRIPTOR)); - if (DescriptorCopy.Control & SE_SELF_RELATIVE) - { - PISECURITY_DESCRIPTOR_RELATIVE RelSD = (PISECURITY_DESCRIPTOR_RELATIVE)OriginalSecurityDescriptor; - - DescriptorCopy.Owner = (PSID)RelSD->Owner; - DescriptorCopy.Group = (PSID)RelSD->Group; - DescriptorCopy.Sacl = (PACL)RelSD->Sacl; - DescriptorCopy.Dacl = (PACL)RelSD->Dacl; - } - else - { - DescriptorCopy.Owner = OriginalSecurityDescriptor->Owner; - DescriptorCopy.Group = OriginalSecurityDescriptor->Group; - DescriptorCopy.Sacl = OriginalSecurityDescriptor->Sacl; - DescriptorCopy.Dacl = OriginalSecurityDescriptor->Dacl; - } - } - - if (DescriptorCopy.Control & SE_SELF_RELATIVE) - { - /* - * In case we're dealing with a self-relative descriptor, do a basic convert - * to an absolute descriptor. We do this so we can simply access the data - * using the pointers without calculating them again. - */ - DescriptorCopy.Control &= ~SE_SELF_RELATIVE; - if (DescriptorCopy.Owner != NULL) - { - DescriptorCopy.Owner = (PSID)((ULONG_PTR)OriginalSecurityDescriptor + (ULONG_PTR)DescriptorCopy.Owner); - } - if (DescriptorCopy.Group != NULL) - { - DescriptorCopy.Group = (PSID)((ULONG_PTR)OriginalSecurityDescriptor + (ULONG_PTR)DescriptorCopy.Group); - } - if (DescriptorCopy.Dacl != NULL) - { - DescriptorCopy.Dacl = (PACL)((ULONG_PTR)OriginalSecurityDescriptor + (ULONG_PTR)DescriptorCopy.Dacl); - } - if (DescriptorCopy.Sacl != NULL) - { - DescriptorCopy.Sacl = (PACL)((ULONG_PTR)OriginalSecurityDescriptor + (ULONG_PTR)DescriptorCopy.Sacl); - } - } - - /* Determine the size of the SIDs */ -#define DetermineSIDSize(SidType) \ -do { \ -if(DescriptorCopy.SidType != NULL) \ -{ \ -SID *SidType = (SID*)DescriptorCopy.SidType; \ -\ -if(CurrentMode != KernelMode) \ -{ \ -/* Securely access the buffers! */ \ -_SEH2_TRY \ -{ \ -SidType##SAC = ProbeForReadUchar(&SidType->SubAuthorityCount); \ -SidType##Size = RtlLengthRequiredSid(SidType##SAC); \ -DescriptorSize += ROUND_UP(SidType##Size, sizeof(ULONG)); \ -ProbeForRead(SidType, \ -SidType##Size, \ -sizeof(ULONG)); \ -} \ -_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \ -{ \ -_SEH2_YIELD(return _SEH2_GetExceptionCode()); \ -} \ -_SEH2_END; \ -\ -} \ -else \ -{ \ -SidType##SAC = SidType->SubAuthorityCount; \ -SidType##Size = RtlLengthRequiredSid(SidType##SAC); \ -DescriptorSize += ROUND_UP(SidType##Size, sizeof(ULONG)); \ -} \ -} \ -} while(0) - - DetermineSIDSize(Owner); - DetermineSIDSize(Group); - -#undef DetermineSIDSize - - /* Determine the size of the ACLs */ -#define DetermineACLSize(AclType, AclFlag) \ -do { \ -if((DescriptorCopy.Control & SE_##AclFlag##_PRESENT) && \ -DescriptorCopy.AclType != NULL) \ -{ \ -PACL AclType = (PACL)DescriptorCopy.AclType; \ -\ -if(CurrentMode != KernelMode) \ -{ \ -/* Securely access the buffers! */ \ -_SEH2_TRY \ -{ \ -AclType##Size = ProbeForReadUshort(&AclType->AclSize); \ -DescriptorSize += ROUND_UP(AclType##Size, sizeof(ULONG)); \ -ProbeForRead(AclType, \ -AclType##Size, \ -sizeof(ULONG)); \ -} \ -_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) \ -{ \ -_SEH2_YIELD(return _SEH2_GetExceptionCode()); \ -} \ -_SEH2_END; \ -\ -} \ -else \ -{ \ -AclType##Size = AclType->AclSize; \ -DescriptorSize += ROUND_UP(AclType##Size, sizeof(ULONG)); \ -} \ -} \ -else \ -{ \ -DescriptorCopy.AclType = NULL; \ -} \ -} while(0) - - DetermineACLSize(Sacl, SACL); - DetermineACLSize(Dacl, DACL); - -#undef DetermineACLSize - - /* - * Allocate enough memory to store a complete copy of a self-relative - * security descriptor - */ - NewDescriptor = ExAllocatePoolWithTag(PoolType, - DescriptorSize, - TAG_SD); - if (NewDescriptor != NULL) - { - ULONG_PTR Offset = sizeof(SECURITY_DESCRIPTOR); - - RtlZeroMemory(NewDescriptor, DescriptorSize); - NewDescriptor->Revision = DescriptorCopy.Revision; - NewDescriptor->Sbz1 = DescriptorCopy.Sbz1; - NewDescriptor->Control = DescriptorCopy.Control | SE_SELF_RELATIVE; - - _SEH2_TRY - { - /* - * Setup the offsets and copy the SIDs and ACLs to the new - * self-relative security descriptor. Probing the pointers is not - * neccessary anymore as we did that when collecting the sizes! - * Make sure to validate the SIDs and ACLs *again* as they could have - * been modified in the meanwhile! - */ -#define CopySID(Type) \ -do { \ -if(DescriptorCopy.Type != NULL) \ -{ \ -NewDescriptor->Type = (PVOID)Offset; \ -RtlCopyMemory((PVOID)((ULONG_PTR)NewDescriptor + \ -(ULONG_PTR)NewDescriptor->Type), \ -DescriptorCopy.Type, \ -Type##Size); \ -if (!RtlValidSid((PSID)((ULONG_PTR)NewDescriptor + \ -(ULONG_PTR)NewDescriptor->Type))) \ -{ \ -RtlRaiseStatus(STATUS_INVALID_SID); \ -} \ -Offset += ROUND_UP(Type##Size, sizeof(ULONG)); \ -} \ -} while(0) - - CopySID(Owner); - CopySID(Group); - -#undef CopySID - -#define CopyACL(Type) \ -do { \ -if(DescriptorCopy.Type != NULL) \ -{ \ -NewDescriptor->Type = (PVOID)Offset; \ -RtlCopyMemory((PVOID)((ULONG_PTR)NewDescriptor + \ -(ULONG_PTR)NewDescriptor->Type), \ -DescriptorCopy.Type, \ -Type##Size); \ -if (!RtlValidAcl((PACL)((ULONG_PTR)NewDescriptor + \ -(ULONG_PTR)NewDescriptor->Type))) \ -{ \ -RtlRaiseStatus(STATUS_INVALID_ACL); \ -} \ -Offset += ROUND_UP(Type##Size, sizeof(ULONG)); \ -} \ -} while(0) - - CopyACL(Sacl); - CopyACL(Dacl); - -#undef CopyACL - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* We failed to copy the data to the new descriptor */ - ExFreePoolWithTag(NewDescriptor, TAG_SD); - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; - - /* - * We're finally done! - * Copy the pointer to the captured descriptor to to the caller. - */ - *CapturedSecurityDescriptor = NewDescriptor; - return STATUS_SUCCESS; - } - else - { - Status = STATUS_INSUFFICIENT_RESOURCES; - } - } - else + if (!OriginalDescriptor) { /* Nothing to do... */ *CapturedSecurityDescriptor = NULL; + return STATUS_SUCCESS; } - return Status; + /* Quick path */ + if (CurrentMode == KernelMode && !CaptureIfKernel) + { + /* Check descriptor version */ + if (OriginalDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) + { + return STATUS_UNKNOWN_REVISION; + } + + *CapturedSecurityDescriptor = _OriginalSecurityDescriptor; + return STATUS_SUCCESS; + } + + _SEH2_TRY + { + if (CurrentMode != KernelMode) + { + ProbeForRead(OriginalDescriptor, + sizeof(SECURITY_DESCRIPTOR_RELATIVE), + sizeof(ULONG)); + } + + /* Check the descriptor version */ + if (OriginalDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) + { + _SEH2_YIELD(return STATUS_UNKNOWN_REVISION); + } + + if (CurrentMode != KernelMode) + { + /* Get the size of the descriptor */ + DescriptorSize = (OriginalDescriptor->Control & SE_SELF_RELATIVE) ? + sizeof(SECURITY_DESCRIPTOR_RELATIVE) : sizeof(SECURITY_DESCRIPTOR); + + /* Probe the entire security descriptor structure. The SIDs + * and ACLs will be probed and copied later though */ + ProbeForRead(OriginalDescriptor, DescriptorSize, sizeof(ULONG)); + } + + /* Now capture all fields and convert to an absolute descriptor */ + DescriptorCopy.Revision = OriginalDescriptor->Revision; + DescriptorCopy.Sbz1 = OriginalDescriptor->Sbz1; + DescriptorCopy.Control = OriginalDescriptor->Control & ~SE_SELF_RELATIVE; + DescriptorCopy.Owner = SepGetOwnerFromDescriptor(OriginalDescriptor); + DescriptorCopy.Group = SepGetGroupFromDescriptor(OriginalDescriptor); + DescriptorCopy.Sacl = SepGetSaclFromDescriptor(OriginalDescriptor); + DescriptorCopy.Dacl = SepGetDaclFromDescriptor(OriginalDescriptor); + DescriptorSize = sizeof(SECURITY_DESCRIPTOR_RELATIVE); + + /* Determine owner and group sizes */ + OwnerSize = DetermineSIDSize(DescriptorCopy.Owner, &OwnerSAC, CurrentMode); + DescriptorSize += ROUND_UP(OwnerSize, sizeof(ULONG)); + GroupSize = DetermineSIDSize(DescriptorCopy.Group, &GroupSAC, CurrentMode); + DescriptorSize += ROUND_UP(GroupSize, sizeof(ULONG)); + + /* Determine the size of the ACLs */ + if (DescriptorCopy.Control & SE_SACL_PRESENT) + { + /* Get the size and probe if user mode */ + SaclSize = DetermineACLSize(DescriptorCopy.Sacl, CurrentMode); + DescriptorSize += ROUND_UP(SaclSize, sizeof(ULONG)); + } + + if (DescriptorCopy.Control & SE_DACL_PRESENT) + { + /* Get the size and probe if user mode */ + DaclSize = DetermineACLSize(DescriptorCopy.Dacl, CurrentMode); + DescriptorSize += ROUND_UP(DaclSize, sizeof(ULONG)); + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END + + /* + * Allocate enough memory to store a complete copy of a self-relative + * security descriptor + */ + NewDescriptor = ExAllocatePoolWithTag(PoolType, + DescriptorSize, + TAG_SD); + if (!NewDescriptor) return STATUS_INSUFFICIENT_RESOURCES; + + RtlZeroMemory(NewDescriptor, DescriptorSize); + NewDescriptor->Revision = DescriptorCopy.Revision; + NewDescriptor->Sbz1 = DescriptorCopy.Sbz1; + NewDescriptor->Control = DescriptorCopy.Control | SE_SELF_RELATIVE; + + _SEH2_TRY + { + /* + * Setup the offsets and copy the SIDs and ACLs to the new + * self-relative security descriptor. Probing the pointers is not + * neccessary anymore as we did that when collecting the sizes! + * Make sure to validate the SIDs and ACLs *again* as they could have + * been modified in the meanwhile! + */ + Offset = sizeof(SECURITY_DESCRIPTOR_RELATIVE); + + if (DescriptorCopy.Owner) + { + if (!RtlValidSid(DescriptorCopy.Owner)) RtlRaiseStatus(STATUS_INVALID_SID); + NewDescriptor->Owner = Offset; + RtlCopyMemory((PUCHAR)NewDescriptor + Offset, + DescriptorCopy.Owner, + OwnerSize); + Offset += ROUND_UP(OwnerSize, sizeof(ULONG)); + } + + if (DescriptorCopy.Group) + { + if (!RtlValidSid(DescriptorCopy.Group)) RtlRaiseStatus(STATUS_INVALID_SID); + NewDescriptor->Group = Offset; + RtlCopyMemory((PUCHAR)NewDescriptor + Offset, + DescriptorCopy.Group, + GroupSize); + Offset += ROUND_UP(GroupSize, sizeof(ULONG)); + } + + if (DescriptorCopy.Sacl) + { + if (!RtlValidAcl(DescriptorCopy.Sacl)) RtlRaiseStatus(STATUS_INVALID_ACL); + NewDescriptor->Sacl = Offset; + RtlCopyMemory((PUCHAR)NewDescriptor + Offset, + DescriptorCopy.Sacl, + SaclSize); + Offset += ROUND_UP(SaclSize, sizeof(ULONG)); + } + + if (DescriptorCopy.Dacl) + { + if (!RtlValidAcl(DescriptorCopy.Dacl)) RtlRaiseStatus(STATUS_INVALID_ACL); + NewDescriptor->Dacl = Offset; + RtlCopyMemory((PUCHAR)NewDescriptor + Offset, + DescriptorCopy.Dacl, + DaclSize); + Offset += ROUND_UP(DaclSize, sizeof(ULONG)); + } + + /* Make sure the size was correct */ + ASSERT(Offset == DescriptorSize); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* We failed to copy the data to the new descriptor */ + ExFreePoolWithTag(NewDescriptor, TAG_SD); + _SEH2_YIELD(return _SEH2_GetExceptionCode()); + } + _SEH2_END; + + /* + * We're finally done! + * Copy the pointer to the captured descriptor to to the caller. + */ + *CapturedSecurityDescriptor = NewDescriptor; + return STATUS_SUCCESS; } /* @@ -889,9 +861,10 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, IN POOL_TYPE PoolType, IN PGENERIC_MAPPING GenericMapping) { - PISECURITY_DESCRIPTOR ObjectSd; - PISECURITY_DESCRIPTOR NewSd; + PISECURITY_DESCRIPTOR_RELATIVE ObjectSd; + PISECURITY_DESCRIPTOR_RELATIVE NewSd; PISECURITY_DESCRIPTOR SecurityDescriptor = _SecurityDescriptor; + PISECURITY_DESCRIPTOR_RELATIVE RelSD = (PISECURITY_DESCRIPTOR_RELATIVE)SecurityDescriptor; PSID Owner = 0; PSID Group = 0; PACL Dacl = 0; @@ -901,10 +874,11 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, ULONG DaclLength = 0; ULONG SaclLength = 0; ULONG Control = 0; - ULONG_PTR Current; + ULONG Current; SECURITY_INFORMATION SecurityInformation; ObjectSd = *ObjectsSecurityDescriptor; + ASSERT(ObjectSd->Control & SE_SELF_RELATIVE); /* The object does not have a security descriptor. */ if (!ObjectSd) @@ -918,7 +892,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, if (SecurityDescriptor->Owner != NULL) { if (SecurityDescriptor->Control & SE_SELF_RELATIVE) - Owner = (PSID)((ULONG_PTR)SecurityDescriptor->Owner + + Owner = (PSID)((ULONG_PTR)RelSD->Owner + (ULONG_PTR)SecurityDescriptor); else Owner = (PSID)SecurityDescriptor->Owner; @@ -929,7 +903,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, } else { - if (ObjectSd->Owner != NULL) + if (ObjectSd->Owner) { Owner = (PSID)((ULONG_PTR)ObjectSd->Owner + (ULONG_PTR)ObjectSd); OwnerLength = ROUND_UP(RtlLengthSid(Owner), 4); @@ -937,7 +911,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, Control |= (ObjectSd->Control & SE_OWNER_DEFAULTED); } - + /* Get group and group size */ if (SecurityInformation & GROUP_SECURITY_INFORMATION) { @@ -955,7 +929,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, } else { - if (ObjectSd->Group != NULL) + if (ObjectSd->Group) { Group = (PSID)((ULONG_PTR)ObjectSd->Group + (ULONG_PTR)ObjectSd); GroupLength = ROUND_UP(RtlLengthSid(Group), 4); @@ -983,8 +957,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, } else { - if ((ObjectSd->Control & SE_DACL_PRESENT) && - (ObjectSd->Dacl != NULL)) + if ((ObjectSd->Control & SE_DACL_PRESENT) && (ObjectSd->Dacl)) { Dacl = (PACL)((ULONG_PTR)ObjectSd->Dacl + (ULONG_PTR)ObjectSd); DaclLength = ROUND_UP((ULONG)Dacl->AclSize, 4); @@ -992,7 +965,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, Control |= (ObjectSd->Control & (SE_DACL_DEFAULTED | SE_DACL_PRESENT)); } - + /* Get SACL and SACL size */ if (SecurityInformation & SACL_SECURITY_INFORMATION) { @@ -1011,8 +984,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, } else { - if ((ObjectSd->Control & SE_SACL_PRESENT) && - (ObjectSd->Sacl != NULL)) + if ((ObjectSd->Control & SE_SACL_PRESENT) && (ObjectSd->Sacl)) { Sacl = (PACL)((ULONG_PTR)ObjectSd->Sacl + (ULONG_PTR)ObjectSd); SaclLength = ROUND_UP((ULONG)Sacl->AclSize, 4); @@ -1022,7 +994,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, } NewSd = ExAllocatePool(NonPagedPool, - sizeof(SECURITY_DESCRIPTOR) + OwnerLength + GroupLength + + sizeof(SECURITY_DESCRIPTOR_RELATIVE) + OwnerLength + GroupLength + DaclLength + SaclLength); if (NewSd == NULL) { @@ -1036,41 +1008,33 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, /* We always build a self-relative descriptor */ NewSd->Control = (USHORT)Control | SE_SELF_RELATIVE; - Current = (ULONG_PTR)NewSd + sizeof(SECURITY_DESCRIPTOR); + Current = sizeof(SECURITY_DESCRIPTOR); if (OwnerLength != 0) { - RtlCopyMemory((PVOID)Current, - Owner, - OwnerLength); - NewSd->Owner = (PSID)(Current - (ULONG_PTR)NewSd); + RtlCopyMemory((PUCHAR)NewSd + Current, Owner, OwnerLength); + NewSd->Owner = Current; Current += OwnerLength; } if (GroupLength != 0) { - RtlCopyMemory((PVOID)Current, - Group, - GroupLength); - NewSd->Group = (PSID)(Current - (ULONG_PTR)NewSd); + RtlCopyMemory((PUCHAR)NewSd + Current, Group, GroupLength); + NewSd->Group = Current; Current += GroupLength; } if (DaclLength != 0) { - RtlCopyMemory((PVOID)Current, - Dacl, - DaclLength); - NewSd->Dacl = (PACL)(Current - (ULONG_PTR)NewSd); + RtlCopyMemory((PUCHAR)NewSd + Current, Dacl, DaclLength); + NewSd->Dacl = Current; Current += DaclLength; } if (SaclLength != 0) { - RtlCopyMemory((PVOID)Current, - Sacl, - SaclLength); - NewSd->Sacl = (PACL)(Current - (ULONG_PTR)NewSd); + RtlCopyMemory((PUCHAR)NewSd + Current, Sacl, SaclLength); + NewSd->Sacl = Current; Current += SaclLength; } @@ -1112,7 +1076,7 @@ SeValidSecurityDescriptor(IN ULONG Length, ULONG SdLength; PISID Sid; PACL Acl; - PISECURITY_DESCRIPTOR SecurityDescriptor = _SecurityDescriptor; + PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor = _SecurityDescriptor; if (Length < SECURITY_DESCRIPTOR_MIN_LENGTH) { @@ -1135,19 +1099,19 @@ SeValidSecurityDescriptor(IN ULONG Length, SdLength = sizeof(SECURITY_DESCRIPTOR); /* Check Owner SID */ - if (SecurityDescriptor->Owner == NULL) + if (SecurityDescriptor->Owner) { DPRINT1("No Owner SID\n"); return FALSE; } - if ((ULONG_PTR)SecurityDescriptor->Owner % sizeof(ULONG)) + if (SecurityDescriptor->Owner % sizeof(ULONG)) { DPRINT1("Invalid Owner SID alignment\n"); return FALSE; } - Sid = (PISID)((ULONG_PTR)SecurityDescriptor + (ULONG_PTR)SecurityDescriptor->Owner); + Sid = (PISID)((ULONG_PTR)SecurityDescriptor + SecurityDescriptor->Owner); if (Sid->Revision != SID_REVISION) { DPRINT1("Invalid Owner SID revision\n"); @@ -1162,15 +1126,15 @@ SeValidSecurityDescriptor(IN ULONG Length, } /* Check Group SID */ - if (SecurityDescriptor->Group != NULL) + if (SecurityDescriptor->Group) { - if ((ULONG_PTR)SecurityDescriptor->Group % sizeof(ULONG)) + if (SecurityDescriptor->Group % sizeof(ULONG)) { DPRINT1("Invalid Group SID alignment\n"); return FALSE; } - Sid = (PSID)((ULONG_PTR)SecurityDescriptor + (ULONG_PTR)SecurityDescriptor->Group); + Sid = (PSID)((ULONG_PTR)SecurityDescriptor + SecurityDescriptor->Group); if (Sid->Revision != SID_REVISION) { DPRINT1("Invalid Group SID revision\n"); @@ -1186,15 +1150,15 @@ SeValidSecurityDescriptor(IN ULONG Length, } /* Check DACL */ - if (SecurityDescriptor->Dacl != NULL) + if (SecurityDescriptor->Dacl) { - if ((ULONG_PTR)SecurityDescriptor->Dacl % sizeof(ULONG)) + if (SecurityDescriptor->Dacl % sizeof(ULONG)) { DPRINT1("Invalid DACL alignment\n"); return FALSE; } - Acl = (PACL)((ULONG_PTR)SecurityDescriptor + (ULONG_PTR)SecurityDescriptor->Dacl); + Acl = (PACL)((ULONG_PTR)SecurityDescriptor + SecurityDescriptor->Dacl); if ((Acl->AclRevision < MIN_ACL_REVISION) && (Acl->AclRevision > MAX_ACL_REVISION)) { @@ -1211,15 +1175,15 @@ SeValidSecurityDescriptor(IN ULONG Length, } /* Check SACL */ - if (SecurityDescriptor->Sacl != NULL) + if (SecurityDescriptor->Sacl) { - if ((ULONG_PTR)SecurityDescriptor->Sacl % sizeof(ULONG)) + if (SecurityDescriptor->Sacl % sizeof(ULONG)) { DPRINT1("Invalid SACL alignment\n"); return FALSE; } - Acl = (PACL)((ULONG_PTR)SecurityDescriptor + (ULONG_PTR)SecurityDescriptor->Sacl); + Acl = (PACL)((ULONG_PTR)SecurityDescriptor + SecurityDescriptor->Sacl); if ((Acl->AclRevision < MIN_ACL_REVISION) || (Acl->AclRevision > MAX_ACL_REVISION)) { @@ -1256,6 +1220,7 @@ SeDeassignSecurity(PSECURITY_DESCRIPTOR *SecurityDescriptor) } + /* * @unimplemented */ @@ -1288,7 +1253,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, { PISECURITY_DESCRIPTOR ParentDescriptor = _ParentDescriptor; PISECURITY_DESCRIPTOR ExplicitDescriptor = _ExplicitDescriptor; - PISECURITY_DESCRIPTOR Descriptor; + PISECURITY_DESCRIPTOR_RELATIVE Descriptor; PTOKEN Token; ULONG OwnerLength = 0; ULONG GroupLength = 0; @@ -1296,7 +1261,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, ULONG SaclLength = 0; ULONG Length = 0; ULONG Control = 0; - ULONG_PTR Current; + ULONG Current; PSID Owner = NULL; PSID Group = NULL; PACL Dacl = NULL; @@ -1317,17 +1282,13 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, } /* Inherit the Owner SID */ - if (ExplicitDescriptor != NULL && ExplicitDescriptor->Owner != NULL) + if (ExplicitDescriptor != NULL) { DPRINT("Use explicit owner sid!\n"); - Owner = ExplicitDescriptor->Owner; - - if (ExplicitDescriptor->Control & SE_SELF_RELATIVE) - { - Owner = (PSID)(((ULONG_PTR)Owner) + (ULONG_PTR)ExplicitDescriptor); - } + Owner = SepGetOwnerFromDescriptor(ExplicitDescriptor); } - else + + if (!Owner) { if (Token != NULL) { @@ -1346,16 +1307,12 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, OwnerLength = ROUND_UP(RtlLengthSid(Owner), 4); /* Inherit the Group SID */ - if (ExplicitDescriptor != NULL && ExplicitDescriptor->Group != NULL) + if (ExplicitDescriptor != NULL) { - DPRINT("Use explicit group sid!\n"); - Group = ExplicitDescriptor->Group; - if (ExplicitDescriptor->Control & SE_SELF_RELATIVE) - { - Group = (PSID)(((ULONG_PTR)Group) + (ULONG_PTR)ExplicitDescriptor); - } + Group = SepGetGroupFromDescriptor(ExplicitDescriptor); } - else + + if (!Group) { if (Token != NULL) { @@ -1368,7 +1325,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, Group = SeLocalSystemSid; } - Control |= SE_OWNER_DEFAULTED; + Control |= SE_GROUP_DEFAULTED; } GroupLength = ROUND_UP(RtlLengthSid(Group), 4); @@ -1379,12 +1336,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, !(ExplicitDescriptor->Control & SE_DACL_DEFAULTED)) { DPRINT("Use explicit DACL!\n"); - Dacl = ExplicitDescriptor->Dacl; - if (Dacl != NULL && (ExplicitDescriptor->Control & SE_SELF_RELATIVE)) - { - Dacl = (PACL)(((ULONG_PTR)Dacl) + (ULONG_PTR)ExplicitDescriptor); - } - + Dacl = SepGetDaclFromDescriptor(ExplicitDescriptor); Control |= SE_DACL_PRESENT; } else if (ParentDescriptor != NULL && @@ -1392,12 +1344,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, { DPRINT("Use parent DACL!\n"); /* FIXME: Inherit */ - Dacl = ParentDescriptor->Dacl; - if (Dacl != NULL && (ParentDescriptor->Control & SE_SELF_RELATIVE)) - { - Dacl = (PACL)(((ULONG_PTR)Dacl) + (ULONG_PTR)ParentDescriptor); - } - + Dacl = SepGetDaclFromDescriptor(ParentDescriptor); Control |= (SE_DACL_PRESENT | SE_DACL_DEFAULTED); } else if (Token != NULL && Token->DefaultDacl != NULL) @@ -1422,12 +1369,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, !(ExplicitDescriptor->Control & SE_SACL_DEFAULTED)) { DPRINT("Use explicit SACL!\n"); - Sacl = ExplicitDescriptor->Sacl; - if (Sacl != NULL && (ExplicitDescriptor->Control & SE_SELF_RELATIVE)) - { - Sacl = (PACL)(((ULONG_PTR)Sacl) + (ULONG_PTR)ExplicitDescriptor); - } - + Sacl = SepGetSaclFromDescriptor(ExplicitDescriptor); Control |= SE_SACL_PRESENT; } else if (ParentDescriptor != NULL && @@ -1435,20 +1377,15 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, { DPRINT("Use parent SACL!\n"); /* FIXME: Inherit */ - Sacl = ParentDescriptor->Sacl; - if (Sacl != NULL && (ParentDescriptor->Control & SE_SELF_RELATIVE)) - { - Sacl = (PACL)(((ULONG_PTR)Sacl) + (ULONG_PTR)ParentDescriptor); - } - + Sacl = SepGetSaclFromDescriptor(ParentDescriptor); Control |= (SE_SACL_PRESENT | SE_SACL_DEFAULTED); } SaclLength = (Sacl != NULL) ? ROUND_UP(Sacl->AclSize, 4) : 0; /* Allocate and initialize the new security descriptor */ - Length = sizeof(SECURITY_DESCRIPTOR) + - OwnerLength + GroupLength + DaclLength + SaclLength; + Length = sizeof(SECURITY_DESCRIPTOR_RELATIVE) + + OwnerLength + GroupLength + DaclLength + SaclLength; DPRINT("L: sizeof(SECURITY_DESCRIPTOR) %d OwnerLength %d GroupLength %d DaclLength %d SaclLength %d\n", sizeof(SECURITY_DESCRIPTOR), @@ -1457,9 +1394,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, DaclLength, SaclLength); - Descriptor = ExAllocatePoolWithTag(PagedPool, - Length, - TAG_SD); + Descriptor = ExAllocatePoolWithTag(PagedPool, Length, TAG_SD); if (Descriptor == NULL) { DPRINT1("ExAlloctePool() failed\n"); @@ -1467,38 +1402,31 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, return STATUS_INSUFFICIENT_RESOURCES; } - RtlZeroMemory( Descriptor, Length ); - RtlCreateSecurityDescriptor(Descriptor, - SECURITY_DESCRIPTOR_REVISION); + RtlZeroMemory(Descriptor, Length); + RtlCreateSecurityDescriptor(Descriptor, SECURITY_DESCRIPTOR_REVISION); Descriptor->Control = (USHORT)Control | SE_SELF_RELATIVE; - Current = (ULONG_PTR)Descriptor + sizeof(SECURITY_DESCRIPTOR); + Current = sizeof(SECURITY_DESCRIPTOR_RELATIVE); if (SaclLength != 0) { - RtlCopyMemory((PVOID)Current, - Sacl, - SaclLength); - Descriptor->Sacl = (PACL)((ULONG_PTR)Current - (ULONG_PTR)Descriptor); + RtlCopyMemory((PUCHAR)Descriptor + Current, Sacl, SaclLength); + Descriptor->Sacl = Current; Current += SaclLength; } if (DaclLength != 0) { - RtlCopyMemory((PVOID)Current, - Dacl, - DaclLength); - Descriptor->Dacl = (PACL)((ULONG_PTR)Current - (ULONG_PTR)Descriptor); + RtlCopyMemory((PUCHAR)Descriptor + Current, Dacl, DaclLength); + Descriptor->Dacl = Current; Current += DaclLength; } if (OwnerLength != 0) { - RtlCopyMemory((PVOID)Current, - Owner, - OwnerLength); - Descriptor->Owner = (PSID)((ULONG_PTR)Current - (ULONG_PTR)Descriptor); + RtlCopyMemory((PUCHAR)Descriptor + Current, Owner, OwnerLength); + Descriptor->Owner = Current; Current += OwnerLength; DPRINT("Owner of %x at %x\n", Descriptor, Descriptor->Owner); } @@ -1509,10 +1437,8 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, if (GroupLength != 0) { - memmove((PVOID)Current, - Group, - GroupLength); - Descriptor->Group = (PSID)((ULONG_PTR)Current - (ULONG_PTR)Descriptor); + RtlCopyMemory((PUCHAR)Descriptor + Current, Group, GroupLength); + Descriptor->Group = Current; } /* Unlock subject context */ From 440561287ca0ebcd1e15878ed5f8f1ca91cfb8b4 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 5 Feb 2012 18:41:37 +0000 Subject: [PATCH 222/289] [NTOSKRNL] - Modify MiRosTakeOverPebTebRanges to only create a memory area for the shared user page and rename it to MiRosTakeOverSharedUserPage. Previously it was creating a memory area for the whole region from USER_SHARED_DATA up to MM_HIGHEST_USER_ADDRESS, which is the majority of the x64 user mode address space and doesn't even contain the PEB/TEB. Those are allocated below the shared user page and get their memory areas created in MiInsertNode. - Add amd64 versions of MmGetPageTableForProcess, MmUnmapPageTable, MmGetPageFileMapping svn path=/trunk/; revision=55438 --- reactos/ntoskrnl/mm/ARM3/procsup.c | 9 ++++--- reactos/ntoskrnl/mm/amd64/page.c | 38 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index 6356f933fa0..a9928dcf6cf 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -24,7 +24,7 @@ PMMWSL MmWorkingSetList; VOID NTAPI -MiRosTakeOverPebTebRanges(IN PEPROCESS Process) +MiRosTakeOverSharedUserPage(IN PEPROCESS Process) { NTSTATUS Status; PMEMORY_AREA MemoryArea; @@ -35,8 +35,7 @@ MiRosTakeOverPebTebRanges(IN PEPROCESS Process) Status = MmCreateMemoryArea(&Process->Vm, MEMORY_AREA_OWNED_BY_ARM3, &AllocatedBase, - ((ULONG_PTR)MM_HIGHEST_USER_ADDRESS - 1) - - (ULONG_PTR)USER_SHARED_DATA, + PAGE_SIZE, PAGE_READWRITE, &MemoryArea, TRUE, @@ -1002,7 +1001,7 @@ MmInitializeProcessAddressSpace(IN PEPROCESS Process, KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); /* Lock the VAD, ARM3-owned ranges away */ - MiRosTakeOverPebTebRanges(Process); + MiRosTakeOverSharedUserPage(Process); /* Check if there's a Section Object */ if (SectionObject) @@ -1102,7 +1101,7 @@ INIT_FUNCTION MmInitializeHandBuiltProcess2(IN PEPROCESS Process) { /* Lock the VAD, ARM3-owned ranges away */ - MiRosTakeOverPebTebRanges(Process); + MiRosTakeOverSharedUserPage(Process); return STATUS_SUCCESS; } diff --git a/reactos/ntoskrnl/mm/amd64/page.c b/reactos/ntoskrnl/mm/amd64/page.c index 485919bffac..ea245533f06 100644 --- a/reactos/ntoskrnl/mm/amd64/page.c +++ b/reactos/ntoskrnl/mm/amd64/page.c @@ -336,6 +336,44 @@ MmIsPageSwapEntry(PEPROCESS Process, PVOID Address) return Pte.u.Hard.Valid && Pte.u.Soft.Transition; } +static PMMPTE +MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) +{ + __debugbreak(); + return 0; +} + +BOOLEAN MmUnmapPageTable(PMMPTE Pt) +{ + ASSERT(FALSE); + return 0; +} + +static ULONG64 MmGetPageEntryForProcess(PEPROCESS Process, PVOID Address) +{ + MMPTE Pte, *PointerPte; + + PointerPte = MmGetPageTableForProcess(Process, Address, FALSE); + if (PointerPte) + { + Pte = *PointerPte; + MmUnmapPageTable(PointerPte); + return Pte.u.Long; + } + return 0; +} + +VOID +NTAPI +MmGetPageFileMapping( + PEPROCESS Process, + PVOID Address, + SWAPENTRY* SwapEntry) +{ + ULONG64 Entry = MmGetPageEntryForProcess(Process, Address); + *SwapEntry = Entry >> 1; +} + BOOLEAN NTAPI MmIsDirtyPage(PEPROCESS Process, PVOID Address) From a423f34284f8da630fcb707400f0fddbf46436fc Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 5 Feb 2012 20:21:22 +0000 Subject: [PATCH 223/289] [win32k] - load gpsi->dtCaretBlink and g_PaintDesktopVersion in sysparams.c - Rename IntGdiGetLanguageID to UserGetLanguageID - Remove some unused functions and definitions svn path=/trunk/; revision=55439 --- .../subsystems/win32/win32k/include/desktop.h | 5 - .../subsystems/win32/win32k/include/hotkey.h | 2 - .../subsystems/win32/win32k/include/misc.h | 2 +- .../subsystems/win32/win32k/include/ntuser.h | 1 + .../win32/win32k/include/sysparams.h | 1 + .../subsystems/win32/win32k/include/winsta.h | 7 -- .../subsystems/win32/win32k/main/dllmain.c | 38 +----- .../subsystems/win32/win32k/ntuser/caret.c | 115 +----------------- .../subsystems/win32/win32k/ntuser/desktop.c | 44 ------- .../subsystems/win32/win32k/ntuser/hotkey.c | 14 --- .../subsystems/win32/win32k/ntuser/input.c | 3 - reactos/subsystems/win32/win32k/ntuser/misc.c | 2 +- .../subsystems/win32/win32k/ntuser/ntuser.c | 2 +- .../win32/win32k/ntuser/sysparams.c | 9 +- .../subsystems/win32/win32k/ntuser/winsta.c | 6 - 15 files changed, 20 insertions(+), 231 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/desktop.h b/reactos/subsystems/win32/win32k/include/desktop.h index 92635b05bc4..0a9f6ae2010 100644 --- a/reactos/subsystems/win32/win32k/include/desktop.h +++ b/reactos/subsystems/win32/win32k/include/desktop.h @@ -43,7 +43,6 @@ extern PDESKTOP InputDesktop; extern HDESK InputDesktopHandle; extern PCLS DesktopWindowClass; extern HDC ScreenDeviceContext; -extern BOOL g_PaintDesktopVersion; typedef struct _SHELL_HOOK_WINDOW { @@ -56,9 +55,6 @@ NTSTATUS NTAPI InitDesktopImpl(VOID); -NTSTATUS FASTCALL -CleanupDesktopImpl(VOID); - NTSTATUS APIENTRY IntDesktopObjectParse(IN PVOID ParseObject, @@ -121,7 +117,6 @@ IntParseDesktopPath(PEPROCESS Process, HWINSTA *hWinSta, HDESK *hDesktop); -BOOL FASTCALL IntDesktopUpdatePerUserSettings(BOOL bEnable); VOID APIENTRY UserRedrawDesktop(VOID); BOOL IntRegisterShellHookWindow(HWND hWnd); BOOL IntDeRegisterShellHookWindow(HWND hWnd); diff --git a/reactos/subsystems/win32/win32k/include/hotkey.h b/reactos/subsystems/win32/win32k/include/hotkey.h index 44107ab789f..89fa7d002a5 100644 --- a/reactos/subsystems/win32/win32k/include/hotkey.h +++ b/reactos/subsystems/win32/win32k/include/hotkey.h @@ -16,8 +16,6 @@ typedef struct _HOT_KEY #define IDHK_WINKEY -7 #define IDHK_REACTOS -8 -INIT_FUNCTION NTSTATUS NTAPI InitHotkeyImpl(VOID); - VOID FASTCALL UnregisterWindowHotKeys(PWND Window); VOID FASTCALL UnregisterThreadHotKeys(struct _ETHREAD *pThread); BOOL NTAPI co_UserProcessHotKeys(WORD wVk, BOOL bIsDown); diff --git a/reactos/subsystems/win32/win32k/include/misc.h b/reactos/subsystems/win32/win32k/include/misc.h index e5be2bde9b4..addd2591806 100644 --- a/reactos/subsystems/win32/win32k/include/misc.h +++ b/reactos/subsystems/win32/win32k/include/misc.h @@ -23,7 +23,7 @@ extern BOOL APIENTRY IntEngLeave(PINTENG_ENTER_LEAVE EnterLeave); extern HGDIOBJ StockObjects[]; extern SHORT gusLanguageID; -SHORT FASTCALL IntGdiGetLanguageID(VOID); +SHORT FASTCALL UserGetLanguageID(VOID); VOID FASTCALL IntUserManualGuiCheck(LONG Check); PVOID APIENTRY HackSecureVirtualMemory(IN PVOID,IN SIZE_T,IN ULONG,OUT PVOID *); VOID APIENTRY HackUnsecureVirtualMemory(IN PVOID); diff --git a/reactos/subsystems/win32/win32k/include/ntuser.h b/reactos/subsystems/win32/win32k/include/ntuser.h index e932d3f760d..b0f0b043ad6 100644 --- a/reactos/subsystems/win32/win32k/include/ntuser.h +++ b/reactos/subsystems/win32/win32k/include/ntuser.h @@ -11,6 +11,7 @@ extern PSERVERINFO gpsi; extern PTHREADINFO gptiCurrent; +extern PPROCESSINFO ppiScrnSaver; INIT_FUNCTION NTSTATUS NTAPI InitUserImpl(VOID); VOID FASTCALL CleanupUserImpl(VOID); diff --git a/reactos/subsystems/win32/win32k/include/sysparams.h b/reactos/subsystems/win32/win32k/include/sysparams.h index abd7d59acc1..665c75ca3c1 100644 --- a/reactos/subsystems/win32/win32k/include/sysparams.h +++ b/reactos/subsystems/win32/win32k/include/sysparams.h @@ -175,6 +175,7 @@ typedef union _SPIBUFFER } SPIBUFFER; extern SPIVALUES gspv; +extern BOOL g_PaintDesktopVersion; BOOL InitSysParams(); diff --git a/reactos/subsystems/win32/win32k/include/winsta.h b/reactos/subsystems/win32/win32k/include/winsta.h index d536f965a29..7fda4ab0f39 100644 --- a/reactos/subsystems/win32/win32k/include/winsta.h +++ b/reactos/subsystems/win32/win32k/include/winsta.h @@ -74,13 +74,6 @@ NTSTATUS NTAPI InitWindowStationImpl(VOID); -NTSTATUS FASTCALL -CleanupWindowStationImpl(VOID); - -NTSTATUS -APIENTRY -IntWinStaObjectOpen(PWIN32_OPENMETHOD_PARAMETERS Parameters); - VOID APIENTRY IntWinStaObjectDelete(PWIN32_DELETEMETHOD_PARAMETERS Parameters); diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index b67a92d0117..0c7fff08457 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -454,41 +454,6 @@ leave: return Status; } -NTSTATUS -Win32kInitWin32Thread(PETHREAD Thread) -{ - PEPROCESS Process; - - Process = Thread->ThreadsProcess; - - if (Process->Win32Process == NULL) - { - /* FIXME: Lock the process */ - Process->Win32Process = ExAllocatePoolWithTag(NonPagedPool, sizeof(PROCESSINFO), USERTAG_PROCESSINFO); - - if (Process->Win32Process == NULL) - return STATUS_NO_MEMORY; - - RtlZeroMemory(Process->Win32Process, sizeof(PROCESSINFO)); - /* FIXME: Unlock the process */ - - Win32kProcessCallback(Process, TRUE); - } - - if (Thread->Tcb.Win32Thread == NULL) - { - Thread->Tcb.Win32Thread = ExAllocatePoolWithTag(NonPagedPool, sizeof(THREADINFO), USERTAG_THREADINFO); - if (Thread->Tcb.Win32Thread == NULL) - return STATUS_NO_MEMORY; - - RtlZeroMemory(Thread->Tcb.Win32Thread, sizeof(THREADINFO)); - - Win32kThreadCallback(Thread, PsW32ThreadCalloutInitialize); - } - - return(STATUS_SUCCESS); -} - #ifdef _M_IX86 C_ASSERT(sizeof(SERVERINFO) <= PAGE_SIZE); #endif @@ -588,7 +553,6 @@ DriverEntry( NT_ROF(InitDeviceImpl()); NT_ROF(InitDcImpl()); NT_ROF(InitUserImpl()); - NT_ROF(InitHotkeyImpl()); NT_ROF(InitWindowStationImpl()); NT_ROF(InitDesktopImpl()); NT_ROF(InitInputImpl()); @@ -603,7 +567,7 @@ DriverEntry( return Status; } - gusLanguageID = IntGdiGetLanguageID(); + gusLanguageID = UserGetLanguageID(); return STATUS_SUCCESS; } diff --git a/reactos/subsystems/win32/win32k/ntuser/caret.c b/reactos/subsystems/win32/win32k/ntuser/caret.c index 10a84336404..7ab4db11503 100644 --- a/reactos/subsystems/win32/win32k/ntuser/caret.c +++ b/reactos/subsystems/win32/win32k/ntuser/caret.c @@ -13,9 +13,6 @@ DBG_DEFAULT_CHANNEL(UserCaret); #define MIN_CARETBLINKRATE 100 #define MAX_CARETBLINKRATE 10000 -#define DEFAULT_CARETBLINKRATE 530 -#define CARET_REGKEY L"\\Registry\\User\\.Default\\Control Panel\\Desktop" -#define CARET_VALUENAME L"CursorBlinkRate" /* FUNCTIONS *****************************************************************/ @@ -60,117 +57,19 @@ BOOL FASTCALL IntSetCaretBlinkTime(UINT uMSeconds) { /* Don't save the new value to the registry! */ - PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); - PWINSTATION_OBJECT WinStaObject = pti->rpdesk->rpwinstaParent; /* Windows doesn't do this check */ if((uMSeconds < MIN_CARETBLINKRATE) || (uMSeconds > MAX_CARETBLINKRATE)) { EngSetLastError(ERROR_INVALID_PARAMETER); - ObDereferenceObject(WinStaObject); return FALSE; } - WinStaObject->CaretBlinkRate = uMSeconds; gpsi->dtCaretBlink = uMSeconds; return TRUE; } -static -UINT FASTCALL -IntQueryCaretBlinkRate(VOID) -{ - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(CARET_REGKEY); - UNICODE_STRING ValueName = RTL_CONSTANT_STRING(CARET_VALUENAME); - NTSTATUS Status; - HANDLE KeyHandle = NULL; - OBJECT_ATTRIBUTES KeyAttributes; - PKEY_VALUE_PARTIAL_INFORMATION KeyValuePartialInfo; - ULONG Length = 0; - ULONG ResLength = 0; - ULONG Val = 0; - - InitializeObjectAttributes(&KeyAttributes, &KeyName, OBJ_CASE_INSENSITIVE, - NULL, NULL); - - Status = ZwOpenKey(&KeyHandle, KEY_READ, &KeyAttributes); - if(!NT_SUCCESS(Status)) - { - return 0; - } - - Status = ZwQueryValueKey(KeyHandle, &ValueName, KeyValuePartialInformation, - 0, 0, &ResLength); - if((Status != STATUS_BUFFER_TOO_SMALL)) - { - NtClose(KeyHandle); - return 0; - } - - ResLength += sizeof(KEY_VALUE_PARTIAL_INFORMATION); - KeyValuePartialInfo = ExAllocatePoolWithTag(PagedPool, ResLength, TAG_STRING); - Length = ResLength; - - if(!KeyValuePartialInfo) - { - NtClose(KeyHandle); - return 0; - } - - Status = ZwQueryValueKey(KeyHandle, &ValueName, KeyValuePartialInformation, - (PVOID)KeyValuePartialInfo, Length, &ResLength); - if(!NT_SUCCESS(Status) || (KeyValuePartialInfo->Type != REG_SZ)) - { - NtClose(KeyHandle); - ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING); - return 0; - } - - ValueName.Length = KeyValuePartialInfo->DataLength; - ValueName.MaximumLength = KeyValuePartialInfo->DataLength; - ValueName.Buffer = (PWSTR)KeyValuePartialInfo->Data; - - Status = RtlUnicodeStringToInteger(&ValueName, 0, &Val); - if(!NT_SUCCESS(Status)) - { - Val = 0; - } - - ExFreePoolWithTag(KeyValuePartialInfo, TAG_STRING); - NtClose(KeyHandle); - - return (UINT)Val; -} - -static -UINT FASTCALL -IntGetCaretBlinkTime(VOID) -{ - PTHREADINFO pti; - PWINSTATION_OBJECT WinStaObject; - UINT Ret; - - pti = PsGetCurrentThreadWin32Thread(); - WinStaObject = pti->rpdesk->rpwinstaParent; - - Ret = WinStaObject->CaretBlinkRate; - if(!Ret) - { - /* Load it from the registry the first call only! */ - Ret = WinStaObject->CaretBlinkRate = IntQueryCaretBlinkRate(); - } - - /* Windows doesn't do this check */ - if((Ret < MIN_CARETBLINKRATE) || (Ret > MAX_CARETBLINKRATE)) - { - Ret = DEFAULT_CARETBLINKRATE; - } - - return Ret; -} - - BOOL FASTCALL co_IntSetCaretPos(int X, int Y) { @@ -191,7 +90,7 @@ co_IntSetCaretPos(int X, int Y) ThreadQueue->CaretInfo->Pos.x = X; ThreadQueue->CaretInfo->Pos.y = Y; co_IntSendMessage(ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0); - IntSetTimer(UserGetWindowObject(ThreadQueue->CaretInfo->hWnd), IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TMRF_SYSTEM); + IntSetTimer(UserGetWindowObject(ThreadQueue->CaretInfo->hWnd), IDCARETTIMER, gpsi->dtCaretBlink, NULL, TMRF_SYSTEM); IntNotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, pWnd, OBJID_CARET, CHILDID_SELF, 0); } return TRUE; @@ -308,7 +207,7 @@ BOOL FASTCALL co_UserShowCaret(PWND Window OPTIONAL) co_IntSendMessage(ThreadQueue->CaretInfo->hWnd, WM_SYSTIMER, IDCARETTIMER, 0); IntNotifyWinEvent(EVENT_OBJECT_SHOW, pWnd, OBJID_CARET, OBJID_CARET, 0); } - IntSetTimer(UserGetWindowObject(ThreadQueue->CaretInfo->hWnd), IDCARETTIMER, IntGetCaretBlinkTime(), NULL, TMRF_SYSTEM); + IntSetTimer(UserGetWindowObject(ThreadQueue->CaretInfo->hWnd), IDCARETTIMER, gpsi->dtCaretBlink, NULL, TMRF_SYSTEM); } return TRUE; } @@ -387,17 +286,15 @@ UINT APIENTRY NtUserGetCaretBlinkTime(VOID) { - DECLARE_RETURN(UINT); + UINT ret; - TRACE("Enter NtUserGetCaretBlinkTime\n"); UserEnterShared(); - RETURN(IntGetCaretBlinkTime()); + ret = gpsi->dtCaretBlink; -CLEANUP: - TRACE("Leave NtUserGetCaretBlinkTime, ret=%i\n",_ret_); UserLeave(); - END_CLEANUP; + + return ret; } BOOL diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index b699287e39f..55dd8f83294 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -23,7 +23,6 @@ IntFreeDesktopHeap( PDESKTOP InputDesktop = NULL; HDESK InputDesktopHandle = NULL; HDC ScreenDeviceContext = NULL; -BOOL g_PaintDesktopVersion = FALSE; GENERIC_MAPPING IntDesktopMapping = { @@ -197,13 +196,6 @@ InitDesktopImpl(VOID) return STATUS_SUCCESS; } -NTSTATUS -FASTCALL -CleanupDesktopImpl(VOID) -{ - return STATUS_SUCCESS; -} - static int GetSystemVersionString(LPWSTR buffer) { RTL_OSVERSIONINFOEXW versionInfo; @@ -569,42 +561,6 @@ HWND FASTCALL IntGetCurrentThreadDesktopWindow(VOID) return pdo->DesktopWindow; } -BOOL FASTCALL IntDesktopUpdatePerUserSettings(BOOL bEnable) -{ - if (bEnable) - { - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - NTSTATUS Status; - - RtlZeroMemory(QueryTable, sizeof(QueryTable)); - - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT; - QueryTable[0].Name = L"PaintDesktopVersion"; - QueryTable[0].EntryContext = &g_PaintDesktopVersion; - - /* Query the "PaintDesktopVersion" flag in the "Control Panel\Desktop" key */ - Status = RtlQueryRegistryValues(RTL_REGISTRY_USER, - L"Control Panel\\Desktop", - QueryTable, NULL, NULL); - if (!NT_SUCCESS(Status)) - { - TRACE("RtlQueryRegistryValues failed for PaintDesktopVersion (%x)\n", - Status); - g_PaintDesktopVersion = FALSE; - return FALSE; - } - - TRACE("PaintDesktopVersion = %d\n", g_PaintDesktopVersion); - - return TRUE; - } - else - { - g_PaintDesktopVersion = FALSE; - return TRUE; - } -} - /* PUBLIC FUNCTIONS ***********************************************************/ HDC FASTCALL diff --git a/reactos/subsystems/win32/win32k/ntuser/hotkey.c b/reactos/subsystems/win32/win32k/ntuser/hotkey.c index ff9e7430c75..e86ea0ae691 100644 --- a/reactos/subsystems/win32/win32k/ntuser/hotkey.c +++ b/reactos/subsystems/win32/win32k/ntuser/hotkey.c @@ -28,20 +28,6 @@ PHOT_KEY gphkFirst = &hkWinKey; /* FUNCTIONS *****************************************************************/ -INIT_FUNCTION -NTSTATUS -NTAPI -InitHotkeyImpl(VOID) -{ - return STATUS_SUCCESS; -} - -/*NTSTATUS FASTCALL -CleanupHotKeys(VOID) -{ - return STATUS_SUCCESS; -}*/ - /* * IntGetModifiers * diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 25a9429f5d0..8ad738cc295 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -10,9 +10,6 @@ #include DBG_DEFAULT_CHANNEL(UserInput); -extern NTSTATUS Win32kInitWin32Thread(PETHREAD Thread); -extern PPROCESSINFO ppiScrnSaver; - /* GLOBALS *******************************************************************/ PTHREADINFO ptiRawInput; diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index bd5caf8db8d..56449425c0c 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -11,7 +11,7 @@ DBG_DEFAULT_CHANNEL(UserMisc); SHORT FASTCALL -IntGdiGetLanguageID(VOID) +UserGetLanguageID(VOID) { HANDLE KeyHandle; OBJECT_ATTRIBUTES ObAttr; diff --git a/reactos/subsystems/win32/win32k/ntuser/ntuser.c b/reactos/subsystems/win32/win32k/ntuser/ntuser.c index ac602a25253..39d22439c97 100644 --- a/reactos/subsystems/win32/win32k/ntuser/ntuser.c +++ b/reactos/subsystems/win32/win32k/ntuser/ntuser.c @@ -178,7 +178,7 @@ NtUserInitialize( // InitializeGreCSRSS(); // { // Startup DxGraphics. -// calls ** IntGdiGetLanguageID() and sets it **. +// calls ** UserGetLanguageID() and sets it **. // Enables Fonts drivers, Initialize Font table & Stock Fonts. // } diff --git a/reactos/subsystems/win32/win32k/ntuser/sysparams.c b/reactos/subsystems/win32/win32k/ntuser/sysparams.c index c878b3e47e3..52773fd26f2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/sysparams.c +++ b/reactos/subsystems/win32/win32k/ntuser/sysparams.c @@ -17,6 +17,7 @@ DBG_DEFAULT_CHANNEL(UserSysparams); SPIVALUES gspv; BOOL gbSpiInitialized = FALSE; PWINSTATION_OBJECT gpwinstaCurrent = NULL; +BOOL g_PaintDesktopVersion = FALSE; // HACK! We initialize SPI before we have a proper surface to get this from. #define dpi 96 @@ -58,6 +59,8 @@ static const WCHAR* VAL_DRAGWIDTH = L"DragWidth"; static const WCHAR* VAL_FNTSMOOTH = L"FontSmoothing"; static const WCHAR* VAL_SCRLLLINES = L"WheelScrollLines"; static const WCHAR* VAL_CLICKLOCKTIME = L"ClickLockTime"; +static const WCHAR* VAL_PAINTDESKVER = L"PaintDesktopVersion"; +static const WCHAR* VAL_CARETRATE = L"CursorBlinkRate"; #if (_WIN32_WINNT >= 0x0600) static const WCHAR* VAL_SCRLLCHARS = L"WheelScrollChars"; #endif @@ -267,6 +270,7 @@ SpiUpdatePerUserSystemParameters() gspv.bDragFullWindows = SpiLoadInt(KEY_DESKTOP, VAL_DRAG, 0); gspv.iWheelScrollLines = SpiLoadInt(KEY_DESKTOP, VAL_SCRLLLINES, 3); gspv.dwMouseClickLockTime = SpiLoadDWord(KEY_DESKTOP, VAL_CLICKLOCKTIME, 1200); + gpsi->dtCaretBlink = SpiLoadInt(KEY_DESKTOP, VAL_CARETRATE, 530); gspv.dwUserPrefMask = SpiLoadUserPrefMask(UPM_DEFAULT); gspv.bMouseClickLock = (gspv.dwUserPrefMask & UPM_CLICKLOCK) != 0; gspv.bMouseCursorShadow = (gspv.dwUserPrefMask & UPM_CURSORSHADOW) != 0; @@ -320,7 +324,10 @@ NtUserUpdatePerUserSystemParameters( UserEnterExclusive(); SpiUpdatePerUserSystemParameters(); - bResult = IntDesktopUpdatePerUserSettings(bEnable); + if(bEnable) + g_PaintDesktopVersion = SpiLoadDWord(KEY_DESKTOP, VAL_PAINTDESKVER, 0); + else + g_PaintDesktopVersion = FALSE; TRACE("Leave NtUserUpdatePerUserSystemParameters, returning %d\n", bResult); UserLeave(); diff --git a/reactos/subsystems/win32/win32k/ntuser/winsta.c b/reactos/subsystems/win32/win32k/ntuser/winsta.c index eec529ef6ee..51aa4890df4 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winsta.c +++ b/reactos/subsystems/win32/win32k/ntuser/winsta.c @@ -66,12 +66,6 @@ InitWindowStationImpl(VOID) return STATUS_SUCCESS; } -NTSTATUS FASTCALL -CleanupWindowStationImpl(VOID) -{ - return STATUS_SUCCESS; -} - /* OBJECT CALLBACKS **********************************************************/ VOID APIENTRY From aac3d1876326e3658f4a34cf277f25b1816dbc75 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 5 Feb 2012 20:56:21 +0000 Subject: [PATCH 224/289] [rosautotest] - When rosautotest is launched, show how much time has past since the machine has started - Also show how much time each individual test need to complete - The purpose of this feature isn't to benchmark the os but to let us spot regressions regarding test time svn path=/trunk/; revision=55441 --- rostests/rosautotest/CWineTest.cpp | 11 ++++++++++- rostests/rosautotest/main.cpp | 6 ++++++ rostests/rosautotest/precomp.h | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/rostests/rosautotest/CWineTest.cpp b/rostests/rosautotest/CWineTest.cpp index 976343b8296..f5dbd6bdcf2 100644 --- a/rostests/rosautotest/CWineTest.cpp +++ b/rostests/rosautotest/CWineTest.cpp @@ -263,11 +263,15 @@ CWineTest::RunTest(CTestInfo* TestInfo) bool BreakLoop = false; DWORD BytesAvailable; DWORD Temp; - stringstream ss; + stringstream ss, ssFinish; + DWORD StartTime = GetTickCount(); + float TotalTime; ss << "Running Wine Test, Module: " << TestInfo->Module << ", Test: " << TestInfo->Test << endl; StringOut(ss.str()); + StartTime = GetTickCount(); + { /* Execute the test */ CProcess Process(TestInfo->CommandLine, &m_StartupInfo); @@ -305,6 +309,11 @@ CWineTest::RunTest(CTestInfo* TestInfo) } while(!BreakLoop); } + + TotalTime = ((float)GetTickCount() - StartTime)/1000; + ssFinish << "Test " << TestInfo->Test << " completed in "; + ssFinish << setprecision(2) << fixed << TotalTime << " seconds." << endl; + StringOut(ssFinish.str()); } /** diff --git a/rostests/rosautotest/main.cpp b/rostests/rosautotest/main.cpp index 5fb5dd4c297..d9cdb37d828 100644 --- a/rostests/rosautotest/main.cpp +++ b/rostests/rosautotest/main.cpp @@ -51,11 +51,17 @@ wmain(int argc, wchar_t* argv[]) try { + stringstream ss; + /* Set up the configuration */ Configuration.ParseParameters(argc, argv); Configuration.GetSystemInformation(); Configuration.GetConfigurationFromFile(); + ss << "\n\nSystem uptime " << setprecision(2) << fixed ; + ss << ((float)GetTickCount()/1000) << " seconds\n"; + StringOut(ss.str()); + /* Run the tests */ WineTest.Run(); diff --git a/rostests/rosautotest/precomp.h b/rostests/rosautotest/precomp.h index f5e65ad0798..d70ae88f8dc 100644 --- a/rostests/rosautotest/precomp.h +++ b/rostests/rosautotest/precomp.h @@ -4,6 +4,7 @@ #include #include #include +#include using namespace std; From a10e76cc381cf1b0ecd3d3aab107fee82a2fd44b Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sun, 5 Feb 2012 21:15:01 +0000 Subject: [PATCH 225/289] Massive rapps update. Almost anything revisited and corrected. svn path=/trunk/; revision=55442 --- .../base/applications/rapps/rapps/7zip.txt | 2 +- .../base/applications/rapps/rapps/abiword.txt | 2 +- .../applications/rapps/rapps/abiword28x.txt | 2 +- .../base/applications/rapps/rapps/abyss.txt | 2 +- .../rapps/rapps/ac97forvirtualbox.txt | 2 +- .../applications/rapps/rapps/audiograbber.txt | 2 +- .../applications/rapps/rapps/bittorrent.txt | 6 +-- .../applications/rapps/rapps/comctl32ocx.txt | 2 +- .../base/applications/rapps/rapps/diablo2.txt | 2 +- .../applications/rapps/rapps/dosblaster.txt | 2 +- .../base/applications/rapps/rapps/dosbox.txt | 2 +- .../rapps/rapps/doublecommander.txt | 6 +-- reactos/base/applications/rapps/rapps/fap.txt | 6 +-- .../applications/rapps/rapps/firefox2.txt | 2 +- .../applications/rapps/rapps/firefox3.txt | 2 +- .../applications/rapps/rapps/firefox36.txt | 38 +++++++++--------- .../applications/rapps/rapps/firefox5.txt | 40 +++++++++---------- .../rapps/rapps/glidewrapzbag.txt | 2 +- .../applications/rapps/rapps/irfanview.txt | 6 +-- .../rapps/rapps/irfanviewplugins.txt | 6 +-- .../base/applications/rapps/rapps/kdewin.txt | 6 +-- .../applications/rapps/rapps/lbreakout2.txt | 2 +- .../applications/rapps/rapps/lgeneral.txt | 2 +- .../applications/rapps/rapps/libreoffice.txt | 6 +-- .../applications/rapps/rapps/lmarbles.txt | 2 +- .../base/applications/rapps/rapps/mfc40.txt | 2 +- .../applications/rapps/rapps/mirandaim.txt | 4 +- .../base/applications/rapps/rapps/mirc.txt | 2 +- .../base/applications/rapps/rapps/mirc6.txt | 2 +- .../base/applications/rapps/rapps/mono2.txt | 6 +-- reactos/base/applications/rapps/rapps/mpc.txt | 6 +-- .../base/applications/rapps/rapps/msxml3.txt | 2 +- .../base/applications/rapps/rapps/net11.txt | 2 +- .../base/applications/rapps/rapps/net20.txt | 2 +- .../applications/rapps/rapps/net20sp2.txt | 2 +- .../applications/rapps/rapps/offbyone.txt | 2 +- .../rapps/rapps/openoffice2.4.txt | 12 +++--- .../rapps/rapps/openoffice3.0.txt | 12 +++--- .../base/applications/rapps/rapps/openttd.txt | 6 +-- .../base/applications/rapps/rapps/opera.txt | 6 +-- .../base/applications/rapps/rapps/opera9.txt | 2 +- .../base/applications/rapps/rapps/putty.txt | 2 +- .../base/applications/rapps/rapps/python.txt | 2 +- .../base/applications/rapps/rapps/python3.txt | 2 +- .../base/applications/rapps/rapps/remood.txt | 2 +- .../base/applications/rapps/rapps/rosbe.txt | 2 +- .../applications/rapps/rapps/rosbeamd64.txt | 2 +- .../applications/rapps/rapps/rosbearm.txt | 2 +- .../applications/rapps/rapps/sambatng.txt | 2 +- .../applications/rapps/rapps/sbforvmware.txt | 2 +- .../base/applications/rapps/rapps/scite.txt | 6 +-- .../base/applications/rapps/rapps/scummvm.txt | 6 +-- .../applications/rapps/rapps/sdl_mixer.txt | 6 +-- .../applications/rapps/rapps/sdl_runtime.txt | 6 +-- .../applications/rapps/rapps/seamonkey.txt | 30 +++++++------- .../applications/rapps/rapps/smplayer.txt | 6 +-- .../base/applications/rapps/rapps/steam.txt | 2 +- .../applications/rapps/rapps/sumatrapdf.txt | 2 +- .../applications/rapps/rapps/superfinder.txt | 2 +- .../base/applications/rapps/rapps/tahoma.txt | 2 +- .../applications/rapps/rapps/thunderbird.txt | 30 +++++++------- .../applications/rapps/rapps/thunderbird5.txt | 32 +++++++-------- .../applications/rapps/rapps/tileworld.txt | 2 +- .../applications/rapps/rapps/tuxpaint.txt | 2 +- .../applications/rapps/rapps/ultravnc.txt | 2 +- .../applications/rapps/rapps/utorrent.txt | 6 +-- .../base/applications/rapps/rapps/vb5run.txt | 2 +- .../base/applications/rapps/rapps/vb6run.txt | 2 +- .../applications/rapps/rapps/vc2008sp1run.txt | 2 +- .../base/applications/rapps/rapps/vc6run.txt | 2 +- .../applications/rapps/rapps/winboard.txt | 2 +- .../base/applications/rapps/rapps/wme9.txt | 2 +- 72 files changed, 197 insertions(+), 197 deletions(-) diff --git a/reactos/base/applications/rapps/rapps/7zip.txt b/reactos/base/applications/rapps/rapps/7zip.txt index 84da1e5ef3f..1cac16e00c5 100644 --- a/reactos/base/applications/rapps/rapps/7zip.txt +++ b/reactos/base/applications/rapps/rapps/7zip.txt @@ -5,7 +5,7 @@ Name = 7-Zip Version = 9.20 Licence = LGPL Description = Utility to create and open 7zip, zip, tar, rar and other archive files. -Size = 1.0M +Size = 1.06MB Category = 12 URLSite = http://www.7-zip.org/ URLDownload = http://ovh.dl.sourceforge.net/project/sevenzip/7-Zip/9.20/7z920.exe diff --git a/reactos/base/applications/rapps/rapps/abiword.txt b/reactos/base/applications/rapps/rapps/abiword.txt index 0357825ac2f..06057d5e8f2 100644 --- a/reactos/base/applications/rapps/rapps/abiword.txt +++ b/reactos/base/applications/rapps/rapps/abiword.txt @@ -5,7 +5,7 @@ Name = AbiWord Version = 2.6.8 Licence = GPL Description = Word processor. -Size = 5.6MB +Size = 5.64MB Category = 6 URLSite = http://www.abisource.com/ URLDownload = http://www.abisource.com/downloads/abiword/2.6.8/Windows/abiword-setup-2.6.8.exe diff --git a/reactos/base/applications/rapps/rapps/abiword28x.txt b/reactos/base/applications/rapps/rapps/abiword28x.txt index 43f914c0faa..73bc0e21577 100644 --- a/reactos/base/applications/rapps/rapps/abiword28x.txt +++ b/reactos/base/applications/rapps/rapps/abiword28x.txt @@ -5,7 +5,7 @@ Name = AbiWord Version = 2.9.2 Licence = GPL Description = Word processor. -Size = 9.3MB +Size = 9.33MB Category = 6 URLSite = http://www.abisource.com/ URLDownload = http://www.abisource.com/downloads/abiword/2.9.2/Windows/abiword-setup-2.9.2.exe diff --git a/reactos/base/applications/rapps/rapps/abyss.txt b/reactos/base/applications/rapps/rapps/abyss.txt index b92fb3b4a6d..7bdec4f0f0f 100644 --- a/reactos/base/applications/rapps/rapps/abyss.txt +++ b/reactos/base/applications/rapps/rapps/abyss.txt @@ -5,7 +5,7 @@ Name = Abyss Web server X1 Version = 2.7 Licence = Freeware Description = Abyss Web Server enables you to host your Web sites on your computer. It supports secure SSL/TLS connections (HTTPS) as well as a wide range of Web technologies. It can also run advanced PHP, Perl, Python, ASP, ASP.NET, and Ruby on Rails Web applications, which can be backed by databases such as MySQL, SQLite, MS SQL Server, MS Access, or Oracle. -Size = 1.8M +Size = 1.82MB Category = 5 URLSite = http://www.aprelium.com/ URLDownload = http://www.aprelium.com/data/abwsx1.exe diff --git a/reactos/base/applications/rapps/rapps/ac97forvirtualbox.txt b/reactos/base/applications/rapps/rapps/ac97forvirtualbox.txt index d5d1b3a6da0..96cb95b6501 100644 --- a/reactos/base/applications/rapps/rapps/ac97forvirtualbox.txt +++ b/reactos/base/applications/rapps/rapps/ac97forvirtualbox.txt @@ -5,7 +5,7 @@ Name = AC97 Driver for VirtualBox Version = 5.10.00.3610 Licence = Unknown Description = Unzip in the "ReactOS" folder then restart ReactOS twice. -Size = 186kB +Size = 185.5kB Category = 13 URLSite = Unknown URLDownload = http://svn.reactos.org/packages/ac97_vbox.exe diff --git a/reactos/base/applications/rapps/rapps/audiograbber.txt b/reactos/base/applications/rapps/rapps/audiograbber.txt index 5f8ed5c0bf4..96f975fc0e3 100644 --- a/reactos/base/applications/rapps/rapps/audiograbber.txt +++ b/reactos/base/applications/rapps/rapps/audiograbber.txt @@ -5,7 +5,7 @@ Name = Audio Grabber Version = 1.83 SE Licence = Freeware Description = A very good CD Ripper/Audio File Converter. -Size = 1.6MB +Size = 3.57MB Category = 1 URLSite = http://www.audiograbber.de/ URLDownload = http://www.audiograbber.de/files/4898276276/agsetup183se.exe diff --git a/reactos/base/applications/rapps/rapps/bittorrent.txt b/reactos/base/applications/rapps/rapps/bittorrent.txt index f1e6634baa6..2ecd9a542c5 100644 --- a/reactos/base/applications/rapps/rapps/bittorrent.txt +++ b/reactos/base/applications/rapps/rapps/bittorrent.txt @@ -2,13 +2,13 @@ [Section] Name = BitTorrent -Version = 7.5 +Version = 7.6 Licence = Freeware for non-commercial uses Description = The Original BitTorrent Client. -Size = 539K +Size = 5.78M Category = 5 URLSite = http://www.bittorrent.com/ -URLDownload = http://download.bittorrent.com/dl/BitTorrent-7.5.exe +URLDownload = http://download.bittorrent.com/dl/BitTorrent-7.6.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/comctl32ocx.txt b/reactos/base/applications/rapps/rapps/comctl32ocx.txt index 47494f3fb43..d3effbc56d7 100644 --- a/reactos/base/applications/rapps/rapps/comctl32ocx.txt +++ b/reactos/base/applications/rapps/rapps/comctl32ocx.txt @@ -5,7 +5,7 @@ Name = Microsoft Visual Basic 6.0 Common Controls Version = 6.0 Licence = Unknown Description = File needed by some applications. Contains: comctl32.ocx, mscomctl.ocx, advpack.dll. -Size = 914kB +Size = 913.73kB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyID=25437D98-51D0-41C1-BB14-64662F5F62FE&displaylang=en URLDownload = http://download.microsoft.com/download/3/a/5/3a5925ac-e779-4b1c-bb01-af67dc2f96fc/VisualBasic6-KB896559-v1-ENU.exe diff --git a/reactos/base/applications/rapps/rapps/diablo2.txt b/reactos/base/applications/rapps/rapps/diablo2.txt index 90538d0b5a7..25c647da894 100644 --- a/reactos/base/applications/rapps/rapps/diablo2.txt +++ b/reactos/base/applications/rapps/rapps/diablo2.txt @@ -5,7 +5,7 @@ Name = Diablo II Version = 1.4 Licence = Shareware Description = Diablo 2 Shareware. zeckensack's glide wrapper is required to run it. -Size = 132MB +Size = 131.9MB Category = 4 URLSite = http://www.blizzard.com/diablo2/ URLDownload = http://pub.zoneofgames.ru/demos/diabloiidemo.exe diff --git a/reactos/base/applications/rapps/rapps/dosblaster.txt b/reactos/base/applications/rapps/rapps/dosblaster.txt index 022294c295b..c0a7fbac4e7 100644 --- a/reactos/base/applications/rapps/rapps/dosblaster.txt +++ b/reactos/base/applications/rapps/rapps/dosblaster.txt @@ -5,7 +5,7 @@ Name = DosBlaster Version = 2.5 Licence = GPL Description = DosBlaster is a Shell extension which makes it possible to open any DOS executabe in DOSBox via right click. This version contains DOSBox 0.70, but can be simply updated by installing a newer DOSBox into the DosBlaster folders. -Size = 2.1MB +Size = 2.05MB Category = 15 URLSite = http://dosblaster.sourceforge.net/ URLDownload = http://surfnet.dl.sourceforge.net/project/dosblaster/DosBlaster%202.5%20%28x86%29/Downloads/DosbasterSetup_2_5.exe diff --git a/reactos/base/applications/rapps/rapps/dosbox.txt b/reactos/base/applications/rapps/rapps/dosbox.txt index 3c10329fab5..1dd0ef04981 100644 --- a/reactos/base/applications/rapps/rapps/dosbox.txt +++ b/reactos/base/applications/rapps/rapps/dosbox.txt @@ -5,7 +5,7 @@ Name = DOSBox Version = 0.74 Licence = GPL Description = DOSBox is a DOS emulator. -Size = 1.4MB +Size = 1.38MB Category = 15 URLSite = http://www.dosbox.com/ URLDownload = http://ovh.dl.sourceforge.net/project/dosbox/dosbox/0.74/DOSBox0.74-win32-installer.exe diff --git a/reactos/base/applications/rapps/rapps/doublecommander.txt b/reactos/base/applications/rapps/rapps/doublecommander.txt index ef2389fdb39..041cbcb3cb1 100644 --- a/reactos/base/applications/rapps/rapps/doublecommander.txt +++ b/reactos/base/applications/rapps/rapps/doublecommander.txt @@ -2,13 +2,13 @@ [Section] Name = Double Commander -Version = 0.5.1 +Version = 0.5.3 Licence = GPL Description = Double Commander is an open source file manager with two panels side by side. You need 7-Zip or a similar Utility to extract it. -Size = 6.4MB +Size = 6.5MB Category = 12 URLSite = http://doublecmd.sourceforge.net/ -URLDownload = http://garr.dl.sourceforge.net/project/doublecmd/DC%20for%20Windows%2032%20bit/Double%20Commander%200.5.1%20beta/doublecmd-0.5.1.i386-win32.exe +URLDownload = http://freefr.dl.sourceforge.net/project/doublecmd/DC%20for%20Windows%2032%20bit/Double%20Commander%200.5.3%20beta/doublecmd-0.5.3.i386-win32.exe CDPath = none [Section.0415] diff --git a/reactos/base/applications/rapps/rapps/fap.txt b/reactos/base/applications/rapps/rapps/fap.txt index c08fea3eeb3..ee15acd2397 100644 --- a/reactos/base/applications/rapps/rapps/fap.txt +++ b/reactos/base/applications/rapps/rapps/fap.txt @@ -2,13 +2,13 @@ [Section] Name = Fox Audio Player -Version = 0.8.8 +Version = 0.9.0 Licence = GPL Description = Simple and lightweight audio player. -Size = 1.85MB +Size = 1.86MB Category = 1 URLSite = http://foxaudioplayer.sourceforge.net/ -URLDownload = http://svn.reactos.org/packages/fap-0.8.8-win32-bin.exe +URLDownload = http://svn.reactos.org/packages/fap-0.9.0-win32-bin.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/firefox2.txt b/reactos/base/applications/rapps/rapps/firefox2.txt index fa3df59fef7..f04e3eba373 100644 --- a/reactos/base/applications/rapps/rapps/firefox2.txt +++ b/reactos/base/applications/rapps/rapps/firefox2.txt @@ -5,7 +5,7 @@ Name = Mozilla Firefox 2.0 Version = 2.0.0.20 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Web Browsers out there. -Size = 5.8M +Size = 5.77MB Category = 5 URLSite = http://www.mozilla.com/en-US/ URLDownload = http://svn.reactos.org/packages/Firefox%20Setup%202.0.0.20.exe diff --git a/reactos/base/applications/rapps/rapps/firefox3.txt b/reactos/base/applications/rapps/rapps/firefox3.txt index 1e07d384faf..3647f9d12cf 100644 --- a/reactos/base/applications/rapps/rapps/firefox3.txt +++ b/reactos/base/applications/rapps/rapps/firefox3.txt @@ -5,7 +5,7 @@ Name = Mozilla Firefox 3.0 Version = 3.0.19 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Web Browsers out there. -Size = 7.2M +Size = 7.16MB Category = 5 URLSite = http://www.mozilla.com/en-US/ URLDownload = http://svn.reactos.org/packages/Firefox%20Setup%203.0.19.exe diff --git a/reactos/base/applications/rapps/rapps/firefox36.txt b/reactos/base/applications/rapps/rapps/firefox36.txt index 23ff22553f0..164d066e6b4 100644 --- a/reactos/base/applications/rapps/rapps/firefox36.txt +++ b/reactos/base/applications/rapps/rapps/firefox36.txt @@ -2,59 +2,59 @@ [Section] Name = Mozilla Firefox 3.6 -Version = 3.6.25 +Version = 3.6.26 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Web Browsers out there. -Size = 7.5M +Size = 8.22MB Category = 5 URLSite = http://www.mozilla.com/en-US/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/en-US/Firefox%20Setup%203.6.25.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/en-US/Firefox%20Setup%203.6.26.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Webbrowser. -Size = 7.4M +Size = 8.06MB URLSite = http://www.mozilla-europe.org/de/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/de/Firefox%20Setup%203.6.25.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/de/Firefox%20Setup%203.6.26.exe [Section.040a] Description = El más popular y uno de los mejores navegadores web gratuitos que hay. -Size = 7.4M +Size = 8.05MB URLSite = http://www.mozilla-europe.org/es/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/es-ES/Firefox%20Setup%203.6.25.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/es-ES/Firefox%20Setup%203.6.26.exe [Section.040c] Description = Le navigateur web gratuit le plus populaire et l'un des meilleurs. -Size = 7.6M +Size = 8.28MB URLSite = http://www.mozilla-europe.org/fr/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/fr/Firefox%20Setup%203.6.25.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/fr/Firefox%20Setup%203.6.26.exe [Section.0414] Description = Mest populære og best ogsÃ¥ gratis nettleserene der ute. -Size = 7.4M +Size = 8.06MB URLSite = http://www.mozilla-europe.org/no/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/nb-NO/Firefox%20Setup%203.6.25.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/nb-NO/Firefox%20Setup%203.6.26.exe [Section.0415] Description = Najpopularniejsza i jedna z najlepszych darmowych przeglÄ…darek internetowych. -Size = 8.2M +Size = 8.9MB URLSite = http://www.mozilla-europe.org/pl/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/pl/Firefox%20Setup%203.6.25.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/pl/Firefox%20Setup%203.6.26.exe [Section.0419] Description = Один из Ñамых популÑрных и лучших беÑплатных браузеров. -Size = 7.8M +Size = 8.46MB URLSite = http://www.mozilla-europe.org/ru/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/ru/Firefox%20Setup%203.6.25.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/ru/Firefox%20Setup%203.6.26.exe [Section.041b] Description = Najpopulárnejší a jeden z najlepších slobodný webových prehliadaÄov. -Size = 7.8MB +Size = 8.53MB URLSite = http://www.mozilla-europe.org/sk/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/sk/Firefox%20Setup%203.6.25.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/sk/Firefox%20Setup%203.6.26.exe [Section.0422] Description = ÐайпопулÑрніший та один з кращих безплатних веб-браузерів. -Size = 7.7M +Size = 8.44MB URLSite = http://www.mozilla-europe.org/uk/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/uk/Firefox%20Setup%203.6.25.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.6/win32/uk/Firefox%20Setup%203.6.26.exe diff --git a/reactos/base/applications/rapps/rapps/firefox5.txt b/reactos/base/applications/rapps/rapps/firefox5.txt index 675cc605d4b..fed93aac195 100644 --- a/reactos/base/applications/rapps/rapps/firefox5.txt +++ b/reactos/base/applications/rapps/rapps/firefox5.txt @@ -1,60 +1,60 @@ ; UTF-8 [Section] -Name = Mozilla Firefox 9 -Version = 9.0.1 +Name = Mozilla Firefox 10 +Version = 10.0 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Web Browsers out there. -Size = 14.6M +Size = 15.06MB Category = 5 URLSite = http://www.mozilla.com/en-US/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-9.0/win32/en-US/Firefox%20Setup%209.0.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/10.0/win32/en-US/Firefox%20Setup%2010.0.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Webbrowser. -Size = 14.4M +Size = 14.92MB URLSite = http://www.mozilla-europe.org/de/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-9.0/win32/de/Firefox%20Setup%209.0.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/10.0/win32/de/Firefox%20Setup%2010.0.exe [Section.040a] Description = El más popular y uno de los mejores navegadores web gratuitos que hay. -Size = 14.4M +Size = 14.88MB URLSite = http://www.mozilla-europe.org/es/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-9.0/win32/es-ES/Firefox%20Setup%209.0.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/10.0/win32/es-ES/Firefox%20Setup%2010.0.exe [Section.040c] Description = Le navigateur web gratuit le plus populaire et l'un des meilleurs. -Size = 14.7M +Size = 15.18MB URLSite = http://www.mozilla-europe.org/fr/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-9.0/win32/fr/Firefox%20Setup%209.0.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/10.0/win32/fr/Firefox%20Setup%2010.0.exe [Section.0414] Description = Mest populære og best ogsÃ¥ gratis nettleserene der ute. -Size = 14.4M +Size = 14.91MB URLSite = http://www.mozilla-europe.org/no/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-9.0/win32/nb-NO/Firefox%20Setup%209.0.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/10.0/win32/nb-NO/Firefox%20Setup%2010.0.exe [Section.0415] Description = Najpopularniejsza i jedna z najlepszych darmowych przeglÄ…darek internetowych. -Size = 15.3M +Size = 15.76MB URLSite = http://www.mozilla-europe.org/pl/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-9.0/win32/pl/Firefox%20Setup%209.0.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/10.0/win32/pl/Firefox%20Setup%2010.0.exe [Section.0419] Description = Один из Ñамых популÑрных и лучших беÑплатных браузеров. -Size = 14.8M +Size = 15.33MB URLSite = http://www.mozilla-europe.org/ru/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-9.0/win32/ru/Firefox%20Setup%209.0.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/10.0/win32/ru/Firefox%20Setup%2010.0.exe [Section.041b] Description = Najpopulárnejší a jeden z najlepších slobodný webových prehliadaÄov. -Size = 15.1MB +Size = 15.57MB URLSite = http://www.mozilla-europe.org/sk/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-9.0/win32/sk/Firefox%20Setup%209.0.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/10.0/win32/sk/Firefox%20Setup%2010.0.exe [Section.0422] Description = ÐайпопулÑрніший та один з кращих безплатних веб-браузерів. -Size = 14.8M +Size = 15.32MB URLSite = http://www.mozilla-europe.org/uk/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-9.0/win32/uk/Firefox%20Setup%209.0.1.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/10.0/win32/uk/Firefox%20Setup%2010.0.exe diff --git a/reactos/base/applications/rapps/rapps/glidewrapzbag.txt b/reactos/base/applications/rapps/rapps/glidewrapzbag.txt index e8024abfca8..d3bce11ca92 100644 --- a/reactos/base/applications/rapps/rapps/glidewrapzbag.txt +++ b/reactos/base/applications/rapps/rapps/glidewrapzbag.txt @@ -5,7 +5,7 @@ Name = GlidewrapZbag Version = 0.84c Licence = Freeware Description = glidewrapper needed to run Diablo 2 on ReactOS. -Size = 249kB +Size = 249.02kB Category = 3 URLSite = http://www.zeckensack.de/glide/index.html URLDownload = http://www.zeckensack.de/glide/archive/GlideWrapper084c.exe diff --git a/reactos/base/applications/rapps/rapps/irfanview.txt b/reactos/base/applications/rapps/rapps/irfanview.txt index c12850d54e6..faf260d58c0 100644 --- a/reactos/base/applications/rapps/rapps/irfanview.txt +++ b/reactos/base/applications/rapps/rapps/irfanview.txt @@ -2,13 +2,13 @@ [Section] Name = IrfanView -Version = 4.30 +Version = 4.32 Licence = Freeware (for personal use) Description = Viewer for all kinds of graphics/audio files/video files. -Size = 1.4MB +Size = 1.46MB Category = 3 URLSite = http://www.irfanview.com/ -URLDownload = http://irfanview.tuwien.ac.at/iview430_setup.exe +URLDownload = http://irfanview.tuwien.ac.at/iview432_setup.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/irfanviewplugins.txt b/reactos/base/applications/rapps/rapps/irfanviewplugins.txt index 7b9d12bdbb6..ea79b361b3b 100644 --- a/reactos/base/applications/rapps/rapps/irfanviewplugins.txt +++ b/reactos/base/applications/rapps/rapps/irfanviewplugins.txt @@ -2,13 +2,13 @@ [Section] Name = IrfanView Plugins -Version = 4.30 +Version = 4.32 Licence = Freeware (for personal use) Description = Additional Plugins for supporting more file types. -Size = 7.7MB +Size = 8.92MB Category = 3 URLSite = http://www.irfanview.com/ -URLDownload = http://irfanview.tuwien.ac.at/plugins/irfanview_plugins_430_setup.exe +URLDownload = http://irfanview.tuwien.ac.at/plugins/irfanview_plugins_432_setup.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/kdewin.txt b/reactos/base/applications/rapps/rapps/kdewin.txt index eeae48362b0..ceade991972 100644 --- a/reactos/base/applications/rapps/rapps/kdewin.txt +++ b/reactos/base/applications/rapps/rapps/kdewin.txt @@ -2,13 +2,13 @@ [Section] Name = K Desktop Environment -Version = 0.9.9-4 +Version = 0.9.9-5 Licence = GPL Description = KDE for Windows. -Size = 2.2MB +Size = 2.21MB Category = 15 URLSite = http://www.winkde.org/ -URLDownload = http://www.winkde.org/pub/kde/ports/win32/installer/kdewin-installer-gui-0.9.9-4.exe +URLDownload = http://www.winkde.org/pub/kde/ports/win32/installer/kdewin-installer-gui-0.9.9-5.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/lbreakout2.txt b/reactos/base/applications/rapps/rapps/lbreakout2.txt index 82da4bb8ae2..f49e463da2e 100644 --- a/reactos/base/applications/rapps/rapps/lbreakout2.txt +++ b/reactos/base/applications/rapps/rapps/lbreakout2.txt @@ -5,7 +5,7 @@ Name = LBreakout2 Version = 2.4.1 Licence = GPL Description = Breakout Clone using SDL libs. -Size = 3.1MB +Size = 3.03MB Category = 4 URLSite = http://lgames.sourceforge.net/index.php?project=LBreakout2 URLDownload = http://ovh.dl.sourceforge.net/project/lgames/binaries/lbreakout2-2.4.1-win32.exe diff --git a/reactos/base/applications/rapps/rapps/lgeneral.txt b/reactos/base/applications/rapps/rapps/lgeneral.txt index a3fd16d924b..5cf04dee85e 100644 --- a/reactos/base/applications/rapps/rapps/lgeneral.txt +++ b/reactos/base/applications/rapps/rapps/lgeneral.txt @@ -5,7 +5,7 @@ Name = LGeneral Version = 1.1 Licence = GPL Description = Panzer General Clone using SDL libs. -Size = 2.0MB +Size = 1.92MB Category = 4 URLSite = http://lgames.sourceforge.net/index.php?project=LGeneral URLDownload = http://ovh.dl.sourceforge.net/project/lgames/binaries/lgeneral-1.1-win32.exe diff --git a/reactos/base/applications/rapps/rapps/libreoffice.txt b/reactos/base/applications/rapps/rapps/libreoffice.txt index 517a0b77b6a..052b82b6913 100644 --- a/reactos/base/applications/rapps/rapps/libreoffice.txt +++ b/reactos/base/applications/rapps/rapps/libreoffice.txt @@ -2,13 +2,13 @@ [Section] Name = LibreOffice -Version = 3.4.4 +Version = 3.4.5 Licence = LGPL Description = Former called OpenOffice. Open Source Office Suite. -Size = 191.0MB +Size = 190.74MB Category = 6 URLSite = http://www.documentfoundation.org/ -URLDownload = http://download.documentfoundation.org/libreoffice/stable/3.4.4/win/x86/LibO_3.4.4_Win_x86_install_multi.exe +URLDownload = http://download.documentfoundation.org/libreoffice/stable/3.4.5/win/x86/LibO_3.4.5_Win_x86_install_multi.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/lmarbles.txt b/reactos/base/applications/rapps/rapps/lmarbles.txt index d2beeef014d..13fc70566c3 100644 --- a/reactos/base/applications/rapps/rapps/lmarbles.txt +++ b/reactos/base/applications/rapps/rapps/lmarbles.txt @@ -5,7 +5,7 @@ Name = LMarbles Version = 1.0.6 Licence = GPL Description = Atomix Clone using SDL libs. -Size = 1.4MB +Size = 1.39MB Category = 4 URLSite = http://lgames.sourceforge.net/index.php?project=LMarbles URLDownload = http://ovh.dl.sourceforge.net/project/lgames/binaries/lmarbles-1.0.6-win32.exe diff --git a/reactos/base/applications/rapps/rapps/mfc40.txt b/reactos/base/applications/rapps/rapps/mfc40.txt index b732baa385e..6db87e053c0 100644 --- a/reactos/base/applications/rapps/rapps/mfc40.txt +++ b/reactos/base/applications/rapps/rapps/mfc40.txt @@ -5,7 +5,7 @@ Name = OLE Viewer and Microsoft Foundation Classes version 4 Version = 4.0 Licence = Unknown Description = MFC 4 is needed by some applications. Contains: mfc40.dll, msvcrt40.dll. -Size = 865kB +Size = 865.04kB Category = 14 URLSite = http://support.microsoft.com/kb/122244/ URLDownload = http://download.microsoft.com/download/ole/ole2v/3.5/w351/en-us/ole2v.exe diff --git a/reactos/base/applications/rapps/rapps/mirandaim.txt b/reactos/base/applications/rapps/rapps/mirandaim.txt index d69ae215539..16dbba3ea38 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.9.37 +Version = 0.9.42 Licence = GPL Description = Open source multiprotocol instant messaging application - May not work completely. Size = 3.1MB Category = 5 URLSite = http://www.miranda-im.org/ -URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.9.37-unicode.exe +URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.9.42-unicode.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/mirc.txt b/reactos/base/applications/rapps/rapps/mirc.txt index ea361b3adae..10907c57f51 100644 --- a/reactos/base/applications/rapps/rapps/mirc.txt +++ b/reactos/base/applications/rapps/rapps/mirc.txt @@ -5,7 +5,7 @@ Name = mIRC 7 Version = 7.22 Licence = Shareware Description = The most popular client for the Internet Relay Chat (IRC). -Size = 1.8M +Size = 1.82MB Category = 5 URLSite = http://www.mirc.com/ URLDownload = http://download.mirc.com/3/mirc722.exe diff --git a/reactos/base/applications/rapps/rapps/mirc6.txt b/reactos/base/applications/rapps/rapps/mirc6.txt index f249e373bdc..ab2932577a0 100644 --- a/reactos/base/applications/rapps/rapps/mirc6.txt +++ b/reactos/base/applications/rapps/rapps/mirc6.txt @@ -5,7 +5,7 @@ Name = mIRC 6 Version = 6.35 Licence = Shareware Description = The most popular client for the Internet Relay Chat (IRC). -Size = 1.7M +Size = 1.67MB Category = 5 URLSite = http://www.mirc.com/ URLDownload = http://download.mirc.com/3/mirc635.exe diff --git a/reactos/base/applications/rapps/rapps/mono2.txt b/reactos/base/applications/rapps/rapps/mono2.txt index 85109bd820f..b4e69a751ce 100644 --- a/reactos/base/applications/rapps/rapps/mono2.txt +++ b/reactos/base/applications/rapps/rapps/mono2.txt @@ -2,13 +2,13 @@ [Section] Name = Mono .net Development Framework -Version = 2.10.6 +Version = 2.10.8 Licence = Unknown Description = Open Source .net Framework. -Size = 79.3MB +Size = 79.47MB Category = 14 URLSite = http://www.mono-project.com/Main_Page -URLDownload = http://download.mono-project.com/archive/2.10.6/windows-installer/1/mono-2.10.6-gtksharp-2.12.11-win32-1.exe +URLDownload = http://download.mono-project.com/archive/2.10.8/windows-installer/1/mono-2.10.8-gtksharp-2.12.11-win32-1.exe CDPath = none [Section.040a] diff --git a/reactos/base/applications/rapps/rapps/mpc.txt b/reactos/base/applications/rapps/rapps/mpc.txt index 56db1f27839..aed88b974d1 100644 --- a/reactos/base/applications/rapps/rapps/mpc.txt +++ b/reactos/base/applications/rapps/rapps/mpc.txt @@ -2,13 +2,13 @@ [Section] Name = Media Player Classic Home Cinema -Version = 1.5.2.3456 +Version = 1.6.0.4014 Licence = GPL Description = A media player. -Size = 5.3MB +Size = 5.57MB Category = 1 URLSite = http://mpc-hc.sourceforge.net/ -URLDownload = http://freefr.dl.sourceforge.net/project/mpc-hc/MPC%20HomeCinema%20-%20Win32/MPC-HC%20v1.5.2.3456_32%20bits/MPC-HomeCinema.1.5.2.3456.x86.exe +URLDownload = http://freefr.dl.sourceforge.net/project/mpc-hc/MPC%20HomeCinema%20-%20Win32/MPC-HC%20v1.6.0.4014_32%20bits/MPC-HomeCinema.1.6.0.4014.x86.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/msxml3.txt b/reactos/base/applications/rapps/rapps/msxml3.txt index 49ca9d87fe1..b8cae81819a 100644 --- a/reactos/base/applications/rapps/rapps/msxml3.txt +++ b/reactos/base/applications/rapps/rapps/msxml3.txt @@ -5,7 +5,7 @@ Name = Microsoft XML 3 Version = 3.0 Licence = Unknown Description = MSXML3 is needed for some MSI Installers. Contains: msxml3.dll, msxml3a.dll, msxml3r.dll. -Size = 1.9MB +Size = 1.85MB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyID=28494391-052B-42FF-9674-F752BDCA9582&displaylang=en URLDownload = ftp://ftp.uni-rostock.de/pub/tools/microsoft/XML/US/msxml3.msi diff --git a/reactos/base/applications/rapps/rapps/net11.txt b/reactos/base/applications/rapps/rapps/net11.txt index c2ea5087369..55c0077d34a 100644 --- a/reactos/base/applications/rapps/rapps/net11.txt +++ b/reactos/base/applications/rapps/rapps/net11.txt @@ -5,7 +5,7 @@ Name = Microsoft .NET Framework Version 1.1 Redistributable Package Version = 1.1 Licence = Unknown Description = Microsoft .NET Framework Version 1.1 Redistributable Package. -Size = 23.1MB +Size = 23.14MB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyId=262D25E3-F589-4842-8157-034D1E7CF3A3 URLDownload = http://download.microsoft.com/download/a/a/c/aac39226-8825-44ce-90e3-bf8203e74006/dotnetfx.exe diff --git a/reactos/base/applications/rapps/rapps/net20.txt b/reactos/base/applications/rapps/rapps/net20.txt index 48c2d8b2536..084c1bd9fd7 100644 --- a/reactos/base/applications/rapps/rapps/net20.txt +++ b/reactos/base/applications/rapps/rapps/net20.txt @@ -5,7 +5,7 @@ Name = Microsoft .NET Framework Version 2.0 Redistributable Package Version = 2.0 Licence = Unknown Description = Microsoft .NET Framework Version 2.0 Redistributable Package. -Size = 22.4MB +Size = 22.42MB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5 URLDownload = http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe diff --git a/reactos/base/applications/rapps/rapps/net20sp2.txt b/reactos/base/applications/rapps/rapps/net20sp2.txt index b7155dda584..8b8ebff8163 100644 --- a/reactos/base/applications/rapps/rapps/net20sp2.txt +++ b/reactos/base/applications/rapps/rapps/net20sp2.txt @@ -5,7 +5,7 @@ Name = Microsoft .NET Framework Version 2.0 Service Pack 2 Version = 2.0SP2 Licence = Unknown Description = Microsoft .NET Framework Version 2.0 Service Pack 2 -Size = 23.8MB +Size = 23.84MB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?familyid=5B2C0358-915B-4EB5-9B1D-10E506DA9D0F URLDownload = http://download.microsoft.com/download/c/6/e/c6e88215-0178-4c6c-b5f3-158ff77b1f38/NetFx20SP2_x86.exe diff --git a/reactos/base/applications/rapps/rapps/offbyone.txt b/reactos/base/applications/rapps/rapps/offbyone.txt index 582627c7392..4b8ada052ee 100644 --- a/reactos/base/applications/rapps/rapps/offbyone.txt +++ b/reactos/base/applications/rapps/rapps/offbyone.txt @@ -5,7 +5,7 @@ Name = Off By One Browser Version = 3.5d Licence = Freeware Description = The Off By One Browser is a very small and fast web browser with full HTML 3.2 support. -Size = 0.98M +Size = 0.98MB Category = 5 URLSite = http://offbyone.com/ URLDownload = http://offbyone.com/offbyone/images/OffByOneSetup.exe diff --git a/reactos/base/applications/rapps/rapps/openoffice2.4.txt b/reactos/base/applications/rapps/rapps/openoffice2.4.txt index 907712013be..e088541b15b 100644 --- a/reactos/base/applications/rapps/rapps/openoffice2.4.txt +++ b/reactos/base/applications/rapps/rapps/openoffice2.4.txt @@ -5,7 +5,7 @@ Name = OpenOffice 2.4 Version = 2.4.3 Licence = LGPL Description = THE Open Source Office Suite. -Size = 127MB +Size = 113MB Category = 6 URLSite = http://www.openoffice.org/ URLDownload = http://archive.services.openoffice.org/pub/openoffice-archive/stable/2.4.3/OOo_2.4.3_Win32Intel_install_en-US.exe @@ -14,30 +14,30 @@ CDPath = none [Section.0407] Description = DIE Open Source Office Suite. URLSite = http://de.openoffice.org/ -Size = 114.2MB +Size = 114.25MB URLDownload = http://archive.services.openoffice.org/pub/openoffice-archive/localized/de/2.4.3/OOo_2.4.3_Win32Intel_install_de.exe [Section.040a] Description = La suite de ofimática de código abierto. URLSite = http://es.openoffice.org/ -Size = 113.9MB +Size = 113.87MB URLDownload = http://archive.services.openoffice.org/pub/openoffice-archive/localized/es/2.4.3/OOo_2.4.3_Win32Intel_install_es.exe [Section.040c] Version = 2.4.2 Description = LA suite bureautique open source. URLSite = http://fr.openoffice.org/ -Size = 113.9MB +Size = 114MB URLDownload = http://archive.services.openoffice.org/pub/openoffice-archive/localized/fr/2.4.2/OOo_2.4.2_Win32Intel_install_fr.exe [Section.0415] URLSite = http://pl.openoffice.org/ Description = Otwarty pakiet biurowy. URLDownload = http://archive.services.openoffice.org/pub/openoffice-archive/localized/pl/2.4.2/OOo_2.4.2_Win32Intel_install_pl.exe -Size = 113.9M +Size = 113.92MB [Section.0422] URLSite = http://ua.openoffice.org/ Description = Відкритий офіÑний пакет. URLDownload = http://archive.services.openoffice.org/pub/openoffice-archive/localized/ru/2.4.3/OOo_2.4.3_Win32Intel_install_ru.exe -Size = 114.8M +Size = 114.76MB diff --git a/reactos/base/applications/rapps/rapps/openoffice3.0.txt b/reactos/base/applications/rapps/rapps/openoffice3.0.txt index 4662cfee621..c1361cf5e1f 100644 --- a/reactos/base/applications/rapps/rapps/openoffice3.0.txt +++ b/reactos/base/applications/rapps/rapps/openoffice3.0.txt @@ -5,7 +5,7 @@ Name = OpenOffice 3.3 Version = 3.3.0 Licence = LGPL Description = THE Open Source Office Suite. -Size = 137.0MB +Size = 136.79MB Category = 6 URLSite = http://www.openoffice.org/ URLDownload = http://ftp3.gwdg.de/pub/openoffice/stable/3.3.0/OOo_3.3.0_Win_x86_install_en-US.exe @@ -14,29 +14,29 @@ CDPath = none [Section.0407] Description = DIE Open Source Office Suite. URLSite = http://de.openoffice.org/ -Size = 160.0MB +Size = 160.38MB URLDownload = http://ftp3.gwdg.de/pub/openoffice/localized/de/3.3.0/OOo_3.3.0_Win_x86_install-wJRE_de.exe [Section.040a] Description = La suite de ofimática de código abierto. URLSite = http://es.openoffice.org/ -Size = 132.0MB +Size = 132.4MB URLDownload = http://ftp.gwdg.de/pub/openoffice/localized/es/3.3.0/OOo_3.3.0_Win_x86_install_es.exe [Section.040c] Description = LA suite bureautique open source. URLSite = http://fr.openoffice.org/ -Size = 132.0MB +Size = 131.45MB URLDownload = http://ftp.gwdg.de/pub/openoffice/localized/fr/3.3.0/OOo_3.3.0_Win_x86_install_fr.exe [Section.0415] Description = Otwarty pakiet biurowy. URLSite = http://pl.openoffice.org/ -Size = 134.0MB +Size = 134.33MB URLDownload = http://ftp3.gwdg.de/pub/openoffice/localized/pl/3.3.0/OOo_3.3.0_Win_x86_install_pl.exe [Section.0422] Description = Відкритий офіÑний пакет. URLSite = http://ua.openoffice.org/ -Size = 133.0MB +Size = 132.82MB URLDownload = http://ftp3.gwdg.de/pub/openoffice/localized/ru/3.3.0/OOo_3.3.0_Win_x86_install_ru.exe diff --git a/reactos/base/applications/rapps/rapps/openttd.txt b/reactos/base/applications/rapps/rapps/openttd.txt index 0de4bd4fb5a..63714868412 100644 --- a/reactos/base/applications/rapps/rapps/openttd.txt +++ b/reactos/base/applications/rapps/rapps/openttd.txt @@ -2,13 +2,13 @@ [Section] Name = OpenTTD -Version = 1.1.4 +Version = 1.1.5 Licence = GPL v2 Description = Open Source clone of the "Transport Tycoon Deluxe" game engine. You need a copy of Transport Tycoon. -Size = 4.1MB +Size = 4.13MB Category = 4 URLSite = http://www.openttd.org/ -URLDownload = http://binaries.openttd.org/releases/1.1.4/openttd-1.1.4-windows-win32.exe +URLDownload = http://binaries.openttd.org/releases/1.1.5/openttd-1.1.5-windows-win32.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/opera.txt b/reactos/base/applications/rapps/rapps/opera.txt index 97ee12fbaa8..e4d13c8eddf 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 = 11.60 +Version = 11.61 Licence = Freeware Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client. -Size = 10.1M +Size = 10.13MB Category = 5 URLSite = http://www.opera.com/ -URLDownload = http://get4.opera.com/pub/opera/win/1160/int/Opera_1160_int_Setup.exe +URLDownload = http://get4.opera.com/pub/opera/win/1161/int/Opera_1161_int_Setup.exe CDPath = none [Section.0405] diff --git a/reactos/base/applications/rapps/rapps/opera9.txt b/reactos/base/applications/rapps/rapps/opera9.txt index 7f5d161f0a1..cfdfd15809b 100644 --- a/reactos/base/applications/rapps/rapps/opera9.txt +++ b/reactos/base/applications/rapps/rapps/opera9.txt @@ -5,7 +5,7 @@ Name = Opera Version = 9.64 Licence = Freeware Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client. -Size = 7.2M +Size = 7.21MB Category = 5 URLSite = http://www.opera.com/ URLDownload = http://arc.opera.com/pub/opera/win/964/int/Opera_964_int_Setup.exe diff --git a/reactos/base/applications/rapps/rapps/putty.txt b/reactos/base/applications/rapps/rapps/putty.txt index b2045a40676..4c4dba2274e 100644 --- a/reactos/base/applications/rapps/rapps/putty.txt +++ b/reactos/base/applications/rapps/rapps/putty.txt @@ -5,7 +5,7 @@ Name = PuTTY Version = 0.62 Licence = MIT Description = A free SSH, Telnet, rlogin, and raw TCP client. -Size = 1.8MB +Size = 1.76MB Category = 5 URLSite = http://www.chiark.greenend.org.uk/~sgtatham/putty/ URLDownload = http://the.earth.li/~sgtatham/putty/latest/x86/putty-0.62-installer.exe diff --git a/reactos/base/applications/rapps/rapps/python.txt b/reactos/base/applications/rapps/rapps/python.txt index 4d120acec95..df5b7ab6a94 100644 --- a/reactos/base/applications/rapps/rapps/python.txt +++ b/reactos/base/applications/rapps/rapps/python.txt @@ -5,7 +5,7 @@ Name = Python 2 Version = 2.7.2 Licence = GPL/LGPL Description = A remarkably powerful dynamic programming language. -Size = 15.2MB +Size = 15.23MB Category = 7 URLSite = http://www.python.org/ URLDownload = http://www.python.org/ftp/python/2.7.2/python-2.7.2.msi diff --git a/reactos/base/applications/rapps/rapps/python3.txt b/reactos/base/applications/rapps/rapps/python3.txt index bab63b3eba0..f34ced886f0 100644 --- a/reactos/base/applications/rapps/rapps/python3.txt +++ b/reactos/base/applications/rapps/rapps/python3.txt @@ -5,7 +5,7 @@ Name = Python 3 Version = 3.2.2 Licence = GPL/LGPL Description = A remarkably powerful dynamic programming language. -Size = 17MB +Size = 17.2MB Category = 7 URLSite = http://www.python.org/ URLDownload = http://www.python.org/ftp/python/3.2.2/python-3.2.2.msi diff --git a/reactos/base/applications/rapps/rapps/remood.txt b/reactos/base/applications/rapps/rapps/remood.txt index bb67d85364a..f08ac00f337 100644 --- a/reactos/base/applications/rapps/rapps/remood.txt +++ b/reactos/base/applications/rapps/rapps/remood.txt @@ -5,7 +5,7 @@ Name = ReMooD Version = 0.8a Licence = GPL Description = ReMooD is a source port of Doom Legacy. It aims to provide the classic Legacy Experience with new features and more stability. -Size = 1.2M +Size = 1.15MB Category = 4 URLSite = http://remood.sourceforge.net/ URLDownload = http://ovh.dl.sourceforge.net/project/remood/ReMooD/0.8a/remoodsetup-win32_08a.exe diff --git a/reactos/base/applications/rapps/rapps/rosbe.txt b/reactos/base/applications/rapps/rapps/rosbe.txt index 44666e1b805..6c851fca700 100644 --- a/reactos/base/applications/rapps/rapps/rosbe.txt +++ b/reactos/base/applications/rapps/rapps/rosbe.txt @@ -5,7 +5,7 @@ Name = ReactOS Build Environment Version = 1.5.1.1 Licence = GPL Description = Allows you to build the ReactOS Source. For more instructions see ReactOS wiki. -Size = 13.8MB +Size = 13.76MB Category = 7 URLSite = http://reactos.org/wiki/Build_Environment URLDownload = http://ovh.dl.sourceforge.net/project/reactos/RosBE-Windows/i386/1.5.1/RosBE-1.5.1.1.exe diff --git a/reactos/base/applications/rapps/rapps/rosbeamd64.txt b/reactos/base/applications/rapps/rapps/rosbeamd64.txt index 4fd113844a5..f0bca66516b 100644 --- a/reactos/base/applications/rapps/rapps/rosbeamd64.txt +++ b/reactos/base/applications/rapps/rapps/rosbeamd64.txt @@ -5,7 +5,7 @@ Name = ReactOS Build Environment AMD64 Addon Version = 1.3 Licence = GPL Description = Allows you to build the ReactOS AMD64 Source. For more instructions see ReactOS wiki. -Size = 15.8MB +Size = 15.83MB Category = 7 URLSite = http://reactos.org/wiki/Build_Environment/ URLDownload = http://sunet.dl.sourceforge.net/project/reactos/RosBE-Windows/amd64/1.3/RosBE64-1.3.exe diff --git a/reactos/base/applications/rapps/rapps/rosbearm.txt b/reactos/base/applications/rapps/rapps/rosbearm.txt index 4db452a36b6..ff7d5442158 100644 --- a/reactos/base/applications/rapps/rapps/rosbearm.txt +++ b/reactos/base/applications/rapps/rapps/rosbearm.txt @@ -5,7 +5,7 @@ Name = ReactOS Build Environment ARM Addon Version = 1.0 Licence = GPL Description = Allows you to build the ReactOS ARM Source. For more instructions see ReactOS wiki. -Size = 11.1MB +Size = 11.15MB Category = 7 URLSite = http://reactos.org/wiki/Build_Environment/ URLDownload = http://ovh.dl.sourceforge.net/project/reactos/RosBE-Windows/arm/1.0/RosBE-ARM-1.0.exe diff --git a/reactos/base/applications/rapps/rapps/sambatng.txt b/reactos/base/applications/rapps/rapps/sambatng.txt index a76bf5f5c74..2f7418e9b2e 100644 --- a/reactos/base/applications/rapps/rapps/sambatng.txt +++ b/reactos/base/applications/rapps/rapps/sambatng.txt @@ -5,7 +5,7 @@ Name = Samba TNG Version = 0.5-RC1 Licence = GPL Description = This tool allows you to access your Windows shared folders/printers with ReactOS. -Size = 2.1MB +Size = 2.13MB Category = 5 URLSite = http://samba-tng.org/ URLDownload = http://svn.reactos.org/packages/samba-tng.exe diff --git a/reactos/base/applications/rapps/rapps/sbforvmware.txt b/reactos/base/applications/rapps/rapps/sbforvmware.txt index 9fac3b81bfd..5dae8f82e8c 100644 --- a/reactos/base/applications/rapps/rapps/sbforvmware.txt +++ b/reactos/base/applications/rapps/rapps/sbforvmware.txt @@ -5,7 +5,7 @@ Name = SoundBlaster Driver for VMWare Version = 5.12.1.5017 Licence = Unknown Description = Unzip in the "ReactOS" folder then restart ReactOS twice. -Size = 2.2MB +Size = 2.22MB Category = 13 URLSite = Unknown URLDownload = http://svn.reactos.org/packages/sb_vmware.exe diff --git a/reactos/base/applications/rapps/rapps/scite.txt b/reactos/base/applications/rapps/rapps/scite.txt index 135a890009e..99e368a06bb 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.29 +Version = 3.0.3 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 +Size = 666KB Category = 7 URLSite = http://www.scintilla.org/ -URLDownload = http://kent.dl.sourceforge.net/project/scintilla/SciTE/2.29/Sc229.exe +URLDownload = http://kent.dl.sourceforge.net/project/scintilla/SciTE/3.0.3/Sc303.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/scummvm.txt b/reactos/base/applications/rapps/rapps/scummvm.txt index 82f83a2a23c..432d78acf21 100644 --- a/reactos/base/applications/rapps/rapps/scummvm.txt +++ b/reactos/base/applications/rapps/rapps/scummvm.txt @@ -2,13 +2,13 @@ [Section] Name = ScummVM -Version = 1.4.0 +Version = 1.4.1 Licence = GPL Description = Sam and Max, Day of the Tentacle, etc on ReactOS. -Size = 4.6MB +Size = 5.28MB Category = 4 URLSite = http://scummvm.org/ -URLDownload = http://kent.dl.sourceforge.net/project/scummvm/scummvm/1.4.0/scummvm-1.4.0-win32.exe +URLDownload = http://kent.dl.sourceforge.net/project/scummvm/scummvm/1.4.1/scummvm-1.4.1-win32.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/sdl_mixer.txt b/reactos/base/applications/rapps/rapps/sdl_mixer.txt index a8ebeb9cc6d..e67887f065e 100644 --- a/reactos/base/applications/rapps/rapps/sdl_mixer.txt +++ b/reactos/base/applications/rapps/rapps/sdl_mixer.txt @@ -2,13 +2,13 @@ [Section] Name = Simple Direct Media Layer (SDL) Mixer -Version = 1.2.11 +Version = 1.2.12 Licence = LGPL Description = Needed for some Open Source Games to run. You need 7-Zip or a similar Utility to extract it. -Size = 307kB +Size = 548.02kB Category = 14 URLSite = http://www.libsdl.org/projects/SDL_mixer/ -URLDownload = http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-1.2.11-win32.zip +URLDownload = http://www.libsdl.org/projects/SDL_mixer/release/SDL_mixer-1.2.12-win32.zip CDPath = none [Section.0405] diff --git a/reactos/base/applications/rapps/rapps/sdl_runtime.txt b/reactos/base/applications/rapps/rapps/sdl_runtime.txt index d3225ae7605..2cbdaf83c41 100644 --- a/reactos/base/applications/rapps/rapps/sdl_runtime.txt +++ b/reactos/base/applications/rapps/rapps/sdl_runtime.txt @@ -2,13 +2,13 @@ [Section] Name = Simple Direct Media Layer (SDL) Runtime -Version = 1.2.14 +Version = 1.2.15 Licence = LGPL Description = Needed for many Open Source Games to run. You need 7-Zip or a similar Utility to extract it. -Size = 145kB +Size = 136.67kB Category = 14 URLSite = http://www.libsdl.org/ -URLDownload = http://www.libsdl.org/release/SDL-1.2.14-win32.zip +URLDownload = http://www.libsdl.org/release/SDL-1.2.15-win32.zip CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/seamonkey.txt b/reactos/base/applications/rapps/rapps/seamonkey.txt index 7fe9c072319..57ea71a856a 100644 --- a/reactos/base/applications/rapps/rapps/seamonkey.txt +++ b/reactos/base/applications/rapps/rapps/seamonkey.txt @@ -2,41 +2,41 @@ [Section] Name = Mozilla SeaMonkey -Version = 2.5 +Version = 2.7 Licence = MPL/GPL/LGPL Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need. -Size = 16.9MB +Size = 17.59MB Category = 5 URLSite = http://www.seamonkey-project.org/ -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.5/win32/en-US/SeaMonkey%20Setup%202.5.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.7/win32/en-US/SeaMonkey%20Setup%202.7.exe CDPath = none [Section.0407] Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen. -Size = 16.9MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.5/win32/de/SeaMonkey%20Setup%202.5.exe +Size = 17.56MB +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.7/win32/de/SeaMonkey%20Setup%202.7.exe [Section.040a] Description = La suite de Mozilla está viva. Es el primero y único navegador web, gestor de correo, lector de noticias, Chat y editor HTML que necesitarás. -Size = 16.8MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.5/win32/es-ES/SeaMonkey%20Setup%202.5.exe +Size = 17.49MB +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.7/win32/es-ES/SeaMonkey%20Setup%202.7.exe [Section.040c] Description = La suite Mozilla est en vie. Ceci est le seul et l'unique package navigateur, client mail, client chat et composer dont vous aurez besoin. -Size = 17.1MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.5/win32/fr/SeaMonkey%20Setup%202.5.exe +Size = 17.79MB +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.7/win32/fr/SeaMonkey%20Setup%202.7.exe [Section.0415] Description = Pakiet Mozilla żyje. W zestawie: przeglÄ…darka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz. -Size = 17.7MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.5/win32/pl/SeaMonkey%20Setup%202.5.exe +Size = 18.38MB +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.7/win32/pl/SeaMonkey%20Setup%202.7.exe [Section.0419] Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор. -Size = 17.3MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.5/win32/ru/SeaMonkey%20Setup%202.5.exe +Size = 18.01MB +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.7/win32/ru/SeaMonkey%20Setup%202.7.exe [Section.0422] Description = ÐŸÑ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ Mozilla Suite. Включає в Ñебе браузер, поштовий клієнт, IRC-клієнт та HTML-редактор. -Size = 17.3MB -URLDownload = http://releases.mozilla.org/pub/mozilla.org/seamonkey/releases/2.5/win32/ru/SeaMonkey%20Setup%202.5.exe +Size = 18.01MB +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.7/win32/ru/SeaMonkey%20Setup%202.7.exe diff --git a/reactos/base/applications/rapps/rapps/smplayer.txt b/reactos/base/applications/rapps/rapps/smplayer.txt index 9cfd35f26b9..dfb684d1991 100644 --- a/reactos/base/applications/rapps/rapps/smplayer.txt +++ b/reactos/base/applications/rapps/rapps/smplayer.txt @@ -2,13 +2,13 @@ [Section] Name = SMPlayer -Version = 0.6.9 +Version = 0.7.0 Licence = GPL Description = SMPlayer. -Size = 14.2MB +Size = 14.65MB Category = 1 URLSite = http://smplayer.sourceforge.net/ -URLDownload = http://ovh.dl.sourceforge.net/project/smplayer/SMPlayer/0.6.9/smplayer-0.6.9-win32.exe +URLDownload = http://freefr.dl.sourceforge.net/project/smplayer/SMPlayer/0.7.0/smplayer-0.7.0-win32.exe CDPath = none [Section.0407] diff --git a/reactos/base/applications/rapps/rapps/steam.txt b/reactos/base/applications/rapps/rapps/steam.txt index 6306fde7903..dda55801a80 100644 --- a/reactos/base/applications/rapps/rapps/steam.txt +++ b/reactos/base/applications/rapps/rapps/steam.txt @@ -5,7 +5,7 @@ Name = STEAM Version = 1.0 Licence = Freeware Description = The STEAM Gaming platform used by many games these days. -Size = 1.5MB +Size = 1.53MB Category = 4 URLSite = http://steampowered.com/ URLDownload = http://storefront.steampowered.com/download/SteamInstall.msi diff --git a/reactos/base/applications/rapps/rapps/sumatrapdf.txt b/reactos/base/applications/rapps/rapps/sumatrapdf.txt index 2fbfa1a37a1..ba97e001ebe 100644 --- a/reactos/base/applications/rapps/rapps/sumatrapdf.txt +++ b/reactos/base/applications/rapps/rapps/sumatrapdf.txt @@ -5,7 +5,7 @@ Name = SumatraPDF Version = 1.9 Licence = GPLv3 Description = Sumatra PDF is a slim, free, open-source PDF reader. Portable out of the box. -Size = 4.5MB +Size = 4.48MB Category = 6 URLSite = http://blog.kowalczyk.info/software/sumatrapdf/free-pdf-reader.html URLDownload = http://kjkpub.s3.amazonaws.com/sumatrapdf/rel/SumatraPDF-1.9-install.exe diff --git a/reactos/base/applications/rapps/rapps/superfinder.txt b/reactos/base/applications/rapps/rapps/superfinder.txt index 0abc6654944..1b6d538a2ad 100644 --- a/reactos/base/applications/rapps/rapps/superfinder.txt +++ b/reactos/base/applications/rapps/rapps/superfinder.txt @@ -5,7 +5,7 @@ Name = Super Finder XT Version = 1.6.3.2 Licence = Freeware Description = A fast and feature rich search Application. -Size = 4.9MB +Size = 4.94MB Category = 12 URLSite = http://fsl.sytes.net/ssearchxt.html URLDownload = http://www.webalice.it/guido.vinaio/releases/setup_SuperFinderXT.exe diff --git a/reactos/base/applications/rapps/rapps/tahoma.txt b/reactos/base/applications/rapps/rapps/tahoma.txt index 2fec1bf7750..dc9f3d79f80 100644 --- a/reactos/base/applications/rapps/rapps/tahoma.txt +++ b/reactos/base/applications/rapps/rapps/tahoma.txt @@ -5,7 +5,7 @@ Name = Microsoft Tahoma Font Version = 1.0 Licence = Unknown Description = Tahoma Font pack needed by some apps (Steam). Contains: Tahoma.tff, Tahomabd.ttf. -Size = 305kB +Size = 305.12kB Category = 14 URLSite = http://support.microsoft.com/ URLDownload = http://download.microsoft.com/download/office97pro/fonts/1/w95/en-us/tahoma32.exe diff --git a/reactos/base/applications/rapps/rapps/thunderbird.txt b/reactos/base/applications/rapps/rapps/thunderbird.txt index 0a40b191191..fb7ba64fb11 100644 --- a/reactos/base/applications/rapps/rapps/thunderbird.txt +++ b/reactos/base/applications/rapps/rapps/thunderbird.txt @@ -2,47 +2,47 @@ [Section] Name = Mozilla Thunderbird -Version = 3.1.16 +Version = 3.1.18 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Mail Clients out there. -Size = 9.1M +Size = 9.06MB Category = 5 URLSite = http://www.mozilla-europe.org/en/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.16/win32/en-US/Thunderbird%20Setup%203.1.16.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.18/win32/en-US/Thunderbird%20Setup%203.1.18.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Mail-Clients. -Size = 8.9M +Size = 8.91MB URLSite = http://www.mozilla-europe.org/de/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.16/win32/de/Thunderbird%20Setup%203.1.16.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.18/win32/de/Thunderbird%20Setup%203.1.18.exe [Section.040a] Description = El más popular y uno de los mejores clientes mail que hay. -Size = 8.9M +Size = 8.88MB URLSite = http://www.mozilla-europe.org/es/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.16/win32/es-ES/Thunderbird%20Setup%203.1.16.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.18/win32/es-ES/Thunderbird%20Setup%203.1.18.exe [Section.040c] Description = Le plus populaire et l'un des meilleurs clients mail gratuits disponible. -Size = 9.1M +Size = 9.13MB URLSite = http://www.mozilla-europe.org/fr/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.16/win32/fr/Thunderbird%20Setup%203.1.16.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.18/win32/fr/Thunderbird%20Setup%203.1.18.exe [Section.0415] Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty. -Size = 9.7M +Size = 9.73MB URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.16/win32/pl/Thunderbird%20Setup%203.1.16.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.18/win32/pl/Thunderbird%20Setup%203.1.18.exe [Section.0419] Description = Один из Ñамых популÑрных и лучших беÑплатных почтовых клиентов. -Size = 9.3M +Size = 9.29MB URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.16/win32/ru/Thunderbird%20Setup%203.1.16.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.18/win32/ru/Thunderbird%20Setup%203.1.18.exe [Section.0422] Description = ÐайпопулÑрніший та один з кращих поштових клієнтів. -Size = 9.3M +Size = 9.29MB URLSite = http://www.mozillamessaging.com/uk/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.16/win32/uk/Thunderbird%20Setup%203.1.16.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.1.18/win32/uk/Thunderbird%20Setup%203.1.18.exe diff --git a/reactos/base/applications/rapps/rapps/thunderbird5.txt b/reactos/base/applications/rapps/rapps/thunderbird5.txt index 17bf9d373ab..c50fe7a559a 100644 --- a/reactos/base/applications/rapps/rapps/thunderbird5.txt +++ b/reactos/base/applications/rapps/rapps/thunderbird5.txt @@ -1,48 +1,48 @@ ; UTF-8 [Section] -Name = Mozilla Thunderbird 5 -Version = 8.0 +Name = Mozilla Thunderbird 9 +Version = 9.0.1 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Mail Clients out there. -Size = 15.2M +Size = 16.22MB Category = 5 URLSite = http://www.mozilla-europe.org/en/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/8.0/win32/en-US/Thunderbird%20Setup%208.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/9.0.1/win32/en-US/Thunderbird%20Setup%209.0.1.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Mail-Clients. -Size = 15.1M +Size = 15.1MB URLSite = http://www.mozilla-europe.org/de/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/8.0/win32/de/Thunderbird%20Setup%208.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/9.0.1/win32/de/Thunderbird%20Setup%209.0.1.exe [Section.040a] Description = El más popular y uno de los mejores clientes mail que hay. -Size = 15.0M +Size = 15.0MB URLSite = http://www.mozilla-europe.org/es/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/8.0/win32/es-ES/Thunderbird%20Setup%208.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/9.0.1/win32/es-ES/Thunderbird%20Setup%209.0.1.exe [Section.040c] Description = Le plus populaire et l'un des meilleurs clients mail gratuits disponible. -Size = 15.4M +Size = 15.4MB URLSite = http://www.mozilla-europe.org/fr/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/8.0/win32/fr/Thunderbird%20Setup%208.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/9.0.1/win32/fr/Thunderbird%20Setup%209.0.1.exe [Section.0415] Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty. -Size = 15.9M +Size = 15.9MB URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/8.0/win32/pl/Thunderbird%20Setup%208.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/9.0.1/win32/pl/Thunderbird%20Setup%209.0.1.exe [Section.0419] Description = Один из Ñамых популÑрных и лучших беÑплатных почтовых клиентов. -Size = 15.5M +Size = 15.5MB URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/8.0/win32/ru/Thunderbird%20Setup%208.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/9.0.1/win32/ru/Thunderbird%20Setup%209.0.1.exe [Section.0422] Description = ÐайпопулÑрніший та один з кращих поштових клієнтів. -Size = 15.5M +Size = 15.5MB URLSite = http://www.mozillamessaging.com/uk/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/8.0/win32/uk/Thunderbird%20Setup%208.0.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/9.0.1/win32/uk/Thunderbird%20Setup%209.0.1.exe diff --git a/reactos/base/applications/rapps/rapps/tileworld.txt b/reactos/base/applications/rapps/rapps/tileworld.txt index 985eb61e8a8..6615be04f99 100644 --- a/reactos/base/applications/rapps/rapps/tileworld.txt +++ b/reactos/base/applications/rapps/rapps/tileworld.txt @@ -5,7 +5,7 @@ Name = Tile World Version = 1.3.0 Licence = GPL Description = Nice Clone of Chip's Challenge originally made for the Atari Lynx. Includes free CCLP2 Graphics Pack, so you dont need the copyrighted Original. -Size = 1.2MB +Size = 1.16MB Category = 4 URLSite = http://www.muppetlabs.com/~breadbox/software/tworld/ URLDownload = http://www.muppetlabs.com/~breadbox/pub/software/tworld/tworld-1.3.0-win32-CCLP2.exe diff --git a/reactos/base/applications/rapps/rapps/tuxpaint.txt b/reactos/base/applications/rapps/rapps/tuxpaint.txt index f4c6e4d6528..b7101679207 100644 --- a/reactos/base/applications/rapps/rapps/tuxpaint.txt +++ b/reactos/base/applications/rapps/rapps/tuxpaint.txt @@ -5,7 +5,7 @@ Name = TuxPaint Version = 0.9.21c Licence = GPL Description = An Open Source bitmap graphics editor geared towards young children. -Size = 11MB +Size = 10.42MB Category = 3 URLSite = http://tuxpaint.org/ URLDownload = http://ovh.dl.sourceforge.net/project/tuxpaint/tuxpaint/0.9.21c/tuxpaint-0.9.21c-win32-installer.exe diff --git a/reactos/base/applications/rapps/rapps/ultravnc.txt b/reactos/base/applications/rapps/rapps/ultravnc.txt index c60a825b3ac..636ffb284bd 100644 --- a/reactos/base/applications/rapps/rapps/ultravnc.txt +++ b/reactos/base/applications/rapps/rapps/ultravnc.txt @@ -5,7 +5,7 @@ Name = UltraVNC Version = 1.0.9.6.1 Licence = GPL Description = Open-source VNC client/server. -Size = 2.2MB +Size = 2.19MB Category = 5 URLSite = http://www.uvnc.com/ URLDownload = http://support1.uvnc.com/download/10961/UltraVNC_1.0.9.6.1_Setup.exe diff --git a/reactos/base/applications/rapps/rapps/utorrent.txt b/reactos/base/applications/rapps/rapps/utorrent.txt index 28eeda34899..51fd215bb5e 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 = 3.0 +Version = 3.1.2 Licence = Freeware for non-commercial uses Description = Small and fast BitTorrent Client. -Size = 626K +Size = 720.87KB Category = 5 URLSite = http://www.utorrent.com/ -URLDownload = http://download.utorrent.com/3.0/utorrent.exe +URLDownload = http://download.utorrent.com/3.1.2/utorrent.exe CDPath = none diff --git a/reactos/base/applications/rapps/rapps/vb5run.txt b/reactos/base/applications/rapps/rapps/vb5run.txt index a2847618589..1264571525a 100644 --- a/reactos/base/applications/rapps/rapps/vb5run.txt +++ b/reactos/base/applications/rapps/rapps/vb5run.txt @@ -5,7 +5,7 @@ Name = Visual Basic 5 Runtime Version = 5.0 Licence = Unknown Description = Visual Basic 5 Runtime. Contains: advpack.dll, asycfilt.dll, comcat.dll, msvbvm50.dll, oleaut32.dll, olepro32.dll. -Size = 970kB +Size = 969.59kB Category = 14 URLSite = http://support.microsoft.com/kb/180071/ URLDownload = http://download.microsoft.com/download/vb50pro/utility/1/win98/en-us/msvbvm50.exe diff --git a/reactos/base/applications/rapps/rapps/vb6run.txt b/reactos/base/applications/rapps/rapps/vb6run.txt index a7f34a12ed6..fc5d1c6d916 100644 --- a/reactos/base/applications/rapps/rapps/vb6run.txt +++ b/reactos/base/applications/rapps/rapps/vb6run.txt @@ -5,7 +5,7 @@ Name = Visual Basic 6 Runtime Version = 6.0 Licence = Unknown Description = Visual Basic 6 Runtime. Contains: advpack.dll, asycfilt.dll, comcat.dll, msvbvm60.dll, oleaut32.dll, olepro32.dll. -Size = 1.0MB +Size = 1.02MB Category = 14 URLSite = http://support.microsoft.com/kb/192461/ URLDownload = http://download.microsoft.com/download/5/a/d/5ad868a0-8ecd-4bb0-a882-fe53eb7ef348/VB6.0-KB290887-X86.exe diff --git a/reactos/base/applications/rapps/rapps/vc2008sp1run.txt b/reactos/base/applications/rapps/rapps/vc2008sp1run.txt index 2743f24c607..81051dece59 100644 --- a/reactos/base/applications/rapps/rapps/vc2008sp1run.txt +++ b/reactos/base/applications/rapps/rapps/vc2008sp1run.txt @@ -5,7 +5,7 @@ Name = Microsoft Visual C++ 2008 SP1 Redistributable Package Version = 8.0 Licence = Unknown Description = Visual Studio 2008 SP1 Runtime. Contains: atl90.dll, mfc90.dll, mfc90u.dll, mfcm90.dll, mfcm90u.dll, msdia90.dll, msvcm90.dll, msvcp90.dll, msvcr90.dll, vcomp90.dll. -Size = 4.0MB +Size = 4.02MB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=en URLDownload = http://download.microsoft.com/download/d/d/9/dd9a82d0-52ef-40db-8dab-795376989c03/vcredist_x86.exe diff --git a/reactos/base/applications/rapps/rapps/vc6run.txt b/reactos/base/applications/rapps/rapps/vc6run.txt index 0f45b98a420..bcc4878753a 100644 --- a/reactos/base/applications/rapps/rapps/vc6run.txt +++ b/reactos/base/applications/rapps/rapps/vc6run.txt @@ -5,7 +5,7 @@ Name = Microsoft Visual C++ 6 Redistributable Package Version = 6.0 Licence = Unknown Description = Visual Studio 6 Runtime. Contains: advpack.dll, asycfilt.dll, atla.dll, atlu.dll, comcat.dll, mfc42.dll, mfc42u.dll, msvcirt.dll, msvcp60.dll, msvcrt.dll, oleaut32.dll, olepro32.dll. -Size = 1.7MB +Size = 1.75MB Category = 14 URLSite = http://support.microsoft.com/kb/259403/ URLDownload = http://download.microsoft.com/download/vc60pro/update/1/w9xnt4/en-us/vc6redistsetup_enu.exe diff --git a/reactos/base/applications/rapps/rapps/winboard.txt b/reactos/base/applications/rapps/rapps/winboard.txt index a7a0db6ffb5..08cfc055bae 100644 --- a/reactos/base/applications/rapps/rapps/winboard.txt +++ b/reactos/base/applications/rapps/rapps/winboard.txt @@ -5,7 +5,7 @@ Name = WinBoard Version = 4.2.7b Licence = GPL 3 Description = WinBoard is a graphical chessboard for the Windows/ReactOS that can serve as a user interface for GNU Chess, Crafty, and other chess engines, for the Internet Chess Servers, and for electronic mail correspondence chess. -Size = 5.9MB +Size = 5.93MB Category = 4 URLSite = http://www.gnu.org/software/xboard/ URLDownload = http://ftp.gnu.org/old-gnu/xboard/winboard/winboard-4_2_7b.exe diff --git a/reactos/base/applications/rapps/rapps/wme9.txt b/reactos/base/applications/rapps/rapps/wme9.txt index cced38c3f0f..749258357c2 100644 --- a/reactos/base/applications/rapps/rapps/wme9.txt +++ b/reactos/base/applications/rapps/rapps/wme9.txt @@ -5,7 +5,7 @@ Name = Windows Media Encoder 9 Version = 9.0 Licence = Unknown Description = Windows Media Encoder 9 -Size = 9.5MB +Size = 9.46MB Category = 14 URLSite = http://www.microsoft.com/downloads/details.aspx?FamilyID=5691ba02-e496-465a-bba9-b2f1182cdf24 URLDownload = http://download.microsoft.com/download/8/1/f/81f9402f-efdd-439d-b2a4-089563199d47/WMEncoder.exe From 83904f66db540d7d31648633960f984b4625d672 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 6 Feb 2012 00:24:31 +0000 Subject: [PATCH 226/289] [NTOSKRNL] - Add MM_HAL_VA_END and use it in MiAddHalIoMappings instead of making assumptions about the page tables - Add MM_SHARED_USER_DATA_VA for x86 - use MM_SHARED_USER_DATA_VA in Mm to avoid ambiguities - fix or comment out USER_SHARED_DATA in asm headers, as it should be the kernel mode address here - set Teb->ExceptionList to NULL on amd64, it is used as a link to the Wow64 TEB, if any svn path=/trunk/; revision=55445 --- reactos/hal/halx86/apic/rtctimer.c | 8 ++++---- reactos/include/asm/ksx.template.h | 2 +- reactos/include/ndk/amd64/ketypes.h | 1 + reactos/include/ndk/i386/ketypes.h | 1 + reactos/include/ndk/i386/mmtypes.h | 5 +++++ reactos/include/reactos/ks386.inc | 2 +- reactos/include/reactos/ksamd64.inc | 2 +- reactos/ntoskrnl/mm/ARM3/mminit.c | 9 +++++---- reactos/ntoskrnl/mm/ARM3/pagfault.c | 2 +- reactos/ntoskrnl/mm/ARM3/procsup.c | 6 +++++- reactos/ntoskrnl/mm/ARM3/virtual.c | 6 +++--- 11 files changed, 28 insertions(+), 16 deletions(-) diff --git a/reactos/hal/halx86/apic/rtctimer.c b/reactos/hal/halx86/apic/rtctimer.c index 1384b68dd8c..5b86a1682a5 100644 --- a/reactos/hal/halx86/apic/rtctimer.c +++ b/reactos/hal/halx86/apic/rtctimer.c @@ -19,10 +19,10 @@ const UCHAR HalpClockVector = 0xD1; BOOLEAN HalpClockSetMSRate; UCHAR HalpNextMSRate; -UCHAR HalpCurrentRate = 9; /* Initial rate 9: 128 Hz / 7,8 ms */ +UCHAR HalpCurrentRate = 9; /* Initial rate 9: 128 Hz / 7.8 ms */ ULONG HalpCurrentTimeIncrement; -static UCHAR RtcMinimumClockRate = 6; /* Minimum rate 6: 16 Hz / 62,5 ms */ -static UCHAR RtcMaximumClockRate = 10; /* Maximum rate 10: 256 Hz / 3,9 ms */ +static UCHAR RtcMinimumClockRate = 6; /* Minimum rate 6: 16 Hz / 62.5 ms */ +static UCHAR RtcMaximumClockRate = 10; /* Maximum rate 10: 256 Hz / 3.9 ms */ ULONG @@ -131,7 +131,7 @@ HalpClockInterruptHandler(IN PKTRAP_FRAME TrapFrame) if (HalpClockSetMSRate) { /* Set new clock rate */ - RtcSetClockRate(HalpCurrentRate); + RtcSetClockRate(HalpNextMSRate); /* We're done */ HalpClockSetMSRate = FALSE; diff --git a/reactos/include/asm/ksx.template.h b/reactos/include/asm/ksx.template.h index cd98da0f9fd..d66c1b4707f 100644 --- a/reactos/include/asm/ksx.template.h +++ b/reactos/include/asm/ksx.template.h @@ -240,7 +240,7 @@ CONSTANT(Executive), CONSTANT(FALSE), CONSTANT(TRUE), CONSTANT(DBG_STATUS_CONTROL_C), -CONSTANTPTR(USER_SHARED_DATA), +//CONSTANTPTR(USER_SHARED_DATA), // FIXME: we need the kernel mode address here! //CONSTANT(MM_SHARED_USER_DATA_VA), CONSTANT(PAGE_SIZE), //CONSTANT(KERNEL_STACK_CONTROL_LARGE_STACK), diff --git a/reactos/include/ndk/amd64/ketypes.h b/reactos/include/ndk/amd64/ketypes.h index 6b3f90a790d..36406091eb5 100644 --- a/reactos/include/ndk/amd64/ketypes.h +++ b/reactos/include/ndk/amd64/ketypes.h @@ -164,6 +164,7 @@ Author: #define INITIAL_STALL_COUNT 100 #define HYPERSPACE_BASE 0xfffff70000000000ULL #define MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL /* This is Vista+ */ +#define MM_HAL_VA_END 0xFFFFFFFFFFFFFFFFULL #define APIC_BASE 0xFFFFFFFFFFFE0000ULL // diff --git a/reactos/include/ndk/i386/ketypes.h b/reactos/include/ndk/i386/ketypes.h index 5845a73ffe2..1beda332e3d 100644 --- a/reactos/include/ndk/i386/ketypes.h +++ b/reactos/include/ndk/i386/ketypes.h @@ -142,6 +142,7 @@ Author: #define HYPERSPACE_BASE 0xc0800000 #endif #define MM_HAL_VA_START 0xFFC00000 +#define MM_HAL_VA_END 0xFFFFFFFF #define APIC_BASE 0xFFFE0000 // diff --git a/reactos/include/ndk/i386/mmtypes.h b/reactos/include/ndk/i386/mmtypes.h index 01bc426ca6b..a4105c95ecb 100644 --- a/reactos/include/ndk/i386/mmtypes.h +++ b/reactos/include/ndk/i386/mmtypes.h @@ -31,6 +31,11 @@ Author: #define MM_ALLOCATION_GRANULARITY 0x10000 #define MM_ALLOCATION_GRANULARITY_SHIFT 16L +// +// Address of the shared user page +// +#define MM_SHARED_USER_DATA_VA 0x7FFE0000 + // // Sanity checks for Paging Macros // diff --git a/reactos/include/reactos/ks386.inc b/reactos/include/reactos/ks386.inc index f3791133cca..c7ccf36f551 100644 --- a/reactos/include/reactos/ks386.inc +++ b/reactos/include/reactos/ks386.inc @@ -182,7 +182,7 @@ Executive = 0x0 FALSE = 0x0 TRUE = 0x1 DBG_STATUS_CONTROL_C = 0x1 -USER_SHARED_DATA = 0x7ffe0000 +USER_SHARED_DATA = 0xffdf0000 PAGE_SIZE = 0x1000 MAXIMUM_IDTVECTOR = 0xff PRIMARY_VECTOR_BASE = 0x30 diff --git a/reactos/include/reactos/ksamd64.inc b/reactos/include/reactos/ksamd64.inc index ff308023213..24caf537153 100644 --- a/reactos/include/reactos/ksamd64.inc +++ b/reactos/include/reactos/ksamd64.inc @@ -182,7 +182,7 @@ Executive = 0x0 FALSE = 0x0 TRUE = 0x1 DBG_STATUS_CONTROL_C = 0x1 -USER_SHARED_DATA = 0x7ffe0000 +USER_SHARED_DATA = 0xffdf0000 PAGE_SIZE = 0x1000 MAXIMUM_IDTVECTOR = 0xff PRIMARY_VECTOR_BASE = 0x30 diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 4ecb18f5cc7..3d19b04e2dd 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -1284,9 +1284,9 @@ INIT_FUNCTION MiAddHalIoMappings(VOID) { PVOID BaseAddress; - PMMPDE PointerPde; + PMMPDE PointerPde, LastPde; PMMPTE PointerPte; - ULONG i, j, PdeCount; + ULONG j; PFN_NUMBER PageFrameIndex; /* HAL Heap address -- should be on a PDE boundary */ @@ -1295,8 +1295,9 @@ MiAddHalIoMappings(VOID) /* Check how many PDEs the heap has */ PointerPde = MiAddressToPde(BaseAddress); - PdeCount = PDE_COUNT - MiGetPdeOffset(BaseAddress); - for (i = 0; i < PdeCount; i++) + LastPde = MiAddressToPde((PVOID)MM_HAL_VA_END); + + while (PointerPde <= LastPde) { /* Does the HAL own this mapping? */ if ((PointerPde->u.Hard.Valid == 1) && diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index a7c1841d63d..cc609210242 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -56,7 +56,7 @@ MiCheckVirtualAddress(IN PVOID VirtualAddress, ASSERT(MI_IS_SESSION_ADDRESS(VirtualAddress) == FALSE); /* Special case for shared data */ - if (PAGE_ALIGN(VirtualAddress) == (PVOID)USER_SHARED_DATA) + if (PAGE_ALIGN(VirtualAddress) == (PVOID)MM_SHARED_USER_DATA_VA) { /* It's a read-only page */ *ProtectCode = MM_READONLY; diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index a9928dcf6cf..0b6c3faed8b 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -29,7 +29,7 @@ MiRosTakeOverSharedUserPage(IN PEPROCESS Process) NTSTATUS Status; PMEMORY_AREA MemoryArea; PHYSICAL_ADDRESS BoundaryAddressMultiple; - PVOID AllocatedBase = (PVOID)USER_SHARED_DATA; + PVOID AllocatedBase = (PVOID)MM_SHARED_USER_DATA_VA; BoundaryAddressMultiple.QuadPart = 0; Status = MmCreateMemoryArea(&Process->Vm, @@ -830,7 +830,11 @@ MmCreateTeb(IN PEPROCESS Process, // // Set TIB Data // +#ifdef _M_AMD64 + Teb->NtTib.ExceptionList = NULL; +#else Teb->NtTib.ExceptionList = EXCEPTION_CHAIN_END; +#endif Teb->NtTib.Self = (PNT_TIB)Teb; // diff --git a/reactos/ntoskrnl/mm/ARM3/virtual.c b/reactos/ntoskrnl/mm/ARM3/virtual.c index 52d88b859e0..22526aeb201 100644 --- a/reactos/ntoskrnl/mm/ARM3/virtual.c +++ b/reactos/ntoskrnl/mm/ARM3/virtual.c @@ -2360,7 +2360,7 @@ MiQueryMemoryBasicInformation(IN HANDLE ProcessHandle, /* Check for illegal addresses in user-space, or the shared memory area */ if ((BaseAddress > MM_HIGHEST_VAD_ADDRESS) || - (PAGE_ALIGN(BaseAddress) == (PVOID)USER_SHARED_DATA)) + (PAGE_ALIGN(BaseAddress) == (PVOID)MM_SHARED_USER_DATA_VA)) { Address = PAGE_ALIGN(BaseAddress); @@ -2370,9 +2370,9 @@ MiQueryMemoryBasicInformation(IN HANDLE ProcessHandle, MemoryInfo.Type = MEM_PRIVATE; /* Special case for shared data */ - if (Address == (PVOID)USER_SHARED_DATA) + if (Address == (PVOID)MM_SHARED_USER_DATA_VA) { - MemoryInfo.AllocationBase = (PVOID)USER_SHARED_DATA; + MemoryInfo.AllocationBase = (PVOID)MM_SHARED_USER_DATA_VA; MemoryInfo.State = MEM_COMMIT; MemoryInfo.Protect = PAGE_READONLY; MemoryInfo.RegionSize = PAGE_SIZE; From a78b493a6b5f41d77a619a1623232220ba5c770d Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 6 Feb 2012 00:29:50 +0000 Subject: [PATCH 227/289] [NTOSKRNL] In PeFmtCreateSection don't use the ImageBase field of the ImageOptionalHeader directly, since it's different between PE32 and PE64. Use the ImageSectionObject->ImageBase field instead, which already contains the correct value. svn path=/trunk/; revision=55446 --- reactos/ntoskrnl/mm/section.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/section.c b/reactos/ntoskrnl/mm/section.c index 00556d82fe9..be5c5dd4bac 100644 --- a/reactos/ntoskrnl/mm/section.c +++ b/reactos/ntoskrnl/mm/section.c @@ -402,7 +402,7 @@ l_ReadHeaderFromFile: break; } - /* PE32+ */ + /* PE64 */ case IMAGE_NT_OPTIONAL_HDR64_MAGIC: { const IMAGE_OPTIONAL_HEADER64 * pioh64OptHeader; @@ -463,7 +463,7 @@ l_ReadHeaderFromFile: if(RTL_CONTAINS_FIELD(piohOptHeader, cbOptHeaderSize, AddressOfEntryPoint)) { - ImageSectionObject->EntryPoint = piohOptHeader->ImageBase + + ImageSectionObject->EntryPoint = ImageSectionObject->ImageBase + piohOptHeader->AddressOfEntryPoint; } From 16b9a65060b77fd9bdc27fe184a2fe7f7c1eaeee Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 6 Feb 2012 06:53:28 +0000 Subject: [PATCH 228/289] [NTOSKRNL]: Partly implement NtAreMappedFilesTheSame... [NTDLL]: Fix (although I'm not sure quite why) LdrpCheckForLoadedDll which was crashing now that I've fixed PAGE_EXECUTE sections with only FILE_EXECUTE handles. Ironically, this meant that LdrpCheckForLoadedDll never worked until my previous fix some revisions ago, it always returned FALSE. This should fix KVM/QEMU crashes... svn path=/trunk/; revision=55448 --- reactos/dll/ntdll/ldr/ldrutils.c | 7 +-- reactos/ntoskrnl/mm/ARM3/section.c | 84 +++++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 8 deletions(-) diff --git a/reactos/dll/ntdll/ldr/ldrutils.c b/reactos/dll/ntdll/ldr/ldrutils.c index de93a738b34..4bc12c0705a 100644 --- a/reactos/dll/ntdll/ldr/ldrutils.c +++ b/reactos/dll/ntdll/ldr/ldrutils.c @@ -2204,12 +2204,7 @@ lookinhash: { /* Headers match too! Finally ask the kernel to compare mapped files */ Status = ZwAreMappedFilesTheSame(CurEntry->DllBase, ViewBase); - if (!NT_SUCCESS(Status)) - { - /* Almost identical, but not quite, keep trying */ - _SEH2_YIELD(continue;) - } - else + if (NT_SUCCESS(Status)) { /* This is our entry!, unmap and return success */ *LdrEntry = CurEntry; diff --git a/reactos/ntoskrnl/mm/ARM3/section.c b/reactos/ntoskrnl/mm/ARM3/section.c index c1a6dfe343b..ef8cfc843bf 100644 --- a/reactos/ntoskrnl/mm/ARM3/section.c +++ b/reactos/ntoskrnl/mm/ARM3/section.c @@ -1383,8 +1383,88 @@ NTAPI NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, IN PVOID File2MappedAsFile) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PVOID AddressSpace; + PMEMORY_AREA MemoryArea1, MemoryArea2; + PROS_SECTION_OBJECT Section1, Section2; + + DPRINT1("Is image: %p the same as file: %p?\n", File1MappedAsAnImage, File2MappedAsFile); + + /* Lock address space */ + AddressSpace = MmGetCurrentAddressSpace(); + MmLockAddressSpace(AddressSpace); + + /* Locate the memory area for the process by address */ + MemoryArea1 = MmLocateMemoryAreaByAddress(AddressSpace, File1MappedAsAnImage); + if (!MemoryArea1) + { + /* Fail, the address does not exist */ + DPRINT1("Invalid address\n"); + MmUnlockAddressSpace(AddressSpace); + return STATUS_INVALID_ADDRESS; + } + + /* Check if it's a section view (RosMm section) or ARM3 section */ + if (MemoryArea1->Type != MEMORY_AREA_SECTION_VIEW) + { + /* Fail, the address is not a section */ + DPRINT1("Invalid address (not a section)\n"); + MmUnlockAddressSpace(AddressSpace); + return STATUS_CONFLICTING_ADDRESSES; + } + + /* Get the section pointer to the SECTION_OBJECT */ + Section1 = MemoryArea1->Data.SectionData.Section; + if (Section1->FileObject == NULL) + { + DPRINT1("No file object\n"); + MmUnlockAddressSpace(AddressSpace); + return STATUS_CONFLICTING_ADDRESSES; + } + + /* Locate the memory area for the process by address */ + MemoryArea2 = MmLocateMemoryAreaByAddress(AddressSpace, File2MappedAsFile); + if (!MemoryArea2) + { + /* Fail, the address does not exist */ + DPRINT1("Invalid address\n"); + MmUnlockAddressSpace(AddressSpace); + return STATUS_INVALID_ADDRESS; + } + + /* Check if it's a section view (RosMm section) or ARM3 section */ + if (MemoryArea2->Type != MEMORY_AREA_SECTION_VIEW) + { + /* Fail, the address is not a section */ + DPRINT1("Invalid address (not a section)\n"); + MmUnlockAddressSpace(AddressSpace); + return STATUS_CONFLICTING_ADDRESSES; + } + + /* Get the section pointer to the SECTION_OBJECT */ + Section2 = MemoryArea2->Data.SectionData.Section; + if (Section2->FileObject == NULL) + { + DPRINT1("No file object\n"); + MmUnlockAddressSpace(AddressSpace); + return STATUS_CONFLICTING_ADDRESSES; + } + + /* These dbgprints should allow me to see what should w ecompare in ROS's section implementation once the winetests are run... for now lie and say they're not equal. */ + DPRINT1("FO1/2: %p %p\n", Section1->FileObject, Section2->FileObject); + DPRINT1("SOP: %p %p\n", + Section1->FileObject->SectionObjectPointer, + Section2->FileObject->SectionObjectPointer); + DPRINT1("SCM: %p %p\n", + Section1->FileObject->SectionObjectPointer->SharedCacheMap, + Section2->FileObject->SectionObjectPointer->SharedCacheMap); + DPRINT1("ISO: %p %p\n", + Section1->FileObject->SectionObjectPointer->ImageSectionObject, + Section2->FileObject->SectionObjectPointer->ImageSectionObject); + DPRINT1("SISO: %p %p\n", Section1->ImageSection, Section2->ImageSection); + + /* Unlock address space */ + MmUnlockAddressSpace(AddressSpace); + return STATUS_NOT_SAME_DEVICE; } /* From f17b946a8854964c8334462ee53eb32fe672b648 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 6 Feb 2012 08:17:03 +0000 Subject: [PATCH 229/289] [NTOSKRNL]: Finish implementation of NtAreMappedFilesTheSame based on what winetests revealed. Should fix all 20+ winetests in this area, on top of making Ldr suck less. svn path=/trunk/; revision=55452 --- reactos/ntoskrnl/mm/ARM3/section.c | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/section.c b/reactos/ntoskrnl/mm/ARM3/section.c index ef8cfc843bf..d4a06e2d2e0 100644 --- a/reactos/ntoskrnl/mm/ARM3/section.c +++ b/reactos/ntoskrnl/mm/ARM3/section.c @@ -1387,8 +1387,6 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, PMEMORY_AREA MemoryArea1, MemoryArea2; PROS_SECTION_OBJECT Section1, Section2; - DPRINT1("Is image: %p the same as file: %p?\n", File1MappedAsAnImage, File2MappedAsFile); - /* Lock address space */ AddressSpace = MmGetCurrentAddressSpace(); MmLockAddressSpace(AddressSpace); @@ -1398,7 +1396,6 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, if (!MemoryArea1) { /* Fail, the address does not exist */ - DPRINT1("Invalid address\n"); MmUnlockAddressSpace(AddressSpace); return STATUS_INVALID_ADDRESS; } @@ -1407,7 +1404,6 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, if (MemoryArea1->Type != MEMORY_AREA_SECTION_VIEW) { /* Fail, the address is not a section */ - DPRINT1("Invalid address (not a section)\n"); MmUnlockAddressSpace(AddressSpace); return STATUS_CONFLICTING_ADDRESSES; } @@ -1416,7 +1412,6 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, Section1 = MemoryArea1->Data.SectionData.Section; if (Section1->FileObject == NULL) { - DPRINT1("No file object\n"); MmUnlockAddressSpace(AddressSpace); return STATUS_CONFLICTING_ADDRESSES; } @@ -1426,7 +1421,6 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, if (!MemoryArea2) { /* Fail, the address does not exist */ - DPRINT1("Invalid address\n"); MmUnlockAddressSpace(AddressSpace); return STATUS_INVALID_ADDRESS; } @@ -1435,7 +1429,6 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, if (MemoryArea2->Type != MEMORY_AREA_SECTION_VIEW) { /* Fail, the address is not a section */ - DPRINT1("Invalid address (not a section)\n"); MmUnlockAddressSpace(AddressSpace); return STATUS_CONFLICTING_ADDRESSES; } @@ -1444,23 +1437,17 @@ NtAreMappedFilesTheSame(IN PVOID File1MappedAsAnImage, Section2 = MemoryArea2->Data.SectionData.Section; if (Section2->FileObject == NULL) { - DPRINT1("No file object\n"); MmUnlockAddressSpace(AddressSpace); return STATUS_CONFLICTING_ADDRESSES; } - /* These dbgprints should allow me to see what should w ecompare in ROS's section implementation once the winetests are run... for now lie and say they're not equal. */ - DPRINT1("FO1/2: %p %p\n", Section1->FileObject, Section2->FileObject); - DPRINT1("SOP: %p %p\n", - Section1->FileObject->SectionObjectPointer, - Section2->FileObject->SectionObjectPointer); - DPRINT1("SCM: %p %p\n", - Section1->FileObject->SectionObjectPointer->SharedCacheMap, - Section2->FileObject->SectionObjectPointer->SharedCacheMap); - DPRINT1("ISO: %p %p\n", - Section1->FileObject->SectionObjectPointer->ImageSectionObject, - Section2->FileObject->SectionObjectPointer->ImageSectionObject); - DPRINT1("SISO: %p %p\n", Section1->ImageSection, Section2->ImageSection); + /* The shared cache map seems to be the same if both of these are equal */ + if (Section1->FileObject->SectionObjectPointer->SharedCacheMap == + Section2->FileObject->SectionObjectPointer->SharedCacheMap) + { + MmUnlockAddressSpace(AddressSpace); + return STATUS_SUCCESS; + } /* Unlock address space */ MmUnlockAddressSpace(AddressSpace); From 12f8a6d6a61c8407f204fcfd513e8a63537df226 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 6 Feb 2012 09:06:38 +0000 Subject: [PATCH 230/289] [SMSS2]: Implement SmpProcessFileRenames and actually create the paging file now. All initialization work is now done by SMSS2. [SMSS]: Neuter away most of the code and only keep SMSS around for managing the API port. Next step is to make the SMSS2 API port go into use. svn path=/trunk/; revision=55453 --- reactos/base/system/smss/init.c | 14 +- reactos/base/system/smss2/pagefile.c | 4 +- reactos/base/system/smss2/sminit.c | 206 ++++++++++++++++++++++++++- 3 files changed, 213 insertions(+), 11 deletions(-) diff --git a/reactos/base/system/smss/init.c b/reactos/base/system/smss/init.c index 1ad50e33989..54678f4ffc1 100644 --- a/reactos/base/system/smss/init.c +++ b/reactos/base/system/smss/init.c @@ -23,16 +23,16 @@ struct { PCHAR ErrorMessage; } InitRoutine [] = { {TRUE, SmCreateHeap, "create private heap, aborting"}, - {TRUE, SmCreateObjectDirectories, "create object directories"}, +// {TRUE, SmCreateObjectDirectories, "create object directories"}, {TRUE, SmCreateApiPort, "create \\SmApiPort"}, {TRUE, SmCreateEnvironment, "create the system environment"}, - {TRUE, SmSetEnvironmentVariables, "set system environment variables"}, - {TRUE, SmInitDosDevices, "create dos device links"}, - {TRUE, SmRunBootApplications, "run boot applications"}, - {TRUE, SmProcessFileRenameList, "process the file rename list"}, +// {TRUE, SmSetEnvironmentVariables, "set system environment variables"}, +// {TRUE, SmInitDosDevices, "create dos device links"}, +// {TRUE, SmRunBootApplications, "run boot applications"}, +// {TRUE, SmProcessFileRenameList, "process the file rename list"}, {FALSE, SmUpdateEnvironment, "update environment variables"}, - {FALSE, SmLoadKnownDlls, "preload system DLLs"}, - {TRUE, SmCreatePagingFiles, "create paging files"}, +// {FALSE, SmLoadKnownDlls, "preload system DLLs"}, +// {TRUE, SmCreatePagingFiles, "create paging files"}, // {TRUE, SmInitializeRegistry, "initialize the registry"}, {TRUE, SmInitializeClientManagement, "initialize client management"}, {TRUE, SmLoadSubsystems, "load subsystems"} diff --git a/reactos/base/system/smss2/pagefile.c b/reactos/base/system/smss2/pagefile.c index f257963641a..035f437d858 100644 --- a/reactos/base/system/smss2/pagefile.c +++ b/reactos/base/system/smss2/pagefile.c @@ -451,11 +451,9 @@ SmpCreatePagingFile(IN PUNICODE_STRING Name, IN ULONG Priority) { NTSTATUS Status; - DPRINT1("Should request pagefile: %wZ with size %I64x and %I64x\n", Name, MinSize->QuadPart, MaxSize->QuadPart); /* Tell the kernel to create the pagefile */ - Status = STATUS_SUCCESS; - //Status = NtCreatePagingFile(Name, MinSize, MaxSize, Priority); + Status = NtCreatePagingFile(Name, MinSize, MaxSize, Priority); if (NT_SUCCESS(Status)) { DPRINT1("SMSS:PFILE: NtCreatePagingFile (%wZ, %I64X, %I64X) succeeded. \n", diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index 625de6a58be..c07bfc936a2 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -1827,7 +1827,211 @@ NTSTATUS NTAPI SmpProcessFileRenames(VOID) { - return STATUS_SUCCESS; + BOOLEAN OldState, HavePrivilege; + NTSTATUS Status; + HANDLE FileHandle, OtherFileHandle; + FILE_INFORMATION_CLASS InformationClass; + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK IoStatusBlock; + UNICODE_STRING FileString; + FILE_BASIC_INFORMATION BasicInfo; + FILE_DISPOSITION_INFORMATION DeleteInformation; + PFILE_RENAME_INFORMATION Buffer; + PLIST_ENTRY Head, NextEntry; + PSMP_REGISTRY_VALUE RegEntry; + PWCHAR FileName; + ULONG ValueLength, Length; + + /* Give us access to restore any files we want */ + Status = RtlAdjustPrivilege(SE_RESTORE_PRIVILEGE, TRUE, FALSE, &OldState); + if (NT_SUCCESS(Status)) HavePrivilege = TRUE; + + /* Process pending files to rename */ + Head = &SmpFileRenameList; + while (!IsListEmpty(Head)) + { + /* Get this entry */ + NextEntry = RemoveHeadList(Head); + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("Processing PFRO: %wZ/%wZ\n", &RegEntry->Value, &RegEntry->Name); + + /* Skip past the '@' marker */ + if (!(RegEntry->Value.Length) && (*RegEntry->Name.Buffer == L'@')) + { + RegEntry->Name.Length -= sizeof(UNICODE_NULL); + RegEntry->Name.Buffer++; + } + + /* Open the file for delete access */ + InitializeObjectAttributes(&ObjectAttributes, + &RegEntry->Name, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenFile(&OtherFileHandle, + DELETE | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) goto Quickie; + + /* Check if it's a rename or just a delete */ + ValueLength = RegEntry->Value.Length; + if (!ValueLength) + { + /* Just a delete, set up the class, length and buffer */ + InformationClass = FileDispositionInformation; + Length = sizeof(DeleteInformation); + Buffer = (PFILE_RENAME_INFORMATION)&DeleteInformation; + + /* Set the delete disposition */ + DeleteInformation.DeleteFile = TRUE; + } + else + { + /* This is a rename, setup the class and length */ + InformationClass = FileRenameInformation; + Length = ValueLength + sizeof(FILE_RENAME_INFORMATION); + + /* Skip past the special markers */ + FileName = RegEntry->Value.Buffer; + if ((*FileName == L'!') || (*FileName == L'@')) + { + FileName++; + Length -= sizeof(UNICODE_NULL); + } + + /* Now allocate the buffer for the rename information */ + Buffer = RtlAllocateHeap(RtlGetProcessHeap(), SmBaseTag, Length); + if (Buffer) + { + /* Setup the buffer to point to the filename, and copy it */ + Buffer->RootDirectory = NULL; + Buffer->FileNameLength = Length - sizeof(FILE_RENAME_INFORMATION); + Buffer->ReplaceIfExists = FileName != RegEntry->Value.Buffer; + RtlCopyMemory(Buffer->FileName, FileName, Buffer->FileNameLength); + } + else + { + /* Fail */ + Status = STATUS_NO_MEMORY; + } + } + + /* Check if everything is okay till here */ + if (NT_SUCCESS(Status)) + { + /* Now either rename or delete the file as requested */ + Status = NtSetInformationFile(OtherFileHandle, + &IoStatusBlock, + Buffer, + Length, + InformationClass); + + /* Check if we seem to have failed because the file was readonly */ + if ((NT_SUCCESS(Status) && + (InformationClass == FileRenameInformation) && + (Status == STATUS_OBJECT_NAME_COLLISION) && + (Buffer->ReplaceIfExists))) + { + /* Open the file for write attribute access this time... */ + DPRINT1("\nSMSS: %wZ => %wZ failed - Status == %x, Possible readonly target\n", + &RegEntry->Name, + &RegEntry->Value, + STATUS_OBJECT_NAME_COLLISION); + FileString.Length = RegEntry->Value.Length - sizeof(WCHAR); + FileString.MaximumLength = RegEntry->Value.MaximumLength - sizeof(WCHAR); + FileString.Buffer = FileName; + InitializeObjectAttributes(&ObjectAttributes, + &FileString, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenFile(&FileHandle, + FILE_WRITE_ATTRIBUTES | SYNCHRONIZE, + &ObjectAttributes, + &IoStatusBlock, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) + { + /* That didn't work, so bail out */ + DPRINT1(" SMSS: Open Existing file Failed - Status == %x\n", + Status); + } + else + { + /* Now remove the read-only attribute from the file */ + DPRINT1(" SMSS: Open Existing Success\n"); + RtlZeroMemory(&BasicInfo, sizeof(BasicInfo)); + BasicInfo.FileAttributes = FILE_ATTRIBUTE_NORMAL; + Status = NtSetInformationFile(FileHandle, + &IoStatusBlock, + &BasicInfo, + sizeof(BasicInfo), + FileBasicInformation); + NtClose(FileHandle); + if (!NT_SUCCESS(Status)) + { + /* That didn't work, bail out */ + DPRINT1(" SMSS: Set To NORMAL Failed - Status == %x\n", + Status); + } + else + { + /* Now that the file is no longer read-only, delete! */ + DPRINT1(" SMSS: Set To NORMAL OK\n"); + Status = NtSetInformationFile(OtherFileHandle, + &IoStatusBlock, + Buffer, + Length, + FileRenameInformation); + if (!NT_SUCCESS(Status)) + { + /* That failed too! */ + DPRINT1(" SMSS: Re-Rename Failed - Status == %x\n", + Status); + } + else + { + /* Everything ok */ + DPRINT1(" SMSS: Re-Rename Worked OK\n"); + } + } + } + } + } + + /* Close the file handle and check the operation result */ + NtClose(OtherFileHandle); +Quickie: + if (!NT_SUCCESS(Status)) + { + /* We totally failed */ + DPRINT1("SMSS: %wZ => %wZ failed - Status == %x\n", + &RegEntry->Name, &RegEntry->Value, Status); + } + else if (RegEntry->Value.Length) + { + /* We succeed with a rename */ + DPRINT1("SMSS: %wZ (renamed to) %wZ\n", &RegEntry->Name, &RegEntry->Value); + } + else + { + /* We suceeded with a delete */ + DPRINT1("SMSS: %wZ (deleted)\n", &RegEntry->Name); + } + + /* Now free this entry and keep going */ + if (RegEntry->AnsiValue) RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->AnsiValue); + if (RegEntry->Value.Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry->Value.Buffer); + RtlFreeHeap(RtlGetProcessHeap(), 0, RegEntry); + } + + /* Put back the restore privilege if we had requested it, and return */ + if (HavePrivilege) RtlAdjustPrivilege(SE_RESTORE_PRIVILEGE, FALSE, FALSE, &OldState); + return Status; } NTSTATUS From b207b33d11d8c7ae7f4689b8ca527ef9b59e6e77 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 6 Feb 2012 09:26:23 +0000 Subject: [PATCH 231/289] =?UTF-8?q?[=C3=87NTOSKRNL]=20-=20modify=20MiResol?= =?UTF-8?q?veDemandZeroFault=20to=20take=20the=20page=20protection=20as=20?= =?UTF-8?q?a=20parameter=20instead=20of=20the=20PTE.=20This=20will=20be=20?= =?UTF-8?q?used=20soon.=20-=20Move=20increment=20of=20counters=20into=20th?= =?UTF-8?q?e=20region=20where=20the=20pfn=20lock=20is=20held=20to=20avoid?= =?UTF-8?q?=20race=20conditions=20and=20make=20heavy=20locked=20operations?= =?UTF-8?q?=20unneccessary=20-=20Add=20some=20ASSERTs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=55454 --- reactos/ntoskrnl/mm/ARM3/pagfault.c | 85 ++++++++++++----------------- 1 file changed, 34 insertions(+), 51 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index cc609210242..baa72e47818 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -209,11 +209,12 @@ MiZeroPfn(IN PFN_NUMBER PageFrameNumber) NTSTATUS NTAPI MiResolveDemandZeroFault(IN PVOID Address, - IN PMMPTE PointerPte, + IN ULONG Protection, IN PEPROCESS Process, IN KIRQL OldIrql) { PFN_NUMBER PageFrameNumber = 0; + PMMPTE PointerPte = MiAddressToPte(Address); MMPTE TempPte; BOOLEAN NeedZero = FALSE, HaveLock = FALSE; ULONG Color; @@ -294,14 +295,12 @@ MiResolveDemandZeroFault(IN PVOID Address, /* Initialize it */ MiInitializePfn(PageFrameNumber, PointerPte, TRUE); + /* Increment demand zero faults */ + KeGetCurrentPrcb()->MmDemandZeroCount++; + /* Release PFN lock if needed */ if (HaveLock) KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - // - // Increment demand zero faults - // - InterlockedIncrement(&KeGetCurrentPrcb()->MmDemandZeroCount); - /* Zero the page if need be */ if (NeedZero) MiZeroPfn(PageFrameNumber); @@ -311,7 +310,7 @@ MiResolveDemandZeroFault(IN PVOID Address, /* For user mode */ MI_MAKE_HARDWARE_PTE_USER(&TempPte, PointerPte, - PointerPte->u.Soft.Protection, + Protection, PageFrameNumber); } else @@ -319,7 +318,7 @@ MiResolveDemandZeroFault(IN PVOID Address, /* For kernel mode */ MI_MAKE_HARDWARE_PTE(&TempPte, PointerPte, - PointerPte->u.Soft.Protection, + Protection, PageFrameNumber); } @@ -462,7 +461,10 @@ MiResolveProtoPteFault(IN BOOLEAN StoreInstruction, ASSERT(TempPte.u.Soft.Transition == 0); /* Resolve the demand zero fault */ - Status = MiResolveDemandZeroFault(Address, PointerProtoPte, Process, OldIrql); + Status = MiResolveDemandZeroFault(Address, + (ULONG)PointerProtoPte->u.Soft.Protection, + Process, + OldIrql); ASSERT(NT_SUCCESS(Status)); /* Complete the prototype PTE fault -- this will release the PFN lock */ @@ -494,6 +496,9 @@ MiDispatchFault(IN BOOLEAN StoreInstruction, Address, Process); + /* Make sure the addresses are ok */ + ASSERT(PointerPte == MiAddressToPte(Address)); + // // Make sure APCs are off and we're not at dispatch // @@ -609,7 +614,7 @@ MiDispatchFault(IN BOOLEAN StoreInstruction, // we want. Go handle it! // Status = MiResolveDemandZeroFault(Address, - PointerPte, + (ULONG)PointerPte->u.Soft.Protection, Process, MM_NOIRQL); ASSERT(KeAreAllApcsDisabled() == TRUE); @@ -658,30 +663,23 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, DPRINT("ARM3 FAULT AT: %p\n", Address); - // - // Check for dispatch-level snafu - // + /* Check for page fault on high IRQL */ if (OldIrql > APC_LEVEL) { - // // There are some special cases where this is okay, but not in ARM3 yet - // DbgPrint("MM:***PAGE FAULT AT IRQL > 1 Va %p, IRQL %lx\n", Address, OldIrql); ASSERT(OldIrql <= APC_LEVEL); } - // - // Check for kernel fault address - // + /* Check for kernel fault address */ while (Address >= MmSystemRangeStart) { - // - // What are you even DOING here? - // + /* Bail out, if the fault came from user mode */ if (Mode == UserMode) return STATUS_ACCESS_VIOLATION; + /* PXEs and PPEs for kernel mode are mapped for everything we need */ #if (_MI_PAGING_LEVELS >= 3) if ( #if (_MI_PAGING_LEVELS == 4) @@ -689,6 +687,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, #endif (PointerPpe->u.Hard.Valid == 0)) { + /* The address is not from any pageable area! */ KeBugCheckEx(PAGE_FAULT_IN_NONPAGED_AREA, (ULONG_PTR)Address, StoreInstruction, @@ -697,9 +696,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, } #endif - // - // Is the PDE valid? - // + /* Check if the PDE is invalid */ if (PointerPde->u.Hard.Valid == 0) { // @@ -732,9 +729,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, } } - // - // The PDE is valid, so read the PTE - // + /* The PDE is valid, so read the PTE */ TempPte = *PointerPte; if (TempPte.u.Hard.Valid == 1) { @@ -751,9 +746,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, return STATUS_SUCCESS; } - // - // Check for a fault on the page table or hyperspace itself - // + // Check for a fault on the page table or hyperspace if (MI_IS_PAGE_TABLE_OR_HYPER_ADDRESS(Address)) { #if (_MI_PAGING_LEVELS == 2) @@ -776,26 +769,21 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, KeRaiseIrql(APC_LEVEL, &LockIrql); MiLockWorkingSet(CurrentThread, WorkingSet); - // - // Re-read PTE now that the IRQL has been raised - // + /* Re-read PTE now that we own the lock */ TempPte = *PointerPte; if (TempPte.u.Hard.Valid == 1) { - // // Only two things can go wrong here: // Executing NX page (we couldn't care less) // Writing to a read-only page (the stuff ARM3 works with is write, - // so again, moot point. - // + // so again, moot point). + ASSERT(TempPte.u.Hard.Write == 1); /* Release the working set */ MiUnlockWorkingSet(CurrentThread, WorkingSet); KeLowerIrql(LockIrql); - // // Otherwise, the PDE was probably invalid, and all is good now - // return STATUS_SUCCESS; } @@ -823,15 +811,13 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, } else { - // - // We don't implement transition PTEs - // + /* We don't implement transition PTEs */ ASSERT(TempPte.u.Soft.Transition == 0); /* Check for no-access PTE */ if (TempPte.u.Soft.Protection == MM_NOACCESS) { - /* Bad boy, bad boy, whatcha gonna do, whatcha gonna do when ARM3 comes for you! */ + /* Bugcheck the system! */ KeBugCheckEx(PAGE_FAULT_IN_NONPAGED_AREA, (ULONG_PTR)Address, StoreInstruction, @@ -855,9 +841,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, } } - // - // Now do the real fault handling - // + /* Now do the real fault handling */ Status = MiDispatchFault(StoreInstruction, Address, PointerPte, @@ -872,9 +856,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, MiUnlockWorkingSet(CurrentThread, WorkingSet); KeLowerIrql(LockIrql); - // - // We are done! - // + /* We are done! */ DPRINT("Fault resolved with status: %lx\n", Status); return Status; } @@ -939,7 +921,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, { /* Resolve the fault */ MiResolveDemandZeroFault(Address, - PointerPte, + (ULONG)PointerPte->u.Soft.Protection, CurrentProcess, MM_NOIRQL); @@ -1038,11 +1020,12 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, /* Initialize the PFN entry now */ MiInitializePfn(PageFrameIndex, PointerPte, 1); + /* One more demand-zero fault */ + KeGetCurrentPrcb()->MmDemandZeroCount++; + /* And we're done with the lock */ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - /* One more demand-zero fault */ - InterlockedIncrement(&KeGetCurrentPrcb()->MmDemandZeroCount); /* Was the fault on an actual user page, or a kernel page for the user? */ if (PointerPte <= MiHighestUserPte) From ed64af75b627f8ece6bdca6d61e5efa0bf2eb555 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 6 Feb 2012 09:29:33 +0000 Subject: [PATCH 232/289] [SMSS]: Nuke the environment code and instead inherit SMSS2's, which does all the right things. #if 0 all the non-used code, and nuke support for the "debug" subsystem as well as the custom "SmQuery" APIs. [SMSS2]: Use SMSS2's environment when creating SMSS. svn path=/trunk/; revision=55455 --- reactos/base/system/smss/client.c | 4 ++-- reactos/base/system/smss/debug.c | 3 +++ reactos/base/system/smss/init.c | 2 +- reactos/base/system/smss/initdosdev.c | 4 ++++ reactos/base/system/smss/initenv.c | 10 +++++----- reactos/base/system/smss/initmv.c | 3 +++ reactos/base/system/smss/initobdir.c | 2 ++ reactos/base/system/smss/initpage.c | 4 +++- reactos/base/system/smss/initreg.c | 2 ++ reactos/base/system/smss/initrun.c | 3 ++- reactos/base/system/smss/initwkdll.c | 3 ++- reactos/base/system/smss/print.c | 2 ++ reactos/base/system/smss/smapi.c | 2 +- reactos/base/system/smss/smapiexec.c | 18 ++---------------- reactos/base/system/smss/smapiquery.c | 4 ++-- reactos/base/system/smss2/smss.c | 25 ++----------------------- 16 files changed, 38 insertions(+), 53 deletions(-) diff --git a/reactos/base/system/smss/client.c b/reactos/base/system/smss/client.c index 5dee5421af4..97b54e32220 100644 --- a/reactos/base/system/smss/client.c +++ b/reactos/base/system/smss/client.c @@ -500,7 +500,7 @@ SmDestroyClient (ULONG SubsystemId) RtlLeaveCriticalSection (& SmpClientDirectory.Lock); return Status; } - +#if 0 /* === Utilities for SmQryInfo === */ /********************************************************************** @@ -566,5 +566,5 @@ SmGetSubSystemInformation (PSM_SUBSYSTEM_INFORMATION i) RtlLeaveCriticalSection (& SmpClientDirectory.Lock); return Status; } - +#endif /* EOF */ diff --git a/reactos/base/system/smss/debug.c b/reactos/base/system/smss/debug.c index 658a00f5649..a92a947c103 100644 --- a/reactos/base/system/smss/debug.c +++ b/reactos/base/system/smss/debug.c @@ -12,6 +12,7 @@ #define NDEBUG #include +#if 0 /* GLOBALS ***********************************************************/ @@ -164,5 +165,7 @@ SmInitializeDbgSs (VOID) return STATUS_SUCCESS; } +#endif + /* EOF */ diff --git a/reactos/base/system/smss/init.c b/reactos/base/system/smss/init.c index 54678f4ffc1..48a60fc14b9 100644 --- a/reactos/base/system/smss/init.c +++ b/reactos/base/system/smss/init.c @@ -30,7 +30,7 @@ struct { // {TRUE, SmInitDosDevices, "create dos device links"}, // {TRUE, SmRunBootApplications, "run boot applications"}, // {TRUE, SmProcessFileRenameList, "process the file rename list"}, - {FALSE, SmUpdateEnvironment, "update environment variables"}, +// {FALSE, SmUpdateEnvironment, "update environment variables"}, // {FALSE, SmLoadKnownDlls, "preload system DLLs"}, // {TRUE, SmCreatePagingFiles, "create paging files"}, // {TRUE, SmInitializeRegistry, "initialize the registry"}, diff --git a/reactos/base/system/smss/initdosdev.c b/reactos/base/system/smss/initdosdev.c index a8ed20adfb7..a0fc387201f 100644 --- a/reactos/base/system/smss/initdosdev.c +++ b/reactos/base/system/smss/initdosdev.c @@ -12,6 +12,8 @@ #define NDEBUG #include +#if 0 + static NTSTATUS NTAPI SmpDosDevicesQueryRoutine(PWSTR ValueName, ULONG ValueType, @@ -89,4 +91,6 @@ SmInitDosDevices(VOID) return(Status); } +#endif + /* EOF */ diff --git a/reactos/base/system/smss/initenv.c b/reactos/base/system/smss/initenv.c index 21874e366ff..4f3a581a26a 100644 --- a/reactos/base/system/smss/initenv.c +++ b/reactos/base/system/smss/initenv.c @@ -22,10 +22,12 @@ PWSTR SmSystemEnvironment = NULL; NTSTATUS SmCreateEnvironment(VOID) { - return RtlCreateEnvironment(FALSE, &SmSystemEnvironment); + return RtlCreateEnvironment(TRUE, &SmSystemEnvironment); } +#if 0 + static NTSTATUS SmpSetEnvironmentVariable(IN PVOID Context, IN PWSTR ValueName, @@ -61,7 +63,6 @@ SmpEnvironmentQueryRoutine(IN PWSTR ValueName, return SmpSetEnvironmentVariable(Context,ValueName,(PWSTR)ValueData); } - NTSTATUS SmSetEnvironmentVariables(VOID) { @@ -280,14 +281,13 @@ done: return Status; } - /********************************************************************** * Set environment variables from registry */ NTSTATUS SmUpdateEnvironment(VOID) { - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + //RTL_QUERY_REGISTRY_TABLE QueryTable[2]; WCHAR ValueBuffer[MAX_PATH]; NTSTATUS Status; #ifndef NDEBUG @@ -343,5 +343,5 @@ SmUpdateEnvironment(VOID) return Status; } - +#endif /* EOF */ diff --git a/reactos/base/system/smss/initmv.c b/reactos/base/system/smss/initmv.c index aa69d14f9af..e864550a1e5 100644 --- a/reactos/base/system/smss/initmv.c +++ b/reactos/base/system/smss/initmv.c @@ -12,6 +12,7 @@ #define NDEBUG #include +#if 0 /* FUNCTIONS *****************************************************************/ @@ -446,4 +447,6 @@ SmProcessFileRenameList( VOID ) return (STATUS_SUCCESS); } +#endif + /* EOF */ diff --git a/reactos/base/system/smss/initobdir.c b/reactos/base/system/smss/initobdir.c index f90d973d7db..721910e2b61 100644 --- a/reactos/base/system/smss/initobdir.c +++ b/reactos/base/system/smss/initobdir.c @@ -12,6 +12,7 @@ #define NDEBUG #include +#if 0 static NTSTATUS NTAPI SmpObjectDirectoryQueryRoutine(PWSTR ValueName, ULONG ValueType, @@ -69,5 +70,6 @@ SmCreateObjectDirectories(VOID) return(Status); } +#endif /* EOF */ diff --git a/reactos/base/system/smss/initpage.c b/reactos/base/system/smss/initpage.c index 3123761b4cc..ab1fc0735a7 100644 --- a/reactos/base/system/smss/initpage.c +++ b/reactos/base/system/smss/initpage.c @@ -12,6 +12,8 @@ #define NDEBUG #include +#if 0 + #define GIGABYTE (1024 * 1024 * 1024) /* One Gigabyte */ static NTSTATUS NTAPI @@ -520,6 +522,6 @@ SmCreatePagingFiles(VOID) return Status; } - +#endif /* EOF */ diff --git a/reactos/base/system/smss/initreg.c b/reactos/base/system/smss/initreg.c index 14f0adc38b9..9cb154abe8c 100644 --- a/reactos/base/system/smss/initreg.c +++ b/reactos/base/system/smss/initreg.c @@ -12,6 +12,7 @@ #define NDEBUG #include +#if 0 NTSTATUS SmInitializeRegistry(VOID) { @@ -20,5 +21,6 @@ SmInitializeRegistry(VOID) /* Load remaining registry hives */ return NtInitializeRegistry(CM_BOOT_FLAG_SMSS); } +#endif /* EOF */ diff --git a/reactos/base/system/smss/initrun.c b/reactos/base/system/smss/initrun.c index e656bd22fa6..7f672f0777c 100644 --- a/reactos/base/system/smss/initrun.c +++ b/reactos/base/system/smss/initrun.c @@ -12,6 +12,7 @@ #define NDEBUG #include +#if 0 //HANDLE Children[2] = {0, 0}; /* csrss, winlogon */ @@ -223,6 +224,6 @@ SmRunBootApplications(VOID) return(Status); } - +#endif /* EOF */ diff --git a/reactos/base/system/smss/initwkdll.c b/reactos/base/system/smss/initwkdll.c index ba73626ee48..9b44542564d 100644 --- a/reactos/base/system/smss/initwkdll.c +++ b/reactos/base/system/smss/initwkdll.c @@ -12,6 +12,7 @@ #define NDEBUG #include +#if 0 static NTSTATUS NTAPI SmpKnownDllsQueryRoutine(PWSTR ValueName, ULONG ValueType, @@ -236,6 +237,6 @@ SmLoadKnownDlls(VOID) return Status; } - +#endif /* EOF */ diff --git a/reactos/base/system/smss/print.c b/reactos/base/system/smss/print.c index 3bf6535031f..25e13f20751 100644 --- a/reactos/base/system/smss/print.c +++ b/reactos/base/system/smss/print.c @@ -12,6 +12,7 @@ #define NDEBUG #include +#if 0 VOID NTAPI DisplayString(LPCWSTR lpwString) { UNICODE_STRING us; @@ -39,5 +40,6 @@ VOID NTAPI PrintString (char* fmt, ...) NtDisplayString(&UnicodeString); RtlFreeUnicodeString (&UnicodeString); } +#endif /* EOF */ diff --git a/reactos/base/system/smss/smapi.c b/reactos/base/system/smss/smapi.c index 669c8ed755b..681a9c1508a 100644 --- a/reactos/base/system/smss/smapi.c +++ b/reactos/base/system/smss/smapi.c @@ -35,7 +35,7 @@ SM_PORT_API SmApi [] = SmInvalid, /* obsolete */ SmInvalid, /* unknown */ SmExecPgm, /* smapiexec.c */ - SmQryInfo /* smapyqry.c */ + SmInvalid /* smapyqry.c */ }; /* TODO: optimize this address computation (it should be done diff --git a/reactos/base/system/smss/smapiexec.c b/reactos/base/system/smss/smapiexec.c index 8fef5654a72..9d0afe02e20 100644 --- a/reactos/base/system/smss/smapiexec.c +++ b/reactos/base/system/smss/smapiexec.c @@ -263,23 +263,9 @@ SMAPI(SmExecPgm) else { /* - * OK, the definition is empty, but check - * if it is the name of an embedded subsystem. + * Badly defined subsystem. Check the registry! */ - if(0 == _wcsicmp(L"DEBUG", Name)) - { - /* - * Initialize the embedded DBGSS. - */ - Request->SmHeader.Status = SmInitializeDbgSs(); - } - else - { - /* - * Badly defined subsystem. Check the registry! - */ - Request->SmHeader.Status = STATUS_NOT_FOUND; - } + Request->SmHeader.Status = STATUS_NOT_FOUND; } } else { /* It couldn't lookup the Name! */ diff --git a/reactos/base/system/smss/smapiquery.c b/reactos/base/system/smss/smapiquery.c index b80c429acc5..a9a02f40d2b 100644 --- a/reactos/base/system/smss/smapiquery.c +++ b/reactos/base/system/smss/smapiquery.c @@ -12,7 +12,7 @@ #define NDEBUG #include - +#if 0 /********************************************************************** * SmQryInfo/1 API */ @@ -50,6 +50,6 @@ SMAPI(SmQryInfo) } return Status; } - +#endif /* EOF */ diff --git a/reactos/base/system/smss2/smss.c b/reactos/base/system/smss2/smss.c index e661c123804..5bc5b91a8a1 100644 --- a/reactos/base/system/smss2/smss.c +++ b/reactos/base/system/smss2/smss.c @@ -305,7 +305,7 @@ ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, SIZE_T Size; PWSTR p; UNICODE_STRING NullString = RTL_CONSTANT_STRING(L""); - UNICODE_STRING SmssName, Environment, SystemDriveString, DebugString; + UNICODE_STRING SmssName, DebugString; PVOID EnvironmentPtr = NULL; PRTL_USER_PROCESS_INFORMATION ProcessInformation; PRTL_USER_PROCESS_PARAMETERS ProcessParams = NULL; @@ -436,28 +436,7 @@ ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, NtInitialUserProcessBuffer); /* Create the environment string */ - RtlInitEmptyUnicodeString(&Environment, - ProcessParams->Environment, - (USHORT)Size); - - /* Append the DLL path to it */ - RtlAppendUnicodeToString(&Environment, L"Path="); - RtlAppendUnicodeStringToString(&Environment, &ProcessParams->DllPath); - RtlAppendUnicodeStringToString(&Environment, &NullString); - - /* Create the system drive string */ - SystemDriveString = SmpSystemRoot; - SystemDriveString.Length = 2 * sizeof(WCHAR); - - /* Append it to the environment */ - RtlAppendUnicodeToString(&Environment, L"SystemDrive="); - RtlAppendUnicodeStringToString(&Environment, &SystemDriveString); - RtlAppendUnicodeStringToString(&Environment, &NullString); - - /* Append the system root to the environment */ - RtlAppendUnicodeToString(&Environment, L"SystemRoot="); - RtlAppendUnicodeStringToString(&Environment, &SmpSystemRoot); - RtlAppendUnicodeStringToString(&Environment, &NullString); + ProcessParams->Environment = SmpDefaultEnvironment; /* Create SMSS process */ SmssName = ProcessParams->ImagePathName; From 44d9f6f83894c8f6346a4f417bedb97d18b902c3 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 6 Feb 2012 10:46:52 +0000 Subject: [PATCH 233/289] [NTOSKRNL] - Implement MiSynchronizeSystemPde, which does what its name suggests, synchronize a system PDE and is an improved replacement (with a more proper name) for MiCheckPdeForPagedPool - Move some code to avoid an additional check - Call MiResolveDemandZeroFault directy instead of creating a demand zero PDE and then calling MiDispatchFault, which after a lot of checks will finally do the same svn path=/trunk/; revision=55456 --- reactos/ntoskrnl/mm/ARM3/pagfault.c | 90 ++++++++++++++--------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index baa72e47818..2c1a3b33af7 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -100,6 +100,28 @@ MiCheckVirtualAddress(IN PVOID VirtualAddress, } } +#if (_MI_PAGING_LEVELS == 2) +BOOLEAN +FORCEINLINE +MiSynchronizeSystemPde(PMMPDE PointerPde) +{ + MMPDE SystemPde; + ULONG Index; + + /* Get the Index from the PDE */ + Index = ((ULONG_PTR)PointerPde & (SYSTEM_PD_SIZE - 1)) / sizeof(MMPTE); + + /* Copy the PDE from the double-mapped system page directory */ + SystemPde = MmSystemPagePtes[Index]; + *PointerPde = SystemPde; + + /* Make sure we re-read the PDE and PTE */ + KeMemoryBarrierWithoutFence(); + + /* Return, if we had success */ + return (BOOLEAN)SystemPde.u.Hard.Valid; +} + NTSTATUS FASTCALL MiCheckPdeForPagedPool(IN PVOID Address) @@ -159,6 +181,7 @@ MiCheckPdeForPagedPool(IN PVOID Address) // return Status; } +#endif VOID NTAPI @@ -699,28 +722,12 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, /* Check if the PDE is invalid */ if (PointerPde->u.Hard.Valid == 0) { - // - // Debug spew (eww!) - // - DPRINT("Invalid PDE\n"); #if (_MI_PAGING_LEVELS == 2) - // - // Handle mapping in "Special" PDE directoreis - // - MiCheckPdeForPagedPool(Address); + /* Sync this PDE and check, if that made it valid */ + if (!MiSynchronizeSystemPde(PointerPde)) #endif - // - // Now we SHOULD be good - // - if (PointerPde->u.Hard.Valid == 0) { - // - // FIXFIX: Do the S-LIST hack - // - - // - // Kill the system - // + /* PDE (still) not valid, kill the system */ KeBugCheckEx(PAGE_FAULT_IN_NONPAGED_AREA, (ULONG_PTR)Address, StoreInstruction, @@ -824,20 +831,20 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, (ULONG_PTR)TrapInformation, 1); } - } - /* Check for demand page */ - if ((StoreInstruction) && !(ProtoPte) && !(TempPte.u.Hard.Valid)) - { - /* Get the protection code */ - if (!(TempPte.u.Soft.Protection & MM_READWRITE)) + /* Check for demand page */ + if ((StoreInstruction) && !(TempPte.u.Hard.Valid)) { - /* Bad boy, bad boy, whatcha gonna do, whatcha gonna do when ARM3 comes for you! */ - KeBugCheckEx(ATTEMPTED_WRITE_TO_READONLY_MEMORY, - (ULONG_PTR)Address, - TempPte.u.Long, - (ULONG_PTR)TrapInformation, - 14); + /* Get the protection code */ + if (!(TempPte.u.Soft.Protection & MM_READWRITE)) + { + /* Bugcheck the system! */ + KeBugCheckEx(ATTEMPTED_WRITE_TO_READONLY_MEMORY, + (ULONG_PTR)Address, + TempPte.u.Long, + (ULONG_PTR)TrapInformation, + 14); + } } } @@ -889,21 +896,15 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, /* Right now, we expect a valid protection mask on the VAD */ ASSERT(ProtectionCode != MM_NOACCESS); - /* Make the PDE demand-zero */ - MI_WRITE_INVALID_PDE(PointerPde, DemandZeroPde); - /* And go dispatch the fault on the PDE. This should handle the demand-zero */ #if MI_TRACE_PFNS UserPdeFault = TRUE; #endif - Status = MiDispatchFault(TRUE, - PointerPte, - (PMMPTE)PointerPde, - NULL, - FALSE, - PsGetCurrentProcess(), - TrapInformation, - NULL); + /* Resolve a demand zero fault */ + Status = MiResolveDemandZeroFault(PointerPte, + MM_READWRITE, + CurrentProcess, + MM_NOIRQL); #if MI_TRACE_PFNS UserPdeFault = FALSE; #endif @@ -930,15 +931,14 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, return STATUS_PAGE_FAULT_DEMAND_ZERO; } - /* Get protection and check if it's a prototype PTE */ - ProtectionCode = (ULONG)TempPte.u.Soft.Protection; + /* Make sure it's not a prototype PTE */ ASSERT(TempPte.u.Soft.Prototype == 0); /* Check for non-demand zero PTE */ if (TempPte.u.Long != 0) { /* This is a page fault, check for valid protection */ - ASSERT(ProtectionCode != 0x100); + ASSERT(TempPte.u.Soft.Protection != 0x100); /* FIXME: Run MiAccessCheck */ From da5891c24b6a224f97fbc777b3c7871a62eb2beb Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Mon, 6 Feb 2012 11:00:52 +0000 Subject: [PATCH 234/289] [win32k] - Fix a warning caused by my previous commit svn path=/trunk/; revision=55457 --- reactos/subsystems/win32/win32k/ntuser/sysparams.c | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/sysparams.c b/reactos/subsystems/win32/win32k/ntuser/sysparams.c index 52773fd26f2..acfa3340ead 100644 --- a/reactos/subsystems/win32/win32k/ntuser/sysparams.c +++ b/reactos/subsystems/win32/win32k/ntuser/sysparams.c @@ -328,6 +328,7 @@ NtUserUpdatePerUserSystemParameters( g_PaintDesktopVersion = SpiLoadDWord(KEY_DESKTOP, VAL_PAINTDESKVER, 0); else g_PaintDesktopVersion = FALSE; + bResult = TRUE; TRACE("Leave NtUserUpdatePerUserSystemParameters, returning %d\n", bResult); UserLeave(); From 0e7cf2af8703c0bb2563512b70e2de8dfb34a106 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Mon, 6 Feb 2012 12:30:59 +0000 Subject: [PATCH 235/289] [win32k] - Cleanup Win32kProcessCallback and Win32kThreadCallback - Even though it works, trying to post a message in Win32kProcessCallback after the THREADINFO is destroyed can only cause trouble, so move it in Win32kThreadCallback - There is no need to try opening a desktop and windowstation before winlogon initializes - Handle errors properly when we fail to get a default window station and desktop for the new process - Enable win32k syscall hook callbacks - Rewrite SetThreadDesktop to update THREADINFO properly and handle errors properly - Do not initialize the THREADINFO in GetW32ThreadInfo as it is now done properly (actually leave a small hack that updates pci->dwTIFlags) - Add UserDbgAssertThreadInfo that asserts the integrity of THREADINFO, CLIENTINFO and CLIENTTHREADINFO. This is called by GetW32ThreadInfo and the syscall hook callbacks svn path=/trunk/; revision=55458 --- .../win32/win32k/include/gdidebug.h | 4 +- .../subsystems/win32/win32k/include/ntuser.h | 1 + .../subsystems/win32/win32k/include/win32.h | 6 + .../subsystems/win32/win32k/main/dllmain.c | 352 +++++++++--------- .../subsystems/win32/win32k/ntuser/desktop.c | 182 ++++----- .../subsystems/win32/win32k/ntuser/input.c | 4 +- reactos/subsystems/win32/win32k/ntuser/misc.c | 124 +++--- .../subsystems/win32/win32k/objects/gdidbg.c | 4 +- 8 files changed, 342 insertions(+), 335 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/gdidebug.h b/reactos/subsystems/win32/win32k/include/gdidebug.h index 5b53ec44218..d59d367d75f 100644 --- a/reactos/subsystems/win32/win32k/include/gdidebug.h +++ b/reactos/subsystems/win32/win32k/include/gdidebug.h @@ -55,11 +55,11 @@ NTSYSAPI ULONG APIENTRY RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN #if DBG void NTAPI -DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments); +GdiDbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments); ULONG_PTR NTAPI -DbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult); +GdiDbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult); #define ID_Win32PreServiceHook 'WSH0' #define ID_Win32PostServiceHook 'WSH1' diff --git a/reactos/subsystems/win32/win32k/include/ntuser.h b/reactos/subsystems/win32/win32k/include/ntuser.h index b0f0b043ad6..1f97e9554d2 100644 --- a/reactos/subsystems/win32/win32k/include/ntuser.h +++ b/reactos/subsystems/win32/win32k/include/ntuser.h @@ -9,6 +9,7 @@ #define UserEnterCo UserEnterExclusive #define UserLeaveCo UserLeave +extern BOOL gbInitialized; extern PSERVERINFO gpsi; extern PTHREADINFO gptiCurrent; extern PPROCESSINFO ppiScrnSaver; diff --git a/reactos/subsystems/win32/win32k/include/win32.h b/reactos/subsystems/win32/win32k/include/win32.h index 2cc36a55d98..480c267a861 100644 --- a/reactos/subsystems/win32/win32k/include/win32.h +++ b/reactos/subsystems/win32/win32k/include/win32.h @@ -198,3 +198,9 @@ typedef struct _PROCESSINFO BYTE DbgChannelLevel[DbgChCount]; #endif } PROCESSINFO; + +#ifdef DBG +void NTAPI UserDbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments); +ULONG_PTR NTAPI UserDbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult); +#endif + diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index 0c7fff08457..60dbd63b490 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -29,52 +29,62 @@ extern ULONG_PTR Win32kSSDT[]; extern UCHAR Win32kSSPT[]; extern ULONG Win32kNumberOfSysCalls; +void +NTAPI +DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments) +{ + GdiDbgPreServiceHook(ulSyscallId, pulArguments); + UserDbgPreServiceHook(ulSyscallId, pulArguments); +} + +ULONG_PTR +NTAPI +DbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult) +{ + ulResult = GdiDbgPostServiceHook(ulSyscallId, ulResult); + ulResult = UserDbgPostServiceHook(ulSyscallId, ulResult); + return ulResult; +} + NTSTATUS APIENTRY Win32kProcessCallback(struct _EPROCESS *Process, BOOLEAN Create) { - PPROCESSINFO Win32Process; + PPROCESSINFO ppiCurrent; DECLARE_RETURN(NTSTATUS); + ASSERT(Process->Peb); + DPRINT("Enter Win32kProcessCallback\n"); UserEnterExclusive(); - /* Get the Win32 Process */ - Win32Process = PsGetProcessWin32Process(Process); - - /* Allocate one if needed */ - if (!Win32Process) - { - /* FIXME: Lock the process */ - Win32Process = ExAllocatePoolWithTag(NonPagedPool, - sizeof(PROCESSINFO), - USERTAG_PROCESSINFO); - - if (Win32Process == NULL) RETURN( STATUS_NO_MEMORY); - - RtlZeroMemory(Win32Process, sizeof(PROCESSINFO)); - - PsSetProcessWin32Process(Process, Win32Process); - /* FIXME: Unlock the process */ - } - if (Create) { SIZE_T ViewSize = 0; LARGE_INTEGER Offset; PVOID UserBase = NULL; - PRTL_USER_PROCESS_PARAMETERS pParams = NULL; + PRTL_USER_PROCESS_PARAMETERS pParams = Process->Peb->ProcessParameters; NTSTATUS Status; - extern PSECTION_OBJECT GlobalUserHeapSection; + + ASSERT(PsGetProcessWin32Process(Process) == NULL); + + ppiCurrent = ExAllocatePoolWithTag(NonPagedPool, + sizeof(PROCESSINFO), + USERTAG_PROCESSINFO); + + if (ppiCurrent == NULL) + RETURN( STATUS_NO_MEMORY); + + RtlZeroMemory(ppiCurrent, sizeof(PROCESSINFO)); + + PsSetProcessWin32Process(Process, ppiCurrent); #ifdef DBG DbgInitDebugChannels(); #endif - TRACE_PPI(Win32Process, UserProcess,"Allocated ppi for PID:%d\n", Process->UniqueProcessId); - - DPRINT("Creating W32 process PID:%d at IRQ level: %lu\n", Process->UniqueProcessId, KeGetCurrentIrql()); + TRACE_PPI(ppiCurrent, UserProcess,"Allocated ppi for PID:%d\n", Process->UniqueProcessId); /* map the global heap into the process */ Offset.QuadPart = 0; @@ -93,89 +103,76 @@ Win32kProcessCallback(struct _EPROCESS *Process, DPRINT1("Failed to map the global heap! 0x%x\n", Status); RETURN(Status); } - Win32Process->HeapMappings.Next = NULL; - Win32Process->HeapMappings.KernelMapping = (PVOID)GlobalUserHeap; - Win32Process->HeapMappings.UserMapping = UserBase; - Win32Process->HeapMappings.Count = 1; + ppiCurrent->HeapMappings.Next = NULL; + ppiCurrent->HeapMappings.KernelMapping = (PVOID)GlobalUserHeap; + ppiCurrent->HeapMappings.UserMapping = UserBase; + ppiCurrent->HeapMappings.Count = 1; - InitializeListHead(&Win32Process->MenuListHead); + InitializeListHead(&ppiCurrent->MenuListHead); - InitializeListHead(&Win32Process->GDIBrushAttrFreeList); - InitializeListHead(&Win32Process->GDIDcAttrFreeList); + InitializeListHead(&ppiCurrent->GDIBrushAttrFreeList); + InitializeListHead(&ppiCurrent->GDIDcAttrFreeList); - InitializeListHead(&Win32Process->PrivateFontListHead); - ExInitializeFastMutex(&Win32Process->PrivateFontListLock); + InitializeListHead(&ppiCurrent->PrivateFontListHead); + ExInitializeFastMutex(&ppiCurrent->PrivateFontListLock); - InitializeListHead(&Win32Process->DriverObjListHead); - ExInitializeFastMutex(&Win32Process->DriverObjListLock); + InitializeListHead(&ppiCurrent->DriverObjListHead); + ExInitializeFastMutex(&ppiCurrent->DriverObjListLock); - Win32Process->KeyboardLayout = W32kGetDefaultKeyLayout(); - EngCreateEvent((PEVENT *)&Win32Process->InputIdleEvent); - KeInitializeEvent(Win32Process->InputIdleEvent, NotificationEvent, FALSE); + ppiCurrent->KeyboardLayout = W32kGetDefaultKeyLayout(); + EngCreateEvent((PEVENT *)&ppiCurrent->InputIdleEvent); + KeInitializeEvent(ppiCurrent->InputIdleEvent, NotificationEvent, FALSE); + - if(Process->Peb != NULL) - { - /* map the gdi handle table to user land */ - Process->Peb->GdiSharedHandleTable = GDI_MapHandleTable(Process); - Process->Peb->GdiDCAttributeList = GDI_BATCH_LIMIT; - pParams = Process->Peb->ProcessParameters; - } + /* map the gdi handle table to user land */ + Process->Peb->GdiSharedHandleTable = GDI_MapHandleTable(Process); + Process->Peb->GdiDCAttributeList = GDI_BATCH_LIMIT; + pParams = Process->Peb->ProcessParameters; - Win32Process->peProcess = Process; + ppiCurrent->peProcess = Process; /* setup process flags */ - Win32Process->W32PF_flags = W32PF_THREADCONNECTED; + ppiCurrent->W32PF_flags = W32PF_THREADCONNECTED; if ( pParams && pParams->WindowFlags & STARTF_SCRNSAVER ) { - ppiScrnSaver = Win32Process; - Win32Process->W32PF_flags |= W32PF_SCREENSAVER; + ppiScrnSaver = ppiCurrent; + ppiCurrent->W32PF_flags |= W32PF_SCREENSAVER; } /* Create pools for GDI object attributes */ - Win32Process->pPoolDcAttr = GdiPoolCreate(sizeof(DC_ATTR), 'acdG'); - Win32Process->pPoolBrushAttr = GdiPoolCreate(sizeof(BRUSH_ATTR), 'arbG'); - Win32Process->pPoolRgnAttr = GdiPoolCreate(sizeof(RGN_ATTR), 'agrG'); - ASSERT(Win32Process->pPoolDcAttr); - ASSERT(Win32Process->pPoolBrushAttr); - ASSERT(Win32Process->pPoolRgnAttr); + ppiCurrent->pPoolDcAttr = GdiPoolCreate(sizeof(DC_ATTR), 'acdG'); + ppiCurrent->pPoolBrushAttr = GdiPoolCreate(sizeof(BRUSH_ATTR), 'arbG'); + ppiCurrent->pPoolRgnAttr = GdiPoolCreate(sizeof(RGN_ATTR), 'agrG'); + ASSERT(ppiCurrent->pPoolDcAttr); + ASSERT(ppiCurrent->pPoolBrushAttr); + ASSERT(ppiCurrent->pPoolRgnAttr); } else { - DPRINT("Destroying W32 process PID:%d at IRQ level: %lu\n", Process->UniqueProcessId, KeGetCurrentIrql()); - Win32Process->W32PF_flags |= W32PF_TERMINATED; + /* Get the Win32 Process */ + ppiCurrent = PsGetProcessWin32Process(Process); - if (ppiScrnSaver == Win32Process) ppiScrnSaver = NULL; + ASSERT(ppiCurrent); - /* Notify logon application to restart shell if needed */ - if(Win32Process->rpdeskStartup->pDeskInfo) + TRACE_CH(UserProcess, "Destroying W32 process PID:%d at IRQ level: %lu\n", Process->UniqueProcessId, KeGetCurrentIrql()); + ppiCurrent->W32PF_flags |= W32PF_TERMINATED; + + if (ppiScrnSaver == ppiCurrent) + ppiScrnSaver = NULL; + + if (ppiCurrent->InputIdleEvent) { - if(Win32Process->rpdeskStartup->pDeskInfo->ppiShellProcess == Win32Process) - { - DWORD ExitCode; - ExitCode = PsGetProcessExitStatus(Win32Process->peProcess); - - DPRINT1("Shell process is exiting (%d)\n", ExitCode); - - UserPostMessage(hwndSAS, - WM_LOGONNOTIFY, - LN_SHELL_EXITED, - ExitCode); - } + EngFreeMem(ppiCurrent->InputIdleEvent); + ppiCurrent->InputIdleEvent = NULL; } - if (Win32Process->InputIdleEvent) - { - EngFreeMem((PVOID)Win32Process->InputIdleEvent); - Win32Process->InputIdleEvent = NULL; - } - - IntCleanupMenus(Process, Win32Process); - IntCleanupCurIcons(Process, Win32Process); + IntCleanupMenus(Process, ppiCurrent); + IntCleanupCurIcons(Process, ppiCurrent); /* no process windows should exist at this point, or the function will assert! */ - DestroyProcessClasses(Win32Process); - Win32Process->W32PF_flags &= ~W32PF_CLASSESREGISTERED; + DestroyProcessClasses(ppiCurrent); + ppiCurrent->W32PF_flags &= ~W32PF_CLASSESREGISTERED; GDI_CleanupForProcess(Process); @@ -184,28 +181,28 @@ Win32kProcessCallback(struct _EPROCESS *Process, /* * Deregister logon application automatically */ - if(LogonProcess == Win32Process) + if(LogonProcess == ppiCurrent) { LogonProcess = NULL; } /* Close the startup desktop */ - ASSERT(Win32Process->rpdeskStartup); - ASSERT(Win32Process->hdeskStartup); - ObDereferenceObject(Win32Process->rpdeskStartup); - ZwClose(Win32Process->hdeskStartup); + ASSERT(ppiCurrent->rpdeskStartup); + ASSERT(ppiCurrent->hdeskStartup); + ObDereferenceObject(ppiCurrent->rpdeskStartup); + ZwClose(ppiCurrent->hdeskStartup); /* Close the current window station */ UserSetProcessWindowStation(NULL); /* Destroy GDI pools */ - GdiPoolDestroy(Win32Process->pPoolDcAttr); - GdiPoolDestroy(Win32Process->pPoolBrushAttr); - GdiPoolDestroy(Win32Process->pPoolRgnAttr); + GdiPoolDestroy(ppiCurrent->pPoolDcAttr); + GdiPoolDestroy(ppiCurrent->pPoolBrushAttr); + GdiPoolDestroy(ppiCurrent->pPoolRgnAttr); /* Ftee the PROCESSINFO */ PsSetProcessWin32Process(Process, NULL); - ExFreePoolWithTag(Win32Process, USERTAG_PROCESSINFO); + ExFreePoolWithTag(ppiCurrent, USERTAG_PROCESSINFO); } RETURN( STATUS_SUCCESS); @@ -226,23 +223,30 @@ Win32kThreadCallback(struct _ETHREAD *Thread, PTHREADINFO ptiCurrent; int i; NTSTATUS Status; + PTEB pTeb; DPRINT("Enter Win32kThreadCallback\n"); UserEnterExclusive(); Process = Thread->ThreadsProcess; + pTeb = NtCurrentTeb(); - /* Get the Win32 Thread */ - ptiCurrent = PsGetThreadWin32Thread(Thread); + ASSERT(pTeb); - /* Allocate one if needed */ - if (!ptiCurrent) + if (Type == PsW32ThreadCalloutInitialize) { - /* FIXME: Lock the process */ + HWINSTA hWinSta = NULL; + PCLIENTINFO pci; + HDESK hDesk = NULL; + PUNICODE_STRING DesktopPath; + PDESKTOP pdesk; + PRTL_USER_PROCESS_PARAMETERS ProcessParams = Process->Peb->ProcessParameters; + + ASSERT(PsGetThreadWin32Thread(Thread)==NULL); + ptiCurrent = ExAllocatePoolWithTag(NonPagedPool, sizeof(THREADINFO), USERTAG_THREADINFO); - if (ptiCurrent == NULL) { Status = STATUS_NO_MEMORY; @@ -252,20 +256,12 @@ Win32kThreadCallback(struct _ETHREAD *Thread, RtlZeroMemory(ptiCurrent, sizeof(THREADINFO)); PsSetThreadWin32Thread(Thread, ptiCurrent); - /* FIXME: Unlock the process */ - } + pTeb->Win32ThreadInfo = ptiCurrent; + ptiCurrent->pClientInfo = (PCLIENTINFO)pTeb->Win32ClientInfo; - if (Type == PsW32ThreadCalloutInitialize) - { - HWINSTA hWinSta = NULL; - PTEB pTeb; - HDESK hDesk = NULL; - PUNICODE_STRING DesktopPath; - PDESKTOP pdesk; - PRTL_USER_PROCESS_PARAMETERS ProcessParams = (Process->Peb ? Process->Peb->ProcessParameters : NULL); - - DPRINT("Creating W32 thread TID:%d at IRQ level: %lu\n", Thread->Cid.UniqueThread, KeGetCurrentIrql()); + TRACE_CH(UserThread, "Creating W32 thread TID:%d at IRQ level: %lu\n", Thread->Cid.UniqueThread, KeGetCurrentIrql()); + /* Initialize the THREADINFO */ InitializeListHead(&ptiCurrent->WindowListHead); InitializeListHead(&ptiCurrent->W32CallbackListHead); InitializeListHead(&ptiCurrent->PtiLink); @@ -273,25 +269,29 @@ Win32kThreadCallback(struct _ETHREAD *Thread, { InitializeListHead(&ptiCurrent->aphkStart[i]); } - - ptiCurrent->TIF_flags &= ~TIF_INCLEANUP; - co_IntDestroyCaret(ptiCurrent); + ptiCurrent->pEThread = Thread; ptiCurrent->ppi = PsGetCurrentProcessWin32Process(); ptiCurrent->ptiSibling = ptiCurrent->ppi->ptiList; ptiCurrent->ppi->ptiList = ptiCurrent; ptiCurrent->ppi->cThreads++; - if (ptiCurrent->rpdesk && !ptiCurrent->pDeskInfo) - { - ptiCurrent->pDeskInfo = ptiCurrent->rpdesk->pDeskInfo; - } ptiCurrent->MessageQueue = MsqCreateMessageQueue(Thread); ptiCurrent->KeyboardLayout = W32kGetDefaultKeyLayout(); if (ptiCurrent->KeyboardLayout) UserReferenceObject(ptiCurrent->KeyboardLayout); - ptiCurrent->pEThread = Thread; + ptiCurrent->TIF_flags &= ~TIF_INCLEANUP; - /* HAAAAAAAACK! This should go to Win32kProcessCallback */ - if(ptiCurrent->ppi->hdeskStartup == NULL) + /* Initialize the CLIENTINFO */ + pci = (PCLIENTINFO)pTeb->Win32ClientInfo; + RtlZeroMemory(pci, sizeof(CLIENTINFO)); + pci->ppi = ptiCurrent->ppi; + pci->fsHooks = ptiCurrent->fsHooks; + pci->dwTIFlags = ptiCurrent->TIF_flags; + if (ptiCurrent->KeyboardLayout) + pci->hKL = ptiCurrent->KeyboardLayout->hkl; + + /* Assign a default window station and desktop to the process */ + /* Do not try to open a desktop or window station before winlogon initializes */ + if(ptiCurrent->ppi->hdeskStartup == NULL && LogonProcess != NULL) { /* * inherit the thread desktop and process window station (if not yet inherited) from the process startup @@ -302,74 +302,39 @@ Win32kThreadCallback(struct _ETHREAD *Thread, DesktopPath, &hWinSta, &hDesk); - if(NT_SUCCESS(Status)) + if(!NT_SUCCESS(Status)) { - if(hWinSta != NULL) - { - if(!UserSetProcessWindowStation(hWinSta)) - { - DPRINT1("Failed to set process window station\n"); - } - } - - if (hDesk != NULL) - { - /* Validate the new desktop. */ - Status = IntValidateDesktopHandle(hDesk, - UserMode, - 0, - &pdesk); - - if(NT_SUCCESS(Status)) - { - ptiCurrent->ppi->hdeskStartup = hDesk; - ptiCurrent->ppi->rpdeskStartup = pdesk; - } - } + ERR_CH(UserThread, "Failed to assign default dekstop and winsta to process\n"); + goto leave; } - else + + if(!UserSetProcessWindowStation(hWinSta)) { - DPRINT1("No Desktop handle for this Thread!\n"); + Status = STATUS_UNSUCCESSFUL; + goto leave; } + + /* Validate the new desktop. */ + Status = IntValidateDesktopHandle(hDesk, UserMode, 0, &pdesk); + if(!NT_SUCCESS(Status)) + { + goto leave; + } + + /* Store the parsed desktop as the initial desktop */ + ptiCurrent->ppi->hdeskStartup = hDesk; + ptiCurrent->ppi->rpdeskStartup = pdesk; } if (ptiCurrent->ppi->hdeskStartup != NULL) { if (!IntSetThreadDesktop(ptiCurrent->ppi->hdeskStartup, FALSE)) { - DPRINT1("Unable to set thread desktop\n"); + ERR_CH(UserThread,"Unable to set thread desktop\n"); + Status = STATUS_UNSUCCESSFUL; + goto leave; } } - - pTeb = NtCurrentTeb(); - if (pTeb) - { /* Attempt to startup client support which should have been initialized in IntSetThreadDesktop. */ - PCLIENTINFO pci = (PCLIENTINFO)pTeb->Win32ClientInfo; - ptiCurrent->pClientInfo = pci; - pci->ppi = ptiCurrent->ppi; - pci->fsHooks = ptiCurrent->fsHooks; - if (ptiCurrent->KeyboardLayout) pci->hKL = ptiCurrent->KeyboardLayout->hkl; - pci->dwTIFlags = ptiCurrent->TIF_flags; - - /* CI may not have been initialized. */ - if (!pci->pDeskInfo && ptiCurrent->pDeskInfo) - { - if (!pci->ulClientDelta) pci->ulClientDelta = DesktopHeapGetUserDelta(); - - pci->pDeskInfo = (PVOID)((ULONG_PTR)ptiCurrent->pDeskInfo - pci->ulClientDelta); - } - if (ptiCurrent->pcti && pci->pDeskInfo) - pci->pClientThreadInfo = (PVOID)((ULONG_PTR)ptiCurrent->pcti - pci->ulClientDelta); - else - pci->pClientThreadInfo = NULL; - } - else - { - DPRINT1("No TEB for this Thread!\n"); - // System thread running! Now SendMessage should be okay. - ptiCurrent->pcti = &ptiCurrent->cti; - } - GetW32ThreadInfo(); } else { @@ -377,10 +342,16 @@ Win32kThreadCallback(struct _ETHREAD *Thread, PSINGLE_LIST_ENTRY psle; PPROCESSINFO ppiCurrent; - DPRINT("Destroying W32 thread TID:%d at IRQ level: %lu\n", Thread->Cid.UniqueThread, KeGetCurrentIrql()); + /* Get the Win32 Thread */ + ptiCurrent = PsGetThreadWin32Thread(Thread); + + ASSERT(ptiCurrent); + + TRACE_CH(UserThread,"Destroying W32 thread TID:%d at IRQ level: %lu\n", Thread->Cid.UniqueThread, KeGetCurrentIrql()); ppiCurrent = ptiCurrent->ppi; ptiCurrent->TIF_flags |= TIF_INCLEANUP; + ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags; /* Find the THREADINFO in the PROCESSINFO's list */ ppti = &ppiCurrent->ptiList; @@ -407,6 +378,24 @@ Win32kThreadCallback(struct _ETHREAD *Thread, /* Unregister the api hook without blocking */ UserUnregisterUserApiHook(); } + + /* Notify logon application to restart shell if needed */ + if(ptiCurrent->pDeskInfo) + { + if(ptiCurrent->pDeskInfo->ppiShellProcess == ppiCurrent) + { + DWORD ExitCode = PsGetProcessExitStatus(Process); + + TRACE_PPI(ppiCurrent, UserProcess, "Shell process is exiting (%d)\n", ExitCode); + + UserPostMessage(hwndSAS, + WM_LOGONNOTIFY, + LN_SHELL_EXITED, + ExitCode); + + ptiCurrent->pDeskInfo->ppiShellProcess = NULL; + } + } } DceFreeThreadDCE(ptiCurrent); @@ -418,7 +407,6 @@ Win32kThreadCallback(struct _ETHREAD *Thread, KeSetEvent(ptiCurrent->MessageQueue->NewMessages, IO_NO_INCREMENT, FALSE); UnregisterThreadHotKeys(Thread); - /* what if this co_ func crash in umode? what will clean us up then? */ co_DestroyThreadWindows(Thread); IntBlockInput(ptiCurrent, FALSE); MsqDestroyMessageQueue(ptiCurrent->MessageQueue); @@ -431,7 +419,7 @@ Win32kThreadCallback(struct _ETHREAD *Thread, while (psle) { PUSER_REFERENCE_ENTRY ref = CONTAINING_RECORD(psle, USER_REFERENCE_ENTRY, Entry); - DPRINT("thread clean: remove reference obj 0x%x\n",ref->obj); + TRACE_CH(UserThread,"thread clean: remove reference obj 0x%x\n",ref->obj); UserDereferenceObject(ref->obj); psle = PopEntryList(&ptiCurrent->ReferencesList); @@ -474,8 +462,8 @@ INIT_FUNCTION NTSTATUS APIENTRY DriverEntry( - IN PDRIVER_OBJECT DriverObject, - IN PUNICODE_STRING RegistryPath) + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath) { NTSTATUS Status; BOOLEAN Result; @@ -513,11 +501,9 @@ DriverEntry( /* Register our per-process and per-thread structures. */ PsEstablishWin32Callouts((PWIN32_CALLOUTS_FPNS)&CalloutData); -#if DBG_ENABLE_SERVICE_HOOKS /* Register service hook callbacks */ KdSystemDebugControl('CsoR', DbgPreServiceHook, ID_Win32PreServiceHook, 0, 0, 0, 0); KdSystemDebugControl('CsoR', DbgPostServiceHook, ID_Win32PostServiceHook, 0, 0, 0, 0); -#endif /* Create the global USER heap */ GlobalUserHeap = UserCreateHeap(&GlobalUserHeapSection, diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index 55dd8f83294..a04d2cedffe 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -864,6 +864,7 @@ NtUserCreateDesktop( /* Turn off hooks when calling any CreateWindowEx from inside win32k. */ NoHooks = (ptiCurrent->TIF_flags & TIF_DISABLEHOOKS); ptiCurrent->TIF_flags |= TIF_DISABLEHOOKS; + ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags; } DesktopName.Buffer = NULL; @@ -1069,7 +1070,11 @@ CLEANUP: { ExFreePoolWithTag(DesktopName.Buffer, TAG_STRING); } - if (!NoHooks && ptiCurrent) ptiCurrent->TIF_flags &= ~TIF_DISABLEHOOKS; + if (!NoHooks && ptiCurrent) + { + ptiCurrent->TIF_flags &= ~TIF_DISABLEHOOKS; + ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags; + } TRACE("Leave NtUserCreateDesktop, ret=%i\n",_ret_); UserLeave(); END_CLEANUP; @@ -1676,15 +1681,14 @@ CLEANUP: static NTSTATUS IntUnmapDesktopView(IN PDESKTOP DesktopObject) { - PTHREADINFO ti; - PPROCESSINFO CurrentWin32Process; + PPROCESSINFO ppi; PW32HEAP_USER_MAPPING HeapMapping, *PrevLink; NTSTATUS Status = STATUS_SUCCESS; TRACE("DO %p\n"); - CurrentWin32Process = PsGetCurrentProcessWin32Process(); - PrevLink = &CurrentWin32Process->HeapMappings.Next; + ppi = PsGetCurrentProcessWin32Process(); + PrevLink = &ppi->HeapMappings.Next; /* Unmap if we're the last thread using the desktop */ HeapMapping = *PrevLink; @@ -1710,13 +1714,6 @@ IntUnmapDesktopView(IN PDESKTOP DesktopObject) HeapMapping = HeapMapping->Next; } - ti = GetW32ThreadInfo(); - if (ti != NULL) - { - GetWin32ClientInfo()->pDeskInfo = NULL; - } - GetWin32ClientInfo()->ulClientDelta = 0; - return Status; } @@ -1792,17 +1789,21 @@ BOOL IntSetThreadDesktop(IN HDESK hDesktop, IN BOOL FreeOnFailure) { - PDESKTOP DesktopObject = NULL, OldDesktop; - HDESK hOldDesktop; - PTHREADINFO W32Thread; + PDESKTOP pdesk = NULL, pdeskOld; + HDESK hdeskOld; + PTHREADINFO pti; NTSTATUS Status; - BOOL MapHeap; - CLIENTTHREADINFO ctiSave; + PCLIENTTHREADINFO pctiOld, pctiNew; + PCLIENTINFO pci; + + ASSERT(NtCurrentTeb()); TRACE("IntSetThreadDesktop() , FOF=%d\n", FreeOnFailure); - MapHeap = (PsGetCurrentProcess() != PsInitialSystemProcess); - W32Thread = PsGetCurrentThreadWin32Thread(); + pti = PsGetCurrentThreadWin32Thread(); + pci = pti->pClientInfo; + + /* If the caller gave us a desktop, ensure it is valid */ if(hDesktop != NULL) { /* Validate the new desktop. */ @@ -1810,7 +1811,7 @@ IntSetThreadDesktop(IN HDESK hDesktop, hDesktop, UserMode, 0, - &DesktopObject); + &pdesk); if (!NT_SUCCESS(Status)) { @@ -1818,106 +1819,113 @@ IntSetThreadDesktop(IN HDESK hDesktop, return FALSE; } - if (W32Thread->rpdesk == DesktopObject) + if (pti->rpdesk == pdesk) { /* Nothing to do */ - ObDereferenceObject(DesktopObject); + ObDereferenceObject(pdesk); return TRUE; } - } - if (!IsListEmpty(&W32Thread->WindowListHead)) + /* Make sure that we don't own any window in the current desktop */ + if (!IsListEmpty(&pti->WindowListHead)) { + if(pdesk) + ObDereferenceObject(pdesk); ERR("Attempted to change thread desktop although the thread has windows!\n"); EngSetLastError(ERROR_BUSY); return FALSE; } - OldDesktop = W32Thread->rpdesk; - hOldDesktop = W32Thread->hdesk; - - W32Thread->rpdesk = DesktopObject; - W32Thread->hdesk = hDesktop; - - if (MapHeap && DesktopObject != NULL) + /* Before doing the switch, map the new desktop heap and allocate the new pcti */ + if(pdesk != NULL) { - Status = IntMapDesktopView(DesktopObject); + Status = IntMapDesktopView(pdesk); if (!NT_SUCCESS(Status)) { + ERR("Failed to map desktop heap!\n"); + ObDereferenceObject(pdesk); SetLastNtError(Status); return FALSE; } - W32Thread->pDeskInfo = DesktopObject->pDeskInfo; + + pctiNew = DesktopHeapAlloc( pdesk, sizeof(CLIENTTHREADINFO)); + if(pctiNew == NULL) + { + ERR("Failed to allocate new pcti\n"); + IntUnmapDesktopView(pdesk); + ObDereferenceObject(pdesk); + EngSetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } } - RtlZeroMemory(&ctiSave, sizeof(CLIENTTHREADINFO)); - - if (W32Thread->pcti && OldDesktop && NtCurrentTeb()) + /* free all classes or move them to the shared heap */ + if(pti->rpdesk != NULL) { - RtlCopyMemory(&ctiSave, W32Thread->pcti, sizeof(CLIENTTHREADINFO)); - TRACE("Free ClientThreadInfo\n"); - DesktopHeapFree(OldDesktop, W32Thread->pcti); - W32Thread->pcti = NULL; + if(!IntCheckProcessDesktopClasses(pti->rpdesk, FreeOnFailure)) + { + ERR("Failed to move process classes to shared heap!\n"); + if(pdesk) + { + DesktopHeapFree(pdesk, pctiNew); + IntUnmapDesktopView(pdesk); + ObDereferenceObject(pdesk); + } + return FALSE; + } } - if (!W32Thread->pcti && DesktopObject && NtCurrentTeb()) - { - TRACE("Allocate ClientThreadInfo\n"); - W32Thread->pcti = DesktopHeapAlloc( DesktopObject, - sizeof(CLIENTTHREADINFO)); - RtlCopyMemory(W32Thread->pcti, &ctiSave, sizeof(CLIENTTHREADINFO)); - } + pdeskOld = pti->rpdesk; + hdeskOld = pti->hdesk; + pctiOld = pti->pcti; - if (NtCurrentTeb()) + /* do the switch */ + if(pdesk != NULL) { - PCLIENTINFO pci = GetWin32ClientInfo(); + pti->rpdesk = pdesk; + pti->hdesk = hDesktop; + pti->pDeskInfo = pti->rpdesk->pDeskInfo; + pti->pcti = pctiNew; + pci->ulClientDelta = DesktopHeapGetUserDelta(); - if (DesktopObject) + pci->pDeskInfo = (PVOID)((ULONG_PTR)pti->pDeskInfo - pci->ulClientDelta); + pci->pClientThreadInfo = (PVOID)((ULONG_PTR)pti->pcti - pci->ulClientDelta); + + /* initialize the new pcti */ + if(pctiOld != NULL) { - pci->pDeskInfo = (PVOID)((ULONG_PTR)DesktopObject->pDeskInfo - pci->ulClientDelta); - if (W32Thread->pcti) pci->pClientThreadInfo = (PVOID)((ULONG_PTR)W32Thread->pcti - pci->ulClientDelta); + RtlCopyMemory(pctiNew, pctiOld, sizeof(CLIENTTHREADINFO)); + } + else + { + RtlZeroMemory(pctiNew, sizeof(CLIENTTHREADINFO)); } } - - if (OldDesktop != NULL && - !IntCheckProcessDesktopClasses(OldDesktop, - FreeOnFailure)) + else { - ERR("Failed to move process classes to shared heap!\n"); - - /* Failed to move desktop classes to the shared heap, - unmap the view and return the error */ - if (MapHeap && DesktopObject != NULL) - IntUnmapDesktopView(DesktopObject); - - return FALSE; + pti->rpdesk = NULL; + pti->hdesk = NULL; + pti->pDeskInfo = NULL; + pti->pcti = NULL; + pci->ulClientDelta = 0; + pci->pDeskInfo = NULL; + pci->pClientThreadInfo = NULL; + } + + /* clean up the old desktop */ + if(pdeskOld != NULL) + { + RemoveEntryList(&pti->PtiLink); + DesktopHeapFree(pdeskOld, pctiOld); + IntUnmapDesktopView(pdeskOld); + ObDereferenceObject(pdeskOld); + ZwClose(hdeskOld); } - /* Remove the thread from the old desktop's list */ - RemoveEntryList(&W32Thread->PtiLink); - - if (DesktopObject != NULL) + if(pdesk) { - ObReferenceObject(DesktopObject); - /* Insert into new desktop's list */ - InsertTailList(&DesktopObject->PtiList, &W32Thread->PtiLink); - } - - /* Close the old desktop */ - if (OldDesktop != NULL) - { - if (MapHeap) - { - IntUnmapDesktopView(OldDesktop); - } - - ObDereferenceObject(OldDesktop); - } - - if (hOldDesktop != NULL) - { - ZwClose(hOldDesktop); + InsertTailList(&pdesk->PtiList, &pti->PtiLink); } return TRUE; diff --git a/reactos/subsystems/win32/win32k/ntuser/input.c b/reactos/subsystems/win32/win32k/ntuser/input.c index 8ad738cc295..7db00b66ab2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/input.c +++ b/reactos/subsystems/win32/win32k/ntuser/input.c @@ -141,8 +141,10 @@ RawInputThreadMain() ByteOffset.QuadPart = (LONGLONG)0; //WaitTimeout.QuadPart = (LONGLONG)(-10000000); - ptiRawInput = PsGetCurrentThreadWin32Thread(); + ptiRawInput = GetW32ThreadInfo(); ptiRawInput->TIF_flags |= TIF_SYSTEMTHREAD; + ptiRawInput->pClientInfo->dwTIFlags = ptiRawInput->TIF_flags; + TRACE("Raw Input Thread 0x%x\n", ptiRawInput); KeSetPriorityThread(&PsGetCurrentThread()->Tcb, diff --git a/reactos/subsystems/win32/win32k/ntuser/misc.c b/reactos/subsystems/win32/win32k/ntuser/misc.c index 56449425c0c..ee96c7da2c1 100644 --- a/reactos/subsystems/win32/win32k/ntuser/misc.c +++ b/reactos/subsystems/win32/win32k/ntuser/misc.c @@ -542,6 +542,68 @@ IntSafeCopyUnicodeStringTerminateNULL(PUNICODE_STRING Dest, return STATUS_SUCCESS; } +void UserDbgAssertThreadInfo(BOOL showCaller) +{ + PTEB Teb; + PPROCESSINFO ppi; + PCLIENTINFO pci; + PTHREADINFO pti; + + ppi = PsGetCurrentProcessWin32Process(); + pti = PsGetCurrentThreadWin32Thread(); + Teb = NtCurrentTeb(); + pci = GetWin32ClientInfo(); + + ASSERT(Teb); + ASSERT(pti); + ASSERT(pti->ppi == ppi); + ASSERT(pti->pClientInfo == pci); + ASSERT(Teb->Win32ThreadInfo == pti); + ASSERT(pci->ppi == ppi); + ASSERT(pci->fsHooks == pti->fsHooks); + ASSERT(pci->ulClientDelta == DesktopHeapGetUserDelta()); + if (pti->pcti && pci->pDeskInfo) + ASSERT(pci->pClientThreadInfo == (PVOID)((ULONG_PTR)pti->pcti - pci->ulClientDelta)); + if (pti->KeyboardLayout) + ASSERT(pci->hKL == pti->KeyboardLayout->hkl); + if(pti->rpdesk != NULL) + ASSERT(pti->pDeskInfo == pti->rpdesk->pDeskInfo); + + /*too bad we still get this assertion*/ + /* ASSERT(pci->dwTIFlags == pti->TIF_flags); */ + if(pci->dwTIFlags != pti->TIF_flags) + { + ERR("pci->dwTIFlags(0x%x) doesn't match pti->TIF_flags(0x%x)\n", pci->dwTIFlags, pti->TIF_flags); + if(showCaller) + { + DbgPrint("Caller:\n"); + KeRosDumpStackFrames(NULL, 10); + } + pci->dwTIFlags = pti->TIF_flags; + } +} + +void +NTAPI +UserDbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments) +{ + UserDbgAssertThreadInfo(FALSE); +} + +ULONG_PTR +NTAPI +UserDbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult) +{ + /* Make sure that the first syscall is NtUserInitialize */ + /* too bad this fails */ + //ASSERT(gbInitialized); + + UserDbgAssertThreadInfo(TRUE); + + return ulResult; +} + + PPROCESSINFO GetW32ProcessInfo(VOID) { @@ -551,66 +613,8 @@ GetW32ProcessInfo(VOID) PTHREADINFO GetW32ThreadInfo(VOID) { - PTEB Teb; - PPROCESSINFO ppi; - PCLIENTINFO pci; - PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); - - if (pti == NULL) - { - /* FIXME: Temporary hack for system threads... */ - return NULL; - } - /* Initialize it */ - pti->ppi = ppi = GetW32ProcessInfo(); - - if (pti->rpdesk != NULL) - { - pti->pDeskInfo = pti->rpdesk->pDeskInfo; - } - else - { - pti->pDeskInfo = NULL; - } - /* Update the TEB */ - Teb = NtCurrentTeb(); - pci = GetWin32ClientInfo(); - pti->pClientInfo = pci; - _SEH2_TRY - { - if(Teb) - { - ProbeForWrite( Teb, - sizeof(TEB), - sizeof(ULONG)); - - Teb->Win32ThreadInfo = (PW32THREAD) pti; - } - - pci->ppi = ppi; - pci->fsHooks = pti->fsHooks; - if (pti->KeyboardLayout) pci->hKL = pti->KeyboardLayout->hkl; - pci->dwTIFlags = pti->TIF_flags; - /* CI may not have been initialized. */ - if (!pci->pDeskInfo && pti->pDeskInfo) - { - if (!pci->ulClientDelta) pci->ulClientDelta = DesktopHeapGetUserDelta(); - - pci->pDeskInfo = (PVOID)((ULONG_PTR)pti->pDeskInfo - pci->ulClientDelta); - } - if (pti->pcti && pci->pDeskInfo) - pci->pClientThreadInfo = (PVOID)((ULONG_PTR)pti->pcti - pci->ulClientDelta); - else - pci->pClientThreadInfo = NULL; - - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - SetLastNtError(_SEH2_GetExceptionCode()); - } - _SEH2_END; - - return pti; + UserDbgAssertThreadInfo(TRUE); + return (PTHREADINFO)PsGetCurrentThreadWin32Thread(); } /* EOF */ diff --git a/reactos/subsystems/win32/win32k/objects/gdidbg.c b/reactos/subsystems/win32/win32k/objects/gdidbg.c index 803d41e5e67..51b2a430448 100644 --- a/reactos/subsystems/win32/win32k/objects/gdidbg.c +++ b/reactos/subsystems/win32/win32k/objects/gdidbg.c @@ -483,7 +483,7 @@ DbgCleanupEventList(PSLIST_HEADER pslh) void NTAPI -DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments) +GdiDbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments) { PTHREADINFO pti = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); if (pti && pti->cExclusiveLocks != 0) @@ -498,7 +498,7 @@ DbgPreServiceHook(ULONG ulSyscallId, PULONG_PTR pulArguments) ULONG_PTR NTAPI -DbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult) +GdiDbgPostServiceHook(ULONG ulSyscallId, ULONG_PTR ulResult) { PTHREADINFO pti = (PTHREADINFO)PsGetCurrentThreadWin32Thread(); if (pti && pti->cExclusiveLocks != 0) From 02fdd71dd4a2822c8f1e347abbf3151f1864016a Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 6 Feb 2012 14:32:07 +0000 Subject: [PATCH 236/289] [NTOSKRNL] - Modify the logic in MmArmAccessFault, so that faults on kernel mode addresses including page table addresses are handled in the first part and user mode addresses (VADs) in the second part. This works, because for the special case of page table addresses, the user mode and kernel mode part of the code end up doing the same thing and this simplifies the code. - In the user mode part call MiCheckVirtualAddress early and bail out if no VAD is found, since we do not care about any other cases any more. svn path=/trunk/; revision=55459 --- reactos/ntoskrnl/mm/ARM3/pagfault.c | 129 +++++++++++++--------------- 1 file changed, 59 insertions(+), 70 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index 2c1a3b33af7..270d7d537eb 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -697,7 +697,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, } /* Check for kernel fault address */ - while (Address >= MmSystemRangeStart) + if (Address >= MmSystemRangeStart) { /* Bail out, if the fault came from user mode */ if (Mode == UserMode) return STATUS_ACCESS_VIOLATION; @@ -719,6 +719,17 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, } #endif +#if (_MI_PAGING_LEVELS == 2) + /* Check if we have a situation that might need synchronization + of the PDE with the system page directory */ + if (MI_IS_SYSTEM_PAGE_TABLE_ADDRESS(Address)) + { + /* This could be a paged pool commit with an unsychronized PDE. + NOTE: This way it works on x86, verify for other architectures! */ + if (MiSynchronizeSystemPde((PMMPDE)PointerPte)) return STATUS_SUCCESS; + } +#endif + /* Check if the PDE is invalid */ if (PointerPde->u.Hard.Valid == 0) { @@ -756,23 +767,24 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, // Check for a fault on the page table or hyperspace if (MI_IS_PAGE_TABLE_OR_HYPER_ADDRESS(Address)) { -#if (_MI_PAGING_LEVELS == 2) - /* Could be paged pool access from a new process -- synchronize the page directories */ - if (MiCheckPdeForPagedPool(Address) == STATUS_WAIT_1) - { - DPRINT1("PAGE TABLES FAULTED IN!\n"); - return STATUS_SUCCESS; - } -#endif - /* Otherwise this could be a commit of a virtual address */ - break; + ASSERT(TempPte.u.Long != (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)); + ASSERT(TempPte.u.Soft.Prototype == 0); + + /* Use the process working set */ + CurrentProcess = (PEPROCESS)CurrentThread->Tcb.ApcState.Process; + WorkingSet = &CurrentProcess->Vm; + } + else + { + /* Otherwise use the system working set */ + WorkingSet = &MmSystemCacheWs; + CurrentProcess = NULL; } - /* In this path, we are using the system working set */ + /* Get the current thread */ CurrentThread = PsGetCurrentThread(); - WorkingSet = &MmSystemCacheWs; - /* Acquire it */ + /* Acquire the working set lock */ KeRaiseIrql(APC_LEVEL, &LockIrql); MiLockWorkingSet(CurrentThread, WorkingSet); @@ -854,7 +866,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, PointerPte, ProtoPte, FALSE, - NULL, + CurrentProcess, TrapInformation, NULL); @@ -868,31 +880,42 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, return Status; } -#if (_MI_PAGING_LEVELS == 4) - /* On these systems we have PXEs and PPEs ready for everything we need */ - if (PointerPxe->u.Hard.Valid == 0) return STATUS_ACCESS_VIOLATION; -#endif -#if (_MI_PAGING_LEVELS >= 3) - if (PointerPpe->u.Hard.Valid == 0) return STATUS_ACCESS_VIOLATION; -#endif - - /* This is a user fault (<- And this is a lie!) */ + /* This is a user fault */ CurrentThread = PsGetCurrentThread(); - CurrentProcess = PsGetCurrentProcess(); + CurrentProcess = (PEPROCESS)CurrentThread->Tcb.ApcState.Process; /* Lock the working set */ MiLockProcessWorkingSet(CurrentProcess, CurrentThread); - /* First things first, is the PDE valid? */ +#if (_MI_PAGING_LEVELS == 2) ASSERT(PointerPde->u.Hard.LargePage == 0); +#endif + + /* Check if this address range belongs to a valid allocation (VAD) */ + ProtoPte = MiCheckVirtualAddress(Address, &ProtectionCode, &Vad); + if (ProtectionCode == MM_NOACCESS) + { + /* This is a bogus VA */ + MiUnlockProcessWorkingSet(CurrentProcess, CurrentThread); + return STATUS_ACCESS_VIOLATION; + } + +#if (_MI_PAGING_LEVELS == 4) + /* On these systems we have PXEs and PPEs ready for everything we need */ + if (PointerPxe->u.Hard.Valid == 0) return STATUS_ACCESS_VIOLATION; +#endif + +#if (_MI_PAGING_LEVELS >= 3) + if (PointerPpe->u.Hard.Valid == 0) return STATUS_ACCESS_VIOLATION; +#endif + + + /* First things first, is the PDE valid? */ if (PointerPde->u.Hard.Valid == 0) { /* Right now, we only handle scenarios where the PDE is totally empty */ ASSERT(PointerPde->u.Long == 0); - /* Check if this address range belongs to a valid allocation (VAD) */ - MiCheckVirtualAddress(Address, &ProtectionCode, &Vad); - /* Right now, we expect a valid protection mask on the VAD */ ASSERT(ProtectionCode != MM_NOACCESS); @@ -921,6 +944,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, if (TempPte.u.Long == (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)) { /* Resolve the fault */ + MI_WRITE_INVALID_PDE(PointerPde, DemandZeroPde); MiResolveDemandZeroFault(Address, (ULONG)PointerPte->u.Soft.Protection, CurrentProcess, @@ -937,8 +961,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, /* Check for non-demand zero PTE */ if (TempPte.u.Long != 0) { - /* This is a page fault, check for valid protection */ - ASSERT(TempPte.u.Soft.Protection != 0x100); + /* This is a page fault */ /* FIXME: Run MiAccessCheck */ @@ -959,28 +982,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, return Status; } - /* Check if this address range belongs to a valid allocation (VAD) */ - ASSERT(TempPte.u.Long == 0); - ProtoPte = MiCheckVirtualAddress(Address, &ProtectionCode, &Vad); - if (ProtectionCode == MM_NOACCESS) - { - /* This is a bogus VA */ - Status = STATUS_ACCESS_VIOLATION; - /* Could be a not-yet-mapped paged pool page table */ -#if (_MI_PAGING_LEVELS == 2) - MiCheckPdeForPagedPool(Address); -#endif - /* See if that fixed it */ - if (PointerPte->u.Hard.Valid == 1) Status = STATUS_SUCCESS; - - /* Return the status */ - MiUnlockProcessWorkingSet(CurrentProcess, CurrentThread); - return Status; - } - - /* Is this a user address? */ - if (Address <= MM_HIGHEST_USER_ADDRESS) { /* Add an additional page table reference */ MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)]++; @@ -1026,24 +1028,11 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, /* And we're done with the lock */ KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); - - /* Was the fault on an actual user page, or a kernel page for the user? */ - if (PointerPte <= MiHighestUserPte) - { - /* User fault, build a user PTE */ - MI_MAKE_HARDWARE_PTE_USER(&TempPte, - PointerPte, - PointerPte->u.Soft.Protection, - PageFrameIndex); - } - else - { - /* Session, kernel, or user PTE, figure it out and build it */ - MI_MAKE_HARDWARE_PTE(&TempPte, - PointerPte, - PointerPte->u.Soft.Protection, - PageFrameIndex); - } + /* User fault, build a user PTE */ + MI_MAKE_HARDWARE_PTE_USER(&TempPte, + PointerPte, + PointerPte->u.Soft.Protection, + PageFrameIndex); /* Write the dirty bit for writeable pages */ if (MI_IS_PAGE_WRITEABLE(&TempPte)) MI_MAKE_DIRTY_PAGE(&TempPte); From 1e7a03a90390afb5e9cc51edac301acc16eaa668 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 6 Feb 2012 14:35:09 +0000 Subject: [PATCH 237/289] [NTOSKRNL] Add a modification that I missed to apply. svn path=/trunk/; revision=55460 --- reactos/ntoskrnl/mm/ARM3/pagfault.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index 270d7d537eb..17a622fab96 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -764,6 +764,9 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, return STATUS_SUCCESS; } + /* Get the current thread */ + CurrentThread = PsGetCurrentThread(); + // Check for a fault on the page table or hyperspace if (MI_IS_PAGE_TABLE_OR_HYPER_ADDRESS(Address)) { @@ -781,8 +784,6 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, CurrentProcess = NULL; } - /* Get the current thread */ - CurrentThread = PsGetCurrentThread(); /* Acquire the working set lock */ KeRaiseIrql(APC_LEVEL, &LockIrql); From 1374772ff71d99fa61f9016409b2fa745317b6c0 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 6 Feb 2012 15:04:12 +0000 Subject: [PATCH 238/289] [NTOSKRNL] - Assert that reference counts are sane in MmReferencePage and MmDereferencePage svn path=/trunk/; revision=55461 --- reactos/ntoskrnl/mm/freelist.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/ntoskrnl/mm/freelist.c b/reactos/ntoskrnl/mm/freelist.c index ba66cd7871a..b69a40b971c 100644 --- a/reactos/ntoskrnl/mm/freelist.c +++ b/reactos/ntoskrnl/mm/freelist.c @@ -501,6 +501,7 @@ MmReferencePage(PFN_NUMBER Pfn) ASSERT(Page); ASSERT_IS_ROS_PFN(Page); + ASSERT(Page->u3.e2.ReferenceCount != 0); Page->u3.e2.ReferenceCount++; } @@ -543,6 +544,7 @@ MmDereferencePage(PFN_NUMBER Pfn) ASSERT(Page); ASSERT_IS_ROS_PFN(Page); + ASSERT(Page->u3.e2.ReferenceCount != 0); Page->u3.e2.ReferenceCount--; if (Page->u3.e2.ReferenceCount == 0) { From 60f47202806fe7ecbe4adff448fc82d2477b393d Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 6 Feb 2012 15:08:32 +0000 Subject: [PATCH 239/289] [NTOSKRNL] Handle 3 and 4 level page tables in MmArmAccessFault svn path=/trunk/; revision=55462 --- reactos/ntoskrnl/mm/ARM3/pagfault.c | 55 ++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index 17a622fab96..0b59938eb0b 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -181,6 +181,13 @@ MiCheckPdeForPagedPool(IN PVOID Address) // return Status; } +#else +NTSTATUS +FASTCALL +MiCheckPdeForPagedPool(IN PVOID Address) +{ + return STATUS_ACCESS_VIOLATION; +} #endif VOID @@ -784,7 +791,6 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, CurrentProcess = NULL; } - /* Acquire the working set lock */ KeRaiseIrql(APC_LEVEL, &LockIrql); MiLockWorkingSet(CurrentThread, WorkingSet); @@ -902,16 +908,42 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, } #if (_MI_PAGING_LEVELS == 4) - /* On these systems we have PXEs and PPEs ready for everything we need */ - if (PointerPxe->u.Hard.Valid == 0) return STATUS_ACCESS_VIOLATION; + /* Check if the PXE is valid */ + if (PointerPxe->u.Hard.Valid == 0) + { + /* Right now, we only handle scenarios where the PXE is totally empty */ + ASSERT(PointerPxe->u.Long == 0); + + /* Resolve a demand zero fault */ + Status = MiResolveDemandZeroFault(PointerPpe, + MM_READWRITE, + CurrentProcess, + MM_NOIRQL); + + /* We should come back with a valid PXE */ + ASSERT(PointerPxe->u.Hard.Valid == 1); + } #endif #if (_MI_PAGING_LEVELS >= 3) - if (PointerPpe->u.Hard.Valid == 0) return STATUS_ACCESS_VIOLATION; + /* Check if the PPE is valid */ + if (PointerPpe->u.Hard.Valid == 0) + { + /* Right now, we only handle scenarios where the PPE is totally empty */ + ASSERT(PointerPpe->u.Long == 0); + + /* Resolve a demand zero fault */ + Status = MiResolveDemandZeroFault(PointerPde, + MM_READWRITE, + CurrentProcess, + MM_NOIRQL); + + /* We should come back with a valid PPE */ + ASSERT(PointerPpe->u.Hard.Valid == 1); + } #endif - - /* First things first, is the PDE valid? */ + /* Check if the PDE is valid */ if (PointerPde->u.Hard.Valid == 0) { /* Right now, we only handle scenarios where the PDE is totally empty */ @@ -983,12 +1015,11 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, return Status; } - - { - /* Add an additional page table reference */ - MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)]++; - ASSERT(MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)] <= PTE_COUNT); - } +#if (_MI_PAGING_LEVELS == 2) + /* Add an additional page table reference */ + MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)]++; + ASSERT(MmWorkingSetList->UsedPageTableEntries[MiGetPdeOffset(Address)] <= PTE_COUNT); +#endif /* Did we get a prototype PTE back? */ if (!ProtoPte) From 1fbcc2809fa0ccd8be1a49e64992db7d28695f08 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 6 Feb 2012 17:03:59 +0000 Subject: [PATCH 240/289] [SMSS2]: Add some debugging to figure out what's happening on KVM. svn path=/trunk/; revision=55463 --- reactos/base/system/smss2/pagefile.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/reactos/base/system/smss2/pagefile.c b/reactos/base/system/smss2/pagefile.c index 035f437d858..ba9047b65d2 100644 --- a/reactos/base/system/smss2/pagefile.c +++ b/reactos/base/system/smss2/pagefile.c @@ -395,6 +395,10 @@ SmpGetVolumeFreeSpace(IN PSMP_VOLUME_DESCRIPTOR Volume) SizeInfo.SectorsPerAllocationUnit; FinalFreeSpace.QuadPart = FreeSpace.QuadPart * SizeInfo.BytesPerSector; Volume->FreeSpace = FinalFreeSpace; + DPRINT1("AUs: %I64 Sectors: %lx Bytes Per Sector: %lx\n", + SizeInfo.AvailableAllocationUnits.QuadPart, + SizeInfo.SectorsPerAllocationUnit, + SizeInfo.BytesPerSector); /* Check if there's less than 32MB free so we don't starve the disk */ if (FinalFreeSpace.QuadPart <= 0x2000000) @@ -515,6 +519,11 @@ SmpCreatePagingFileOnFixedDrive(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, DPRINT1("SMSS:PFILE: Failed to query free space for boot volume `%wC'\n", Volume->DriveLetter); } + else + { + DPRINT1("Queried free space for boot volume `%wC: %I64x'\n", + Volume->DriveLetter, Volume->FreeSpace.QuadPart); + } /* Don't process crashdump on this volume anymore */ Descriptor->Flags |= SMP_PAGEFILE_DUMP_PROCESSED; From 5fb988c04dc9ef567c2e2032fabb8a42080184d8 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 6 Feb 2012 17:41:49 +0000 Subject: [PATCH 241/289] [NTOSKRNL]: Stubplement SystemSessionCreateInformation (it allocates a real Session ID and sets the right EPROCESS flags). Nobody uses this yet (future SMSS2 will). [SMSS2]: More attempts at fixing KVM. svn path=/trunk/; revision=55464 --- reactos/base/system/smss2/pagefile.c | 10 +- reactos/ntoskrnl/ex/sysinfo.c | 24 ++++- reactos/ntoskrnl/mm/ARM3/miarm.h | 6 ++ reactos/ntoskrnl/mm/ARM3/procsup.c | 138 +++++++++++++++++++++++++++ reactos/ntoskrnl/mm/mminit.c | 3 + 5 files changed, 176 insertions(+), 5 deletions(-) diff --git a/reactos/base/system/smss2/pagefile.c b/reactos/base/system/smss2/pagefile.c index ba9047b65d2..db72364a1c3 100644 --- a/reactos/base/system/smss2/pagefile.c +++ b/reactos/base/system/smss2/pagefile.c @@ -395,7 +395,7 @@ SmpGetVolumeFreeSpace(IN PSMP_VOLUME_DESCRIPTOR Volume) SizeInfo.SectorsPerAllocationUnit; FinalFreeSpace.QuadPart = FreeSpace.QuadPart * SizeInfo.BytesPerSector; Volume->FreeSpace = FinalFreeSpace; - DPRINT1("AUs: %I64 Sectors: %lx Bytes Per Sector: %lx\n", + DPRINT1("AUs: %I64x Sectors: %lx Bytes Per Sector: %lx\n", SizeInfo.AvailableAllocationUnits.QuadPart, SizeInfo.SectorsPerAllocationUnit, SizeInfo.BytesPerSector); @@ -592,7 +592,13 @@ SmpCreatePagingFileOnFixedDrive(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, if (Descriptor->ActualMinSize.QuadPart < MinimumSize->QuadPart) { /* Delete the current page file and fail */ - if (ShouldDelete) SmpDeletePagingFile(&Descriptor->Name); + if (ShouldDelete) + { + SmpDeletePagingFile(&Descriptor->Name); + + /* FIXFIX: Windows Vista does this, and it seems like we should too, so try to see if this fixes KVM */ + Volume->FreeSpace.QuadPart += PageFileSize.QuadPart; + } DPRINT1("SMSS:PFILE: Failing for min %I64X, max %I64X, real min %I64X \n", Descriptor->ActualMinSize.QuadPart, Descriptor->ActualMaxSize.QuadPart, diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index be41eaae3ae..9343fa0978e 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1755,13 +1755,31 @@ SSI_DEF(SystemSetTimeSlipEvent) return STATUS_NOT_IMPLEMENTED; } +NTSTATUS +NTAPI +MmSessionCreate(OUT PULONG SessionId); /* Class 47 - Create a new session (TSE) */ SSI_DEF(SystemCreateSession) { - /* FIXME */ - DPRINT1("NtSetSystemInformation - SystemCreateSession not implemented\n"); - return STATUS_NOT_IMPLEMENTED; + ULONG SessionId; + KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(); + NTSTATUS Status; + + if (Size != sizeof(ULONG)) return STATUS_INFO_LENGTH_MISMATCH; + + if (PreviousMode != KernelMode) + { + if (!SeSinglePrivilegeCheck(SeLoadDriverPrivilege, PreviousMode)) + { + return STATUS_PRIVILEGE_NOT_HELD; + } + } + + Status = MmSessionCreate(&SessionId); + if (NT_SUCCESS(Status)) *(PULONG)Buffer = SessionId; + + return Status; } diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 5e0541e3a46..78bbcce6f14 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -983,6 +983,12 @@ MiInitializePfnDatabase( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); +VOID +NTAPI +MiInitializeSessionIds( + VOID +); + BOOLEAN NTAPI MiInitializeMemoryEvents( diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index 0b6c3faed8b..e1640fa5827 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -1340,6 +1340,144 @@ MmCleanProcessAddressSpace(IN PEPROCESS Process) MmUnlockAddressSpace(&Process->Vm); } +/* SESSION CODE TO MOVE TO SESSION.C ******************************************/ + +KGUARDED_MUTEX MiSessionIdMutex; +PRTL_BITMAP MiSessionIdBitmap; +volatile LONG MiSessionLeaderExists; + +VOID +NTAPI +MiInitializeSessionIds(VOID) +{ + /* FIXME: Other stuff should go here */ + + /* Initialize the lock */ + KeInitializeGuardedMutex(&MiSessionIdMutex); + + /* Allocate the bitmap */ + MiSessionIdBitmap = ExAllocatePoolWithTag(PagedPool, + sizeof(RTL_BITMAP) + ((64 + 31) / 32) * 4, + ' mM'); + if (MiSessionIdBitmap) + { + /* Free all the bits */ + RtlInitializeBitMap(MiSessionIdBitmap, (PVOID)(MiSessionIdBitmap + 1), 64); + RtlClearAllBits(MiSessionIdBitmap); + } + else + { + /* Die if we couldn't allocate the bitmap */ + KeBugCheckEx(INSTALL_MORE_MEMORY, + MmNumberOfPhysicalPages, + MmLowestPhysicalPage, + MmHighestPhysicalPage, + 0x200); + } +} + +VOID +NTAPI +MiSessionLeader(IN PEPROCESS Process) +{ + KIRQL OldIrql; + + /* Set the flag while under the expansion lock */ + OldIrql = KeAcquireQueuedSpinLock(LockQueueExpansionLock); + Process->Vm.Flags.SessionLeader = TRUE; + KeReleaseQueuedSpinLock(LockQueueExpansionLock, OldIrql); +} + +NTSTATUS +NTAPI +MiSessionCreateInternal(OUT PULONG SessionId) +{ + PEPROCESS Process = PsGetCurrentProcess(); + ULONG NewFlags, Flags; + + /* Loop so we can set the session-is-creating flag */ + Flags = Process->Flags; + while (TRUE) + { + /* Check if it's already set */ + if (Flags & PSF_SESSION_CREATION_UNDERWAY_BIT) + { + /* Bail out */ + DPRINT1("Lost session race\n"); + return STATUS_ALREADY_COMMITTED; + } + + /* Now try to set it */ + NewFlags = InterlockedCompareExchange((PLONG)&Process->Flags, + Flags | PSF_SESSION_CREATION_UNDERWAY_BIT, + Flags); + if (NewFlags == Flags) break; + + /* It changed, try again */ + Flags = NewFlags; + } + + /* Now we should own the flag */ + ASSERT(Process->Flags & PSF_SESSION_CREATION_UNDERWAY_BIT); + + /* Allocate a new Session ID */ + KeAcquireGuardedMutex(&MiSessionIdMutex); + *SessionId = RtlFindClearBitsAndSet(MiSessionIdBitmap, 1, 0); + if (*SessionId == 0xFFFFFFFF) + { + DPRINT1("Too many sessions created. Expansion not yet supported\n"); + return STATUS_NO_MEMORY; + } + KeReleaseGuardedMutex(&MiSessionIdMutex); + + /* We're done, clear the flag */ + ASSERT(Process->Flags & PSF_SESSION_CREATION_UNDERWAY_BIT); + PspClearProcessFlag(Process, PSF_SESSION_CREATION_UNDERWAY_BIT); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MmSessionCreate(OUT PULONG SessionId) +{ + PEPROCESS Process = PsGetCurrentProcess(); + ULONG SessionLeaderExists; + NTSTATUS Status; + + /* Fail if the process is already in a session */ + if (Process->Flags & PSF_PROCESS_IN_SESSION_BIT) + { + DPRINT1("Process already in session\n"); + return STATUS_ALREADY_COMMITTED; + } + + /* Check if the process is already the session leader */ + if (!Process->Vm.Flags.SessionLeader) + { + /* Atomically set it as the leader */ + SessionLeaderExists = InterlockedCompareExchange(&MiSessionLeaderExists, 1, 0); + if (SessionLeaderExists) + { + DPRINT1("Session leader race\n"); + return STATUS_INVALID_SYSTEM_SERVICE; + } + + /* Do the work required to upgrade him */ + MiSessionLeader(Process); + } + + /* FIXME: Actually create a session */ + KeEnterCriticalRegion(); + Status = MiSessionCreateInternal(SessionId); + KeLeaveCriticalRegion(); + + /* Set and assert the flags, and return */ + PspSetProcessFlag(Process, PSF_PROCESS_IN_SESSION_BIT); + ASSERT(MiSessionLeaderExists == 1); + if (NT_SUCCESS(Status)) DPRINT1("New session created: %lx\n", *SessionId); + return Status; +} + /* SYSTEM CALLS ***************************************************************/ NTSTATUS diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index c2b09fd8285..9d603aa9d63 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -437,6 +437,9 @@ MmInitSystem(IN ULONG Phase, PageFrameNumber); *MmSharedUserDataPte = TempPte; + /* Setup session IDs */ + MiInitializeSessionIds(); + /* Setup the memory threshold events */ if (!MiInitializeMemoryEvents()) return FALSE; From 560ff3fed95935966ef03d113c10ad39cfffe389 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 6 Feb 2012 18:14:36 +0000 Subject: [PATCH 242/289] [SMSS2/SMSS]: Put SMSS back in charge of the pagefile as yet another attempt to fix KVM. [NTOSKRNL]: Stub-plement SystemSessionDetachInformation. svn path=/trunk/; revision=55465 --- reactos/base/system/smss/init.c | 2 +- reactos/base/system/smss/initpage.c | 4 ++-- reactos/base/system/smss2/pagefile.c | 15 +++++++------- reactos/ntoskrnl/ex/sysinfo.c | 23 +++++++++++++++++++--- reactos/ntoskrnl/mm/ARM3/procsup.c | 29 ++++++++++++++++++++++++++++ 5 files changed, 59 insertions(+), 14 deletions(-) diff --git a/reactos/base/system/smss/init.c b/reactos/base/system/smss/init.c index 48a60fc14b9..90de9328cde 100644 --- a/reactos/base/system/smss/init.c +++ b/reactos/base/system/smss/init.c @@ -32,7 +32,7 @@ struct { // {TRUE, SmProcessFileRenameList, "process the file rename list"}, // {FALSE, SmUpdateEnvironment, "update environment variables"}, // {FALSE, SmLoadKnownDlls, "preload system DLLs"}, -// {TRUE, SmCreatePagingFiles, "create paging files"}, + {TRUE, SmCreatePagingFiles, "create paging files"}, // {TRUE, SmInitializeRegistry, "initialize the registry"}, {TRUE, SmInitializeClientManagement, "initialize client management"}, {TRUE, SmLoadSubsystems, "load subsystems"} diff --git a/reactos/base/system/smss/initpage.c b/reactos/base/system/smss/initpage.c index ab1fc0735a7..677e8a82dfe 100644 --- a/reactos/base/system/smss/initpage.c +++ b/reactos/base/system/smss/initpage.c @@ -12,7 +12,7 @@ #define NDEBUG #include -#if 0 +#if 1 #define GIGABYTE (1024 * 1024 * 1024) /* One Gigabyte */ @@ -220,7 +220,7 @@ SmpPagingFilesQueryRoutine(PWSTR ValueName, 0); if (! NT_SUCCESS(Status)) { - PrintString("Creation of paging file %wZ with size %I64d KB failed (status 0x%x)\n", + DPRINT1("Creation of paging file %wZ with size %I64d KB failed (status 0x%x)\n", &FileName, InitialSize.QuadPart / 1024, Status); } diff --git a/reactos/base/system/smss2/pagefile.c b/reactos/base/system/smss2/pagefile.c index db72364a1c3..7c3c21a602e 100644 --- a/reactos/base/system/smss2/pagefile.c +++ b/reactos/base/system/smss2/pagefile.c @@ -457,7 +457,8 @@ SmpCreatePagingFile(IN PUNICODE_STRING Name, NTSTATUS Status; /* Tell the kernel to create the pagefile */ - Status = NtCreatePagingFile(Name, MinSize, MaxSize, Priority); + //Status = NtCreatePagingFile(Name, MinSize, MaxSize, Priority); + Status = STATUS_SUCCESS; if (NT_SUCCESS(Status)) { DPRINT1("SMSS:PFILE: NtCreatePagingFile (%wZ, %I64X, %I64X) succeeded. \n", @@ -592,13 +593,7 @@ SmpCreatePagingFileOnFixedDrive(IN PSMP_PAGEFILE_DESCRIPTOR Descriptor, if (Descriptor->ActualMinSize.QuadPart < MinimumSize->QuadPart) { /* Delete the current page file and fail */ - if (ShouldDelete) - { - SmpDeletePagingFile(&Descriptor->Name); - - /* FIXFIX: Windows Vista does this, and it seems like we should too, so try to see if this fixes KVM */ - Volume->FreeSpace.QuadPart += PageFileSize.QuadPart; - } + if (ShouldDelete) SmpDeletePagingFile(&Descriptor->Name); DPRINT1("SMSS:PFILE: Failing for min %I64X, max %I64X, real min %I64X \n", Descriptor->ActualMinSize.QuadPart, Descriptor->ActualMaxSize.QuadPart, @@ -978,6 +973,10 @@ SmpCreateVolumeDescriptors(VOID) SizeInfo.SectorsPerAllocationUnit; FinalFreeSpace.QuadPart = FreeSpace.QuadPart * SizeInfo.BytesPerSector; Volume->FreeSpace = FinalFreeSpace; + DPRINT1("AUs: %I64x Sectors: %lx Bytes Per Sector: %lx\n", + SizeInfo.AvailableAllocationUnits.QuadPart, + SizeInfo.SectorsPerAllocationUnit, + SizeInfo.BytesPerSector); /* Check if there's less than 32MB free so we don't starve the disk */ if (FinalFreeSpace.QuadPart <= 0x2000000) diff --git a/reactos/ntoskrnl/ex/sysinfo.c b/reactos/ntoskrnl/ex/sysinfo.c index 9343fa0978e..ac1dc5d141e 100644 --- a/reactos/ntoskrnl/ex/sysinfo.c +++ b/reactos/ntoskrnl/ex/sysinfo.c @@ -1759,6 +1759,10 @@ NTSTATUS NTAPI MmSessionCreate(OUT PULONG SessionId); +NTSTATUS +NTAPI +MmSessionDelete(IN ULONG SessionId); + /* Class 47 - Create a new session (TSE) */ SSI_DEF(SystemCreateSession) { @@ -1786,9 +1790,22 @@ SSI_DEF(SystemCreateSession) /* Class 48 - Delete an existing session (TSE) */ SSI_DEF(SystemDeleteSession) { - /* FIXME */ - DPRINT1("NtSetSystemInformation - SystemDeleteSession not implemented\n"); - return STATUS_NOT_IMPLEMENTED; + ULONG SessionId; + KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(); + + if (Size != sizeof(ULONG)) return STATUS_INFO_LENGTH_MISMATCH; + + if (PreviousMode != KernelMode) + { + if (!SeSinglePrivilegeCheck(SeLoadDriverPrivilege, PreviousMode)) + { + return STATUS_PRIVILEGE_NOT_HELD; + } + } + + SessionId = *(PULONG)Buffer; + + return MmSessionDelete(SessionId); } diff --git a/reactos/ntoskrnl/mm/ARM3/procsup.c b/reactos/ntoskrnl/mm/ARM3/procsup.c index e1640fa5827..387c3d21612 100644 --- a/reactos/ntoskrnl/mm/ARM3/procsup.c +++ b/reactos/ntoskrnl/mm/ARM3/procsup.c @@ -1478,6 +1478,35 @@ MmSessionCreate(OUT PULONG SessionId) return Status; } +NTSTATUS +NTAPI +MmSessionDelete(IN ULONG SessionId) +{ + PEPROCESS Process = PsGetCurrentProcess(); + + /* Process must be in a session */ + if (!(Process->Flags & PSF_PROCESS_IN_SESSION_BIT)) + { + DPRINT1("Not in a session!\n"); + return STATUS_UNABLE_TO_FREE_VM; + } + + /* It must be the session leader */ + if (!Process->Vm.Flags.SessionLeader) + { + DPRINT1("Not a session leader!\n"); + return STATUS_UNABLE_TO_FREE_VM; + } + + /* Remove one reference count */ + KeEnterCriticalRegion(); + /* FIXME: Do it */ + KeLeaveCriticalRegion(); + + /* All done */ + return STATUS_SUCCESS; +} + /* SYSTEM CALLS ***************************************************************/ NTSTATUS From 9aaaa6c4a223d59a3fdbcdef3afa9d69b4a14789 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 6 Feb 2012 18:48:50 +0000 Subject: [PATCH 243/289] [SXS] * Sync to Wine 1.3.37. svn path=/trunk/; revision=55466 --- reactos/dll/win32/sxs/CMakeLists.txt | 8 +- reactos/dll/win32/sxs/cache.c | 618 +++++++++++++++++++++++++++ reactos/dll/win32/sxs/msvchelper.h | 2 + reactos/dll/win32/sxs/sxs.c | 8 - reactos/dll/win32/sxs/sxs.rbuild | 3 + reactos/dll/win32/sxs/sxs.spec | 2 +- reactos/media/doc/README.WINE | 2 +- 7 files changed, 632 insertions(+), 11 deletions(-) create mode 100644 reactos/dll/win32/sxs/cache.c create mode 100644 reactos/dll/win32/sxs/msvchelper.h diff --git a/reactos/dll/win32/sxs/CMakeLists.txt b/reactos/dll/win32/sxs/CMakeLists.txt index 4e23ad77755..a009000e4cb 100644 --- a/reactos/dll/win32/sxs/CMakeLists.txt +++ b/reactos/dll/win32/sxs/CMakeLists.txt @@ -5,6 +5,7 @@ add_definitions(-D__WINESRC__) spec2def(sxs.dll sxs.spec) list(APPEND SOURCE + cache.c sxs.c ${CMAKE_CURRENT_BINARY_DIR}/sxs_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/sxs.def) @@ -14,7 +15,12 @@ set_module_type(sxs win32dll ENTRYPOINT 0 ) target_link_libraries(sxs wine) -add_importlibs(sxs kernel32 ntdll) +if(MSVC) + set_source_files_properties(cache.c PROPERTIES COMPILE_FLAGS /FImsvchelper.h) + target_link_libraries(sxs uuid) +endif() + +add_importlibs(sxs oleaut32 ole32 kernel32 ntdll) add_dependencies(sxs psdk) add_cd_file(TARGET sxs DESTINATION reactos/system32 FOR all) diff --git a/reactos/dll/win32/sxs/cache.c b/reactos/dll/win32/sxs/cache.c new file mode 100644 index 00000000000..af19e60d600 --- /dev/null +++ b/reactos/dll/win32/sxs/cache.c @@ -0,0 +1,618 @@ +/* + * IAssemblyCache implementation + * + * Copyright 2010 Hans Leidekker 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 + +#define COBJMACROS +#define INITGUID + +#include "windef.h" +#include "winbase.h" +#include "ole2.h" +#include "winsxs.h" +#include "msxml2.h" + +#include "wine/debug.h" +#include "wine/list.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(sxs); + +static inline WCHAR *strdupW( const WCHAR *s ) +{ + WCHAR *t; + if (!s) return NULL; + if ((t = HeapAlloc( GetProcessHeap(), 0, (strlenW( s ) + 1) * sizeof(WCHAR) ))) strcpyW( t, s ); + return t; +} + +struct cache +{ + IAssemblyCache IAssemblyCache_iface; + LONG refs; +}; + +static inline struct cache *impl_from_IAssemblyCache(IAssemblyCache *iface) +{ + return CONTAINING_RECORD(iface, struct cache, IAssemblyCache_iface); +} + +static HRESULT WINAPI cache_QueryInterface( + IAssemblyCache *iface, + REFIID riid, + void **obj ) +{ + struct cache *cache = impl_from_IAssemblyCache(iface); + + TRACE("%p, %s, %p\n", cache, debugstr_guid(riid), obj); + + *obj = NULL; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAssemblyCache)) + { + IUnknown_AddRef( iface ); + *obj = cache; + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI cache_AddRef( IAssemblyCache *iface ) +{ + struct cache *cache = impl_from_IAssemblyCache(iface); + return InterlockedIncrement( &cache->refs ); +} + +static ULONG WINAPI cache_Release( IAssemblyCache *iface ) +{ + struct cache *cache = impl_from_IAssemblyCache(iface); + ULONG refs = InterlockedDecrement( &cache->refs ); + + if (!refs) + { + TRACE("destroying %p\n", cache); + HeapFree( GetProcessHeap(), 0, cache ); + } + return refs; +} + +static HRESULT WINAPI cache_UninstallAssembly( + IAssemblyCache *iface, + DWORD flags, + LPCWSTR name, + LPCFUSION_INSTALL_REFERENCE ref, + ULONG *disp ) +{ + FIXME("%p, 0x%08x, %s, %p, %p\n", iface, flags, debugstr_w(name), ref, disp); + return E_NOTIMPL; +} + +static HRESULT WINAPI cache_QueryAssemblyInfo( + IAssemblyCache *iface, + DWORD flags, + LPCWSTR name, + ASSEMBLY_INFO *info ) +{ + FIXME("%p, 0x%08x, %s, %p\n", iface, flags, debugstr_w(name), info); + return E_NOTIMPL; +} + +static HRESULT WINAPI cache_CreateAssemblyCacheItem( + IAssemblyCache *iface, + DWORD flags, + PVOID reserved, + IAssemblyCacheItem **item, + LPCWSTR name ) +{ + FIXME("%p, 0x%08x, %p, %p, %s\n", iface, flags, reserved, item, debugstr_w(name)); + return E_NOTIMPL; +} + +static HRESULT WINAPI cache_Reserved( + IAssemblyCache *iface, + IUnknown **reserved) +{ + FIXME("%p\n", reserved); + return E_NOTIMPL; +} + +static BSTR get_attribute_value( IXMLDOMNamedNodeMap *map, const WCHAR *value_name ) +{ + HRESULT hr; + IXMLDOMNode *attr; + VARIANT var; + BSTR str; + + str = SysAllocString( value_name ); + hr = IXMLDOMNamedNodeMap_getNamedItem( map, str, &attr ); + SysFreeString( str ); + if (hr != S_OK) return NULL; + + hr = IXMLDOMNode_get_nodeValue( attr, &var ); + IXMLDOMNode_Release( attr ); + if (hr != S_OK) return NULL; + if (V_VT(&var) != VT_BSTR) + { + VariantClear( &var ); + return NULL; + } + TRACE("%s=%s\n", debugstr_w(value_name), debugstr_w(V_BSTR( &var ))); + return V_BSTR( &var ); +} + +struct file +{ + struct list entry; + BSTR name; +}; + +struct assembly +{ + BSTR type; + BSTR name; + BSTR version; + BSTR arch; + BSTR token; + struct list files; +}; + +static void free_assembly( struct assembly *assembly ) +{ + struct list *item, *cursor; + + if (!assembly) return; + SysFreeString( assembly->type ); + SysFreeString( assembly->name ); + SysFreeString( assembly->version ); + SysFreeString( assembly->arch ); + SysFreeString( assembly->token ); + LIST_FOR_EACH_SAFE( item, cursor, &assembly->files ) + { + struct file *file = LIST_ENTRY( item, struct file, entry ); + list_remove( &file->entry ); + SysFreeString( file->name ); + HeapFree( GetProcessHeap(), 0, file ); + } + HeapFree( GetProcessHeap(), 0, assembly ); +} + +static HRESULT parse_files( IXMLDOMDocument *doc, struct assembly *assembly ) +{ + static const WCHAR fileW[] = {'f','i','l','e',0}; + static const WCHAR nameW[] = {'n','a','m','e',0}; + IXMLDOMNamedNodeMap *attrs; + IXMLDOMNodeList *list; + IXMLDOMNode *node; + struct file *f; + BSTR str; + HRESULT hr; + LONG len; + + str = SysAllocString( fileW ); + hr = IXMLDOMDocument_getElementsByTagName( doc, str, &list ); + SysFreeString( str ); + if (hr != S_OK) return hr; + + hr = IXMLDOMNodeList_get_length( list, &len ); + if (hr != S_OK) goto done; + TRACE("found %d files\n", len); + if (!len) + { + hr = ERROR_SXS_MANIFEST_FORMAT_ERROR; + goto done; + } + + for (;;) + { + hr = IXMLDOMNodeList_nextNode( list, &node ); + if (hr != S_OK || !node) + { + hr = S_OK; + break; + } + + /* FIXME: validate node type */ + + hr = IXMLDOMNode_get_attributes( node, &attrs ); + IXMLDOMNode_Release( node ); + if (hr != S_OK) + goto done; + + if (!(f = HeapAlloc( GetProcessHeap(), 0, sizeof(struct file) ))) + { + IXMLDOMNamedNodeMap_Release( attrs ); + hr = E_OUTOFMEMORY; + goto done; + } + + f->name = get_attribute_value( attrs, nameW ); + IXMLDOMNamedNodeMap_Release( attrs ); + if (!f->name) + { + HeapFree( GetProcessHeap(), 0, f ); + hr = ERROR_SXS_MANIFEST_FORMAT_ERROR; + goto done; + } + list_add_tail( &assembly->files, &f->entry ); + } + + if (list_empty( &assembly->files )) + { + WARN("no files found\n"); + hr = ERROR_SXS_MANIFEST_FORMAT_ERROR; + } + +done: + IXMLDOMNodeList_Release( list ); + return hr; +} + +static HRESULT parse_assembly( IXMLDOMDocument *doc, struct assembly **assembly ) +{ + static const WCHAR identityW[] = {'a','s','s','e','m','b','l','y','I','d','e','n','t','i','t','y',0}; + static const WCHAR typeW[] = {'t','y','p','e',0}; + static const WCHAR nameW[] = {'n','a','m','e',0}; + static const WCHAR versionW[] = {'v','e','r','s','i','o','n',0}; + static const WCHAR architectureW[] = {'p','r','o','c','e','s','s','o','r','A','r','c','h','i','t','e','c','t','u','r','e',0}; + static const WCHAR tokenW[] = {'p','u','b','l','i','c','K','e','y','T','o','k','e','n',0}; + static const WCHAR win32W[] = {'w','i','n','3','2',0}; + static const WCHAR policyW[] = {'w','i','n','3','2','-','p','o','l','i','c','y',0}; + IXMLDOMNodeList *list = NULL; + IXMLDOMNode *node = NULL; + IXMLDOMNamedNodeMap *attrs = NULL; + struct assembly *a = NULL; + BSTR str; + HRESULT hr; + LONG len; + + str = SysAllocString( identityW ); + hr = IXMLDOMDocument_getElementsByTagName( doc, str, &list ); + SysFreeString( str ); + if (hr != S_OK) goto done; + + hr = IXMLDOMNodeList_get_length( list, &len ); + if (hr != S_OK) goto done; + if (!len) + { + hr = ERROR_SXS_MANIFEST_FORMAT_ERROR; + goto done; + } + hr = IXMLDOMNodeList_nextNode( list, &node ); + if (hr != S_OK) goto done; + if (!node) + { + hr = ERROR_SXS_MANIFEST_FORMAT_ERROR; + goto done; + } + if (!(a = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct assembly) ))) + { + hr = E_OUTOFMEMORY; + goto done; + } + list_init( &a->files ); + + hr = IXMLDOMNode_get_attributes( node, &attrs ); + if (hr != S_OK) goto done; + + a->type = get_attribute_value( attrs, typeW ); + a->name = get_attribute_value( attrs, nameW ); + a->version = get_attribute_value( attrs, versionW ); + a->arch = get_attribute_value( attrs, architectureW ); + a->token = get_attribute_value( attrs, tokenW ); + + if (!a->type || (strcmpW( a->type, win32W ) && strcmpW( a->type, policyW )) || + !a->name || !a->version || !a->arch || !a->token) + { + WARN("invalid win32 assembly\n"); + hr = ERROR_SXS_MANIFEST_FORMAT_ERROR; + goto done; + } + if (!strcmpW( a->type, win32W )) hr = parse_files( doc, a ); + +done: + if (attrs) IXMLDOMNamedNodeMap_Release( attrs ); + if (node) IXMLDOMNode_Release( node ); + if (list) IXMLDOMNodeList_Release( list ); + if (hr == S_OK) *assembly = a; + else free_assembly( a ); + return hr; +} + +static WCHAR *build_sxs_path( void ) +{ + static const WCHAR winsxsW[] = {'\\','w','i','n','s','x','s','\\',0}; + WCHAR sxsdir[MAX_PATH]; + + GetWindowsDirectoryW( sxsdir, MAX_PATH ); + strcatW( sxsdir, winsxsW ); + return strdupW( sxsdir ); +} + +static WCHAR *build_assembly_name( struct assembly *assembly ) +{ + static const WCHAR fmtW[] = + {'%','s','_','%','s','_','%','s','_','%','s','_','n','o','n','e','_','d','e','a','d','b','e','e','f',0}; + WCHAR *ret, *p; + int len; + + len = strlenW( fmtW ); + len += strlenW( assembly->arch ); + len += strlenW( assembly->name ); + len += strlenW( assembly->token ); + len += strlenW( assembly->version ); + + if (!(ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return NULL; + sprintfW( ret, fmtW, assembly->arch, assembly->name, assembly->token, assembly->version ); + for (p = ret; *p; p++) *p = tolowerW( *p ); + return ret; +} + +static WCHAR *build_policy_name( struct assembly *assembly ) +{ + static const WCHAR fmtW[] = + {'%','s','_','%','s','_','%','s','_','n','o','n','e','_','d','e','a','d','b','e','e','f',0}; + WCHAR *ret, *p; + int len; + + len = strlenW( fmtW ); + len += strlenW( assembly->arch ); + len += strlenW( assembly->name ); + len += strlenW( assembly->token ); + + if (!(ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ))) return NULL; + sprintfW( ret, fmtW, assembly->arch, assembly->name, assembly->token ); + for (p = ret; *p; p++) *p = tolowerW( *p ); + return ret; +} + +static HRESULT install_policy( const WCHAR *manifest, struct assembly *assembly ) +{ + static const WCHAR policiesW[] = {'p','o','l','i','c','i','e','s','\\',0}; + static const WCHAR suffixW[] = {'.','p','o','l','i','c','y',0}; + static const WCHAR backslashW[] = {'\\',0}; + WCHAR *sxsdir, *name, *dst; + HRESULT hr = E_OUTOFMEMORY; + BOOL ret; + int len; + + /* FIXME: handle catalog file */ + + if (!(sxsdir = build_sxs_path())) return E_OUTOFMEMORY; + if (!(name = build_policy_name( assembly ))) goto done; + + len = strlenW( sxsdir ); + len += strlenW( policiesW ); + len += strlenW( name ) + 1; + len += strlenW( assembly->version ); + len += strlenW( suffixW ); + + if (!(dst = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) ))) goto done; + strcpyW( dst, sxsdir ); + strcatW( dst, policiesW ); + CreateDirectoryW( dst, NULL ); + strcatW( dst, name ); + CreateDirectoryW( dst, NULL ); + strcatW( dst, backslashW ); + strcatW( dst, assembly->version ); + strcatW( dst, suffixW ); + + ret = CopyFileW( manifest, dst, FALSE ); + HeapFree( GetProcessHeap(), 0, dst ); + if (!ret) + { + hr = HRESULT_FROM_WIN32( GetLastError() ); + WARN("failed to copy policy manifest file 0x%08x\n", hr); + } + hr = S_OK; + +done: + HeapFree( GetProcessHeap(), 0, sxsdir ); + HeapFree( GetProcessHeap(), 0, name ); + return hr; +} + +static WCHAR *build_source_filename( const WCHAR *manifest, struct file *file ) +{ + WCHAR *src; + const WCHAR *p; + int len; + + p = strrchrW( manifest, '\\' ); + if (!p) p = strrchrW( manifest, '/' ); + if (!p) return strdupW( manifest ); + + len = p - manifest + 1; + if (!(src = HeapAlloc( GetProcessHeap(), 0, (len + strlenW( file->name ) + 1) * sizeof(WCHAR) ))) + return NULL; + + memcpy( src, manifest, len * sizeof(WCHAR) ); + strcpyW( src + len, file->name ); + return src; +} + +static HRESULT install_assembly( const WCHAR *manifest, struct assembly *assembly ) +{ + static const WCHAR manifestsW[] = {'m','a','n','i','f','e','s','t','s','\\',0}; + static const WCHAR suffixW[] = {'.','m','a','n','i','f','e','s','t',0}; + static const WCHAR backslashW[] = {'\\',0}; + WCHAR *sxsdir, *p, *name, *dst, *src; + struct file *file; + HRESULT hr = E_OUTOFMEMORY; + BOOL ret; + int len; + + if (!(sxsdir = build_sxs_path())) return E_OUTOFMEMORY; + if (!(name = build_assembly_name( assembly ))) goto done; + + len = strlenW( sxsdir ); + len += strlenW( manifestsW ); + len += strlenW( name ); + len += strlenW( suffixW ); + if (!(dst = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) ))) goto done; + strcpyW( dst, sxsdir ); + strcatW( dst, manifestsW ); + strcatW( dst, name ); + strcatW( dst, suffixW ); + + ret = CopyFileW( manifest, dst, FALSE ); + HeapFree( GetProcessHeap(), 0, dst ); + if (!ret) + { + hr = HRESULT_FROM_WIN32( GetLastError() ); + WARN("failed to copy manifest file 0x%08x\n", hr); + goto done; + } + + /* FIXME: this should be a transaction */ + LIST_FOR_EACH_ENTRY( file, &assembly->files, struct file, entry ) + { + if (!(src = build_source_filename( manifest, file ))) + { + hr = E_OUTOFMEMORY; + goto done; + } + len = strlenW( sxsdir ) + strlenW( name ) + strlenW( file->name ); + if (!(dst = HeapAlloc( GetProcessHeap(), 0, (len + 2) * sizeof(WCHAR) ))) + { + HeapFree( GetProcessHeap(), 0, src ); + hr = E_OUTOFMEMORY; + goto done; + } + strcpyW( dst, sxsdir ); + strcatW( dst, name ); + CreateDirectoryW( dst, NULL ); + + strcatW( dst, backslashW ); + strcatW( dst, file->name ); + for (p = dst; *p; p++) *p = tolowerW( *p ); + + ret = CopyFileW( src, dst, FALSE ); + HeapFree( GetProcessHeap(), 0, src ); + HeapFree( GetProcessHeap(), 0, dst ); + if (!ret) + { + hr = HRESULT_FROM_WIN32( GetLastError() ); + WARN("failed to copy file 0x%08x\n", hr); + goto done; + } + } + hr = S_OK; + +done: + HeapFree( GetProcessHeap(), 0, sxsdir ); + HeapFree( GetProcessHeap(), 0, name ); + return hr; +} + +static HRESULT WINAPI cache_InstallAssembly( + IAssemblyCache *iface, + DWORD flags, + LPCWSTR path, + LPCFUSION_INSTALL_REFERENCE ref ) +{ + static const WCHAR policyW[] = {'w','i','n','3','2','-','p','o','l','i','c','y',0}; + HRESULT hr, init; + IXMLDOMDocument *doc = NULL; + struct assembly *assembly = NULL; + BSTR str; + VARIANT var; + VARIANT_BOOL b; + + TRACE("%p, 0x%08x, %s, %p\n", iface, flags, debugstr_w(path), ref); + + init = CoInitialize( NULL ); + + hr = CoCreateInstance( &CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER, &IID_IXMLDOMDocument, (void **)&doc ); + if (hr != S_OK) + goto done; + + str = SysAllocString( path ); + VariantInit( &var ); + V_VT( &var ) = VT_BSTR; + V_BSTR( &var ) = str; + hr = IXMLDOMDocument_load( doc, var, &b ); + SysFreeString( str ); + if (hr != S_OK) goto done; + if (!b) + { + WARN("failed to load manifest\n"); + hr = S_FALSE; + goto done; + } + + hr = parse_assembly( doc, &assembly ); + if (hr != S_OK) + goto done; + + /* FIXME: verify name attributes */ + + if (!strcmpW( assembly->type, policyW )) + hr = install_policy( path, assembly ); + else + hr = install_assembly( path, assembly ); + +done: + free_assembly( assembly ); + if (doc) IXMLDOMDocument_Release( doc ); + + if (SUCCEEDED(init)) + CoUninitialize(); + + return hr; +} + +static const IAssemblyCacheVtbl cache_vtbl = +{ + cache_QueryInterface, + cache_AddRef, + cache_Release, + cache_UninstallAssembly, + cache_QueryAssemblyInfo, + cache_CreateAssemblyCacheItem, + cache_Reserved, + cache_InstallAssembly +}; + +/****************************************************************** + * CreateAssemblyCache (SXS.@) + */ +HRESULT WINAPI CreateAssemblyCache( IAssemblyCache **obj, DWORD reserved ) +{ + struct cache *cache; + + TRACE("%p, %u\n", obj, reserved); + + if (!obj) + return E_INVALIDARG; + + *obj = NULL; + + cache = HeapAlloc( GetProcessHeap(), 0, sizeof(struct cache) ); + if (!cache) + return E_OUTOFMEMORY; + + cache->IAssemblyCache_iface.lpVtbl = &cache_vtbl; + cache->refs = 1; + + *obj = &cache->IAssemblyCache_iface; + return S_OK; +} diff --git a/reactos/dll/win32/sxs/msvchelper.h b/reactos/dll/win32/sxs/msvchelper.h new file mode 100644 index 00000000000..1e4f5ceb4cf --- /dev/null +++ b/reactos/dll/win32/sxs/msvchelper.h @@ -0,0 +1,2 @@ +#include +const CLSID CLSID_DOMDocument2 = {0xf6d90f11, 0x9c73, 0x11d3, {0xb3, 0x2e, 0x00,0xc0, 0x4f, 0x99, 0x0b, 0xb4}}; diff --git a/reactos/dll/win32/sxs/sxs.c b/reactos/dll/win32/sxs/sxs.c index 76c2f85d0d4..06e6672dbf7 100644 --- a/reactos/dll/win32/sxs/sxs.c +++ b/reactos/dll/win32/sxs/sxs.c @@ -22,9 +22,7 @@ #include "windef.h" #include "winbase.h" -#include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(sxs); /*********************************************************************** * DllMain (SXS.@) @@ -42,9 +40,3 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) } return TRUE; } - -HRESULT WINAPI CreateAssemblyCache(DWORD unimplemented, DWORD dwReserved) -{ - FIXME("%u %u stub\n", unimplemented, dwReserved); - return E_NOTIMPL; -} diff --git a/reactos/dll/win32/sxs/sxs.rbuild b/reactos/dll/win32/sxs/sxs.rbuild index 3e0c4b715ac..9a4b30e7b56 100644 --- a/reactos/dll/win32/sxs/sxs.rbuild +++ b/reactos/dll/win32/sxs/sxs.rbuild @@ -5,7 +5,10 @@ . include/reactos/wine + cache.c sxs.c + oleaut32 + ole32 wine ntdll diff --git a/reactos/dll/win32/sxs/sxs.spec b/reactos/dll/win32/sxs/sxs.spec index cd32a2e9ddb..e199bb139a0 100644 --- a/reactos/dll/win32/sxs/sxs.spec +++ b/reactos/dll/win32/sxs/sxs.spec @@ -1,2 +1,2 @@ -@ stdcall CreateAssemblyCache(long long) +@ stdcall CreateAssemblyCache(ptr long) @ stub CreateAssemblyNameObject diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index debf51422cb..13276b2d4cf 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -161,7 +161,7 @@ reactos/dll/win32/spoolss # Autosync reactos/dll/win32/stdole2.tlb # Synced to Wine-1.3.37 reactos/dll/win32/stdole32.tlb # Synced to Wine-1.3.37 reactos/dll/win32/sti # Autosync -reactos/dll/win32/sxs # Autosync +reactos/dll/win32/sxs # Synced to Wine-1.3.37 reactos/dll/win32/tapi32 # Autosync reactos/dll/win32/traffic # Autosync reactos/dll/win32/twain_32 # Out of sync From 524f08e959c8123cee0a5c8d990e365fb3bb7d27 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 6 Feb 2012 18:57:18 +0000 Subject: [PATCH 244/289] [SMSS2]: Implement SmpTranslateSystemPartitionInformation which sets a few last registry keys as part of the initialization process. [SMSS2]: Implement SmpLoadSubsystemsForMuSession which correctly creates a session, loads win32k.sys inside of it, and then detaches from the session. Winlogon.exe is set as the initial command (but not launched), and CSRSS is fake-started. [CSRSRV]: No longer start win32k.sys, that's not your job. [SMSS2]: Kill most debug prints that aren't errors. svn path=/trunk/; revision=55467 --- reactos/base/system/smss2/sminit.c | 204 ++++++++++++++++--- reactos/base/system/smss2/smss.c | 2 +- reactos/base/system/smss2/smss.h | 21 +- reactos/base/system/smss2/smsubsys.c | 169 ++++++++++++++- reactos/subsystems/win32/csrss/csrsrv/init.c | 4 +- 5 files changed, 367 insertions(+), 33 deletions(-) diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index c07bfc936a2..d05a84ce3de 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -14,14 +14,6 @@ /* GLOBALS ********************************************************************/ -typedef struct _SMP_REGISTRY_VALUE -{ - LIST_ENTRY Entry; - UNICODE_STRING Name; - UNICODE_STRING Value; - PCHAR AnsiValue; -} SMP_REGISTRY_VALUE, *PSMP_REGISTRY_VALUE; - UNICODE_STRING SmpSubsystemName, PosixName, Os2Name; LIST_ENTRY SmpBootExecuteList, SmpSetupExecuteList, SmpPagingFileList; LIST_ENTRY SmpDosDevicesList, SmpFileRenameList, SmpKnownDllsList; @@ -244,7 +236,7 @@ SmpConfigureProtectionMode(IN PWSTR ValueName, /* Recreate the security descriptors to take into account security mode */ SmpCreateSecurityDescriptors(FALSE); - DPRINT1("SmpProtectionMode: %d\n", SmpProtectionMode); + DPRINT("SmpProtectionMode: %d\n", SmpProtectionMode); return STATUS_SUCCESS; } @@ -269,7 +261,7 @@ SmpConfigureAllowProtectedRenames(IN PWSTR ValueName, SmpAllowProtectedRenames = 0; } - DPRINT1("SmpAllowProtectedRenames: %d\n", SmpAllowProtectedRenames); + DPRINT("SmpAllowProtectedRenames: %d\n", SmpAllowProtectedRenames); return STATUS_SUCCESS; } @@ -315,7 +307,7 @@ SmpConfigureObjectDirectories(IN PWSTR ValueName, OBJ_PERMANENT, NULL, SecDescriptor); - DPRINT1("Creating: %wZ directory\n", &SearchString); + DPRINT("Creating: %wZ directory\n", &SearchString); Status = NtCreateDirectoryObject(&DirHandle, DIRECTORY_ALL_ACCESS, &ObjectAttributes); @@ -403,7 +395,7 @@ SmpConfigureExcludeKnownDlls(IN PWSTR ValueName, while (*DllName) { /* Add this to the linked list */ - DPRINT1("Excluded DLL: %S\n", DllName); + DPRINT("Excluded DLL: %S\n", DllName); Status = SmpSaveRegistryValue(EntryContext, DllName, NULL, TRUE); /* Bail out on failure or if only one DLL name was present */ @@ -478,7 +470,7 @@ SmpConfigureKnownDlls(IN PWSTR ValueName, } /* This is the directory, initialize it */ - DPRINT1("KnownDll Path: %S\n", ValueData); + DPRINT("KnownDll Path: %S\n", ValueData); return SmpInitializeKnownDllPath(&SmpKnownDllPath, ValueData, ValueLength); } @@ -497,7 +489,7 @@ SmpConfigureEnvironment(IN PWSTR ValueName, /* Convert the strings into UNICODE_STRING and set the variable defined */ RtlInitUnicodeString(&ValueString, ValueName); RtlInitUnicodeString(&DataString, ValueData); - DPRINT1("Setting %wZ = %wZ\n", &ValueString, &DataString); + DPRINT("Setting %wZ = %wZ\n", &ValueString, &DataString); Status = RtlSetEnvironmentVariable(0, &ValueString, &DataString); if (!NT_SUCCESS(Status)) { @@ -545,7 +537,7 @@ SmpConfigureSubSystems(IN PWSTR ValueName, (ValueType != REG_DWORD)) { /* It isn't, must be a subsystem entry, add it to the list */ - DPRINT1("Subsystem entry: %S-%S\n", ValueName, ValueData); + DPRINT("Subsystem entry: %S-%S\n", ValueName, ValueData); return SmpSaveRegistryValue(EntryContext, ValueName, ValueData, TRUE); } @@ -562,7 +554,7 @@ SmpConfigureSubSystems(IN PWSTR ValueName, while (*SubsystemName) { /* We should have already put it into the list when we found it */ - DPRINT1("Found subsystem: %S\n", SubsystemName); + DPRINT("Found subsystem: %S\n", SubsystemName); RegEntry = SmpFindRegistryValue(EntryContext, SubsystemName); if (!RegEntry) { @@ -578,13 +570,13 @@ SmpConfigureSubSystems(IN PWSTR ValueName, if (_wcsicmp(ValueName, L"Required")) { /* Put it into the optional list */ - DPRINT1("Optional\n"); + DPRINT("Optional\n"); InsertTailList(&SmpSubSystemsToDefer, &RegEntry->Entry); } else { /* Put it into the required list */ - DPRINT1("Required\n"); + DPRINT("Required\n"); InsertTailList(&SmpSubSystemsToLoad, &RegEntry->Entry); } } @@ -796,6 +788,161 @@ SmpRegistryConfigurationTable[] = /* FUNCTIONS ******************************************************************/ +VOID +NTAPI +SmpTranslateSystemPartitionInformation(VOID) +{ + NTSTATUS Status; + UNICODE_STRING UnicodeString, LinkTarget, SearchString, SystemPartition; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE KeyHandle, LinkHandle; + CHAR ValueBuffer[512 + sizeof(KEY_VALUE_PARTIAL_INFORMATION)]; + PKEY_VALUE_PARTIAL_INFORMATION PartialInfo = (PVOID)ValueBuffer; + ULONG Length, Context; + CHAR DirInfoBuffer[512 + sizeof(OBJECT_DIRECTORY_INFORMATION)]; + POBJECT_DIRECTORY_INFORMATION DirInfo = (PVOID)DirInfoBuffer; + WCHAR LinkBuffer[MAX_PATH]; + + /* Open the setup key */ + RtlInitUnicodeString(&UnicodeString, L"\\Registry\\Machine\\System\\Setup"); + InitializeObjectAttributes(&ObjectAttributes, + &UnicodeString, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't open system setup key for reading: 0x%x\n", Status); + return; + } + + /* Query the system partition */ + RtlInitUnicodeString(&UnicodeString, L"SystemPartition"); + Status = NtQueryValueKey(KeyHandle, + &UnicodeString, + KeyValuePartialInformation, + PartialInfo, + sizeof(ValueBuffer), + &Length); + NtClose(KeyHandle); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't query SystemPartition value: 0x%x\n", Status); + return; + } + + /* Initialize the system partition string string */ + RtlInitUnicodeString(&SystemPartition, (PWCHAR)PartialInfo->Data); + + /* Enumerate the directory looking for the symbolic link string */ + RtlInitUnicodeString(&SearchString, L"SymbolicLink"); + RtlInitEmptyUnicodeString(&LinkTarget, LinkBuffer, sizeof(LinkBuffer)); + Status = NtQueryDirectoryObject(SmpDosDevicesObjectDirectory, + DirInfo, + sizeof(DirInfoBuffer), + TRUE, + TRUE, + &Context, + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't find drive letter for system partition\n"); + return; + } + + /* Keep searching until we find it */ + do + { + /* Is this it? */ + if ((RtlEqualUnicodeString(&DirInfo->TypeName, &SearchString, TRUE)) && + (DirInfo->Name.Length == 2 * sizeof(WCHAR)) && + (DirInfo->Name.Buffer[1] == L':')) + { + /* Looks like we found it, open the link to get its target */ + InitializeObjectAttributes(&ObjectAttributes, + &DirInfo->Name, + OBJ_CASE_INSENSITIVE, + SmpDosDevicesObjectDirectory, + NULL); + Status = NtOpenSymbolicLinkObject(&LinkHandle, + SYMBOLIC_LINK_ALL_ACCESS, + &ObjectAttributes); + if (NT_SUCCESS(Status)) + { + /* Open worked, query the target now */ + Status = NtQuerySymbolicLinkObject(LinkHandle, + &LinkTarget, + NULL); + NtClose(LinkHandle); + + /* Check if it matches the string we had found earlier */ + if ((NT_SUCCESS(Status)) && + ((RtlEqualUnicodeString(&SystemPartition, + &LinkTarget, + TRUE)) || + ((RtlPrefixUnicodeString(&SystemPartition, + &LinkTarget, + TRUE)) && + (LinkTarget.Buffer[SystemPartition.Length / sizeof(WCHAR)] == L'\\')))) + { + /* All done */ + break; + } + } + } + + /* Couldn't find it, try again */ + Status = NtQueryDirectoryObject(SmpDosDevicesObjectDirectory, + DirInfo, + sizeof(DirInfoBuffer), + TRUE, + FALSE, + &Context, + NULL); + } while (NT_SUCCESS(Status)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't find drive letter for system partition\n"); + return; + } + + /* Open the setup key again, for full access this time */ + RtlInitUnicodeString(&UnicodeString, + L"\\Registry\\Machine\\Software\\Microsoft\\Windows\\CurrentVersion\\Setup"); + InitializeObjectAttributes(&ObjectAttributes, + &UnicodeString, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = NtOpenKey(&KeyHandle, KEY_ALL_ACCESS, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: can't open software setup key for writing: 0x%x\n", + Status); + return; + } + + /* Wrap up the end of the link buffer */ + wcsncpy(LinkBuffer, DirInfo->Name.Buffer, 2); + LinkBuffer[2] = L'\\'; + LinkBuffer[3] = L'\0'; + + /* Now set this as the "BootDir" */ + RtlInitUnicodeString(&UnicodeString, L"BootDir"); + Status = NtSetValueKey(KeyHandle, + &UnicodeString, + 0, + REG_SZ, + LinkBuffer, + 4 * sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: couldn't write BootDir value: 0x%x\n", Status); + } + NtClose(KeyHandle); +} + NTSTATUS NTAPI SmpCreateSecurityDescriptors(IN BOOLEAN InitialCall) @@ -1151,7 +1298,7 @@ SmpInitializeDosDevices(VOID) } /* Create the symbolic link */ - DPRINT1("Creating symlink for %wZ to %wZ\n", &RegEntry->Name, &RegEntry->Value); + DPRINT("Creating symlink for %wZ to %wZ\n", &RegEntry->Name, &RegEntry->Value); Status = NtCreateSymbolicLinkObject(&DirHandle, SYMBOLIC_LINK_ALL_ACCESS, &ObjectAttributes, @@ -1357,7 +1504,7 @@ SmpInitializeKnownDllsInternal(IN PUNICODE_STRING Directory, { /* Get the entry and skip it if it's in the exluded list */ RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); - DPRINT1("Processing known DLL: %wZ-%wZ\n", &RegEntry->Name, &RegEntry->Value); + DPRINT("Processing known DLL: %wZ-%wZ\n", &RegEntry->Name, &RegEntry->Value); if ((SmpFindRegistryValue(&SmpExcludeKnownDllsList, RegEntry->Name.Buffer)) || (SmpFindRegistryValue(&SmpExcludeKnownDllsList, @@ -1388,6 +1535,8 @@ SmpInitializeKnownDllsInternal(IN PUNICODE_STRING Directory, &ImageCharacteristics); if (!NT_SUCCESS(Status)) { + DPRINT1("Hey ReactOS -- you suck! Please fix the checksum (or the API) behind: %wZ\n", &RegEntry->Value); + #if 0 /* Checksum failed, so don't even try going further -- kill SMSS */ RtlInitUnicodeString(&ErrorResponse, L"Verification of a KnownDLL failed."); @@ -1395,6 +1544,7 @@ SmpInitializeKnownDllsInternal(IN PUNICODE_STRING Directory, ErrorParameters[1] = Status; ErrorParameters[2] = (ULONG)&RegEntry->Value; SmpTerminate(ErrorParameters, 5, RTL_NUMBER_OF(ErrorParameters)); + #endif } else if (!(ImageCharacteristics & IMAGE_FILE_DLL)) { @@ -1559,7 +1709,7 @@ SmpCreateDynamicEnvironmentVariables(VOID) /* First let's write the OS variable */ RtlInitUnicodeString(&ValueName, L"OS"); - DPRINT1("Setting %wZ to %S\n", &ValueName, L"Windows_NT"); + DPRINT("Setting %wZ to %S\n", &ValueName, L"Windows_NT"); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1597,7 +1747,7 @@ SmpCreateDynamicEnvironmentVariables(VOID) } /* Set it */ - DPRINT1("Setting %wZ to %S\n", &ValueName, ArchName); + DPRINT("Setting %wZ to %S\n", &ValueName, ArchName); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1615,7 +1765,7 @@ SmpCreateDynamicEnvironmentVariables(VOID) /* And now let's write the processor level */ RtlInitUnicodeString(&ValueName, L"PROCESSOR_LEVEL"); swprintf(ValueBuffer, L"%u", ProcessorInfo.ProcessorLevel); - DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + DPRINT("Setting %wZ to %S\n", &ValueName, ValueBuffer); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1683,7 +1833,7 @@ SmpCreateDynamicEnvironmentVariables(VOID) /* So that we can set this as the PROCESSOR_IDENTIFIER variable */ RtlInitUnicodeString(&ValueName, L"PROCESSOR_IDENTIFIER"); - DPRINT1("Setting %wZ to %S\n", &ValueName, PartialInfo->Data); + DPRINT("Setting %wZ to %S\n", &ValueName, PartialInfo->Data); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1725,7 +1875,7 @@ SmpCreateDynamicEnvironmentVariables(VOID) } /* Write the revision to the registry */ - DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + DPRINT("Setting %wZ to %S\n", &ValueName, ValueBuffer); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1743,7 +1893,7 @@ SmpCreateDynamicEnvironmentVariables(VOID) /* And finally, write the number of CPUs */ RtlInitUnicodeString(&ValueName, L"NUMBER_OF_PROCESSORS"); swprintf(ValueBuffer, L"%u", BasicInfo.NumberOfProcessors); - DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + DPRINT("Setting %wZ to %S\n", &ValueName, ValueBuffer); Status = NtSetValueKey(KeyHandle, &ValueName, 0, @@ -1797,7 +1947,7 @@ SmpCreateDynamicEnvironmentVariables(VOID) } /* And write it in the environment! */ - DPRINT1("Setting %wZ to %S\n", &ValueName, ValueBuffer); + DPRINT("Setting %wZ to %S\n", &ValueName, ValueBuffer); Status = NtSetValueKey(KeyHandle, &ValueName, 0, diff --git a/reactos/base/system/smss2/smss.c b/reactos/base/system/smss2/smss.c index 5bc5b91a8a1..bfcd52f9418 100644 --- a/reactos/base/system/smss2/smss.c +++ b/reactos/base/system/smss2/smss.c @@ -627,7 +627,7 @@ _main(IN INT argc, Status = SmpInit(&InitialCommand, Handles); if (!NT_SUCCESS(Status)) { - DPRINT1("SMSS: SmpInit return failure - Status == %x\n"); + DPRINT1("SMSS: SmpInit return failure - Status == %x\n", Status); RtlInitUnicodeString(&DbgString, L"Session Manager Initialization"); Parameters[1] = Status; //_SEH2_LEAVE; Hack so that setup can work. will go away later diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index d2e9604a841..b5117356b5f 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -37,6 +37,16 @@ #define SMP_INVALID_PATH 0x10 #define SMP_DEFERRED_FLAG 0x20 +/* STRUCTURES *****************************************************************/ + +typedef struct _SMP_REGISTRY_VALUE +{ + LIST_ENTRY Entry; + UNICODE_STRING Name; + UNICODE_STRING Value; + PCHAR AnsiValue; +} SMP_REGISTRY_VALUE, *PSMP_REGISTRY_VALUE; + /* EXTERNALS ******************************************************************/ extern RTL_CRITICAL_SECTION SmpKnownSubSysLock; @@ -56,6 +66,11 @@ extern ULONG SmBaseTag; extern UNICODE_STRING SmpSystemRoot; extern PWCHAR SmpDefaultEnvironment; extern UNICODE_STRING SmpDefaultLibPath; +extern LIST_ENTRY SmpSetupExecuteList; +extern LIST_ENTRY SmpSubSystemsToLoad; +extern LIST_ENTRY SmpExecuteList; +extern LIST_ENTRY SmpSubSystemList; +extern ULONG AttachedSessionId; /* FUNCTIONS ******************************************************************/ @@ -187,4 +202,8 @@ SmpCheckForCrashDump( IN PUNICODE_STRING FileName ); - +VOID +NTAPI +SmpTranslateSystemPartitionInformation( + VOID + ); diff --git a/reactos/base/system/smss2/smsubsys.c b/reactos/base/system/smss2/smsubsys.c index 01c637434c5..16c407a5f6d 100644 --- a/reactos/base/system/smss2/smsubsys.c +++ b/reactos/base/system/smss2/smsubsys.c @@ -19,6 +19,7 @@ LIST_ENTRY SmpKnownSubSysHead; HANDLE SmpWindowsSubSysProcess; HANDLE SmpWindowsSubSysProcessId; BOOLEAN RegPosixSingleInstance; +WCHAR InitialCommandBuffer[256]; /* FUNCTIONS ******************************************************************/ @@ -31,7 +32,7 @@ SmpLoadSubSystem(IN PUNICODE_STRING FileName, OUT PHANDLE ProcessId) { DPRINT1("Should start subsystem %wZ for Session: %lx\n", FileName, MuSessionId); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } NTSTATUS @@ -40,7 +41,169 @@ SmpLoadSubSystemsForMuSession(IN PULONG MuSessionId, OUT PHANDLE ProcessId, IN PUNICODE_STRING InitialCommand) { - DPRINT1("Should start subsystems for Session: %lx\n", *MuSessionId); - return STATUS_SUCCESS; + NTSTATUS Status = STATUS_SUCCESS, Status2; + PSMP_REGISTRY_VALUE RegEntry; + UNICODE_STRING DestinationString, NtPath; + PLIST_ENTRY NextEntry; + LARGE_INTEGER Timeout; + PVOID State; + + /* Write a few last registry keys with the boot partition information */ + SmpTranslateSystemPartitionInformation(); + + /* Process "SetupExecute" values */ + NextEntry = SmpSetupExecuteList.Flink; + while (NextEntry != &SmpSetupExecuteList) + { + /* Execute each one and move on */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("SetupExecute entry: %wZ\n", &RegEntry->Name); + SmpExecuteCommand(&RegEntry->Name, 0, NULL, 0); + NextEntry = NextEntry->Flink; + } + + /* Now process the subsystems */ + NextEntry = SmpSubSystemList.Flink; + while (NextEntry != &SmpSubSystemList) + { + /* Get the entry and check if this is the special Win32k entry */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("Subsystem: %wZ\n", &RegEntry->Name); + if (!_wcsicmp(RegEntry->Name.Buffer, L"Kmode")) + { + /* Translate it */ + if (!RtlDosPathNameToNtPathName_U(RegEntry->Value.Buffer, + &NtPath, + NULL, + NULL)) + { + Status = STATUS_OBJECT_PATH_SYNTAX_BAD; + DPRINT1("Failed: %lx\n", Status); + } + else + { + /* Get the driver privilege */ + Status = SmpAcquirePrivilege(SE_LOAD_DRIVER_PRIVILEGE, &State); + if (NT_SUCCESS(Status)) + { + /* Create the new session */ + ASSERT(AttachedSessionId == -1); + Status = NtSetSystemInformation(SystemSessionCreate, + MuSessionId, + sizeof(*MuSessionId)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Session space creation failed\n"); + SmpReleasePrivilege(State); + RtlFreeHeap(RtlGetProcessHeap(), 0, NtPath.Buffer); + return Status; + } + AttachedSessionId = *MuSessionId; + + /* Start Win32k.sys on this session */ + DPRINT1("Starting win32k.sys...\n"); + RtlInitUnicodeString(&DestinationString, + L"\\SystemRoot\\System32\\win32k.sys"); + Status = NtSetSystemInformation(SystemExtendServiceTableInformation, + &DestinationString, + sizeof(DestinationString)); + RtlFreeHeap(RtlGetProcessHeap(), 0, NtPath.Buffer); + SmpReleasePrivilege(State); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Load of WIN32K failed.\n"); + return Status; + } + } + } + } + + /* Next entry */ + NextEntry = NextEntry->Flink; + } + + /* Now parse the required subsystem list */ + NextEntry = SmpSubSystemsToLoad.Flink; + while (NextEntry != &SmpSubSystemsToLoad) + { + /* Get each entry and check if it's the internal debug or not */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("Subsystem (required): %wZ\n", &RegEntry->Name); + if (_wcsicmp(RegEntry->Name.Buffer, L"debug")) + { + /* Load the required subsystem */ + Status = SmpExecuteCommand(&RegEntry->Value, + *MuSessionId, + ProcessId, + SMP_SUBSYSTEM_FLAG); + } + else + { + /* Load the internal debug system */ + Status = SmpExecuteCommand(&RegEntry->Value, + *MuSessionId, + ProcessId, + SMP_DEBUG_FLAG | SMP_SUBSYSTEM_FLAG); + } + if (!NT_SUCCESS(Status)) + { + DbgPrint("SMSS: Subsystem execute failed (%WZ)\n", &RegEntry->Value); + return Status; + } + + /* Move to the next entry */ + NextEntry = NextEntry->Flink; + } + + /* Process the "Execute" list now */ + NextEntry = SmpExecuteList.Blink; + if (NextEntry != &SmpExecuteList) + { + /* Get the custom initial command */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("Initial command found: %wZ\n", &RegEntry->Name); + + /* Write the initial command and wait for 5 seconds (why??!) */ + *InitialCommand = RegEntry->Name; + Timeout.QuadPart = -50000000; + NtDelayExecution(FALSE, &Timeout); + } + else + { + /* Use the default Winlogon initial command */ + RtlInitUnicodeString(InitialCommand, L"winlogon.exe"); + InitialCommandBuffer[0] = UNICODE_NULL; + DPRINT1("Initial command found: %wZ\n", InitialCommand); + + /* Check if there's a debugger for Winlogon */ + Status2 = LdrQueryImageFileExecutionOptions(InitialCommand, + L"Debugger", + REG_SZ, + InitialCommandBuffer, + sizeof(InitialCommandBuffer) - + InitialCommand->Length, + NULL); + if ((NT_SUCCESS(Status2)) && (InitialCommandBuffer[0])) + { + /* Put the debugger string with the Winlogon string */ + wcscat(InitialCommandBuffer, L" "); + wcscat(InitialCommandBuffer, InitialCommand->Buffer); + RtlInitUnicodeString(InitialCommand, InitialCommandBuffer); + } + } + + /* Finally check if there was a custom initial command */ + NextEntry = SmpExecuteList.Flink; + while (NextEntry != &SmpExecuteList) + { + /* Execute each one */ + RegEntry = CONTAINING_RECORD(NextEntry, SMP_REGISTRY_VALUE, Entry); + DPRINT1("Initial command (custom): %wZ\n", &RegEntry->Name); + SmpExecuteCommand(&RegEntry->Name, *MuSessionId, NULL, 0); + NextEntry = NextEntry->Flink; + } + + /* Return status */ + return Status; } diff --git a/reactos/subsystems/win32/csrss/csrsrv/init.c b/reactos/subsystems/win32/csrss/csrsrv/init.c index e0b1a99c094..fde310f4f25 100644 --- a/reactos/subsystems/win32/csrss/csrsrv/init.c +++ b/reactos/subsystems/win32/csrss/csrsrv/init.c @@ -598,6 +598,7 @@ CsrpRegisterSubsystem (int argc, char ** argv, char ** envp) return Status; } +#if 0 /********************************************************************** * CsrpLoadKernelModeDriver/3 */ @@ -641,6 +642,7 @@ CsrpLoadKernelModeDriver (int argc, char ** argv, char ** envp) } return Status; } +#endif /********************************************************************** * CsrpCreateApiPort/2 @@ -753,7 +755,7 @@ struct { {TRUE, CsrpCreateApiPort, "create the api port \\Windows\\ApiPort"}, {TRUE, CsrpCreateHardErrorPort, "create the hard error port"}, {TRUE, CsrpCreateObjectDirectory,"create the object directory \\Windows"}, - {TRUE, CsrpLoadKernelModeDriver, "load Kmode driver"}, +// {TRUE, CsrpLoadKernelModeDriver, "load Kmode driver"}, {TRUE, CsrpInitVideo, "initialize video"}, {TRUE, CsrpApiRegisterDef, "initialize api definitions"}, {TRUE, CsrpCCTS, "connect client to server"}, From 56152bb4a9fc40af86070eebb7c0fd8d910b875a Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Mon, 6 Feb 2012 19:37:19 +0000 Subject: [PATCH 245/289] [SMSS2]: I hate you, rbuild. svn path=/trunk/; revision=55468 --- reactos/base/system/smss2/smss.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index b5117356b5f..66d8fb43cbc 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -7,6 +7,9 @@ */ /* DEPENDENCIES ***************************************************************/ +#pragma once +#ifndef _SM_ +#define _SM_ // // Native Headers @@ -206,4 +209,5 @@ VOID NTAPI SmpTranslateSystemPartitionInformation( VOID - ); +); +#endif From 5d71814fc47f4c626c2d13a1327fa0333d93ee9b Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 6 Feb 2012 20:43:28 +0000 Subject: [PATCH 246/289] [MSI] * Properly sync to Wine 1.3.37. This partially reverts r55046. svn path=/trunk/; revision=55469 --- reactos/dll/win32/msi/action.c | 71 +- reactos/dll/win32/msi/automation.c | 775 +++++---- reactos/dll/win32/msi/cond.tab.h | 108 -- reactos/dll/win32/msi/cond.y | 10 +- reactos/dll/win32/msi/install.c | 33 +- reactos/dll/win32/msi/msi.c | 107 +- reactos/dll/win32/msi/msi.rgs | 101 ++ reactos/dll/win32/msi/msipriv.h | 2 +- reactos/dll/win32/msi/msiserver.h | 2411 ---------------------------- reactos/media/doc/README.WINE | 2 +- 10 files changed, 551 insertions(+), 3069 deletions(-) delete mode 100644 reactos/dll/win32/msi/cond.tab.h delete mode 100644 reactos/dll/win32/msi/msiserver.h diff --git a/reactos/dll/win32/msi/action.c b/reactos/dll/win32/msi/action.c index 16ac4f0e268..5444dfc05af 100644 --- a/reactos/dll/win32/msi/action.c +++ b/reactos/dll/win32/msi/action.c @@ -2214,15 +2214,11 @@ static UINT calculate_file_cost( MSIPACKAGE *package ) return ERROR_SUCCESS; } -WCHAR *msi_normalize_path( const WCHAR *in ) +void msi_clean_path( WCHAR *p ) { - const WCHAR *p = in; - WCHAR *q, *ret; - int n, len = strlenW( in ) + 2; + WCHAR *q = p; + int n, len = 0; - if (!(q = ret = msi_alloc( len * sizeof(WCHAR) ))) return NULL; - - len = 0; while (1) { /* copy until the end of the string or a space */ @@ -2249,20 +2245,32 @@ WCHAR *msi_normalize_path( const WCHAR *in ) else /* copy n spaces */ while (n && (*q++ = *p++)) n--; } - while (q - ret > 0 && q[-1] == ' ') q--; - if (q - ret > 0 && q[-1] != '\\') +} + +static WCHAR *get_target_dir_property( MSIDATABASE *db ) +{ + int len; + WCHAR *path, *target_dir = msi_dup_property( db, szTargetDir ); + + if (!target_dir) return NULL; + + len = strlenW( target_dir ); + if (target_dir[len - 1] == '\\') return target_dir; + if ((path = msi_alloc( (len + 2) * sizeof(WCHAR) ))) { - q[0] = '\\'; - q[1] = 0; + strcpyW( path, target_dir ); + path[len] = '\\'; + path[len + 1] = 0; } - return ret; + msi_free( target_dir ); + return path; } void msi_resolve_target_folder( MSIPACKAGE *package, const WCHAR *name, BOOL load_prop ) { FolderList *fl; MSIFOLDER *folder, *parent, *child; - WCHAR *path, *normalized_path; + WCHAR *path; TRACE("resolving %s\n", debugstr_w(name)); @@ -2270,7 +2278,7 @@ void msi_resolve_target_folder( MSIPACKAGE *package, const WCHAR *name, BOOL loa if (!strcmpW( folder->Directory, szTargetDir )) /* special resolving for target root dir */ { - if (!load_prop || !(path = msi_dup_property( package->db, szTargetDir ))) + if (!load_prop || !(path = get_target_dir_property( package->db ))) { path = msi_dup_property( package->db, szRootDrive ); } @@ -2285,17 +2293,16 @@ void msi_resolve_target_folder( MSIPACKAGE *package, const WCHAR *name, BOOL loa else path = msi_build_directory_name( 2, folder->TargetDefault, NULL ); } - normalized_path = msi_normalize_path( path ); - msi_free( path ); - if (folder->ResolvedTarget && !strcmpiW( normalized_path, folder->ResolvedTarget )) + msi_clean_path( path ); + if (folder->ResolvedTarget && !strcmpiW( path, folder->ResolvedTarget )) { TRACE("%s already resolved to %s\n", debugstr_w(name), debugstr_w(folder->ResolvedTarget)); - msi_free( normalized_path ); + msi_free( path ); return; } - msi_set_property( package->db, folder->Directory, normalized_path ); + msi_set_property( package->db, folder->Directory, path ); msi_free( folder->ResolvedTarget ); - folder->ResolvedTarget = normalized_path; + folder->ResolvedTarget = path; LIST_FOR_EACH_ENTRY( fl, &folder->children, FolderList, entry ) { @@ -3601,9 +3608,25 @@ static UINT ITERATE_CreateShortcuts(MSIRECORD *row, LPVOID param) target = MSI_RecordGetString(row, 5); if (strchrW(target, '[')) { - deformat_string( package, target, &path ); + int len; + WCHAR *format_string, *p; + + if (!(p = strchrW( target, ']' ))) goto err; + len = p - target + 1; + format_string = msi_alloc( (len + 1) * sizeof(WCHAR) ); + memcpy( format_string, target, len * sizeof(WCHAR) ); + format_string[len] = 0; + deformat_string( package, format_string, &deformated ); + msi_free( format_string ); + + path = msi_alloc( (strlenW( deformated ) + strlenW( p + 1 ) + 2) * sizeof(WCHAR) ); + strcpyW( path, deformated ); + PathAddBackslashW( path ); + strcatW( path, p + 1 ); TRACE("target path is %s\n", debugstr_w(path)); + IShellLinkW_SetPath( sl, path ); + msi_free( deformated ); msi_free( path ); } else @@ -4456,7 +4479,7 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param) MSIFILE *file; MSIRECORD *uirow; - filename = MSI_RecordGetString( row, 1 ); + filename = MSI_RecordGetString(row,1); file = msi_get_loaded_file( package, filename ); if (!file) { @@ -4474,7 +4497,7 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param) register_dll( file->TargetPath, FALSE ); uirow = MSI_CreateRecord( 2 ); - MSI_RecordSetStringW( uirow, 1, file->File ); + MSI_RecordSetStringW( uirow, 1, filename ); MSI_RecordSetStringW( uirow, 2, file->Component->Directory ); msi_ui_actiondata( package, szSelfRegModules, uirow ); msiobj_release( &uirow->hdr ); @@ -4524,7 +4547,7 @@ static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param ) register_dll( file->TargetPath, TRUE ); uirow = MSI_CreateRecord( 2 ); - MSI_RecordSetStringW( uirow, 1, file->File ); + MSI_RecordSetStringW( uirow, 1, filename ); MSI_RecordSetStringW( uirow, 2, file->Component->Directory ); msi_ui_actiondata( package, szSelfUnregModules, uirow ); msiobj_release( &uirow->hdr ); diff --git a/reactos/dll/win32/msi/automation.c b/reactos/dll/win32/msi/automation.c index f1a353207e7..d62c989e530 100644 --- a/reactos/dll/win32/msi/automation.c +++ b/reactos/dll/win32/msi/automation.c @@ -44,20 +44,19 @@ WINE_DEFAULT_DEBUG_CHANNEL(msi); /* * AutomationObject - "base" class for all automation objects. For each interface, we implement Invoke function - * called from AutomationObject::Invoke. + * called from AutomationObject::Invoke, and pass this function to create_automation_object. */ typedef struct AutomationObject AutomationObject; -typedef HRESULT (*autoInvokeFunc)(AutomationObject* This, - DISPID dispIdMember, REFIID riid, LCID lcid, WORD flags, DISPPARAMS* pDispParams, - VARIANT* result, EXCEPINFO* ei, UINT* arg_err); - -typedef void (*autoFreeFunc)(AutomationObject* This); - struct AutomationObject { - IDispatch IDispatch_iface; - IProvideMultipleClassInfo IProvideMultipleClassInfo_iface; + /* + * VTables - We provide IDispatch, IProvideClassInfo, IProvideClassInfo2, IProvideMultipleClassInfo + */ + const IDispatchVtbl *lpVtbl; + const IProvideMultipleClassInfoVtbl *lpvtblIProvideMultipleClassInfo; + + /* Object reference count */ LONG ref; /* Clsid for this class and it's appropriate ITypeInfo object */ @@ -68,62 +67,68 @@ struct AutomationObject { MSIHANDLE msiHandle; /* A function that is called from AutomationObject::Invoke, specific to this type of object. */ - autoInvokeFunc funcInvoke; + HRESULT (*funcInvoke)( + AutomationObject* This, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS* pDispParams, + VARIANT* pVarResult, + EXCEPINFO* pExcepInfo, + UINT* puArgErr); + /* A function that is called from AutomationObject::Release when the object is being freed to free any private * data structures (or NULL) */ - autoFreeFunc funcFree; + void (*funcFree)(AutomationObject* This); }; -typedef struct { - AutomationObject autoobj; - int count; - VARIANT *data; -} ListObject; +/* + * ListEnumerator - IEnumVARIANT implementation for MSI automation lists. + */ -static HRESULT create_database(MSIHANDLE, IDispatch**); -static HRESULT create_list_enumerator(ListObject*, void**); -static HRESULT create_summaryinfo(MSIHANDLE, IDispatch**); -static HRESULT create_view(MSIHANDLE, IDispatch**); - -/* ListEnumerator - IEnumVARIANT implementation for MSI automation lists */ typedef struct { IEnumVARIANT IEnumVARIANT_iface; LONG ref; /* Current position and pointer to AutomationObject that stores actual data */ - ULONG pos; - ListObject *list; + ULONG ulPos; + AutomationObject *pObj; } ListEnumerator; +/* + * Structures for additional data required by specific automation objects + */ + typedef struct { - AutomationObject autoobj; - IDispatch *installer; -} SessionObject; + ULONG ulCount; + VARIANT *pVars; +} ListData; -static inline AutomationObject *impl_from_IProvideMultipleClassInfo( IProvideMultipleClassInfo *iface ) -{ - return CONTAINING_RECORD(iface, AutomationObject, IProvideMultipleClassInfo_iface); -} +typedef struct { + /* The parent Installer object */ + IDispatch *pInstaller; +} SessionData; -static inline AutomationObject *impl_from_IDispatch( IDispatch *iface ) -{ - return CONTAINING_RECORD(iface, AutomationObject, IDispatch_iface); -} +/* VTables */ +static const struct IDispatchVtbl AutomationObject_Vtbl; +static const struct IProvideMultipleClassInfoVtbl AutomationObject_IProvideMultipleClassInfo_Vtbl; +static const struct IEnumVARIANTVtbl ListEnumerator_Vtbl; /* Load type info so we don't have to process GetIDsOfNames */ HRESULT load_type_info(IDispatch *iface, ITypeInfo **pptinfo, REFIID clsid, LCID lcid) { - static const WCHAR msiserverW[] = {'m','s','i','s','e','r','v','e','r','.','t','l','b',0}; - ITypeInfo *ti = NULL; - ITypeLib *lib = NULL; HRESULT hr; + LPTYPELIB pLib = NULL; + LPTYPEINFO pInfo = NULL; + static const WCHAR szMsiServer[] = {'m','s','i','s','e','r','v','e','r','.','t','l','b'}; - TRACE("(%p)->(%s, %d)\n", iface, debugstr_guid(clsid), lcid); + TRACE("(%p)->(%s,%d)\n", iface, debugstr_guid(clsid), lcid); /* Load registered type library */ - hr = LoadRegTypeLib(&LIBID_WindowsInstaller, 1, 0, lcid, &lib); + hr = LoadRegTypeLib(&LIBID_WindowsInstaller, 1, 0, lcid, &pLib); if (FAILED(hr)) { - hr = LoadTypeLib(msiserverW, &lib); + hr = LoadTypeLib(szMsiServer, &pLib); if (FAILED(hr)) { ERR("Could not load msiserver.tlb\n"); return hr; @@ -131,20 +136,101 @@ HRESULT load_type_info(IDispatch *iface, ITypeInfo **pptinfo, REFIID clsid, LCID } /* Get type information for object */ - hr = ITypeLib_GetTypeInfoOfGuid(lib, clsid, &ti); - ITypeLib_Release(lib); + hr = ITypeLib_GetTypeInfoOfGuid(pLib, clsid, &pInfo); + ITypeLib_Release(pLib); if (FAILED(hr)) { ERR("Could not load ITypeInfo for %s\n", debugstr_guid(clsid)); return hr; } - *pptinfo = ti; + *pptinfo = pInfo; return S_OK; } -/* AutomationObject methods */ +/* Create the automation object, placing the result in the pointer ppObj. The automation object is created + * with the appropriate clsid and invocation function. */ +static HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter, void **ppObj, REFIID clsid, + HRESULT (*funcInvoke)(AutomationObject*,DISPID,REFIID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,UINT*), + void (*funcFree)(AutomationObject*), SIZE_T sizetPrivateData) +{ + AutomationObject *object; + HRESULT hr; + + TRACE("(%d,%p,%p,%s,%p,%p,%ld)\n", msiHandle, pUnkOuter, ppObj, debugstr_guid(clsid), funcInvoke, funcFree, sizetPrivateData); + + if( pUnkOuter ) + return CLASS_E_NOAGGREGATION; + + object = msi_alloc_zero( sizeof(AutomationObject) + sizetPrivateData ); + + /* Set all the VTable references */ + object->lpVtbl = &AutomationObject_Vtbl; + object->lpvtblIProvideMultipleClassInfo = &AutomationObject_IProvideMultipleClassInfo_Vtbl; + object->ref = 1; + + /* Store data that was passed */ + object->msiHandle = msiHandle; + object->clsid = (LPCLSID)clsid; + object->funcInvoke = funcInvoke; + object->funcFree = funcFree; + + /* Load our TypeInfo so we don't have to process GetIDsOfNames */ + object->iTypeInfo = NULL; + hr = load_type_info((IDispatch *)object, &object->iTypeInfo, clsid, 0x0); + if (FAILED(hr)) { + msi_free( object ); + return hr; + } + + *ppObj = object; + + return S_OK; +} + +/* Create a list enumerator, placing the result in the pointer ppObj. */ +static HRESULT create_list_enumerator(IUnknown *pUnkOuter, LPVOID *ppObj, AutomationObject *pObj, ULONG ulPos) +{ + ListEnumerator *object; + + TRACE("(%p,%p,%p,%uld)\n", pUnkOuter, ppObj, pObj, ulPos); + + if( pUnkOuter ) + return CLASS_E_NOAGGREGATION; + + object = msi_alloc_zero( sizeof(ListEnumerator) ); + + /* Set all the VTable references */ + object->IEnumVARIANT_iface.lpVtbl = &ListEnumerator_Vtbl; + object->ref = 1; + + /* Store data that was passed */ + object->ulPos = ulPos; + object->pObj = pObj; + if (pObj) IDispatch_AddRef((IDispatch *)pObj); + + *ppObj = object; + return S_OK; +} + +/* Macros to get pointer to AutomationObject from the other VTables. */ +static inline AutomationObject *obj_from_IProvideMultipleClassInfo( IProvideMultipleClassInfo *iface ) +{ + return (AutomationObject *)((char*)iface - FIELD_OFFSET(AutomationObject, lpvtblIProvideMultipleClassInfo)); +} + +/* Macro to get pointer to private object data */ +static inline void *private_data( AutomationObject *This ) +{ + return This + 1; +} + +/* + * AutomationObject methods + */ + +/*** IUnknown methods ***/ static HRESULT WINAPI AutomationObject_QueryInterface(IDispatch* iface, REFIID riid, void** ppvObject) { - AutomationObject *This = impl_from_IDispatch(iface); + AutomationObject *This = (AutomationObject *)iface; TRACE("(%p/%p)->(%s,%p)\n", iface, This, debugstr_guid(riid), ppvObject); @@ -153,28 +239,30 @@ static HRESULT WINAPI AutomationObject_QueryInterface(IDispatch* iface, REFIID r *ppvObject = 0; - if (IsEqualGUID(riid, &IID_IUnknown) || - IsEqualGUID(riid, &IID_IDispatch) || - IsEqualGUID(riid, This->clsid)) - *ppvObject = &This->IDispatch_iface; + if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IDispatch) || IsEqualGUID(riid, This->clsid)) + *ppvObject = This; else if (IsEqualGUID(riid, &IID_IProvideClassInfo) || IsEqualGUID(riid, &IID_IProvideClassInfo2) || IsEqualGUID(riid, &IID_IProvideMultipleClassInfo)) - *ppvObject = &This->IProvideMultipleClassInfo_iface; + *ppvObject = &This->lpvtblIProvideMultipleClassInfo; else { - TRACE("() : asking for unsupported interface %s\n", debugstr_guid(riid)); + TRACE("() : asking for unsupported interface %s\n",debugstr_guid(riid)); return E_NOINTERFACE; } - IDispatch_AddRef(iface); + /* + * Query Interface always increases the reference count by one when it is + * successful + */ + IClassFactory_AddRef(iface); return S_OK; } static ULONG WINAPI AutomationObject_AddRef(IDispatch* iface) { - AutomationObject *This = impl_from_IDispatch(iface); + AutomationObject *This = (AutomationObject *)iface; TRACE("(%p/%p)\n", iface, This); @@ -183,7 +271,7 @@ static ULONG WINAPI AutomationObject_AddRef(IDispatch* iface) static ULONG WINAPI AutomationObject_Release(IDispatch* iface) { - AutomationObject *This = impl_from_IDispatch(iface); + AutomationObject *This = (AutomationObject *)iface; ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p/%p)\n", iface, This); @@ -199,11 +287,12 @@ static ULONG WINAPI AutomationObject_Release(IDispatch* iface) return ref; } +/*** IDispatch methods ***/ static HRESULT WINAPI AutomationObject_GetTypeInfoCount( IDispatch* iface, UINT* pctinfo) { - AutomationObject *This = impl_from_IDispatch(iface); + AutomationObject *This = (AutomationObject *)iface; TRACE("(%p/%p)->(%p)\n", iface, This, pctinfo); *pctinfo = 1; @@ -216,7 +305,7 @@ static HRESULT WINAPI AutomationObject_GetTypeInfo( LCID lcid, ITypeInfo** ppTInfo) { - AutomationObject *This = impl_from_IDispatch(iface); + AutomationObject *This = (AutomationObject *)iface; TRACE("(%p/%p)->(%d,%d,%p)\n", iface, This, iTInfo, lcid, ppTInfo); ITypeInfo_AddRef(This->iTypeInfo); @@ -232,7 +321,7 @@ static HRESULT WINAPI AutomationObject_GetIDsOfNames( LCID lcid, DISPID* rgDispId) { - AutomationObject *This = impl_from_IDispatch(iface); + AutomationObject *This = (AutomationObject *)iface; HRESULT hr; TRACE("(%p/%p)->(%p,%p,%d,%d,%p)\n", iface, This, riid, rgszNames, cNames, lcid, rgDispId); @@ -265,7 +354,7 @@ static HRESULT WINAPI AutomationObject_Invoke( EXCEPINFO* pExcepInfo, UINT* puArgErr) { - AutomationObject *This = impl_from_IDispatch(iface); + AutomationObject *This = (AutomationObject *)iface; HRESULT hr; unsigned int uArgErr; VARIANT varResultDummy; @@ -352,7 +441,7 @@ static HRESULT WINAPI AutomationObject_Invoke( return hr; } -static const struct IDispatchVtbl AutomationObjectVtbl = +static const struct IDispatchVtbl AutomationObject_Vtbl = { AutomationObject_QueryInterface, AutomationObject_AddRef, @@ -367,37 +456,37 @@ static const struct IDispatchVtbl AutomationObjectVtbl = * IProvideMultipleClassInfo methods */ -static HRESULT WINAPI ProvideMultipleClassInfo_QueryInterface( +static HRESULT WINAPI AutomationObject_IProvideMultipleClassInfo_QueryInterface( IProvideMultipleClassInfo* iface, REFIID riid, VOID** ppvoid) { - AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); - return IDispatch_QueryInterface(&This->IDispatch_iface, riid, ppvoid); + AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); + return AutomationObject_QueryInterface((IDispatch *)This, riid, ppvoid); } -static ULONG WINAPI ProvideMultipleClassInfo_AddRef(IProvideMultipleClassInfo* iface) +static ULONG WINAPI AutomationObject_IProvideMultipleClassInfo_AddRef(IProvideMultipleClassInfo* iface) { - AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); - return IDispatch_AddRef(&This->IDispatch_iface); + AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); + return AutomationObject_AddRef((IDispatch *)This); } -static ULONG WINAPI ProvideMultipleClassInfo_Release(IProvideMultipleClassInfo* iface) +static ULONG WINAPI AutomationObject_IProvideMultipleClassInfo_Release(IProvideMultipleClassInfo* iface) { - AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); - return IDispatch_Release(&This->IDispatch_iface); + AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); + return AutomationObject_Release((IDispatch *)This); } -static HRESULT WINAPI ProvideMultipleClassInfo_GetClassInfo(IProvideMultipleClassInfo* iface, ITypeInfo** ppTI) +static HRESULT WINAPI AutomationObject_IProvideMultipleClassInfo_GetClassInfo(IProvideMultipleClassInfo* iface, ITypeInfo** ppTI) { - AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); + AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); TRACE("(%p/%p)->(%p)\n", iface, This, ppTI); - return load_type_info(&This->IDispatch_iface, ppTI, This->clsid, 0); + return load_type_info((IDispatch *)This, ppTI, This->clsid, 0); } -static HRESULT WINAPI ProvideMultipleClassInfo_GetGUID(IProvideMultipleClassInfo* iface, DWORD dwGuidKind, GUID* pGUID) +static HRESULT WINAPI AutomationObject_IProvideMultipleClassInfo_GetGUID(IProvideMultipleClassInfo* iface, DWORD dwGuidKind, GUID* pGUID) { - AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); + AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); TRACE("(%p/%p)->(%d,%s)\n", iface, This, dwGuidKind, debugstr_guid(pGUID)); if (dwGuidKind != GUIDKIND_DEFAULT_SOURCE_DISP_IID) @@ -408,16 +497,16 @@ static HRESULT WINAPI ProvideMultipleClassInfo_GetGUID(IProvideMultipleClassInfo } } -static HRESULT WINAPI ProvideMultipleClassInfo_GetMultiTypeInfoCount(IProvideMultipleClassInfo* iface, ULONG* pcti) +static HRESULT WINAPI AutomationObject_GetMultiTypeInfoCount(IProvideMultipleClassInfo* iface, ULONG* pcti) { - AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); + AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); TRACE("(%p/%p)->(%p)\n", iface, This, pcti); *pcti = 1; return S_OK; } -static HRESULT WINAPI ProvideMultipleClassInfo_GetInfoOfIndex(IProvideMultipleClassInfo* iface, +static HRESULT WINAPI AutomationObject_GetInfoOfIndex(IProvideMultipleClassInfo* iface, ULONG iti, DWORD dwFlags, ITypeInfo** pptiCoClass, @@ -426,7 +515,7 @@ static HRESULT WINAPI ProvideMultipleClassInfo_GetInfoOfIndex(IProvideMultipleCl IID* piidPrimary, IID* piidSource) { - AutomationObject *This = impl_from_IProvideMultipleClassInfo(iface); + AutomationObject *This = obj_from_IProvideMultipleClassInfo(iface); TRACE("(%p/%p)->(%d,%d,%p,%p,%p,%p,%p)\n", iface, This, iti, dwFlags, pptiCoClass, pdwTIFlags, pcdispidReserved, piidPrimary, piidSource); @@ -434,7 +523,7 @@ static HRESULT WINAPI ProvideMultipleClassInfo_GetInfoOfIndex(IProvideMultipleCl return E_INVALIDARG; if (dwFlags & MULTICLASSINFO_GETTYPEINFO) - load_type_info(&This->IDispatch_iface, pptiCoClass, This->clsid, 0); + load_type_info((IDispatch *)This, pptiCoClass, This->clsid, 0); if (dwFlags & MULTICLASSINFO_GETNUMRESERVEDDISPIDS) { @@ -453,36 +542,17 @@ static HRESULT WINAPI ProvideMultipleClassInfo_GetInfoOfIndex(IProvideMultipleCl return S_OK; } -static const IProvideMultipleClassInfoVtbl ProvideMultipleClassInfoVtbl = +static const IProvideMultipleClassInfoVtbl AutomationObject_IProvideMultipleClassInfo_Vtbl = { - ProvideMultipleClassInfo_QueryInterface, - ProvideMultipleClassInfo_AddRef, - ProvideMultipleClassInfo_Release, - ProvideMultipleClassInfo_GetClassInfo, - ProvideMultipleClassInfo_GetGUID, - ProvideMultipleClassInfo_GetMultiTypeInfoCount, - ProvideMultipleClassInfo_GetInfoOfIndex + AutomationObject_IProvideMultipleClassInfo_QueryInterface, + AutomationObject_IProvideMultipleClassInfo_AddRef, + AutomationObject_IProvideMultipleClassInfo_Release, + AutomationObject_IProvideMultipleClassInfo_GetClassInfo, + AutomationObject_IProvideMultipleClassInfo_GetGUID, + AutomationObject_GetMultiTypeInfoCount, + AutomationObject_GetInfoOfIndex }; -static HRESULT init_automation_object(AutomationObject *This, MSIHANDLE msiHandle, REFIID clsid, - autoInvokeFunc invokeFunc, autoFreeFunc freeFunc) -{ - TRACE("(%p, %d, %s, %p, %p)\n", This, msiHandle, debugstr_guid(clsid), invokeFunc, freeFunc); - - This->IDispatch_iface.lpVtbl = &AutomationObjectVtbl; - This->IProvideMultipleClassInfo_iface.lpVtbl = &ProvideMultipleClassInfoVtbl; - This->ref = 1; - - This->msiHandle = msiHandle; - This->clsid = (LPCLSID)clsid; - This->funcInvoke = invokeFunc; - This->funcFree = freeFunc; - - /* Load our TypeInfo so we don't have to process GetIDsOfNames */ - This->iTypeInfo = NULL; - return load_type_info(&This->IDispatch_iface, &This->iTypeInfo, clsid, 0); -} - /* * ListEnumerator methods */ @@ -492,6 +562,7 @@ static inline ListEnumerator *impl_from_IEnumVARIANT(IEnumVARIANT* iface) return CONTAINING_RECORD(iface, ListEnumerator, IEnumVARIANT_iface); } +/*** IUnknown methods ***/ static HRESULT WINAPI ListEnumerator_QueryInterface(IEnumVARIANT* iface, REFIID riid, void** ppvObject) { @@ -504,18 +575,15 @@ static HRESULT WINAPI ListEnumerator_QueryInterface(IEnumVARIANT* iface, REFIID *ppvObject = 0; - if (IsEqualGUID(riid, &IID_IUnknown) || - IsEqualGUID(riid, &IID_IEnumVARIANT)) - { - *ppvObject = &This->IEnumVARIANT_iface; - } + if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) + *ppvObject = This; else { TRACE("() : asking for unsupported interface %s\n",debugstr_guid(riid)); return E_NOINTERFACE; } - IEnumVARIANT_AddRef(iface); + IClassFactory_AddRef(iface); return S_OK; } @@ -537,34 +605,39 @@ static ULONG WINAPI ListEnumerator_Release(IEnumVARIANT* iface) if (!ref) { - if (This->list) IDispatch_Release(&This->list->autoobj.IDispatch_iface); + if (This->pObj) IDispatch_Release((IDispatch *)This->pObj); msi_free(This); } return ref; } +/* IEnumVARIANT methods */ + static HRESULT WINAPI ListEnumerator_Next(IEnumVARIANT* iface, ULONG celt, VARIANT* rgVar, - ULONG* fetched) + ULONG* pCeltFetched) { ListEnumerator *This = impl_from_IEnumVARIANT(iface); - ULONG i, local; + ListData *data = private_data(This->pObj); + ULONG idx, local; - TRACE("(%p, %uld, %p, %p)\n", iface, celt, rgVar, fetched); + TRACE("(%p,%uld,%p,%p)\n", iface, celt, rgVar, pCeltFetched); - if (fetched) *fetched = 0; + if (pCeltFetched != NULL) + *pCeltFetched = 0; - if (!rgVar) + if (rgVar == NULL) return S_FALSE; for (local = 0; local < celt; local++) VariantInit(&rgVar[local]); - for (i = This->pos, local = 0; i < This->list->count && local < celt; i++, local++) - VariantCopy(&rgVar[local], &This->list->data[i]); + for (idx = This->ulPos, local = 0; idx < data->ulCount && local < celt; idx++, local++) + VariantCopy(&rgVar[local], &data->pVars[idx]); - if (fetched) *fetched = local; - This->pos = i; + if (pCeltFetched != NULL) + *pCeltFetched = local; + This->ulPos = idx; return (local < celt) ? S_FALSE : S_OK; } @@ -572,16 +645,16 @@ static HRESULT WINAPI ListEnumerator_Next(IEnumVARIANT* iface, ULONG celt, VARIA static HRESULT WINAPI ListEnumerator_Skip(IEnumVARIANT* iface, ULONG celt) { ListEnumerator *This = impl_from_IEnumVARIANT(iface); + ListData *data = private_data(This->pObj); TRACE("(%p,%uld)\n", iface, celt); - This->pos += celt; - if (This->pos >= This->list->count) + This->ulPos += celt; + if (This->ulPos >= data->ulCount) { - This->pos = This->list->count; + This->ulPos = data->ulCount; return S_FALSE; } - return S_OK; } @@ -591,7 +664,7 @@ static HRESULT WINAPI ListEnumerator_Reset(IEnumVARIANT* iface) TRACE("(%p)\n", iface); - This->pos = 0; + This->ulPos = 0; return S_OK; } @@ -606,7 +679,7 @@ static HRESULT WINAPI ListEnumerator_Clone(IEnumVARIANT* iface, IEnumVARIANT **p return S_FALSE; *ppEnum = NULL; - hr = create_list_enumerator(This->list, (LPVOID *)ppEnum); + hr = create_list_enumerator(NULL, (LPVOID *)ppEnum, This->pObj, 0); if (FAILED(hr)) { if (*ppEnum) @@ -628,28 +701,6 @@ static const struct IEnumVARIANTVtbl ListEnumerator_Vtbl = ListEnumerator_Clone }; -/* Create a list enumerator, placing the result in the pointer ppObj. */ -static HRESULT create_list_enumerator(ListObject *list, void **ppObj) -{ - ListEnumerator *object; - - TRACE("(%p, %p)\n", list, ppObj); - - object = msi_alloc(sizeof(ListEnumerator)); - - /* Set all the VTable references */ - object->IEnumVARIANT_iface.lpVtbl = &ListEnumerator_Vtbl; - object->ref = 1; - - /* Store data that was passed */ - object->pos = 0; - object->list = list; - if (list) IDispatch_AddRef(&list->autoobj.IDispatch_iface); - - *ppObj = object; - return S_OK; -} - /* * Individual Object Invocation Functions */ @@ -926,26 +977,6 @@ static HRESULT RecordImpl_Invoke( return S_OK; } -HRESULT create_record(MSIHANDLE msiHandle, IDispatch **disp) -{ - AutomationObject *record; - HRESULT hr; - - record = msi_alloc(sizeof(*record)); - if (!record) return E_OUTOFMEMORY; - - hr = init_automation_object(record, msiHandle, &DIID_Record, RecordImpl_Invoke, NULL); - if (hr != S_OK) - { - msi_free(record); - return hr; - } - - *disp = &record->IDispatch_iface; - - return hr; -} - static HRESULT ListImpl_Invoke( AutomationObject* This, DISPID dispIdMember, @@ -957,16 +988,19 @@ static HRESULT ListImpl_Invoke( EXCEPINFO* pExcepInfo, UINT* puArgErr) { - ListObject *list = (ListObject*)This; - IUnknown *pUnk = NULL; + ListData *data = private_data(This); HRESULT hr; + VARIANTARG varg0; + IUnknown *pUnk = NULL; + + VariantInit(&varg0); switch (dispIdMember) { case DISPID_LIST__NEWENUM: if (wFlags & DISPATCH_METHOD) { V_VT(pVarResult) = VT_UNKNOWN; - if (SUCCEEDED(hr = create_list_enumerator(list, (LPVOID *)&pUnk))) + if (SUCCEEDED(hr = create_list_enumerator(NULL, (LPVOID *)&pUnk, This, 0))) V_UNKNOWN(pVarResult) = pUnk; else ERR("Failed to create IEnumVARIANT object, hresult 0x%08x\n", hr); @@ -976,14 +1010,11 @@ static HRESULT ListImpl_Invoke( case DISPID_LIST_ITEM: if (wFlags & DISPATCH_PROPERTYGET) { - VARIANTARG index; - - VariantInit(&index); - hr = DispGetParam(pDispParams, 0, VT_I4, &index, puArgErr); + hr = DispGetParam(pDispParams, 0, VT_I4, &varg0, puArgErr); if (FAILED(hr)) return hr; - if (V_I4(&index) < 0 || V_I4(&index) >= list->count) + if (V_I4(&varg0) < 0 || V_I4(&varg0) >= data->ulCount) return DISP_E_BADINDEX; - VariantCopy(pVarResult, &list->data[V_I4(&index)]); + VariantCopy(pVarResult, &data->pVars[V_I4(&varg0)]); } else return DISP_E_MEMBERNOTFOUND; break; @@ -991,7 +1022,7 @@ static HRESULT ListImpl_Invoke( case DISPID_LIST_COUNT: if (wFlags & DISPATCH_PROPERTYGET) { V_VT(pVarResult) = VT_I4; - V_I4(pVarResult) = list->count; + V_I4(pVarResult) = data->ulCount; } else return DISP_E_MEMBERNOTFOUND; break; @@ -1000,97 +1031,19 @@ static HRESULT ListImpl_Invoke( return DISP_E_MEMBERNOTFOUND; } + VariantClear(&varg0); + return S_OK; } static void ListImpl_Free(AutomationObject *This) { - ListObject *list = (ListObject*)This; - int i; + ListData *data = private_data(This); + ULONG idx; - for (i = 0; i < list->count; i++) - VariantClear(&list->data[i]); - msi_free(list->data); -} - -static HRESULT get_products_count(const WCHAR *product, int *len) -{ - int i = 0; - - while (1) - { - WCHAR dataW[GUID_SIZE]; - UINT ret; - - /* all or related only */ - if (product) - ret = MsiEnumRelatedProductsW(product, 0, i, dataW); - else - ret = MsiEnumProductsW(i, dataW); - - if (ret == ERROR_NO_MORE_ITEMS) break; - - if (ret != ERROR_SUCCESS) - return DISP_E_EXCEPTION; - - i++; - } - - *len = i; - - return S_OK; -} - -static HRESULT create_list(const WCHAR *product, IDispatch **dispatch) -{ - ListObject *list; - HRESULT hr; - int i; - - list = msi_alloc_zero(sizeof(ListObject)); - if (!list) return E_OUTOFMEMORY; - - hr = init_automation_object(&list->autoobj, 0, &DIID_StringList, ListImpl_Invoke, ListImpl_Free); - if (hr != S_OK) - { - msi_free(list); - return hr; - } - - *dispatch = &list->autoobj.IDispatch_iface; - - hr = get_products_count(product, &list->count); - if (hr != S_OK) - { - IDispatch_Release(*dispatch); - return hr; - } - - list->data = msi_alloc(list->count*sizeof(VARIANT)); - if (!list->data) - { - IDispatch_Release(*dispatch); - return E_OUTOFMEMORY; - } - - for (i = 0; i < list->count; i++) - { - WCHAR dataW[GUID_SIZE]; - UINT ret; - - /* all or related only */ - if (product) - ret = MsiEnumRelatedProductsW(product, 0, i, dataW); - else - ret = MsiEnumProductsW(i, dataW); - - if (ret == ERROR_NO_MORE_ITEMS) break; - - V_VT(&list->data[i]) = VT_BSTR; - V_BSTR(&list->data[i]) = SysAllocString(dataW); - } - - return S_OK; + for (idx=0; idxulCount; idx++) + VariantClear(&data->pVars[idx]); + msi_free(data->pVars); } static HRESULT ViewImpl_Invoke( @@ -1105,6 +1058,7 @@ static HRESULT ViewImpl_Invoke( UINT* puArgErr) { MSIHANDLE msiHandle; + IDispatch *pDispatch = NULL; UINT ret; VARIANTARG varg0, varg1; HRESULT hr; @@ -1132,10 +1086,8 @@ static HRESULT ViewImpl_Invoke( V_VT(pVarResult) = VT_DISPATCH; if ((ret = MsiViewFetch(This->msiHandle, &msiHandle)) == ERROR_SUCCESS) { - IDispatch *dispatch = NULL; - - if (SUCCEEDED(hr = create_record(msiHandle, &dispatch))) - V_DISPATCH(pVarResult) = dispatch; + if (SUCCEEDED(hr = create_automation_object(msiHandle, NULL, (LPVOID*)&pDispatch, &DIID_Record, RecordImpl_Invoke, NULL, 0))) + V_DISPATCH(pVarResult) = pDispatch; else ERR("Failed to create Record object, hresult 0x%08x\n", hr); } @@ -1212,8 +1164,8 @@ static HRESULT DatabaseImpl_Invoke( EXCEPINFO* pExcepInfo, UINT* puArgErr) { - IDispatch *dispatch = NULL; MSIHANDLE msiHandle; + IDispatch *pDispatch = NULL; UINT ret; VARIANTARG varg0, varg1; HRESULT hr; @@ -1233,9 +1185,9 @@ static HRESULT DatabaseImpl_Invoke( V_VT(pVarResult) = VT_DISPATCH; if ((ret = MsiGetSummaryInformationW(This->msiHandle, NULL, V_I4(&varg0), &msiHandle)) == ERROR_SUCCESS) { - hr = create_summaryinfo(msiHandle, &dispatch); + hr = create_automation_object(msiHandle, NULL, (LPVOID *)&pDispatch, &DIID_SummaryInfo, SummaryInfoImpl_Invoke, NULL, 0); if (SUCCEEDED(hr)) - V_DISPATCH(pVarResult) = dispatch; + V_DISPATCH(pVarResult) = pDispatch; else ERR("Failed to create SummaryInfo object: 0x%08x\n", hr); } @@ -1256,8 +1208,8 @@ static HRESULT DatabaseImpl_Invoke( V_VT(pVarResult) = VT_DISPATCH; if ((ret = MsiDatabaseOpenViewW(This->msiHandle, V_BSTR(&varg0), &msiHandle)) == ERROR_SUCCESS) { - if (SUCCEEDED(hr = create_view(msiHandle, &dispatch))) - V_DISPATCH(pVarResult) = dispatch; + if (SUCCEEDED(hr = create_automation_object(msiHandle, NULL, (LPVOID*)&pDispatch, &DIID_View, ViewImpl_Invoke, NULL, 0))) + V_DISPATCH(pVarResult) = pDispatch; else ERR("Failed to create View object, hresult 0x%08x\n", hr); } @@ -1297,9 +1249,10 @@ static HRESULT SessionImpl_Invoke( EXCEPINFO* pExcepInfo, UINT* puArgErr) { - SessionObject *session = (SessionObject*)This; + SessionData *data = private_data(This); WCHAR *szString; DWORD dwLen; + IDispatch *pDispatch = NULL; MSIHANDLE msiHandle; LANGID langId; UINT ret; @@ -1315,8 +1268,8 @@ static HRESULT SessionImpl_Invoke( case DISPID_SESSION_INSTALLER: if (wFlags & DISPATCH_PROPERTYGET) { V_VT(pVarResult) = VT_DISPATCH; - IDispatch_AddRef(session->installer); - V_DISPATCH(pVarResult) = session->installer; + IDispatch_AddRef(data->pInstaller); + V_DISPATCH(pVarResult) = data->pInstaller; } else return DISP_E_MEMBERNOTFOUND; break; @@ -1390,10 +1343,8 @@ static HRESULT SessionImpl_Invoke( V_VT(pVarResult) = VT_DISPATCH; if ((msiHandle = MsiGetActiveDatabase(This->msiHandle))) { - IDispatch *dispatch; - - if (SUCCEEDED(hr = create_database(msiHandle, &dispatch))) - V_DISPATCH(pVarResult) = dispatch; + if (SUCCEEDED(hr = create_automation_object(msiHandle, NULL, (LPVOID*)&pDispatch, &DIID_Database, DatabaseImpl_Invoke, NULL, 0))) + V_DISPATCH(pVarResult) = pDispatch; else ERR("Failed to create Database object, hresult 0x%08x\n", hr); } @@ -1629,7 +1580,8 @@ static HRESULT InstallerImpl_CreateRecord(WORD wFlags, if (!hrec) return DISP_E_EXCEPTION; - hr = create_record(hrec, &dispatch); + hr = create_automation_object(hrec, NULL, (LPVOID*)&dispatch, + &DIID_Record, RecordImpl_Invoke, NULL, 0); if (SUCCEEDED(hr)) V_DISPATCH(pVarResult) = dispatch; @@ -1685,7 +1637,7 @@ static HRESULT InstallerImpl_OpenPackage(AutomationObject* This, goto done; } - hr = create_session(hpkg, &This->IDispatch_iface, &dispatch); + hr = create_session(hpkg, (IDispatch *)This, &dispatch); if (SUCCEEDED(hr)) V_DISPATCH(pVarResult) = dispatch; @@ -1754,7 +1706,8 @@ static HRESULT InstallerImpl_OpenDatabase(WORD wFlags, goto done; } - hr = create_database(hdb, &dispatch); + hr = create_automation_object(hdb, NULL, (LPVOID *)&dispatch, + &DIID_Database, DatabaseImpl_Invoke, NULL, 0); if (SUCCEEDED(hr)) V_DISPATCH(pVarResult) = dispatch; @@ -2202,52 +2155,157 @@ done: return hr; } -static HRESULT InstallerImpl_Products(WORD flags, +static void cleanup_products(IDispatch* dispatch, ULONG count) +{ + UINT i; + ListData* ldata = private_data((AutomationObject *)dispatch); + + for (i = 0; i < count - 1; i++) + VariantClear(&ldata->pVars[i]); + + ldata->ulCount = 0; + msi_free(ldata->pVars); + + IDispatch_Release(dispatch); +} + +static HRESULT InstallerImpl_Products(WORD wFlags, DISPPARAMS* pDispParams, - VARIANT* result, + VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) { - IDispatch *dispatch; + UINT ret; HRESULT hr; + ULONG idx = 0; + ListData *ldata; + IDispatch *dispatch; + WCHAR product[GUID_SIZE]; - if (!(flags & DISPATCH_PROPERTYGET)) + if (!(wFlags & DISPATCH_PROPERTYGET)) return DISP_E_MEMBERNOTFOUND; - hr = create_list(NULL, &dispatch); + /* Find number of products. */ + while ((ret = MsiEnumProductsW(idx, product)) == ERROR_SUCCESS) + idx++; + + if (ret != ERROR_NO_MORE_ITEMS) + return DISP_E_EXCEPTION; + + V_VT(pVarResult) = VT_DISPATCH; + hr = create_automation_object(0, NULL, (LPVOID*)&dispatch, + &DIID_StringList, ListImpl_Invoke, + ListImpl_Free, sizeof(ListData)); if (FAILED(hr)) return hr; - V_VT(result) = VT_DISPATCH; - V_DISPATCH(result) = dispatch; + V_DISPATCH(pVarResult) = dispatch; - return hr; + /* Save product strings. */ + ldata = private_data((AutomationObject *)dispatch); + ldata->ulCount = 0; + ldata->pVars = msi_alloc_zero(sizeof(VARIANT) * idx); + if (!ldata->pVars) + { + IDispatch_Release(dispatch); + return E_OUTOFMEMORY; + } + + ldata->ulCount = idx; + for (idx = 0; idx < ldata->ulCount; idx++) + { + ret = MsiEnumProductsW(idx, product); + if (ret != ERROR_SUCCESS) + { + cleanup_products(dispatch, idx - 1); + return DISP_E_EXCEPTION; + } + + VariantInit(&ldata->pVars[idx]); + V_VT(&ldata->pVars[idx]) = VT_BSTR; + V_BSTR(&ldata->pVars[idx]) = SysAllocString(product); + } + + return S_OK; } -static HRESULT InstallerImpl_RelatedProducts(WORD flags, +static HRESULT InstallerImpl_RelatedProducts(WORD wFlags, DISPPARAMS* pDispParams, - VARIANT* result, + VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) { - IDispatch* dispatch; - VARIANTARG related; + UINT ret; + ULONG idx; HRESULT hr; + ListData *ldata; + VARIANTARG varg0; + IDispatch* dispatch; + WCHAR product[GUID_SIZE]; - if (!(flags & DISPATCH_PROPERTYGET)) + if (!(wFlags & DISPATCH_PROPERTYGET)) return DISP_E_MEMBERNOTFOUND; - VariantInit(&related); - hr = DispGetParam(pDispParams, 0, VT_BSTR, &related, puArgErr); + VariantInit(&varg0); + hr = DispGetParam(pDispParams, 0, VT_BSTR, &varg0, puArgErr); if (FAILED(hr)) return hr; - hr = create_list(V_BSTR(&related), &dispatch); - VariantClear(&related); + /* Find number of related products. */ + idx = 0; + do + { + ret = MsiEnumRelatedProductsW(V_BSTR(&varg0), 0, idx, product); + if (ret == ERROR_SUCCESS) + idx++; + } while (ret == ERROR_SUCCESS); - V_VT(result) = VT_DISPATCH; - V_DISPATCH(result) = dispatch; + if (ret != ERROR_NO_MORE_ITEMS) + { + hr = DISP_E_EXCEPTION; + goto done; + } + V_VT(pVarResult) = VT_DISPATCH; + + hr = create_automation_object(0, NULL, (LPVOID*)&dispatch, + &DIID_StringList, ListImpl_Invoke, + ListImpl_Free, sizeof(ListData)); + if (FAILED(hr)) + goto done; + + V_DISPATCH(pVarResult) = dispatch; + + /* Save product strings. */ + ldata = private_data((AutomationObject *)dispatch); + ldata->pVars = msi_alloc(sizeof(VARIANT) * idx); + if (!ldata->pVars) + { + IDispatch_Release(dispatch); + hr = E_OUTOFMEMORY; + goto done; + } + + ldata->ulCount = idx; + for (idx = 0; idx < ldata->ulCount; idx++) + { + ret = MsiEnumRelatedProductsW(V_BSTR(&varg0), 0, idx, product); + if (ret != ERROR_SUCCESS) + { + cleanup_products(dispatch, idx - 1); + hr = DISP_E_EXCEPTION; + goto done; + } + + VariantInit(&ldata->pVars[idx]); + V_VT(&ldata->pVars[idx]) = VT_BSTR; + V_BSTR(&ldata->pVars[idx]) = SysAllocString(product); + } + + hr = S_OK; + +done: + VariantClear(&varg0); return hr; } @@ -2351,112 +2409,17 @@ static HRESULT InstallerImpl_Invoke( } } -HRESULT create_msiserver(IUnknown *outer, void **ppObj) +/* Wrapper around create_automation_object to create an installer object. */ +HRESULT create_msiserver(IUnknown *pOuter, LPVOID *ppObj) { - AutomationObject *installer; - HRESULT hr; - - TRACE("(%p %p)\n", outer, ppObj); - - if (outer) - return CLASS_E_NOAGGREGATION; - - installer = msi_alloc(sizeof(AutomationObject)); - if (!installer) return E_OUTOFMEMORY; - - hr = init_automation_object(installer, 0, &DIID_Installer, InstallerImpl_Invoke, NULL); - if (hr != S_OK) - { - msi_free(installer); - return hr; - } - - *ppObj = &installer->IDispatch_iface; - - return hr; + return create_automation_object(0, pOuter, ppObj, &DIID_Installer, InstallerImpl_Invoke, NULL, 0); } -HRESULT create_session(MSIHANDLE msiHandle, IDispatch *installer, IDispatch **disp) +/* Wrapper around create_automation_object to create a session object. */ +HRESULT create_session(MSIHANDLE msiHandle, IDispatch *pInstaller, IDispatch **pDispatch) { - SessionObject *session; - HRESULT hr; - - session = msi_alloc(sizeof(SessionObject)); - if (!session) return E_OUTOFMEMORY; - - hr = init_automation_object(&session->autoobj, msiHandle, &DIID_Session, SessionImpl_Invoke, NULL); - if (hr != S_OK) - { - msi_free(session); - return hr; - } - - session->installer = installer; - *disp = &session->autoobj.IDispatch_iface; - - return hr; -} - -static HRESULT create_database(MSIHANDLE msiHandle, IDispatch **dispatch) -{ - AutomationObject *database; - HRESULT hr; - - TRACE("(%d %p)\n", msiHandle, dispatch); - - database = msi_alloc(sizeof(AutomationObject)); - if (!database) return E_OUTOFMEMORY; - - hr = init_automation_object(database, msiHandle, &DIID_Database, DatabaseImpl_Invoke, NULL); - if (hr != S_OK) - { - msi_free(database); - return hr; - } - - *dispatch = &database->IDispatch_iface; - - return hr; -} - -static HRESULT create_view(MSIHANDLE msiHandle, IDispatch **dispatch) -{ - AutomationObject *view; - HRESULT hr; - - TRACE("(%d %p)\n", msiHandle, dispatch); - - view = msi_alloc(sizeof(AutomationObject)); - if (!view) return E_OUTOFMEMORY; - - hr = init_automation_object(view, msiHandle, &DIID_View, ViewImpl_Invoke, NULL); - if (hr != S_OK) - { - msi_free(view); - return hr; - } - - *dispatch = &view->IDispatch_iface; - - return hr; -} - -static HRESULT create_summaryinfo(MSIHANDLE msiHandle, IDispatch **disp) -{ - AutomationObject *info; - HRESULT hr; - - info = msi_alloc(sizeof(*info)); - if (!info) return E_OUTOFMEMORY; - - hr = init_automation_object(info, msiHandle, &DIID_SummaryInfo, SummaryInfoImpl_Invoke, NULL); - if (hr != S_OK) - { - msi_free(info); - return hr; - } - - *disp = &info->IDispatch_iface; - + HRESULT hr = create_automation_object(msiHandle, NULL, (LPVOID)pDispatch, &DIID_Session, SessionImpl_Invoke, NULL, sizeof(SessionData)); + if (SUCCEEDED(hr) && pDispatch && *pDispatch) + ((SessionData *)private_data((AutomationObject *)*pDispatch))->pInstaller = pInstaller; return hr; } diff --git a/reactos/dll/win32/msi/cond.tab.h b/reactos/dll/win32/msi/cond.tab.h deleted file mode 100644 index 47f4816deb3..00000000000 --- a/reactos/dll/win32/msi/cond.tab.h +++ /dev/null @@ -1,108 +0,0 @@ - -/* A Bison parser, made by GNU Bison 2.4.1. */ - -/* Skeleton interface for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - COND_SPACE = 258, - COND_EOF = 259, - COND_OR = 260, - COND_AND = 261, - COND_NOT = 262, - COND_XOR = 263, - COND_IMP = 264, - COND_EQV = 265, - COND_LT = 266, - COND_GT = 267, - COND_EQ = 268, - COND_NE = 269, - COND_GE = 270, - COND_LE = 271, - COND_ILT = 272, - COND_IGT = 273, - COND_IEQ = 274, - COND_INE = 275, - COND_IGE = 276, - COND_ILE = 277, - COND_LPAR = 278, - COND_RPAR = 279, - COND_TILDA = 280, - COND_SS = 281, - COND_ISS = 282, - COND_ILHS = 283, - COND_IRHS = 284, - COND_LHS = 285, - COND_RHS = 286, - COND_PERCENT = 287, - COND_DOLLARS = 288, - COND_QUESTION = 289, - COND_AMPER = 290, - COND_EXCLAM = 291, - COND_IDENT = 292, - COND_NUMBER = 293, - COND_LITER = 294, - COND_ERROR = 295 - }; -#endif - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -{ - -/* Line 1676 of yacc.c */ -#line 116 "cond.y" - - struct cond_str str; - LPWSTR string; - INT value; - - - -/* Line 1676 of yacc.c */ -#line 100 "cond.tab.h" -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - - - - diff --git a/reactos/dll/win32/msi/cond.y b/reactos/dll/win32/msi/cond.y index 5bde044d8c2..97bb002aefb 100644 --- a/reactos/dll/win32/msi/cond.y +++ b/reactos/dll/win32/msi/cond.y @@ -488,7 +488,7 @@ static INT compare_substring( LPCWSTR a, INT operator, LPCWSTR b ) return !strncmpiW( a + (l - r), b, r ); } default: - ERR("invalid substring operator\n"); + ERR("invalid substring operator\n"); return 0; } return 0; @@ -498,7 +498,7 @@ static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert ) { if (operator >= COND_SS && operator <= COND_RHS) return compare_substring( a, operator, b ); - + /* null and empty string are equivalent */ if (!a) a = szEmpty; if (!b) b = szEmpty; @@ -665,8 +665,7 @@ static int COND_GetOne( struct cond_str *str, COND_input *cond ) if (ch == '"' ) { LPCWSTR p = strchrW( str->data + 1, '"' ); - if (!p) - return COND_ERROR; + if (!p) return COND_ERROR; len = p - str->data + 1; rc = COND_LITER; } @@ -813,8 +812,7 @@ MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition ) TRACE("%s\n", debugstr_w( szCondition ) ); - if ( szCondition == NULL ) - return MSICONDITION_NONE; + if (szCondition == NULL) return MSICONDITION_NONE; cond.package = package; cond.str = szCondition; diff --git a/reactos/dll/win32/msi/install.c b/reactos/dll/win32/msi/install.c index 83b8b7d1738..86e397979f6 100644 --- a/reactos/dll/win32/msi/install.c +++ b/reactos/dll/win32/msi/install.c @@ -347,10 +347,16 @@ UINT WINAPI MsiGetTargetPathW( MSIHANDLE hInstall, LPCWSTR szFolder, return MSI_GetTargetPath( hInstall, szFolder, &path, pcchPathBuf ); } -static WCHAR *get_source_root( MSIPACKAGE *package ) +static WCHAR *get_source_root( MSIDATABASE *db ) { - msi_set_sourcedir_props( package, FALSE ); - return msi_dup_property( package->db, szSourceDir ); + WCHAR *path, *p; + + if ((path = msi_dup_property( db, szSourceDir ))) return path; + if ((path = msi_dup_property( db, szDatabase ))) + { + if ((p = strrchrW( path, '\\' ))) p[1] = 0; + } + return path; } WCHAR *msi_resolve_source_folder( MSIPACKAGE *package, const WCHAR *name, MSIFOLDER **folder ) @@ -366,7 +372,7 @@ WCHAR *msi_resolve_source_folder( MSIPACKAGE *package, const WCHAR *name, MSIFOL /* special resolving for root dir */ if (!strcmpW( name, szTargetDir ) && !f->ResolvedSource) { - f->ResolvedSource = get_source_root( package ); + f->ResolvedSource = get_source_root( package->db ); } if (folder) *folder = f; if (f->ResolvedSource) @@ -382,7 +388,7 @@ WCHAR *msi_resolve_source_folder( MSIPACKAGE *package, const WCHAR *name, MSIFOL p = msi_resolve_source_folder( package, parent, NULL ); if (package->WordCount & msidbSumInfoSourceTypeCompressed) - path = get_source_root( package ); + path = get_source_root( package->db ); else if (package->WordCount & msidbSumInfoSourceTypeSFN) path = msi_build_directory_name( 3, p, f->SourceShortPath, NULL ); else @@ -553,7 +559,8 @@ static void set_target_path( MSIPACKAGE *package, MSIFOLDER *folder, const WCHAR MSIFOLDER *child; WCHAR *target_path; - if (!(target_path = msi_normalize_path( path ))) return; + if (!(target_path = strdupW( path ))) return; + msi_clean_path( target_path ); if (strcmpW( target_path, folder->ResolvedTarget )) { msi_free( folder->ResolvedTarget ); @@ -571,7 +578,7 @@ static void set_target_path( MSIPACKAGE *package, MSIFOLDER *folder, const WCHAR UINT MSI_SetTargetPathW( MSIPACKAGE *package, LPCWSTR szFolder, LPCWSTR szFolderPath ) { - DWORD attrib; + DWORD attrib, len; MSIFOLDER *folder; MSIFILE *file; @@ -586,7 +593,17 @@ UINT MSI_SetTargetPathW( MSIPACKAGE *package, LPCWSTR szFolder, LPCWSTR szFolder } if (!(folder = msi_get_loaded_folder( package, szFolder ))) return ERROR_DIRECTORY; - set_target_path( package, folder, szFolderPath ); + len = strlenW( szFolderPath ); + if (len && szFolderPath[len - 1] != '\\') + { + WCHAR *path = msi_alloc( (len + 2) * sizeof(WCHAR) ); + memcpy( path, szFolderPath, len * sizeof(WCHAR) ); + path[len] = '\\'; + path[len + 1] = 0; + set_target_path( package, folder, path ); + msi_free( path ); + } + else set_target_path( package, folder, szFolderPath ); LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry ) { diff --git a/reactos/dll/win32/msi/msi.c b/reactos/dll/win32/msi/msi.c index cc83e39cf3b..fd2315fecdd 100644 --- a/reactos/dll/win32/msi/msi.c +++ b/reactos/dll/win32/msi/msi.c @@ -42,9 +42,6 @@ #include "wintrust.h" #include "softpub.h" -#include "initguid.h" -#include "msxml2.h" - #include "wine/debug.h" #include "wine/unicode.h" @@ -307,6 +304,7 @@ done: return r; } + static UINT get_patch_product_codes( LPCWSTR szPatchPackage, WCHAR ***product_codes ) { MSIHANDLE patch, info = 0; @@ -582,63 +580,17 @@ static UINT MSI_ApplicablePatchW( MSIPACKAGE *package, LPCWSTR patch ) return r; } -/* IXMLDOMDocument should be set to XPath mode already */ -static UINT MSI_ApplicablePatchXML( MSIPACKAGE *package, IXMLDOMDocument *desc ) -{ - static const WCHAR queryW[] = {'M','s','i','P','a','t','c','h','/', - 'T','a','r','g','e','t','P','r','o','d','u','c','t','/', - 'T','a','r','g','e','t','P','r','o','d','u','c','t','C','o','d','e',0}; - UINT r = ERROR_FUNCTION_FAILED; - IXMLDOMNodeList *list; - LPWSTR product_code; - IXMLDOMNode *node; - HRESULT hr; - BSTR s; - - product_code = msi_dup_property( package->db, szProductCode ); - if (!product_code) - { - /* FIXME: the property ProductCode should be written into the DB somewhere */ - ERR("no product code to check\n"); - return ERROR_SUCCESS; - } - - s = SysAllocString(queryW); - hr = IXMLDOMDocument_selectNodes( desc, s, &list ); - SysFreeString(s); - if (hr != S_OK) - return ERROR_INVALID_PATCH_XML; - - while (IXMLDOMNodeList_nextNode( list, &node ) == S_OK && r != ERROR_SUCCESS) - { - hr = IXMLDOMNode_get_text( node, &s ); - IXMLDOMNode_Release( node ); - if (!strcmpW( s, product_code )) r = ERROR_SUCCESS; - SysFreeString(s); - } - IXMLDOMNodeList_Release( list ); - - if (r != ERROR_SUCCESS) - TRACE("patch not applicable\n"); - - msi_free( product_code ); - return r; -} - static UINT determine_patch_sequence( MSIPACKAGE *package, DWORD count, MSIPATCHSEQUENCEINFOW *info ) { - IXMLDOMDocument *desc = NULL; DWORD i; - if (count > 1) - FIXME("patch ordering not supported\n"); - for (i = 0; i < count; i++) { switch (info[i].ePatchDataType) { case MSIPATCH_DATATYPE_PATCHFILE: { + FIXME("patch ordering not supported\n"); if (MSI_ApplicablePatchW( package, info[i].szPatchData ) != ERROR_SUCCESS) { info[i].dwOrder = ~0u; @@ -651,72 +603,19 @@ static UINT determine_patch_sequence( MSIPACKAGE *package, DWORD count, MSIPATCH } break; } - case MSIPATCH_DATATYPE_XMLPATH: - case MSIPATCH_DATATYPE_XMLBLOB: - { - VARIANT_BOOL b; - HRESULT hr; - BSTR s; - - if (!desc) - { - hr = CoCreateInstance( &CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, - &IID_IXMLDOMDocument, (void**)&desc ); - if (hr != S_OK) - { - ERR("failed to create DOMDocument30 instance, 0x%08x\n", hr); - return ERROR_FUNCTION_FAILED; - } - } - - s = SysAllocString( info[i].szPatchData ); - if (info[i].ePatchDataType == MSIPATCH_DATATYPE_XMLPATH) - { - VARIANT src; - - V_VT(&src) = VT_BSTR; - V_BSTR(&src) = s; - hr = IXMLDOMDocument_load( desc, src, &b ); - } - else - hr = IXMLDOMDocument_loadXML( desc, s, &b ); - SysFreeString( s ); - if ( hr != S_OK ) - { - ERR("failed to parse patch description\n"); - IXMLDOMDocument_Release( desc ); - break; - } - - if (MSI_ApplicablePatchXML( package, desc ) != ERROR_SUCCESS) - { - info[i].dwOrder = ~0u; - info[i].uStatus = ERROR_PATCH_TARGET_NOT_FOUND; - } - else - { - info[i].dwOrder = i; - info[i].uStatus = ERROR_SUCCESS; - } - break; - } default: { - FIXME("unknown patch data type %u\n", info[i].ePatchDataType); + FIXME("patch data type %u not supported\n", info[i].ePatchDataType); info[i].dwOrder = i; info[i].uStatus = ERROR_SUCCESS; break; } } - TRACE("szPatchData: %s\n", debugstr_w(info[i].szPatchData)); TRACE("ePatchDataType: %u\n", info[i].ePatchDataType); TRACE("dwOrder: %u\n", info[i].dwOrder); TRACE("uStatus: %u\n", info[i].uStatus); } - - if (desc) IXMLDOMDocument_Release( desc ); - return ERROR_SUCCESS; } diff --git a/reactos/dll/win32/msi/msi.rgs b/reactos/dll/win32/msi/msi.rgs index fd09e8821ca..4b91dd4131e 100644 --- a/reactos/dll/win32/msi/msi.rgs +++ b/reactos/dll/win32/msi/msi.rgs @@ -80,4 +80,105 @@ HKCR { CLSID = s '{000C101D-0000-0000-C000-000000000046}' } + + NoRemove Typelib + { + NoRemove '{000C1092-0000-0000-C000-000000000046}' + { + '1.0' = s 'WindowsInstaller' + { + '0' { win32 = s '%MODULE%' } + FLAGS = s '0' + } + } + } + NoRemove Interface + { + '{000C1090-0000-0000-C000-000000000046}' = s 'Installer' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C1093-0000-0000-C000-000000000046}' = s 'Record' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C1095-0000-0000-C000-000000000046}' = s 'StringList' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C1096-0000-0000-C000-000000000046}' = s 'RecordList' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C109A-0000-0000-C000-000000000046}' = s 'UIPreview' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C109B-0000-0000-C000-000000000046}' = s 'SummaryInfo' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C109C-0000-0000-C000-000000000046}' = s 'View' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C109D-0000-0000-C000-000000000046}' = s 'Database' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C109E-0000-0000-C000-000000000046}' = s 'Session' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C109F-0000-0000-C000-000000000046}' = s 'FeatureInfo' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C10A0-0000-0000-C000-000000000046}' = s 'Product' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + '{000C10A1-0000-0000-C000-000000000046}' = s 'Patch' + { + ProxyStubClsid = s '{00020424-0000-0000-C000-000000000046}' + ProxyStubClsid32 = s '{00020424-0000-0000-C000-000000000046}' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' { val Version = s '1.0' } + } + } + NoRemove CLSID + { + '{000C1090-0000-0000-C000-000000000046}' = s 'Microsoft Windows Installer' + { + InprocServer32 = s '%MODULE%' { val ThreadingModel = s 'Apartment' } + ProgId = s 'WindowsInstaller.Installer' + TypeLib = s '{000C1092-0000-0000-C000-000000000046}' + Version = s '1.0' + } + } + 'WindowsInstaller.Installer' = s 'Microsoft Windows Installer' + { + CLSID = s '{000C1090-0000-0000-C000-000000000046}' + } } diff --git a/reactos/dll/win32/msi/msipriv.h b/reactos/dll/win32/msi/msipriv.h index 2c9385a2a50..589e4a12d94 100644 --- a/reactos/dll/win32/msi/msipriv.h +++ b/reactos/dll/win32/msi/msipriv.h @@ -998,7 +998,7 @@ extern UINT msi_get_property( MSIDATABASE *, LPCWSTR, LPWSTR, LPDWORD ) DECLSPEC extern int msi_get_property_int( MSIDATABASE *package, LPCWSTR prop, int def ) DECLSPEC_HIDDEN; extern WCHAR *msi_resolve_source_folder(MSIPACKAGE *package, const WCHAR *name, MSIFOLDER **folder) DECLSPEC_HIDDEN; extern void msi_resolve_target_folder(MSIPACKAGE *package, const WCHAR *name, BOOL load_prop) DECLSPEC_HIDDEN; -extern WCHAR *msi_normalize_path(const WCHAR *) DECLSPEC_HIDDEN; +extern void msi_clean_path( WCHAR *p ) DECLSPEC_HIDDEN; extern WCHAR *msi_resolve_file_source(MSIPACKAGE *package, MSIFILE *file) DECLSPEC_HIDDEN; extern const WCHAR *msi_get_target_folder(MSIPACKAGE *package, const WCHAR *name) DECLSPEC_HIDDEN; extern void msi_reset_folders( MSIPACKAGE *package, BOOL source ) DECLSPEC_HIDDEN; diff --git a/reactos/dll/win32/msi/msiserver.h b/reactos/dll/win32/msi/msiserver.h deleted file mode 100644 index a925a87e415..00000000000 --- a/reactos/dll/win32/msi/msiserver.h +++ /dev/null @@ -1,2411 +0,0 @@ -/*** Autogenerated by WIDL 1.3.35 from msiserver.idl - Do not edit ***/ - -#ifndef __REQUIRED_RPCNDR_H_VERSION__ -#define __REQUIRED_RPCNDR_H_VERSION__ 475 -#endif - -#include -#include - -#if !defined(COM_NO_WINDOWS_H) && !defined(__WINESRC__) -#include -#include -#endif - -#ifndef __WIDL_MSISERVER_H -#define __WIDL_MSISERVER_H - -/* Forward declarations */ - -#ifndef __IWineMsiRemoteDatabase_FWD_DEFINED__ -#define __IWineMsiRemoteDatabase_FWD_DEFINED__ -typedef interface IWineMsiRemoteDatabase IWineMsiRemoteDatabase; -#endif - -#ifndef __IWineMsiRemotePackage_FWD_DEFINED__ -#define __IWineMsiRemotePackage_FWD_DEFINED__ -typedef interface IWineMsiRemotePackage IWineMsiRemotePackage; -#endif - -#ifndef __IWineMsiRemoteCustomAction_FWD_DEFINED__ -#define __IWineMsiRemoteCustomAction_FWD_DEFINED__ -typedef interface IWineMsiRemoteCustomAction IWineMsiRemoteCustomAction; -#endif - -#ifndef __IMsiServer_FWD_DEFINED__ -#define __IMsiServer_FWD_DEFINED__ -typedef interface IMsiServer IMsiServer; -#endif - -#ifndef __IMsiMessage_FWD_DEFINED__ -#define __IMsiMessage_FWD_DEFINED__ -typedef interface IMsiMessage IMsiMessage; -#endif - -#ifndef __IMsiCustomAction_FWD_DEFINED__ -#define __IMsiCustomAction_FWD_DEFINED__ -typedef interface IMsiCustomAction IMsiCustomAction; -#endif - -#ifndef __IMsiRemoteAPI_FWD_DEFINED__ -#define __IMsiRemoteAPI_FWD_DEFINED__ -typedef interface IMsiRemoteAPI IMsiRemoteAPI; -#endif - -#ifndef __MsiServer_FWD_DEFINED__ -#define __MsiServer_FWD_DEFINED__ -typedef struct MsiServer MsiServer; -#endif /* defined __MsiServer_FWD_DEFINED__ */ - -#ifndef __MsiServerMessage_FWD_DEFINED__ -#define __MsiServerMessage_FWD_DEFINED__ -typedef struct MsiServerMessage MsiServerMessage; -#endif /* defined __MsiServerMessage_FWD_DEFINED__ */ - -#ifndef __PSFactoryBuffer_FWD_DEFINED__ -#define __PSFactoryBuffer_FWD_DEFINED__ -typedef struct PSFactoryBuffer PSFactoryBuffer; -#endif /* defined __PSFactoryBuffer_FWD_DEFINED__ */ - -#ifndef __MsiTransform_FWD_DEFINED__ -#define __MsiTransform_FWD_DEFINED__ -typedef struct MsiTransform MsiTransform; -#endif /* defined __MsiTransform_FWD_DEFINED__ */ - -#ifndef __MsiDatabase_FWD_DEFINED__ -#define __MsiDatabase_FWD_DEFINED__ -typedef struct MsiDatabase MsiDatabase; -#endif /* defined __MsiDatabase_FWD_DEFINED__ */ - -#ifndef __MsiPatch_FWD_DEFINED__ -#define __MsiPatch_FWD_DEFINED__ -typedef struct MsiPatch MsiPatch; -#endif /* defined __MsiPatch_FWD_DEFINED__ */ - -#ifndef __MsiServerX3_FWD_DEFINED__ -#define __MsiServerX3_FWD_DEFINED__ -typedef struct MsiServerX3 MsiServerX3; -#endif /* defined __MsiServerX3_FWD_DEFINED__ */ - -#ifndef __WineMsiRemoteCustomAction_FWD_DEFINED__ -#define __WineMsiRemoteCustomAction_FWD_DEFINED__ -typedef struct WineMsiRemoteCustomAction WineMsiRemoteCustomAction; -#endif /* defined __WineMsiRemoteCustomAction_FWD_DEFINED__ */ - -#ifndef __WineMsiRemotePackage_FWD_DEFINED__ -#define __WineMsiRemotePackage_FWD_DEFINED__ -typedef struct WineMsiRemotePackage WineMsiRemotePackage; -#endif /* defined __WineMsiRemotePackage_FWD_DEFINED__ */ - -#ifndef __Installer_FWD_DEFINED__ -#define __Installer_FWD_DEFINED__ -typedef interface Installer Installer; -#endif - -#ifndef __Record_FWD_DEFINED__ -#define __Record_FWD_DEFINED__ -typedef interface Record Record; -#endif - -#ifndef __StringList_FWD_DEFINED__ -#define __StringList_FWD_DEFINED__ -typedef interface StringList StringList; -#endif - -#ifndef __RecordList_FWD_DEFINED__ -#define __RecordList_FWD_DEFINED__ -typedef interface RecordList RecordList; -#endif - -#ifndef __UIPreview_FWD_DEFINED__ -#define __UIPreview_FWD_DEFINED__ -typedef interface UIPreview UIPreview; -#endif - -#ifndef __SummaryInfo_FWD_DEFINED__ -#define __SummaryInfo_FWD_DEFINED__ -typedef interface SummaryInfo SummaryInfo; -#endif - -#ifndef __View_FWD_DEFINED__ -#define __View_FWD_DEFINED__ -typedef interface View View; -#endif - -#ifndef __Database_FWD_DEFINED__ -#define __Database_FWD_DEFINED__ -typedef interface Database Database; -#endif - -#ifndef __Session_FWD_DEFINED__ -#define __Session_FWD_DEFINED__ -typedef interface Session Session; -#endif - -#ifndef __FeatureInfo_FWD_DEFINED__ -#define __FeatureInfo_FWD_DEFINED__ -typedef interface FeatureInfo FeatureInfo; -#endif - -#ifndef __Product_FWD_DEFINED__ -#define __Product_FWD_DEFINED__ -typedef interface Product Product; -#endif - -#ifndef __Patch_FWD_DEFINED__ -#define __Patch_FWD_DEFINED__ -typedef interface Patch Patch; -#endif - -#ifndef __MsiInstaller_FWD_DEFINED__ -#define __MsiInstaller_FWD_DEFINED__ -typedef struct MsiInstaller MsiInstaller; -#endif /* defined __MsiInstaller_FWD_DEFINED__ */ - -/* Headers for imported files */ - -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#if 0 -typedef ULONG MSIHANDLE; -typedef int INSTALLMESSAGE; -typedef int MSICONDITION; -typedef int MSIRUNMODE; -typedef int INSTALLSTATE; -#endif -/***************************************************************************** - * IWineMsiRemoteDatabase interface - */ -#ifndef __IWineMsiRemoteDatabase_INTERFACE_DEFINED__ -#define __IWineMsiRemoteDatabase_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IWineMsiRemoteDatabase, 0x7bde2046, 0xd03b, 0x4ffc, 0xb8,0x4c, 0xa0,0x98,0xf3,0x8c,0xff,0x0b); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("7bde2046-d03b-4ffc-b84c-a098f38cff0b") -IWineMsiRemoteDatabase : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE IsTablePersistent( - LPCWSTR table, - MSICONDITION *persistent) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetPrimaryKeys( - LPCWSTR table, - MSIHANDLE *keys) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSummaryInformation( - UINT updatecount, - MSIHANDLE *suminfo) = 0; - - virtual HRESULT STDMETHODCALLTYPE OpenView( - LPCWSTR query, - MSIHANDLE *view) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMsiHandle( - MSIHANDLE handle) = 0; - -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(IWineMsiRemoteDatabase, 0x7bde2046, 0xd03b, 0x4ffc, 0xb8,0x4c, 0xa0,0x98,0xf3,0x8c,0xff,0x0b) -#endif -#else -typedef struct IWineMsiRemoteDatabaseVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IWineMsiRemoteDatabase* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IWineMsiRemoteDatabase* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IWineMsiRemoteDatabase* This); - - /*** IWineMsiRemoteDatabase methods ***/ - HRESULT (STDMETHODCALLTYPE *IsTablePersistent)( - IWineMsiRemoteDatabase* This, - LPCWSTR table, - MSICONDITION *persistent); - - HRESULT (STDMETHODCALLTYPE *GetPrimaryKeys)( - IWineMsiRemoteDatabase* This, - LPCWSTR table, - MSIHANDLE *keys); - - HRESULT (STDMETHODCALLTYPE *GetSummaryInformation)( - IWineMsiRemoteDatabase* This, - UINT updatecount, - MSIHANDLE *suminfo); - - HRESULT (STDMETHODCALLTYPE *OpenView)( - IWineMsiRemoteDatabase* This, - LPCWSTR query, - MSIHANDLE *view); - - HRESULT (STDMETHODCALLTYPE *SetMsiHandle)( - IWineMsiRemoteDatabase* This, - MSIHANDLE handle); - - END_INTERFACE -} IWineMsiRemoteDatabaseVtbl; -interface IWineMsiRemoteDatabase { - CONST_VTBL IWineMsiRemoteDatabaseVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define IWineMsiRemoteDatabase_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define IWineMsiRemoteDatabase_AddRef(This) (This)->lpVtbl->AddRef(This) -#define IWineMsiRemoteDatabase_Release(This) (This)->lpVtbl->Release(This) -/*** IWineMsiRemoteDatabase methods ***/ -#define IWineMsiRemoteDatabase_IsTablePersistent(This,table,persistent) (This)->lpVtbl->IsTablePersistent(This,table,persistent) -#define IWineMsiRemoteDatabase_GetPrimaryKeys(This,table,keys) (This)->lpVtbl->GetPrimaryKeys(This,table,keys) -#define IWineMsiRemoteDatabase_GetSummaryInformation(This,updatecount,suminfo) (This)->lpVtbl->GetSummaryInformation(This,updatecount,suminfo) -#define IWineMsiRemoteDatabase_OpenView(This,query,view) (This)->lpVtbl->OpenView(This,query,view) -#define IWineMsiRemoteDatabase_SetMsiHandle(This,handle) (This)->lpVtbl->SetMsiHandle(This,handle) -#endif - -#endif - -HRESULT STDMETHODCALLTYPE IWineMsiRemoteDatabase_IsTablePersistent_Proxy( - IWineMsiRemoteDatabase* This, - LPCWSTR table, - MSICONDITION *persistent); -void __RPC_STUB IWineMsiRemoteDatabase_IsTablePersistent_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemoteDatabase_GetPrimaryKeys_Proxy( - IWineMsiRemoteDatabase* This, - LPCWSTR table, - MSIHANDLE *keys); -void __RPC_STUB IWineMsiRemoteDatabase_GetPrimaryKeys_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemoteDatabase_GetSummaryInformation_Proxy( - IWineMsiRemoteDatabase* This, - UINT updatecount, - MSIHANDLE *suminfo); -void __RPC_STUB IWineMsiRemoteDatabase_GetSummaryInformation_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemoteDatabase_OpenView_Proxy( - IWineMsiRemoteDatabase* This, - LPCWSTR query, - MSIHANDLE *view); -void __RPC_STUB IWineMsiRemoteDatabase_OpenView_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemoteDatabase_SetMsiHandle_Proxy( - IWineMsiRemoteDatabase* This, - MSIHANDLE handle); -void __RPC_STUB IWineMsiRemoteDatabase_SetMsiHandle_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IWineMsiRemoteDatabase_INTERFACE_DEFINED__ */ - -/***************************************************************************** - * IWineMsiRemotePackage interface - */ -#ifndef __IWineMsiRemotePackage_INTERFACE_DEFINED__ -#define __IWineMsiRemotePackage_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IWineMsiRemotePackage, 0x902b3592, 0x9d08, 0x4dfd, 0xa5,0x93, 0xd0,0x7c,0x52,0x54,0x64,0x21); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("902b3592-9d08-4dfd-a593-d07c52546421") -IWineMsiRemotePackage : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE SetMsiHandle( - MSIHANDLE handle) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetActiveDatabase( - MSIHANDLE *handle) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetProperty( - BSTR property, - BSTR value, - DWORD *size) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetProperty( - BSTR property, - BSTR value) = 0; - - virtual HRESULT STDMETHODCALLTYPE ProcessMessage( - INSTALLMESSAGE message, - MSIHANDLE record) = 0; - - virtual HRESULT STDMETHODCALLTYPE DoAction( - BSTR action) = 0; - - virtual HRESULT STDMETHODCALLTYPE Sequence( - BSTR table, - int sequence) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetTargetPath( - BSTR folder, - BSTR value, - DWORD *size) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetTargetPath( - BSTR folder, - BSTR value) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetSourcePath( - BSTR folder, - BSTR value, - DWORD *size) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetMode( - MSIRUNMODE mode, - BOOL *ret) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetMode( - MSIRUNMODE mode, - BOOL state) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFeatureState( - BSTR feature, - INSTALLSTATE *installed, - INSTALLSTATE *action) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetFeatureState( - BSTR feature, - INSTALLSTATE state) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetComponentState( - BSTR component, - INSTALLSTATE *installed, - INSTALLSTATE *action) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetComponentState( - BSTR component, - INSTALLSTATE state) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetLanguage( - LANGID *language) = 0; - - virtual HRESULT STDMETHODCALLTYPE SetInstallLevel( - int level) = 0; - - virtual HRESULT STDMETHODCALLTYPE FormatRecord( - MSIHANDLE record, - BSTR *value) = 0; - - virtual HRESULT STDMETHODCALLTYPE EvaluateCondition( - BSTR condition) = 0; - - virtual HRESULT STDMETHODCALLTYPE GetFeatureCost( - BSTR feature, - INT cost_tree, - INSTALLSTATE state, - INT *cost) = 0; - - virtual HRESULT STDMETHODCALLTYPE EnumComponentCosts( - BSTR component, - DWORD index, - INSTALLSTATE state, - BSTR drive, - DWORD *buflen, - INT *cost, - INT *temp) = 0; - -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(IWineMsiRemotePackage, 0x902b3592, 0x9d08, 0x4dfd, 0xa5,0x93, 0xd0,0x7c,0x52,0x54,0x64,0x21) -#endif -#else -typedef struct IWineMsiRemotePackageVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IWineMsiRemotePackage* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IWineMsiRemotePackage* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IWineMsiRemotePackage* This); - - /*** IWineMsiRemotePackage methods ***/ - HRESULT (STDMETHODCALLTYPE *SetMsiHandle)( - IWineMsiRemotePackage* This, - MSIHANDLE handle); - - HRESULT (STDMETHODCALLTYPE *GetActiveDatabase)( - IWineMsiRemotePackage* This, - MSIHANDLE *handle); - - HRESULT (STDMETHODCALLTYPE *GetProperty)( - IWineMsiRemotePackage* This, - BSTR property, - BSTR value, - DWORD *size); - - HRESULT (STDMETHODCALLTYPE *SetProperty)( - IWineMsiRemotePackage* This, - BSTR property, - BSTR value); - - HRESULT (STDMETHODCALLTYPE *ProcessMessage)( - IWineMsiRemotePackage* This, - INSTALLMESSAGE message, - MSIHANDLE record); - - HRESULT (STDMETHODCALLTYPE *DoAction)( - IWineMsiRemotePackage* This, - BSTR action); - - HRESULT (STDMETHODCALLTYPE *Sequence)( - IWineMsiRemotePackage* This, - BSTR table, - int sequence); - - HRESULT (STDMETHODCALLTYPE *GetTargetPath)( - IWineMsiRemotePackage* This, - BSTR folder, - BSTR value, - DWORD *size); - - HRESULT (STDMETHODCALLTYPE *SetTargetPath)( - IWineMsiRemotePackage* This, - BSTR folder, - BSTR value); - - HRESULT (STDMETHODCALLTYPE *GetSourcePath)( - IWineMsiRemotePackage* This, - BSTR folder, - BSTR value, - DWORD *size); - - HRESULT (STDMETHODCALLTYPE *GetMode)( - IWineMsiRemotePackage* This, - MSIRUNMODE mode, - BOOL *ret); - - HRESULT (STDMETHODCALLTYPE *SetMode)( - IWineMsiRemotePackage* This, - MSIRUNMODE mode, - BOOL state); - - HRESULT (STDMETHODCALLTYPE *GetFeatureState)( - IWineMsiRemotePackage* This, - BSTR feature, - INSTALLSTATE *installed, - INSTALLSTATE *action); - - HRESULT (STDMETHODCALLTYPE *SetFeatureState)( - IWineMsiRemotePackage* This, - BSTR feature, - INSTALLSTATE state); - - HRESULT (STDMETHODCALLTYPE *GetComponentState)( - IWineMsiRemotePackage* This, - BSTR component, - INSTALLSTATE *installed, - INSTALLSTATE *action); - - HRESULT (STDMETHODCALLTYPE *SetComponentState)( - IWineMsiRemotePackage* This, - BSTR component, - INSTALLSTATE state); - - HRESULT (STDMETHODCALLTYPE *GetLanguage)( - IWineMsiRemotePackage* This, - LANGID *language); - - HRESULT (STDMETHODCALLTYPE *SetInstallLevel)( - IWineMsiRemotePackage* This, - int level); - - HRESULT (STDMETHODCALLTYPE *FormatRecord)( - IWineMsiRemotePackage* This, - MSIHANDLE record, - BSTR *value); - - HRESULT (STDMETHODCALLTYPE *EvaluateCondition)( - IWineMsiRemotePackage* This, - BSTR condition); - - HRESULT (STDMETHODCALLTYPE *GetFeatureCost)( - IWineMsiRemotePackage* This, - BSTR feature, - INT cost_tree, - INSTALLSTATE state, - INT *cost); - - HRESULT (STDMETHODCALLTYPE *EnumComponentCosts)( - IWineMsiRemotePackage* This, - BSTR component, - DWORD index, - INSTALLSTATE state, - BSTR drive, - DWORD *buflen, - INT *cost, - INT *temp); - - END_INTERFACE -} IWineMsiRemotePackageVtbl; -interface IWineMsiRemotePackage { - CONST_VTBL IWineMsiRemotePackageVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define IWineMsiRemotePackage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define IWineMsiRemotePackage_AddRef(This) (This)->lpVtbl->AddRef(This) -#define IWineMsiRemotePackage_Release(This) (This)->lpVtbl->Release(This) -/*** IWineMsiRemotePackage methods ***/ -#define IWineMsiRemotePackage_SetMsiHandle(This,handle) (This)->lpVtbl->SetMsiHandle(This,handle) -#define IWineMsiRemotePackage_GetActiveDatabase(This,handle) (This)->lpVtbl->GetActiveDatabase(This,handle) -#define IWineMsiRemotePackage_GetProperty(This,property,value,size) (This)->lpVtbl->GetProperty(This,property,value,size) -#define IWineMsiRemotePackage_SetProperty(This,property,value) (This)->lpVtbl->SetProperty(This,property,value) -#define IWineMsiRemotePackage_ProcessMessage(This,message,record) (This)->lpVtbl->ProcessMessage(This,message,record) -#define IWineMsiRemotePackage_DoAction(This,action) (This)->lpVtbl->DoAction(This,action) -#define IWineMsiRemotePackage_Sequence(This,table,sequence) (This)->lpVtbl->Sequence(This,table,sequence) -#define IWineMsiRemotePackage_GetTargetPath(This,folder,value,size) (This)->lpVtbl->GetTargetPath(This,folder,value,size) -#define IWineMsiRemotePackage_SetTargetPath(This,folder,value) (This)->lpVtbl->SetTargetPath(This,folder,value) -#define IWineMsiRemotePackage_GetSourcePath(This,folder,value,size) (This)->lpVtbl->GetSourcePath(This,folder,value,size) -#define IWineMsiRemotePackage_GetMode(This,mode,ret) (This)->lpVtbl->GetMode(This,mode,ret) -#define IWineMsiRemotePackage_SetMode(This,mode,state) (This)->lpVtbl->SetMode(This,mode,state) -#define IWineMsiRemotePackage_GetFeatureState(This,feature,installed,action) (This)->lpVtbl->GetFeatureState(This,feature,installed,action) -#define IWineMsiRemotePackage_SetFeatureState(This,feature,state) (This)->lpVtbl->SetFeatureState(This,feature,state) -#define IWineMsiRemotePackage_GetComponentState(This,component,installed,action) (This)->lpVtbl->GetComponentState(This,component,installed,action) -#define IWineMsiRemotePackage_SetComponentState(This,component,state) (This)->lpVtbl->SetComponentState(This,component,state) -#define IWineMsiRemotePackage_GetLanguage(This,language) (This)->lpVtbl->GetLanguage(This,language) -#define IWineMsiRemotePackage_SetInstallLevel(This,level) (This)->lpVtbl->SetInstallLevel(This,level) -#define IWineMsiRemotePackage_FormatRecord(This,record,value) (This)->lpVtbl->FormatRecord(This,record,value) -#define IWineMsiRemotePackage_EvaluateCondition(This,condition) (This)->lpVtbl->EvaluateCondition(This,condition) -#define IWineMsiRemotePackage_GetFeatureCost(This,feature,cost_tree,state,cost) (This)->lpVtbl->GetFeatureCost(This,feature,cost_tree,state,cost) -#define IWineMsiRemotePackage_EnumComponentCosts(This,component,index,state,drive,buflen,cost,temp) (This)->lpVtbl->EnumComponentCosts(This,component,index,state,drive,buflen,cost,temp) -#endif - -#endif - -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetMsiHandle_Proxy( - IWineMsiRemotePackage* This, - MSIHANDLE handle); -void __RPC_STUB IWineMsiRemotePackage_SetMsiHandle_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetActiveDatabase_Proxy( - IWineMsiRemotePackage* This, - MSIHANDLE *handle); -void __RPC_STUB IWineMsiRemotePackage_GetActiveDatabase_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetProperty_Proxy( - IWineMsiRemotePackage* This, - BSTR property, - BSTR value, - DWORD *size); -void __RPC_STUB IWineMsiRemotePackage_GetProperty_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetProperty_Proxy( - IWineMsiRemotePackage* This, - BSTR property, - BSTR value); -void __RPC_STUB IWineMsiRemotePackage_SetProperty_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_ProcessMessage_Proxy( - IWineMsiRemotePackage* This, - INSTALLMESSAGE message, - MSIHANDLE record); -void __RPC_STUB IWineMsiRemotePackage_ProcessMessage_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_DoAction_Proxy( - IWineMsiRemotePackage* This, - BSTR action); -void __RPC_STUB IWineMsiRemotePackage_DoAction_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_Sequence_Proxy( - IWineMsiRemotePackage* This, - BSTR table, - int sequence); -void __RPC_STUB IWineMsiRemotePackage_Sequence_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetTargetPath_Proxy( - IWineMsiRemotePackage* This, - BSTR folder, - BSTR value, - DWORD *size); -void __RPC_STUB IWineMsiRemotePackage_GetTargetPath_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetTargetPath_Proxy( - IWineMsiRemotePackage* This, - BSTR folder, - BSTR value); -void __RPC_STUB IWineMsiRemotePackage_SetTargetPath_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetSourcePath_Proxy( - IWineMsiRemotePackage* This, - BSTR folder, - BSTR value, - DWORD *size); -void __RPC_STUB IWineMsiRemotePackage_GetSourcePath_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetMode_Proxy( - IWineMsiRemotePackage* This, - MSIRUNMODE mode, - BOOL *ret); -void __RPC_STUB IWineMsiRemotePackage_GetMode_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetMode_Proxy( - IWineMsiRemotePackage* This, - MSIRUNMODE mode, - BOOL state); -void __RPC_STUB IWineMsiRemotePackage_SetMode_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetFeatureState_Proxy( - IWineMsiRemotePackage* This, - BSTR feature, - INSTALLSTATE *installed, - INSTALLSTATE *action); -void __RPC_STUB IWineMsiRemotePackage_GetFeatureState_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetFeatureState_Proxy( - IWineMsiRemotePackage* This, - BSTR feature, - INSTALLSTATE state); -void __RPC_STUB IWineMsiRemotePackage_SetFeatureState_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetComponentState_Proxy( - IWineMsiRemotePackage* This, - BSTR component, - INSTALLSTATE *installed, - INSTALLSTATE *action); -void __RPC_STUB IWineMsiRemotePackage_GetComponentState_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetComponentState_Proxy( - IWineMsiRemotePackage* This, - BSTR component, - INSTALLSTATE state); -void __RPC_STUB IWineMsiRemotePackage_SetComponentState_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetLanguage_Proxy( - IWineMsiRemotePackage* This, - LANGID *language); -void __RPC_STUB IWineMsiRemotePackage_GetLanguage_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_SetInstallLevel_Proxy( - IWineMsiRemotePackage* This, - int level); -void __RPC_STUB IWineMsiRemotePackage_SetInstallLevel_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_FormatRecord_Proxy( - IWineMsiRemotePackage* This, - MSIHANDLE record, - BSTR *value); -void __RPC_STUB IWineMsiRemotePackage_FormatRecord_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_EvaluateCondition_Proxy( - IWineMsiRemotePackage* This, - BSTR condition); -void __RPC_STUB IWineMsiRemotePackage_EvaluateCondition_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_GetFeatureCost_Proxy( - IWineMsiRemotePackage* This, - BSTR feature, - INT cost_tree, - INSTALLSTATE state, - INT *cost); -void __RPC_STUB IWineMsiRemotePackage_GetFeatureCost_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); -HRESULT STDMETHODCALLTYPE IWineMsiRemotePackage_EnumComponentCosts_Proxy( - IWineMsiRemotePackage* This, - BSTR component, - DWORD index, - INSTALLSTATE state, - BSTR drive, - DWORD *buflen, - INT *cost, - INT *temp); -void __RPC_STUB IWineMsiRemotePackage_EnumComponentCosts_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IWineMsiRemotePackage_INTERFACE_DEFINED__ */ - -/***************************************************************************** - * IWineMsiRemoteCustomAction interface - */ -#ifndef __IWineMsiRemoteCustomAction_INTERFACE_DEFINED__ -#define __IWineMsiRemoteCustomAction_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IWineMsiRemoteCustomAction, 0x56d58b64, 0x8780, 0x4c22, 0xa8,0xbc, 0x8b,0x0b,0x29,0xe4,0xa9,0xf8); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("56d58b64-8780-4c22-a8bc-8b0b29e4a9f8") -IWineMsiRemoteCustomAction : public IUnknown -{ - virtual HRESULT STDMETHODCALLTYPE GetActionInfo( - LPCGUID guid, - INT *type, - MSIHANDLE *handle, - BSTR *dllname, - BSTR *function, - IWineMsiRemotePackage **package) = 0; - -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(IWineMsiRemoteCustomAction, 0x56d58b64, 0x8780, 0x4c22, 0xa8,0xbc, 0x8b,0x0b,0x29,0xe4,0xa9,0xf8) -#endif -#else -typedef struct IWineMsiRemoteCustomActionVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IWineMsiRemoteCustomAction* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IWineMsiRemoteCustomAction* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IWineMsiRemoteCustomAction* This); - - /*** IWineMsiRemoteCustomAction methods ***/ - HRESULT (STDMETHODCALLTYPE *GetActionInfo)( - IWineMsiRemoteCustomAction* This, - LPCGUID guid, - INT *type, - MSIHANDLE *handle, - BSTR *dllname, - BSTR *function, - IWineMsiRemotePackage **package); - - END_INTERFACE -} IWineMsiRemoteCustomActionVtbl; -interface IWineMsiRemoteCustomAction { - CONST_VTBL IWineMsiRemoteCustomActionVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define IWineMsiRemoteCustomAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define IWineMsiRemoteCustomAction_AddRef(This) (This)->lpVtbl->AddRef(This) -#define IWineMsiRemoteCustomAction_Release(This) (This)->lpVtbl->Release(This) -/*** IWineMsiRemoteCustomAction methods ***/ -#define IWineMsiRemoteCustomAction_GetActionInfo(This,guid,type,handle,dllname,function,package) (This)->lpVtbl->GetActionInfo(This,guid,type,handle,dllname,function,package) -#endif - -#endif - -HRESULT STDMETHODCALLTYPE IWineMsiRemoteCustomAction_GetActionInfo_Proxy( - IWineMsiRemoteCustomAction* This, - LPCGUID guid, - INT *type, - MSIHANDLE *handle, - BSTR *dllname, - BSTR *function, - IWineMsiRemotePackage **package); -void __RPC_STUB IWineMsiRemoteCustomAction_GetActionInfo_Stub( - IRpcStubBuffer* This, - IRpcChannelBuffer* pRpcChannelBuffer, - PRPC_MESSAGE pRpcMessage, - DWORD* pdwStubPhase); - -#endif /* __IWineMsiRemoteCustomAction_INTERFACE_DEFINED__ */ - -/***************************************************************************** - * IMsiServer interface - */ -#ifndef __IMsiServer_INTERFACE_DEFINED__ -#define __IMsiServer_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IMsiServer, 0x000c101c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c101c-0000-0000-c000-000000000046") -IMsiServer : public IUnknown -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(IMsiServer, 0x000c101c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct IMsiServerVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IMsiServer* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IMsiServer* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IMsiServer* This); - - END_INTERFACE -} IMsiServerVtbl; -interface IMsiServer { - CONST_VTBL IMsiServerVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define IMsiServer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define IMsiServer_AddRef(This) (This)->lpVtbl->AddRef(This) -#define IMsiServer_Release(This) (This)->lpVtbl->Release(This) -#endif - -#endif - - -#endif /* __IMsiServer_INTERFACE_DEFINED__ */ - -/***************************************************************************** - * IMsiMessage interface - */ -#ifndef __IMsiMessage_INTERFACE_DEFINED__ -#define __IMsiMessage_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IMsiMessage, 0x000c101d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c101d-0000-0000-c000-000000000046") -IMsiMessage : public IUnknown -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(IMsiMessage, 0x000c101d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct IMsiMessageVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IMsiMessage* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IMsiMessage* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IMsiMessage* This); - - END_INTERFACE -} IMsiMessageVtbl; -interface IMsiMessage { - CONST_VTBL IMsiMessageVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define IMsiMessage_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define IMsiMessage_AddRef(This) (This)->lpVtbl->AddRef(This) -#define IMsiMessage_Release(This) (This)->lpVtbl->Release(This) -#endif - -#endif - - -#endif /* __IMsiMessage_INTERFACE_DEFINED__ */ - -/***************************************************************************** - * IMsiCustomAction interface - */ -#ifndef __IMsiCustomAction_INTERFACE_DEFINED__ -#define __IMsiCustomAction_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IMsiCustomAction, 0x000c1025, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c1025-0000-0000-c000-000000000046") -IMsiCustomAction : public IUnknown -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(IMsiCustomAction, 0x000c1025, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct IMsiCustomActionVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IMsiCustomAction* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IMsiCustomAction* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IMsiCustomAction* This); - - END_INTERFACE -} IMsiCustomActionVtbl; -interface IMsiCustomAction { - CONST_VTBL IMsiCustomActionVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define IMsiCustomAction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define IMsiCustomAction_AddRef(This) (This)->lpVtbl->AddRef(This) -#define IMsiCustomAction_Release(This) (This)->lpVtbl->Release(This) -#endif - -#endif - - -#endif /* __IMsiCustomAction_INTERFACE_DEFINED__ */ - -/***************************************************************************** - * IMsiRemoteAPI interface - */ -#ifndef __IMsiRemoteAPI_INTERFACE_DEFINED__ -#define __IMsiRemoteAPI_INTERFACE_DEFINED__ - -DEFINE_GUID(IID_IMsiRemoteAPI, 0x000c1033, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c1033-0000-0000-c000-000000000046") -IMsiRemoteAPI : public IUnknown -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(IMsiRemoteAPI, 0x000c1033, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct IMsiRemoteAPIVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - IMsiRemoteAPI* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - IMsiRemoteAPI* This); - - ULONG (STDMETHODCALLTYPE *Release)( - IMsiRemoteAPI* This); - - END_INTERFACE -} IMsiRemoteAPIVtbl; -interface IMsiRemoteAPI { - CONST_VTBL IMsiRemoteAPIVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define IMsiRemoteAPI_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define IMsiRemoteAPI_AddRef(This) (This)->lpVtbl->AddRef(This) -#define IMsiRemoteAPI_Release(This) (This)->lpVtbl->Release(This) -#endif - -#endif - - -#endif /* __IMsiRemoteAPI_INTERFACE_DEFINED__ */ - -/***************************************************************************** - * MsiServer coclass - */ - -DEFINE_GUID(CLSID_MsiServer, 0x000c101c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); - -#ifdef __cplusplus -class DECLSPEC_UUID("000c101c-0000-0000-c000-000000000046") MsiServer; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(MsiServer, 0x000c101c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#endif - -/***************************************************************************** - * MsiServerMessage coclass - */ - -DEFINE_GUID(CLSID_MsiServerMessage, 0x000c101d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); - -#ifdef __cplusplus -class DECLSPEC_UUID("000c101d-0000-0000-c000-000000000046") MsiServerMessage; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(MsiServerMessage, 0x000c101d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#endif - -/***************************************************************************** - * PSFactoryBuffer coclass - */ - -DEFINE_GUID(CLSID_PSFactoryBuffer, 0x000c103e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); - -#ifdef __cplusplus -class DECLSPEC_UUID("000c103e-0000-0000-c000-000000000046") PSFactoryBuffer; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(PSFactoryBuffer, 0x000c103e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#endif - -/***************************************************************************** - * MsiTransform coclass - */ - -DEFINE_GUID(CLSID_MsiTransform, 0x000c1082, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); - -#ifdef __cplusplus -class DECLSPEC_UUID("000c1082-0000-0000-c000-000000000046") MsiTransform; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(MsiTransform, 0x000c1082, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#endif - -/***************************************************************************** - * MsiDatabase coclass - */ - -DEFINE_GUID(CLSID_MsiDatabase, 0x000c1084, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); - -#ifdef __cplusplus -class DECLSPEC_UUID("000c1084-0000-0000-c000-000000000046") MsiDatabase; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(MsiDatabase, 0x000c1084, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#endif - -/***************************************************************************** - * MsiPatch coclass - */ - -DEFINE_GUID(CLSID_MsiPatch, 0x000c1086, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); - -#ifdef __cplusplus -class DECLSPEC_UUID("000c1086-0000-0000-c000-000000000046") MsiPatch; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(MsiPatch, 0x000c1086, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#endif - -/***************************************************************************** - * MsiServerX3 coclass - */ - -DEFINE_GUID(CLSID_MsiServerX3, 0x000c1094, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); - -#ifdef __cplusplus -class DECLSPEC_UUID("000c1094-0000-0000-c000-000000000046") MsiServerX3; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(MsiServerX3, 0x000c1094, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#endif - -/***************************************************************************** - * WineMsiRemoteCustomAction coclass - */ - -DEFINE_GUID(CLSID_WineMsiRemoteCustomAction, 0xba26e6fa, 0x4f27, 0x4f56, 0x95,0x3a, 0x3f,0x90,0x27,0x20,0x18,0xaa); - -#ifdef __cplusplus -class DECLSPEC_UUID("ba26e6fa-4f27-4f56-953a-3f90272018aa") WineMsiRemoteCustomAction; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(WineMsiRemoteCustomAction, 0xba26e6fa, 0x4f27, 0x4f56, 0x95,0x3a, 0x3f,0x90,0x27,0x20,0x18,0xaa) -#endif -#endif - -/***************************************************************************** - * WineMsiRemotePackage coclass - */ - -DEFINE_GUID(CLSID_WineMsiRemotePackage, 0x902b3592, 0x9d08, 0x4dfd, 0xa5,0x93, 0xd0,0x7c,0x52,0x54,0x64,0x21); - -#ifdef __cplusplus -class DECLSPEC_UUID("902b3592-9d08-4dfd-a593-d07c52546421") WineMsiRemotePackage; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(WineMsiRemotePackage, 0x902b3592, 0x9d08, 0x4dfd, 0xa5,0x93, 0xd0,0x7c,0x52,0x54,0x64,0x21) -#endif -#endif - - -DEFINE_GUID(LIBID_WindowsInstaller, 0x000c1092, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); - -#ifndef __Installer_FWD_DEFINED__ -#define __Installer_FWD_DEFINED__ -typedef interface Installer Installer; -#endif - -#ifndef __Record_FWD_DEFINED__ -#define __Record_FWD_DEFINED__ -typedef interface Record Record; -#endif - -#ifndef __Session_FWD_DEFINED__ -#define __Session_FWD_DEFINED__ -typedef interface Session Session; -#endif - -#ifndef __Database_FWD_DEFINED__ -#define __Database_FWD_DEFINED__ -typedef interface Database Database; -#endif - -#ifndef __SummaryInfo_FWD_DEFINED__ -#define __SummaryInfo_FWD_DEFINED__ -typedef interface SummaryInfo SummaryInfo; -#endif - -#ifndef __View_FWD_DEFINED__ -#define __View_FWD_DEFINED__ -typedef interface View View; -#endif - -#ifndef __UIPreview_FWD_DEFINED__ -#define __UIPreview_FWD_DEFINED__ -typedef interface UIPreview UIPreview; -#endif - -#ifndef __FeatureInfo_FWD_DEFINED__ -#define __FeatureInfo_FWD_DEFINED__ -typedef interface FeatureInfo FeatureInfo; -#endif - -#ifndef __RecordList_FWD_DEFINED__ -#define __RecordList_FWD_DEFINED__ -typedef interface RecordList RecordList; -#endif - -#ifndef __StringList_FWD_DEFINED__ -#define __StringList_FWD_DEFINED__ -typedef interface StringList StringList; -#endif - -#ifndef __Product_FWD_DEFINED__ -#define __Product_FWD_DEFINED__ -typedef interface Product Product; -#endif - -#ifndef __Patch_FWD_DEFINED__ -#define __Patch_FWD_DEFINED__ -typedef interface Patch Patch; -#endif - -typedef enum __WIDL_msiserver_generated_name_00000000 { - msiInstallStateNotUsed = -7, - msiInstallStateBadConfig = -6, - msiInstallStateIncomplete = -5, - msiInstallStateSourceAbsent = -4, - msiInstallStateInvalidArg = -2, - msiInstallStateUnknown = -1, - msiInstallStateBroken = 0, - msiInstallStateAdvertised = 1, - msiInstallStateRemoved = 1, - msiInstallStateAbsent = 2, - msiInstallStateLocal = 3, - msiInstallStateSource = 4, - msiInstallStateDefault = 5 -} MsiInstallState; -typedef enum __WIDL_msiserver_generated_name_00000001 { - msiOpenDatabaseModeReadOnly = 0, - msiOpenDatabaseModeTransact = 1, - msiOpenDatabaseModeDirect = 2, - msiOpenDatabaseModeCreate = 3, - msiOpenDatabaseModeCreateDirect = 4, - msiOpenDatabaseModePatchFile = 32 -} MsiOpenDatabaseMode; -typedef enum __WIDL_msiserver_generated_name_00000002 { - msiUILevelNoChange = 0, - msiUILevelDefault = 1, - msiUILevelNone = 2, - msiUILevelBasic = 3, - msiUILevelReduced = 4, - msiUILevelFull = 5, - msiUILevelHideCancel = 32, - msiUILevelProgressOnly = 64, - msiUILevelEndDialog = 128, - msiUILevelSourceResOnly = 256 -} MsiUILevel; -/***************************************************************************** - * Installer dispinterface - */ -#ifndef __Installer_DISPINTERFACE_DEFINED__ -#define __Installer_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_Installer, 0x000c1090, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c1090-0000-0000-c000-000000000046") -Installer : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(Installer, 0x000c1090, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct InstallerVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - Installer* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - Installer* This); - - ULONG (STDMETHODCALLTYPE *Release)( - Installer* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - Installer* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - Installer* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - Installer* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - Installer* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} InstallerVtbl; -interface Installer { - CONST_VTBL InstallerVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define Installer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define Installer_AddRef(This) (This)->lpVtbl->AddRef(This) -#define Installer_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define Installer_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define Installer_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define Installer_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define Installer_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __Installer_DISPINTERFACE_DEFINED__ */ - -/***************************************************************************** - * Record dispinterface - */ -#ifndef __Record_DISPINTERFACE_DEFINED__ -#define __Record_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_Record, 0x000c1093, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c1093-0000-0000-c000-000000000046") -Record : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(Record, 0x000c1093, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct RecordVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - Record* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - Record* This); - - ULONG (STDMETHODCALLTYPE *Release)( - Record* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - Record* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - Record* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - Record* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - Record* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} RecordVtbl; -interface Record { - CONST_VTBL RecordVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define Record_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define Record_AddRef(This) (This)->lpVtbl->AddRef(This) -#define Record_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define Record_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define Record_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define Record_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define Record_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __Record_DISPINTERFACE_DEFINED__ */ - -/***************************************************************************** - * StringList dispinterface - */ -#ifndef __StringList_DISPINTERFACE_DEFINED__ -#define __StringList_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_StringList, 0x000c1095, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c1095-0000-0000-c000-000000000046") -StringList : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(StringList, 0x000c1095, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct StringListVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - StringList* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - StringList* This); - - ULONG (STDMETHODCALLTYPE *Release)( - StringList* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - StringList* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - StringList* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - StringList* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - StringList* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} StringListVtbl; -interface StringList { - CONST_VTBL StringListVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define StringList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define StringList_AddRef(This) (This)->lpVtbl->AddRef(This) -#define StringList_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define StringList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define StringList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define StringList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define StringList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __StringList_DISPINTERFACE_DEFINED__ */ - -/***************************************************************************** - * RecordList dispinterface - */ -#ifndef __RecordList_DISPINTERFACE_DEFINED__ -#define __RecordList_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_RecordList, 0x000c1096, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c1096-0000-0000-c000-000000000046") -RecordList : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(RecordList, 0x000c1096, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct RecordListVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - RecordList* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - RecordList* This); - - ULONG (STDMETHODCALLTYPE *Release)( - RecordList* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - RecordList* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - RecordList* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - RecordList* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - RecordList* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} RecordListVtbl; -interface RecordList { - CONST_VTBL RecordListVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define RecordList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define RecordList_AddRef(This) (This)->lpVtbl->AddRef(This) -#define RecordList_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define RecordList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define RecordList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define RecordList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define RecordList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __RecordList_DISPINTERFACE_DEFINED__ */ - -/***************************************************************************** - * UIPreview dispinterface - */ -#ifndef __UIPreview_DISPINTERFACE_DEFINED__ -#define __UIPreview_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_UIPreview, 0x000c109a, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c109a-0000-0000-c000-000000000046") -UIPreview : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(UIPreview, 0x000c109a, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct UIPreviewVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - UIPreview* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - UIPreview* This); - - ULONG (STDMETHODCALLTYPE *Release)( - UIPreview* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - UIPreview* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - UIPreview* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - UIPreview* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - UIPreview* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} UIPreviewVtbl; -interface UIPreview { - CONST_VTBL UIPreviewVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define UIPreview_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define UIPreview_AddRef(This) (This)->lpVtbl->AddRef(This) -#define UIPreview_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define UIPreview_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define UIPreview_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define UIPreview_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define UIPreview_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __UIPreview_DISPINTERFACE_DEFINED__ */ - -/***************************************************************************** - * SummaryInfo dispinterface - */ -#ifndef __SummaryInfo_DISPINTERFACE_DEFINED__ -#define __SummaryInfo_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_SummaryInfo, 0x000c109b, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c109b-0000-0000-c000-000000000046") -SummaryInfo : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(SummaryInfo, 0x000c109b, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct SummaryInfoVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - SummaryInfo* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - SummaryInfo* This); - - ULONG (STDMETHODCALLTYPE *Release)( - SummaryInfo* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - SummaryInfo* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - SummaryInfo* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - SummaryInfo* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - SummaryInfo* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} SummaryInfoVtbl; -interface SummaryInfo { - CONST_VTBL SummaryInfoVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define SummaryInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define SummaryInfo_AddRef(This) (This)->lpVtbl->AddRef(This) -#define SummaryInfo_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define SummaryInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define SummaryInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define SummaryInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define SummaryInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __SummaryInfo_DISPINTERFACE_DEFINED__ */ - -typedef enum __WIDL_msiserver_generated_name_00000003 { - msiViewModifySeek = -1, - msiViewModifyRefresh = 0, - msiViewModifyInsert = 1, - msiViewModifyUpdate = 2, - msiViewModifyAssign = 3, - msiViewModifyReplace = 4, - msiViewModifyMerge = 5, - msiViewModifyDelete = 6, - msiViewModifyInsertTemporary = 7, - msiViewModifyValidate = 8, - msiViewModifyValidateNew = 9, - msiViewModifyValidateField = 10, - msiViewModifyValidateDelete = 11 -} _MsiViewModify; -/***************************************************************************** - * View dispinterface - */ -#ifndef __View_DISPINTERFACE_DEFINED__ -#define __View_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_View, 0x000c109c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c109c-0000-0000-c000-000000000046") -View : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(View, 0x000c109c, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct ViewVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - View* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - View* This); - - ULONG (STDMETHODCALLTYPE *Release)( - View* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - View* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - View* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - View* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - View* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} ViewVtbl; -interface View { - CONST_VTBL ViewVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define View_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define View_AddRef(This) (This)->lpVtbl->AddRef(This) -#define View_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define View_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define View_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define View_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define View_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __View_DISPINTERFACE_DEFINED__ */ - -/***************************************************************************** - * Database dispinterface - */ -#ifndef __Database_DISPINTERFACE_DEFINED__ -#define __Database_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_Database, 0x000c109d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c109d-0000-0000-c000-000000000046") -Database : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(Database, 0x000c109d, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct DatabaseVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - Database* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - Database* This); - - ULONG (STDMETHODCALLTYPE *Release)( - Database* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - Database* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - Database* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - Database* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - Database* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} DatabaseVtbl; -interface Database { - CONST_VTBL DatabaseVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define Database_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define Database_AddRef(This) (This)->lpVtbl->AddRef(This) -#define Database_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define Database_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define Database_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define Database_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define Database_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __Database_DISPINTERFACE_DEFINED__ */ - -typedef enum __WIDL_msiserver_generated_name_00000004 { - msiDoActionStatusNoAction = 0, - msiDoActionStatusSuccess = 1, - msiDoActionStatusUserExit = 2, - msiDoActionStatusFailure = 3, - msiDoActionStatusSuspend = 4, - msiDoActionStatusFinished = 5, - msiDoActionStatusWrongState = 6, - msiDoActionStatusBadActionData = 7 -} MsiDoActionStatus; -typedef enum __WIDL_msiserver_generated_name_00000005 { - msiRunModeAdmin = 0, - msiRunModeAdvertise = 1, - msiRunModeMaintenance = 2, - msiRunModeRollbackEnabled = 3, - msiRunModeLogEnabled = 4, - msiRunModeOperations = 5, - msiRunModeRebootAtEnd = 6, - msiRunModeRebootNow = 7, - msiRunModeCabinet = 8, - msiRunModeSourceShortNames = 9, - msiRunModeTargetShortNames = 10, - msiRunModeWindows9x = 12, - msiRunModeZawEnabled = 13, - msiRunModeScheduled = 16, - msiRunModeRollback = 17, - msiRunModeCommit = 18 -} MsiRunMode; -typedef enum __WIDL_msiserver_generated_name_00000006 { - msiEvaluateConditionFalse = 0, - msiEvaluateConditionTrue = 1, - msiEvaluateConditionNone = 2, - msiEvaluateConditionError = 3 -} _MsiEvaluateCondition; -typedef enum __WIDL_msiserver_generated_name_00000007 { - msiMessageStatusError = -1, - msiMessageStatusNone = 0, - msiMessageStatusOk = 1, - msiMessageStatusCancel = 2, - msiMessageStatusAbort = 3, - msiMessageStatusRetry = 4, - msiMessageStatusIgnore = 5, - msiMessageStatusYes = 6, - msiMessageStatusNo = 7 -} MsiMessageStatus; -typedef enum __WIDL_msiserver_generated_name_00000008 { - msiMessageTypeFatalExit = 0, - msiMessageTypeError = 0x1000000, - msiMessageTypeWarning = 0x2000000, - msiMessageTypeUser = 0x3000000, - msiMessageTypeInfo = 0x4000000, - msiMessageTypeFilesInUse = 0x5000000, - msiMessageTypeResolveSource = 0x6000000, - msiMessageTypeOutOfDiskSpace = 0x7000000, - msiMessageTypeActionStart = 0x8000000, - msiMessageTypeActionData = 0x9000000, - msiMessageTypeProgress = 0xa000000, - msiMessageTypeCommonData = 0xb000000, - msiMessageTypeOk = 0, - msiMessageTypeOkCancel = 1, - msiMessageTypeAbortRetryIgnore = 2, - msiMessageTypeYesNoCancel = 3, - msiMessageTypeYesNo = 4, - msiMessageTypeRetryCancel = 5, - msiMessageTypeDefault1 = 0, - msiMessageTypeDefault2 = 256, - msiMessageTypeDefault3 = 512 -} MsiMessageType; -/***************************************************************************** - * Session dispinterface - */ -#ifndef __Session_DISPINTERFACE_DEFINED__ -#define __Session_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_Session, 0x000c109e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c109e-0000-0000-c000-000000000046") -Session : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(Session, 0x000c109e, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct SessionVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - Session* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - Session* This); - - ULONG (STDMETHODCALLTYPE *Release)( - Session* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - Session* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - Session* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - Session* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - Session* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} SessionVtbl; -interface Session { - CONST_VTBL SessionVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define Session_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define Session_AddRef(This) (This)->lpVtbl->AddRef(This) -#define Session_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define Session_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define Session_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define Session_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define Session_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __Session_DISPINTERFACE_DEFINED__ */ - -/***************************************************************************** - * FeatureInfo dispinterface - */ -#ifndef __FeatureInfo_DISPINTERFACE_DEFINED__ -#define __FeatureInfo_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_FeatureInfo, 0x000c109f, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c109f-0000-0000-c000-000000000046") -FeatureInfo : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(FeatureInfo, 0x000c109f, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct FeatureInfoVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - FeatureInfo* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - FeatureInfo* This); - - ULONG (STDMETHODCALLTYPE *Release)( - FeatureInfo* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - FeatureInfo* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - FeatureInfo* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - FeatureInfo* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - FeatureInfo* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} FeatureInfoVtbl; -interface FeatureInfo { - CONST_VTBL FeatureInfoVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define FeatureInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define FeatureInfo_AddRef(This) (This)->lpVtbl->AddRef(This) -#define FeatureInfo_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define FeatureInfo_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define FeatureInfo_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define FeatureInfo_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define FeatureInfo_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __FeatureInfo_DISPINTERFACE_DEFINED__ */ - -/***************************************************************************** - * Product dispinterface - */ -#ifndef __Product_DISPINTERFACE_DEFINED__ -#define __Product_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_Product, 0x000c10a0, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c10a0-0000-0000-c000-000000000046") -Product : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(Product, 0x000c10a0, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct ProductVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - Product* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - Product* This); - - ULONG (STDMETHODCALLTYPE *Release)( - Product* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - Product* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - Product* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - Product* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - Product* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} ProductVtbl; -interface Product { - CONST_VTBL ProductVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define Product_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define Product_AddRef(This) (This)->lpVtbl->AddRef(This) -#define Product_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define Product_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define Product_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define Product_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define Product_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __Product_DISPINTERFACE_DEFINED__ */ - -/***************************************************************************** - * Patch dispinterface - */ -#ifndef __Patch_DISPINTERFACE_DEFINED__ -#define __Patch_DISPINTERFACE_DEFINED__ - -DEFINE_GUID(DIID_Patch, 0x000c10a1, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); -#if defined(__cplusplus) && !defined(CINTERFACE) -MIDL_INTERFACE("000c10a1-0000-0000-c000-000000000046") -Patch : public IDispatch -{ -}; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(Patch, 0x000c10a1, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#else -typedef struct PatchVtbl { - BEGIN_INTERFACE - - /*** IUnknown methods ***/ - HRESULT (STDMETHODCALLTYPE *QueryInterface)( - Patch* This, - REFIID riid, - void **ppvObject); - - ULONG (STDMETHODCALLTYPE *AddRef)( - Patch* This); - - ULONG (STDMETHODCALLTYPE *Release)( - Patch* This); - - /*** IDispatch methods ***/ - HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)( - Patch* This, - UINT *pctinfo); - - HRESULT (STDMETHODCALLTYPE *GetTypeInfo)( - Patch* This, - UINT iTInfo, - LCID lcid, - ITypeInfo **ppTInfo); - - HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)( - Patch* This, - REFIID riid, - LPOLESTR *rgszNames, - UINT cNames, - LCID lcid, - DISPID *rgDispId); - - HRESULT (STDMETHODCALLTYPE *Invoke)( - Patch* This, - DISPID dispIdMember, - REFIID riid, - LCID lcid, - WORD wFlags, - DISPPARAMS *pDispParams, - VARIANT *pVarResult, - EXCEPINFO *pExcepInfo, - UINT *puArgErr); - - END_INTERFACE -} PatchVtbl; -interface Patch { - CONST_VTBL PatchVtbl* lpVtbl; -}; - -#ifdef COBJMACROS -/*** IUnknown methods ***/ -#define Patch_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject) -#define Patch_AddRef(This) (This)->lpVtbl->AddRef(This) -#define Patch_Release(This) (This)->lpVtbl->Release(This) -/*** IDispatch methods ***/ -#define Patch_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo) -#define Patch_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo) -#define Patch_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) -#define Patch_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) -#endif - -#endif - -#endif /* __Patch_DISPINTERFACE_DEFINED__ */ - -/***************************************************************************** - * MsiInstaller coclass - */ - -DEFINE_GUID(CLSID_MsiInstaller, 0x000c1090, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46); - -#ifdef __cplusplus -class DECLSPEC_UUID("000c1090-0000-0000-c000-000000000046") MsiInstaller; -#ifdef __CRT_UUID_DECL -__CRT_UUID_DECL(MsiInstaller, 0x000c1090, 0x0000, 0x0000, 0xc0,0x00, 0x00,0x00,0x00,0x00,0x00,0x46) -#endif -#endif - -/* Begin additional prototypes for all interfaces */ - -ULONG __RPC_USER BSTR_UserSize (ULONG *, ULONG, BSTR *); -unsigned char * __RPC_USER BSTR_UserMarshal (ULONG *, unsigned char *, BSTR *); -unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *); -void __RPC_USER BSTR_UserFree (ULONG *, BSTR *); - -/* End additional prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __WIDL_MSISERVER_H */ diff --git a/reactos/media/doc/README.WINE b/reactos/media/doc/README.WINE index 13276b2d4cf..91be0fe32dd 100644 --- a/reactos/media/doc/README.WINE +++ b/reactos/media/doc/README.WINE @@ -102,7 +102,7 @@ reactos/dll/win32/msg711.acm # Synced to Wine-1.3.37 reactos/dll/win32/msgsm32.acm # Synced to Wine-1.3.37 reactos/dll/win32/mshtml # Autosync reactos/dll/win32/mshtml.tlb # Autosync -reactos/dll/win32/msi # Autosync +reactos/dll/win32/msi # Synced to Wine-1.3.37 reactos/dll/win32/msimg32 # Synced to Wine-1.3.37 reactos/dll/win32/msimtf # Synced to Wine-1.3.37 reactos/dll/win32/msisip # Synced to Wine-1.3.37 From 7a516cc7e6d06f6ce67bf22256feb7ecd3d2a3f7 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 6 Feb 2012 20:43:38 +0000 Subject: [PATCH 247/289] [MSI_WINETEST] * Sync to Wine 1.3.37. This partially reverts r55047. svn path=/trunk/; revision=55470 --- rostests/winetests/msi/automation.c | 168 +++++++++++++++++----------- rostests/winetests/msi/package.c | 93 ++------------- 2 files changed, 111 insertions(+), 150 deletions(-) diff --git a/rostests/winetests/msi/automation.c b/rostests/winetests/msi/automation.c index 8ae18bd9511..f062368dc74 100644 --- a/rostests/winetests/msi/automation.c +++ b/rostests/winetests/msi/automation.c @@ -489,79 +489,113 @@ static DISPID get_dispid( IDispatch *disp, const char *name ) return id; } -typedef struct { - DISPID did; - const char *name; - BOOL todo; -} get_did_t; - -static const get_did_t get_did_data[] = { - { 1, "CreateRecord" }, - { 2, "OpenPackage" }, - { 3, "OpenProduct" }, - { 4, "OpenDatabase" }, - { 5, "SummaryInformation" }, - { 6, "UILevel" }, - { 7, "EnableLog" }, - { 8, "InstallProduct" }, - { 9, "Version" }, - { 10, "LastErrorRecord" }, - { 11, "RegistryValue" }, - { 12, "Environment" }, - { 13, "FileAttributes" }, - { 15, "FileSize" }, - { 16, "FileVersion" }, - { 17, "ProductState" }, - { 18, "ProductInfo" }, - { 19, "ConfigureProduct", TRUE }, - { 20, "ReinstallProduct", TRUE }, - { 21, "CollectUserInfo", TRUE }, - { 22, "ApplyPatch", TRUE }, - { 23, "FeatureParent", TRUE }, - { 24, "FeatureState", TRUE }, - { 25, "UseFeature", TRUE }, - { 26, "FeatureUsageCount", TRUE }, - { 27, "FeatureUsageDate", TRUE }, - { 28, "ConfigureFeature", TRUE }, - { 29, "ReinstallFeature", TRUE }, - { 30, "ProvideComponent", TRUE }, - { 31, "ComponentPath", TRUE }, - { 32, "ProvideQualifiedComponent", TRUE }, - { 33, "QualifierDescription", TRUE }, - { 34, "ComponentQualifiers", TRUE }, - { 35, "Products" }, - { 36, "Features", TRUE }, - { 37, "Components", TRUE }, - { 38, "ComponentClients", TRUE }, - { 39, "Patches", TRUE }, - { 40, "RelatedProducts" }, - { 41, "PatchInfo", TRUE }, - { 42, "PatchTransforms", TRUE }, - { 43, "AddSource", TRUE }, - { 44, "ClearSourceList", TRUE }, - { 45, "ForceSourceListResolution", TRUE }, - { 46, "ShortcutTarget", TRUE }, - { 47, "FileHash", TRUE }, - { 48, "FileSignatureInfo", TRUE }, - { 0 } -}; - static void test_dispid(void) { - const get_did_t *ptr = get_did_data; DISPID dispid; - while (ptr->name) + dispid = get_dispid(pInstaller, "CreateRecord"); + ok(dispid == 1, "Expected 1, got %d\n", dispid); + dispid = get_dispid(pInstaller, "OpenPackage"); + ok(dispid == 2, "Expected 2, got %d\n", dispid); + dispid = get_dispid(pInstaller, "OpenProduct"); + ok(dispid == 3, "Expected 3, got %d\n", dispid); + dispid = get_dispid(pInstaller, "OpenDatabase"); + ok(dispid == 4, "Expected 4, got %d\n", dispid); + dispid = get_dispid(pInstaller, "SummaryInformation"); + ok(dispid == 5, "Expected 5, got %d\n", dispid); + dispid = get_dispid( pInstaller, "UILevel" ); + ok(dispid == 6, "Expected 6, got %d\n", dispid); + dispid = get_dispid(pInstaller, "EnableLog"); + ok(dispid == 7, "Expected 7, got %d\n", dispid); + dispid = get_dispid(pInstaller, "InstallProduct"); + ok(dispid == 8, "Expected 8, got %d\n", dispid); + dispid = get_dispid(pInstaller, "Version"); + ok(dispid == 9, "Expected 9, got %d\n", dispid); + dispid = get_dispid(pInstaller, "LastErrorRecord"); + ok(dispid == 10, "Expected 10, got %d\n", dispid); + dispid = get_dispid(pInstaller, "RegistryValue"); + ok(dispid == 11, "Expected 11, got %d\n", dispid); + dispid = get_dispid(pInstaller, "Environment"); + ok(dispid == 12, "Expected 12, got %d\n", dispid); + dispid = get_dispid(pInstaller, "FileAttributes"); + ok(dispid == 13, "Expected 13, got %d\n", dispid); + dispid = get_dispid(pInstaller, "FileSize"); + ok(dispid == 15, "Expected 15, got %d\n", dispid); + dispid = get_dispid(pInstaller, "FileVersion"); + ok(dispid == 16, "Expected 16, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ProductState"); + ok(dispid == 17, "Expected 17, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ProductInfo"); + ok(dispid == 18, "Expected 18, got %d\n", dispid); + todo_wine { - dispid = get_dispid(pInstaller, ptr->name); - if (ptr->todo) - todo_wine - ok(dispid == ptr->did, "%s: expected %d, got %d\n", ptr->name, ptr->did, dispid); - else - ok(dispid == ptr->did, "%s: expected %d, got %d\n", ptr->name, ptr->did, dispid); - ptr++; + dispid = get_dispid(pInstaller, "ConfigureProduct"); + ok(dispid == 19, "Expected 19, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ReinstallProduct"); + ok(dispid == 20 , "Expected 20, got %d\n", dispid); + dispid = get_dispid(pInstaller, "CollectUserInfo"); + ok(dispid == 21, "Expected 21, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ApplyPatch"); + ok(dispid == 22, "Expected 22, got %d\n", dispid); + dispid = get_dispid(pInstaller, "FeatureParent"); + ok(dispid == 23, "Expected 23, got %d\n", dispid); + dispid = get_dispid(pInstaller, "FeatureState"); + ok(dispid == 24, "Expected 24, got %d\n", dispid); + dispid = get_dispid(pInstaller, "UseFeature"); + ok(dispid == 25, "Expected 25, got %d\n", dispid); + dispid = get_dispid(pInstaller, "FeatureUsageCount"); + ok(dispid == 26, "Expected 26, got %d\n", dispid); + dispid = get_dispid(pInstaller, "FeatureUsageDate"); + ok(dispid == 27, "Expected 27, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ConfigureFeature"); + ok(dispid == 28, "Expected 28, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ReinstallFeature"); + ok(dispid == 29, "Expected 29, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ProvideComponent"); + ok(dispid == 30, "Expected 30, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ComponentPath"); + ok(dispid == 31, "Expected 31, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ProvideQualifiedComponent"); + ok(dispid == 32, "Expected 32, got %d\n", dispid); + dispid = get_dispid(pInstaller, "QualifierDescription"); + ok(dispid == 33, "Expected 33, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ComponentQualifiers"); + ok(dispid == 34, "Expected 34, got %d\n", dispid); + } + dispid = get_dispid(pInstaller, "Products"); + ok(dispid == 35, "Expected 35, got %d\n", dispid); + todo_wine + { + dispid = get_dispid(pInstaller, "Features"); + ok(dispid == 36, "Expected 36, got %d\n", dispid); + dispid = get_dispid(pInstaller, "Components"); + ok(dispid == 37, "Expected 37, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ComponentClients"); + ok(dispid == 38, "Expected 38, got %d\n", dispid); + dispid = get_dispid(pInstaller, "Patches"); + ok(dispid == 39, "Expected 39, got %d\n", dispid); + } + dispid = get_dispid(pInstaller, "RelatedProducts"); + ok(dispid == 40, "Expected 40, got %d\n", dispid); + todo_wine + { + dispid = get_dispid(pInstaller, "PatchInfo"); + ok(dispid == 41, "Expected 41, got %d\n", dispid); + dispid = get_dispid(pInstaller, "PatchTransforms"); + ok(dispid == 42, "Expected 42, got %d\n", dispid); + dispid = get_dispid(pInstaller, "AddSource"); + ok(dispid == 43, "Expected 43, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ClearSourceList"); + ok(dispid == 44, "Expected 44, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ForceSourceListResolution"); + ok(dispid == 45, "Expected 45, got %d\n", dispid); + dispid = get_dispid(pInstaller, "ShortcutTarget"); + ok(dispid == 46, "Expected 46, got %d\n", dispid); + dispid = get_dispid(pInstaller, "FileHash"); + ok(dispid == 47, "Expected 47, got %d\n", dispid); + dispid = get_dispid(pInstaller, "FileSignatureInfo"); + ok(dispid == 48, "Expected 48, got %d\n", dispid); } - dispid = get_dispid(pInstaller, "RemovePatches"); ok(dispid == 49 || dispid == -1, "Expected 49 or -1, got %d\n", dispid); dispid = get_dispid(pInstaller, "ApplyMultiplePatches"); diff --git a/rostests/winetests/msi/package.c b/rostests/winetests/msi/package.c index 9808dfa7126..9fae1d9e780 100644 --- a/rostests/winetests/msi/package.c +++ b/rostests/winetests/msi/package.c @@ -1134,7 +1134,6 @@ static void test_settargetpath(void) r = MsiSetTargetPath( hpkg, "TARGETDIR", tempdir ); ok( r == ERROR_SUCCESS, "MsiSetTargetPath on subsubdir returned %d\n", r ); - buffer[0] = 0; sz = sizeof buffer - 1; lstrcat( tempdir, "\\" ); r = MsiGetTargetPath( hpkg, "TARGETDIR", buffer, &sz ); @@ -1145,7 +1144,6 @@ static void test_settargetpath(void) query_file_path( hpkg, "[#RootFile]", buffer ); ok( !lstrcmp(buffer, file), "Expected %s, got %s\n", file, buffer); - buffer[0] = 0; sz = sizeof(buffer); r = MsiGetPropertyA( hpkg, "TestParent", buffer, &sz ); ok( r == ERROR_SUCCESS, "MsiGetProperty returned %u\n", r ); @@ -1155,19 +1153,16 @@ static void test_settargetpath(void) r = MsiSetTargetPath( hpkg, "TestParent", "C:\\one\\two" ); ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r ); - buffer[0] = 0; sz = sizeof(buffer); r = MsiGetPropertyA( hpkg, "TestParent", buffer, &sz ); ok( r == ERROR_SUCCESS, "MsiGetProperty returned %u\n", r ); ok( lstrcmpi(buffer, "C:\\one\\two\\TestDir\\"), "Expected \"C:\\one\\two\\TestDir\\\", got \"%s\"\n", buffer ); - buffer[0] = 0; query_file_path( hpkg, "[#TestFile]", buffer ); ok( !lstrcmpi(buffer, "C:\\one\\two\\TestDir\\testfile.txt"), "Expected C:\\one\\two\\TestDir\\testfile.txt, got %s\n", buffer ); - buffer[0] = 0; sz = sizeof buffer - 1; r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz ); ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r); @@ -1176,7 +1171,6 @@ static void test_settargetpath(void) r = MsiSetTargetPath( hpkg, "TestParent", "C:\\one\\two\\three" ); ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r ); - buffer[0] = 0; sz = sizeof buffer - 1; r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz ); ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r); @@ -1185,21 +1179,11 @@ static void test_settargetpath(void) r = MsiSetTargetPath( hpkg, "TestParent", "C:\\\\one\\\\two " ); ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r ); - buffer[0] = 0; sz = sizeof buffer - 1; r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz ); ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r); ok( !lstrcmpi(buffer, "C:\\one\\two\\"), "Expected \"C:\\one\\two\\\", got %s\n", buffer); - r = MsiSetTargetPath( hpkg, "TestParent", "C:\\\\ Program Files \\\\ " ); - ok( r == ERROR_SUCCESS, "MsiSetTargetPath returned %d\n", r ); - - buffer[0] = 0; - sz = sizeof buffer - 1; - r = MsiGetTargetPath( hpkg, "TestParent", buffer, &sz ); - ok( r == ERROR_SUCCESS, "failed to get target path: %d\n", r); - ok( !lstrcmpi(buffer, "C:\\Program Files\\"), "Expected \"C:\\Program Files\\\", got %s\n", buffer); - MsiCloseHandle( hpkg ); } @@ -10986,19 +10970,15 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path does not exist, but the property exists */ - size = MAX_PATH; - lstrcpyA(path, "kiwi"); - r = MsiGetProperty(hpkg, "SourceDir", path, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); - size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + todo_wine + { + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + } /* try SubDir after CostInitialize */ size = MAX_PATH; @@ -11045,13 +11025,6 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path does not exist, but the property exists */ - size = MAX_PATH; - lstrcpyA(path, "kiwi"); - r = MsiGetProperty(hpkg, "SourceDir", path, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); - size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -11104,13 +11077,6 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path does not exist, but the property exists */ - size = MAX_PATH; - lstrcpyA(path, "kiwi"); - r = MsiGetProperty(hpkg, "SourceDir", path, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); - size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -11163,13 +11129,6 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path does not exist, but the property exists */ - size = MAX_PATH; - lstrcpyA(path, "kiwi"); - r = MsiGetProperty(hpkg, "SourceDir", path, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); - size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -11307,13 +11266,6 @@ static void test_MsiGetSourcePath(void) ok(size == MAX_PATH, "Expected size to be unchanged, got %d\n", size); /* source path nor the property exist */ - size = MAX_PATH; - lstrcpyA(path, "kiwi"); - r = MsiGetProperty(hpkg, "SourceDir", path, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, ""), "Expected \"\", got \"%s\"\n", path); - ok(size == 0, "Expected 0, got %d\n", size); - size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -11370,19 +11322,15 @@ static void test_MsiGetSourcePath(void) } /* source path does not exist, but the property exists */ - size = MAX_PATH; - lstrcpyA(path, "kiwi"); - r = MsiGetProperty(hpkg, "SourceDir", path, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); - size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + todo_wine + { + ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); + ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); + } /* try SubDir after CostInitialize */ size = MAX_PATH; @@ -11431,13 +11379,6 @@ static void test_MsiGetSourcePath(void) } /* source path and the property exist */ - size = MAX_PATH; - lstrcpyA(path, "kiwi"); - r = MsiGetProperty(hpkg, "SourceDir", path, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); - size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -11492,13 +11433,6 @@ static void test_MsiGetSourcePath(void) } /* source path and the property exist */ - size = MAX_PATH; - lstrcpyA(path, "kiwi"); - r = MsiGetProperty(hpkg, "SourceDir", path, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); - size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); @@ -11553,13 +11487,6 @@ static void test_MsiGetSourcePath(void) } /* source path and the property exist */ - size = MAX_PATH; - lstrcpyA(path, "kiwi"); - r = MsiGetProperty(hpkg, "SourceDir", path, &size); - ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); - ok(!lstrcmpA(path, cwd), "Expected \"%s\", got \"%s\"\n", cwd, path); - ok(size == lstrlenA(cwd), "Expected %d, got %d\n", lstrlenA(cwd), size); - size = MAX_PATH; lstrcpyA(path, "kiwi"); r = MsiGetProperty(hpkg, "SOURCEDIR", path, &size); From 3bc403f6e7f363d67e1dd34fb48587ab09fa24a0 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 6 Feb 2012 20:53:47 +0000 Subject: [PATCH 248/289] [SMSS2] * Fix build. svn path=/trunk/; revision=55471 --- reactos/base/system/smss2/smss.h | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index 66d8fb43cbc..afbf5508eb2 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -7,7 +7,6 @@ */ /* DEPENDENCIES ***************************************************************/ -#pragma once #ifndef _SM_ #define _SM_ From 35a3e62e9dfe6748d42036dd5537f01ef550af3d Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 6 Feb 2012 22:01:09 +0000 Subject: [PATCH 249/289] [NTOSKRNL] - Implement MiIsUserP*e inline functions to efficiently determine if a pte is a pte/pde/ppe or pxe for a user mode page - Make MiDetermineUserGlobalPteMask work for _MI_PAGING_LEVELS >= 3 - In MiResolveDemandZeroFault, use MI_MAKE_HARDWARE_PTE only, it does all the necessary work. svn path=/trunk/; revision=55472 --- reactos/ntoskrnl/mm/ARM3/miarm.h | 56 +++++++++++++++++++++++++++-- reactos/ntoskrnl/mm/ARM3/pagfault.c | 21 +++-------- 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 78bbcce6f14..6b4035be0ff 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -565,6 +565,50 @@ MiIsMemoryTypeInvisible(TYPE_OF_MEMORY MemoryType) (MemoryType == LoaderBBTMemory)); } +#ifdef _M_AMD64 +BOOLEAN +FORCEINLINE +MiIsUserPxe(PVOID Address) +{ + return ((ULONG_PTR)Address >> 7) == 0x1FFFFEDF6FB7DA0ULL; +} + +BOOLEAN +FORCEINLINE +MiIsUserPpe(PVOID Address) +{ + return ((ULONG_PTR)Address >> 16) == 0xFFFFF6FB7DA0ULL; +} + +BOOLEAN +FORCEINLINE +MiIsUserPde(PVOID Address) +{ + return ((ULONG_PTR)Address >> 25) == 0x7FFFFB7DA0ULL; +} + +BOOLEAN +FORCEINLINE +MiIsUserPte(PVOID Address) +{ + return ((ULONG_PTR)Address >> 34) == 0x3FFFFDA0ULL; +} +#else +BOOLEAN +FORCEINLINE +MiIsUserPde(PVOID Address) +{ + return ((Address >= (PVOID)MiAddressToPde(NULL)) && + (Address <= (PVOID)MiHighestUserPde)); +} + +BOOLEAN +FORCEINLINE +MiIsUserPte(PVOID Address) +{ + return (Address <= (PVOID)MiHighestUserPte); +} +#endif // // Figures out the hardware bits for a PTE @@ -583,9 +627,15 @@ MiDetermineUserGlobalPteMask(IN PVOID PointerPte) MI_MAKE_ACCESSED_PAGE(&TempPte); /* Is this for user-mode? */ - if ((PointerPte <= (PVOID)MiHighestUserPte) || - ((PointerPte >= (PVOID)MiAddressToPde(NULL)) && - (PointerPte <= (PVOID)MiHighestUserPde))) + if ( +#if (_MI_PAGING_LEVELS == 4) + MiIsUserPxe(PointerPte) || +#endif +#if (_MI_PAGING_LEVELS >= 3) + MiIsUserPpe(PointerPte) || +#endif + MiIsUserPde(PointerPte) || + MiIsUserPte(PointerPte)) { /* Set the owner bit */ MI_MAKE_OWNER_PAGE(&TempPte); diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index 0b59938eb0b..fda089794fe 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -335,22 +335,10 @@ MiResolveDemandZeroFault(IN PVOID Address, if (NeedZero) MiZeroPfn(PageFrameNumber); /* Build the PTE */ - if (PointerPte <= MiHighestUserPte) - { - /* For user mode */ - MI_MAKE_HARDWARE_PTE_USER(&TempPte, - PointerPte, - Protection, - PageFrameNumber); - } - else - { - /* For kernel mode */ - MI_MAKE_HARDWARE_PTE(&TempPte, - PointerPte, - Protection, - PageFrameNumber); - } + MI_MAKE_HARDWARE_PTE(&TempPte, + PointerPte, + Protection, + PageFrameNumber); /* Set it dirty if it's a writable page */ if (MI_IS_PAGE_WRITEABLE(&TempPte)) MI_MAKE_DIRTY_PAGE(&TempPte); @@ -625,6 +613,7 @@ MiDispatchFault(IN BOOLEAN StoreInstruction, /* Check if the PTE is completely empty */ if (TempPte.u.Long == 0) { + /* The address is not from any pageable area! */ KeBugCheckEx(PAGE_FAULT_IN_NONPAGED_AREA, (ULONG_PTR)Address, StoreInstruction, From dfb761830dbfa0ff7c9c41efbe60c1cab2788559 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Tue, 7 Feb 2012 07:13:42 +0000 Subject: [PATCH 250/289] [SMSS2]: Implement executing the initial command as well as doing the SM-to-SM initial connection. [SMSS2]: Implement the main LPC loop and handle all the supported APIs (all stubs for now). Also handle new connection requests and implement SmpHandleConnectionRequest. [SMSS2]: Implement subsystem helper functions. [SMSS2]: Use SmApiPort2 instead of Sm2ApiPort. [SMSS2]: Rename the SMSRV_APIs not to conflict with the function names, nor with the client functions in smlib. svn path=/trunk/; revision=55478 --- reactos/base/system/smss2/CMakeLists.txt | 2 +- reactos/base/system/smss2/sminit.c | 2 +- reactos/base/system/smss2/smloop.c | 355 +++++++++++++++++++++- reactos/base/system/smss2/smsessn.c | 33 +- reactos/base/system/smss2/smss.c | 121 +++++++- reactos/base/system/smss2/smss.h | 41 +++ reactos/base/system/smss2/smss2.rbuild | 1 + reactos/base/system/smss2/smsubsys.c | 91 ++++++ reactos/include/reactos/subsys/sm/smmsg.h | 39 ++- 9 files changed, 660 insertions(+), 25 deletions(-) diff --git a/reactos/base/system/smss2/CMakeLists.txt b/reactos/base/system/smss2/CMakeLists.txt index dfffa88aa0c..35dd1f81e5a 100644 --- a/reactos/base/system/smss2/CMakeLists.txt +++ b/reactos/base/system/smss2/CMakeLists.txt @@ -15,7 +15,7 @@ list(APPEND SOURCE add_executable(smss2 WIN32 ${SOURCE}) -target_link_libraries(smss2 nt pseh) +target_link_libraries(smss2 nt pseh smlib) add_pch(smss2 smss.h) diff --git a/reactos/base/system/smss2/sminit.c b/reactos/base/system/smss2/sminit.c index d05a84ce3de..3da3fce37a5 100644 --- a/reactos/base/system/smss2/sminit.c +++ b/reactos/base/system/smss2/sminit.c @@ -2439,7 +2439,7 @@ SmpInit(IN PUNICODE_STRING InitialCommand, RtlInitUnicodeString(&Os2Name, L"OS2"); /* Create the SM API Port */ - RtlInitUnicodeString(&PortName, L"\\Sm2ApiPort"); + RtlInitUnicodeString(&PortName, L"\\SmApiPort2"); InitializeObjectAttributes(&ObjectAttributes, &PortName, 0, NULL, NULL); Status = NtCreatePort(&PortHandle, &ObjectAttributes, diff --git a/reactos/base/system/smss2/smloop.c b/reactos/base/system/smss2/smloop.c index 574d7e8821e..ff05e7993f4 100644 --- a/reactos/base/system/smss2/smloop.c +++ b/reactos/base/system/smss2/smloop.c @@ -14,26 +14,365 @@ /* GLOBALS ********************************************************************/ +typedef struct _SMP_CLIENT_CONTEXT +{ + PVOID Subsystem; + HANDLE ProcessHandle; + HANDLE PortHandle; + ULONG dword10; +} SMP_CLIENT_CONTEXT, *PSMP_CLIENT_CONTEXT; + +typedef +NTSTATUS +(NTAPI *PSM_API_HANDLER)( + IN PSM_API_MSG SmApiMsg, + IN PSMP_CLIENT_CONTEXT ClientContext, + IN HANDLE SmApiPort +); + +volatile LONG SmTotalApiThreads; +HANDLE SmUniqueProcessId; + +/* API HANDLERS ***************************************************************/ + +NTSTATUS +NTAPI +SmpCreateForeignSession(IN PSM_API_MSG SmApiMsg, + IN PSMP_CLIENT_CONTEXT ClientContext, + IN HANDLE SmApiPort) +{ + DPRINT1("%s is not yet implemented\n", __FUNCTION__); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpSessionComplete(IN PSM_API_MSG SmApiMsg, + IN PSMP_CLIENT_CONTEXT ClientContext, + IN HANDLE SmApiPort) +{ + DPRINT1("%s is not yet implemented\n", __FUNCTION__); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpTerminateForeignSession(IN PSM_API_MSG SmApiMsg, + IN PSMP_CLIENT_CONTEXT ClientContext, + IN HANDLE SmApiPort) +{ + DPRINT1("%s is not yet implemented\n", __FUNCTION__); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpExecPgm(IN PSM_API_MSG SmApiMsg, + IN PSMP_CLIENT_CONTEXT ClientContext, + IN HANDLE SmApiPort) +{ + DPRINT1("%s is not yet implemented\n", __FUNCTION__); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpLoadDeferedSubsystem(IN PSM_API_MSG SmApiMsg, + IN PSMP_CLIENT_CONTEXT ClientContext, + IN HANDLE SmApiPort) +{ + DPRINT1("%s is not yet implemented\n", __FUNCTION__); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpStartCsr(IN PSM_API_MSG SmApiMsg, + IN PSMP_CLIENT_CONTEXT ClientContext, + IN HANDLE SmApiPort) +{ + DPRINT1("%s is not yet implemented\n", __FUNCTION__); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +SmpStopCsr(IN PSM_API_MSG SmApiMsg, + IN PSMP_CLIENT_CONTEXT ClientContext, + IN HANDLE SmApiPort) +{ + DPRINT1("%s is not yet implemented\n", __FUNCTION__); + return STATUS_SUCCESS; +} + +PSM_API_HANDLER SmpApiDispatch[SmMaxApiNumber] = +{ + SmpCreateForeignSession, + SmpSessionComplete, + SmpTerminateForeignSession, + SmpExecPgm, + SmpLoadDeferedSubsystem, + SmpStartCsr, + SmpStopCsr +}; + /* FUNCTIONS ******************************************************************/ +NTSTATUS +NTAPI +SmpHandleConnectionRequest(IN HANDLE SmApiPort, + IN PSB_API_MSG SbApiMsg) +{ + BOOLEAN Accept = TRUE; + HANDLE PortHandle, ProcessHandle; + ULONG SessionId; + UNICODE_STRING SubsystemPort; + SMP_CLIENT_CONTEXT *ClientContext; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + REMOTE_PORT_VIEW PortView; + SECURITY_QUALITY_OF_SERVICE SecurityQos; + PSMP_SUBSYSTEM CidSubsystem, TypeSubsystem; + + /* Initialize QoS data */ + SecurityQos.ImpersonationLevel = SecurityIdentification; + SecurityQos.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; + SecurityQos.EffectiveOnly = TRUE; + + /* Check if this is SM connecting to itself */ + if (SbApiMsg->h.ClientId.UniqueProcess == SmUniqueProcessId) + { + /* No need to get any handle -- assume session 0 */ + DPRINT1("SM connecting to SM\n"); + ProcessHandle = NULL; + SessionId = 0; + } + else + { + /* Reference the foreign process */ + DPRINT1("Incoming request from %lx\n", SbApiMsg->h.ClientId.UniqueProcess); + InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); + Status = NtOpenProcess(&ProcessHandle, + PROCESS_QUERY_INFORMATION, + &ObjectAttributes, + &SbApiMsg->h.ClientId); + if (!NT_SUCCESS(Status)) Accept = FALSE; + + /* Get its session ID */ + SmpGetProcessMuSessionId(ProcessHandle, &SessionId); + } + + /* See if we already know about the caller's subystem */ + CidSubsystem = SmpLocateKnownSubSysByCid(&SbApiMsg->h.ClientId); + if ((CidSubsystem) && (Accept)) + { + /* Check if we already have a subsystem for this kind of image */ + TypeSubsystem = SmpLocateKnownSubSysByType(SessionId, + SbApiMsg->ConnectionInfo.SubsystemType); + if (TypeSubsystem == CidSubsystem) + { + /* Someone is trying to take control of an existing subsystem, fail */ + Accept = FALSE; + DPRINT1("SMSS: Connection from SubSystem rejected\n"); + DPRINT1("SMSS: Image type already being served\n"); + } + else + { + /* Set this image type as the type for this subsystem */ + CidSubsystem->ImageType = SbApiMsg->ConnectionInfo.SubsystemType; + } + + /* Drop the reference we had acquired */ + if (TypeSubsystem) SmpDereferenceSubsystem(TypeSubsystem); + } + + /* Check if we'll be accepting the connection */ + if (Accept) + { + /* We will, so create a client context for it */ + ClientContext = RtlAllocateHeap(SmpHeap, 0, sizeof(SMP_CLIENT_CONTEXT)); + if (ClientContext) + { + ClientContext->ProcessHandle = ProcessHandle; + ClientContext->Subsystem = CidSubsystem; + ClientContext->dword10 = 0; + ClientContext->PortHandle = NULL; + } + else + { + /* Failed to allocate a client context, so reject the connection */ + DPRINT1("Rejecting connectiond due to lack of memory\n"); + Accept = FALSE; + } + } + else + { + /* Use a bogus context since we're going to reject the message */ + ClientContext = (PSMP_CLIENT_CONTEXT)SbApiMsg; + } + + /* Now send the actual accept reply (which could be a rejection) */ + PortView.Length = sizeof(PortView); + DPRINT1("Accepting: %d connection with context: %p\n", Accept, ClientContext); + Status = NtAcceptConnectPort(&PortHandle, + ClientContext, + &SbApiMsg->h, + Accept, + NULL, + &PortView); + if (!(Accept) || !(NT_SUCCESS(Status))) + { + /* Close the process handle, reference the subsystem, and exit */ + DPRINT1("Accept failed or rejected: %lx\n", Status); + if (ClientContext != (PVOID)SbApiMsg) RtlFreeHeap(SmpHeap, 0, ClientContext); + if (ProcessHandle) NtClose(ProcessHandle); + if (CidSubsystem) SmpDereferenceSubsystem(CidSubsystem); + return Status; + } + + /* Save the port handle now that we've accepted it */ + if (ClientContext) ClientContext->PortHandle = PortHandle; + if (CidSubsystem) CidSubsystem->PortHandle = PortHandle; + + /* Complete the port connection */ + Status = NtCompleteConnectPort(PortHandle); + if ((NT_SUCCESS(Status)) && (CidSubsystem)) + { + /* This was an actual subsystem, so connect back to it */ + DPRINT1("Connecting back to %wZ\n", &SubsystemPort); + SbApiMsg->ConnectionInfo.SbApiPortName[119] = UNICODE_NULL; + RtlCreateUnicodeString(&SubsystemPort, + SbApiMsg->ConnectionInfo.SbApiPortName); + Status = NtConnectPort(&CidSubsystem->SbApiPort, + &SubsystemPort, + &SecurityQos, + NULL, + NULL, + NULL, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Connect back to Sb %wZ failed %lx\n", &SubsystemPort, Status); + } + RtlFreeUnicodeString(&SubsystemPort); + + /* Now that we're connected, signal the event handle */ + NtSetEvent(CidSubsystem->Event, NULL); + } + else if (CidSubsystem) + { + /* We failed to complete the connection, so clear the port handle */ + DPRINT1("Completing the connection failed: %lx\n", Status); + CidSubsystem->PortHandle = NULL; + } + + /* Dereference the subsystem and return the result */ + if (CidSubsystem) SmpDereferenceSubsystem(CidSubsystem); + return Status; +} + ULONG NTAPI SmpApiLoop(IN PVOID Parameter) { HANDLE SmApiPort = (HANDLE)Parameter; NTSTATUS Status; - PVOID ClientContext; - PSM_API_MSG RequestMsg = NULL; - SM_API_MSG ReplyMsg; + PSMP_CLIENT_CONTEXT ClientContext; + PSM_API_MSG ReplyMsg = NULL; + SM_API_MSG RequestMsg; + PROCESS_BASIC_INFORMATION ProcessInformation; + LARGE_INTEGER Timeout; - DPRINT1("API Loop: %p\n", SmApiPort); + /* Increase the number of API threads for throttling code for later */ + _InterlockedExchangeAdd(&SmTotalApiThreads, 1); + + /* Mark us critical */ + RtlSetThreadIsCritical(TRUE, NULL, TRUE); + + /* Set the PID of the SM process itself for later checking */ + NtQueryInformationProcess(NtCurrentProcess(), + ProcessBasicInformation, + &ProcessInformation, + sizeof(ProcessInformation), + NULL); + SmUniqueProcessId = (HANDLE)ProcessInformation.UniqueProcessId; + + /* Now process incoming messages */ while (TRUE) { + /* Begin waiting on a request */ + DPRINT1("API Loop: %p\n", SmApiPort); Status = NtReplyWaitReceivePort(SmApiPort, - &ClientContext, - &RequestMsg->h, - &ReplyMsg.h); - DPRINT1("API loop returned: %lx\n", Status); + (PVOID*)&ClientContext, + &ReplyMsg->h, + &RequestMsg.h); + if (Status == STATUS_NO_MEMORY) + { + /* Ran out of memory, so do a little timeout and try again */ + if (ReplyMsg) DPRINT1("SMSS: Failed to reply to calling thread, retrying.\n"); + Timeout.QuadPart = -50000000; + NtDelayExecution(FALSE, &Timeout); + continue; + } + + /* Check what kind of request we received */ + switch (RequestMsg.h.u2.s2.Type) + { + /* A new connection */ + case LPC_CONNECTION_REQUEST: + /* Create the right structures for it */ + DPRINT1("New connection request\n"); + SmpHandleConnectionRequest(SmApiPort, (PSB_API_MSG)&RequestMsg); + ReplyMsg = NULL; + break; + + /* A closed connection */ + case LPC_PORT_CLOSED: + /* Destroy any state we had for this client */ + DPRINT1("Port closed\n"); + //if (ClientContext) SmpPushDeferredClientContext(ClientContext); + ReplyMsg = NULL; + break; + + /* An actual API message */ + default: + if (!ClientContext) + { + ReplyMsg = NULL; + break; + } + + RequestMsg.ReturnValue = STATUS_PENDING; + + /* Check if the API is valid */ + if (RequestMsg.ApiNumber >= SmMaxApiNumber) + { + /* It isn't, fail */ + DPRINT1("Invalid API: %lx\n", RequestMsg.ApiNumber); + Status = STATUS_NOT_IMPLEMENTED; + } + else if ((RequestMsg.ApiNumber <= SmTerminateForeignSessionApi) && + !(ClientContext->Subsystem)) + { + /* It's valid, but doesn't have a subsystem with it */ + DPRINT1("Invalid session API\n"); + Status = STATUS_INVALID_PARAMETER; + } + else + { + /* It's totally okay, so call the dispatcher for it */ + DPRINT1("Calling dispatcher for ID: %lx\n", RequestMsg.ApiNumber); + Status = SmpApiDispatch[RequestMsg.ApiNumber](&RequestMsg, + ClientContext, + SmApiPort); + } + + /* Write the result valud and return the message back */ + RequestMsg.ReturnValue = Status; + ReplyMsg = &RequestMsg; + break; + } } return STATUS_SUCCESS; } diff --git a/reactos/base/system/smss2/smsessn.c b/reactos/base/system/smss2/smsessn.c index 4c12563cb2f..c8d44558013 100644 --- a/reactos/base/system/smss2/smsessn.c +++ b/reactos/base/system/smss2/smsessn.c @@ -23,6 +23,37 @@ HANDLE SmpSessionsObjectDirectory; /* FUNCTIONS ******************************************************************/ +NTSTATUS +NTAPI +SmpGetProcessMuSessionId(IN HANDLE ProcessHandle, + OUT PULONG SessionId) +{ + NTSTATUS Status; + ULONG ProcessSession; + + /* Query the kernel for the session ID */ + Status = NtQueryInformationProcess(ProcessHandle, + ProcessSessionInformation, + &ProcessSession, + sizeof(ProcessSession), + NULL); + if (NT_SUCCESS(Status)) + { + /* Copy it back into the buffer */ + *SessionId = ProcessSession; + } + else + { + /* Failure -- assume session zero */ + DPRINT1("SMSS: GetProcessMuSessionId, Process=%x, Status=%x\n", + ProcessHandle, Status); + *SessionId = 0; + } + + /* Return result */ + return Status; +} + NTSTATUS NTAPI SmpSetProcessMuSessionId(IN HANDLE ProcessHandle, @@ -30,7 +61,7 @@ SmpSetProcessMuSessionId(IN HANDLE ProcessHandle, { NTSTATUS Status; - /* Tell the kernel about our session ID */ + /* Tell the kernel about the session ID */ Status = NtSetInformationProcess(ProcessHandle, ProcessSessionInformation, &SessionId, diff --git a/reactos/base/system/smss2/smss.c b/reactos/base/system/smss2/smss.c index bfcd52f9418..dd6688f9504 100644 --- a/reactos/base/system/smss2/smss.c +++ b/reactos/base/system/smss2/smss.c @@ -29,6 +29,8 @@ ULONG NtInitialUserProcessBufferType = REG_SZ; UNICODE_STRING SmpSystemRoot; ULONG AttachedSessionId = -1; BOOLEAN SmpDebug, SmpEnableDots; +HANDLE SmApiPort; +HANDLE SmpInitialCommandProcessId; /* FUNCTIONS ******************************************************************/ @@ -57,6 +59,7 @@ SmpExecuteImage(IN PUNICODE_STRING FileName, NTSTATUS Status; RTL_USER_PROCESS_INFORMATION LocalProcessInfo; PRTL_USER_PROCESS_PARAMETERS ProcessParameters; + DPRINT1("Executing image: %wZ\n", FileName); /* Use the input process information if we have it, otherwise use local */ ProcessInfo = ProcessInformation; @@ -295,6 +298,103 @@ SmpExecuteCommand(IN PUNICODE_STRING CommandLine, return Status; } +NTSTATUS +NTAPI +SmpExecuteInitialCommand(IN ULONG MuSessionId, + IN PUNICODE_STRING InitialCommand, + IN HANDLE InitialCommandProcess, + OUT PHANDLE ReturnPid) +{ + NTSTATUS Status; + RTL_USER_PROCESS_INFORMATION ProcessInfo; + UNICODE_STRING Arguments, ImageFileDirectory, ImageFileName; + ULONG Flags = 0; + + /* Check if we haven't yet connected to ourselves */ + if (!SmApiPort) + { + /* Connect to ourselves, as a client */ + Status = SmConnectToSm(0, 0, 0, &SmApiPort); + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: Unable to connect to SM - Status == %lx\n", Status); + return Status; + } + } + + /* Parse the initial command line */ + Status = SmpParseCommandLine(InitialCommand, + (PULONG)&Flags, + &ImageFileName, + &ImageFileDirectory, + &Arguments); + if (Flags & SMP_INVALID_PATH) + { + /* Fail if it doesn't exist */ + DPRINT1("SMSS: Initial command image (%wZ) not found\n", &ImageFileName); + if (ImageFileName.Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, ImageFileName.Buffer); + return STATUS_OBJECT_NAME_NOT_FOUND; + } + + /* And fail if any other reason is also true */ + if (!NT_SUCCESS(Status)) + { + DPRINT1("SMSS: SmpParseCommand( %wZ ) failed - Status == %lx\n", + InitialCommand, Status); + return Status; + } + + /* Execute the initial command -- but defer its full execution */ + Status = SmpExecuteImage(&ImageFileName, + &ImageFileDirectory, + InitialCommand, + MuSessionId, + SMP_DEFERRED_FLAG, + &ProcessInfo); + + /* Free any buffers we had lying around */ + if (ImageFileName.Buffer) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, ImageFileName.Buffer); + } + if (ImageFileDirectory.Buffer) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, ImageFileDirectory.Buffer); + } + if (Arguments.Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, Arguments.Buffer); + + /* Bail out if we couldn't execute the initial command */ + if (!NT_SUCCESS(Status)) return Status; + + /* Now duplicate the handle to this process */ + Status = NtDuplicateObject(NtCurrentProcess(), + ProcessInfo.ProcessHandle, + NtCurrentProcess(), + InitialCommandProcess, + PROCESS_ALL_ACCESS, + 0, + 0); + if (!NT_SUCCESS(Status)) + { + /* Kill it utterly if duplication failed */ + DPRINT1("SMSS: DupObject Failed. Status == %lx\n", Status); + NtTerminateProcess(ProcessInfo.ProcessHandle, Status); + NtResumeThread(ProcessInfo.ThreadHandle, NULL); + NtClose(ProcessInfo.ThreadHandle); + NtClose(ProcessInfo.ProcessHandle); + return Status; + } + + /* Return PID to the caller, and set this as the initial command PID */ + if (ReturnPid) *ReturnPid = ProcessInfo.ClientId.UniqueProcess; + if (!MuSessionId) SmpInitialCommandProcessId = ProcessInfo.ClientId.UniqueProcess; + + /* Now call our server execution function to wrap up its initialization */ + Status = SmExecPgm(SmApiPort, &ProcessInfo, FALSE); + if (!NT_SUCCESS(Status)) DPRINT1("SMSS: SmExecPgm Failed. Status == %lx\n", Status); + return Status; +} + NTSTATUS NTAPI ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, @@ -630,6 +730,9 @@ _main(IN INT argc, DPRINT1("SMSS: SmpInit return failure - Status == %x\n", Status); RtlInitUnicodeString(&DbgString, L"Session Manager Initialization"); Parameters[1] = Status; + DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); + Status = LaunchOldSmss(Handles); + goto SetupHack; //_SEH2_LEAVE; Hack so that setup can work. will go away later } @@ -647,14 +750,21 @@ _main(IN INT argc, DPRINT1("Global Flags Set to SMSS Debugging: Not yet supported\n"); } -#if 0 - /* Execute the initial command (Winlogon.exe) */ - Status = SmpExecuteInitialCommand(0, &InitialCommand, &Handles[1], NULL); -#else /* Launch the original SMSS */ DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); Status = LaunchOldSmss(Handles); -#endif + if (!NT_SUCCESS(Status)) + { + /* Fail and raise a hard error */ + DPRINT1("SMSS: Execute Old SMSS failed\n"); + RtlInitUnicodeString(&DbgString, + L"Session Manager LaunchOldSmss"); + Parameters[1] = Status; + _SEH2_LEAVE; + } + + /* Execute the initial command (Winlogon.exe) */ + Status = SmpExecuteInitialCommand(0, &InitialCommand, &Handles[1], NULL); if (!NT_SUCCESS(Status)) { /* Fail and raise a hard error */ @@ -679,6 +789,7 @@ _main(IN INT argc, SmpReleasePrivilege(State); /* Wait on either CSRSS or Winlogon to die */ +SetupHack: Status = NtWaitForMultipleObjects(RTL_NUMBER_OF(Handles), Handles, WaitAny, diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index afbf5508eb2..22b8af81d3b 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -49,6 +49,20 @@ typedef struct _SMP_REGISTRY_VALUE PCHAR AnsiValue; } SMP_REGISTRY_VALUE, *PSMP_REGISTRY_VALUE; +typedef struct _SMP_SUBSYSTEM +{ + LIST_ENTRY Entry; + HANDLE Event; + HANDLE ProcessHandle; + ULONG ImageType; + HANDLE PortHandle; + HANDLE SbApiPort; + CLIENT_ID ClientId; + ULONG MuSessionId; + BOOLEAN Terminating; + ULONG ReferenceCount; +} SMP_SUBSYSTEM, *PSMP_SUBSYSTEM; + /* EXTERNALS ******************************************************************/ extern RTL_CRITICAL_SECTION SmpKnownSubSysLock; @@ -209,4 +223,31 @@ NTAPI SmpTranslateSystemPartitionInformation( VOID ); + +PSMP_SUBSYSTEM +NTAPI +SmpLocateKnownSubSysByCid( + IN PCLIENT_ID ClientId +); + +PSMP_SUBSYSTEM +NTAPI +SmpLocateKnownSubSysByType( + IN ULONG MuSessionId, + IN ULONG ImageType +); + +NTSTATUS +NTAPI +SmpGetProcessMuSessionId( + IN HANDLE ProcessHandle, + OUT PULONG SessionId +); + +VOID +NTAPI +SmpDereferenceSubsystem( + IN PSMP_SUBSYSTEM SubSystem +); + #endif diff --git a/reactos/base/system/smss2/smss2.rbuild b/reactos/base/system/smss2/smss2.rbuild index 7c01ba71e53..23e97ccb97a 100644 --- a/reactos/base/system/smss2/smss2.rbuild +++ b/reactos/base/system/smss2/smss2.rbuild @@ -7,6 +7,7 @@ nt pseh ntdll + smlib smss.h smss.c diff --git a/reactos/base/system/smss2/smsubsys.c b/reactos/base/system/smss2/smsubsys.c index 16c407a5f6d..459b2bf16b7 100644 --- a/reactos/base/system/smss2/smsubsys.c +++ b/reactos/base/system/smss2/smsubsys.c @@ -23,6 +23,97 @@ WCHAR InitialCommandBuffer[256]; /* FUNCTIONS ******************************************************************/ +VOID +NTAPI +SmpDereferenceSubsystem(IN PSMP_SUBSYSTEM SubSystem) +{ + /* Acquire the database lock while we (potentially) destroy this subsystem */ + RtlEnterCriticalSection(&SmpKnownSubSysLock); + + /* Drop the reference and see if it's terminating */ + if (!(--SubSystem->ReferenceCount) && (SubSystem->Terminating)) + { + /* Close all handles and free it */ + if (SubSystem->Event) NtClose(SubSystem->Event); + if (SubSystem->ProcessHandle) NtClose(SubSystem->ProcessHandle); + if (SubSystem->SbApiPort) NtClose(SubSystem->SbApiPort); + RtlFreeHeap(SmpHeap, 0, SubSystem); + } + + /* Release the database lock */ + RtlLeaveCriticalSection(&SmpKnownSubSysLock); +} + +PSMP_SUBSYSTEM +NTAPI +SmpLocateKnownSubSysByCid(IN PCLIENT_ID ClientId) +{ + PSMP_SUBSYSTEM Subsystem = NULL; + PLIST_ENTRY NextEntry; + + /* Lock the subsystem database */ + RtlEnterCriticalSection(&SmpKnownSubSysLock); + + /* Loop each subsystem in the database */ + NextEntry = SmpKnownSubSysHead.Flink; + while (NextEntry != &SmpKnownSubSysHead) + { + /* Check if this one matches the client ID and is still valid */ + Subsystem = CONTAINING_RECORD(NextEntry, SMP_SUBSYSTEM, Entry); + if ((*(PULONGLONG)&Subsystem->ClientId == *(PULONGLONG)&ClientId) && + !(Subsystem->Terminating)) + { + /* Add a reference and return it */ + Subsystem->ReferenceCount++; + break; + } + + /* Reset the current pointer and keep earching */ + Subsystem = NULL; + NextEntry = NextEntry->Flink; + } + + /* Release the lock and return the subsystem we found */ + RtlLeaveCriticalSection(&SmpKnownSubSysLock); + return Subsystem; +} + +PSMP_SUBSYSTEM +NTAPI +SmpLocateKnownSubSysByType(IN ULONG MuSessionId, + IN ULONG ImageType) +{ + PSMP_SUBSYSTEM Subsystem = NULL; + PLIST_ENTRY NextEntry; + + /* Lock the subsystem database */ + RtlEnterCriticalSection(&SmpKnownSubSysLock); + + /* Loop each subsystem in the database */ + NextEntry = SmpKnownSubSysHead.Flink; + while (NextEntry != &SmpKnownSubSysHead) + { + /* Check if this one matches the image and uID, and is still valid */ + Subsystem = CONTAINING_RECORD(NextEntry, SMP_SUBSYSTEM, Entry); + if ((Subsystem->ImageType == ImageType) && + !(Subsystem->Terminating) && + (Subsystem->MuSessionId == MuSessionId)) + { + /* Return it referenced for the caller */ + Subsystem->ReferenceCount++; + break; + } + + /* Reset the current pointer and keep earching */ + Subsystem = NULL; + NextEntry = NextEntry->Flink; + } + + /* Release the lock and return the subsystem we found */ + RtlLeaveCriticalSection(&SmpKnownSubSysLock); + return Subsystem; +} + NTSTATUS NTAPI SmpLoadSubSystem(IN PUNICODE_STRING FileName, diff --git a/reactos/include/reactos/subsys/sm/smmsg.h b/reactos/include/reactos/subsys/sm/smmsg.h index 6395fb89751..0356a969f2b 100644 --- a/reactos/include/reactos/subsys/sm/smmsg.h +++ b/reactos/include/reactos/subsys/sm/smmsg.h @@ -21,14 +21,14 @@ // typedef enum _SMSRV_API_NUMBER { - SmpCreateForeignSession, - SmpSessionComplete, - SmpTerminateForeignSession, - SmpExecPgm, - SmpLoadDeferedSubsystem, - SmpStartCsr, - SmpStopCsr, - SmpMaxApiNumber // Based on BasepMaxApiNumber, UserpMaxApiNumber... + SmCreateForeignSessionApi, + SmSessionCompleteApi, + SmTerminateForeignSessionApi, + SmExecPgmApi, + SmLoadDeferedSubsystemApi, + SmStartCsrApi, + SmStopCsrApi, + SmMaxApiNumber // Based on BasepMaxApiNumber, UserpMaxApiNumber... } SMSRV_API_NUMBER; // @@ -184,7 +184,7 @@ typedef struct _SB_CONNECTION_INFO // typedef struct _SB_API_MSG { - PORT_MESSAGE Header; + PORT_MESSAGE h; union { SB_CONNECTION_INFO ConnectionInfo; @@ -208,4 +208,25 @@ typedef struct _SB_API_MSG // C_ASSERT(sizeof(SB_CONNECTION_INFO) == 0xF4); C_ASSERT(sizeof(SB_API_MSG) == 0x110); + +// +// The actual server functions that a client linking with smlib can call +// +NTSTATUS +NTAPI +SmConnectToSm( + IN PUNICODE_STRING SbApiPortName, + IN HANDLE SbApiPort, + IN ULONG ImageType, + IN HANDLE SmApiPort +); + +NTSTATUS +NTAPI +SmExecPgm( + IN HANDLE SmApiPort, + IN PRTL_USER_PROCESS_INFORMATION ProcessInformation, + IN BOOLEAN DebugFlag +); + #endif From 7c4171a370bacf5f7ef79d6c997b4e28fdffb3b1 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Tue, 7 Feb 2012 07:43:20 +0000 Subject: [PATCH 251/289] [SMLIB]: Forgot to commit this directory. svn path=/trunk/; revision=55479 --- reactos/lib/smlib/smclient.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/lib/smlib/smclient.c b/reactos/lib/smlib/smclient.c index b8f4ef3326b..8cae30e9971 100644 --- a/reactos/lib/smlib/smclient.c +++ b/reactos/lib/smlib/smclient.c @@ -38,7 +38,7 @@ SmExecPgm(IN HANDLE SmApiPort, SmApiMsg.h.u1.s1.TotalLength = sizeof(SmApiMsg); /* Initalize this specific API's parameters */ - SmApiMsg.ApiNumber = SmpExecPgm; + SmApiMsg.ApiNumber = SmExecPgmApi; RtlCopyMemory(&SmApiMsg.u.ExecPgm.ProcessInformation, ProcessInformation, sizeof(SmApiMsg.u.ExecPgm.ProcessInformation)); @@ -48,7 +48,7 @@ SmExecPgm(IN HANDLE SmApiPort, Status = NtRequestWaitReplyPort(SmApiPort, &SmApiMsg.h, &SmApiMsg.h); if (!NT_SUCCESS(Status)) { - DbgPrint("SmExecPgm: NtRequestWaitReply Failed %lx\n", Status); + DPRINT1("SmExecPgm: NtRequestWaitReply Failed %lx\n", Status); } else { @@ -81,7 +81,7 @@ SmConnectToSm(IN PUNICODE_STRING SbApiPortName, SecurityQos.EffectiveOnly = TRUE; /* Set the SM API port name */ - RtlInitUnicodeString(&DestinationString, L"\\SmApiPort"); + RtlInitUnicodeString(&DestinationString, L"\\SmApiPort2"); /* Check if this is a client connecting to SMSS, or SMSS to itself */ if (SbApiPortName) From 5df1402babfcfc2ae80d6f26230d441fcdfec471 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Tue, 7 Feb 2012 08:05:06 +0000 Subject: [PATCH 252/289] [SMLIB]: Rbuild fix. svn path=/trunk/; revision=55480 --- reactos/lib/smlib/smlib.rbuild | 1 + 1 file changed, 1 insertion(+) diff --git a/reactos/lib/smlib/smlib.rbuild b/reactos/lib/smlib/smlib.rbuild index 733ff2f7dc4..d33d65999cd 100644 --- a/reactos/lib/smlib/smlib.rbuild +++ b/reactos/lib/smlib/smlib.rbuild @@ -7,5 +7,6 @@ execpgm.c compses.c lookupss.c + smclient.c precomp.h From f89567dbbbc4dc140410e4d7d20f848a6f0c2322 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 7 Feb 2012 13:21:04 +0000 Subject: [PATCH 253/289] [smmsg.h] Fix 64 bit compilation svn path=/trunk/; revision=55481 --- reactos/include/reactos/subsys/sm/smmsg.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/reactos/include/reactos/subsys/sm/smmsg.h b/reactos/include/reactos/subsys/sm/smmsg.h index 0356a969f2b..f756fc7da10 100644 --- a/reactos/include/reactos/subsys/sm/smmsg.h +++ b/reactos/include/reactos/subsys/sm/smmsg.h @@ -17,7 +17,7 @@ // The exact names are not known, but we are basing them on the SmpApiName array // in the checked build of SMSS, which is probably a close approximation. We add // "p" to use the similar nomenclature seen/leaked out in the Base CSRSS APIs. -// +// // typedef enum _SMSRV_API_NUMBER { @@ -56,7 +56,9 @@ typedef struct _SM_EXEC_PGM_MSG RTL_USER_PROCESS_INFORMATION ProcessInformation; BOOLEAN DebugFlag; } SM_EXEC_PGM_MSG, *PM_EXEC_PGM_MSG; +#ifndef _WIN64 C_ASSERT(sizeof(SM_EXEC_PGM_MSG) == 0x48); +#endif typedef struct _SM_LOAD_DEFERED_SUBSYSTEM_MSG { @@ -101,7 +103,9 @@ typedef struct _SM_API_MSG // // This is the size that Server 2003 SP1 SMSS expects, so make sure we conform. // +#ifndef _WIN64 C_ASSERT(sizeof(SM_API_MSG) == 0x130); +#endif // // There are the APIs that the SMSS Serve can send to a client (such as CSRSS) @@ -112,7 +116,7 @@ C_ASSERT(sizeof(SM_API_MSG) == 0x130); // array in the checked build of CSRSRV which is probably a close approximation. // We add "p" to use the similar nomenclature seen/leaked out in the Base CSRSS // APIs. -// +// // typedef enum _SB_API_NUMBER { @@ -206,8 +210,10 @@ typedef struct _SB_API_MSG // // This is the size that Server 2003 SP1 SMSS expects, so make sure we conform. // +#ifndef _WIN64 C_ASSERT(sizeof(SB_CONNECTION_INFO) == 0xF4); C_ASSERT(sizeof(SB_API_MSG) == 0x110); +#endif // // The actual server functions that a client linking with smlib can call @@ -228,5 +234,5 @@ SmExecPgm( IN PRTL_USER_PROCESS_INFORMATION ProcessInformation, IN BOOLEAN DebugFlag ); - + #endif From 31a15829d97488a4df388af9df11145575c6a9b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Tue, 7 Feb 2012 14:54:02 +0000 Subject: [PATCH 254/289] [WIN32KDLL] - use spec file - fix use of def files svn path=/trunk/; revision=55482 --- .../w32kdll/w32kdll_2k3sp2/CMakeLists.txt | 12 +- .../w32kdll_2k3sp2/w32kdll_2k3sp2.spec | 671 +++++++++++++++ .../w32kdll/w32kdll_2ksp4/CMakeLists.txt | 11 +- .../w32kdll/w32kdll_2ksp4/w32kdll_2ksp4.spec | 646 +++++++++++++++ .../w32kdll/w32kdll_ros/CMakeLists.txt | 16 +- .../w32kdll/w32kdll_ros/w32kdll_ros.spec | 675 +++++++++++++++ .../w32kdll/w32kdll_vista/CMakeLists.txt | 11 +- .../w32kdll/w32kdll_vista/w32kdll_vista.spec | 778 ++++++++++++++++++ .../w32kdll/w32kdll_xpsp2/CMakeLists.txt | 10 +- .../w32kdll/w32kdll_xpsp2/w32kdll_xpsp2.spec | 674 +++++++++++++++ rostests/apitests/w32knapi/CMakeLists.txt | 10 +- 11 files changed, 3493 insertions(+), 21 deletions(-) create mode 100644 rostests/apitests/w32kdll/w32kdll_2k3sp2/w32kdll_2k3sp2.spec create mode 100644 rostests/apitests/w32kdll/w32kdll_2ksp4/w32kdll_2ksp4.spec create mode 100644 rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.spec create mode 100644 rostests/apitests/w32kdll/w32kdll_vista/w32kdll_vista.spec create mode 100644 rostests/apitests/w32kdll/w32kdll_xpsp2/w32kdll_xpsp2.spec diff --git a/rostests/apitests/w32kdll/w32kdll_2k3sp2/CMakeLists.txt b/rostests/apitests/w32kdll/w32kdll_2k3sp2/CMakeLists.txt index 57da80875a3..1eeb2576f24 100644 --- a/rostests/apitests/w32kdll/w32kdll_2k3sp2/CMakeLists.txt +++ b/rostests/apitests/w32kdll/w32kdll_2k3sp2/CMakeLists.txt @@ -1,6 +1,12 @@ -add_library(w32kdll_2k3sp2 SHARED main.c w32kdll_2k3sp2.S) +spec2def(w32kdll_2k3sp2.dll w32kdll_2k3sp2.spec) + +add_library(w32kdll_2k3sp2 SHARED + main.c + w32kdll_2k3sp2.S + ${CMAKE_CURRENT_BINARY_DIR}/w32kdll_2k3sp2.def) + set_entrypoint(w32kdll_2k3sp2 0) -target_link_libraries(w32kdll_2k3sp2 ${CMAKE_CURRENT_SOURCE_DIR}/w32kdll_2k3sp2.def) + add_dependencies(w32kdll_2k3sp2 psdk ) -add_importlib_target(w32kdll_2k3sp2.def) +add_importlib_target(w32kdll_2k3sp2.spec) diff --git a/rostests/apitests/w32kdll/w32kdll_2k3sp2/w32kdll_2k3sp2.spec b/rostests/apitests/w32kdll/w32kdll_2k3sp2/w32kdll_2k3sp2.spec new file mode 100644 index 00000000000..d2af2ca50b1 --- /dev/null +++ b/rostests/apitests/w32kdll/w32kdll_2k3sp2/w32kdll_2k3sp2.spec @@ -0,0 +1,671 @@ +; +; ReactOS Operating System +; +; This file contains all win32k native api functions from win 2003 sp2 +; + +@ stdcall NtGdiAbortDoc(ptr) +@ stdcall NtGdiAbortPath(ptr) +@ stdcall NtGdiAddFontResourceW(wstr long long long long ptr) +@ stdcall NtGdiAddRemoteFontToDC(ptr ptr long ptr) +@ stdcall NtGdiAddFontMemResourceEx(ptr long ptr long ptr) +@ stdcall NtGdiRemoveMergeFont(ptr ptr) +@ stdcall NtGdiAddRemoteMMInstanceToDC(ptr ptr long) +@ stdcall NtGdiAlphaBlend(ptr long long long long ptr long long long long long ptr) +@ stdcall NtGdiAngleArc(ptr long long long long long) +@ stdcall NtGdiAnyLinkedFonts() +@ stdcall NtGdiFontIsLinked(ptr) +@ stdcall NtGdiArcInternal(long ptr long long long long long long long long) +@ stdcall NtGdiBeginPath(ptr) +@ stdcall NtGdiBitBlt(ptr long long long long ptr long long long long long) +@ stdcall NtGdiCancelDC(ptr) +@ stdcall NtGdiCheckBitmapBits(ptr ptr ptr long long long long ptr) +@ stdcall NtGdiCloseFigure(ptr) +@ stdcall NtGdiClearBitmapAttributes(ptr long) +@ stdcall NtGdiClearBrushAttributes(ptr long) +@ stdcall NtGdiColorCorrectPalette(ptr ptr long long ptr long) +@ stdcall NtGdiCombineRgn(ptr ptr ptr long) +@ stdcall NtGdiCombineTransform(ptr ptr ptr) +@ stdcall NtGdiComputeXformCoefficients(ptr) +@ stdcall NtGdiConsoleTextOut(ptr ptr long ptr) +@ stdcall NtGdiConvertMetafileRect(ptr ptr) +@ stdcall NtGdiCreateBitmap(long long long long ptr) +@ stdcall NtGdiCreateClientObj(long) +@ stdcall NtGdiCreateColorSpace(ptr) +@ stdcall NtGdiCreateColorTransform(ptr ptr ptr long ptr long ptr long) +@ stdcall NtGdiCreateCompatibleBitmap(ptr long long) +@ stdcall NtGdiCreateCompatibleDC(ptr) +@ stdcall NtGdiCreateDIBBrush(ptr long long long long ptr) +@ stdcall NtGdiCreateDIBitmapInternal(ptr long long long ptr ptr long long long long ptr) +@ stdcall NtGdiCreateDIBSection(ptr ptr long ptr long long long ptr ptr) +@ stdcall NtGdiCreateEllipticRgn(long long long long) +@ stdcall NtGdiCreateHalftonePalette(ptr) +@ stdcall NtGdiCreateHatchBrushInternal(long long long) +@ stdcall NtGdiCreateMetafileDC(ptr) +@ stdcall NtGdiCreatePaletteInternal(ptr long) +@ stdcall NtGdiCreatePatternBrushInternal(ptr long long) +@ stdcall NtGdiCreatePen(long long long ptr) +@ stdcall NtGdiCreateRectRgn(long long long long) +@ stdcall NtGdiCreateRoundRectRgn(long long long long long long) +@ stdcall NtGdiCreateServerMetaFile(long long ptr long long long) +@ stdcall NtGdiCreateSolidBrush(long ptr) +@ stdcall NtGdiD3dContextCreate(ptr ptr ptr ptr) +@ stdcall NtGdiD3dContextDestroy(ptr) +@ stdcall NtGdiD3dContextDestroyAll(ptr) +@ stdcall NtGdiD3dValidateTextureStageState(ptr) +@ stdcall NtGdiD3dDrawPrimitives2(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdGetDriverState(ptr) +@ stdcall NtGdiDdAddAttachedSurface(ptr ptr ptr) +@ stdcall NtGdiDdAlphaBlt(ptr ptr ptr) +@ stdcall NtGdiDdAttachSurface(ptr ptr) +@ stdcall NtGdiDdBeginMoCompFrame(ptr ptr) +@ stdcall NtGdiDdBlt(ptr ptr ptr) +@ stdcall NtGdiDdCanCreateSurface(ptr ptr) +@ stdcall NtGdiDdCanCreateD3DBuffer(ptr ptr) +@ stdcall NtGdiDdColorControl(ptr ptr) +@ stdcall NtGdiDdCreateDirectDrawObject(ptr) +@ stdcall NtGdiDdCreateSurface(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdCreateD3DBuffer(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdCreateMoComp(ptr ptr) +@ stdcall NtGdiDdCreateSurfaceObject(ptr ptr ptr ptr ptr long) +@ stdcall NtGdiDdDeleteDirectDrawObject(ptr) +@ stdcall NtGdiDdDeleteSurfaceObject(ptr) +@ stdcall NtGdiDdDestroyMoComp(ptr ptr) +@ stdcall NtGdiDdDestroySurface(ptr long) +@ stdcall NtGdiDdDestroyD3DBuffer(ptr) +@ stdcall NtGdiDdEndMoCompFrame(ptr ptr) +@ stdcall NtGdiDdFlip(ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdFlipToGDISurface(ptr ptr) +@ stdcall NtGdiDdGetAvailDriverMemory(ptr ptr) +@ stdcall NtGdiDdGetBltStatus(ptr ptr) +@ stdcall NtGdiDdGetDC(ptr ptr) +@ stdcall NtGdiDdGetDriverInfo(ptr ptr) +@ stdcall NtGdiDdGetDxHandle(ptr ptr long) +@ stdcall NtGdiDdGetFlipStatus(ptr ptr) +@ stdcall NtGdiDdGetInternalMoCompInfo(ptr ptr) +@ stdcall NtGdiDdGetMoCompBuffInfo(ptr ptr) +@ stdcall NtGdiDdGetMoCompGuids(ptr ptr) +@ stdcall NtGdiDdGetMoCompFormats(ptr ptr) +@ stdcall NtGdiDdGetScanLine(ptr ptr) +@ stdcall NtGdiDdLock(ptr ptr ptr) +@ stdcall NtGdiDdLockD3D(ptr ptr) +@ stdcall NtGdiDdQueryDirectDrawObject(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdQueryMoCompStatus(ptr ptr) +@ stdcall NtGdiDdReenableDirectDrawObject(ptr ptr) +@ stdcall NtGdiDdReleaseDC(ptr) +@ stdcall NtGdiDdRenderMoComp(ptr ptr) +@ stdcall NtGdiDdResetVisrgn(ptr ptr) +@ stdcall NtGdiDdSetColorKey(ptr ptr) +@ stdcall NtGdiDdSetExclusiveMode(ptr ptr) +@ stdcall NtGdiDdSetGammaRamp(ptr ptr ptr) +@ stdcall NtGdiDdCreateSurfaceEx(ptr ptr long) +@ stdcall NtGdiDdSetOverlayPosition(ptr ptr ptr) +@ stdcall NtGdiDdUnattachSurface(ptr ptr) +@ stdcall NtGdiDdUnlock(ptr ptr) +@ stdcall NtGdiDdUnlockD3D(ptr ptr) +@ stdcall NtGdiDdUpdateOverlay(ptr ptr ptr) +@ stdcall NtGdiDdWaitForVerticalBlank(ptr ptr) +@ stdcall NtGdiDvpCanCreateVideoPort(ptr ptr) +@ stdcall NtGdiDvpColorControl(ptr ptr) +@ stdcall NtGdiDvpCreateVideoPort(ptr ptr) +@ stdcall NtGdiDvpDestroyVideoPort(ptr ptr) +@ stdcall NtGdiDvpFlipVideoPort(ptr ptr ptr ptr) +@ stdcall NtGdiDvpGetVideoPortBandwidth(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortField(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortFlipStatus(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortInputFormats(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortLine(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortOutputFormats(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortConnectInfo(ptr ptr) +@ stdcall NtGdiDvpGetVideoSignalStatus(ptr ptr) +@ stdcall NtGdiDvpUpdateVideoPort(ptr ptr ptr ptr) +@ stdcall NtGdiDvpWaitForVideoPortSync(ptr ptr) +@ stdcall NtGdiDvpAcquireNotification(ptr ptr ptr) +@ stdcall NtGdiDvpReleaseNotification(ptr ptr) +@ stdcall NtGdiDxgGenericThunk(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDeleteClientObj(ptr) +@ stdcall NtGdiDeleteColorSpace(ptr) +@ stdcall NtGdiDeleteColorTransform(ptr ptr) +@ stdcall NtGdiDeleteObjectApp(ptr) +@ stdcall NtGdiDescribePixelFormat(ptr long long ptr) +@ stdcall NtGdiGetPerBandInfo(ptr ptr) +@ stdcall NtGdiDoBanding(ptr long ptr ptr) +@ stdcall NtGdiDoPalette(ptr long long ptr long long) +@ stdcall NtGdiDrawEscape(ptr long long ptr) +@ stdcall NtGdiEllipse(ptr long long long long) +@ stdcall NtGdiEnableEudc(long) +@ stdcall NtGdiEndDoc(ptr) +@ stdcall NtGdiEndPage(ptr) +@ stdcall NtGdiEndPath(ptr) +@ stdcall NtGdiEnumFontChunk(ptr ptr long ptr ptr) +@ stdcall NtGdiEnumFontClose(ptr) +@ stdcall NtGdiEnumFontOpen(ptr long long long wstr long ptr) +@ stdcall NtGdiEnumObjects(ptr long long ptr) +@ stdcall NtGdiEqualRgn(ptr ptr) +@ stdcall NtGdiEudcLoadUnloadLink(wstr long wstr long long long long) +@ stdcall NtGdiExcludeClipRect(ptr long long long long) +@ stdcall NtGdiExtCreatePen(long long long long ptr ptr long ptr long long ptr) +@ stdcall NtGdiExtCreateRegion(ptr long ptr) +@ stdcall NtGdiExtEscape(ptr ptr long long long ptr long ptr) +@ stdcall NtGdiExtFloodFill(ptr long long long long) +@ stdcall NtGdiExtGetObjectW(ptr long ptr) +@ stdcall NtGdiExtSelectClipRgn(ptr ptr long) +@ stdcall NtGdiExtTextOutW(ptr long long long ptr wstr long ptr long) +@ stdcall NtGdiFillPath(ptr) +@ stdcall NtGdiFillRgn(ptr ptr ptr) +@ stdcall NtGdiFlattenPath(ptr) +@ stdcall NtGdiFlush() +@ stdcall NtGdiForceUFIMapping(ptr ptr) +@ stdcall NtGdiFrameRgn(ptr ptr ptr long long) +@ stdcall NtGdiFullscreenControl(long ptr long ptr ptr) +@ stdcall NtGdiGetAndSetDCDword(ptr long long ptr) +@ stdcall NtGdiGetAppClipBox(ptr ptr) +@ stdcall NtGdiGetBitmapBits(ptr long ptr) +@ stdcall NtGdiGetBitmapDimension(ptr ptr) +@ stdcall NtGdiGetBoundsRect(ptr ptr long) +@ stdcall NtGdiGetCharABCWidthsW(ptr long long ptr long ptr) +@ stdcall NtGdiGetCharacterPlacementW(ptr wstr long long ptr long) +@ stdcall NtGdiGetCharSet(ptr) +@ stdcall NtGdiGetCharWidthW(ptr long long ptr long ptr) +@ stdcall NtGdiGetCharWidthInfo(ptr ptr) +@ stdcall NtGdiGetColorAdjustment(ptr ptr) +@ stdcall NtGdiGetColorSpaceforBitmap(ptr) +@ stdcall NtGdiGetDCDword(ptr long ptr) +@ stdcall NtGdiGetDCforBitmap(ptr) +@ stdcall NtGdiGetDCObject(ptr long) +@ stdcall NtGdiGetDCPoint(ptr long ptr) +@ stdcall NtGdiGetDeviceCaps(ptr long) +@ stdcall NtGdiGetDeviceGammaRamp(ptr ptr) +@ stdcall NtGdiGetDeviceCapsAll(ptr ptr) +@ stdcall NtGdiGetDIBitsInternal(ptr ptr long long ptr ptr long long long) +@ stdcall NtGdiGetETM(ptr ptr) +@ stdcall NtGdiGetEudcTimeStampEx(wstr long long) +@ stdcall NtGdiGetFontData(ptr long long ptr long) +@ stdcall NtGdiGetFontResourceInfoInternalW(wstr long long long ptr ptr long) +@ stdcall NtGdiGetGlyphIndicesW(ptr wstr long ptr long) +@ stdcall NtGdiGetGlyphIndicesWInternal(ptr wstr long ptr long long) +@ stdcall NtGdiGetGlyphOutline(ptr long long ptr long ptr ptr long) +@ stdcall NtGdiGetKerningPairs(ptr long ptr) +@ stdcall NtGdiGetLinkedUFIs(ptr ptr long) +@ stdcall NtGdiGetMiterLimit(ptr ptr) +@ stdcall NtGdiGetMonitorID(ptr long ptr) +@ stdcall NtGdiGetNearestColor(ptr ptr) +@ stdcall NtGdiGetNearestPaletteIndex(ptr ptr) +@ stdcall NtGdiGetObjectBitmapHandle(ptr ptr) +@ stdcall NtGdiGetOutlineTextMetricsInternalW(ptr long ptr ptr) +@ stdcall NtGdiGetPath(ptr ptr ptr long) +@ stdcall NtGdiGetPixel(ptr long long) +@ stdcall NtGdiGetRandomRgn(ptr ptr long) +@ stdcall NtGdiGetRasterizerCaps(ptr long) +@ stdcall NtGdiGetRealizationInfo(ptr ptr ptr) +@ stdcall NtGdiGetRegionData(ptr long ptr) +@ stdcall NtGdiGetRgnBox(ptr ptr) +@ stdcall NtGdiGetServerMetaFileBits(ptr long ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetSpoolMessage(long long long long) +@ stdcall NtGdiGetStats(ptr long long ptr long) +@ stdcall NtGdiGetStockObject(ptr) +@ stdcall NtGdiGetStringBitmapW(ptr wstr long ptr long) +@ stdcall NtGdiGetSystemPaletteUse(ptr) +@ stdcall NtGdiGetTextCharsetInfo(ptr ptr long) +@ stdcall NtGdiGetTextExtent(ptr wstr long ptr long) +@ stdcall NtGdiGetTextExtentExW(ptr wstr long long ptr ptr ptr long) +@ stdcall NtGdiGetTextFaceW(ptr long ptr long) +@ stdcall NtGdiGetTextMetricsW(ptr ptr long) +@ stdcall NtGdiGetTransform(ptr long ptr) +@ stdcall NtGdiGetUFI(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetEmbUFI(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetUFIPathname(ptr ptr wstr ptr long ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetEmbedFonts() +@ stdcall NtGdiChangeGhostFont(ptr long) +@ stdcall NtGdiAddEmbFontToDC(ptr ptr) +@ stdcall NtGdiGetFontUnicodeRanges(ptr ptr) +@ stdcall NtGdiGetWidthTable(ptr long ptr long ptr ptr ptr) +@ stdcall NtGdiGradientFill(ptr ptr long ptr long long) +@ stdcall NtGdiHfontCreate(ptr long long long ptr) +@ stdcall NtGdiIcmBrushInfo(ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiInit() +@ stdcall NtGdiInitSpool() +@ stdcall NtGdiIntersectClipRect(ptr long long long long) +@ stdcall NtGdiInvertRgn(ptr ptr) +@ stdcall NtGdiLineTo(ptr long long) +@ stdcall NtGdiMakeFontDir(long ptr long wstr long) +@ stdcall NtGdiMakeInfoDC(ptr long) +@ stdcall NtGdiMaskBlt(ptr long long long long ptr long long ptr long long long long) +@ stdcall NtGdiModifyWorldTransform(ptr ptr long) +@ stdcall NtGdiMonoBitmap(ptr) +@ stdcall NtGdiMoveTo(ptr long long ptr) +@ stdcall NtGdiOffsetClipRgn(ptr long long) +@ stdcall NtGdiOffsetRgn(ptr long long) +@ stdcall NtGdiOpenDCW(ptr ptr ptr long long ptr ptr) +@ stdcall NtGdiPatBlt(ptr long long long long long) +@ stdcall NtGdiPolyPatBlt(ptr long ptr long long) +@ stdcall NtGdiPathToRegion(ptr) +@ stdcall NtGdiPlgBlt(ptr ptr ptr long long long long ptr long long long) +@ stdcall NtGdiPolyDraw(ptr ptr ptr long) +@ stdcall NtGdiPolyPolyDraw(ptr ptr ptr long long) +@ stdcall NtGdiPolyTextOutW(ptr ptr long long) +@ stdcall NtGdiPtInRegion(ptr long long) +@ stdcall NtGdiPtVisible(ptr long long) +@ stdcall NtGdiQueryFonts(ptr long ptr) +@ stdcall NtGdiQueryFontAssocInfo(ptr) +@ stdcall NtGdiRectangle(ptr long long long long) +@ stdcall NtGdiRectInRegion(ptr ptr) +@ stdcall NtGdiRectVisible(ptr ptr) +@ stdcall NtGdiRemoveFontResourceW(ptr long long long long ptr) +@ stdcall NtGdiRemoveFontMemResourceEx(ptr) +@ stdcall NtGdiResetDC(ptr ptr ptr ptr ptr) +@ stdcall NtGdiResizePalette(ptr long) +@ stdcall NtGdiRestoreDC(ptr long) +@ stdcall NtGdiRoundRect(ptr long long long long long long) +@ stdcall NtGdiSaveDC(ptr) +@ stdcall NtGdiScaleViewportExtEx(ptr long long long long ptr) +@ stdcall NtGdiScaleWindowExtEx(ptr long long long long ptr) +@ stdcall NtGdiSelectBitmap(ptr ptr) +@ stdcall NtGdiSelectBrush(ptr ptr) +@ stdcall NtGdiSelectClipPath(ptr long) +@ stdcall NtGdiSelectFont(ptr ptr) +@ stdcall NtGdiSelectPen(ptr ptr) +@ stdcall NtGdiSetBitmapAttributes(ptr long) +@ stdcall NtGdiSetBitmapBits(ptr long ptr) +@ stdcall NtGdiSetBitmapDimension(ptr long long ptr) +@ stdcall NtGdiSetBoundsRect(ptr ptr long) +@ stdcall NtGdiSetBrushAttributes(ptr long) +@ stdcall NtGdiSetBrushOrg(ptr long long ptr) +@ stdcall NtGdiSetColorAdjustment(ptr ptr) +@ stdcall NtGdiSetColorSpace(ptr ptr) +@ stdcall NtGdiSetDeviceGammaRamp(ptr ptr) +@ stdcall NtGdiSetDIBitsToDeviceInternal(ptr long long long long long long long long ptr ptr long long long long ptr) +@ stdcall NtGdiSetFontEnumeration(long) +@ stdcall NtGdiSetFontXform(ptr long long) +@ stdcall NtGdiSetIcmMode(ptr long long) +@ stdcall NtGdiSetLinkedUFIs(ptr ptr long) +@ stdcall NtGdiSetMagicColors(ptr long long) +@ stdcall NtGdiSetMetaRgn(ptr) +@ stdcall NtGdiSetMiterLimit(ptr long ptr) +@ stdcall NtGdiGetDeviceWidth(ptr) +@ stdcall NtGdiMirrorWindowOrg(ptr) +@ stdcall NtGdiSetLayout(ptr long long) +@ stdcall NtGdiSetPixel(ptr long long long) +@ stdcall NtGdiSetPixelFormat(ptr long) +@ stdcall NtGdiSetRectRgn(ptr long long long long) +@ stdcall NtGdiSetSystemPaletteUse(ptr long) +@ stdcall NtGdiSetTextJustification(ptr long long) +@ stdcall NtGdiSetupPublicCFONT(ptr ptr long) +@ stdcall NtGdiSetVirtualResolution(ptr long long long long) +@ stdcall NtGdiSetSizeDevice(ptr long long) +@ stdcall NtGdiStartDoc(ptr ptr ptr long) +@ stdcall NtGdiStartPage(ptr) +@ stdcall NtGdiStretchBlt(ptr long long long long ptr long long long long long long) +@ stdcall NtGdiStretchDIBitsInternal(ptr long long long long long long long long ptr ptr long long long long ptr) +@ stdcall NtGdiStrokeAndFillPath(ptr) +@ stdcall NtGdiStrokePath(ptr) +@ stdcall NtGdiSwapBuffers(ptr) +@ stdcall NtGdiTransformPoints(ptr ptr ptr long long) +@ stdcall NtGdiTransparentBlt(ptr long long long long ptr long long long long long) +@ stdcall NtGdiUnloadPrinterDriver(wstr long) +@ stdcall NtGdiUnmapMemFont(ptr) +@ stdcall NtGdiUnrealizeObject(ptr) +@ stdcall NtGdiUpdateColors(ptr) +@ stdcall NtGdiWidenPath(ptr) +@ stdcall NtUserActivateKeyboardLayout(ptr long) +@ stdcall NtUserAlterWindowStyle(long long long) +@ stdcall NtUserAssociateInputContext(long long long) +@ stdcall NtUserAttachThreadInput(long long long) +@ stdcall NtUserBeginPaint(ptr ptr) +@ stdcall NtUserBitBltSysBmp(ptr long long long long long long long) +@ stdcall NtUserBlockInput(long) +@ stdcall NtUserBuildHimcList(long long long long) +@ stdcall NtUserBuildHwndList(ptr ptr long long long ptr ptr) +@ stdcall NtUserBuildNameList(ptr long ptr ptr) +@ stdcall NtUserBuildPropList(ptr ptr long ptr) +@ stdcall NtUserCallHwnd(ptr long) +@ stdcall NtUserCallHwndLock(ptr long) +@ stdcall NtUserCallHwndOpt(ptr long) +@ stdcall NtUserCallHwndParam(ptr long long) +@ stdcall NtUserCallHwndParamLock(ptr long long) +@ stdcall NtUserCallMsgFilter(ptr long) +@ stdcall NtUserCallNextHookEx(long ptr ptr long) +@ stdcall NtUserCallNoParam(long) +@ stdcall NtUserCallOneParam(ptr long) +@ stdcall NtUserCallTwoParam(ptr ptr long) +@ stdcall NtUserChangeClipboardChain(ptr ptr) +@ stdcall NtUserChangeDisplaySettings(ptr ptr ptr long) +@ stdcall NtUserCheckImeHotKey(long long) +@ stdcall NtUserCheckMenuItem(ptr long long) +@ stdcall NtUserChildWindowFromPointEx(ptr long long long) +@ stdcall NtUserClipCursor(ptr) +@ stdcall NtUserCloseClipboard() +@ stdcall NtUserCloseDesktop(ptr) +@ stdcall NtUserCloseWindowStation(ptr) +@ stdcall NtUserConsoleControl(long long long) +@ stdcall NtUserConvertMemHandle(ptr long) +@ stdcall NtUserCopyAcceleratorTable(ptr ptr long) +@ stdcall NtUserCountClipboardFormats() +@ stdcall NtUserCreateAcceleratorTable(ptr ptr) +@ stdcall NtUserCreateCaret(ptr ptr long long) +@ stdcall NtUserCreateDesktop(ptr ptr ptr long long) +@ stdcall NtUserCreateInputContext(long) +@ stdcall NtUserCreateLocalMemHandle(ptr ptr long ptr) +@ stdcall NtUserCreateWindowEx(long ptr ptr ptr long long long long long ptr ptr ptr ptr long ptr) +@ stdcall NtUserCreateWindowStation(ptr long long long long long long) +@ stdcall NtUserDdeGetQualityOfService(ptr ptr ptr) +@ stdcall NtUserDdeInitialize(long long long long long) +@ stdcall NtUserDdeSetQualityOfService(ptr ptr ptr) +@ stdcall NtUserDeferWindowPos(ptr ptr ptr long long long long long) +@ stdcall NtUserDefSetText(ptr ptr) +@ stdcall NtUserDeleteMenu(ptr long long) +@ stdcall NtUserDestroyAcceleratorTable(ptr) +@ stdcall NtUserDestroyCursor(ptr long) +@ stdcall NtUserDestroyInputContext(long) +@ stdcall NtUserDestroyMenu(ptr) +@ stdcall NtUserDestroyWindow(ptr) +@ stdcall NtUserDisableThreadIme(long) +@ stdcall NtUserDispatchMessage(ptr) +@ stdcall NtUserDragDetect(ptr ptr long) +@ stdcall NtUserDragObject(ptr ptr long long ptr) +@ stdcall NtUserDrawAnimatedRects(ptr long ptr ptr) +@ stdcall NtUserDrawCaption(ptr ptr ptr long) +@ stdcall NtUserDrawCaptionTemp(ptr ptr ptr ptr ptr ptr long) +@ stdcall NtUserDrawIconEx(ptr long long ptr long long long ptr long long ptr) +@ stdcall NtUserDrawMenuBarTemp(ptr ptr ptr ptr ptr) +@ stdcall NtUserEmptyClipboard() +@ stdcall NtUserEnableMenuItem(ptr long long) +@ stdcall NtUserEnableScrollBar(ptr long long) +@ stdcall NtUserEndDeferWindowPosEx(ptr long) +@ stdcall NtUserEndMenu() +@ stdcall NtUserEndPaint(ptr ptr) +@ stdcall NtUserEnumDisplayDevices(ptr long ptr long) +@ stdcall NtUserEnumDisplayMonitors(ptr ptr ptr ptr) +@ stdcall NtUserEnumDisplaySettings(ptr long ptr long) +@ stdcall NtUserEvent(long) +@ stdcall NtUserExcludeUpdateRgn(ptr ptr) +@ stdcall NtUserFillWindow(ptr ptr ptr ptr) +@ stdcall NtUserFindExistingCursorIcon(ptr ptr ptr) +@ stdcall NtUserFindWindowEx(ptr ptr ptr ptr long) +@ stdcall NtUserFlashWindowEx(ptr) +@ stdcall NtUserGetAltTabInfo(ptr long ptr wstr long long) +@ stdcall NtUserGetAncestor(ptr long) +@ stdcall NtUserGetAppImeLevel(long) +@ stdcall NtUserGetAsyncKeyState(long) +@ stdcall NtUserGetAtomName(long ptr) +@ stdcall NtUserGetCaretBlinkTime() +@ stdcall NtUserGetCaretPos(ptr) +@ stdcall NtUserGetClassInfoEx(ptr ptr ptr ptr long) +@ stdcall NtUserGetClassName(ptr long ptr) +@ stdcall NtUserGetClipboardData(long ptr) +@ stdcall NtUserGetClipboardFormatName(long wstr ptr) +@ stdcall NtUserGetClipboardOwner() +@ stdcall NtUserGetClipboardSequenceNumber() +@ stdcall NtUserGetClipboardViewer() +@ stdcall NtUserGetClipCursor(ptr) +@ stdcall NtUserGetComboBoxInfo(ptr ptr) +@ stdcall NtUserGetControlBrush(ptr ptr long) +@ stdcall NtUserGetControlColor(ptr ptr ptr long) +@ stdcall NtUserGetCPD(ptr long ptr) +@ stdcall NtUserGetCursorFrameInfo(ptr long ptr ptr) +@ stdcall NtUserGetCursorInfo(ptr) +@ stdcall NtUserGetDC(ptr) +@ stdcall NtUserGetDCEx(ptr ptr long) +@ stdcall NtUserGetDoubleClickTime() +@ stdcall NtUserGetForegroundWindow() +@ stdcall NtUserGetGuiResources(ptr long) +@ stdcall NtUserGetGUIThreadInfo(long ptr) +@ stdcall NtUserGetIconInfo(ptr ptr ptr ptr ptr long) +@ stdcall NtUserGetIconSize(ptr long ptr ptr) +@ stdcall NtUserGetImeHotKey(long long long long) +@ stdcall NtUserGetImeInfoEx(long long) +@ stdcall NtUserGetInternalWindowPos(ptr ptr ptr) +@ stdcall NtUserGetKeyboardLayoutList(long ptr) +@ stdcall NtUserGetKeyboardLayoutName(str) +@ stdcall NtUserGetKeyboardState(ptr) +@ stdcall NtUserGetKeyNameText(long wstr long) +@ stdcall NtUserGetKeyState(long) +@ stdcall NtUserGetListBoxInfo(ptr) +@ stdcall NtUserGetMenuBarInfo(ptr long long ptr) +@ stdcall NtUserGetMenuIndex(ptr ptr) +@ stdcall NtUserGetMenuItemRect(ptr ptr long ptr) +@ stdcall NtUserGetMessage(ptr ptr long long) +@ stdcall NtUserGetMouseMovePointsEx(long ptr ptr long long) +@ stdcall NtUserGetObjectInformation(ptr long ptr long ptr) +@ stdcall NtUserGetOpenClipboardWindow() +@ stdcall NtUserGetPriorityClipboardFormat(ptr long) +@ stdcall NtUserGetProcessWindowStation() +@ stdcall NtUserGetRawInputBuffer(ptr ptr long) +@ stdcall NtUserGetRawInputData(ptr long ptr ptr long) +@ stdcall NtUserGetRawInputDeviceInfo(ptr long ptr ptr) +@ stdcall NtUserGetRawInputDeviceList(ptr ptr long) +@ stdcall NtUserGetRegisteredRawInputDevices(ptr ptr long) +@ stdcall NtUserGetScrollBarInfo(ptr long ptr) +@ stdcall NtUserGetSystemMenu(ptr long) +@ stdcall NtUserGetThreadDesktop(long long) +@ stdcall NtUserGetThreadState(ptr) +@ stdcall NtUserGetTitleBarInfo(ptr ptr) +@ stdcall NtUserGetUpdateRect(ptr ptr long) +@ stdcall NtUserGetUpdateRgn(ptr ptr long) +@ stdcall NtUserGetWindowDC(ptr) +@ stdcall NtUserGetWindowPlacement(ptr ptr) +@ stdcall NtUserGetWOWClass(ptr ptr) +@ stdcall NtUserHardErrorControl(long long long) +@ stdcall NtUserHideCaret(ptr) +@ stdcall NtUserHiliteMenuItem(ptr ptr long long) +@ stdcall NtUserImpersonateDdeClientWindow(ptr ptr) +@ stdcall NtUserInitialize(long ptr ptr) +@ stdcall NtUserInitializeClientPfnArrays(ptr ptr ptr ptr) +@ stdcall NtUserInitTask(long long long long long long long long long long long long) +@ stdcall NtUserInternalGetWindowText(ptr wstr ptr) +@ stdcall NtUserInvalidateRect(ptr ptr long) +@ stdcall NtUserInvalidateRgn(ptr ptr long) +@ stdcall NtUserIsClipboardFormatAvailable(long) +@ stdcall NtUserKillTimer(ptr ptr) +@ stdcall NtUserLoadKeyboardLayoutEx(ptr long ptr ptr ptr long long) +@ stdcall NtUserLockWindowStation(ptr) +@ stdcall NtUserLockWindowUpdate(ptr) +@ stdcall NtUserLockWorkStation() +@ stdcall NtUserMapVirtualKeyEx(long long long ptr) +@ stdcall NtUserMenuItemFromPoint(ptr ptr long long) +@ stdcall NtUserMessageCall(ptr long ptr ptr ptr long long) +@ stdcall NtUserMinMaximize(ptr long long) +@ stdcall NtUserMNDragLeave() +@ stdcall NtUserMNDragOver(long long) +@ stdcall NtUserModifyUserStartupInfoFlags(long long) +@ stdcall NtUserMoveWindow(ptr long long long long long) +@ stdcall NtUserNotifyIMEStatus(long long long) +@ stdcall NtUserNotifyProcessCreate(long long long long) +@ stdcall NtUserNotifyWinEvent(long long long long) +@ stdcall NtUserOpenClipboard(ptr long) +@ stdcall NtUserOpenDesktop(ptr long long) +@ stdcall NtUserOpenInputDesktop(long long long) +@ stdcall NtUserOpenWindowStation(ptr long) +@ stdcall NtUserPaintDesktop(ptr) +@ stdcall NtUserPeekMessage(ptr ptr long long long) +@ stdcall NtUserPostMessage(ptr long long long) +@ stdcall NtUserPostThreadMessage(long long long long) +@ stdcall NtUserPrintWindow(ptr ptr long) +@ stdcall NtUserProcessConnect(ptr ptr long) +@ stdcall NtUserQueryInformationThread(long long long long) +@ stdcall NtUserQueryInputContext(long long) +@ stdcall NtUserQuerySendMessage(long) +@ stdcall NtUserQueryWindow(ptr long) +@ stdcall NtUserRealChildWindowFromPoint(ptr long long) +@ stdcall NtUserRealInternalGetMessage(ptr ptr long long long long) +@ stdcall NtUserRealWaitMessageEx(long long) +@ stdcall NtUserRedrawWindow(ptr ptr ptr long) +@ stdcall NtUserRegisterClassExWOW(ptr ptr ptr ptr long long ptr) +@ stdcall NtUserRegisterUserApiHook(ptr ptr long long) +@ stdcall NtUserRegisterHotKey(ptr long long long) +@ stdcall NtUserRegisterRawInputDevices(ptr long long) +@ stdcall NtUserRegisterTasklist(long) +@ stdcall NtUserRegisterWindowMessage(ptr) +@ stdcall NtUserRemoveMenu(ptr long long) +@ stdcall NtUserRemoveProp(ptr long) +@ stdcall NtUserResolveDesktop(long long long long) +@ stdcall NtUserResolveDesktopForWOW(long) +@ stdcall NtUserSBGetParms(ptr long ptr ptr) +@ stdcall NtUserScrollDC(ptr long long ptr ptr ptr ptr) +@ stdcall NtUserScrollWindowEx(ptr long long ptr ptr ptr ptr long) +@ stdcall NtUserSelectPalette(ptr ptr long) +@ stdcall NtUserSendInput(long ptr long) +@ stdcall NtUserSetActiveWindow(ptr) +@ stdcall NtUserSetAppImeLevel(long long) +@ stdcall NtUserSetCapture(ptr) +@ stdcall NtUserSetClassLong(ptr long ptr long) +@ stdcall NtUserSetClassWord(ptr long long) +@ stdcall NtUserSetClipboardData(long ptr ptr) +@ stdcall NtUserSetClipboardViewer(ptr) +@ stdcall NtUserSetConsoleReserveKeys(long long) +@ stdcall NtUserSetCursor(ptr) +@ stdcall NtUserSetCursorContents(ptr ptr) +@ stdcall NtUserSetCursorIconData(ptr ptr ptr ptr) +@ stdcall NtUserSetFocus(ptr) +@ stdcall NtUserSetImeHotKey(long long long long long) +@ stdcall NtUserSetImeInfoEx(long) +@ stdcall NtUserSetImeOwnerWindow(long long) +@ stdcall NtUserSetInformationProcess(long long long long) +@ stdcall NtUserSetInformationThread(ptr long ptr long) +@ stdcall NtUserSetInternalWindowPos(ptr long ptr ptr) +@ stdcall NtUserSetKeyboardState(ptr) +@ stdcall NtUserSetLogonNotifyWindow(ptr) +@ stdcall NtUserSetMenu(ptr ptr long) +@ stdcall NtUserSetMenuContextHelpId(ptr long) +@ stdcall NtUserSetMenuDefaultItem(ptr long long) +@ stdcall NtUserSetMenuFlagRtoL(ptr) +@ stdcall NtUserSetObjectInformation(ptr long ptr long) +@ stdcall NtUserSetParent(ptr ptr) +@ stdcall NtUserSetProcessWindowStation(ptr) +@ stdcall NtUserSetProp(ptr long ptr) +@ stdcall NtUserSetScrollInfo(ptr long ptr long) +@ stdcall NtUserSetShellWindowEx(ptr ptr) +@ stdcall NtUserSetSysColors(long ptr ptr long) +@ stdcall NtUserSetSystemCursor(ptr long) +@ stdcall NtUserSetSystemMenu(ptr ptr) +@ stdcall NtUserSetSystemTimer(ptr ptr long ptr) +@ stdcall NtUserSetThreadDesktop(ptr) +@ stdcall NtUserSetThreadLayoutHandles(long long) +@ stdcall NtUserSetThreadState(long long) +@ stdcall NtUserSetTimer(ptr ptr long ptr) +@ stdcall NtUserSetWindowFNID(ptr long) +@ stdcall NtUserSetWindowLong(ptr long long long) +@ stdcall NtUserSetWindowPlacement(ptr ptr) +@ stdcall NtUserSetWindowPos(ptr ptr long long long long long) +@ stdcall NtUserSetWindowRgn(ptr ptr long) +@ stdcall NtUserSetWindowsHookAW(long ptr long) +@ stdcall NtUserSetWindowsHookEx(ptr ptr long long ptr long) +@ stdcall NtUserSetWindowStationUser(long long long long) +@ stdcall NtUserSetWindowWord(ptr long long) +@ stdcall NtUserSetWinEventHook(long long ptr ptr ptr long long long) +@ stdcall NtUserShowCaret(ptr) +@ stdcall NtUserShowScrollBar(ptr long long) +@ stdcall NtUserShowWindow(ptr long) +@ stdcall NtUserShowWindowAsync(ptr long) +@ stdcall NtUserSoundSentry() +@ stdcall NtUserSwitchDesktop(ptr) +@ stdcall NtUserSystemParametersInfo(long long ptr long) +@ stdcall NtUserTestForInteractiveUser(long) +@ stdcall NtUserThunkedMenuInfo(ptr ptr) +@ stdcall NtUserThunkedMenuItemInfo(ptr long long long ptr ptr) +@ stdcall NtUserToUnicodeEx(long long ptr wstr long long ptr) +@ stdcall NtUserTrackMouseEvent(ptr) +@ stdcall NtUserTrackPopupMenuEx(ptr long long long ptr ptr) +@ stdcall NtUserCalcMenuBar(long long long long long) +@ stdcall NtUserPaintMenuBar(long long long long long long) +@ stdcall NtUserTranslateAccelerator(ptr ptr ptr) +@ stdcall NtUserTranslateMessage(ptr long) +@ stdcall NtUserUnhookWindowsHookEx(ptr) +@ stdcall NtUserUnhookWinEvent(ptr) +@ stdcall NtUserUnloadKeyboardLayout(ptr) +@ stdcall NtUserUnlockWindowStation(ptr) +@ stdcall NtUserUnregisterClass(ptr ptr ptr) +@ stdcall NtUserUnregisterUserApiHook() +@ stdcall NtUserUnregisterHotKey(ptr long) +@ stdcall NtUserUpdateInputContext(long long long) +@ stdcall NtUserUpdateInstance(long long long) +@ stdcall NtUserUpdateLayeredWindow(ptr ptr ptr ptr ptr ptr long ptr long ptr) +@ stdcall NtUserGetLayeredWindowAttributes(ptr ptr ptr ptr) +@ stdcall NtUserSetLayeredWindowAttributes(ptr long long long) +@ stdcall NtUserUpdatePerUserSystemParameters(long long) +@ stdcall NtUserUserHandleGrantAccess(ptr ptr long) +@ stdcall NtUserValidateHandleSecure(ptr) +@ stdcall NtUserValidateRect(ptr ptr) +@ stdcall NtUserValidateTimerCallback(ptr) +@ stdcall NtUserVkKeyScanEx(long ptr long) +@ stdcall NtUserWaitForInputIdle(ptr long long) +@ stdcall NtUserWaitForMsgAndEvent(long) +@ stdcall NtUserWaitMessage() +@ stdcall NtUserWin32PoolAllocationStats(long long long long long long) +@ stdcall NtUserWindowFromPoint(long long) +@ stdcall NtUserYieldTask() +@ stdcall NtUserRemoteConnect(long long long) +@ stdcall NtUserRemoteRedrawRectangle(long long long long) +@ stdcall NtUserRemoteRedrawScreen() +@ stdcall NtUserRemoteStopScreenUpdates() +@ stdcall NtUserCtxDisplayIOCtl(long long long) +@ stdcall NtGdiEngAssociateSurface(ptr ptr long) +@ stdcall NtGdiEngCreateBitmap(long long long long long ptr) +@ stdcall NtGdiEngCreateDeviceSurface(ptr long long long) +@ stdcall NtGdiEngCreateDeviceBitmap(ptr long long long) +@ stdcall NtGdiEngCreatePalette(long long ptr long long long) +@ stdcall NtGdiEngComputeGlyphSet(ptr ptr ptr) +@ stdcall NtGdiEngCopyBits(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngDeletePalette(ptr) +@ stdcall NtGdiEngDeleteSurface(ptr) +@ stdcall NtGdiEngEraseSurface(ptr ptr long) +@ stdcall NtGdiEngUnlockSurface(ptr) +@ stdcall NtGdiEngLockSurface(ptr) +@ stdcall NtGdiEngBitBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStretchBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiEngPlgBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiEngMarkBandingSurface(ptr) +@ stdcall NtGdiEngStrokePath(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngFillPath(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStrokeAndFillPath(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngPaint(ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngLineTo(ptr ptr ptr long long long long ptr ptr) +@ stdcall NtGdiEngAlphaBlend(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngGradientFill(ptr ptr ptr ptr long ptr long ptr ptr long) +@ stdcall NtGdiEngTransparentBlt(ptr ptr ptr ptr ptr ptr long long) +@ stdcall NtGdiEngTextOut(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStretchBltROP(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long ptr long) +@ stdcall NtGdiXLATEOBJ_cGetPalette(ptr long long ptr) +@ stdcall NtGdiXLATEOBJ_iXlate(ptr long) +@ stdcall NtGdiXLATEOBJ_hGetColorTransform(ptr) +@ stdcall NtGdiCLIPOBJ_bEnum(ptr long long) +@ stdcall NtGdiCLIPOBJ_cEnumStart(ptr long long long long) +@ stdcall NtGdiCLIPOBJ_ppoGetPath(ptr) +@ stdcall NtGdiEngDeletePath(ptr) +@ stdcall NtGdiEngCreateClip() +@ stdcall NtGdiEngDeleteClip(ptr) +@ stdcall NtGdiBRUSHOBJ_ulGetBrushColor(ptr) +@ stdcall NtGdiBRUSHOBJ_pvAllocRbrush(ptr long) +@ stdcall NtGdiBRUSHOBJ_pvGetRbrush(ptr) +@ stdcall NtGdiBRUSHOBJ_hGetColorTransform(ptr) +@ stdcall NtGdiXFORMOBJ_bApplyXform(ptr ptr long long ptr) +@ stdcall NtGdiXFORMOBJ_iGetXform(ptr ptr) +@ stdcall NtGdiFONTOBJ_vGetInfo(ptr long ptr) +@ stdcall NtGdiFONTOBJ_pxoGetXform(ptr) +@ stdcall NtGdiFONTOBJ_cGetGlyphs(ptr long long ptr ptr) +@ stdcall NtGdiFONTOBJ_pifi(ptr) +@ stdcall NtGdiFONTOBJ_pfdg(ptr) +@ stdcall NtGdiFONTOBJ_pQueryGlyphAttrs(ptr long) +@ stdcall NtGdiFONTOBJ_pvTrueTypeFontFile(ptr ptr) +@ stdcall NtGdiFONTOBJ_cGetAllGlyphHandles(ptr ptr) +@ stdcall NtGdiSTROBJ_bEnum(ptr ptr ptr) +@ stdcall NtGdiSTROBJ_bEnumPositionsOnly(ptr ptr ptr) +@ stdcall NtGdiSTROBJ_bGetAdvanceWidths(ptr long long ptr) +@ stdcall NtGdiSTROBJ_vEnumStart(ptr) +@ stdcall NtGdiSTROBJ_dwGetCodePage(ptr) +@ stdcall NtGdiPATHOBJ_vGetBounds(ptr ptr) +@ stdcall NtGdiPATHOBJ_bEnum(ptr ptr) +@ stdcall NtGdiPATHOBJ_vEnumStart(ptr) +@ stdcall NtGdiPATHOBJ_vEnumStartClipLines(ptr ptr ptr ptr) +@ stdcall NtGdiPATHOBJ_bEnumClipLines(ptr long ptr) +@ stdcall NtGdiGetDhpdev(ptr) +@ stdcall NtGdiEngCheckAbort(ptr) +@ stdcall NtGdiHT_Get8BPPFormatPalette(ptr long long long) +@ stdcall NtGdiHT_Get8BPPMaskPalette(ptr long long long long long) +@ stdcall NtGdiUpdateTransform(ptr) +@ stdcall NtGdiSetPUMPDOBJ(ptr long ptr ptr) +@ stdcall NtGdiBRUSHOBJ_DeleteRbrush(ptr ptr) +@ stdcall NtGdiUMPDEngFreeUserMem(ptr) +@ stdcall NtGdiDrawStream(ptr long ptr) +@ stdcall NtGdiMakeObjectXferable(ptr long) +@ stdcall NtGdiMakeObjectUnXferable(ptr) diff --git a/rostests/apitests/w32kdll/w32kdll_2ksp4/CMakeLists.txt b/rostests/apitests/w32kdll/w32kdll_2ksp4/CMakeLists.txt index 66768eeef4d..6ae24d5667f 100644 --- a/rostests/apitests/w32kdll/w32kdll_2ksp4/CMakeLists.txt +++ b/rostests/apitests/w32kdll/w32kdll_2ksp4/CMakeLists.txt @@ -1,6 +1,9 @@ +spec2def(w32kdll_2ksp4.dll w32kdll_2ksp4.spec) -add_library(w32kdll_2ksp4 SHARED main.c w32kdll_2ksp4.S) +add_library(w32kdll_2ksp4 SHARED + main.c + w32kdll_2ksp4.S + ${CMAKE_CURRENT_BINARY_DIR}/w32kdll_2ksp4.def) set_entrypoint(w32kdll_2ksp4 0) -target_link_libraries(w32kdll_2ksp4 ${CMAKE_CURRENT_SOURCE_DIR}/w32kdll_2ksp4.def) -add_dependencies(w32kdll_2ksp4 psdk ) -add_importlib_target(w32kdll_2ksp4.def) + +add_dependencies(w32kdll_2ksp4 psdk) diff --git a/rostests/apitests/w32kdll/w32kdll_2ksp4/w32kdll_2ksp4.spec b/rostests/apitests/w32kdll/w32kdll_2ksp4/w32kdll_2ksp4.spec new file mode 100644 index 00000000000..36ec7066d1c --- /dev/null +++ b/rostests/apitests/w32kdll/w32kdll_2ksp4/w32kdll_2ksp4.spec @@ -0,0 +1,646 @@ +; +; ReactOS Operating System +; +; This file contains all win32k native api functions from win 2000 sp4 +; + +@ stdcall NtGdiAbortDoc(ptr) +@ stdcall NtGdiAbortPath(ptr) +@ stdcall NtGdiAddFontResourceW(wstr long long long long ptr) +@ stdcall NtGdiAddRemoteFontToDC(ptr ptr long ptr) +@ stdcall NtGdiAddFontMemResourceEx(ptr long ptr long ptr) +@ stdcall NtGdiRemoveMergeFont(ptr ptr) +@ stdcall NtGdiAddRemoteMMInstanceToDC(ptr ptr long) +@ stdcall NtGdiAlphaBlend(ptr long long long long ptr long long long long long ptr) +@ stdcall NtGdiAngleArc(ptr long long long long long) +@ stdcall NtGdiAnyLinkedFonts() +@ stdcall NtGdiFontIsLinked(ptr) +@ stdcall NtGdiArcInternal(long ptr long long long long long long long long) +@ stdcall NtGdiBeginPath(ptr) +@ stdcall NtGdiBitBlt(ptr long long long long ptr long long long long long) +@ stdcall NtGdiCancelDC(ptr) +@ stdcall NtGdiCheckBitmapBits(ptr ptr ptr long long long long ptr) +@ stdcall NtGdiCloseFigure(ptr) +@ stdcall NtGdiColorCorrectPalette(ptr ptr long long ptr long) +@ stdcall NtGdiCombineRgn(ptr ptr ptr long) +@ stdcall NtGdiCombineTransform(ptr ptr ptr) +@ stdcall NtGdiComputeXformCoefficients(ptr) +@ stdcall NtGdiConsoleTextOut(ptr ptr long ptr) +@ stdcall NtGdiConvertMetafileRect(ptr ptr) +@ stdcall NtGdiCreateBitmap(long long long long ptr) +@ stdcall NtGdiCreateClientObj(long) +@ stdcall NtGdiCreateColorSpace(ptr) +@ stdcall NtGdiCreateColorTransform(ptr ptr ptr long ptr long ptr long) +@ stdcall NtGdiCreateCompatibleBitmap(ptr long long) +@ stdcall NtGdiCreateCompatibleDC(ptr) +@ stdcall NtGdiCreateDIBBrush(ptr long long long long ptr) +@ stdcall NtGdiCreateDIBitmapInternal(ptr long long long ptr ptr long long long long ptr) +@ stdcall NtGdiCreateDIBSection(ptr ptr long ptr long long long ptr ptr) +@ stdcall NtGdiCreateEllipticRgn(long long long long) +@ stdcall NtGdiCreateHalftonePalette(ptr) +@ stdcall NtGdiCreateHatchBrushInternal(long long long) +@ stdcall NtGdiCreateMetafileDC(ptr) +@ stdcall NtGdiCreatePaletteInternal(ptr long) +@ stdcall NtGdiCreatePatternBrushInternal(ptr long long) +@ stdcall NtGdiCreatePen(long long long ptr) +@ stdcall NtGdiCreateRectRgn(long long long long) +@ stdcall NtGdiCreateRoundRectRgn(long long long long long long) +@ stdcall NtGdiCreateServerMetaFile(long long ptr long long long) +@ stdcall NtGdiCreateSolidBrush(long ptr) +@ stdcall NtGdiD3dContextCreate(ptr ptr ptr ptr) +@ stdcall NtGdiD3dContextDestroy(ptr) +@ stdcall NtGdiD3dContextDestroyAll(ptr) +@ stdcall NtGdiD3dValidateTextureStageState(ptr) +@ stdcall NtGdiD3dDrawPrimitives2(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdGetDriverState(ptr) +@ stdcall NtGdiDdAddAttachedSurface(ptr ptr ptr) +@ stdcall NtGdiDdAlphaBlt(ptr ptr ptr) +@ stdcall NtGdiDdAttachSurface(ptr ptr) +@ stdcall NtGdiDdBeginMoCompFrame(ptr ptr) +@ stdcall NtGdiDdBlt(ptr ptr ptr) +@ stdcall NtGdiDdCanCreateSurface(ptr ptr) +@ stdcall NtGdiDdCanCreateD3DBuffer(ptr ptr) +@ stdcall NtGdiDdColorControl(ptr ptr) +@ stdcall NtGdiDdCreateDirectDrawObject(ptr) +@ stdcall NtGdiDdCreateSurface(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdCreateD3DBuffer(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdCreateMoComp(ptr ptr) +@ stdcall NtGdiDdCreateSurfaceObject(ptr ptr ptr ptr ptr long) +@ stdcall NtGdiDdDeleteDirectDrawObject(ptr) +@ stdcall NtGdiDdDeleteSurfaceObject(ptr) +@ stdcall NtGdiDdDestroyMoComp(ptr ptr) +@ stdcall NtGdiDdDestroySurface(ptr long) +@ stdcall NtGdiDdDestroyD3DBuffer(ptr) +@ stdcall NtGdiDdEndMoCompFrame(ptr ptr) +@ stdcall NtGdiDdFlip(ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdFlipToGDISurface(ptr ptr) +@ stdcall NtGdiDdGetAvailDriverMemory(ptr ptr) +@ stdcall NtGdiDdGetBltStatus(ptr ptr) +@ stdcall NtGdiDdGetDC(ptr ptr) +@ stdcall NtGdiDdGetDriverInfo(ptr ptr) +@ stdcall NtGdiDdGetDxHandle(ptr ptr long) +@ stdcall NtGdiDdGetFlipStatus(ptr ptr) +@ stdcall NtGdiDdGetInternalMoCompInfo(ptr ptr) +@ stdcall NtGdiDdGetMoCompBuffInfo(ptr ptr) +@ stdcall NtGdiDdGetMoCompGuids(ptr ptr) +@ stdcall NtGdiDdGetMoCompFormats(ptr ptr) +@ stdcall NtGdiDdGetScanLine(ptr ptr) +@ stdcall NtGdiDdLock(ptr ptr ptr) +@ stdcall NtGdiDdLockD3D(ptr ptr) +@ stdcall NtGdiDdQueryDirectDrawObject(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdQueryMoCompStatus(ptr ptr) +@ stdcall NtGdiDdReenableDirectDrawObject(ptr ptr) +@ stdcall NtGdiDdReleaseDC(ptr) +@ stdcall NtGdiDdRenderMoComp(ptr ptr) +@ stdcall NtGdiDdResetVisrgn(ptr ptr) +@ stdcall NtGdiDdSetColorKey(ptr ptr) +@ stdcall NtGdiDdSetExclusiveMode(ptr ptr) +@ stdcall NtGdiDdSetGammaRamp(ptr ptr ptr) +@ stdcall NtGdiDdCreateSurfaceEx(ptr ptr long) +@ stdcall NtGdiDdSetOverlayPosition(ptr ptr ptr) +@ stdcall NtGdiDdUnattachSurface(ptr ptr) +@ stdcall NtGdiDdUnlock(ptr ptr) +@ stdcall NtGdiDdUnlockD3D(ptr ptr) +@ stdcall NtGdiDdUpdateOverlay(ptr ptr ptr) +@ stdcall NtGdiDdWaitForVerticalBlank(ptr ptr) +@ stdcall NtGdiDvpCanCreateVideoPort(ptr ptr) +@ stdcall NtGdiDvpColorControl(ptr ptr) +@ stdcall NtGdiDvpCreateVideoPort(ptr ptr) +@ stdcall NtGdiDvpDestroyVideoPort(ptr ptr) +@ stdcall NtGdiDvpFlipVideoPort(ptr ptr ptr ptr) +@ stdcall NtGdiDvpGetVideoPortBandwidth(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortField(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortFlipStatus(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortInputFormats(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortLine(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortOutputFormats(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortConnectInfo(ptr ptr) +@ stdcall NtGdiDvpGetVideoSignalStatus(ptr ptr) +@ stdcall NtGdiDvpUpdateVideoPort(ptr ptr ptr ptr) +@ stdcall NtGdiDvpWaitForVideoPortSync(ptr ptr) +@ stdcall NtGdiDeleteClientObj(ptr) +@ stdcall NtGdiDeleteColorSpace(ptr) +@ stdcall NtGdiDeleteColorTransform(ptr ptr) +@ stdcall NtGdiDeleteObjectApp(ptr) +@ stdcall NtGdiDescribePixelFormat(ptr long long ptr) +@ stdcall NtGdiGetPerBandInfo(ptr ptr) +@ stdcall NtGdiDoBanding(ptr long ptr ptr) +@ stdcall NtGdiDoPalette(ptr long long ptr long long) +@ stdcall NtGdiDrawEscape(ptr long long ptr) +@ stdcall NtGdiEllipse(ptr long long long long) +@ stdcall NtGdiEnableEudc(long) +@ stdcall NtGdiEndDoc(ptr) +@ stdcall NtGdiEndPage(ptr) +@ stdcall NtGdiEndPath(ptr) +@ stdcall NtGdiEnumFontChunk(ptr ptr long ptr ptr) +@ stdcall NtGdiEnumFontClose(ptr) +@ stdcall NtGdiEnumFontOpen(ptr long long long wstr long ptr) +@ stdcall NtGdiEnumObjects(ptr long long ptr) +@ stdcall NtGdiEqualRgn(ptr ptr) +@ stdcall NtGdiEudcEnumFaceNameLinkW(long long long long) +@ stdcall NtGdiEudcLoadUnloadLink(wstr long wstr long long long long) +@ stdcall NtGdiExcludeClipRect(ptr long long long long) +@ stdcall NtGdiExtCreatePen(long long long long ptr ptr long ptr long long ptr) +@ stdcall NtGdiExtCreateRegion(ptr long ptr) +@ stdcall NtGdiExtEscape(ptr ptr long long long ptr long ptr) +@ stdcall NtGdiExtFloodFill(ptr long long long long) +@ stdcall NtGdiExtGetObjectW(ptr long ptr) +@ stdcall NtGdiExtSelectClipRgn(ptr ptr long) +@ stdcall NtGdiExtTextOutW(ptr long long long ptr wstr long ptr long) +@ stdcall NtGdiFillPath(ptr) +@ stdcall NtGdiFillRgn(ptr ptr ptr) +@ stdcall NtGdiFlattenPath(ptr) +@ stdcall NtGdiFlushUserBatch() +@ stdcall NtGdiFlush() +@ stdcall NtGdiForceUFIMapping(ptr ptr) +@ stdcall NtGdiFrameRgn(ptr ptr ptr long long) +@ stdcall NtGdiFullscreenControl(long ptr long ptr ptr) +@ stdcall NtGdiGetAndSetDCDword(ptr long long ptr) +@ stdcall NtGdiGetAppClipBox(ptr ptr) +@ stdcall NtGdiGetBitmapBits(ptr long ptr) +@ stdcall NtGdiGetBitmapDimension(ptr ptr) +@ stdcall NtGdiGetBoundsRect(ptr ptr long) +@ stdcall NtGdiGetCharABCWidthsW(ptr long long ptr long ptr) +@ stdcall NtGdiGetCharacterPlacementW(ptr wstr long long ptr long) +@ stdcall NtGdiGetCharSet(ptr) +@ stdcall NtGdiGetCharWidthW(ptr long long ptr long ptr) +@ stdcall NtGdiGetCharWidthInfo(ptr ptr) +@ stdcall NtGdiGetColorAdjustment(ptr ptr) +@ stdcall NtGdiGetColorSpaceforBitmap(ptr) +@ stdcall NtGdiGetDCDword(ptr long ptr) +@ stdcall NtGdiGetDCforBitmap(ptr) +@ stdcall NtGdiGetDCObject(ptr long) +@ stdcall NtGdiGetDCPoint(ptr long ptr) +@ stdcall NtGdiGetDeviceCaps(ptr long) +@ stdcall NtGdiGetDeviceGammaRamp(ptr ptr) +@ stdcall NtGdiGetDeviceCapsAll(ptr ptr) +@ stdcall NtGdiGetDIBitsInternal(ptr ptr long long ptr ptr long long long) +@ stdcall NtGdiGetETM(ptr ptr) +@ stdcall NtGdiGetEudcTimeStampEx(wstr long long) +@ stdcall NtGdiGetFontData(ptr long long ptr long) +@ stdcall NtGdiGetFontResourceInfoInternalW(wstr long long long ptr ptr long) +@ stdcall NtGdiGetGlyphIndicesW(ptr wstr long ptr long) +@ stdcall NtGdiGetGlyphIndicesWInternal(ptr wstr long ptr long long) +@ stdcall NtGdiGetGlyphOutline(ptr long long ptr long ptr ptr long) +@ stdcall NtGdiGetKerningPairs(ptr long ptr) +@ stdcall NtGdiGetLinkedUFIs(ptr ptr long) +@ stdcall NtGdiGetMiterLimit(ptr ptr) +@ stdcall NtGdiGetMonitorID(ptr long ptr) +@ stdcall NtGdiGetNearestColor(ptr ptr) +@ stdcall NtGdiGetNearestPaletteIndex(ptr ptr) +@ stdcall NtGdiGetObjectBitmapHandle(ptr ptr) +@ stdcall NtGdiGetOutlineTextMetricsInternalW(ptr long ptr ptr) +@ stdcall NtGdiGetPath(ptr ptr ptr long) +@ stdcall NtGdiGetPixel(ptr long long) +@ stdcall NtGdiGetRandomRgn(ptr ptr long) +@ stdcall NtGdiGetRasterizerCaps(ptr long) +@ stdcall NtGdiGetRealizationInfo(ptr ptr) +@ stdcall NtGdiGetRegionData(ptr long ptr) +@ stdcall NtGdiGetRgnBox(ptr ptr) +@ stdcall NtGdiGetServerMetaFileBits(ptr long ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetSpoolMessage(long long long long) +@ stdcall NtGdiGetStats(ptr long long ptr long) +@ stdcall NtGdiGetStockObject(ptr) +@ stdcall NtGdiGetStringBitmapW(ptr wstr long ptr long) +@ stdcall NtGdiGetSystemPaletteUse(ptr) +@ stdcall NtGdiGetTextCharsetInfo(ptr ptr long) +@ stdcall NtGdiGetTextExtent(ptr wstr long ptr long) +@ stdcall NtGdiGetTextExtentExW(ptr wstr long long ptr ptr ptr long) +@ stdcall NtGdiGetTextFaceW(ptr long ptr long) +@ stdcall NtGdiGetTextMetricsW(ptr ptr long) +@ stdcall NtGdiGetTransform(ptr long ptr) +@ stdcall NtGdiGetUFI(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetUFIPathname(ptr ptr wstr ptr long ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetFontUnicodeRanges(ptr ptr) +@ stdcall NtGdiGetWidthTable(ptr long ptr long ptr ptr ptr) +@ stdcall NtGdiGradientFill(ptr ptr long ptr long long) +@ stdcall NtGdiHfontCreate(ptr long long long ptr) +@ stdcall NtGdiIcmBrushInfo(ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiInit() +@ stdcall NtGdiInitSpool() +@ stdcall NtGdiIntersectClipRect(ptr long long long long) +@ stdcall NtGdiInvertRgn(ptr ptr) +@ stdcall NtGdiLineTo(ptr long long) +@ stdcall NtGdiMakeFontDir(long ptr long wstr long) +@ stdcall NtGdiMakeInfoDC(ptr long) +@ stdcall NtGdiMaskBlt(ptr long long long long ptr long long ptr long long long long) +@ stdcall NtGdiModifyWorldTransform(ptr ptr long) +@ stdcall NtGdiMonoBitmap(ptr) +@ stdcall NtGdiMoveTo(ptr long long ptr) +@ stdcall NtGdiOffsetClipRgn(ptr long long) +@ stdcall NtGdiOffsetRgn(ptr long long) +@ stdcall NtGdiOpenDCW(ptr ptr ptr long long ptr ptr) +@ stdcall NtGdiPatBlt(ptr long long long long long) +@ stdcall NtGdiPolyPatBlt(ptr long ptr long long) +@ stdcall NtGdiPathToRegion(ptr) +@ stdcall NtGdiPlgBlt(ptr ptr ptr long long long long ptr long long long) +@ stdcall NtGdiPolyDraw(ptr ptr ptr long) +@ stdcall NtGdiPolyPolyDraw(ptr ptr ptr long long) +@ stdcall NtGdiPolyTextOutW(ptr ptr long long) +@ stdcall NtGdiPtInRegion(ptr long long) +@ stdcall NtGdiPtVisible(ptr long long) +@ stdcall NtGdiQueryFonts(ptr long ptr) +@ stdcall NtGdiQueryFontAssocInfo(ptr) +@ stdcall NtGdiRectangle(ptr long long long long) +@ stdcall NtGdiRectInRegion(ptr ptr) +@ stdcall NtGdiRectVisible(ptr ptr) +@ stdcall NtGdiRemoveFontResourceW(ptr long long long long ptr) +@ stdcall NtGdiRemoveFontMemResourceEx(ptr) +@ stdcall NtGdiResetDC(ptr ptr ptr ptr ptr) +@ stdcall NtGdiResizePalette(ptr long) +@ stdcall NtGdiRestoreDC(ptr long) +@ stdcall NtGdiRoundRect(ptr long long long long long long) +@ stdcall NtGdiSaveDC(ptr) +@ stdcall NtGdiScaleViewportExtEx(ptr long long long long ptr) +@ stdcall NtGdiScaleWindowExtEx(ptr long long long long ptr) +@ stdcall NtGdiSelectBitmap(ptr ptr) +@ stdcall NtGdiSelectBrush(ptr ptr) +@ stdcall NtGdiSelectClipPath(ptr long) +@ stdcall NtGdiSelectFont(ptr ptr) +@ stdcall NtGdiSelectPen(ptr ptr) +@ stdcall NtGdiSetBitmapBits(ptr long ptr) +@ stdcall NtGdiSetBitmapDimension(ptr long long ptr) +@ stdcall NtGdiSetBoundsRect(ptr ptr long) +@ stdcall NtGdiSetBrushOrg(ptr long long ptr) +@ stdcall NtGdiSetColorAdjustment(ptr ptr) +@ stdcall NtGdiSetColorSpace(ptr ptr) +@ stdcall NtGdiSetDeviceGammaRamp(ptr ptr) +@ stdcall NtGdiSetDIBitsToDeviceInternal(ptr long long long long long long long long ptr ptr long long long long ptr) +@ stdcall NtGdiSetFontEnumeration(long) +@ stdcall NtGdiSetFontXform(ptr long long) +@ stdcall NtGdiSetIcmMode(ptr long long) +@ stdcall NtGdiSetLinkedUFIs(ptr ptr long) +@ stdcall NtGdiSetMagicColors(ptr long long) +@ stdcall NtGdiSetMetaRgn(ptr) +@ stdcall NtGdiSetMiterLimit(ptr long ptr) +@ stdcall NtGdiGetDeviceWidth(ptr) +@ stdcall NtGdiMirrorWindowOrg(ptr) +@ stdcall NtGdiSetLayout(ptr long long) +@ stdcall NtGdiSetPixel(ptr long long long) +@ stdcall NtGdiSetPixelFormat(ptr long) +@ stdcall NtGdiSetRectRgn(ptr long long long long) +@ stdcall NtGdiSetSystemPaletteUse(ptr long) +@ stdcall NtGdiSetTextJustification(ptr long long) +@ stdcall NtGdiSetupPublicCFONT(ptr ptr long) +@ stdcall NtGdiSetVirtualResolution(ptr long long long long) +@ stdcall NtGdiSetSizeDevice(ptr long long) +@ stdcall NtGdiStartDoc(ptr ptr ptr long) +@ stdcall NtGdiStartPage(ptr) +@ stdcall NtGdiStretchBlt(ptr long long long long ptr long long long long long long) +@ stdcall NtGdiStretchDIBitsInternal(ptr long long long long long long long long ptr ptr long long long long ptr) +@ stdcall NtGdiStrokeAndFillPath(ptr) +@ stdcall NtGdiStrokePath(ptr) +@ stdcall NtGdiSwapBuffers(ptr) +@ stdcall NtGdiTransformPoints(ptr ptr ptr long long) +@ stdcall NtGdiTransparentBlt(ptr long long long long ptr long long long long long) +@ stdcall NtGdiUnloadPrinterDriver(wstr long) +@ stdcall NtGdiUnmapMemFont(ptr) +@ stdcall NtGdiUnrealizeObject(ptr) +@ stdcall NtGdiUpdateColors(ptr) +@ stdcall NtGdiWidenPath(ptr) +@ stdcall NtUserActivateKeyboardLayout(ptr long) +@ stdcall NtUserAlterWindowStyle(long long long) +@ stdcall NtUserAssociateInputContext(long long long) +@ stdcall NtUserAttachThreadInput(long long long) +@ stdcall NtUserBeginPaint(ptr ptr) +@ stdcall NtUserBitBltSysBmp(ptr long long long long long long long) +@ stdcall NtUserBlockInput(long) +@ stdcall NtUserBuildHimcList(long long long long) +@ stdcall NtUserBuildHwndList(ptr ptr long long long ptr ptr) +@ stdcall NtUserBuildNameList(ptr long ptr ptr) +@ stdcall NtUserBuildPropList(ptr ptr long ptr) +@ stdcall NtUserCallHwnd(ptr long) +@ stdcall NtUserCallHwndLock(ptr long) +@ stdcall NtUserCallHwndOpt(ptr long) +@ stdcall NtUserCallHwndParam(ptr long long) +@ stdcall NtUserCallHwndParamLock(ptr long long) +@ stdcall NtUserCallMsgFilter(ptr long) +@ stdcall NtUserCallNextHookEx(long ptr ptr long) +@ stdcall NtUserCallNoParam(long) +@ stdcall NtUserCallOneParam(long) +@ stdcall NtUserCallTwoParam(ptr ptr long) +@ stdcall NtUserChangeClipboardChain(ptr ptr) +@ stdcall NtUserChangeDisplaySettings(ptr ptr ptr long ptr) +@ stdcall NtUserCheckImeHotKey(long long long) +@ stdcall NtUserCheckMenuItem(ptr long long) +@ stdcall NtUserChildWindowFromPointEx(ptr long long long) +@ stdcall NtUserClipCursor(ptr) +@ stdcall NtUserCloseClipboard() +@ stdcall NtUserCloseDesktop(ptr) +@ stdcall NtUserCloseWindowStation(ptr) +@ stdcall NtUserConsoleControl(long long long) +@ stdcall NtUserConvertMemHandle(ptr long) +@ stdcall NtUserCopyAcceleratorTable(ptr ptr long) +@ stdcall NtUserCountClipboardFormats(long) +@ stdcall NtUserCreateAcceleratorTable(ptr ptr) +@ stdcall NtUserCreateCaret(ptr ptr long long) +@ stdcall NtUserCreateDesktop(ptr ptr ptr long long) +@ stdcall NtUserCreateInputContext(long) +@ stdcall NtUserCreateLocalMemHandle(ptr ptr long ptr) +@ stdcall NtUserCreateWindowEx(long ptr ptr long long long long ptr ptr ptr ptr long ptr) +@ stdcall NtUserCreateWindowStation(ptr long long long long long) +@ stdcall NtUserDdeGetQualityOfService(ptr ptr ptr) +@ stdcall NtUserDdeInitialize(long long long long long) +@ stdcall NtUserDdeSetQualityOfService(ptr ptr ptr) +@ stdcall NtUserDeferWindowPos(ptr ptr ptr long long long long long) +@ stdcall NtUserDefSetText(ptr ptr) +@ stdcall NtUserDeleteMenu(ptr long long) +@ stdcall NtUserDestroyAcceleratorTable(ptr) +@ stdcall NtUserDestroyCursor(ptr long) +@ stdcall NtUserDestroyInputContext(long) +@ stdcall NtUserDestroyMenu(ptr) +@ stdcall NtUserDestroyWindow(ptr) +@ stdcall NtUserDisableThreadIme(long) +@ stdcall NtUserDispatchMessage(ptr) +@ stdcall NtUserDragDetect(ptr ptr long) +@ stdcall NtUserDragObject(ptr ptr long long ptr) +@ stdcall NtUserDrawAnimatedRects(ptr long ptr ptr) +@ stdcall NtUserDrawCaption(ptr ptr ptr long) +@ stdcall NtUserDrawCaptionTemp(ptr ptr ptr ptr ptr ptr long) +@ stdcall NtUserDrawIconEx(ptr long long ptr long long long ptr long long ptr) +@ stdcall NtUserDrawMenuBarTemp(ptr ptr ptr ptr ptr) +@ stdcall NtUserEmptyClipboard() +@ stdcall NtUserEnableMenuItem(ptr long long) +@ stdcall NtUserEnableScrollBar(ptr long long) +@ stdcall NtUserEndDeferWindowPosEx(ptr long) +@ stdcall NtUserEndMenu() +@ stdcall NtUserEndPaint(ptr ptr) +@ stdcall NtUserEnumDisplayDevices(ptr long ptr long) +@ stdcall NtUserEnumDisplayMonitors(ptr ptr ptr ptr) +@ stdcall NtUserEnumDisplaySettings(ptr long ptr long) +@ stdcall NtUserEvent(long) +@ stdcall NtUserExcludeUpdateRgn(ptr ptr) +@ stdcall NtUserFillWindow(ptr ptr ptr ptr) +@ stdcall NtUserFindExistingCursorIcon(ptr ptr ptr) +@ stdcall NtUserFindWindowEx(ptr ptr ptr ptr long) +@ stdcall NtUserFlashWindowEx(ptr) +@ stdcall NtUserGetAltTabInfo(ptr long ptr wstr long long) +@ stdcall NtUserGetAncestor(ptr long) +@ stdcall NtUserGetAppImeLevel(long) +@ stdcall NtUserGetAsyncKeyState(long) +@ stdcall NtUserGetCaretBlinkTime() +@ stdcall NtUserGetCaretPos(ptr) +@ stdcall NtUserGetClassInfo(ptr ptr ptr ptr long) +@ stdcall NtUserGetClassName(ptr long ptr) +@ stdcall NtUserGetClipboardData(long ptr) +@ stdcall NtUserGetClipboardFormatName(long wstr ptr) +@ stdcall NtUserGetClipboardOwner() +@ stdcall NtUserGetClipboardSequenceNumber() +@ stdcall NtUserGetClipboardViewer() +@ stdcall NtUserGetClipCursor(ptr) +@ stdcall NtUserGetComboBoxInfo(ptr ptr) +@ stdcall NtUserGetControlBrush(ptr ptr long) +@ stdcall NtUserGetControlColor(ptr ptr ptr long) +@ stdcall NtUserGetCPD(ptr long ptr) +@ stdcall NtUserGetCursorFrameInfo(ptr long ptr ptr) +@ stdcall NtUserGetCursorInfo(ptr) +@ stdcall NtUserGetDC(ptr) +@ stdcall NtUserGetDCEx(ptr ptr long) +@ stdcall NtUserGetDoubleClickTime() +@ stdcall NtUserGetForegroundWindow() +@ stdcall NtUserGetGuiResources(ptr long) +@ stdcall NtUserGetGUIThreadInfo(long ptr) +@ stdcall NtUserGetIconInfo(ptr ptr ptr ptr ptr long) +@ stdcall NtUserGetIconSize(ptr long ptr ptr) +@ stdcall NtUserGetImeHotKey(long long long long) +@ stdcall NtUserGetImeInfoEx(long long) +@ stdcall NtUserGetInternalWindowPos(ptr ptr ptr) +@ stdcall NtUserGetKeyboardLayoutList(long ptr) +@ stdcall NtUserGetKeyboardLayoutName(str) +@ stdcall NtUserGetKeyboardState(ptr) +@ stdcall NtUserGetKeyNameText(long wstr long) +@ stdcall NtUserGetKeyState(long) +@ stdcall NtUserGetListBoxInfo(ptr) +@ stdcall NtUserGetMenuBarInfo(ptr long long ptr) +@ stdcall NtUserGetMenuIndex(ptr ptr) +@ stdcall NtUserGetMenuItemRect(ptr ptr long ptr) +@ stdcall NtUserGetMessage(ptr ptr long long) +@ stdcall NtUserGetMouseMovePointsEx(long ptr ptr long long) +@ stdcall NtUserGetObjectInformation(ptr long ptr long ptr) +@ stdcall NtUserGetOpenClipboardWindow() +@ stdcall NtUserGetPriorityClipboardFormat(ptr long) +@ stdcall NtUserGetProcessWindowStation() +@ stdcall NtUserGetScrollBarInfo(ptr long ptr) +@ stdcall NtUserGetSystemMenu(ptr long) +@ stdcall NtUserGetThreadDesktop(long long) +@ stdcall NtUserGetThreadState(ptr) +@ stdcall NtUserGetTitleBarInfo(ptr ptr) +@ stdcall NtUserGetUpdateRect(ptr ptr long) +@ stdcall NtUserGetUpdateRgn(ptr ptr long) +@ stdcall NtUserGetWindowDC(ptr) +@ stdcall NtUserGetWindowPlacement(ptr ptr) +@ stdcall NtUserGetWOWClass(ptr ptr) +@ stdcall NtUserHardErrorControl(long long long) +@ stdcall NtUserHideCaret(ptr) +@ stdcall NtUserHiliteMenuItem(ptr ptr long long) +@ stdcall NtUserImpersonateDdeClientWindow(ptr ptr) +@ stdcall NtUserInitialize(long ptr ptr) +@ stdcall NtUserInitializeClientPfnArrays(ptr ptr ptr ptr) +@ stdcall NtUserInitTask(long long long long long long long long long long long) +@ stdcall NtUserInternalGetWindowText(ptr wstr ptr) +@ stdcall NtUserInvalidateRect(ptr ptr long) +@ stdcall NtUserInvalidateRgn(ptr ptr long) +@ stdcall NtUserIsClipboardFormatAvailable(long) +@ stdcall NtUserKillTimer(ptr ptr) +@ stdcall NtUserLoadKeyboardLayoutEx(ptr long ptr ptr ptr long) +@ stdcall NtUserLockWindowStation(ptr) +@ stdcall NtUserLockWindowUpdate(ptr) +@ stdcall NtUserLockWorkStation() +@ stdcall NtUserMapVirtualKeyEx(long long long ptr) +@ stdcall NtUserMenuItemFromPoint(ptr ptr long long) +@ stdcall NtUserMessageCall(ptr long ptr ptr ptr long long) +@ stdcall NtUserMinMaximize(ptr long long) +@ stdcall NtUserMNDragLeave(long) +@ stdcall NtUserMNDragOver(long long) +@ stdcall NtUserModifyUserStartupInfoFlags(long long) +@ stdcall NtUserMoveWindow(ptr long long long long long) +@ stdcall NtUserNotifyIMEStatus(long long long) +@ stdcall NtUserNotifyProcessCreate(long long long long) +@ stdcall NtUserNotifyWinEvent(long long long long) +@ stdcall NtUserOpenClipboard(ptr long) +@ stdcall NtUserOpenDesktop(ptr long long) +@ stdcall NtUserOpenInputDesktop(long long long) +@ stdcall NtUserOpenWindowStation(ptr long) +@ stdcall NtUserPaintDesktop(ptr) +@ stdcall NtUserPeekMessage(ptr ptr long long long) +@ stdcall NtUserPostMessage(ptr long long long) +@ stdcall NtUserPostThreadMessage(long long long long) +@ stdcall NtUserProcessConnect(ptr ptr long) +@ stdcall NtUserQueryInformationThread(long long long long long) +@ stdcall NtUserQueryInputContext(long long) +@ stdcall NtUserQuerySendMessage(long) +@ stdcall NtUserQueryUserCounters(long long long long long) +@ stdcall NtUserQueryWindow(ptr long) +@ stdcall NtUserRealChildWindowFromPoint(ptr long long) +@ stdcall NtUserRedrawWindow(ptr ptr ptr long) +@ stdcall NtUserRegisterClassExWOW(ptr ptr ptr long long ptr) +@ stdcall NtUserRegisterHotKey(ptr long long long) +@ stdcall NtUserRegisterTasklist(long) +@ stdcall NtUserRegisterWindowMessage(ptr) +@ stdcall NtUserRemoveMenu(ptr long long) +@ stdcall NtUserRemoveProp(ptr long) +@ stdcall NtUserResolveDesktop(long long long long) +@ stdcall NtUserResolveDesktopForWOW(long) +@ stdcall NtUserSBGetParms(ptr long ptr ptr) +@ stdcall NtUserScrollDC(ptr long long ptr ptr ptr ptr) +@ stdcall NtUserScrollWindowEx(ptr long long ptr ptr ptr ptr long) +@ stdcall NtUserSelectPalette(ptr ptr long) +@ stdcall NtUserSendInput(long ptr long) +@ stdcall NtUserSendMessageCallback(long long long long long long) +@ stdcall NtUserSendNotifyMessage(long long long long) +@ stdcall NtUserSetActiveWindow(ptr) +@ stdcall NtUserSetAppImeLevel(long long) +@ stdcall NtUserSetCapture(ptr) +@ stdcall NtUserSetClassLong(ptr long ptr long) +@ stdcall NtUserSetClassWord(ptr long long) +@ stdcall NtUserSetClipboardData(long ptr ptr) +@ stdcall NtUserSetClipboardViewer(ptr) +@ stdcall NtUserSetConsoleReserveKeys(long long) +@ stdcall NtUserSetCursor(ptr) +@ stdcall NtUserSetCursorContents(ptr ptr) +@ stdcall NtUserSetCursorIconData(ptr ptr ptr ptr) +@ stdcall NtUserSetDbgTag(long long) +@ stdcall NtUserSetFocus(ptr) +@ stdcall NtUserSetImeHotKey(long long long long long) +@ stdcall NtUserSetImeInfoEx(long) +@ stdcall NtUserSetImeOwnerWindow(long long) +@ stdcall NtUserSetInformationProcess(long long long long) +@ stdcall NtUserSetInformationThread(ptr long ptr long long) +@ stdcall NtUserSetInternalWindowPos(ptr long ptr ptr) +@ stdcall NtUserSetKeyboardState(ptr) +@ stdcall NtUserSetLogonNotifyWindow(ptr) +@ stdcall NtUserSetMenu(ptr ptr long) +@ stdcall NtUserSetMenuContextHelpId(ptr long) +@ stdcall NtUserSetMenuDefaultItem(ptr long long) +@ stdcall NtUserSetMenuFlagRtoL(ptr) +@ stdcall NtUserSetObjectInformation(ptr long ptr long) +@ stdcall NtUserSetParent(ptr ptr) +@ stdcall NtUserSetProcessWindowStation(ptr) +@ stdcall NtUserSetProp(ptr long ptr) +@ stdcall NtUserSetRipFlags(long long) +@ stdcall NtUserSetScrollInfo(ptr long ptr long) +@ stdcall NtUserSetShellWindowEx(ptr ptr) +@ stdcall NtUserSetSysColors(long ptr ptr long) +@ stdcall NtUserSetSystemCursor(ptr long) +@ stdcall NtUserSetSystemMenu(ptr ptr) +@ stdcall NtUserSetSystemTimer(ptr ptr long ptr) +@ stdcall NtUserSetThreadDesktop(ptr) +@ stdcall NtUserSetThreadLayoutHandles(long long) +@ stdcall NtUserSetThreadState(long long) +@ stdcall NtUserSetTimer(ptr ptr long ptr) +@ stdcall NtUserSetWindowFNID(ptr long) +@ stdcall NtUserSetWindowLong(ptr long long long) +@ stdcall NtUserSetWindowPlacement(ptr ptr) +@ stdcall NtUserSetWindowPos(ptr ptr long long long long long) +@ stdcall NtUserSetWindowRgn(ptr ptr long) +@ stdcall NtUserSetWindowsHookAW(long ptr long) +@ stdcall NtUserSetWindowsHookEx(ptr ptr long long ptr long) +@ stdcall NtUserSetWindowStationUser(long long long long) +@ stdcall NtUserSetWindowWord(ptr long long) +@ stdcall NtUserSetWinEventHook(long long ptr ptr ptr long long long) +@ stdcall NtUserShowCaret(ptr) +@ stdcall NtUserShowScrollBar(ptr long long) +@ stdcall NtUserShowWindow(ptr long) +@ stdcall NtUserShowWindowAsync(ptr long) +@ stdcall NtUserSoundSentry() +@ stdcall NtUserSwitchDesktop(ptr) +@ stdcall NtUserSystemParametersInfo(long long ptr long) +@ stdcall NtUserTestForInteractiveUser(long) +@ stdcall NtUserThunkedMenuInfo(ptr ptr) +@ stdcall NtUserThunkedMenuItemInfo(ptr long long long ptr ptr) +@ stdcall NtUserToUnicodeEx(long long ptr wstr long long ptr) +@ stdcall NtUserTrackMouseEvent(ptr) +@ stdcall NtUserTrackPopupMenuEx(ptr long long long ptr ptr) +@ stdcall NtUserTranslateAccelerator(ptr ptr ptr) +@ stdcall NtUserTranslateMessage(ptr long) +@ stdcall NtUserUnhookWindowsHookEx(ptr) +@ stdcall NtUserUnhookWinEvent(ptr) +@ stdcall NtUserUnloadKeyboardLayout(ptr) +@ stdcall NtUserUnlockWindowStation(ptr) +@ stdcall NtUserUnregisterClass(ptr ptr ptr) +@ stdcall NtUserUnregisterHotKey(ptr long) +@ stdcall NtUserUpdateInputContext(long long long) +@ stdcall NtUserUpdateInstance(long long long) +@ stdcall NtUserUpdateLayeredWindow(ptr ptr ptr ptr ptr ptr long long ptr) +@ stdcall NtUserSetLayeredWindowAttributes(ptr long long long) +@ stdcall NtUserUpdatePerUserSystemParameters(long long) +@ stdcall NtUserUserHandleGrantAccess(ptr ptr long) +@ stdcall NtUserValidateHandleSecure(ptr) +@ stdcall NtUserValidateRect(ptr ptr) +@ stdcall NtUserVkKeyScanEx(long ptr long) +@ stdcall NtUserWaitForInputIdle(ptr long long) +@ stdcall NtUserWaitForMsgAndEvent(long) +@ stdcall NtUserWaitMessage() +@ stdcall NtUserWin32PoolAllocationStats(long long long long long long) +@ stdcall NtUserWindowFromPoint(long long) +@ stdcall NtUserYieldTask() +@ stdcall NtUserRemoteConnect(long long long) +@ stdcall NtUserRemoteRedrawRectangle(long long long long) +@ stdcall NtUserRemoteRedrawScreen() +@ stdcall NtUserRemoteStopScreenUpdates() +@ stdcall NtUserCtxDisplayIOCtl(long long long) +@ stdcall NtGdiEngAssociateSurface(ptr ptr long) +@ stdcall NtGdiEngCreateBitmap(long long long long long ptr) +@ stdcall NtGdiEngCreateDeviceSurface(ptr long long long) +@ stdcall NtGdiEngCreateDeviceBitmap(ptr long long long) +@ stdcall NtGdiEngCreatePalette(long long ptr long long long) +@ stdcall NtGdiEngComputeGlyphSet(ptr ptr ptr) +@ stdcall NtGdiEngCopyBits(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngDeletePalette(ptr) +@ stdcall NtGdiEngDeleteSurface(ptr) +@ stdcall NtGdiEngEraseSurface(ptr ptr long) +@ stdcall NtGdiEngUnlockSurface(ptr) +@ stdcall NtGdiEngLockSurface(ptr) +@ stdcall NtGdiEngBitBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStretchBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiEngPlgBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiEngMarkBandingSurface(ptr) +@ stdcall NtGdiEngStrokePath(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngFillPath(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStrokeAndFillPath(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngPaint(ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngLineTo(ptr ptr ptr long long long long ptr ptr) +@ stdcall NtGdiEngAlphaBlend(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngGradientFill(ptr ptr ptr ptr long ptr long ptr ptr long) +@ stdcall NtGdiEngTransparentBlt(ptr ptr ptr ptr ptr ptr long long) +@ stdcall NtGdiEngTextOut(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStretchBltROP(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long ptr long) +@ stdcall NtGdiXLATEOBJ_cGetPalette(ptr long long ptr) +@ stdcall NtGdiXLATEOBJ_iXlate(ptr long) +@ stdcall NtGdiXLATEOBJ_hGetColorTransform(ptr) +@ stdcall NtGdiCLIPOBJ_bEnum(ptr long long) +@ stdcall NtGdiCLIPOBJ_cEnumStart(ptr long long long long) +@ stdcall NtGdiCLIPOBJ_ppoGetPath(ptr) +@ stdcall NtGdiEngDeletePath(ptr) +@ stdcall NtGdiEngCreateClip() +@ stdcall NtGdiEngDeleteClip(ptr) +@ stdcall NtGdiBRUSHOBJ_ulGetBrushColor(ptr) +@ stdcall NtGdiBRUSHOBJ_pvAllocRbrush(ptr long) +@ stdcall NtGdiBRUSHOBJ_pvGetRbrush(ptr) +@ stdcall NtGdiBRUSHOBJ_hGetColorTransform(ptr) +@ stdcall NtGdiXFORMOBJ_bApplyXform(ptr ptr long long ptr) +@ stdcall NtGdiXFORMOBJ_iGetXform(ptr ptr) +@ stdcall NtGdiFONTOBJ_vGetInfo(ptr long ptr) +@ stdcall NtGdiFONTOBJ_pxoGetXform(ptr) +@ stdcall NtGdiFONTOBJ_cGetGlyphs(ptr long long ptr ptr) +@ stdcall NtGdiFONTOBJ_pifi(ptr) +@ stdcall NtGdiFONTOBJ_pfdg(ptr) +@ stdcall NtGdiFONTOBJ_pQueryGlyphAttrs(ptr long) +@ stdcall NtGdiFONTOBJ_pvTrueTypeFontFile(ptr ptr) +@ stdcall NtGdiFONTOBJ_cGetAllGlyphHandles(ptr ptr) +@ stdcall NtGdiSTROBJ_bEnum(ptr ptr ptr) +@ stdcall NtGdiSTROBJ_bEnumPositionsOnly(ptr ptr ptr) +@ stdcall NtGdiSTROBJ_bGetAdvanceWidths(ptr long long ptr) +@ stdcall NtGdiSTROBJ_vEnumStart(ptr) +@ stdcall NtGdiSTROBJ_dwGetCodePage(ptr) +@ stdcall NtGdiPATHOBJ_vGetBounds(ptr ptr) +@ stdcall NtGdiPATHOBJ_bEnum(ptr ptr) +@ stdcall NtGdiPATHOBJ_vEnumStart(ptr) +@ stdcall NtGdiPATHOBJ_vEnumStartClipLines(ptr ptr ptr ptr) +@ stdcall NtGdiPATHOBJ_bEnumClipLines(ptr long ptr) +@ stdcall NtGdiGetDhpdev(ptr) +@ stdcall NtGdiEngCheckAbort(ptr) +@ stdcall NtGdiHT_Get8BPPFormatPalette(ptr long long long) +@ stdcall NtGdiHT_Get8BPPMaskPalette(ptr long long long long long) +@ stdcall NtGdiUpdateTransform(ptr) +@ stdcall NtUserValidateTimerCallback(ptr ptr ptr) diff --git a/rostests/apitests/w32kdll/w32kdll_ros/CMakeLists.txt b/rostests/apitests/w32kdll/w32kdll_ros/CMakeLists.txt index c96fff8d796..4f434694655 100644 --- a/rostests/apitests/w32kdll/w32kdll_ros/CMakeLists.txt +++ b/rostests/apitests/w32kdll/w32kdll_ros/CMakeLists.txt @@ -1,11 +1,13 @@ -add_library(w32kdll SHARED main.c) +spec2def(w32kdll_ros.dll w32kdll_ros.spec) -set_entrypoint(w32kdll 0) +add_library(w32kdll_ros SHARED + main.c + ${CMAKE_CURRENT_BINARY_DIR}/w32kdll_ros.def) -target_link_libraries(w32kdll - ${CMAKE_CURRENT_SOURCE_DIR}/w32kdll_ros.def - win32ksys) +set_entrypoint(w32kdll_ros 0) -add_dependencies(w32kdll psdk ) -add_importlib_target(w32kdll_ros.def) +target_link_libraries(w32kdll_ros win32ksys) + +add_dependencies(w32kdll_ros psdk) +add_importlib_target(w32kdll_ros.spec) diff --git a/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.spec b/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.spec new file mode 100644 index 00000000000..81d3b8540e7 --- /dev/null +++ b/rostests/apitests/w32kdll/w32kdll_ros/w32kdll_ros.spec @@ -0,0 +1,675 @@ +; +; ReactOS Operating System +; +; This file contains all win32k native api functions from win 2003 sp2 +; Unsupported functions are commented out +; + +@ stdcall NtGdiAbortDoc(ptr) +@ stdcall NtGdiAbortPath(ptr) +@ stdcall NtGdiAddFontResourceW(wstr long long long long ptr) +@ stdcall NtGdiAddRemoteFontToDC(ptr ptr long ptr) +@ stdcall NtGdiAddFontMemResourceEx(ptr long ptr long ptr) +@ stdcall NtGdiRemoveMergeFont(ptr ptr) +@ stdcall NtGdiAddRemoteMMInstanceToDC(ptr ptr long) +@ stdcall NtGdiAlphaBlend(ptr long long long long ptr long long long long long ptr) +@ stdcall NtGdiAngleArc(ptr long long long long long) +@ stdcall NtGdiAnyLinkedFonts() +@ stdcall NtGdiFontIsLinked(ptr) +@ stdcall NtGdiArcInternal(long ptr long long long long long long long long) +@ stdcall NtGdiBeginPath(ptr) +@ stdcall NtGdiBitBlt(ptr long long long long ptr long long long long long) +@ stdcall NtGdiCancelDC(ptr) +@ stdcall NtGdiCheckBitmapBits(ptr ptr ptr long long long long ptr) +@ stdcall NtGdiCloseFigure(ptr) +@ stdcall NtGdiClearBitmapAttributes(ptr long) +@ stdcall NtGdiClearBrushAttributes(ptr long) +@ stdcall NtGdiColorCorrectPalette(ptr ptr long long ptr long) +@ stdcall NtGdiCombineRgn(ptr ptr ptr long) +@ stdcall NtGdiCombineTransform(ptr ptr ptr) +@ stdcall NtGdiComputeXformCoefficients(ptr) +@ stdcall NtGdiConsoleTextOut(ptr ptr long ptr) +@ stdcall NtGdiConvertMetafileRect(ptr ptr) +@ stdcall NtGdiCreateBitmap(long long long long ptr) +@ stdcall NtGdiCreateClientObj(long) +@ stdcall NtGdiCreateColorSpace(ptr) +@ stdcall NtGdiCreateColorTransform(ptr ptr ptr long ptr long ptr long) +@ stdcall NtGdiCreateCompatibleBitmap(ptr long long) +@ stdcall NtGdiCreateCompatibleDC(ptr) +@ stdcall NtGdiCreateDIBBrush(ptr long long long long ptr) +@ stdcall NtGdiCreateDIBitmapInternal(ptr long long long ptr ptr long long long long ptr) +@ stdcall NtGdiCreateDIBSection(ptr ptr long ptr long long long ptr ptr) +@ stdcall NtGdiCreateEllipticRgn(long long long long) +@ stdcall NtGdiCreateHalftonePalette(ptr) +@ stdcall NtGdiCreateHatchBrushInternal(long long long) +@ stdcall NtGdiCreateMetafileDC(ptr) +@ stdcall NtGdiCreatePaletteInternal(ptr long) +@ stdcall NtGdiCreatePatternBrushInternal(ptr long long) +@ stdcall NtGdiCreatePen(long long long ptr) +@ stdcall NtGdiCreateRectRgn(long long long long) +@ stdcall NtGdiCreateRoundRectRgn(long long long long long long) +@ stdcall NtGdiCreateServerMetaFile(long long ptr long long long) +@ stdcall NtGdiCreateSolidBrush(long ptr) +@ stdcall NtGdiD3dContextCreate(ptr ptr ptr ptr) +@ stdcall NtGdiD3dContextDestroy(ptr) +@ stdcall NtGdiD3dContextDestroyAll(ptr) +@ stdcall NtGdiD3dValidateTextureStageState(ptr) +@ stdcall NtGdiD3dDrawPrimitives2(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdGetDriverState(ptr) +@ stdcall NtGdiDdAddAttachedSurface(ptr ptr ptr) +@ stdcall NtGdiDdAlphaBlt(ptr ptr ptr) +@ stdcall NtGdiDdAttachSurface(ptr ptr) +@ stdcall NtGdiDdBeginMoCompFrame(ptr ptr) +@ stdcall NtGdiDdBlt(ptr ptr ptr) +@ stdcall NtGdiDdCanCreateSurface(ptr ptr) +@ stdcall NtGdiDdCanCreateD3DBuffer(ptr ptr) +@ stdcall NtGdiDdColorControl(ptr ptr) +@ stdcall NtGdiDdCreateDirectDrawObject(ptr) +@ stdcall NtGdiDdCreateSurface(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdCreateD3DBuffer(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdCreateMoComp(ptr ptr) +@ stdcall NtGdiDdCreateSurfaceObject(ptr ptr ptr ptr ptr long) +@ stdcall NtGdiDdDeleteDirectDrawObject(ptr) +@ stdcall NtGdiDdDeleteSurfaceObject(ptr) +@ stdcall NtGdiDdDestroyMoComp(ptr ptr) +@ stdcall NtGdiDdDestroySurface(ptr long) +@ stdcall NtGdiDdDestroyD3DBuffer(ptr) +@ stdcall NtGdiDdEndMoCompFrame(ptr ptr) +@ stdcall NtGdiDdFlip(ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdFlipToGDISurface(ptr ptr) +@ stdcall NtGdiDdGetAvailDriverMemory(ptr ptr) +@ stdcall NtGdiDdGetBltStatus(ptr ptr) +@ stdcall NtGdiDdGetDC(ptr ptr) +@ stdcall NtGdiDdGetDriverInfo(ptr ptr) +@ stdcall NtGdiDdGetDxHandle(ptr ptr long) +@ stdcall NtGdiDdGetFlipStatus(ptr ptr) +@ stdcall NtGdiDdGetInternalMoCompInfo(ptr ptr) +@ stdcall NtGdiDdGetMoCompBuffInfo(ptr ptr) +@ stdcall NtGdiDdGetMoCompGuids(ptr ptr) +@ stdcall NtGdiDdGetMoCompFormats(ptr ptr) +@ stdcall NtGdiDdGetScanLine(ptr ptr) +@ stdcall NtGdiDdLock(ptr ptr ptr) +@ stdcall NtGdiDdLockD3D(ptr ptr) +@ stdcall NtGdiDdQueryDirectDrawObject(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdQueryMoCompStatus(ptr ptr) +@ stdcall NtGdiDdReenableDirectDrawObject(ptr ptr) +@ stdcall NtGdiDdReleaseDC(ptr) +@ stdcall NtGdiDdRenderMoComp(ptr ptr) +@ stdcall NtGdiDdResetVisrgn(ptr ptr) +@ stdcall NtGdiDdSetColorKey(ptr ptr) +@ stdcall NtGdiDdSetExclusiveMode(ptr ptr) +@ stdcall NtGdiDdSetGammaRamp(ptr ptr ptr) +@ stdcall NtGdiDdCreateSurfaceEx(ptr ptr long) +@ stdcall NtGdiDdSetOverlayPosition(ptr ptr ptr) +@ stdcall NtGdiDdUnattachSurface(ptr ptr) +@ stdcall NtGdiDdUnlock(ptr ptr) +@ stdcall NtGdiDdUnlockD3D(ptr ptr) +@ stdcall NtGdiDdUpdateOverlay(ptr ptr ptr) +@ stdcall NtGdiDdWaitForVerticalBlank(ptr ptr) +@ stdcall NtGdiDvpCanCreateVideoPort(ptr ptr) +@ stdcall NtGdiDvpColorControl(ptr ptr) +@ stdcall NtGdiDvpCreateVideoPort(ptr ptr) +@ stdcall NtGdiDvpDestroyVideoPort(ptr ptr) +@ stdcall NtGdiDvpFlipVideoPort(ptr ptr ptr ptr) +@ stdcall NtGdiDvpGetVideoPortBandwidth(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortField(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortFlipStatus(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortInputFormats(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortLine(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortOutputFormats(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortConnectInfo(ptr ptr) +@ stdcall NtGdiDvpGetVideoSignalStatus(ptr ptr) +@ stdcall NtGdiDvpUpdateVideoPort(ptr ptr ptr ptr) +@ stdcall NtGdiDvpWaitForVideoPortSync(ptr ptr) +@ stdcall NtGdiDvpAcquireNotification(ptr ptr ptr) +@ stdcall NtGdiDvpReleaseNotification(ptr ptr) +@ stdcall NtGdiDxgGenericThunk(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDeleteClientObj(ptr) +@ stdcall NtGdiDeleteColorSpace(ptr) +@ stdcall NtGdiDeleteColorTransform(ptr ptr) +@ stdcall NtGdiDeleteObjectApp(ptr) +@ stdcall NtGdiDescribePixelFormat(ptr long long ptr) +@ stdcall NtGdiGetPerBandInfo(ptr ptr) +@ stdcall NtGdiDoBanding(ptr long ptr ptr) +@ stdcall NtGdiDoPalette(ptr long long ptr long long) +@ stdcall NtGdiDrawEscape(ptr long long ptr) +@ stdcall NtGdiEllipse(ptr long long long long) +@ stdcall NtGdiEnableEudc(long) +@ stdcall NtGdiEndDoc(ptr) +@ stdcall NtGdiEndPage(ptr) +@ stdcall NtGdiEndPath(ptr) +@ stdcall NtGdiEnumFontChunk(ptr ptr long ptr ptr) +@ stdcall NtGdiEnumFontClose(ptr) +@ stdcall NtGdiEnumFontOpen(ptr long long long wstr long ptr) +@ stdcall NtGdiEnumObjects(ptr long long ptr) +@ stdcall NtGdiEqualRgn(ptr ptr) +@ stdcall NtGdiEudcLoadUnloadLink(wstr long wstr long long long long) +@ stdcall NtGdiExcludeClipRect(ptr long long long long) +@ stdcall NtGdiExtCreatePen(long long long long ptr ptr long ptr long long ptr) +@ stdcall NtGdiExtCreateRegion(ptr long ptr) +@ stdcall NtGdiExtEscape(ptr ptr long long long ptr long ptr) +@ stdcall NtGdiExtFloodFill(ptr long long long long) +@ stdcall NtGdiExtGetObjectW(ptr long ptr) +@ stdcall NtGdiExtSelectClipRgn(ptr ptr long) +@ stdcall NtGdiExtTextOutW(ptr long long long ptr wstr long ptr long) +@ stdcall NtGdiFillPath(ptr) +@ stdcall NtGdiFillRgn(ptr ptr ptr) +@ stdcall NtGdiFlattenPath(ptr) +@ stdcall NtGdiFlushUserBatch() +@ stdcall NtGdiFlush() +@ stdcall NtGdiForceUFIMapping(ptr ptr) +@ stdcall NtGdiFrameRgn(ptr ptr ptr long long) +@ stdcall NtGdiFullscreenControl(long ptr long ptr ptr) +@ stdcall NtGdiGetAndSetDCDword(ptr long long ptr) +@ stdcall NtGdiGetAppClipBox(ptr ptr) +@ stdcall NtGdiGetBitmapBits(ptr long ptr) +@ stdcall NtGdiGetBitmapDimension(ptr ptr) +@ stdcall NtGdiGetBoundsRect(ptr ptr long) +@ stdcall NtGdiGetCharABCWidthsW(ptr long long ptr long ptr) +@ stdcall NtGdiGetCharacterPlacementW(ptr wstr long long ptr long) +@ stdcall NtGdiGetCharSet(ptr) +@ stdcall NtGdiGetCharWidthW(ptr long long ptr long ptr) +@ stdcall NtGdiGetCharWidthInfo(ptr ptr) +@ stdcall NtGdiGetColorAdjustment(ptr ptr) +@ stdcall NtGdiGetColorSpaceforBitmap(ptr) +@ stdcall NtGdiGetDCDword(ptr long ptr) +@ stdcall NtGdiGetDCforBitmap(ptr) +@ stdcall NtGdiGetDCObject(ptr long) +@ stdcall NtGdiGetDCPoint(ptr long ptr) +@ stdcall NtGdiGetDeviceCaps(ptr long) +@ stdcall NtGdiGetDeviceGammaRamp(ptr ptr) +@ stdcall NtGdiGetDeviceCapsAll(ptr ptr) +@ stdcall NtGdiGetDIBitsInternal(ptr ptr long long ptr ptr long long long) +@ stdcall NtGdiGetETM(ptr ptr) +@ stdcall NtGdiGetEudcTimeStampEx(wstr long long) +@ stdcall NtGdiGetFontData(ptr long long ptr long) +@ stdcall NtGdiGetFontResourceInfoInternalW(wstr long long long ptr ptr long) +@ stdcall NtGdiGetGlyphIndicesW(ptr wstr long ptr long) +@ stdcall NtGdiGetGlyphIndicesWInternal(ptr wstr long ptr long long) +@ stdcall NtGdiGetGlyphOutline(ptr long long ptr long ptr ptr long) +@ stdcall NtGdiGetKerningPairs(ptr long ptr) +@ stdcall NtGdiGetLinkedUFIs(ptr ptr long) +@ stdcall NtGdiGetMiterLimit(ptr ptr) +@ stdcall NtGdiGetMonitorID(ptr long ptr) +@ stdcall NtGdiGetNearestColor(ptr ptr) +@ stdcall NtGdiGetNearestPaletteIndex(ptr ptr) +@ stdcall NtGdiGetObjectBitmapHandle(ptr ptr) +@ stdcall NtGdiGetOutlineTextMetricsInternalW(ptr long ptr ptr) +@ stdcall NtGdiGetPath(ptr ptr ptr long) +@ stdcall NtGdiGetPixel(ptr long long) +@ stdcall NtGdiGetRandomRgn(ptr ptr long) +@ stdcall NtGdiGetRasterizerCaps(ptr long) +@ stdcall NtGdiGetRealizationInfo(ptr ptr ptr) +@ stdcall NtGdiGetRegionData(ptr long ptr) +@ stdcall NtGdiGetRgnBox(ptr ptr) +@ stdcall NtGdiGetServerMetaFileBits(ptr long ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetSpoolMessage(long long long long) +@ stdcall NtGdiGetStats(ptr long long ptr long) +@ stdcall NtGdiGetStockObject(ptr) +@ stdcall NtGdiGetStringBitmapW(ptr wstr long ptr long) +@ stdcall NtGdiGetSystemPaletteUse(ptr) +@ stdcall NtGdiGetTextCharsetInfo(ptr ptr long) +@ stdcall NtGdiGetTextExtent(ptr wstr long ptr long) +@ stdcall NtGdiGetTextExtentExW(ptr wstr long long ptr ptr ptr long) +@ stdcall NtGdiGetTextFaceW(ptr long ptr long) +@ stdcall NtGdiGetTextMetricsW(ptr ptr long) +@ stdcall NtGdiGetTransform(ptr long ptr) +@ stdcall NtGdiGetUFI(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetEmbUFI(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetUFIPathname(ptr ptr wstr ptr long ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetEmbedFonts() +@ stdcall NtGdiChangeGhostFont(ptr long) +@ stdcall NtGdiAddEmbFontToDC(ptr ptr) +@ stdcall NtGdiGetFontUnicodeRanges(ptr ptr) +@ stdcall NtGdiGetWidthTable(ptr long ptr long ptr ptr ptr) +@ stdcall NtGdiGradientFill(ptr ptr long ptr long long) +@ stdcall NtGdiHfontCreate(ptr long long long ptr) +@ stdcall NtGdiIcmBrushInfo(ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiInit() +@ stdcall NtGdiInitSpool() +@ stdcall NtGdiIntersectClipRect(ptr long long long long) +@ stdcall NtGdiInvertRgn(ptr ptr) +@ stdcall NtGdiLineTo(ptr long long) +@ stdcall NtGdiMakeFontDir(long ptr long wstr long) +@ stdcall NtGdiMakeInfoDC(ptr long) +@ stdcall NtGdiMaskBlt(ptr long long long long ptr long long ptr long long long long) +@ stdcall NtGdiModifyWorldTransform(ptr ptr long) +@ stdcall NtGdiMonoBitmap(ptr) +@ stdcall NtGdiMoveTo(ptr long long ptr) +@ stdcall NtGdiOffsetClipRgn(ptr long long) +@ stdcall NtGdiOffsetRgn(ptr long long) +@ stdcall NtGdiOpenDCW(ptr ptr ptr long ptr long ptr ptr) +@ stdcall NtGdiPatBlt(ptr long long long long long) +@ stdcall NtGdiPolyPatBlt(ptr long ptr long long) +@ stdcall NtGdiPathToRegion(ptr) +@ stdcall NtGdiPlgBlt(ptr ptr ptr long long long long ptr long long long) +@ stdcall NtGdiPolyDraw(ptr ptr ptr long) +@ stdcall NtGdiPolyPolyDraw(ptr ptr ptr long long) +@ stdcall NtGdiPolyTextOutW(ptr ptr long long) +@ stdcall NtGdiPtInRegion(ptr long long) +@ stdcall NtGdiPtVisible(ptr long long) +@ stdcall NtGdiQueryFonts(ptr long ptr) +@ stdcall NtGdiQueryFontAssocInfo(ptr) +@ stdcall NtGdiRectangle(ptr long long long long) +@ stdcall NtGdiRectInRegion(ptr ptr) +@ stdcall NtGdiRectVisible(ptr ptr) +@ stdcall NtGdiRemoveFontResourceW(ptr long long long long ptr) +@ stdcall NtGdiRemoveFontMemResourceEx(ptr) +@ stdcall NtGdiResetDC(ptr ptr ptr ptr ptr) +@ stdcall NtGdiResizePalette(ptr long) +@ stdcall NtGdiRestoreDC(ptr long) +@ stdcall NtGdiRoundRect(ptr long long long long long long) +@ stdcall NtGdiSaveDC(ptr) +@ stdcall NtGdiScaleViewportExtEx(ptr long long long long ptr) +@ stdcall NtGdiScaleWindowExtEx(ptr long long long long ptr) +@ stdcall NtGdiSelectBitmap(ptr ptr) +@ stdcall NtGdiSelectBrush(ptr ptr) +@ stdcall NtGdiSelectClipPath(ptr long) +@ stdcall NtGdiSelectFont(ptr ptr) +@ stdcall NtGdiSelectPen(ptr ptr) +@ stdcall NtGdiSetBitmapAttributes(ptr long) +@ stdcall NtGdiSetBitmapBits(ptr long ptr) +@ stdcall NtGdiSetBitmapDimension(ptr long long ptr) +@ stdcall NtGdiSetBoundsRect(ptr ptr long) +@ stdcall NtGdiSetBrushAttributes(ptr long) +@ stdcall NtGdiSetBrushOrg(ptr long long ptr) +@ stdcall NtGdiSetColorAdjustment(ptr ptr) +@ stdcall NtGdiSetColorSpace(ptr ptr) +@ stdcall NtGdiSetDeviceGammaRamp(ptr ptr) +@ stdcall NtGdiSetDIBitsToDeviceInternal(ptr long long long long long long long long ptr ptr long long long long ptr) +@ stdcall NtGdiSetFontEnumeration(long) +@ stdcall NtGdiSetFontXform(ptr long long) +@ stdcall NtGdiSetIcmMode(ptr long long) +@ stdcall NtGdiSetLinkedUFIs(ptr ptr long) +@ stdcall NtGdiSetMagicColors(ptr long long) +@ stdcall NtGdiSetMetaRgn(ptr) +@ stdcall NtGdiSetMiterLimit(ptr long ptr) +@ stdcall NtGdiGetDeviceWidth(ptr) +@ stdcall NtGdiMirrorWindowOrg(ptr) +@ stdcall NtGdiSetLayout(ptr long long) +@ stdcall NtGdiSetPixel(ptr long long long) +@ stdcall NtGdiSetPixelFormat(ptr long) +@ stdcall NtGdiSetRectRgn(ptr long long long long) +@ stdcall NtGdiSetSystemPaletteUse(ptr long) +@ stdcall NtGdiSetTextJustification(ptr long long) +@ stdcall NtGdiSetupPublicCFONT(ptr ptr long) +@ stdcall NtGdiSetVirtualResolution(ptr long long long long) +@ stdcall NtGdiSetSizeDevice(ptr long long) +@ stdcall NtGdiStartDoc(ptr ptr ptr long) +@ stdcall NtGdiStartPage(ptr) +@ stdcall NtGdiStretchBlt(ptr long long long long ptr long long long long long long) +@ stdcall NtGdiStretchDIBitsInternal(ptr long long long long long long long long ptr ptr long long long long ptr) +@ stdcall NtGdiStrokeAndFillPath(ptr) +@ stdcall NtGdiStrokePath(ptr) +@ stdcall NtGdiSwapBuffers(ptr) +@ stdcall NtGdiTransformPoints(ptr ptr ptr long long) +@ stdcall NtGdiTransparentBlt(ptr long long long long ptr long long long long long) +@ stdcall NtGdiUnloadPrinterDriver(wstr long) +@ stdcall NtGdiUnmapMemFont(ptr) +@ stdcall NtGdiUnrealizeObject(ptr) +@ stdcall NtGdiUpdateColors(ptr) +@ stdcall NtGdiWidenPath(ptr) +@ stdcall NtUserActivateKeyboardLayout(ptr long) +@ stdcall NtUserAlterWindowStyle(long long long) +@ stdcall NtUserAssociateInputContext(long long long) +@ stdcall NtUserAttachThreadInput(long long long) +@ stdcall NtUserBeginPaint(ptr ptr) +@ stdcall NtUserBitBltSysBmp(ptr long long long long long long long) +@ stdcall NtUserBlockInput(long) +@ stdcall NtUserBuildHimcList(long long long long) +@ stdcall NtUserBuildHwndList(ptr ptr long long long ptr ptr) +@ stdcall NtUserBuildNameList(ptr long ptr ptr) +@ stdcall NtUserBuildPropList(ptr ptr long ptr) +@ stdcall NtUserCallHwnd(ptr long) +@ stdcall NtUserCallHwndLock(ptr long) +@ stdcall NtUserCallHwndOpt(ptr long) +@ stdcall NtUserCallHwndParam(ptr long long) +@ stdcall NtUserCallHwndParamLock(ptr long long) +@ stdcall NtUserCallMsgFilter(ptr long) +@ stdcall NtUserCallNextHookEx(long ptr ptr long) +@ stdcall NtUserCallNoParam(long) +@ stdcall NtUserCallOneParam(ptr long) +@ stdcall NtUserCallTwoParam(ptr ptr long) +@ stdcall NtUserChangeClipboardChain(ptr ptr) +@ stdcall NtUserChangeDisplaySettings(ptr ptr ptr long ptr) +@ stdcall NtUserCheckImeHotKey(long long) +@ stdcall NtUserCheckMenuItem(ptr long long) +@ stdcall NtUserChildWindowFromPointEx(ptr long long long) +@ stdcall NtUserClipCursor(ptr) +@ stdcall NtUserCloseClipboard() +@ stdcall NtUserCloseDesktop(ptr) +@ stdcall NtUserCloseWindowStation(ptr) +@ stdcall NtUserConsoleControl(long long long) +@ stdcall NtUserConvertMemHandle(ptr long) +@ stdcall NtUserCopyAcceleratorTable(ptr ptr long) +@ stdcall NtUserCountClipboardFormats() +@ stdcall NtUserCreateAcceleratorTable(ptr ptr) +@ stdcall NtUserCreateCaret(ptr ptr long long) +@ stdcall NtUserCreateDesktop(ptr ptr ptr long long) +@ stdcall NtUserCreateInputContext(long) +@ stdcall NtUserCreateLocalMemHandle(ptr ptr long ptr) +@ stdcall NtUserCreateWindowEx(long ptr ptr ptr long long long long long ptr ptr ptr ptr long ptr) +@ stdcall NtUserCreateWindowStation(ptr long long long long long long) +@ stdcall NtUserDdeGetQualityOfService(ptr ptr ptr) +@ stdcall NtUserDdeInitialize(long long long long long) +@ stdcall NtUserDdeSetQualityOfService(ptr ptr ptr) +@ stdcall NtUserDeferWindowPos(ptr ptr ptr long long long long long) +@ stdcall NtUserDefSetText(ptr ptr) +@ stdcall NtUserDeleteMenu(ptr long long) +@ stdcall NtUserDestroyAcceleratorTable(ptr) +@ stdcall NtUserDestroyCursor(ptr long) +@ stdcall NtUserDestroyInputContext(long) +@ stdcall NtUserDestroyMenu(ptr) +@ stdcall NtUserDestroyWindow(ptr) +@ stdcall NtUserDisableThreadIme(long) +@ stdcall NtUserDispatchMessage(ptr) +@ stdcall NtUserDragDetect(ptr ptr long) +@ stdcall NtUserDragObject(ptr ptr long long ptr) +@ stdcall NtUserDrawAnimatedRects(ptr long ptr ptr) +@ stdcall NtUserDrawCaption(ptr ptr ptr long) +@ stdcall NtUserDrawCaptionTemp(ptr ptr ptr ptr ptr ptr long) +@ stdcall NtUserDrawIconEx(ptr long long ptr long long long ptr long long ptr) +@ stdcall NtUserDrawMenuBarTemp(ptr ptr ptr ptr ptr) +@ stdcall NtUserEmptyClipboard() +@ stdcall NtUserEnableMenuItem(ptr long long) +@ stdcall NtUserEnableScrollBar(ptr long long) +@ stdcall NtUserEndDeferWindowPosEx(ptr long) +@ stdcall NtUserEndMenu() +@ stdcall NtUserEndPaint(ptr ptr) +@ stdcall NtUserEnumDisplayDevices(ptr long ptr long) +; @ stdcall NtUserEnumDisplayMonitors(ptr ptr ptr ptr) +@ stdcall NtUserEnumDisplaySettings(ptr long ptr long) +@ stdcall NtUserEvent(long) +@ stdcall NtUserExcludeUpdateRgn(ptr ptr) +@ stdcall NtUserFillWindow(ptr ptr ptr ptr) +; @ stdcall NtUserFindExistingCursorIcon(ptr ptr ptr) +@ stdcall NtUserFindWindowEx(ptr ptr ptr ptr long) +@ stdcall NtUserFlashWindowEx(ptr) +@ stdcall NtUserGetAltTabInfo(ptr long ptr wstr long long) +@ stdcall NtUserGetAncestor(ptr long) +; @ stdcall NtUserGetAppImeLevel(long) +@ stdcall NtUserGetAsyncKeyState(long) +@ stdcall NtUserGetAtomName(long ptr) +@ stdcall NtUserGetCaretBlinkTime() +@ stdcall NtUserGetCaretPos(ptr) +; @ stdcall NtUserGetClassInfo(ptr ptr ptr ptr long) +@ stdcall NtUserGetClassName(ptr long ptr) +@ stdcall NtUserGetClipboardData(long ptr) +@ stdcall NtUserGetClipboardFormatName(long wstr ptr) +@ stdcall NtUserGetClipboardOwner() +@ stdcall NtUserGetClipboardSequenceNumber() +@ stdcall NtUserGetClipboardViewer() +@ stdcall NtUserGetClipCursor(ptr) +@ stdcall NtUserGetComboBoxInfo(ptr ptr) +@ stdcall NtUserGetControlBrush(ptr ptr long) +@ stdcall NtUserGetControlColor(ptr ptr ptr long) +@ stdcall NtUserGetCPD(ptr long ptr) +@ stdcall NtUserGetCursorFrameInfo(ptr long ptr ptr) +@ stdcall NtUserGetCursorInfo(ptr) +@ stdcall NtUserGetDC(ptr) +@ stdcall NtUserGetDCEx(ptr ptr long) +@ stdcall NtUserGetDoubleClickTime() +@ stdcall NtUserGetForegroundWindow() +@ stdcall NtUserGetGuiResources(ptr long) +@ stdcall NtUserGetGUIThreadInfo(long ptr) +@ stdcall NtUserGetIconInfo(ptr ptr ptr ptr ptr long) +@ stdcall NtUserGetIconSize(ptr long ptr ptr) +@ stdcall NtUserGetImeHotKey(long long long long) +@ stdcall NtUserGetImeInfoEx(long long) +@ stdcall NtUserGetInternalWindowPos(ptr ptr ptr) +@ stdcall NtUserGetKeyboardLayoutList(long ptr) +@ stdcall NtUserGetKeyboardLayoutName(str) +@ stdcall NtUserGetKeyboardState(ptr) +@ stdcall NtUserGetKeyNameText(long wstr long) +@ stdcall NtUserGetKeyState(long) +@ stdcall NtUserGetListBoxInfo(ptr) +@ stdcall NtUserGetMenuBarInfo(ptr long long ptr) +@ stdcall NtUserGetMenuIndex(ptr ptr) +@ stdcall NtUserGetMenuItemRect(ptr ptr long ptr) +@ stdcall NtUserGetMessage(ptr ptr long long) +@ stdcall NtUserGetMouseMovePointsEx(long ptr ptr long long) +@ stdcall NtUserGetObjectInformation(ptr long ptr long ptr) +@ stdcall NtUserGetOpenClipboardWindow() +@ stdcall NtUserGetPriorityClipboardFormat(ptr long) +@ stdcall NtUserGetProcessWindowStation() +@ stdcall NtUserGetRawInputBuffer(ptr ptr long) +@ stdcall NtUserGetRawInputData(ptr long ptr ptr long) +@ stdcall NtUserGetRawInputDeviceInfo(ptr long ptr ptr) +@ stdcall NtUserGetRawInputDeviceList(ptr ptr long) +@ stdcall NtUserGetRegisteredRawInputDevices(ptr ptr long) +@ stdcall NtUserGetScrollBarInfo(ptr long ptr) +@ stdcall NtUserGetSystemMenu(ptr long) +@ stdcall NtUserGetThreadDesktop(long long) +@ stdcall NtUserGetThreadState(ptr) +@ stdcall NtUserGetTitleBarInfo(ptr ptr) +@ stdcall NtUserGetUpdateRect(ptr ptr long) +@ stdcall NtUserGetUpdateRgn(ptr ptr long) +@ stdcall NtUserGetWindowDC(ptr) +@ stdcall NtUserGetWindowPlacement(ptr ptr) +@ stdcall NtUserGetWOWClass(ptr ptr) +@ stdcall NtUserHardErrorControl(long long long) +@ stdcall NtUserHideCaret(ptr) +@ stdcall NtUserHiliteMenuItem(ptr ptr long long) +@ stdcall NtUserImpersonateDdeClientWindow(ptr ptr) +@ stdcall NtUserInitialize(long ptr ptr) +@ stdcall NtUserInitializeClientPfnArrays(ptr ptr ptr ptr) +; @ stdcall NtUserInitTask(long long long long long long long long long long long long) +@ stdcall NtUserInternalGetWindowText(ptr wstr ptr) +@ stdcall NtUserInvalidateRect(ptr ptr long) +@ stdcall NtUserInvalidateRgn(ptr ptr long) +@ stdcall NtUserIsClipboardFormatAvailable(long) +@ stdcall NtUserKillTimer(ptr ptr) +@ stdcall NtUserLoadKeyboardLayoutEx(ptr long ptr ptr ptr long long) +@ stdcall NtUserLockWindowStation(ptr) +@ stdcall NtUserLockWindowUpdate(ptr) +@ stdcall NtUserLockWorkStation() +@ stdcall NtUserMapVirtualKeyEx(long long long ptr) +@ stdcall NtUserMenuItemFromPoint(ptr ptr long long) +@ stdcall NtUserMessageCall(ptr long ptr ptr ptr long long) +@ stdcall NtUserMinMaximize(ptr long long) +@ stdcall NtUserMNDragLeave() +@ stdcall NtUserMNDragOver(long long) +@ stdcall NtUserModifyUserStartupInfoFlags(long long) +@ stdcall NtUserMoveWindow(ptr long long long long long) +@ stdcall NtUserNotifyIMEStatus(long long long) +@ stdcall NtUserNotifyProcessCreate(long long long long) +@ stdcall NtUserNotifyWinEvent(long long long long) +@ stdcall NtUserOpenClipboard(ptr long) +@ stdcall NtUserOpenDesktop(ptr long long) +@ stdcall NtUserOpenInputDesktop(long long long) +@ stdcall NtUserOpenWindowStation(ptr long) +@ stdcall NtUserPaintDesktop(ptr) +@ stdcall NtUserPeekMessage(ptr ptr long long long) +@ stdcall NtUserPostMessage(ptr long long long) +@ stdcall NtUserPostThreadMessage(long long long long) +@ stdcall NtUserPrintWindow(ptr ptr long) +@ stdcall NtUserProcessConnect(ptr ptr long) +@ stdcall NtUserQueryInformationThread(long long long long long) +@ stdcall NtUserQueryInputContext(long long) +@ stdcall NtUserQuerySendMessage(long) +@ stdcall NtUserQueryUserCounters(long long long long long) +@ stdcall NtUserQueryWindow(ptr long) +@ stdcall NtUserRealChildWindowFromPoint(ptr long long) +@ stdcall NtUserRealInternalGetMessage(ptr ptr long long long long) +@ stdcall NtUserRealWaitMessageEx(long long) +@ stdcall NtUserRedrawWindow(ptr ptr ptr long) +@ stdcall NtUserRegisterClassExWOW(ptr ptr ptr ptr long long ptr) +@ stdcall NtUserRegisterUserApiHook(ptr ptr long long) +@ stdcall NtUserRegisterHotKey(ptr long long long) +@ stdcall NtUserRegisterRawInputDevices(ptr long long) +@ stdcall NtUserRegisterTasklist(long) +@ stdcall NtUserRegisterWindowMessage(ptr) +@ stdcall NtUserRemoveMenu(ptr long long) +@ stdcall NtUserRemoveProp(ptr long) +@ stdcall NtUserResolveDesktop(long long long long) +@ stdcall NtUserResolveDesktopForWOW(long) +@ stdcall NtUserSBGetParms(ptr long ptr ptr) +@ stdcall NtUserScrollDC(ptr long long ptr ptr ptr ptr) +@ stdcall NtUserScrollWindowEx(ptr long long ptr ptr ptr ptr long) +@ stdcall NtUserSelectPalette(ptr ptr long) +@ stdcall NtUserSendInput(long ptr long) +@ stdcall NtUserSetActiveWindow(ptr) +@ stdcall NtUserSetAppImeLevel(long long) +@ stdcall NtUserSetCapture(ptr) +@ stdcall NtUserSetClassLong(ptr long ptr long) +@ stdcall NtUserSetClassWord(ptr long long) +@ stdcall NtUserSetClipboardData(long ptr ptr) +@ stdcall NtUserSetClipboardViewer(ptr) +@ stdcall NtUserSetConsoleReserveKeys(long long) +@ stdcall NtUserSetCursor(ptr) +@ stdcall NtUserSetCursorContents(ptr ptr) +; @ stdcall NtUserSetCursorIconData(ptr ptr ptr ptr) +@ stdcall NtUserSetDbgTag(long long) +@ stdcall NtUserSetFocus(ptr) +@ stdcall NtUserSetImeHotKey(long long long long long) +@ stdcall NtUserSetImeInfoEx(long) +@ stdcall NtUserSetImeOwnerWindow(long long) +@ stdcall NtUserSetInformationProcess(long long long long) +@ stdcall NtUserSetInformationThread(ptr long ptr long) +@ stdcall NtUserSetInternalWindowPos(ptr long ptr ptr) +@ stdcall NtUserSetKeyboardState(ptr) +@ stdcall NtUserSetLogonNotifyWindow(ptr) +@ stdcall NtUserSetMenu(ptr ptr long) +@ stdcall NtUserSetMenuContextHelpId(ptr long) +@ stdcall NtUserSetMenuDefaultItem(ptr long long) +@ stdcall NtUserSetMenuFlagRtoL(ptr) +@ stdcall NtUserSetObjectInformation(ptr long ptr long) +@ stdcall NtUserSetParent(ptr ptr) +@ stdcall NtUserSetProcessWindowStation(ptr) +@ stdcall NtUserSetProp(ptr long ptr) +@ stdcall NtUserSetRipFlags(long long) +@ stdcall NtUserSetScrollInfo(ptr long ptr long) +@ stdcall NtUserSetShellWindowEx(ptr ptr) +@ stdcall NtUserSetSysColors(long ptr ptr long) +@ stdcall NtUserSetSystemCursor(ptr long) +@ stdcall NtUserSetSystemMenu(ptr ptr) +@ stdcall NtUserSetSystemTimer(ptr ptr long ptr) +@ stdcall NtUserSetThreadDesktop(ptr) +@ stdcall NtUserSetThreadLayoutHandles(long long) +@ stdcall NtUserSetThreadState(long long) +@ stdcall NtUserSetTimer(ptr ptr long ptr) +@ stdcall NtUserSetWindowFNID(ptr long) +@ stdcall NtUserSetWindowLong(ptr long long long) +@ stdcall NtUserSetWindowPlacement(ptr ptr) +@ stdcall NtUserSetWindowPos(ptr ptr long long long long long) +@ stdcall NtUserSetWindowRgn(ptr ptr long) +@ stdcall NtUserSetWindowsHookAW(long ptr long) +@ stdcall NtUserSetWindowsHookEx(ptr ptr long long ptr long) +@ stdcall NtUserSetWindowStationUser(long long long long) +@ stdcall NtUserSetWindowWord(ptr long long) +@ stdcall NtUserSetWinEventHook(long long ptr ptr ptr long long long) +@ stdcall NtUserShowCaret(ptr) +@ stdcall NtUserShowScrollBar(ptr long long) +@ stdcall NtUserShowWindow(ptr long) +@ stdcall NtUserShowWindowAsync(ptr long) +@ stdcall NtUserSoundSentry() +@ stdcall NtUserSwitchDesktop(ptr) +@ stdcall NtUserSystemParametersInfo(long long ptr long) +@ stdcall NtUserTestForInteractiveUser(long) +@ stdcall NtUserThunkedMenuInfo(ptr ptr) +@ stdcall NtUserThunkedMenuItemInfo(ptr long long long ptr ptr) +@ stdcall NtUserToUnicodeEx(long long ptr wstr long long ptr) +@ stdcall NtUserTrackMouseEvent(ptr) +@ stdcall NtUserTrackPopupMenuEx(ptr long long long ptr ptr) +@ stdcall NtUserCalcMenuBar(long long long long long) +@ stdcall NtUserPaintMenuBar(long long long long long long) +@ stdcall NtUserTranslateAccelerator(ptr ptr ptr) +@ stdcall NtUserTranslateMessage(ptr long) +@ stdcall NtUserUnhookWindowsHookEx(ptr) +@ stdcall NtUserUnhookWinEvent(ptr) +@ stdcall NtUserUnloadKeyboardLayout(ptr) +@ stdcall NtUserUnlockWindowStation(ptr) +; @ stdcall NtUserUnregisterClass(ptr ptr ptr) +@ stdcall NtUserUnregisterUserApiHook() +@ stdcall NtUserUnregisterHotKey(ptr long) +@ stdcall NtUserUpdateInputContext(long long long) +@ stdcall NtUserUpdateInstance(long long long) +@ stdcall NtUserUpdateLayeredWindow(ptr ptr ptr ptr ptr ptr long ptr long ptr) +@ stdcall NtUserGetLayeredWindowAttributes(ptr ptr ptr ptr) +@ stdcall NtUserSetLayeredWindowAttributes(ptr long long long) +@ stdcall NtUserUpdatePerUserSystemParameters(long long) +@ stdcall NtUserUserHandleGrantAccess(ptr ptr long) +@ stdcall NtUserValidateHandleSecure(ptr long) +@ stdcall NtUserValidateRect(ptr ptr) +@ stdcall NtUserValidateTimerCallback(ptr ptr ptr) +@ stdcall NtUserVkKeyScanEx(long ptr long) +@ stdcall NtUserWaitForInputIdle(ptr long long) +@ stdcall NtUserWaitForMsgAndEvent(long) +@ stdcall NtUserWaitMessage() +@ stdcall NtUserWin32PoolAllocationStats(long long long long long long) +@ stdcall NtUserWindowFromPoint(long long) +@ stdcall NtUserYieldTask() +@ stdcall NtUserRemoteConnect(long long long) +@ stdcall NtUserRemoteRedrawRectangle(long long long long) +@ stdcall NtUserRemoteRedrawScreen() +@ stdcall NtUserRemoteStopScreenUpdates() +@ stdcall NtUserCtxDisplayIOCtl(long long long) +@ stdcall NtGdiEngAssociateSurface(ptr ptr long) +@ stdcall NtGdiEngCreateBitmap(long long long long long ptr) +@ stdcall NtGdiEngCreateDeviceSurface(ptr long long long) +@ stdcall NtGdiEngCreateDeviceBitmap(ptr long long long) +@ stdcall NtGdiEngCreatePalette(long long ptr long long long) +@ stdcall NtGdiEngComputeGlyphSet(ptr ptr ptr) +@ stdcall NtGdiEngCopyBits(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngDeletePalette(ptr) +@ stdcall NtGdiEngDeleteSurface(ptr) +@ stdcall NtGdiEngEraseSurface(ptr ptr long) +@ stdcall NtGdiEngUnlockSurface(ptr) +@ stdcall NtGdiEngLockSurface(ptr) +@ stdcall NtGdiEngBitBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStretchBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiEngPlgBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiEngMarkBandingSurface(ptr) +@ stdcall NtGdiEngStrokePath(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngFillPath(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStrokeAndFillPath(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngPaint(ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngLineTo(ptr ptr ptr long long long long ptr ptr) +@ stdcall NtGdiEngAlphaBlend(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngGradientFill(ptr ptr ptr ptr long ptr long ptr ptr long) +@ stdcall NtGdiEngTransparentBlt(ptr ptr ptr ptr ptr ptr long long) +@ stdcall NtGdiEngTextOut(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStretchBltROP(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long ptr long) +@ stdcall NtGdiXLATEOBJ_cGetPalette(ptr long long ptr) +@ stdcall NtGdiXLATEOBJ_iXlate(ptr long) +@ stdcall NtGdiXLATEOBJ_hGetColorTransform(ptr) +@ stdcall NtGdiCLIPOBJ_bEnum(ptr long long) +@ stdcall NtGdiCLIPOBJ_cEnumStart(ptr long long long long) +@ stdcall NtGdiCLIPOBJ_ppoGetPath(ptr) +@ stdcall NtGdiEngDeletePath(ptr) +@ stdcall NtGdiEngCreateClip() +@ stdcall NtGdiEngDeleteClip(ptr) +@ stdcall NtGdiBRUSHOBJ_ulGetBrushColor(ptr) +@ stdcall NtGdiBRUSHOBJ_pvAllocRbrush(ptr long) +@ stdcall NtGdiBRUSHOBJ_pvGetRbrush(ptr) +@ stdcall NtGdiBRUSHOBJ_hGetColorTransform(ptr) +@ stdcall NtGdiXFORMOBJ_bApplyXform(ptr ptr long long ptr) +@ stdcall NtGdiXFORMOBJ_iGetXform(ptr ptr) +@ stdcall NtGdiFONTOBJ_vGetInfo(ptr long ptr) +@ stdcall NtGdiFONTOBJ_pxoGetXform(ptr) +@ stdcall NtGdiFONTOBJ_cGetGlyphs(ptr long long ptr ptr) +@ stdcall NtGdiFONTOBJ_pifi(ptr) +@ stdcall NtGdiFONTOBJ_pfdg(ptr) +@ stdcall NtGdiFONTOBJ_pQueryGlyphAttrs(ptr long) +@ stdcall NtGdiFONTOBJ_pvTrueTypeFontFile(ptr ptr) +@ stdcall NtGdiFONTOBJ_cGetAllGlyphHandles(ptr ptr) +@ stdcall NtGdiSTROBJ_bEnum(ptr ptr ptr) +@ stdcall NtGdiSTROBJ_bEnumPositionsOnly(ptr ptr ptr) +@ stdcall NtGdiSTROBJ_bGetAdvanceWidths(ptr long long ptr) +@ stdcall NtGdiSTROBJ_vEnumStart(ptr) +@ stdcall NtGdiSTROBJ_dwGetCodePage(ptr) +@ stdcall NtGdiPATHOBJ_vGetBounds(ptr ptr) +@ stdcall NtGdiPATHOBJ_bEnum(ptr ptr) +@ stdcall NtGdiPATHOBJ_vEnumStart(ptr) +@ stdcall NtGdiPATHOBJ_vEnumStartClipLines(ptr ptr ptr ptr) +@ stdcall NtGdiPATHOBJ_bEnumClipLines(ptr long ptr) +@ stdcall NtGdiGetDhpdev(ptr) +@ stdcall NtGdiEngCheckAbort(ptr) +@ stdcall NtGdiHT_Get8BPPFormatPalette(ptr long long long) +@ stdcall NtGdiHT_Get8BPPMaskPalette(ptr long long long long long) +@ stdcall NtGdiUpdateTransform(ptr) +@ stdcall NtGdiSetPUMPDOBJ(ptr long ptr ptr) +@ stdcall NtGdiBRUSHOBJ_DeleteRbrush(ptr ptr) +@ stdcall NtGdiUMPDEngFreeUserMem(ptr) +@ stdcall NtGdiUnmapMemFont(ptr) +@ stdcall NtGdiDrawStream(ptr long ptr) diff --git a/rostests/apitests/w32kdll/w32kdll_vista/CMakeLists.txt b/rostests/apitests/w32kdll/w32kdll_vista/CMakeLists.txt index a70bec57cf7..5d26368d7dd 100644 --- a/rostests/apitests/w32kdll/w32kdll_vista/CMakeLists.txt +++ b/rostests/apitests/w32kdll/w32kdll_vista/CMakeLists.txt @@ -1,6 +1,11 @@ -add_library(w32kdll_vista SHARED main.c w32kdll_vista.S) +spec2def(w32kdll_dll.spec w32kdll_vista.spec) + +add_library(w32kdll_vista SHARED + main.c + w32kdll_vista.S + ${CMAKE_CURRENT_BINARY_DIR}/w32kdll_vista.def) set_entrypoint(w32kdll_vista 0) -target_link_libraries(w32kdll_vista ${CMAKE_CURRENT_SOURCE_DIR}/w32kdll_vista.def) + add_dependencies(w32kdll_vista psdk ) -add_importlib_target(w32kdll_vista.def) +add_importlib_target(w32kdll_vista.spec) diff --git a/rostests/apitests/w32kdll/w32kdll_vista/w32kdll_vista.spec b/rostests/apitests/w32kdll/w32kdll_vista/w32kdll_vista.spec new file mode 100644 index 00000000000..8b716bb120f --- /dev/null +++ b/rostests/apitests/w32kdll/w32kdll_vista/w32kdll_vista.spec @@ -0,0 +1,778 @@ +; +; ReactOS Operating System +; +; This file contains all win32k native api functions from win vista +; + +@ stdcall NtGdiAbortDoc(ptr) +@ stdcall NtGdiAbortPath(ptr) +@ stdcall NtGdiAddFontResourceW(wstr long long long long ptr) +@ stdcall NtGdiAddRemoteFontToDC(ptr ptr long ptr) +@ stdcall NtGdiAddFontMemResourceEx(ptr long ptr long ptr) +@ stdcall NtGdiRemoveMergeFont(ptr ptr) +@ stdcall NtGdiAddRemoteMMInstanceToDC(ptr ptr long) +@ stdcall NtGdiAlphaBlend(ptr long long long long ptr long long long long long ptr) +@ stdcall NtGdiAngleArc(ptr long long long long long) +@ stdcall NtGdiAnyLinkedFonts() +@ stdcall NtGdiFontIsLinked(ptr) +@ stdcall NtGdiArcInternal(long ptr long long long long long long long long) +@ stdcall NtGdiBeginPath(ptr) +@ stdcall NtGdiBitBlt(ptr long long long long ptr long long long long long) +@ stdcall NtGdiCancelDC(ptr) +@ stdcall NtGdiCheckBitmapBits(ptr ptr ptr long long long long ptr) +@ stdcall NtGdiCloseFigure(ptr) +@ stdcall NtGdiClearBitmapAttributes(ptr long) +@ stdcall NtGdiClearBrushAttributes(ptr long) +@ stdcall NtGdiColorCorrectPalette(ptr ptr long long ptr long) +@ stdcall NtGdiCombineRgn(ptr ptr ptr long) +@ stdcall NtGdiCombineTransform(ptr ptr ptr) +@ stdcall NtGdiComputeXformCoefficients(ptr) +@ stdcall NtGdiConfigureOPMProtectedOutput(ptr ptr long ptr) +@ stdcall NtGdiConsoleTextOut(ptr ptr long ptr) +@ stdcall NtGdiConvertMetafileRect(ptr ptr) +@ stdcall NtGdiCreateBitmap(long long long long ptr) +@ stdcall NtGdiCreateClientObj(long) +@ stdcall NtGdiCreateColorSpace(ptr) +@ stdcall NtGdiCreateColorTransform(ptr ptr ptr long ptr long ptr long) +@ stdcall NtGdiCreateCompatibleBitmap(ptr long long) +@ stdcall NtGdiCreateCompatibleDC(ptr) +@ stdcall NtGdiCreateDIBBrush(ptr long long long long ptr) +@ stdcall NtGdiCreateDIBitmapInternal(ptr long long long ptr ptr long long long long ptr) +@ stdcall NtGdiCreateDIBSection(ptr ptr long ptr long long long ptr ptr) +@ stdcall NtGdiCreateEllipticRgn(long long long long) +@ stdcall NtGdiCreateHalftonePalette(ptr) +@ stdcall NtGdiCreateHatchBrushInternal(long long long) +@ stdcall NtGdiCreateMetafileDC(ptr) +@ stdcall NtGdiCreateOPMProtectedOutputs(ptr long long ptr ptr) +@ stdcall NtGdiCreatePaletteInternal(ptr long) +@ stdcall NtGdiCreatePatternBrushInternal(ptr long long) +@ stdcall NtGdiCreatePen(long long long ptr) +@ stdcall NtGdiCreateRectRgn(long long long long) +@ stdcall NtGdiCreateRoundRectRgn(long long long long long long) +@ stdcall NtGdiCreateServerMetaFile(long long ptr long long long) +@ stdcall NtGdiCreateSolidBrush(long ptr) +@ stdcall NtGdiD3dContextCreate(ptr ptr ptr ptr) +@ stdcall NtGdiD3dContextDestroy(ptr) +@ stdcall NtGdiD3dContextDestroyAll(ptr) +@ stdcall NtGdiD3dValidateTextureStageState(ptr) +@ stdcall NtGdiD3dDrawPrimitives2(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdGetDriverState(ptr) +@ stdcall NtGdiDdAddAttachedSurface(ptr ptr ptr) +@ stdcall NtGdiDdAlphaBlt(ptr ptr ptr) +@ stdcall NtGdiDdAttachSurface(ptr ptr) +@ stdcall NtGdiDdBeginMoCompFrame(ptr ptr) +@ stdcall NtGdiDdBlt(ptr ptr ptr) +@ stdcall NtGdiDdCanCreateSurface(ptr ptr) +@ stdcall NtGdiDdCanCreateD3DBuffer(ptr ptr) +@ stdcall NtGdiDdColorControl(ptr ptr) +@ stdcall NtGdiDdCreateDirectDrawObject(ptr) +@ stdcall NtGdiDdCreateSurface(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdCreateD3DBuffer(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdCreateMoComp(ptr ptr) +@ stdcall NtGdiDdCreateSurfaceObject(ptr ptr ptr ptr ptr long) +@ stdcall NtGdiDdDeleteDirectDrawObject(ptr) +@ stdcall NtGdiDdDeleteSurfaceObject(ptr) +@ stdcall NtGdiDdDestroyMoComp(ptr ptr) +@ stdcall NtGdiDdDestroySurface(ptr long) +@ stdcall NtGdiDdDestroyD3DBuffer(ptr) +@ stdcall NtGdiDdEndMoCompFrame(ptr ptr) +@ stdcall NtGdiDdFlip(ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdFlipToGDISurface(ptr ptr) +@ stdcall NtGdiDdGetAvailDriverMemory(ptr ptr) +@ stdcall NtGdiDdGetBltStatus(ptr ptr) +@ stdcall NtGdiDdGetDC(ptr ptr) +@ stdcall NtGdiDdGetDriverInfo(ptr ptr) +@ stdcall NtGdiDdGetDxHandle(ptr ptr long) +@ stdcall NtGdiDdGetFlipStatus(ptr ptr) +@ stdcall NtGdiDdGetInternalMoCompInfo(ptr ptr) +@ stdcall NtGdiDdGetMoCompBuffInfo(ptr ptr) +@ stdcall NtGdiDdGetMoCompGuids(ptr ptr) +@ stdcall NtGdiDdGetMoCompFormats(ptr ptr) +@ stdcall NtGdiDdGetScanLine(ptr ptr) +@ stdcall NtGdiDdLock(ptr ptr ptr) +@ stdcall NtGdiDdLockD3D(ptr ptr) +@ stdcall NtGdiDdQueryDirectDrawObject(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdQueryMoCompStatus(ptr ptr) +@ stdcall NtGdiDdReenableDirectDrawObject(ptr ptr) +@ stdcall NtGdiDdReleaseDC(ptr) +@ stdcall NtGdiDdRenderMoComp(ptr ptr) +@ stdcall NtGdiDdResetVisrgn(ptr ptr) +@ stdcall NtGdiDdSetColorKey(ptr ptr) +@ stdcall NtGdiDdSetExclusiveMode(ptr ptr) +@ stdcall NtGdiDdSetGammaRamp(ptr ptr ptr) +@ stdcall NtGdiDdCreateSurfaceEx(ptr ptr long) +@ stdcall NtGdiDdSetOverlayPosition(ptr ptr ptr) +@ stdcall NtGdiDdUnattachSurface(ptr ptr) +@ stdcall NtGdiDdUnlock(ptr ptr) +@ stdcall NtGdiDdUnlockD3D(ptr ptr) +@ stdcall NtGdiDdUpdateOverlay(ptr ptr ptr) +@ stdcall NtGdiDdWaitForVerticalBlank(ptr ptr) +@ stdcall NtGdiDvpCanCreateVideoPort(ptr ptr) +@ stdcall NtGdiDvpColorControl(ptr ptr) +@ stdcall NtGdiDvpCreateVideoPort(ptr ptr) +@ stdcall NtGdiDvpDestroyVideoPort(ptr ptr) +@ stdcall NtGdiDvpFlipVideoPort(ptr ptr ptr ptr) +@ stdcall NtGdiDvpGetVideoPortBandwidth(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortField(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortFlipStatus(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortInputFormats(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortLine(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortOutputFormats(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortConnectInfo(ptr ptr) +@ stdcall NtGdiDvpGetVideoSignalStatus(ptr ptr) +@ stdcall NtGdiDvpUpdateVideoPort(ptr ptr ptr ptr) +@ stdcall NtGdiDvpWaitForVideoPortSync(ptr ptr) +@ stdcall NtGdiDvpAcquireNotification(ptr ptr ptr) +@ stdcall NtGdiDvpReleaseNotification(ptr ptr) +@ stdcall NtGdiDxgGenericThunk(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDeleteClientObj(ptr) +@ stdcall NtGdiDeleteColorSpace(ptr) +@ stdcall NtGdiDeleteColorTransform(ptr ptr) +@ stdcall NtGdiDeleteObjectApp(ptr) +@ stdcall NtGdiDescribePixelFormat(ptr long long ptr) +@ stdcall NtGdiDestroyOPMProtectedOutput(ptr) +@ stdcall NtGdiGetPerBandInfo(ptr ptr) +@ stdcall NtGdiDoBanding(ptr long ptr ptr) +@ stdcall NtGdiDoPalette(ptr long long ptr long long) +@ stdcall NtGdiDrawEscape(ptr long long ptr) +@ stdcall NtGdiEllipse(ptr long long long long) +@ stdcall NtGdiEnableEudc(long) +@ stdcall NtGdiEndDoc(ptr) +@ stdcall NtGdiEndPage(ptr) +@ stdcall NtGdiEndPath(ptr) +@ stdcall NtGdiEnumFontChunk(ptr ptr long ptr ptr) +@ stdcall NtGdiEnumFontClose(ptr) +@ stdcall NtGdiEnumFontOpen(ptr long long long wstr long ptr) +@ stdcall NtGdiEnumObjects(ptr long long ptr) +@ stdcall NtGdiEqualRgn(ptr ptr) +@ stdcall NtGdiEudcLoadUnloadLink(wstr long wstr long long long long) +@ stdcall NtGdiExcludeClipRect(ptr long long long long) +@ stdcall NtGdiExtCreatePen(long long long long ptr ptr long ptr long long ptr) +@ stdcall NtGdiExtCreateRegion(ptr long ptr) +@ stdcall NtGdiExtEscape(ptr ptr long long long ptr long ptr) +@ stdcall NtGdiExtFloodFill(ptr long long long long) +@ stdcall NtGdiExtGetObjectW(ptr long ptr) +@ stdcall NtGdiExtSelectClipRgn(ptr ptr long) +@ stdcall NtGdiExtTextOutW(ptr long long long ptr wstr long ptr long) +@ stdcall NtGdiFillPath(ptr) +@ stdcall NtGdiFillRgn(ptr ptr ptr) +@ stdcall NtGdiFlattenPath(ptr) +@ stdcall NtGdiFlush() +@ stdcall NtGdiForceUFIMapping(ptr ptr) +@ stdcall NtGdiFrameRgn(ptr ptr ptr long long) +@ stdcall NtGdiFullscreenControl(long ptr long ptr ptr) +@ stdcall NtGdiGetAndSetDCDword(ptr long long ptr) +@ stdcall NtGdiGetAppClipBox(ptr ptr) +@ stdcall NtGdiGetBitmapBits(ptr long ptr) +@ stdcall NtGdiGetBitmapDimension(ptr ptr) +@ stdcall NtGdiGetBoundsRect(ptr ptr long) +@ stdcall NtGdiGetCertificate(ptr ptr long ptr) +@ stdcall NtGdiGetCertificateSize(ptr ptr ptr) +@ stdcall NtGdiGetCharABCWidthsW(ptr long long ptr long ptr) +@ stdcall NtGdiGetCharacterPlacementW(ptr wstr long long ptr long) +@ stdcall NtGdiGetCharSet(ptr) +@ stdcall NtGdiGetCharWidthW(ptr long long ptr long ptr) +@ stdcall NtGdiGetCharWidthInfo(ptr ptr) +@ stdcall NtGdiGetColorAdjustment(ptr ptr) +@ stdcall NtGdiGetColorSpaceforBitmap(ptr) +@ stdcall NtGdiGetCOPPCompatibleOPMInformation(ptr ptr ptr) +@ stdcall NtGdiGetDCDword(ptr long ptr) +@ stdcall NtGdiGetDCforBitmap(ptr) +@ stdcall NtGdiGetDCObject(ptr long) +@ stdcall NtGdiGetDCPoint(ptr long ptr) +@ stdcall NtGdiGetDeviceCaps(ptr long) +@ stdcall NtGdiGetDeviceGammaRamp(ptr ptr) +@ stdcall NtGdiGetDeviceCapsAll(ptr ptr) +@ stdcall NtGdiGetDIBitsInternal(ptr ptr long long ptr ptr long long long) +@ stdcall NtGdiGetETM(ptr ptr) +@ stdcall NtGdiGetEudcTimeStampEx(wstr long long) +@ stdcall NtGdiGetFontData(ptr long long ptr long) +@ stdcall NtGdiGetFontResourceInfoInternalW(wstr long long long ptr ptr long) +@ stdcall NtGdiGetGlyphIndicesW(ptr wstr long ptr long) +@ stdcall NtGdiGetGlyphIndicesWInternal(ptr wstr long ptr long long) +@ stdcall NtGdiGetGlyphOutline(ptr long long ptr long ptr ptr long) +@ stdcall NtGdiGetOPMInformation(ptr ptr ptr) +@ stdcall NtGdiGetKerningPairs(ptr long ptr) +@ stdcall NtGdiGetLinkedUFIs(ptr ptr long) +@ stdcall NtGdiGetMiterLimit(ptr ptr) +@ stdcall NtGdiGetMonitorID(ptr long ptr) +@ stdcall NtGdiGetNearestColor(ptr ptr) +@ stdcall NtGdiGetNearestPaletteIndex(ptr ptr) +@ stdcall NtGdiGetObjectBitmapHandle(ptr ptr) +@ stdcall NtGdiGetOPMRandomNumber(ptr ptr) +@ stdcall NtGdiGetOutlineTextMetricsInternalW(ptr long ptr ptr) +@ stdcall NtGdiGetPath(ptr ptr ptr long) +@ stdcall NtGdiGetPixel(ptr long long) +@ stdcall NtGdiGetRandomRgn(ptr ptr long) +@ stdcall NtGdiGetRasterizerCaps(ptr long) +@ stdcall NtGdiGetRealizationInfo(ptr ptr ptr) +@ stdcall NtGdiGetRegionData(ptr long ptr) +@ stdcall NtGdiGetRgnBox(ptr ptr) +@ stdcall NtGdiGetServerMetaFileBits(ptr long ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetSpoolMessage(long long long long) +@ stdcall NtGdiGetStats(ptr long long ptr long) +@ stdcall NtGdiGetStockObject(ptr) +@ stdcall NtGdiGetStringBitmapW(ptr wstr long ptr long) +@ stdcall NtGdiGetSuggestedOPMProtectedOutputArraySize(ptr ptr) +@ stdcall NtGdiGetSystemPaletteUse(ptr) +@ stdcall NtGdiGetTextCharsetInfo(ptr ptr long) +@ stdcall NtGdiGetTextExtent(ptr wstr long ptr long) +@ stdcall NtGdiGetTextExtentExW(ptr wstr long long ptr ptr ptr long) +@ stdcall NtGdiGetTextFaceW(ptr long ptr long) +@ stdcall NtGdiGetTextMetricsW(ptr ptr long) +@ stdcall NtGdiGetTransform(ptr long ptr) +@ stdcall NtGdiGetUFI(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetEmbUFI(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetUFIPathname(ptr ptr wstr ptr long ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetEmbedFonts() +@ stdcall NtGdiChangeGhostFont(ptr long) +@ stdcall NtGdiAddEmbFontToDC(ptr ptr) +@ stdcall NtGdiGetFontUnicodeRanges(ptr ptr) +@ stdcall NtGdiGetWidthTable(ptr long ptr long ptr ptr ptr) +@ stdcall NtGdiGradientFill(ptr ptr long ptr long long) +@ stdcall NtGdiHfontCreate(ptr long long long ptr) +@ stdcall NtGdiIcmBrushInfo(ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiInit() +@ stdcall NtGdiInitSpool() +@ stdcall NtGdiIntersectClipRect(ptr long long long long) +@ stdcall NtGdiInvertRgn(ptr ptr) +@ stdcall NtGdiLineTo(ptr long long) +@ stdcall NtGdiMakeFontDir(long ptr long wstr long) +@ stdcall NtGdiMakeInfoDC(ptr long) +@ stdcall NtGdiMaskBlt(ptr long long long long ptr long long ptr long long long long) +@ stdcall NtGdiModifyWorldTransform(ptr ptr long) +@ stdcall NtGdiMonoBitmap(ptr) +@ stdcall NtGdiMoveTo(ptr long long ptr) +@ stdcall NtGdiOffsetClipRgn(ptr long long) +@ stdcall NtGdiOffsetRgn(ptr long long) +@ stdcall NtGdiOpenDCW(ptr ptr ptr long long ptr ptr ptr) +@ stdcall NtGdiPatBlt(ptr long long long long long) +@ stdcall NtGdiPolyPatBlt(ptr long ptr long long) +@ stdcall NtGdiPathToRegion(ptr) +@ stdcall NtGdiPlgBlt(ptr ptr ptr long long long long ptr long long long) +@ stdcall NtGdiPolyDraw(ptr ptr ptr long) +@ stdcall NtGdiPolyPolyDraw(ptr ptr ptr long long) +@ stdcall NtGdiPolyTextOutW(ptr ptr long long) +@ stdcall NtGdiPtInRegion(ptr long long) +@ stdcall NtGdiPtVisible(ptr long long) +@ stdcall NtGdiQueryFonts(ptr long ptr) +@ stdcall NtGdiQueryFontAssocInfo(ptr) +@ stdcall NtGdiRectangle(ptr long long long long) +@ stdcall NtGdiRectInRegion(ptr ptr) +@ stdcall NtGdiRectVisible(ptr ptr) +@ stdcall NtGdiRemoveFontResourceW(ptr long long long long ptr) +@ stdcall NtGdiRemoveFontMemResourceEx(ptr) +@ stdcall NtGdiResetDC(ptr ptr ptr ptr ptr) +@ stdcall NtGdiResizePalette(ptr long) +@ stdcall NtGdiRestoreDC(ptr long) +@ stdcall NtGdiRoundRect(ptr long long long long long long) +@ stdcall NtGdiSaveDC(ptr) +@ stdcall NtGdiScaleViewportExtEx(ptr long long long long ptr) +@ stdcall NtGdiScaleWindowExtEx(ptr long long long long ptr) +@ stdcall NtGdiSelectBitmap(ptr ptr) +@ stdcall NtGdiSelectBrush(ptr ptr) +@ stdcall NtGdiSelectClipPath(ptr long) +@ stdcall NtGdiSelectFont(ptr ptr) +@ stdcall NtGdiSelectPen(ptr ptr) +@ stdcall NtGdiSetBitmapAttributes(ptr long) +@ stdcall NtGdiSetBitmapBits(ptr long ptr) +@ stdcall NtGdiSetBitmapDimension(ptr long long ptr) +@ stdcall NtGdiSetBoundsRect(ptr ptr long) +@ stdcall NtGdiSetBrushAttributes(ptr long) +@ stdcall NtGdiSetBrushOrg(ptr long long ptr) +@ stdcall NtGdiSetColorAdjustment(ptr ptr) +@ stdcall NtGdiSetColorSpace(ptr ptr) +@ stdcall NtGdiSetDeviceGammaRamp(ptr ptr) +@ stdcall NtGdiSetDIBitsToDeviceInternal(ptr long long long long long long long long ptr ptr long long long long ptr) +@ stdcall NtGdiSetFontEnumeration(long) +@ stdcall NtGdiSetFontXform(ptr long long) +@ stdcall NtGdiSetIcmMode(ptr long long) +@ stdcall NtGdiSetLinkedUFIs(ptr ptr long) +@ stdcall NtGdiSetMagicColors(ptr long long) +@ stdcall NtGdiSetMetaRgn(ptr) +@ stdcall NtGdiSetMiterLimit(ptr long ptr) +@ stdcall NtGdiGetDeviceWidth(ptr) +@ stdcall NtGdiMirrorWindowOrg(ptr) +@ stdcall NtGdiSetLayout(ptr long long) +@ stdcall NtGdiSetOPMSigningKeyAndSequenceNumbers(ptr ptr) +@ stdcall NtGdiSetPixel(ptr long long long) +@ stdcall NtGdiSetPixelFormat(ptr long) +@ stdcall NtGdiSetRectRgn(ptr long long long long) +@ stdcall NtGdiSetSystemPaletteUse(ptr long) +@ stdcall NtGdiSetTextJustification(ptr long long) +@ stdcall NtGdiSetupPublicCFONT(ptr ptr long) +@ stdcall NtGdiSetVirtualResolution(ptr long long long long) +@ stdcall NtGdiSetSizeDevice(ptr long long) +@ stdcall NtGdiStartDoc(ptr ptr ptr long) +@ stdcall NtGdiStartPage(ptr) +@ stdcall NtGdiStretchBlt(ptr long long long long ptr long long long long long long) +@ stdcall NtGdiStretchDIBitsInternal(ptr long long long long long long long long ptr ptr long long long long ptr) +@ stdcall NtGdiStrokeAndFillPath(ptr) +@ stdcall NtGdiStrokePath(ptr) +@ stdcall NtGdiSwapBuffers(ptr) +@ stdcall NtGdiTransformPoints(ptr ptr ptr long long) +@ stdcall NtGdiTransparentBlt(ptr long long long long ptr long long long long long) +@ stdcall NtGdiUnloadPrinterDriver(wstr long) +@ stdcall NtGdiUnmapMemFont(ptr) +@ stdcall NtGdiUnrealizeObject(ptr) +@ stdcall NtGdiUpdateColors(ptr) +@ stdcall NtGdiWidenPath(ptr) +@ stdcall NtUserActivateKeyboardLayout(ptr long) +@ stdcall NtUserAddClipboardFormatListener(ptr) +@ stdcall NtUserAlterWindowStyle(long long long) +@ stdcall NtUserAssociateInputContext(long long long) +@ stdcall NtUserAttachThreadInput(long long long) +@ stdcall NtUserBeginPaint(ptr ptr) +@ stdcall NtUserBitBltSysBmp(ptr long long long long long long long) +@ stdcall NtUserBlockInput(long) +@ stdcall NtUserBuildHimcList(long long long long) +@ stdcall NtUserBuildHwndList(ptr ptr long long long ptr ptr) +@ stdcall NtUserBuildNameList(ptr long ptr ptr) +@ stdcall NtUserBuildPropList(ptr ptr long ptr) +@ stdcall NtUserCallHwnd(ptr long) +@ stdcall NtUserCallHwndLock(ptr long) +@ stdcall NtUserCallHwndOpt(ptr long) +@ stdcall NtUserCallHwndParam(ptr long long) +@ stdcall NtUserCallHwndParamLock(ptr long long) +@ stdcall NtUserCallMsgFilter(ptr long) +@ stdcall NtUserCallNextHookEx(long ptr ptr long) +@ stdcall NtUserCallNoParam(long) +@ stdcall NtUserCallOneParam(ptr long) +@ stdcall NtUserCallTwoParam(ptr ptr long) +@ stdcall NtUserChangeClipboardChain(ptr ptr) +@ stdcall NtUserChangeDisplaySettings(ptr ptr ptr long) +@ stdcall NtUserCheckAccessForIntegrityLevel(long long ptr) +@ stdcall NtUserCheckDesktopByThreadId(long) +@ stdcall NtUserCheckWindowThreadDesktop(ptr long long) +@ stdcall NtUserCheckImeHotKey(long long) +@ stdcall NtUserCheckMenuItem(ptr long long) +@ stdcall NtUserChildWindowFromPointEx(ptr long long long) +@ stdcall NtUserClipCursor(ptr) +@ stdcall NtUserCloseClipboard() +@ stdcall NtUserCloseDesktop(ptr) +@ stdcall NtUserCloseWindowStation(ptr) +@ stdcall NtUserConsoleControl(long long long) +@ stdcall NtUserConvertMemHandle(ptr long) +@ stdcall NtUserCopyAcceleratorTable(ptr ptr long) +@ stdcall NtUserCountClipboardFormats() +@ stdcall NtUserCreateAcceleratorTable(ptr ptr) +@ stdcall NtUserCreateCaret(ptr ptr long long) +@ stdcall NtUserCreateDesktopEx(ptr ptr ptr long long long) +@ stdcall NtUserCreateInputContext(long) +@ stdcall NtUserCreateLocalMemHandle(ptr ptr long ptr) +@ stdcall NtUserCreateWindowEx(long ptr ptr ptr long long long long long ptr ptr ptr ptr long ptr) +@ stdcall NtUserCreateWindowStation(ptr long long long long long long) +@ stdcall NtUserDdeInitialize(long long long long long) +@ stdcall NtUserDeferWindowPos(ptr ptr ptr long long long long long) +@ stdcall NtUserDefSetText(ptr ptr) +@ stdcall NtUserDeleteMenu(ptr long long) +@ stdcall NtUserDestroyAcceleratorTable(ptr) +@ stdcall NtUserDestroyCursor(ptr long) +@ stdcall NtUserDestroyInputContext(long) +@ stdcall NtUserDestroyMenu(ptr) +@ stdcall NtUserDestroyWindow(ptr) +@ stdcall NtUserDisableThreadIme(long) +@ stdcall NtUserDispatchMessage(ptr) +@ stdcall NtUserDoSoundConnect() +@ stdcall NtUserDoSoundDisconnect() +@ stdcall NtUserDragDetect(ptr ptr long) +@ stdcall NtUserDragObject(ptr ptr long long ptr) +@ stdcall NtUserDrawAnimatedRects(ptr long ptr ptr) +@ stdcall NtUserDrawCaption(ptr ptr ptr long) +@ stdcall NtUserDrawCaptionTemp(ptr ptr ptr ptr ptr ptr long) +@ stdcall NtUserDrawIconEx(ptr long long ptr long long long ptr long long ptr) +@ stdcall NtUserDrawMenuBarTemp(ptr ptr ptr ptr ptr) +@ stdcall NtUserEmptyClipboard() +@ stdcall NtUserEnableMenuItem(ptr long long) +@ stdcall NtUserEnableScrollBar(ptr long long) +@ stdcall NtUserEndDeferWindowPosEx(ptr long) +@ stdcall NtUserEndMenu() +@ stdcall NtUserEndPaint(ptr ptr) +@ stdcall NtUserEnumDisplayDevices(ptr long ptr long) +@ stdcall NtUserEnumDisplayMonitors(ptr ptr ptr ptr) +@ stdcall NtUserEnumDisplaySettings(ptr long ptr long) +@ stdcall NtUserEvent(long) +@ stdcall NtUserExcludeUpdateRgn(ptr ptr) +@ stdcall NtUserFillWindow(ptr ptr ptr ptr) +@ stdcall NtUserFindExistingCursorIcon(ptr ptr ptr) +@ stdcall NtUserFindWindowEx(ptr ptr ptr ptr long) +@ stdcall NtUserFlashWindowEx(ptr) +@ stdcall NtUserFrostCrashedWindow(ptr long) +@ stdcall NtUserGetAltTabInfo(ptr long ptr wstr long long) +@ stdcall NtUserGetAncestor(ptr long) +@ stdcall NtUserGetAppImeLevel(long) +@ stdcall NtUserGetAsyncKeyState(long) +@ stdcall NtUserGetAtomName(long ptr) +@ stdcall NtUserGetCaretBlinkTime() +@ stdcall NtUserGetCaretPos(ptr) +@ stdcall NtUserGetClassInfoEx(ptr ptr ptr ptr long) +@ stdcall NtUserGetClassName(ptr long ptr) +@ stdcall NtUserGetClipboardData(long ptr) +@ stdcall NtUserGetClipboardFormatName(long wstr ptr) +@ stdcall NtUserGetClipboardOwner() +@ stdcall NtUserGetClipboardSequenceNumber() +@ stdcall NtUserGetClipboardViewer() +@ stdcall NtUserGetClipCursor(ptr) +@ stdcall NtUserGetComboBoxInfo(ptr ptr) +@ stdcall NtUserGetControlBrush(ptr ptr long) +@ stdcall NtUserGetControlColor(ptr ptr ptr long) +@ stdcall NtUserGetCPD(ptr long ptr) +@ stdcall NtUserGetCursorFrameInfo(ptr long ptr ptr) +@ stdcall NtUserGetCursorInfo(ptr) +@ stdcall NtUserGetDC(ptr) +@ stdcall NtUserGetDCEx(ptr ptr long) +@ stdcall NtUserGetDoubleClickTime() +@ stdcall NtUserGetForegroundWindow() +@ stdcall NtUserGetGuiResources(ptr long) +@ stdcall NtUserGetGUIThreadInfo(long ptr) +@ stdcall NtUserGetIconInfo(ptr ptr ptr ptr ptr long) +@ stdcall NtUserGetIconSize(ptr long ptr ptr) +@ stdcall NtUserGetImeHotKey(long long long long) +@ stdcall NtUserGetImeInfoEx(long long) +@ stdcall NtUserGetInternalWindowPos(ptr ptr ptr) +@ stdcall NtUserGetKeyboardLayoutList(long ptr) +@ stdcall NtUserGetKeyboardLayoutName(str) +@ stdcall NtUserGetKeyboardState(ptr) +@ stdcall NtUserGetKeyNameText(long wstr long) +@ stdcall NtUserGetKeyState(long) +@ stdcall NtUserGetListBoxInfo(ptr) +@ stdcall NtUserGetMenuBarInfo(ptr long long ptr) +@ stdcall NtUserGetMenuIndex(ptr ptr) +@ stdcall NtUserGetMenuItemRect(ptr ptr long ptr) +@ stdcall NtUserGetMessage(ptr ptr long long) +@ stdcall NtUserGetMouseMovePointsEx(long ptr ptr long long) +@ stdcall NtUserGetObjectInformation(ptr long ptr long ptr) +@ stdcall NtUserGetOpenClipboardWindow() +@ stdcall NtUserGetPriorityClipboardFormat(ptr long) +@ stdcall NtUserGetProcessWindowStation() +@ stdcall NtUserGetRawInputBuffer(ptr ptr long) +@ stdcall NtUserGetRawInputData(ptr long ptr ptr long) +@ stdcall NtUserGetRawInputDeviceInfo(ptr long ptr ptr) +@ stdcall NtUserGetRawInputDeviceList(ptr ptr long) +@ stdcall NtUserGetRegisteredRawInputDevices(ptr ptr long) +@ stdcall NtUserGetScrollBarInfo(ptr long ptr) +@ stdcall NtUserGetSystemMenu(ptr long) +@ stdcall NtUserGetThreadDesktop(long long) +@ stdcall NtUserGetThreadState(ptr) +@ stdcall NtUserGetTitleBarInfo(ptr ptr) +@ stdcall NtUserGetUpdatedClipboardFormats(ptr long ptr) +@ stdcall NtUserGetUpdateRect(ptr ptr long) +@ stdcall NtUserGetUpdateRgn(ptr ptr long) +@ stdcall NtUserGetWindowDC(ptr) +@ stdcall NtUserGetWindowPlacement(ptr ptr) +@ stdcall NtUserGetWOWClass(ptr ptr) +@ stdcall NtUserGhostWindowFromHungWindow(ptr) +@ stdcall NtUserHardErrorControl(long long long) +@ stdcall NtUserHideCaret(ptr) +@ stdcall NtUserHiliteMenuItem(ptr ptr long long) +@ stdcall NtUserHungWindowFromGhostWindow(ptr) +@ stdcall NtUserImpersonateDdeClientWindow(ptr ptr) +@ stdcall NtUserInitialize(long ptr) +@ stdcall NtUserInitializeClientPfnArrays(ptr ptr ptr ptr) +@ stdcall NtUserInitTask(long long long long long long long long long long long long) +@ stdcall NtUserInternalGetWindowText(ptr wstr ptr) +@ stdcall NtUserInternalGetWindowIcon(ptr long) +@ stdcall NtUserInvalidateRect(ptr ptr long) +@ stdcall NtUserInvalidateRgn(ptr ptr long) +@ stdcall NtUserIsClipboardFormatAvailable(long) +@ stdcall NtUserKillTimer(ptr ptr) +@ stdcall NtUserLoadKeyboardLayoutEx(ptr long ptr ptr ptr long long) +@ stdcall NtUserLockWindowStation(ptr) +@ stdcall NtUserLockWindowUpdate(ptr) +@ stdcall NtUserLockWorkStation() +@ stdcall NtUserLogicalToPhysicalPoint(ptr ptr) +@ stdcall NtUserMapVirtualKeyEx(long long long ptr) +@ stdcall NtUserMenuItemFromPoint(ptr ptr long long) +@ stdcall NtUserMessageCall(ptr long ptr ptr ptr long long) +@ stdcall NtUserMinMaximize(ptr long long) +@ stdcall NtUserMNDragLeave() +@ stdcall NtUserMNDragOver(long long) +@ stdcall NtUserModifyUserStartupInfoFlags(long long) +@ stdcall NtUserMoveWindow(ptr long long long long long) +@ stdcall NtUserNotifyIMEStatus(long long long) +@ stdcall NtUserNotifyProcessCreate(long long long long) +@ stdcall NtUserNotifyWinEvent(long long long long) +@ stdcall NtUserOpenClipboard(ptr long) +@ stdcall NtUserOpenDesktop(ptr long long) +@ stdcall NtUserOpenInputDesktop(long long long) +@ stdcall NtUserOpenThreadDesktop(ptr ptr ptr ptr ptr) +@ stdcall NtUserOpenWindowStation(ptr long) +@ stdcall NtUserPaintDesktop(ptr) +@ stdcall NtUserPaintMonitor(long long long) +@ stdcall NtUserPeekMessage(ptr ptr long long long) +@ stdcall NtUserPhysicalToLogicalPoint(ptr ptr) +@ stdcall NtUserPostMessage(ptr long long long) +@ stdcall NtUserPostThreadMessage(long long long long) +@ stdcall NtUserPrintWindow(ptr ptr long) +@ stdcall NtUserProcessConnect(ptr ptr) +@ stdcall NtUserQueryInformationThread(long long long long) +@ stdcall NtUserQueryInputContext(long long) +@ stdcall NtUserQuerySendMessage(long) +@ stdcall NtUserQueryWindow(ptr long) +@ stdcall NtUserRealChildWindowFromPoint(ptr long long) +@ stdcall NtUserRealInternalGetMessage(ptr ptr long long long long) +@ stdcall NtUserRealWaitMessageEx(long long) +@ stdcall NtUserRedrawWindow(ptr ptr ptr long) +@ stdcall NtUserRegisterClassExWOW(ptr ptr ptr ptr long long ptr) +@ stdcall NtUserRegisterErrorReportingDialog(long long) +@ stdcall NtUserRegisterUserApiHook(ptr ptr long long) +@ stdcall NtUserRegisterHotKey(ptr long long long) +@ stdcall NtUserRegisterRawInputDevices(ptr long long) +@ stdcall NtUserRegisterTasklist(long) +@ stdcall NtUserRegisterWindowMessage(ptr) +@ stdcall NtUserRemoveClipboardFormatListener(ptr) +@ stdcall NtUserRemoveMenu(ptr long long) +@ stdcall NtUserRemoveProp(ptr long) +@ stdcall NtUserResolveDesktop(long long long long) +@ stdcall NtUserResolveDesktopForWOW(long) +@ stdcall NtUserSBGetParms(ptr long ptr ptr) +@ stdcall NtUserScrollDC(ptr long long ptr ptr ptr ptr) +@ stdcall NtUserScrollWindowEx(ptr long long ptr ptr ptr ptr long) +@ stdcall NtUserSelectPalette(ptr ptr long) +@ stdcall NtUserSendInput(long ptr long) +@ stdcall NtUserSetActiveWindow(ptr) +@ stdcall NtUserSetAppImeLevel(long long) +@ stdcall NtUserSetCapture(ptr) +@ stdcall NtUserSetClassLong(ptr long ptr long) +@ stdcall NtUserSetClassWord(ptr long long) +@ stdcall NtUserSetClipboardData(long ptr ptr) +@ stdcall NtUserSetClipboardViewer(ptr) +@ stdcall NtUserSetConsoleReserveKeys(long long) +@ stdcall NtUserSetCursor(ptr) +@ stdcall NtUserSetCursorContents(ptr ptr) +@ stdcall NtUserSetCursorIconData(ptr ptr ptr ptr) +@ stdcall NtUserSetFocus(ptr) +@ stdcall NtUserSetImeHotKey(long long long long long) +@ stdcall NtUserSetImeInfoEx(long) +@ stdcall NtUserSetImeOwnerWindow(long long) +@ stdcall NtUserSetInformationProcess(long long long long) +@ stdcall NtUserSetInformationThread(ptr long ptr long) +@ stdcall NtUserSetInternalWindowPos(ptr long ptr ptr) +@ stdcall NtUserSetKeyboardState(ptr) +@ stdcall NtUserSetMenu(ptr ptr long) +@ stdcall NtUserSetMenuContextHelpId(ptr long) +@ stdcall NtUserSetMenuDefaultItem(ptr long long) +@ stdcall NtUserSetMenuFlagRtoL(ptr) +@ stdcall NtUserSetObjectInformation(ptr long ptr long) +@ stdcall NtUserSetParent(ptr ptr) +@ stdcall NtUserSetProcessWindowStation(ptr) +@ stdcall NtUserGetProp(ptr long) +@ stdcall NtUserSetProp(ptr long ptr) +@ stdcall NtUserSetScrollInfo(ptr long ptr long) +@ stdcall NtUserSetShellWindowEx(ptr ptr) +@ stdcall NtUserSetSysColors(long ptr ptr long) +@ stdcall NtUserSetSystemCursor(ptr long) +@ stdcall NtUserSetSystemMenu(ptr ptr) +@ stdcall NtUserSetSystemTimer(ptr ptr ptr) +@ stdcall NtUserSetThreadDesktop(ptr) +@ stdcall NtUserSetThreadLayoutHandles(long long) +@ stdcall NtUserSetThreadState(long long) +@ stdcall NtUserSetTimer(ptr ptr long ptr) +@ stdcall NtUserSetProcessDPIAware() +@ stdcall NtUserSetWindowFNID(ptr long) +@ stdcall NtUserSetWindowLong(ptr long long long) +@ stdcall NtUserSetWindowPlacement(ptr ptr) +@ stdcall NtUserSetWindowPos(ptr ptr long long long long long) +@ stdcall NtUserSetWindowRgn(ptr ptr long) +@ stdcall NtUserGetWindowRgnEx(ptr ptr long) +@ stdcall NtUserSetWindowRgnEx(ptr ptr long) +@ stdcall NtUserSetWindowsHookAW(long ptr long) +@ stdcall NtUserSetWindowsHookEx(ptr ptr long long ptr long) +@ stdcall NtUserSetWindowStationUser(long long long long) +@ stdcall NtUserSetWindowWord(ptr long long) +@ stdcall NtUserSetWinEventHook(long long ptr ptr ptr long long long) +@ stdcall NtUserShowCaret(ptr) +@ stdcall NtUserShowScrollBar(ptr long long) +@ stdcall NtUserShowWindow(ptr long) +@ stdcall NtUserShowWindowAsync(ptr long) +@ stdcall NtUserSoundSentry() +@ stdcall NtUserSwitchDesktop(ptr long) +@ stdcall NtUserSystemParametersInfo(long long ptr long) +@ stdcall NtUserTestForInteractiveUser(long) +@ stdcall NtUserThunkedMenuInfo(ptr ptr) +@ stdcall NtUserThunkedMenuItemInfo(ptr long long long ptr ptr) +@ stdcall NtUserToUnicodeEx(long long ptr wstr long long ptr) +@ stdcall NtUserTrackMouseEvent(ptr) +@ stdcall NtUserTrackPopupMenuEx(ptr long long long ptr ptr) +@ stdcall NtUserCalcMenuBar(long long long long long) +@ stdcall NtUserPaintMenuBar(long long long long long long) +@ stdcall NtUserTranslateAccelerator(ptr ptr ptr) +@ stdcall NtUserTranslateMessage(ptr long) +@ stdcall NtUserUnhookWindowsHookEx(ptr) +@ stdcall NtUserUnhookWinEvent(ptr) +@ stdcall NtUserUnloadKeyboardLayout(ptr) +@ stdcall NtUserUnlockWindowStation(ptr) +@ stdcall NtUserUnregisterClass(ptr ptr ptr) +@ stdcall NtUserUnregisterUserApiHook() +@ stdcall NtUserUnregisterHotKey(ptr long) +@ stdcall NtUserUpdateInputContext(long long long) +@ stdcall NtUserUpdateInstance(long long long) +@ stdcall NtUserUpdateLayeredWindow(ptr ptr ptr ptr ptr ptr long ptr long ptr) +@ stdcall NtUserGetLayeredWindowAttributes(ptr ptr ptr ptr) +@ stdcall NtUserSetLayeredWindowAttributes(ptr long long long) +@ stdcall NtUserUpdatePerUserSystemParameters(long) +@ stdcall NtUserUserHandleGrantAccess(ptr ptr long) +@ stdcall NtUserValidateHandleSecure(ptr) +@ stdcall NtUserValidateRect(ptr ptr) +@ stdcall NtUserValidateTimerCallback(ptr) +@ stdcall NtUserVkKeyScanEx(long ptr long) +@ stdcall NtUserWaitForInputIdle(ptr long long) +@ stdcall NtUserWaitForMsgAndEvent(long) +@ stdcall NtUserWaitMessage() +@ stdcall NtUserWin32PoolAllocationStats(long long long long long long) +@ stdcall NtUserWindowFromPhysicalPoint(long long) +@ stdcall NtUserWindowFromPoint(long long) +@ stdcall NtUserYieldTask() +@ stdcall NtUserRemoteConnect(long long long) +@ stdcall NtUserRemoteRedrawRectangle(long long long long) +@ stdcall NtUserRemoteRedrawScreen() +@ stdcall NtUserRemoteStopScreenUpdates() +@ stdcall NtUserCtxDisplayIOCtl(long long long) +@ stdcall NtUserRegisterSessionPort(long) +@ stdcall NtUserUnregisterSessionPort() +@ stdcall NtUserUpdateWindowTransform(ptr ptr long) +@ stdcall NtUserDwmStartRedirection(long) +@ stdcall NtUserDwmStopRedirection() +@ stdcall NtUserDwmHintDxUpdate(long long) +@ stdcall NtUserDwmGetDxRgn(long long long) +@ stdcall NtUserGetWindowMinimizeRect(long long) +@ stdcall NtGdiEngAssociateSurface(ptr ptr long) +@ stdcall NtGdiEngCreateBitmap(long long long long long ptr) +@ stdcall NtGdiEngCreateDeviceSurface(ptr long long long) +@ stdcall NtGdiEngCreateDeviceBitmap(ptr long long long) +@ stdcall NtGdiEngCreatePalette(long long ptr long long long) +@ stdcall NtGdiEngComputeGlyphSet(ptr ptr ptr) +@ stdcall NtGdiEngCopyBits(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngDeletePalette(ptr) +@ stdcall NtGdiEngDeleteSurface(ptr) +@ stdcall NtGdiEngEraseSurface(ptr ptr long) +@ stdcall NtGdiEngUnlockSurface(ptr) +@ stdcall NtGdiEngLockSurface(ptr) +@ stdcall NtGdiEngBitBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStretchBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiEngPlgBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiEngMarkBandingSurface(ptr) +@ stdcall NtGdiEngStrokePath(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngFillPath(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStrokeAndFillPath(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngPaint(ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngLineTo(ptr ptr ptr long long long long ptr ptr) +@ stdcall NtGdiEngAlphaBlend(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngGradientFill(ptr ptr ptr ptr long ptr long ptr ptr long) +@ stdcall NtGdiEngTransparentBlt(ptr ptr ptr ptr ptr ptr long long) +@ stdcall NtGdiEngTextOut(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStretchBltROP(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long ptr long) +@ stdcall NtGdiXLATEOBJ_cGetPalette(ptr long long ptr) +@ stdcall NtGdiXLATEOBJ_iXlate(ptr long) +@ stdcall NtGdiXLATEOBJ_hGetColorTransform(ptr) +@ stdcall NtGdiCLIPOBJ_bEnum(ptr long long) +@ stdcall NtGdiCLIPOBJ_cEnumStart(ptr long long long long) +@ stdcall NtGdiCLIPOBJ_ppoGetPath(ptr) +@ stdcall NtGdiEngDeletePath(ptr) +@ stdcall NtGdiEngCreateClip() +@ stdcall NtGdiEngDeleteClip(ptr) +@ stdcall NtGdiBRUSHOBJ_ulGetBrushColor(ptr) +@ stdcall NtGdiBRUSHOBJ_pvAllocRbrush(ptr long) +@ stdcall NtGdiBRUSHOBJ_pvGetRbrush(ptr) +@ stdcall NtGdiBRUSHOBJ_hGetColorTransform(ptr) +@ stdcall NtGdiXFORMOBJ_bApplyXform(ptr ptr long long ptr) +@ stdcall NtGdiXFORMOBJ_iGetXform(ptr ptr) +@ stdcall NtGdiFONTOBJ_vGetInfo(ptr long ptr) +@ stdcall NtGdiFONTOBJ_pxoGetXform(ptr) +@ stdcall NtGdiFONTOBJ_cGetGlyphs(ptr long long ptr ptr) +@ stdcall NtGdiFONTOBJ_pifi(ptr) +@ stdcall NtGdiFONTOBJ_pfdg(ptr) +@ stdcall NtGdiFONTOBJ_pQueryGlyphAttrs(ptr long) +@ stdcall NtGdiFONTOBJ_pvTrueTypeFontFile(ptr ptr) +@ stdcall NtGdiFONTOBJ_cGetAllGlyphHandles(ptr ptr) +@ stdcall NtGdiSTROBJ_bEnum(ptr ptr ptr) +@ stdcall NtGdiSTROBJ_bEnumPositionsOnly(ptr ptr ptr) +@ stdcall NtGdiSTROBJ_bGetAdvanceWidths(ptr long long ptr) +@ stdcall NtGdiSTROBJ_vEnumStart(ptr) +@ stdcall NtGdiSTROBJ_dwGetCodePage(ptr) +@ stdcall NtGdiPATHOBJ_vGetBounds(ptr ptr) +@ stdcall NtGdiPATHOBJ_bEnum(ptr ptr) +@ stdcall NtGdiPATHOBJ_vEnumStart(ptr) +@ stdcall NtGdiPATHOBJ_vEnumStartClipLines(ptr ptr ptr ptr) +@ stdcall NtGdiPATHOBJ_bEnumClipLines(ptr long ptr) +@ stdcall NtGdiGetDhpdev(ptr) +@ stdcall NtGdiEngCheckAbort(ptr) +@ stdcall NtGdiHT_Get8BPPFormatPalette(ptr long long long) +@ stdcall NtGdiHT_Get8BPPMaskPalette(ptr long long long long long) +@ stdcall NtGdiUpdateTransform(ptr) +@ stdcall NtGdiSetPUMPDOBJ(ptr long ptr ptr) +@ stdcall NtGdiBRUSHOBJ_DeleteRbrush(ptr ptr) +@ stdcall NtGdiUMPDEngFreeUserMem(ptr) +@ stdcall NtGdiDrawStream(ptr long ptr) +@ stdcall NtGdiDwmGetDirtyRgn(long long long long long) +@ stdcall NtGdiDwmGetSurfaceData(long long) +@ stdcall NtGdiDdDDICreateAllocation(ptr) +@ stdcall NtGdiDdDDIQueryResourceInfo(ptr) +@ stdcall NtGdiDdDDIOpenResource(ptr) +@ stdcall NtGdiDdDDIDestroyAllocation(ptr) +@ stdcall NtGdiDdDDISetAllocationPriority(ptr) +@ stdcall NtGdiDdDDIQueryAllocationResidency(ptr) +@ stdcall NtGdiDdDDICreateDevice(ptr) +@ stdcall NtGdiDdDDIDestroyDevice(ptr) +@ stdcall NtGdiDdDDICreateContext(ptr) +@ stdcall NtGdiDdDDIDestroyContext(ptr) +@ stdcall NtGdiDdDDICreateSynchronizationObject(ptr) +@ stdcall NtGdiDdDDIDestroySynchronizationObject(ptr) +@ stdcall NtGdiDdDDIWaitForSynchronizationObject(ptr) +@ stdcall NtGdiDdDDISignalSynchronizationObject(ptr) +@ stdcall NtGdiDdDDIGetRuntimeData(ptr) +@ stdcall NtGdiDdDDIQueryAdapterInfo(ptr) +@ stdcall NtGdiDdDDILock(ptr) +@ stdcall NtGdiDdDDIUnlock(ptr) +@ stdcall NtGdiDdDDIGetDisplayModeList(ptr) +@ stdcall NtGdiDdDDISetDisplayMode(ptr) +@ stdcall NtGdiDdDDIGetMultisampleMethodList(ptr) +@ stdcall NtGdiDdDDIPresent(ptr) +@ stdcall NtGdiDdDDIRender(ptr) +@ stdcall NtGdiDdDDIOpenAdapterFromDeviceName(ptr) +@ stdcall NtGdiDdDDIOpenAdapterFromHdc(ptr) +@ stdcall NtGdiDdDDICloseAdapter(ptr) +@ stdcall NtGdiDdDDIGetSharedPrimaryHandle(ptr) +@ stdcall NtGdiDdDDIEscape(ptr) +@ stdcall NtGdiDdDDIQueryStatistics(ptr) +@ stdcall NtGdiDdDDISetVidPnSourceOwner(ptr) +@ stdcall NtGdiDdDDIGetPresentHistory(ptr) +@ stdcall NtGdiDdDDICreateOverlay(ptr) +@ stdcall NtGdiDdDDIUpdateOverlay(ptr) +@ stdcall NtGdiDdDDIFlipOverlay(ptr) +@ stdcall NtGdiDdDDIDestroyOverlay(ptr) +@ stdcall NtGdiDdDDIWaitForVerticalBlankEvent(ptr) +@ stdcall NtGdiDdDDISetGammaRamp(ptr) +@ stdcall NtGdiDdDDIGetDeviceState(ptr) +@ stdcall NtGdiDdDDICreateDCFromMemory(ptr) +@ stdcall NtGdiDdDDIDestroyDCFromMemory(ptr) +@ stdcall NtGdiDdDDISetContextSchedulingPriority(ptr) +@ stdcall NtGdiDdDDIGetContextSchedulingPriority(ptr) +@ stdcall NtGdiDdDDISetProcessSchedulingPriorityClass(ptr long) +@ stdcall NtGdiDdDDIGetProcessSchedulingPriorityClass(ptr ptr) +@ stdcall NtGdiDdDDIReleaseProcessVidPnSourceOwners(ptr) +@ stdcall NtGdiDdDDIGetScanLine(ptr) +@ stdcall NtGdiDdDDISetQueuedLimit(ptr) +@ stdcall NtGdiDdDDIPollDisplayChildren(ptr) +@ stdcall NtGdiDdDDIInvalidateActiveVidPn(ptr) +@ stdcall NtGdiDdDDICheckOcclusion(ptr) +@ stdcall NtGdiDdDDIWaitForIdle(ptr) +@ stdcall NtGdiDdDDICheckMonitorPowerState(ptr) +@ stdcall NtGdiDdDDICheckExclusiveOwnership() +@ stdcall NtGdiDdDDISetDisplayPrivateDriverFormat(ptr) +@ stdcall NtGdiDdDDISharedPrimaryLockNotification(ptr) +@ stdcall NtGdiDdDDISharedPrimaryUnLockNotification(ptr) +@ stdcall NtGdiMakeObjectXferable(ptr long) +@ stdcall NtGdiMakeObjectUnXferable(ptr) +@ stdcall NtGdiGetNumberOfPhysicalMonitors(ptr ptr) +@ stdcall NtGdiGetPhysicalMonitors(ptr long ptr ptr) +@ stdcall NtGdiGetPhysicalMonitorDescription(ptr long ptr) +@ stdcall NtGdiDestroyPhysicalMonitor(ptr) +@ stdcall NtGdiDDCCIGetVCPFeature(ptr long ptr ptr ptr) +@ stdcall NtGdiDDCCISetVCPFeature(ptr long long) +@ stdcall NtGdiDDCCISaveCurrentSettings(ptr) +@ stdcall NtGdiDDCCIGetCapabilitiesStringLength(ptr ptr) +@ stdcall NtGdiDDCCIGetCapabilitiesString(ptr ptr long) +@ stdcall NtGdiDDCCIGetTimingReport(ptr ptr) +@ stdcall NtUserSetMirrorRendering(long long) +@ stdcall NtUserShowSystemCursor(long) diff --git a/rostests/apitests/w32kdll/w32kdll_xpsp2/CMakeLists.txt b/rostests/apitests/w32kdll/w32kdll_xpsp2/CMakeLists.txt index e3579261dd4..48d219ab43c 100644 --- a/rostests/apitests/w32kdll/w32kdll_xpsp2/CMakeLists.txt +++ b/rostests/apitests/w32kdll/w32kdll_xpsp2/CMakeLists.txt @@ -1,6 +1,10 @@ +spec2def(w32kdll_xpsp2.dll w32kdll_xpsp2.spec) -add_library(w32kdll_xpsp2 SHARED main.c w32kdll_xpsp2.S) +add_library(w32kdll_xpsp2 SHARED + main.c + w32kdll_xpsp2.S + ${CMAKE_CURRENT_BINARY_DIR}/w32kdll_xpsp2.def) set_entrypoint(w32kdll_xpsp2 0) -target_link_libraries(w32kdll_xpsp2 ${CMAKE_CURRENT_SOURCE_DIR}/w32kdll_xpsp2.def) + add_dependencies(w32kdll_xpsp2 psdk ) -add_importlib_target(w32kdll_xpsp2.def) +add_importlib_target(w32kdll_xpsp2.spec) diff --git a/rostests/apitests/w32kdll/w32kdll_xpsp2/w32kdll_xpsp2.spec b/rostests/apitests/w32kdll/w32kdll_xpsp2/w32kdll_xpsp2.spec new file mode 100644 index 00000000000..b33c7d93df0 --- /dev/null +++ b/rostests/apitests/w32kdll/w32kdll_xpsp2/w32kdll_xpsp2.spec @@ -0,0 +1,674 @@ +; +; ReactOS Operating System +; +; This file contains all win32k native api functions from win XP sp2 +; + +@ stdcall NtGdiAbortDoc(ptr) +@ stdcall NtGdiAbortPath(ptr) +@ stdcall NtGdiAddFontResourceW(wstr long long long long ptr) +@ stdcall NtGdiAddRemoteFontToDC(ptr ptr long ptr) +@ stdcall NtGdiAddFontMemResourceEx(ptr long ptr long ptr) +@ stdcall NtGdiRemoveMergeFont(ptr ptr) +@ stdcall NtGdiAddRemoteMMInstanceToDC(ptr ptr long) +@ stdcall NtGdiAlphaBlend(ptr long long long long ptr long long long long long ptr) +@ stdcall NtGdiAngleArc(ptr long long long long long) +@ stdcall NtGdiAnyLinkedFonts() +@ stdcall NtGdiFontIsLinked(ptr) +@ stdcall NtGdiArcInternal(long ptr long long long long long long long long) +@ stdcall NtGdiBeginPath(ptr) +@ stdcall NtGdiBitBlt(ptr long long long long ptr long long long long long) +@ stdcall NtGdiCancelDC(ptr) +@ stdcall NtGdiCheckBitmapBits(ptr ptr ptr long long long long ptr) +@ stdcall NtGdiCloseFigure(ptr) +@ stdcall NtGdiClearBitmapAttributes(ptr long) +@ stdcall NtGdiClearBrushAttributes(ptr long) +@ stdcall NtGdiColorCorrectPalette(ptr ptr long long ptr long) +@ stdcall NtGdiCombineRgn(ptr ptr ptr long) +@ stdcall NtGdiCombineTransform(ptr ptr ptr) +@ stdcall NtGdiComputeXformCoefficients(ptr) +@ stdcall NtGdiConsoleTextOut(ptr ptr long ptr) +@ stdcall NtGdiConvertMetafileRect(ptr ptr) +@ stdcall NtGdiCreateBitmap(long long long long ptr) +@ stdcall NtGdiCreateClientObj(long) +@ stdcall NtGdiCreateColorSpace(ptr) +@ stdcall NtGdiCreateColorTransform(ptr ptr ptr long ptr long ptr long) +@ stdcall NtGdiCreateCompatibleBitmap(ptr long long) +@ stdcall NtGdiCreateCompatibleDC(ptr) +@ stdcall NtGdiCreateDIBBrush(ptr long long long long ptr) +@ stdcall NtGdiCreateDIBitmapInternal(ptr long long long ptr ptr long long long long ptr) +@ stdcall NtGdiCreateDIBSection(ptr ptr long ptr long long long ptr ptr) +@ stdcall NtGdiCreateEllipticRgn(long long long long) +@ stdcall NtGdiCreateHalftonePalette(ptr) +@ stdcall NtGdiCreateHatchBrushInternal(long long long) +@ stdcall NtGdiCreateMetafileDC(ptr) +@ stdcall NtGdiCreatePaletteInternal(ptr long) +@ stdcall NtGdiCreatePatternBrushInternal(ptr long long) +@ stdcall NtGdiCreatePen(long long long ptr) +@ stdcall NtGdiCreateRectRgn(long long long long) +@ stdcall NtGdiCreateRoundRectRgn(long long long long long long) +@ stdcall NtGdiCreateServerMetaFile(long long ptr long long long) +@ stdcall NtGdiCreateSolidBrush(long ptr) +@ stdcall NtGdiD3dContextCreate(ptr ptr ptr ptr) +@ stdcall NtGdiD3dContextDestroy(ptr) +@ stdcall NtGdiD3dContextDestroyAll(ptr) +@ stdcall NtGdiD3dValidateTextureStageState(ptr) +@ stdcall NtGdiD3dDrawPrimitives2(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdGetDriverState(ptr) +@ stdcall NtGdiDdAddAttachedSurface(ptr ptr ptr) +@ stdcall NtGdiDdAlphaBlt(ptr ptr ptr) +@ stdcall NtGdiDdAttachSurface(ptr ptr) +@ stdcall NtGdiDdBeginMoCompFrame(ptr ptr) +@ stdcall NtGdiDdBlt(ptr ptr ptr) +@ stdcall NtGdiDdCanCreateSurface(ptr ptr) +@ stdcall NtGdiDdCanCreateD3DBuffer(ptr ptr) +@ stdcall NtGdiDdColorControl(ptr ptr) +@ stdcall NtGdiDdCreateDirectDrawObject(ptr) +@ stdcall NtGdiDdCreateSurface(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdCreateD3DBuffer(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdCreateMoComp(ptr ptr) +@ stdcall NtGdiDdCreateSurfaceObject(ptr ptr ptr ptr ptr long) +@ stdcall NtGdiDdDeleteDirectDrawObject(ptr) +@ stdcall NtGdiDdDeleteSurfaceObject(ptr) +@ stdcall NtGdiDdDestroyMoComp(ptr ptr) +@ stdcall NtGdiDdDestroySurface(ptr long) +@ stdcall NtGdiDdDestroyD3DBuffer(ptr) +@ stdcall NtGdiDdEndMoCompFrame(ptr ptr) +@ stdcall NtGdiDdFlip(ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdFlipToGDISurface(ptr ptr) +@ stdcall NtGdiDdGetAvailDriverMemory(ptr ptr) +@ stdcall NtGdiDdGetBltStatus(ptr ptr) +@ stdcall NtGdiDdGetDC(ptr ptr) +@ stdcall NtGdiDdGetDriverInfo(ptr ptr) +@ stdcall NtGdiDdGetDxHandle(ptr ptr long) +@ stdcall NtGdiDdGetFlipStatus(ptr ptr) +@ stdcall NtGdiDdGetInternalMoCompInfo(ptr ptr) +@ stdcall NtGdiDdGetMoCompBuffInfo(ptr ptr) +@ stdcall NtGdiDdGetMoCompGuids(ptr ptr) +@ stdcall NtGdiDdGetMoCompFormats(ptr ptr) +@ stdcall NtGdiDdGetScanLine(ptr ptr) +@ stdcall NtGdiDdLock(ptr ptr ptr) +@ stdcall NtGdiDdLockD3D(ptr ptr) +@ stdcall NtGdiDdQueryDirectDrawObject(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDdQueryMoCompStatus(ptr ptr) +@ stdcall NtGdiDdReenableDirectDrawObject(ptr ptr) +@ stdcall NtGdiDdReleaseDC(ptr) +@ stdcall NtGdiDdRenderMoComp(ptr ptr) +@ stdcall NtGdiDdResetVisrgn(ptr ptr) +@ stdcall NtGdiDdSetColorKey(ptr ptr) +@ stdcall NtGdiDdSetExclusiveMode(ptr ptr) +@ stdcall NtGdiDdSetGammaRamp(ptr ptr ptr) +@ stdcall NtGdiDdCreateSurfaceEx(ptr ptr long) +@ stdcall NtGdiDdSetOverlayPosition(ptr ptr ptr) +@ stdcall NtGdiDdUnattachSurface(ptr ptr) +@ stdcall NtGdiDdUnlock(ptr ptr) +@ stdcall NtGdiDdUnlockD3D(ptr ptr) +@ stdcall NtGdiDdUpdateOverlay(ptr ptr ptr) +@ stdcall NtGdiDdWaitForVerticalBlank(ptr ptr) +@ stdcall NtGdiDvpCanCreateVideoPort(ptr ptr) +@ stdcall NtGdiDvpColorControl(ptr ptr) +@ stdcall NtGdiDvpCreateVideoPort(ptr ptr) +@ stdcall NtGdiDvpDestroyVideoPort(ptr ptr) +@ stdcall NtGdiDvpFlipVideoPort(ptr ptr ptr ptr) +@ stdcall NtGdiDvpGetVideoPortBandwidth(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortField(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortFlipStatus(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortInputFormats(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortLine(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortOutputFormats(ptr ptr) +@ stdcall NtGdiDvpGetVideoPortConnectInfo(ptr ptr) +@ stdcall NtGdiDvpGetVideoSignalStatus(ptr ptr) +@ stdcall NtGdiDvpUpdateVideoPort(ptr ptr ptr ptr) +@ stdcall NtGdiDvpWaitForVideoPortSync(ptr ptr) +@ stdcall NtGdiDvpAcquireNotification(ptr ptr ptr) +@ stdcall NtGdiDvpReleaseNotification(ptr ptr) +@ stdcall NtGdiDxgGenericThunk(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiDeleteClientObj(ptr) +@ stdcall NtGdiDeleteColorSpace(ptr) +@ stdcall NtGdiDeleteColorTransform(ptr ptr) +@ stdcall NtGdiDeleteObjectApp(ptr) +@ stdcall NtGdiDescribePixelFormat(ptr long long ptr) +@ stdcall NtGdiGetPerBandInfo(ptr ptr) +@ stdcall NtGdiDoBanding(ptr long ptr ptr) +@ stdcall NtGdiDoPalette(ptr long long ptr long long) +@ stdcall NtGdiDrawEscape(ptr long long ptr) +@ stdcall NtGdiEllipse(ptr long long long long) +@ stdcall NtGdiEnableEUDC(long) +@ stdcall NtGdiEndDoc(ptr) +@ stdcall NtGdiEndPage(ptr) +@ stdcall NtGdiEndPath(ptr) +@ stdcall NtGdiEnumFontChunk(ptr ptr long ptr ptr) +@ stdcall NtGdiEnumFontClose(ptr) +@ stdcall NtGdiEnumFontOpen(ptr long long long wstr long ptr) +@ stdcall NtGdiEnumObjects(ptr long long ptr) +@ stdcall NtGdiEqualRgn(ptr ptr) +@ stdcall NtGdiEudcLoadUnloadLink(wstr long wstr long long long long) +@ stdcall NtGdiExcludeClipRect(ptr long long long long) +@ stdcall NtGdiExtCreatePen(long long long long ptr ptr long ptr long long ptr) +@ stdcall NtGdiExtCreateRegion(ptr long ptr) +@ stdcall NtGdiExtEscape(ptr ptr long long long ptr long ptr) +@ stdcall NtGdiExtFloodFill(ptr long long long long) +@ stdcall NtGdiExtGetObjectW(ptr long ptr) +@ stdcall NtGdiExtSelectClipRgn(ptr ptr long) +@ stdcall NtGdiExtTextOutW(ptr long long long ptr wstr long ptr long) +@ stdcall NtGdiFillPath(ptr) +@ stdcall NtGdiFillRgn(ptr ptr ptr) +@ stdcall NtGdiFlattenPath(ptr) +@ stdcall NtGdiFlushUserBatch() +@ stdcall NtGdiFlush() +@ stdcall NtGdiForceUFIMapping(ptr ptr) +@ stdcall NtGdiFrameRgn(ptr ptr ptr long long) +@ stdcall NtGdiFullscreenControl(long ptr long ptr ptr) +@ stdcall NtGdiGetAndSetDCDword(ptr long long ptr) +@ stdcall NtGdiGetAppClipBox(ptr ptr) +@ stdcall NtGdiGetBitmapBits(ptr long ptr) +@ stdcall NtGdiGetBitmapDimension(ptr ptr) +@ stdcall NtGdiGetBoundsRect(ptr ptr long) +@ stdcall NtGdiGetCharABCWidthsW(ptr long long ptr long ptr) +@ stdcall NtGdiGetCharacterPlacementW(ptr wstr long long ptr long) +@ stdcall NtGdiGetCharSet(ptr) +@ stdcall NtGdiGetCharWidthW(ptr long long ptr long ptr) +@ stdcall NtGdiGetCharWidthInfo(ptr ptr) +@ stdcall NtGdiGetColorAdjustment(ptr ptr) +@ stdcall NtGdiGetColorSpaceforBitmap(ptr) +@ stdcall NtGdiGetDCDword(ptr long ptr) +@ stdcall NtGdiGetDCforBitmap(ptr) +@ stdcall NtGdiGetDCObject(ptr long) +@ stdcall NtGdiGetDCPoint(ptr long ptr) +@ stdcall NtGdiGetDeviceCaps(ptr long) +@ stdcall NtGdiGetDeviceGammaRamp(ptr ptr) +@ stdcall NtGdiGetDeviceCapsAll(ptr ptr) +@ stdcall NtGdiGetDIBitsInternal(ptr ptr long long ptr ptr long long long) +@ stdcall NtGdiGetETM(ptr ptr) +@ stdcall NtGdiGetEudcTimeStampEx(wstr long long) +@ stdcall NtGdiGetFontData(ptr long long ptr long) +@ stdcall NtGdiGetFontResourceInfoInternalW(wstr long long long ptr ptr long) +@ stdcall NtGdiGetGlyphIndicesW(ptr wstr long ptr long) +@ stdcall NtGdiGetGlyphIndicesWInternal(ptr wstr long ptr long long) +@ stdcall NtGdiGetGlyphOutline(ptr long long ptr long ptr ptr long) +@ stdcall NtGdiGetKerningPairs(ptr long ptr) +@ stdcall NtGdiGetLinkedUFIs(ptr ptr long) +@ stdcall NtGdiGetMiterLimit(ptr ptr) +@ stdcall NtGdiGetMonitorID(ptr long ptr) +@ stdcall NtGdiGetNearestColor(ptr ptr) +@ stdcall NtGdiGetNearestPaletteIndex(ptr ptr) +@ stdcall NtGdiGetObjectBitmapHandle(ptr ptr) +@ stdcall NtGdiGetOutlineTextMetricsInternalW(ptr long ptr ptr) +@ stdcall NtGdiGetPath(ptr ptr ptr long) +@ stdcall NtGdiGetPixel(ptr long long) +@ stdcall NtGdiGetRandomRgn(ptr ptr long) +@ stdcall NtGdiGetRasterizerCaps(ptr long) +@ stdcall NtGdiGetRealizationInfo(ptr ptr ptr) +@ stdcall NtGdiGetRegionData(ptr long ptr) +@ stdcall NtGdiGetRgnBox(ptr ptr) +@ stdcall NtGdiGetServerMetaFileBits(ptr long ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetSpoolMessage(long long long long) +@ stdcall NtGdiGetStats(ptr long long ptr long) +@ stdcall NtGdiGetStockObject(ptr) +@ stdcall NtGdiGetStringBitmapW(ptr wstr long ptr long) +@ stdcall NtGdiGetSystemPaletteUse(ptr) +@ stdcall NtGdiGetTextCharsetInfo(ptr ptr long) +@ stdcall NtGdiGetTextExtent(ptr wstr long ptr long) +@ stdcall NtGdiGetTextExtentExW(ptr wstr long long ptr ptr ptr long) +@ stdcall NtGdiGetTextFaceW(ptr long ptr long) +@ stdcall NtGdiGetTextMetricsW(ptr ptr long) +@ stdcall NtGdiGetTransform(ptr long ptr) +@ stdcall NtGdiGetUFI(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetEmbUFI(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetUFIPathname(ptr ptr wstr ptr long ptr ptr ptr ptr ptr) +@ stdcall NtGdiGetEmbedFonts() +@ stdcall NtGdiChangeGhostFont(ptr long) +@ stdcall NtGdiAddEmbFontToDC(ptr ptr) +@ stdcall NtGdiGetFontUnicodeRanges(ptr ptr) +@ stdcall NtGdiGetWidthTable(ptr long ptr long ptr ptr ptr) +@ stdcall NtGdiGradientFill(ptr ptr long ptr long long) +@ stdcall NtGdiHfontCreate(ptr long long long ptr) +@ stdcall NtGdiIcmBrushInfo(ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiInit() +@ stdcall NtGdiInitSpool() +@ stdcall NtGdiIntersectClipRect(ptr long long long long) +@ stdcall NtGdiInvertRgn(ptr ptr) +@ stdcall NtGdiLineTo(ptr long long) +@ stdcall NtGdiMakeFontDir(long ptr long wstr long) +@ stdcall NtGdiMakeInfoDC(ptr long) +@ stdcall NtGdiMaskBlt(ptr long long long long ptr long long ptr long long long long) +@ stdcall NtGdiModifyWorldTransform(ptr ptr long) +@ stdcall NtGdiMonoBitmap(ptr) +@ stdcall NtGdiMoveTo(ptr long long ptr) +@ stdcall NtGdiOffsetClipRgn(ptr long long) +@ stdcall NtGdiOffsetRgn(ptr long long) +@ stdcall NtGdiOpenDCW(ptr ptr ptr long long ptr ptr) +@ stdcall NtGdiPatBlt(ptr long long long long long) +@ stdcall NtGdiPolyPatBlt(ptr long ptr long long) +@ stdcall NtGdiPathToRegion(ptr) +@ stdcall NtGdiPlgBlt(ptr ptr ptr long long long long ptr long long long) +@ stdcall NtGdiPolyDraw(ptr ptr ptr long) +@ stdcall NtGdiPolyPolyDraw(ptr ptr ptr long long) +@ stdcall NtGdiPolyTextOutW(ptr ptr long long) +@ stdcall NtGdiPtInRegion(ptr long long) +@ stdcall NtGdiPtVisible(ptr long long) +@ stdcall NtGdiQueryFonts(ptr long ptr) +@ stdcall NtGdiQueryFontAssocInfo(ptr) +@ stdcall NtGdiRectangle(ptr long long long long) +@ stdcall NtGdiRectInRegion(ptr ptr) +@ stdcall NtGdiRectVisible(ptr ptr) +@ stdcall NtGdiRemoveFontResourceW(ptr long long long long ptr) +@ stdcall NtGdiRemoveFontMemResourceEx(ptr) +@ stdcall NtGdiResetDC(ptr ptr ptr ptr ptr) +@ stdcall NtGdiResizePalette(ptr long) +@ stdcall NtGdiRestoreDC(ptr long) +@ stdcall NtGdiRoundRect(ptr long long long long long long) +@ stdcall NtGdiSaveDC(ptr) +@ stdcall NtGdiScaleViewportExtEx(ptr long long long long ptr) +@ stdcall NtGdiScaleWindowExtEx(ptr long long long long ptr) +@ stdcall NtGdiSelectBitmap(ptr ptr) +@ stdcall NtGdiSelectBrush(ptr ptr) +@ stdcall NtGdiSelectClipPath(ptr long) +@ stdcall NtGdiSelectFont(ptr ptr) +@ stdcall NtGdiSelectPen(ptr ptr) +@ stdcall NtGdiSetBitmapAttributes(ptr long) +@ stdcall NtGdiSetBitmapBits(ptr long ptr) +@ stdcall NtGdiSetBitmapDimension(ptr long long ptr) +@ stdcall NtGdiSetBoundsRect(ptr ptr long) +@ stdcall NtGdiSetBrushAttributes(ptr long) +@ stdcall NtGdiSetBrushOrg(ptr long long ptr) +@ stdcall NtGdiSetColorAdjustment(ptr ptr) +@ stdcall NtGdiSetColorSpace(ptr ptr) +@ stdcall NtGdiSetDeviceGammaRamp(ptr ptr) +@ stdcall NtGdiSetDIBitsToDeviceInternal(ptr long long long long long long long long ptr ptr long long long long ptr) +@ stdcall NtGdiSetFontEnumeration(long) +@ stdcall NtGdiSetFontXform(ptr long long) +@ stdcall NtGdiSetIcmMode(ptr long long) +@ stdcall NtGdiSetLinkedUFIs(ptr ptr long) +@ stdcall NtGdiSetMagicColors(ptr long long) +@ stdcall NtGdiSetMetaRgn(ptr) +@ stdcall NtGdiSetMiterLimit(ptr long ptr) +@ stdcall NtGdiGetDeviceWidth(ptr) +@ stdcall NtGdiMirrorWindowOrg(ptr) +@ stdcall NtGdiSetLayout(ptr long long) +@ stdcall NtGdiSetPixel(ptr long long long) +@ stdcall NtGdiSetPixelFormat(ptr long) +@ stdcall NtGdiSetRectRgn(ptr long long long long) +@ stdcall NtGdiSetSystemPaletteUse(ptr long) +@ stdcall NtGdiSetTextJustification(ptr long long) +@ stdcall NtGdiSetupPublicCFONT(ptr ptr long) +@ stdcall NtGdiSetVirtualResolution(ptr long long long long) +@ stdcall NtGdiSetSizeDevice(ptr long long) +@ stdcall NtGdiStartDoc(ptr ptr ptr long) +@ stdcall NtGdiStartPage(ptr) +@ stdcall NtGdiStretchBlt(ptr long long long long ptr long long long long long long) +@ stdcall NtGdiStretchDIBitsInternal(ptr long long long long long long long long ptr ptr long long long long ptr) +@ stdcall NtGdiStrokeAndFillPath(ptr) +@ stdcall NtGdiStrokePath(ptr) +@ stdcall NtGdiSwapBuffers(ptr) +@ stdcall NtGdiTransformPoints(ptr ptr ptr long long) +@ stdcall NtGdiTransparentBlt(ptr long long long long ptr long long long long long) +@ stdcall NtGdiUnloadPrinterDriver(wstr long) +@ stdcall NtGdiUnmapMemFont(ptr) +@ stdcall NtGdiUnrealizeObject(ptr) +@ stdcall NtGdiUpdateColors(ptr) +@ stdcall NtGdiWidenPath(ptr) +@ stdcall NtUserActivateKeyboardLayout(ptr long) +@ stdcall NtUserAlterWindowStyle(long long long) +@ stdcall NtUserAssociateInputContext(long long long) +@ stdcall NtUserAttachThreadInput(long long long) +@ stdcall NtUserBeginPaint(ptr ptr) +@ stdcall NtUserBitBltSysBmp(ptr long long long long long long long) +@ stdcall NtUserBlockInput(long) +@ stdcall NtUserBuildHimcList(long long long long) +@ stdcall NtUserBuildHwndList(ptr ptr long long long ptr ptr) +@ stdcall NtUserBuildNameList(ptr long ptr ptr) +@ stdcall NtUserBuildPropList(ptr ptr long ptr) +@ stdcall NtUserCallHwnd(ptr long) +@ stdcall NtUserCallHwndLock(ptr long) +@ stdcall NtUserCallHwndOpt(ptr long) +@ stdcall NtUserCallHwndParam(ptr long long) +@ stdcall NtUserCallHwndParamLock(ptr long long) +@ stdcall NtUserCallMsgFilter(ptr long) +@ stdcall NtUserCallNextHookEx(long ptr ptr long) +@ stdcall NtUserCallNoParam(long) +@ stdcall NtUserCallOneParam(ptr long) +@ stdcall NtUserCallTwoParam(ptr ptr long) +@ stdcall NtUserChangeClipboardChain(ptr ptr) +@ stdcall NtUserChangeDisplaySettings(ptr ptr ptr long ptr) +@ stdcall NtUserCheckImeHotKey(long long) +@ stdcall NtUserCheckMenuItem(ptr long long) +@ stdcall NtUserChildWindowFromPointEx(ptr long long long) +@ stdcall NtUserClipCursor(ptr) +@ stdcall NtUserCloseClipboard() +@ stdcall NtUserCloseDesktop(ptr) +@ stdcall NtUserCloseWindowStation(ptr) +@ stdcall NtUserConsoleControl(long long long) +@ stdcall NtUserConvertMemHandle(ptr long) +@ stdcall NtUserCopyAcceleratorTable(ptr ptr long) +@ stdcall NtUserCountClipboardFormats() +@ stdcall NtUserCreateAcceleratorTable(ptr ptr) +@ stdcall NtUserCreateCaret(ptr ptr long long) +@ stdcall NtUserCreateDesktop(ptr ptr ptr long long) +@ stdcall NtUserCreateInputContext(long) +@ stdcall NtUserCreateLocalMemHandle(ptr ptr long ptr) +@ stdcall NtUserCreateWindowEx(long ptr ptr ptr long long long long long ptr ptr ptr ptr long ptr) +@ stdcall NtUserCreateWindowStation(ptr long long long long long long) +@ stdcall NtUserDdeGetQualityOfService(ptr ptr ptr) +@ stdcall NtUserDdeInitialize(long long long long long) +@ stdcall NtUserDdeSetQualityOfService(ptr ptr ptr) +@ stdcall NtUserDeferWindowPos(ptr ptr ptr long long long long long) +@ stdcall NtUserDefSetText(ptr ptr) +@ stdcall NtUserDeleteMenu(ptr long long) +@ stdcall NtUserDestroyAcceleratorTable(ptr) +@ stdcall NtUserDestroyCursor(ptr long) +@ stdcall NtUserDestroyInputContext(long) +@ stdcall NtUserDestroyMenu(ptr) +@ stdcall NtUserDestroyWindow(ptr) +@ stdcall NtUserDisableThreadIme(long) +@ stdcall NtUserDispatchMessage(ptr) +@ stdcall NtUserDragDetect(ptr ptr long) +@ stdcall NtUserDragObject(ptr ptr long long ptr) +@ stdcall NtUserDrawAnimatedRects(ptr long ptr ptr) +@ stdcall NtUserDrawCaption(ptr ptr ptr long) +@ stdcall NtUserDrawCaptionTemp(ptr ptr ptr ptr ptr ptr long) +@ stdcall NtUserDrawIconEx(ptr long long ptr long long long ptr long long ptr) +@ stdcall NtUserDrawMenuBarTemp(ptr ptr ptr ptr ptr) +@ stdcall NtUserEmptyClipboard() +@ stdcall NtUserEnableMenuItem(ptr long long) +@ stdcall NtUserEnableScrollBar(ptr long long) +@ stdcall NtUserEndDeferWindowPosEx(ptr long) +@ stdcall NtUserEndMenu() +@ stdcall NtUserEndPaint(ptr ptr) +@ stdcall NtUserEnumDisplayDevices(ptr long ptr long) +@ stdcall NtUserEnumDisplayMonitors(ptr ptr ptr ptr) +@ stdcall NtUserEnumDisplaySettings(ptr long ptr long) +@ stdcall NtUserEvent(long) +@ stdcall NtUserExcludeUpdateRgn(ptr ptr) +@ stdcall NtUserFillWindow(ptr ptr ptr ptr) +@ stdcall NtUserFindExistingCursorIcon(ptr ptr ptr) +@ stdcall NtUserFindWindowEx(ptr ptr ptr ptr long) +@ stdcall NtUserFlashWindowEx(ptr) +@ stdcall NtUserGetAltTabInfo(ptr long ptr wstr long long) +@ stdcall NtUserGetAncestor(ptr long) +@ stdcall NtUserGetAppImeLevel(long) +@ stdcall NtUserGetAsyncKeyState(long) +@ stdcall NtUserGetAtomName(long ptr) +@ stdcall NtUserGetCaretBlinkTime() +@ stdcall NtUserGetCaretPos(ptr) +@ stdcall NtUserGetClassInfo(ptr ptr ptr ptr long) +@ stdcall NtUserGetClassName(ptr long ptr) +@ stdcall NtUserGetClipboardData(long ptr) +@ stdcall NtUserGetClipboardFormatName(long wstr ptr) +@ stdcall NtUserGetClipboardOwner() +@ stdcall NtUserGetClipboardSequenceNumber() +@ stdcall NtUserGetClipboardViewer() +@ stdcall NtUserGetClipCursor(ptr) +@ stdcall NtUserGetComboBoxInfo(ptr ptr) +@ stdcall NtUserGetControlBrush(ptr ptr long) +@ stdcall NtUserGetControlColor(ptr ptr ptr long) +@ stdcall NtUserGetCPD(ptr long ptr) +@ stdcall NtUserGetCursorFrameInfo(ptr long ptr ptr) +@ stdcall NtUserGetCursorInfo(ptr) +@ stdcall NtUserGetDC(ptr) +@ stdcall NtUserGetDCEx(ptr ptr long) +@ stdcall NtUserGetDoubleClickTime() +@ stdcall NtUserGetForegroundWindow() +@ stdcall NtUserGetGuiResources(ptr long) +@ stdcall NtUserGetGUIThreadInfo(long ptr) +@ stdcall NtUserGetIconInfo(ptr ptr ptr ptr ptr long) +@ stdcall NtUserGetIconSize(ptr long ptr ptr) +@ stdcall NtUserGetImeHotKey(long long long long) +@ stdcall NtUserGetImeInfoEx(long long) +@ stdcall NtUserGetInternalWindowPos(ptr ptr ptr) +@ stdcall NtUserGetKeyboardLayoutList(long ptr) +@ stdcall NtUserGetKeyboardLayoutName(str) +@ stdcall NtUserGetKeyboardState(ptr) +@ stdcall NtUserGetKeyNameText(long wstr long) +@ stdcall NtUserGetKeyState(long) +@ stdcall NtUserGetListBoxInfo(ptr) +@ stdcall NtUserGetMenuBarInfo(ptr long long ptr) +@ stdcall NtUserGetMenuIndex(ptr ptr) +@ stdcall NtUserGetMenuItemRect(ptr ptr long ptr) +@ stdcall NtUserGetMessage(ptr ptr long long) +@ stdcall NtUserGetMouseMovePointsEx(long ptr ptr long long) +@ stdcall NtUserGetObjectInformation(ptr long ptr long ptr) +@ stdcall NtUserGetOpenClipboardWindow() +@ stdcall NtUserGetPriorityClipboardFormat(ptr long) +@ stdcall NtUserGetProcessWindowStation() +@ stdcall NtUserGetRawInputBuffer(ptr ptr long) +@ stdcall NtUserGetRawInputData(ptr long ptr ptr long) +@ stdcall NtUserGetRawInputDeviceInfo(ptr long ptr ptr) +@ stdcall NtUserGetRawInputDeviceList(ptr ptr long) +@ stdcall NtUserGetRegisteredRawInputDevices(ptr ptr long) +@ stdcall NtUserGetScrollBarInfo(ptr long ptr) +@ stdcall NtUserGetSystemMenu(ptr long) +@ stdcall NtUserGetThreadDesktop(long long) +@ stdcall NtUserGetThreadState(ptr) +@ stdcall NtUserGetTitleBarInfo(ptr ptr) +@ stdcall NtUserGetUpdateRect(ptr ptr long) +@ stdcall NtUserGetUpdateRgn(ptr ptr long) +@ stdcall NtUserGetWindowDC(ptr) +@ stdcall NtUserGetWindowPlacement(ptr ptr) +@ stdcall NtUserGetWOWClass(ptr ptr) +@ stdcall NtUserHardErrorControl(long long long) +@ stdcall NtUserHideCaret(ptr) +@ stdcall NtUserHiliteMenuItem(ptr ptr long long) +@ stdcall NtUserImpersonateDdeClientWindow(ptr ptr) +@ stdcall NtUserInitialize(long ptr ptr) +@ stdcall NtUserInitializeClientPfnArrays(ptr ptr ptr ptr) +@ stdcall NtUserInitTask(long long long long long long long long long long long long) +@ stdcall NtUserInternalGetWindowText(ptr wstr ptr) +@ stdcall NtUserInvalidateRect(ptr ptr long) +@ stdcall NtUserInvalidateRgn(ptr ptr long) +@ stdcall NtUserIsClipboardFormatAvailable(long) +@ stdcall NtUserKillTimer(ptr ptr) +@ stdcall NtUserLoadKeyboardLayoutEx(ptr long ptr ptr ptr long long) +@ stdcall NtUserLockWindowStation(ptr) +@ stdcall NtUserLockWindowUpdate(ptr) +@ stdcall NtUserLockWorkStation() +@ stdcall NtUserMapVirtualKeyEx(long long long ptr) +@ stdcall NtUserMenuItemFromPoint(ptr ptr long long) +@ stdcall NtUserMessageCall(ptr long ptr ptr ptr long long) +@ stdcall NtUserMinMaximize(ptr long long) +@ stdcall NtUserMNDragLeave() +@ stdcall NtUserMNDragOver(long long) +@ stdcall NtUserModifyUserStartupInfoFlags(long long) +@ stdcall NtUserMoveWindow(ptr long long long long long) +@ stdcall NtUserNotifyIMEStatus(long long long) +@ stdcall NtUserNotifyProcessCreate(long long long long) +@ stdcall NtUserNotifyWinEvent(long long long long) +@ stdcall NtUserOpenClipboard(ptr long) +@ stdcall NtUserOpenDesktop(ptr long long) +@ stdcall NtUserOpenInputDesktop(long long long) +@ stdcall NtUserOpenWindowStation(ptr long) +@ stdcall NtUserPaintDesktop(ptr) +@ stdcall NtUserPeekMessage(ptr ptr long long long) +@ stdcall NtUserPostMessage(ptr long long long) +@ stdcall NtUserPostThreadMessage(long long long long) +@ stdcall NtUserPrintWindow(ptr ptr long) +@ stdcall NtUserProcessConnect(ptr ptr long) +@ stdcall NtUserQueryInformationThread(long long long long long) +@ stdcall NtUserQueryInputContext(long long) +@ stdcall NtUserQuerySendMessage(long) +@ stdcall NtUserQueryUserCounters(long long long long long) +@ stdcall NtUserQueryWindow(ptr long) +@ stdcall NtUserRealChildWindowFromPoint(ptr long long) +@ stdcall NtUserRealInternalGetMessage(ptr ptr long long long long) +@ stdcall NtUserRealWaitMessageEx(long long) +@ stdcall NtUserRedrawWindow(ptr ptr ptr long) +@ stdcall NtUserRegisterClassExWOW(ptr ptr ptr ptr long long ptr) +@ stdcall NtUserRegisterUserApiHook(ptr ptr) +@ stdcall NtUserRegisterHotKey(ptr long long long) +@ stdcall NtUserRegisterRawInputDevices(ptr long long) +@ stdcall NtUserRegisterTasklist(long) +@ stdcall NtUserRegisterWindowMessage(ptr) +@ stdcall NtUserRemoveMenu(ptr long long) +@ stdcall NtUserRemoveProp(ptr long) +@ stdcall NtUserResolveDesktop(long long long long) +@ stdcall NtUserResolveDesktopForWOW(long) +@ stdcall NtUserSBGetParms(ptr long ptr ptr) +@ stdcall NtUserScrollDC(ptr long long ptr ptr ptr ptr) +@ stdcall NtUserScrollWindowEx(ptr long long ptr ptr ptr ptr long) +@ stdcall NtUserSelectPalette(ptr ptr long) +@ stdcall NtUserSendInput(long ptr long) +@ stdcall NtUserSetActiveWindow(ptr) +@ stdcall NtUserSetAppImeLevel(long long) +@ stdcall NtUserSetCapture(ptr) +@ stdcall NtUserSetClassLong(ptr long ptr long) +@ stdcall NtUserSetClassWord(ptr long long) +@ stdcall NtUserSetClipboardData(long ptr ptr) +@ stdcall NtUserSetClipboardViewer(ptr) +@ stdcall NtUserSetConsoleReserveKeys(long long) +@ stdcall NtUserSetCursor(ptr) +@ stdcall NtUserSetCursorContents(ptr ptr) +@ stdcall NtUserSetCursorIconData(ptr ptr ptr ptr) +@ stdcall NtUserSetDbgTag(long long) +@ stdcall NtUserSetFocus(ptr) +@ stdcall NtUserSetImeHotKey(long long long long long) +@ stdcall NtUserSetImeInfoEx(long) +@ stdcall NtUserSetImeOwnerWindow(long long) +@ stdcall NtUserSetInformationProcess(long long long long) +@ stdcall NtUserSetInformationThread(ptr long ptr long) +@ stdcall NtUserSetInternalWindowPos(ptr long ptr ptr) +@ stdcall NtUserSetKeyboardState(ptr) +@ stdcall NtUserSetLogonNotifyWindow(ptr) +@ stdcall NtUserSetMenu(ptr ptr long) +@ stdcall NtUserSetMenuContextHelpId(ptr long) +@ stdcall NtUserSetMenuDefaultItem(ptr long long) +@ stdcall NtUserSetMenuFlagRtoL(ptr) +@ stdcall NtUserSetObjectInformation(ptr long ptr long) +@ stdcall NtUserSetParent(ptr ptr) +@ stdcall NtUserSetProcessWindowStation(ptr) +@ stdcall NtUserSetProp(ptr long ptr) +@ stdcall NtUserSetRipFlags(long long) +@ stdcall NtUserSetScrollInfo(ptr long ptr long) +@ stdcall NtUserSetShellWindowEx(ptr ptr) +@ stdcall NtUserSetSysColors(long ptr ptr long) +@ stdcall NtUserSetSystemCursor(ptr long) +@ stdcall NtUserSetSystemMenu(ptr ptr) +@ stdcall NtUserSetSystemTimer(ptr ptr long ptr) +@ stdcall NtUserSetThreadDesktop(ptr) +@ stdcall NtUserSetThreadLayoutHandles(long long) +@ stdcall NtUserSetThreadState(long long) +@ stdcall NtUserSetTimer(ptr ptr long ptr) +@ stdcall NtUserSetWindowFNID(ptr long) +@ stdcall NtUserSetWindowLong(ptr long long long) +@ stdcall NtUserSetWindowPlacement(ptr ptr) +@ stdcall NtUserSetWindowPos(ptr ptr long long long long long) +@ stdcall NtUserSetWindowRgn(ptr ptr long) +@ stdcall NtUserSetWindowsHookAW(long ptr long) +@ stdcall NtUserSetWindowsHookEx(ptr ptr long long ptr long) +@ stdcall NtUserSetWindowStationUser(long long long long) +@ stdcall NtUserSetWindowWord(ptr long long) +@ stdcall NtUserSetWinEventHook(long long ptr ptr ptr long long long) +@ stdcall NtUserShowCaret(ptr) +@ stdcall NtUserShowScrollBar(ptr long long) +@ stdcall NtUserShowWindow(ptr long) +@ stdcall NtUserShowWindowAsync(ptr long) +@ stdcall NtUserSoundSentry() +@ stdcall NtUserSwitchDesktop(ptr) +@ stdcall NtUserSystemParametersInfo(long long ptr long) +@ stdcall NtUserTestForInteractiveUser(long) +@ stdcall NtUserThunkedMenuInfo(ptr ptr) +@ stdcall NtUserThunkedMenuItemInfo(ptr long long long ptr ptr) +@ stdcall NtUserToUnicodeEx(long long ptr wstr long long ptr) +@ stdcall NtUserTrackMouseEvent(ptr) +@ stdcall NtUserTrackPopupMenuEx(ptr long long long ptr ptr) +@ stdcall NtUserCalcMenuBar(long long long long long) +@ stdcall NtUserPaintMenuBar(long long long long long long) +@ stdcall NtUserTranslateAccelerator(ptr ptr ptr) +@ stdcall NtUserTranslateMessage(ptr long) +@ stdcall NtUserUnhookWindowsHookEx(ptr) +@ stdcall NtUserUnhookWinEvent(ptr) +@ stdcall NtUserUnloadKeyboardLayout(ptr) +@ stdcall NtUserUnlockWindowStation(ptr) +@ stdcall NtUserUnregisterClass(ptr ptr ptr) +@ stdcall NtUserUnregisterUserApiHook() +@ stdcall NtUserUnregisterHotKey(ptr long) +@ stdcall NtUserUpdateInputContext(long long long) +@ stdcall NtUserUpdateInstance(long long long) +@ stdcall NtUserUpdateLayeredWindow(ptr ptr ptr ptr ptr ptr long long ptr) +@ stdcall NtUserGetLayeredWindowAttributes(ptr ptr ptr ptr) +@ stdcall NtUserSetLayeredWindowAttributes(ptr long long long) +@ stdcall NtUserUpdatePerUserSystemParameters(long long) +@ stdcall NtUserUserHandleGrantAccess(ptr ptr long) +@ stdcall NtUserValidateHandleSecure(ptr long) +@ stdcall NtUserValidateRect(ptr ptr) +@ stdcall NtUserValidateTimerCallback(ptr ptr ptr) +@ stdcall NtUserVkKeyScanEx(long ptr long) +@ stdcall NtUserWaitForInputIdle(ptr long long) +@ stdcall NtUserWaitForMsgAndEvent(long) +@ stdcall NtUserWaitMessage() +@ stdcall NtUserWin32PoolAllocationStats(long long long long long long) +@ stdcall NtUserWindowFromPoint(long long) +@ stdcall NtUserYieldTask() +@ stdcall NtUserRemoteConnect(long long long) +@ stdcall NtUserRemoteRedrawRectangle(long long long long) +@ stdcall NtUserRemoteRedrawScreen() +@ stdcall NtUserRemoteStopScreenUpdates() +@ stdcall NtUserCtxDisplayIOCtl(long long long) +@ stdcall NtGdiEngAssociateSurface(ptr ptr long) +@ stdcall NtGdiEngCreateBitmap(long long long long long ptr) +@ stdcall NtGdiEngCreateDeviceSurface(ptr long long long) +@ stdcall NtGdiEngCreateDeviceBitmap(ptr long long long) +@ stdcall NtGdiEngCreatePalette(long long ptr long long long) +@ stdcall NtGdiEngComputeGlyphSet(ptr ptr ptr) +@ stdcall NtGdiEngCopyBits(ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngDeletePalette(ptr) +@ stdcall NtGdiEngDeleteSurface(ptr) +@ stdcall NtGdiEngEraseSurface(ptr ptr long) +@ stdcall NtGdiEngUnlockSurface(ptr) +@ stdcall NtGdiEngLockSurface(ptr) +@ stdcall NtGdiEngBitBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStretchBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiEngPlgBlt(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long) +@ stdcall NtGdiEngMarkBandingSurface(ptr) +@ stdcall NtGdiEngStrokePath(ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngFillPath(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStrokeAndFillPath(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngPaint(ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngLineTo(ptr ptr ptr long long long long ptr ptr) +@ stdcall NtGdiEngAlphaBlend(ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngGradientFill(ptr ptr ptr ptr long ptr long ptr ptr long) +@ stdcall NtGdiEngTransparentBlt(ptr ptr ptr ptr ptr ptr long long) +@ stdcall NtGdiEngTextOut(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) +@ stdcall NtGdiEngStretchBltROP(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr long ptr long) +@ stdcall NtGdiXLATEOBJ_cGetPalette(ptr long long ptr) +@ stdcall NtGdiXLATEOBJ_iXlate(ptr long) +@ stdcall NtGdiXLATEOBJ_hGetColorTransform(ptr) +@ stdcall NtGdiCLIPOBJ_bEnum(ptr long long) +@ stdcall NtGdiCLIPOBJ_cEnumStart(ptr long long long long) +@ stdcall NtGdiCLIPOBJ_ppoGetPath(ptr) +@ stdcall NtGdiEngDeletePath(ptr) +@ stdcall NtGdiEngCreateClip() +@ stdcall NtGdiEngDeleteClip(ptr) +@ stdcall NtGdiBRUSHOBJ_ulGetBrushColor(ptr) +@ stdcall NtGdiBRUSHOBJ_pvAllocRbrush(ptr long) +@ stdcall NtGdiBRUSHOBJ_pvGetRbrush(ptr) +@ stdcall NtGdiBRUSHOBJ_hGetColorTransform(ptr) +@ stdcall NtGdiXFORMOBJ_bApplyXform(ptr ptr long long ptr) +@ stdcall NtGdiXFORMOBJ_iGetXform(ptr ptr) +@ stdcall NtGdiFONTOBJ_vGetInfo(ptr long ptr) +@ stdcall NtGdiFONTOBJ_pxoGetXform(ptr) +@ stdcall NtGdiFONTOBJ_cGetGlyphs(ptr long long ptr ptr) +@ stdcall NtGdiFONTOBJ_pifi(ptr) +@ stdcall NtGdiFONTOBJ_pfdg(ptr) +@ stdcall NtGdiFONTOBJ_pQueryGlyphAttrs(ptr long) +@ stdcall NtGdiFONTOBJ_pvTrueTypeFontFile(ptr ptr) +@ stdcall NtGdiFONTOBJ_cGetAllGlyphHandles(ptr ptr) +@ stdcall NtGdiSTROBJ_bEnum(ptr ptr ptr) +@ stdcall NtGdiSTROBJ_bEnumPositionsOnly(ptr ptr ptr) +@ stdcall NtGdiSTROBJ_bGetAdvanceWidths(ptr long long ptr) +@ stdcall NtGdiSTROBJ_vEnumStart(ptr) +@ stdcall NtGdiSTROBJ_dwGetCodePage(ptr) +@ stdcall NtGdiPATHOBJ_vGetBounds(ptr ptr) +@ stdcall NtGdiPATHOBJ_bEnum(ptr ptr) +@ stdcall NtGdiPATHOBJ_vEnumStart(ptr) +@ stdcall NtGdiPATHOBJ_vEnumStartClipLines(ptr ptr ptr ptr) +@ stdcall NtGdiPATHOBJ_bEnumClipLines(ptr long ptr) +@ stdcall NtGdiGetDhpdev(ptr) +@ stdcall NtGdiEngCheckAbort(ptr) +@ stdcall NtGdiHT_Get8BPPFormatPalette(ptr long long long) +@ stdcall NtGdiHT_Get8BPPMaskPalette(ptr long long long long long) +@ stdcall NtGdiUpdateTransform(ptr) +@ stdcall NtGdiSetPUMPDOBJ(ptr long ptr ptr) +@ stdcall NtGdiBRUSHOBJ_DeleteRbrush(ptr ptr) +@ stdcall NtGdiUMPDEngFreeUserMem(ptr) +@ stdcall NtGdiUnmapMemFont(ptr) +@ stdcall NtGdiDrawStream(ptr long ptr) diff --git a/rostests/apitests/w32knapi/CMakeLists.txt b/rostests/apitests/w32knapi/CMakeLists.txt index 77dd4528800..a0d4a014b51 100644 --- a/rostests/apitests/w32knapi/CMakeLists.txt +++ b/rostests/apitests/w32knapi/CMakeLists.txt @@ -12,4 +12,12 @@ list(APPEND SOURCE add_executable(w32knapi ${SOURCE}) target_link_libraries(w32knapi apitest) set_module_type(w32knapi win32cui) -add_importlibs(w32knapi w32kdll_ros gdi32 user32 shell32 advapi32 msvcrt kernel32 ntdll) +add_importlibs(w32knapi + w32kdll_ros # w32kdll_2ksp4 w32kdll_xpsp2 w32kdll_2k3sp2 w32kdll_vista + gdi32 + user32 + shell32 + advapi32 + msvcrt + kernel32 + ntdll) From b3466d43ab5e27a22f853188b1a6a7b907c0ea36 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Tue, 7 Feb 2012 17:40:15 +0000 Subject: [PATCH 255/289] [NTOSKRNL] Fix a FIXME in IopCreateArcNames. This allows ntoskrnl to find where it boots from and where it is when performing remote boot. Now ReactOS should boot a bit farther using PXE :-). svn path=/trunk/; revision=55485 --- reactos/ntoskrnl/io/iomgr/arcname.c | 68 ++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/arcname.c b/reactos/ntoskrnl/io/iomgr/arcname.c index 58457d22546..64aa3489810 100644 --- a/reactos/ntoskrnl/io/iomgr/arcname.c +++ b/reactos/ntoskrnl/io/iomgr/arcname.c @@ -18,6 +18,7 @@ UNICODE_STRING IoArcHalDeviceName, IoArcBootDeviceName; PCHAR IoLoaderArcBootDeviceName; +extern BOOLEAN IoRemoteBootClient; /* FUNCTIONS *****************************************************************/ @@ -40,13 +41,14 @@ INIT_FUNCTION NTAPI IopCreateArcNames(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { - PARC_DISK_INFORMATION ArcDiskInfo = LoaderBlock->ArcDiskInformation; - CHAR Buffer[128]; - ANSI_STRING ArcSystemString, ArcString; - BOOLEAN SingleDisk; SIZE_T Length; NTSTATUS Status; + CHAR Buffer[128]; + BOOLEAN SingleDisk; BOOLEAN FoundBoot = FALSE; + UNICODE_STRING SystemDevice, LoaderPathNameW, BootDeviceName; + PARC_DISK_INFORMATION ArcDiskInfo = LoaderBlock->ArcDiskInformation; + ANSI_STRING ArcSystemString, ArcString, LanmanRedirector, LoaderPathNameA; /* Check if we only have one disk on the machine */ SingleDisk = ArcDiskInfo->DiskSignatureListHead.Flink->Flink == @@ -85,7 +87,53 @@ IopCreateArcNames(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Build the boot strings */ RtlInitAnsiString(&ArcSystemString, LoaderBlock->ArcHalDeviceName); - /* FIXME: Handle IoRemoteBootClient here and create appropriate symbolic link */ + /* If we are doing remote booting */ + if (IoRemoteBootClient) + { + /* Yes, we have found boot device */ + FoundBoot = TRUE; + + /* Get NT device name */ + RtlInitAnsiString(&LanmanRedirector, "\\Device\\LanmanRedirector"); + Status = RtlAnsiStringToUnicodeString(&SystemDevice, &LanmanRedirector, TRUE); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + /* Get ARC booting device name (in net(0) something) */ + sprintf(Buffer, "\\ArcName\\%s", LoaderBlock->ArcBootDeviceName); + RtlInitAnsiString(&ArcString, Buffer); + Status = RtlAnsiStringToUnicodeString(&BootDeviceName, &ArcString, TRUE); + if (NT_SUCCESS(Status)) + { + /* Map ARC to NT name */ + IoCreateSymbolicLink(&BootDeviceName, &SystemDevice); + RtlFreeUnicodeString(&BootDeviceName); + + /* Now, get loader path name */ + RtlInitAnsiString(&LoaderPathNameA, LoaderBlock->NtHalPathName); + Status = RtlAnsiStringToUnicodeString(&LoaderPathNameW, &LoaderPathNameA, TRUE); + if (!NT_SUCCESS(Status)) + { + RtlFreeUnicodeString(&SystemDevice); + return Status; + } + + /* And set it has system partition */ + IopStoreSystemPartitionInformation(&SystemDevice, &LoaderPathNameW); + } + + RtlFreeUnicodeString(&SystemDevice); + + /* Don't quit here, even if everything went fine! + * We need IopCreateArcNamesDisk to properly map + * devices with symlinks. + * It will return success if the mapping process went fine + * even if it didn't find boot device. + * It won't reset boot device finding status as well. + */ + } /* Loop every disk and try to find boot disk */ Status = IopCreateArcNamesDisk(LoaderBlock, SingleDisk, &FoundBoot); @@ -391,7 +439,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, ANSI_STRING ArcBootString, ArcSystemString, DeviceStringA, ArcNameStringA, HalPathStringA; /* Initialise device number */ - DeviceNumber.DeviceNumber = 0xFFFFFFFF; + DeviceNumber.DeviceNumber = UINT_MAX; /* Get all the disks present in the system */ DiskCount = IoGetConfigurationInformation()->DiskCount; @@ -487,7 +535,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, if (NotEnabledPresent && *lSymbolicLinkList == UNICODE_NULL) { /* No enabled disk worked, reset field */ - if (DeviceNumber.DeviceNumber == 0xFFFFFFFF) + if (DeviceNumber.DeviceNumber == UINT_MAX) { DeviceNumber.DeviceNumber = 0; } @@ -521,7 +569,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, RtlFreeUnicodeString(&DeviceStringW); /* This is a security measure, to ensure DiskNumber will be used */ - DeviceNumber.DeviceNumber = 0xFFFFFFFF; + DeviceNumber.DeviceNumber = UINT_MAX; } /* Something failed somewhere earlier, just skip the disk */ @@ -657,7 +705,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, (DriveLayout->PartitionStyle == PARTITION_STYLE_MBR)) { /* Create device name */ - sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", (DeviceNumber.DeviceNumber != 0xFFFFFFFF) ? DeviceNumber.DeviceNumber : DiskNumber); + sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", (DeviceNumber.DeviceNumber != UINT_MAX) ? DeviceNumber.DeviceNumber : DiskNumber); RtlInitAnsiString(&DeviceStringA, Buffer); Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); if (!NT_SUCCESS(Status)) @@ -686,7 +734,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, for (i = 1; i <= DriveLayout->PartitionCount; i++) { /* Create device name */ - sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition%lu", (DeviceNumber.DeviceNumber != 0xFFFFFFFF) ? DeviceNumber.DeviceNumber : DiskNumber, i); + sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition%lu", (DeviceNumber.DeviceNumber != UINT_MAX) ? DeviceNumber.DeviceNumber : DiskNumber, i); RtlInitAnsiString(&DeviceStringA, Buffer); Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); if (!NT_SUCCESS(Status)) From 26260e22cbf008b06f15683eccc7b9a8156d35d3 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Tue, 7 Feb 2012 17:50:00 +0000 Subject: [PATCH 256/289] [NTOSKRNL] *grmbl* s/UINT_MAX/ULONG_MAX/g *grmbl* svn path=/trunk/; revision=55486 --- reactos/ntoskrnl/io/iomgr/arcname.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/arcname.c b/reactos/ntoskrnl/io/iomgr/arcname.c index 64aa3489810..d70b4864580 100644 --- a/reactos/ntoskrnl/io/iomgr/arcname.c +++ b/reactos/ntoskrnl/io/iomgr/arcname.c @@ -439,7 +439,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, ANSI_STRING ArcBootString, ArcSystemString, DeviceStringA, ArcNameStringA, HalPathStringA; /* Initialise device number */ - DeviceNumber.DeviceNumber = UINT_MAX; + DeviceNumber.DeviceNumber = ULONG_MAX; /* Get all the disks present in the system */ DiskCount = IoGetConfigurationInformation()->DiskCount; @@ -535,7 +535,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, if (NotEnabledPresent && *lSymbolicLinkList == UNICODE_NULL) { /* No enabled disk worked, reset field */ - if (DeviceNumber.DeviceNumber == UINT_MAX) + if (DeviceNumber.DeviceNumber == ULONG_MAX) { DeviceNumber.DeviceNumber = 0; } @@ -569,7 +569,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, RtlFreeUnicodeString(&DeviceStringW); /* This is a security measure, to ensure DiskNumber will be used */ - DeviceNumber.DeviceNumber = UINT_MAX; + DeviceNumber.DeviceNumber = ULONG_MAX; } /* Something failed somewhere earlier, just skip the disk */ @@ -705,7 +705,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, (DriveLayout->PartitionStyle == PARTITION_STYLE_MBR)) { /* Create device name */ - sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", (DeviceNumber.DeviceNumber != UINT_MAX) ? DeviceNumber.DeviceNumber : DiskNumber); + sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition0", (DeviceNumber.DeviceNumber != ULONG_MAX) ? DeviceNumber.DeviceNumber : DiskNumber); RtlInitAnsiString(&DeviceStringA, Buffer); Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); if (!NT_SUCCESS(Status)) @@ -734,7 +734,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, for (i = 1; i <= DriveLayout->PartitionCount; i++) { /* Create device name */ - sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition%lu", (DeviceNumber.DeviceNumber != UINT_MAX) ? DeviceNumber.DeviceNumber : DiskNumber, i); + sprintf(Buffer, "\\Device\\Harddisk%lu\\Partition%lu", (DeviceNumber.DeviceNumber != ULONG_MAX) ? DeviceNumber.DeviceNumber : DiskNumber, i); RtlInitAnsiString(&DeviceStringA, Buffer); Status = RtlAnsiStringToUnicodeString(&DeviceStringW, &DeviceStringA, TRUE); if (!NT_SUCCESS(Status)) From 48449b19710172701048bee30a2e860d2112e153 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Tue, 7 Feb 2012 18:09:25 +0000 Subject: [PATCH 257/289] [CRT] Fix 64 bit build of MSVCRT svn path=/trunk/; revision=55487 --- reactos/lib/sdk/crt/time/bitsfixup.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/lib/sdk/crt/time/bitsfixup.h b/reactos/lib/sdk/crt/time/bitsfixup.h index b7bc7f9f248..4fcd9e57ee1 100644 --- a/reactos/lib/sdk/crt/time/bitsfixup.h +++ b/reactos/lib/sdk/crt/time/bitsfixup.h @@ -10,13 +10,14 @@ #undef _timeb #undef _ftime #undef _tctime -#undef _ftime_s #undef _tctime_s #undef _tutime #else #define _time time #endif +#undef _ftime_s + #ifdef _USE_EXPLICIT_32BIT_TIME #define time_t __time32_t #define _timeb __timeb32 From eece771f9fd6125617d2a10d44b5b1e746f08edc Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Tue, 7 Feb 2012 20:40:00 +0000 Subject: [PATCH 258/289] [RAPPS] Fix French translation encoding svn path=/trunk/; revision=55488 --- reactos/base/applications/rapps/lang/fr-FR.rc | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/reactos/base/applications/rapps/lang/fr-FR.rc b/reactos/base/applications/rapps/lang/fr-FR.rc index 1e610cf43a3..645623ef462 100644 --- a/reactos/base/applications/rapps/lang/fr-FR.rc +++ b/reactos/base/applications/rapps/lang/fr-FR.rc @@ -21,7 +21,7 @@ BEGIN POPUP "Aide" BEGIN MENUITEM "Aide", ID_HELP, GRAYED - MENUITEM "Å” propos", ID_ABOUT + MENUITEM "À propos", ID_ABOUT END END @@ -54,15 +54,15 @@ CAPTION "Configuration" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Général", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Enregistrer la position de la fenÄ™tre", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Mettre Å• jour la liste des programmes accessibles au démarage", IDC_UPDATE_AVLIST, 15, 29, 222, 12 + AUTOCHECKBOX "&Enregistrer la position de la fenêtre", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 + AUTOCHECKBOX "&Mettre à jour la liste des programmes accessibles au démarage", IDC_UPDATE_AVLIST, 15, 29, 222, 12 AUTOCHECKBOX "&Journal de l'installation de la suppression des programmes", IDC_LOG_ENABLED, 15, 46, 219, 12 GROUPBOX "Téléchargement", -1, 4, 65, 240, 51 LTEXT "Fichier des téléchargements :", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP PUSHBUTTON "&Sélectionner", IDC_CHOOSE, 187, 85, 50, 14 - AUTOCHECKBOX "&Supprimer l'installateur du programme aprÄs l'installation", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12 + AUTOCHECKBOX "&Supprimer l'installateur du programme après l'installation", IDC_DEL_AFTER_INSTALL, 16, 100, 218, 12 PUSHBUTTON "Par défaut", IDC_DEFAULT_SETTINGS, 8, 124, 60, 14 PUSHBUTTON "Accepter", IDOK, 116, 124, 60, 14 @@ -76,7 +76,7 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "...", IDC_INSTALL_TEXT, 4, 5, 209, 35 - AUTORADIOBUTTON "&Installer Å• partir d'un disque (CD ou DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP + AUTORADIOBUTTON "&Installer à partir d'un disque (CD ou DVD)", IDC_CD_INSTALL, 10, 46, 197, 11, WS_GROUP AUTORADIOBUTTON "&Télécharger et installer", IDC_DOWNLOAD_INSTALL, 10, 59, 197, 11, NOT WS_TABSTOP PUSHBUTTON "Accepter", IDOK, 86, 78, 60, 14 @@ -95,7 +95,7 @@ END IDD_ABOUT_DIALOG DIALOGEX 22, 16, 190, 66 STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | WS_SYSMENU | DS_MODALFRAME -CAPTION "Å” propos" +CAPTION "À propos" FONT 8, "MS Shell Dlg" BEGIN LTEXT "ReactOS Applications Manager\nCopyright (C) 2009\npar Dmitry Chapyshev (dmitry@reactos.org)", IDC_STATIC, 48, 7, 130, 39 @@ -131,13 +131,13 @@ BEGIN IDS_INFO_REGOWNER "\nUtilisateur enregistré : " IDS_INFO_PRODUCTID "\nID du produit : " IDS_INFO_CONTACT "\nContact : " - IDS_INFO_UPDATEINFO "\nInformation de mise Å• jour : " - IDS_INFO_INFOABOUT "\nInformation Å• propos : " + IDS_INFO_UPDATEINFO "\nInformation de mise à jour : " + IDS_INFO_INFOABOUT "\nInformation à propos : " IDS_INFO_COMMENTS "\nCommentaires : " IDS_INFO_INSTLOCATION "\nEmplacement de l'installation : " IDS_INFO_INSTALLSRC "\nSource de l'installation : " IDS_INFO_UNINSTALLSTR "\nCommande de désinstallation : " - IDS_INFO_MODIFYPATH "\nModifier le chemin d'accÄs : " + IDS_INFO_MODIFYPATH "\nModifier le chemin d'accès : " IDS_INFO_INSTALLDATE "\nDate d'installation : " END @@ -161,7 +161,7 @@ BEGIN IDS_CAT_GAMES "Jeux & détente" IDS_CAT_GRAPHICS "Graphismes" IDS_CAT_INTERNET "Internet & résaux" - IDS_CAT_LIBS "BibliothÄques" + IDS_CAT_LIBS "Bibliothèques" IDS_CAT_OFFICE "Bureautique" IDS_CAT_OTHER "Autres" IDS_CAT_SCIENCE "Sciences" @@ -177,17 +177,17 @@ BEGIN IDS_UNINSTALL "Désinstaller" IDS_MODIFY "Modifier" IDS_APPS_COUNT "Nombre d'applications : %d" - IDS_WELCOME_TITLE "Bienvenue Å• ReactOS Applications Manager!\n\n" - IDS_WELCOME_TEXT "Choisisez une catégorie Å• gauche, ensuite choisisez une application Å• installer ou désinstaller.\nSite internet de ReactOS : " + IDS_WELCOME_TITLE "Bienvenue à ReactOS Applications Manager!\n\n" + IDS_WELCOME_TEXT "Choisisez une catégorie à gauche, ensuite choisisez une application à installer ou désinstaller.\nSite internet de ReactOS : " IDS_WELCOME_URL "http://www.reactos.org" IDS_INSTALLED "Installé" IDS_AVAILABLEFORINST "Disponible pour installation" - IDS_UPDATES "Mises Å• jour" + IDS_UPDATES "Mises à jour" IDS_APPLICATIONS "Applications" IDS_CHOOSE_FOLDER_TEXT "Choisisez un dossier dans lequel seront téléchargés les programmes :" IDS_CHOOSE_FOLDER_ERROR "Le dossier que vous avez spécifié n'existe pas. Le créer ?" - IDS_USER_NOT_ADMIN "Vous devez Ä™tre un administrateur pour démarrer ""ReactOS Applications Manager""!" - IDS_APP_REG_REMOVE "Etes-vous sűr de vouloir supprimer les données du programme installé du registre ?" + IDS_USER_NOT_ADMIN "Vous devez être un administrateur pour démarrer ""ReactOS Applications Manager""!" + IDS_APP_REG_REMOVE "Etes-vous sûr de vouloir supprimer les données du programme installé du registre ?" IDS_INFORMATION "Information" IDS_UNABLE_TO_REMOVE "Impossible de supprimer les données du programme du registre !" END From 03e2adb69eb216a0875e9cea2c3ded800d876d4e Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Feb 2012 16:25:13 +0000 Subject: [PATCH 259/289] [NDK] Add definition of PWOW64_CONTEXT svn path=/trunk/; revision=55494 --- reactos/include/ndk/rtlfuncs.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index a0b8a723a26..4ec355f5a67 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -2332,6 +2332,8 @@ RtlInitializeContext( ); #ifdef _M_AMD64 +typedef struct _WOW64_CONTEXT *PWOW64_CONTEXT; + NTSYSAPI NTSTATUS NTAPI From d964bd32f29f0e1113abb571b2466c50d8b1f055 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Feb 2012 17:16:00 +0000 Subject: [PATCH 260/289] [ATL] Fix an MSVC warning svn path=/trunk/; revision=55495 --- reactos/lib/atl/statreg.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/lib/atl/statreg.h b/reactos/lib/atl/statreg.h index 33e784cbbc3..83d83a1a2d7 100644 --- a/reactos/lib/atl/statreg.h +++ b/reactos/lib/atl/statreg.h @@ -470,7 +470,7 @@ private: return S_OK; } - inline unsigned int HexToBin(char a) + inline unsigned int HexToBin(OLECHAR a) { if (a >= '0' && a <= '9') return a - '0'; @@ -489,14 +489,14 @@ private: LONG lres; HKEY hkey; strbuf name; - + enum { NORMAL, NO_REMOVE, IS_VAL, FORCE_REMOVE, DO_DELETE - } key_type = NORMAL; + } key_type = NORMAL; static const wchar_t *wstrNoRemove = _T("NoRemove"); static const wchar_t *wstrForceRemove = _T("ForceRemove"); @@ -531,7 +531,7 @@ private: if (FAILED(hres)) break; } - + if (do_register) { if (key_type == IS_VAL) @@ -676,7 +676,7 @@ private: RegCloseKey(hkey); hkey = 0; name.len = 0; - + hres = get_word(&iter, buf); if (FAILED(hres)) break; From a713dd0ea3fc52ea9d876d3744a200b541ebe660 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Feb 2012 18:29:08 +0000 Subject: [PATCH 261/289] [HAL] Fix syntax, patch by Victor Martinez svn path=/trunk/; revision=55496 --- reactos/hal/halx86/up/pic.c | 212 ++++++++++++++++++------------------ 1 file changed, 106 insertions(+), 106 deletions(-) diff --git a/reactos/hal/halx86/up/pic.c b/reactos/hal/halx86/up/pic.c index 22af47676ce..186548c1b9d 100644 --- a/reactos/hal/halx86/up/pic.c +++ b/reactos/hal/halx86/up/pic.c @@ -104,7 +104,7 @@ ULONG KiI8259MaskTable[32] = 0b00000000000000000000000000000000, /* IRQL 1 */ 0b00000000000000000000000000000000, /* IRQL 2 */ 0b00000000000000000000000000000000, /* IRQL 3 */ - + /* * These next IRQLs are actually useless from the PIC perspective, because * with only 2 PICs, the mask you can send them is only 8 bits each, for 16 @@ -118,7 +118,7 @@ ULONG KiI8259MaskTable[32] = 0b11111111111111000000000000000000, /* IRQL 9 */ 0b11111111111111100000000000000000, /* IRQL 10 */ 0b11111111111111110000000000000000, /* IRQL 11 */ - + /* * Okay, now we're finally starting to mask off IRQs on the slave PIC, from * IRQ15 to IRQ8. This means the higher-level IRQs get less priority in the @@ -132,7 +132,7 @@ ULONG KiI8259MaskTable[32] = 0b11111111111111111111110000000000, /* IRQL 17 */ 0b11111111111111111111111000000000, /* IRQL 18 */ 0b11111111111111111111111000000000, /* IRQL 19 */ - + /* * Now we mask off the IRQs on the master. Notice the 0 "droplet"? You might * have also seen that IRQL 18 and 19 are essentially equal as far as the @@ -149,7 +149,7 @@ ULONG KiI8259MaskTable[32] = 0b11111111111111111111111011111000, /* IRQL 25 */ 0b11111111111111111111111011111010, /* IRQL 26 */ 0b11111111111111111111111111111010, /* IRQL 27 */ - + /* * IRQL 24 and 25 are actually identical, so IRQL 28 is actually the last * IRQL to modify a bit on the master PIC. It happens to modify the very @@ -160,7 +160,7 @@ ULONG KiI8259MaskTable[32] = * called CLOCK2_LEVEL, which explains the usage we just explained. */ 0b11111111111111111111111111111011, /* IRQL 28 */ - + /* * We have finished off with the PIC so there's nothing left to mask at the * level of these IRQLs, making them only logical IRQLs on x86 machines. @@ -221,13 +221,13 @@ ULONG FindHigherIrqlMask[32] = 0b11111111111111111111111111111110, /* IRQL 0 */ 0b11111111111111111111111111111100, /* IRQL 1 */ 0b11111111111111111111111111111000, /* IRQL 2 */ - + /* * IRQL3 means only hardware IRQLs can now preempt. These last 4 zeros will * then continue throughout the rest of the list, trickling down. */ 0b11111111111111111111111111110000, /* IRQL 3 */ - + /* * Just like in the previous list, these masks don't really mean anything * since we've only got two PICs with 16 possible IRQs total @@ -239,7 +239,7 @@ ULONG FindHigherIrqlMask[32] = 0b00000000011111111111111111110000, /* IRQL 8 */ 0b00000000001111111111111111110000, /* IRQL 9 */ 0b00000000000111111111111111110000, /* IRQL 10 */ - + /* * Now we start progressivly limiting which slave PIC interrupts have the * right to preempt us at each level. @@ -253,7 +253,7 @@ ULONG FindHigherIrqlMask[32] = 0b00000000000000000011111111110000, /* IRQL 17 */ 0b00000000000000000001111111110000, /* IRQL 18 */ 0b00000000000000000001111111110000, /* IRQL 19 */ - + /* * Also recall from the earlier table that IRQL 18/19 are treated the same * in order to spread the masks better thoughout the 32 IRQLs and to reflect @@ -269,15 +269,15 @@ ULONG FindHigherIrqlMask[32] = 0b00000000000000000001000001110000, /* IRQL 24 */ 0b00000000000000000001000000110000, /* IRQL 25 */ 0b00000000000000000001000000010000, /* IRQL 26 */ - + /* At this point, only the clock (IRQ0) can still preempt... */ 0b00000000000000000000000000010000, /* IRQL 27 */ - + /* And any higher than that there's no relation with hardware PICs anymore */ 0b00000000000000000000000000000000, /* IRQL 28 */ 0b00000000000000000000000000000000, /* IRQL 29 */ 0b00000000000000000000000000000000, /* IRQL 30 */ - 0b00000000000000000000000000000000, /* IRQL 31 */ + 0b00000000000000000000000000000000 /* IRQL 31 */ #else 0xFFFFFFFE, /* IRQL 0 */ 0xFFFFFFFC, /* IRQL 1 */ @@ -420,11 +420,11 @@ HalpInitializePICs(IN BOOLEAN EnableInterrupts) I8259_ICW4 Icw4; EISA_ELCR Elcr; ULONG i, j; - + /* Save EFlags and disable interrupts */ EFlags = __readeflags(); _disable(); - + /* Initialize ICW1 for master, interval 8, edge-triggered mode with ICW4 */ Icw1.NeedIcw4 = TRUE; Icw1.InterruptMode = EdgeTriggered; @@ -433,16 +433,16 @@ HalpInitializePICs(IN BOOLEAN EnableInterrupts) Icw1.Init = TRUE; Icw1.InterruptVectorAddress = 0; /* This is only used in MCS80/85 mode */ __outbyte(PIC1_CONTROL_PORT, Icw1.Bits); - + /* Set interrupt vector base */ Icw2.Bits = PRIMARY_VECTOR_BASE; __outbyte(PIC1_DATA_PORT, Icw2.Bits); - + /* Connect slave to IRQ 2 */ Icw3.Bits = 0; Icw3.SlaveIrq2 = TRUE; __outbyte(PIC1_DATA_PORT, Icw3.Bits); - + /* Enable 8086 mode, non-automatic EOI, non-buffered mode, non special fully nested mode */ Icw4.Reserved = 0; Icw4.SystemMode = New8086Mode; @@ -450,10 +450,10 @@ HalpInitializePICs(IN BOOLEAN EnableInterrupts) Icw4.BufferedMode = NonBuffered; Icw4.SpecialFullyNestedMode = FALSE; __outbyte(PIC1_DATA_PORT, Icw4.Bits); - + /* Mask all interrupts */ __outbyte(PIC1_DATA_PORT, 0xFF); - + /* Initialize ICW1 for master, interval 8, edge-triggered mode with ICW4 */ Icw1.NeedIcw4 = TRUE; Icw1.InterruptMode = EdgeTriggered; @@ -462,16 +462,16 @@ HalpInitializePICs(IN BOOLEAN EnableInterrupts) Icw1.Init = TRUE; Icw1.InterruptVectorAddress = 0; /* This is only used in MCS80/85 mode */ __outbyte(PIC2_CONTROL_PORT, Icw1.Bits); - + /* Set interrupt vector base */ Icw2.Bits = PRIMARY_VECTOR_BASE + 8; __outbyte(PIC2_DATA_PORT, Icw2.Bits); - + /* Slave ID */ Icw3.Bits = 0; Icw3.SlaveId = 2; __outbyte(PIC2_DATA_PORT, Icw3.Bits); - + /* Enable 8086 mode, non-automatic EOI, non-buffered mode, non special fully nested mode */ Icw4.Reserved = 0; Icw4.SystemMode = New8086Mode; @@ -479,20 +479,20 @@ HalpInitializePICs(IN BOOLEAN EnableInterrupts) Icw4.BufferedMode = NonBuffered; Icw4.SpecialFullyNestedMode = FALSE; __outbyte(PIC2_DATA_PORT, Icw4.Bits); - + /* Mask all interrupts */ __outbyte(PIC2_DATA_PORT, 0xFF); - + /* Read EISA Edge/Level Register for master and slave */ Elcr.Bits = (__inbyte(EISA_ELCR_SLAVE) << 8) | __inbyte(EISA_ELCR_MASTER); - + /* IRQs 0, 1, 2, 8, and 13 are system-reserved and must be edge */ if (!(Elcr.Master.Irq0Level) && !(Elcr.Master.Irq1Level) && !(Elcr.Master.Irq2Level) && !(Elcr.Slave.Irq8Level) && !(Elcr.Slave.Irq13Level)) { /* ELCR is as it's supposed to be, save it */ HalpEisaELCR = Elcr.Bits; - + /* Scan for level interrupts */ for (i = 1, j = 0; j < 16; i <<= 1, j++) { @@ -506,7 +506,7 @@ HalpInitializePICs(IN BOOLEAN EnableInterrupts) } } } - + /* Register IRQ 2 */ HalpRegisterVector(IDT_INTERNAL, PRIMARY_VECTOR_BASE + 2, @@ -561,11 +561,11 @@ KeRaiseIrqlToDpcLevel(VOID) { PKPCR Pcr = KeGetPcr(); KIRQL CurrentIrql; - + /* Save and update IRQL */ CurrentIrql = Pcr->Irql; Pcr->Irql = DISPATCH_LEVEL; - + #if DBG /* Validate correct raise */ if (CurrentIrql > DISPATCH_LEVEL) KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL); @@ -584,11 +584,11 @@ KeRaiseIrqlToSynchLevel(VOID) { PKPCR Pcr = KeGetPcr(); KIRQL CurrentIrql; - + /* Save and update IRQL */ CurrentIrql = Pcr->Irql; Pcr->Irql = SYNCH_LEVEL; - + #if DBG /* Validate correct raise */ if (CurrentIrql > SYNCH_LEVEL) @@ -618,7 +618,7 @@ KfRaiseIrql(IN KIRQL NewIrql) /* Read current IRQL */ CurrentIrql = Pcr->Irql; - + #if DBG /* Validate correct raise */ if (CurrentIrql > NewIrql) @@ -631,7 +631,7 @@ KfRaiseIrql(IN KIRQL NewIrql) /* Set new IRQL */ Pcr->Irql = NewIrql; - + /* Return old IRQL */ return CurrentIrql; } @@ -648,7 +648,7 @@ KfLowerIrql(IN KIRQL OldIrql) ULONG PendingIrql, PendingIrqlMask; PKPCR Pcr = KeGetPcr(); PIC_MASK Mask; - + #if DBG /* Validate correct lower */ if (OldIrql > Pcr->Irql) @@ -658,7 +658,7 @@ KfLowerIrql(IN KIRQL OldIrql) KeBugCheck(IRQL_NOT_LESS_OR_EQUAL); } #endif - + /* Save EFlags and disable interrupts */ EFlags = __readeflags(); _disable(); @@ -707,18 +707,18 @@ HalRequestSoftwareInterrupt(IN KIRQL Irql) ULONG EFlags; PKPCR Pcr = KeGetPcr(); KIRQL PendingIrql; - + /* Save EFlags and disable interrupts */ EFlags = __readeflags(); _disable(); - + /* Mask out the requested bit */ Pcr->IRR |= (1 << Irql); /* Check for pending software interrupts and compare with current IRQL */ PendingIrql = SWInterruptLookUpTable[Pcr->IRR & 3]; if (PendingIrql > Pcr->Irql) SWInterruptHandlerTable[PendingIrql](); - + /* Restore interrupt state */ __writeeflags(EFlags); } @@ -752,10 +752,10 @@ HalpEndSoftwareInterrupt(IN KIRQL OldIrql, /* Check for pending software interrupts and compare with current IRQL */ PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[OldIrql]; if (!PendingIrqlMask) return; - + /* Check for in-service delayed interrupt */ if (Pcr->IrrActive & 0xFFFFFFF0) return; - + /* Check if pending IRQL affects hardware state */ BitScanReverse(&PendingIrql, PendingIrqlMask); if (PendingIrql > DISPATCH_LEVEL) @@ -769,10 +769,10 @@ HalpEndSoftwareInterrupt(IN KIRQL OldIrql, PendingIrqMask = (1 << PendingIrql); Pcr->IrrActive |= PendingIrqMask; Pcr->IRR ^= PendingIrqMask; - + /* Handle delayed hardware interrupt */ SWInterruptHandlerTable[PendingIrql](); - + /* Handling complete */ Pcr->IrrActive ^= PendingIrqMask; } @@ -799,14 +799,14 @@ _HalpDismissIrqGeneric(IN KIRQL Irql, /* First save current IRQL and compare it to the requested one */ CurrentIrql = Pcr->Irql; - + /* Check if this interrupt is really allowed to happen */ if (Irql > CurrentIrql) { /* Set the new IRQL and return the current one */ Pcr->Irql = Irql; *OldIrql = CurrentIrql; - + /* Prepare OCW2 for EOI */ Ocw2.Bits = 0; Ocw2.EoiMode = SpecificEoi; @@ -816,7 +816,7 @@ _HalpDismissIrqGeneric(IN KIRQL Irql, { /* Send the EOI for the IRQ */ __outbyte(PIC2_CONTROL_PORT, Ocw2.Bits | ((Irq - 8) & 0xFF)); - + /* Send the EOI for IRQ2 on the master because this was cascaded */ __outbyte(PIC1_CONTROL_PORT, Ocw2.Bits | 2); } @@ -825,20 +825,20 @@ _HalpDismissIrqGeneric(IN KIRQL Irql, /* Send the EOI for the IRQ */ __outbyte(PIC1_CONTROL_PORT, Ocw2.Bits | (Irq &0xFF)); } - + /* Enable interrupts and return success */ _enable(); return TRUE; } - + /* Update the IRR so that we deliver this interrupt when the IRQL is proper */ Pcr->IRR |= (1 << (Irq + 4)); - + /* Set new PIC mask to real IRQL level, since the optimization is lost now */ Mask.Both = (KiI8259MaskTable[CurrentIrql] | Pcr->IDR) & 0xFFFF; __outbyte(PIC1_DATA_PORT, Mask.Master); __outbyte(PIC2_DATA_PORT, Mask.Slave); - + /* Now lie and say this was spurious */ return FALSE; } @@ -862,16 +862,16 @@ HalpDismissIrq15(IN KIRQL Irql, I8259_OCW3 Ocw3; I8259_OCW2 Ocw2; I8259_ISR Isr; - + /* Request the ISR */ Ocw3.Bits = 0; Ocw3.Sbo = 1; /* This encodes an OCW3 vs. an OCW2 */ Ocw3.ReadRequest = ReadIsr; __outbyte(PIC2_CONTROL_PORT, Ocw3.Bits); - + /* Read the ISR */ Isr.Bits = __inbyte(PIC2_CONTROL_PORT); - + /* Is IRQ15 really active (this is IR7) */ if (Isr.Irq7 == FALSE) { @@ -879,7 +879,7 @@ HalpDismissIrq15(IN KIRQL Irql, Ocw2.Bits = 0; Ocw2.EoiMode = SpecificEoi; __outbyte(PIC1_CONTROL_PORT, Ocw2.Bits | 2); - + /* And now fail since this was spurious */ return FALSE; } @@ -897,7 +897,7 @@ HalpDismissIrq13(IN KIRQL Irql, { /* Clear the FPU busy latch */ __outbyte(0xF0, 0); - + /* Do normal interrupt dismiss */ return _HalpDismissIrqGeneric(Irql, Irq, OldIrql); } @@ -910,19 +910,19 @@ HalpDismissIrq07(IN KIRQL Irql, { I8259_OCW3 Ocw3; I8259_ISR Isr; - + /* Request the ISR */ Ocw3.Bits = 0; Ocw3.Sbo = 1; Ocw3.ReadRequest = ReadIsr; __outbyte(PIC1_CONTROL_PORT, Ocw3.Bits); - + /* Read the ISR */ Isr.Bits = __inbyte(PIC1_CONTROL_PORT); - + /* Is IRQ 7 really active? If it isn't, this is spurious so fail */ if (Isr.Irq7 == FALSE) return FALSE; - + /* Do normal interrupt dismiss */ return _HalpDismissIrqGeneric(Irql, Irq, OldIrql); } @@ -944,13 +944,13 @@ _HalpDismissIrqLevel(IN KIRQL Irql, Mask.Both = (KiI8259MaskTable[Irql] | Pcr->IDR) & 0xFFFF; __outbyte(PIC1_DATA_PORT, Mask.Master); __outbyte(PIC2_DATA_PORT, Mask.Slave); - + /* Update the IRR so that we clear this interrupt when the IRQL is proper */ Pcr->IRR |= (1 << (Irq + 4)); - + /* Save current IRQL */ CurrentIrql = Pcr->Irql; - + /* Prepare OCW2 for EOI */ Ocw2.Bits = 0; Ocw2.EoiMode = SpecificEoi; @@ -976,12 +976,12 @@ _HalpDismissIrqLevel(IN KIRQL Irql, /* Set the new IRQL and return the current one */ Pcr->Irql = Irql; *OldIrql = CurrentIrql; - + /* Enable interrupts and return success */ _enable(); return TRUE; } - + /* Now lie and say this was spurious */ return FALSE; } @@ -1005,16 +1005,16 @@ HalpDismissIrq15Level(IN KIRQL Irql, I8259_OCW3 Ocw3; I8259_OCW2 Ocw2; I8259_ISR Isr; - + /* Request the ISR */ Ocw3.Bits = 0; Ocw3.Sbo = 1; /* This encodes an OCW3 vs. an OCW2 */ Ocw3.ReadRequest = ReadIsr; __outbyte(PIC2_CONTROL_PORT, Ocw3.Bits); - + /* Read the ISR */ Isr.Bits = __inbyte(PIC2_CONTROL_PORT); - + /* Is IRQ15 really active (this is IR7) */ if (Isr.Irq7 == FALSE) { @@ -1022,7 +1022,7 @@ HalpDismissIrq15Level(IN KIRQL Irql, Ocw2.Bits = 0; Ocw2.EoiMode = SpecificEoi; __outbyte(PIC1_CONTROL_PORT, Ocw2.Bits | 2); - + /* And now fail since this was spurious */ return FALSE; } @@ -1039,7 +1039,7 @@ HalpDismissIrq13Level(IN KIRQL Irql, { /* Clear the FPU busy latch */ __outbyte(0xF0, 0); - + /* Do normal interrupt dismiss */ return _HalpDismissIrqLevel(Irql, Irq, OldIrql); } @@ -1052,19 +1052,19 @@ HalpDismissIrq07Level(IN KIRQL Irql, { I8259_OCW3 Ocw3; I8259_ISR Isr; - + /* Request the ISR */ Ocw3.Bits = 0; Ocw3.Sbo = 1; Ocw3.ReadRequest = ReadIsr; __outbyte(PIC1_CONTROL_PORT, Ocw3.Bits); - + /* Read the ISR */ Isr.Bits = __inbyte(PIC1_CONTROL_PORT); - + /* Is IRQ 7 really active? If it isn't, this is spurious so fail */ if (Isr.Irq7 == FALSE) return FALSE; - + /* Do normal interrupt dismiss */ return _HalpDismissIrqLevel(Irql, Irq, OldIrql); } @@ -1074,17 +1074,17 @@ HalpHardwareInterruptLevel(VOID) { PKPCR Pcr = KeGetPcr(); ULONG PendingIrqlMask, PendingIrql; - + /* Check for pending software interrupts and compare with current IRQL */ PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[Pcr->Irql]; if (PendingIrqlMask) { /* Check for in-service delayed interrupt */ if (Pcr->IrrActive & 0xFFFFFFF0) return; - + /* Check if pending IRQL affects hardware state */ BitScanReverse(&PendingIrql, PendingIrqlMask); - + /* Clear IRR bit */ Pcr->IRR ^= (1 << PendingIrql); @@ -1107,24 +1107,24 @@ HalEnableSystemInterrupt(IN ULONG Vector, ULONG Irq; PKPCR Pcr = KeGetPcr(); PIC_MASK PicMask; - + /* Validate the IRQ */ Irq = Vector - PRIMARY_VECTOR_BASE; if (Irq >= CLOCK2_LEVEL) return FALSE; - + /* Check for level interrupt */ if (InterruptMode == LevelSensitive) { /* Switch handler to level */ SWInterruptHandlerTable[Irq + 4] = HalpHardwareInterruptLevel; - + /* Switch dismiss to level */ HalpSpecialDismissTable[Irq] = HalpSpecialDismissLevelTable[Irq]; } - + /* Disable interrupts */ _disable(); - + /* Update software IDR */ Pcr->IDR &= ~(1 << Irq); @@ -1132,7 +1132,7 @@ HalEnableSystemInterrupt(IN ULONG Vector, PicMask.Both = (KiI8259MaskTable[Pcr->Irql] | Pcr->IDR) & 0xFFFF; __outbyte(PIC1_DATA_PORT, PicMask.Master); __outbyte(PIC2_DATA_PORT, PicMask.Slave); - + /* Enable interrupts and exit */ _enable(); return TRUE; @@ -1151,24 +1151,24 @@ HalDisableSystemInterrupt(IN ULONG Vector, /* Compute new combined IRQ mask */ IrqMask = 1 << (Vector - PRIMARY_VECTOR_BASE); - + /* Disable interrupts */ _disable(); - + /* Update software IDR */ KeGetPcr()->IDR |= IrqMask; - + /* Read current interrupt mask */ PicMask.Master = __inbyte(PIC1_DATA_PORT); PicMask.Slave = __inbyte(PIC2_DATA_PORT); - + /* Add the new disabled interrupt */ PicMask.Both |= IrqMask; - + /* Write new interrupt mask */ __outbyte(PIC1_DATA_PORT, PicMask.Master); __outbyte(PIC2_DATA_PORT, PicMask.Slave); - + /* Bring interrupts back */ _enable(); } @@ -1183,7 +1183,7 @@ HalBeginSystemInterrupt(IN KIRQL Irql, OUT PKIRQL OldIrql) { ULONG Irq; - + /* Get the IRQ and call the proper routine to handle it */ Irq = Vector - PRIMARY_VECTOR_BASE; return HalpSpecialDismissTable[Irq](Irql, Irq, OldIrql); @@ -1210,7 +1210,7 @@ HalEndSystemInterrupt(IN KIRQL OldIrql, { /* Check for in-service delayed interrupt */ if (Pcr->IrrActive & 0xFFFFFFF0) return; - + /* Loop checking for pending interrupts */ while (TRUE) { @@ -1222,21 +1222,21 @@ HalEndSystemInterrupt(IN KIRQL OldIrql, Mask.Both = Pcr->IDR & 0xFFFF; __outbyte(PIC1_DATA_PORT, Mask.Master); __outbyte(PIC2_DATA_PORT, Mask.Slave); - + /* Now check if this specific interrupt is already in-service */ PendingIrqMask = (1 << PendingIrql); if (Pcr->IrrActive & PendingIrqMask) return; - + /* Set active bit otherwise, and clear it from IRR */ Pcr->IrrActive |= PendingIrqMask; Pcr->IRR ^= PendingIrqMask; - + /* Handle delayed hardware interrupt */ SWInterruptHandlerTable[PendingIrql](); - + /* Handling complete */ Pcr->IrrActive ^= PendingIrqMask; - + /* Check if there's still interrupts pending */ PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[Pcr->Irql]; if (!PendingIrqlMask) break; @@ -1259,7 +1259,7 @@ _HalpApcInterruptHandler(IN PKTRAP_FRAME TrapFrame) { KIRQL CurrentIrql; PKPCR Pcr = KeGetPcr(); - + /* Save the current IRQL and update it */ CurrentIrql = Pcr->Irql; Pcr->Irql = APC_LEVEL; @@ -1300,10 +1300,10 @@ HalpApcInterruptHandler(IN PKTRAP_FRAME TrapFrame) TrapFrame->EFlags = __readeflags(); TrapFrame->SegCs = KGDT_R0_CODE; TrapFrame->Eip = TrapFrame->Eax; - + /* Build the trap frame */ KiEnterInterruptTrap(TrapFrame); - + /* Do the work */ _HalpApcInterruptHandler(TrapFrame); } @@ -1314,19 +1314,19 @@ _HalpDispatchInterruptHandler(VOID) { KIRQL CurrentIrql; PKPCR Pcr = KeGetPcr(); - + /* Save the current IRQL and update it */ CurrentIrql = Pcr->Irql; Pcr->Irql = DISPATCH_LEVEL; - + /* Remove DPC from IRR */ Pcr->IRR &= ~(1 << DISPATCH_LEVEL); - + /* Enable interrupts and call the kernel's DPC interrupt handler */ _enable(); KiDispatchInterrupt(); _disable(); - + /* Return IRQL */ return CurrentIrql; } @@ -1337,13 +1337,13 @@ FASTCALL HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame) { KIRQL CurrentIrql; - + /* Do the work */ CurrentIrql = _HalpDispatchInterruptHandler(); - + /* End the interrupt */ HalpEndSoftwareInterrupt(CurrentIrql, TrapFrame); - + /* Exit the interrupt */ KiEoiHelper(TrapFrame); } @@ -1358,7 +1358,7 @@ HalpDispatchInterrupt2(VOID) /* Do the work */ OldIrql = _HalpDispatchInterruptHandler(); - + /* Restore IRQL */ Pcr->Irql = OldIrql; @@ -1374,7 +1374,7 @@ HalpDispatchInterrupt2(VOID) Mask.Both = Pcr->IDR & 0xFFFF; __outbyte(PIC1_DATA_PORT, Mask.Master); __outbyte(PIC2_DATA_PORT, Mask.Slave); - + /* Clear IRR bit */ Pcr->IRR ^= (1 << PendingIrql); } From b6d994d577ed50b984d6eba2898457b774d78750 Mon Sep 17 00:00:00 2001 From: Rafal Harabien Date: Wed, 8 Feb 2012 19:03:43 +0000 Subject: [PATCH 262/289] [SHELL32] - Fix warnings in MSVC svn path=/trunk/; revision=55497 --- reactos/dll/win32/shell32/pidl.cpp | 14 ++++++++------ reactos/dll/win32/shell32/pidl.h | 4 ++-- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/reactos/dll/win32/shell32/pidl.cpp b/reactos/dll/win32/shell32/pidl.cpp index 6da6d68dad3..d4e33742381 100644 --- a/reactos/dll/win32/shell32/pidl.cpp +++ b/reactos/dll/win32/shell32/pidl.cpp @@ -1463,8 +1463,8 @@ LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID) LPITEMIDLIST _ILCreateFromFindDataW( const WIN32_FIND_DATAW *wfd ) { - char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ - DWORD len, len1, wlen, alen; + char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ + DWORD len, len1, wlen, alen, cbData; LPITEMIDLIST pidl; PIDLTYPE type; @@ -1481,8 +1481,10 @@ LPITEMIDLIST _ILCreateFromFindDataW( const WIN32_FIND_DATAW *wfd ) type = (wfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : PT_VALUE; wlen = wcslen(wfd->cFileName) + 1; - pidl = _ILAlloc(type, sizeof(FileStruct) + (alen + (alen & 1)) + - sizeof(FileStructW) + wlen * sizeof(WCHAR) + sizeof(WORD)); + cbData = sizeof(FileStruct) - 1 + (alen + (alen & 1)); // Note: szNames field is initially 1 byte long + cbData += sizeof(FileStructW) - 1 + wlen * sizeof(WCHAR); // Note: wszName field is initially 1 byte long + cbData += sizeof(WORD); // offset to FileStructW + pidl = _ILAlloc(type, cbData); if (pidl) { LPPIDLDATA pData = _ILGetDataPointer(pidl); @@ -1496,7 +1498,7 @@ LPITEMIDLIST _ILCreateFromFindDataW( const WIN32_FIND_DATAW *wfd ) memcpy(fs->szNames, buff, alen); fsw = (FileStructW*)(pData->u.file.szNames + alen + (alen & 0x1)); - fsw->cbLen = sizeof(FileStructW) + wlen * sizeof(WCHAR) + sizeof(WORD); + fsw->cbLen = sizeof(FileStructW) - 1 + wlen * sizeof(WCHAR) + sizeof(WORD); FileTimeToDosDateTime( &wfd->ftCreationTime, &fsw->uCreationDate, &fsw->uCreationTime); FileTimeToDosDateTime( &wfd->ftLastAccessTime, &fsw->uLastAccessDate, &fsw->uLastAccessTime); memcpy(fsw->wszName, wfd->cFileName, wlen * sizeof(WCHAR)); @@ -2115,7 +2117,7 @@ FileStructW* _ILGetFileStructW(LPCITEMIDLIST pidl) { cbOffset > pidl->mkid.cb - sizeof(cbOffset) - sizeof(FileStructW) || pidl->mkid.cb != cbOffset + pFileStructW->cbLen) { - WARN("Invalid pidl format (cbOffset = %d)!\n", cbOffset); + ERR("Invalid pidl format (cbOffset = %d)!\n", cbOffset); return NULL; } diff --git a/reactos/dll/win32/shell32/pidl.h b/reactos/dll/win32/shell32/pidl.h index fb3f37694ad..99c21b88ff4 100644 --- a/reactos/dll/win32/shell32/pidl.h +++ b/reactos/dll/win32/shell32/pidl.h @@ -164,7 +164,7 @@ typedef struct tagFileStruct WORD uFileDate; /*06*/ WORD uFileTime; /*08*/ WORD uFileAttribs; /*10*/ - CHAR szNames[0]; /*12*/ + CHAR szNames[1]; /*12*/ /* Here are coming two strings. The first is the long name. The second the dos name when needed or just 0x00 */ } FileStruct; @@ -180,7 +180,7 @@ typedef struct tagFileStructW { WORD uLastAccessDate; WORD uLastAccessTime; BYTE dummy2[4]; - WCHAR wszName[0]; + WCHAR wszName[1]; } FileStructW; typedef struct tagValueW From 9e03b926315f19ba514342c0a6af1712e32a9ac6 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Feb 2012 21:38:53 +0000 Subject: [PATCH 263/289] [SHELL32] Fix 64 bit MSVC build, fix some warnings svn path=/trunk/; revision=55498 --- reactos/dll/win32/shell32/drvdefext.cpp | 15 +++++----- reactos/dll/win32/shell32/shellole.cpp | 40 ++++++++++++------------- reactos/include/psdk/shlobj.h | 18 +++++------ 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/reactos/dll/win32/shell32/drvdefext.cpp b/reactos/dll/win32/shell32/drvdefext.cpp index 79d7abc4e32..32706b4c7f6 100644 --- a/reactos/dll/win32/shell32/drvdefext.cpp +++ b/reactos/dll/win32/shell32/drvdefext.cpp @@ -44,7 +44,8 @@ UINT SH_FormatByteSize(LONGLONG cbSize, LPWSTR pwszResult, UINT cchResultMax); static VOID GetDriveNameWithLetter(LPWSTR pwszText, UINT cchTextMax, LPCWSTR pwszDrive) { - DWORD dwMaxComp, dwFileSys, cchText = 0; + DWORD dwMaxComp, dwFileSys; + SIZE_T cchText = 0; if (GetVolumeInformationW(pwszDrive, pwszText, cchTextMax, NULL, &dwMaxComp, &dwFileSys, NULL, 0)) { @@ -219,8 +220,8 @@ CDrvDefExt::PaintStaticControls(HWND hwndDlg, LPDRAWITEMSTRUCT pDrawItem) TRACE("FreeSpace %u a %f cx %d\n", m_FreeSpacePerc, M_PI+m_FreeSpacePerc/100.0f*M_PI*2.0f, cx); HBRUSH hbrOld = (HBRUSH)SelectObject(pDrawItem->hDC, hMagBrush); - INT xRadial = xCenter + (INT)(cosf(M_PI+m_FreeSpacePerc/100.0f*M_PI*2.0f)*cx/2); - INT yRadial = yCenter - (INT)(sinf(M_PI+m_FreeSpacePerc/100.0f*M_PI*2.0f)*cy/2); + INT xRadial = xCenter + (INT)(cos(M_PI+m_FreeSpacePerc/100.0f*M_PI*2.0f)*cx/2); + INT yRadial = yCenter - (INT)(sin(M_PI+m_FreeSpacePerc/100.0f*M_PI*2.0f)*cy/2); Pie(pDrawItem->hDC, pDrawItem->rcItem.left, pDrawItem->rcItem.top, pDrawItem->rcItem.right, pDrawItem->rcItem.bottom - 10, @@ -241,8 +242,8 @@ CDrvDefExt::PaintStaticControls(HWND hwndDlg, LPDRAWITEMSTRUCT pDrawItem) if (m_FreeSpacePerc < 50 && x == xRadial) SelectObject(pDrawItem->hDC, hDarkMagPen); - float cos_val = (x - xCenter)*2.0f/cx; - INT y = yCenter+sinf(acosf(cos_val))*cy/2; + double cos_val = (x - xCenter)*2.0f/cx; + INT y = yCenter+(INT)sin(acos(cos_val))*cy/2; MoveToEx(pDrawItem->hDC, x, y, NULL); LineTo(pDrawItem->hDC, x, y + 10); } @@ -390,7 +391,7 @@ CDrvDefExt::GeneralPageProc( { /* Property Sheet */ LPPSHNOTIFY lppsn = (LPPSHNOTIFY)lParam; - + if (lppsn->hdr.code == PSN_APPLY) { CDrvDefExt *pDrvDefExt = (CDrvDefExt*)GetWindowLongPtr(hwndDlg, DWLP_USER); @@ -505,7 +506,7 @@ CDrvDefExt::CDrvDefExt() CDrvDefExt::~CDrvDefExt() { - + } HRESULT WINAPI diff --git a/reactos/dll/win32/shell32/shellole.cpp b/reactos/dll/win32/shell32/shellole.cpp index c4f1b50a202..5ad879e5ff9 100644 --- a/reactos/dll/win32/shell32/shellole.cpp +++ b/reactos/dll/win32/shell32/shellole.cpp @@ -248,7 +248,7 @@ HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal) * SEE ALSO * CoTaskMemAlloc, SHLoadOLE */ -LPVOID WINAPI SHAlloc(DWORD len) +LPVOID WINAPI SHAlloc(SIZE_T len) { LPVOID ret; @@ -596,7 +596,7 @@ EXTERN_C HRESULT WINAPI SHPropStgCreate(IPropertySetStorage *psstg, REFFMTID fmt grfFlags, grfMode, dwDisposition, ppstg, puCodePage); hres = psstg->Open(fmtid, grfMode, ppstg); - + switch (dwDisposition) { case CREATE_ALWAYS: @@ -608,16 +608,16 @@ EXTERN_C HRESULT WINAPI SHPropStgCreate(IPropertySetStorage *psstg, REFFMTID fmt return hres; hres = E_FAIL; } - + case OPEN_ALWAYS: case CREATE_NEW: if (FAILED(hres)) hres = psstg->Create(fmtid, pclsid, grfFlags, grfMode, ppstg); - + case OPEN_EXISTING: if (FAILED(hres)) return hres; - + if (puCodePage) { prop.ulKind = PRSPEC_PROPID; @@ -629,7 +629,7 @@ EXTERN_C HRESULT WINAPI SHPropStgCreate(IPropertySetStorage *psstg, REFFMTID fmt *puCodePage = ret.iVal; } } - + return S_OK; } @@ -641,32 +641,32 @@ EXTERN_C HRESULT WINAPI SHPropStgReadMultiple(IPropertyStorage *pps, UINT uCodeP { STATPROPSETSTG stat; HRESULT hres; - + FIXME("%p %u %u %p %p\n", pps, uCodePage, cpspec, rgpspec, rgvar); - + memset(rgvar, 0, cpspec*sizeof(PROPVARIANT)); hres = pps->ReadMultiple(cpspec, rgpspec, rgvar); if (FAILED(hres)) return hres; - + if (!uCodePage) { PROPSPEC prop; PROPVARIANT ret; - + prop.ulKind = PRSPEC_PROPID; prop.propid = PID_CODEPAGE; hres = pps->ReadMultiple(1, &prop, &ret); if(FAILED(hres) || ret.vt!=VT_I2) return S_OK; - + uCodePage = ret.iVal; } - + hres = pps->Stat(&stat); if (FAILED(hres)) return S_OK; - + /* TODO: do something with codepage and stat */ return S_OK; } @@ -680,20 +680,20 @@ EXTERN_C HRESULT WINAPI SHPropStgWriteMultiple(IPropertyStorage *pps, UINT *uCod STATPROPSETSTG stat; UINT codepage; HRESULT hres; - + FIXME("%p %p %u %p %p %d\n", pps, uCodePage, cpspec, rgpspec, rgvar, propidNameFirst); - + hres = pps->Stat(&stat); if (FAILED(hres)) return hres; - + if (uCodePage && *uCodePage) codepage = *uCodePage; else { PROPSPEC prop; PROPVARIANT ret; - + prop.ulKind = PRSPEC_PROPID; prop.propid = PID_CODEPAGE; hres = pps->ReadMultiple(1, &prop, &ret); @@ -701,14 +701,14 @@ EXTERN_C HRESULT WINAPI SHPropStgWriteMultiple(IPropertyStorage *pps, UINT *uCod return hres; if (ret.vt!=VT_I2 || !ret.iVal) return E_FAIL; - + codepage = ret.iVal; if (uCodePage) *uCodePage = codepage; } - + /* TODO: do something with codepage and stat */ - + hres = pps->WriteMultiple(cpspec, rgpspec, rgvar, propidNameFirst); return hres; } diff --git a/reactos/include/psdk/shlobj.h b/reactos/include/psdk/shlobj.h index 04a0d076655..ff1599d5c8f 100644 --- a/reactos/include/psdk/shlobj.h +++ b/reactos/include/psdk/shlobj.h @@ -82,7 +82,7 @@ DECLARE_HANDLE(HPSXA); #endif UINT WINAPI SHAddFromPropSheetExtArray(HPSXA,LPFNADDPROPSHEETPAGE,LPARAM); -LPVOID WINAPI SHAlloc(ULONG) __WINE_ALLOC_SIZE(1); +LPVOID WINAPI SHAlloc(SIZE_T) __WINE_ALLOC_SIZE(1); HRESULT WINAPI SHCoCreateInstance(LPCWSTR,const CLSID*,IUnknown*,REFIID,LPVOID*); HPSXA WINAPI SHCreatePropSheetExtArray(HKEY,LPCWSTR,UINT); HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY,LPCWSTR,UINT,IDataObject*); @@ -1812,7 +1812,7 @@ HRESULT WINAPI CIDLData_CreateFromIDArray( * SHOpenWithDialog */ -enum tagOPEN_AS_INFO_FLAGS +enum tagOPEN_AS_INFO_FLAGS { OAIF_ALLOW_REGISTRATION = 1, OAIF_REGISTER_EXT = 2, @@ -1871,14 +1871,14 @@ DECLARE_INTERFACE_(IShellIconOverlayIdentifier, IUnknown) * Travel log */ -#define TLOG_BACK -1 -#define TLOG_FORE 1 +#define TLOG_BACK -1 +#define TLOG_FORE 1 -#define TLMENUF_INCLUDECURRENT 0x00000001 -#define TLMENUF_CHECKCURRENT (TLMENUF_INCLUDECURRENT | 0x00000002) -#define TLMENUF_BACK 0x00000010 // Default -#define TLMENUF_FORE 0x00000020 -#define TLMENUF_BACKANDFORTH (TLMENUF_BACK | TLMENUF_FORE | TLMENUF_INCLUDECURRENT) +#define TLMENUF_INCLUDECURRENT 0x00000001 +#define TLMENUF_CHECKCURRENT (TLMENUF_INCLUDECURRENT | 0x00000002) +#define TLMENUF_BACK 0x00000010 // Default +#define TLMENUF_FORE 0x00000020 +#define TLMENUF_BACKANDFORTH (TLMENUF_BACK | TLMENUF_FORE | TLMENUF_INCLUDECURRENT) /***************************************************************************** * IDockingWindowSite interface From f1831b3bac63fd0baa1fbeec849567cfeb4d8bbd Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 8 Feb 2012 21:53:00 +0000 Subject: [PATCH 264/289] [SM Headers]: Fix a few typos. svn path=/trunk/; revision=55499 --- reactos/include/reactos/subsys/sm/smmsg.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/reactos/include/reactos/subsys/sm/smmsg.h b/reactos/include/reactos/subsys/sm/smmsg.h index f756fc7da10..b95841e8b03 100644 --- a/reactos/include/reactos/subsys/sm/smmsg.h +++ b/reactos/include/reactos/subsys/sm/smmsg.h @@ -55,7 +55,7 @@ typedef struct _SM_EXEC_PGM_MSG { RTL_USER_PROCESS_INFORMATION ProcessInformation; BOOLEAN DebugFlag; -} SM_EXEC_PGM_MSG, *PM_EXEC_PGM_MSG; +} SM_EXEC_PGM_MSG, *PSM_EXEC_PGM_MSG; #ifndef _WIN64 C_ASSERT(sizeof(SM_EXEC_PGM_MSG) == 0x48); #endif @@ -135,6 +135,9 @@ typedef struct _SB_CREATE_SESSION_MSG { ULONG SessionId; RTL_USER_PROCESS_INFORMATION ProcessInfo; + ULONG Unknown; + ULONG MuSessionId; + CLIENT_ID ClientId; } SB_CREATE_SESSION_MSG, *PSB_CREATE_SESSION_MSG; typedef struct _SB_TERMINATE_SESSION_MSG From 17492f909720ee800e3448bdb33b96130f9a2a09 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 8 Feb 2012 21:56:23 +0000 Subject: [PATCH 265/289] [CSRSRV]: The connection with SMSS(2) should be done after initialization, not before. This is because in SMSS2, there is no "Complete" API -- you are assumed to be ready when you connect, instead of connecting + completing later. Should not break SMSS behavior, but required for SMSS2. [CSRSRV]: Fix many bugs in ServerSbApiPortThread. This function never worked as SMSS never actually connects to the SB API Port. Since SMSS2 does, a few bugs were discovered. Also, hack-plement the one SB API that is required for SMSS2 (SbpCreateSession). All we do is resume the thread we receive (Winlogon)... normally we'd also register a hard-error port, etc. [CSRSRV]: If connecting with SMDLL to SMSS did not work (such as on my system where SMSS is no longer there), try using SMLIB and SMSS2 instead. This way CSRSS still works with both environments. [CSRSRV]: Required rbuild/cmake changes to build with SMLIB. svn path=/trunk/; revision=55500 --- .../win32/csrss/csrsrv/CMakeLists.txt | 2 +- .../subsystems/win32/csrss/csrsrv/api/wapi.c | 30 +++++++++++++++---- .../win32/csrss/csrsrv/csrsrv.rbuild | 1 + reactos/subsystems/win32/csrss/csrsrv/init.c | 17 +++++++---- reactos/subsystems/win32/csrss/csrsrv/srv.h | 1 + 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/reactos/subsystems/win32/csrss/csrsrv/CMakeLists.txt b/reactos/subsystems/win32/csrss/csrsrv/CMakeLists.txt index 6d96ca4c6b5..148f6e64633 100644 --- a/reactos/subsystems/win32/csrss/csrsrv/CMakeLists.txt +++ b/reactos/subsystems/win32/csrss/csrsrv/CMakeLists.txt @@ -15,7 +15,7 @@ list(APPEND SOURCE add_library(csrsrv SHARED ${SOURCE}) -target_link_libraries(csrsrv ${PSEH_LIB}) +target_link_libraries(csrsrv ${PSEH_LIB} smlib) set_module_type(csrsrv nativedll) diff --git a/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c b/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c index e856b3050d2..897f9051767 100644 --- a/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c +++ b/reactos/subsystems/win32/csrss/csrsrv/api/wapi.c @@ -767,7 +767,7 @@ DWORD WINAPI ServerSbApiPortThread (HANDLE hSbApiPortListen) { HANDLE hConnectedPort = (HANDLE) 0; - PORT_MESSAGE Request; + SB_API_MSG Request; PVOID Context = NULL; NTSTATUS Status = STATUS_SUCCESS; PPORT_MESSAGE Reply = NULL; @@ -775,7 +775,7 @@ ServerSbApiPortThread (HANDLE hSbApiPortListen) DPRINT("CSR: %s called\n", __FUNCTION__); RtlZeroMemory(&Request, sizeof(PORT_MESSAGE)); - Status = NtListenPort (hSbApiPortListen, & Request); + Status = NtListenPort (hSbApiPortListen, & Request.h); if (!NT_SUCCESS(Status)) { @@ -785,7 +785,7 @@ ServerSbApiPortThread (HANDLE hSbApiPortListen) DPRINT("-- 1\n"); Status = NtAcceptConnectPort(&hConnectedPort, NULL, - &Request, + &Request.h, TRUE, NULL, NULL); @@ -819,7 +819,7 @@ ServerSbApiPortThread (HANDLE hSbApiPortListen) Status = NtReplyWaitReceivePort(hConnectedPort, Context, Reply, - &Request); + &Request.h); if(!NT_SUCCESS(Status)) { DPRINT1("CSR: %s: NtReplyWaitReceivePort failed (Status=0x%08lx)\n", @@ -827,12 +827,30 @@ ServerSbApiPortThread (HANDLE hSbApiPortListen) break; } - switch (Request.u2.s2.Type) //fix .h PORT_MESSAGE_TYPE(Request)) + switch (Request.h.u2.s2.Type) //fix .h PORT_MESSAGE_TYPE(Request)) { /* TODO */ + case LPC_PORT_CLOSED: + case LPC_CLIENT_DIED: + DPRINT1("CSR: SMSS died\n"); + Reply = NULL; + break; + default: DPRINT1("CSR: %s received message (type=%d)\n", - __FUNCTION__, Request.u2.s2.Type); + __FUNCTION__, Request.h.u2.s2.Type); + + if (Request.ApiNumber == SbpCreateSession) + { + DPRINT("Session create... legacy CSRSS resuming thread as minimum work done\n"); + Request.ReturnValue = NtResumeThread(Request.CreateSession.ProcessInfo.ThreadHandle, NULL); + } + else + { + DPRINT1("CSR: %d Not implemented in legacy CSRSS... faking success\n", Request.ApiNumber); + Request.ReturnValue = STATUS_SUCCESS; + } + Reply = &Request.h; } DPRINT("-- 5\n"); } diff --git a/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild index 987ed18944d..49ff4de115c 100644 --- a/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild +++ b/reactos/subsystems/win32/csrss/csrsrv/csrsrv.rbuild @@ -9,6 +9,7 @@ ntdll pseh smdll + smlib process.c user.c diff --git a/reactos/subsystems/win32/csrss/csrsrv/init.c b/reactos/subsystems/win32/csrss/csrsrv/init.c index fde310f4f25..cf7b7a7c0a3 100644 --- a/reactos/subsystems/win32/csrss/csrsrv/init.c +++ b/reactos/subsystems/win32/csrss/csrsrv/init.c @@ -383,9 +383,9 @@ CsrpCreateListenPort (IN LPWSTR Name, NULL); Status = NtCreatePort ( Port, & PortAttributes, - LPC_MAX_DATA_LENGTH, /* TODO: make caller set it*/ - LPC_MAX_MESSAGE_LENGTH, /* TODO: make caller set it*/ - 0); /* TODO: make caller set it*/ + sizeof(SB_CONNECTION_INFO), + sizeof(SB_API_MSG), + 32 * sizeof(SB_API_MSG)); if(!NT_SUCCESS(Status)) { DPRINT1("CSR: %s: NtCreatePort failed (Status=%08lx)\n", @@ -540,6 +540,7 @@ CsrpCreateCallbackPort (int argc, char ** argv, char ** envp) /********************************************************************** * CsrpRegisterSubsystem/3 */ +BOOLEAN g_ModernSm; static NTSTATUS CsrpRegisterSubsystem (int argc, char ** argv, char ** envp) { @@ -579,6 +580,11 @@ CsrpRegisterSubsystem (int argc, char ** argv, char ** envp) hSbApiPort, IMAGE_SUBSYSTEM_WINDOWS_CUI, & hSmApiPort); + if (!NT_SUCCESS(Status)) + { + Status = SmConnectToSm(&Name, hSbApiPort, IMAGE_SUBSYSTEM_WINDOWS_GUI, &hSmApiPort); + g_ModernSm = TRUE; + } if(!NT_SUCCESS(Status)) { DPRINT("CSR: %s unable to connect to the SM (Status=0x%08lx)\n", @@ -698,6 +704,7 @@ CsrpRunWinlogon (int argc, char ** argv, char ** envp) DPRINT("CSR: %s called\n", __FUNCTION__); + if (g_ModernSm) return STATUS_SUCCESS; /* initialize the process parameters */ RtlInitUnicodeString (& ImagePath, L"\\SystemRoot\\system32\\winlogon.exe"); @@ -749,8 +756,6 @@ struct { PCHAR ErrorMessage; } InitRoutine [] = { {TRUE, CsrpCreateBNODirectory, "create base named objects directory"}, - {TRUE, CsrpCreateCallbackPort, "create the callback port \\Windows\\SbApiPort"}, - {TRUE, CsrpRegisterSubsystem, "register with SM"}, {TRUE, CsrpCreateHeap, "create the CSR heap"}, {TRUE, CsrpCreateApiPort, "create the api port \\Windows\\ApiPort"}, {TRUE, CsrpCreateHardErrorPort, "create the hard error port"}, @@ -760,6 +765,8 @@ struct { {TRUE, CsrpApiRegisterDef, "initialize api definitions"}, {TRUE, CsrpCCTS, "connect client to server"}, {TRUE, CsrpInitWin32Csr, "load usermode dll"}, + {TRUE, CsrpCreateCallbackPort, "create the callback port \\Windows\\SbApiPort"}, + {TRUE, CsrpRegisterSubsystem, "register with SM"}, {TRUE, CsrpRunWinlogon, "run WinLogon"}, }; diff --git a/reactos/subsystems/win32/csrss/csrsrv/srv.h b/reactos/subsystems/win32/csrss/csrsrv/srv.h index 204d4ea9324..981fdf84d13 100644 --- a/reactos/subsystems/win32/csrss/csrsrv/srv.h +++ b/reactos/subsystems/win32/csrss/csrsrv/srv.h @@ -23,6 +23,7 @@ /* Subsystem Manager Header */ #include +#include /* Internal CSRSS Headers */ #include From e856535365d4e5f357aa88329dabd22383a44008 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 8 Feb 2012 22:05:53 +0000 Subject: [PATCH 266/289] [SMSS2]: Implement (not yet used) Session Management APIs. svn path=/trunk/; revision=55501 --- reactos/base/system/smss2/smsessn.c | 141 +++++++++++++++++++++++++++- 1 file changed, 140 insertions(+), 1 deletion(-) diff --git a/reactos/base/system/smss2/smsessn.c b/reactos/base/system/smss2/smsessn.c index c8d44558013..6cee473dc79 100644 --- a/reactos/base/system/smss2/smsessn.c +++ b/reactos/base/system/smss2/smsessn.c @@ -14,6 +14,14 @@ /* GLOBALS ********************************************************************/ +typedef struct _SMP_SESSION +{ + LIST_ENTRY Entry; + ULONG SessionId; + PSMP_SUBSYSTEM Subsystem; + PSMP_SUBSYSTEM OtherSubsystem; +} SMP_SESSION, *PSMP_SESSION; + RTL_CRITICAL_SECTION SmpSessionListLock; LIST_ENTRY SmpSessionListHead; ULONG SmpNextSessionId; @@ -23,6 +31,137 @@ HANDLE SmpSessionsObjectDirectory; /* FUNCTIONS ******************************************************************/ +BOOLEAN +NTAPI +SmpCheckDuplicateMuSessionId(IN ULONG MuSessionId) +{ + PSMP_SUBSYSTEM Subsystem; + BOOLEAN FoundDuplicate = FALSE; + PLIST_ENTRY NextEntry; + + /* Lock the subsystem database */ + RtlEnterCriticalSection(&SmpKnownSubSysLock); + + /* Scan each entry */ + NextEntry = SmpKnownSubSysHead.Flink; + while (NextEntry != &SmpKnownSubSysHead) + { + /* Check if this entry has the same session ID */ + Subsystem = CONTAINING_RECORD(NextEntry, SMP_SUBSYSTEM, Entry); + if (Subsystem->MuSessionId == MuSessionId) + { + /* Break out of here! */ + FoundDuplicate = TRUE; + break; + } + + /* Keep going */ + NextEntry = NextEntry->Flink; + } + + /* Release the database and return the result */ + RtlLeaveCriticalSection(&SmpKnownSubSysLock); + return FoundDuplicate; +} + +PSMP_SESSION +NTAPI +SmpSessionIdToSession(IN ULONG SessionId) +{ + PSMP_SESSION Session, FoundSession = NULL; + PLIST_ENTRY NextEntry; + + /* Loop the session list -- lock must already be held! */ + NextEntry = SmpSessionListHead.Flink; + while (NextEntry != &SmpSessionListHead) + { + /* Check if this session's ID matches */ + Session = CONTAINING_RECORD(NextEntry, SMP_SESSION, Entry); + if (Session->SessionId == SessionId) + { + /* Set this as the found session and break out */ + FoundSession = Session; + break; + } + + /* Keep going */ + NextEntry = NextEntry->Flink; + } + + /* Return the session that was found and exit */ + return FoundSession; +} + +VOID +NTAPI +SmpDeleteSession(IN ULONG SessionId) +{ + PSMP_SESSION Session; + + /* Enter the lock and get the session structure */ + RtlEnterCriticalSection(&SmpSessionListLock); + Session = SmpSessionIdToSession(SessionId); + if (Session) + { + /* Remove it from the list */ + RemoveEntryList(&Session->Entry); + RtlLeaveCriticalSection(&SmpSessionListLock); + + /* Now free the structure outside of the lock */ + RtlFreeHeap(SmpHeap, 0, Session); + } + else + { + /* ID doesn't map to one of our structures, nothing to do... */ + RtlLeaveCriticalSection(&SmpSessionListLock); + } +} + +ULONG +NTAPI +SmpAllocateSessionId(IN PSMP_SUBSYSTEM Subsystem, + IN PSMP_SUBSYSTEM OtherSubsystem) +{ + ULONG SessionId; + PSMP_SESSION Session; + + /* Allocate a new ID while under the lock */ + RtlEnterCriticalSection(&SmpSessionListLock); + SessionId = SmpNextSessionId++; + + /* Check for overflow */ + if (SmpNextSessionIdScanMode) + { + /* Break if it happened */ + DbgPrint("SMSS: SessionId's Wrapped\n"); + DbgBreakPoint(); + } + else + { + /* Detect it for next time */ + if (!SmpNextSessionId) SmpNextSessionIdScanMode = 1; + } + + /* Allocate a session structure */ + Session = RtlAllocateHeap(SmpHeap, 0, sizeof(SMP_SESSION)); + if (Session) + { + /* Write the session data and insert it into the session list */ + Session->Subsystem = Subsystem; + Session->SessionId = SessionId; + Session->OtherSubsystem = OtherSubsystem; + InsertTailList(&SmpSessionListHead, &Session->Entry); + } + else + { + DPRINT1("SMSS: Unable to keep track of session ID -- no memory available\n"); + } + + /* Release the session lock */ + RtlLeaveCriticalSection(&SmpSessionListLock); + return SessionId; +} + NTSTATUS NTAPI SmpGetProcessMuSessionId(IN HANDLE ProcessHandle, @@ -49,7 +188,7 @@ SmpGetProcessMuSessionId(IN HANDLE ProcessHandle, ProcessHandle, Status); *SessionId = 0; } - + /* Return result */ return Status; } From 5eeb447451df579f72575d4b7a5576c8215156ae Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Feb 2012 22:11:02 +0000 Subject: [PATCH 267/289] [SMLIB] "Fix" 64 bit compilation svn path=/trunk/; revision=55503 --- reactos/lib/smlib/smclient.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/lib/smlib/smclient.c b/reactos/lib/smlib/smclient.c index 8cae30e9971..24a5f0a25a6 100644 --- a/reactos/lib/smlib/smclient.c +++ b/reactos/lib/smlib/smclient.c @@ -24,7 +24,7 @@ SmExecPgm(IN HANDLE SmApiPort, NTSTATUS Status; SM_API_MSG SmApiMsg; -#ifdef _WIN64 // You can take care of this Timo +#if 0 //def _WIN64 // You can take care of this Timo /* 64-bit SMSS needs to talk to 32-bit processes so do the LPC conversion */ if (SmpIsWow64Process()) { From 683b30a149149aab4e8d8e556ce98ac8fd072cad Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Feb 2012 22:15:06 +0000 Subject: [PATCH 268/289] [XDK/DDK] Slightly reorganize architecture dependent headers, so that ASSERT can be used [CRT] Use some definitions only for vista+, since 2k3 msvcrt doesn't have them svn path=/trunk/; revision=55504 --- reactos/include/crt/math.h | 5 +- reactos/include/ddk/wdm.h | 1121 ++++++++++++++-------------- reactos/include/xdk/kefuncs.h | 16 + reactos/include/xdk/wdm.template.h | 17 - 4 files changed, 579 insertions(+), 580 deletions(-) diff --git a/reactos/include/crt/math.h b/reactos/include/crt/math.h index 83a1ea2e1f9..6b7d1db7861 100644 --- a/reactos/include/crt/math.h +++ b/reactos/include/crt/math.h @@ -124,8 +124,9 @@ extern "C" { __CRT_INLINE long double tanl(long double x) { return (tan((double)x)); } #endif -#if defined(__x86_64) || defined(_M_AMD64) || \ - defined (__ia64__) || defined (_M_IA64) +#if (_WIN32_WINNT >= 0x600) && \ + (defined(__x86_64) || defined(_M_AMD64) || \ + defined (__ia64__) || defined (_M_IA64)) _CRTIMP float __cdecl acosf(float x); _CRTIMP float __cdecl asinf(float x); _CRTIMP float __cdecl atanf(float x); diff --git a/reactos/include/ddk/wdm.h b/reactos/include/ddk/wdm.h index a3bfa4b4b0e..5daea6daab1 100644 --- a/reactos/include/ddk/wdm.h +++ b/reactos/include/ddk/wdm.h @@ -1597,567 +1597,6 @@ extern PCCHAR KeNumberProcessors; #endif - -#if defined(_M_IX86) -/** Kernel definitions for x86 **/ - -/* Interrupt request levels */ -#define PASSIVE_LEVEL 0 -#define LOW_LEVEL 0 -#define APC_LEVEL 1 -#define DISPATCH_LEVEL 2 -#define CMCI_LEVEL 5 -#define PROFILE_LEVEL 27 -#define CLOCK1_LEVEL 28 -#define CLOCK2_LEVEL 28 -#define IPI_LEVEL 29 -#define POWER_LEVEL 30 -#define HIGH_LEVEL 31 -#define CLOCK_LEVEL CLOCK2_LEVEL - -#define KIP0PCRADDRESS 0xffdff000 -#define KI_USER_SHARED_DATA 0xffdf0000 -#define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA) - -#define PAGE_SIZE 0x1000 -#define PAGE_SHIFT 12L -#define KeGetDcacheFillSize() 1L - -#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 ControlWord; - ULONG StatusWord; - ULONG ErrorOffset; - ULONG ErrorSelector; - ULONG DataOffset; - ULONG DataSelector; - ULONG Cr0NpxState; - ULONG Spare1; -} KFLOATING_SAVE, *PKFLOATING_SAVE; - -extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount; - -#define YieldProcessor _mm_pause - -FORCEINLINE -VOID -KeMemoryBarrier(VOID) -{ - LONG Barrier, *Dummy = &Barrier; - UNREFERENCED_LOCAL_VARIABLE(Dummy); - -#if defined(__GNUC__) - __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax"); -#elif defined(_MSC_VER) - __asm xchg [Barrier], eax -#endif -} - -#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() - -_IRQL_requires_max_(HIGH_LEVEL) -_IRQL_saves_ -NTHALAPI -KIRQL -NTAPI -KeGetCurrentIrql(VOID); - -_IRQL_requires_max_(HIGH_LEVEL) -NTHALAPI -VOID -FASTCALL -KfLowerIrql( - _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql); -#define KeLowerIrql(a) KfLowerIrql(a) - -_IRQL_requires_max_(HIGH_LEVEL) -_IRQL_raises_(NewIrql) -_IRQL_saves_ -NTHALAPI -KIRQL -FASTCALL -KfRaiseIrql( - _In_ KIRQL NewIrql); -#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) - -_IRQL_requires_max_(DISPATCH_LEVEL) -_IRQL_saves_ -_IRQL_raises_(DISPATCH_LEVEL) -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToDpcLevel(VOID); - -NTHALAPI -KIRQL -NTAPI -KeRaiseIrqlToSynchLevel(VOID); - -_Requires_lock_not_held_(*SpinLock) -_Acquires_lock_(*SpinLock) -_IRQL_requires_max_(DISPATCH_LEVEL) -_IRQL_saves_ -_IRQL_raises_(DISPATCH_LEVEL) -NTHALAPI -KIRQL -FASTCALL -KfAcquireSpinLock( - _Inout_ PKSPIN_LOCK SpinLock); -#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) - -_Requires_lock_held_(*SpinLock) -_Releases_lock_(*SpinLock) -_IRQL_requires_(DISPATCH_LEVEL) -NTHALAPI -VOID -FASTCALL -KfReleaseSpinLock( - _Inout_ PKSPIN_LOCK SpinLock, - _In_ _IRQL_restores_ KIRQL NewIrql); -#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) - -_Requires_lock_not_held_(*SpinLock) -_Acquires_lock_(*SpinLock) -_IRQL_requires_min_(DISPATCH_LEVEL) -NTKERNELAPI -VOID -FASTCALL -KefAcquireSpinLockAtDpcLevel( - _Inout_ PKSPIN_LOCK SpinLock); -#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) - -_Requires_lock_held_(*SpinLock) -_Releases_lock_(*SpinLock) -_IRQL_requires_min_(DISPATCH_LEVEL) -NTKERNELAPI -VOID -FASTCALL -KefReleaseSpinLockFromDpcLevel( - _Inout_ PKSPIN_LOCK SpinLock); -#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) - -NTSYSAPI -PKTHREAD -NTAPI -KeGetCurrentThread(VOID); - -_Always_(_Post_satisfies_(return<=0)) -_Must_inspect_result_ -_IRQL_requires_max_(DISPATCH_LEVEL) -_Kernel_float_saved_ -_At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) -NTKERNELAPI -NTSTATUS -NTAPI -KeSaveFloatingPointState( - _Out_ PKFLOATING_SAVE FloatSave); - -_Success_(1) -_Kernel_float_restored_ -_At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) -NTKERNELAPI -NTSTATUS -NTAPI -KeRestoreFloatingPointState( - _In_ PKFLOATING_SAVE FloatSave); - -/* 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 - -FORCEINLINE -VOID -_KeQueryTickCount( - OUT PLARGE_INTEGER CurrentCount) -{ - for (;;) { -#ifdef NONAMELESSUNION - CurrentCount->s.HighPart = KeTickCount.High1Time; - CurrentCount->s.LowPart = KeTickCount.LowPart; - if (CurrentCount->s.HighPart == KeTickCount.High2Time) break; -#else - CurrentCount->HighPart = KeTickCount.High1Time; - CurrentCount->LowPart = KeTickCount.LowPart; - if (CurrentCount->HighPart == KeTickCount.High2Time) break; -#endif - YieldProcessor(); - } -} -#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) - - - - - -#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) - -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 -#define FastFence __faststorefence -#define LoadFence _mm_lfence -#define MemoryFence _mm_mfence -#define StoreFence _mm_sfence -#define LFENCE_ACQUIRE() LoadFence() - -FORCEINLINE -VOID -KeMemoryBarrier(VOID) -{ - // FIXME: Do we really need lfence after the __faststorefence ? - FastFence(); - LFENCE_ACQUIRE(); -} - -#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() - -FORCEINLINE -KIRQL -KeGetCurrentIrql(VOID) -{ - return (KIRQL)__readcr8(); -} - -FORCEINLINE -VOID -KeLowerIrql(IN KIRQL NewIrql) -{ - ASSERT((KIRQL)__readcr8() >= NewIrql); - __writecr8(NewIrql); -} - -FORCEINLINE -KIRQL -KfRaiseIrql(IN KIRQL NewIrql) -{ - KIRQL OldIrql; - - OldIrql = (KIRQL)__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); -} - -FORCEINLINE -NTSTATUS -KeSaveFloatingPointState(PVOID FloatingState) -{ - UNREFERENCED_PARAMETER(FloatingState); - return STATUS_SUCCESS; -} - -FORCEINLINE -NTSTATUS -KeRestoreFloatingPointState(PVOID FloatingState) -{ - UNREFERENCED_PARAMETER(FloatingState); - return STATUS_SUCCESS; -} - -/* 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 - /****************************************************************************** * Memory manager Types * ******************************************************************************/ @@ -10065,6 +9504,566 @@ RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)( /****************************************************************************** * Kernel Functions * ******************************************************************************/ +#if defined(_M_IX86) +/** Kernel definitions for x86 **/ + +/* Interrupt request levels */ +#define PASSIVE_LEVEL 0 +#define LOW_LEVEL 0 +#define APC_LEVEL 1 +#define DISPATCH_LEVEL 2 +#define CMCI_LEVEL 5 +#define PROFILE_LEVEL 27 +#define CLOCK1_LEVEL 28 +#define CLOCK2_LEVEL 28 +#define IPI_LEVEL 29 +#define POWER_LEVEL 30 +#define HIGH_LEVEL 31 +#define CLOCK_LEVEL CLOCK2_LEVEL + +#define KIP0PCRADDRESS 0xffdff000 +#define KI_USER_SHARED_DATA 0xffdf0000 +#define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA) + +#define PAGE_SIZE 0x1000 +#define PAGE_SHIFT 12L +#define KeGetDcacheFillSize() 1L + +#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 ControlWord; + ULONG StatusWord; + ULONG ErrorOffset; + ULONG ErrorSelector; + ULONG DataOffset; + ULONG DataSelector; + ULONG Cr0NpxState; + ULONG Spare1; +} KFLOATING_SAVE, *PKFLOATING_SAVE; + +extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount; + +#define YieldProcessor _mm_pause + +FORCEINLINE +VOID +KeMemoryBarrier(VOID) +{ + LONG Barrier, *Dummy = &Barrier; + UNREFERENCED_LOCAL_VARIABLE(Dummy); + +#if defined(__GNUC__) + __asm__ __volatile__ ("xchg %%eax, %0" : : "m" (Barrier) : "%eax"); +#elif defined(_MSC_VER) + __asm xchg [Barrier], eax +#endif +} + +#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() + +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_saves_ +NTHALAPI +KIRQL +NTAPI +KeGetCurrentIrql(VOID); + +_IRQL_requires_max_(HIGH_LEVEL) +NTHALAPI +VOID +FASTCALL +KfLowerIrql( + _In_ _IRQL_restores_ _Notliteral_ KIRQL NewIrql); +#define KeLowerIrql(a) KfLowerIrql(a) + +_IRQL_requires_max_(HIGH_LEVEL) +_IRQL_raises_(NewIrql) +_IRQL_saves_ +NTHALAPI +KIRQL +FASTCALL +KfRaiseIrql( + _In_ KIRQL NewIrql); +#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a) + +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToDpcLevel(VOID); + +NTHALAPI +KIRQL +NTAPI +KeRaiseIrqlToSynchLevel(VOID); + +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_max_(DISPATCH_LEVEL) +_IRQL_saves_ +_IRQL_raises_(DISPATCH_LEVEL) +NTHALAPI +KIRQL +FASTCALL +KfAcquireSpinLock( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a) + +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_(DISPATCH_LEVEL) +NTHALAPI +VOID +FASTCALL +KfReleaseSpinLock( + _Inout_ PKSPIN_LOCK SpinLock, + _In_ _IRQL_restores_ KIRQL NewIrql); +#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b) + +_Requires_lock_not_held_(*SpinLock) +_Acquires_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) +NTKERNELAPI +VOID +FASTCALL +KefAcquireSpinLockAtDpcLevel( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeAcquireSpinLockAtDpcLevel(SpinLock) KefAcquireSpinLockAtDpcLevel(SpinLock) + +_Requires_lock_held_(*SpinLock) +_Releases_lock_(*SpinLock) +_IRQL_requires_min_(DISPATCH_LEVEL) +NTKERNELAPI +VOID +FASTCALL +KefReleaseSpinLockFromDpcLevel( + _Inout_ PKSPIN_LOCK SpinLock); +#define KeReleaseSpinLockFromDpcLevel(SpinLock) KefReleaseSpinLockFromDpcLevel(SpinLock) + +NTSYSAPI +PKTHREAD +NTAPI +KeGetCurrentThread(VOID); + +_Always_(_Post_satisfies_(return<=0)) +_Must_inspect_result_ +_IRQL_requires_max_(DISPATCH_LEVEL) +_Kernel_float_saved_ +_At_(*FloatSave, _Kernel_requires_resource_not_held_(FloatState) _Kernel_acquires_resource_(FloatState)) +NTKERNELAPI +NTSTATUS +NTAPI +KeSaveFloatingPointState( + _Out_ PKFLOATING_SAVE FloatSave); + +_Success_(1) +_Kernel_float_restored_ +_At_(*FloatSave, _Kernel_requires_resource_held_(FloatState) _Kernel_releases_resource_(FloatState)) +NTKERNELAPI +NTSTATUS +NTAPI +KeRestoreFloatingPointState( + _In_ PKFLOATING_SAVE FloatSave); + +/* 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 + +FORCEINLINE +VOID +_KeQueryTickCount( + OUT PLARGE_INTEGER CurrentCount) +{ + for (;;) { +#ifdef NONAMELESSUNION + CurrentCount->s.HighPart = KeTickCount.High1Time; + CurrentCount->s.LowPart = KeTickCount.LowPart; + if (CurrentCount->s.HighPart == KeTickCount.High2Time) break; +#else + CurrentCount->HighPart = KeTickCount.High1Time; + CurrentCount->LowPart = KeTickCount.LowPart; + if (CurrentCount->HighPart == KeTickCount.High2Time) break; +#endif + YieldProcessor(); + } +} +#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount) + + + + + +#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) + +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 +#define FastFence __faststorefence +#define LoadFence _mm_lfence +#define MemoryFence _mm_mfence +#define StoreFence _mm_sfence +#define LFENCE_ACQUIRE() LoadFence() + +FORCEINLINE +VOID +KeMemoryBarrier(VOID) +{ + // FIXME: Do we really need lfence after the __faststorefence ? + FastFence(); + LFENCE_ACQUIRE(); +} + +#define KeMemoryBarrierWithoutFence() _ReadWriteBarrier() + +FORCEINLINE +KIRQL +KeGetCurrentIrql(VOID) +{ + return (KIRQL)__readcr8(); +} + +FORCEINLINE +VOID +KeLowerIrql(IN KIRQL NewIrql) +{ + ASSERT((KIRQL)__readcr8() >= NewIrql); + __writecr8(NewIrql); +} + +FORCEINLINE +KIRQL +KfRaiseIrql(IN KIRQL NewIrql) +{ + KIRQL OldIrql; + + OldIrql = (KIRQL)__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); +} + +FORCEINLINE +NTSTATUS +KeSaveFloatingPointState(PVOID FloatingState) +{ + UNREFERENCED_PARAMETER(FloatingState); + return STATUS_SUCCESS; +} + +FORCEINLINE +NTSTATUS +KeRestoreFloatingPointState(PVOID FloatingState) +{ + UNREFERENCED_PARAMETER(FloatingState); + return STATUS_SUCCESS; +} + +/* 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 + NTKERNELAPI VOID NTAPI diff --git a/reactos/include/xdk/kefuncs.h b/reactos/include/xdk/kefuncs.h index 9b36804a4fd..b8b339debf1 100644 --- a/reactos/include/xdk/kefuncs.h +++ b/reactos/include/xdk/kefuncs.h @@ -2,6 +2,22 @@ * Kernel Functions * ******************************************************************************/ $if (_WDMDDK_) +#if defined(_M_IX86) +$include(x86/ke.h) +#elif defined(_M_AMD64) +$include(amd64/ke.h) +#elif defined(_M_IA64) +$include(ia64/ke.h) +#elif defined(_M_PPC) +$include(ppc/ke.h) +#elif defined(_M_MIPS) +$include(mips/ke.h) +#elif defined(_M_ARM) +$include(arm/ke.h) +#else +#error Unknown Architecture +#endif + NTKERNELAPI VOID NTAPI diff --git a/reactos/include/xdk/wdm.template.h b/reactos/include/xdk/wdm.template.h index e134333c837..a18ce71db5d 100644 --- a/reactos/include/xdk/wdm.template.h +++ b/reactos/include/xdk/wdm.template.h @@ -209,23 +209,6 @@ $define (_WDMDDK_) $include (interlocked.h) $include (rtltypes.h) $include (ketypes.h) - -#if defined(_M_IX86) -$include(x86/ke.h) -#elif defined(_M_AMD64) -$include(amd64/ke.h) -#elif defined(_M_IA64) -$include(ia64/ke.h) -#elif defined(_M_PPC) -$include(ppc/ke.h) -#elif defined(_M_MIPS) -$include(mips/ke.h) -#elif defined(_M_ARM) -$include(arm/ke.h) -#else -#error Unknown Architecture -#endif - $include (mmtypes.h) $include (extypes.h) $include (setypes.h) From 54bd4f5cc8f0ca2dc6b16ebb24ca9c1378b70501 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Feb 2012 22:23:10 +0000 Subject: [PATCH 269/289] [NTOSKRNL] - Implement amd64 version of MmDeleteProcessPageDirectory - Fix amd64 build svn path=/trunk/; revision=55505 --- reactos/ntoskrnl/kd64/kddata.c | 1 + reactos/ntoskrnl/mm/ARM3/mminit.c | 3 +- reactos/ntoskrnl/mm/amd64/page.c | 112 ++++++++++++++++++++---------- 3 files changed, 77 insertions(+), 39 deletions(-) diff --git a/reactos/ntoskrnl/kd64/kddata.c b/reactos/ntoskrnl/kd64/kddata.c index 092efce3a63..d6b0107fcb9 100644 --- a/reactos/ntoskrnl/kd64/kddata.c +++ b/reactos/ntoskrnl/kd64/kddata.c @@ -12,6 +12,7 @@ #define NDEBUG #include #include "../mm/ARM3/miarm.h" +#undef MmSystemRangeStart VOID NTAPI RtlpBreakWithStatusInstruction(VOID); diff --git a/reactos/ntoskrnl/mm/ARM3/mminit.c b/reactos/ntoskrnl/mm/ARM3/mminit.c index 3d19b04e2dd..5554b9ebed7 100644 --- a/reactos/ntoskrnl/mm/ARM3/mminit.c +++ b/reactos/ntoskrnl/mm/ARM3/mminit.c @@ -14,6 +14,7 @@ #define MODULE_INVOLVED_IN_ARM3 #include "miarm.h" +#undef MmSystemRangeStart /* GLOBALS ********************************************************************/ @@ -170,7 +171,7 @@ PMMPDE MmSystemPagePtes; // // This should be 0xC0C00000 -- the cache itself starts at 0xC1000000 // -PMMWSL MmSystemCacheWorkingSetList = MI_SYSTEM_CACHE_WS_START; +PMMWSL MmSystemCacheWorkingSetList = (PVOID)MI_SYSTEM_CACHE_WS_START; // // Windows NT seems to choose between 7000, 11000 and 50000 diff --git a/reactos/ntoskrnl/mm/amd64/page.c b/reactos/ntoskrnl/mm/amd64/page.c index ea245533f06..de5dd773d14 100644 --- a/reactos/ntoskrnl/mm/amd64/page.c +++ b/reactos/ntoskrnl/mm/amd64/page.c @@ -137,6 +137,80 @@ MiFlushTlb(PMMPTE Pte, PVOID Address) } } +static +VOID +MmDeletePageTablePfn(PFN_NUMBER PageFrameNumber, ULONG Level) +{ + PMMPTE PageTable; + KIRQL OldIrql; + PMMPFN PfnEntry; + ULONG i, NumberEntries; + + /* Check if this is a page table */ + if (Level > 0) + { + NumberEntries = (Level == 4) ? MiAddressToPxi(MmHighestUserAddress)+1 : 512; + + /* Map the page table in hyperspace */ + PageTable = (PMMPTE)MmCreateHyperspaceMapping(PageFrameNumber); + + /* Loop all page table entries */ + for (i = 0; i < NumberEntries; i++) + { + /* Check if the entry is valid */ + if (PageTable[i].u.Hard.Valid) + { + /* Recursively free the page that backs it */ + MmDeletePageTablePfn(PageTable[i].u.Hard.PageFrameNumber, Level - 1); + } + } + + /* Delete the hyperspace mapping */ + MmDeleteHyperspaceMapping(PageTable); + } + + /* Check if this is a legacy allocation */ + PfnEntry = MiGetPfnEntry(PageFrameNumber); + if (MI_IS_ROS_PFN(PfnEntry)) + { + /* Free it using the legacy API */ + MmReleasePageMemoryConsumer(MC_SYSTEM, PageFrameNumber); + } + else + { + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Free it using the ARM3 API */ + MI_SET_PFN_DELETED(PfnEntry); + MiDecrementShareCount(PfnEntry, PageFrameNumber); + + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + } +} + +VOID +NTAPI +MmDeleteProcessPageDirectory(PEPROCESS Process) +{ + PFN_NUMBER TableBasePfn; + PMMPTE PageDir; + + /* Get the page directory PFN */ + TableBasePfn = Process->Pcb.DirectoryTableBase[0] >> PAGE_SHIFT; + + /* Map the page directory in hyperspace */ + PageDir = (PMMPTE)MmCreateHyperspaceMapping(TableBasePfn); + + /* Free the hyperspace mapping page (ARM3) */ + //MmDeletePageTablePfn(PageDir[ADDR_TO_PDE_OFFSET(HYPERSPACE)].u.Hard.PageFrameNumber, 3); + + /* Delete the hyperspace mapping */ + MmDeleteHyperspaceMapping(PageDir); + + /* Recursively free the page directories */ + MmDeletePageTablePfn(TableBasePfn, 4); +} + static PMMPTE MiGetPteForProcess( @@ -628,44 +702,6 @@ MmCreateVirtualMapping(PEPROCESS Process, return MmCreateVirtualMappingUnsafe(Process, Address, Protect, Pages, PageCount); } -static PMMPTE -MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create) -{ - __debugbreak(); - return 0; -} - -BOOLEAN MmUnmapPageTable(PMMPTE Pt) -{ - ASSERT(FALSE); - return 0; -} - -static ULONG64 MmGetPageEntryForProcess(PEPROCESS Process, PVOID Address) -{ - MMPTE Pte, *PointerPte; - - PointerPte = MmGetPageTableForProcess(Process, Address, FALSE); - if (PointerPte) - { - Pte = *PointerPte; - MmUnmapPageTable(PointerPte); - return Pte.u.Long; - } - return 0; -} - -VOID -NTAPI -MmGetPageFileMapping( - PEPROCESS Process, - PVOID Address, - SWAPENTRY* SwapEntry) -{ - ULONG64 Entry = MmGetPageEntryForProcess(Process, Address); - *SwapEntry = Entry >> 1; -} - BOOLEAN NTAPI MmCreateProcessAddressSpace(IN ULONG MinWs, From 2adafb93b0d5dff44496b86836ef8e24afdcc513 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 8 Feb 2012 22:53:29 +0000 Subject: [PATCH 270/289] [SHELL32] Fix a bug I introduced in r55498 Spotted by Thomas svn path=/trunk/; revision=55506 --- reactos/dll/win32/shell32/drvdefext.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/drvdefext.cpp b/reactos/dll/win32/shell32/drvdefext.cpp index 32706b4c7f6..bc188915671 100644 --- a/reactos/dll/win32/shell32/drvdefext.cpp +++ b/reactos/dll/win32/shell32/drvdefext.cpp @@ -243,7 +243,7 @@ CDrvDefExt::PaintStaticControls(HWND hwndDlg, LPDRAWITEMSTRUCT pDrawItem) SelectObject(pDrawItem->hDC, hDarkMagPen); double cos_val = (x - xCenter)*2.0f/cx; - INT y = yCenter+(INT)sin(acos(cos_val))*cy/2; + INT y = yCenter+(INT)(sin(acos(cos_val))*cy/2); MoveToEx(pDrawItem->hDC, x, y, NULL); LineTo(pDrawItem->hDC, x, y + 10); } From 09c7bc60a5a13bdb58217b359d724c3cba2b57c5 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Wed, 8 Feb 2012 23:49:19 +0000 Subject: [PATCH 271/289] [SMSS2]: Make not-implemented functions return a failure. Cleanup the SMSS hack in the _main function to be cleaner. Add a few more functions and flags to the header. Fix a function prototype. svn path=/trunk/; revision=55507 --- reactos/base/system/smss2/smloop.c | 14 ++++----- reactos/base/system/smss2/smss.c | 37 ++++++++-------------- reactos/base/system/smss2/smss.h | 46 +++++++++++++++++++++++++++- reactos/base/system/smss2/smsubsys.c | 3 +- 4 files changed, 67 insertions(+), 33 deletions(-) diff --git a/reactos/base/system/smss2/smloop.c b/reactos/base/system/smss2/smloop.c index ff05e7993f4..3762eae76b0 100644 --- a/reactos/base/system/smss2/smloop.c +++ b/reactos/base/system/smss2/smloop.c @@ -42,7 +42,7 @@ SmpCreateForeignSession(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -52,7 +52,7 @@ SmpSessionComplete(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -62,7 +62,7 @@ SmpTerminateForeignSession(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -72,7 +72,7 @@ SmpExecPgm(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -82,7 +82,7 @@ SmpLoadDeferedSubsystem(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -92,7 +92,7 @@ SmpStartCsr(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -102,7 +102,7 @@ SmpStopCsr(IN PSM_API_MSG SmApiMsg, IN HANDLE SmApiPort) { DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } PSM_API_HANDLER SmpApiDispatch[SmMaxApiNumber] = diff --git a/reactos/base/system/smss2/smss.c b/reactos/base/system/smss2/smss.c index dd6688f9504..a3df5c666f6 100644 --- a/reactos/base/system/smss2/smss.c +++ b/reactos/base/system/smss2/smss.c @@ -265,7 +265,8 @@ SmpExecuteCommand(IN PUNICODE_STRING CommandLine, &Directory, CommandLine, MuSessionId, - ProcessId); + ProcessId, + Flags); } else if (Flags & SMP_INVALID_PATH) { @@ -590,7 +591,7 @@ ExpLoadInitialProcess(IN PINIT_BUFFER InitBuffer, NTSTATUS NTAPI -LaunchOldSmss(OUT PHANDLE Handles) +LaunchOldSmss(VOID) { PINIT_BUFFER InitBuffer; PRTL_USER_PROCESS_PARAMETERS ProcessParameters = NULL; @@ -598,9 +599,6 @@ LaunchOldSmss(OUT PHANDLE Handles) NTSTATUS Status; PCHAR Environment; - /* No handles at first */ - Handles[0] = Handles[1] = NULL; - /* Initialize the system root */ RtlInitUnicodeString(&SmpSystemRoot, SharedUserData->NtSystemRoot); @@ -623,8 +621,6 @@ LaunchOldSmss(OUT PHANDLE Handles) } /* Return the handle and status */ - Handles[0] = ProcessInfo->ProcessHandle; - Handles[1] = ProcessInfo->ProcessHandle; return Status; } @@ -723,6 +719,8 @@ _main(IN INT argc, /* Enter SEH so we can terminate correctly if anything goes wrong */ _SEH2_TRY { + LARGE_INTEGER Infinite = {{0x80000000, 0x7FFFFFFF}}; + /* Initialize SMSS */ Status = SmpInit(&InitialCommand, Handles); if (!NT_SUCCESS(Status)) @@ -731,9 +729,10 @@ _main(IN INT argc, RtlInitUnicodeString(&DbgString, L"Session Manager Initialization"); Parameters[1] = Status; DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); - Status = LaunchOldSmss(Handles); - goto SetupHack; //_SEH2_LEAVE; Hack so that setup can work. will go away later + Status = LaunchOldSmss(); + if (!NT_SUCCESS(Status)) return Status; + return NtDelayExecution(FALSE, &Infinite); } /* Get the global flags */ @@ -750,19 +749,6 @@ _main(IN INT argc, DPRINT1("Global Flags Set to SMSS Debugging: Not yet supported\n"); } - /* Launch the original SMSS */ - DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); - Status = LaunchOldSmss(Handles); - if (!NT_SUCCESS(Status)) - { - /* Fail and raise a hard error */ - DPRINT1("SMSS: Execute Old SMSS failed\n"); - RtlInitUnicodeString(&DbgString, - L"Session Manager LaunchOldSmss"); - Parameters[1] = Status; - _SEH2_LEAVE; - } - /* Execute the initial command (Winlogon.exe) */ Status = SmpExecuteInitialCommand(0, &InitialCommand, &Handles[1], NULL); if (!NT_SUCCESS(Status)) @@ -772,7 +758,11 @@ _main(IN INT argc, RtlInitUnicodeString(&DbgString, L"Session Manager ExecuteInitialCommand"); Parameters[1] = Status; - _SEH2_LEAVE; + //_SEH2_LEAVE; + DPRINT1("SMSS-2 Loaded... Launching original SMSS\n"); + Status = LaunchOldSmss(); + if (!NT_SUCCESS(Status)) return Status; + return NtDelayExecution(FALSE, &Infinite); } /* Check if we're already attached to a session */ @@ -789,7 +779,6 @@ _main(IN INT argc, SmpReleasePrivilege(State); /* Wait on either CSRSS or Winlogon to die */ -SetupHack: Status = NtWaitForMultipleObjects(RTL_NUMBER_OF(Handles), Handles, WaitAny, diff --git a/reactos/base/system/smss2/smss.h b/reactos/base/system/smss2/smss.h index 22b8af81d3b..dabd9dc68b4 100644 --- a/reactos/base/system/smss2/smss.h +++ b/reactos/base/system/smss2/smss.h @@ -38,6 +38,8 @@ #define SMP_SUBSYSTEM_FLAG 0x08 #define SMP_INVALID_PATH 0x10 #define SMP_DEFERRED_FLAG 0x20 +#define SMP_POSIX_FLAG 0x100 +#define SMP_OS2_FLAG 0x200 /* STRUCTURES *****************************************************************/ @@ -87,6 +89,7 @@ extern LIST_ENTRY SmpSubSystemsToLoad; extern LIST_ENTRY SmpExecuteList; extern LIST_ENTRY SmpSubSystemList; extern ULONG AttachedSessionId; +extern BOOLEAN SmpDebug; /* FUNCTIONS ******************************************************************/ @@ -182,7 +185,8 @@ SmpLoadSubSystem( IN PUNICODE_STRING Directory, IN PUNICODE_STRING CommandLine, IN ULONG MuSessionId, - OUT PHANDLE ProcessId + OUT PHANDLE ProcessId, + IN ULONG Flags ); NTSTATUS @@ -250,4 +254,44 @@ SmpDereferenceSubsystem( IN PSMP_SUBSYSTEM SubSystem ); +NTSTATUS +NTAPI +SmpSbCreateSession( + IN PVOID Reserved, + IN PSMP_SUBSYSTEM OtherSubsystem, + IN PRTL_USER_PROCESS_INFORMATION ProcessInformation, + IN ULONG MuSessionId, + IN PCLIENT_ID DbgClientId +); + +ULONG +NTAPI +SmpAllocateSessionId( + IN PSMP_SUBSYSTEM Subsystem, + IN PSMP_SUBSYSTEM OtherSubsystem +); + +VOID +NTAPI +SmpDeleteSession( + IN ULONG SessionId +); + +BOOLEAN +NTAPI +SmpCheckDuplicateMuSessionId( + IN ULONG MuSessionId +); + +NTSTATUS +NTAPI +SmpExecuteImage( + IN PUNICODE_STRING FileName, + IN PUNICODE_STRING Directory, + IN PUNICODE_STRING CommandLine, + IN ULONG MuSessionId, + IN ULONG Flags, + IN PRTL_USER_PROCESS_INFORMATION ProcessInformation +); + #endif diff --git a/reactos/base/system/smss2/smsubsys.c b/reactos/base/system/smss2/smsubsys.c index 459b2bf16b7..d38695c6bb6 100644 --- a/reactos/base/system/smss2/smsubsys.c +++ b/reactos/base/system/smss2/smsubsys.c @@ -120,7 +120,8 @@ SmpLoadSubSystem(IN PUNICODE_STRING FileName, IN PUNICODE_STRING Directory, IN PUNICODE_STRING CommandLine, IN ULONG MuSessionId, - OUT PHANDLE ProcessId) + OUT PHANDLE ProcessId, + IN ULONG Flags) { DPRINT1("Should start subsystem %wZ for Session: %lx\n", FileName, MuSessionId); return STATUS_SUCCESS; From e23e0ca4013c08e27e78afff443a1452d49b6a7c Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Thu, 9 Feb 2012 00:07:36 +0000 Subject: [PATCH 272/289] [SMSS2]: Implement SmpExecPgm and SmpSbCreateSession. Nothing happens (STATUS_OBJECT_NAME_NOT_FOUND is returned) because we don't really launch CSRSS and so we can't find a subsystem for Winlogon and fail (as expected for now). svn path=/trunk/; revision=55508 --- reactos/base/system/smss2/smloop.c | 65 ++++++++++- reactos/base/system/smss2/smsbapi.c | 169 ++++++++++++++++++++++++++++ 2 files changed, 232 insertions(+), 2 deletions(-) diff --git a/reactos/base/system/smss2/smloop.c b/reactos/base/system/smss2/smloop.c index 3762eae76b0..8958e0438f0 100644 --- a/reactos/base/system/smss2/smloop.c +++ b/reactos/base/system/smss2/smloop.c @@ -71,8 +71,69 @@ SmpExecPgm(IN PSM_API_MSG SmApiMsg, IN PSMP_CLIENT_CONTEXT ClientContext, IN HANDLE SmApiPort) { - DPRINT1("%s is not yet implemented\n", __FUNCTION__); - return STATUS_NOT_IMPLEMENTED; + HANDLE ProcessHandle; + NTSTATUS Status; + PSM_EXEC_PGM_MSG SmExecPgm; + RTL_USER_PROCESS_INFORMATION ProcessInformation; + OBJECT_ATTRIBUTES ObjectAttributes; + + /* Open the client process */ + InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); + Status = NtOpenProcess(&ProcessHandle, + PROCESS_DUP_HANDLE, + &ObjectAttributes, + &SmApiMsg->h.ClientId); + if (!NT_SUCCESS(Status)) + { + /* Fail */ + DPRINT1("SmExecPgm: NtOpenProcess Failed %lx\n", Status); + return Status; + } + + /* Copy the process information out of the message */ + SmExecPgm = &SmApiMsg->u.ExecPgm; + ProcessInformation = SmExecPgm->ProcessInformation; + + /* Duplicate the process handle */ + Status = NtDuplicateObject(ProcessHandle, + SmExecPgm->ProcessInformation.ProcessHandle, + NtCurrentProcess(), + &ProcessInformation.ProcessHandle, + PROCESS_ALL_ACCESS, + 0, + 0); + if (!NT_SUCCESS(Status)) + { + /* Close the handle and fail */ + NtClose(ProcessHandle); + DPRINT1("SmExecPgm: NtDuplicateObject (Process) Failed %lx\n", Status); + return Status; + } + + /* Duplicate the thread handle */ + Status = NtDuplicateObject(ProcessHandle, + SmExecPgm->ProcessInformation.ThreadHandle, + NtCurrentProcess(), + &ProcessInformation.ThreadHandle, + THREAD_ALL_ACCESS, + 0, + 0); + if (!NT_SUCCESS(Status)) + { + /* Close both handles and fail */ + NtClose(ProcessInformation.ProcessHandle); + NtClose(ProcessHandle); + DPRINT1("SmExecPgm: NtDuplicateObject (Thread) Failed %lx\n", Status); + return Status; + } + + /* Close the process handle and call the internal client API */ + NtClose(ProcessHandle); + return SmpSbCreateSession(NULL, + NULL, + &ProcessInformation, + 0, + SmExecPgm->DebugFlag ? &SmApiMsg->h.ClientId : NULL); } NTSTATUS diff --git a/reactos/base/system/smss2/smsbapi.c b/reactos/base/system/smss2/smsbapi.c index 8678afa43b2..d72b582691b 100644 --- a/reactos/base/system/smss2/smsbapi.c +++ b/reactos/base/system/smss2/smsbapi.c @@ -14,4 +14,173 @@ /* GLOBALS ********************************************************************/ +PCHAR SmpSubSystemNames[] = +{ + "Unknown", + "Native", + "Windows", + "Posix", + "OS/2" +}; + /* FUNCTIONS ******************************************************************/ + +NTSTATUS +NTAPI +SmpSbCreateSession(IN PVOID Reserved, + IN PSMP_SUBSYSTEM OtherSubsystem, + IN PRTL_USER_PROCESS_INFORMATION ProcessInformation, + IN ULONG MuSessionId, + IN PCLIENT_ID DbgClientId) +{ + NTSTATUS Status; + PSMP_SUBSYSTEM KnownSubsys; + SB_API_MSG SbApiMsg; + ULONG SessionId; + PSB_CREATE_SESSION_MSG CreateSessionMsg; + + /* Write out the create session message including its initial process */ + CreateSessionMsg = &SbApiMsg.CreateSession; + CreateSessionMsg->ProcessInfo = *ProcessInformation; + CreateSessionMsg->MuSessionId = MuSessionId; + if (DbgClientId) + { + CreateSessionMsg->ClientId = *DbgClientId; + } + else + { + CreateSessionMsg->ClientId.UniqueThread = NULL; + CreateSessionMsg->ClientId.UniqueProcess = NULL; + } + + /* Find a subsystem responsible for this session */ + SmpGetProcessMuSessionId(ProcessInformation->ProcessHandle, &MuSessionId); + if (!SmpCheckDuplicateMuSessionId(MuSessionId)) + { + NtClose(ProcessInformation->ProcessHandle); + NtClose(ProcessInformation->ThreadHandle); + DPRINT1("SMSS: CreateSession status=%x\n", STATUS_OBJECT_NAME_NOT_FOUND); + return STATUS_OBJECT_NAME_NOT_FOUND; + } + + /* Find the subsystem we have for this initial process */ + KnownSubsys = SmpLocateKnownSubSysByType(MuSessionId, + ProcessInformation-> + ImageInformation.SubSystemType); + if (KnownSubsys) + { + /* Duplicate the process handle into the message */ + Status = NtDuplicateObject(NtCurrentProcess(), + ProcessInformation->ProcessHandle, + KnownSubsys->ProcessHandle, + &CreateSessionMsg->ProcessInfo.ProcessHandle, + PROCESS_ALL_ACCESS, + 0, + 0); + if (NT_SUCCESS(Status)) + { + /* Duplicate the thread handle into the message */ + Status = NtDuplicateObject(NtCurrentProcess(), + ProcessInformation->ThreadHandle, + KnownSubsys->ProcessHandle, + &CreateSessionMsg->ProcessInfo.ThreadHandle, + THREAD_ALL_ACCESS, + 0, + 0); + if (!NT_SUCCESS(Status)) + { + /* Close everything on failure */ + NtClose(ProcessInformation->ProcessHandle); + NtClose(ProcessInformation->ThreadHandle); + SmpDereferenceSubsystem(KnownSubsys); + DbgPrint("SmpSbCreateSession: NtDuplicateObject (Thread) Failed %lx\n", Status); + return Status; + } + + /* Close the original handles as they are no longer needed */ + NtClose(ProcessInformation->ProcessHandle); + NtClose(ProcessInformation->ThreadHandle); + + /* Finally, allocate a new SMSS session ID for this session */ + SessionId = SmpAllocateSessionId(KnownSubsys, OtherSubsystem); + CreateSessionMsg->SessionId = SessionId; + + /* Fill out the LPC message header and send it to the client! */ + SbApiMsg.ApiNumber = SbpCreateSession; + SbApiMsg.h.u2.ZeroInit = 0; + SbApiMsg.h.u1.s1.DataLength = sizeof(SB_CREATE_SESSION_MSG) + 8; + SbApiMsg.h.u1.s1.TotalLength = sizeof(SbApiMsg); + Status = NtRequestWaitReplyPort(KnownSubsys->SbApiPort, + &SbApiMsg.h, + &SbApiMsg.h); + if (!NT_SUCCESS(Status)) + { + /* Bail out */ + DPRINT1("SmpSbCreateSession: NtRequestWaitReply Failed %lx\n", Status); + } + else + { + /* If the API succeeded, get the result value from the LPC */ + Status = SbApiMsg.ReturnValue; + } + + /* Delete the session on any kind of failure */ + if (!NT_SUCCESS(Status)) SmpDeleteSession(SessionId); + } + else + { + /* Close the handles on failure */ + DPRINT1("SmpSbCreateSession: NtDuplicateObject (Process) Failed %lx\n", Status); + NtClose(ProcessInformation->ProcessHandle); + NtClose(ProcessInformation->ThreadHandle); + } + + /* Dereference the subsystem and return the status of the LPC call */ + SmpDereferenceSubsystem(KnownSubsys); + return Status; + } + + /* If we don't yet have a subsystem, only native images can be launched */ + if (ProcessInformation->ImageInformation.SubSystemType != IMAGE_SUBSYSTEM_NATIVE) + { + /* Fail */ + DPRINT1("SMSS: %s SubSystem has not been started.\n", + SmpSubSystemNames[ProcessInformation->ImageInformation.SubSystemType]); + Status = STATUS_UNSUCCESSFUL; + NtClose(ProcessInformation->ProcessHandle); + NtClose(ProcessInformation->ThreadHandle); + return Status; + } + +#if 0 + /* This code handles debug applications, but it seems vestigial... */ + if ((*(ULONGLONG)&CreateSessionMsg.ClientId) && (SmpDbgSsLoaded)) + { + Process = RtlAllocateHeap(SmpHeap, SmBaseTag, sizeof(SMP_PROCESS)); + if (!Process) + { + DPRINT1("Unable to initialize debugging for Native App %lx.%lx -- out of memory\n", + ProcessInformation->ClientId.UniqueProcess, + ProcessInformation->ClientId.UniqueThread); + NtClose(ProcessInformation->ProcessHandle); + NtClose(ProcessInformation->ThreadHandle); + return STATUS_NO_MEMORY; + } + + Process->DbgClientId = CreateSessionMsg->ClientId; + Process->ClientId = ProcessInformation->ClientId; + InsertHeadList(&NativeProcessList, &Process->Entry); + DPRINT1("Native Debug App %lx.%lx\n", Process->ClientId.UniqueProcess, Process->ClientId.UniqueThread); + + Status = NtSetInformationProcess(ProcessInformation->ProcessHandle, 7, &SmpDebugPort, 4); + ASSERT(NT_SUCCESS(Status)); + } +#endif + + /* This is a native application being started as the initial command */ + DPRINT1("Subsystem active, starting thread\n"); + NtClose(ProcessInformation->ProcessHandle); + NtResumeThread(ProcessInformation->ThreadHandle, NULL); + NtClose(ProcessInformation->ThreadHandle); + return STATUS_SUCCESS; +} From 14ba04899c8d26ab6fd94023165afa903e6f1feb Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Thu, 9 Feb 2012 02:21:56 +0000 Subject: [PATCH 273/289] [SMSS2]: Implement SmpCallCsrCreateProcess and SmpLoadSubsystem. We now load CSRSS and everything works 100%! Winlogon is now launched by SMSS2 and no regressions have been found. [SMSS]: Turn off all code other than setting up the pagefile. There's a lot of debug prints, as soon as things seem stable after a few days, SMSS will be gone and SMSS2 will take over and DPRINT1s will mostly be gone. svn path=/trunk/; revision=55509 --- reactos/base/system/smss/init.c | 8 +- reactos/base/system/smss2/smsubsys.c | 394 ++++++++++++++++++++++++++- 2 files changed, 395 insertions(+), 7 deletions(-) diff --git a/reactos/base/system/smss/init.c b/reactos/base/system/smss/init.c index 90de9328cde..7a94022fe27 100644 --- a/reactos/base/system/smss/init.c +++ b/reactos/base/system/smss/init.c @@ -24,8 +24,8 @@ struct { } InitRoutine [] = { {TRUE, SmCreateHeap, "create private heap, aborting"}, // {TRUE, SmCreateObjectDirectories, "create object directories"}, - {TRUE, SmCreateApiPort, "create \\SmApiPort"}, - {TRUE, SmCreateEnvironment, "create the system environment"}, +// {TRUE, SmCreateApiPort, "create \\SmApiPort"}, +// {TRUE, SmCreateEnvironment, "create the system environment"}, // {TRUE, SmSetEnvironmentVariables, "set system environment variables"}, // {TRUE, SmInitDosDevices, "create dos device links"}, // {TRUE, SmRunBootApplications, "run boot applications"}, @@ -34,8 +34,8 @@ struct { // {FALSE, SmLoadKnownDlls, "preload system DLLs"}, {TRUE, SmCreatePagingFiles, "create paging files"}, // {TRUE, SmInitializeRegistry, "initialize the registry"}, - {TRUE, SmInitializeClientManagement, "initialize client management"}, - {TRUE, SmLoadSubsystems, "load subsystems"} +// {TRUE, SmInitializeClientManagement, "initialize client management"}, +// {TRUE, SmLoadSubsystems, "load subsystems"} }; NTSTATUS diff --git a/reactos/base/system/smss2/smsubsys.c b/reactos/base/system/smss2/smsubsys.c index d38695c6bb6..d0bfbd83b9c 100644 --- a/reactos/base/system/smss2/smsubsys.c +++ b/reactos/base/system/smss2/smsubsys.c @@ -23,6 +23,24 @@ WCHAR InitialCommandBuffer[256]; /* FUNCTIONS ******************************************************************/ +NTSTATUS +NTAPI +SmpCallCsrCreateProcess(IN PSB_API_MSG SbApiMsg, + IN USHORT MessageLength, + IN HANDLE PortHandle) +{ + NTSTATUS Status; + + /* Initialize the header and send the message to CSRSS */ + SbApiMsg->h.u2.ZeroInit = 0; + SbApiMsg->h.u1.s1.DataLength = MessageLength + 8; + SbApiMsg->h.u1.s1.TotalLength = sizeof(SB_API_MSG); + SbApiMsg->ApiNumber = SbpCreateProcess; + Status = NtRequestWaitReplyPort(PortHandle, &SbApiMsg->h, &SbApiMsg->h); + if (NT_SUCCESS(Status)) Status = SbApiMsg->ReturnValue; + return Status; +} + VOID NTAPI SmpDereferenceSubsystem(IN PSMP_SUBSYSTEM SubSystem) @@ -60,7 +78,7 @@ SmpLocateKnownSubSysByCid(IN PCLIENT_ID ClientId) { /* Check if this one matches the client ID and is still valid */ Subsystem = CONTAINING_RECORD(NextEntry, SMP_SUBSYSTEM, Entry); - if ((*(PULONGLONG)&Subsystem->ClientId == *(PULONGLONG)&ClientId) && + if ((*(PULONGLONG)&Subsystem->ClientId == *(PULONGLONG)ClientId) && !(Subsystem->Terminating)) { /* Add a reference and return it */ @@ -123,8 +141,378 @@ SmpLoadSubSystem(IN PUNICODE_STRING FileName, OUT PHANDLE ProcessId, IN ULONG Flags) { - DPRINT1("Should start subsystem %wZ for Session: %lx\n", FileName, MuSessionId); - return STATUS_SUCCESS; + PSMP_SUBSYSTEM Subsystem, NewSubsystem, KnownSubsystem = NULL; + HANDLE SubSysProcessId; + NTSTATUS Status = STATUS_SUCCESS; + SB_API_MSG SbApiMsg, SbApiMsg2; + RTL_USER_PROCESS_INFORMATION ProcessInformation; + LARGE_INTEGER Timeout; + PVOID State; + PSB_CREATE_PROCESS_MSG CreateProcess = &SbApiMsg.CreateProcess; + PSB_CREATE_SESSION_MSG CreateSession = &SbApiMsg.CreateSession; + DPRINT1("Loading subsystem: %wZ\n", FileName); + + /* Make sure this is a found subsystem */ + if (Flags & SMP_INVALID_PATH) + { + DPRINT1("SMSS: Unable to find subsystem - %wZ\n", FileName); + return STATUS_OBJECT_NAME_NOT_FOUND; + } + + /* Don't use a session if the flag is set */ + if (Flags & 0x80) MuSessionId = 0; + + /* Lock the subsystems while we do a look up */ + RtlEnterCriticalSection(&SmpKnownSubSysLock); + while (TRUE) + { + /* Check if we found a subsystem not yet fully iniitalized */ + Subsystem = SmpLocateKnownSubSysByType(MuSessionId, -1); + if (!Subsystem) break; + RtlLeaveCriticalSection(&SmpKnownSubSysLock); + + /* Wait on it to initialize */ + NtWaitForSingleObject(Subsystem->Event, FALSE, NULL); + + /* Dereference it and try the next one */ + RtlEnterCriticalSection(&SmpKnownSubSysLock); + SmpDereferenceSubsystem(Subsystem); + } + + /* Check if this is a POSIX subsystem */ + if (Flags & SMP_POSIX_FLAG) + { + /* Do we already have it? */ + Subsystem = SmpLocateKnownSubSysByType(MuSessionId, IMAGE_SUBSYSTEM_POSIX_CUI); + } + else if (Flags & SMP_OS2_FLAG) + { + /* This is an OS/2 subsystem, do we we already have it? */ + Subsystem = SmpLocateKnownSubSysByType(MuSessionId, IMAGE_SUBSYSTEM_OS2_CUI); + } + + /* Check if we already have one of the optional subsystems for the session */ + if (Subsystem) + { + /* Dereference and return, no work to do */ + SmpDereferenceSubsystem(Subsystem); + RtlLeaveCriticalSection(&SmpKnownSubSysLock); + return STATUS_SUCCESS; + } + + /* Allocate a new subsystem! */ + NewSubsystem = RtlAllocateHeap(SmpHeap, SmBaseTag, sizeof(SMP_SUBSYSTEM)); + DPRINT1("new subsystem created: %p\n", NewSubsystem); + if (!NewSubsystem) + { + RtlLeaveCriticalSection(&SmpKnownSubSysLock); + return STATUS_NO_MEMORY; + } + + /* Initialize its header and reference count */ + NewSubsystem->ReferenceCount = 1; + NewSubsystem->MuSessionId = MuSessionId; + NewSubsystem->ImageType = -1; + + /* Clear out all the other data for now */ + NewSubsystem->Terminating = FALSE; + NewSubsystem->ProcessHandle = NULL; + NewSubsystem->Event = NULL; + NewSubsystem->PortHandle = NULL; + NewSubsystem->SbApiPort = NULL; + + /* Create the event we'll be wating on for initialization */ + Status = NtCreateEvent(&NewSubsystem->Event, + EVENT_ALL_ACCESS, + NULL, + NotificationEvent, + FALSE); + if (!NT_SUCCESS(Status)) + { + /* This failed, bail out */ + RtlFreeHeap(SmpHeap, 0, NewSubsystem); + RtlLeaveCriticalSection(&SmpKnownSubSysLock); + return STATUS_NO_MEMORY; + } + + /* Insert the subsystem and release the lock. It can now be found */ + InsertTailList(&SmpKnownSubSysHead, &NewSubsystem->Entry); + RtlLeaveCriticalSection(&SmpKnownSubSysLock); + + /* The OS/2 and POSIX subsystems are actually Windows applications! */ + if (Flags & (SMP_POSIX_FLAG | SMP_OS2_FLAG)) + { + /* Locate the Windows subsystem for this session */ + KnownSubsystem = SmpLocateKnownSubSysByType(MuSessionId, + IMAGE_SUBSYSTEM_WINDOWS_GUI); + if (!KnownSubsystem) + { + DPRINT1("SMSS: SmpLoadSubSystem - SmpLocateKnownSubSysByType Failed\n"); + goto Quickie2; + } + + /* Fill out all the process details and call CSRSS to launch it */ + CreateProcess->In.ImageName = FileName; + CreateProcess->In.CurrentDirectory = Directory; + CreateProcess->In.CommandLine = CommandLine; + CreateProcess->In.DllPath = SmpDefaultLibPath.Length ? + &SmpDefaultLibPath : NULL; + CreateProcess->In.Flags = Flags | SMP_DEFERRED_FLAG; + CreateProcess->In.DebugFlags = SmpDebug; + Status = SmpCallCsrCreateProcess(&SbApiMsg, + sizeof(*CreateProcess), + KnownSubsystem->SbApiPort); + if (!NT_SUCCESS(Status)) + { + /* Handle failures */ + DPRINT1("SMSS: SmpLoadSubSystem - SmpCallCsrCreateProcess Failed with Status %lx\n", + Status); + goto Quickie2; + } + + /* Save the process information we'll need for the create session */ + ProcessInformation.ProcessHandle = CreateProcess->Out.ProcessHandle; + ProcessInformation.ThreadHandle = CreateProcess->Out.ThreadHandle; + ProcessInformation.ClientId = CreateProcess->Out.ClientId; + ProcessInformation.ImageInformation.SubSystemType = CreateProcess->Out.SubsystemType; + } + else + { + /* This must be CSRSS itself, so just launch it and that's it */ + DPRINT1("Executing CSRSS\n"); + Status = SmpExecuteImage(FileName, + Directory, + CommandLine, + MuSessionId, + Flags | SMP_DEFERRED_FLAG, + &ProcessInformation); + if (!NT_SUCCESS(Status)) + { + /* Handle failures */ + DPRINT1("SMSS: SmpLoadSubSystem - SmpExecuteImage Failed with Status %lx\n", + Status); + goto Quickie2; + } + } + + /* Fill out the handle and client ID in the subsystem structure now */ + NewSubsystem->ProcessHandle = ProcessInformation.ProcessHandle; + NewSubsystem->ClientId = ProcessInformation.ClientId; + + /* Check if we launched a native image or a subsystem-backed image */ + if (ProcessInformation.ImageInformation.SubSystemType == IMAGE_SUBSYSTEM_NATIVE) + { + /* This must be CSRSS itself, since it's a native subsystem image */ + SubSysProcessId = ProcessInformation.ClientId.UniqueProcess; + if ((ProcessId) && !(*ProcessId)) *ProcessId = SubSysProcessId; + + /* Was this the initial CSRSS on Session 0? */ + if (!MuSessionId) + { + /* Then save it in the global variables */ + SmpWindowsSubSysProcessId = SubSysProcessId; + SmpWindowsSubSysProcess = ProcessInformation.ProcessHandle; + } + ASSERT(NT_SUCCESS(Status)); + DPRINT1("CSRSS is up and running: %lx %lx\n", SmpWindowsSubSysProcessId, SmpWindowsSubSysProcess); + } + else + { + /* This is the POSIX or OS/2 subsystem process, copy its information */ + RtlCopyMemory(&CreateSession->ProcessInfo, + &ProcessInformation, + sizeof(&CreateSession->ProcessInfo)); + + /* Not sure these field mean what I think they do -- but clear them */ + *(PULONGLONG)&CreateSession->ClientId = 0; + CreateSession->MuSessionId = 0; + + /* This should find CSRSS because they are POSIX or OS/2 subsystems */ + Subsystem = SmpLocateKnownSubSysByType(MuSessionId, + ProcessInformation.ImageInformation.SubSystemType); + if (!Subsystem) + { + /* Odd failure -- but handle it anyway */ + Status = STATUS_NO_SUCH_PACKAGE; + DPRINT1("SMSS: SmpLoadSubSystem - SmpLocateKnownSubSysByType Failed with Status %lx for sessionid %ld\n", + Status, + MuSessionId); + goto Quickie; + } + + /* Duplicate the parent process handle for the subsystem to have */ + Status = NtDuplicateObject(NtCurrentProcess(), + ProcessInformation.ProcessHandle, + Subsystem->ProcessHandle, + &CreateSession->ProcessInfo.ProcessHandle, + PROCESS_ALL_ACCESS, + 0, + 0); + if (!NT_SUCCESS(Status)) + { + /* Fail since this is critical */ + DPRINT1("SMSS: SmpLoadSubSystem - NtDuplicateObject Failed with Status %lx for sessionid %ld\n", + Status, + MuSessionId); + goto Quickie; + } + + /* Duplicate the initial thread handle for the subsystem to have */ + Status = NtDuplicateObject(NtCurrentProcess(), + ProcessInformation.ThreadHandle, + Subsystem->ProcessHandle, + &CreateSession->ProcessInfo.ThreadHandle, + THREAD_ALL_ACCESS, + 0, + 0); + if (!NT_SUCCESS(Status)) + { + /* Fail since this is critical */ + DPRINT1("SMSS: SmpLoadSubSystem - NtDuplicateObject Failed with Status %lx for sessionid %ld\n", + Status, + MuSessionId); + goto Quickie; + } + + /* Allocate an internal Session ID for this subsystem */ + MuSessionId = SmpAllocateSessionId(Subsystem, 0); + CreateSession->SessionId = MuSessionId; + + /* Send the create session message to the subsystem */ + SbApiMsg2.ReturnValue = STATUS_SUCCESS; + SbApiMsg2.h.u2.ZeroInit = 0; + SbApiMsg2.h.u1.s1.DataLength = sizeof(SB_CREATE_SESSION_MSG) + 8; + SbApiMsg2.h.u1.s1.TotalLength = sizeof(SB_API_MSG); + Status = NtRequestWaitReplyPort(Subsystem->SbApiPort, + &SbApiMsg2.h, + &SbApiMsg2.h); + if (NT_SUCCESS(Status)) Status = SbApiMsg2.ReturnValue; + if (!NT_SUCCESS(Status)) + { + /* Delete the session and handle failure if the LPC call failed */ + SmpDeleteSession(CreateSession->SessionId); + DPRINT1("SMSS: SmpLoadSubSystem - NtRequestWaitReplyPort Failed with Status %lx for sessionid %ld\n", + Status, + CreateSession->SessionId); + goto Quickie; + } + } + + /* Okay, everything looks good to go, initialize this subsystem now! */ + DPRINT1("Resuming the subsystem!\n"); + Status = NtResumeThread(ProcessInformation.ThreadHandle, NULL); + if (!NT_SUCCESS(Status)) + { + /* That didn't work -- back out of everything */ + DPRINT1("SMSS: SmpLoadSubSystem - NtResumeThread failed Status %lx\n", Status); + goto Quickie; + } + + /* Check if this was the subsystem for a different session */ + if (MuSessionId) + { + /* Wait up to 60 seconds for it to initialize */ + Timeout.QuadPart = -600000000; + Status = NtWaitForSingleObject(NewSubsystem->Event, FALSE, &Timeout); + + /* Timeout is done -- does this session still exist? */ + if (!SmpCheckDuplicateMuSessionId(MuSessionId)) + { + /* Nope, it died. Cleanup should've ocurred in a different path. */ + DPRINT1("SMSS: SmpLoadSubSystem - session deleted\n"); + return STATUS_DELETE_PENDING; + } + + /* Check if we timed our or there was another error with the wait */ + if (Status != STATUS_WAIT_0) + { + /* Something is wrong with the subsystem, so back out of everything */ + DPRINT1("SMSS: SmpLoadSubSystem - Timeout waiting for subsystem connect with Status %lx for sessionid %ld\n", + Status, + MuSessionId); + goto Quickie; + } + } + else + { + /* This a session 0 subsystem, just wait for it to initialize */ + DPRINT1("Waiting on the subsystem to initialize...\n"); + NtWaitForSingleObject(NewSubsystem->Event, FALSE, NULL); + DPRINT1("Subsystem is ready!!!\n"); + } + + /* Subsystem is created, resumed, and initialized. Close handles and exit */ + NtClose(ProcessInformation.ThreadHandle); + Status = STATUS_SUCCESS; + DPRINT1("Returning success\n"); + goto Quickie2; + +Quickie: + /* This is the failure path. First check if we need to detach from session */ + if ((AttachedSessionId == -1) || (Flags & (SMP_POSIX_FLAG | SMP_OS2_FLAG))) + { + /* We were not attached, or did not launch subsystems that required it */ + DPRINT1("SMSS: Did not detach from Session Space: SessionId=%x Flags=%x Status=%x\n", + AttachedSessionId, + Flags | SMP_DEFERRED_FLAG, + Status); + } + else + { + /* Get the privilege we need for detachment */ + Status = SmpAcquirePrivilege(SE_LOAD_DRIVER_PRIVILEGE, &State); + if (!NT_SUCCESS(Status)) + { + /* We can't detach without it */ + DPRINT1("SMSS: Did not detach from Session Space: SessionId=%x Flags=%x Status=%x\n", + AttachedSessionId, + Flags | SMP_DEFERRED_FLAG, + Status); + } + else + { + /* Now detach from the session */ + Status = NtSetSystemInformation(SystemSessionDetach, + &AttachedSessionId, + sizeof(AttachedSessionId)); + if (!NT_SUCCESS(Status)) + { + /* Failed to detach. Note the DPRINT1 has a typo in Windows */ + DPRINT1("SMSS: SmpStartCsr, Couldn't Detach from Session Space. Status=%x\n", Status); + ASSERT(NT_SUCCESS(Status)); + } + else + { + /* Detachment worked, reset our attached session ID */ + AttachedSessionId = -1; + } + + /* And release the privilege we acquired */ + SmpReleasePrivilege(State); + } + } + + /* Since this is the failure path, terminate the subsystem process */ + NtTerminateProcess(ProcessInformation.ProcessHandle, Status); + NtClose(ProcessInformation.ThreadHandle); + +Quickie2: + /* This is the cleanup path -- first dereference our subsystems */ + RtlEnterCriticalSection(&SmpKnownSubSysLock); + if (Subsystem) SmpDereferenceSubsystem(Subsystem); + if (KnownSubsystem) SmpDereferenceSubsystem(KnownSubsystem); + + /* In the failure case, destroy the new subsystem we just created */ + if (!NT_SUCCESS(Status)) + { + RemoveEntryList(&NewSubsystem->Entry); + NtSetEvent(NewSubsystem->Event, 0); + if (NewSubsystem) SmpDereferenceSubsystem(NewSubsystem); + } + + /* Finally, we're all done! */ + RtlLeaveCriticalSection(&SmpKnownSubSysLock); + return Status; } NTSTATUS From 680bfb5aa7b6a017438b3a0b3d2e89717d613dd7 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 9 Feb 2012 11:34:21 +0000 Subject: [PATCH 274/289] [CLASS2] Fix 64 bit warnings svn path=/trunk/; revision=55510 --- reactos/drivers/storage/class/class2/class2.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/storage/class/class2/class2.c b/reactos/drivers/storage/class/class2/class2.c index e3b830e1bea..60268748ab9 100644 --- a/reactos/drivers/storage/class/class2/class2.c +++ b/reactos/drivers/storage/class/class2/class2.c @@ -1510,7 +1510,7 @@ Return Value: srb, irpStack->MajorFunction, irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL ? irpStack->Parameters.DeviceIoControl.IoControlCode : 0, - MAXIMUM_RETRIES - ((ULONG_PTR)irpStack->Parameters.Others.Argument4), + MAXIMUM_RETRIES - PtrToUlong(irpStack->Parameters.Others.Argument4), &status); // @@ -1662,7 +1662,7 @@ Return Value: srb, irpStack->MajorFunction, irpStack->MajorFunction == IRP_MJ_DEVICE_CONTROL ? irpStack->Parameters.DeviceIoControl.IoControlCode : 0, - MAXIMUM_RETRIES - ((ULONG_PTR)irpStack->Parameters.Others.Argument4), + MAXIMUM_RETRIES - PtrToUlong(irpStack->Parameters.Others.Argument4), &status); // From 0b2dbd9cea3567941f29f01dfc1a0898cd04b0ad Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 9 Feb 2012 11:51:21 +0000 Subject: [PATCH 275/289] [USB] Don't compile nt4 compat driver for amd64 svn path=/trunk/; revision=55511 --- reactos/drivers/usb/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/reactos/drivers/usb/CMakeLists.txt b/reactos/drivers/usb/CMakeLists.txt index 291a4290b86..a86fdfa7adb 100644 --- a/reactos/drivers/usb/CMakeLists.txt +++ b/reactos/drivers/usb/CMakeLists.txt @@ -1,5 +1,7 @@ -add_subdirectory(nt4compat) +if(NOT ${ARCH} MATCHES amd64) + add_subdirectory(nt4compat) +endif() add_subdirectory(usbd) #add_subdirectory(usbehci) The USB branch has usbehci_new #add_subdirectory(usbhub) Compiles, just skipped in trunk From 2de5176c84ff1166bd21fa255009187b8a795169 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 9 Feb 2012 11:54:59 +0000 Subject: [PATCH 276/289] {RTL] - Fix RtlLengthSecurityDescriptor - Fix pointer calculation in amd64 interlocked slist code - Assert that the slist entry pointer is 16 byte aligned [CRT] - Add amd64 stubs for acos and acosf svn path=/trunk/; revision=55512 --- reactos/lib/rtl/amd64/slist.S | 13 +++++++++++-- reactos/lib/rtl/sd.c | 7 ++++++- reactos/lib/sdk/crt/crt.cmake | 2 ++ reactos/lib/sdk/crt/math/amd64/acos.S | 21 +++++++++++++++++++++ reactos/lib/sdk/crt/math/amd64/acosf.S | 21 +++++++++++++++++++++ 5 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 reactos/lib/sdk/crt/math/amd64/acos.S create mode 100644 reactos/lib/sdk/crt/math/amd64/acosf.S diff --git a/reactos/lib/rtl/amd64/slist.S b/reactos/lib/rtl/amd64/slist.S index efdada51999..81ed2061396 100644 --- a/reactos/lib/rtl/amd64/slist.S +++ b/reactos/lib/rtl/amd64/slist.S @@ -18,7 +18,7 @@ #define SLIST8B_HEADERTYPE_MASK HEX(0000000000000001) #define SLIST8B_INIT_MASK HEX(0000000000000002) #define SLIST8B_REGION_MASK HEX(E000000000000000) -#define SLIST8_POINTER_MASK HEX(000007FFFFFFFFF0) +#define SLIST8_POINTER_MASK HEX(000007FFFFFFFFFF) #define SLIST16A_DEPTH_MASK HEX(000000000000FFFF) #define SLIST16A_DEPTH_INC HEX(0000000000000001) @@ -181,6 +181,15 @@ RtlInterlockedPopEntrySListEmpty16: RtlInterlockedPushEntrySList: ExpInterlockedPushEntrySList: +#if DBG + /* Make sure the ListEntry is 16 bytes aligned */ + test rdx, HEX(0F) + jz ExpInterlockedPushEntrySListChecked + /* Not aligned, raise an assertion */ + int HEX(2C) +ExpInterlockedPushEntrySListChecked: +#endif + /* Load ListHead->Alignment into rax */ mov rax, [rcx] @@ -301,7 +310,7 @@ ExpInterlockedFlushSList: RtlInterlockedFlushSListLoop: - /* Zero ListHead->Alignment */ + /* Zero ListHead->Alignment */ xor r8, r8 /* If [rcx] equals rax, exchange it with r8 */ diff --git a/reactos/lib/rtl/sd.c b/reactos/lib/rtl/sd.c index 7d26e568b19..7dc49a3aa6c 100644 --- a/reactos/lib/rtl/sd.c +++ b/reactos/lib/rtl/sd.c @@ -250,10 +250,15 @@ RtlLengthSecurityDescriptor(IN PSECURITY_DESCRIPTOR SecurityDescriptor) { PSID Owner, Group; PACL Sacl, Dacl; - ULONG Length = sizeof(SECURITY_DESCRIPTOR); + ULONG Length; PAGED_CODE_RTL(); + if (((PISECURITY_DESCRIPTOR)SecurityDescriptor)->Control & SE_SELF_RELATIVE) + Length = sizeof(SECURITY_DESCRIPTOR_RELATIVE); + else + Length = sizeof(SECURITY_DESCRIPTOR); + RtlpQuerySecurityDescriptorPointers((PISECURITY_DESCRIPTOR)SecurityDescriptor, &Owner, &Group, diff --git a/reactos/lib/sdk/crt/crt.cmake b/reactos/lib/sdk/crt/crt.cmake index 748eda9bed9..692841b8362 100644 --- a/reactos/lib/sdk/crt/crt.cmake +++ b/reactos/lib/sdk/crt/crt.cmake @@ -392,6 +392,8 @@ elseif(ARCH MATCHES amd64) float/amd64/fpreset.S float/amd64/logb.S float/i386/statfp.c + math/amd64/acos.S + math/amd64/acosf.S math/amd64/atan.S math/amd64/atan2.S math/amd64/ceil.S diff --git a/reactos/lib/sdk/crt/math/amd64/acos.S b/reactos/lib/sdk/crt/math/amd64/acos.S new file mode 100644 index 00000000000..23a90493d6d --- /dev/null +++ b/reactos/lib/sdk/crt/math/amd64/acos.S @@ -0,0 +1,21 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: Implementation of acos + * FILE: lib/sdk/crt/math/amd64/acos.S + * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include + +/* CODE **********************************************************************/ +.code64 + +PUBLIC acos +acos: + UNIMPLEMENTED acos + ret + +END diff --git a/reactos/lib/sdk/crt/math/amd64/acosf.S b/reactos/lib/sdk/crt/math/amd64/acosf.S new file mode 100644 index 00000000000..fab952692bf --- /dev/null +++ b/reactos/lib/sdk/crt/math/amd64/acosf.S @@ -0,0 +1,21 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: Implementation of acosf + * FILE: lib/sdk/crt/math/amd64/acosf.S + * PROGRAMMER: Timo Kreuzer (timo.kreuzer@reactos.org) + */ + +/* INCLUDES ******************************************************************/ + +#include + +/* CODE **********************************************************************/ +.code64 + +PUBLIC acosf +acosf: + UNIMPLEMENTED acos + ret + +END From 672c617e8cb30bdb05a53a982570315d2101577d Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 9 Feb 2012 12:04:31 +0000 Subject: [PATCH 277/289] [NTOSKRNL] Use MiNonPagedSystemSize when creating the system NP memory area instead of making assumptions about the memory layout Finally the amd64 port boots into usermode and usetup is partly working, formats the harddisk but freezes, when copying files. svn path=/trunk/; revision=55513 --- reactos/ntoskrnl/mm/mminit.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 9d603aa9d63..c0ff60fa53e 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -126,8 +126,7 @@ MiInitSystemMemoryAreas() Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, - (ULONG_PTR)MmNonPagedPoolEnd - - (ULONG_PTR)MmNonPagedSystemStart, + MiNonPagedSystemSize, PAGE_READWRITE, &MArea, TRUE, From 9cde5acdc8573b7f6f2a3d5eb8ecf10a8b59bcf4 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Thu, 9 Feb 2012 19:41:38 +0000 Subject: [PATCH 278/289] [win32k] - Use the parse context to store whether or not the desktop object was created. If the object was not created, NtUserCreateDesktop should return immediately (this can happen if it didn't exist) - Before this , if the desktop already exited, we opened the existing desktop and initialized it again. We also created another desktop heap, desktop window, etc.. This fact confused threads using this desktop and caused problems like the assertion we see in the test suite svn path=/trunk/; revision=55517 --- reactos/subsystems/win32/win32k/ntuser/desktop.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index a04d2cedffe..00abc978cf7 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -67,6 +67,10 @@ IntDesktopObjectParse(IN PVOID ParseObject, PLIST_ENTRY NextEntry, ListHead; PWINSTATION_OBJECT WinStaObject = (PWINSTATION_OBJECT)ParseObject; PUNICODE_STRING DesktopName; + PBOOLEAN pContext = (PBOOLEAN) Context; + + if(pContext) + *pContext = FALSE; /* Set the list pointers and loop the window station */ ListHead = &WinStaObject->DesktopListHead; @@ -144,6 +148,7 @@ IntDesktopObjectParse(IN PVOID ParseObject, /* Set the desktop object and return success */ *Object = Desktop; + *pContext = TRUE; return STATUS_SUCCESS; } @@ -844,7 +849,7 @@ NtUserCreateDesktop( CSR_API_MESSAGE Request; PVOID DesktopHeapSystemBase = NULL; SIZE_T DesktopInfoSize; - ULONG DummyContext; + BOOLEAN Context; ULONG_PTR HeapSize = 4 * 1024 * 1024; /* FIXME */ UNICODE_STRING ClassName; LARGE_STRING WindowName; @@ -880,10 +885,12 @@ NtUserCreateDesktop( UserMode, NULL, dwDesiredAccess, - (PVOID)&DummyContext, + (PVOID)&Context, (HANDLE*)&Desktop); if (!NT_SUCCESS(Status)) RETURN(NULL); - if (Status == STATUS_OBJECT_NAME_EXISTS) + + /* In case the object was not created (eg if it existed), return now */ + if (Context == FALSE) { RETURN( Desktop); } From e2efea8263a59df7a12e025caaa5dacde5a5eb43 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 9 Feb 2012 20:01:10 +0000 Subject: [PATCH 279/289] [FREELDR] - Enable new heap code and cleanup the heap, releasing unused memory, before starting reactos - Gives our kernel about 4MB additional memory, which - at the current leak rate - means around 8 minutes longer before it runs out of memory :) - Using the temp heap for all temporary allocations should increase the amount of saved space svn path=/trunk/; revision=55518 --- reactos/boot/freeldr/freeldr/CMakeLists.txt | 3 +- reactos/boot/freeldr/freeldr/mm/heap.c | 157 -- reactos/boot/freeldr/freeldr/rtl/bget.c | 1599 ----------------- .../boot/freeldr/freeldr/windows/wlmemory.c | 5 +- 4 files changed, 5 insertions(+), 1759 deletions(-) delete mode 100644 reactos/boot/freeldr/freeldr/mm/heap.c delete mode 100644 reactos/boot/freeldr/freeldr/rtl/bget.c diff --git a/reactos/boot/freeldr/freeldr/CMakeLists.txt b/reactos/boot/freeldr/freeldr/CMakeLists.txt index c538cf1e1c1..90e17f8d273 100644 --- a/reactos/boot/freeldr/freeldr/CMakeLists.txt +++ b/reactos/boot/freeldr/freeldr/CMakeLists.txt @@ -54,7 +54,7 @@ list(APPEND FREELDR_COMMON_SOURCE inifile/parse.c mm/meminit.c mm/mm.c - mm/heap.c + mm/heap_new.c reactos/registry.c reactos/arcname.c reactos/archwsup.c @@ -155,7 +155,6 @@ endif() list(APPEND FREELDR_BASE_SOURCE bootmgr.c # This file is compiled with custom definitions freeldr.c - rtl/bget.c rtl/libsupp.c) if (NOT MSVC) diff --git a/reactos/boot/freeldr/freeldr/mm/heap.c b/reactos/boot/freeldr/freeldr/mm/heap.c deleted file mode 100644 index e447546a2fa..00000000000 --- a/reactos/boot/freeldr/freeldr/mm/heap.c +++ /dev/null @@ -1,157 +0,0 @@ -/* - * FreeLoader - * Copyright (C) 2006-2008 Aleksey Bragin - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include -#include - -//#define MM_DBG 1 // needs #define BufStats 1 in bget.c - -ULONG MmMaximumHeapAlloc; - -DBG_DEFAULT_CHANNEL(MEMORY); - -VOID MmInitializeHeap(PVOID PageLookupTable) -{ - ULONG PagesNeeded = 0; - ULONG HeapStart = 0; - - // Find contigious memory block for HEAP:STACK - PagesNeeded = HEAP_PAGES + STACK_PAGES; - HeapStart = MmFindAvailablePages(PageLookupTable, TotalPagesInLookupTable, PagesNeeded, FALSE); - - if (HeapStart == 0) - { - UiMessageBox("Critical error: Can't allocate heap!"); - return; - } - - // Initialize BGET - bpool((PVOID)(HeapStart << MM_PAGE_SHIFT), PagesNeeded << MM_PAGE_SHIFT); - - // Mark those pages as used - MmMarkPagesInLookupTable(PageLookupTableAddress, HeapStart, PagesNeeded, LoaderOsloaderHeap); - - TRACE("Heap initialized, base 0x%08x, pages %d\n", (HeapStart << MM_PAGE_SHIFT), PagesNeeded); -} - -PVOID MmHeapAlloc(ULONG MemorySize) -{ - PVOID Result; - - if (MemorySize > MM_PAGE_SIZE) - { - WARN("Consider using other functions to allocate %d bytes of memory!\n", MemorySize); - } - - // Get the buffer from BGET pool - Result = bget(MemorySize); - - if (Result == NULL) - { - ERR("Heap allocation for %d bytes failed\n", MemorySize); - } -#ifdef MM_DBG - { - LONG CurAlloc, TotalFree, MaxFree, NumberOfGets, NumberOfRels; - - // Gather some stats - bstats(&CurAlloc, &TotalFree, &MaxFree, &NumberOfGets, &NumberOfRels); - if (CurAlloc > MmMaximumHeapAlloc) MmMaximumHeapAlloc = CurAlloc; - - TRACE("Current alloc %d, free %d, max alloc %lx, allocs %d, frees %d\n", - CurAlloc, TotalFree, MmMaximumHeapAlloc, NumberOfGets, NumberOfRels); - } -#endif - return Result; -} - -VOID MmHeapFree(PVOID MemoryPointer) -{ - // Release the buffer to the pool - brel(MemoryPointer); -} - - -PVOID -NTAPI -ExAllocatePool( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes) -{ - return MmHeapAlloc(NumberOfBytes); -} - -#undef ExAllocatePoolWithTag -PVOID -NTAPI -ExAllocatePoolWithTag( - IN POOL_TYPE PoolType, - IN SIZE_T NumberOfBytes, - IN ULONG Tag) -{ - return MmHeapAlloc(NumberOfBytes); -} - -#undef ExFreePool -VOID -NTAPI -ExFreePool( - IN PVOID P) -{ - MmHeapFree(P); -} - -#undef ExFreePoolWithTag -VOID -NTAPI -ExFreePoolWithTag( - IN PVOID P, - IN ULONG Tag) -{ - ExFreePool(P); -} - -PVOID -NTAPI -RtlAllocateHeap( - IN PVOID HeapHandle, - IN ULONG Flags, - IN SIZE_T Size) -{ - PVOID ptr; - - ptr = MmHeapAlloc(Size); - if (ptr && (Flags & HEAP_ZERO_MEMORY)) - { - RtlZeroMemory(ptr, Size); - } - - return ptr; -} - -BOOLEAN -NTAPI -RtlFreeHeap( - IN PVOID HeapHandle, - IN ULONG Flags, - IN PVOID HeapBase) -{ - MmHeapFree(HeapBase); - return TRUE; -} diff --git a/reactos/boot/freeldr/freeldr/rtl/bget.c b/reactos/boot/freeldr/freeldr/rtl/bget.c deleted file mode 100644 index fb6c2d49d34..00000000000 --- a/reactos/boot/freeldr/freeldr/rtl/bget.c +++ /dev/null @@ -1,1599 +0,0 @@ -/* - - B G E T - - Buffer allocator - - Designed and implemented in April of 1972 by John Walker, based on the - Case Algol OPRO$ algorithm implemented in 1966. - - Reimplemented in 1975 by John Walker for the Interdata 70. - Reimplemented in 1977 by John Walker for the Marinchip 9900. - Reimplemented in 1982 by Duff Kurland for the Intel 8080. - - Portable C version implemented in September of 1990 by an older, wiser - instance of the original implementor. - - Souped up and/or weighed down slightly shortly thereafter by Greg - Lutz. - - AMIX edition, including the new compaction call-back option, prepared - by John Walker in July of 1992. - - Bug in built-in test program fixed, ANSI compiler warnings eradicated, - buffer pool validator implemented, and guaranteed repeatable test - added by John Walker in October of 1995. - - This program is in the public domain. - - 1. This is the book of the generations of Adam. In the day that God - created man, in the likeness of God made he him; - 2. Male and female created he them; and blessed them, and called - their name Adam, in the day when they were created. - 3. And Adam lived an hundred and thirty years, and begat a son in - his own likeness, and after his image; and called his name Seth: - 4. And the days of Adam after he had begotten Seth were eight - hundred years: and he begat sons and daughters: - 5. And all the days that Adam lived were nine hundred and thirty - years: and he died. - 6. And Seth lived an hundred and five years, and begat Enos: - 7. And Seth lived after he begat Enos eight hundred and seven years, - and begat sons and daughters: - 8. And all the days of Seth were nine hundred and twelve years: and - he died. - 9. And Enos lived ninety years, and begat Cainan: - 10. And Enos lived after he begat Cainan eight hundred and fifteen - years, and begat sons and daughters: - 11. And all the days of Enos were nine hundred and five years: and - he died. - 12. And Cainan lived seventy years and begat Mahalaleel: - 13. And Cainan lived after he begat Mahalaleel eight hundred and - forty years, and begat sons and daughters: - 14. And all the days of Cainan were nine hundred and ten years: and - he died. - 15. And Mahalaleel lived sixty and five years, and begat Jared: - 16. And Mahalaleel lived after he begat Jared eight hundred and - thirty years, and begat sons and daughters: - 17. And all the days of Mahalaleel were eight hundred ninety and - five years: and he died. - 18. And Jared lived an hundred sixty and two years, and he begat - Enoch: - 19. And Jared lived after he begat Enoch eight hundred years, and - begat sons and daughters: - 20. And all the days of Jared were nine hundred sixty and two years: - and he died. - 21. And Enoch lived sixty and five years, and begat Methuselah: - 22. And Enoch walked with God after he begat Methuselah three - hundred years, and begat sons and daughters: - 23. And all the days of Enoch were three hundred sixty and five - years: - 24. And Enoch walked with God: and he was not; for God took him. - 25. And Methuselah lived an hundred eighty and seven years, and - begat Lamech. - 26. And Methuselah lived after he begat Lamech seven hundred eighty - and two years, and begat sons and daughters: - 27. And all the days of Methuselah were nine hundred sixty and nine - years: and he died. - 28. And Lamech lived an hundred eighty and two years, and begat a - son: - 29. And he called his name Noah, saying, This same shall comfort us - concerning our work and toil of our hands, because of the ground - which the LORD hath cursed. - 30. And Lamech lived after he begat Noah five hundred ninety and - five years, and begat sons and daughters: - 31. And all the days of Lamech were seven hundred seventy and seven - years: and he died. - 32. And Noah was five hundred years old: and Noah begat Shem, Ham, - and Japheth. - - And buffers begat buffers, and links begat links, and buffer pools - begat links to chains of buffer pools containing buffers, and lo the - buffers and links and pools of buffers and pools of links to chains of - pools of buffers were fruitful and they multiplied and the Operating - System looked down upon them and said that it was Good. - - - INTRODUCTION - ============ - - BGET is a comprehensive memory allocation package which is easily - configured to the needs of an application. BGET is efficient in - both the time needed to allocate and release buffers and in the - memory overhead required for buffer pool management. It - automatically consolidates contiguous space to minimise - fragmentation. BGET is configured by compile-time definitions, - Major options include: - - * A built-in test program to exercise BGET and - demonstrate how the various functions are used. - - * Allocation by either the "first fit" or "best fit" - method. - - * Wiping buffers at release time to catch code which - references previously released storage. - - * Built-in routines to dump individual buffers or the - entire buffer pool. - - * Retrieval of allocation and pool size statistics. - - * Quantisation of buffer sizes to a power of two to - satisfy hardware alignment constraints. - - * Automatic pool compaction, growth, and shrinkage by - means of call-backs to user defined functions. - - Applications of BGET can range from storage management in - ROM-based embedded programs to providing the framework upon which - a multitasking system incorporating garbage collection is - constructed. BGET incorporates extensive internal consistency - checking using the mechanism; all these checks can be - turned off by compiling with NDEBUG defined, yielding a version of - BGET with minimal size and maximum speed. - - The basic algorithm underlying BGET has withstood the test of - time; more than 25 years have passed since the first - implementation of this code. And yet, it is substantially more - efficient than the native allocation schemes of many operating - systems: the Macintosh and Microsoft Windows to name two, on which - programs have obtained substantial speed-ups by layering BGET as - an application level memory manager atop the underlying system's. - - BGET has been implemented on the largest mainframes and the lowest - of microprocessors. It has served as the core for multitasking - operating systems, multi-thread applications, embedded software in - data network switching processors, and a host of C programs. And - while it has accreted flexibility and additional options over the - years, it remains fast, memory efficient, portable, and easy to - integrate into your program. - - - BGET IMPLEMENTATION ASSUMPTIONS - =============================== - - BGET is written in as portable a dialect of C as possible. The - only fundamental assumption about the underlying hardware - architecture is that memory is allocated is a linear array which - can be addressed as a vector of C "char" objects. On segmented - address space architectures, this generally means that BGET should - be used to allocate storage within a single segment (although some - compilers simulate linear address spaces on segmented - architectures). On segmented architectures, then, BGET buffer - pools may not be larger than a segment, but since BGET allows any - number of separate buffer pools, there is no limit on the total - storage which can be managed, only on the largest individual - object which can be allocated. Machines with a linear address - architecture, such as the VAX, 680x0, Sparc, MIPS, or the Intel - 80386 and above in native mode, may use BGET without restriction. - - - GETTING STARTED WITH BGET - ========================= - - Although BGET can be configured in a multitude of fashions, there - are three basic ways of working with BGET. The functions - mentioned below are documented in the following section. Please - excuse the forward references which are made in the interest of - providing a roadmap to guide you to the BGET functions you're - likely to need. - - Embedded Applications - --------------------- - - Embedded applications typically have a fixed area of memory - dedicated to buffer allocation (often in a separate RAM address - space distinct from the ROM that contains the executable code). - To use BGET in such an environment, simply call bpool() with the - start address and length of the buffer pool area in RAM, then - allocate buffers with bget() and release them with brel(). - Embedded applications with very limited RAM but abundant CPU speed - may benefit by configuring BGET for BestFit allocation (which is - usually not worth it in other environments). - - Malloc() Emulation - ------------------ - - If the C library malloc() function is too slow, not present in - your development environment (for example, an a native Windows or - Macintosh program), or otherwise unsuitable, you can replace it - with BGET. Initially define a buffer pool of an appropriate size - with bpool()--usually obtained by making a call to the operating - system's low-level memory allocator. Then allocate buffers with - bget(), bgetz(), and bgetr() (the last two permit the allocation - of buffers initialised to zero and [inefficient] re-allocation of - existing buffers for compatibility with C library functions). - Release buffers by calling brel(). If a buffer allocation request - fails, obtain more storage from the underlying operating system, - add it to the buffer pool by another call to bpool(), and continue - execution. - - Automatic Storage Management - ---------------------------- - - You can use BGET as your application's native memory manager and - implement automatic storage pool expansion, contraction, and - optionally application-specific memory compaction by compiling - BGET with the BECtl variable defined, then calling bectl() and - supplying functions for storage compaction, acquisition, and - release, as well as a standard pool expansion increment. All of - these functions are optional (although it doesn't make much sense - to provide a release function without an acquisition function, - does it?). Once the call-back functions have been defined with - bectl(), you simply use bget() and brel() to allocate and release - storage as before. You can supply an initial buffer pool with - bpool() or rely on automatic allocation to acquire the entire - pool. When a call on bget() cannot be satisfied, BGET first - checks if a compaction function has been supplied. If so, it is - called (with the space required to satisfy the allocation request - and a sequence number to allow the compaction routine to be called - successively without looping). If the compaction function is able - to free any storage (it needn't know whether the storage it freed - was adequate) it should return a nonzero value, whereupon BGET - will retry the allocation request and, if it fails again, call the - compaction function again with the next-higher sequence number. - - If the compaction function returns zero, indicating failure to - free space, or no compaction function is defined, BGET next tests - whether a non-NULL allocation function was supplied to bectl(). - If so, that function is called with an argument indicating how - many bytes of additional space are required. This will be the - standard pool expansion increment supplied in the call to bectl() - unless the original bget() call requested a buffer larger than - this; buffers larger than the standard pool block can be managed - "off the books" by BGET in this mode. If the allocation function - succeeds in obtaining the storage, it returns a pointer to the new - block and BGET expands the buffer pool; if it fails, the - allocation request fails and returns NULL to the caller. If a - non-NULL release function is supplied, expansion blocks which - become totally empty are released to the global free pool by - passing their addresses to the release function. - - Equipped with appropriate allocation, release, and compaction - functions, BGET can be used as part of very sophisticated memory - management strategies, including garbage collection. (Note, - however, that BGET is *not* a garbage collector by itself, and - that developing such a system requires much additional logic and - careful design of the application's memory allocation strategy.) - - - BGET FUNCTION DESCRIPTIONS - ========================== - - Functions implemented in this file (some are enabled by certain of - the optional settings below): - - void bpool(void *buffer, bufsize len); - - Create a buffer pool of bytes, using the storage starting at - . You can call bpool() subsequently to contribute - additional storage to the overall buffer pool. - - void *bget(bufsize size); - - Allocate a buffer of bytes. The address of the buffer is - returned, or NULL if insufficient memory was available to allocate - the buffer. - - void *bgetz(bufsize size); - - Allocate a buffer of bytes and clear it to all zeroes. The - address of the buffer is returned, or NULL if insufficient memory - was available to allocate the buffer. - - void *bgetr(void *buffer, bufsize newsize); - - Reallocate a buffer previously allocated by bget(), changing its - size to and preserving all existing data. NULL is - returned if insufficient memory is available to reallocate the - buffer, in which case the original buffer remains intact. - - void brel(void *buf); - - Return the buffer , previously allocated by bget(), to the - free space pool. - - void bectl(int (*compact)(bufsize sizereq, int sequence), - void *(*acquire)(bufsize size), - void (*release)(void *buf), - bufsize pool_incr); - - Expansion control: specify functions through which the package may - compact storage (or take other appropriate action) when an - allocation request fails, and optionally automatically acquire - storage for expansion blocks when necessary, and release such - blocks when they become empty. If is non-NULL, whenever - a buffer allocation request fails, the function will be - called with arguments specifying the number of bytes (total buffer - size, including header overhead) required to satisfy the - allocation request, and a sequence number indicating the number of - consecutive calls on attempting to satisfy this - allocation request. The sequence number is 1 for the first call - on for a given allocation request, and increments on - subsequent calls, permitting the function to take - increasingly dire measures in an attempt to free up storage. If - the function returns a nonzero value, the allocation - attempt is re-tried. If returns 0 (as it must if it - isn't able to release any space or add storage to the buffer - pool), the allocation request fails, which can trigger automatic - pool expansion if the argument is non-NULL. At the time - the function is called, the state of the buffer - allocator is identical to that at the moment the allocation - request was made; consequently, the function may call - brel(), bpool(), bstats(), and/or directly manipulate the buffer - pool in any manner which would be valid were the application in - control. This does not, however, relieve the function - of the need to ensure that whatever actions it takes do not change - things underneath the application that made the allocation - request. For example, a function that released a buffer - in the process of being reallocated with bgetr() would lead to - disaster. Implementing a safe and effective mechanism - requires careful design of an application's memory architecture, - and cannot generally be easily retrofitted into existing code. - - If is non-NULL, that function will be called whenever an - allocation request fails. If the function succeeds in - allocating the requested space and returns a pointer to the new - area, allocation will proceed using the expanded buffer pool. If - cannot obtain the requested space, it should return NULL - and the entire allocation process will fail. - specifies the normal expansion block size. Providing an - function will cause subsequent bget() requests for buffers too - large to be managed in the linked-block scheme (in other words, - larger than minus the buffer overhead) to be satisfied - directly by calls to the function. Automatic release of - empty pool blocks will occur only if all pool blocks in the system - are the size given by . - - void bstats(bufsize *curalloc, bufsize *totfree, - bufsize *maxfree, long *nget, long *nrel); - - The amount of space currently allocated is stored into the - variable pointed to by . The total free space (sum of - all free blocks in the pool) is stored into the variable pointed - to by , and the size of the largest single block in the - free space pool is stored into the variable pointed to by - . The variables pointed to by and are - filled, respectively, with the number of successful (non-NULL - return) bget() calls and the number of brel() calls. - - void bstatse(bufsize *pool_incr, long *npool, - long *npget, long *nprel, - long *ndget, long *ndrel); - - Extended statistics: The expansion block size will be stored into - the variable pointed to by , or the negative thereof if - automatic expansion block releases are disabled. The number of - currently active pool blocks will be stored into the variable - pointed to by . The variables pointed to by and - will be filled with, respectively, the number of expansion - block acquisitions and releases which have occurred. The - variables pointed to by and will be filled with - the number of bget() and brel() calls, respectively, managed - through blocks directly allocated by the acquisition and release - functions. - - void bufdump(void *buf); - - The buffer pointed to by is dumped on standard output. - - void bpoold(void *pool, int dumpalloc, int dumpfree); - - All buffers in the buffer pool , previously initialised by a - call on bpool(), are listed in ascending memory address order. If - is nonzero, the contents of allocated buffers are - dumped; if is nonzero, the contents of free blocks are - dumped. - - int bpoolv(void *pool); - - The named buffer pool, previously initialised by a call on - bpool(), is validated for bad pointers, overwritten data, etc. If - compiled with NDEBUG not defined, any error generates an assertion - failure. Otherwise 1 is returned if the pool is valid, 0 if an - error is found. - - - BGET CONFIGURATION - ================== -*/ - -/*#define TestProg 20000*/ /* Generate built-in test program - if defined. The value specifies - how many buffer allocation attempts - the test program should make. */ - -#define SizeQuant 4 /* Buffer allocation size quantum: - all buffers allocated are a - multiple of this size. This - MUST be a power of two. */ -#ifdef MM_DBG - -#define BufDump 1 /* Define this symbol to enable the - bpoold() function which dumps the - buffers in a buffer pool. */ - -#define BufValid 1 /* Define this symbol to enable the - bpoolv() function for validating - a buffer pool. */ - -#define DumpData 1 /* Define this symbol to enable the - bufdump() function which allows - dumping the contents of an allocated - or free buffer. */ - -#define BufStats 1 /* Define this symbol to enable the - bstats() function which calculates - the total free space in the buffer - pool, the largest available - buffer, and the total space - currently allocated. */ - -#define FreeWipe 1 /* Wipe free buffers to a guaranteed - pattern of garbage to trip up - miscreants who attempt to use - pointers into released buffers. */ - -#define BestFit 1 /* Use a best fit algorithm when - searching for space for an - allocation request. This uses - memory more efficiently, but - allocation will be much slower. */ - -#define BECtl 1 /* Define this symbol to enable the - bectl() function for automatic - pool space control. */ -#else -#endif - -#include - -int TuiPrintf(const char *format, ... ); -#define printf TuiPrintf - -#ifdef lint -#define NDEBUG /* Exits in asserts confuse lint */ -/* LINTLIBRARY */ /* Don't complain about def, no ref */ -extern char *sprintf(); /* Sun includes don't define sprintf */ -#endif - -#define NDEBUG - -#include -#include - -#ifdef BufDump /* BufDump implies DumpData */ -#ifndef DumpData -#define DumpData 1 -#endif -#endif - -#ifdef DumpData -#include -#endif - -/* Declare the interface, including the requested buffer size type, - bufsize. */ - -#include "bget.h" - -#define MemSize int /* Type for size arguments to memxxx() - functions such as memcmp(). */ - -/* Queue links */ - -struct qlinks { - struct bfhead *flink; /* Forward link */ - struct bfhead *blink; /* Backward link */ -}; - -/* Header in allocated and free buffers */ - -struct bhead { - bufsize prevfree; /* Relative link back to previous - free buffer in memory or 0 if - previous buffer is allocated. */ - bufsize bsize; /* Buffer size: positive if free, - negative if allocated. */ -}; -#define BH(p) ((struct bhead *) (p)) - -/* Header in directly allocated buffers (by acqfcn) */ - -struct bdhead { - bufsize tsize; /* Total size, including overhead */ - struct bhead bh; /* Common header */ -}; -#define BDH(p) ((struct bdhead *) (p)) - -/* Header in free buffers */ - -struct bfhead { - struct bhead bh; /* Common allocated/free header */ - struct qlinks ql; /* Links on free list */ -}; -#define BFH(p) ((struct bfhead *) (p)) - -static struct bfhead freelist = { /* List of free buffers */ - {0, 0}, - {&freelist, &freelist} -}; - - -#ifdef BufStats -static bufsize totalloc = 0; /* Total space currently allocated */ -static long numget = 0, numrel = 0; /* Number of bget() and brel() calls */ -#ifdef BECtl -static long numpblk = 0; /* Number of pool blocks */ -static long numpget = 0, numprel = 0; /* Number of block gets and rels */ -static long numdget = 0, numdrel = 0; /* Number of direct gets and rels */ -#endif /* BECtl */ -#endif /* BufStats */ - -#ifdef BECtl - -/* Automatic expansion block management functions */ - -static int (*compfcn) _((bufsize sizereq, int sequence)) = NULL; -static void *(*acqfcn) _((bufsize size)) = NULL; -static void (*relfcn) _((void *buf)) = NULL; - -static bufsize exp_incr = 0; /* Expansion block size */ -static bufsize pool_len = 0; /* 0: no bpool calls have been made - -1: not all pool blocks are - the same size - >0: (common) block size for all - bpool calls made so far - */ -#endif - -/* Minimum allocation quantum: */ - -#define QLSize (sizeof(struct qlinks)) -#define SizeQ ((SizeQuant > QLSize) ? SizeQuant : QLSize) - -#define V (void) /* To denote unwanted returned values */ - -/* End sentinel: value placed in bsize field of dummy block delimiting - end of pool block. The most negative number which will fit in a - bufsize, defined in a way that the compiler will accept. */ - -#define ESent ((bufsize) (-(((1L << (sizeof(bufsize) * 8 - 2)) - 1) * 2) - 2)) - -/* BGET -- Allocate a buffer. */ - -void *bget(requested_size) - bufsize requested_size; -{ - bufsize size = requested_size; - struct bfhead *b; -#ifdef BestFit - struct bfhead *best; -#endif - void *buf; -#ifdef BECtl - int compactseq = 0; -#endif - - assert(size > 0); - - if (size < SizeQ) { /* Need at least room for the */ - size = SizeQ; /* queue links. */ - } -#ifdef SizeQuant -#if SizeQuant > 1 - size = (size + (SizeQuant - 1)) & (~(SizeQuant - 1)); -#endif -#endif - - size += sizeof(struct bhead); /* Add overhead in allocated buffer - to size required. */ - -#ifdef BECtl - /* If a compact function was provided in the call to bectl(), wrap - a loop around the allocation process to allow compaction to - intervene in case we don't find a suitable buffer in the chain. */ - - while (1) { -#endif - b = freelist.ql.flink; -#ifdef BestFit - best = &freelist; -#endif - - - /* Scan the free list searching for the first buffer big enough - to hold the requested size buffer. */ - -#ifdef BestFit - while (b != &freelist) { - if (b->bh.bsize >= size) { - if ((best == &freelist) || (b->bh.bsize < best->bh.bsize)) { - best = b; - } - } - b = b->ql.flink; /* Link to next buffer */ - } - b = best; -#endif /* BestFit */ - - while (b != &freelist) { - if ((bufsize) b->bh.bsize >= size) { - - /* Buffer is big enough to satisfy the request. Allocate it - to the caller. We must decide whether the buffer is large - enough to split into the part given to the caller and a - free buffer that remains on the free list, or whether the - entire buffer should be removed from the free list and - given to the caller in its entirety. We only split the - buffer if enough room remains for a header plus the minimum - quantum of allocation. */ - - if ((b->bh.bsize - size) > (SizeQ + (sizeof(struct bhead)))) { - struct bhead *ba, *bn; - - ba = BH(((char *) b) + (b->bh.bsize - size)); - bn = BH(((char *) ba) + size); - assert(bn->prevfree == b->bh.bsize); - /* Subtract size from length of free block. */ - b->bh.bsize -= size; - /* Link allocated buffer to the previous free buffer. */ - ba->prevfree = b->bh.bsize; - /* Plug negative size into user buffer. */ - ba->bsize = -(bufsize) size; - /* Mark buffer after this one not preceded by free block. */ - bn->prevfree = 0; - -#ifdef BufStats - totalloc += size; - numget++; /* Increment number of bget() calls */ -#endif - buf = (void *) ((((char *) ba) + sizeof(struct bhead))); - return buf; - } else { - struct bhead *ba; - - ba = BH(((char *) b) + b->bh.bsize); - assert(ba->prevfree == b->bh.bsize); - - /* The buffer isn't big enough to split. Give the whole - shebang to the caller and remove it from the free list. */ - - assert(b->ql.blink->ql.flink == b); - assert(b->ql.flink->ql.blink == b); - b->ql.blink->ql.flink = b->ql.flink; - b->ql.flink->ql.blink = b->ql.blink; - -#ifdef BufStats - totalloc += b->bh.bsize; - numget++; /* Increment number of bget() calls */ -#endif - /* Negate size to mark buffer allocated. */ - b->bh.bsize = -(b->bh.bsize); - - /* Zero the back pointer in the next buffer in memory - to indicate that this buffer is allocated. */ - ba->prevfree = 0; - - /* Give user buffer starting at queue links. */ - buf = (void *) &(b->ql); - return buf; - } - } - b = b->ql.flink; /* Link to next buffer */ - } -#ifdef BECtl - - /* We failed to find a buffer. If there's a compact function - defined, notify it of the size requested. If it returns - TRUE, try the allocation again. */ - - if ((compfcn == NULL) || (!(*compfcn)(size, ++compactseq))) { - break; - } - } - - /* No buffer available with requested size free. */ - - /* Don't give up yet -- look in the reserve supply. */ - - if (acqfcn != NULL) { - if (size > exp_incr - sizeof(struct bhead)) { - - /* Request is too large to fit in a single expansion - block. Try to satisy it by a direct buffer acquisition. */ - - struct bdhead *bdh; - - size += sizeof(struct bdhead) - sizeof(struct bhead); - if ((bdh = BDH((*acqfcn)((bufsize) size))) != NULL) { - - /* Mark the buffer special by setting the size field - of its header to zero. */ - bdh->bh.bsize = 0; - bdh->bh.prevfree = 0; - bdh->tsize = size; -#ifdef BufStats - totalloc += size; - numget++; /* Increment number of bget() calls */ - numdget++; /* Direct bget() call count */ -#endif - buf = (void *) (bdh + 1); - return buf; - } - - } else { - - /* Try to obtain a new expansion block */ - - void *newpool; - - if ((newpool = (*acqfcn)((bufsize) exp_incr)) != NULL) { - bpool(newpool, exp_incr); - buf = bget(requested_size); /* This can't, I say, can't - get into a loop. */ - return buf; - } - } - } - - /* Still no buffer available */ - -#endif /* BECtl */ - - return NULL; -} - -/* BGETZ -- Allocate a buffer and clear its contents to zero. We clear - the entire contents of the buffer to zero, not just the - region requested by the caller. */ - -void *bgetz(size) - bufsize size; -{ - char *buf = (char *) bget(size); - - if (buf != NULL) { - struct bhead *b; - bufsize rsize; - - b = BH(buf - sizeof(struct bhead)); - rsize = -(b->bsize); - if (rsize == 0) { - struct bdhead *bd; - - bd = BDH(buf - sizeof(struct bdhead)); - rsize = bd->tsize - sizeof(struct bdhead); - } else { - rsize -= sizeof(struct bhead); - } - assert(rsize >= size); - V memset(buf, 0, (MemSize) rsize); - } - return ((void *) buf); -} - -/* BGETR -- Reallocate a buffer. This is a minimal implementation, - simply in terms of brel() and bget(). It could be - enhanced to allow the buffer to grow into adjacent free - blocks and to avoid moving data unnecessarily. */ - -void *bgetr(buf, size) - void *buf; - bufsize size; -{ - void *nbuf; - bufsize osize; /* Old size of buffer */ - struct bhead *b; - - if ((nbuf = bget(size)) == NULL) { /* Acquire new buffer */ - return NULL; - } - if (buf == NULL) { - return nbuf; - } - b = BH(((char *) buf) - sizeof(struct bhead)); - osize = -b->bsize; -#ifdef BECtl - if (osize == 0) { - /* Buffer acquired directly through acqfcn. */ - struct bdhead *bd; - - bd = BDH(((char *) buf) - sizeof(struct bdhead)); - osize = bd->tsize - sizeof(struct bdhead); - } else -#endif - osize -= sizeof(struct bhead); - assert(osize > 0); - V memcpy((char *) nbuf, (char *) buf, /* Copy the data */ - (MemSize) ((size < osize) ? size : osize)); - brel(buf); - return nbuf; -} - -/* BREL -- Release a buffer. */ - -void brel(buf) - void *buf; -{ - struct bfhead *b, *bn; - - b = BFH(((char *) buf) - sizeof(struct bhead)); -#ifdef BufStats - numrel++; /* Increment number of brel() calls */ -#endif - assert(buf != NULL); - -#ifdef BECtl - if (b->bh.bsize == 0) { /* Directly-acquired buffer? */ - struct bdhead *bdh; - - bdh = BDH(((char *) buf) - sizeof(struct bdhead)); - assert(b->bh.prevfree == 0); -#ifdef BufStats - totalloc -= bdh->tsize; - assert(totalloc >= 0); - numdrel++; /* Number of direct releases */ -#endif /* BufStats */ -#ifdef FreeWipe - V memset((char *) buf, 0x55, - (MemSize) (bdh->tsize - sizeof(struct bdhead))); -#endif /* FreeWipe */ - assert(relfcn != NULL); - (*relfcn)((void *) bdh); /* Release it directly. */ - return; - } -#endif /* BECtl */ - - /* Buffer size must be negative, indicating that the buffer is - allocated. */ - - if (b->bh.bsize >= 0) { - bn = NULL; - } - assert(b->bh.bsize < 0); - - /* Back pointer in next buffer must be zero, indicating the - same thing: */ - - assert(BH((char *) b - b->bh.bsize)->prevfree == 0); - -#ifdef BufStats - totalloc += b->bh.bsize; - assert(totalloc >= 0); -#endif - - /* If the back link is nonzero, the previous buffer is free. */ - - if (b->bh.prevfree != 0) { - - /* The previous buffer is free. Consolidate this buffer with it - by adding the length of this buffer to the previous free - buffer. Note that we subtract the size in the buffer being - released, since it's negative to indicate that the buffer is - allocated. */ - - register bufsize size = b->bh.bsize; - - /* Make the previous buffer the one we're working on. */ - assert(BH((char *) b - b->bh.prevfree)->bsize == b->bh.prevfree); - b = BFH(((char *) b) - b->bh.prevfree); - b->bh.bsize -= size; - } else { - - /* The previous buffer isn't allocated. Insert this buffer - on the free list as an isolated free block. */ - - assert(freelist.ql.blink->ql.flink == &freelist); - assert(freelist.ql.flink->ql.blink == &freelist); - b->ql.flink = &freelist; - b->ql.blink = freelist.ql.blink; - freelist.ql.blink = b; - b->ql.blink->ql.flink = b; - b->bh.bsize = -b->bh.bsize; - } - - /* Now we look at the next buffer in memory, located by advancing from - the start of this buffer by its size, to see if that buffer is - free. If it is, we combine this buffer with the next one in - memory, dechaining the second buffer from the free list. */ - - bn = BFH(((char *) b) + b->bh.bsize); - if (bn->bh.bsize > 0) { - - /* The buffer is free. Remove it from the free list and add - its size to that of our buffer. */ - - assert(BH((char *) bn + bn->bh.bsize)->prevfree == bn->bh.bsize); - assert(bn->ql.blink->ql.flink == bn); - assert(bn->ql.flink->ql.blink == bn); - bn->ql.blink->ql.flink = bn->ql.flink; - bn->ql.flink->ql.blink = bn->ql.blink; - b->bh.bsize += bn->bh.bsize; - - /* Finally, advance to the buffer that follows the newly - consolidated free block. We must set its backpointer to the - head of the consolidated free block. We know the next block - must be an allocated block because the process of recombination - guarantees that two free blocks will never be contiguous in - memory. */ - - bn = BFH(((char *) b) + b->bh.bsize); - } -#ifdef FreeWipe - V memset(((char *) b) + sizeof(struct bfhead), 0x55, - (MemSize) (b->bh.bsize - sizeof(struct bfhead))); -#endif - assert(bn->bh.bsize < 0); - - /* The next buffer is allocated. Set the backpointer in it to point - to this buffer; the previous free buffer in memory. */ - - bn->bh.prevfree = b->bh.bsize; - -#ifdef BECtl - - /* If a block-release function is defined, and this free buffer - constitutes the entire block, release it. Note that pool_len - is defined in such a way that the test will fail unless all - pool blocks are the same size. */ - - if (relfcn != NULL && - ((bufsize) b->bh.bsize) == (pool_len - sizeof(struct bhead))) { - - assert(b->bh.prevfree == 0); - assert(BH((char *) b + b->bh.bsize)->bsize == ESent); - assert(BH((char *) b + b->bh.bsize)->prevfree == b->bh.bsize); - /* Unlink the buffer from the free list */ - b->ql.blink->ql.flink = b->ql.flink; - b->ql.flink->ql.blink = b->ql.blink; - - (*relfcn)(b); -#ifdef BufStats - numprel++; /* Nr of expansion block releases */ - numpblk--; /* Total number of blocks */ - assert(numpblk == numpget - numprel); -#endif /* BufStats */ - } -#endif /* BECtl */ -} - -#ifdef BECtl - -/* BECTL -- Establish automatic pool expansion control */ - -void bectl(compact, acquire, release, pool_incr) - int (*compact) _((bufsize sizereq, int sequence)); - void *(*acquire) _((bufsize size)); - void (*release) _((void *buf)); - bufsize pool_incr; -{ - compfcn = compact; - acqfcn = acquire; - relfcn = release; - exp_incr = pool_incr; -} -#endif - -/* BPOOL -- Add a region of memory to the buffer pool. */ - -void bpool(buf, len) - void *buf; - bufsize len; -{ - struct bfhead *b = BFH(buf); - struct bhead *bn; - -#ifdef SizeQuant - len &= ~(SizeQuant - 1); -#endif -#ifdef BECtl - if (pool_len == 0) { - pool_len = len; - } else if (len != pool_len) { - pool_len = -1; - } -#ifdef BufStats - numpget++; /* Number of block acquisitions */ - numpblk++; /* Number of blocks total */ - assert(numpblk == numpget - numprel); -#endif /* BufStats */ -#endif /* BECtl */ - - /* Since the block is initially occupied by a single free buffer, - it had better not be (much) larger than the largest buffer - whose size we can store in bhead.bsize. */ - - assert(len - sizeof(struct bhead) <= -((bufsize) ESent + 1)); - - /* Clear the backpointer at the start of the block to indicate that - there is no free block prior to this one. That blocks - recombination when the first block in memory is released. */ - - b->bh.prevfree = 0; - - /* Chain the new block to the free list. */ - - assert(freelist.ql.blink->ql.flink == &freelist); - assert(freelist.ql.flink->ql.blink == &freelist); - b->ql.flink = &freelist; - b->ql.blink = freelist.ql.blink; - freelist.ql.blink = b; - b->ql.blink->ql.flink = b; - - /* Create a dummy allocated buffer at the end of the pool. This dummy - buffer is seen when a buffer at the end of the pool is released and - blocks recombination of the last buffer with the dummy buffer at - the end. The length in the dummy buffer is set to the largest - negative number to denote the end of the pool for diagnostic - routines (this specific value is not counted on by the actual - allocation and release functions). */ - - len -= sizeof(struct bhead); - b->bh.bsize = (bufsize) len; -#ifdef FreeWipe - V memset(((char *) b) + sizeof(struct bfhead), 0x55, - (MemSize) (len - sizeof(struct bfhead))); -#endif - bn = BH(((char *) b) + len); - bn->prevfree = (bufsize) len; - /* Definition of ESent assumes two's complement! */ - assert((~0) == -1); - bn->bsize = ESent; -} - -#ifdef BufStats - -/* BSTATS -- Return buffer allocation free space statistics. */ - -void bstats(curalloc, totfree, maxfree, nget, nrel) - bufsize *curalloc, *totfree, *maxfree; - long *nget, *nrel; -{ - struct bfhead *b = freelist.ql.flink; - - *nget = numget; - *nrel = numrel; - *curalloc = totalloc; - *totfree = 0; - *maxfree = -1; - while (b != &freelist) { - assert(b->bh.bsize > 0); - *totfree += b->bh.bsize; - if (b->bh.bsize > *maxfree) { - *maxfree = b->bh.bsize; - } - b = b->ql.flink; /* Link to next buffer */ - } -} - -#ifdef BECtl - -/* BSTATSE -- Return extended statistics */ - -void bstatse(pool_incr, npool, npget, nprel, ndget, ndrel) - bufsize *pool_incr; - long *npool, *npget, *nprel, *ndget, *ndrel; -{ - *pool_incr = (pool_len < 0) ? -exp_incr : exp_incr; - *npool = numpblk; - *npget = numpget; - *nprel = numprel; - *ndget = numdget; - *ndrel = numdrel; -} -#endif /* BECtl */ -#endif /* BufStats */ - -#ifdef DumpData - -/* BUFDUMP -- Dump the data in a buffer. This is called with the user - data pointer, and backs up to the buffer header. It will - dump either a free block or an allocated one. */ - -void bufdump(buf) - void *buf; -{ - struct bfhead *b; - unsigned char *bdump; - bufsize bdlen; - - b = BFH(((char *) buf) - sizeof(struct bhead)); - assert(b->bh.bsize != 0); - if (b->bh.bsize < 0) { - bdump = (unsigned char *) buf; - bdlen = (-b->bh.bsize) - sizeof(struct bhead); - } else { - bdump = (unsigned char *) (((char *) b) + sizeof(struct bfhead)); - bdlen = b->bh.bsize - sizeof(struct bfhead); - } - - while (bdlen > 0) { - int i, dupes = 0; - bufsize l = bdlen; - char bhex[50], bascii[20]; - - if (l > 16) { - l = 16; - } - - for (i = 0; i < l; i++) { - V sprintf(bhex + i * 3, "%02X ", bdump[i]); - bascii[i] = isprint(bdump[i]) ? bdump[i] : ' '; - } - bascii[i] = 0; - V printf("%-48s %s\n", bhex, bascii); - bdump += l; - bdlen -= l; - while ((bdlen > 16) && (memcmp((char *) (bdump - 16), - (char *) bdump, 16) == 0)) { - dupes++; - bdump += 16; - bdlen -= 16; - } - if (dupes > 1) { - V printf( - " (%d lines [%d bytes] identical to above line skipped)\n", - dupes, dupes * 16); - } else if (dupes == 1) { - bdump -= 16; - bdlen += 16; - } - } -} -#endif - -#ifdef BufDump - -/* BPOOLD -- Dump a buffer pool. The buffer headers are always listed. - If DUMPALLOC is nonzero, the contents of allocated buffers - are dumped. If DUMPFREE is nonzero, free blocks are - dumped as well. If FreeWipe checking is enabled, free - blocks which have been clobbered will always be dumped. */ - -void bpoold(buf, dumpalloc, dumpfree) - void *buf; - int dumpalloc, dumpfree; -{ - struct bfhead *b = BFH(buf); - - while (b->bh.bsize != ESent) { - bufsize bs = b->bh.bsize; - - if (bs < 0) { - bs = -bs; - V printf("Allocated buffer: size %6ld bytes.\n", (long) bs); - if (dumpalloc) { - bufdump((void *) (((char *) b) + sizeof(struct bhead))); - } - } else { - char *lerr = ""; - - assert(bs > 0); - if ((b->ql.blink->ql.flink != b) || - (b->ql.flink->ql.blink != b)) { - lerr = " (Bad free list links)"; - } - V printf("Free block: size %6ld bytes.%s\n", - (long) bs, lerr); -#ifdef FreeWipe - lerr = ((char *) b) + sizeof(struct bfhead); - if ((bs > sizeof(struct bfhead)) && ((*lerr != 0x55) || - (memcmp(lerr, lerr + 1, - (MemSize) (bs - (sizeof(struct bfhead) + 1))) != 0))) { - V printf( - "(Contents of above free block have been overstored.)\n"); - bufdump((void *) (((char *) b) + sizeof(struct bhead))); - } else -#endif - if (dumpfree) { - bufdump((void *) (((char *) b) + sizeof(struct bhead))); - } - } - b = BFH(((char *) b) + bs); - } -} -#endif /* BufDump */ - -#ifdef BufValid - -/* BPOOLV -- Validate a buffer pool. If NDEBUG isn't defined, - any error generates an assertion failure. */ - -int bpoolv(buf) - void *buf; -{ - struct bfhead *b = BFH(buf); - - while (b->bh.bsize != ESent) { - bufsize bs = b->bh.bsize; - - if (bs < 0) { - bs = -bs; - } else { - char *lerr = ""; - - assert(bs > 0); - if (bs <= 0) { - return 0; - } - if ((b->ql.blink->ql.flink != b) || - (b->ql.flink->ql.blink != b)) { - V printf("Free block: size %6ld bytes. (Bad free list links)\n", - (long) bs); - assert(0); - return 0; - } -#ifdef FreeWipe - lerr = ((char *) b) + sizeof(struct bfhead); - if ((bs > sizeof(struct bfhead)) && ((*lerr != 0x55) || - (memcmp(lerr, lerr + 1, - (MemSize) (bs - (sizeof(struct bfhead) + 1))) != 0))) { - V printf( - "(Contents of above free block have been overstored.)\n"); - bufdump((void *) (((char *) b) + sizeof(struct bhead))); - assert(0); - return 0; - } -#endif - } - b = BFH(((char *) b) + bs); - } - return 1; -} -#endif /* BufValid */ - - /***********************\ - * * - * Built-in test program * - * * - \***********************/ - -#ifdef TestProg - -#define Repeatable 1 /* Repeatable pseudorandom sequence */ - /* If Repeatable is not defined, a - time-seeded pseudorandom sequence - is generated, exercising BGET with - a different pattern of calls on each - run. */ -#define OUR_RAND /* Use our own built-in version of - rand() to guarantee the test is - 100% repeatable. */ - -#ifdef BECtl -#define PoolSize 300000 /* Test buffer pool size */ -#else -#define PoolSize 50000 /* Test buffer pool size */ -#endif -#define ExpIncr 32768 /* Test expansion block size */ -#define CompactTries 10 /* Maximum tries at compacting */ - -#define dumpAlloc 0 /* Dump allocated buffers ? */ -#define dumpFree 0 /* Dump free buffers ? */ - -#ifndef Repeatable -extern long time(); -#endif - -extern char *malloc(); -extern int free _((char *)); - -static char *bchain = NULL; /* Our private buffer chain */ -static char *bp = NULL; /* Our initial buffer pool */ - -#include - -#ifdef OUR_RAND - -static unsigned long int next = 1; - -/* Return next random integer */ - -int rand() -{ - next = next * 1103515245L + 12345; - return (unsigned int) (next / 65536L) % 32768L; -} - -/* Set seed for random generator */ - -void srand(seed) - unsigned int seed; -{ - next = seed; -} -#endif - -/* STATS -- Edit statistics returned by bstats() or bstatse(). */ - -static void stats(when) - char *when; -{ - bufsize cural, totfree, maxfree; - long nget, nfree; -#ifdef BECtl - bufsize pincr; - long totblocks, npget, nprel, ndget, ndrel; -#endif - - bstats(&cural, &totfree, &maxfree, &nget, &nfree); - V printf( - "%s: %ld gets, %ld releases. %ld in use, %ld free, largest = %ld\n", - when, nget, nfree, (long) cural, (long) totfree, (long) maxfree); -#ifdef BECtl - bstatse(&pincr, &totblocks, &npget, &nprel, &ndget, &ndrel); - V printf( - " Blocks: size = %ld, %ld (%ld bytes) in use, %ld gets, %ld frees\n", - (long)pincr, totblocks, pincr * totblocks, npget, nprel); - V printf(" %ld direct gets, %ld direct frees\n", ndget, ndrel); -#endif /* BECtl */ -} - -#ifdef BECtl -static int protect = 0; /* Disable compaction during bgetr() */ - -/* BCOMPACT -- Compaction call-back function. */ - -static int bcompact(bsize, seq) - bufsize bsize; - int seq; -{ -#ifdef CompactTries - char *bc = bchain; - int i = rand() & 0x3; - -#ifdef COMPACTRACE - V printf("Compaction requested. %ld bytes needed, sequence %d.\n", - (long) bsize, seq); -#endif - - if (protect || (seq > CompactTries)) { -#ifdef COMPACTRACE - V printf("Compaction gave up.\n"); -#endif - return 0; - } - - /* Based on a random cast, release a random buffer in the list - of allocated buffers. */ - - while (i > 0 && bc != NULL) { - bc = *((char **) bc); - i--; - } - if (bc != NULL) { - char *fb; - - fb = *((char **) bc); - if (fb != NULL) { - *((char **) bc) = *((char **) fb); - brel((void *) fb); - return 1; - } - } - -#ifdef COMPACTRACE - V printf("Compaction bailed out.\n"); -#endif -#endif /* CompactTries */ - return 0; -} - -/* BEXPAND -- Expand pool call-back function. */ - -static void *bexpand(size) - bufsize size; -{ - void *np = NULL; - bufsize cural, totfree, maxfree; - long nget, nfree; - - /* Don't expand beyond the total allocated size given by PoolSize. */ - - bstats(&cural, &totfree, &maxfree, &nget, &nfree); - - if (cural < PoolSize) { - np = (void *) malloc((unsigned) size); - } -#ifdef EXPTRACE - V printf("Expand pool by %ld -- %s.\n", (long) size, - np == NULL ? "failed" : "succeeded"); -#endif - return np; -} - -/* BSHRINK -- Shrink buffer pool call-back function. */ - -static void bshrink(buf) - void *buf; -{ - if (((char *) buf) == bp) { -#ifdef EXPTRACE - V printf("Initial pool released.\n"); -#endif - bp = NULL; - } -#ifdef EXPTRACE - V printf("Shrink pool.\n"); -#endif - free((char *) buf); -} - -#endif /* BECtl */ - -/* Restrict buffer requests to those large enough to contain our pointer and - small enough for the CPU architecture. */ - -static bufsize blimit(bs) - bufsize bs; -{ - if (bs < sizeof(char *)) { - bs = sizeof(char *); - } - - /* This is written out in this ugly fashion because the - cool expression in sizeof(int) that auto-configured - to any length int befuddled some compilers. */ - - if (sizeof(int) == 2) { - if (bs > 32767) { - bs = 32767; - } - } else { - if (bs > 200000) { - bs = 200000; - } - } - return bs; -} - -int main() -{ - int i; - double x; - - /* Seed the random number generator. If Repeatable is defined, we - always use the same seed. Otherwise, we seed from the clock to - shake things up from run to run. */ - -#ifdef Repeatable - V srand(1234); -#else - V srand((int) time((long *) NULL)); -#endif - - /* Compute x such that pow(x, p) ranges between 1 and 4*ExpIncr as - p ranges from 0 to ExpIncr-1, with a concentration in the lower - numbers. */ - - x = 4.0 * ExpIncr; - x = log(x); - x = exp(log(4.0 * ExpIncr) / (ExpIncr - 1.0)); - -#ifdef BECtl - bectl(bcompact, bexpand, bshrink, (bufsize) ExpIncr); - bp = malloc(ExpIncr); - assert(bp != NULL); - bpool((void *) bp, (bufsize) ExpIncr); -#else - bp = malloc(PoolSize); - assert(bp != NULL); - bpool((void *) bp, (bufsize) PoolSize); -#endif - - stats("Create pool"); - V bpoolv((void *) bp); - bpoold((void *) bp, dumpAlloc, dumpFree); - - for (i = 0; i < TestProg; i++) { - char *cb; - bufsize bs = pow(x, (double) (rand() & (ExpIncr - 1))); - - assert(bs <= (((bufsize) 4) * ExpIncr)); - bs = blimit(bs); - if (rand() & 0x400) { - cb = (char *) bgetz(bs); - } else { - cb = (char *) bget(bs); - } - if (cb == NULL) { -#ifdef EasyOut - break; -#else - char *bc = bchain; - - if (bc != NULL) { - char *fb; - - fb = *((char **) bc); - if (fb != NULL) { - *((char **) bc) = *((char **) fb); - brel((void *) fb); - } - continue; - } -#endif - } - *((char **) cb) = (char *) bchain; - bchain = cb; - - /* Based on a random cast, release a random buffer in the list - of allocated buffers. */ - - if ((rand() & 0x10) == 0) { - char *bc = bchain; - int i = rand() & 0x3; - - while (i > 0 && bc != NULL) { - bc = *((char **) bc); - i--; - } - if (bc != NULL) { - char *fb; - - fb = *((char **) bc); - if (fb != NULL) { - *((char **) bc) = *((char **) fb); - brel((void *) fb); - } - } - } - - /* Based on a random cast, reallocate a random buffer in the list - to a random size */ - - if ((rand() & 0x20) == 0) { - char *bc = bchain; - int i = rand() & 0x3; - - while (i > 0 && bc != NULL) { - bc = *((char **) bc); - i--; - } - if (bc != NULL) { - char *fb; - - fb = *((char **) bc); - if (fb != NULL) { - char *newb; - - bs = pow(x, (double) (rand() & (ExpIncr - 1))); - bs = blimit(bs); -#ifdef BECtl - protect = 1; /* Protect against compaction */ -#endif - newb = (char *) bgetr((void *) fb, bs); -#ifdef BECtl - protect = 0; -#endif - if (newb != NULL) { - *((char **) bc) = newb; - } - } - } - } - } - stats("\nAfter allocation"); - if (bp != NULL) { - V bpoolv((void *) bp); - bpoold((void *) bp, dumpAlloc, dumpFree); - } - - while (bchain != NULL) { - char *buf = bchain; - - bchain = *((char **) buf); - brel((void *) buf); - } - stats("\nAfter release"); -#ifndef BECtl - if (bp != NULL) { - V bpoolv((void *) bp); - bpoold((void *) bp, dumpAlloc, dumpFree); - } -#endif - - return 0; -} -#endif diff --git a/reactos/boot/freeldr/freeldr/windows/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/wlmemory.c index d5492a8376d..505c52e9454 100644 --- a/reactos/boot/freeldr/freeldr/windows/wlmemory.c +++ b/reactos/boot/freeldr/freeldr/windows/wlmemory.c @@ -202,8 +202,11 @@ WinLdrSetupMemoryLayout(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock) //PKTSS Tss; //BOOLEAN Status; + /* Cleanup heap */ + HeapCleanupAll(); + // - // Creating a suitable memory map for the Windows can be tricky, so let's + // Creating a suitable memory map for Windows can be tricky, so let's // give a few advices: // 1) One must not map the whole available memory pages to PDE! // Map only what's needed - 16Mb, 24Mb, 32Mb max I think, From dd52d89b536242fba1b1f27b726505a7f388b600 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 9 Feb 2012 20:10:26 +0000 Subject: [PATCH 280/289] [FREELDR] Rename Heap_new.c to Heap.c svn path=/trunk/; revision=55519 --- reactos/boot/freeldr/freeldr/CMakeLists.txt | 2 +- reactos/boot/freeldr/freeldr/mm/{heap_new.c => heap.c} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename reactos/boot/freeldr/freeldr/mm/{heap_new.c => heap.c} (100%) diff --git a/reactos/boot/freeldr/freeldr/CMakeLists.txt b/reactos/boot/freeldr/freeldr/CMakeLists.txt index 90e17f8d273..8098bd89233 100644 --- a/reactos/boot/freeldr/freeldr/CMakeLists.txt +++ b/reactos/boot/freeldr/freeldr/CMakeLists.txt @@ -54,7 +54,7 @@ list(APPEND FREELDR_COMMON_SOURCE inifile/parse.c mm/meminit.c mm/mm.c - mm/heap_new.c + mm/heap.c reactos/registry.c reactos/arcname.c reactos/archwsup.c diff --git a/reactos/boot/freeldr/freeldr/mm/heap_new.c b/reactos/boot/freeldr/freeldr/mm/heap.c similarity index 100% rename from reactos/boot/freeldr/freeldr/mm/heap_new.c rename to reactos/boot/freeldr/freeldr/mm/heap.c From ed481636c66645f97260d11af4d9e2604d1c2b16 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 9 Feb 2012 20:11:35 +0000 Subject: [PATCH 281/289] [FREELDR] Fix rbuild... svn path=/trunk/; revision=55520 --- reactos/boot/freeldr/freeldr/freeldr_base.rbuild | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild index 3be3b3408fc..a23f0cc66e1 100644 --- a/reactos/boot/freeldr/freeldr/freeldr_base.rbuild +++ b/reactos/boot/freeldr/freeldr/freeldr_base.rbuild @@ -51,7 +51,6 @@ binhive.c - bget.c libsupp.c From af8d992a9ef8c16a07602d2fd62c4bf8fe58b889 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Thu, 9 Feb 2012 23:18:47 +0000 Subject: [PATCH 282/289] [win32k] - fix some more tests in user32:winstation svn path=/trunk/; revision=55522 --- reactos/subsystems/win32/win32k/ntuser/desktop.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index 00abc978cf7..d41f0426cd8 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -1243,11 +1243,21 @@ NtUserCloseDesktop(HDESK hDesktop) { PDESKTOP Object; NTSTATUS Status; + PTHREADINFO pti; DECLARE_RETURN(BOOL); + pti = PsGetCurrentThreadWin32Thread(); + TRACE("Enter NtUserCloseDesktop\n"); UserEnterExclusive(); + if( hDesktop == pti->hdesk || hDesktop == pti->ppi->hdeskStartup) + { + ERR("Attempted to close thread desktop\n"); + EngSetLastError(ERROR_BUSY); + RETURN(FALSE); + } + TRACE("About to close desktop handle (0x%X)\n", hDesktop); Status = IntValidateDesktopHandle( From cb1539b7df635a0add672d6b33b6a86f49b60cf2 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 10 Feb 2012 17:36:11 +0000 Subject: [PATCH 283/289] [RTL] Fix64 bit warnings svn path=/trunk/; revision=55527 --- reactos/include/ndk/rtlfuncs.h | 6 +++--- reactos/lib/rtl/atom.c | 2 +- reactos/lib/rtl/path.c | 34 +++++++++++++++++----------------- reactos/lib/rtl/res.c | 3 ++- reactos/lib/rtl/slist.c | 6 +++--- reactos/lib/rtl/time.c | 2 +- reactos/lib/rtl/unicode.c | 3 +-- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/reactos/include/ndk/rtlfuncs.h b/reactos/include/ndk/rtlfuncs.h index 4ec355f5a67..235c2d836e7 100644 --- a/reactos/include/ndk/rtlfuncs.h +++ b/reactos/include/ndk/rtlfuncs.h @@ -2533,8 +2533,8 @@ RtlDosSearchPath_Ustr( IN PUNICODE_STRING CallerBuffer, IN OUT PUNICODE_STRING DynamicString OPTIONAL, OUT PUNICODE_STRING* FullNameOut OPTIONAL, - OUT PULONG FilePartSize OPTIONAL, - OUT PULONG LengthNeeded OPTIONAL + OUT PSIZE_T FilePartSize OPTIONAL, + OUT PSIZE_T LengthNeeded OPTIONAL ); NTSYSAPI @@ -2608,7 +2608,7 @@ RtlGetFullPathName_UstrEx( IN PSIZE_T FilePartSize, OUT PBOOLEAN NameInvalid, OUT RTL_PATH_TYPE* PathType, - OUT PULONG LengthNeeded + OUT PSIZE_T LengthNeeded ); NTSYSAPI diff --git a/reactos/lib/rtl/atom.c b/reactos/lib/rtl/atom.c index dde6658346f..aa09ae71e90 100644 --- a/reactos/lib/rtl/atom.c +++ b/reactos/lib/rtl/atom.c @@ -349,7 +349,7 @@ RtlAddAtomToAtomTable(IN PRTL_ATOM_TABLE AtomTable, simply add it to the list */ if (HashLink != NULL) { - ULONG AtomNameLen = wcslen(AtomName); + ULONG AtomNameLen = (ULONG)wcslen(AtomName); if (AtomNameLen > RTL_MAXIMUM_ATOM_LENGTH) { diff --git a/reactos/lib/rtl/path.c b/reactos/lib/rtl/path.c index 3fc824f6063..78b79a10aea 100644 --- a/reactos/lib/rtl/path.c +++ b/reactos/lib/rtl/path.c @@ -138,7 +138,7 @@ RtlIsDosDeviceName_Ustr(IN PCUNICODE_STRING PathString) ((c == 'l') || (c == 'c') || (c == 'p') || (c == 'a') || (c == 'n'))) { /* Calculate the offset */ - ReturnOffset = (PCHAR)End - (PCHAR)PathCopy.Buffer; + ReturnOffset = (USHORT)((PCHAR)End - (PCHAR)PathCopy.Buffer); /* Build the final string */ PathCopy.Length = OriginalLength - ReturnOffset - (ColonCount * sizeof(WCHAR)); @@ -179,7 +179,7 @@ RtlIsDosDeviceName_Ustr(IN PCUNICODE_STRING PathString) while ((Start > PathCopy.Buffer) && (Start[-1] == ' ')) --Start; /* Finally see how many characters are left, and that's our size */ - PathChars = Start - PathCopy.Buffer; + PathChars = (USHORT)(Start - PathCopy.Buffer); PathCopy.Length = PathChars * sizeof(WCHAR); /* Check if this is a COM or LPT port, which has a digit after it */ @@ -641,13 +641,13 @@ RtlpDosPathNameToRelativeNtPathName_Ustr(IN BOOLEAN HaveRelative, RtlReleasePebLock(); return Status; } - + /* File is in current directory */ if (RtlEqualUnicodeString(&FullPath, &CurrentDirectory->DosPath, TRUE)) { /* Make relative name string */ RelativeName->RelativeName.Buffer = (PWSTR)((ULONG_PTR)NewBuffer + FullPath.Length - PrefixCut); - RelativeName->RelativeName.Length = PathLength - FullPath.Length; + RelativeName->RelativeName.Length = (USHORT)(PathLength - FullPath.Length); /* If relative name starts with \, skip it */ if (RelativeName->RelativeName.Buffer[0] == L'\\') { @@ -1116,7 +1116,7 @@ RtlSetCurrentDirectory_U(IN PUNICODE_STRING Path) CurDirHandle = (HANDLE)((ULONG_PTR)CurDirHandle | RTL_CURDIR_IS_REMOVABLE); } - FullPath.Length = FullPathLength; + FullPath.Length = (USHORT)FullPathLength; /* If full path isn't \ terminated, do it */ if (FullPath.Buffer[CharLength - 1] != L'\\') @@ -1784,7 +1784,7 @@ RtlGetFullPathName_UstrEx(IN PUNICODE_STRING FileName, IN PSIZE_T FilePartSize, OUT PBOOLEAN NameInvalid, OUT RTL_PATH_TYPE* PathType, - OUT PULONG LengthNeeded) + OUT PSIZE_T LengthNeeded) { NTSTATUS Status; PWCHAR StaticBuffer; @@ -1846,7 +1846,7 @@ RtlGetFullPathName_UstrEx(IN PUNICODE_STRING FileName, if ((StaticString) && (Length < StaticLength)) { /* Set the final length */ - StaticString->Length = Length; + StaticString->Length = (USHORT)Length; /* Set the file part size */ if (FilePartSize) *FilePartSize = ShortName ? (ShortName - StaticString->Buffer) : 0; @@ -1878,7 +1878,7 @@ RtlGetFullPathName_UstrEx(IN PUNICODE_STRING FileName, /* Set the settings for the dynamic string the caller sent */ DynamicString->MaximumLength = StaticLength; - DynamicString->Length = Length; + DynamicString->Length = (USHORT)Length; DynamicString->Buffer = StaticBuffer; /* Set the part size */ @@ -1914,7 +1914,7 @@ RtlGetFullPathName_UstrEx(IN PUNICODE_STRING FileName, if ((StaticString) && (Length < StaticLength)) { /* Set the final length */ - StaticString->Length = Length; + StaticString->Length = (USHORT)Length; /* Set the file part size */ if (FilePartSize) *FilePartSize = ShortName ? (ShortName - StaticString->Buffer) : 0; @@ -1946,7 +1946,7 @@ RtlGetFullPathName_UstrEx(IN PUNICODE_STRING FileName, } /* Add space for a NULL terminator, and now check the full path */ - TempDynamicString.MaximumLength = Length + sizeof(UNICODE_NULL); + TempDynamicString.MaximumLength = (USHORT)Length + sizeof(UNICODE_NULL); Length = RtlGetFullPathName_Ustr(FileName, Length, TempDynamicString.Buffer, @@ -1979,7 +1979,7 @@ RtlGetFullPathName_UstrEx(IN PUNICODE_STRING FileName, /* Finalize the string and return it to the user */ DynamicString->Buffer = TempDynamicString.Buffer; - DynamicString->Length = Length; + DynamicString->Length = (USHORT)Length; DynamicString->MaximumLength = TempDynamicString.MaximumLength; if (StringUsed) *StringUsed = DynamicString; @@ -2027,16 +2027,16 @@ RtlDosSearchPath_Ustr(IN ULONG Flags, IN PUNICODE_STRING CallerBuffer, IN OUT PUNICODE_STRING DynamicString OPTIONAL, OUT PUNICODE_STRING* FullNameOut OPTIONAL, - OUT PULONG FilePartSize OPTIONAL, - OUT PULONG LengthNeeded OPTIONAL) + OUT PSIZE_T FilePartSize OPTIONAL, + OUT PSIZE_T LengthNeeded OPTIONAL) { WCHAR StaticCandidateBuffer[MAX_PATH]; UNICODE_STRING StaticCandidateString; NTSTATUS Status; RTL_PATH_TYPE PathType; PWCHAR p, End, CandidateEnd, SegmentEnd; - ULONG SegmentSize, NamePlusExtLength, PathSize, MaxPathSize = 0, WorstCaseLength, ByteCount; - USHORT ExtensionLength = 0; + SIZE_T SegmentSize, ByteCount, PathSize, MaxPathSize = 0; + USHORT NamePlusExtLength, WorstCaseLength, ExtensionLength = 0; PUNICODE_STRING FullIsolatedPath; DPRINT("DOS Path Search: %lx %wZ %wZ %wZ %wZ %wZ\n", Flags, PathString, FileNameString, ExtensionString, CallerBuffer, DynamicString); @@ -2177,7 +2177,7 @@ RtlDosSearchPath_Ustr(IN ULONG Flags, /* Use the extension, the file name, and the largest path as the size */ WorstCaseLength = ExtensionLength + FileNameString->Length + - MaxPathSize + + (USHORT)MaxPathSize + sizeof(UNICODE_NULL); if (WorstCaseLength > UNICODE_STRING_MAX_BYTES) { @@ -2292,7 +2292,7 @@ RtlDosSearchPath_Ustr(IN ULONG Flags, *CandidateEnd = UNICODE_NULL; /* Now set the final length of the string so it becomes valid */ - StaticCandidateString.Length = (CandidateEnd - + StaticCandidateString.Length = (USHORT)(CandidateEnd - StaticCandidateString.Buffer) * sizeof(WCHAR); diff --git a/reactos/lib/rtl/res.c b/reactos/lib/rtl/res.c index 91ed90fab8c..4c296fe8171 100644 --- a/reactos/lib/rtl/res.c +++ b/reactos/lib/rtl/res.c @@ -133,7 +133,8 @@ IMAGE_RESOURCE_DIRECTORY *find_entry_by_name( IMAGE_RESOURCE_DIRECTORY *dir, { const IMAGE_RESOURCE_DIRECTORY_ENTRY *entry; const IMAGE_RESOURCE_DIR_STRING_U *str; - int min, max, res, pos, namelen; + int min, max, res, pos; + size_t namelen; if (!((ULONG_PTR)name & 0xFFFF0000)) return find_entry_by_id( dir, (ULONG_PTR)name & 0xFFFF, root, want_dir ); entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1); diff --git a/reactos/lib/rtl/slist.c b/reactos/lib/rtl/slist.c index 4d291abe70e..fe96ab6248d 100644 --- a/reactos/lib/rtl/slist.c +++ b/reactos/lib/rtl/slist.c @@ -58,13 +58,13 @@ RtlFirstEntrySList(IN const SLIST_HEADER *ListHead) #endif } -WORD +WORD NTAPI RtlQueryDepthSList(IN PSLIST_HEADER ListHead) { #ifdef _WIN64 - return ListHead->Header8.HeaderType ? - ListHead->Header16.Sequence : ListHead->Header8.Sequence; + return ListHead->Header8.HeaderType ? + (WORD)ListHead->Header16.Sequence : (WORD)ListHead->Header8.Sequence; #else return ListHead->Depth; #endif diff --git a/reactos/lib/rtl/time.c b/reactos/lib/rtl/time.c index 0a6f68505a7..5433c3a15fe 100644 --- a/reactos/lib/rtl/time.c +++ b/reactos/lib/rtl/time.c @@ -37,7 +37,7 @@ #endif -static const int YearLengths[2] = +static const unsigned int YearLengths[2] = { DAYSPERNORMALYEAR, DAYSPERLEAPYEAR }; diff --git a/reactos/lib/rtl/unicode.c b/reactos/lib/rtl/unicode.c index c91d04cbd81..16eb6112791 100644 --- a/reactos/lib/rtl/unicode.c +++ b/reactos/lib/rtl/unicode.c @@ -2525,8 +2525,7 @@ RtlFindCharInUnicodeString( BOOLEAN Found; const BOOLEAN WantToFind = (Flags & RTL_FIND_CHAR_IN_UNICODE_STRING_COMPLEMENT_CHAR_SET) == 0; const BOOLEAN CaseInSensitive = (Flags & RTL_FIND_CHAR_IN_UNICODE_STRING_CASE_INSENSITIVE) != 0; - INT Length; - INT i; + USHORT i, Length; DPRINT("RtlFindCharInUnicodeString(%u, '%wZ', '%wZ', %p)\n", Flags, SearchString, MatchString, Position); From fd8ceb0b0d752ba0c118aedb29d71370768391e2 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Fri, 10 Feb 2012 18:57:55 +0000 Subject: [PATCH 284/289] [NTOSKRNL] IoCreateSymbolicLink -> IoAssignArcName svn path=/trunk/; revision=55528 --- reactos/ntoskrnl/io/iomgr/arcname.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/io/iomgr/arcname.c b/reactos/ntoskrnl/io/iomgr/arcname.c index d70b4864580..c56359bc489 100644 --- a/reactos/ntoskrnl/io/iomgr/arcname.c +++ b/reactos/ntoskrnl/io/iomgr/arcname.c @@ -108,7 +108,7 @@ IopCreateArcNames(IN PLOADER_PARAMETER_BLOCK LoaderBlock) if (NT_SUCCESS(Status)) { /* Map ARC to NT name */ - IoCreateSymbolicLink(&BootDeviceName, &SystemDevice); + IoAssignArcName(&BootDeviceName, &SystemDevice); RtlFreeUnicodeString(&BootDeviceName); /* Now, get loader path name */ @@ -381,7 +381,7 @@ IopCreateArcNamesCd(IN PLOADER_PARAMETER_BLOCK LoaderBlock) if (NT_SUCCESS(Status)) { /* Create symbolic link */ - IoCreateSymbolicLink(&ArcNameStringW, &DeviceStringW); + IoAssignArcName(&ArcNameStringW, &DeviceStringW); RtlFreeUnicodeString(&ArcNameStringW); DPRINT1("Boot device found\n"); } @@ -724,7 +724,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, } /* Link both */ - IoCreateSymbolicLink(&ArcNameStringW, &DeviceStringW); + IoAssignArcName(&ArcNameStringW, &DeviceStringW); /* And release resources */ RtlFreeUnicodeString(&ArcNameStringW); @@ -781,7 +781,7 @@ IopCreateArcNamesDisk(IN PLOADER_PARAMETER_BLOCK LoaderBlock, } /* Link device name & ARC name */ - IoCreateSymbolicLink(&ArcNameStringW, &DeviceStringW); + IoAssignArcName(&ArcNameStringW, &DeviceStringW); /* Release strings */ RtlFreeUnicodeString(&ArcNameStringW); From 3234bb7c43911ca99eac0978e054535934821a00 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 10 Feb 2012 19:10:17 +0000 Subject: [PATCH 285/289] [FREELDR] Fix 64 bit warnings Patch by Samuel Serapion, slightly modified by me svn path=/trunk/; revision=55529 --- .../boot/freeldr/freeldr/arch/amd64/winldr.c | 12 ++-- .../boot/freeldr/freeldr/arch/arm/winldr.c | 6 +- .../boot/freeldr/freeldr/arch/i386/pcvideo.c | 2 +- .../boot/freeldr/freeldr/arch/i386/winldr.c | 10 +-- .../boot/freeldr/freeldr/cache/blocklist.c | 2 +- reactos/boot/freeldr/freeldr/cache/cache.c | 4 +- reactos/boot/freeldr/freeldr/fs/fs.c | 24 +++---- reactos/boot/freeldr/freeldr/include/cache.h | 4 +- reactos/boot/freeldr/freeldr/include/mm.h | 44 ++++++------ reactos/boot/freeldr/freeldr/include/winldr.h | 6 +- reactos/boot/freeldr/freeldr/inifile/parse.c | 2 +- reactos/boot/freeldr/freeldr/mm/heap.c | 26 +++---- reactos/boot/freeldr/freeldr/mm/meminit.c | 68 +++++++++---------- reactos/boot/freeldr/freeldr/mm/mm.c | 32 ++++----- .../boot/freeldr/freeldr/reactos/archwsup.c | 8 +-- .../boot/freeldr/freeldr/reactos/registry.c | 14 ++-- reactos/boot/freeldr/freeldr/ui/tui.c | 20 +++--- reactos/boot/freeldr/freeldr/ui/tuimenu.c | 10 +-- reactos/boot/freeldr/freeldr/ui/ui.c | 11 +-- .../boot/freeldr/freeldr/windows/peloader.c | 2 +- .../boot/freeldr/freeldr/windows/wlmemory.c | 14 ++-- .../boot/freeldr/freeldr/windows/wlregistry.c | 6 +- 22 files changed, 164 insertions(+), 163 deletions(-) diff --git a/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c b/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c index 14b4a2e062c..68d8569b189 100644 --- a/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c +++ b/reactos/boot/freeldr/freeldr/arch/amd64/winldr.c @@ -145,10 +145,10 @@ MempIsPageMapped(PVOID VirtualAddress) return TRUE; } -ULONG -MempMapRangeOfPages(ULONG64 VirtualAddress, ULONG64 PhysicalAddress, ULONG cPages) +PFN_NUMBER +MempMapRangeOfPages(ULONG64 VirtualAddress, ULONG64 PhysicalAddress, PFN_NUMBER cPages) { - ULONG i; + PFN_NUMBER i; for (i = 0; i < cPages; i++) { @@ -165,8 +165,8 @@ MempMapRangeOfPages(ULONG64 VirtualAddress, ULONG64 PhysicalAddress, ULONG cPage } BOOLEAN -MempSetupPaging(IN ULONG StartPage, - IN ULONG NumberOfPages, +MempSetupPaging(IN PFN_NUMBER StartPage, + IN PFN_NUMBER NumberOfPages, IN BOOLEAN KernelMapping) { TRACE(">>> MempSetupPaging(0x%lx, %ld, %p)\n", @@ -196,7 +196,7 @@ MempSetupPaging(IN ULONG StartPage, } VOID -MempUnmapPage(ULONG Page) +MempUnmapPage(PFN_NUMBER Page) { // TRACE(">>> MempUnmapPage\n"); } diff --git a/reactos/boot/freeldr/freeldr/arch/arm/winldr.c b/reactos/boot/freeldr/freeldr/arch/arm/winldr.c index 37356a4107f..8301f10eae6 100644 --- a/reactos/boot/freeldr/freeldr/arch/arm/winldr.c +++ b/reactos/boot/freeldr/freeldr/arch/arm/winldr.c @@ -80,14 +80,14 @@ PKPDR_PAGE PdrPage; /* FUNCTIONS **************************************************************/ BOOLEAN -MempSetupPaging(IN ULONG StartPage, - IN ULONG NumberOfPages) +MempSetupPaging(IN PFN_NUMBER StartPage, + IN PFN_COUNT NumberOfPages) { return TRUE; } VOID -MempUnmapPage(IN ULONG Page) +MempUnmapPage(IN PFN_NUMBER Page) { return; } diff --git a/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c b/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c index c571097d541..b481dd4ec0d 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/pcvideo.c @@ -416,7 +416,7 @@ PcVideoSet480ScanLines(VOID) CRTC = (CRTC | 0xE2); /* (write) */ - WRITE_PORT_UCHAR((PUCHAR)0x03C2, CRTC); + WRITE_PORT_UCHAR((PUCHAR)0x03C2, (UCHAR)CRTC); } static VOID diff --git a/reactos/boot/freeldr/freeldr/arch/i386/winldr.c b/reactos/boot/freeldr/freeldr/arch/i386/winldr.c index cb94d0b4ead..2bb5979f0ed 100644 --- a/reactos/boot/freeldr/freeldr/arch/i386/winldr.c +++ b/reactos/boot/freeldr/freeldr/arch/i386/winldr.c @@ -143,13 +143,13 @@ MempAllocatePTE(ULONG Entry, PHARDWARE_PTE *PhysicalPT, PHARDWARE_PTE *KernelPT) } BOOLEAN -MempSetupPaging(IN ULONG StartPage, - IN ULONG NumberOfPages, +MempSetupPaging(IN PFN_NUMBER StartPage, + IN PFN_COUNT NumberOfPages, IN BOOLEAN KernelMapping) { PHARDWARE_PTE PhysicalPT; PHARDWARE_PTE KernelPT; - ULONG Entry, Page; + PFN_COUNT Entry, Page; TRACE("MempSetupPaging: SP 0x%X, Number: 0x%X, Kernel: %s\n", StartPage, NumberOfPages, KernelMapping ? "yes" : "no"); @@ -199,10 +199,10 @@ MempSetupPaging(IN ULONG StartPage, } VOID -MempUnmapPage(ULONG Page) +MempUnmapPage(PFN_NUMBER Page) { PHARDWARE_PTE KernelPT; - ULONG Entry = (Page >> 10) + (KSEG0_BASE >> 22); + PFN_NUMBER Entry = (Page >> 10) + (KSEG0_BASE >> 22); /* Don't unmap hyperspace or HAL entries */ if (Entry == HYPER_SPACE_ENTRY || Entry == 1023) diff --git a/reactos/boot/freeldr/freeldr/cache/blocklist.c b/reactos/boot/freeldr/freeldr/cache/blocklist.c index 67c648df1cb..ffe82b4f352 100644 --- a/reactos/boot/freeldr/freeldr/cache/blocklist.c +++ b/reactos/boot/freeldr/freeldr/cache/blocklist.c @@ -175,7 +175,7 @@ BOOLEAN CacheInternalFreeBlock(PCACHE_DRIVE CacheDrive) VOID CacheInternalCheckCacheSizeLimits(PCACHE_DRIVE CacheDrive) { - ULONG NewCacheSize; + SIZE_T NewCacheSize; TRACE("CacheInternalCheckCacheSizeLimits()\n"); diff --git a/reactos/boot/freeldr/freeldr/cache/cache.c b/reactos/boot/freeldr/freeldr/cache/cache.c index dc2342577d2..ac547a772da 100644 --- a/reactos/boot/freeldr/freeldr/cache/cache.c +++ b/reactos/boot/freeldr/freeldr/cache/cache.c @@ -31,8 +31,8 @@ CACHE_DRIVE CacheManagerDrive; BOOLEAN CacheManagerInitialized = FALSE; BOOLEAN CacheManagerDataInvalid = FALSE; ULONG CacheBlockCount = 0; -ULONG CacheSizeLimit = 0; -ULONG CacheSizeCurrent = 0; +SIZE_T CacheSizeLimit = 0; +SIZE_T CacheSizeCurrent = 0; BOOLEAN CacheInitializeDrive(UCHAR DriveNumber) { diff --git a/reactos/boot/freeldr/freeldr/fs/fs.c b/reactos/boot/freeldr/freeldr/fs/fs.c index 34527e9458e..6692115acd8 100644 --- a/reactos/boot/freeldr/freeldr/fs/fs.c +++ b/reactos/boot/freeldr/freeldr/fs/fs.c @@ -248,14 +248,14 @@ LONG ArcGetFileInformation(ULONG FileId, FILEINFORMATION* Information) LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) { - ULONG i, ret; + ULONG Count, i, ret; PLIST_ENTRY pEntry; DEVICE* pDevice; CHAR* DeviceName; CHAR* FileName; CHAR* p; CHAR* q; - ULONG dwCount, dwLength; + SIZE_T Length; OPENMODE DeviceOpenMode; ULONG DeviceId; @@ -271,16 +271,16 @@ LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) FileName++; /* Count number of "()", which needs to be replaced by "(0)" */ - dwCount = 0; + Count = 0; for (p = Path; p != FileName; p++) if (*p == '(' && *(p + 1) == ')') - dwCount++; + Count++; /* Duplicate device name, and replace "()" by "(0)" (if required) */ - dwLength = FileName - Path + dwCount; - if (dwCount != 0) + Length = FileName - Path + Count; + if (Count != 0) { - DeviceName = MmHeapAlloc(FileName - Path + dwCount); + DeviceName = MmHeapAlloc(FileName - Path + Count); if (!DeviceName) return ENOMEM; for (p = Path, q = DeviceName; p != FileName; p++) @@ -302,7 +302,7 @@ LONG ArcOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) while (pEntry != &DeviceListHead) { pDevice = CONTAINING_RECORD(pEntry, DEVICE, ListEntry); - if (strncmp(pDevice->Prefix, DeviceName, dwLength) == 0) + if (strncmp(pDevice->Prefix, DeviceName, Length) == 0) { /* OK, device found. It is already opened? */ if (pDevice->ReferenceCount == 0) @@ -412,18 +412,18 @@ LONG ArcSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode) VOID FsRegisterDevice(CHAR* Prefix, const DEVVTBL* FuncTable) { DEVICE* pNewEntry; - ULONG dwLength; + SIZE_T Length; TRACE("FsRegisterDevice() Prefix = %s\n", Prefix); - dwLength = strlen(Prefix) + 1; - pNewEntry = MmHeapAlloc(sizeof(DEVICE) + dwLength); + Length = strlen(Prefix) + 1; + pNewEntry = MmHeapAlloc(sizeof(DEVICE) + Length); if (!pNewEntry) return; pNewEntry->FuncTable = FuncTable; pNewEntry->ReferenceCount = 0; pNewEntry->Prefix = (CHAR*)(pNewEntry + 1); - memcpy(pNewEntry->Prefix, Prefix, dwLength); + memcpy(pNewEntry->Prefix, Prefix, Length); InsertHeadList(&DeviceListHead, &pNewEntry->ListEntry); } diff --git a/reactos/boot/freeldr/freeldr/include/cache.h b/reactos/boot/freeldr/freeldr/include/cache.h index ecc02acac5f..ae6c7707e9b 100644 --- a/reactos/boot/freeldr/freeldr/include/cache.h +++ b/reactos/boot/freeldr/freeldr/include/cache.h @@ -67,8 +67,8 @@ typedef struct extern CACHE_DRIVE CacheManagerDrive; extern BOOLEAN CacheManagerInitialized; extern ULONG CacheBlockCount; -extern ULONG CacheSizeLimit; -extern ULONG CacheSizeCurrent; +extern SIZE_T CacheSizeLimit; +extern SIZE_T CacheSizeCurrent; /////////////////////////////////////////////////////////////////////////////////////// // diff --git a/reactos/boot/freeldr/freeldr/include/mm.h b/reactos/boot/freeldr/freeldr/include/mm.h index c9068e1c6d7..a453a284770 100644 --- a/reactos/boot/freeldr/freeldr/include/mm.h +++ b/reactos/boot/freeldr/freeldr/include/mm.h @@ -60,7 +60,7 @@ typedef struct _FREELDR_MEMORY_DESCRIPTOR typedef struct { TYPE_OF_MEMORY PageAllocated; // Type of allocated memory (LoaderFree if this memory is free) - ULONG PageAllocationLength; // Number of pages allocated (or zero if this isn't the first page in the chain) + PFN_NUMBER PageAllocationLength; // Number of pages allocated (or zero if this isn't the first page in the chain) } PAGE_LOOKUP_TABLE_ITEM, *PPAGE_LOOKUP_TABLE_ITEM; #include @@ -72,38 +72,38 @@ typedef struct #define DUMP_MEM_MAP_ON_VERIFY 0 extern PVOID PageLookupTableAddress; -extern ULONG TotalPagesInLookupTable; -extern ULONG FreePagesInLookupTable; -extern ULONG LastFreePageHint; +extern PFN_NUMBER TotalPagesInLookupTable; +extern PFN_NUMBER FreePagesInLookupTable; +extern PFN_NUMBER LastFreePageHint; #if DBG PCSTR MmGetSystemMemoryMapTypeString(TYPE_OF_MEMORY Type); #endif -ULONG MmGetPageNumberFromAddress(PVOID Address); // Returns the page number that contains a linear address -ULONG MmGetAddressablePageCountIncludingHoles(VOID); // Returns the count of addressable pages from address zero including any memory holes and reserved memory regions -PVOID MmFindLocationForPageLookupTable(ULONG TotalPageCount); // Returns the address for a memory chunk big enough to hold the page lookup table (starts search from end of memory) -VOID MmInitPageLookupTable(PVOID PageLookupTable, ULONG TotalPageCount); // Inits the page lookup table according to the memory types in the memory map -VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG PageCount, TYPE_OF_MEMORY PageAllocated); // Marks the specified pages as allocated or free in the lookup table -VOID MmAllocatePagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG PageCount, TYPE_OF_MEMORY MemoryType); // Allocates the specified pages in the lookup table -ULONG MmCountFreePagesInLookupTable(PVOID PageLookupTable, ULONG TotalPageCount); // Returns the number of free pages in the lookup table -ULONG MmFindAvailablePages(PVOID PageLookupTable, ULONG TotalPageCount, ULONG PagesNeeded, BOOLEAN FromEnd); // Returns the page number of the first available page range from the beginning or end of memory -ULONG MmFindAvailablePagesBeforePage(PVOID PageLookupTable, ULONG TotalPageCount, ULONG PagesNeeded, ULONG LastPage); // Returns the page number of the first available page range before the specified page -VOID MmUpdateLastFreePageHint(PVOID PageLookupTable, ULONG TotalPageCount); // Sets the LastFreePageHint to the last usable page of memory -BOOLEAN MmAreMemoryPagesAvailable(PVOID PageLookupTable, ULONG TotalPageCount, PVOID PageAddress, ULONG PageCount); // Returns TRUE if the specified pages of memory are available, otherwise FALSE -VOID MmSetMemoryType(PVOID MemoryAddress, ULONG MemorySize, TYPE_OF_MEMORY NewType); // Use with EXTREME caution! +PFN_NUMBER MmGetPageNumberFromAddress(PVOID Address); // Returns the page number that contains a linear address +PFN_NUMBER MmGetAddressablePageCountIncludingHoles(VOID); // Returns the count of addressable pages from address zero including any memory holes and reserved memory regions +PVOID MmFindLocationForPageLookupTable(PFN_NUMBER TotalPageCount); // Returns the address for a memory chunk big enough to hold the page lookup table (starts search from end of memory) +VOID MmInitPageLookupTable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount); // Inits the page lookup table according to the memory types in the memory map +VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER StartPage, PFN_NUMBER PageCount, TYPE_OF_MEMORY PageAllocated); // Marks the specified pages as allocated or free in the lookup table +VOID MmAllocatePagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER StartPage, PFN_NUMBER PageCount, TYPE_OF_MEMORY MemoryType); // Allocates the specified pages in the lookup table +PFN_NUMBER MmCountFreePagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount); // Returns the number of free pages in the lookup table +PFN_NUMBER MmFindAvailablePages(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PFN_NUMBER PagesNeeded, BOOLEAN FromEnd); // Returns the page number of the first available page range from the beginning or end of memory +PFN_NUMBER MmFindAvailablePagesBeforePage(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PFN_NUMBER PagesNeeded, PFN_NUMBER LastPage); // Returns the page number of the first available page range before the specified page +VOID MmUpdateLastFreePageHint(PVOID PageLookupTable, PFN_NUMBER TotalPageCount); // Sets the LastFreePageHint to the last usable page of memory +BOOLEAN MmAreMemoryPagesAvailable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PVOID PageAddress, PFN_NUMBER PageCount); // Returns TRUE if the specified pages of memory are available, otherwise FALSE +VOID MmSetMemoryType(PVOID MemoryAddress, SIZE_T MemorySize, TYPE_OF_MEMORY NewType); // Use with EXTREME caution! -PPAGE_LOOKUP_TABLE_ITEM MmGetMemoryMap(ULONG *NoEntries); // Returns a pointer to the memory mapping table and a number of entries in it +PPAGE_LOOKUP_TABLE_ITEM MmGetMemoryMap(PFN_NUMBER *NoEntries); // Returns a pointer to the memory mapping table and a number of entries in it //BOOLEAN MmInitializeMemoryManager(ULONG LowMemoryStart, ULONG LowMemoryLength); BOOLEAN MmInitializeMemoryManager(VOID); VOID MmInitializeHeap(PVOID PageLookupTable); -PVOID MmAllocateMemory(ULONG MemorySize); -PVOID MmAllocateMemoryWithType(ULONG MemorySize, TYPE_OF_MEMORY MemoryType); +PVOID MmAllocateMemory(SIZE_T MemorySize); +PVOID MmAllocateMemoryWithType(SIZE_T MemorySize, TYPE_OF_MEMORY MemoryType); VOID MmFreeMemory(PVOID MemoryPointer); -PVOID MmAllocateMemoryAtAddress(ULONG MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType); -PVOID MmAllocateHighestMemoryBelowAddress(ULONG MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType); +PVOID MmAllocateMemoryAtAddress(SIZE_T MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType); +PVOID MmAllocateHighestMemoryBelowAddress(SIZE_T MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType); PVOID MmHeapAlloc(SIZE_T MemorySize); VOID MmHeapFree(PVOID MemoryPointer); @@ -114,7 +114,7 @@ extern PVOID FrLdrTempHeap; PVOID HeapCreate( - ULONG MaximumSize, + SIZE_T MaximumSize, TYPE_OF_MEMORY MemoryType); VOID diff --git a/reactos/boot/freeldr/freeldr/include/winldr.h b/reactos/boot/freeldr/freeldr/include/winldr.h index 84bfa377353..58e0057f374 100644 --- a/reactos/boot/freeldr/freeldr/include/winldr.h +++ b/reactos/boot/freeldr/freeldr/include/winldr.h @@ -162,12 +162,12 @@ BOOLEAN MempAllocatePageTables(); BOOLEAN -MempSetupPaging(IN ULONG StartPage, - IN ULONG NumberOfPages, +MempSetupPaging(IN PFN_NUMBER StartPage, + IN PFN_NUMBER NumberOfPages, IN BOOLEAN KernelMapping); VOID -MempUnmapPage(ULONG Page); +MempUnmapPage(PFN_NUMBER Page); VOID MempDump(); diff --git a/reactos/boot/freeldr/freeldr/inifile/parse.c b/reactos/boot/freeldr/freeldr/inifile/parse.c index d1937eec12d..8af3080f57f 100644 --- a/reactos/boot/freeldr/freeldr/inifile/parse.c +++ b/reactos/boot/freeldr/freeldr/inifile/parse.c @@ -73,7 +73,7 @@ BOOLEAN IniParseFile(PCHAR IniFileData, ULONG IniFileSize) // Get the line of data CurrentOffset = IniGetNextLine(IniFileData, IniFileSize, IniFileLine, IniFileLineSize, CurrentOffset); - LineLength = strlen(IniFileLine); + LineLength = (ULONG)strlen(IniFileLine); // If it is a blank line or a comment then skip it if (IniIsLineEmpty(IniFileLine, LineLength) || IniIsCommentLine(IniFileLine, LineLength)) diff --git a/reactos/boot/freeldr/freeldr/mm/heap.c b/reactos/boot/freeldr/freeldr/mm/heap.c index e3a89f22754..07a083bad69 100644 --- a/reactos/boot/freeldr/freeldr/mm/heap.c +++ b/reactos/boot/freeldr/freeldr/mm/heap.c @@ -30,8 +30,8 @@ PVOID FrLdrTempHeap; typedef struct _BLOCK_DATA { - ULONG Flink; - ULONG Blink; + ULONG_PTR Flink; + ULONG_PTR Blink; } BLOCK_DATA, *PBLOCK_DATA; typedef struct _HEAP_BLOCK @@ -44,26 +44,26 @@ typedef struct _HEAP_BLOCK typedef struct _HEAP { - ULONG MaximumSize; - ULONG CurrentAllocBytes; - ULONG MaxAllocBytes; + SIZE_T MaximumSize; + SIZE_T CurrentAllocBytes; + SIZE_T MaxAllocBytes; ULONG NumAllocs; ULONG NumFrees; - ULONG LargestAllocation; + SIZE_T LargestAllocation; ULONGLONG AllocationTime; ULONGLONG FreeTime; - ULONG TerminatingBlock; + ULONG_PTR TerminatingBlock; HEAP_BLOCK Blocks; } HEAP, *PHEAP; PVOID HeapCreate( - ULONG MaximumSize, + SIZE_T MaximumSize, TYPE_OF_MEMORY MemoryType) { PHEAP Heap; PHEAP_BLOCK Block; - ULONG Remaining; + SIZE_T Remaining; USHORT PreviousSize; TRACE("HeapCreate(MemoryType=%ld)\n", MemoryType); @@ -136,7 +136,7 @@ HeapDestroy( /* Mark all pages as firmware temporary, so they are free for the kernel */ MmMarkPagesInLookupTable(PageLookupTableAddress, (ULONG_PTR)Heap / MM_PAGE_SIZE, - Heap->MaximumSize / MM_PAGE_SIZE, + (PFN_COUNT)(Heap->MaximumSize / MM_PAGE_SIZE), LoaderFirmwareTemporary); } @@ -147,7 +147,7 @@ HeapRelease( PHEAP Heap = HeapHandle; PHEAP_BLOCK Block; PUCHAR StartAddress, EndAddress; - ULONG FreePages, AllFreePages = 0; + PFN_COUNT FreePages, AllFreePages = 0; TRACE("HeapRelease(%p)\n", HeapHandle); /* Loop all heap chunks */ @@ -176,7 +176,7 @@ HeapRelease( EndAddress = ALIGN_DOWN_POINTER_BY(Block->Data, PAGE_SIZE); } - FreePages = (EndAddress - StartAddress) / MM_PAGE_SIZE; + FreePages = (PFN_COUNT)((EndAddress - StartAddress) / MM_PAGE_SIZE); AllFreePages += FreePages; /* Now mark the pages free */ @@ -449,7 +449,7 @@ MmInitializeHeap(PVOID PageLookupTable) } PVOID -MmHeapAlloc(ULONG MemorySize) +MmHeapAlloc(SIZE_T MemorySize) { return HeapAllocate(FrLdrDefaultHeap, MemorySize, 'pHmM'); } diff --git a/reactos/boot/freeldr/freeldr/mm/meminit.c b/reactos/boot/freeldr/freeldr/mm/meminit.c index d818218d970..7794f6f1639 100644 --- a/reactos/boot/freeldr/freeldr/mm/meminit.c +++ b/reactos/boot/freeldr/freeldr/mm/meminit.c @@ -53,11 +53,11 @@ ULONG MemoryTypeCount = sizeof(MemoryTypeArray) / sizeof(MemoryTypeArray[0]); #endif PVOID PageLookupTableAddress = NULL; -ULONG TotalPagesInLookupTable = 0; -ULONG FreePagesInLookupTable = 0; -ULONG LastFreePageHint = 0; -ULONG MmLowestPhysicalPage = 0xFFFFFFFF; -ULONG MmHighestPhysicalPage = 0; +PFN_NUMBER TotalPagesInLookupTable = 0; +PFN_NUMBER FreePagesInLookupTable = 0; +PFN_NUMBER LastFreePageHint = 0; +PFN_NUMBER MmLowestPhysicalPage = 0xFFFFFFFF; +PFN_NUMBER MmHighestPhysicalPage = 0; PFREELDR_MEMORY_DESCRIPTOR BiosMemoryMap; ULONG BiosMemoryMapEntryCount; @@ -232,15 +232,15 @@ PCSTR MmGetSystemMemoryMapTypeString(TYPE_OF_MEMORY Type) } #endif -ULONG MmGetPageNumberFromAddress(PVOID Address) +PFN_NUMBER MmGetPageNumberFromAddress(PVOID Address) { return ((ULONG_PTR)Address) / MM_PAGE_SIZE; } -ULONG MmGetAddressablePageCountIncludingHoles(VOID) +PFN_NUMBER MmGetAddressablePageCountIncludingHoles(VOID) { const FREELDR_MEMORY_DESCRIPTOR* MemoryDescriptor = NULL; - ULONG PageCount; + PFN_NUMBER PageCount; // // Go through the whole memory map to get max address @@ -277,12 +277,12 @@ ULONG MmGetAddressablePageCountIncludingHoles(VOID) return PageCount; } -PVOID MmFindLocationForPageLookupTable(ULONG TotalPageCount) +PVOID MmFindLocationForPageLookupTable(PFN_NUMBER TotalPageCount) { const FREELDR_MEMORY_DESCRIPTOR* MemoryDescriptor = NULL; - ULONG PageLookupTableSize; - ULONG PageLookupTablePages; - ULONG PageLookupTableStartPage = 0; + SIZE_T PageLookupTableSize; + PFN_NUMBER PageLookupTablePages; + PFN_NUMBER PageLookupTableStartPage = 0; PVOID PageLookupTableMemAddress = NULL; // Calculate how much pages we need to keep the page lookup table @@ -316,11 +316,11 @@ PVOID MmFindLocationForPageLookupTable(ULONG TotalPageCount) return PageLookupTableMemAddress; } -VOID MmInitPageLookupTable(PVOID PageLookupTable, ULONG TotalPageCount) +VOID MmInitPageLookupTable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount) { const FREELDR_MEMORY_DESCRIPTOR* MemoryDescriptor = NULL; - ULONG PageLookupTableStartPage; - ULONG PageLookupTablePageCount; + PFN_NUMBER PageLookupTableStartPage; + PFN_NUMBER PageLookupTablePageCount; TRACE("MmInitPageLookupTable()\n"); @@ -359,10 +359,10 @@ VOID MmInitPageLookupTable(PVOID PageLookupTable, ULONG TotalPageCount) MmMarkPagesInLookupTable(PageLookupTable, PageLookupTableStartPage, PageLookupTablePageCount, LoaderFirmwareTemporary); } -VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG PageCount, TYPE_OF_MEMORY PageAllocated) +VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER StartPage, PFN_NUMBER PageCount, TYPE_OF_MEMORY PageAllocated) { - PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable; - ULONG Index; + PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable; + PFN_NUMBER Index; TRACE("MmMarkPagesInLookupTable()\n"); /* Validate the range */ @@ -389,10 +389,10 @@ VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG Page TRACE("MmMarkPagesInLookupTable() Done\n"); } -VOID MmAllocatePagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG PageCount, TYPE_OF_MEMORY MemoryType) +VOID MmAllocatePagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER StartPage, PFN_NUMBER PageCount, TYPE_OF_MEMORY MemoryType) { PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable; - ULONG Index; + PFN_NUMBER Index; StartPage -= MmLowestPhysicalPage; for (Index=StartPage; Index<(StartPage+PageCount); Index++) @@ -402,11 +402,11 @@ VOID MmAllocatePagesInLookupTable(PVOID PageLookupTable, ULONG StartPage, ULONG } } -ULONG MmCountFreePagesInLookupTable(PVOID PageLookupTable, ULONG TotalPageCount) +PFN_NUMBER MmCountFreePagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount) { PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable; - ULONG Index; - ULONG FreePageCount; + PFN_NUMBER Index; + PFN_NUMBER FreePageCount; FreePageCount = 0; for (Index=0; Index TotalPageCount) { @@ -479,11 +479,11 @@ ULONG MmFindAvailablePages(PVOID PageLookupTable, ULONG TotalPageCount, ULONG Pa return 0; } -ULONG MmFindAvailablePagesBeforePage(PVOID PageLookupTable, ULONG TotalPageCount, ULONG PagesNeeded, ULONG LastPage) +PFN_NUMBER MmFindAvailablePagesBeforePage(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PFN_NUMBER PagesNeeded, PFN_NUMBER LastPage) { PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable; - ULONG AvailablePagesSoFar; - ULONG Index; + PFN_NUMBER AvailablePagesSoFar; + PFN_NUMBER Index; if (LastPage > TotalPageCount) { @@ -512,10 +512,10 @@ ULONG MmFindAvailablePagesBeforePage(PVOID PageLookupTable, ULONG TotalPageCount return 0; } -VOID MmUpdateLastFreePageHint(PVOID PageLookupTable, ULONG TotalPageCount) +VOID MmUpdateLastFreePageHint(PVOID PageLookupTable, PFN_NUMBER TotalPageCount) { PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable; - ULONG Index; + PFN_NUMBER Index; for (Index=TotalPageCount-1; Index>0; Index--) { @@ -527,11 +527,11 @@ VOID MmUpdateLastFreePageHint(PVOID PageLookupTable, ULONG TotalPageCount) } } -BOOLEAN MmAreMemoryPagesAvailable(PVOID PageLookupTable, ULONG TotalPageCount, PVOID PageAddress, ULONG PageCount) +BOOLEAN MmAreMemoryPagesAvailable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PVOID PageAddress, PFN_NUMBER PageCount) { PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTable; - ULONG StartPage; - ULONG Index; + PFN_NUMBER StartPage; + PFN_NUMBER Index; StartPage = MmGetPageNumberFromAddress(PageAddress); diff --git a/reactos/boot/freeldr/freeldr/mm/mm.c b/reactos/boot/freeldr/freeldr/mm/mm.c index bf1b2063f25..cad4860d15f 100644 --- a/reactos/boot/freeldr/freeldr/mm/mm.c +++ b/reactos/boot/freeldr/freeldr/mm/mm.c @@ -27,12 +27,12 @@ VOID MemAllocTest(VOID); DBG_DEFAULT_CHANNEL(MEMORY); -ULONG LoaderPagesSpanned = 0; +PFN_NUMBER LoaderPagesSpanned = 0; -PVOID MmAllocateMemoryWithType(ULONG MemorySize, TYPE_OF_MEMORY MemoryType) +PVOID MmAllocateMemoryWithType(SIZE_T MemorySize, TYPE_OF_MEMORY MemoryType) { - ULONG PagesNeeded; - ULONG FirstFreePageFromEnd; + PFN_NUMBER PagesNeeded; + PFN_NUMBER FirstFreePageFromEnd; PVOID MemPointer; if (MemorySize == 0) @@ -83,10 +83,10 @@ PVOID MmAllocateMemoryWithType(ULONG MemorySize, TYPE_OF_MEMORY MemoryType) return MemPointer; } -PVOID MmAllocateMemoryAtAddress(ULONG MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType) +PVOID MmAllocateMemoryAtAddress(SIZE_T MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType) { - ULONG PagesNeeded; - ULONG StartPageNumber; + PFN_NUMBER PagesNeeded; + PFN_NUMBER StartPageNumber; PVOID MemPointer; if (MemorySize == 0) @@ -142,10 +142,10 @@ PVOID MmAllocateMemoryAtAddress(ULONG MemorySize, PVOID DesiredAddress, TYPE_OF_ return MemPointer; } -VOID MmSetMemoryType(PVOID MemoryAddress, ULONG MemorySize, TYPE_OF_MEMORY NewType) +VOID MmSetMemoryType(PVOID MemoryAddress, SIZE_T MemorySize, TYPE_OF_MEMORY NewType) { - ULONG PagesNeeded; - ULONG StartPageNumber; + PFN_NUMBER PagesNeeded; + PFN_NUMBER StartPageNumber; // Find out how many blocks it will take to // satisfy this allocation @@ -158,11 +158,11 @@ VOID MmSetMemoryType(PVOID MemoryAddress, ULONG MemorySize, TYPE_OF_MEMORY NewTy MmAllocatePagesInLookupTable(PageLookupTableAddress, StartPageNumber, PagesNeeded, NewType); } -PVOID MmAllocateHighestMemoryBelowAddress(ULONG MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType) +PVOID MmAllocateHighestMemoryBelowAddress(SIZE_T MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType) { - ULONG PagesNeeded; - ULONG FirstFreePageFromEnd; - ULONG DesiredAddressPageNumber; + PFN_NUMBER PagesNeeded; + PFN_NUMBER FirstFreePageFromEnd; + PFN_NUMBER DesiredAddressPageNumber; PVOID MemPointer; if (MemorySize == 0) @@ -221,7 +221,7 @@ VOID MmFreeMemory(PVOID MemoryPointer) VOID DumpMemoryAllocMap(VOID) { - ULONG Idx; + PFN_NUMBER Idx; PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTableAddress; DbgPrint("----------- Memory Allocation Bitmap -----------\n"); @@ -295,7 +295,7 @@ VOID DumpMemoryAllocMap(VOID) } #endif // DBG -PPAGE_LOOKUP_TABLE_ITEM MmGetMemoryMap(ULONG *NoEntries) +PPAGE_LOOKUP_TABLE_ITEM MmGetMemoryMap(PFN_NUMBER *NoEntries) { PPAGE_LOOKUP_TABLE_ITEM RealPageLookupTable = (PPAGE_LOOKUP_TABLE_ITEM)PageLookupTableAddress; diff --git a/reactos/boot/freeldr/freeldr/reactos/archwsup.c b/reactos/boot/freeldr/freeldr/reactos/archwsup.c index 5abf4d02f7c..31291d8ad60 100644 --- a/reactos/boot/freeldr/freeldr/reactos/archwsup.c +++ b/reactos/boot/freeldr/freeldr/reactos/archwsup.c @@ -15,7 +15,7 @@ /* GLOBALS ********************************************************************/ extern CHAR reactos_arc_hardware_data[]; -ULONG FldrpHwHeapLocation; +SIZE_T FldrpHwHeapLocation; PCONFIGURATION_COMPONENT_DATA FldrArcHwTreeRoot; BOOLEAN UseRealHeap = FALSE; @@ -30,7 +30,7 @@ FldrSetConfigurationData(IN PCONFIGURATION_COMPONENT_DATA ComponentData, PVOID NTAPI -FldrpHwHeapAlloc(IN ULONG Size) +FldrpHwHeapAlloc(IN SIZE_T Size) { PVOID Buffer; @@ -62,7 +62,7 @@ NTAPI FldrSetIdentifier(IN PCONFIGURATION_COMPONENT_DATA ComponentData, IN PCHAR IdentifierString) { - ULONG IdentifierLength; + SIZE_T IdentifierLength; PCONFIGURATION_COMPONENT Component = &ComponentData->ComponentEntry; PCHAR Identifier; @@ -75,7 +75,7 @@ FldrSetIdentifier(IN PCONFIGURATION_COMPONENT_DATA ComponentData, RtlCopyMemory(Identifier, IdentifierString, IdentifierLength); /* Set component information */ - Component->IdentifierLength = IdentifierLength; + Component->IdentifierLength = (ULONG)IdentifierLength; Component->Identifier = Identifier; } diff --git a/reactos/boot/freeldr/freeldr/reactos/registry.c b/reactos/boot/freeldr/freeldr/reactos/registry.c index f401807d175..8de13024d66 100644 --- a/reactos/boot/freeldr/freeldr/reactos/registry.c +++ b/reactos/boot/freeldr/freeldr/reactos/registry.c @@ -174,8 +174,8 @@ RegCreateKey(FRLDRHKEY ParentKey, FRLDRHKEY NewKey; PWCHAR p; PCWSTR name; - int subkeyLength; - int stringLength; + SIZE_T subkeyLength; + SIZE_T stringLength; ULONG NameSize; int CmpResult; @@ -220,7 +220,7 @@ RegCreateKey(FRLDRHKEY ParentKey, stringLength = subkeyLength; name = KeyName; } - NameSize = (subkeyLength + 1) * sizeof(WCHAR); + NameSize = (ULONG)((subkeyLength + 1) * sizeof(WCHAR)); Ptr = CurrentKey->SubKeyList.Flink; CmpResult = 1; @@ -345,8 +345,8 @@ RegOpenKey(FRLDRHKEY ParentKey, FRLDRHKEY CurrentKey; PWCHAR p; PCWSTR name; - int subkeyLength; - int stringLength; + SIZE_T subkeyLength; + SIZE_T stringLength; ULONG NameSize; TRACE("KeyName '%S'\n", KeyName); @@ -391,7 +391,7 @@ RegOpenKey(FRLDRHKEY ParentKey, stringLength = subkeyLength; name = KeyName; } - NameSize = (subkeyLength + 1) * sizeof(WCHAR); + NameSize = (ULONG)((subkeyLength + 1) * sizeof(WCHAR)); Ptr = CurrentKey->SubKeyList.Flink; while (Ptr != &CurrentKey->SubKeyList) @@ -495,7 +495,7 @@ RegSetValue(FRLDRHKEY Key, InsertTailList(&Key->ValueList, &Value->ValueList); Key->ValueCount++; - Value->NameSize = (wcslen(ValueName)+1) * sizeof(WCHAR); + Value->NameSize = (ULONG)(wcslen(ValueName)+1) * sizeof(WCHAR); Value->Name = MmHeapAlloc(Value->NameSize); if (Value->Name == NULL) return ERROR_OUTOFMEMORY; wcscpy(Value->Name, ValueName); diff --git a/reactos/boot/freeldr/freeldr/ui/tui.c b/reactos/boot/freeldr/freeldr/ui/tui.c index 91356d28122..1dfb615b92e 100644 --- a/reactos/boot/freeldr/freeldr/ui/tui.c +++ b/reactos/boot/freeldr/freeldr/ui/tui.c @@ -128,7 +128,7 @@ VOID TuiDrawBackdrop(VOID) // // Draw title text // - TuiDrawText( (UiScreenWidth / 2) - (strlen(UiTitleBoxTitleText) / 2), + TuiDrawText( (UiScreenWidth / 2) - ((ULONG)strlen(UiTitleBoxTitleText) / 2), 2, UiTitleBoxTitleText, ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); @@ -332,12 +332,12 @@ VOID TuiDrawText(ULONG X, ULONG Y, PCSTR Text, UCHAR Attr) VOID TuiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR TextString, UCHAR Attr) { - ULONG TextLength; + SIZE_T TextLength; ULONG BoxWidth; ULONG BoxHeight; ULONG LineBreakCount; - ULONG Index; - ULONG LastIndex; + SIZE_T Index; + SIZE_T LastIndex; ULONG RealLeft; ULONG RealTop; ULONG X; @@ -361,7 +361,7 @@ VOID TuiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR { if ((Index - LastIndex) > BoxWidth) { - BoxWidth = (Index - LastIndex); + BoxWidth = (ULONG)(Index - LastIndex); } } } @@ -381,7 +381,7 @@ VOID TuiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR } else { - X = RealLeft + LastIndex; + X = (ULONG)(RealLeft + LastIndex); Y = RealTop; LastIndex++; Temp[0] = TextString[Index]; @@ -393,14 +393,14 @@ VOID TuiDrawCenteredText(ULONG Left, ULONG Top, ULONG Right, ULONG Bottom, PCSTR VOID TuiDrawStatusText(PCSTR StatusText) { - ULONG i; + SIZE_T i; TuiDrawText(0, UiScreenHeight-1, " ", ATTR(UiStatusBarFgColor, UiStatusBarBgColor)); TuiDrawText(1, UiScreenHeight-1, StatusText, ATTR(UiStatusBarFgColor, UiStatusBarBgColor)); for (i=strlen(StatusText)+1; iHour > 12) @@ -498,7 +498,7 @@ VOID TuiUpdateDateTime(VOID) } // Draw the time - TuiDrawText(UiScreenWidth-strlen(TimeString)-2, 2, TimeString, ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); + TuiDrawText(UiScreenWidth-(ULONG)strlen(TimeString)-2, 2, TimeString, ATTR(UiTitleBoxFgColor, UiTitleBoxBgColor)); } VOID TuiSaveScreen(PUCHAR Buffer) diff --git a/reactos/boot/freeldr/freeldr/ui/tuimenu.c b/reactos/boot/freeldr/freeldr/ui/tuimenu.c index 055e1b44b85..00402df96dc 100644 --- a/reactos/boot/freeldr/freeldr/ui/tuimenu.c +++ b/reactos/boot/freeldr/freeldr/ui/tuimenu.c @@ -151,7 +151,7 @@ TuiCalcMenuBoxSize(PUI_MENU_INFO MenuInfo) // // Get the string length and make it become the new width if necessary // - Length = strlen(MenuInfo->MenuItemList[i]); + Length = (ULONG)strlen(MenuInfo->MenuItemList[i]); if (Length > Width) Width = Length; } @@ -248,7 +248,7 @@ TuiDrawMenuBox(PUI_MENU_INFO MenuInfo) // Copy the integral time text string, and remove the last 2 chars // strcpy(TempString, UiTimeText); - i = strlen(TempString); + i = (ULONG)strlen(TempString); TempString[i - 2] = 0; // @@ -271,7 +271,7 @@ TuiDrawMenuBox(PUI_MENU_INFO MenuInfo) // // Display it in the center of the menu // - UiDrawText(MenuInfo->Right - strlen(MenuLineText) - 1, + UiDrawText(MenuInfo->Right - (ULONG)strlen(MenuLineText) - 1, MenuInfo->Bottom, MenuLineText, ATTR(UiMenuFgColor, UiMenuBgColor)); @@ -303,7 +303,7 @@ TuiDrawMenuBox(PUI_MENU_INFO MenuInfo) // if (UiCenterMenu) { - UiDrawText(MenuInfo->Right - strlen(MenuLineText) - 1, + UiDrawText(MenuInfo->Right - (ULONG)strlen(MenuLineText) - 1, MenuInfo->Bottom, MenuLineText, ATTR(UiMenuFgColor, UiMenuBgColor)); @@ -364,7 +364,7 @@ TuiDrawMenuItem(PUI_MENU_INFO MenuInfo, // how many spaces will be to the left and right // SpaceTotal = (MenuInfo->Right - MenuInfo->Left - 2) - - strlen(MenuInfo->MenuItemList[MenuItemNumber]); + (ULONG)strlen(MenuInfo->MenuItemList[MenuItemNumber]); SpaceLeft = (SpaceTotal / 2) + 1; SpaceRight = (SpaceTotal - SpaceLeft) + 1; diff --git a/reactos/boot/freeldr/freeldr/ui/ui.c b/reactos/boot/freeldr/freeldr/ui/ui.c index dbbd9361722..b0f0f12dcc9 100644 --- a/reactos/boot/freeldr/freeldr/ui/ui.c +++ b/reactos/boot/freeldr/freeldr/ui/ui.c @@ -228,7 +228,8 @@ BOOLEAN UiInitialize(BOOLEAN ShowGui) BOOLEAN SetupUiInitialize(VOID) { CHAR DisplayModeText[260]; - ULONG Depth, Length; + ULONG Depth; + SIZE_T Length; DisplayModeText[0] = '\0'; @@ -313,12 +314,12 @@ VOID UiUpdateDateTime(VOID) VOID UiInfoBox(PCSTR MessageText) { - ULONG TextLength; + SIZE_T TextLength; ULONG BoxWidth; ULONG BoxHeight; ULONG LineBreakCount; - ULONG Index; - ULONG LastIndex; + SIZE_T Index; + SIZE_T LastIndex; ULONG Left; ULONG Top; ULONG Right; @@ -341,7 +342,7 @@ VOID UiInfoBox(PCSTR MessageText) { if ((Index - LastIndex) > BoxWidth) { - BoxWidth = (Index - LastIndex); + BoxWidth = (ULONG)(Index - LastIndex); } } } diff --git a/reactos/boot/freeldr/freeldr/windows/peloader.c b/reactos/boot/freeldr/freeldr/windows/peloader.c index 62a2dd26cba..07c1a079f6c 100644 --- a/reactos/boot/freeldr/freeldr/windows/peloader.c +++ b/reactos/boot/freeldr/freeldr/windows/peloader.c @@ -453,7 +453,7 @@ WinLdrpCompareDllName(IN PCH DllName, { PWSTR Buffer; UNICODE_STRING UnicodeNamePA; - ULONG i, Length; + SIZE_T i, Length; /* First obvious check: for length of two names */ Length = strlen(DllName); diff --git a/reactos/boot/freeldr/freeldr/windows/wlmemory.c b/reactos/boot/freeldr/freeldr/windows/wlmemory.c index 505c52e9454..1f04319e731 100644 --- a/reactos/boot/freeldr/freeldr/windows/wlmemory.c +++ b/reactos/boot/freeldr/freeldr/windows/wlmemory.c @@ -49,8 +49,8 @@ WinLdrInsertDescriptor(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, extern PFREELDR_MEMORY_DESCRIPTOR BiosMemoryMap; extern ULONG BiosMemoryMapEntryCount; -extern ULONG MmLowestPhysicalPage; -extern ULONG MmHighestPhysicalPage; +extern PFN_NUMBER MmLowestPhysicalPage; +extern PFN_NUMBER MmHighestPhysicalPage; /* GLOBALS ***************************************************************/ @@ -63,8 +63,8 @@ ULONG MadCount = 0; VOID MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, - ULONG BasePage, - ULONG PageCount, + PFN_NUMBER BasePage, + PFN_NUMBER PageCount, ULONG Type) { BOOLEAN Status = TRUE; @@ -195,10 +195,10 @@ MempAddMemoryBlock(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, BOOLEAN WinLdrSetupMemoryLayout(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock) { - ULONG i, PagesCount, MemoryMapSizeInPages; - ULONG LastPageIndex, LastPageType, MemoryMapStartPage; + PFN_NUMBER i, PagesCount, MemoryMapSizeInPages, NoEntries; + PFN_NUMBER LastPageIndex, MemoryMapStartPage; PPAGE_LOOKUP_TABLE_ITEM MemoryMap; - ULONG NoEntries; + ULONG LastPageType; //PKTSS Tss; //BOOLEAN Status; diff --git a/reactos/boot/freeldr/freeldr/windows/wlregistry.c b/reactos/boot/freeldr/freeldr/windows/wlregistry.c index 55def6632f8..a7a33c75aa4 100644 --- a/reactos/boot/freeldr/freeldr/windows/wlregistry.c +++ b/reactos/boot/freeldr/freeldr/windows/wlregistry.c @@ -720,7 +720,7 @@ WinLdrAddDriverToList(LIST_ENTRY *BootDriverListHead, if (ImagePath && (wcslen(ImagePath) > 0)) { // Just copy ImagePath to the corresponding field in the structure - PathLength = wcslen(ImagePath) * sizeof(WCHAR) + sizeof(UNICODE_NULL); + PathLength = (USHORT)wcslen(ImagePath) * sizeof(WCHAR) + sizeof(UNICODE_NULL); BootDriverEntry->FilePath.Length = 0; BootDriverEntry->FilePath.MaximumLength = PathLength; @@ -743,7 +743,7 @@ WinLdrAddDriverToList(LIST_ENTRY *BootDriverListHead, else { // we have to construct ImagePath ourselves - PathLength = wcslen(ServiceName)*sizeof(WCHAR) + sizeof(L"system32\\drivers\\.sys"); + PathLength = (USHORT)wcslen(ServiceName)*sizeof(WCHAR) + sizeof(L"system32\\drivers\\.sys"); BootDriverEntry->FilePath.Length = 0; BootDriverEntry->FilePath.MaximumLength = PathLength; BootDriverEntry->FilePath.Buffer = MmHeapAlloc(PathLength); @@ -780,7 +780,7 @@ WinLdrAddDriverToList(LIST_ENTRY *BootDriverListHead, } // Add registry path - PathLength = (wcslen(RegistryPath) + wcslen(ServiceName))*sizeof(WCHAR) + sizeof(UNICODE_NULL); + PathLength = (USHORT)(wcslen(RegistryPath) + wcslen(ServiceName))*sizeof(WCHAR) + sizeof(UNICODE_NULL); BootDriverEntry->RegistryPath.Length = 0; BootDriverEntry->RegistryPath.MaximumLength = PathLength; BootDriverEntry->RegistryPath.Buffer = MmHeapAlloc(PathLength); From 4664ff43e20c429ef38899dc6e0eee67778508f3 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 10 Feb 2012 22:16:03 +0000 Subject: [PATCH 286/289] [IPHLPAPI] - Forward ICMP function calls to icmp.dll (for XP and higher) svn path=/trunk/; revision=55532 --- reactos/dll/win32/iphlpapi/iphlpapi.spec | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reactos/dll/win32/iphlpapi/iphlpapi.spec b/reactos/dll/win32/iphlpapi/iphlpapi.spec index ace65bf541d..4206beafacd 100644 --- a/reactos/dll/win32/iphlpapi/iphlpapi.spec +++ b/reactos/dll/win32/iphlpapi/iphlpapi.spec @@ -84,11 +84,11 @@ @ stub Icmp6CreateFile @ stub Icmp6ParseReplies @ stub Icmp6SendEcho2 -@ stub IcmpCloseHandle -@ stub IcmpCreateFile -@ stub IcmpParseReplies -@ stub IcmpSendEcho -@ stub IcmpSendEcho2 +@ stdcall IcmpCloseHandle(ptr) icmp.IcmpCloseHandle +@ stdcall IcmpCreateFile() icmp.IcmpCreateFile +@ stdcall IcmpParseReplies(ptr long) icmp.IcmpParseReplies +@ stdcall IcmpSendEcho(ptr long ptr long ptr ptr long long) icmp.IcmpSendEcho +@ stdcall IcmpSendEcho2(ptr ptr ptr ptr long ptr long ptr ptr long long) icmp.IcmpSendEcho2 @ stub InternalCreateIpForwardEntry @ stub InternalCreateIpNetEntry @ stub InternalDeleteIpForwardEntry From e1f18f1b3b1b169a8e9aec4612000de50b1c5a9f Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 11 Feb 2012 00:44:16 +0000 Subject: [PATCH 287/289] Dmitry Timoshkov : user32: RealChildWindowFromPoint should skip invisible windows. svn path=/trunk/; revision=55533 --- reactos/dll/win32/user32/windows/window.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/user32/windows/window.c b/reactos/dll/win32/user32/windows/window.c index 03674e524f9..6a594862818 100644 --- a/reactos/dll/win32/user32/windows/window.c +++ b/reactos/dll/win32/user32/windows/window.c @@ -1688,7 +1688,7 @@ HWND WINAPI RealChildWindowFromPoint(HWND hwndParent, POINT ptParentClientCoords) { - return ChildWindowFromPointEx(hwndParent, ptParentClientCoords, CWP_SKIPTRANSPARENT); + return ChildWindowFromPointEx(hwndParent, ptParentClientCoords, CWP_SKIPTRANSPARENT | CWP_SKIPINVISIBLE); } /* From 338cb3493d90745eabb3aa23f949afffbd28306f Mon Sep 17 00:00:00 2001 From: James Tabor Date: Sat, 11 Feb 2012 01:09:41 +0000 Subject: [PATCH 288/289] Alexandre Julliard : Draw the mask with SRCCOPY in DrawIcon when the image isn't being drawn. svn path=/trunk/; revision=55534 --- reactos/subsystems/win32/win32k/ntuser/cursoricon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c index a2f4a291d41..b786b2b7596 100644 --- a/reactos/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/reactos/subsystems/win32/win32k/ntuser/cursoricon.c @@ -1222,6 +1222,7 @@ UserDrawIconEx( if (diFlags & DI_MASK) { + DWORD rop = (diFlags & DI_IMAGE) ? SRCAND : SRCCOPY; hTmpBmp = NtGdiSelectBitmap(hMemDC, hbmMask); NtGdiStretchBlt(hDestDC, x, @@ -1233,7 +1234,7 @@ UserDrawIconEx( 0, pIcon->Size.cx, pIcon->Size.cy, - SRCAND, + rop, 0); NtGdiSelectBitmap(hMemDC, hTmpBmp); } From b9193d4c1b2e5e6bf82351626b43a63cb4c51c3c Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sat, 11 Feb 2012 10:32:22 +0000 Subject: [PATCH 289/289] [PSDK] * ntdddisk.h: Improve some definitions and add some missing ones. svn path=/trunk/; revision=55543 --- reactos/include/psdk/ntdddisk.h | 138 ++++++++++++++++++-------------- 1 file changed, 79 insertions(+), 59 deletions(-) diff --git a/reactos/include/psdk/ntdddisk.h b/reactos/include/psdk/ntdddisk.h index d1b3ee4d494..54d4229a56e 100644 --- a/reactos/include/psdk/ntdddisk.h +++ b/reactos/include/psdk/ntdddisk.h @@ -191,8 +191,16 @@ extern "C" { #define SMART_SEND_DRIVE_COMMAND \ CTL_CODE(IOCTL_DISK_BASE, 0x0021, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) -#define IOCTL_DISK_UPDATE_PROPERTIES \ - CTL_CODE(IOCTL_DISK_BASE, 0x50, METHOD_BUFFERED, FILE_ANY_ACCESS) +#if(_WIN32_WINNT >= 0x0500) +#define IOCTL_DISK_UPDATE_DRIVE_SIZE CTL_CODE(IOCTL_DISK_BASE, 0x0032, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GROW_PARTITION CTL_CODE(IOCTL_DISK_BASE, 0x0034, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_GET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE, 0x0035, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_DISK_SET_CACHE_INFORMATION CTL_CODE(IOCTL_DISK_BASE, 0x0036, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_DELETE_DRIVE_LAYOUT CTL_CODE(IOCTL_DISK_BASE, 0x0040, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_UPDATE_PROPERTIES CTL_CODE(IOCTL_DISK_BASE, 0x0050, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_DISK_FORMAT_DRIVE CTL_CODE(IOCTL_DISK_BASE, 0x00f3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS) +#define IOCTL_DISK_SENSE_DEVICE CTL_CODE(IOCTL_DISK_BASE, 0x00f8, METHOD_BUFFERED, FILE_ANY_ACCESS) +#endif #define PARTITION_ENTRY_UNUSED 0x00 #define PARTITION_FAT_12 0x01 @@ -473,68 +481,11 @@ typedef struct _SET_PARTITION_INFORMATION_EX { } DUMMYUNIONNAME; } SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX; -typedef struct _CREATE_DISK_GPT { - GUID DiskId; - ULONG MaxPartitionCount; -} CREATE_DISK_GPT, *PCREATE_DISK_GPT; - -typedef struct _CREATE_DISK_MBR { - ULONG Signature; -} CREATE_DISK_MBR, *PCREATE_DISK_MBR; - -typedef struct _CREATE_DISK { - PARTITION_STYLE PartitionStyle; - _ANONYMOUS_UNION union { - CREATE_DISK_MBR Mbr; - CREATE_DISK_GPT Gpt; - } DUMMYUNIONNAME; -} CREATE_DISK, *PCREATE_DISK; - typedef struct _VERIFY_INFORMATION { LARGE_INTEGER StartingOffset; ULONG Length; } VERIFY_INFORMATION, *PVERIFY_INFORMATION; -#if (OSVER(NTDDI_VERSION) == NTDDI_WINXP) -typedef enum _DISK_WRITE_CACHE_STATE { - DiskWriteCacheNormal, - DiskWriteCacheForceDisable, - DiskWriteCacheDisableNotSupported -} DISK_WRITE_CACHE_STATE, *PDISK_WRITE_CACHE_STATE; -#endif - -typedef enum { - EqualPriority, - KeepPrefetchedData, - KeepReadData -} DISK_CACHE_RETENTION_PRIORITY; - -typedef struct _DISK_CACHE_INFORMATION { - BOOLEAN ParametersSavable; - BOOLEAN ReadCacheEnabled; - BOOLEAN WriteCacheEnabled; - DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority; - DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority; - USHORT DisablePrefetchTransferLength; - BOOLEAN PrefetchScalar; - _ANONYMOUS_UNION union { - struct { - USHORT Minimum; - USHORT Maximum; - USHORT MaximumBlocks; - } ScalarPrefetch; - struct { - USHORT Minimum; - USHORT Maximum; - } BlockPrefetch; - } DUMMYUNIONNAME; -} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION; - -typedef struct _DISK_GROW_PARTITION { - ULONG PartitionNumber; - LARGE_INTEGER BytesToGrow; -} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION; - /* GETVERSIONINPARAMS.fCapabilities constants */ #define CAP_ATA_ID_CMD 1 #define CAP_ATAPI_ID_CMD 2 @@ -640,6 +591,75 @@ typedef struct _MAPPED_ADDRESS { } MAPPED_ADDRESS, *PMAPPED_ADDRESS; + +#if(_WIN32_WINNT >= 0x0500) + +typedef struct _CREATE_DISK_GPT +{ + GUID DiskId; + ULONG MaxPartitionCount; +} CREATE_DISK_GPT, *PCREATE_DISK_GPT; + +typedef struct _CREATE_DISK_MBR +{ + ULONG Signature; +} CREATE_DISK_MBR, *PCREATE_DISK_MBR; + + +typedef struct _CREATE_DISK +{ + PARTITION_STYLE PartitionStyle; + union { + CREATE_DISK_MBR Mbr; + CREATE_DISK_GPT Gpt; + }; +} CREATE_DISK, *PCREATE_DISK; + + +typedef enum { + EqualPriority, + KeepPrefetchedData, + KeepReadData +} DISK_CACHE_RETENTION_PRIORITY; + +typedef enum _DISK_WRITE_CACHE_STATE { + DiskWriteCacheNormal, + DiskWriteCacheForceDisable, + DiskWriteCacheDisableNotSupported +} DISK_WRITE_CACHE_STATE, *PDISK_WRITE_CACHE_STATE; + + +typedef struct _DISK_CACHE_INFORMATION +{ + BOOLEAN ParametersSavable; + BOOLEAN ReadCacheEnabled; + BOOLEAN WriteCacheEnabled; + DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority; + DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority; + USHORT DisablePrefetchTransferLength; + BOOLEAN PrefetchScalar; + union { + struct { + USHORT Minimum; + USHORT Maximum; + USHORT MaximumBlocks; + } ScalarPrefetch; + + struct { + USHORT Minimum; + USHORT Maximum; + } BlockPrefetch; + }; + +} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION; + +typedef struct _DISK_GROW_PARTITION { + ULONG PartitionNumber; + LARGE_INTEGER BytesToGrow; +} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION; +#endif + + #ifdef __cplusplus } #endif