ReactOS 0.4.16-dev-976-g18fc5a1
misc.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS shell extensions
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Quick Launch Toolbar (Taskbar Shell Extension)
5 * COPYRIGHT: Copyright 2014 Giannis Adamopoulos
6 */
7
8
9#include <stdio.h>
10#include <tchar.h>
11
12#define WIN32_NO_STATUS
13#define _INC_WINDOWS
14#define COM_NO_WINDOWS_H
15
16#define COBJMACROS
17
18#include <windef.h>
19#include <winbase.h>
20#include <winreg.h>
21#include <wingdi.h>
22#include <winnls.h>
23#include <wincon.h>
24#include <shellapi.h>
25#include <shlobj.h>
26#include <shlobj_undoc.h>
27#include <shlwapi.h>
28#include <shlguid_undoc.h>
29#include <uxtheme.h>
30#include <strsafe.h>
31
32#include <atlbase.h>
33#include <atlcom.h>
34#include <atlwin.h>
35#include <undocshell.h>
36#include <undocuser.h>
37
38#include <shellutils.h>
39
40#include <CQuickLaunchBand.h>
41
42#include <wine/debug.h>
43
44extern "C"
45{
47
53}
54
55class CRShellModule : public CComModule
56{
57public:
58};
59
61CAtlWinModule gWinModule;
62
64
65static LSTATUS inline _RegSetStringValueW(HKEY hKey, LPCWSTR lpValueName, LPCWSTR lpStringData)
66{
67 DWORD dwStringDataLen = lstrlenW(lpStringData);
68
69 return RegSetValueExW(hKey, lpValueName, 0, REG_SZ, (BYTE *) lpStringData, 2 * (dwStringDataLen + 1));
70}
71
73{
74 WCHAR szFilename[MAX_PATH];
75 WCHAR szClsid[MAX_PATH];
76 WCHAR szRoot[MAX_PATH];
77
78 if (!StringFromGUID2(clsid, szClsid, _countof(szClsid)))
79 return E_FAIL;
80
81 if (!GetModuleFileNameW(shell32_hInstance, szFilename, _countof(szFilename)))
82 return E_FAIL;
83
84 HRESULT hr = StringCchPrintfW(szRoot, 0x104u, L"CLSID\\%s", szClsid);
85 if (FAILED(hr))
86 return hr;
87
88 DWORD dwDisposition;
89 HKEY hkRoot;
90 if (RegCreateKeyExW(HKEY_CLASSES_ROOT, szRoot, 0, NULL, 0, KEY_WRITE, 0, &hkRoot, &dwDisposition) != 0)
91 return E_FAIL;
92
93 HKEY hkServer;
94
95 _RegSetStringValueW(hkRoot, NULL, szDisplayName);
96
97 if (RegCreateKeyExW(hkRoot, L"InprocServer32", 0, NULL, 0, KEY_SET_VALUE, 0, &hkServer, &dwDisposition) != 0)
98 {
99 RegCloseKey(hkRoot);
100 return E_FAIL;
101 }
102
103 _RegSetStringValueW(hkServer, NULL, szFilename);
104 _RegSetStringValueW(hkServer, L"ThreadingModel", L"Both");
105
106 RegCloseKey(hkServer);
107 RegCloseKey(hkRoot);
108 return S_OK;
109}
110
112{
113 WCHAR szClsid[MAX_PATH];
114 WCHAR szRoot[MAX_PATH];
115 HKEY hkRoot;
116
117 if (!StringFromGUID2(clsid, szClsid, _countof(szClsid)))
118 return E_FAIL;
119
120 HRESULT hr = StringCchPrintfW(szRoot, 0x104u, L"CLSID\\%s", szClsid);
121 if (FAILED(hr))
122 return hr;
123
124 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szRoot, 0, KEY_WRITE, &hkRoot) != 0)
125 return E_FAIL;
126
127 RegDeleteKeyW(hkRoot, L"InprocServer32");
128 RegCloseKey(hkRoot);
129
131
132 return S_OK;
133}
134
136{
138 {
140
141 gModule.Init(NULL, hInstance, NULL);
143 }
144 else if (dwReason == DLL_PROCESS_DETACH)
145 {
147 gModule.Term();
148 }
149 return TRUE;
150}
151
153WINAPI
155{
156 gModule.DllCanUnloadNow();
157 return S_FALSE;
158}
159
160STDAPI
162{
163#if 0
164 RegisterComponent(CLSID_StartMenu, L"Shell Start Menu");
165 RegisterComponent(CLSID_MenuDeskBar, L"Shell Menu Desk Bar");
166 RegisterComponent(CLSID_MenuBand, L"Shell Menu Band");
167 RegisterComponent(CLSID_MenuBandSite, L"Shell Menu Band Site");
168 RegisterComponent(CLSID_MergedFolder, L"Merged Shell Folder");
169 RegisterComponent(CLSID_RebarBandSite, L"Shell Rebar Band Site");
170#endif
173 return S_OK;
174}
175
176STDAPI
178{
179#if 0
181 UnregisterComponent(CLSID_MenuDeskBar);
182 UnregisterComponent(CLSID_MenuBand);
184 UnregisterComponent(CLSID_MergedFolder);
185 UnregisterComponent(CLSID_RebarBandSite);
186#endif
189 return S_OK;
190}
191
193 public CComObjectRootEx<CComMultiThreadModelNoCS>,
194 public IClassFactory
195{
196private:
198
199public:
202
204 {
205 m_Clsid = clsid;
206 return S_OK;
207 }
208
209 /* IClassFactory */
211 {
212 *ppvObject = NULL;
213
216
217 if (IsEqualCLSID(m_Clsid, CLSID_MenuDeskBar))
219
220 if (IsEqualCLSID(m_Clsid, CLSID_MenuBand))
222
225
226 if (IsEqualCLSID(m_Clsid, CLSID_MergedFolder))
228
230 return ShellObjectCreator<CQuickLaunchBand>(riid, ppvObject);
231
232 return E_NOINTERFACE;
233 }
234
236 {
237 return E_NOTIMPL;
238 }
239
243};
244
245STDAPI
247 REFCLSID rclsid,
248 REFIID riid,
249 LPVOID *ppv)
250{
251 if (!ppv)
252 return E_INVALIDARG;
253
254 *ppv = NULL;
255
256 return ShellObjectCreatorInit<CRShellClassFactory>(rclsid, riid, ppv);
257}
258
260{
261 char buf[MAX_PATH];
262 wsprintfA(buf, "rundll32.exe shell32.dll,Options_RunDLL %u", Page);
264}
const GUID CLSID_QuickLaunchBand
HRESULT UnregisterComCat()
HRESULT RegisterComCat()
static HRESULT UnregisterComponent(REFGUID clsid)
Definition: misc.cpp:111
STDAPI DllRegisterServer(void)
Definition: misc.cpp:161
CAtlWinModule gWinModule
Definition: misc.cpp:61
VOID WINAPI ShowFolderOptionsDialog(UINT Page, BOOL Async)
Definition: misc.cpp:259
DWORD LPVOID fImpLoad
Definition: misc.cpp:136
STDAPI DllUnregisterServer(void)
Definition: misc.cpp:177
HINSTANCE shell32_hInstance
Definition: misc.cpp:63
static HRESULT RegisterComponent(REFGUID clsid, LPCWSTR szDisplayName)
Definition: misc.cpp:72
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
Definition: misc.cpp:246
HRESULT WINAPI RSHELL_CStartMenu_CreateInstance(REFIID riid, void **ppv)
Definition: CStartMenu.cpp:592
static LSTATUS _RegSetStringValueW(HKEY hKey, LPCWSTR lpValueName, LPCWSTR lpStringData)
Definition: misc.cpp:65
HRESULT WINAPI RSHELL_CMenuBand_CreateInstance(REFIID riid, LPVOID *ppv)
Definition: CMenuBand.cpp:1321
HRESULT WINAPI RSHELL_CMenuSite_CreateInstance(REFIID riid, LPVOID *ppv)
Definition: CMenuSite.cpp:363
HRESULT WINAPI RSHELL_CMenuDeskBar_CreateInstance(REFIID riid, LPVOID *ppv)
CRShellModule gModule
Definition: misc.cpp:60
HRESULT WINAPI DllCanUnloadNow(void)
Definition: misc.cpp:154
HRESULT WINAPI RSHELL_CMergedFolder_CreateInstance(REFIID riid, LPVOID *ppv)
DWORD dwReason
Definition: misc.cpp:135
#define STDAPI_(t)
Definition: basetyps.h:42
#define STDAPI
Definition: basetyps.h:41
const GUID IID_IClassFactory
#define RegCloseKey(hKey)
Definition: registry.h:49
HINSTANCE hInstance
Definition: charmap.c:19
virtual HRESULT WINAPI CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObject)
Definition: misc.cpp:210
HRESULT Initialize(REFGUID clsid)
Definition: misc.cpp:203
virtual HRESULT WINAPI LockServer(BOOL fLock)
Definition: misc.cpp:235
virtual ~CRShellClassFactory()
Definition: misc.cpp:201
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegDeleteKeyW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey)
Definition: reg.c:1239
#define DLL_PROCESS_ATTACH
Definition: compat.h:131
#define DLL_PROCESS_DETACH
Definition: compat.h:130
#define MAX_PATH
Definition: compat.h:34
#define lstrlenW
Definition: compat.h:750
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
BOOL WINAPI DisableThreadLibraryCalls(IN HMODULE hLibModule)
Definition: loader.c:85
UINT WINAPI DECLSPEC_HOTPATCH WinExec(LPCSTR lpCmdLine, UINT uCmdShow)
Definition: proc.c:4779
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
const GUID CLSID_MenuBandSite
const GUID CLSID_StartMenu
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
BOOL WINAPI DllMain(IN HINSTANCE hinstDLL, IN DWORD dwReason, IN LPVOID lpvReserved)
Definition: kbsdll.c:95
#define REG_SZ
Definition: layer.c:22
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define END_COM_MAP()
Definition: atlcom.h:592
REFCLSID clsid
Definition: msctf.c:82
unsigned int UINT
Definition: ndis.h:50
#define KEY_WRITE
Definition: nt_native.h:1031
#define KEY_SET_VALUE
Definition: nt_native.h:1017
_In_ PVOID _Out_opt_ BOOLEAN _Out_opt_ PPFN_NUMBER Page
Definition: mm.h:1313
#define L(x)
Definition: ntvdm.h:50
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
#define IsEqualCLSID(rclsid1, rclsid2)
Definition: guiddef.h:96
HRESULT hr
Definition: shlfolder.c:183
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
Definition: scsiwmi.h:51
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
Definition: wincrypt.h:6082
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
int WINAPIV wsprintfA(_Out_ LPSTR, _In_ _Printf_format_string_ LPCSTR,...)
#define SW_SHOW
Definition: winuser.h:786
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193