ReactOS 0.4.16-dev-2206-gc56950d
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
35/*************************************************************************
36 * StrRStrA [SHELL32.389]
37 */
41 _In_ PCSTR pszSrc,
42 _In_opt_ PCSTR pszLast,
43 _In_ PCSTR pszSearch)
44{
45 INT cchSearch = lstrlenA(pszSearch);
46
47 PCSTR pchEnd = pszLast ? pszLast : &pszSrc[lstrlenA(pszSrc)];
48 if (pchEnd == pszSrc)
49 return NULL;
50
51 INT_PTR cchEnd = pchEnd - pszSrc;
52 for (;;)
53 {
54 --pchEnd;
55 --cchEnd;
56 if (!pchEnd)
57 break;
58 if (!StrCmpNA(pchEnd, pszSearch, cchSearch) && pchEnd == StrEndNA(pszSrc, cchEnd))
59 break;
60 if (pchEnd == pszSrc)
61 return NULL;
62 }
63
64 return const_cast<PSTR>(pchEnd);
65}
66
67/*************************************************************************
68 * StrRStrW [SHELL32.392]
69 */
73 _In_ PCWSTR pszSrc,
74 _In_opt_ PCWSTR pszLast,
75 _In_ PCWSTR pszSearch)
76{
77 INT cchSearch = lstrlenW(pszSearch);
78
79 PCWSTR pchEnd = pszLast ? pszLast : &pszSrc[lstrlenW(pszSrc)];
80 if (pchEnd == pszSrc)
81 return NULL;
82
83 INT_PTR cchEnd = pchEnd - pszSrc;
84 for (;;)
85 {
86 --pchEnd;
87 --cchEnd;
88 if (!pchEnd)
89 break;
90 if (!StrCmpNW(pchEnd, pszSearch, cchSearch) && pchEnd == StrEndNW(pszSrc, cchEnd))
91 break;
92 if (pchEnd == pszSrc)
93 return NULL;
94 }
95
96 return const_cast<PWSTR>(pchEnd);
97}
98
99HWND
101{
102 for (HWND hWnd, hWndAfter = NULL;;)
103 {
104 hWnd = hWndAfter = FindWindowExW(NULL, hWndAfter, CSTUBWINDOW32_CLASSNAME, Path);
105 if (!hWnd || !Path)
106 return NULL;
108 return hWnd;
109 }
110}
111
114{
116 {
119 }
120 RECT rcPosition = { pPt ? pPt->x : CW_USEDEFAULT, pPt ? pPt->y : CW_USEDEFAULT, 0, 0 };
123 if (!Create(NULL, rcPosition, Path, Style, ExStyle))
124 {
125 ERR("StubWindow32 creation failed\n");
126 return E_FAIL;
127 }
129 return S_OK;
130}
131
135 _Outptr_ LPITEMIDLIST *ppidl)
136{
137 if (!pidl)
138 {
139 *ppidl = NULL;
140 return S_OK;
141 }
142 *ppidl = ILClone(pidl);
143 return (*ppidl ? S_OK : E_OUTOFMEMORY);
144}
145
147{
148 if (pszPath[0] != L'.')
149 return FALSE;
150 return !pszPath[1] || (pszPath[1] == L'.' && !pszPath[2]);
151}
152
153#define PATH_VALID_ELEMENT ( \
154 PATH_CHAR_CLASS_DOT | PATH_CHAR_CLASS_SEMICOLON | PATH_CHAR_CLASS_COMMA | \
155 PATH_CHAR_CLASS_SPACE | PATH_CHAR_CLASS_OTHER_VALID \
156)
157
159{
160 if (!*pszPath || PathIsDotOrDotDotW(pszPath))
161 return FALSE;
162
163 for (LPCWSTR pch = pszPath; *pch; ++pch)
164 {
166 return FALSE;
167 }
168
169 return TRUE;
170}
171
173{
177
178 if (lstrcmpiW(szPath, L"NUL") == 0 || lstrcmpiW(szPath, L"PRN") == 0 ||
179 lstrcmpiW(szPath, L"CON") == 0 || lstrcmpiW(szPath, L"AUX") == 0)
180 {
181 return TRUE;
182 }
183
184 if (_wcsnicmp(szPath, L"LPT", 3) == 0 || _wcsnicmp(szPath, L"COM", 3) == 0)
185 {
186 if ((L'0' <= szPath[3] && szPath[3] <= L'9') && szPath[4] == UNICODE_NULL)
187 return TRUE;
188 }
189
190 return FALSE;
191}
192
194{
195 LPITEMIDLIST pidlOld = *ppidl;
196 if (!pidlOld)
197 {
198 *ppidl = pidl;
199 return S_OK;
200 }
201
202 HRESULT hr = SHILCombine(*ppidl, pidl, ppidl);
203 ILFree(pidlOld);
204 ILFree(pidl);
205 return hr;
206}
207
208/*************************************************************************
209 * SHShouldShowWizards [SHELL32.237]
210 *
211 * Used by printer and network features.
212 * @see https://undoc.airesoft.co.uk/shell32.dll/SHShouldShowWizards.php
213 */
217{
218 HRESULT hr;
219 IShellBrowser *pBrowser;
220
221 hr = IUnknown_QueryService(pUnknown, SID_STopWindow, IID_PPV_ARG(IShellBrowser, &pBrowser));
222 if (FAILED(hr))
223 return hr;
224
227 if (state.fWebView &&
228 !SHRegGetBoolUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
229 L"ShowWizardsTEST", FALSE, FALSE))
230 {
231 hr = S_FALSE;
232 }
233
234 pBrowser->Release();
235 return hr;
236}
237
238static BOOL
242{
243 BOOL ret;
244
245 if (phToken == NULL)
246 {
248 return FALSE;
249 }
250
251 *phToken = NULL;
252
254 if (!ret && GetLastError() == ERROR_NO_TOKEN)
256
257 return ret;
258}
259
261{
263 if (!pBindCtx || FAILED(pBindCtx->GetObjectParam(const_cast<LPWSTR>(pszName), &punk)))
264 return FALSE;
265 return TRUE;
266}
267
269{
270 if (!pbc)
271 return dwDefault;
272
273 BIND_OPTS BindOpts = { sizeof(BindOpts) };
274 HRESULT hr = pbc->GetBindOptions(&BindOpts);
275 if (FAILED(hr))
276 return dwDefault;
277
278 return BindOpts.grfMode;
279}
280
282{
283 if (!pbc)
284 return FALSE;
285
286 BIND_OPTS BindOps = { sizeof(BindOps) };
287 if (SUCCEEDED(pbc->GetBindOptions(&BindOps)) && BindOps.grfFlags == OLECONTF_LINKS)
288 return TRUE;
289
290 return pclsid && SHSkipJunction(pbc, pclsid);
291}
292
294{
297
298 if (!pBindCtx || FAILED(pBindCtx->GetObjectParam((LPWSTR)STR_FILE_SYS_BIND_DATA, &punk)))
299 return S_FALSE;
300
302 return S_FALSE;
303
304 if (pFindData)
305 pBindData->GetFindData(pFindData);
306
307 return S_OK;
308}
309
311{
313
314 switch (code)
315 {
318 case ERROR_CANCELLED:
319 return TRUE;
320
321 default:
323 }
324}
325
328 _In_opt_ IShellFolder *pShellFolder,
329 _In_ LPCITEMIDLIST pidl,
330 _In_opt_ IBindCtx *pBindCtx,
332 _Out_ void **ppvObj)
333{
334 CComPtr<IShellFolder> psfDesktop;
335
336 *ppvObj = NULL;
337
338 if (!pShellFolder)
339 {
340 SHGetDesktopFolder(&psfDesktop);
341 if (!psfDesktop)
342 return E_FAIL;
343
344 pShellFolder = psfDesktop;
345 }
346
347 HRESULT hr;
348 if (_ILIsDesktop(pidl))
349 hr = pShellFolder->QueryInterface(riid, ppvObj);
350 else
351 hr = pShellFolder->BindToObject(pidl, pBindCtx, riid, ppvObj);
352
353 if (SUCCEEDED(hr) && !*ppvObj)
354 hr = E_FAIL;
355
356 return hr;
357}
358
362 _In_ LPCITEMIDLIST pidl,
364 _Out_ void **ppvObj)
365{
366 return SHBindToObjectEx(psf, pidl, NULL, riid, ppvObj);
367}
368
373 _In_ REFIID riid, _Out_ void **ppvObj)
374{
375 if (!ppvObj)
376 return E_INVALIDARG;
377 *ppvObj = NULL;
378 IShellFolder *psf;
379 PCUITEMID_CHILD pidlChild;
380 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlChild);
381 if (SUCCEEDED(hr))
382 {
383 hr = psf->GetUIObjectOf(hWnd, 1, &pidlChild, riid, NULL, ppvObj);
384 psf->Release();
385 if (SUCCEEDED(hr))
386 {
387 if (*ppvObj)
388 return hr;
389 hr = E_FAIL;
390 }
391 }
392 return hr;
393}
394
398 _In_ LPCITEMIDLIST pidl,
400 _Out_ PWSTR *ppStr)
401{
402 HRESULT hr;
403 CComPtr<IShellFolder> psfRoot;
404 if (!psf)
405 {
406 PCUITEMID_CHILD pidlChild;
407 hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfRoot), &pidlChild);
408 if (FAILED(hr))
409 return hr;
410 psf = psfRoot;
411 pidl = pidlChild;
412 }
413 STRRET sr;
414 hr = psf->GetDisplayNameOf((PCUITEMID_CHILD)pidl, Flags, &sr);
415 return SUCCEEDED(hr) ? StrRetToStrW(&sr, pidl, ppStr) : hr;
416}
417
418/***********************************************************************
419 * DisplayNameOfW [SHELL32.757] (Vista+)
420 */
423 _In_ IShellFolder *psf,
424 _In_ LPCITEMIDLIST pidl,
426 _Out_ LPWSTR pszBuf,
428{
429 *pszBuf = UNICODE_NULL;
430 STRRET sr;
431 HRESULT hr = psf->GetDisplayNameOf(pidl, dwFlags, &sr);
432 if (FAILED(hr))
433 return hr;
434 return StrRetToBufW(&sr, pidl, pszBuf, cchBuf);
435}
436
437DWORD
439{
440 LPCITEMIDLIST pidlLast = pidl;
441 IShellFolder *release = NULL;
442
443 if (!psf)
444 {
445 SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlLast);
446 if (!psf)
447 return 0;
448 release = psf;
449 }
450
451 DWORD oldAttrs = dwAttributes;
452 if (FAILED(psf->GetAttributesOf(1, &pidlLast, &dwAttributes)))
453 dwAttributes = 0;
454 else
455 dwAttributes &= oldAttrs;
456
457 if ((dwAttributes & SFGAO_FOLDER) &&
458 (dwAttributes & SFGAO_STREAM) &&
459 !(dwAttributes & SFGAO_STORAGEANCESTOR) &&
460 (oldAttrs & SFGAO_STORAGEANCESTOR) &&
461 (SHGetObjectCompatFlags(psf, NULL) & 0x200))
462 {
463 dwAttributes &= ~(SFGAO_STREAM | SFGAO_STORAGEANCESTOR);
464 dwAttributes |= SFGAO_STORAGEANCESTOR;
465 }
466
467 if (release)
468 release->Release();
469 return dwAttributes;
470}
471
473{
474 IShellLink *pSL;
475 HRESULT hr = SHBindToObject(NULL, pidl, IID_PPV_ARG(IShellLink, &pSL));
476 if (SUCCEEDED(hr))
477 {
478 hr = pSL->GetIDList(ppidl); // Note: Returns S_FALSE if no target pidl
479 pSL->Release();
480 }
481 return hr;
482}
483
485{
487 if (FAILED(hr))
489 return hr;
490}
491
494 _In_ LPCITEMIDLIST pidl,
496 _Out_opt_ LPWSTR pszText,
498 _Inout_opt_ DWORD *pdwAttributes)
499{
500 if (pszText)
501 *pszText = UNICODE_NULL;
502
504
505 CComPtr<IShellFolder> psfFolder;
506 LPCITEMIDLIST ppidlLast;
507 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfFolder), &ppidlLast);
508 if (SUCCEEDED(hr))
509 {
510 if (pszText)
511 hr = DisplayNameOfW(psfFolder, ppidlLast, dwFlags, pszText, cchBuf);
512
513 if (SUCCEEDED(hr))
514 {
515 if (pdwAttributes)
516 *pdwAttributes = SHGetAttributes(psfFolder, ppidlLast, *pdwAttributes);
517 }
518 }
519
520 if (SUCCEEDED(hrCoInit))
522
523 return hr;
524}
525
528{
529 HWND hWnd = NULL;
530
532 if (pBindCtx && SUCCEEDED(pBindCtx->GetObjectParam((LPWSTR)L"UI During Binding", &punk)))
534
535 return hWnd;
536}
537
539{
540protected:
543
544public:
546 virtual ~CDummyOleWindow() { }
547
548 // IUnknown methods
550 {
551 static const QITAB c_tab[] =
552 {
554 { NULL }
555 };
556 return ::QISearch(this, c_tab, riid, ppvObj);
557 }
559 {
560 return ++m_cRefs;
561 }
563 {
564 if (--m_cRefs == 0)
565 {
566 delete this;
567 return 0;
568 }
569 return m_cRefs;
570 }
571
572 // IOleWindow methods
573 STDMETHODIMP GetWindow(HWND *phWnd) override
574 {
575 *phWnd = m_hWnd;
576 if (!m_hWnd)
577 return E_NOTIMPL;
578 return S_OK;
579 }
581 {
582 return E_NOTIMPL;
583 }
584};
585
588 _In_ IBindCtx *pBindCtx,
589 _In_ LPOLESTR pszKey,
591 _Out_ LPBC *ppbc)
592{
593 HRESULT hr = S_OK;
595
596 *ppbc = pBindCtx;
597
598 if (pBindCtx)
599 {
600 pBindCtx->AddRef();
601 }
602 else
603 {
604 hr = CreateBindCtx(0, ppbc);
605 if (FAILED(hr))
606 return hr;
607 }
608
609 if (!punk)
610 punk = pUnknown = new CDummyOleWindow();
611
612 hr = (*ppbc)->RegisterObjectParam(pszKey, punk);
613
614 if (pUnknown)
615 pUnknown->Release();
616
617 if (FAILED(hr))
618 {
619 (*ppbc)->Release();
620 *ppbc = NULL;
621 }
622
623 return hr;
624}
625
626/*************************************************************************
627 * SHSetFolderPathA (SHELL32.231)
628 *
629 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shsetfolderpatha
630 */
634 _In_ INT csidl,
635 _In_ HANDLE hToken,
637 _In_ LPCSTR pszPath)
638{
639 TRACE("(%d, %p, 0x%X, %s)\n", csidl, hToken, dwFlags, debugstr_a(pszPath));
640 CStringW strPathW(pszPath);
641 return SHSetFolderPathW(csidl, hToken, dwFlags, strPathW);
642}
643
644/*************************************************************************
645 * PathIsSlowA (SHELL32.240)
646 *
647 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj/nf-shlobj-pathisslowa
648 */
652 _In_ LPCSTR pszFile,
653 _In_ DWORD dwAttr)
654{
655 TRACE("(%s, 0x%X)\n", debugstr_a(pszFile), dwAttr);
656 CStringW strFileW(pszFile);
657 return PathIsSlowW(strFileW, dwAttr);
658}
659
660/*************************************************************************
661 * ExtractIconResInfoA (SHELL32.221)
662 */
666 _In_ HANDLE hHandle,
668 _In_ WORD wIndex,
669 _Out_ LPWORD lpSize,
670 _Out_ LPHANDLE lpIcon)
671{
672 TRACE("(%p, %s, %u, %p, %p)\n", hHandle, debugstr_a(lpFileName), wIndex, lpSize, lpIcon);
673
674 if (!lpFileName)
675 return 0;
676
677 CStringW strFileNameW(lpFileName);
678 return ExtractIconResInfoW(hHandle, strFileNameW, wIndex, lpSize, lpIcon);
679}
680
681/*************************************************************************
682 * ShortSizeFormatW (SHELL32.204)
683 */
687 _In_ DWORD dwNumber,
688 _Out_writes_(0x8FFF) LPWSTR pszBuffer)
689{
690 TRACE("(%lu, %p)\n", dwNumber, pszBuffer);
691 return StrFormatByteSizeW(dwNumber, pszBuffer, 0x8FFF);
692}
693
694/*************************************************************************
695 * SHOpenEffectiveToken (SHELL32.235)
696 */
698{
699 TRACE("%p\n", phToken);
701}
702
703/*************************************************************************
704 * SHGetUserSessionId (SHELL32.248)
705 */
707{
708 DWORD dwSessionId, dwLength;
709 BOOL bOpenToken = FALSE;
710
711 TRACE("%p\n", hToken);
712
713 if (!hToken)
714 bOpenToken = SHOpenEffectiveToken(&hToken);
715
716 if (!hToken ||
717 !GetTokenInformation(hToken, TokenSessionId, &dwSessionId, sizeof(dwSessionId), &dwLength))
718 {
719 dwSessionId = 0;
720 }
721
722 if (bOpenToken)
723 CloseHandle(hToken);
724
725 return dwSessionId;
726}
727
728/*************************************************************************
729 * SHInvokePrivilegedFunctionW (SHELL32.246)
730 */
734 _In_ LPCWSTR pszName,
737{
738 TRACE("(%s %p %p)\n", debugstr_w(pszName), fn, lParam);
739
740 if (!pszName || !fn)
741 return E_INVALIDARG;
742
743 HANDLE hToken = NULL;
744 TOKEN_PRIVILEGES NewPriv, PrevPriv;
745 BOOL bAdjusted = FALSE;
746
747 if (SHOpenEffectiveToken(&hToken) &&
748 ::LookupPrivilegeValueW(NULL, pszName, &NewPriv.Privileges[0].Luid))
749 {
750 NewPriv.PrivilegeCount = 1;
752
753 DWORD dwReturnSize;
754 bAdjusted = ::AdjustTokenPrivileges(hToken, FALSE, &NewPriv,
755 sizeof(PrevPriv), &PrevPriv, &dwReturnSize);
756 }
757
758 HRESULT hr = fn(lParam);
759
760 if (bAdjusted)
761 ::AdjustTokenPrivileges(hToken, FALSE, &PrevPriv, 0, NULL, NULL);
762
763 if (hToken)
764 ::CloseHandle(hToken);
765
766 return hr;
767}
768
769/*************************************************************************
770 * SHTestTokenPrivilegeW (SHELL32.236)
771 *
772 * @see http://undoc.airesoft.co.uk/shell32.dll/SHTestTokenPrivilegeW.php
773 */
777 _In_opt_ HANDLE hToken,
779{
780 LUID Luid;
782 PTOKEN_PRIVILEGES pTokenPriv;
783 HANDLE hNewToken = NULL;
784 BOOL ret = FALSE;
785
786 TRACE("(%p, %s)\n", hToken, debugstr_w(lpName));
787
788 if (!lpName)
789 return FALSE;
790
791 if (!hToken)
792 {
793 if (!SHOpenEffectiveToken(&hNewToken))
794 goto Quit;
795
796 if (!hNewToken)
797 return FALSE;
798
799 hToken = hNewToken;
800 }
801
802 if (!LookupPrivilegeValueW(NULL, lpName, &Luid))
803 return FALSE;
804
805 dwLength = 0;
807 goto Quit;
808
810 if (!pTokenPriv)
811 goto Quit;
812
813 if (GetTokenInformation(hToken, TokenPrivileges, pTokenPriv, dwLength, &dwLength))
814 {
815 UINT iPriv, cPrivs;
816 cPrivs = pTokenPriv->PrivilegeCount;
817 for (iPriv = 0; !ret && iPriv < cPrivs; ++iPriv)
818 {
819 ret = RtlEqualLuid(&Luid, &pTokenPriv->Privileges[iPriv].Luid);
820 }
821 }
822
823 LocalFree(pTokenPriv);
824
825Quit:
826 if (hToken == hNewToken)
827 CloseHandle(hNewToken);
828
829 return ret;
830}
831
833{
835}
836
837/*************************************************************************
838 * IsSuspendAllowed (SHELL32.53)
839 */
841{
842 TRACE("()\n");
844}
845
846/*************************************************************************
847 * SHGetShellStyleHInstance (SHELL32.749)
848 */
850WINAPI
852{
855 HRESULT hr;
856 CStringW strShellStyle;
857
858 TRACE("SHGetShellStyleHInstance called\n");
859
860 /* First, attempt to load the shellstyle dll from the current active theme */
862 if (FAILED(hr))
863 goto DoDefault;
864
865 /* Strip the theme filename */
867
868 strShellStyle = szPath;
869 strShellStyle += L"\\Shell\\";
870 strShellStyle += szColorName;
871 strShellStyle += L"\\ShellStyle.dll";
872
874 if (hInst)
875 return hInst;
876
877 /* Otherwise, use the version stored in the System32 directory */
878DoDefault:
879 if (!ExpandEnvironmentStringsW(L"%SystemRoot%\\System32\\ShellStyle.dll",
881 {
882 ERR("Expand failed\n");
883 return NULL;
884 }
886}
887
888/*************************************************************************
889 * SHCreatePropertyBag (SHELL32.715)
890 */
892WINAPI
894{
896}
897
898// The helper function for SHGetUnreadMailCountW
899static DWORD
901 _In_ HKEY hKey,
902 _Out_opt_ PDWORD pdwCount,
903 _Out_opt_ PFILETIME pFileTime,
904 _Out_writes_opt_(cchShellExecuteCommand) LPWSTR pszShellExecuteCommand,
905 _In_ INT cchShellExecuteCommand)
906{
907 DWORD dwType, dwCount, cbSize = sizeof(dwCount);
908 DWORD error = SHQueryValueExW(hKey, L"MessageCount", 0, &dwType, &dwCount, &cbSize);
909 if (error)
910 return error;
911 if (pdwCount && dwType == REG_DWORD)
912 *pdwCount = dwCount;
913
914 FILETIME FileTime;
915 cbSize = sizeof(FileTime);
916 error = SHQueryValueExW(hKey, L"TimeStamp", 0, &dwType, &FileTime, &cbSize);
917 if (error)
918 return error;
919 if (pFileTime && dwType == REG_BINARY)
920 *pFileTime = FileTime;
921
922 WCHAR szName[2 * MAX_PATH];
923 cbSize = sizeof(szName);
924 error = SHQueryValueExW(hKey, L"Application", 0, &dwType, szName, &cbSize);
925 if (error)
926 return error;
927
928 if (pszShellExecuteCommand && dwType == REG_SZ &&
929 FAILED(StringCchCopyW(pszShellExecuteCommand, cchShellExecuteCommand, szName)))
930 {
932 }
933
934 return ERROR_SUCCESS;
935}
936
937/*************************************************************************
938 * SHGetUnreadMailCountW [SHELL32.320]
939 *
940 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shgetunreadmailcountw
941 */
945 _In_opt_ HKEY hKeyUser,
946 _In_opt_ PCWSTR pszMailAddress,
947 _Out_opt_ PDWORD pdwCount,
948 _Inout_opt_ PFILETIME pFileTime,
949 _Out_writes_opt_(cchShellExecuteCommand) PWSTR pszShellExecuteCommand,
950 _In_ INT cchShellExecuteCommand)
951{
953 HKEY hKey;
954
955 if (!hKeyUser)
956 hKeyUser = HKEY_CURRENT_USER;
957
958 if (pszMailAddress)
959 {
960 CStringW strKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail";
961 strKey += L'\\';
962 strKey += pszMailAddress;
963
964 error = RegOpenKeyExW(hKeyUser, strKey, 0, KEY_QUERY_VALUE, &hKey);
965 if (error)
967
968 error = SHELL_ReadSingleUnreadMailCount(hKey, pdwCount, pFileTime,
969 pszShellExecuteCommand, cchShellExecuteCommand);
970 }
971 else
972 {
973 if (pszShellExecuteCommand || cchShellExecuteCommand)
974 return E_INVALIDARG;
975
976 *pdwCount = 0;
977
978 error = RegOpenKeyExW(hKeyUser, L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
980 if (error)
982
983 for (DWORD dwIndex = 0; !error; ++dwIndex)
984 {
985 WCHAR Name[2 * MAX_PATH];
987 FILETIME LastWritten;
988 error = RegEnumKeyExW(hKey, dwIndex, Name, &cchName, NULL, NULL, NULL, &LastWritten);
989 if (error)
990 break;
991
992 HKEY hSubKey;
993 error = RegOpenKeyExW(hKey, Name, 0, KEY_QUERY_VALUE, &hSubKey);
994 if (error)
995 break;
996
997 FILETIME FileTime;
998 DWORD dwCount;
999 error = SHELL_ReadSingleUnreadMailCount(hSubKey, &dwCount, &FileTime, NULL, 0);
1000 if (!error && (!pFileTime || CompareFileTime(&FileTime, pFileTime) >= 0))
1001 *pdwCount += dwCount;
1002
1003 RegCloseKey(hSubKey);
1004 }
1005
1008 }
1009
1011
1012 return error ? HRESULT_FROM_WIN32(error) : S_OK;
1013}
1014
1015/*************************************************************************
1016 * SHSetUnreadMailCountW [SHELL32.336]
1017 *
1018 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shsetunreadmailcountw
1019 */
1023 _In_ PCWSTR pszMailAddress,
1024 _In_ DWORD dwCount,
1025 _In_ PCWSTR pszShellExecuteCommand)
1026{
1027 CString strKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\";
1028 strKey += pszMailAddress;
1029
1030 HKEY hKey;
1031 DWORD dwDisposition;
1033 &hKey, &dwDisposition);
1034 if (error)
1035 return HRESULT_FROM_WIN32(error);
1036
1037 error = RegSetValueExW(hKey, L"MessageCount", 0, REG_DWORD, (PBYTE)&dwCount, sizeof(dwCount));
1038 if (error)
1039 {
1041 return HRESULT_FROM_WIN32(error);
1042 }
1043
1044 FILETIME FileTime;
1045 GetSystemTimeAsFileTime(&FileTime);
1046
1047 error = RegSetValueExW(hKey, L"TimeStamp", 0, REG_BINARY, (PBYTE)&FileTime, sizeof(FileTime));
1048 if (error)
1049 {
1051 return HRESULT_FROM_WIN32(error);
1052 }
1053
1054 WCHAR szBuff[2 * MAX_PATH];
1055 if (!PathUnExpandEnvStringsW(pszShellExecuteCommand, szBuff, _countof(szBuff)))
1056 {
1057 HRESULT hr = StringCchCopyW(szBuff, _countof(szBuff), pszShellExecuteCommand);
1059 {
1061 return hr;
1062 }
1063 }
1064
1065 DWORD cbValue = (lstrlenW(szBuff) + 1) * sizeof(WCHAR);
1066 error = RegSetValueExW(hKey, L"Application", 0, REG_SZ, (PBYTE)szBuff, cbValue);
1067
1069 return (error ? HRESULT_FROM_WIN32(error) : S_OK);
1070}
1071
1072/*************************************************************************
1073 * SheRemoveQuotesA (SHELL32.@)
1074 */
1076WINAPI
1078{
1079 PCHAR pch;
1080
1081 if (*psz == '"')
1082 {
1083 for (pch = psz + 1; *pch && *pch != '"'; ++pch)
1084 {
1085 *(pch - 1) = *pch;
1086 }
1087
1088 if (*pch == '"')
1089 *(pch - 1) = ANSI_NULL;
1090 }
1091
1092 return psz;
1093}
1094
1095/*************************************************************************
1096 * SheRemoveQuotesW (SHELL32.@)
1097 *
1098 * ExtractAssociatedIconExW uses this function.
1099 */
1101WINAPI
1103{
1104 PWCHAR pch;
1105
1106 if (*psz == L'"')
1107 {
1108 for (pch = psz + 1; *pch && *pch != L'"'; ++pch)
1109 {
1110 *(pch - 1) = *pch;
1111 }
1112
1113 if (*pch == L'"')
1114 *(pch - 1) = UNICODE_NULL;
1115 }
1116
1117 return psz;
1118}
1119
1120/*************************************************************************
1121 * SHEnumerateUnreadMailAccountsW [SHELL32.287]
1122 *
1123 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shenumerateunreadmailaccountsw
1124 */
1128 _In_opt_ HKEY hKeyUser,
1129 _In_ DWORD dwIndex,
1130 _Out_writes_(cchMailAddress) PWSTR pszMailAddress,
1131 _In_ INT cchMailAddress)
1132{
1133 if (!hKeyUser)
1134 hKeyUser = HKEY_CURRENT_USER;
1135
1136 HKEY hKey;
1137 LSTATUS error = RegOpenKeyExW(hKeyUser,
1138 L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
1140 if (error)
1141 return HRESULT_FROM_WIN32(error);
1142
1143 FILETIME FileTime;
1144 error = RegEnumKeyExW(hKey, dwIndex, pszMailAddress, (PDWORD)&cchMailAddress, NULL, NULL,
1145 NULL, &FileTime);
1146 if (error)
1147 *pszMailAddress = UNICODE_NULL;
1148
1150 return error ? HRESULT_FROM_WIN32(error) : S_OK;
1151}
1152
1153/*************************************************************************
1154 * SHFindComputer [SHELL32.91]
1155 *
1156 * Invokes the shell search in My Computer. Used in SHFindFiles.
1157 * Two parameters are ignored.
1158 */
1160WINAPI
1162{
1163 UNREFERENCED_PARAMETER(pidlRoot);
1164 UNREFERENCED_PARAMETER(pidlSavedSearch);
1165
1166 TRACE("%p %p\n", pidlRoot, pidlSavedSearch);
1167
1168 IContextMenu *pCM;
1169 HRESULT hr = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER,
1170 IID_IContextMenu, (void **)&pCM);
1171 if (FAILED(hr))
1172 {
1173 ERR("0x%08X\n", hr);
1174 return hr;
1175 }
1176
1177 CMINVOKECOMMANDINFO InvokeInfo = { sizeof(InvokeInfo) };
1178 InvokeInfo.lpParameters = "{996E1EB1-B524-11D1-9120-00A0C98BA67D}";
1179 InvokeInfo.nShow = SW_SHOWNORMAL;
1180 hr = pCM->InvokeCommand(&InvokeInfo);
1181 pCM->Release();
1182
1183 return SUCCEEDED(hr);
1184}
1185
1186static HRESULT
1188 _In_ LONGLONG llValue,
1189 _Out_writes_(cchValue) LPWSTR pszValue,
1190 _In_ UINT cchValue)
1191{
1192 WCHAR szBuff[40];
1193 UINT ich = 0, ichValue;
1194#if (WINVER >= _WIN32_WINNT_VISTA)
1195 BOOL bMinus = (llValue < 0);
1196
1197 if (bMinus)
1198 llValue = -llValue;
1199#endif
1200
1201 if (cchValue <= 0)
1202 return E_FAIL;
1203
1204 do
1205 {
1206 szBuff[ich++] = (WCHAR)(L'0' + (llValue % 10));
1207 llValue /= 10;
1208 } while (llValue != 0 && ich < _countof(szBuff) - 1);
1209
1210#if (WINVER >= _WIN32_WINNT_VISTA)
1211 if (bMinus && ich < _countof(szBuff))
1212 szBuff[ich++] = '-';
1213#endif
1214
1215 for (ichValue = 0; ich > 0 && ichValue < cchValue; ++ichValue)
1216 {
1217 --ich;
1218 pszValue[ichValue] = szBuff[ich];
1219 }
1220
1221 if (ichValue >= cchValue)
1222 {
1223 pszValue[cchValue - 1] = UNICODE_NULL;
1224 return E_FAIL;
1225 }
1226
1227 pszValue[ichValue] = UNICODE_NULL;
1228 return S_OK;
1229}
1230
1231static VOID
1233 _Out_ NUMBERFMTW *pDest,
1234 _In_opt_ const NUMBERFMTW *pSrc,
1235 _In_ DWORD dwNumberFlags,
1236 _Out_writes_(cchDecimal) LPWSTR pszDecimal,
1237 _In_ INT cchDecimal,
1238 _Out_writes_(cchThousand) LPWSTR pszThousand,
1239 _In_ INT cchThousand)
1240{
1241 WCHAR szBuff[20];
1242
1243 if (pSrc)
1244 *pDest = *pSrc;
1245 else
1246 dwNumberFlags = 0;
1247
1248 if (!(dwNumberFlags & FMT_USE_NUMDIGITS))
1249 {
1251 pDest->NumDigits = StrToIntW(szBuff);
1252 }
1253
1254 if (!(dwNumberFlags & FMT_USE_LEADZERO))
1255 {
1257 pDest->LeadingZero = StrToIntW(szBuff);
1258 }
1259
1260 if (!(dwNumberFlags & FMT_USE_GROUPING))
1261 {
1263 pDest->Grouping = StrToIntW(szBuff);
1264 }
1265
1266 if (!(dwNumberFlags & FMT_USE_DECIMAL))
1267 {
1268 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, pszDecimal, cchDecimal);
1269 pDest->lpDecimalSep = pszDecimal;
1270 }
1271
1272 if (!(dwNumberFlags & FMT_USE_THOUSAND))
1273 {
1274 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, pszThousand, cchThousand);
1275 pDest->lpThousandSep = pszThousand;
1276 }
1277
1278 if (!(dwNumberFlags & FMT_USE_NEGNUMBER))
1279 {
1281 pDest->NegativeOrder = StrToIntW(szBuff);
1282 }
1283}
1284
1285/*************************************************************************
1286 * Int64ToString [SHELL32.209]
1287 *
1288 * @see http://undoc.airesoft.co.uk/shell32.dll/Int64ToString.php
1289 */
1291INT WINAPI
1293 _In_ LONGLONG llValue,
1294 _Out_writes_(cchOut) LPWSTR pszOut,
1295 _In_ UINT cchOut,
1296 _In_ BOOL bUseFormat,
1297 _In_opt_ const NUMBERFMTW *pNumberFormat,
1298 _In_ DWORD dwNumberFlags)
1299{
1300 INT ret;
1301 NUMBERFMTW NumFormat;
1302 WCHAR szValue[80], szDecimalSep[6], szThousandSep[6];
1303
1304 Int64ToStr(llValue, szValue, _countof(szValue));
1305
1306 if (bUseFormat)
1307 {
1308 Int64GetNumFormat(&NumFormat, pNumberFormat, dwNumberFlags,
1309 szDecimalSep, _countof(szDecimalSep),
1310 szThousandSep, _countof(szThousandSep));
1311 ret = GetNumberFormatW(LOCALE_USER_DEFAULT, 0, szValue, &NumFormat, pszOut, cchOut);
1312 if (ret)
1313 --ret;
1314 return ret;
1315 }
1316
1317 if (FAILED(StringCchCopyW(pszOut, cchOut, szValue)))
1318 return 0;
1319
1320 return lstrlenW(pszOut);
1321}
1322
1323/*************************************************************************
1324 * LargeIntegerToString [SHELL32.210]
1325 *
1326 * @see http://undoc.airesoft.co.uk/shell32.dll/LargeIntegerToString.php
1327 */
1329INT WINAPI
1331 _In_ const LARGE_INTEGER *pLargeInt,
1332 _Out_writes_(cchOut) LPWSTR pszOut,
1333 _In_ UINT cchOut,
1334 _In_ BOOL bUseFormat,
1335 _In_opt_ const NUMBERFMTW *pNumberFormat,
1336 _In_ DWORD dwNumberFlags)
1337{
1338 return Int64ToString(pLargeInt->QuadPart, pszOut, cchOut, bUseFormat,
1339 pNumberFormat, dwNumberFlags);
1340}
1341
1342/*************************************************************************
1343 * CopyStreamUI [SHELL32.726]
1344 *
1345 * Copy a stream to another stream with optional progress display.
1346 */
1350 _In_ IStream *pSrc,
1351 _Out_ IStream *pDst,
1352 _Inout_opt_ IProgressDialog *pProgress,
1353 _In_opt_ DWORDLONG dwlSize)
1354{
1355 HRESULT hr = E_FAIL;
1356 DWORD cbBuff, cbRead, dwSizeToWrite;
1357 DWORDLONG cbDone;
1358 LPVOID pBuff;
1359 CComHeapPtr<BYTE> pHeapPtr;
1360 STATSTG Stat;
1361 BYTE abBuff[1024];
1362
1363 TRACE("(%p, %p, %p, %I64u)\n", pSrc, pDst, pProgress, dwlSize);
1364
1365 if (dwlSize == 0) // Invalid size?
1366 {
1367 // Get the stream size
1368 ZeroMemory(&Stat, sizeof(Stat));
1369 if (FAILED(pSrc->Stat(&Stat, STATFLAG_NONAME)))
1370 pProgress = NULL; // No size info. Disable progress
1371 else
1372 dwlSize = Stat.cbSize.QuadPart;
1373 }
1374
1375 if (!pProgress) // Progress is disabled?
1376 {
1377 ULARGE_INTEGER uliSize;
1378
1379 if (dwlSize > 0)
1380 uliSize.QuadPart = dwlSize;
1381 else
1382 uliSize.HighPart = uliSize.LowPart = INVALID_FILE_SIZE;
1383
1384 return pSrc->CopyTo(pDst, uliSize, NULL, NULL); // One punch
1385 }
1386
1387 // Allocate the buffer if necessary
1388 if (dwlSize > 0 && dwlSize <= sizeof(abBuff))
1389 {
1390 cbBuff = sizeof(abBuff);
1391 pBuff = abBuff;
1392 }
1393 else
1394 {
1395#define COPY_STREAM_DEFAULT_BUFFER_SIZE 0x4000
1397 if (pHeapPtr.AllocateBytes(cbBuff))
1398 {
1399 pBuff = pHeapPtr;
1400 }
1401 else // Low memory?
1402 {
1403 cbBuff = sizeof(abBuff);
1404 pBuff = abBuff;
1405 }
1406#undef COPY_STREAM_DEFAULT_BUFFER_SIZE
1407 }
1408
1409 // Start reading
1411 zero.QuadPart = 0;
1412 pSrc->Seek(zero, 0, NULL);
1413 pDst->Seek(zero, 0, NULL);
1414 cbDone = 0;
1415 pProgress->SetProgress64(cbDone, dwlSize);
1416
1417 // Repeat reading and writing until goal
1418 for (;;)
1419 {
1420 hr = pSrc->Read(pBuff, cbBuff, &cbRead);
1421 if (FAILED(hr))
1422 break;
1423
1424 // Calculate the size to write
1425 if (dwlSize > 0)
1426 dwSizeToWrite = (DWORD)min((DWORDLONG)(dwlSize - cbDone), (DWORDLONG)cbRead);
1427 else
1428 dwSizeToWrite = cbRead;
1429
1430 if (dwSizeToWrite == 0) // No need to write?
1431 {
1432 hr = S_OK;
1433 break;
1434 }
1435
1436 hr = pDst->Write(pBuff, dwSizeToWrite, NULL);
1437 if (hr != S_OK)
1438 break;
1439
1440 cbDone += dwSizeToWrite;
1441
1442 if (pProgress->HasUserCancelled()) // Cancelled?
1443 {
1445 break;
1446 }
1447 pProgress->SetProgress64(cbDone, dwlSize);
1448
1449 if (dwlSize > 0 && cbDone >= dwlSize) // Reached the goal?
1450 {
1451 hr = S_OK;
1452 break;
1453 }
1454 }
1455
1456 return hr;
1457}
1458
1459/*************************************************************************
1460 * Activate_RunDLL [SHELL32.105]
1461 *
1462 * Unlocks the foreground window and allows the shell window to become the
1463 * foreground window. Every parameter is unused.
1464 */
1468 _In_ HWND hwnd,
1471 _In_ INT cmdshow)
1472{
1473 DWORD dwProcessID;
1474
1478 UNREFERENCED_PARAMETER(cmdshow);
1479
1480 TRACE("(%p, %p, %s, %d)\n", hwnd, hinst, debugstr_w(cmdline), cmdline);
1481
1483 return AllowSetForegroundWindow(dwProcessID);
1484}
1485
1486/*************************************************************************
1487 * SHStartNetConnectionDialogA (SHELL32.12)
1488 *
1489 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shstartnetconnectiondialoga
1490 */
1494 _In_ HWND hwnd,
1495 _In_ LPCSTR pszRemoteName,
1496 _In_ DWORD dwType)
1497{
1498 LPCWSTR pszRemoteNameW = NULL;
1499 CStringW strRemoteNameW;
1500
1501 TRACE("(%p, %s, %lu)\n", hwnd, debugstr_a(pszRemoteName), dwType);
1502
1503 if (pszRemoteName)
1504 {
1505 strRemoteNameW = pszRemoteName;
1506 pszRemoteNameW = strRemoteNameW;
1507 }
1508
1509 return SHStartNetConnectionDialogW(hwnd, pszRemoteNameW, dwType);
1510}
1511
1512/*************************************************************************
1513 * Helper functions for PathIsEqualOrSubFolder
1514 */
1515
1516static INT
1518 _In_ LPCWSTR lpszPath1,
1519 _In_ LPCWSTR lpszPath2,
1520 _Out_ CStringW& strPath)
1521{
1522 SIZE_T cchPath1 = wcslen(lpszPath1);
1523 SIZE_T cchPath2 = wcslen(lpszPath2);
1524 LPWSTR lpszPath = strPath.GetBuffer((INT)max(cchPath1, cchPath2) + 16);
1525 INT ret = PathCommonPrefixW(lpszPath1, lpszPath2, lpszPath);
1526 strPath.ReleaseBuffer();
1527 return ret;
1528}
1529
1532
1533static HRESULT
1535 _In_ LPCITEMIDLIST pidl,
1536 _Out_ CStringW& strPath)
1537{
1538 HRESULT hr;
1539
1540 for (UINT cchPath = MAX_PATH;; cchPath *= 2)
1541 {
1542 LPWSTR lpszPath = strPath.GetBuffer(cchPath);
1543 if (!lpszPath)
1544 return E_OUTOFMEMORY;
1545
1546 hr = SHGetPathCchFromIDListW(pidl, lpszPath, cchPath);
1547 strPath.ReleaseBuffer();
1548
1550 break;
1551
1552 if (cchPath >= MAXUINT / 2)
1553 {
1554 hr = E_FAIL;
1555 break;
1556 }
1557 }
1558
1559 if (FAILED(hr))
1560 strPath.Empty();
1561
1562 return hr;
1563}
1564
1565static HRESULT
1567 _In_ HWND hwndOwner,
1568 _Out_ CStringW& strPath,
1569 _In_ INT nCSIDL,
1571{
1572 LPITEMIDLIST pidl;
1573 HRESULT hr = SHGetSpecialFolderLocation(hwndOwner, nCSIDL, &pidl);
1574 if (SUCCEEDED(hr))
1575 {
1576 hr = DynamicSHGetPathFromIDListW(pidl, strPath);
1577 CoTaskMemFree(pidl);
1578 }
1579
1580 if (FAILED(hr))
1581 strPath.Empty();
1582 else if (bCreate)
1583 CreateDirectoryW(strPath, NULL);
1584
1585 return hr;
1586}
1587
1588static VOID
1590 _Out_ CStringW& strPath)
1591{
1592 INT nLength = strPath.GetLength();
1593 if (nLength > 0 && strPath[nLength - 1] == L'\\')
1594 strPath = strPath.Left(nLength - 1);
1595}
1596
1597/*************************************************************************
1598 * PathIsEqualOrSubFolder (SHELL32.755)
1599 */
1603 _In_ LPCWSTR pszPath1OrCSIDL,
1604 _In_ LPCWSTR pszPath2)
1605{
1606 CStringW strCommon, strPath1;
1607
1608 TRACE("(%s %s)\n", debugstr_w(pszPath1OrCSIDL), debugstr_w(pszPath2));
1609
1610 if (IS_INTRESOURCE(pszPath1OrCSIDL))
1611 {
1613 NULL, strPath1, LOWORD(pszPath1OrCSIDL) | CSIDL_FLAG_DONT_VERIFY, FALSE);
1614 }
1615 else
1616 {
1617 strPath1 = pszPath1OrCSIDL;
1618 }
1619
1621
1622 if (!DynamicPathCommonPrefixW(strPath1, pszPath2, strCommon))
1623 return FALSE;
1624
1625 return strPath1.CompareNoCase(strCommon) == 0;
1626}
1627
1628/*************************************************************************
1629 * SHGetRealIDL [SHELL32.98]
1630 */
1634 _In_ IShellFolder *psf,
1635 _In_ PCUITEMID_CHILD pidlSimple,
1636 _Outptr_ PITEMID_CHILD *ppidlReal)
1637{
1638 HRESULT hr;
1639 STRRET strret;
1641 SFGAOF attrs;
1642
1643 *ppidlReal = NULL;
1644
1645 hr = IShellFolder_GetDisplayNameOf(psf, pidlSimple, SHGDN_INFOLDER | SHGDN_FORPARSING,
1646 &strret, 0);
1648 return hr;
1649
1650 hr = StrRetToBufW(&strret, pidlSimple, szPath, _countof(szPath));
1652 return hr;
1653
1654 attrs = SFGAO_FILESYSTEM;
1655 hr = psf->GetAttributesOf(1, &pidlSimple, &attrs);
1656 if (SUCCEEDED(hr) && !(attrs & SFGAO_FILESYSTEM))
1657 return SHILClone(pidlSimple, ppidlReal);
1658
1659 hr = IShellFolder_ParseDisplayName(psf, NULL, NULL, szPath, NULL, ppidlReal, NULL);
1660 if (hr == E_INVALIDARG || hr == E_NOTIMPL)
1661 return SHILClone(pidlSimple, ppidlReal);
1662
1663 return hr;
1664}
1665
1669 _In_ PCWSTR pszCommandName,
1671{
1672 HRESULT hr;
1674 if (SUCCEEDED(hr = pUnk->QueryInterface(IID_PPV_ARG(IInitializeCommand, &pIC))))
1675 hr = pIC->Initialize(pszCommandName, pPB);
1676 return hr;
1677}
1678
1681 _In_ IExecuteCommand *pEC,
1682 _In_ PCWSTR pszCommandName,
1684 _In_opt_ IShellItemArray *pSIA,
1685 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1686 _In_opt_ IUnknown *pSite)
1687{
1688 if (!pEC)
1689 return E_INVALIDARG;
1690
1691 CScopedSetObjectWithSite site(pEC, pSite);
1692 IUnknown_InitializeCommand(pEC, pszCommandName, pPB);
1693
1695 if (pSIA && SUCCEEDED(pEC->QueryInterface(IID_PPV_ARG(IObjectWithSelection, &pOWS))))
1696 pOWS->SetSelection(pSIA);
1697
1698 DWORD dwKeyState = 0, fMask = pICI ? pICI->fMask : 0;
1699 pEC->SetNoShowUI((fMask & CMIC_MASK_FLAG_NO_UI) != 0);
1700 pEC->SetShowWindow(pICI ? pICI->nShow : SW_SHOW);
1701 if (fMask & CMIC_MASK_SHIFT_DOWN)
1702 dwKeyState |= MK_SHIFT;
1703 if (fMask & CMIC_MASK_CONTROL_DOWN)
1704 dwKeyState |= MK_CONTROL;
1705 pEC->SetKeyState(dwKeyState);
1706 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpDirectoryW)
1707 pEC->SetDirectory(pICI->lpDirectoryW);
1708 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpParametersW)
1709 pEC->SetParameters(pICI->lpParametersW);
1710 if (fMask & CMIC_MASK_PTINVOKE)
1711 pEC->SetPosition(pICI->ptInvoke);
1712
1713 return pEC->Execute();
1714}
1715
1718 _In_ IExecuteCommand *pEC,
1719 _In_ PCWSTR pszCommandName,
1721 _In_ IDataObject *pDO,
1722 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1723 _In_opt_ IUnknown *pSite)
1724{
1726 HRESULT hr = SHCreateShellItemArrayFromDataObject(pDO, IID_PPV_ARG(IShellItemArray, &pSIA));
1727 return SUCCEEDED(hr) ? InvokeIExecuteCommand(pEC, pszCommandName, pPB, pSIA, pICI, pSite) : hr;
1728}
1729
1730static HRESULT
1732{
1733 HRESULT hr = pCM->GetCommandString(Id, GCS & ~GCS_UNICODE, NULL, Buf, cchMax);
1734 if (FAILED(hr))
1735 {
1737 hr = pCM->GetCommandString(Id, GCS | GCS_UNICODE, NULL, (LPSTR)buf, _countof(buf));
1738 if (SUCCEEDED(hr))
1739 hr = SHUnicodeToAnsi(buf, Buf, cchMax) > 0 ? S_OK : E_FAIL;
1740 }
1741 return hr;
1742}
1743
1744UINT
1746{
1747 CHAR buf[MAX_PATH];
1748 if (IS_INTRESOURCE(verba))
1749 {
1750 if (FAILED(GetCommandStringA(pCM, LOWORD(verba), GCS_VERB, buf, _countof(buf))))
1751 return 0;
1752 verba = buf;
1753 }
1754 return MapVerbToDfmCmd(verba); // Returns DFM_CMD_* or 0
1755}
1756
1757HRESULT
1758SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
1759{
1760 LPCSTR pVerbA = pICI->lpVerb;
1761 CHAR buf[MAX_PATH];
1762 LPCMINVOKECOMMANDINFOEX pICIX = (LPCMINVOKECOMMANDINFOEX)pICI;
1763 if (IsUnicode(*pICIX) && !IS_INTRESOURCE(pICIX->lpVerbW))
1764 {
1765 if (SHUnicodeToAnsi(pICIX->lpVerbW, buf, _countof(buf)))
1766 pVerbA = buf;
1767 }
1768
1769 if (IS_INTRESOURCE(pVerbA))
1770 return LOWORD(pVerbA);
1771 for (SIZE_T i = 0; pMap[i].Verb; ++i)
1772 {
1773 assert(SUCCEEDED((int)(pMap[i].CmdId))); // The id must be >= 0 and ideally in the 0..0x7fff range
1774 if (!lstrcmpiA(pMap[i].Verb, pVerbA) && pVerbA[0])
1775 return pMap[i].CmdId;
1776 }
1777 return E_FAIL;
1778}
1779
1780static const CMVERBMAP*
1782{
1783 for (SIZE_T i = 0; pMap[i].Verb; ++i)
1784 {
1785 if (pMap[i].CmdId == CmdId)
1786 return &pMap[i];
1787 }
1788 return NULL;
1789}
1790
1791HRESULT
1793{
1794 const CMVERBMAP* pEntry;
1795 switch (uFlags | GCS_UNICODE)
1796 {
1797 case GCS_VALIDATEW:
1798 case GCS_VERBW:
1799 pEntry = FindVerbMapEntry(CmdId, pMap);
1800 if ((uFlags | GCS_UNICODE) == GCS_VERBW)
1801 {
1802 if (!pEntry)
1803 return E_INVALIDARG;
1804 else if (uFlags & GCS_UNICODE)
1805 return SHAnsiToUnicode(pEntry->Verb, (LPWSTR)Buf, cchBuf) ? S_OK : E_FAIL;
1806 else
1807 return StringCchCopyA(Buf, cchBuf, pEntry->Verb);
1808 }
1809 return pEntry ? S_OK : S_FALSE; // GCS_VALIDATE
1810 }
1811 return E_NOTIMPL;
1812}
1813
1814HRESULT
1816{
1820 return hr;
1821 initIcon->SetNormalIcon(swShell32Name, IconIndex);
1822 return initIcon->QueryInterface(riid, ppvOut);
1823}
1824
1825int DCIA_AddEntry(HDCIA hDCIA, REFCLSID rClsId)
1826{
1827 for (UINT i = 0;; ++i)
1828 {
1829 const CLSID *pClsId = DCIA_GetEntry(hDCIA, i);
1830 if (!pClsId)
1831 break;
1832 if (IsEqualGUID(*pClsId, rClsId))
1833 return i; // Don't allow duplicates
1834 }
1835 return DSA_AppendItem((HDSA)hDCIA, const_cast<CLSID*>(&rClsId));
1836}
1837
1838void DCIA_AddShellExSubkey(HDCIA hDCIA, HKEY hProgId, PCWSTR pszSubkey)
1839{
1840 WCHAR szKey[200];
1841 PathCombineW(szKey, L"shellex", pszSubkey);
1842 HKEY hEnum;
1843 if (RegOpenKeyExW(hProgId, szKey, 0, KEY_READ, &hEnum) != ERROR_SUCCESS)
1844 return;
1845 for (UINT i = 0; RegEnumKeyW(hEnum, i++, szKey, _countof(szKey)) == ERROR_SUCCESS;)
1846 {
1847 CLSID clsid;
1848 if (SUCCEEDED(SHELL_GetShellExtensionRegCLSID(hEnum, szKey, &clsid)))
1849 DCIA_AddEntry(hDCIA, clsid);
1850 }
1851 RegCloseKey(hEnum);
1852}
1853
1854/*************************************************************************
1855 * SHIsBadInterfacePtr [SHELL32.84]
1856 *
1857 * Retired in 6.0 from Windows Vista and higher.
1858 */
1862 _In_ LPCVOID pv,
1863 _In_ UINT_PTR ucb)
1864{
1865 struct CUnknownVtbl
1866 {
1870 };
1871 struct CUnknown { CUnknownVtbl *lpVtbl; };
1872 const CUnknown *punk = reinterpret_cast<const CUnknown *>(pv);
1873 return !punk || IsBadReadPtr(punk, sizeof(punk->lpVtbl)) ||
1874 IsBadReadPtr(punk->lpVtbl, ucb) ||
1875 IsBadCodePtr((FARPROC)punk->lpVtbl->Release);
1876}
1877
1878/*************************************************************************
1879 * SHGetUserDisplayName [SHELL32.241]
1880 *
1881 * @see https://undoc.airesoft.co.uk/shell32.dll/SHGetUserDisplayName.php
1882 */
1886 _Out_writes_to_(*puSize, *puSize) PWSTR pName,
1887 _Inout_ PULONG puSize)
1888{
1889 if (!pName || !puSize)
1890 return E_INVALIDARG;
1891
1892 if (GetUserNameExW(NameDisplay, pName, puSize))
1893 return S_OK;
1894
1895 LONG error = GetLastError(); // for ERROR_NONE_MAPPED
1897
1898 WCHAR UserName[MAX_PATH];
1899 DWORD cchUserName = _countof(UserName);
1900 if (!GetUserNameW(UserName, &cchUserName))
1902
1903 // Was the user name not available in the specified format (NameDisplay)?
1904 if (error == ERROR_NONE_MAPPED)
1905 {
1906 // Try to get the user name by using Network API
1907 PUSER_INFO_2 UserInfo;
1908 DWORD NetError = NetUserGetInfo(NULL, UserName, 2, (PBYTE*)&UserInfo);
1909 if (NetError)
1910 {
1911 hr = HRESULT_FROM_WIN32(NetError);
1912 }
1913 else
1914 {
1915 if (UserInfo->usri2_full_name)
1916 {
1917 hr = StringCchCopyW(pName, *puSize, UserInfo->usri2_full_name);
1918 if (SUCCEEDED(hr))
1919 {
1920 // Include the NUL-terminator
1921 *puSize = lstrlenW(UserInfo->usri2_full_name) + 1;
1922 }
1923 }
1924
1925 NetApiBufferFree(UserInfo);
1926 }
1927 }
1928
1929 if (FAILED(hr))
1930 {
1931 hr = StringCchCopyW(pName, *puSize, UserName);
1932 if (SUCCEEDED(hr))
1933 *puSize = cchUserName;
1934 }
1935
1936 return hr;
1937}
1938
1939// Skip leading backslashes
1940static PCWSTR
1942 _In_ PCWSTR pszPath)
1943{
1944 PCWSTR pch;
1945 for (pch = pszPath; *pch == L'\\'; ++pch)
1946 ;
1947 return pch;
1948}
1949
1950// The registry key for server computer descriptions cache
1951#define COMPUTER_DESCRIPTIONS_KEY \
1952 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComputerDescriptions"
1953
1954// Get server computer description from cache
1955static HRESULT
1957 _Out_writes_z_(cchDescMax) PWSTR pszDesc,
1958 _In_ DWORD cchDescMax,
1959 _In_ PCWSTR pszServerName)
1960{
1961 cchDescMax *= sizeof(WCHAR);
1963 SHELL_SkipServerSlashes(pszServerName), NULL, pszDesc, &cchDescMax);
1964 return HRESULT_FROM_WIN32(error);
1965}
1966
1967// Do cache a server computer description
1968static VOID
1970 _In_ PCWSTR pszServerName,
1971 _In_ PCWSTR pszDesc)
1972{
1973 if (!pszDesc)
1974 return;
1975
1976 SIZE_T cbDesc = (wcslen(pszDesc) + 1) * sizeof(WCHAR);
1978 SHELL_SkipServerSlashes(pszServerName), REG_SZ, pszDesc, (DWORD)cbDesc);
1979}
1980
1981// Get real server computer description
1982static HRESULT
1984 _Out_writes_z_(cchDescMax) PWSTR pszDesc,
1985 _In_ SIZE_T cchDescMax,
1986 _In_ PWSTR pszServerName)
1987{
1989 NET_API_STATUS error = NetServerGetInfo(pszServerName, 101, (PBYTE*)&bufptr);
1992 return hr;
1993
1994 PCWSTR comment = bufptr->sv101_comment;
1995 if (comment && comment[0])
1996 StringCchCopyW(pszDesc, cchDescMax, comment);
1997 else
1998 hr = E_FAIL;
1999
2001 return hr;
2002}
2003
2004// Build computer display name
2005static HRESULT
2007 _Out_writes_z_(cchNameMax) PWSTR pszName,
2008 _In_ DWORD cchNameMax,
2009 _In_ PCWSTR pszServerName,
2010 _In_ PCWSTR pszDescription)
2011{
2012 if (!pszDescription || !*pszDescription)
2013 return E_FAIL;
2014
2015 PCWSTR pszFormat = (SHRestricted(REST_ALLOWCOMMENTTOGGLE) ? L"%2 (%1)" : L"%1 (%2)");
2016 PCWSTR args[] = { pszDescription , SHELL_SkipServerSlashes(pszServerName) };
2018 pszFormat, 0, 0, pszName, cchNameMax, (va_list *)args) ? S_OK : E_FAIL);
2019}
2020
2021/*************************************************************************
2022 * SHGetComputerDisplayNameW [SHELL32.752]
2023 */
2027 _In_opt_ PWSTR pszServerName,
2029 _Out_writes_z_(cchNameMax) PWSTR pszName,
2030 _In_ DWORD cchNameMax)
2031{
2032 WCHAR szDesc[256], szCompName[MAX_COMPUTERNAME_LENGTH + 1];
2033
2034 // If no server name is specified, retrieve the local computer name
2035 if (!pszServerName)
2036 {
2037 // Use computer name as server name
2038 DWORD cchCompName = _countof(szCompName);
2039 if (!GetComputerNameW(szCompName, &cchCompName))
2040 return E_FAIL;
2041 pszServerName = szCompName;
2042
2043 // Don't use the cache for the local machine
2045 }
2046
2047 // Get computer description from cache if necessary
2048 HRESULT hr = E_FAIL;
2049 if (!(dwFlags & SHGCDN_NOCACHE))
2050 hr = SHELL_GetCachedComputerDescription(szDesc, _countof(szDesc), pszServerName);
2051
2052 // Actually retrieve the computer description if it is not in the cache
2053 if (FAILED(hr))
2054 {
2055 hr = SHELL_GetComputerDescription(szDesc, _countof(szDesc), pszServerName);
2056 if (FAILED(hr))
2057 szDesc[0] = UNICODE_NULL;
2058
2059 // Cache the description if necessary
2060 if (!(dwFlags & SHGCDN_NOCACHE))
2061 SHELL_CacheComputerDescription(pszServerName, szDesc);
2062 }
2063
2064 // If getting the computer description failed, store the server name only
2065 if (FAILED(hr) || !szDesc[0])
2066 {
2068 return hr; // Bail out if no server name is requested
2069
2070 StringCchCopyW(pszName, cchNameMax, SHELL_SkipServerSlashes(pszServerName));
2071 return S_OK;
2072 }
2073
2074 // If no server name is requested, store the description only
2076 {
2077 StringCchCopyW(pszName, cchNameMax, szDesc);
2078 return S_OK;
2079 }
2080
2081 // Build a string like "Description (SERVERNAME)"
2082 return SHELL_BuildDisplayMachineName(pszName, cchNameMax, pszServerName, szDesc);
2083}
2084
2085typedef struct tagALIAS_MAPPING
2086{
2087 BYTE bFlagMask; // The combination of ALIAS_USER_FOLDER and/or ALIAS_DESKTOP
2089 WORD nCsidlSrc; // CSIDL_... (source)
2090 WORD nCsidlDest; // CSIDL_... (destination)
2092
2095{
2096 {
2098 FALSE,
2101 },
2102 {
2104 FALSE,
2107 },
2108 {
2110 FALSE,
2113 },
2114 {
2116 TRUE,
2119 }
2120};
2121
2126 _In_opt_ HANDLE hToken,
2127 _In_ LPCITEMIDLIST pidlTarget,
2128 _Out_ LPITEMIDLIST *ppidlNew,
2130{
2131 if (!pidlTarget || !ppidlNew)
2132 return FALSE;
2133
2134 *ppidlNew = NULL;
2135
2136 for (SIZE_T iEntry = 0; iEntry < _countof(g_AliasTable); ++iEntry)
2137 {
2138 const ALIAS_MAPPING *pEntry = &g_AliasTable[iEntry];
2139
2140 if (!(dwFlags & pEntry->bFlagMask))
2141 continue;
2142
2143 // Get the source root PIDL
2144 LPITEMIDLIST pidlSrcRoot = NULL;
2145 HRESULT hr = SHGetFolderLocation(hwnd, pEntry->nCsidlSrc, hToken, 0, &pidlSrcRoot);
2146 if (FAILED(hr))
2147 continue;
2148
2149 // Check whether the input pidlTarget is under the source folder.
2150 // If it matches, ILFindChild returns the relative PIDL in the pidlTarget.
2151 LPCITEMIDLIST pidlRelative = ILFindChild(pidlSrcRoot, pidlTarget);
2152 if (!pidlRelative) // Not found?
2153 {
2154 ILFree(pidlSrcRoot);
2155 continue;
2156 }
2157
2158 // Found. Get the destination root PIDL
2159 LPITEMIDLIST pidlDestRoot = NULL;
2160 hr = SHGetFolderLocation(hwnd, pEntry->nCsidlDest, hToken, 0, &pidlDestRoot);
2161 if (SUCCEEDED(hr))
2162 {
2163 // Create a new PIDL by combining the destination root PIDL and the relative PIDL
2164 *ppidlNew = ILCombine(pidlDestRoot, pidlRelative);
2165 if (*ppidlNew)
2166 {
2167 // Manipulate specific flags in the PIDL if necessary
2168 if (pEntry->bCommonDesktop && (*ppidlNew)->mkid.cb >= 3)
2169 {
2170 (*ppidlNew)->mkid.abID[0] |= (PT_FS | PT_FS_COMMON_FLAG);
2171 }
2172 }
2173 ILFree(pidlDestRoot);
2174 }
2175
2176 ILFree(pidlSrcRoot);
2177 break; // A match was found, so exit the loop
2178 }
2179
2180 return (*ppidlNew != NULL);
2181}
2182
2186 _In_ LPCITEMIDLIST pidl,
2187 _Out_ LPITEMIDLIST *ppidlNew,
2189{
2190 return SHELL32_ReparentAsAliasPidl(NULL, NULL, pidl, ppidlNew, dwFlags) ? S_OK : E_FAIL;
2191}
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
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:549
STDMETHODIMP GetWindow(HWND *phWnd) override
Definition: utils.cpp:573
STDMETHODIMP_(ULONG) Release() override
Definition: utils.cpp:562
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override
Definition: utils.cpp:580
STDMETHODIMP_(ULONG) AddRef() override
Definition: utils.cpp:558
virtual ~CDummyOleWindow()
Definition: utils.cpp:546
bool AllocateBytes(_In_ size_t nBytes)
Definition: atlalloc.h:127
HRESULT CreateStub(UINT Type, LPCWSTR Path, const POINT *pPt)
Definition: utils.cpp:113
static LPCWSTR GetTypePropName()
Definition: precomp.h:233
static HWND FindStubWindow(UINT Type, LPCWSTR Path)
Definition: utils.cpp:100
LPARAM lParam
Definition: combotst.c:139
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
#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
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 ERROR_INVALID_PARAMETER
Definition: compat.h:101
int(* FARPROC)()
Definition: compat.h:36
#define SetLastError(x)
Definition: compat.h:752
#define GetCurrentProcess()
Definition: compat.h:759
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define MAX_PATH
Definition: compat.h:34
#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:90
HINSTANCE WINAPI DECLSPEC_HOTPATCH LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags)
Definition: loader.c:288
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:4265
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4227
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
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
Definition: compobj.c:2002
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
static const WCHAR IconIndex[]
Definition: install.c:52
#define CSTUBWINDOW32_CLASSNAME
Definition: precomp.h:223
EXTERN_C WORD WINAPI ExtractIconResInfoW(_In_ HANDLE hHandle, _In_ LPCWSTR lpFileName, _In_ WORD wIndex, _Out_ LPWORD lpSize, _Out_ LPHANDLE lpIcon)
Definition: stubs.cpp:652
EXTERN_C HRESULT WINAPI SHSetFolderPathW(_In_ INT csidl, _In_ HANDLE hToken, _In_ DWORD dwFlags, _In_ LPCWSTR pszPath)
Definition: stubs.cpp:727
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogW(_In_ HWND hwnd, _In_ LPCWSTR pszRemoteName, _In_ DWORD dwType)
Definition: stubs.cpp:470
EXTERN_C BOOL WINAPI PathIsSlowW(_In_ LPCWSTR pszFile, _In_ DWORD dwAttr)
Definition: stubs.cpp:764
HRESULT SHELL_DisplayNameOf(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_opt_ UINT Flags, _Out_ PWSTR *ppStr)
Definition: utils.cpp:396
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:900
BOOL WINAPI IsSuspendAllowed(VOID)
Definition: utils.cpp:840
HRESULT SHELL_CreateShell32DefaultExtractIcon(int IconIndex, REFIID riid, LPVOID *ppvOut)
Definition: utils.cpp:1815
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:2026
EXTERN_C HRESULT WINAPI SHEnumerateUnreadMailAccountsW(_In_opt_ HKEY hKeyUser, _In_ DWORD dwIndex, _Out_writes_(cchMailAddress) PWSTR pszMailAddress, _In_ INT cchMailAddress)
Definition: utils.cpp:1127
static const CMVERBMAP * FindVerbMapEntry(UINT_PTR CmdId, const CMVERBMAP *pMap)
Definition: utils.cpp:1781
#define PATH_VALID_ELEMENT
Definition: utils.cpp:153
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:944
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:438
static HRESULT SHELL_GetComputerDescription(_Out_writes_z_(cchDescMax) PWSTR pszDesc, _In_ SIZE_T cchDescMax, _In_ PWSTR pszServerName)
Definition: utils.cpp:1983
static VOID DynamicPathRemoveBackslashW(_Out_ CStringW &strPath)
Definition: utils.cpp:1589
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:2124
EXTERN_C WORD WINAPI ExtractIconResInfoA(_In_ HANDLE hHandle, _In_ LPCSTR lpFileName, _In_ WORD wIndex, _Out_ LPWORD lpSize, _Out_ LPHANDLE lpIcon)
Definition: utils.cpp:665
EXTERN_C PSTR WINAPI StrRStrA(_In_ PCSTR pszSrc, _In_opt_ PCSTR pszLast, _In_ PCSTR pszSearch)
Definition: utils.cpp:40
HRESULT SHGetNameAndFlagsW(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_opt_ LPWSTR pszText, _In_ UINT cchBuf, _Inout_opt_ DWORD *pdwAttributes)
Definition: utils.cpp:493
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:133
static const ALIAS_MAPPING g_AliasTable[]
PIDL alias table.
Definition: utils.cpp:2094
static HRESULT GetCommandStringA(_In_ IContextMenu *pCM, _In_ UINT_PTR Id, _In_ UINT GCS, _Out_writes_(cchMax) LPSTR Buf, _In_ UINT cchMax)
Definition: utils.cpp:1731
EXTERN_C BOOL WINAPI PathIsEqualOrSubFolder(_In_ LPCWSTR pszPath1OrCSIDL, _In_ LPCWSTR pszPath2)
Definition: utils.cpp:1602
EXTERN_C HRESULT WINAPI SHGetRealIDL(_In_ IShellFolder *psf, _In_ PCUITEMID_CHILD pidlSimple, _Outptr_ PITEMID_CHILD *ppidlReal)
Definition: utils.cpp:1633
EXTERN_C DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken)
Definition: utils.cpp:706
#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:1232
EXTERN_C BOOL WINAPI SHTestTokenPrivilegeW(_In_opt_ HANDLE hToken, _In_ LPCWSTR lpName)
Definition: utils.cpp:776
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:268
static HRESULT SHELL_BuildDisplayMachineName(_Out_writes_z_(cchNameMax) PWSTR pszName, _In_ DWORD cchNameMax, _In_ PCWSTR pszServerName, _In_ PCWSTR pszDescription)
Definition: utils.cpp:2006
static VOID SHELL_CacheComputerDescription(_In_ PCWSTR pszServerName, _In_ PCWSTR pszDesc)
Definition: utils.cpp:1969
EXTERN_C HRESULT WINAPI SHInvokePrivilegedFunctionW(_In_ LPCWSTR pszName, _In_ PRIVILEGED_FUNCTION fn, _In_opt_ LPARAM lParam)
Definition: utils.cpp:733
BOOL BindCtx_ContainsObject(_In_ IBindCtx *pBindCtx, _In_ LPCWSTR pszName)
Definition: utils.cpp:260
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:293
BOOL PathIsValidElement(_In_ LPCWSTR pszPath)
Definition: utils.cpp:158
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:1680
EXTERN_C LPWSTR WINAPI ShortSizeFormatW(_In_ DWORD dwNumber, _Out_writes_(0x8FFF) LPWSTR pszBuffer)
Definition: utils.cpp:686
static PCSTR StrEndNA(_In_ PCSTR psz, _In_ INT_PTR cch)
Definition: utils.cpp:17
EXTERN_C LPSTR WINAPI SheRemoveQuotesA(LPSTR psz)
Definition: utils.cpp:1077
BOOL Shell_FailForceReturn(_In_ HRESULT hr)
Definition: utils.cpp:310
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:360
void DCIA_AddShellExSubkey(HDCIA hDCIA, HKEY hProgId, PCWSTR pszSubkey)
Definition: utils.cpp:1838
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:1517
EXTERN_C HRESULT IUnknown_InitializeCommand(_In_ IUnknown *pUnk, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB)
Definition: utils.cpp:1667
static HRESULT DynamicSHGetPathFromIDListW(_In_ LPCITEMIDLIST pidl, _Out_ CStringW &strPath)
Definition: utils.cpp:1534
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:1292
EXTERN_C BOOL WINAPI Activate_RunDLL(_In_ HWND hwnd, _In_ HINSTANCE hinst, _In_ LPCWSTR cmdline, _In_ INT cmdshow)
Definition: utils.cpp:1467
EXTERN_C BOOL WINAPI PathIsSlowA(_In_ LPCSTR pszFile, _In_ DWORD dwAttr)
Definition: utils.cpp:651
UINT GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba)
Definition: utils.cpp:1745
HRESULT SHELL_GetCommandStringImpl(SIZE_T CmdId, UINT uFlags, LPSTR Buf, UINT cchBuf, const CMVERBMAP *pMap)
Definition: utils.cpp:1792
EXTERN_C HRESULT WINAPI DisplayNameOfW(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_ LPWSTR pszBuf, _In_ UINT cchBuf)
Definition: utils.cpp:422
EXTERN_C HRESULT WINAPI SHSetUnreadMailCountW(_In_ PCWSTR pszMailAddress, _In_ DWORD dwCount, _In_ PCWSTR pszShellExecuteCommand)
Definition: utils.cpp:1022
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:1330
EXTERN_C HINSTANCE WINAPI SHGetShellStyleHInstance(VOID)
Definition: utils.cpp:851
EXTERN_C HRESULT SHELL_GetUIObjectOfAbsoluteItem(_In_opt_ HWND hWnd, _In_ PCIDLIST_ABSOLUTE pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:370
EXTERN_C PWSTR WINAPI StrRStrW(_In_ PCWSTR pszSrc, _In_opt_ PCWSTR pszLast, _In_ PCWSTR pszSearch)
Definition: utils.cpp:72
static HRESULT SHELL_GetCachedComputerDescription(_Out_writes_z_(cchDescMax) PWSTR pszDesc, _In_ DWORD cchDescMax, _In_ PCWSTR pszServerName)
Definition: utils.cpp:1956
EXTERN_C HRESULT BindCtx_RegisterObjectParam(_In_ IBindCtx *pBindCtx, _In_ LPOLESTR pszKey, _In_opt_ IUnknown *punk, _Out_ LPBC *ppbc)
Definition: utils.cpp:587
EXTERN_C HRESULT WINAPI CopyStreamUI(_In_ IStream *pSrc, _Out_ IStream *pDst, _Inout_opt_ IProgressDialog *pProgress, _In_opt_ DWORDLONG dwlSize)
Definition: utils.cpp:1349
EXTERN_C HRESULT WINAPI SHGetUserDisplayName(_Out_writes_to_(*puSize, *puSize) PWSTR pName, _Inout_ PULONG puSize)
Definition: utils.cpp:1885
#define COMPUTER_DESCRIPTIONS_KEY
Definition: utils.cpp:1951
static BOOL OpenEffectiveToken(_In_ DWORD DesiredAccess, _Out_ HANDLE *phToken)
Definition: utils.cpp:239
EXTERN_C BOOL WINAPI SHFindComputer(LPCITEMIDLIST pidlRoot, LPCITEMIDLIST pidlSavedSearch)
Definition: utils.cpp:1161
static HRESULT Int64ToStr(_In_ LONGLONG llValue, _Out_writes_(cchValue) LPWSTR pszValue, _In_ UINT cchValue)
Definition: utils.cpp:1187
int DCIA_AddEntry(HDCIA hDCIA, REFCLSID rClsId)
Definition: utils.cpp:1825
HRESULT SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
Definition: utils.cpp:1758
EXTERN_C LPWSTR WINAPI SheRemoveQuotesW(LPWSTR psz)
Definition: utils.cpp:1102
EXTERN_C BOOL WINAPI SHIsBadInterfacePtr(_In_ LPCVOID pv, _In_ UINT_PTR ucb)
Definition: utils.cpp:1861
EXTERN_C HRESULT WINAPI SHCreatePropertyBag(_In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:893
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:1717
EXTERN_C HWND BindCtx_GetUIWindow(_In_ IBindCtx *pBindCtx)
Definition: utils.cpp:527
HRESULT SHBindToObjectEx(_In_opt_ IShellFolder *pShellFolder, _In_ LPCITEMIDLIST pidl, _In_opt_ IBindCtx *pBindCtx, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:327
EXTERN_C HRESULT WINAPI SHSetFolderPathA(_In_ INT csidl, _In_ HANDLE hToken, _In_ DWORD dwFlags, _In_ LPCSTR pszPath)
Definition: utils.cpp:633
BOOL IsShutdownAllowed(VOID)
Definition: utils.cpp:832
BOOL SHSkipJunctionBinding(_In_ IBindCtx *pbc, _In_ CLSID *pclsid)
Definition: utils.cpp:281
HRESULT SHELL_GetIDListTarget(_In_ LPCITEMIDLIST pidl, _Out_ PIDLIST_ABSOLUTE *ppidl)
Definition: utils.cpp:472
BOOL PathIsDotOrDotDotW(_In_ LPCWSTR pszPath)
Definition: utils.cpp:146
static PCWSTR SHELL_SkipServerSlashes(_In_ PCWSTR pszPath)
Definition: utils.cpp:1941
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogA(_In_ HWND hwnd, _In_ LPCSTR pszRemoteName, _In_ DWORD dwType)
Definition: utils.cpp:1493
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:193
struct tagALIAS_MAPPING ALIAS_MAPPING
EXTERN_C HRESULT WINAPI SHShouldShowWizards(_In_ IUnknown *pUnknown)
Definition: utils.cpp:216
EXTERN_C BOOL WINAPI SHOpenEffectiveToken(_Out_ LPHANDLE phToken)
Definition: utils.cpp:697
static HRESULT DynamicSHGetSpecialFolderPathW(_In_ HWND hwndOwner, _Out_ CStringW &strPath, _In_ INT nCSIDL, _In_ BOOL bCreate)
Definition: utils.cpp:1566
EXTERN_C HRESULT SHELL32_AliasTranslatePidl(_In_ LPCITEMIDLIST pidl, _Out_ LPITEMIDLIST *ppidlNew, _In_ DWORD dwFlags)
Translate a PIDL to an "alias" PIDL.
Definition: utils.cpp:2185
HRESULT SHCoInitializeAnyApartment(VOID)
Definition: utils.cpp:484
BOOL PathIsDosDevice(_In_ LPCWSTR pszName)
Definition: utils.cpp:172
#define DCIA_GetEntry(hDCIA, iItem)
Definition: utils.h:127
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
DWORD WINAPI SHGetObjectCompatFlags(IUnknown *pUnk, const CLSID *clsid)
Definition: ordinal.c:6499
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:1236
DWORD WINAPI SHQueryValueExW(HKEY hKey, LPCWSTR lpszValue, LPDWORD lpReserved, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1461
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1306
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
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 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
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
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
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
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)
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:1208
#define Stat
Definition: syshdrs.h:78
#define PT_FS
Definition: lnktool.cpp:40
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#define ZeroMemory
Definition: minwinbase.h:31
#define LPTR
Definition: minwinbase.h:93
LONG_PTR LPARAM
Definition: minwindef.h:175
CONST void * LPCVOID
Definition: minwindef.h:164
#define error(str)
Definition: mkdosfs.c:1605
#define pch(ap)
Definition: match.c:418
#define ERROR_ALREADY_EXISTS
Definition: disk.h:80
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
LPCWSTR szPath
Definition: env.c:37
static LPSTR pName
Definition: security.c:75
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 LPOLESTR
Definition: stg_prop.c:27
static ULONG WINAPI AddRef(IStream *iface)
Definition: clist.c:83
#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:919
@ COINIT_APARTMENTTHREADED
Definition: objbase.h:278
@ COINIT_DISABLE_OLE1DDE
Definition: objbase.h:280
interface IBindCtx * LPBC
Definition: objfwd.h:18
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
#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
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
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 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
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
Definition: shellord.c:225
HRESULT hr
Definition: shlfolder.c:183
#define CSIDL_COMMON_DESKTOPDIRECTORY
Definition: shlobj.h:2203
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1525
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2194
#define CSIDL_PERSONAL
Definition: shlobj.h:2184
#define CSIDL_FLAG_NO_ALIAS
Definition: shlobj.h:2239
#define CSIDL_FLAG_DONT_VERIFY
Definition: shlobj.h:2240
#define SSF_WEBVIEW
Definition: shlobj.h:1625
#define CSIDL_DESKTOP
Definition: shlobj.h:2179
@ REST_ALLOWCOMMENTTOGGLE
Definition: shlobj.h:1876
#define CSIDL_COMMON_DOCUMENTS
Definition: shlobj.h:2224
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
Definition: match.c:390
Definition: inflate.c:139
BYTE bCommonDesktop
Definition: utils.cpp:2088
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
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
int64_t LONGLONG
Definition: typedefs.h:68
uint16_t * LPWORD
Definition: typedefs.h:56
ULONG_PTR SIZE_T
Definition: typedefs.h:80
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:862
#define FMT_USE_GROUPING
Definition: undocshell.h:860
#define SHGCDN_NOSERVERNAME
Definition: undocshell.h:1018
#define FMT_USE_NUMDIGITS
Definition: undocshell.h:858
#define FMT_USE_NEGNUMBER
Definition: undocshell.h:863
#define FMT_USE_LEADZERO
Definition: undocshell.h:859
HRESULT(CALLBACK * PRIVILEGED_FUNCTION)(LPARAM lParam)
Definition: undocshell.h:891
#define SHGCDN_NOCACHE
Definition: undocshell.h:1017
#define FMT_USE_DECIMAL
Definition: undocshell.h:861
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:1148
#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 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:423
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define MK_SHIFT
Definition: winuser.h:2405
#define WS_EX_APPWINDOW
Definition: winuser.h:383
HWND WINAPI FindWindowExW(_In_opt_ HWND, _In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR)
#define MK_CONTROL
Definition: winuser.h:2406
BOOL WINAPI SetPropW(_In_ HWND, _In_ LPCWSTR, _In_opt_ HANDLE)
#define WS_EX_WINDOWEDGE
Definition: winuser.h:407
#define CW_USEDEFAULT
Definition: winuser.h:225
HANDLE WINAPI GetPropW(_In_ HWND, _In_ LPCWSTR)
#define SW_SHOW
Definition: winuser.h:786
_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)
const char * LPCSTR
Definition: xmlstorage.h:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
char * LPSTR
Definition: xmlstorage.h:182
char CHAR
Definition: xmlstorage.h:175
unsigned char BYTE
Definition: xxhash.c:193