Author: hpoussin
Date: Mon Oct  1 23:09:53 2007
New Revision: 29336
URL: 
http://svn.reactos.org/svn/reactos?rev=29336&view=rev
Log:
Autosyncing with Wine HEAD
Added:
    trunk/reactos/dll/win32/browseui/aclmulti.c   (with props)
    trunk/reactos/dll/win32/browseui/browseui.h   (with props)
    trunk/reactos/dll/win32/browseui/browseui.rbuild   (with props)
    trunk/reactos/dll/win32/browseui/browseui.spec   (with props)
    trunk/reactos/dll/win32/browseui/browseui_main.c   (with props)
    trunk/reactos/dll/win32/browseui/browseui_ros.diff   (with props)
    trunk/reactos/dll/win32/browseui/regsvr.c   (with props)
    trunk/reactos/dll/win32/browseui/version.rc   (with props)
Added: trunk/reactos/dll/win32/browseui/aclmulti.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/aclmult…
==============================================================================
--- trunk/reactos/dll/win32/browseui/aclmulti.c (added)
+++ trunk/reactos/dll/win32/browseui/aclmulti.c Mon Oct  1 23:09:53 2007
@@ -1,0 +1,331 @@
+/*
+ *     Multisource AutoComplete list
+ *
+ *     Copyright 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
+ */
+
+#include "config.h"
+
+#include <stdarg.h>
+
+#define COBJMACROS
+
+#include "wine/debug.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "winuser.h"
+#include "shlwapi.h"
+#include "winerror.h"
+#include "objbase.h"
+
+#include "shlguid.h"
+#include "shlobj.h"
+
+#include "wine/unicode.h"
+
+#include "browseui.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(browseui);
+
+struct ACLMultiSublist {
+    IUnknown *punk;
+    IEnumString *pEnum;
+    IACList *pACL;
+};
+
+typedef struct tagACLMulti {
+    const IEnumStringVtbl *vtbl;
+    const IACListVtbl *aclVtbl;
+    const IObjMgrVtbl *objmgrVtbl;
+    LONG refCount;
+    INT nObjs;
+    INT currObj;
+    struct ACLMultiSublist *objs;
+} ACLMulti;
+
+static const IEnumStringVtbl ACLMultiVtbl;
+static const IACListVtbl ACLMulti_ACListVtbl;
+static const IObjMgrVtbl ACLMulti_ObjMgrVtbl;
+
+static inline ACLMulti *impl_from_IACList(IACList *iface)
+{
+    return (ACLMulti *)((char *)iface - FIELD_OFFSET(ACLMulti, aclVtbl));
+}
+
+static inline ACLMulti *impl_from_IObjMgr(IObjMgr *iface)
+{
+    return (ACLMulti *)((char *)iface - FIELD_OFFSET(ACLMulti, objmgrVtbl));
+}
+
+static void release_obj(struct ACLMultiSublist *obj)
+{
+    IUnknown_Release(obj->punk);
+    if (obj->pEnum)
+        IEnumString_Release(obj->pEnum);
+    if (obj->pACL)
+        IACList_Release(obj->pACL);
+}
+
+HRESULT WINAPI ACLMulti_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut)
+{
+    ACLMulti *This;
+    if (pUnkOuter)
+        return CLASS_E_NOAGGREGATION;
+
+    This = CoTaskMemAlloc(sizeof(ACLMulti));
+    if (This == NULL)
+        return E_OUTOFMEMORY;
+    ZeroMemory(This, sizeof(*This));
+    This->vtbl = &ACLMultiVtbl;
+    This->aclVtbl = &ACLMulti_ACListVtbl;
+    This->objmgrVtbl = &ACLMulti_ObjMgrVtbl;
+    This->refCount = 1;
+
+    TRACE("returning %p\n", This);
+    *ppOut = (IUnknown *)This;
+    BROWSEUI_refCount++;
+    return S_OK;
+}
+
+static void WINAPI ACLMulti_Destructor(ACLMulti *This)
+{
+    int i;
+    TRACE("destroying %p\n", This);
+    for (i = 0; i < This->nObjs; i++)
+        release_obj(&This->objs[i]);
+    CoTaskMemFree(This->objs);
+    CoTaskMemFree(This);
+    BROWSEUI_refCount--;
+}
+
+static HRESULT WINAPI ACLMulti_QueryInterface(IEnumString *iface, REFIID iid, LPVOID
*ppvOut)
+{
+    ACLMulti *This = (ACLMulti *)iface;
+    *ppvOut = NULL;
+
+    if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_IEnumString))
+    {
+        *ppvOut = This;
+    }
+    else if (IsEqualIID(iid, &IID_IACList))
+    {
+        *ppvOut = &This->aclVtbl;
+    }
+    else if (IsEqualIID(iid, &IID_IObjMgr))
+    {
+        *ppvOut = &This->objmgrVtbl;
+    }
+
+    if (*ppvOut)
+    {
+        IUnknown_AddRef(iface);
+        return S_OK;
+    }
+
+    WARN("unsupported interface: %s\n", debugstr_guid(iid));
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ACLMulti_AddRef(IEnumString *iface)
+{
+    ACLMulti *This = (ACLMulti *)iface;
+    return InterlockedIncrement(&This->refCount);
+}
+
+static ULONG WINAPI ACLMulti_Release(IEnumString *iface)
+{
+    ACLMulti *This = (ACLMulti *)iface;
+    ULONG ret;
+
+    ret = InterlockedDecrement(&This->refCount);
+    if (ret == 0)
+        ACLMulti_Destructor(This);
+    return ret;
+}
+
+static HRESULT WINAPI ACLMulti_Append(IObjMgr *iface, IUnknown *obj)
+{
+    ACLMulti *This = impl_from_IObjMgr(iface);
+
+    TRACE("(%p, %p)\n", This, obj);
+    if (obj == NULL)
+        return E_FAIL;
+
+    This->objs = CoTaskMemRealloc(This->objs, sizeof(This->objs[0]) *
(This->nObjs+1));
+    This->objs[This->nObjs].punk = obj;
+    IUnknown_AddRef(obj);
+    if (FAILED(IUnknown_QueryInterface(obj, &IID_IEnumString, (LPVOID
*)&This->objs[This->nObjs].pEnum)))
+        This->objs[This->nObjs].pEnum = NULL;
+    if (FAILED(IUnknown_QueryInterface(obj, &IID_IACList, (LPVOID
*)&This->objs[This->nObjs].pACL)))
+        This->objs[This->nObjs].pACL = NULL;
+    This->nObjs++;
+    return S_OK;
+}
+
+static HRESULT WINAPI ACLMulti_Remove(IObjMgr *iface, IUnknown *obj)
+{
+    ACLMulti *This = impl_from_IObjMgr(iface);
+    int i;
+
+    TRACE("(%p, %p)\n", This, obj);
+    for (i = 0; i < This->nObjs; i++)
+        if (This->objs[i].punk == obj)
+        {
+            release_obj(&This->objs[i]);
+            memmove(&This->objs[i], &This->objs[i+1],
(This->nObjs-i-1)*sizeof(struct ACLMultiSublist));
+            This->nObjs--;
+            This->objs = CoTaskMemRealloc(This->objs, sizeof(This->objs[0]) *
This->nObjs);
+            return S_OK;
+        }
+
+    return E_FAIL;
+}
+
+static HRESULT WINAPI ACLMulti_Next(IEnumString *iface, ULONG celt, LPOLESTR *rgelt,
ULONG *pceltFetched)
+{
+    ACLMulti *This = (ACLMulti *)iface;
+
+    TRACE("(%p, %d, %p, %p)\n", iface, celt, rgelt, pceltFetched);
+    while (This->currObj < This->nObjs)
+    {
+        if (This->objs[This->currObj].pEnum)
+        {
+            /* native browseui 6.0 also returns only one element */
+            HRESULT ret = IEnumString_Next(This->objs[This->currObj].pEnum, 1,
rgelt, pceltFetched);
+            if (ret != S_FALSE)
+                return ret;
+        }
+        This->currObj++;
+    }
+
+    if (pceltFetched)
+        *pceltFetched = 0;
+    *rgelt = NULL;
+    return S_FALSE;
+}
+
+static HRESULT WINAPI ACLMulti_Reset(IEnumString *iface)
+{
+    ACLMulti *This = (ACLMulti *)iface;
+    int i;
+
+    This->currObj = 0;
+    for (i = 0; i < This->nObjs; i++)
+    {
+        if (This->objs[i].pEnum)
+            IEnumString_Reset(This->objs[i].pEnum);
+    }
+    return S_OK;
+}
+
+static HRESULT WINAPI ACLMulti_Skip(IEnumString *iface, ULONG celt)
+{
+    /* native browseui 6.0 returns this: */
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ACLMulti_Clone(IEnumString *iface, IEnumString **ppOut)
+{
+    *ppOut = NULL;
+    /* native browseui 6.0 returns this: */
+    return E_OUTOFMEMORY;
+}
+
+static HRESULT WINAPI ACLMulti_Expand(IACList *iface, LPCWSTR wstr)
+{
+    ACLMulti *This = impl_from_IACList(iface);
+    HRESULT res = S_OK;
+    int i;
+
+    for (i = 0; i < This->nObjs; i++)
+    {
+        if (!This->objs[i].pACL)
+            continue;
+        res = IACList_Expand(This->objs[i].pACL, wstr);
+        if (res == S_OK)
+            break;
+    }
+    return res;
+}
+
+static const IEnumStringVtbl ACLMultiVtbl =
+{
+    ACLMulti_QueryInterface,
+    ACLMulti_AddRef,
+    ACLMulti_Release,
+
+    ACLMulti_Next,
+    ACLMulti_Skip,
+    ACLMulti_Reset,
+    ACLMulti_Clone
+};
+
+static HRESULT WINAPI ACLMulti_IObjMgr_QueryInterface(IObjMgr *iface, REFIID iid, LPVOID
*ppvOut)
+{
+    ACLMulti *This = impl_from_IObjMgr(iface);
+    return ACLMulti_QueryInterface((IEnumString *)This, iid, ppvOut);
+}
+
+static ULONG WINAPI ACLMulti_IObjMgr_AddRef(IObjMgr *iface)
+{
+    ACLMulti *This = impl_from_IObjMgr(iface);
+    return ACLMulti_AddRef((IEnumString *)This);
+}
+
+static ULONG WINAPI ACLMulti_IObjMgr_Release(IObjMgr *iface)
+{
+    ACLMulti *This = impl_from_IObjMgr(iface);
+    return ACLMulti_Release((IEnumString *)This);
+}
+
+static const IObjMgrVtbl ACLMulti_ObjMgrVtbl =
+{
+    ACLMulti_IObjMgr_QueryInterface,
+    ACLMulti_IObjMgr_AddRef,
+    ACLMulti_IObjMgr_Release,
+
+    ACLMulti_Append,
+    ACLMulti_Remove
+};
+
+static HRESULT WINAPI ACLMulti_IACList_QueryInterface(IACList *iface, REFIID iid, LPVOID
*ppvOut)
+{
+    ACLMulti *This = impl_from_IACList(iface);
+    return ACLMulti_QueryInterface((IEnumString *)This, iid, ppvOut);
+}
+
+static ULONG WINAPI ACLMulti_IACList_AddRef(IACList *iface)
+{
+    ACLMulti *This = impl_from_IACList(iface);
+    return ACLMulti_AddRef((IEnumString *)This);
+}
+
+static ULONG WINAPI ACLMulti_IACList_Release(IACList *iface)
+{
+    ACLMulti *This = impl_from_IACList(iface);
+    return ACLMulti_Release((IEnumString *)This);
+}
+
+static const IACListVtbl ACLMulti_ACListVtbl =
+{
+    ACLMulti_IACList_QueryInterface,
+    ACLMulti_IACList_AddRef,
+    ACLMulti_IACList_Release,
+
+    ACLMulti_Expand
+};
Propchange: trunk/reactos/dll/win32/browseui/aclmulti.c
------------------------------------------------------------------------------
    svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/browseui.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/browseu…
==============================================================================
--- trunk/reactos/dll/win32/browseui/browseui.h (added)
+++ trunk/reactos/dll/win32/browseui/browseui.h Mon Oct  1 23:09:53 2007
@@ -1,0 +1,28 @@
+/*
+ * Internal header for browseui.dll
+ *
+ * Copyright 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
+ */
+
+#ifndef __WINE_BROWSEUI_H
+#define __WINE_BROWSEUI_H
+
+extern LONG BROWSEUI_refCount;
+
+HRESULT WINAPI ACLMulti_Constructor(IUnknown *punkOuter, IUnknown **ppOut);
+
+#endif /* __WINE_SHDOCVW_H */
Propchange: trunk/reactos/dll/win32/browseui/browseui.h
------------------------------------------------------------------------------
    svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/browseui.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/browseu…
==============================================================================
--- trunk/reactos/dll/win32/browseui/browseui.rbuild (added)
+++ trunk/reactos/dll/win32/browseui/browseui.rbuild Mon Oct  1 23:09:53 2007
@@ -1,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<module name="browseui" type="win32dll"
baseaddress="${BASEADDRESS_BROWSEUI}" installbase="system32"
installname="browseui.dll" allowwarnings="true">
+       <autoregister infsection="OleControlDlls" type="Both" />
+       <importlibrary definition="browseui.spec.def" />
+       <include base="browseui">.</include>
+       <include base="ReactOS">include/reactos/wine</include>
+       <define name="__REACTOS__" />
+       <define name="__WINESRC__" />
+       <define name="__USE_W32API" />
+       <define name="_WIN32_IE">0x600</define>
+       <define name="_WIN32_WINNT">0x600</define>
+       <define name="WINVER">0x600</define>
+       <library>wine</library>
+       <library>ole32</library>
+       <library>user32</library>
+       <library>advapi32</library>
+       <library>kernel32</library>
+       <library>uuid</library>
+       <library>ntdll</library>
+       <file>aclmulti.c</file>
+       <file>browseui_main.c</file>
+       <file>regsvr.c</file>
+       <file>version.rc</file>
+       <file>browseui.spec</file>
+</module>
Propchange: trunk/reactos/dll/win32/browseui/browseui.rbuild
------------------------------------------------------------------------------
    svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/browseui.spec
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/browseu…
==============================================================================
--- trunk/reactos/dll/win32/browseui/browseui.spec (added)
+++ trunk/reactos/dll/win32/browseui/browseui.spec Mon Oct  1 23:09:53 2007
@@ -1,0 +1,6 @@
+@ stdcall -private DllCanUnloadNow()
+@ stdcall -private DllGetClassObject(ptr ptr ptr)
+@ stdcall -private DllGetVersion(ptr)
+@ stub DllInstall
+@ stdcall -private DllRegisterServer()
+@ stdcall -private DllUnregisterServer()
Propchange: trunk/reactos/dll/win32/browseui/browseui.spec
------------------------------------------------------------------------------
    svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/browseui_main.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/browseu…
==============================================================================
--- trunk/reactos/dll/win32/browseui/browseui_main.c (added)
+++ trunk/reactos/dll/win32/browseui/browseui_main.c Mon Oct  1 23:09:53 2007
@@ -1,0 +1,211 @@
+/*
+ * browseui - Internet Explorer / Windows Explorer standard UI
+ *
+ * Copyright 2001 John R. Sheets (for CodeWeavers)
+ * Copyright 2004 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 "config.h"
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#define COBJMACROS
+
+#include "wine/debug.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "shlwapi.h"
+#include "shlguid.h"
+
+#include "initguid.h"
+
+#include "browseui.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(browseui);
+
+LONG BROWSEUI_refCount = 0;
+
+HINSTANCE browseui_hinstance = 0;
+
+typedef HRESULT (WINAPI *LPFNCONSTRUCTOR)(IUnknown *pUnkOuter, IUnknown **ppvOut);
+
+static const struct {
+    REFCLSID clsid;
+    LPFNCONSTRUCTOR ctor;
+} ClassesTable[] = {
+    {&CLSID_ACLMulti, ACLMulti_Constructor},
+    {NULL, NULL}
+};
+
+typedef struct tagClassFactory
+{
+    const IClassFactoryVtbl *vtbl;
+    LONG   ref;
+    LPFNCONSTRUCTOR ctor;
+} ClassFactory;
+static const IClassFactoryVtbl ClassFactoryVtbl;
+
+static HRESULT ClassFactory_Constructor(LPFNCONSTRUCTOR ctor, LPVOID *ppvOut)
+{
+    ClassFactory *This = CoTaskMemAlloc(sizeof(ClassFactory));
+    This->vtbl = &ClassFactoryVtbl;
+    This->ref = 1;
+    This->ctor = ctor;
+    *ppvOut = (LPVOID)This;
+    TRACE("Created class factory %p\n", This);
+    BROWSEUI_refCount++;
+    return S_OK;
+}
+
+static void ClassFactory_Destructor(ClassFactory *This)
+{
+    TRACE("Destroying class factory %p\n", This);
+    CoTaskMemFree(This);
+    BROWSEUI_refCount--;
+}
+
+static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid,
LPVOID *ppvOut)
+{
+    *ppvOut = NULL;
+    if (IsEqualIID(riid, &IID_IClassFactory) || IsEqualIID(riid, &IID_IUnknown))
{
+        IClassFactory_AddRef(iface);
+        *ppvOut = iface;
+        return S_OK;
+    }
+
+    WARN("Unknown interface %s\n", debugstr_guid(riid));
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
+{
+    ClassFactory *This = (ClassFactory *)iface;
+    return InterlockedIncrement(&This->ref);
+}
+
+static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
+{
+    ClassFactory *This = (ClassFactory *)iface;
+    ULONG ret = InterlockedDecrement(&This->ref);
+
+    if (ret == 0)
+        ClassFactory_Destructor(This);
+    return ret;
+}
+
+static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown
*punkOuter, REFIID iid, LPVOID *ppvOut)
+{
+    ClassFactory *This = (ClassFactory *)iface;
+    HRESULT ret;
+    IUnknown *obj;
+
+    TRACE("(%p, %p, %s, %p)\n", iface, punkOuter, debugstr_guid(iid), ppvOut);
+    ret = This->ctor(punkOuter, &obj);
+    if (FAILED(ret))
+        return ret;
+    ret = IUnknown_QueryInterface(obj, iid, ppvOut);
+    IUnknown_Release(obj);
+    return ret;
+}
+
+static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock)
+{
+    ClassFactory *This = (ClassFactory *)iface;
+
+    TRACE("(%p)->(%x)\n", This, fLock);
+
+    if(fLock)
+        InterlockedIncrement(&BROWSEUI_refCount);
+    else
+        InterlockedDecrement(&BROWSEUI_refCount);
+
+    return S_OK;
+}
+
+static const IClassFactoryVtbl ClassFactoryVtbl = {
+    /* IUnknown */
+    ClassFactory_QueryInterface,
+    ClassFactory_AddRef,
+    ClassFactory_Release,
+
+    /* IClassFactory*/
+    ClassFactory_CreateInstance,
+    ClassFactory_LockServer
+};
+
+/*************************************************************************
+ * BROWSEUI DllMain
+ */
+BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad)
+{
+    TRACE("%p 0x%x %p\n", hinst, fdwReason, fImpLoad);
+    switch (fdwReason)
+    {
+        case DLL_WINE_PREATTACH:
+            return FALSE;   /* prefer native version */
+        case DLL_PROCESS_ATTACH:
+            DisableThreadLibraryCalls(hinst);
+            browseui_hinstance = hinst;
+            break;
+    }
+    return TRUE;
+}
+
+/*************************************************************************
+ *              DllCanUnloadNow (BROWSEUI.@)
+ */
+HRESULT WINAPI DllCanUnloadNow(void)
+{
+    return BROWSEUI_refCount ? S_FALSE : S_OK;
+}
+
+/***********************************************************************
+ *              DllGetVersion (BROWSEUI.@)
+ */
+HRESULT WINAPI DllGetVersion(DLLVERSIONINFO *info)
+{
+    if (info->cbSize != sizeof(DLLVERSIONINFO)) FIXME("support
DLLVERSIONINFO2\n");
+
+    /* this is what IE6 on Windows 98 reports */
+    info->dwMajorVersion = 6;
+    info->dwMinorVersion = 0;
+    info->dwBuildNumber = 2600;
+    info->dwPlatformID = DLLVER_PLATFORM_WINDOWS;
+
+    return NOERROR;
+}
+
+/***********************************************************************
+ *              DllGetClassObject (BROWSEUI.@)
+ */
+HRESULT WINAPI DllGetClassObject(REFCLSID clsid, REFIID iid, LPVOID *ppvOut)
+{
+    int i;
+
+    *ppvOut = NULL;
+    if (!IsEqualIID(iid, &IID_IUnknown) && !IsEqualIID(iid,
&IID_IClassFactory))
+        return E_NOINTERFACE;
+
+    for (i = 0; ClassesTable[i].clsid != NULL; i++)
+        if (IsEqualCLSID(ClassesTable[i].clsid, clsid)) {
+            return ClassFactory_Constructor(ClassesTable[i].ctor, ppvOut);
+        }
+    FIXME("CLSID %s not supported\n", debugstr_guid(clsid));
+    return CLASS_E_CLASSNOTAVAILABLE;
+}
Propchange: trunk/reactos/dll/win32/browseui/browseui_main.c
------------------------------------------------------------------------------
    svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/browseui_ros.diff
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/browseu…
==============================================================================
--- trunk/reactos/dll/win32/browseui/browseui_ros.diff (added)
+++ trunk/reactos/dll/win32/browseui/browseui_ros.diff Mon Oct  1 23:09:53 2007
@@ -1,0 +1,15 @@
+Index: browseui.rbuild
+===================================================================
+--- browseui.rbuild    (revision 23123)
++++ browseui.rbuild    (working copy)
+@@ -9,8 +9,8 @@
+       <define name="__WINESRC__" />
+       <define name="__USE_W32API" />
+       <define name="_WIN32_IE">0x600</define>
+-      <define name="_WIN32_WINNT">0x501</define>
+-      <define name="WINVER">0x501</define>
++      <define name="_WIN32_WINNT">0x600</define>
++      <define name="WINVER">0x600</define>
+       <library>wine</library>
+       <library>ole32</library>
+       <library>user32</library>
Propchange: trunk/reactos/dll/win32/browseui/browseui_ros.diff
------------------------------------------------------------------------------
    svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/regsvr.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/regsvr.…
==============================================================================
--- trunk/reactos/dll/win32/browseui/regsvr.c (added)
+++ trunk/reactos/dll/win32/browseui/regsvr.c Mon Oct  1 23:09:53 2007
@@ -1,0 +1,489 @@
+/*
+ *     self-registerable dll functions for browseui.dll
+ *
+ * Copyright (C) 2004 Stefan Leichter
+ *
+ * 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 <stdarg.h>
+#include <string.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "wingdi.h"
+#include "winreg.h"
+#include "winerror.h"
+
+#include "ole2.h"
+#include "shlguid.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(browseui);
+
+/*
+ * 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;
+
+           wsprintfW(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_ACLMulti,
+        "Multiple AutoComplete List Container",
+        NULL,
+        "browseui.dll",
+        "Apartment"
+    },
+    { NULL }                   /* list terminator */
+};
+
+/***********************************************************************
+ *             interface list
+ */
+
+static struct regsvr_interface const interface_list[] = {
+    { NULL }                   /* list terminator */
+};
+
+/***********************************************************************
+ *             DllRegisterServer (HHCTRL.@)
+ */
+HRESULT WINAPI DllRegisterServer(void)
+{
+    HRESULT hr;
+
+    TRACE("\n");
+
+    hr = register_coclasses(coclass_list);
+    if (SUCCEEDED(hr))
+       hr = register_interfaces(interface_list);
+    return hr;
+}
+
+/***********************************************************************
+ *             DllUnregisterServer (HHCTRL.@)
+ */
+HRESULT WINAPI DllUnregisterServer(void)
+{
+    HRESULT hr;
+
+    TRACE("\n");
+
+    hr = unregister_coclasses(coclass_list);
+    if (SUCCEEDED(hr))
+       hr = unregister_interfaces(interface_list);
+    return hr;
+}
Propchange: trunk/reactos/dll/win32/browseui/regsvr.c
------------------------------------------------------------------------------
    svn:eol-style = native
Added: trunk/reactos/dll/win32/browseui/version.rc
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/browseui/version…
==============================================================================
--- trunk/reactos/dll/win32/browseui/version.rc (added)
+++ trunk/reactos/dll/win32/browseui/version.rc Mon Oct  1 23:09:53 2007
@@ -1,0 +1,27 @@
+/*
+ * Copyright 2003 Francois Gouget (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 WINE_OLESELFREGISTER
+#define WINE_FILEDESCRIPTION_STR "Wine core dll"
+#define WINE_FILENAME_STR "browseui.dll"
+#define WINE_FILEVERSION 6,0,2900,2180
+#define WINE_FILEVERSION_STR "6.0.2900.2180"
+#define WINE_PRODUCTVERSION 6,0,2900,2180
+#define WINE_PRODUCTVERSION_STR "6.0.2900.2180"
+
+#include "wine/wine_common_ver.rc"
Propchange: trunk/reactos/dll/win32/browseui/version.rc
------------------------------------------------------------------------------
    svn:eol-style = native