diff --git a/reactos/baseaddress.rbuild b/reactos/baseaddress.rbuild index c5694e8b3ec..e380e871bf1 100644 --- a/reactos/baseaddress.rbuild +++ b/reactos/baseaddress.rbuild @@ -55,6 +55,7 @@ + diff --git a/reactos/dll/win32/shellext/deskadp/deskadp.c b/reactos/dll/win32/shellext/deskadp/deskadp.c new file mode 100644 index 00000000000..ca4d5d2076b --- /dev/null +++ b/reactos/dll/win32/shellext/deskadp/deskadp.c @@ -0,0 +1,218 @@ +#include "precomp.h" + +#define NDEBUG +#include + +static HINSTANCE hInstance; + +static INT_PTR CALLBACK +DisplayAdapterDlgProc(HWND hwndDlg, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + PDESKDISPLAYADAPTER This; + INT_PTR Ret = 0; + + if (uMsg != WM_INITDIALOG) + { + This = (PDESKDISPLAYADAPTER)GetWindowLongPtr(hwndDlg, + DWL_USER); + } + + switch (uMsg) + { + case WM_INITDIALOG: + This = (PDESKDISPLAYADAPTER)((LPCPROPSHEETPAGE)lParam)->lParam; + SetWindowLongPtr(hwndDlg, + DWL_USER, + (LONG_PTR)This); + + Ret = TRUE; + break; + } + + return Ret; +} + +static VOID +IDeskDisplayAdapter_Destroy(PDESKDISPLAYADAPTER This) +{ + if (This->pdtobj != NULL) + { + IDataObject_Release(This->pdtobj); + This->pdtobj = NULL; + } + + if (This->DeskExtInterface != NULL) + { + LocalFree((HLOCAL)This->DeskExtInterface); + This->DeskExtInterface = NULL; + } +} + +ULONG +IDeskDisplayAdapter_AddRef(PDESKDISPLAYADAPTER This) +{ + ULONG ret; + + ret = InterlockedIncrement((PLONG)&This->ref); + if (ret == 1) + InterlockedIncrement(&dll_refs); + + return ret; +} + +ULONG +IDeskDisplayAdapter_Release(PDESKDISPLAYADAPTER This) +{ + ULONG ret; + + ret = InterlockedDecrement((PLONG)&This->ref); + if (ret == 0) + { + IDeskDisplayAdapter_Destroy(This); + InterlockedDecrement(&dll_refs); + + HeapFree(GetProcessHeap(), + 0, + This); + } + + return ret; +} + +HRESULT STDMETHODCALLTYPE +IDeskDisplayAdapter_QueryInterface(PDESKDISPLAYADAPTER 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("IDeskDisplayAdapter::QueryInterface(%p,%p): E_NOINTERFACE\n", iid, pvObject); + return E_NOINTERFACE; + } + + IDeskDisplayAdapter_AddRef(This); + return S_OK; +} + +HRESULT +IDeskDisplayAdapter_Initialize(PDESKDISPLAYADAPTER This, + LPCITEMIDLIST pidlFolder, + IDataObject *pdtobj, + HKEY hkeyProgID) +{ + DPRINT1("IDeskDisplayAdapter::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 +IDeskDisplayAdapter_AddPages(PDESKDISPLAYADAPTER This, + LPFNADDPROPSHEETPAGE pfnAddPage, + LPARAM lParam) +{ + HPROPSHEETPAGE hpsp; + PROPSHEETPAGE psp; + + DPRINT1("IDeskDisplayAdapter::AddPages(%p,%p)\n", pfnAddPage, lParam); + + psp.dwSize = sizeof(psp); + psp.dwFlags = PSP_DEFAULT; + psp.hInstance = hInstance; + psp.pszTemplate = MAKEINTRESOURCE(IDD_DISPLAYADAPTER); + psp.pfnDlgProc = DisplayAdapterDlgProc; + psp.lParam = (LPARAM)This; + + hpsp = CreatePropertySheetPage(&psp); + if (hpsp != NULL && pfnAddPage(hpsp, lParam)) + return S_OK; + + return S_FALSE; +} + +HRESULT +IDeskDisplayAdapter_ReplacePage(PDESKDISPLAYADAPTER This, + EXPPS uPageID, + LPFNADDPROPSHEETPAGE pfnReplacePage, + LPARAM lParam) +{ + DPRINT1("IDeskDisplayAdapter::ReplacePage(%u,%p,%p)\n", uPageID, pfnReplacePage, lParam); + return E_NOTIMPL; +} + +HRESULT +IDeskDisplayAdapter_Constructor(REFIID riid, + LPVOID *ppv) +{ + PDESKDISPLAYADAPTER This; + HRESULT hRet = E_OUTOFMEMORY; + + DPRINT1("IDeskDisplayAdapter::Constructor(%p,%p)\n", riid, ppv); + + This = HeapAlloc(GetProcessHeap(), + 0, + sizeof(*This)); + if (This != NULL) + { + ZeroMemory(This, + sizeof(*This)); + + IDeskDisplayAdapter_InitIface(This); + + hRet = IDeskDisplayAdapter_QueryInterface(This, + riid, + ppv); + if (!SUCCEEDED(hRet)) + IDeskDisplayAdapter_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/deskadp/deskadp.h b/reactos/dll/win32/shellext/deskadp/deskadp.h new file mode 100644 index 00000000000..a2344615ca3 --- /dev/null +++ b/reactos/dll/win32/shellext/deskadp/deskadp.h @@ -0,0 +1,59 @@ +#ifndef __DESKADP__H +#define __DESKADP__H + +typedef struct _DESKDISPLAYADAPTER +{ + const struct IShellPropSheetExtVtbl *lpIShellPropSheetExtVtbl; + const struct IShellExtInitVtbl *lpIShellExtInitVtbl; + const struct IClassFactoryVtbl *lpIClassFactoryVtbl; + DWORD ref; + + PDESK_EXT_INTERFACE DeskExtInterface; + IDataObject *pdtobj; +} DESKDISPLAYADAPTER, *PDESKDISPLAYADAPTER; + +extern LONG dll_refs; + +#define impl_to_interface(impl,iface) (struct iface *)(&(impl)->lp##iface##Vtbl) +#define interface_to_impl(instance,iface) ((PDESKDISPLAYADAPTER)((ULONG_PTR)instance - FIELD_OFFSET(DESKDISPLAYADAPTER,lp##iface##Vtbl))) + +HRESULT +IDeskDisplayAdapter_Constructor(REFIID riid, + LPVOID *ppv); + +VOID +IDeskDisplayAdapter_InitIface(PDESKDISPLAYADAPTER This); + +HRESULT STDMETHODCALLTYPE +IDeskDisplayAdapter_QueryInterface(PDESKDISPLAYADAPTER This, + REFIID iid, + PVOID *pvObject); + +ULONG +IDeskDisplayAdapter_AddRef(PDESKDISPLAYADAPTER This); + +ULONG +IDeskDisplayAdapter_Release(PDESKDISPLAYADAPTER This); + +HRESULT +IDeskDisplayAdapter_Initialize(PDESKDISPLAYADAPTER This, + LPCITEMIDLIST pidlFolder, + IDataObject *pdtobj, + HKEY hkeyProgID); + +HRESULT +IDeskDisplayAdapter_AddPages(PDESKDISPLAYADAPTER This, + LPFNADDPROPSHEETPAGE pfnAddPage, + LPARAM lParam); + +HRESULT +IDeskDisplayAdapter_ReplacePage(PDESKDISPLAYADAPTER This, + EXPPS uPageID, + LPFNADDPROPSHEETPAGE pfnReplacePage, + LPARAM lParam); + +static const GUID CLSID_IDeskDisplayAdapter = {0x42071712,0x76d4,0x11d1,{0x8b,0x24,0x00,0xa0,0xc9,0x06,0x8f,0xf3}}; + +ULONG __cdecl DbgPrint(PCCH Format,...); + +#endif /* __DESKADP__H */ diff --git a/reactos/dll/win32/shellext/deskadp/deskadp.rbuild b/reactos/dll/win32/shellext/deskadp/deskadp.rbuild new file mode 100644 index 00000000000..16db27f4b9f --- /dev/null +++ b/reactos/dll/win32/shellext/deskadp/deskadp.rbuild @@ -0,0 +1,21 @@ + + + . + + 0x0500 + 0x0600 + 0x0600 + ntdll + kernel32 + user32 + gdi32 + comctl32 + ole32 + uuid + msvcrt + deskadp.c + shxiface.c + deskadp.rc + deskadp.spec + precomp.h + diff --git a/reactos/dll/win32/shellext/deskadp/deskadp.rc b/reactos/dll/win32/shellext/deskadp/deskadp.rc new file mode 100644 index 00000000000..3f7c2531386 --- /dev/null +++ b/reactos/dll/win32/shellext/deskadp/deskadp.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 adapter properties\0" +#define REACTOS_STR_INTERNAL_NAME "deskadp\0" +#define REACTOS_STR_ORIGINAL_FILENAME "deskadp.dll\0" +#include + +#include "rsrc.rc" diff --git a/reactos/dll/win32/shellext/deskadp/deskadp.spec b/reactos/dll/win32/shellext/deskadp/deskadp.spec new file mode 100644 index 00000000000..04847a5d1f5 --- /dev/null +++ b/reactos/dll/win32/shellext/deskadp/deskadp.spec @@ -0,0 +1,4 @@ +# deskadp.dll exports + + 1 stdcall DllCanUnloadNow() + 2 stdcall DllGetClassObject(ptr ptr ptr) \ No newline at end of file diff --git a/reactos/dll/win32/shellext/deskadp/lang/en-US.rc b/reactos/dll/win32/shellext/deskadp/lang/en-US.rc new file mode 100644 index 00000000000..252b82b9816 --- /dev/null +++ b/reactos/dll/win32/shellext/deskadp/lang/en-US.rc @@ -0,0 +1,10 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +IDD_DISPLAYADAPTER DIALOGEX 0, 0, 224, 226 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION +CAPTION "Adapter" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + +END + diff --git a/reactos/dll/win32/shellext/deskadp/precomp.h b/reactos/dll/win32/shellext/deskadp/precomp.h new file mode 100644 index 00000000000..f31cb20b980 --- /dev/null +++ b/reactos/dll/win32/shellext/deskadp/precomp.h @@ -0,0 +1,11 @@ +#ifndef __PRECOMP__H +#define __PRECOMP__H + +#define COBJMACROS +#include +#include +#include +#include "deskadp.h" +#include "resource.h" + +#endif /* __PRECOMP__H */ diff --git a/reactos/dll/win32/shellext/deskadp/resource.h b/reactos/dll/win32/shellext/deskadp/resource.h new file mode 100644 index 00000000000..f9645cd9bfa --- /dev/null +++ b/reactos/dll/win32/shellext/deskadp/resource.h @@ -0,0 +1,6 @@ +#ifndef __RESOURCE__H +#define __RESOURCE__H + +#define IDD_DISPLAYADAPTER 100 + +#endif /* __RESOURCE__H */ diff --git a/reactos/dll/win32/shellext/deskadp/rsrc.rc b/reactos/dll/win32/shellext/deskadp/rsrc.rc new file mode 100644 index 00000000000..8e7eed174b9 --- /dev/null +++ b/reactos/dll/win32/shellext/deskadp/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/deskadp/shxiface.c b/reactos/dll/win32/shellext/deskadp/shxiface.c new file mode 100644 index 00000000000..95eecdd3512 --- /dev/null +++ b/reactos/dll/win32/shellext/deskadp/shxiface.c @@ -0,0 +1,209 @@ +#include "precomp.h" + +#define NDEBUG +#include + +LONG dll_refs = 0; + +static HRESULT STDMETHODCALLTYPE +IDeskDisplayAdapter_IShellPropSheetExt_QueryInterface(IShellPropSheetExt *iface, + REFIID iid, + PVOID *pvObject) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellPropSheetExt); + return IDeskDisplayAdapter_QueryInterface(This, + iid, + pvObject); +} + +static ULONG STDMETHODCALLTYPE +IDeskDisplayAdapter_IShellPropSheetExt_AddRef(IShellPropSheetExt* iface) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellPropSheetExt); + return IDeskDisplayAdapter_AddRef(This); +} + +static ULONG STDMETHODCALLTYPE +IDeskDisplayAdapter_IShellPropSheetExt_Release(IShellPropSheetExt* iface) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellPropSheetExt); + return IDeskDisplayAdapter_Release(This); +} + +static HRESULT STDMETHODCALLTYPE +IDeskDisplayAdapter_IShellPropSheetExt_AddPages(IShellPropSheetExt* iface, + LPFNADDPROPSHEETPAGE pfnAddPage, + LPARAM lParam) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellPropSheetExt); + return IDeskDisplayAdapter_AddPages(This, + pfnAddPage, + lParam); +} + +static HRESULT STDMETHODCALLTYPE +IDeskDisplayAdapter_IShellPropSheetExt_ReplacePage(IShellPropSheetExt* iface, + EXPPS uPageID, + LPFNADDPROPSHEETPAGE pfnReplacePage, + LPARAM lParam) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellPropSheetExt); + return IDeskDisplayAdapter_ReplacePage(This, + uPageID, + pfnReplacePage, + lParam); +} + +static IShellPropSheetExtVtbl efvtIShellPropSheetExt = +{ + IDeskDisplayAdapter_IShellPropSheetExt_QueryInterface, + IDeskDisplayAdapter_IShellPropSheetExt_AddRef, + IDeskDisplayAdapter_IShellPropSheetExt_Release, + IDeskDisplayAdapter_IShellPropSheetExt_AddPages, + IDeskDisplayAdapter_IShellPropSheetExt_ReplacePage +}; + +static HRESULT STDMETHODCALLTYPE +IDeskDisplayAdapter_IShellExtInit_QueryInterface(IShellExtInit *iface, + REFIID iid, + PVOID *pvObject) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellExtInit); + return IDeskDisplayAdapter_QueryInterface(This, + iid, + pvObject); +} + +static ULONG STDMETHODCALLTYPE +IDeskDisplayAdapter_IShellExtInit_AddRef(IShellExtInit* iface) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellExtInit); + return IDeskDisplayAdapter_AddRef(This); +} + +static ULONG STDMETHODCALLTYPE +IDeskDisplayAdapter_IShellExtInit_Release(IShellExtInit* iface) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellExtInit); + return IDeskDisplayAdapter_Release(This); +} + +static HRESULT STDMETHODCALLTYPE +IDeskDisplayAdapter_IShellExtInit_Initialize(IShellExtInit* iface, + LPCITEMIDLIST pidlFolder, + IDataObject *pdtobj, + HKEY hkeyProgID) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellExtInit); + return IDeskDisplayAdapter_Initialize(This, + pidlFolder, + pdtobj, + hkeyProgID); +} + +static IShellExtInitVtbl efvtIShellExtInit = +{ + IDeskDisplayAdapter_IShellExtInit_QueryInterface, + IDeskDisplayAdapter_IShellExtInit_AddRef, + IDeskDisplayAdapter_IShellExtInit_Release, + IDeskDisplayAdapter_IShellExtInit_Initialize +}; + +static HRESULT STDMETHODCALLTYPE +IDeskDisplayAdapter_IClassFactory_QueryInterface(IClassFactory *iface, + REFIID iid, + PVOID *pvObject) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IClassFactory); + return IDeskDisplayAdapter_QueryInterface(This, + iid, + pvObject); +} + +static ULONG STDMETHODCALLTYPE +IDeskDisplayAdapter_IClassFactory_AddRef(IClassFactory* iface) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IClassFactory); + return IDeskDisplayAdapter_AddRef(This); +} + +static ULONG STDMETHODCALLTYPE +IDeskDisplayAdapter_IClassFactory_Release(IClassFactory* iface) +{ + PDESKDISPLAYADAPTER This = interface_to_impl(iface, IClassFactory); + return IDeskDisplayAdapter_Release(This); +} + +static HRESULT STDMETHODCALLTYPE +IDeskDisplayAdapter_IClassFactory_CreateInstance(IClassFactory *iface, + IUnknown * pUnkOuter, + REFIID riid, + PVOID *ppvObject) +{ + if (pUnkOuter != NULL && + !IsEqualIID(riid, + &IID_IUnknown)) + { + return CLASS_E_NOAGGREGATION; + } + + return IDeskDisplayAdapter_Constructor(riid, + ppvObject); +} + +static HRESULT STDMETHODCALLTYPE +IDeskDisplayAdapter_IClassFactory_LockServer(IClassFactory *iface, + BOOL fLock) +{ + if (fLock) + InterlockedIncrement(&dll_refs); + else + InterlockedDecrement(&dll_refs); + + return S_OK; +} + +static IClassFactoryVtbl efvtIClassFactory = +{ + IDeskDisplayAdapter_IClassFactory_QueryInterface, + IDeskDisplayAdapter_IClassFactory_AddRef, + IDeskDisplayAdapter_IClassFactory_Release, + IDeskDisplayAdapter_IClassFactory_CreateInstance, + IDeskDisplayAdapter_IClassFactory_LockServer, +}; + +VOID +IDeskDisplayAdapter_InitIface(PDESKDISPLAYADAPTER This) +{ + This->lpIShellPropSheetExtVtbl = &efvtIShellPropSheetExt; + This->lpIShellExtInitVtbl = &efvtIShellExtInit; + This->lpIClassFactoryVtbl = &efvtIClassFactory; + + IDeskDisplayAdapter_AddRef(This); +} + +HRESULT WINAPI +DllGetClassObject(REFCLSID rclsid, + REFIID riid, + LPVOID *ppv) +{ + if (ppv == NULL) + return E_INVALIDARG; + + *ppv = NULL; + if (IsEqualCLSID(rclsid, + &CLSID_IDeskDisplayAdapter)) + { + return IDeskDisplayAdapter_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 b7b81f2c2f1..c5c6a628292 100644 --- a/reactos/dll/win32/shellext/shellext.rbuild +++ b/reactos/dll/win32/shellext/shellext.rbuild @@ -4,4 +4,7 @@ + + +