ReactOS 0.4.17-dev-470-gf9e3448
utils.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: shell32
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: Utility functions
5 * COPYRIGHT: Copyright 2023-2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "precomp.h"
9#include <lmcons.h>
10#include <lmapibuf.h>
11#include <lmaccess.h>
12#include <lmserver.h>
13#include <secext.h>
14
16
18{
19 PCSTR pch, pchEnd = &psz[cch];
20 for (pch = psz; *pch && pch < pchEnd; pch = CharNextA(pch))
21 ;
22 if (pchEnd < pch) // A double-byte character detected at last?
23 pch -= 2; // The width of a double-byte character is 2
24 return pch;
25}
26
28{
29 PCWSTR pch, pchEnd = &psz[cch];
30 for (pch = psz; *pch && pch < pchEnd; ++pch)
31 ;
32 return pch;
33}
34
35static INT _SHMergePopupMenus(HMENU hMenu, HMENU hPopupMenu, UINT uIDAdjust, UINT uIDAdjustMax)
36{
37 INT maxID = uIDAdjust;
38 const INT itemCount = GetMenuItemCount(hPopupMenu);
39 if (itemCount == -1)
40 return maxID;
41
42 MENUITEMINFOW mii = { sizeof(mii), MIIM_ID | MIIM_SUBMENU };
43 for (INT i = itemCount - 1; i >= 0; --i)
44 {
45 if (!GetMenuItemInfoW(hPopupMenu, i, TRUE, &mii))
46 continue;
47
48 HMENU hTargetSubMenu = SHGetMenuFromID(hMenu, mii.wID);
49 if (!hTargetSubMenu)
50 continue;
51
52 INT currentMax = Shell_MergeMenus(hTargetSubMenu, mii.hSubMenu, 0,
53 uIDAdjust, uIDAdjustMax,
55 maxID = max(maxID, currentMax);
56 }
57
58 return maxID;
59}
60
62{
63 HMENU hMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(uMenuId));
64 if (!hMenu)
65 return NULL;
66 HMENU hSubMenu = GetSubMenu(hMenu, 0);
67 RemoveMenu(hMenu, 0, MF_BYPOSITION);
68 DestroyMenu(hMenu);
69 return hSubMenu;
70}
71
72/*************************************************************************
73 * CDefFolderMenu_MergeMenu [SHELL32.702]
74 */
79 _In_ UINT uMainMerge,
80 _In_ UINT uPopupMerge,
81 _Inout_ LPQCMINFO lpQcmInfo)
82{
83 UINT idCmdFirst = lpQcmInfo->idCmdFirst;
84 HMENU hPopupMenu;
85
86 if (uMainMerge)
87 {
88 hPopupMenu = SHLoadPopupMenu(hInstance, uMainMerge);
89 if (hPopupMenu)
90 {
92 idCmdFirst = Shell_MergeMenus(lpQcmInfo->hmenu,
93 hPopupMenu,
94 lpQcmInfo->indexMenu,
95 lpQcmInfo->idCmdFirst,
96 lpQcmInfo->idCmdLast,
97 uFlags);
98 DestroyMenu(hPopupMenu);
99 }
100 }
101
102 if (uPopupMerge)
103 {
104 hPopupMenu = LoadMenuW(hInstance, MAKEINTRESOURCEW(uPopupMerge));
105 if (hPopupMenu)
106 {
107 UINT id = _SHMergePopupMenus(lpQcmInfo->hmenu, hPopupMenu,
108 lpQcmInfo->idCmdFirst, lpQcmInfo->idCmdLast);
109 idCmdFirst = max(idCmdFirst, id);
110 DestroyMenu(hPopupMenu);
111 }
112 }
113
114 lpQcmInfo->idCmdFirst = idCmdFirst;
115}
116
117/*************************************************************************
118 * StrRStrA [SHELL32.389]
119 */
123 _In_ PCSTR pszSrc,
124 _In_opt_ PCSTR pszLast,
125 _In_ PCSTR pszSearch)
126{
127 INT cchSearch = lstrlenA(pszSearch);
128
129 PCSTR pchEnd = pszLast ? pszLast : &pszSrc[lstrlenA(pszSrc)];
130 if (pchEnd == pszSrc)
131 return NULL;
132
133 INT_PTR cchEnd = pchEnd - pszSrc;
134 for (;;)
135 {
136 --pchEnd;
137 --cchEnd;
138 if (!pchEnd)
139 break;
140 if (!StrCmpNA(pchEnd, pszSearch, cchSearch) && pchEnd == StrEndNA(pszSrc, cchEnd))
141 break;
142 if (pchEnd == pszSrc)
143 return NULL;
144 }
145
146 return const_cast<PSTR>(pchEnd);
147}
148
149/*************************************************************************
150 * StrRStrW [SHELL32.392]
151 */
155 _In_ PCWSTR pszSrc,
156 _In_opt_ PCWSTR pszLast,
157 _In_ PCWSTR pszSearch)
158{
159 INT cchSearch = lstrlenW(pszSearch);
160
161 PCWSTR pchEnd = pszLast ? pszLast : &pszSrc[lstrlenW(pszSrc)];
162 if (pchEnd == pszSrc)
163 return NULL;
164
165 INT_PTR cchEnd = pchEnd - pszSrc;
166 for (;;)
167 {
168 --pchEnd;
169 --cchEnd;
170 if (!pchEnd)
171 break;
172 if (!StrCmpNW(pchEnd, pszSearch, cchSearch) && pchEnd == StrEndNW(pszSrc, cchEnd))
173 break;
174 if (pchEnd == pszSrc)
175 return NULL;
176 }
177
178 return const_cast<PWSTR>(pchEnd);
179}
180
181HWND
183{
184 for (HWND hWnd, hWndAfter = NULL;;)
185 {
186 hWnd = hWndAfter = FindWindowExW(NULL, hWndAfter, CSTUBWINDOW32_CLASSNAME, Path);
187 if (!hWnd || !Path)
188 return NULL;
190 return hWnd;
191 }
192}
193
196{
198 {
201 }
202 RECT rcPosition = { pPt ? pPt->x : CW_USEDEFAULT, pPt ? pPt->y : CW_USEDEFAULT, 0, 0 };
205 if (!Create(NULL, rcPosition, Path, Style, ExStyle))
206 {
207 ERR("StubWindow32 creation failed\n");
208 return E_FAIL;
209 }
211 return S_OK;
212}
213
217 _Outptr_ LPITEMIDLIST *ppidl)
218{
219 if (!pidl)
220 {
221 *ppidl = NULL;
222 return S_OK;
223 }
224 *ppidl = ILClone(pidl);
225 return (*ppidl ? S_OK : E_OUTOFMEMORY);
226}
227
229{
230 if (pszPath[0] != L'.')
231 return FALSE;
232 return !pszPath[1] || (pszPath[1] == L'.' && !pszPath[2]);
233}
234
235#define PATH_VALID_ELEMENT ( \
236 PATH_CHAR_CLASS_DOT | PATH_CHAR_CLASS_SEMICOLON | PATH_CHAR_CLASS_COMMA | \
237 PATH_CHAR_CLASS_SPACE | PATH_CHAR_CLASS_OTHER_VALID \
238)
239
241{
242 if (!*pszPath || PathIsDotOrDotDotW(pszPath))
243 return FALSE;
244
245 for (LPCWSTR pch = pszPath; *pch; ++pch)
246 {
248 return FALSE;
249 }
250
251 return TRUE;
252}
253
255{
259
260 if (lstrcmpiW(szPath, L"NUL") == 0 || lstrcmpiW(szPath, L"PRN") == 0 ||
261 lstrcmpiW(szPath, L"CON") == 0 || lstrcmpiW(szPath, L"AUX") == 0)
262 {
263 return TRUE;
264 }
265
266 if (_wcsnicmp(szPath, L"LPT", 3) == 0 || _wcsnicmp(szPath, L"COM", 3) == 0)
267 {
268 if ((L'0' <= szPath[3] && szPath[3] <= L'9') && szPath[4] == UNICODE_NULL)
269 return TRUE;
270 }
271
272 return FALSE;
273}
274
276{
277 LPITEMIDLIST pidlOld = *ppidl;
278 if (!pidlOld)
279 {
280 *ppidl = pidl;
281 return S_OK;
282 }
283
284 HRESULT hr = SHILCombine(*ppidl, pidl, ppidl);
285 ILFree(pidlOld);
286 ILFree(pidl);
287 return hr;
288}
289
290/*************************************************************************
291 * SHShouldShowWizards [SHELL32.237]
292 *
293 * Used by printer and network features.
294 * @see https://undoc.airesoft.co.uk/shell32.dll/SHShouldShowWizards.php
295 */
299{
300 HRESULT hr;
301 IShellBrowser *pBrowser;
302
303 hr = IUnknown_QueryService(pUnknown, SID_STopWindow, IID_PPV_ARG(IShellBrowser, &pBrowser));
304 if (FAILED(hr))
305 return hr;
306
309 if (state.fWebView &&
310 !SHRegGetBoolUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
311 L"ShowWizardsTEST", FALSE, FALSE))
312 {
313 hr = S_FALSE;
314 }
315
316 pBrowser->Release();
317 return hr;
318}
319
320static BOOL
324{
325 BOOL ret;
326
327 if (phToken == NULL)
328 {
330 return FALSE;
331 }
332
333 *phToken = NULL;
334
336 if (!ret && GetLastError() == ERROR_NO_TOKEN)
338
339 return ret;
340}
341
343{
345 if (!pBindCtx || FAILED(pBindCtx->GetObjectParam(const_cast<LPWSTR>(pszName), &punk)))
346 return FALSE;
347 return TRUE;
348}
349
351{
352 if (!pbc)
353 return dwDefault;
354
355 BIND_OPTS BindOpts = { sizeof(BindOpts) };
356 HRESULT hr = pbc->GetBindOptions(&BindOpts);
357 if (FAILED(hr))
358 return dwDefault;
359
360 return BindOpts.grfMode;
361}
362
364{
365 if (!pbc)
366 return FALSE;
367
368 BIND_OPTS BindOps = { sizeof(BindOps) };
369 if (SUCCEEDED(pbc->GetBindOptions(&BindOps)) && BindOps.grfFlags == OLECONTF_LINKS)
370 return TRUE;
371
372 return pclsid && SHSkipJunction(pbc, pclsid);
373}
374
376{
379
380 if (!pBindCtx || FAILED(pBindCtx->GetObjectParam((LPWSTR)STR_FILE_SYS_BIND_DATA, &punk)))
381 return S_FALSE;
382
384 return S_FALSE;
385
386 if (pFindData)
387 pBindData->GetFindData(pFindData);
388
389 return S_OK;
390}
391
393{
395
396 switch (code)
397 {
400 case ERROR_CANCELLED:
401 return TRUE;
402
403 default:
405 }
406}
407
410 _In_opt_ IShellFolder *pShellFolder,
412 _In_opt_ IBindCtx *pBindCtx,
414 _Out_ void **ppvObj)
415{
416 CComPtr<IShellFolder> psfDesktop;
417
418 *ppvObj = NULL;
419
420 if (!pShellFolder)
421 {
422 SHGetDesktopFolder(&psfDesktop);
423 if (!psfDesktop)
424 return E_FAIL;
425
426 pShellFolder = psfDesktop;
427 }
428
429 HRESULT hr;
430 if (_ILIsDesktop(pidl))
431 hr = pShellFolder->QueryInterface(riid, ppvObj);
432 else
433 hr = pShellFolder->BindToObject(pidl, pBindCtx, riid, ppvObj);
434
435 if (SUCCEEDED(hr) && !*ppvObj)
436 hr = E_FAIL;
437
438 return hr;
439}
440
445 _In_ REFIID riid, _Out_ void **ppvObj)
446{
447 if (!ppvObj)
448 return E_INVALIDARG;
449 *ppvObj = NULL;
450 IShellFolder *psf;
451 PCUITEMID_CHILD pidlChild;
452 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlChild);
453 if (SUCCEEDED(hr))
454 {
455 hr = psf->GetUIObjectOf(hWnd, 1, &pidlChild, riid, NULL, ppvObj);
456 psf->Release();
457 if (SUCCEEDED(hr))
458 {
459 if (*ppvObj)
460 return hr;
461 hr = E_FAIL;
462 }
463 }
464 return hr;
465}
466
470 _In_ LPCITEMIDLIST pidl,
472 _Out_ PWSTR *ppStr)
473{
474 HRESULT hr;
475 CComPtr<IShellFolder> psfRoot;
476 if (!psf)
477 {
478 PCUITEMID_CHILD pidlChild;
479 hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfRoot), &pidlChild);
480 if (FAILED(hr))
481 return hr;
482 psf = psfRoot;
483 pidl = pidlChild;
484 }
485 STRRET sr;
486 hr = psf->GetDisplayNameOf((PCUITEMID_CHILD)pidl, Flags, &sr);
487 return SUCCEEDED(hr) ? StrRetToStrW(&sr, pidl, ppStr) : hr;
488}
489
490/***********************************************************************
491 * DisplayNameOfW [SHELL32.757] (Vista+)
492 */
495 _In_ IShellFolder *psf,
496 _In_ LPCITEMIDLIST pidl,
498 _Out_ LPWSTR pszBuf,
500{
501 *pszBuf = UNICODE_NULL;
502 STRRET sr;
503 HRESULT hr = psf->GetDisplayNameOf(pidl, dwFlags, &sr);
504 if (FAILED(hr))
505 return hr;
506 return StrRetToBufW(&sr, pidl, pszBuf, cchBuf);
507}
508
509DWORD
511{
512 LPCITEMIDLIST pidlLast = pidl;
513 IShellFolder *release = NULL;
514
515 if (!psf)
516 {
517 SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlLast);
518 if (!psf)
519 return 0;
520 release = psf;
521 }
522
523 DWORD oldAttrs = dwAttributes;
524 if (FAILED(psf->GetAttributesOf(1, &pidlLast, &dwAttributes)))
525 dwAttributes = 0;
526 else
527 dwAttributes &= oldAttrs;
528
529 if ((dwAttributes & SFGAO_FOLDER) &&
530 (dwAttributes & SFGAO_STREAM) &&
531 !(dwAttributes & SFGAO_STORAGEANCESTOR) &&
532 (oldAttrs & SFGAO_STORAGEANCESTOR) &&
533 (SHGetObjectCompatFlags(psf, NULL) & 0x200))
534 {
535 dwAttributes &= ~(SFGAO_STREAM | SFGAO_STORAGEANCESTOR);
536 dwAttributes |= SFGAO_STORAGEANCESTOR;
537 }
538
539 if (release)
540 release->Release();
541 return dwAttributes;
542}
543
545{
546 IShellLink *pSL;
547 HRESULT hr = SHBindToObject(NULL, pidl, NULL, IID_PPV_ARG(IShellLink, &pSL));
548 if (SUCCEEDED(hr))
549 {
550 hr = pSL->GetIDList(ppidl); // Note: Returns S_FALSE if no target pidl
551 pSL->Release();
552 }
553 return hr;
554}
555
557{
559 if (FAILED(hr))
561 return hr;
562}
563
566 _In_ LPCITEMIDLIST pidl,
568 _Out_opt_ LPWSTR pszText,
570 _Inout_opt_ DWORD *pdwAttributes)
571{
572 if (pszText)
573 *pszText = UNICODE_NULL;
574
576
577 CComPtr<IShellFolder> psfFolder;
578 LPCITEMIDLIST ppidlLast;
579 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfFolder), &ppidlLast);
580 if (SUCCEEDED(hr))
581 {
582 if (pszText)
583 hr = DisplayNameOfW(psfFolder, ppidlLast, dwFlags, pszText, cchBuf);
584
585 if (SUCCEEDED(hr))
586 {
587 if (pdwAttributes)
588 *pdwAttributes = SHGetAttributes(psfFolder, ppidlLast, *pdwAttributes);
589 }
590 }
591
592 if (SUCCEEDED(hrCoInit))
594
595 return hr;
596}
597
600{
601 HWND hWnd = NULL;
602
604 if (pBindCtx && SUCCEEDED(pBindCtx->GetObjectParam((LPWSTR)L"UI During Binding", &punk)))
606
607 return hWnd;
608}
609
611{
612protected:
615
616public:
618 virtual ~CDummyOleWindow() { }
619
620 // IUnknown methods
622 {
623 static const QITAB c_tab[] =
624 {
626 { NULL }
627 };
628 return ::QISearch(this, c_tab, riid, ppvObj);
629 }
631 {
632 return ++m_cRefs;
633 }
635 {
636 if (--m_cRefs == 0)
637 {
638 delete this;
639 return 0;
640 }
641 return m_cRefs;
642 }
643
644 // IOleWindow methods
645 STDMETHODIMP GetWindow(HWND *phWnd) override
646 {
647 *phWnd = m_hWnd;
648 if (!m_hWnd)
649 return E_NOTIMPL;
650 return S_OK;
651 }
653 {
654 return E_NOTIMPL;
655 }
656};
657
660 _In_ IBindCtx *pBindCtx,
661 _In_ LPOLESTR pszKey,
663 _Out_ LPBC *ppbc)
664{
665 HRESULT hr = S_OK;
667
668 *ppbc = pBindCtx;
669
670 if (pBindCtx)
671 {
672 pBindCtx->AddRef();
673 }
674 else
675 {
676 hr = CreateBindCtx(0, ppbc);
677 if (FAILED(hr))
678 return hr;
679 }
680
681 if (!punk)
682 punk = pUnknown = new CDummyOleWindow();
683
684 hr = (*ppbc)->RegisterObjectParam(pszKey, punk);
685
686 if (pUnknown)
687 pUnknown->Release();
688
689 if (FAILED(hr))
690 {
691 (*ppbc)->Release();
692 *ppbc = NULL;
693 }
694
695 return hr;
696}
697
698/*************************************************************************
699 * SHSetFolderPathA (SHELL32.231)
700 *
701 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shsetfolderpatha
702 */
706 _In_ INT csidl,
707 _In_ HANDLE hToken,
709 _In_ LPCSTR pszPath)
710{
711 TRACE("(%d, %p, 0x%X, %s)\n", csidl, hToken, dwFlags, debugstr_a(pszPath));
712 CStringW strPathW(pszPath);
713 return SHSetFolderPathW(csidl, hToken, dwFlags, strPathW);
714}
715
716/*************************************************************************
717 * PathIsSlowA (SHELL32.240)
718 *
719 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj/nf-shlobj-pathisslowa
720 */
724 _In_ LPCSTR pszFile,
725 _In_ DWORD dwAttr)
726{
727 TRACE("(%s, 0x%X)\n", debugstr_a(pszFile), dwAttr);
728 CStringW strFileW(pszFile);
729 return PathIsSlowW(strFileW, dwAttr);
730}
731
732/*************************************************************************
733 * ExtractIconResInfoA (SHELL32.221)
734 */
738 _In_ HANDLE hHandle,
740 _In_ WORD wIndex,
741 _Out_ LPWORD lpSize,
742 _Out_ LPHANDLE lpIcon)
743{
744 TRACE("(%p, %s, %u, %p, %p)\n", hHandle, debugstr_a(lpFileName), wIndex, lpSize, lpIcon);
745
746 if (!lpFileName)
747 return 0;
748
749 CStringW strFileNameW(lpFileName);
750 return ExtractIconResInfoW(hHandle, strFileNameW, wIndex, lpSize, lpIcon);
751}
752
753/*************************************************************************
754 * ShortSizeFormatW (SHELL32.204)
755 */
759 _In_ DWORD dwNumber,
760 _Out_writes_(0x8FFF) LPWSTR pszBuffer)
761{
762 TRACE("(%lu, %p)\n", dwNumber, pszBuffer);
763 return StrFormatByteSizeW(dwNumber, pszBuffer, 0x8FFF);
764}
765
766/*************************************************************************
767 * SHOpenEffectiveToken (SHELL32.235)
768 */
770{
771 TRACE("%p\n", phToken);
773}
774
775/*************************************************************************
776 * SHGetUserSessionId (SHELL32.248)
777 */
779{
780 DWORD dwSessionId, dwLength;
781 BOOL bOpenToken = FALSE;
782
783 TRACE("%p\n", hToken);
784
785 if (!hToken)
786 bOpenToken = SHOpenEffectiveToken(&hToken);
787
788 if (!hToken ||
789 !GetTokenInformation(hToken, TokenSessionId, &dwSessionId, sizeof(dwSessionId), &dwLength))
790 {
791 dwSessionId = 0;
792 }
793
794 if (bOpenToken)
795 CloseHandle(hToken);
796
797 return dwSessionId;
798}
799
800/*************************************************************************
801 * SHInvokePrivilegedFunctionW (SHELL32.246)
802 */
806 _In_ LPCWSTR pszName,
809{
810 TRACE("(%s %p %p)\n", debugstr_w(pszName), fn, lParam);
811
812 if (!pszName || !fn)
813 return E_INVALIDARG;
814
815 HANDLE hToken = NULL;
816 TOKEN_PRIVILEGES NewPriv, PrevPriv;
817 BOOL bAdjusted = FALSE;
818
819 if (SHOpenEffectiveToken(&hToken) &&
820 ::LookupPrivilegeValueW(NULL, pszName, &NewPriv.Privileges[0].Luid))
821 {
822 NewPriv.PrivilegeCount = 1;
824
825 DWORD dwReturnSize;
826 bAdjusted = ::AdjustTokenPrivileges(hToken, FALSE, &NewPriv,
827 sizeof(PrevPriv), &PrevPriv, &dwReturnSize);
828 }
829
830 HRESULT hr = fn(lParam);
831
832 if (bAdjusted)
833 ::AdjustTokenPrivileges(hToken, FALSE, &PrevPriv, 0, NULL, NULL);
834
835 if (hToken)
836 ::CloseHandle(hToken);
837
838 return hr;
839}
840
841/*************************************************************************
842 * SHTestTokenPrivilegeW (SHELL32.236)
843 *
844 * @see http://undoc.airesoft.co.uk/shell32.dll/SHTestTokenPrivilegeW.php
845 */
849 _In_opt_ HANDLE hToken,
851{
852 LUID Luid;
854 PTOKEN_PRIVILEGES pTokenPriv;
855 HANDLE hNewToken = NULL;
856 BOOL ret = FALSE;
857
858 TRACE("(%p, %s)\n", hToken, debugstr_w(lpName));
859
860 if (!lpName)
861 return FALSE;
862
863 if (!hToken)
864 {
865 if (!SHOpenEffectiveToken(&hNewToken))
866 goto Quit;
867
868 if (!hNewToken)
869 return FALSE;
870
871 hToken = hNewToken;
872 }
873
874 if (!LookupPrivilegeValueW(NULL, lpName, &Luid))
875 return FALSE;
876
877 dwLength = 0;
879 goto Quit;
880
882 if (!pTokenPriv)
883 goto Quit;
884
885 if (GetTokenInformation(hToken, TokenPrivileges, pTokenPriv, dwLength, &dwLength))
886 {
887 UINT iPriv, cPrivs;
888 cPrivs = pTokenPriv->PrivilegeCount;
889 for (iPriv = 0; !ret && iPriv < cPrivs; ++iPriv)
890 {
891 ret = RtlEqualLuid(&Luid, &pTokenPriv->Privileges[iPriv].Luid);
892 }
893 }
894
895 LocalFree(pTokenPriv);
896
897Quit:
898 if (hToken == hNewToken)
899 CloseHandle(hNewToken);
900
901 return ret;
902}
903
905{
907}
908
909/*************************************************************************
910 * IsSuspendAllowed (SHELL32.53)
911 */
913{
914 TRACE("()\n");
916}
917
918/*************************************************************************
919 * SHGetShellStyleHInstance (SHELL32.749)
920 */
922WINAPI
924{
927 HRESULT hr;
928 CStringW strShellStyle;
929
930 TRACE("SHGetShellStyleHInstance called\n");
931
932 /* First, attempt to load the shellstyle dll from the current active theme */
934 if (FAILED(hr))
935 goto DoDefault;
936
937 /* Strip the theme filename */
939
940 strShellStyle = szPath;
941 strShellStyle += L"\\Shell\\";
942 strShellStyle += szColorName;
943 strShellStyle += L"\\ShellStyle.dll";
944
946 if (hInst)
947 return hInst;
948
949 /* Otherwise, use the version stored in the System32 directory */
950DoDefault:
951 if (!ExpandEnvironmentStringsW(L"%SystemRoot%\\System32\\ShellStyle.dll",
953 {
954 ERR("Expand failed\n");
955 return NULL;
956 }
958}
959
960/*************************************************************************
961 * SHCreatePropertyBag (SHELL32.715)
962 */
964WINAPI
966{
968}
969
970// The helper function for SHGetUnreadMailCountW
971static DWORD
973 _In_ HKEY hKey,
974 _Out_opt_ PDWORD pdwCount,
975 _Out_opt_ PFILETIME pFileTime,
976 _Out_writes_opt_(cchShellExecuteCommand) LPWSTR pszShellExecuteCommand,
977 _In_ INT cchShellExecuteCommand)
978{
979 DWORD dwType, dwCount, cbSize = sizeof(dwCount);
980 DWORD error = SHQueryValueExW(hKey, L"MessageCount", 0, &dwType, &dwCount, &cbSize);
981 if (error)
982 return error;
983 if (pdwCount && dwType == REG_DWORD)
984 *pdwCount = dwCount;
985
986 FILETIME FileTime;
987 cbSize = sizeof(FileTime);
988 error = SHQueryValueExW(hKey, L"TimeStamp", 0, &dwType, &FileTime, &cbSize);
989 if (error)
990 return error;
991 if (pFileTime && dwType == REG_BINARY)
992 *pFileTime = FileTime;
993
994 WCHAR szName[2 * MAX_PATH];
995 cbSize = sizeof(szName);
996 error = SHQueryValueExW(hKey, L"Application", 0, &dwType, szName, &cbSize);
997 if (error)
998 return error;
999
1000 if (pszShellExecuteCommand && dwType == REG_SZ &&
1001 FAILED(StringCchCopyW(pszShellExecuteCommand, cchShellExecuteCommand, szName)))
1002 {
1004 }
1005
1006 return ERROR_SUCCESS;
1007}
1008
1009/*************************************************************************
1010 * SHGetUnreadMailCountW [SHELL32.320]
1011 *
1012 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shgetunreadmailcountw
1013 */
1017 _In_opt_ HKEY hKeyUser,
1018 _In_opt_ PCWSTR pszMailAddress,
1019 _Out_opt_ PDWORD pdwCount,
1020 _Inout_opt_ PFILETIME pFileTime,
1021 _Out_writes_opt_(cchShellExecuteCommand) PWSTR pszShellExecuteCommand,
1022 _In_ INT cchShellExecuteCommand)
1023{
1024 LSTATUS error;
1025 HKEY hKey;
1026
1027 if (!hKeyUser)
1028 hKeyUser = HKEY_CURRENT_USER;
1029
1030 if (pszMailAddress)
1031 {
1032 CStringW strKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail";
1033 strKey += L'\\';
1034 strKey += pszMailAddress;
1035
1036 error = RegOpenKeyExW(hKeyUser, strKey, 0, KEY_QUERY_VALUE, &hKey);
1037 if (error)
1038 return HRESULT_FROM_WIN32(error);
1039
1040 error = SHELL_ReadSingleUnreadMailCount(hKey, pdwCount, pFileTime,
1041 pszShellExecuteCommand, cchShellExecuteCommand);
1042 }
1043 else
1044 {
1045 if (pszShellExecuteCommand || cchShellExecuteCommand)
1046 return E_INVALIDARG;
1047
1048 *pdwCount = 0;
1049
1050 error = RegOpenKeyExW(hKeyUser, L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
1052 if (error)
1053 return HRESULT_FROM_WIN32(error);
1054
1055 for (DWORD dwIndex = 0; !error; ++dwIndex)
1056 {
1057 WCHAR Name[2 * MAX_PATH];
1059 FILETIME LastWritten;
1060 error = RegEnumKeyExW(hKey, dwIndex, Name, &cchName, NULL, NULL, NULL, &LastWritten);
1061 if (error)
1062 break;
1063
1064 HKEY hSubKey;
1065 error = RegOpenKeyExW(hKey, Name, 0, KEY_QUERY_VALUE, &hSubKey);
1066 if (error)
1067 break;
1068
1069 FILETIME FileTime;
1070 DWORD dwCount;
1071 error = SHELL_ReadSingleUnreadMailCount(hSubKey, &dwCount, &FileTime, NULL, 0);
1072 if (!error && (!pFileTime || CompareFileTime(&FileTime, pFileTime) >= 0))
1073 *pdwCount += dwCount;
1074
1075 RegCloseKey(hSubKey);
1076 }
1077
1080 }
1081
1083
1084 return error ? HRESULT_FROM_WIN32(error) : S_OK;
1085}
1086
1087/*************************************************************************
1088 * SHSetUnreadMailCountW [SHELL32.336]
1089 *
1090 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shsetunreadmailcountw
1091 */
1095 _In_ PCWSTR pszMailAddress,
1096 _In_ DWORD dwCount,
1097 _In_ PCWSTR pszShellExecuteCommand)
1098{
1099 CString strKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\";
1100 strKey += pszMailAddress;
1101
1102 HKEY hKey;
1103 DWORD dwDisposition;
1105 &hKey, &dwDisposition);
1106 if (error)
1107 return HRESULT_FROM_WIN32(error);
1108
1109 error = RegSetValueExW(hKey, L"MessageCount", 0, REG_DWORD, (PBYTE)&dwCount, sizeof(dwCount));
1110 if (error)
1111 {
1113 return HRESULT_FROM_WIN32(error);
1114 }
1115
1116 FILETIME FileTime;
1117 GetSystemTimeAsFileTime(&FileTime);
1118
1119 error = RegSetValueExW(hKey, L"TimeStamp", 0, REG_BINARY, (PBYTE)&FileTime, sizeof(FileTime));
1120 if (error)
1121 {
1123 return HRESULT_FROM_WIN32(error);
1124 }
1125
1126 WCHAR szBuff[2 * MAX_PATH];
1127 if (!PathUnExpandEnvStringsW(pszShellExecuteCommand, szBuff, _countof(szBuff)))
1128 {
1129 HRESULT hr = StringCchCopyW(szBuff, _countof(szBuff), pszShellExecuteCommand);
1131 {
1133 return hr;
1134 }
1135 }
1136
1137 DWORD cbValue = (lstrlenW(szBuff) + 1) * sizeof(WCHAR);
1138 error = RegSetValueExW(hKey, L"Application", 0, REG_SZ, (PBYTE)szBuff, cbValue);
1139
1141 return (error ? HRESULT_FROM_WIN32(error) : S_OK);
1142}
1143
1144/*************************************************************************
1145 * SheRemoveQuotesA (SHELL32.@)
1146 */
1148WINAPI
1150{
1151 PCHAR pch;
1152
1153 if (*psz == '"')
1154 {
1155 for (pch = psz + 1; *pch && *pch != '"'; ++pch)
1156 {
1157 *(pch - 1) = *pch;
1158 }
1159
1160 if (*pch == '"')
1161 *(pch - 1) = ANSI_NULL;
1162 }
1163
1164 return psz;
1165}
1166
1167/*************************************************************************
1168 * SheRemoveQuotesW (SHELL32.@)
1169 *
1170 * ExtractAssociatedIconExW uses this function.
1171 */
1173WINAPI
1175{
1176 PWCHAR pch;
1177
1178 if (*psz == L'"')
1179 {
1180 for (pch = psz + 1; *pch && *pch != L'"'; ++pch)
1181 {
1182 *(pch - 1) = *pch;
1183 }
1184
1185 if (*pch == L'"')
1186 *(pch - 1) = UNICODE_NULL;
1187 }
1188
1189 return psz;
1190}
1191
1192/*************************************************************************
1193 * SHEnumerateUnreadMailAccountsW [SHELL32.287]
1194 *
1195 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shenumerateunreadmailaccountsw
1196 */
1200 _In_opt_ HKEY hKeyUser,
1201 _In_ DWORD dwIndex,
1202 _Out_writes_(cchMailAddress) PWSTR pszMailAddress,
1203 _In_ INT cchMailAddress)
1204{
1205 if (!hKeyUser)
1206 hKeyUser = HKEY_CURRENT_USER;
1207
1208 HKEY hKey;
1209 LSTATUS error = RegOpenKeyExW(hKeyUser,
1210 L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
1212 if (error)
1213 return HRESULT_FROM_WIN32(error);
1214
1215 FILETIME FileTime;
1216 error = RegEnumKeyExW(hKey, dwIndex, pszMailAddress, (PDWORD)&cchMailAddress, NULL, NULL,
1217 NULL, &FileTime);
1218 if (error)
1219 *pszMailAddress = UNICODE_NULL;
1220
1222 return error ? HRESULT_FROM_WIN32(error) : S_OK;
1223}
1224
1225/*************************************************************************
1226 * SHFindComputer [SHELL32.91]
1227 *
1228 * Invokes the shell search in My Computer. Used in SHFindFiles.
1229 * Two parameters are ignored.
1230 */
1232WINAPI
1234{
1235 UNREFERENCED_PARAMETER(pidlRoot);
1236 UNREFERENCED_PARAMETER(pidlSavedSearch);
1237
1238 TRACE("%p %p\n", pidlRoot, pidlSavedSearch);
1239
1240 IContextMenu *pCM;
1241 HRESULT hr = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER,
1242 IID_IContextMenu, (void **)&pCM);
1243 if (FAILED(hr))
1244 {
1245 ERR("0x%08X\n", hr);
1246 return hr;
1247 }
1248
1249 CMINVOKECOMMANDINFO InvokeInfo = { sizeof(InvokeInfo) };
1250 InvokeInfo.lpParameters = "{996E1EB1-B524-11D1-9120-00A0C98BA67D}";
1251 InvokeInfo.nShow = SW_SHOWNORMAL;
1252 hr = pCM->InvokeCommand(&InvokeInfo);
1253 pCM->Release();
1254
1255 return SUCCEEDED(hr);
1256}
1257
1258static HRESULT
1260 _In_ LONGLONG llValue,
1261 _Out_writes_(cchValue) LPWSTR pszValue,
1262 _In_ UINT cchValue)
1263{
1264 WCHAR szBuff[40];
1265 UINT ich = 0, ichValue;
1266#if (WINVER >= _WIN32_WINNT_VISTA)
1267 BOOL bMinus = (llValue < 0);
1268
1269 if (bMinus)
1270 llValue = -llValue;
1271#endif
1272
1273 if (cchValue <= 0)
1274 return E_FAIL;
1275
1276 do
1277 {
1278 szBuff[ich++] = (WCHAR)(L'0' + (llValue % 10));
1279 llValue /= 10;
1280 } while (llValue != 0 && ich < _countof(szBuff) - 1);
1281
1282#if (WINVER >= _WIN32_WINNT_VISTA)
1283 if (bMinus && ich < _countof(szBuff))
1284 szBuff[ich++] = '-';
1285#endif
1286
1287 for (ichValue = 0; ich > 0 && ichValue < cchValue; ++ichValue)
1288 {
1289 --ich;
1290 pszValue[ichValue] = szBuff[ich];
1291 }
1292
1293 if (ichValue >= cchValue)
1294 {
1295 pszValue[cchValue - 1] = UNICODE_NULL;
1296 return E_FAIL;
1297 }
1298
1299 pszValue[ichValue] = UNICODE_NULL;
1300 return S_OK;
1301}
1302
1303static VOID
1305 _Out_ NUMBERFMTW *pDest,
1306 _In_opt_ const NUMBERFMTW *pSrc,
1307 _In_ DWORD dwNumberFlags,
1308 _Out_writes_(cchDecimal) LPWSTR pszDecimal,
1309 _In_ INT cchDecimal,
1310 _Out_writes_(cchThousand) LPWSTR pszThousand,
1311 _In_ INT cchThousand)
1312{
1313 WCHAR szBuff[20];
1314
1315 if (pSrc)
1316 *pDest = *pSrc;
1317 else
1318 dwNumberFlags = 0;
1319
1320 if (!(dwNumberFlags & FMT_USE_NUMDIGITS))
1321 {
1323 pDest->NumDigits = StrToIntW(szBuff);
1324 }
1325
1326 if (!(dwNumberFlags & FMT_USE_LEADZERO))
1327 {
1329 pDest->LeadingZero = StrToIntW(szBuff);
1330 }
1331
1332 if (!(dwNumberFlags & FMT_USE_GROUPING))
1333 {
1335 pDest->Grouping = StrToIntW(szBuff);
1336 }
1337
1338 if (!(dwNumberFlags & FMT_USE_DECIMAL))
1339 {
1340 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, pszDecimal, cchDecimal);
1341 pDest->lpDecimalSep = pszDecimal;
1342 }
1343
1344 if (!(dwNumberFlags & FMT_USE_THOUSAND))
1345 {
1346 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, pszThousand, cchThousand);
1347 pDest->lpThousandSep = pszThousand;
1348 }
1349
1350 if (!(dwNumberFlags & FMT_USE_NEGNUMBER))
1351 {
1353 pDest->NegativeOrder = StrToIntW(szBuff);
1354 }
1355}
1356
1357/*************************************************************************
1358 * Int64ToString [SHELL32.209]
1359 *
1360 * @see http://undoc.airesoft.co.uk/shell32.dll/Int64ToString.php
1361 */
1363INT WINAPI
1365 _In_ LONGLONG llValue,
1366 _Out_writes_(cchOut) LPWSTR pszOut,
1367 _In_ UINT cchOut,
1368 _In_ BOOL bUseFormat,
1369 _In_opt_ const NUMBERFMTW *pNumberFormat,
1370 _In_ DWORD dwNumberFlags)
1371{
1372 INT ret;
1373 NUMBERFMTW NumFormat;
1374 WCHAR szValue[80], szDecimalSep[6], szThousandSep[6];
1375
1376 Int64ToStr(llValue, szValue, _countof(szValue));
1377
1378 if (bUseFormat)
1379 {
1380 Int64GetNumFormat(&NumFormat, pNumberFormat, dwNumberFlags,
1381 szDecimalSep, _countof(szDecimalSep),
1382 szThousandSep, _countof(szThousandSep));
1383 ret = GetNumberFormatW(LOCALE_USER_DEFAULT, 0, szValue, &NumFormat, pszOut, cchOut);
1384 if (ret)
1385 --ret;
1386 return ret;
1387 }
1388
1389 if (FAILED(StringCchCopyW(pszOut, cchOut, szValue)))
1390 return 0;
1391
1392 return lstrlenW(pszOut);
1393}
1394
1395/*************************************************************************
1396 * LargeIntegerToString [SHELL32.210]
1397 *
1398 * @see http://undoc.airesoft.co.uk/shell32.dll/LargeIntegerToString.php
1399 */
1401INT WINAPI
1403 _In_ const LARGE_INTEGER *pLargeInt,
1404 _Out_writes_(cchOut) LPWSTR pszOut,
1405 _In_ UINT cchOut,
1406 _In_ BOOL bUseFormat,
1407 _In_opt_ const NUMBERFMTW *pNumberFormat,
1408 _In_ DWORD dwNumberFlags)
1409{
1410 return Int64ToString(pLargeInt->QuadPart, pszOut, cchOut, bUseFormat,
1411 pNumberFormat, dwNumberFlags);
1412}
1413
1414/*************************************************************************
1415 * CopyStreamUI [SHELL32.726]
1416 *
1417 * Copy a stream to another stream with optional progress display.
1418 */
1422 _In_ IStream *pSrc,
1423 _Out_ IStream *pDst,
1424 _Inout_opt_ IProgressDialog *pProgress,
1425 _In_opt_ DWORDLONG dwlSize)
1426{
1427 HRESULT hr = E_FAIL;
1428 DWORD cbBuff, cbRead, dwSizeToWrite;
1429 DWORDLONG cbDone;
1430 LPVOID pBuff;
1431 CComHeapPtr<BYTE> pHeapPtr;
1432 STATSTG Stat;
1433 BYTE abBuff[1024];
1434
1435 TRACE("(%p, %p, %p, %I64u)\n", pSrc, pDst, pProgress, dwlSize);
1436
1437 if (dwlSize == 0) // Invalid size?
1438 {
1439 // Get the stream size
1440 ZeroMemory(&Stat, sizeof(Stat));
1441 if (FAILED(pSrc->Stat(&Stat, STATFLAG_NONAME)))
1442 pProgress = NULL; // No size info. Disable progress
1443 else
1444 dwlSize = Stat.cbSize.QuadPart;
1445 }
1446
1447 if (!pProgress) // Progress is disabled?
1448 {
1449 ULARGE_INTEGER uliSize;
1450
1451 if (dwlSize > 0)
1452 uliSize.QuadPart = dwlSize;
1453 else
1454 uliSize.HighPart = uliSize.LowPart = INVALID_FILE_SIZE;
1455
1456 return pSrc->CopyTo(pDst, uliSize, NULL, NULL); // One punch
1457 }
1458
1459 // Allocate the buffer if necessary
1460 if (dwlSize > 0 && dwlSize <= sizeof(abBuff))
1461 {
1462 cbBuff = sizeof(abBuff);
1463 pBuff = abBuff;
1464 }
1465 else
1466 {
1467#define COPY_STREAM_DEFAULT_BUFFER_SIZE 0x4000
1469 if (pHeapPtr.AllocateBytes(cbBuff))
1470 {
1471 pBuff = pHeapPtr;
1472 }
1473 else // Low memory?
1474 {
1475 cbBuff = sizeof(abBuff);
1476 pBuff = abBuff;
1477 }
1478#undef COPY_STREAM_DEFAULT_BUFFER_SIZE
1479 }
1480
1481 // Start reading
1483 zero.QuadPart = 0;
1484 pSrc->Seek(zero, 0, NULL);
1485 pDst->Seek(zero, 0, NULL);
1486 cbDone = 0;
1487 pProgress->SetProgress64(cbDone, dwlSize);
1488
1489 // Repeat reading and writing until goal
1490 for (;;)
1491 {
1492 hr = pSrc->Read(pBuff, cbBuff, &cbRead);
1493 if (FAILED(hr))
1494 break;
1495
1496 // Calculate the size to write
1497 if (dwlSize > 0)
1498 dwSizeToWrite = (DWORD)min((DWORDLONG)(dwlSize - cbDone), (DWORDLONG)cbRead);
1499 else
1500 dwSizeToWrite = cbRead;
1501
1502 if (dwSizeToWrite == 0) // No need to write?
1503 {
1504 hr = S_OK;
1505 break;
1506 }
1507
1508 hr = pDst->Write(pBuff, dwSizeToWrite, NULL);
1509 if (hr != S_OK)
1510 break;
1511
1512 cbDone += dwSizeToWrite;
1513
1514 if (pProgress->HasUserCancelled()) // Cancelled?
1515 {
1517 break;
1518 }
1519 pProgress->SetProgress64(cbDone, dwlSize);
1520
1521 if (dwlSize > 0 && cbDone >= dwlSize) // Reached the goal?
1522 {
1523 hr = S_OK;
1524 break;
1525 }
1526 }
1527
1528 return hr;
1529}
1530
1531/*************************************************************************
1532 * Activate_RunDLL [SHELL32.105]
1533 *
1534 * Unlocks the foreground window and allows the shell window to become the
1535 * foreground window. Every parameter is unused.
1536 */
1540 _In_ HWND hwnd,
1543 _In_ INT cmdshow)
1544{
1545 DWORD dwProcessID;
1546
1550 UNREFERENCED_PARAMETER(cmdshow);
1551
1552 TRACE("(%p, %p, %s, %d)\n", hwnd, hinst, debugstr_w(cmdline), cmdline);
1553
1555 return AllowSetForegroundWindow(dwProcessID);
1556}
1557
1558/*************************************************************************
1559 * SHStartNetConnectionDialogA (SHELL32.12)
1560 *
1561 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shstartnetconnectiondialoga
1562 */
1566 _In_ HWND hwnd,
1567 _In_ LPCSTR pszRemoteName,
1568 _In_ DWORD dwType)
1569{
1570 LPCWSTR pszRemoteNameW = NULL;
1571 CStringW strRemoteNameW;
1572
1573 TRACE("(%p, %s, %lu)\n", hwnd, debugstr_a(pszRemoteName), dwType);
1574
1575 if (pszRemoteName)
1576 {
1577 strRemoteNameW = pszRemoteName;
1578 pszRemoteNameW = strRemoteNameW;
1579 }
1580
1581 return SHStartNetConnectionDialogW(hwnd, pszRemoteNameW, dwType);
1582}
1583
1584/*************************************************************************
1585 * Helper functions for PathIsEqualOrSubFolder
1586 */
1587
1588static INT
1590 _In_ LPCWSTR lpszPath1,
1591 _In_ LPCWSTR lpszPath2,
1592 _Out_ CStringW& strPath)
1593{
1594 SIZE_T cchPath1 = wcslen(lpszPath1);
1595 SIZE_T cchPath2 = wcslen(lpszPath2);
1596 LPWSTR lpszPath = strPath.GetBuffer((INT)max(cchPath1, cchPath2) + 16);
1597 INT ret = PathCommonPrefixW(lpszPath1, lpszPath2, lpszPath);
1598 strPath.ReleaseBuffer();
1599 return ret;
1600}
1601
1604
1605static HRESULT
1607 _In_ LPCITEMIDLIST pidl,
1608 _Out_ CStringW& strPath)
1609{
1610 HRESULT hr;
1611
1612 for (UINT cchPath = MAX_PATH;; cchPath *= 2)
1613 {
1614 LPWSTR lpszPath = strPath.GetBuffer(cchPath);
1615 if (!lpszPath)
1616 return E_OUTOFMEMORY;
1617
1618 hr = SHGetPathCchFromIDListW(pidl, lpszPath, cchPath);
1619 strPath.ReleaseBuffer();
1620
1622 break;
1623
1624 if (cchPath >= MAXUINT / 2)
1625 {
1626 hr = E_FAIL;
1627 break;
1628 }
1629 }
1630
1631 if (FAILED(hr))
1632 strPath.Empty();
1633
1634 return hr;
1635}
1636
1637static HRESULT
1639 _In_ HWND hwndOwner,
1640 _Out_ CStringW& strPath,
1641 _In_ INT nCSIDL,
1643{
1644 LPITEMIDLIST pidl;
1645 HRESULT hr = SHGetSpecialFolderLocation(hwndOwner, nCSIDL, &pidl);
1646 if (SUCCEEDED(hr))
1647 {
1648 hr = DynamicSHGetPathFromIDListW(pidl, strPath);
1649 CoTaskMemFree(pidl);
1650 }
1651
1652 if (FAILED(hr))
1653 strPath.Empty();
1654 else if (bCreate)
1655 CreateDirectoryW(strPath, NULL);
1656
1657 return hr;
1658}
1659
1660static VOID
1662 _Out_ CStringW& strPath)
1663{
1664 INT nLength = strPath.GetLength();
1665 if (nLength > 0 && strPath[nLength - 1] == L'\\')
1666 strPath = strPath.Left(nLength - 1);
1667}
1668
1669/*************************************************************************
1670 * PathIsEqualOrSubFolder (SHELL32.755)
1671 */
1675 _In_ LPCWSTR pszPath1OrCSIDL,
1676 _In_ LPCWSTR pszPath2)
1677{
1678 CStringW strCommon, strPath1;
1679
1680 TRACE("(%s %s)\n", debugstr_w(pszPath1OrCSIDL), debugstr_w(pszPath2));
1681
1682 if (IS_INTRESOURCE(pszPath1OrCSIDL))
1683 {
1685 NULL, strPath1, LOWORD(pszPath1OrCSIDL) | CSIDL_FLAG_DONT_VERIFY, FALSE);
1686 }
1687 else
1688 {
1689 strPath1 = pszPath1OrCSIDL;
1690 }
1691
1693
1694 if (!DynamicPathCommonPrefixW(strPath1, pszPath2, strCommon))
1695 return FALSE;
1696
1697 return strPath1.CompareNoCase(strCommon) == 0;
1698}
1699
1700/*************************************************************************
1701 * SHGetRealIDL [SHELL32.98]
1702 */
1706 _In_ IShellFolder *psf,
1707 _In_ PCUITEMID_CHILD pidlSimple,
1708 _Outptr_ PITEMID_CHILD *ppidlReal)
1709{
1710 HRESULT hr;
1711 STRRET strret;
1713 SFGAOF attrs;
1714
1715 *ppidlReal = NULL;
1716
1717 hr = IShellFolder_GetDisplayNameOf(psf, pidlSimple, SHGDN_INFOLDER | SHGDN_FORPARSING,
1718 &strret, 0);
1720 return hr;
1721
1722 hr = StrRetToBufW(&strret, pidlSimple, szPath, _countof(szPath));
1724 return hr;
1725
1726 attrs = SFGAO_FILESYSTEM;
1727 hr = psf->GetAttributesOf(1, &pidlSimple, &attrs);
1728 if (SUCCEEDED(hr) && !(attrs & SFGAO_FILESYSTEM))
1729 return SHILClone(pidlSimple, ppidlReal);
1730
1731 hr = IShellFolder_ParseDisplayName(psf, NULL, NULL, szPath, NULL, ppidlReal, NULL);
1732 if (hr == E_INVALIDARG || hr == E_NOTIMPL)
1733 return SHILClone(pidlSimple, ppidlReal);
1734
1735 return hr;
1736}
1737
1741 _In_ PCWSTR pszCommandName,
1743{
1744 HRESULT hr;
1746 if (SUCCEEDED(hr = pUnk->QueryInterface(IID_PPV_ARG(IInitializeCommand, &pIC))))
1747 hr = pIC->Initialize(pszCommandName, pPB);
1748 return hr;
1749}
1750
1753 _In_ IExecuteCommand *pEC,
1754 _In_ PCWSTR pszCommandName,
1756 _In_opt_ IShellItemArray *pSIA,
1757 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1758 _In_opt_ IUnknown *pSite)
1759{
1760 if (!pEC)
1761 return E_INVALIDARG;
1762
1763 CScopedSetObjectWithSite site(pEC, pSite);
1764 IUnknown_InitializeCommand(pEC, pszCommandName, pPB);
1765
1767 if (pSIA && SUCCEEDED(pEC->QueryInterface(IID_PPV_ARG(IObjectWithSelection, &pOWS))))
1768 pOWS->SetSelection(pSIA);
1769
1770 DWORD dwKeyState = 0, fMask = pICI ? pICI->fMask : 0;
1771 pEC->SetNoShowUI((fMask & CMIC_MASK_FLAG_NO_UI) != 0);
1772 pEC->SetShowWindow(pICI ? pICI->nShow : SW_SHOW);
1773 if (fMask & CMIC_MASK_SHIFT_DOWN)
1774 dwKeyState |= MK_SHIFT;
1775 if (fMask & CMIC_MASK_CONTROL_DOWN)
1776 dwKeyState |= MK_CONTROL;
1777 pEC->SetKeyState(dwKeyState);
1778 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpDirectoryW)
1779 pEC->SetDirectory(pICI->lpDirectoryW);
1780 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpParametersW)
1781 pEC->SetParameters(pICI->lpParametersW);
1782 if (fMask & CMIC_MASK_PTINVOKE)
1783 pEC->SetPosition(pICI->ptInvoke);
1784
1785 return pEC->Execute();
1786}
1787
1790 _In_ IExecuteCommand *pEC,
1791 _In_ PCWSTR pszCommandName,
1793 _In_ IDataObject *pDO,
1794 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1795 _In_opt_ IUnknown *pSite)
1796{
1798 HRESULT hr = SHCreateShellItemArrayFromDataObject(pDO, IID_PPV_ARG(IShellItemArray, &pSIA));
1799 return SUCCEEDED(hr) ? InvokeIExecuteCommand(pEC, pszCommandName, pPB, pSIA, pICI, pSite) : hr;
1800}
1801
1802static HRESULT
1804{
1805 HRESULT hr = pCM->GetCommandString(Id, GCS & ~GCS_UNICODE, NULL, Buf, cchMax);
1806 if (FAILED(hr))
1807 {
1809 hr = pCM->GetCommandString(Id, GCS | GCS_UNICODE, NULL, (LPSTR)buf, _countof(buf));
1810 if (SUCCEEDED(hr))
1811 hr = SHUnicodeToAnsi(buf, Buf, cchMax) > 0 ? S_OK : E_FAIL;
1812 }
1813 return hr;
1814}
1815
1816UINT
1818{
1819 CHAR buf[MAX_PATH];
1820 if (IS_INTRESOURCE(verba))
1821 {
1822 if (FAILED(GetCommandStringA(pCM, LOWORD(verba), GCS_VERB, buf, _countof(buf))))
1823 return 0;
1824 verba = buf;
1825 }
1826 return MapVerbToDfmCmd(verba); // Returns DFM_CMD_* or 0
1827}
1828
1829HRESULT
1830SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
1831{
1832 LPCSTR pVerbA = pICI->lpVerb;
1833 CHAR buf[MAX_PATH];
1834 LPCMINVOKECOMMANDINFOEX pICIX = (LPCMINVOKECOMMANDINFOEX)pICI;
1835 if (IsUnicode(*pICIX) && !IS_INTRESOURCE(pICIX->lpVerbW))
1836 {
1837 if (SHUnicodeToAnsi(pICIX->lpVerbW, buf, _countof(buf)))
1838 pVerbA = buf;
1839 }
1840
1841 if (IS_INTRESOURCE(pVerbA))
1842 return LOWORD(pVerbA);
1843 for (SIZE_T i = 0; pMap[i].Verb; ++i)
1844 {
1845 assert(SUCCEEDED((int)(pMap[i].CmdId))); // The id must be >= 0 and ideally in the 0..0x7fff range
1846 if (!lstrcmpiA(pMap[i].Verb, pVerbA) && pVerbA[0])
1847 return pMap[i].CmdId;
1848 }
1849 return E_FAIL;
1850}
1851
1852static const CMVERBMAP*
1854{
1855 for (SIZE_T i = 0; pMap[i].Verb; ++i)
1856 {
1857 if (pMap[i].CmdId == CmdId)
1858 return &pMap[i];
1859 }
1860 return NULL;
1861}
1862
1863HRESULT
1865{
1866 const CMVERBMAP* pEntry;
1867 switch (uFlags | GCS_UNICODE)
1868 {
1869 case GCS_VALIDATEW:
1870 case GCS_VERBW:
1871 pEntry = FindVerbMapEntry(CmdId, pMap);
1872 if ((uFlags | GCS_UNICODE) == GCS_VERBW)
1873 {
1874 if (!pEntry)
1875 return E_INVALIDARG;
1876 else if (uFlags & GCS_UNICODE)
1877 return SHAnsiToUnicode(pEntry->Verb, (LPWSTR)Buf, cchBuf) ? S_OK : E_FAIL;
1878 else
1879 return StringCchCopyA(Buf, cchBuf, pEntry->Verb);
1880 }
1881 return pEntry ? S_OK : S_FALSE; // GCS_VALIDATE
1882 }
1883 return E_NOTIMPL;
1884}
1885
1886HRESULT
1888{
1892 return hr;
1893 initIcon->SetNormalIcon(swShell32Name, IconIndex);
1894 return initIcon->QueryInterface(riid, ppvOut);
1895}
1896
1897int DCIA_AddEntry(HDCIA hDCIA, REFCLSID rClsId)
1898{
1899 for (UINT i = 0;; ++i)
1900 {
1901 const CLSID *pClsId = DCIA_GetEntry(hDCIA, i);
1902 if (!pClsId)
1903 break;
1904 if (IsEqualGUID(*pClsId, rClsId))
1905 return i; // Don't allow duplicates
1906 }
1907 return DSA_AppendItem((HDSA)hDCIA, const_cast<CLSID*>(&rClsId));
1908}
1909
1910void DCIA_AddShellExSubkey(HDCIA hDCIA, HKEY hProgId, PCWSTR pszSubkey)
1911{
1912 WCHAR szKey[200];
1913 PathCombineW(szKey, L"shellex", pszSubkey);
1914 HKEY hEnum;
1915 if (RegOpenKeyExW(hProgId, szKey, 0, KEY_READ, &hEnum) != ERROR_SUCCESS)
1916 return;
1917 for (UINT i = 0; RegEnumKeyW(hEnum, i++, szKey, _countof(szKey)) == ERROR_SUCCESS;)
1918 {
1919 CLSID clsid;
1920 if (SUCCEEDED(SHELL_GetShellExtensionRegCLSID(hEnum, szKey, &clsid)))
1921 DCIA_AddEntry(hDCIA, clsid);
1922 }
1923 RegCloseKey(hEnum);
1924}
1925
1926/*************************************************************************
1927 * SHIsBadInterfacePtr [SHELL32.84]
1928 *
1929 * Retired in 6.0 from Windows Vista and higher.
1930 */
1934 _In_ LPCVOID pv,
1935 _In_ UINT_PTR ucb)
1936{
1937 struct CUnknownVtbl
1938 {
1942 };
1943 struct CUnknown { CUnknownVtbl *lpVtbl; };
1944 const CUnknown *punk = reinterpret_cast<const CUnknown *>(pv);
1945 return !punk || IsBadReadPtr(punk, sizeof(punk->lpVtbl)) ||
1946 IsBadReadPtr(punk->lpVtbl, ucb) ||
1947 IsBadCodePtr((FARPROC)punk->lpVtbl->Release);
1948}
1949
1950/*************************************************************************
1951 * SHGetUserDisplayName [SHELL32.241]
1952 *
1953 * @see https://undoc.airesoft.co.uk/shell32.dll/SHGetUserDisplayName.php
1954 */
1958 _Out_writes_to_(*puSize, *puSize) PWSTR pName,
1959 _Inout_ PULONG puSize)
1960{
1961 if (!pName || !puSize)
1962 return E_INVALIDARG;
1963
1964 if (GetUserNameExW(NameDisplay, pName, puSize))
1965 return S_OK;
1966
1967 LONG error = GetLastError(); // for ERROR_NONE_MAPPED
1969
1970 WCHAR UserName[MAX_PATH];
1971 DWORD cchUserName = _countof(UserName);
1972 if (!GetUserNameW(UserName, &cchUserName))
1974
1975 // Was the user name not available in the specified format (NameDisplay)?
1976 if (error == ERROR_NONE_MAPPED)
1977 {
1978 // Try to get the user name by using Network API
1979 PUSER_INFO_2 UserInfo;
1980 DWORD NetError = NetUserGetInfo(NULL, UserName, 2, (PBYTE*)&UserInfo);
1981 if (NetError)
1982 {
1983 hr = HRESULT_FROM_WIN32(NetError);
1984 }
1985 else
1986 {
1987 if (UserInfo->usri2_full_name)
1988 {
1989 hr = StringCchCopyW(pName, *puSize, UserInfo->usri2_full_name);
1990 if (SUCCEEDED(hr))
1991 {
1992 // Include the NUL-terminator
1993 *puSize = lstrlenW(UserInfo->usri2_full_name) + 1;
1994 }
1995 }
1996
1997 NetApiBufferFree(UserInfo);
1998 }
1999 }
2000
2001 if (FAILED(hr))
2002 {
2003 hr = StringCchCopyW(pName, *puSize, UserName);
2004 if (SUCCEEDED(hr))
2005 *puSize = cchUserName;
2006 }
2007
2008 return hr;
2009}
2010
2011// Skip leading backslashes
2012static PCWSTR
2014 _In_ PCWSTR pszPath)
2015{
2016 PCWSTR pch;
2017 for (pch = pszPath; *pch == L'\\'; ++pch)
2018 ;
2019 return pch;
2020}
2021
2022// The registry key for server computer descriptions cache
2023#define COMPUTER_DESCRIPTIONS_KEY \
2024 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComputerDescriptions"
2025
2026// Get server computer description from cache
2027static HRESULT
2029 _Out_writes_z_(cchDescMax) PWSTR pszDesc,
2030 _In_ DWORD cchDescMax,
2031 _In_ PCWSTR pszServerName)
2032{
2033 cchDescMax *= sizeof(WCHAR);
2035 SHELL_SkipServerSlashes(pszServerName), NULL, pszDesc, &cchDescMax);
2036 return HRESULT_FROM_WIN32(error);
2037}
2038
2039// Do cache a server computer description
2040static VOID
2042 _In_ PCWSTR pszServerName,
2043 _In_ PCWSTR pszDesc)
2044{
2045 if (!pszDesc)
2046 return;
2047
2048 SIZE_T cbDesc = (wcslen(pszDesc) + 1) * sizeof(WCHAR);
2050 SHELL_SkipServerSlashes(pszServerName), REG_SZ, pszDesc, (DWORD)cbDesc);
2051}
2052
2053// Get real server computer description
2054static HRESULT
2056 _Out_writes_z_(cchDescMax) PWSTR pszDesc,
2057 _In_ SIZE_T cchDescMax,
2058 _In_ PWSTR pszServerName)
2059{
2061 NET_API_STATUS error = NetServerGetInfo(pszServerName, 101, (PBYTE*)&bufptr);
2064 return hr;
2065
2066 PCWSTR comment = bufptr->sv101_comment;
2067 if (comment && comment[0])
2068 StringCchCopyW(pszDesc, cchDescMax, comment);
2069 else
2070 hr = E_FAIL;
2071
2073 return hr;
2074}
2075
2076// Build computer display name
2077static HRESULT
2079 _Out_writes_z_(cchNameMax) PWSTR pszName,
2080 _In_ DWORD cchNameMax,
2081 _In_ PCWSTR pszServerName,
2082 _In_ PCWSTR pszDescription)
2083{
2084 if (!pszDescription || !*pszDescription)
2085 return E_FAIL;
2086
2087 PCWSTR pszFormat = (SHRestricted(REST_ALLOWCOMMENTTOGGLE) ? L"%2 (%1)" : L"%1 (%2)");
2088 PCWSTR args[] = { pszDescription , SHELL_SkipServerSlashes(pszServerName) };
2090 pszFormat, 0, 0, pszName, cchNameMax, (va_list *)args) ? S_OK : E_FAIL);
2091}
2092
2093/*************************************************************************
2094 * SHGetComputerDisplayNameW [SHELL32.752]
2095 */
2099 _In_opt_ PWSTR pszServerName,
2101 _Out_writes_z_(cchNameMax) PWSTR pszName,
2102 _In_ DWORD cchNameMax)
2103{
2104 WCHAR szDesc[256], szCompName[MAX_COMPUTERNAME_LENGTH + 1];
2105
2106 // If no server name is specified, retrieve the local computer name
2107 if (!pszServerName)
2108 {
2109 // Use computer name as server name
2110 DWORD cchCompName = _countof(szCompName);
2111 if (!GetComputerNameW(szCompName, &cchCompName))
2112 return E_FAIL;
2113 pszServerName = szCompName;
2114
2115 // Don't use the cache for the local machine
2117 }
2118
2119 // Get computer description from cache if necessary
2120 HRESULT hr = E_FAIL;
2121 if (!(dwFlags & SHGCDN_NOCACHE))
2122 hr = SHELL_GetCachedComputerDescription(szDesc, _countof(szDesc), pszServerName);
2123
2124 // Actually retrieve the computer description if it is not in the cache
2125 if (FAILED(hr))
2126 {
2127 hr = SHELL_GetComputerDescription(szDesc, _countof(szDesc), pszServerName);
2128 if (FAILED(hr))
2129 szDesc[0] = UNICODE_NULL;
2130
2131 // Cache the description if necessary
2132 if (!(dwFlags & SHGCDN_NOCACHE))
2133 SHELL_CacheComputerDescription(pszServerName, szDesc);
2134 }
2135
2136 // If getting the computer description failed, store the server name only
2137 if (FAILED(hr) || !szDesc[0])
2138 {
2140 return hr; // Bail out if no server name is requested
2141
2142 StringCchCopyW(pszName, cchNameMax, SHELL_SkipServerSlashes(pszServerName));
2143 return S_OK;
2144 }
2145
2146 // If no server name is requested, store the description only
2148 {
2149 StringCchCopyW(pszName, cchNameMax, szDesc);
2150 return S_OK;
2151 }
2152
2153 // Build a string like "Description (SERVERNAME)"
2154 return SHELL_BuildDisplayMachineName(pszName, cchNameMax, pszServerName, szDesc);
2155}
2156
2157typedef struct tagALIAS_MAPPING
2158{
2159 BYTE bFlagMask; // The combination of ALIAS_USER_FOLDER and/or ALIAS_DESKTOP
2161 WORD nCsidlSrc; // CSIDL_... (source)
2162 WORD nCsidlDest; // CSIDL_... (destination)
2164
2167{
2168 {
2170 FALSE,
2173 },
2174 {
2176 FALSE,
2179 },
2180 {
2182 FALSE,
2185 },
2186 {
2188 TRUE,
2191 }
2192};
2193
2198 _In_opt_ HANDLE hToken,
2199 _In_ LPCITEMIDLIST pidlTarget,
2200 _Out_ LPITEMIDLIST *ppidlNew,
2202{
2203 if (!pidlTarget || !ppidlNew)
2204 return FALSE;
2205
2206 *ppidlNew = NULL;
2207
2208 for (SIZE_T iEntry = 0; iEntry < _countof(g_AliasTable); ++iEntry)
2209 {
2210 const ALIAS_MAPPING *pEntry = &g_AliasTable[iEntry];
2211
2212 if (!(dwFlags & pEntry->bFlagMask))
2213 continue;
2214
2215 // Get the source root PIDL
2216 LPITEMIDLIST pidlSrcRoot = NULL;
2217 HRESULT hr = SHGetFolderLocation(hwnd, pEntry->nCsidlSrc, hToken, 0, &pidlSrcRoot);
2218 if (FAILED(hr))
2219 continue;
2220
2221 // Check whether the input pidlTarget is under the source folder.
2222 // If it matches, ILFindChild returns the relative PIDL in the pidlTarget.
2223 LPCITEMIDLIST pidlRelative = ILFindChild(pidlSrcRoot, pidlTarget);
2224 if (!pidlRelative) // Not found?
2225 {
2226 ILFree(pidlSrcRoot);
2227 continue;
2228 }
2229
2230 // Found. Get the destination root PIDL
2231 LPITEMIDLIST pidlDestRoot = NULL;
2232 hr = SHGetFolderLocation(hwnd, pEntry->nCsidlDest, hToken, 0, &pidlDestRoot);
2233 if (SUCCEEDED(hr))
2234 {
2235 // Create a new PIDL by combining the destination root PIDL and the relative PIDL
2236 *ppidlNew = ILCombine(pidlDestRoot, pidlRelative);
2237 if (*ppidlNew)
2238 {
2239 // Manipulate specific flags in the PIDL if necessary
2240 if (pEntry->bCommonDesktop && (*ppidlNew)->mkid.cb >= 3)
2241 {
2242 (*ppidlNew)->mkid.abID[0] |= (PT_FS | PT_FS_COMMON_FLAG);
2243 }
2244 }
2245 ILFree(pidlDestRoot);
2246 }
2247
2248 ILFree(pidlSrcRoot);
2249 break; // A match was found, so exit the loop
2250 }
2251
2252 return (*ppidlNew != NULL);
2253}
2254
2255/*************************************************************************
2256 * SHSetLocalizedName (SHELL32.@)
2257 *
2258 * https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shsetlocalizedname
2259 */
2263 _In_ PCWSTR pszPath,
2264 _In_ PCWSTR pszResModule,
2265 _In_ INT idsRes)
2266{
2267 HRESULT hr;
2268 IShellFolder *pDesktop = NULL, *pParent = NULL;
2269 LPITEMIDLIST pidl = NULL;
2270 LPCITEMIDLIST pidlLast;
2272 INT cchShortMax, cchShort, cchName;
2273 PWSTR pszShortPath = NULL, pszName = NULL;
2274
2277 return hr;
2278
2279 hr = SHGetDesktopFolder(&pDesktop);
2281 goto Cleanup;
2282
2283 hr = pDesktop->ParseDisplayName(NULL, NULL, (PWSTR)pszPath, NULL, &pidl, NULL);
2285 goto Cleanup;
2286
2287 hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &pParent), &pidlLast);
2289 goto Cleanup;
2290
2292 cchShortMax = lstrlenW(pszResModule) + 1;
2293 pszShortPath = (PWSTR)HeapAlloc(hProcessHeap, 0, cchShortMax * sizeof(WCHAR));
2294 if (!pszShortPath)
2295 {
2296 hr = E_OUTOFMEMORY;
2297 goto Cleanup;
2298 }
2299
2300 cchShort = GetShortPathNameW(pszResModule, pszShortPath, cchShortMax);
2301 if (cchShort)
2302 pszResModule = pszShortPath;
2303 else
2304 cchShort = cchShortMax;
2305
2306 /* 14 == '@' + ',' + '-' + (digits of max width 10) + NUL */
2307 cchName = cchShort + 14;
2308 pszName = (PWSTR)HeapAlloc(hProcessHeap, 0, cchName * sizeof(WCHAR));
2309 if (!pszName)
2310 {
2311 hr = E_OUTOFMEMORY;
2312 goto Cleanup;
2313 }
2314
2315 wnsprintfW(pszName, cchName, L"@%s,%d", pszResModule, -idsRes);
2316 hr = pParent->SetNameOf(NULL, pidlLast, pszName, 0, NULL);
2317
2318Cleanup:
2319 if (pszName)
2320 HeapFree(hProcessHeap, 0, pszName);
2321 if (pszShortPath)
2322 HeapFree(hProcessHeap, 0, pszShortPath);
2323 if (pParent)
2324 pParent->Release();
2325 if (pidl)
2326 SHFree(pidl);
2327 if (pDesktop)
2328 pDesktop->Release();
2330 return hr;
2331}
2332
2336 _In_ LPCITEMIDLIST pidl,
2337 _Out_ LPITEMIDLIST *ppidlNew,
2339{
2340 return SHELL32_ReparentAsAliasPidl(NULL, NULL, pidl, ppidlNew, dwFlags) ? S_OK : E_FAIL;
2341}
2342
2343/*************************************************************************
2344 * LinkWindow_RegisterClass (SHELL32.258)
2345 *
2346 * https://learn.microsoft.com/en-us/windows/win32/shell/linkwindow-registerclass
2347 */
2349{
2350 INITCOMMONCONTROLSEX iccx = { sizeof(iccx), ICC_LINK_CLASS };
2351 InitCommonControlsEx(&iccx);
2352
2353 WNDCLASSEXW wcx = { sizeof(wcx) };
2354 if (!GetClassInfoExW(NULL, L"SysLink", &wcx))
2355 return FALSE;
2356
2357 /* Superclassing! */
2358 wcx.lpszClassName = L"Link Window";
2360}
2361
2362/*************************************************************************
2363 * LinkWindow_UnregisterClass (SHELL32.259)
2364 */
2366{
2367 /* Do nothing. This is correct. */
2368 return TRUE;
2369}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
UINT MapVerbToDfmCmd(_In_ LPCSTR verba)
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
HRESULT WINAPI SHCreateDefaultExtractIcon(REFIID riid, void **ppv)
DWORD Id
EXTERN_C HRESULT WINAPI SHCreateShellItemArrayFromDataObject(_In_ IDataObject *pdo, _In_ REFIID riid, _Out_ void **ppv)
Definition: CShellItem.cpp:429
PRTL_UNICODE_STRING_BUFFER Path
UINT cchMax
Type
Definition: Type.h:7
static int state
Definition: maze.c:121
const DWORD Style
Definition: appswitch.c:72
const DWORD ExStyle
Definition: appswitch.c:73
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
@ Create
Definition: registry.c:563
#define ERR(fmt,...)
Definition: precomp.h:57
#define ULongToHandle(h)
Definition: basetsd.h:75
#define EXTERN_C
Definition: basetyps.h:12
#define STDMETHODIMP
Definition: basetyps.h:43
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
#define RegCloseKey(hKey)
Definition: registry.h:49
_In_ BOOLEAN Release
Definition: cdrom.h:920
HINSTANCE hInstance
Definition: charmap.c:19
int CompareNoCase(_In_z_ PCXSTR psz) const
Definition: cstringt.h:743
HWND GetLastActivePopup() const
Definition: atlwin.h:676
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObj) override
Definition: utils.cpp:621
STDMETHODIMP GetWindow(HWND *phWnd) override
Definition: utils.cpp:645
STDMETHODIMP_(ULONG) Release() override
Definition: utils.cpp:634
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override
Definition: utils.cpp:652
STDMETHODIMP_(ULONG) AddRef() override
Definition: utils.cpp:630
virtual ~CDummyOleWindow()
Definition: utils.cpp:618
bool AllocateBytes(_In_ size_t nBytes)
Definition: atlalloc.h:127
HRESULT CreateStub(UINT Type, LPCWSTR Path, const POINT *pPt)
Definition: utils.cpp:195
static LPCWSTR GetTypePropName()
Definition: precomp.h:234
static HWND FindStubWindow(UINT Type, LPCWSTR Path)
Definition: utils.cpp:182
virtual ULONG Release(__in_opt PVOID Tag=NULL, __in LONG Line=0, __in_opt PSTR File=NULL)
Definition: fxobject.hpp:853
LPARAM lParam
Definition: combotst.c:139
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:904
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
Definition: compname.c:446
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#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:582
#define ERROR_SUCCESS
Definition: deptool.c:10
LPWSTR Name
Definition: desk.c:124
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2393
BOOL WINAPI LookupPrivilegeValueW(LPCWSTR lpSystemName, LPCWSTR lpPrivilegeName, PLUID lpLuid)
Definition: misc.c:782
BOOL WINAPI GetUserNameW(LPWSTR lpszName, LPDWORD lpSize)
Definition: misc.c:291
BOOL WINAPI AdjustTokenPrivileges(HANDLE TokenHandle, BOOL DisableAllPrivileges, PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength)
Definition: security.c:374
BOOL WINAPI GetTokenInformation(HANDLE TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, LPVOID TokenInformation, DWORD TokenInformationLength, PDWORD ReturnLength)
Definition: security.c:411
BOOL WINAPI OpenProcessToken(HANDLE ProcessHandle, DWORD DesiredAccess, PHANDLE TokenHandle)
Definition: security.c:294
BOOL WINAPI OpenThreadToken(HANDLE ThreadHandle, DWORD DesiredAccess, BOOL OpenAsSelf, HANDLE *TokenHandle)
Definition: security.c:336
UINT uFlags
Definition: api.c:59
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(void *reserved, DWORD model)
Definition: combase.c:2803
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
INT WINAPI StrToIntW(LPCWSTR lpString)
Definition: string.c:407
INT WINAPI StrCmpNW(LPCWSTR lpszStr, LPCWSTR lpszComp, INT iLen)
Definition: string.c:500
INT WINAPI StrCmpNA(LPCSTR lpszStr, LPCSTR lpszComp, INT iLen)
Definition: string.c:489
#define CloseHandle
Definition: compat.h:739
#define GetProcessHeap()
Definition: compat.h:736
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
int(* FARPROC)()
Definition: compat.h:36
#define SetLastError(x)
Definition: compat.h:752
#define HeapAlloc
Definition: compat.h:733
#define GetCurrentProcess()
Definition: compat.h:759
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define lstrlenW
Definition: compat.h:750
static DWORD DWORD * dwLength
Definition: fusion.c:86
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:492
BOOL WINAPI IsBadReadPtr(IN LPCVOID lp, IN UINT_PTR ucb)
Definition: except.c:805
BOOL NTAPI IsBadCodePtr(FARPROC lpfn)
Definition: except.c:872
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:58
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: loader.c:288
DWORD WINAPI GetShortPathNameW(IN LPCWSTR lpszLongPath, OUT LPWSTR lpszShortPath, IN DWORD cchBuffer)
Definition: path.c:1752
VOID WINAPI GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
Definition: time.c:128
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
Definition: time.c:106
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:4171
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4133
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1675
#define IS_INTRESOURCE(x)
Definition: loader.c:613
int WINAPI PathCommonPrefixW(const WCHAR *file1, const WCHAR *file2, WCHAR *path)
Definition: path.c:1596
void WINAPI PathRemoveExtensionW(WCHAR *path)
Definition: path.c:1922
BOOL WINAPI PathRemoveFileSpecW(WCHAR *path)
Definition: path.c:1121
BOOL WINAPI PathUnExpandEnvStringsW(const WCHAR *path, WCHAR *buffer, UINT buf_len)
Definition: path.c:2681
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
Definition: path.c:2197
BOOL WINAPI SHRegGetBoolUSValueW(const WCHAR *subkey, const WCHAR *value, BOOL ignore_hkcu, BOOL default_value)
Definition: registry.c:4139
LPSTR WINAPI CharNextA(const char *ptr)
Definition: string.c:1151
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
_ACRTIMP int __cdecl _wcsnicmp(const wchar_t *, const wchar_t *, size_t)
Definition: wcs.c:200
char * va_list
Definition: vadefs.h:50
NET_API_STATUS WINAPI NetApiBufferFree(LPVOID Buffer)
Definition: apibuf.c:43
NET_API_STATUS WINAPI NetServerGetInfo(LMSTR servername, DWORD level, LPBYTE *bufptr)
Definition: srvsvc.c:369
NET_API_STATUS WINAPI NetUserGetInfo(LPCWSTR servername, LPCWSTR username, DWORD level, LPBYTE *bufptr)
Definition: user.c:3147
static const WCHAR IconIndex[]
Definition: install.c:52
HRESULT WINAPI IUnknown_QueryService(IUnknown *obj, REFGUID sid, REFIID iid, void **out)
Definition: main.c:181
DWORD WINAPI SHQueryValueExW(HKEY hkey, const WCHAR *name, DWORD *reserved, DWORD *type, void *buff, DWORD *buff_len)
Definition: main.c:2101
DWORD WINAPI SHGetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD *type, void *data, DWORD *data_len)
Definition: main.c:2222
DWORD WINAPI SHAnsiToUnicode(const char *src, WCHAR *dest, int dest_len)
Definition: main.c:1801
DWORD WINAPI SHSetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD type, const void *data, DWORD data_len)
Definition: main.c:2292
DWORD WINAPI SHUnicodeToAnsi(const WCHAR *src, char *dest, int dest_len)
Definition: main.c:1756
#define CSTUBWINDOW32_CLASSNAME
Definition: precomp.h:224
EXTERN_C WORD WINAPI ExtractIconResInfoW(_In_ HANDLE hHandle, _In_ LPCWSTR lpFileName, _In_ WORD wIndex, _Out_ LPWORD lpSize, _Out_ LPHANDLE lpIcon)
Definition: stubs.cpp:639
EXTERN_C HRESULT WINAPI SHSetFolderPathW(_In_ INT csidl, _In_ HANDLE hToken, _In_ DWORD dwFlags, _In_ LPCWSTR pszPath)
Definition: stubs.cpp:714
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogW(_In_ HWND hwnd, _In_ LPCWSTR pszRemoteName, _In_ DWORD dwType)
Definition: stubs.cpp:457
EXTERN_C BOOL WINAPI PathIsSlowW(_In_ LPCWSTR pszFile, _In_ DWORD dwAttr)
Definition: stubs.cpp:751
HRESULT SHELL_DisplayNameOf(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_opt_ UINT Flags, _Out_ PWSTR *ppStr)
Definition: utils.cpp:468
static DWORD SHELL_ReadSingleUnreadMailCount(_In_ HKEY hKey, _Out_opt_ PDWORD pdwCount, _Out_opt_ PFILETIME pFileTime, _Out_writes_opt_(cchShellExecuteCommand) LPWSTR pszShellExecuteCommand, _In_ INT cchShellExecuteCommand)
Definition: utils.cpp:972
BOOL WINAPI IsSuspendAllowed(VOID)
Definition: utils.cpp:912
HRESULT SHELL_CreateShell32DefaultExtractIcon(int IconIndex, REFIID riid, LPVOID *ppvOut)
Definition: utils.cpp:1887
EXTERN_C HRESULT WINAPI SHGetPathCchFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, SIZE_T cchPathMax)
EXTERN_C HRESULT WINAPI SHGetComputerDisplayNameW(_In_opt_ PWSTR pszServerName, _In_ DWORD dwFlags, _Out_writes_z_(cchNameMax) PWSTR pszName, _In_ DWORD cchNameMax)
Definition: utils.cpp:2098
EXTERN_C HRESULT WINAPI SHEnumerateUnreadMailAccountsW(_In_opt_ HKEY hKeyUser, _In_ DWORD dwIndex, _Out_writes_(cchMailAddress) PWSTR pszMailAddress, _In_ INT cchMailAddress)
Definition: utils.cpp:1199
static const CMVERBMAP * FindVerbMapEntry(UINT_PTR CmdId, const CMVERBMAP *pMap)
Definition: utils.cpp:1853
#define PATH_VALID_ELEMENT
Definition: utils.cpp:235
EXTERN_C HRESULT WINAPI SHGetUnreadMailCountW(_In_opt_ HKEY hKeyUser, _In_opt_ PCWSTR pszMailAddress, _Out_opt_ PDWORD pdwCount, _Inout_opt_ PFILETIME pFileTime, _Out_writes_opt_(cchShellExecuteCommand) PWSTR pszShellExecuteCommand, _In_ INT cchShellExecuteCommand)
Definition: utils.cpp:1016
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:510
static HRESULT SHELL_GetComputerDescription(_Out_writes_z_(cchDescMax) PWSTR pszDesc, _In_ SIZE_T cchDescMax, _In_ PWSTR pszServerName)
Definition: utils.cpp:2055
static VOID DynamicPathRemoveBackslashW(_Out_ CStringW &strPath)
Definition: utils.cpp:1661
EXTERN_C BOOL SHELL32_ReparentAsAliasPidl(_In_opt_ HWND hwnd, _In_opt_ HANDLE hToken, _In_ LPCITEMIDLIST pidlTarget, _Out_ LPITEMIDLIST *ppidlNew, _In_ DWORD dwFlags)
Translate a PIDL to an "alias" PIDL.
Definition: utils.cpp:2196
EXTERN_C WORD WINAPI ExtractIconResInfoA(_In_ HANDLE hHandle, _In_ LPCSTR lpFileName, _In_ WORD wIndex, _Out_ LPWORD lpSize, _Out_ LPHANDLE lpIcon)
Definition: utils.cpp:737
EXTERN_C PSTR WINAPI StrRStrA(_In_ PCSTR pszSrc, _In_opt_ PCSTR pszLast, _In_ PCSTR pszSearch)
Definition: utils.cpp:122
HRESULT SHGetNameAndFlagsW(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_opt_ LPWSTR pszText, _In_ UINT cchBuf, _Inout_opt_ DWORD *pdwAttributes)
Definition: utils.cpp:565
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:215
static const ALIAS_MAPPING g_AliasTable[]
PIDL alias table.
Definition: utils.cpp:2166
static HRESULT GetCommandStringA(_In_ IContextMenu *pCM, _In_ UINT_PTR Id, _In_ UINT GCS, _Out_writes_(cchMax) LPSTR Buf, _In_ UINT cchMax)
Definition: utils.cpp:1803
EXTERN_C BOOL WINAPI PathIsEqualOrSubFolder(_In_ LPCWSTR pszPath1OrCSIDL, _In_ LPCWSTR pszPath2)
Definition: utils.cpp:1674
EXTERN_C HRESULT WINAPI SHGetRealIDL(_In_ IShellFolder *psf, _In_ PCUITEMID_CHILD pidlSimple, _Outptr_ PITEMID_CHILD *ppidlReal)
Definition: utils.cpp:1705
EXTERN_C DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken)
Definition: utils.cpp:778
#define COPY_STREAM_DEFAULT_BUFFER_SIZE
static VOID Int64GetNumFormat(_Out_ NUMBERFMTW *pDest, _In_opt_ const NUMBERFMTW *pSrc, _In_ DWORD dwNumberFlags, _Out_writes_(cchDecimal) LPWSTR pszDecimal, _In_ INT cchDecimal, _Out_writes_(cchThousand) LPWSTR pszThousand, _In_ INT cchThousand)
Definition: utils.cpp:1304
static INT _SHMergePopupMenus(HMENU hMenu, HMENU hPopupMenu, UINT uIDAdjust, UINT uIDAdjustMax)
Definition: utils.cpp:35
EXTERN_C BOOL WINAPI SHTestTokenPrivilegeW(_In_opt_ HANDLE hToken, _In_ LPCWSTR lpName)
Definition: utils.cpp:848
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:350
static HRESULT SHELL_BuildDisplayMachineName(_Out_writes_z_(cchNameMax) PWSTR pszName, _In_ DWORD cchNameMax, _In_ PCWSTR pszServerName, _In_ PCWSTR pszDescription)
Definition: utils.cpp:2078
static VOID SHELL_CacheComputerDescription(_In_ PCWSTR pszServerName, _In_ PCWSTR pszDesc)
Definition: utils.cpp:2041
EXTERN_C HRESULT WINAPI SHInvokePrivilegedFunctionW(_In_ LPCWSTR pszName, _In_ PRIVILEGED_FUNCTION fn, _In_opt_ LPARAM lParam)
Definition: utils.cpp:805
BOOL BindCtx_ContainsObject(_In_ IBindCtx *pBindCtx, _In_ LPCWSTR pszName)
Definition: utils.cpp:342
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:375
BOOL PathIsValidElement(_In_ LPCWSTR pszPath)
Definition: utils.cpp:240
EXTERN_C HRESULT InvokeIExecuteCommand(_In_ IExecuteCommand *pEC, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB, _In_opt_ IShellItemArray *pSIA, _In_opt_ LPCMINVOKECOMMANDINFOEX pICI, _In_opt_ IUnknown *pSite)
Definition: utils.cpp:1752
EXTERN_C LPWSTR WINAPI ShortSizeFormatW(_In_ DWORD dwNumber, _Out_writes_(0x8FFF) LPWSTR pszBuffer)
Definition: utils.cpp:758
static PCSTR StrEndNA(_In_ PCSTR psz, _In_ INT_PTR cch)
Definition: utils.cpp:17
EXTERN_C LPSTR WINAPI SheRemoveQuotesA(LPSTR psz)
Definition: utils.cpp:1149
BOOL Shell_FailForceReturn(_In_ HRESULT hr)
Definition: utils.cpp:392
void DCIA_AddShellExSubkey(HDCIA hDCIA, HKEY hProgId, PCWSTR pszSubkey)
Definition: utils.cpp:1910
static PCWSTR StrEndNW(_In_ PCWSTR psz, _In_ INT_PTR cch)
Definition: utils.cpp:27
static INT DynamicPathCommonPrefixW(_In_ LPCWSTR lpszPath1, _In_ LPCWSTR lpszPath2, _Out_ CStringW &strPath)
Definition: utils.cpp:1589
EXTERN_C HRESULT IUnknown_InitializeCommand(_In_ IUnknown *pUnk, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB)
Definition: utils.cpp:1739
static HRESULT DynamicSHGetPathFromIDListW(_In_ LPCITEMIDLIST pidl, _Out_ CStringW &strPath)
Definition: utils.cpp:1606
EXTERN_C INT WINAPI Int64ToString(_In_ LONGLONG llValue, _Out_writes_(cchOut) LPWSTR pszOut, _In_ UINT cchOut, _In_ BOOL bUseFormat, _In_opt_ const NUMBERFMTW *pNumberFormat, _In_ DWORD dwNumberFlags)
Definition: utils.cpp:1364
SHSTDAPI SHBindToObject(_In_opt_ IShellFolder *pShellFolder, _In_ PCUIDLIST_RELATIVE pidl, _In_opt_ IBindCtx *pBindCtx, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:409
EXTERN_C BOOL WINAPI Activate_RunDLL(_In_ HWND hwnd, _In_ HINSTANCE hinst, _In_ LPCWSTR cmdline, _In_ INT cmdshow)
Definition: utils.cpp:1539
EXTERN_C BOOL WINAPI PathIsSlowA(_In_ LPCSTR pszFile, _In_ DWORD dwAttr)
Definition: utils.cpp:723
UINT GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba)
Definition: utils.cpp:1817
HRESULT SHELL_GetCommandStringImpl(SIZE_T CmdId, UINT uFlags, LPSTR Buf, UINT cchBuf, const CMVERBMAP *pMap)
Definition: utils.cpp:1864
EXTERN_C HRESULT WINAPI DisplayNameOfW(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_ LPWSTR pszBuf, _In_ UINT cchBuf)
Definition: utils.cpp:494
EXTERN_C HRESULT WINAPI SHSetUnreadMailCountW(_In_ PCWSTR pszMailAddress, _In_ DWORD dwCount, _In_ PCWSTR pszShellExecuteCommand)
Definition: utils.cpp:1094
EXTERN_C INT WINAPI LargeIntegerToString(_In_ const LARGE_INTEGER *pLargeInt, _Out_writes_(cchOut) LPWSTR pszOut, _In_ UINT cchOut, _In_ BOOL bUseFormat, _In_opt_ const NUMBERFMTW *pNumberFormat, _In_ DWORD dwNumberFlags)
Definition: utils.cpp:1402
EXTERN_C VOID WINAPI CDefFolderMenu_MergeMenu(_In_ HINSTANCE hInstance, _In_ UINT uMainMerge, _In_ UINT uPopupMerge, _Inout_ LPQCMINFO lpQcmInfo)
Definition: utils.cpp:77
EXTERN_C HINSTANCE WINAPI SHGetShellStyleHInstance(VOID)
Definition: utils.cpp:923
EXTERN_C HRESULT SHELL_GetUIObjectOfAbsoluteItem(_In_opt_ HWND hWnd, _In_ PCIDLIST_ABSOLUTE pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:442
EXTERN_C PWSTR WINAPI StrRStrW(_In_ PCWSTR pszSrc, _In_opt_ PCWSTR pszLast, _In_ PCWSTR pszSearch)
Definition: utils.cpp:154
static HRESULT SHELL_GetCachedComputerDescription(_Out_writes_z_(cchDescMax) PWSTR pszDesc, _In_ DWORD cchDescMax, _In_ PCWSTR pszServerName)
Definition: utils.cpp:2028
EXTERN_C HRESULT BindCtx_RegisterObjectParam(_In_ IBindCtx *pBindCtx, _In_ LPOLESTR pszKey, _In_opt_ IUnknown *punk, _Out_ LPBC *ppbc)
Definition: utils.cpp:659
EXTERN_C HRESULT WINAPI CopyStreamUI(_In_ IStream *pSrc, _Out_ IStream *pDst, _Inout_opt_ IProgressDialog *pProgress, _In_opt_ DWORDLONG dwlSize)
Definition: utils.cpp:1421
EXTERN_C HRESULT WINAPI SHGetUserDisplayName(_Out_writes_to_(*puSize, *puSize) PWSTR pName, _Inout_ PULONG puSize)
Definition: utils.cpp:1957
#define COMPUTER_DESCRIPTIONS_KEY
Definition: utils.cpp:2023
static BOOL OpenEffectiveToken(_In_ DWORD DesiredAccess, _Out_ HANDLE *phToken)
Definition: utils.cpp:321
EXTERN_C BOOL WINAPI SHFindComputer(LPCITEMIDLIST pidlRoot, LPCITEMIDLIST pidlSavedSearch)
Definition: utils.cpp:1233
static HRESULT Int64ToStr(_In_ LONGLONG llValue, _Out_writes_(cchValue) LPWSTR pszValue, _In_ UINT cchValue)
Definition: utils.cpp:1259
int DCIA_AddEntry(HDCIA hDCIA, REFCLSID rClsId)
Definition: utils.cpp:1897
EXTERN_C HRESULT WINAPI SHSetLocalizedName(_In_ PCWSTR pszPath, _In_ PCWSTR pszResModule, _In_ INT idsRes)
Definition: utils.cpp:2262
HRESULT SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
Definition: utils.cpp:1830
EXTERN_C LPWSTR WINAPI SheRemoveQuotesW(LPWSTR psz)
Definition: utils.cpp:1174
EXTERN_C BOOL WINAPI SHIsBadInterfacePtr(_In_ LPCVOID pv, _In_ UINT_PTR ucb)
Definition: utils.cpp:1933
EXTERN_C HRESULT WINAPI SHCreatePropertyBag(_In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:965
struct tagALIAS_MAPPING * PALIAS_MAPPING
EXTERN_C HRESULT InvokeIExecuteCommandWithDataObject(_In_ IExecuteCommand *pEC, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB, _In_ IDataObject *pDO, _In_opt_ LPCMINVOKECOMMANDINFOEX pICI, _In_opt_ IUnknown *pSite)
Definition: utils.cpp:1789
EXTERN_C HWND BindCtx_GetUIWindow(_In_ IBindCtx *pBindCtx)
Definition: utils.cpp:599
static HMENU SHLoadPopupMenu(HINSTANCE hInstance, UINT uMenuId)
Definition: utils.cpp:61
EXTERN_C HRESULT WINAPI SHSetFolderPathA(_In_ INT csidl, _In_ HANDLE hToken, _In_ DWORD dwFlags, _In_ LPCSTR pszPath)
Definition: utils.cpp:705
BOOL IsShutdownAllowed(VOID)
Definition: utils.cpp:904
BOOL SHSkipJunctionBinding(_In_ IBindCtx *pbc, _In_ CLSID *pclsid)
Definition: utils.cpp:363
HRESULT SHELL_GetIDListTarget(_In_ LPCITEMIDLIST pidl, _Out_ PIDLIST_ABSOLUTE *ppidl)
Definition: utils.cpp:544
BOOL PathIsDotOrDotDotW(_In_ LPCWSTR pszPath)
Definition: utils.cpp:228
static PCWSTR SHELL_SkipServerSlashes(_In_ PCWSTR pszPath)
Definition: utils.cpp:2013
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogA(_In_ HWND hwnd, _In_ LPCSTR pszRemoteName, _In_ DWORD dwType)
Definition: utils.cpp:1565
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:275
struct tagALIAS_MAPPING ALIAS_MAPPING
EXTERN_C BOOL WINAPI LinkWindow_UnregisterClass(_In_ DWORD dwUnused)
Definition: utils.cpp:2365
EXTERN_C HRESULT WINAPI SHShouldShowWizards(_In_ IUnknown *pUnknown)
Definition: utils.cpp:298
EXTERN_C BOOL WINAPI SHOpenEffectiveToken(_Out_ LPHANDLE phToken)
Definition: utils.cpp:769
static HRESULT DynamicSHGetSpecialFolderPathW(_In_ HWND hwndOwner, _Out_ CStringW &strPath, _In_ INT nCSIDL, _In_ BOOL bCreate)
Definition: utils.cpp:1638
EXTERN_C HRESULT SHELL32_AliasTranslatePidl(_In_ LPCITEMIDLIST pidl, _Out_ LPITEMIDLIST *ppidlNew, _In_ DWORD dwFlags)
Translate a PIDL to an "alias" PIDL.
Definition: utils.cpp:2335
HRESULT SHCoInitializeAnyApartment(VOID)
Definition: utils.cpp:556
BOOL PathIsDosDevice(_In_ LPCWSTR pszName)
Definition: utils.cpp:254
#define DCIA_GetEntry(hDCIA, iItem)
Definition: utils.h:127
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3384
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3277
HMENU WINAPI SHGetMenuFromID(HMENU hMenu, UINT uID)
Definition: ordinal.c:1592
DWORD WINAPI SHGetObjectCompatFlags(IUnknown *pUnk, const CLSID *clsid)
Definition: ordinal.c:5727
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
Definition: ordinal.c:988
BOOL WINAPI SHSkipJunction(IBindCtx *pbc, const CLSID *pclsid)
Definition: ordinal.c:4022
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:854
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:248
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
Definition: string.c:349
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
#define IShellFolder_ParseDisplayName
Definition: utils.cpp:14
#define IShellFolder_GetDisplayNameOf
Definition: utils.cpp:13
int WINAPIV wnsprintfW(LPWSTR lpOut, int cchLimitIn, LPCWSTR lpFmt,...)
Definition: wsprintf.c:564
HRESULT WINAPI GetCurrentThemeName(LPWSTR pszThemeFileName, int dwMaxNameChars, LPWSTR pszColorBuff, int cchMaxColorChars, LPWSTR pszSizeBuff, int cchMaxSizeChars)
Definition: system.c:980
static const WCHAR szColorName[]
Definition: system.c:42
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
_In_ PUNKNOWN pUnknown
Definition: drmk.h:76
HINSTANCE hInst
Definition: dxdiag.c:13
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
HANDLE hProcessHeap
Definition: explorer.cpp:25
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
WCHAR swShell32Name[MAX_PATH]
Definition: folders.cpp:22
FxObject * pParent
Definition: fxdpcapi.cpp:86
FxAutoRegKey hKey
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: sysinfo.c:13
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
REFIID riid
Definition: atlbase.h:39
HRESULT InvokeCommand([in] LPCMINVOKECOMMANDINFO lpici)
HRESULT GetUIObjectOf([in] HWND hwndOwner, [in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in] REFIID riid, [in, out, unique] UINT *prgfInOut, [out, iid_is(riid)] void **ppvOut)
HRESULT ParseDisplayName([in] HWND hwndOwner, [in] LPBC pbcReserved, [in, string] LPOLESTR lpszDisplayName, [out] ULONG *pchEaten, [out] PIDLIST_RELATIVE *ppidl, [in, out, unique] ULONG *pdwAttributes)
ULONG AddRef()
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
nsresult QueryInterface(nsIIDRef riid, void **result)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
unsigned long long DWORDLONG
Definition: intsafe.h:93
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_a
Definition: kernel32.h:31
#define debugstr_w
Definition: kernel32.h:32
#define REG_SZ
Definition: layer.c:22
INT WINAPI GetNumberFormatW(LCID lcid, DWORD dwFlags, LPCWSTR lpszValue, const NUMBERFMTW *lpFormat, LPWSTR lpNumberStr, int cchOut)
Definition: lcformat.c:1130
#define Stat
Definition: syshdrs.h:78
#define PT_FS
Definition: lnktool.cpp:40
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define ZeroMemory
Definition: minwinbase.h:31
#define LPTR
Definition: minwinbase.h:93
LONG_PTR LPARAM
Definition: minwindef.h:175
CONST void * LPCVOID
Definition: minwindef.h:164
#define error(str)
Definition: mkdosfs.c:1605
#define pch(ap)
Definition: match.c:418
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
LPCWSTR szPath
Definition: env.c:37
static LPSTR pName
Definition: security.c:86
static HINSTANCE hinst
Definition: edit.c:551
#define comment(fmt, arg1)
Definition: rebar.c:847
static HRESULT QueryInterface(REFIID, void **)
Definition: events.c:2587
static IActiveScriptSite * site
Definition: script.c:149
static ULONG WINAPI AddRef(IStream *iface)
Definition: clist.c:83
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define min(a, b)
Definition: monoChain.cc:55
DWORD NET_API_STATUS
Definition: ms-dtyp.idl:91
const CLSID * clsid
Definition: msctf.cpp:50
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define _Out_writes_z_(s)
Definition: no_sal2.h:180
#define _Out_opt_
Definition: no_sal2.h:214
#define _Inout_
Definition: no_sal2.h:162
#define _Out_writes_opt_(s)
Definition: no_sal2.h:226
#define _Outptr_
Definition: no_sal2.h:262
#define _Inout_opt_
Definition: no_sal2.h:216
#define _Out_writes_(s)
Definition: no_sal2.h:176
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define _Out_writes_to_(s, c)
Definition: no_sal2.h:188
#define REG_BINARY
Definition: nt_native.h:1499
#define KEY_READ
Definition: nt_native.h:1026
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1022
#define DWORD
Definition: nt_native.h:44
#define KEY_SET_VALUE
Definition: nt_native.h:1020
#define LOCALE_USER_DEFAULT
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define ANSI_NULL
#define STGM_READWRITE
Definition: objbase.h:938
@ COINIT_APARTMENTTHREADED
Definition: objbase.h:279
@ COINIT_DISABLE_OLE1DDE
Definition: objbase.h:281
interface IBindCtx * LPBC
Definition: objfwd.h:18
HRESULT WINAPI CreateBindCtx(DWORD reserved, IBindCtx **bind_context)
Definition: bindctx.c:491
#define PathCombineW
Definition: pathcch.h:318
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CAPTION
Definition: pedump.c:624
BYTE * PBYTE
Definition: pedump.c:66
short WCHAR
Definition: pedump.c:58
DWORD * PDWORD
Definition: pedump.c:68
long LONG
Definition: pedump.c:60
#define WS_DISABLED
Definition: pedump.c:621
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
char CHAR
Definition: pedump.c:57
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1504
PUIDLIST_RELATIVE WINAPI ILFindChild(PIDLIST_ABSOLUTE pidl1, PCIDLIST_ABSOLUTE pidl2)
Definition: pidl.c:751
BOOLEAN WINAPI IsPwrSuspendAllowed(VOID)
Definition: powrprof.c:713
static const WCHAR szName[]
Definition: powrprof.c:45
EXTERN_C HRESULT WINAPI SHCreatePropertyBagOnMemory(_In_ DWORD dwMode, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: propbag.cpp:260
#define DSA_AppendItem(hdsa, pitem)
Definition: commctrl.h:4832
#define ICC_LINK_CLASS
Definition: commctrl.h:74
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158
#define QITABENT(Cthis, Ifoo)
Definition: shlwapi.h:152
_In_ UINT cchBuf
Definition: shlwapi.h:378
_In_opt_ LPCSTR _In_opt_ LPCSTR pszValue
Definition: shlwapi.h:783
#define REG_DWORD
Definition: sdbapi.c:615
int zero
Definition: sehframes.cpp:29
#define ALIAS_USER_FOLDER
Definition: shell32_main.h:119
#define ALIAS_DESKTOP
Definition: shell32_main.h:120
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
BOOL WINAPI LinkWindow_RegisterClass(void)
Definition: shellord.c:2718
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
Definition: shellord.c:225
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define CSIDL_COMMON_DESKTOPDIRECTORY
Definition: shlobj.h:2214
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1536
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2205
#define CSIDL_PERSONAL
Definition: shlobj.h:2195
#define CSIDL_FLAG_NO_ALIAS
Definition: shlobj.h:2250
#define CSIDL_FLAG_DONT_VERIFY
Definition: shlobj.h:2251
#define MM_SUBMENUSHAVEIDS
Definition: shlobj.h:2546
#define SSF_WEBVIEW
Definition: shlobj.h:1636
#define MM_DONTREMOVESEPS
Definition: shlobj.h:2547
#define CSIDL_DESKTOP
Definition: shlobj.h:2190
#define MM_ADDSEPARATOR
Definition: shlobj.h:2545
@ REST_ALLOWCOMMENTTOGGLE
Definition: shlobj.h:1887
#define CSIDL_COMMON_DOCUMENTS
Definition: shlobj.h:2235
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:166
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
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
BOOLEAN WINAPI GetUserNameExW(EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
Definition: sspi.c:1079
TCHAR * cmdline
Definition: stretchblt.cpp:32
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
WORD CmdId
Definition: utils.h:89
LPCSTR Verb
Definition: utils.h:88
Definition: shlwapi.h:139
Definition: dsa.c:45
$ULONG PrivilegeCount
Definition: setypes.h:1035
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]
Definition: setypes.h:1036
$ULONG LowPart
Definition: ntbasedef.h:581
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
$ULONG HighPart
Definition: ntbasedef.h:582
LPWSTR usri2_full_name
Definition: lmaccess.h:222
LPCWSTR lpszClassName
Definition: winuser.h:3334
Definition: match.c:390
Definition: inflate.c:139
BYTE bCommonDesktop
Definition: utils.cpp:2160
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define max(a, b)
Definition: svc.c:63
static unsigned int bufptr
Definition: tncon.cpp:77
uint16_t * PWSTR
Definition: typedefs.h:56
const char * LPCSTR
Definition: typedefs.h:52
int32_t INT_PTR
Definition: typedefs.h:64
uint32_t * PULONG
Definition: typedefs.h:59
char * PSTR
Definition: typedefs.h:51
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
int64_t LONGLONG
Definition: typedefs.h:68
uint16_t * LPWORD
Definition: typedefs.h:56
ULONG_PTR SIZE_T
Definition: typedefs.h:80
char * LPSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
const char * PCSTR
Definition: typedefs.h:52
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
char * PCHAR
Definition: typedefs.h:51
#define FMT_USE_THOUSAND
Definition: undocshell.h:907
#define FMT_USE_GROUPING
Definition: undocshell.h:905
#define SHGCDN_NOSERVERNAME
Definition: undocshell.h:1070
#define FMT_USE_NUMDIGITS
Definition: undocshell.h:903
#define SHSTDAPI
Definition: undocshell.h:22
#define FMT_USE_NEGNUMBER
Definition: undocshell.h:908
#define FMT_USE_LEADZERO
Definition: undocshell.h:904
HRESULT(CALLBACK * PRIVILEGED_FUNCTION)(LPARAM lParam)
Definition: undocshell.h:936
#define SHGCDN_NOCACHE
Definition: undocshell.h:1069
#define FMT_USE_DECIMAL
Definition: undocshell.h:906
DWORD dwAttributes
Definition: vdmdbg.h:34
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2664
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
HRESULT SHELL_GetShellExtensionRegCLSID(HKEY hKey, LPCWSTR KeyName, CLSID *pClsId)
Definition: propsheet.cpp:13
VOID WINAPI SwitchToThisWindow(HWND hwnd, BOOL fAltTab)
Definition: window.c:82
BOOL WINAPI AllowSetForegroundWindow(DWORD dwProcessId)
Definition: window.c:49
HWND WINAPI GetShellWindow(void)
Definition: input.c:974
_In_opt_ LPSTR _In_opt_ LPSTR _In_ DWORD _In_ DWORD _Out_opt_ PHANDLE phToken
Definition: winbase.h:2445
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LPCSTR lpFileName
Definition: winbase.h:2800
#define FORMAT_MESSAGE_FROM_STRING
Definition: winbase.h:398
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1145
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:338
_In_ LPCSTR lpName
Definition: winbase.h:2519
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define INVALID_FILE_SIZE
Definition: winbase.h:528
#define FORMAT_MESSAGE_ARGUMENT_ARRAY
Definition: winbase.h:401
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2497
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:268
WINBASEAPI _In_ DWORD nLength
Definition: wincon.h:682
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define ERROR_BAD_NETPATH
Definition: winerror.h:267
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define ERROR_CLASS_ALREADY_EXISTS
Definition: winerror.h:1236
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:3437
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:228
#define ERROR_CANCELLED
Definition: winerror.h:1055
#define HRESULT_CODE(hr)
Definition: winerror.h:188
#define ERROR_NO_TOKEN
Definition: winerror.h:911
#define ERROR_BAD_NET_NAME
Definition: winerror.h:281
#define ERROR_NONE_MAPPED
Definition: winerror.h:1159
#define LOCALE_SGROUPING
Definition: winnls.h:54
#define LOCALE_SDECIMAL
Definition: winnls.h:52
#define LOCALE_IDIGITS
Definition: winnls.h:55
#define LOCALE_STHOUSAND
Definition: winnls.h:53
#define LOCALE_INEGNUMBER
Definition: winnls.h:57
#define LOCALE_ILZERO
Definition: winnls.h:56
#define SE_SHUTDOWN_NAME
Definition: winnt_old.h:427
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define MK_SHIFT
Definition: winuser.h:2405
#define MIIM_ID
Definition: winuser.h:733
int WINAPI GetMenuItemCount(_In_opt_ HMENU)
#define WS_EX_APPWINDOW
Definition: winuser.h:383
BOOL WINAPI GetClassInfoExW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _Out_ LPWNDCLASSEXW)
HWND WINAPI FindWindowExW(_In_opt_ HWND, _In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR)
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define MIIM_SUBMENU
Definition: winuser.h:734
#define MK_CONTROL
Definition: winuser.h:2406
#define MF_BYPOSITION
Definition: winuser.h:203
BOOL WINAPI RemoveMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE)
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *)
#define WS_EX_WINDOWEDGE
Definition: winuser.h:407
#define CW_USEDEFAULT
Definition: winuser.h:225
HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR)
BOOL WINAPI DestroyMenu(_In_ HMENU)
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
#define SW_SHOW
Definition: winuser.h:786
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define RtlEqualLuid(Luid1, Luid2)
Definition: rtlfuncs.h:304
#define TOKEN_ADJUST_PRIVILEGES
Definition: setypes.h:942
#define TOKEN_QUERY
Definition: setypes.h:940
@ TokenPrivileges
Definition: setypes.h:980
@ TokenSessionId
Definition: setypes.h:989
struct _TOKEN_PRIVILEGES * PTOKEN_PRIVILEGES
#define SE_PRIVILEGE_ENABLED
Definition: setypes.h:63
#define IID_PPV_ARG(Itype, ppType)
unsigned char BYTE
Definition: xxhash.c:193