ReactOS 0.4.16-dev-178-g8ba6102
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
56{
57 /* do something here (perhaps we may want to add our own implementation fo win8) */
58 return 0;
59}
60
61class CRShellModule : public CComModule
62{
63public:
64};
65
67CAtlWinModule gWinModule;
68
70
71static LSTATUS inline _RegSetStringValueW(HKEY hKey, LPCWSTR lpValueName, LPCWSTR lpStringData)
72{
73 DWORD dwStringDataLen = lstrlenW(lpStringData);
74
75 return RegSetValueExW(hKey, lpValueName, 0, REG_SZ, (BYTE *) lpStringData, 2 * (dwStringDataLen + 1));
76}
77
79{
80 WCHAR szFilename[MAX_PATH];
81 WCHAR szClsid[MAX_PATH];
82 WCHAR szRoot[MAX_PATH];
83
84 if (!StringFromGUID2(clsid, szClsid, _countof(szClsid)))
85 return E_FAIL;
86
87 if (!GetModuleFileNameW(shell32_hInstance, szFilename, _countof(szFilename)))
88 return E_FAIL;
89
90 HRESULT hr = StringCchPrintfW(szRoot, 0x104u, L"CLSID\\%s", szClsid);
91 if (FAILED(hr))
92 return hr;
93
94 DWORD dwDisposition;
95 HKEY hkRoot;
96 if (RegCreateKeyExW(HKEY_CLASSES_ROOT, szRoot, 0, NULL, 0, KEY_WRITE, 0, &hkRoot, &dwDisposition) != 0)
97 return E_FAIL;
98
99 HKEY hkServer;
100
101 _RegSetStringValueW(hkRoot, NULL, szDisplayName);
102
103 if (RegCreateKeyExW(hkRoot, L"InprocServer32", 0, NULL, 0, KEY_SET_VALUE, 0, &hkServer, &dwDisposition) != 0)
104 {
105 RegCloseKey(hkRoot);
106 return E_FAIL;
107 }
108
109 _RegSetStringValueW(hkServer, NULL, szFilename);
110 _RegSetStringValueW(hkServer, L"ThreadingModel", L"Both");
111
112 RegCloseKey(hkServer);
113 RegCloseKey(hkRoot);
114 return S_OK;
115}
116
118{
119 WCHAR szClsid[MAX_PATH];
120 WCHAR szRoot[MAX_PATH];
121 HKEY hkRoot;
122
123 if (!StringFromGUID2(clsid, szClsid, _countof(szClsid)))
124 return E_FAIL;
125
126 HRESULT hr = StringCchPrintfW(szRoot, 0x104u, L"CLSID\\%s", szClsid);
127 if (FAILED(hr))
128 return hr;
129
130 if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szRoot, 0, KEY_WRITE, &hkRoot) != 0)
131 return E_FAIL;
132
133 RegDeleteKeyW(hkRoot, L"InprocServer32");
134 RegCloseKey(hkRoot);
135
137
138 return S_OK;
139}
140
142{
144 {
146
147 gModule.Init(NULL, hInstance, NULL);
149 }
150 else if (dwReason == DLL_PROCESS_DETACH)
151 {
153 gModule.Term();
154 }
155 return TRUE;
156}
157
159WINAPI
161{
162 gModule.DllCanUnloadNow();
163 return S_FALSE;
164}
165
166STDAPI
168{
169#if 0
170 RegisterComponent(CLSID_StartMenu, L"Shell Start Menu");
171 RegisterComponent(CLSID_MenuDeskBar, L"Shell Menu Desk Bar");
172 RegisterComponent(CLSID_MenuBand, L"Shell Menu Band");
173 RegisterComponent(CLSID_MenuBandSite, L"Shell Menu Band Site");
174 RegisterComponent(CLSID_MergedFolder, L"Merged Shell Folder");
175 RegisterComponent(CLSID_RebarBandSite, L"Shell Rebar Band Site");
176#endif
179 return S_OK;
180}
181
182STDAPI
184{
185#if 0
187 UnregisterComponent(CLSID_MenuDeskBar);
188 UnregisterComponent(CLSID_MenuBand);
190 UnregisterComponent(CLSID_MergedFolder);
191 UnregisterComponent(CLSID_RebarBandSite);
192#endif
195 return S_OK;
196}
197
199 public CComObjectRootEx<CComMultiThreadModelNoCS>,
200 public IClassFactory
201{
202private:
204
205public:
208
210 {
211 m_Clsid = clsid;
212 return S_OK;
213 }
214
215 /* IClassFactory */
217 {
218 *ppvObject = NULL;
219
222
223 if (IsEqualCLSID(m_Clsid, CLSID_MenuDeskBar))
225
226 if (IsEqualCLSID(m_Clsid, CLSID_MenuBand))
228
231
232 if (IsEqualCLSID(m_Clsid, CLSID_MergedFolder))
234
236 return ShellObjectCreator<CQuickLaunchBand>(riid, ppvObject);
237
238 return E_NOINTERFACE;
239 }
240
242 {
243 return E_NOTIMPL;
244 }
245
249};
250
251STDAPI
253 REFCLSID rclsid,
254 REFIID riid,
255 LPVOID *ppv)
256{
257 if (!ppv)
258 return E_INVALIDARG;
259
260 *ppv = NULL;
261
262 return ShellObjectCreatorInit<CRShellClassFactory>(rclsid, riid, ppv);
263}
264
266{
267 char buf[MAX_PATH];
268 wsprintfA(buf, "rundll32.exe shell32.dll,Options_RunDLL %u", Page);
270}
const GUID CLSID_QuickLaunchBand
HRESULT UnregisterComCat()
HRESULT RegisterComCat()
static HRESULT UnregisterComponent(REFGUID clsid)
Definition: misc.cpp:117
STDAPI DllRegisterServer(void)
Definition: misc.cpp:167
CAtlWinModule gWinModule
Definition: misc.cpp:67
VOID WINAPI ShowFolderOptionsDialog(UINT Page, BOOL Async)
Definition: misc.cpp:265
DWORD LPVOID fImpLoad
Definition: misc.cpp:142
STDAPI DllUnregisterServer(void)
Definition: misc.cpp:183
HINSTANCE shell32_hInstance
Definition: misc.cpp:69
static HRESULT RegisterComponent(REFGUID clsid, LPCWSTR szDisplayName)
Definition: misc.cpp:78
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
Definition: misc.cpp:252
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:71
HRESULT WINAPI RSHELL_CMenuBand_CreateInstance(REFIID riid, LPVOID *ppv)
Definition: CMenuBand.cpp:1320
HRESULT WINAPI RSHELL_CMenuSite_CreateInstance(REFIID riid, LPVOID *ppv)
Definition: CMenuSite.cpp:360
HRESULT WINAPI RSHELL_CMenuDeskBar_CreateInstance(REFIID riid, LPVOID *ppv)
DWORD WINAPI WinList_Init(void)
Definition: misc.cpp:55
CRShellModule gModule
Definition: misc.cpp:66
HRESULT WINAPI DllCanUnloadNow(void)
Definition: misc.cpp:160
HRESULT WINAPI RSHELL_CMergedFolder_CreateInstance(REFIID riid, LPVOID *ppv)
DWORD dwReason
Definition: misc.cpp:141
#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:216
HRESULT Initialize(REFGUID clsid)
Definition: misc.cpp:209
virtual HRESULT WINAPI LockServer(BOOL fLock)
Definition: misc.cpp:241
virtual ~CRShellClassFactory()
Definition: misc.cpp:207
#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:1306
#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:778
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193