ReactOS 0.4.17-dev-116-ga4b6fe9
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,
411 _In_ LPCITEMIDLIST pidl,
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
444 _In_ LPCITEMIDLIST pidl,
446 _Out_ void **ppvObj)
447{
448 return SHBindToObjectEx(psf, pidl, NULL, riid, ppvObj);
449}
450
455 _In_ REFIID riid, _Out_ void **ppvObj)
456{
457 if (!ppvObj)
458 return E_INVALIDARG;
459 *ppvObj = NULL;
460 IShellFolder *psf;
461 PCUITEMID_CHILD pidlChild;
462 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlChild);
463 if (SUCCEEDED(hr))
464 {
465 hr = psf->GetUIObjectOf(hWnd, 1, &pidlChild, riid, NULL, ppvObj);
466 psf->Release();
467 if (SUCCEEDED(hr))
468 {
469 if (*ppvObj)
470 return hr;
471 hr = E_FAIL;
472 }
473 }
474 return hr;
475}
476
480 _In_ LPCITEMIDLIST pidl,
482 _Out_ PWSTR *ppStr)
483{
484 HRESULT hr;
485 CComPtr<IShellFolder> psfRoot;
486 if (!psf)
487 {
488 PCUITEMID_CHILD pidlChild;
489 hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfRoot), &pidlChild);
490 if (FAILED(hr))
491 return hr;
492 psf = psfRoot;
493 pidl = pidlChild;
494 }
495 STRRET sr;
496 hr = psf->GetDisplayNameOf((PCUITEMID_CHILD)pidl, Flags, &sr);
497 return SUCCEEDED(hr) ? StrRetToStrW(&sr, pidl, ppStr) : hr;
498}
499
500/***********************************************************************
501 * DisplayNameOfW [SHELL32.757] (Vista+)
502 */
505 _In_ IShellFolder *psf,
506 _In_ LPCITEMIDLIST pidl,
508 _Out_ LPWSTR pszBuf,
510{
511 *pszBuf = UNICODE_NULL;
512 STRRET sr;
513 HRESULT hr = psf->GetDisplayNameOf(pidl, dwFlags, &sr);
514 if (FAILED(hr))
515 return hr;
516 return StrRetToBufW(&sr, pidl, pszBuf, cchBuf);
517}
518
519DWORD
521{
522 LPCITEMIDLIST pidlLast = pidl;
523 IShellFolder *release = NULL;
524
525 if (!psf)
526 {
527 SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlLast);
528 if (!psf)
529 return 0;
530 release = psf;
531 }
532
533 DWORD oldAttrs = dwAttributes;
534 if (FAILED(psf->GetAttributesOf(1, &pidlLast, &dwAttributes)))
535 dwAttributes = 0;
536 else
537 dwAttributes &= oldAttrs;
538
539 if ((dwAttributes & SFGAO_FOLDER) &&
540 (dwAttributes & SFGAO_STREAM) &&
541 !(dwAttributes & SFGAO_STORAGEANCESTOR) &&
542 (oldAttrs & SFGAO_STORAGEANCESTOR) &&
543 (SHGetObjectCompatFlags(psf, NULL) & 0x200))
544 {
545 dwAttributes &= ~(SFGAO_STREAM | SFGAO_STORAGEANCESTOR);
546 dwAttributes |= SFGAO_STORAGEANCESTOR;
547 }
548
549 if (release)
550 release->Release();
551 return dwAttributes;
552}
553
555{
556 IShellLink *pSL;
557 HRESULT hr = SHBindToObject(NULL, pidl, IID_PPV_ARG(IShellLink, &pSL));
558 if (SUCCEEDED(hr))
559 {
560 hr = pSL->GetIDList(ppidl); // Note: Returns S_FALSE if no target pidl
561 pSL->Release();
562 }
563 return hr;
564}
565
567{
569 if (FAILED(hr))
571 return hr;
572}
573
576 _In_ LPCITEMIDLIST pidl,
578 _Out_opt_ LPWSTR pszText,
580 _Inout_opt_ DWORD *pdwAttributes)
581{
582 if (pszText)
583 *pszText = UNICODE_NULL;
584
586
587 CComPtr<IShellFolder> psfFolder;
588 LPCITEMIDLIST ppidlLast;
589 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfFolder), &ppidlLast);
590 if (SUCCEEDED(hr))
591 {
592 if (pszText)
593 hr = DisplayNameOfW(psfFolder, ppidlLast, dwFlags, pszText, cchBuf);
594
595 if (SUCCEEDED(hr))
596 {
597 if (pdwAttributes)
598 *pdwAttributes = SHGetAttributes(psfFolder, ppidlLast, *pdwAttributes);
599 }
600 }
601
602 if (SUCCEEDED(hrCoInit))
604
605 return hr;
606}
607
610{
611 HWND hWnd = NULL;
612
614 if (pBindCtx && SUCCEEDED(pBindCtx->GetObjectParam((LPWSTR)L"UI During Binding", &punk)))
616
617 return hWnd;
618}
619
621{
622protected:
625
626public:
628 virtual ~CDummyOleWindow() { }
629
630 // IUnknown methods
632 {
633 static const QITAB c_tab[] =
634 {
636 { NULL }
637 };
638 return ::QISearch(this, c_tab, riid, ppvObj);
639 }
641 {
642 return ++m_cRefs;
643 }
645 {
646 if (--m_cRefs == 0)
647 {
648 delete this;
649 return 0;
650 }
651 return m_cRefs;
652 }
653
654 // IOleWindow methods
655 STDMETHODIMP GetWindow(HWND *phWnd) override
656 {
657 *phWnd = m_hWnd;
658 if (!m_hWnd)
659 return E_NOTIMPL;
660 return S_OK;
661 }
663 {
664 return E_NOTIMPL;
665 }
666};
667
670 _In_ IBindCtx *pBindCtx,
671 _In_ LPOLESTR pszKey,
673 _Out_ LPBC *ppbc)
674{
675 HRESULT hr = S_OK;
677
678 *ppbc = pBindCtx;
679
680 if (pBindCtx)
681 {
682 pBindCtx->AddRef();
683 }
684 else
685 {
686 hr = CreateBindCtx(0, ppbc);
687 if (FAILED(hr))
688 return hr;
689 }
690
691 if (!punk)
692 punk = pUnknown = new CDummyOleWindow();
693
694 hr = (*ppbc)->RegisterObjectParam(pszKey, punk);
695
696 if (pUnknown)
697 pUnknown->Release();
698
699 if (FAILED(hr))
700 {
701 (*ppbc)->Release();
702 *ppbc = NULL;
703 }
704
705 return hr;
706}
707
708/*************************************************************************
709 * SHSetFolderPathA (SHELL32.231)
710 *
711 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shsetfolderpatha
712 */
716 _In_ INT csidl,
717 _In_ HANDLE hToken,
719 _In_ LPCSTR pszPath)
720{
721 TRACE("(%d, %p, 0x%X, %s)\n", csidl, hToken, dwFlags, debugstr_a(pszPath));
722 CStringW strPathW(pszPath);
723 return SHSetFolderPathW(csidl, hToken, dwFlags, strPathW);
724}
725
726/*************************************************************************
727 * PathIsSlowA (SHELL32.240)
728 *
729 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj/nf-shlobj-pathisslowa
730 */
734 _In_ LPCSTR pszFile,
735 _In_ DWORD dwAttr)
736{
737 TRACE("(%s, 0x%X)\n", debugstr_a(pszFile), dwAttr);
738 CStringW strFileW(pszFile);
739 return PathIsSlowW(strFileW, dwAttr);
740}
741
742/*************************************************************************
743 * ExtractIconResInfoA (SHELL32.221)
744 */
748 _In_ HANDLE hHandle,
750 _In_ WORD wIndex,
751 _Out_ LPWORD lpSize,
752 _Out_ LPHANDLE lpIcon)
753{
754 TRACE("(%p, %s, %u, %p, %p)\n", hHandle, debugstr_a(lpFileName), wIndex, lpSize, lpIcon);
755
756 if (!lpFileName)
757 return 0;
758
759 CStringW strFileNameW(lpFileName);
760 return ExtractIconResInfoW(hHandle, strFileNameW, wIndex, lpSize, lpIcon);
761}
762
763/*************************************************************************
764 * ShortSizeFormatW (SHELL32.204)
765 */
769 _In_ DWORD dwNumber,
770 _Out_writes_(0x8FFF) LPWSTR pszBuffer)
771{
772 TRACE("(%lu, %p)\n", dwNumber, pszBuffer);
773 return StrFormatByteSizeW(dwNumber, pszBuffer, 0x8FFF);
774}
775
776/*************************************************************************
777 * SHOpenEffectiveToken (SHELL32.235)
778 */
780{
781 TRACE("%p\n", phToken);
783}
784
785/*************************************************************************
786 * SHGetUserSessionId (SHELL32.248)
787 */
789{
790 DWORD dwSessionId, dwLength;
791 BOOL bOpenToken = FALSE;
792
793 TRACE("%p\n", hToken);
794
795 if (!hToken)
796 bOpenToken = SHOpenEffectiveToken(&hToken);
797
798 if (!hToken ||
799 !GetTokenInformation(hToken, TokenSessionId, &dwSessionId, sizeof(dwSessionId), &dwLength))
800 {
801 dwSessionId = 0;
802 }
803
804 if (bOpenToken)
805 CloseHandle(hToken);
806
807 return dwSessionId;
808}
809
810/*************************************************************************
811 * SHInvokePrivilegedFunctionW (SHELL32.246)
812 */
816 _In_ LPCWSTR pszName,
819{
820 TRACE("(%s %p %p)\n", debugstr_w(pszName), fn, lParam);
821
822 if (!pszName || !fn)
823 return E_INVALIDARG;
824
825 HANDLE hToken = NULL;
826 TOKEN_PRIVILEGES NewPriv, PrevPriv;
827 BOOL bAdjusted = FALSE;
828
829 if (SHOpenEffectiveToken(&hToken) &&
830 ::LookupPrivilegeValueW(NULL, pszName, &NewPriv.Privileges[0].Luid))
831 {
832 NewPriv.PrivilegeCount = 1;
834
835 DWORD dwReturnSize;
836 bAdjusted = ::AdjustTokenPrivileges(hToken, FALSE, &NewPriv,
837 sizeof(PrevPriv), &PrevPriv, &dwReturnSize);
838 }
839
840 HRESULT hr = fn(lParam);
841
842 if (bAdjusted)
843 ::AdjustTokenPrivileges(hToken, FALSE, &PrevPriv, 0, NULL, NULL);
844
845 if (hToken)
846 ::CloseHandle(hToken);
847
848 return hr;
849}
850
851/*************************************************************************
852 * SHTestTokenPrivilegeW (SHELL32.236)
853 *
854 * @see http://undoc.airesoft.co.uk/shell32.dll/SHTestTokenPrivilegeW.php
855 */
859 _In_opt_ HANDLE hToken,
861{
862 LUID Luid;
864 PTOKEN_PRIVILEGES pTokenPriv;
865 HANDLE hNewToken = NULL;
866 BOOL ret = FALSE;
867
868 TRACE("(%p, %s)\n", hToken, debugstr_w(lpName));
869
870 if (!lpName)
871 return FALSE;
872
873 if (!hToken)
874 {
875 if (!SHOpenEffectiveToken(&hNewToken))
876 goto Quit;
877
878 if (!hNewToken)
879 return FALSE;
880
881 hToken = hNewToken;
882 }
883
884 if (!LookupPrivilegeValueW(NULL, lpName, &Luid))
885 return FALSE;
886
887 dwLength = 0;
889 goto Quit;
890
892 if (!pTokenPriv)
893 goto Quit;
894
895 if (GetTokenInformation(hToken, TokenPrivileges, pTokenPriv, dwLength, &dwLength))
896 {
897 UINT iPriv, cPrivs;
898 cPrivs = pTokenPriv->PrivilegeCount;
899 for (iPriv = 0; !ret && iPriv < cPrivs; ++iPriv)
900 {
901 ret = RtlEqualLuid(&Luid, &pTokenPriv->Privileges[iPriv].Luid);
902 }
903 }
904
905 LocalFree(pTokenPriv);
906
907Quit:
908 if (hToken == hNewToken)
909 CloseHandle(hNewToken);
910
911 return ret;
912}
913
915{
917}
918
919/*************************************************************************
920 * IsSuspendAllowed (SHELL32.53)
921 */
923{
924 TRACE("()\n");
926}
927
928/*************************************************************************
929 * SHGetShellStyleHInstance (SHELL32.749)
930 */
932WINAPI
934{
937 HRESULT hr;
938 CStringW strShellStyle;
939
940 TRACE("SHGetShellStyleHInstance called\n");
941
942 /* First, attempt to load the shellstyle dll from the current active theme */
944 if (FAILED(hr))
945 goto DoDefault;
946
947 /* Strip the theme filename */
949
950 strShellStyle = szPath;
951 strShellStyle += L"\\Shell\\";
952 strShellStyle += szColorName;
953 strShellStyle += L"\\ShellStyle.dll";
954
956 if (hInst)
957 return hInst;
958
959 /* Otherwise, use the version stored in the System32 directory */
960DoDefault:
961 if (!ExpandEnvironmentStringsW(L"%SystemRoot%\\System32\\ShellStyle.dll",
963 {
964 ERR("Expand failed\n");
965 return NULL;
966 }
968}
969
970/*************************************************************************
971 * SHCreatePropertyBag (SHELL32.715)
972 */
974WINAPI
976{
978}
979
980// The helper function for SHGetUnreadMailCountW
981static DWORD
983 _In_ HKEY hKey,
984 _Out_opt_ PDWORD pdwCount,
985 _Out_opt_ PFILETIME pFileTime,
986 _Out_writes_opt_(cchShellExecuteCommand) LPWSTR pszShellExecuteCommand,
987 _In_ INT cchShellExecuteCommand)
988{
989 DWORD dwType, dwCount, cbSize = sizeof(dwCount);
990 DWORD error = SHQueryValueExW(hKey, L"MessageCount", 0, &dwType, &dwCount, &cbSize);
991 if (error)
992 return error;
993 if (pdwCount && dwType == REG_DWORD)
994 *pdwCount = dwCount;
995
996 FILETIME FileTime;
997 cbSize = sizeof(FileTime);
998 error = SHQueryValueExW(hKey, L"TimeStamp", 0, &dwType, &FileTime, &cbSize);
999 if (error)
1000 return error;
1001 if (pFileTime && dwType == REG_BINARY)
1002 *pFileTime = FileTime;
1003
1004 WCHAR szName[2 * MAX_PATH];
1005 cbSize = sizeof(szName);
1006 error = SHQueryValueExW(hKey, L"Application", 0, &dwType, szName, &cbSize);
1007 if (error)
1008 return error;
1009
1010 if (pszShellExecuteCommand && dwType == REG_SZ &&
1011 FAILED(StringCchCopyW(pszShellExecuteCommand, cchShellExecuteCommand, szName)))
1012 {
1014 }
1015
1016 return ERROR_SUCCESS;
1017}
1018
1019/*************************************************************************
1020 * SHGetUnreadMailCountW [SHELL32.320]
1021 *
1022 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shgetunreadmailcountw
1023 */
1027 _In_opt_ HKEY hKeyUser,
1028 _In_opt_ PCWSTR pszMailAddress,
1029 _Out_opt_ PDWORD pdwCount,
1030 _Inout_opt_ PFILETIME pFileTime,
1031 _Out_writes_opt_(cchShellExecuteCommand) PWSTR pszShellExecuteCommand,
1032 _In_ INT cchShellExecuteCommand)
1033{
1034 LSTATUS error;
1035 HKEY hKey;
1036
1037 if (!hKeyUser)
1038 hKeyUser = HKEY_CURRENT_USER;
1039
1040 if (pszMailAddress)
1041 {
1042 CStringW strKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail";
1043 strKey += L'\\';
1044 strKey += pszMailAddress;
1045
1046 error = RegOpenKeyExW(hKeyUser, strKey, 0, KEY_QUERY_VALUE, &hKey);
1047 if (error)
1048 return HRESULT_FROM_WIN32(error);
1049
1050 error = SHELL_ReadSingleUnreadMailCount(hKey, pdwCount, pFileTime,
1051 pszShellExecuteCommand, cchShellExecuteCommand);
1052 }
1053 else
1054 {
1055 if (pszShellExecuteCommand || cchShellExecuteCommand)
1056 return E_INVALIDARG;
1057
1058 *pdwCount = 0;
1059
1060 error = RegOpenKeyExW(hKeyUser, L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
1062 if (error)
1063 return HRESULT_FROM_WIN32(error);
1064
1065 for (DWORD dwIndex = 0; !error; ++dwIndex)
1066 {
1067 WCHAR Name[2 * MAX_PATH];
1069 FILETIME LastWritten;
1070 error = RegEnumKeyExW(hKey, dwIndex, Name, &cchName, NULL, NULL, NULL, &LastWritten);
1071 if (error)
1072 break;
1073
1074 HKEY hSubKey;
1075 error = RegOpenKeyExW(hKey, Name, 0, KEY_QUERY_VALUE, &hSubKey);
1076 if (error)
1077 break;
1078
1079 FILETIME FileTime;
1080 DWORD dwCount;
1081 error = SHELL_ReadSingleUnreadMailCount(hSubKey, &dwCount, &FileTime, NULL, 0);
1082 if (!error && (!pFileTime || CompareFileTime(&FileTime, pFileTime) >= 0))
1083 *pdwCount += dwCount;
1084
1085 RegCloseKey(hSubKey);
1086 }
1087
1090 }
1091
1093
1094 return error ? HRESULT_FROM_WIN32(error) : S_OK;
1095}
1096
1097/*************************************************************************
1098 * SHSetUnreadMailCountW [SHELL32.336]
1099 *
1100 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shsetunreadmailcountw
1101 */
1105 _In_ PCWSTR pszMailAddress,
1106 _In_ DWORD dwCount,
1107 _In_ PCWSTR pszShellExecuteCommand)
1108{
1109 CString strKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\";
1110 strKey += pszMailAddress;
1111
1112 HKEY hKey;
1113 DWORD dwDisposition;
1115 &hKey, &dwDisposition);
1116 if (error)
1117 return HRESULT_FROM_WIN32(error);
1118
1119 error = RegSetValueExW(hKey, L"MessageCount", 0, REG_DWORD, (PBYTE)&dwCount, sizeof(dwCount));
1120 if (error)
1121 {
1123 return HRESULT_FROM_WIN32(error);
1124 }
1125
1126 FILETIME FileTime;
1127 GetSystemTimeAsFileTime(&FileTime);
1128
1129 error = RegSetValueExW(hKey, L"TimeStamp", 0, REG_BINARY, (PBYTE)&FileTime, sizeof(FileTime));
1130 if (error)
1131 {
1133 return HRESULT_FROM_WIN32(error);
1134 }
1135
1136 WCHAR szBuff[2 * MAX_PATH];
1137 if (!PathUnExpandEnvStringsW(pszShellExecuteCommand, szBuff, _countof(szBuff)))
1138 {
1139 HRESULT hr = StringCchCopyW(szBuff, _countof(szBuff), pszShellExecuteCommand);
1141 {
1143 return hr;
1144 }
1145 }
1146
1147 DWORD cbValue = (lstrlenW(szBuff) + 1) * sizeof(WCHAR);
1148 error = RegSetValueExW(hKey, L"Application", 0, REG_SZ, (PBYTE)szBuff, cbValue);
1149
1151 return (error ? HRESULT_FROM_WIN32(error) : S_OK);
1152}
1153
1154/*************************************************************************
1155 * SheRemoveQuotesA (SHELL32.@)
1156 */
1158WINAPI
1160{
1161 PCHAR pch;
1162
1163 if (*psz == '"')
1164 {
1165 for (pch = psz + 1; *pch && *pch != '"'; ++pch)
1166 {
1167 *(pch - 1) = *pch;
1168 }
1169
1170 if (*pch == '"')
1171 *(pch - 1) = ANSI_NULL;
1172 }
1173
1174 return psz;
1175}
1176
1177/*************************************************************************
1178 * SheRemoveQuotesW (SHELL32.@)
1179 *
1180 * ExtractAssociatedIconExW uses this function.
1181 */
1183WINAPI
1185{
1186 PWCHAR pch;
1187
1188 if (*psz == L'"')
1189 {
1190 for (pch = psz + 1; *pch && *pch != L'"'; ++pch)
1191 {
1192 *(pch - 1) = *pch;
1193 }
1194
1195 if (*pch == L'"')
1196 *(pch - 1) = UNICODE_NULL;
1197 }
1198
1199 return psz;
1200}
1201
1202/*************************************************************************
1203 * SHEnumerateUnreadMailAccountsW [SHELL32.287]
1204 *
1205 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shenumerateunreadmailaccountsw
1206 */
1210 _In_opt_ HKEY hKeyUser,
1211 _In_ DWORD dwIndex,
1212 _Out_writes_(cchMailAddress) PWSTR pszMailAddress,
1213 _In_ INT cchMailAddress)
1214{
1215 if (!hKeyUser)
1216 hKeyUser = HKEY_CURRENT_USER;
1217
1218 HKEY hKey;
1219 LSTATUS error = RegOpenKeyExW(hKeyUser,
1220 L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
1222 if (error)
1223 return HRESULT_FROM_WIN32(error);
1224
1225 FILETIME FileTime;
1226 error = RegEnumKeyExW(hKey, dwIndex, pszMailAddress, (PDWORD)&cchMailAddress, NULL, NULL,
1227 NULL, &FileTime);
1228 if (error)
1229 *pszMailAddress = UNICODE_NULL;
1230
1232 return error ? HRESULT_FROM_WIN32(error) : S_OK;
1233}
1234
1235/*************************************************************************
1236 * SHFindComputer [SHELL32.91]
1237 *
1238 * Invokes the shell search in My Computer. Used in SHFindFiles.
1239 * Two parameters are ignored.
1240 */
1242WINAPI
1244{
1245 UNREFERENCED_PARAMETER(pidlRoot);
1246 UNREFERENCED_PARAMETER(pidlSavedSearch);
1247
1248 TRACE("%p %p\n", pidlRoot, pidlSavedSearch);
1249
1250 IContextMenu *pCM;
1251 HRESULT hr = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER,
1252 IID_IContextMenu, (void **)&pCM);
1253 if (FAILED(hr))
1254 {
1255 ERR("0x%08X\n", hr);
1256 return hr;
1257 }
1258
1259 CMINVOKECOMMANDINFO InvokeInfo = { sizeof(InvokeInfo) };
1260 InvokeInfo.lpParameters = "{996E1EB1-B524-11D1-9120-00A0C98BA67D}";
1261 InvokeInfo.nShow = SW_SHOWNORMAL;
1262 hr = pCM->InvokeCommand(&InvokeInfo);
1263 pCM->Release();
1264
1265 return SUCCEEDED(hr);
1266}
1267
1268static HRESULT
1270 _In_ LONGLONG llValue,
1271 _Out_writes_(cchValue) LPWSTR pszValue,
1272 _In_ UINT cchValue)
1273{
1274 WCHAR szBuff[40];
1275 UINT ich = 0, ichValue;
1276#if (WINVER >= _WIN32_WINNT_VISTA)
1277 BOOL bMinus = (llValue < 0);
1278
1279 if (bMinus)
1280 llValue = -llValue;
1281#endif
1282
1283 if (cchValue <= 0)
1284 return E_FAIL;
1285
1286 do
1287 {
1288 szBuff[ich++] = (WCHAR)(L'0' + (llValue % 10));
1289 llValue /= 10;
1290 } while (llValue != 0 && ich < _countof(szBuff) - 1);
1291
1292#if (WINVER >= _WIN32_WINNT_VISTA)
1293 if (bMinus && ich < _countof(szBuff))
1294 szBuff[ich++] = '-';
1295#endif
1296
1297 for (ichValue = 0; ich > 0 && ichValue < cchValue; ++ichValue)
1298 {
1299 --ich;
1300 pszValue[ichValue] = szBuff[ich];
1301 }
1302
1303 if (ichValue >= cchValue)
1304 {
1305 pszValue[cchValue - 1] = UNICODE_NULL;
1306 return E_FAIL;
1307 }
1308
1309 pszValue[ichValue] = UNICODE_NULL;
1310 return S_OK;
1311}
1312
1313static VOID
1315 _Out_ NUMBERFMTW *pDest,
1316 _In_opt_ const NUMBERFMTW *pSrc,
1317 _In_ DWORD dwNumberFlags,
1318 _Out_writes_(cchDecimal) LPWSTR pszDecimal,
1319 _In_ INT cchDecimal,
1320 _Out_writes_(cchThousand) LPWSTR pszThousand,
1321 _In_ INT cchThousand)
1322{
1323 WCHAR szBuff[20];
1324
1325 if (pSrc)
1326 *pDest = *pSrc;
1327 else
1328 dwNumberFlags = 0;
1329
1330 if (!(dwNumberFlags & FMT_USE_NUMDIGITS))
1331 {
1333 pDest->NumDigits = StrToIntW(szBuff);
1334 }
1335
1336 if (!(dwNumberFlags & FMT_USE_LEADZERO))
1337 {
1339 pDest->LeadingZero = StrToIntW(szBuff);
1340 }
1341
1342 if (!(dwNumberFlags & FMT_USE_GROUPING))
1343 {
1345 pDest->Grouping = StrToIntW(szBuff);
1346 }
1347
1348 if (!(dwNumberFlags & FMT_USE_DECIMAL))
1349 {
1350 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, pszDecimal, cchDecimal);
1351 pDest->lpDecimalSep = pszDecimal;
1352 }
1353
1354 if (!(dwNumberFlags & FMT_USE_THOUSAND))
1355 {
1356 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, pszThousand, cchThousand);
1357 pDest->lpThousandSep = pszThousand;
1358 }
1359
1360 if (!(dwNumberFlags & FMT_USE_NEGNUMBER))
1361 {
1363 pDest->NegativeOrder = StrToIntW(szBuff);
1364 }
1365}
1366
1367/*************************************************************************
1368 * Int64ToString [SHELL32.209]
1369 *
1370 * @see http://undoc.airesoft.co.uk/shell32.dll/Int64ToString.php
1371 */
1373INT WINAPI
1375 _In_ LONGLONG llValue,
1376 _Out_writes_(cchOut) LPWSTR pszOut,
1377 _In_ UINT cchOut,
1378 _In_ BOOL bUseFormat,
1379 _In_opt_ const NUMBERFMTW *pNumberFormat,
1380 _In_ DWORD dwNumberFlags)
1381{
1382 INT ret;
1383 NUMBERFMTW NumFormat;
1384 WCHAR szValue[80], szDecimalSep[6], szThousandSep[6];
1385
1386 Int64ToStr(llValue, szValue, _countof(szValue));
1387
1388 if (bUseFormat)
1389 {
1390 Int64GetNumFormat(&NumFormat, pNumberFormat, dwNumberFlags,
1391 szDecimalSep, _countof(szDecimalSep),
1392 szThousandSep, _countof(szThousandSep));
1393 ret = GetNumberFormatW(LOCALE_USER_DEFAULT, 0, szValue, &NumFormat, pszOut, cchOut);
1394 if (ret)
1395 --ret;
1396 return ret;
1397 }
1398
1399 if (FAILED(StringCchCopyW(pszOut, cchOut, szValue)))
1400 return 0;
1401
1402 return lstrlenW(pszOut);
1403}
1404
1405/*************************************************************************
1406 * LargeIntegerToString [SHELL32.210]
1407 *
1408 * @see http://undoc.airesoft.co.uk/shell32.dll/LargeIntegerToString.php
1409 */
1411INT WINAPI
1413 _In_ const LARGE_INTEGER *pLargeInt,
1414 _Out_writes_(cchOut) LPWSTR pszOut,
1415 _In_ UINT cchOut,
1416 _In_ BOOL bUseFormat,
1417 _In_opt_ const NUMBERFMTW *pNumberFormat,
1418 _In_ DWORD dwNumberFlags)
1419{
1420 return Int64ToString(pLargeInt->QuadPart, pszOut, cchOut, bUseFormat,
1421 pNumberFormat, dwNumberFlags);
1422}
1423
1424/*************************************************************************
1425 * CopyStreamUI [SHELL32.726]
1426 *
1427 * Copy a stream to another stream with optional progress display.
1428 */
1432 _In_ IStream *pSrc,
1433 _Out_ IStream *pDst,
1434 _Inout_opt_ IProgressDialog *pProgress,
1435 _In_opt_ DWORDLONG dwlSize)
1436{
1437 HRESULT hr = E_FAIL;
1438 DWORD cbBuff, cbRead, dwSizeToWrite;
1439 DWORDLONG cbDone;
1440 LPVOID pBuff;
1441 CComHeapPtr<BYTE> pHeapPtr;
1442 STATSTG Stat;
1443 BYTE abBuff[1024];
1444
1445 TRACE("(%p, %p, %p, %I64u)\n", pSrc, pDst, pProgress, dwlSize);
1446
1447 if (dwlSize == 0) // Invalid size?
1448 {
1449 // Get the stream size
1450 ZeroMemory(&Stat, sizeof(Stat));
1451 if (FAILED(pSrc->Stat(&Stat, STATFLAG_NONAME)))
1452 pProgress = NULL; // No size info. Disable progress
1453 else
1454 dwlSize = Stat.cbSize.QuadPart;
1455 }
1456
1457 if (!pProgress) // Progress is disabled?
1458 {
1459 ULARGE_INTEGER uliSize;
1460
1461 if (dwlSize > 0)
1462 uliSize.QuadPart = dwlSize;
1463 else
1464 uliSize.HighPart = uliSize.LowPart = INVALID_FILE_SIZE;
1465
1466 return pSrc->CopyTo(pDst, uliSize, NULL, NULL); // One punch
1467 }
1468
1469 // Allocate the buffer if necessary
1470 if (dwlSize > 0 && dwlSize <= sizeof(abBuff))
1471 {
1472 cbBuff = sizeof(abBuff);
1473 pBuff = abBuff;
1474 }
1475 else
1476 {
1477#define COPY_STREAM_DEFAULT_BUFFER_SIZE 0x4000
1479 if (pHeapPtr.AllocateBytes(cbBuff))
1480 {
1481 pBuff = pHeapPtr;
1482 }
1483 else // Low memory?
1484 {
1485 cbBuff = sizeof(abBuff);
1486 pBuff = abBuff;
1487 }
1488#undef COPY_STREAM_DEFAULT_BUFFER_SIZE
1489 }
1490
1491 // Start reading
1493 zero.QuadPart = 0;
1494 pSrc->Seek(zero, 0, NULL);
1495 pDst->Seek(zero, 0, NULL);
1496 cbDone = 0;
1497 pProgress->SetProgress64(cbDone, dwlSize);
1498
1499 // Repeat reading and writing until goal
1500 for (;;)
1501 {
1502 hr = pSrc->Read(pBuff, cbBuff, &cbRead);
1503 if (FAILED(hr))
1504 break;
1505
1506 // Calculate the size to write
1507 if (dwlSize > 0)
1508 dwSizeToWrite = (DWORD)min((DWORDLONG)(dwlSize - cbDone), (DWORDLONG)cbRead);
1509 else
1510 dwSizeToWrite = cbRead;
1511
1512 if (dwSizeToWrite == 0) // No need to write?
1513 {
1514 hr = S_OK;
1515 break;
1516 }
1517
1518 hr = pDst->Write(pBuff, dwSizeToWrite, NULL);
1519 if (hr != S_OK)
1520 break;
1521
1522 cbDone += dwSizeToWrite;
1523
1524 if (pProgress->HasUserCancelled()) // Cancelled?
1525 {
1527 break;
1528 }
1529 pProgress->SetProgress64(cbDone, dwlSize);
1530
1531 if (dwlSize > 0 && cbDone >= dwlSize) // Reached the goal?
1532 {
1533 hr = S_OK;
1534 break;
1535 }
1536 }
1537
1538 return hr;
1539}
1540
1541/*************************************************************************
1542 * Activate_RunDLL [SHELL32.105]
1543 *
1544 * Unlocks the foreground window and allows the shell window to become the
1545 * foreground window. Every parameter is unused.
1546 */
1550 _In_ HWND hwnd,
1553 _In_ INT cmdshow)
1554{
1555 DWORD dwProcessID;
1556
1560 UNREFERENCED_PARAMETER(cmdshow);
1561
1562 TRACE("(%p, %p, %s, %d)\n", hwnd, hinst, debugstr_w(cmdline), cmdline);
1563
1565 return AllowSetForegroundWindow(dwProcessID);
1566}
1567
1568/*************************************************************************
1569 * SHStartNetConnectionDialogA (SHELL32.12)
1570 *
1571 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shstartnetconnectiondialoga
1572 */
1576 _In_ HWND hwnd,
1577 _In_ LPCSTR pszRemoteName,
1578 _In_ DWORD dwType)
1579{
1580 LPCWSTR pszRemoteNameW = NULL;
1581 CStringW strRemoteNameW;
1582
1583 TRACE("(%p, %s, %lu)\n", hwnd, debugstr_a(pszRemoteName), dwType);
1584
1585 if (pszRemoteName)
1586 {
1587 strRemoteNameW = pszRemoteName;
1588 pszRemoteNameW = strRemoteNameW;
1589 }
1590
1591 return SHStartNetConnectionDialogW(hwnd, pszRemoteNameW, dwType);
1592}
1593
1594/*************************************************************************
1595 * Helper functions for PathIsEqualOrSubFolder
1596 */
1597
1598static INT
1600 _In_ LPCWSTR lpszPath1,
1601 _In_ LPCWSTR lpszPath2,
1602 _Out_ CStringW& strPath)
1603{
1604 SIZE_T cchPath1 = wcslen(lpszPath1);
1605 SIZE_T cchPath2 = wcslen(lpszPath2);
1606 LPWSTR lpszPath = strPath.GetBuffer((INT)max(cchPath1, cchPath2) + 16);
1607 INT ret = PathCommonPrefixW(lpszPath1, lpszPath2, lpszPath);
1608 strPath.ReleaseBuffer();
1609 return ret;
1610}
1611
1614
1615static HRESULT
1617 _In_ LPCITEMIDLIST pidl,
1618 _Out_ CStringW& strPath)
1619{
1620 HRESULT hr;
1621
1622 for (UINT cchPath = MAX_PATH;; cchPath *= 2)
1623 {
1624 LPWSTR lpszPath = strPath.GetBuffer(cchPath);
1625 if (!lpszPath)
1626 return E_OUTOFMEMORY;
1627
1628 hr = SHGetPathCchFromIDListW(pidl, lpszPath, cchPath);
1629 strPath.ReleaseBuffer();
1630
1632 break;
1633
1634 if (cchPath >= MAXUINT / 2)
1635 {
1636 hr = E_FAIL;
1637 break;
1638 }
1639 }
1640
1641 if (FAILED(hr))
1642 strPath.Empty();
1643
1644 return hr;
1645}
1646
1647static HRESULT
1649 _In_ HWND hwndOwner,
1650 _Out_ CStringW& strPath,
1651 _In_ INT nCSIDL,
1653{
1654 LPITEMIDLIST pidl;
1655 HRESULT hr = SHGetSpecialFolderLocation(hwndOwner, nCSIDL, &pidl);
1656 if (SUCCEEDED(hr))
1657 {
1658 hr = DynamicSHGetPathFromIDListW(pidl, strPath);
1659 CoTaskMemFree(pidl);
1660 }
1661
1662 if (FAILED(hr))
1663 strPath.Empty();
1664 else if (bCreate)
1665 CreateDirectoryW(strPath, NULL);
1666
1667 return hr;
1668}
1669
1670static VOID
1672 _Out_ CStringW& strPath)
1673{
1674 INT nLength = strPath.GetLength();
1675 if (nLength > 0 && strPath[nLength - 1] == L'\\')
1676 strPath = strPath.Left(nLength - 1);
1677}
1678
1679/*************************************************************************
1680 * PathIsEqualOrSubFolder (SHELL32.755)
1681 */
1685 _In_ LPCWSTR pszPath1OrCSIDL,
1686 _In_ LPCWSTR pszPath2)
1687{
1688 CStringW strCommon, strPath1;
1689
1690 TRACE("(%s %s)\n", debugstr_w(pszPath1OrCSIDL), debugstr_w(pszPath2));
1691
1692 if (IS_INTRESOURCE(pszPath1OrCSIDL))
1693 {
1695 NULL, strPath1, LOWORD(pszPath1OrCSIDL) | CSIDL_FLAG_DONT_VERIFY, FALSE);
1696 }
1697 else
1698 {
1699 strPath1 = pszPath1OrCSIDL;
1700 }
1701
1703
1704 if (!DynamicPathCommonPrefixW(strPath1, pszPath2, strCommon))
1705 return FALSE;
1706
1707 return strPath1.CompareNoCase(strCommon) == 0;
1708}
1709
1710/*************************************************************************
1711 * SHGetRealIDL [SHELL32.98]
1712 */
1716 _In_ IShellFolder *psf,
1717 _In_ PCUITEMID_CHILD pidlSimple,
1718 _Outptr_ PITEMID_CHILD *ppidlReal)
1719{
1720 HRESULT hr;
1721 STRRET strret;
1723 SFGAOF attrs;
1724
1725 *ppidlReal = NULL;
1726
1727 hr = IShellFolder_GetDisplayNameOf(psf, pidlSimple, SHGDN_INFOLDER | SHGDN_FORPARSING,
1728 &strret, 0);
1730 return hr;
1731
1732 hr = StrRetToBufW(&strret, pidlSimple, szPath, _countof(szPath));
1734 return hr;
1735
1736 attrs = SFGAO_FILESYSTEM;
1737 hr = psf->GetAttributesOf(1, &pidlSimple, &attrs);
1738 if (SUCCEEDED(hr) && !(attrs & SFGAO_FILESYSTEM))
1739 return SHILClone(pidlSimple, ppidlReal);
1740
1741 hr = IShellFolder_ParseDisplayName(psf, NULL, NULL, szPath, NULL, ppidlReal, NULL);
1742 if (hr == E_INVALIDARG || hr == E_NOTIMPL)
1743 return SHILClone(pidlSimple, ppidlReal);
1744
1745 return hr;
1746}
1747
1751 _In_ PCWSTR pszCommandName,
1753{
1754 HRESULT hr;
1756 if (SUCCEEDED(hr = pUnk->QueryInterface(IID_PPV_ARG(IInitializeCommand, &pIC))))
1757 hr = pIC->Initialize(pszCommandName, pPB);
1758 return hr;
1759}
1760
1763 _In_ IExecuteCommand *pEC,
1764 _In_ PCWSTR pszCommandName,
1766 _In_opt_ IShellItemArray *pSIA,
1767 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1768 _In_opt_ IUnknown *pSite)
1769{
1770 if (!pEC)
1771 return E_INVALIDARG;
1772
1773 CScopedSetObjectWithSite site(pEC, pSite);
1774 IUnknown_InitializeCommand(pEC, pszCommandName, pPB);
1775
1777 if (pSIA && SUCCEEDED(pEC->QueryInterface(IID_PPV_ARG(IObjectWithSelection, &pOWS))))
1778 pOWS->SetSelection(pSIA);
1779
1780 DWORD dwKeyState = 0, fMask = pICI ? pICI->fMask : 0;
1781 pEC->SetNoShowUI((fMask & CMIC_MASK_FLAG_NO_UI) != 0);
1782 pEC->SetShowWindow(pICI ? pICI->nShow : SW_SHOW);
1783 if (fMask & CMIC_MASK_SHIFT_DOWN)
1784 dwKeyState |= MK_SHIFT;
1785 if (fMask & CMIC_MASK_CONTROL_DOWN)
1786 dwKeyState |= MK_CONTROL;
1787 pEC->SetKeyState(dwKeyState);
1788 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpDirectoryW)
1789 pEC->SetDirectory(pICI->lpDirectoryW);
1790 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpParametersW)
1791 pEC->SetParameters(pICI->lpParametersW);
1792 if (fMask & CMIC_MASK_PTINVOKE)
1793 pEC->SetPosition(pICI->ptInvoke);
1794
1795 return pEC->Execute();
1796}
1797
1800 _In_ IExecuteCommand *pEC,
1801 _In_ PCWSTR pszCommandName,
1803 _In_ IDataObject *pDO,
1804 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1805 _In_opt_ IUnknown *pSite)
1806{
1808 HRESULT hr = SHCreateShellItemArrayFromDataObject(pDO, IID_PPV_ARG(IShellItemArray, &pSIA));
1809 return SUCCEEDED(hr) ? InvokeIExecuteCommand(pEC, pszCommandName, pPB, pSIA, pICI, pSite) : hr;
1810}
1811
1812static HRESULT
1814{
1815 HRESULT hr = pCM->GetCommandString(Id, GCS & ~GCS_UNICODE, NULL, Buf, cchMax);
1816 if (FAILED(hr))
1817 {
1819 hr = pCM->GetCommandString(Id, GCS | GCS_UNICODE, NULL, (LPSTR)buf, _countof(buf));
1820 if (SUCCEEDED(hr))
1821 hr = SHUnicodeToAnsi(buf, Buf, cchMax) > 0 ? S_OK : E_FAIL;
1822 }
1823 return hr;
1824}
1825
1826UINT
1828{
1829 CHAR buf[MAX_PATH];
1830 if (IS_INTRESOURCE(verba))
1831 {
1832 if (FAILED(GetCommandStringA(pCM, LOWORD(verba), GCS_VERB, buf, _countof(buf))))
1833 return 0;
1834 verba = buf;
1835 }
1836 return MapVerbToDfmCmd(verba); // Returns DFM_CMD_* or 0
1837}
1838
1839HRESULT
1840SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
1841{
1842 LPCSTR pVerbA = pICI->lpVerb;
1843 CHAR buf[MAX_PATH];
1844 LPCMINVOKECOMMANDINFOEX pICIX = (LPCMINVOKECOMMANDINFOEX)pICI;
1845 if (IsUnicode(*pICIX) && !IS_INTRESOURCE(pICIX->lpVerbW))
1846 {
1847 if (SHUnicodeToAnsi(pICIX->lpVerbW, buf, _countof(buf)))
1848 pVerbA = buf;
1849 }
1850
1851 if (IS_INTRESOURCE(pVerbA))
1852 return LOWORD(pVerbA);
1853 for (SIZE_T i = 0; pMap[i].Verb; ++i)
1854 {
1855 assert(SUCCEEDED((int)(pMap[i].CmdId))); // The id must be >= 0 and ideally in the 0..0x7fff range
1856 if (!lstrcmpiA(pMap[i].Verb, pVerbA) && pVerbA[0])
1857 return pMap[i].CmdId;
1858 }
1859 return E_FAIL;
1860}
1861
1862static const CMVERBMAP*
1864{
1865 for (SIZE_T i = 0; pMap[i].Verb; ++i)
1866 {
1867 if (pMap[i].CmdId == CmdId)
1868 return &pMap[i];
1869 }
1870 return NULL;
1871}
1872
1873HRESULT
1875{
1876 const CMVERBMAP* pEntry;
1877 switch (uFlags | GCS_UNICODE)
1878 {
1879 case GCS_VALIDATEW:
1880 case GCS_VERBW:
1881 pEntry = FindVerbMapEntry(CmdId, pMap);
1882 if ((uFlags | GCS_UNICODE) == GCS_VERBW)
1883 {
1884 if (!pEntry)
1885 return E_INVALIDARG;
1886 else if (uFlags & GCS_UNICODE)
1887 return SHAnsiToUnicode(pEntry->Verb, (LPWSTR)Buf, cchBuf) ? S_OK : E_FAIL;
1888 else
1889 return StringCchCopyA(Buf, cchBuf, pEntry->Verb);
1890 }
1891 return pEntry ? S_OK : S_FALSE; // GCS_VALIDATE
1892 }
1893 return E_NOTIMPL;
1894}
1895
1896HRESULT
1898{
1902 return hr;
1903 initIcon->SetNormalIcon(swShell32Name, IconIndex);
1904 return initIcon->QueryInterface(riid, ppvOut);
1905}
1906
1907int DCIA_AddEntry(HDCIA hDCIA, REFCLSID rClsId)
1908{
1909 for (UINT i = 0;; ++i)
1910 {
1911 const CLSID *pClsId = DCIA_GetEntry(hDCIA, i);
1912 if (!pClsId)
1913 break;
1914 if (IsEqualGUID(*pClsId, rClsId))
1915 return i; // Don't allow duplicates
1916 }
1917 return DSA_AppendItem((HDSA)hDCIA, const_cast<CLSID*>(&rClsId));
1918}
1919
1920void DCIA_AddShellExSubkey(HDCIA hDCIA, HKEY hProgId, PCWSTR pszSubkey)
1921{
1922 WCHAR szKey[200];
1923 PathCombineW(szKey, L"shellex", pszSubkey);
1924 HKEY hEnum;
1925 if (RegOpenKeyExW(hProgId, szKey, 0, KEY_READ, &hEnum) != ERROR_SUCCESS)
1926 return;
1927 for (UINT i = 0; RegEnumKeyW(hEnum, i++, szKey, _countof(szKey)) == ERROR_SUCCESS;)
1928 {
1929 CLSID clsid;
1930 if (SUCCEEDED(SHELL_GetShellExtensionRegCLSID(hEnum, szKey, &clsid)))
1931 DCIA_AddEntry(hDCIA, clsid);
1932 }
1933 RegCloseKey(hEnum);
1934}
1935
1936/*************************************************************************
1937 * SHIsBadInterfacePtr [SHELL32.84]
1938 *
1939 * Retired in 6.0 from Windows Vista and higher.
1940 */
1944 _In_ LPCVOID pv,
1945 _In_ UINT_PTR ucb)
1946{
1947 struct CUnknownVtbl
1948 {
1952 };
1953 struct CUnknown { CUnknownVtbl *lpVtbl; };
1954 const CUnknown *punk = reinterpret_cast<const CUnknown *>(pv);
1955 return !punk || IsBadReadPtr(punk, sizeof(punk->lpVtbl)) ||
1956 IsBadReadPtr(punk->lpVtbl, ucb) ||
1957 IsBadCodePtr((FARPROC)punk->lpVtbl->Release);
1958}
1959
1960/*************************************************************************
1961 * SHGetUserDisplayName [SHELL32.241]
1962 *
1963 * @see https://undoc.airesoft.co.uk/shell32.dll/SHGetUserDisplayName.php
1964 */
1968 _Out_writes_to_(*puSize, *puSize) PWSTR pName,
1969 _Inout_ PULONG puSize)
1970{
1971 if (!pName || !puSize)
1972 return E_INVALIDARG;
1973
1974 if (GetUserNameExW(NameDisplay, pName, puSize))
1975 return S_OK;
1976
1977 LONG error = GetLastError(); // for ERROR_NONE_MAPPED
1979
1980 WCHAR UserName[MAX_PATH];
1981 DWORD cchUserName = _countof(UserName);
1982 if (!GetUserNameW(UserName, &cchUserName))
1984
1985 // Was the user name not available in the specified format (NameDisplay)?
1986 if (error == ERROR_NONE_MAPPED)
1987 {
1988 // Try to get the user name by using Network API
1989 PUSER_INFO_2 UserInfo;
1990 DWORD NetError = NetUserGetInfo(NULL, UserName, 2, (PBYTE*)&UserInfo);
1991 if (NetError)
1992 {
1993 hr = HRESULT_FROM_WIN32(NetError);
1994 }
1995 else
1996 {
1997 if (UserInfo->usri2_full_name)
1998 {
1999 hr = StringCchCopyW(pName, *puSize, UserInfo->usri2_full_name);
2000 if (SUCCEEDED(hr))
2001 {
2002 // Include the NUL-terminator
2003 *puSize = lstrlenW(UserInfo->usri2_full_name) + 1;
2004 }
2005 }
2006
2007 NetApiBufferFree(UserInfo);
2008 }
2009 }
2010
2011 if (FAILED(hr))
2012 {
2013 hr = StringCchCopyW(pName, *puSize, UserName);
2014 if (SUCCEEDED(hr))
2015 *puSize = cchUserName;
2016 }
2017
2018 return hr;
2019}
2020
2021// Skip leading backslashes
2022static PCWSTR
2024 _In_ PCWSTR pszPath)
2025{
2026 PCWSTR pch;
2027 for (pch = pszPath; *pch == L'\\'; ++pch)
2028 ;
2029 return pch;
2030}
2031
2032// The registry key for server computer descriptions cache
2033#define COMPUTER_DESCRIPTIONS_KEY \
2034 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComputerDescriptions"
2035
2036// Get server computer description from cache
2037static HRESULT
2039 _Out_writes_z_(cchDescMax) PWSTR pszDesc,
2040 _In_ DWORD cchDescMax,
2041 _In_ PCWSTR pszServerName)
2042{
2043 cchDescMax *= sizeof(WCHAR);
2045 SHELL_SkipServerSlashes(pszServerName), NULL, pszDesc, &cchDescMax);
2046 return HRESULT_FROM_WIN32(error);
2047}
2048
2049// Do cache a server computer description
2050static VOID
2052 _In_ PCWSTR pszServerName,
2053 _In_ PCWSTR pszDesc)
2054{
2055 if (!pszDesc)
2056 return;
2057
2058 SIZE_T cbDesc = (wcslen(pszDesc) + 1) * sizeof(WCHAR);
2060 SHELL_SkipServerSlashes(pszServerName), REG_SZ, pszDesc, (DWORD)cbDesc);
2061}
2062
2063// Get real server computer description
2064static HRESULT
2066 _Out_writes_z_(cchDescMax) PWSTR pszDesc,
2067 _In_ SIZE_T cchDescMax,
2068 _In_ PWSTR pszServerName)
2069{
2071 NET_API_STATUS error = NetServerGetInfo(pszServerName, 101, (PBYTE*)&bufptr);
2074 return hr;
2075
2076 PCWSTR comment = bufptr->sv101_comment;
2077 if (comment && comment[0])
2078 StringCchCopyW(pszDesc, cchDescMax, comment);
2079 else
2080 hr = E_FAIL;
2081
2083 return hr;
2084}
2085
2086// Build computer display name
2087static HRESULT
2089 _Out_writes_z_(cchNameMax) PWSTR pszName,
2090 _In_ DWORD cchNameMax,
2091 _In_ PCWSTR pszServerName,
2092 _In_ PCWSTR pszDescription)
2093{
2094 if (!pszDescription || !*pszDescription)
2095 return E_FAIL;
2096
2097 PCWSTR pszFormat = (SHRestricted(REST_ALLOWCOMMENTTOGGLE) ? L"%2 (%1)" : L"%1 (%2)");
2098 PCWSTR args[] = { pszDescription , SHELL_SkipServerSlashes(pszServerName) };
2100 pszFormat, 0, 0, pszName, cchNameMax, (va_list *)args) ? S_OK : E_FAIL);
2101}
2102
2103/*************************************************************************
2104 * SHGetComputerDisplayNameW [SHELL32.752]
2105 */
2109 _In_opt_ PWSTR pszServerName,
2111 _Out_writes_z_(cchNameMax) PWSTR pszName,
2112 _In_ DWORD cchNameMax)
2113{
2114 WCHAR szDesc[256], szCompName[MAX_COMPUTERNAME_LENGTH + 1];
2115
2116 // If no server name is specified, retrieve the local computer name
2117 if (!pszServerName)
2118 {
2119 // Use computer name as server name
2120 DWORD cchCompName = _countof(szCompName);
2121 if (!GetComputerNameW(szCompName, &cchCompName))
2122 return E_FAIL;
2123 pszServerName = szCompName;
2124
2125 // Don't use the cache for the local machine
2127 }
2128
2129 // Get computer description from cache if necessary
2130 HRESULT hr = E_FAIL;
2131 if (!(dwFlags & SHGCDN_NOCACHE))
2132 hr = SHELL_GetCachedComputerDescription(szDesc, _countof(szDesc), pszServerName);
2133
2134 // Actually retrieve the computer description if it is not in the cache
2135 if (FAILED(hr))
2136 {
2137 hr = SHELL_GetComputerDescription(szDesc, _countof(szDesc), pszServerName);
2138 if (FAILED(hr))
2139 szDesc[0] = UNICODE_NULL;
2140
2141 // Cache the description if necessary
2142 if (!(dwFlags & SHGCDN_NOCACHE))
2143 SHELL_CacheComputerDescription(pszServerName, szDesc);
2144 }
2145
2146 // If getting the computer description failed, store the server name only
2147 if (FAILED(hr) || !szDesc[0])
2148 {
2150 return hr; // Bail out if no server name is requested
2151
2152 StringCchCopyW(pszName, cchNameMax, SHELL_SkipServerSlashes(pszServerName));
2153 return S_OK;
2154 }
2155
2156 // If no server name is requested, store the description only
2158 {
2159 StringCchCopyW(pszName, cchNameMax, szDesc);
2160 return S_OK;
2161 }
2162
2163 // Build a string like "Description (SERVERNAME)"
2164 return SHELL_BuildDisplayMachineName(pszName, cchNameMax, pszServerName, szDesc);
2165}
2166
2167typedef struct tagALIAS_MAPPING
2168{
2169 BYTE bFlagMask; // The combination of ALIAS_USER_FOLDER and/or ALIAS_DESKTOP
2171 WORD nCsidlSrc; // CSIDL_... (source)
2172 WORD nCsidlDest; // CSIDL_... (destination)
2174
2177{
2178 {
2180 FALSE,
2183 },
2184 {
2186 FALSE,
2189 },
2190 {
2192 FALSE,
2195 },
2196 {
2198 TRUE,
2201 }
2202};
2203
2208 _In_opt_ HANDLE hToken,
2209 _In_ LPCITEMIDLIST pidlTarget,
2210 _Out_ LPITEMIDLIST *ppidlNew,
2212{
2213 if (!pidlTarget || !ppidlNew)
2214 return FALSE;
2215
2216 *ppidlNew = NULL;
2217
2218 for (SIZE_T iEntry = 0; iEntry < _countof(g_AliasTable); ++iEntry)
2219 {
2220 const ALIAS_MAPPING *pEntry = &g_AliasTable[iEntry];
2221
2222 if (!(dwFlags & pEntry->bFlagMask))
2223 continue;
2224
2225 // Get the source root PIDL
2226 LPITEMIDLIST pidlSrcRoot = NULL;
2227 HRESULT hr = SHGetFolderLocation(hwnd, pEntry->nCsidlSrc, hToken, 0, &pidlSrcRoot);
2228 if (FAILED(hr))
2229 continue;
2230
2231 // Check whether the input pidlTarget is under the source folder.
2232 // If it matches, ILFindChild returns the relative PIDL in the pidlTarget.
2233 LPCITEMIDLIST pidlRelative = ILFindChild(pidlSrcRoot, pidlTarget);
2234 if (!pidlRelative) // Not found?
2235 {
2236 ILFree(pidlSrcRoot);
2237 continue;
2238 }
2239
2240 // Found. Get the destination root PIDL
2241 LPITEMIDLIST pidlDestRoot = NULL;
2242 hr = SHGetFolderLocation(hwnd, pEntry->nCsidlDest, hToken, 0, &pidlDestRoot);
2243 if (SUCCEEDED(hr))
2244 {
2245 // Create a new PIDL by combining the destination root PIDL and the relative PIDL
2246 *ppidlNew = ILCombine(pidlDestRoot, pidlRelative);
2247 if (*ppidlNew)
2248 {
2249 // Manipulate specific flags in the PIDL if necessary
2250 if (pEntry->bCommonDesktop && (*ppidlNew)->mkid.cb >= 3)
2251 {
2252 (*ppidlNew)->mkid.abID[0] |= (PT_FS | PT_FS_COMMON_FLAG);
2253 }
2254 }
2255 ILFree(pidlDestRoot);
2256 }
2257
2258 ILFree(pidlSrcRoot);
2259 break; // A match was found, so exit the loop
2260 }
2261
2262 return (*ppidlNew != NULL);
2263}
2264
2265/*************************************************************************
2266 * SHSetLocalizedName (SHELL32.@)
2267 *
2268 * https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shsetlocalizedname
2269 */
2273 _In_ PCWSTR pszPath,
2274 _In_ PCWSTR pszResModule,
2275 _In_ INT idsRes)
2276{
2277 HRESULT hr;
2278 IShellFolder *pDesktop = NULL, *pParent = NULL;
2279 LPITEMIDLIST pidl = NULL;
2280 LPCITEMIDLIST pidlLast;
2282 INT cchShortMax, cchShort, cchName;
2283 PWSTR pszShortPath = NULL, pszName = NULL;
2284
2287 return hr;
2288
2289 hr = SHGetDesktopFolder(&pDesktop);
2291 goto Cleanup;
2292
2293 hr = pDesktop->ParseDisplayName(NULL, NULL, (PWSTR)pszPath, NULL, &pidl, NULL);
2295 goto Cleanup;
2296
2297 hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &pParent), &pidlLast);
2299 goto Cleanup;
2300
2302 cchShortMax = lstrlenW(pszResModule) + 1;
2303 pszShortPath = (PWSTR)HeapAlloc(hProcessHeap, 0, cchShortMax * sizeof(WCHAR));
2304 if (!pszShortPath)
2305 {
2306 hr = E_OUTOFMEMORY;
2307 goto Cleanup;
2308 }
2309
2310 cchShort = GetShortPathNameW(pszResModule, pszShortPath, cchShortMax);
2311 if (cchShort)
2312 pszResModule = pszShortPath;
2313 else
2314 cchShort = cchShortMax;
2315
2316 /* 14 == '@' + ',' + '-' + (digits of max width 10) + NUL */
2317 cchName = cchShort + 14;
2318 pszName = (PWSTR)HeapAlloc(hProcessHeap, 0, cchName * sizeof(WCHAR));
2319 if (!pszName)
2320 {
2321 hr = E_OUTOFMEMORY;
2322 goto Cleanup;
2323 }
2324
2325 wnsprintfW(pszName, cchName, L"@%s,%d", pszResModule, -idsRes);
2326 hr = pParent->SetNameOf(NULL, pidlLast, pszName, 0, NULL);
2327
2328Cleanup:
2329 if (pszName)
2330 HeapFree(hProcessHeap, 0, pszName);
2331 if (pszShortPath)
2332 HeapFree(hProcessHeap, 0, pszShortPath);
2333 if (pParent)
2334 pParent->Release();
2335 if (pidl)
2336 SHFree(pidl);
2337 if (pDesktop)
2338 pDesktop->Release();
2340 return hr;
2341}
2342
2346 _In_ LPCITEMIDLIST pidl,
2347 _Out_ LPITEMIDLIST *ppidlNew,
2349{
2350 return SHELL32_ReparentAsAliasPidl(NULL, NULL, pidl, ppidlNew, dwFlags) ? S_OK : E_FAIL;
2351}
2352
2353/*************************************************************************
2354 * LinkWindow_RegisterClass (SHELL32.258)
2355 *
2356 * https://learn.microsoft.com/en-us/windows/win32/shell/linkwindow-registerclass
2357 */
2359{
2360 INITCOMMONCONTROLSEX iccx = { sizeof(iccx), ICC_LINK_CLASS };
2361 InitCommonControlsEx(&iccx);
2362
2363 WNDCLASSEXW wcx = { sizeof(wcx) };
2364 if (!GetClassInfoExW(NULL, L"SysLink", &wcx))
2365 return FALSE;
2366
2367 /* Superclassing! */
2368 wcx.lpszClassName = L"Link Window";
2370}
2371
2372/*************************************************************************
2373 * LinkWindow_UnregisterClass (SHELL32.259)
2374 */
2376{
2377 /* Do nothing. This is correct. */
2378 return TRUE;
2379}
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:631
STDMETHODIMP GetWindow(HWND *phWnd) override
Definition: utils.cpp:655
STDMETHODIMP_(ULONG) Release() override
Definition: utils.cpp:644
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override
Definition: utils.cpp:662
STDMETHODIMP_(ULONG) AddRef() override
Definition: utils.cpp:640
virtual ~CDummyOleWindow()
Definition: utils.cpp:628
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:231
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:573
#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
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:520
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:1620
void WINAPI PathRemoveExtensionW(WCHAR *path)
Definition: path.c:1946
BOOL WINAPI PathRemoveFileSpecW(WCHAR *path)
Definition: path.c:1145
BOOL WINAPI PathUnExpandEnvStringsW(const WCHAR *path, WCHAR *buffer, UINT buf_len)
Definition: path.c:2705
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
Definition: path.c:2221
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:1107
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
_ACRTIMP int __cdecl _wcsnicmp(const wchar_t *, const wchar_t *, size_t)
Definition: wcs.c:195
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
#define CSTUBWINDOW32_CLASSNAME
Definition: precomp.h:221
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:478
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:982
BOOL WINAPI IsSuspendAllowed(VOID)
Definition: utils.cpp:922
HRESULT SHELL_CreateShell32DefaultExtractIcon(int IconIndex, REFIID riid, LPVOID *ppvOut)
Definition: utils.cpp:1897
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:2108
EXTERN_C HRESULT WINAPI SHEnumerateUnreadMailAccountsW(_In_opt_ HKEY hKeyUser, _In_ DWORD dwIndex, _Out_writes_(cchMailAddress) PWSTR pszMailAddress, _In_ INT cchMailAddress)
Definition: utils.cpp:1209
static const CMVERBMAP * FindVerbMapEntry(UINT_PTR CmdId, const CMVERBMAP *pMap)
Definition: utils.cpp:1863
#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:1026
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:520
static HRESULT SHELL_GetComputerDescription(_Out_writes_z_(cchDescMax) PWSTR pszDesc, _In_ SIZE_T cchDescMax, _In_ PWSTR pszServerName)
Definition: utils.cpp:2065
static VOID DynamicPathRemoveBackslashW(_Out_ CStringW &strPath)
Definition: utils.cpp:1671
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:2206
EXTERN_C WORD WINAPI ExtractIconResInfoA(_In_ HANDLE hHandle, _In_ LPCSTR lpFileName, _In_ WORD wIndex, _Out_ LPWORD lpSize, _Out_ LPHANDLE lpIcon)
Definition: utils.cpp:747
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:575
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:2176
static HRESULT GetCommandStringA(_In_ IContextMenu *pCM, _In_ UINT_PTR Id, _In_ UINT GCS, _Out_writes_(cchMax) LPSTR Buf, _In_ UINT cchMax)
Definition: utils.cpp:1813
EXTERN_C BOOL WINAPI PathIsEqualOrSubFolder(_In_ LPCWSTR pszPath1OrCSIDL, _In_ LPCWSTR pszPath2)
Definition: utils.cpp:1684
EXTERN_C HRESULT WINAPI SHGetRealIDL(_In_ IShellFolder *psf, _In_ PCUITEMID_CHILD pidlSimple, _Outptr_ PITEMID_CHILD *ppidlReal)
Definition: utils.cpp:1715
EXTERN_C DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken)
Definition: utils.cpp:788
#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:1314
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:858
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:2088
static VOID SHELL_CacheComputerDescription(_In_ PCWSTR pszServerName, _In_ PCWSTR pszDesc)
Definition: utils.cpp:2051
EXTERN_C HRESULT WINAPI SHInvokePrivilegedFunctionW(_In_ LPCWSTR pszName, _In_ PRIVILEGED_FUNCTION fn, _In_opt_ LPARAM lParam)
Definition: utils.cpp:815
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:1762
EXTERN_C LPWSTR WINAPI ShortSizeFormatW(_In_ DWORD dwNumber, _Out_writes_(0x8FFF) LPWSTR pszBuffer)
Definition: utils.cpp:768
static PCSTR StrEndNA(_In_ PCSTR psz, _In_ INT_PTR cch)
Definition: utils.cpp:17
EXTERN_C LPSTR WINAPI SheRemoveQuotesA(LPSTR psz)
Definition: utils.cpp:1159
BOOL Shell_FailForceReturn(_In_ HRESULT hr)
Definition: utils.cpp:392
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:442
void DCIA_AddShellExSubkey(HDCIA hDCIA, HKEY hProgId, PCWSTR pszSubkey)
Definition: utils.cpp:1920
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:1599
EXTERN_C HRESULT IUnknown_InitializeCommand(_In_ IUnknown *pUnk, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB)
Definition: utils.cpp:1749
static HRESULT DynamicSHGetPathFromIDListW(_In_ LPCITEMIDLIST pidl, _Out_ CStringW &strPath)
Definition: utils.cpp:1616
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:1374
EXTERN_C BOOL WINAPI Activate_RunDLL(_In_ HWND hwnd, _In_ HINSTANCE hinst, _In_ LPCWSTR cmdline, _In_ INT cmdshow)
Definition: utils.cpp:1549
EXTERN_C BOOL WINAPI PathIsSlowA(_In_ LPCSTR pszFile, _In_ DWORD dwAttr)
Definition: utils.cpp:733
UINT GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba)
Definition: utils.cpp:1827
HRESULT SHELL_GetCommandStringImpl(SIZE_T CmdId, UINT uFlags, LPSTR Buf, UINT cchBuf, const CMVERBMAP *pMap)
Definition: utils.cpp:1874
EXTERN_C HRESULT WINAPI DisplayNameOfW(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_ LPWSTR pszBuf, _In_ UINT cchBuf)
Definition: utils.cpp:504
EXTERN_C HRESULT WINAPI SHSetUnreadMailCountW(_In_ PCWSTR pszMailAddress, _In_ DWORD dwCount, _In_ PCWSTR pszShellExecuteCommand)
Definition: utils.cpp:1104
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:1412
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:933
EXTERN_C HRESULT SHELL_GetUIObjectOfAbsoluteItem(_In_opt_ HWND hWnd, _In_ PCIDLIST_ABSOLUTE pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:452
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:2038
EXTERN_C HRESULT BindCtx_RegisterObjectParam(_In_ IBindCtx *pBindCtx, _In_ LPOLESTR pszKey, _In_opt_ IUnknown *punk, _Out_ LPBC *ppbc)
Definition: utils.cpp:669
EXTERN_C HRESULT WINAPI CopyStreamUI(_In_ IStream *pSrc, _Out_ IStream *pDst, _Inout_opt_ IProgressDialog *pProgress, _In_opt_ DWORDLONG dwlSize)
Definition: utils.cpp:1431
EXTERN_C HRESULT WINAPI SHGetUserDisplayName(_Out_writes_to_(*puSize, *puSize) PWSTR pName, _Inout_ PULONG puSize)
Definition: utils.cpp:1967
#define COMPUTER_DESCRIPTIONS_KEY
Definition: utils.cpp:2033
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:1243
static HRESULT Int64ToStr(_In_ LONGLONG llValue, _Out_writes_(cchValue) LPWSTR pszValue, _In_ UINT cchValue)
Definition: utils.cpp:1269
int DCIA_AddEntry(HDCIA hDCIA, REFCLSID rClsId)
Definition: utils.cpp:1907
EXTERN_C HRESULT WINAPI SHSetLocalizedName(_In_ PCWSTR pszPath, _In_ PCWSTR pszResModule, _In_ INT idsRes)
Definition: utils.cpp:2272
HRESULT SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
Definition: utils.cpp:1840
EXTERN_C LPWSTR WINAPI SheRemoveQuotesW(LPWSTR psz)
Definition: utils.cpp:1184
EXTERN_C BOOL WINAPI SHIsBadInterfacePtr(_In_ LPCVOID pv, _In_ UINT_PTR ucb)
Definition: utils.cpp:1943
EXTERN_C HRESULT WINAPI SHCreatePropertyBag(_In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:975
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:1799
EXTERN_C HWND BindCtx_GetUIWindow(_In_ IBindCtx *pBindCtx)
Definition: utils.cpp:609
static HMENU SHLoadPopupMenu(HINSTANCE hInstance, UINT uMenuId)
Definition: utils.cpp:61
HRESULT SHBindToObjectEx(_In_opt_ IShellFolder *pShellFolder, _In_ LPCITEMIDLIST pidl, _In_opt_ IBindCtx *pBindCtx, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:409
EXTERN_C HRESULT WINAPI SHSetFolderPathA(_In_ INT csidl, _In_ HANDLE hToken, _In_ DWORD dwFlags, _In_ LPCSTR pszPath)
Definition: utils.cpp:715
BOOL IsShutdownAllowed(VOID)
Definition: utils.cpp:914
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:554
BOOL PathIsDotOrDotDotW(_In_ LPCWSTR pszPath)
Definition: utils.cpp:228
static PCWSTR SHELL_SkipServerSlashes(_In_ PCWSTR pszPath)
Definition: utils.cpp:2023
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogA(_In_ HWND hwnd, _In_ LPCSTR pszRemoteName, _In_ DWORD dwType)
Definition: utils.cpp:1575
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:2375
EXTERN_C HRESULT WINAPI SHShouldShowWizards(_In_ IUnknown *pUnknown)
Definition: utils.cpp:298
EXTERN_C BOOL WINAPI SHOpenEffectiveToken(_Out_ LPHANDLE phToken)
Definition: utils.cpp:779
static HRESULT DynamicSHGetSpecialFolderPathW(_In_ HWND hwndOwner, _Out_ CStringW &strPath, _In_ INT nCSIDL, _In_ BOOL bCreate)
Definition: utils.cpp:1648
EXTERN_C HRESULT SHELL32_AliasTranslatePidl(_In_ LPCITEMIDLIST pidl, _Out_ LPITEMIDLIST *ppidlNew, _In_ DWORD dwFlags)
Translate a PIDL to an "alias" PIDL.
Definition: utils.cpp:2345
HRESULT SHCoInitializeAnyApartment(VOID)
Definition: utils.cpp:566
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:1997
DWORD WINAPI SHGetObjectCompatFlags(IUnknown *pUnk, const CLSID *clsid)
Definition: ordinal.c:6515
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1501
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
Definition: ordinal.c:1336
BOOL WINAPI SHSkipJunction(IBindCtx *pbc, const CLSID *pclsid)
Definition: ordinal.c:4779
DWORD WINAPI SHGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1278
DWORD WINAPI SHQueryValueExW(HKEY hKey, LPCWSTR lpszValue, LPDWORD lpReserved, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1503
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1348
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
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2524
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:1660
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
Definition: string.c:1761
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
#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
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
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
#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:116
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 BSTR *static LPOLESTR
Definition: varformat.c:44
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
unsigned int UINT
Definition: ndis.h:50
_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:254
#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:2701
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:2205
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1527
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2196
#define CSIDL_PERSONAL
Definition: shlobj.h:2186
#define CSIDL_FLAG_NO_ALIAS
Definition: shlobj.h:2241
#define CSIDL_FLAG_DONT_VERIFY
Definition: shlobj.h:2242
#define MM_SUBMENUSHAVEIDS
Definition: shlobj.h:2537
#define SSF_WEBVIEW
Definition: shlobj.h:1627
#define MM_DONTREMOVESEPS
Definition: shlobj.h:2538
#define CSIDL_DESKTOP
Definition: shlobj.h:2181
#define MM_ADDSEPARATOR
Definition: shlobj.h:2536
@ REST_ALLOWCOMMENTTOGGLE
Definition: shlobj.h:1878
#define CSIDL_COMMON_DOCUMENTS
Definition: shlobj.h:2226
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 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:2170
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:1066
#define FMT_USE_NUMDIGITS
Definition: undocshell.h:903
#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:1065
#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:2469
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LPCSTR lpFileName
Definition: winbase.h:2824
#define FORMAT_MESSAGE_FROM_STRING
Definition: winbase.h:398
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1146
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:338
_In_ LPCSTR lpName
Definition: winbase.h:2543
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:2521
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:267
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:51
#define LOCALE_SDECIMAL
Definition: winnls.h:49
#define LOCALE_IDIGITS
Definition: winnls.h:52
#define LOCALE_STHOUSAND
Definition: winnls.h:50
#define LOCALE_INEGNUMBER
Definition: winnls.h:54
#define LOCALE_ILZERO
Definition: winnls.h:53
#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