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 @@
+
+
+