ReactOS 0.4.16-dev-2298-gcac013a
fontpidl.cpp File Reference
#include "precomp.h"
Include dependency graph for fontpidl.cpp:

Go to the source code of this file.

Macros

#define FONTPIDL_MAGIC   0x7066
 
#define ALIGN_DWORD(size)   (((size) + 3) & ~3)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (fontext)
 
PITEMID_CHILD _ILCreate (LPCWSTR lpName, LPCWSTR lpFileName)
 
const FontPidlEntry_FontFromIL (PCITEMID_CHILD pidl)
 

Macro Definition Documentation

◆ ALIGN_DWORD

#define ALIGN_DWORD (   size)    (((size) + 3) & ~3)

Definition at line 14 of file fontpidl.cpp.

◆ FONTPIDL_MAGIC

#define FONTPIDL_MAGIC   0x7066

Definition at line 13 of file fontpidl.cpp.

Function Documentation

◆ _FontFromIL()

const FontPidlEntry * _FontFromIL ( PCITEMID_CHILD  pidl)

Definition at line 80 of file fontpidl.cpp.

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 ERR(fmt,...)
Definition: precomp.h:57
#define NULL
Definition: types.h:112
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
#define FONTPIDL_MAGIC
Definition: fontpidl.cpp:13
STRSAFEAPI StringCbLengthW(STRSAFE_LPCWSTR psz, size_t cbMax, size_t *pcbLength)
Definition: strsafe.h:876
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
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by _CDataObject_CreateInstance(), _ILCreate(), CFontExt::CompareIDs(), DeleteFontFiles(), DoPreviewFontFiles(), CFontExt::GetAttributesOf(), CFontExt::GetDetailsOf(), CFontExt::GetDisplayNameOf(), and CFontExt::GetUIObjectOf().

◆ _ILCreate()

PITEMID_CHILD _ILCreate ( LPCWSTR  lpName,
LPCWSTR  lpFileName 
)

Definition at line 16 of file fontpidl.cpp.

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}
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
#define FALSE
Definition: types.h:117
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
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 StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
#define STRSAFE_MAX_CCH
Definition: strsafe.h:83
_In_ LPCSTR lpFileName
Definition: winbase.h:2824
_In_ LPCSTR lpName
Definition: winbase.h:2543

Referenced by CFindFolder::AddResult(), CEnumZipContents::Next(), CEnumFonts::Next(), CFontExt::ParseDisplayName(), and CFindFolder::SetNameOf().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( fontext  )