ReactOS 0.4.16-dev-981-g80eb313
errinfo.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS uxtheme.dll
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: UXTHEME error reporting helpers
5 * COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "uxthemep.h"
9#include <stdlib.h>
10#include <strsafe.h>
11
14{
15 PTMERRINFO pErrInfo;
16
18 return NULL;
19
21 if (pErrInfo)
22 return pErrInfo;
23
24 if (bCreate)
25 {
26 pErrInfo = LocalAlloc(LPTR, sizeof(*pErrInfo));
28 }
29
30 return pErrInfo;
31}
32
33VOID
35{
37 if (!pErrInfo)
38 return;
39
41 LocalFree(pErrInfo);
42}
43
44static BOOL
47 _In_ UINT uID,
48 _Out_ LPWSTR pszDest,
50 _In_ LPCWSTR pszDrive,
51 _In_ PTMERRINFO pErrInfo)
52{
53 WCHAR szFormat[MAX_PATH];
54 LPCWSTR args[2] = { pErrInfo->szParam1, pErrInfo->szParam2 };
55
56 if (!LoadStringW(hInstance, uID, szFormat, _countof(szFormat)) || !szFormat[0])
57 return FALSE;
58
60 szFormat, 0, 0, pszDest, cchDest, (va_list *)args) != 0;
61}
62
63static HRESULT
65 _In_ PTMERRINFO pErrInfo,
66 _Out_ LPWSTR pszDest,
68{
69 DWORD nID;
70 HMODULE hMod, hUxTheme;
71 WCHAR szFullPath[_MAX_PATH];
72 WCHAR szDrive[_MAX_DRIVE + 1], szDir[_MAX_DIR], szFileName[_MAX_FNAME], szExt[_MAX_EXT];
73 BOOL ret;
74 HRESULT hr;
75
76 nID = LOWORD(pErrInfo->nID);
77 if (!GetModuleFileNameW(NULL, szFullPath, _countof(szFullPath)))
78 return S_OK;
79
80 _wsplitpath(szFullPath, szDrive, szDir, szFileName, szExt);
81 if (lstrcmpiW(szFileName, L"packthem") == 0)
82 {
83 hMod = GetModuleHandleW(NULL);
84 if (UXTHEME_FormatLocalMsg(hMod, nID, pszDest, cchDest, szDrive, pErrInfo))
85 return S_OK;
86 }
87
88 hUxTheme = LoadLibraryW(L"uxtheme.dll");
89 if (!hUxTheme)
90 return E_FAIL;
91
92 ret = UXTHEME_FormatLocalMsg(hUxTheme, nID, pszDest, cchDest, szDrive, pErrInfo);
95
96 return hr;
97}
98
99// Parser should use this function on failure
102 _In_ UINT nID,
103 _In_ LPCWSTR pszParam1,
104 _In_ LPCWSTR pszParam2,
105 _In_ LPCWSTR pszFile,
106 _In_ LPCWSTR pszLine,
107 _In_ INT nLineNo)
108{
110 if (pErrInfo)
111 {
112 pErrInfo->nID = nID;
113 pErrInfo->nLineNo = nLineNo;
114 StringCchCopyW(pErrInfo->szParam1, _countof(pErrInfo->szParam1), pszParam1);
115 StringCchCopyW(pErrInfo->szParam2, _countof(pErrInfo->szParam2), pszParam2);
116 StringCchCopyW(pErrInfo->szFile, _countof(pErrInfo->szFile), pszFile);
117 StringCchCopyW(pErrInfo->szLine, _countof(pErrInfo->szLine), pszLine);
118 }
120}
121
122/*************************************************************************
123 * GetThemeParseErrorInfo (UXTHEME.48)
124 */
127{
128 PTMERRINFO pErrInfo;
129 HRESULT hr;
130
131 if (!pInfo)
132 return E_POINTER;
133
134 if (pInfo->cbSize != sizeof(*pInfo))
135 return E_INVALIDARG;
136
138 if (!pErrInfo)
139 return E_OUTOFMEMORY;
140
141 hr = UXTHEME_FormatParseMessage(pErrInfo, pInfo->szDescription, _countof(pInfo->szDescription));
142 if (FAILED(hr))
143 return hr;
144
145 pInfo->nID = pErrInfo->nID;
146 pInfo->nLineNo = pErrInfo->nLineNo;
147 StringCchCopyW(pInfo->szFile, _countof(pInfo->szFile), pErrInfo->szFile);
148 StringCchCopyW(pInfo->szLine, _countof(pInfo->szLine), pErrInfo->szLine);
149 return hr;
150}
static _In_ LPCWSTR _In_ DWORD _In_ int _In_ int cchDest
char * va_list
Definition: acmsvcex.h:78
static HMODULE hUxTheme
Definition: theme.c:60
HINSTANCE hInstance
Definition: charmap.c:19
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define FreeLibrary(x)
Definition: compat.h:748
#define MAX_PATH
Definition: compat.h:34
#define LoadLibraryW(x)
Definition: compat.h:747
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
HMODULE WINAPI GetModuleHandleW(LPCWSTR lpModuleName)
Definition: loader.c:838
LPVOID WINAPI TlsGetValue(IN DWORD Index)
Definition: thread.c:1240
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
Definition: thread.c:1276
DWORD WINAPI FormatMessageW(DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, __ms_va_list *args)
Definition: format_msg.c:583
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4262
DWORD gdwErrorInfoTlsIndex
Definition: system.c:27
HRESULT UXTHEME_MakeParseError(_In_ UINT nID, _In_ LPCWSTR pszParam1, _In_ LPCWSTR pszParam2, _In_ LPCWSTR pszFile, _In_ LPCWSTR pszLine, _In_ INT nLineNo)
Definition: errinfo.c:101
PTMERRINFO UXTHEME_GetParseErrorInfo(_In_ BOOL bCreate)
Definition: errinfo.c:13
HRESULT WINAPI GetThemeParseErrorInfo(_Inout_ PPARSE_ERROR_INFO pInfo)
Definition: errinfo.c:126
VOID UXTHEME_DeleteParseErrorInfo(VOID)
Definition: errinfo.c:34
static BOOL UXTHEME_FormatLocalMsg(_In_ HINSTANCE hInstance, _In_ UINT uID, _Out_ LPWSTR pszDest, _In_ SIZE_T cchDest, _In_ LPCWSTR pszDrive, _In_ PTMERRINFO pErrInfo)
Definition: errinfo.c:45
static HRESULT UXTHEME_FormatParseMessage(_In_ PTMERRINFO pErrInfo, _Out_ LPWSTR pszDest, _In_ SIZE_T cchDest)
Definition: errinfo.c:64
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
_CRTIMP void __cdecl _wsplitpath(_In_z_ const wchar_t *_FullPath, _Pre_maybenull_ _Post_z_ wchar_t *_Drive, _Pre_maybenull_ _Post_z_ wchar_t *_Dir, _Pre_maybenull_ _Post_z_ wchar_t *_Filename, _Pre_maybenull_ _Post_z_ wchar_t *_Ext)
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define _MAX_FNAME
Definition: utility.h:74
#define _MAX_PATH
Definition: utility.h:77
#define _MAX_DIR
Definition: utility.h:75
#define _MAX_DRIVE
Definition: utility.h:73
#define _MAX_EXT
Definition: utility.h:76
unsigned int UINT
Definition: ndis.h:50
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
HRESULT hr
Definition: shlfolder.c:183
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1528
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
Definition: match.c:390
WCHAR szFile[MAX_PATH]
Definition: uxthemep.h:98
UINT nID
Definition: uxthemep.h:95
WCHAR szParam1[MAX_PATH]
Definition: uxthemep.h:96
WCHAR szParam2[MAX_PATH]
Definition: uxthemep.h:97
WCHAR szLine[MAX_PATH]
Definition: uxthemep.h:99
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
static HRESULT UXTHEME_MakeLastError(VOID)
Definition: uxthemep.h:315
int ret
#define FORMAT_MESSAGE_FROM_STRING
Definition: winbase.h:447
#define LPTR
Definition: winbase.h:407
#define FORMAT_MESSAGE_ARGUMENT_ARRAY
Definition: winbase.h:450
#define TLS_OUT_OF_INDEXES
Definition: winbase.h:575
#define WINAPI
Definition: msvc.h:6
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define ERROR_UNKNOWN_PROPERTY
Definition: winerror.h:966
#define E_POINTER
Definition: winerror.h:2365
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185