1 /*
2 * PROJECT: ReactOS Font Shell Extension
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Shell extension entry point
5 * COPYRIGHT: Copyright 2019,2020 Mark Jansen <mark.jansen@reactos.org>
6 */
7
8 #include "precomp.h"
9
10 WINE_DEFAULT_DEBUG_CHANNEL(fontext);
11
12 const GUID CLSID_CFontExt = { 0xbd84b380, 0x8ca2, 0x1069, { 0xab, 0x1d, 0x08, 0x00, 0x09, 0x48, 0xf5, 0x34 } };
13
14
15 class CFontExtModule : public CComModule
16 {
17 public:
Init(_ATL_OBJMAP_ENTRY * p,HINSTANCE h,const GUID * plibid)18 void Init(_ATL_OBJMAP_ENTRY *p, HINSTANCE h, const GUID *plibid)
19 {
20 g_FontCache = new CFontCache();
21 CComModule::Init(p, h, plibid);
22 }
23
Term()24 void Term()
25 {
26 delete g_FontCache;
27 g_FontCache = NULL;
28 CComModule::Term();
29 }
30 };
31
32 BEGIN_OBJECT_MAP(ObjectMap)
33 OBJECT_ENTRY(CLSID_CFontExt, CFontExt)
34 END_OBJECT_MAP()
35
36
37 LONG g_ModuleRefCnt;
38 CFontExtModule gModule;
39
40
DllCanUnloadNow()41 STDAPI DllCanUnloadNow()
42 {
43 if (g_ModuleRefCnt)
44 return S_FALSE;
45 return gModule.DllCanUnloadNow();
46 }
47
DllGetClassObject(REFCLSID rclsid,REFIID riid,LPVOID * ppv)48 STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
49 {
50 return gModule.DllGetClassObject(rclsid, riid, ppv);
51 }
52
53
DllRegisterServer()54 STDAPI DllRegisterServer()
55 {
56 WCHAR Path[MAX_PATH] = { 0 };
57 static const char DesktopIniContents[] = "[.ShellClassInfo]\r\n"
58 "CLSID={BD84B380-8CA2-1069-AB1D-08000948F534}\r\n"
59 "IconResource=%SystemRoot%\\system32\\shell32.dll,-39\r\n"; // IDI_SHELL_FONTS_FOLDER
60 HANDLE hFile;
61 HRESULT hr;
62
63 hr = gModule.DllRegisterServer(FALSE);
64 if (FAILED_UNEXPECTEDLY(hr))
65 return hr;
66
67 hr = SHGetFolderPathW(NULL, CSIDL_FONTS, NULL, 0, Path);
68 if (FAILED_UNEXPECTEDLY(hr))
69 return hr;
70
71 // Make this a system folder:
72 // Ideally this should not be done here, but when installing
73 // Otherwise, livecd won't have this set properly
74 DWORD dwAttributes = GetFileAttributesW(Path);
75 if (dwAttributes != INVALID_FILE_ATTRIBUTES)
76 {
77 dwAttributes |= FILE_ATTRIBUTE_SYSTEM;
78 SetFileAttributesW(Path, dwAttributes);
79 }
80 else
81 {
82 ERR("Unable to get attributes for fonts folder (%d)\n", GetLastError());
83 }
84
85 if (!PathAppendW(Path, L"desktop.ini"))
86 return E_FAIL;
87
88 hFile = CreateFileW(Path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN, NULL);
89 if (hFile == INVALID_HANDLE_VALUE)
90 return HRESULT_FROM_WIN32(GetLastError());
91
92 DWORD BytesWritten, BytesToWrite = strlen(DesktopIniContents);
93 if (WriteFile(hFile, DesktopIniContents, (DWORD)BytesToWrite, &BytesWritten, NULL))
94 hr = (BytesToWrite == BytesWritten) ? S_OK : E_FAIL;
95 else
96 hr = HRESULT_FROM_WIN32(GetLastError());
97 CloseHandle(hFile);
98 return hr;
99 }
100
DllUnregisterServer()101 STDAPI DllUnregisterServer()
102 {
103 return gModule.DllUnregisterServer(FALSE);
104 }
105
106
107 EXTERN_C
DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved)108 BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
109 {
110 switch (dwReason)
111 {
112 case DLL_PROCESS_ATTACH:
113 DisableThreadLibraryCalls(hInstance);
114 gModule.Init(ObjectMap, hInstance, NULL);
115 break;
116 case DLL_PROCESS_DETACH:
117 gModule.Term();
118 break;
119 }
120
121 return TRUE;
122 }
123