ReactOS 0.4.16-dev-2284-g3529151
fontpidl.cpp
Go to the documentation of this file.
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: pidl handling
5 * COPYRIGHT: Copyright 2019,2020 Mark Jansen <mark.jansen@reactos.org>
6 * Copyright 2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7 */
8
9#include "precomp.h"
10
12
13#define FONTPIDL_MAGIC 0x7066 // 'fp'
14#define ALIGN_DWORD(size) (((size) + 3) & ~3)
15
17{
20
21 if (!lpName[0] || !lpFileName[0])
22 {
23 ERR("Invalid parameters: lpName '%S', lpFileName '%S'\n", lpName, lpFileName);
24 return NULL;
25 }
26
27 HRESULT hr;
28 size_t cbName, cbFileName;
29 hr = StringCbLengthW(lpName, min(MAXWORD - 1, STRSAFE_MAX_CCH) * sizeof(WCHAR), &cbName);
31 return NULL;
32 hr = StringCbLengthW(lpFileName, min(MAXWORD - 1, STRSAFE_MAX_CCH) * sizeof(WCHAR), &cbFileName);
34 return NULL;
35 cbName += sizeof(UNICODE_NULL);
36 cbFileName += sizeof(UNICODE_NULL);
37
38 size_t ibName = ALIGN_DWORD(sizeof(FontPidlEntry));
39 size_t ibFileName = ALIGN_DWORD(ibName + cbName);
40 size_t cbData = ibFileName + cbFileName;
41 if (cbData > MAXWORD - sizeof(WORD))
42 {
44 return NULL;
45 }
46
48 if (!pidl)
49 {
50 ERR("Out of memory\n");
51 return NULL;
52 }
53
54 ZeroMemory(pidl, cbData + sizeof(WORD));
55 pidl->cb = (WORD)cbData;
56 pidl->Magic = FONTPIDL_MAGIC;
57 pidl->ibName = (WORD)ibName;
58 pidl->ibFileName = (WORD)ibFileName;
59
60 hr = StringCbCopyW(pidl->Name(), cbName, lpName);
62 {
63 CoTaskMemFree(pidl);
64 return NULL;
65 }
66 hr = StringCbCopyW(pidl->FileName(), cbFileName, lpFileName);
68 {
69 CoTaskMemFree(pidl);
70 return NULL;
71 }
72
73 *(PWORD)((PBYTE)pidl + cbData) = UNICODE_NULL;
74
76
77 return (PITEMID_CHILD)pidl;
78}
79
81{
82 if (!pidl || pidl->mkid.cb < sizeof(FontPidlEntry))
83 return NULL;
84
85 const FontPidlEntry* fontEntry = (const FontPidlEntry*)pidl;
86 if (fontEntry->Magic != FONTPIDL_MAGIC)
87 return NULL;
88
89 // The function gets an arbitrary PIDL here. Security is important.
90 if (fontEntry->ibName < sizeof(FontPidlEntry) || fontEntry->ibFileName < sizeof(FontPidlEntry) ||
91 fontEntry->ibName >= fontEntry->cb || fontEntry->ibFileName >= fontEntry->cb ||
92 fontEntry->ibName % sizeof(WCHAR) != 0 || fontEntry->ibFileName % sizeof(WCHAR) != 0)
93 {
94 ERR("Invalid fontEntry %p (ibName %d, ibFileName %d, cb %d)\n", fontEntry,
95 fontEntry->ibName, fontEntry->ibFileName, fontEntry->cb);
96 return NULL;
97 }
98
99 size_t cbName, cbNameMax = fontEntry->cb - fontEntry->ibName;
100 if (FAILED_UNEXPECTEDLY(StringCbLengthW(fontEntry->Name(), cbNameMax, &cbName)))
101 return NULL;
102 size_t cbFileName, cbFileNameMax = fontEntry->cb - fontEntry->ibFileName;
103 if (FAILED_UNEXPECTEDLY(StringCbLengthW(fontEntry->FileName(), cbFileNameMax, &cbFileName)))
104 return NULL;
105
106 return fontEntry;
107}
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ERR(fmt,...)
Definition: precomp.h:57
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
unsigned short WORD
Definition: ntddk_ex.h:93
#define ALIGN_DWORD(size)
Definition: fontpidl.cpp:14
const FontPidlEntry * _FontFromIL(PCITEMID_CHILD pidl)
Definition: fontpidl.cpp:80
PITEMID_CHILD _ILCreate(LPCWSTR lpName, LPCWSTR lpFileName)
Definition: fontpidl.cpp:16
#define FONTPIDL_MAGIC
Definition: fontpidl.cpp:13
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
#define ZeroMemory
Definition: minwinbase.h:31
#define min(a, b)
Definition: monoChain.cc:55
#define UNICODE_NULL
#define MAXWORD
WORD * PWORD
Definition: pedump.c:67
BYTE * PBYTE
Definition: pedump.c:66
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
Definition: shlwapi.h:761
HRESULT hr
Definition: shlfolder.c:183
STRSAFEAPI StringCbLengthW(STRSAFE_LPCWSTR psz, size_t cbMax, size_t *pcbLength)
Definition: strsafe.h:876
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
#define STRSAFE_MAX_CCH
Definition: strsafe.h:83
LPWSTR Name()
Definition: fontpidl.hpp:18
WORD ibFileName
Definition: fontpidl.hpp:17
LPWSTR FileName()
Definition: fontpidl.hpp:19
WORD cb
Definition: shtypes.idl:27
SHITEMID mkid
Definition: shtypes.idl:34
_In_ LPCSTR lpFileName
Definition: winbase.h:2824
_In_ LPCSTR lpName
Definition: winbase.h:2543
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180