ReactOS 0.4.17-dev-116-ga4b6fe9
utils.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Shell
3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
4 * PURPOSE: Implement shell light-weight utility functions
5 * COPYRIGHT: Copyright 2023-2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#define _ATL_NO_EXCEPTIONS
9
10/*
11 * HACK! These functions are conflicting with <shobjidl.h> inline functions...
12 */
13#define IShellFolder_GetDisplayNameOf _disabled_IShellFolder_GetDisplayNameOf_
14#define IShellFolder_ParseDisplayName _disabled_IShellFolder_ParseDisplayName_
15#define IShellFolder_CompareIDs _disabled_IShellFolder_CompareIDs_
16
17#include "precomp.h"
18#include <shellapi.h>
19#include <shlwapi.h>
20#include <shlobj_undoc.h>
21#include <shlguid_undoc.h>
22#include <atlstr.h>
23
24#include <shlwapi_undoc.h>
26
27#include <strsafe.h>
28
29#ifndef FAILED_UNEXPECTEDLY
30#define FAILED_UNEXPECTEDLY FAILED /* FIXME: Make shellutils.h usable without ATL */
31#endif
32
34
36
37static inline WORD
39{
42}
43
44static BOOL CharLowerNoDBCSAWorker(PSTR lpString, INT cchMax, BOOL bUppercase)
45{
46 CHAR szBuff[MAX_PATH];
47 INT cch;
48 if (!lpString)
49 return FALSE;
50 cch = cchMax ? cchMax : lstrlenA(lpString);
51 if (FAILED(StringCchCopyA(szBuff, _countof(szBuff), lpString)))
52 return FALSE;
54 szBuff, cch, lpString, cch);
55}
56
57static BOOL CharLowerNoDBCSWWorker(PWSTR lpString, INT cchMax, BOOL bUppercase)
58{
59 WCHAR szDest[MAX_PATH];
60 INT cch;
61 if (!lpString)
62 return FALSE;
63 cch = cchMax ? cchMax : lstrlenW(lpString);
64 if (FAILED(StringCchCopyW(szDest, _countof(szDest), lpString)))
65 return FALSE;
67 szDest, cch, lpString, cch);
68}
69
70/*************************************************************************
71 * CharLowerNoDBCSA [SHLWAPI.453]
72 */
74{
75 return CharLowerNoDBCSAWorker(lpString, 0, FALSE) ? lpString : NULL;
76}
77
78/*************************************************************************
79 * CharLowerNoDBCSW [SHLWAPI.454]
80 */
82{
83 return CharLowerNoDBCSWWorker(lpString, 0, FALSE) ? lpString : NULL;
84}
85
86/*************************************************************************
87 * CharUpperNoDBCSA [SHLWAPI.451]
88 */
90{
91 return CharLowerNoDBCSAWorker(lpString, 0, TRUE) ? lpString : NULL;
92}
93
94/*************************************************************************
95 * CharUpperNoDBCSW [SHLWAPI.452]
96 */
98{
99 return CharLowerNoDBCSWWorker(lpString, 0, TRUE) ? lpString : NULL;
100}
101
102static HRESULT
106 _In_ IContextMenu* pCM,
107 _In_ UINT fCMIC,
108 _In_ UINT fCMF,
109 _In_opt_ LPCSTR pszVerb,
110 _In_opt_ LPCWSTR pwszDir,
111 _In_ bool ForceQCM)
112{
113 CMINVOKECOMMANDINFOEX info = { sizeof(info), fCMIC, hWnd, pszVerb };
114 INT iDefItem = 0;
115 HMENU hMenu = NULL;
116 HCURSOR hOldCursor;
117 HRESULT hr = S_OK;
118 WCHAR wideverb[MAX_PATH];
119
120 if (!pCM)
121 return E_INVALIDARG;
122
123 hOldCursor = SetCursor(LoadCursorW(NULL, (LPCWSTR)IDC_WAIT));
124 info.nShow = SW_NORMAL;
125 if (pUnk)
127
128 if (IS_INTRESOURCE(pszVerb))
129 {
130 hMenu = CreatePopupMenu();
131 if (hMenu)
132 {
133 hr = pCM->QueryContextMenu(hMenu, 0, 1, MAXSHORT, fCMF | CMF_DEFAULTONLY);
134 iDefItem = GetMenuDefaultItem(hMenu, 0, 0);
135 if (iDefItem != -1)
136 info.lpVerb = MAKEINTRESOURCEA(iDefItem - 1);
137 }
138 info.lpVerbW = MAKEINTRESOURCEW(info.lpVerb);
139 }
140 else
141 {
143 {
144 info.fMask |= CMF_OPTIMIZEFORINVOKE;
145 }
146 if (pszVerb && SHAnsiToUnicode(pszVerb, wideverb, _countof(wideverb)))
147 {
148 info.fMask |= CMIC_MASK_UNICODE;
149 info.lpVerbW = wideverb;
150 }
151 if (ForceQCM)
152 {
153 hMenu = CreatePopupMenu();
154 hr = pCM->QueryContextMenu(hMenu, 0, 1, MAXSHORT, fCMF);
155 }
156 }
157
158 SetCursor(hOldCursor);
159
160 if (!FAILED_UNEXPECTEDLY(hr) && (iDefItem != -1 || info.lpVerb))
161 {
162 if (!hWnd)
163 info.fMask |= CMIC_MASK_FLAG_NO_UI;
164
166 if (pwszDir)
167 {
168 info.fMask |= CMIC_MASK_UNICODE;
169 info.lpDirectoryW = pwszDir;
170 if (SHUnicodeToAnsi(pwszDir, dir, _countof(dir)))
171 info.lpDirectory = dir;
172 }
173
174 hr = pCM->InvokeCommand((LPCMINVOKECOMMANDINFO)&info);
175 if (FAILED_UNEXPECTEDLY(hr)) { /* Diagnostic message */ }
176 }
177
178 if (pUnk)
180 if (hMenu)
181 DestroyMenu(hMenu);
182
183 return hr;
184}
185
186/*************************************************************************
187 * SHInvokeCommandOnContextMenuEx [SHLWAPI.639]
188 */
194 _In_ IContextMenu* pCM,
195 _In_ UINT fCMIC,
196 _In_ UINT fCMF,
197 _In_opt_ LPCSTR pszVerb,
198 _In_opt_ LPCWSTR pwszDir)
199{
200 return SHInvokeCommandOnContextMenuInternal(hWnd, pUnk, pCM, fCMIC, fCMF, pszVerb, pwszDir, true);
201}
202
203/*************************************************************************
204 * SHInvokeCommandOnContextMenu [SHLWAPI.540]
205 */
211 _In_ IContextMenu* pCM,
212 _In_ UINT fCMIC,
213 _In_opt_ LPCSTR pszVerb)
214{
215 return SHInvokeCommandOnContextMenuEx(hWnd, pUnk, pCM, fCMIC, CMF_EXTENDEDVERBS, pszVerb, NULL);
216}
217
218static inline BOOL
220{
221 for (const signed char *pch = (const signed char *)psz; *pch; ++pch)
222 {
223 if (*pch < 0)
224 return FALSE;
225 }
226 return TRUE;
227}
228
229/*************************************************************************
230 * SHInvokeCommandsOnContextMenu [SHLWAPI.541]
231 */
236 _In_opt_ IUnknown *punkSite,
237 _In_ IContextMenu *pCM,
238 _In_ DWORD fMask,
239 _In_reads_opt_(cVerbs) PCSTR *pVerbs,
240 _In_ UINT cVerbs)
241{
242 HRESULT hr;
243 CMINVOKECOMMANDINFOEX ici;
244 WCHAR szVerbW[MAX_PATH];
245 HMENU hMenu = NULL;
246 UINT iVerb, idDefault = (UINT)-1;
247 PCSTR pszVerbA = NULL;
248
249 if (!pCM)
250 return E_INVALIDARG;
251
252 hMenu = CreatePopupMenu();
253 if (!hMenu)
254 return E_OUTOFMEMORY;
255
256 if (punkSite)
257 IUnknown_SetSite(pCM, punkSite);
258
259 hr = pCM->QueryContextMenu(hMenu, 0, 1, MAXSHORT, (cVerbs ? 0 : CMF_DEFAULTONLY));
260 if (FAILED(hr))
261 goto Cleanup;
262
263 if (!cVerbs)
264 {
265 idDefault = GetMenuDefaultItem(hMenu, FALSE, 0);
266 if (idDefault != (UINT)-1)
267 pszVerbA = MAKEINTRESOURCEA(idDefault - 1);
268 }
269
270 ZeroMemory(&ici, sizeof(ici));
271 ici.cbSize = sizeof(ici);
272 ici.hwnd = hwnd;
273 ici.nShow = SW_SHOWNORMAL;
274
275 iVerb = 0;
276 do
277 {
278 if (cVerbs)
279 pszVerbA = pVerbs[iVerb];
280
281 if (!pszVerbA && idDefault == (UINT)-1)
282 {
283 hr = E_FAIL;
284 break;
285 }
286
287 ici.fMask = fMask;
288 ici.lpVerb = pszVerbA;
289 ici.lpVerbW = NULL;
290
291 if (idDefault == (UINT)-1 && !IS_INTRESOURCE(pszVerbA) && IsTextAsciiOnly(pszVerbA))
292 {
293 size_t ich;
294 for (ich = 0; pszVerbA[ich] && ich + 1 < _countof(szVerbW); ++ich)
295 {
296 szVerbW[ich] = (BYTE)pszVerbA[ich];
297 }
298 szVerbW[ich] = UNICODE_NULL;
299
300 ici.lpVerbW = szVerbW;
301 ici.fMask |= CMIC_MASK_UNICODE;
302 }
303
304 hr = pCM->InvokeCommand((LPCMINVOKECOMMANDINFO)&ici);
305
307 break;
308
309 ++iVerb;
310 } while (iVerb < cVerbs);
311
312Cleanup:
313 if (punkSite)
315 DestroyMenu(hMenu);
316 return hr;
317}
318
319/*************************************************************************
320 * SHInvokeCommandWithFlagsAndSite [SHLWAPI.571]
321 */
327 _In_ IShellFolder* pShellFolder,
328 _In_ LPCITEMIDLIST pidl,
329 _In_ UINT fCMIC,
330 _In_opt_ LPCSTR pszVerb)
331{
333 if (pShellFolder)
334 {
335 IContextMenu *pCM;
336 hr = pShellFolder->GetUIObjectOf(hWnd, 1, &pidl, IID_IContextMenu, NULL, (void**)&pCM);
337 if (SUCCEEDED(hr))
338 {
339 fCMIC |= CMIC_MASK_FLAG_LOG_USAGE;
340 hr = SHInvokeCommandOnContextMenuEx(hWnd, pUnk, pCM, fCMIC, 0, pszVerb, NULL);
341 pCM->Release();
342 }
343 }
344 return hr;
345}
346
347
348/*************************************************************************
349 * IContextMenu_Invoke [SHLWAPI.207]
350 *
351 * Used by Win:SHELL32!CISFBand::_TrySimpleInvoke.
352 */
356 _In_ IContextMenu *pContextMenu,
357 _In_ HWND hwnd,
358 _In_ LPCSTR lpVerb,
360{
361 TRACE("(%p, %p, %s, %u)\n", pContextMenu, hwnd, debugstr_a(lpVerb), uFlags);
363 uFlags, lpVerb, NULL, false);
364 return !FAILED_UNEXPECTEDLY(hr);
365}
366
367/*************************************************************************
368 * ShellExecuteCommand [INTERNAL]
369 */
370static HRESULT
372{
373 WCHAR szCmd[MAX_PATH * 2];
375 if (len <= 0) // Could not resolve the command, just use the input
376 {
377 HRESULT hr = StringCchCopyW(szCmd, _countof(szCmd), Command);
378 if (FAILED(hr))
379 return hr;
380 }
381 PWSTR pszArgs = PathGetArgsW(szCmd);
382 PathRemoveArgsW(szCmd);
383 PathUnquoteSpacesW(szCmd);
384
385 SHELLEXECUTEINFOW sei = { sizeof(sei), Flags, hWnd, NULL, szCmd, pszArgs };
386 sei.nShow = SW_SHOW;
389}
390
391/*************************************************************************
392 * RunRegCommand [SHLWAPI.469]
393 */
396{
397 WCHAR szCmd[MAX_PATH * 2];
398 DWORD cb = sizeof(szCmd);
400 if (error)
403}
404
405/*************************************************************************
406 * RunIndirectRegCommand [SHLWAPI.468]
407 */
410{
411 WCHAR szKey[MAX_PATH];
412 HRESULT hr;
413 if (pszSubKey)
414 hr = StringCchPrintfW(szKey, _countof(szKey), L"%s\\shell\\%s\\command", pszSubKey, pszVerb);
415 else
416 hr = StringCchPrintfW(szKey, _countof(szKey), L"shell\\%s\\command", pszVerb);
417 return SUCCEEDED(hr) ? RunRegCommand(hWnd, hKey, szKey) : hr;
418}
419
420/*************************************************************************
421 * SHRunIndirectRegClientCommand [SHLWAPI.467]
422 */
425{
426 WCHAR szKey[MAX_PATH], szClient[MAX_PATH];
427 HRESULT hr = StringCchPrintfW(szKey, _countof(szKey), L"Software\\Clients\\%s", pszClientType);
428 if (FAILED(hr))
429 return hr;
430
431 // Find the default client
432 DWORD error, cb;
433 cb = sizeof(szClient);
435 if (error)
436 {
437 cb = sizeof(szClient);
440 if (error)
442 }
443
444 hr = StringCchPrintfW(szKey, _countof(szKey), L"Software\\Clients\\%s\\%s", pszClientType, szClient);
445 if (SUCCEEDED(hr))
447 return hr;
448}
449
450/*************************************************************************
451 * PathFileExistsDefExtAndAttributesW [SHLWAPI.511]
452 *
453 * @param pszPath The path string.
454 * @param dwWhich The WHICH_... flags.
455 * @param pdwFileAttributes A pointer to the file attributes. Optional.
456 * @return TRUE if successful.
457 */
460 _Inout_ LPWSTR pszPath,
461 _In_ DWORD dwWhich,
462 _Out_opt_ LPDWORD pdwFileAttributes)
463{
464 TRACE("(%s, 0x%lX, %p)\n", debugstr_w(pszPath), dwWhich, pdwFileAttributes);
465
466 if (pdwFileAttributes)
467 *pdwFileAttributes = INVALID_FILE_ATTRIBUTES;
468
469 if (!pszPath)
470 return FALSE;
471
472 if (!dwWhich || (*PathFindExtensionW(pszPath) && (dwWhich & WHICH_OPTIONAL)))
473 return PathFileExistsAndAttributesW(pszPath, pdwFileAttributes);
474
475 if (!PathFileExistsDefExtW(pszPath, dwWhich))
476 {
477 if (pdwFileAttributes)
478 *pdwFileAttributes = INVALID_FILE_ATTRIBUTES;
479 return FALSE;
480 }
481
482 if (pdwFileAttributes)
483 *pdwFileAttributes = GetFileAttributesW(pszPath);
484
485 return TRUE;
486}
487
488static inline BOOL
490{
491 return (hr == E_FAIL || hr == E_INVALIDARG || hr == E_NOTIMPL);
492}
493
494// Used for IShellFolder_GetDisplayNameOf
496{
497 SHGDNF uRemove;
498 SHGDNF uAdd;
500};
501static const RETRY_DATA g_RetryData[] =
502{
503 { SHGDN_FOREDITING, SHGDN_NORMAL, SFGDNO_RETRYALWAYS },
504 { SHGDN_FORADDRESSBAR, SHGDN_NORMAL, SFGDNO_RETRYALWAYS },
505 { SHGDN_NORMAL, SHGDN_FORPARSING, SFGDNO_RETRYALWAYS },
506 { SHGDN_FORPARSING, SHGDN_NORMAL, SFGDNO_RETRYWITHFORPARSING },
507 { SHGDN_INFOLDER, SHGDN_NORMAL, SFGDNO_RETRYALWAYS },
508};
509
510/*************************************************************************
511 * IShellFolder_GetDisplayNameOf [SHLWAPI.316]
512 *
513 * @note Don't confuse with <shobjidl.h> inline function of the same name.
514 * If the original call fails with the given uFlags, this function will
515 * retry with other flags to attempt retrieving any meaningful description.
516 */
519 _In_ IShellFolder *psf,
520 _In_ LPCITEMIDLIST pidl,
521 _In_ SHGDNF uFlags,
523 _In_ DWORD dwRetryFlags) // dwRetryFlags is an additional parameter
524{
525 HRESULT hr;
526
527 TRACE("(%p)->(%p, 0x%lX, %p, 0x%lX)\n", psf, pidl, uFlags, lpName, dwRetryFlags);
528
529 hr = psf->GetDisplayNameOf(pidl, uFlags, lpName);
531 return hr;
532
533 dwRetryFlags |= SFGDNO_RETRYALWAYS;
534
535 if ((uFlags & SHGDN_FORPARSING) == 0)
536 dwRetryFlags |= SFGDNO_RETRYWITHFORPARSING;
537
538 // Retry with other flags to get successful results
539 for (SIZE_T iEntry = 0; iEntry < _countof(g_RetryData); ++iEntry)
540 {
541 const RETRY_DATA *pData = &g_RetryData[iEntry];
542 if (!(dwRetryFlags & pData->dwRetryFlags))
543 continue;
544
545 SHGDNF uNewFlags = ((uFlags & ~pData->uRemove) | pData->uAdd);
546 if (uNewFlags == uFlags)
547 continue;
548
549 hr = psf->GetDisplayNameOf(pidl, uNewFlags, lpName);
551 break;
552
553 uFlags = uNewFlags; // Update flags every time
554 }
555
556 return hr;
557}
558
559/*************************************************************************
560 * IShellFolder_ParseDisplayName [SHLWAPI.317]
561 *
562 * @note Don't confuse with <shobjidl.h> inline function of the same name.
563 * This function is safer than IShellFolder::ParseDisplayName.
564 */
567 _In_ IShellFolder *psf,
568 _In_opt_ HWND hwndOwner,
569 _In_opt_ LPBC pbcReserved,
570 _In_ LPOLESTR lpszDisplayName,
571 _Out_opt_ ULONG *pchEaten,
573 _Out_opt_ ULONG *pdwAttributes)
574{
575 ULONG dummy1, dummy2;
576
577 TRACE("(%p)->(%p, %p, %s, %p, %p, %p)\n", psf, hwndOwner, pbcReserved,
578 debugstr_w(lpszDisplayName), pchEaten, ppidl, pdwAttributes);
579
580 if (!pdwAttributes)
581 {
582 dummy1 = 0;
583 pdwAttributes = &dummy1;
584 }
585
586 if (!pchEaten)
587 {
588 dummy2 = 0;
589 pchEaten = &dummy2;
590 }
591
592 if (ppidl)
593 *ppidl = NULL;
594
595 return psf->ParseDisplayName(hwndOwner, pbcReserved, lpszDisplayName, pchEaten,
596 ppidl, pdwAttributes);
597}
598
599/*************************************************************************
600 * IShellFolder_CompareIDs [SHLWAPI.551]
601 *
602 * @note Don't confuse with <shobjidl.h> inline function of the same name.
603 * This function tries IShellFolder2 if possible.
604 */
607 _In_ IShellFolder *psf,
611{
612 TRACE("(%p, %p, %p, %p)\n", psf, lParam, pidl1, pidl2);
613
614 if (lParam & ~(SIZE_T)SHCIDS_COLUMNMASK)
615 {
616 /* Try as IShellFolder2 if possible */
617 HRESULT hr = psf->QueryInterface(IID_IShellFolder2, (void **)&psf);
618 if (FAILED(hr))
619 lParam &= SHCIDS_COLUMNMASK;
620 else
621 psf->Release();
622 }
623
624 return psf->CompareIDs(lParam, pidl1, pidl2);
625}
626
627/*************************************************************************
628 * SHDialogProc [INTERNAL]
629 *
630 * Used in SHDialogBox below
631 */
632
633typedef struct tagSHDIALOG
634{
638
639static INT_PTR CALLBACK
641{
644 HWND hwndItem;
645 LRESULT ret;
646
647 if (uMsg == WM_INITDIALOG)
648 {
651 lParam = (LPARAM)pData->pThis;
652 }
653 else
654 {
656 }
657
658 if (pData && pData->fn)
659 {
660 result = pData->fn(pData->pThis, hWnd, uMsg, wParam, lParam);
661 if (result)
662 return result;
663 }
664
665 switch (uMsg)
666 {
667 case WM_INITDIALOG:
668 return TRUE;
669
670 case WM_COMMAND:
671 if (LOWORD(wParam) == IDHELP)
672 return FALSE;
673
674 hwndItem = GetDlgItem(hWnd, LOWORD(wParam));
675 if (!hwndItem)
676 return FALSE;
677
678 ret = SendMessageA(hwndItem, WM_GETDLGCODE, 0, 0);
680 return FALSE;
681
683 return TRUE;
684
685 default:
686 return FALSE;
687 }
688}
689
690/*************************************************************************
691 * SHDialogBox [SHLWAPI.277]
692 */
696 _In_ PCSTR lpTemplateName,
699 _In_opt_ PVOID pThis)
700{
701 SHDIALOG data = { fn, pThis };
702 return DialogBoxParamA(hInstance, lpTemplateName, hWndParent, SHDialogProc, (LPARAM)&data);
703}
UINT cchMax
unsigned int dir
Definition: maze.c:112
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define EXTERN_C
Definition: basetyps.h:12
HINSTANCE hInstance
Definition: charmap.c:19
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:573
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
UINT uFlags
Definition: api.c:59
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define lstrlenW
Definition: compat.h:750
static const WCHAR version[]
Definition: asmname.c:66
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:636
INT WINAPI LCMapStringA(LCID lcid, DWORD flags, LPCSTR src, INT srclen, LPSTR dst, INT dstlen)
Definition: locale.c:3834
INT WINAPI LCMapStringW(LCID lcid, DWORD flags, LPCWSTR src, INT srclen, LPWSTR dst, INT dstlen)
Definition: locale.c:3808
#define IS_INTRESOURCE(x)
Definition: loader.c:613
void WINAPI PathUnquoteSpacesW(WCHAR *path)
Definition: path.c:2006
LPWSTR WINAPI PathFindExtensionW(const WCHAR *path)
Definition: path.c:1274
WCHAR *WINAPI PathGetArgsW(const WCHAR *path)
Definition: path.c:1740
DWORD WINAPI GetVersion(void)
Definition: version.c:1458
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1411
void WINAPI PathRemoveArgsW(LPWSTR lpszPath)
Definition: path.c:782
BOOL WINAPI PathFileExistsAndAttributesW(LPCWSTR lpszPath, DWORD *dwAttr)
Definition: path.c:1879
BOOL WINAPI PathFileExistsDefExtW(LPWSTR lpszPath, DWORD dwWhich)
Definition: path.c:1126
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
Definition: string.c:2803
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2927
EXTERN_C HRESULT WINAPI RunRegCommand(_In_opt_ HWND hWnd, _In_ HKEY hKey, _In_opt_ PCWSTR pszSubKey)
Definition: utils.cpp:395
EXTERN_C HRESULT WINAPI SHInvokeCommandOnContextMenu(_In_opt_ HWND hWnd, _In_opt_ IUnknown *pUnk, _In_ IContextMenu *pCM, _In_ UINT fCMIC, _In_opt_ LPCSTR pszVerb)
Definition: utils.cpp:208
EXTERN_C LSTATUS WINAPI RegGetValueW(HKEY, LPCWSTR, LPCWSTR, DWORD, LPDWORD, PVOID, LPDWORD)
Definition: reg.c:1931
static BOOL IsTextAsciiOnly(PCSTR psz)
Definition: utils.cpp:219
struct tagSHDIALOG * PSHDIALOG
EXTERN_C HRESULT WINAPI RunIndirectRegCommand(_In_opt_ HWND hWnd, _In_ HKEY hKey, _In_opt_ PCWSTR pszSubKey, _In_ PCWSTR pszVerb)
Definition: utils.cpp:409
static HRESULT ShellExecuteCommand(_In_opt_ HWND hWnd, _In_ PCWSTR Command, _In_opt_ UINT Flags)
Definition: utils.cpp:371
EXTERN_C HRESULT WINAPI SHInvokeCommandWithFlagsAndSite(_In_opt_ HWND hWnd, _In_opt_ IUnknown *pUnk, _In_ IShellFolder *pShellFolder, _In_ LPCITEMIDLIST pidl, _In_ UINT fCMIC, _In_opt_ LPCSTR pszVerb)
Definition: utils.cpp:324
EXTERN_C PWSTR WINAPI CharLowerNoDBCSW(_Inout_ PWSTR lpString)
Definition: utils.cpp:81
EXTERN_C INT_PTR WINAPI SHDialogBox(_In_opt_ HINSTANCE hInstance, _In_ PCSTR lpTemplateName, _In_opt_ HWND hWndParent, _In_opt_ SHDIALOGPROC fn, _In_opt_ PVOID pThis)
Definition: utils.cpp:694
EXTERN_C PSTR WINAPI CharUpperNoDBCSA(_Inout_ PSTR lpString)
Definition: utils.cpp:89
EXTERN_C HRESULT WINAPI SHInvokeCommandOnContextMenuEx(_In_opt_ HWND hWnd, _In_opt_ IUnknown *pUnk, _In_ IContextMenu *pCM, _In_ UINT fCMIC, _In_ UINT fCMF, _In_opt_ LPCSTR pszVerb, _In_opt_ LPCWSTR pwszDir)
Definition: utils.cpp:191
EXTERN_C BOOL WINAPI IContextMenu_Invoke(_In_ IContextMenu *pContextMenu, _In_ HWND hwnd, _In_ LPCSTR lpVerb, _In_ UINT uFlags)
Definition: utils.cpp:355
EXTERN_C PSTR WINAPI CharLowerNoDBCSA(_Inout_ PSTR lpString)
Definition: utils.cpp:73
static const RETRY_DATA g_RetryData[]
Definition: utils.cpp:501
EXTERN_C HRESULT WINAPI SHInvokeCommandsOnContextMenu(_In_opt_ HWND hwnd, _In_opt_ IUnknown *punkSite, _In_ IContextMenu *pCM, _In_ DWORD fMask, _In_reads_opt_(cVerbs) PCSTR *pVerbs, _In_ UINT cVerbs)
Definition: utils.cpp:234
struct tagSHDIALOG SHDIALOG
static BOOL CharLowerNoDBCSWWorker(PWSTR lpString, INT cchMax, BOOL bUppercase)
Definition: utils.cpp:57
static HRESULT SHInvokeCommandOnContextMenuInternal(_In_opt_ HWND hWnd, _In_opt_ IUnknown *pUnk, _In_ IContextMenu *pCM, _In_ UINT fCMIC, _In_ UINT fCMF, _In_opt_ LPCSTR pszVerb, _In_opt_ LPCWSTR pwszDir, _In_ bool ForceQCM)
Definition: utils.cpp:103
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
static BOOL CharLowerNoDBCSAWorker(PSTR lpString, INT cchMax, BOOL bUppercase)
Definition: utils.cpp:44
EXTERN_C HRESULT WINAPI SHRunIndirectRegClientCommand(_In_opt_ HWND hWnd, _In_ PCWSTR pszClientType)
Definition: utils.cpp:424
#define IShellFolder_ParseDisplayName
Definition: utils.cpp:14
#define IShellFolder_CompareIDs
Definition: utils.cpp:15
static WORD GetVersionMajorMinor()
Definition: utils.cpp:38
EXTERN_C PWSTR WINAPI CharUpperNoDBCSW(_Inout_ PWSTR lpString)
Definition: utils.cpp:97
BOOL WINAPI PathFileExistsDefExtAndAttributesW(_Inout_ LPWSTR pszPath, _In_ DWORD dwWhich, _Out_opt_ LPDWORD pdwFileAttributes)
Definition: utils.cpp:459
static INT_PTR CALLBACK SHDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: utils.cpp:640
#define IShellFolder_GetDisplayNameOf
Definition: utils.cpp:13
static BOOL SHLWAPI_IsBogusHRESULT(HRESULT hr)
Definition: utils.cpp:489
static const WCHAR Cleanup[]
Definition: register.c:80
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLuint64EXT * result
Definition: glext.h:11304
GLenum GLsizei len
Definition: glext.h:6722
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
nsrefcnt Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define SFGDNO_RETRYWITHFORPARSING
#define SFGDNO_RETRYALWAYS
#define LOBYTE(W)
Definition: jmemdos.c:487
#define HIBYTE(W)
Definition: jmemdos.c:486
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define ZeroMemory
Definition: minwinbase.h:31
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
#define error(str)
Definition: mkdosfs.c:1605
#define pch(ap)
Definition: match.c:418
static BSTR *static LPOLESTR
Definition: varformat.c:44
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
unsigned int UINT
Definition: ndis.h:50
#define _Out_opt_
Definition: no_sal2.h:214
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_reads_opt_(s)
Definition: no_sal2.h:222
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define LOCALE_SYSTEM_DEFAULT
#define UNICODE_NULL
interface IBindCtx * LPBC
Definition: objfwd.h:18
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
char CHAR
Definition: pedump.c:57
_In_opt_ LPCSTR pszSubKey
Definition: shlwapi.h:783
#define IDHELP
Definition: resource_2.h:8
#define _WIN32_WINNT_WIN7
Definition: sdkddkver.h:28
#define SEE_MASK_FLAG_LOG_USAGE
Definition: shellapi.h:55
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2723
#define PPCF_FORCEQUALIFY
Definition: shlobj.h:2429
LONG WINAPI PathProcessCommand(_In_ LPCWSTR, _Out_writes_(cchDest) LPWSTR, int cchDest, DWORD)
#define PPCF_ADDARGUMENTS
Definition: shlobj.h:2426
INT_PTR(CALLBACK * SHDIALOGPROC)(PVOID pThis, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
#define WHICH_OPTIONAL
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
STRSAFEAPI StringCchCopyA(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:145
Definition: shell.h:41
SHGDNF uAdd
Definition: utils.cpp:498
SHGDNF uRemove
Definition: utils.cpp:497
DWORD dwRetryFlags
Definition: utils.cpp:499
SHDIALOGPROC fn
Definition: utils.cpp:635
PVOID pThis
Definition: utils.cpp:636
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
uint16_t * PWSTR
Definition: typedefs.h:56
const char * LPCSTR
Definition: typedefs.h:52
int32_t INT_PTR
Definition: typedefs.h:64
char * PSTR
Definition: typedefs.h:51
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define MAKEWORD(a, b)
Definition: typedefs.h:248
uint16_t * LPWSTR
Definition: typedefs.h:56
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint32_t * LPDWORD
Definition: typedefs.h:59
int32_t INT
Definition: typedefs.h:58
const char * PCSTR
Definition: typedefs.h:52
uint32_t ULONG
Definition: typedefs.h:59
#define MAXSHORT
Definition: umtypes.h:114
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LPCSTR lpName
Definition: winbase.h:2543
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
HICON HCURSOR
Definition: windef.h:99
#define WINAPI
Definition: msvc.h:6
#define ERROR_BUFFER_OVERFLOW
Definition: winerror.h:307
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define ERROR_CANCELLED
Definition: winerror.h:1055
#define LCMAP_UPPERCASE
Definition: winnls.h:198
#define LCMAP_LOWERCASE
Definition: winnls.h:197
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define RRF_RT_REG_SZ
Definition: winreg.h:58
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define SetWindowLongPtrA
Definition: winuser.h:5511
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
UINT WINAPI GetMenuDefaultItem(_In_ HMENU hMenu, _In_ UINT fByPos, _In_ UINT gmdiFlags)
#define DWLP_USER
Definition: winuser.h:883
#define WM_COMMAND
Definition: winuser.h:1768
#define DLGC_UNDEFPUSHBUTTON
Definition: winuser.h:2658
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
HCURSOR WINAPI SetCursor(_In_opt_ HCURSOR)
#define GetWindowLongPtrA
Definition: winuser.h:4982
#define WM_INITDIALOG
Definition: winuser.h:1767
HCURSOR WINAPI LoadCursorW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
Definition: cursoricon.c:2474
#define DLGC_DEFPUSHBUTTON
Definition: winuser.h:2657
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define IDC_WAIT
Definition: winuser.h:697
#define SW_SHOW
Definition: winuser.h:786
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define SW_NORMAL
Definition: winuser.h:780
#define WM_GETDLGCODE
Definition: winuser.h:1717
INT_PTR WINAPI DialogBoxParamA(_In_opt_ HINSTANCE, _In_ LPCSTR, _In_opt_ HWND, _In_opt_ DLGPROC, _In_ LPARAM)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
unsigned char BYTE
Definition: xxhash.c:193