diff --git a/reactos/baseaddress.rbuild b/reactos/baseaddress.rbuild index e380e871bf1..7917521d3a4 100644 --- a/reactos/baseaddress.rbuild +++ b/reactos/baseaddress.rbuild @@ -55,6 +55,7 @@ + diff --git a/reactos/boot/bootdata/hivecls.inf b/reactos/boot/bootdata/hivecls.inf index 9c63d5e8148..5ea1dcc1215 100644 --- a/reactos/boot/bootdata/hivecls.inf +++ b/reactos/boot/bootdata/hivecls.inf @@ -238,6 +238,11 @@ HKCR,"CLSID\{42071712-76d4-11d1-8b24-00a0c9068ff3}","",0x00000000,"Display Adapt HKCR,"CLSID\{42071712-76d4-11d1-8b24-00a0c9068ff3}\InProcServer32","",0x00020000,"%SystemRoot%\system32\deskadp.dll" HKCR,"CLSID\{42071712-76d4-11d1-8b24-00a0c9068ff3}\InProcServer32","ThreadingModel",0x00000000,"Apartment" +; deskmon.dll shell extension +HKCR,"CLSID\{42071713-76d4-11d1-8b24-00a0c9068ff3}","",0x00000000,"Display Monitor CPL Extension" +HKCR,"CLSID\{42071713-76d4-11d1-8b24-00a0c9068ff3}\InProcServer32","",0x00020000,"%SystemRoot%\system32\deskmon.dll" +HKCR,"CLSID\{42071713-76d4-11d1-8b24-00a0c9068ff3}\InProcServer32","ThreadingModel",0x00000000,"Apartment" + ; For comcat.dll HKCR,"CLSID\{0002E005-0000-0000-C000-000000000046}","",0x00000000,"StdComponentCategoriesMgr" HKCR,"CLSID\{0002E005-0000-0000-C000-000000000046}\InProcServer32","",0x00000000,"comcat.dll" diff --git a/reactos/boot/bootdata/hivesft.inf b/reactos/boot/bootdata/hivesft.inf index 689dddf93dd..c6077f228fd 100644 --- a/reactos/boot/bootdata/hivesft.inf +++ b/reactos/boot/bootdata/hivesft.inf @@ -767,6 +767,9 @@ HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\DateTime\Servers","8",0x00000000 ; deskadp.dll shell extension HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Controls Folder\Device\shellex\PropertySheetHandlers\Display Adapter CPL Extension","",0x00000000,"{42071712-76d4-11d1-8b24-00a0c9068ff3}" +; deskmon.dll shell extension +HKLM,"SOFTWARE\Microsoft\Windows\CurrentVersion\Controls Folder\Device\shellex\PropertySheetHandlers\Display Monitor CPL Extension","",0x00000000,"{42071713-76d4-11d1-8b24-00a0c9068ff3}" + ; Where to download the Mozilla ActiveX control HKLM,"SOFTWARE\ReactOS\shdocvw","MozillaUrl",0x00000000,"http://links.reactos.org/mozactivex" diff --git a/reactos/boot/bootdata/packages/reactos.dff b/reactos/boot/bootdata/packages/reactos.dff index 61ad26a6e93..a2e2efb88e9 100644 --- a/reactos/boot/bootdata/packages/reactos.dff +++ b/reactos/boot/bootdata/packages/reactos.dff @@ -256,6 +256,7 @@ dll\win32\wsock32\wsock32.dll 1 dll\win32\wtsapi32\wtsapi32.dll 1 dll\win32\beepmidi\beepmidi.dll 1 dll\win32\shellext\deskadp\deskadp.dll 1 +dll\win32\shellext\deskadp\deskmon.dll 1 ; Drivers drivers\base\bootvid\bootvid.dll 1 diff --git a/reactos/dll/win32/shellext/deskmon/deskmon.c b/reactos/dll/win32/shellext/deskmon/deskmon.c new file mode 100644 index 00000000000..35d171c43b7 --- /dev/null +++ b/reactos/dll/win32/shellext/deskmon/deskmon.c @@ -0,0 +1,251 @@ +#include "precomp.h" + +#define NDEBUG +#include + +static HINSTANCE hInstance; + +static VOID +InitMonitorDialog(PDESKMONITOR This) +{ + LPTSTR lpMonitorName; + + lpMonitorName = QueryDeskCplString(This->pdtobj, + RegisterClipboardFormat(DESK_EXT_MONITORNAME)); + if (lpMonitorName != NULL) + { + SetDlgItemText(This->hwndDlg, + IDC_MONITORNAME, + lpMonitorName); + + LocalFree((HLOCAL)lpMonitorName); + } + + if (This->DeskExtInterface != NULL) + { + /* FIXME */ + } +} + +static INT_PTR CALLBACK +MonitorDlgProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PDESKMONITOR This; + INT_PTR Ret = 0; + + if (uMsg != WM_INITDIALOG) + { + This = (PDESKMONITOR)GetWindowLongPtr(hwndDlg, + DWL_USER); + } + + switch (uMsg) + { + case WM_INITDIALOG: + This = (PDESKMONITOR)((LPCPROPSHEETPAGE)lParam)->lParam; + This->hwndDlg = hwndDlg; + SetWindowLongPtr(hwndDlg, + DWL_USER, + (LONG_PTR)This); + + InitMonitorDialog(This); + Ret = TRUE; + break; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDC_MONITORPROPERTIES: + break; + } + + break; + } + + return Ret; +} + +static VOID +IDeskMonitor_Destroy(PDESKMONITOR This) +{ + if (This->pdtobj != NULL) + { + IDataObject_Release(This->pdtobj); + This->pdtobj = NULL; + } + + if (This->DeskExtInterface != NULL) + { + LocalFree((HLOCAL)This->DeskExtInterface); + This->DeskExtInterface = NULL; + } +} + +ULONG +IDeskMonitor_AddRef(PDESKMONITOR This) +{ + ULONG ret; + + ret = InterlockedIncrement((PLONG)&This->ref); + if (ret == 1) + InterlockedIncrement(&dll_refs); + + return ret; +} + +ULONG +IDeskMonitor_Release(PDESKMONITOR This) +{ + ULONG ret; + + ret = InterlockedDecrement((PLONG)&This->ref); + if (ret == 0) + { + IDeskMonitor_Destroy(This); + InterlockedDecrement(&dll_refs); + + HeapFree(GetProcessHeap(), + 0, + This); + } + + return ret; +} + +HRESULT STDMETHODCALLTYPE +IDeskMonitor_QueryInterface(PDESKMONITOR This, + REFIID iid, + PVOID *pvObject) +{ + *pvObject = NULL; + + if (IsEqualIID(iid, + &IID_IShellPropSheetExt) || + IsEqualIID(iid, + &IID_IUnknown)) + { + *pvObject = impl_to_interface(This, IShellPropSheetExt); + } + else if (IsEqualIID(iid, + &IID_IShellExtInit)) + { + *pvObject = impl_to_interface(This, IShellExtInit); + } + else if (IsEqualIID(iid, + &IID_IClassFactory)) + { + *pvObject = impl_to_interface(This, IClassFactory); + } + else + { + DPRINT1("IDeskMonitor::QueryInterface(%p,%p): E_NOINTERFACE\n", iid, pvObject); + return E_NOINTERFACE; + } + + IDeskMonitor_AddRef(This); + return S_OK; +} + +HRESULT +IDeskMonitor_Initialize(PDESKMONITOR This, + LPCITEMIDLIST pidlFolder, + IDataObject *pdtobj, + HKEY hkeyProgID) +{ + DPRINT1("IDeskMonitor::Initialize(%p,%p,%p)\n", pidlFolder, pdtobj, hkeyProgID); + + if (pdtobj != NULL) + { + IDataObject_AddRef(pdtobj); + This->pdtobj = pdtobj; + + /* Get a copy of the desk.cpl extension interface */ + This->DeskExtInterface = QueryDeskCplExtInterface(This->pdtobj); + if (This->DeskExtInterface != NULL) + return S_OK; + } + + return S_FALSE; +} + +HRESULT +IDeskMonitor_AddPages(PDESKMONITOR This, + LPFNADDPROPSHEETPAGE pfnAddPage, + LPARAM lParam) +{ + HPROPSHEETPAGE hpsp; + PROPSHEETPAGE psp; + + DPRINT1("IDeskMonitor::AddPages(%p,%p)\n", pfnAddPage, lParam); + + psp.dwSize = sizeof(psp); + psp.dwFlags = PSP_DEFAULT; + psp.hInstance = hInstance; + psp.pszTemplate = MAKEINTRESOURCE(IDD_MONITOR); + psp.pfnDlgProc = MonitorDlgProc; + psp.lParam = (LPARAM)This; + + hpsp = CreatePropertySheetPage(&psp); + if (hpsp != NULL && pfnAddPage(hpsp, lParam)) + return S_OK; + + return S_FALSE; +} + +HRESULT +IDeskMonitor_ReplacePage(PDESKMONITOR This, + EXPPS uPageID, + LPFNADDPROPSHEETPAGE pfnReplacePage, + LPARAM lParam) +{ + DPRINT1("IDeskMonitor::ReplacePage(%u,%p,%p)\n", uPageID, pfnReplacePage, lParam); + return E_NOTIMPL; +} + +HRESULT +IDeskMonitor_Constructor(REFIID riid, + LPVOID *ppv) +{ + PDESKMONITOR This; + HRESULT hRet = E_OUTOFMEMORY; + + DPRINT1("IDeskMonitor::Constructor(%p,%p)\n", riid, ppv); + + This = HeapAlloc(GetProcessHeap(), + 0, + sizeof(*This)); + if (This != NULL) + { + ZeroMemory(This, + sizeof(*This)); + + IDeskMonitor_InitIface(This); + + hRet = IDeskMonitor_QueryInterface(This, + riid, + ppv); + if (!SUCCEEDED(hRet)) + IDeskMonitor_Release(This); + } + + return hRet; +} + +BOOL STDCALL +DllMain(HINSTANCE hinstDLL, + DWORD dwReason, + LPVOID lpvReserved) +{ + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + hInstance = hinstDLL; + DisableThreadLibraryCalls(hInstance); + break; + } + + return TRUE; +} diff --git a/reactos/dll/win32/shellext/deskmon/deskmon.h b/reactos/dll/win32/shellext/deskmon/deskmon.h new file mode 100644 index 00000000000..b3269fc3304 --- /dev/null +++ b/reactos/dll/win32/shellext/deskmon/deskmon.h @@ -0,0 +1,60 @@ +#ifndef __DESKMON__H +#define __DESKMON__H + +typedef struct _DESKMONITOR +{ + const struct IShellPropSheetExtVtbl *lpIShellPropSheetExtVtbl; + const struct IShellExtInitVtbl *lpIShellExtInitVtbl; + const struct IClassFactoryVtbl *lpIClassFactoryVtbl; + DWORD ref; + + HWND hwndDlg; + PDESK_EXT_INTERFACE DeskExtInterface; + IDataObject *pdtobj; +} DESKMONITOR, *PDESKMONITOR; + +extern LONG dll_refs; + +#define impl_to_interface(impl,iface) (struct iface *)(&(impl)->lp##iface##Vtbl) +#define interface_to_impl(instance,iface) ((PDESKMONITOR)((ULONG_PTR)instance - FIELD_OFFSET(DESKMONITOR,lp##iface##Vtbl))) + +HRESULT +IDeskMonitor_Constructor(REFIID riid, + LPVOID *ppv); + +VOID +IDeskMonitor_InitIface(PDESKMONITOR This); + +HRESULT STDMETHODCALLTYPE +IDeskMonitor_QueryInterface(PDESKMONITOR This, + REFIID iid, + PVOID *pvObject); + +ULONG +IDeskMonitor_AddRef(PDESKMONITOR This); + +ULONG +IDeskMonitor_Release(PDESKMONITOR This); + +HRESULT +IDeskMonitor_Initialize(PDESKMONITOR This, + LPCITEMIDLIST pidlFolder, + IDataObject *pdtobj, + HKEY hkeyProgID); + +HRESULT +IDeskMonitor_AddPages(PDESKMONITOR This, + LPFNADDPROPSHEETPAGE pfnAddPage, + LPARAM lParam); + +HRESULT +IDeskMonitor_ReplacePage(PDESKMONITOR This, + EXPPS uPageID, + LPFNADDPROPSHEETPAGE pfnReplacePage, + LPARAM lParam); + +static const GUID CLSID_IDeskMonitor = {0x42071713,0x76d4,0x11d1,{0x8b,0x24,0x00,0xa0,0xc9,0x06,0x8f,0xf3}}; + +ULONG __cdecl DbgPrint(PCCH Format,...); + +#endif /* __DESKMON__H */ diff --git a/reactos/dll/win32/shellext/deskmon/deskmon.rbuild b/reactos/dll/win32/shellext/deskmon/deskmon.rbuild new file mode 100644 index 00000000000..c84dedfc775 --- /dev/null +++ b/reactos/dll/win32/shellext/deskmon/deskmon.rbuild @@ -0,0 +1,21 @@ + + + . + + 0x0500 + 0x0600 + 0x0600 + ntdll + kernel32 + user32 + gdi32 + comctl32 + ole32 + uuid + msvcrt + deskmon.c + shxiface.c + deskmon.rc + deskmon.spec + precomp.h + diff --git a/reactos/dll/win32/shellext/deskmon/deskmon.rc b/reactos/dll/win32/shellext/deskmon/deskmon.rc new file mode 100644 index 00000000000..23b5675eefc --- /dev/null +++ b/reactos/dll/win32/shellext/deskmon/deskmon.rc @@ -0,0 +1,12 @@ +/* $Id: slayer.rc 24931 2006-11-28 19:35:42Z janderwald $ */ + +#include +#include "resource.h" + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Advanced display monitor properties\0" +#define REACTOS_STR_INTERNAL_NAME "deskmon\0" +#define REACTOS_STR_ORIGINAL_FILENAME "deskmon.dll\0" +#include + +#include "rsrc.rc" diff --git a/reactos/dll/win32/shellext/deskmon/deskmon.spec b/reactos/dll/win32/shellext/deskmon/deskmon.spec new file mode 100644 index 00000000000..49e7f67daae --- /dev/null +++ b/reactos/dll/win32/shellext/deskmon/deskmon.spec @@ -0,0 +1,4 @@ +# deskmon.dll exports + + 1 stdcall DllCanUnloadNow() + 2 stdcall DllGetClassObject(ptr ptr ptr) \ No newline at end of file diff --git a/reactos/dll/win32/shellext/deskmon/lang/en-US.rc b/reactos/dll/win32/shellext/deskmon/lang/en-US.rc new file mode 100644 index 00000000000..437c2a69d51 --- /dev/null +++ b/reactos/dll/win32/shellext/deskmon/lang/en-US.rc @@ -0,0 +1,12 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +IDD_MONITOR DIALOGEX 0, 0, 224, 226 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Monitor" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + GROUPBOX "Monitor type", -1, 7, 3, 237, 52 + LTEXT "", IDC_MONITORNAME, 40, 17, 190, 20, SS_NOPREFIX + PUSHBUTTON "&Properties", IDC_MONITORPROPERTIES, 177, 35, 59, 14, WS_DISABLED +END + diff --git a/reactos/dll/win32/shellext/deskmon/precomp.h b/reactos/dll/win32/shellext/deskmon/precomp.h new file mode 100644 index 00000000000..a69d02aecec --- /dev/null +++ b/reactos/dll/win32/shellext/deskmon/precomp.h @@ -0,0 +1,13 @@ +#ifndef __PRECOMP__H +#define __PRECOMP__H + +#define COBJMACROS +#include +#include +#include +#include +#include +#include "deskmon.h" +#include "resource.h" + +#endif /* __PRECOMP__H */ diff --git a/reactos/dll/win32/shellext/deskmon/resource.h b/reactos/dll/win32/shellext/deskmon/resource.h new file mode 100644 index 00000000000..6e46ea0511a --- /dev/null +++ b/reactos/dll/win32/shellext/deskmon/resource.h @@ -0,0 +1,9 @@ +#ifndef __RESOURCE__H +#define __RESOURCE__H + +#define IDD_MONITOR 100 + +#define IDC_MONITORNAME 201 +#define IDC_MONITORPROPERTIES 202 + +#endif /* __RESOURCE__H */ diff --git a/reactos/dll/win32/shellext/deskmon/rsrc.rc b/reactos/dll/win32/shellext/deskmon/rsrc.rc new file mode 100644 index 00000000000..8e7eed174b9 --- /dev/null +++ b/reactos/dll/win32/shellext/deskmon/rsrc.rc @@ -0,0 +1,7 @@ +#include +#include "resource.h" + +LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL + +#include "lang/en-US.rc" + diff --git a/reactos/dll/win32/shellext/deskmon/shxiface.c b/reactos/dll/win32/shellext/deskmon/shxiface.c new file mode 100644 index 00000000000..0fbaf65cfa1 --- /dev/null +++ b/reactos/dll/win32/shellext/deskmon/shxiface.c @@ -0,0 +1,209 @@ +#include "precomp.h" + +#define NDEBUG +#include + +LONG dll_refs = 0; + +static HRESULT STDMETHODCALLTYPE +IDeskMonitor_IShellPropSheetExt_QueryInterface(IShellPropSheetExt *iface, + REFIID iid, + PVOID *pvObject) +{ + PDESKMONITOR This = interface_to_impl(iface, IShellPropSheetExt); + return IDeskMonitor_QueryInterface(This, + iid, + pvObject); +} + +static ULONG STDMETHODCALLTYPE +IDeskMonitor_IShellPropSheetExt_AddRef(IShellPropSheetExt* iface) +{ + PDESKMONITOR This = interface_to_impl(iface, IShellPropSheetExt); + return IDeskMonitor_AddRef(This); +} + +static ULONG STDMETHODCALLTYPE +IDeskMonitor_IShellPropSheetExt_Release(IShellPropSheetExt* iface) +{ + PDESKMONITOR This = interface_to_impl(iface, IShellPropSheetExt); + return IDeskMonitor_Release(This); +} + +static HRESULT STDMETHODCALLTYPE +IDeskMonitor_IShellPropSheetExt_AddPages(IShellPropSheetExt* iface, + LPFNADDPROPSHEETPAGE pfnAddPage, + LPARAM lParam) +{ + PDESKMONITOR This = interface_to_impl(iface, IShellPropSheetExt); + return IDeskMonitor_AddPages(This, + pfnAddPage, + lParam); +} + +static HRESULT STDMETHODCALLTYPE +IDeskMonitor_IShellPropSheetExt_ReplacePage(IShellPropSheetExt* iface, + EXPPS uPageID, + LPFNADDPROPSHEETPAGE pfnReplacePage, + LPARAM lParam) +{ + PDESKMONITOR This = interface_to_impl(iface, IShellPropSheetExt); + return IDeskMonitor_ReplacePage(This, + uPageID, + pfnReplacePage, + lParam); +} + +static IShellPropSheetExtVtbl efvtIShellPropSheetExt = +{ + IDeskMonitor_IShellPropSheetExt_QueryInterface, + IDeskMonitor_IShellPropSheetExt_AddRef, + IDeskMonitor_IShellPropSheetExt_Release, + IDeskMonitor_IShellPropSheetExt_AddPages, + IDeskMonitor_IShellPropSheetExt_ReplacePage +}; + +static HRESULT STDMETHODCALLTYPE +IDeskMonitor_IShellExtInit_QueryInterface(IShellExtInit *iface, + REFIID iid, + PVOID *pvObject) +{ + PDESKMONITOR This = interface_to_impl(iface, IShellExtInit); + return IDeskMonitor_QueryInterface(This, + iid, + pvObject); +} + +static ULONG STDMETHODCALLTYPE +IDeskMonitor_IShellExtInit_AddRef(IShellExtInit* iface) +{ + PDESKMONITOR This = interface_to_impl(iface, IShellExtInit); + return IDeskMonitor_AddRef(This); +} + +static ULONG STDMETHODCALLTYPE +IDeskMonitor_IShellExtInit_Release(IShellExtInit* iface) +{ + PDESKMONITOR This = interface_to_impl(iface, IShellExtInit); + return IDeskMonitor_Release(This); +} + +static HRESULT STDMETHODCALLTYPE +IDeskMonitor_IShellExtInit_Initialize(IShellExtInit* iface, + LPCITEMIDLIST pidlFolder, + IDataObject *pdtobj, + HKEY hkeyProgID) +{ + PDESKMONITOR This = interface_to_impl(iface, IShellExtInit); + return IDeskMonitor_Initialize(This, + pidlFolder, + pdtobj, + hkeyProgID); +} + +static IShellExtInitVtbl efvtIShellExtInit = +{ + IDeskMonitor_IShellExtInit_QueryInterface, + IDeskMonitor_IShellExtInit_AddRef, + IDeskMonitor_IShellExtInit_Release, + IDeskMonitor_IShellExtInit_Initialize +}; + +static HRESULT STDMETHODCALLTYPE +IDeskMonitor_IClassFactory_QueryInterface(IClassFactory *iface, + REFIID iid, + PVOID *pvObject) +{ + PDESKMONITOR This = interface_to_impl(iface, IClassFactory); + return IDeskMonitor_QueryInterface(This, + iid, + pvObject); +} + +static ULONG STDMETHODCALLTYPE +IDeskMonitor_IClassFactory_AddRef(IClassFactory* iface) +{ + PDESKMONITOR This = interface_to_impl(iface, IClassFactory); + return IDeskMonitor_AddRef(This); +} + +static ULONG STDMETHODCALLTYPE +IDeskMonitor_IClassFactory_Release(IClassFactory* iface) +{ + PDESKMONITOR This = interface_to_impl(iface, IClassFactory); + return IDeskMonitor_Release(This); +} + +static HRESULT STDMETHODCALLTYPE +IDeskMonitor_IClassFactory_CreateInstance(IClassFactory *iface, + IUnknown * pUnkOuter, + REFIID riid, + PVOID *ppvObject) +{ + if (pUnkOuter != NULL && + !IsEqualIID(riid, + &IID_IUnknown)) + { + return CLASS_E_NOAGGREGATION; + } + + return IDeskMonitor_Constructor(riid, + ppvObject); +} + +static HRESULT STDMETHODCALLTYPE +IDeskMonitor_IClassFactory_LockServer(IClassFactory *iface, + BOOL fLock) +{ + if (fLock) + InterlockedIncrement(&dll_refs); + else + InterlockedDecrement(&dll_refs); + + return S_OK; +} + +static IClassFactoryVtbl efvtIClassFactory = +{ + IDeskMonitor_IClassFactory_QueryInterface, + IDeskMonitor_IClassFactory_AddRef, + IDeskMonitor_IClassFactory_Release, + IDeskMonitor_IClassFactory_CreateInstance, + IDeskMonitor_IClassFactory_LockServer, +}; + +VOID +IDeskMonitor_InitIface(PDESKMONITOR This) +{ + This->lpIShellPropSheetExtVtbl = &efvtIShellPropSheetExt; + This->lpIShellExtInitVtbl = &efvtIShellExtInit; + This->lpIClassFactoryVtbl = &efvtIClassFactory; + + IDeskMonitor_AddRef(This); +} + +HRESULT WINAPI +DllGetClassObject(REFCLSID rclsid, + REFIID riid, + LPVOID *ppv) +{ + if (ppv == NULL) + return E_INVALIDARG; + + *ppv = NULL; + if (IsEqualCLSID(rclsid, + &CLSID_IDeskMonitor)) + { + return IDeskMonitor_Constructor(riid, + ppv); + } + + DPRINT1("DllGetClassObject: CLASS_E_CLASSNOTAVAILABLE\n"); + return CLASS_E_CLASSNOTAVAILABLE; +} + +HRESULT WINAPI +DllCanUnloadNow(VOID) +{ + return dll_refs == 0 ? S_OK : S_FALSE; +} diff --git a/reactos/dll/win32/shellext/shellext.rbuild b/reactos/dll/win32/shellext/shellext.rbuild index c5c6a628292..a5362ffe8d6 100644 --- a/reactos/dll/win32/shellext/shellext.rbuild +++ b/reactos/dll/win32/shellext/shellext.rbuild @@ -7,4 +7,7 @@ + + +