ReactOS 0.4.16-dev-1292-g1ece139
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
262 _In_ LPCITEMIDLIST pidl,
263 _In_ HANDLE hToken,
264 _Out_ LPITEMIDLIST *ppidlAlias,
266{
267 return E_FAIL; //FIXME
268}
269
271{
273 if (!pBindCtx || FAILED(pBindCtx->GetObjectParam(const_cast<LPWSTR>(pszName), &punk)))
274 return FALSE;
275 return TRUE;
276}
277
279{
280 if (!pbc)
281 return dwDefault;
282
283 BIND_OPTS BindOpts = { sizeof(BindOpts) };
284 HRESULT hr = pbc->GetBindOptions(&BindOpts);
285 if (FAILED(hr))
286 return dwDefault;
287
288 return BindOpts.grfMode;
289}
290
292{
293 if (!pbc)
294 return FALSE;
295
296 BIND_OPTS BindOps = { sizeof(BindOps) };
297 if (SUCCEEDED(pbc->GetBindOptions(&BindOps)) && BindOps.grfFlags == OLECONTF_LINKS)
298 return TRUE;
299
300 return pclsid && SHSkipJunction(pbc, pclsid);
301}
302
304{
307
308 if (!pBindCtx || FAILED(pBindCtx->GetObjectParam((LPWSTR)STR_FILE_SYS_BIND_DATA, &punk)))
309 return S_FALSE;
310
311 if (FAILED(punk->QueryInterface(IID_PPV_ARG(IFileSystemBindData, &pBindData))))
312 return S_FALSE;
313
314 if (pFindData)
315 pBindData->GetFindData(pFindData);
316
317 return S_OK;
318}
319
321{
323
324 switch (code)
325 {
328 case ERROR_CANCELLED:
329 return TRUE;
330
331 default:
333 }
334}
335
338 _In_opt_ IShellFolder *pShellFolder,
339 _In_ LPCITEMIDLIST pidl,
340 _In_opt_ IBindCtx *pBindCtx,
342 _Out_ void **ppvObj)
343{
344 CComPtr<IShellFolder> psfDesktop;
345
346 *ppvObj = NULL;
347
348 if (!pShellFolder)
349 {
350 SHGetDesktopFolder(&psfDesktop);
351 if (!psfDesktop)
352 return E_FAIL;
353
354 pShellFolder = psfDesktop;
355 }
356
357 HRESULT hr;
358 if (_ILIsDesktop(pidl))
359 hr = pShellFolder->QueryInterface(riid, ppvObj);
360 else
361 hr = pShellFolder->BindToObject(pidl, pBindCtx, riid, ppvObj);
362
363 if (SUCCEEDED(hr) && !*ppvObj)
364 hr = E_FAIL;
365
366 return hr;
367}
368
372 _In_ LPCITEMIDLIST pidl,
374 _Out_ void **ppvObj)
375{
376 return SHBindToObjectEx(psf, pidl, NULL, riid, ppvObj);
377}
378
383 _In_ REFIID riid, _Out_ void **ppvObj)
384{
385 if (!ppvObj)
386 return E_INVALIDARG;
387 *ppvObj = NULL;
388 IShellFolder *psf;
389 PCUITEMID_CHILD pidlChild;
390 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlChild);
391 if (SUCCEEDED(hr))
392 {
393 hr = psf->GetUIObjectOf(hWnd, 1, &pidlChild, riid, NULL, ppvObj);
394 psf->Release();
395 if (SUCCEEDED(hr))
396 {
397 if (*ppvObj)
398 return hr;
399 hr = E_FAIL;
400 }
401 }
402 return hr;
403}
404
408 _In_ LPCITEMIDLIST pidl,
410 _Out_ PWSTR *ppStr)
411{
412 HRESULT hr;
413 CComPtr<IShellFolder> psfRoot;
414 if (!psf)
415 {
416 PCUITEMID_CHILD pidlChild;
417 hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfRoot), &pidlChild);
418 if (FAILED(hr))
419 return hr;
420 psf = psfRoot;
421 pidl = pidlChild;
422 }
423 STRRET sr;
424 hr = psf->GetDisplayNameOf((PCUITEMID_CHILD)pidl, Flags, &sr);
425 return SUCCEEDED(hr) ? StrRetToStrW(&sr, pidl, ppStr) : hr;
426}
427
428/***********************************************************************
429 * DisplayNameOfW [SHELL32.757] (Vista+)
430 */
433 _In_ IShellFolder *psf,
434 _In_ LPCITEMIDLIST pidl,
436 _Out_ LPWSTR pszBuf,
437 _In_ UINT cchBuf)
438{
439 *pszBuf = UNICODE_NULL;
440 STRRET sr;
441 HRESULT hr = psf->GetDisplayNameOf(pidl, dwFlags, &sr);
442 if (FAILED(hr))
443 return hr;
444 return StrRetToBufW(&sr, pidl, pszBuf, cchBuf);
445}
446
447DWORD
449{
450 LPCITEMIDLIST pidlLast = pidl;
451 IShellFolder *release = NULL;
452
453 if (!psf)
454 {
455 SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlLast);
456 if (!psf)
457 return 0;
458 release = psf;
459 }
460
461 DWORD oldAttrs = dwAttributes;
462 if (FAILED(psf->GetAttributesOf(1, &pidlLast, &dwAttributes)))
463 dwAttributes = 0;
464 else
465 dwAttributes &= oldAttrs;
466
467 if ((dwAttributes & SFGAO_FOLDER) &&
468 (dwAttributes & SFGAO_STREAM) &&
469 !(dwAttributes & SFGAO_STORAGEANCESTOR) &&
470 (oldAttrs & SFGAO_STORAGEANCESTOR) &&
471 (SHGetObjectCompatFlags(psf, NULL) & 0x200))
472 {
473 dwAttributes &= ~(SFGAO_STREAM | SFGAO_STORAGEANCESTOR);
474 dwAttributes |= SFGAO_STORAGEANCESTOR;
475 }
476
477 if (release)
478 release->Release();
479 return dwAttributes;
480}
481
483{
484 IShellLink *pSL;
485 HRESULT hr = SHBindToObject(NULL, pidl, IID_PPV_ARG(IShellLink, &pSL));
486 if (SUCCEEDED(hr))
487 {
488 hr = pSL->GetIDList(ppidl); // Note: Returns S_FALSE if no target pidl
489 pSL->Release();
490 }
491 return hr;
492}
493
495{
497 if (FAILED(hr))
499 return hr;
500}
501
504 _In_ LPCITEMIDLIST pidl,
506 _Out_opt_ LPWSTR pszText,
507 _In_ UINT cchBuf,
508 _Inout_opt_ DWORD *pdwAttributes)
509{
510 if (pszText)
511 *pszText = UNICODE_NULL;
512
514
515 CComPtr<IShellFolder> psfFolder;
516 LPCITEMIDLIST ppidlLast;
517 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfFolder), &ppidlLast);
518 if (SUCCEEDED(hr))
519 {
520 if (pszText)
521 hr = DisplayNameOfW(psfFolder, ppidlLast, dwFlags, pszText, cchBuf);
522
523 if (SUCCEEDED(hr))
524 {
525 if (pdwAttributes)
526 *pdwAttributes = SHGetAttributes(psfFolder, ppidlLast, *pdwAttributes);
527 }
528 }
529
530 if (SUCCEEDED(hrCoInit))
532
533 return hr;
534}
535
538{
539 HWND hWnd = NULL;
540
542 if (pBindCtx && SUCCEEDED(pBindCtx->GetObjectParam((LPWSTR)L"UI During Binding", &punk)))
543 IUnknown_GetWindow(punk, &hWnd);
544
545 return hWnd;
546}
547
549{
550protected:
553
554public:
556 virtual ~CDummyOleWindow() { }
557
558 // IUnknown methods
560 {
561 static const QITAB c_tab[] =
562 {
564 { NULL }
565 };
566 return ::QISearch(this, c_tab, riid, ppvObj);
567 }
569 {
570 return ++m_cRefs;
571 }
573 {
574 if (--m_cRefs == 0)
575 {
576 delete this;
577 return 0;
578 }
579 return m_cRefs;
580 }
581
582 // IOleWindow methods
583 STDMETHODIMP GetWindow(HWND *phWnd) override
584 {
585 *phWnd = m_hWnd;
586 if (!m_hWnd)
587 return E_NOTIMPL;
588 return S_OK;
589 }
591 {
592 return E_NOTIMPL;
593 }
594};
595
598 _In_ IBindCtx *pBindCtx,
599 _In_ LPOLESTR pszKey,
600 _In_opt_ IUnknown *punk,
601 _Out_ LPBC *ppbc)
602{
603 HRESULT hr = S_OK;
605
606 *ppbc = pBindCtx;
607
608 if (pBindCtx)
609 {
610 pBindCtx->AddRef();
611 }
612 else
613 {
614 hr = CreateBindCtx(0, ppbc);
615 if (FAILED(hr))
616 return hr;
617 }
618
619 if (!punk)
620 punk = pUnknown = new CDummyOleWindow();
621
622 hr = (*ppbc)->RegisterObjectParam(pszKey, punk);
623
624 if (pUnknown)
625 pUnknown->Release();
626
627 if (FAILED(hr))
628 {
629 (*ppbc)->Release();
630 *ppbc = NULL;
631 }
632
633 return hr;
634}
635
636/*************************************************************************
637 * SHSetFolderPathA (SHELL32.231)
638 *
639 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shsetfolderpatha
640 */
644 _In_ INT csidl,
645 _In_ HANDLE hToken,
647 _In_ LPCSTR pszPath)
648{
649 TRACE("(%d, %p, 0x%X, %s)\n", csidl, hToken, dwFlags, debugstr_a(pszPath));
650 CStringW strPathW(pszPath);
651 return SHSetFolderPathW(csidl, hToken, dwFlags, strPathW);
652}
653
654/*************************************************************************
655 * PathIsSlowA (SHELL32.240)
656 *
657 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj/nf-shlobj-pathisslowa
658 */
662 _In_ LPCSTR pszFile,
663 _In_ DWORD dwAttr)
664{
665 TRACE("(%s, 0x%X)\n", debugstr_a(pszFile), dwAttr);
666 CStringW strFileW(pszFile);
667 return PathIsSlowW(strFileW, dwAttr);
668}
669
670/*************************************************************************
671 * ExtractIconResInfoA (SHELL32.221)
672 */
676 _In_ HANDLE hHandle,
678 _In_ WORD wIndex,
679 _Out_ LPWORD lpSize,
680 _Out_ LPHANDLE lpIcon)
681{
682 TRACE("(%p, %s, %u, %p, %p)\n", hHandle, debugstr_a(lpFileName), wIndex, lpSize, lpIcon);
683
684 if (!lpFileName)
685 return 0;
686
687 CStringW strFileNameW(lpFileName);
688 return ExtractIconResInfoW(hHandle, strFileNameW, wIndex, lpSize, lpIcon);
689}
690
691/*************************************************************************
692 * ShortSizeFormatW (SHELL32.204)
693 */
697 _In_ DWORD dwNumber,
698 _Out_writes_(0x8FFF) LPWSTR pszBuffer)
699{
700 TRACE("(%lu, %p)\n", dwNumber, pszBuffer);
701 return StrFormatByteSizeW(dwNumber, pszBuffer, 0x8FFF);
702}
703
704/*************************************************************************
705 * SHOpenEffectiveToken (SHELL32.235)
706 */
708{
709 TRACE("%p\n", phToken);
711}
712
713/*************************************************************************
714 * SHGetUserSessionId (SHELL32.248)
715 */
717{
718 DWORD dwSessionId, dwLength;
719 BOOL bOpenToken = FALSE;
720
721 TRACE("%p\n", hToken);
722
723 if (!hToken)
724 bOpenToken = SHOpenEffectiveToken(&hToken);
725
726 if (!hToken ||
727 !GetTokenInformation(hToken, TokenSessionId, &dwSessionId, sizeof(dwSessionId), &dwLength))
728 {
729 dwSessionId = 0;
730 }
731
732 if (bOpenToken)
733 CloseHandle(hToken);
734
735 return dwSessionId;
736}
737
738/*************************************************************************
739 * SHInvokePrivilegedFunctionW (SHELL32.246)
740 */
744 _In_ LPCWSTR pszName,
747{
748 TRACE("(%s %p %p)\n", debugstr_w(pszName), fn, lParam);
749
750 if (!pszName || !fn)
751 return E_INVALIDARG;
752
753 HANDLE hToken = NULL;
754 TOKEN_PRIVILEGES NewPriv, PrevPriv;
755 BOOL bAdjusted = FALSE;
756
757 if (SHOpenEffectiveToken(&hToken) &&
758 ::LookupPrivilegeValueW(NULL, pszName, &NewPriv.Privileges[0].Luid))
759 {
760 NewPriv.PrivilegeCount = 1;
762
763 DWORD dwReturnSize;
764 bAdjusted = ::AdjustTokenPrivileges(hToken, FALSE, &NewPriv,
765 sizeof(PrevPriv), &PrevPriv, &dwReturnSize);
766 }
767
768 HRESULT hr = fn(lParam);
769
770 if (bAdjusted)
771 ::AdjustTokenPrivileges(hToken, FALSE, &PrevPriv, 0, NULL, NULL);
772
773 if (hToken)
774 ::CloseHandle(hToken);
775
776 return hr;
777}
778
779/*************************************************************************
780 * SHTestTokenPrivilegeW (SHELL32.236)
781 *
782 * @see http://undoc.airesoft.co.uk/shell32.dll/SHTestTokenPrivilegeW.php
783 */
787 _In_opt_ HANDLE hToken,
789{
790 LUID Luid;
792 PTOKEN_PRIVILEGES pTokenPriv;
793 HANDLE hNewToken = NULL;
794 BOOL ret = FALSE;
795
796 TRACE("(%p, %s)\n", hToken, debugstr_w(lpName));
797
798 if (!lpName)
799 return FALSE;
800
801 if (!hToken)
802 {
803 if (!SHOpenEffectiveToken(&hNewToken))
804 goto Quit;
805
806 if (!hNewToken)
807 return FALSE;
808
809 hToken = hNewToken;
810 }
811
812 if (!LookupPrivilegeValueW(NULL, lpName, &Luid))
813 return FALSE;
814
815 dwLength = 0;
817 goto Quit;
818
820 if (!pTokenPriv)
821 goto Quit;
822
823 if (GetTokenInformation(hToken, TokenPrivileges, pTokenPriv, dwLength, &dwLength))
824 {
825 UINT iPriv, cPrivs;
826 cPrivs = pTokenPriv->PrivilegeCount;
827 for (iPriv = 0; !ret && iPriv < cPrivs; ++iPriv)
828 {
829 ret = RtlEqualLuid(&Luid, &pTokenPriv->Privileges[iPriv].Luid);
830 }
831 }
832
833 LocalFree(pTokenPriv);
834
835Quit:
836 if (hToken == hNewToken)
837 CloseHandle(hNewToken);
838
839 return ret;
840}
841
843{
845}
846
847/*************************************************************************
848 * IsSuspendAllowed (SHELL32.53)
849 */
851{
852 TRACE("()\n");
854}
855
856/*************************************************************************
857 * SHGetShellStyleHInstance (SHELL32.749)
858 */
860WINAPI
862{
865 HRESULT hr;
866 CStringW strShellStyle;
867
868 TRACE("SHGetShellStyleHInstance called\n");
869
870 /* First, attempt to load the shellstyle dll from the current active theme */
872 if (FAILED(hr))
873 goto DoDefault;
874
875 /* Strip the theme filename */
877
878 strShellStyle = szPath;
879 strShellStyle += L"\\Shell\\";
880 strShellStyle += szColorName;
881 strShellStyle += L"\\ShellStyle.dll";
882
884 if (hInst)
885 return hInst;
886
887 /* Otherwise, use the version stored in the System32 directory */
888DoDefault:
889 if (!ExpandEnvironmentStringsW(L"%SystemRoot%\\System32\\ShellStyle.dll",
891 {
892 ERR("Expand failed\n");
893 return NULL;
894 }
896}
897
898/*************************************************************************
899 * SHCreatePropertyBag (SHELL32.715)
900 */
902WINAPI
904{
906}
907
908// The helper function for SHGetUnreadMailCountW
909static DWORD
911 _In_ HKEY hKey,
912 _Out_opt_ PDWORD pdwCount,
913 _Out_opt_ PFILETIME pFileTime,
914 _Out_writes_opt_(cchShellExecuteCommand) LPWSTR pszShellExecuteCommand,
915 _In_ INT cchShellExecuteCommand)
916{
917 DWORD dwType, dwCount, cbSize = sizeof(dwCount);
918 DWORD error = SHQueryValueExW(hKey, L"MessageCount", 0, &dwType, &dwCount, &cbSize);
919 if (error)
920 return error;
921 if (pdwCount && dwType == REG_DWORD)
922 *pdwCount = dwCount;
923
924 FILETIME FileTime;
925 cbSize = sizeof(FileTime);
926 error = SHQueryValueExW(hKey, L"TimeStamp", 0, &dwType, &FileTime, &cbSize);
927 if (error)
928 return error;
929 if (pFileTime && dwType == REG_BINARY)
930 *pFileTime = FileTime;
931
932 WCHAR szName[2 * MAX_PATH];
933 cbSize = sizeof(szName);
934 error = SHQueryValueExW(hKey, L"Application", 0, &dwType, szName, &cbSize);
935 if (error)
936 return error;
937
938 if (pszShellExecuteCommand && dwType == REG_SZ &&
939 FAILED(StringCchCopyW(pszShellExecuteCommand, cchShellExecuteCommand, szName)))
940 {
942 }
943
944 return ERROR_SUCCESS;
945}
946
947/*************************************************************************
948 * SHGetUnreadMailCountW [SHELL32.320]
949 *
950 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shgetunreadmailcountw
951 */
955 _In_opt_ HKEY hKeyUser,
956 _In_opt_ PCWSTR pszMailAddress,
957 _Out_opt_ PDWORD pdwCount,
958 _Inout_opt_ PFILETIME pFileTime,
959 _Out_writes_opt_(cchShellExecuteCommand) PWSTR pszShellExecuteCommand,
960 _In_ INT cchShellExecuteCommand)
961{
963 HKEY hKey;
964
965 if (!hKeyUser)
966 hKeyUser = HKEY_CURRENT_USER;
967
968 if (pszMailAddress)
969 {
970 CStringW strKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail";
971 strKey += L'\\';
972 strKey += pszMailAddress;
973
974 error = RegOpenKeyExW(hKeyUser, strKey, 0, KEY_QUERY_VALUE, &hKey);
975 if (error)
977
978 error = SHELL_ReadSingleUnreadMailCount(hKey, pdwCount, pFileTime,
979 pszShellExecuteCommand, cchShellExecuteCommand);
980 }
981 else
982 {
983 if (pszShellExecuteCommand || cchShellExecuteCommand)
984 return E_INVALIDARG;
985
986 *pdwCount = 0;
987
988 error = RegOpenKeyExW(hKeyUser, L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
990 if (error)
992
993 for (DWORD dwIndex = 0; !error; ++dwIndex)
994 {
995 WCHAR Name[2 * MAX_PATH];
997 FILETIME LastWritten;
998 error = RegEnumKeyExW(hKey, dwIndex, Name, &cchName, NULL, NULL, NULL, &LastWritten);
999 if (error)
1000 break;
1001
1002 HKEY hSubKey;
1003 error = RegOpenKeyExW(hKey, Name, 0, KEY_QUERY_VALUE, &hSubKey);
1004 if (error)
1005 break;
1006
1007 FILETIME FileTime;
1008 DWORD dwCount;
1009 error = SHELL_ReadSingleUnreadMailCount(hSubKey, &dwCount, &FileTime, NULL, 0);
1010 if (!error && (!pFileTime || CompareFileTime(&FileTime, pFileTime) >= 0))
1011 *pdwCount += dwCount;
1012
1013 RegCloseKey(hSubKey);
1014 }
1015
1018 }
1019
1021
1022 return error ? HRESULT_FROM_WIN32(error) : S_OK;
1023}
1024
1025/*************************************************************************
1026 * SHSetUnreadMailCountW [SHELL32.336]
1027 *
1028 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shsetunreadmailcountw
1029 */
1033 _In_ PCWSTR pszMailAddress,
1034 _In_ DWORD dwCount,
1035 _In_ PCWSTR pszShellExecuteCommand)
1036{
1037 CString strKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\";
1038 strKey += pszMailAddress;
1039
1040 HKEY hKey;
1041 DWORD dwDisposition;
1043 &hKey, &dwDisposition);
1044 if (error)
1045 return HRESULT_FROM_WIN32(error);
1046
1047 error = RegSetValueExW(hKey, L"MessageCount", 0, REG_DWORD, (PBYTE)&dwCount, sizeof(dwCount));
1048 if (error)
1049 {
1051 return HRESULT_FROM_WIN32(error);
1052 }
1053
1054 FILETIME FileTime;
1055 GetSystemTimeAsFileTime(&FileTime);
1056
1057 error = RegSetValueExW(hKey, L"TimeStamp", 0, REG_BINARY, (PBYTE)&FileTime, sizeof(FileTime));
1058 if (error)
1059 {
1061 return HRESULT_FROM_WIN32(error);
1062 }
1063
1064 WCHAR szBuff[2 * MAX_PATH];
1065 if (!PathUnExpandEnvStringsW(pszShellExecuteCommand, szBuff, _countof(szBuff)))
1066 {
1067 HRESULT hr = StringCchCopyW(szBuff, _countof(szBuff), pszShellExecuteCommand);
1069 {
1071 return hr;
1072 }
1073 }
1074
1075 DWORD cbValue = (lstrlenW(szBuff) + 1) * sizeof(WCHAR);
1076 error = RegSetValueExW(hKey, L"Application", 0, REG_SZ, (PBYTE)szBuff, cbValue);
1077
1079 return (error ? HRESULT_FROM_WIN32(error) : S_OK);
1080}
1081
1082/*************************************************************************
1083 * SheRemoveQuotesA (SHELL32.@)
1084 */
1086WINAPI
1088{
1089 PCHAR pch;
1090
1091 if (*psz == '"')
1092 {
1093 for (pch = psz + 1; *pch && *pch != '"'; ++pch)
1094 {
1095 *(pch - 1) = *pch;
1096 }
1097
1098 if (*pch == '"')
1099 *(pch - 1) = ANSI_NULL;
1100 }
1101
1102 return psz;
1103}
1104
1105/*************************************************************************
1106 * SheRemoveQuotesW (SHELL32.@)
1107 *
1108 * ExtractAssociatedIconExW uses this function.
1109 */
1111WINAPI
1113{
1114 PWCHAR pch;
1115
1116 if (*psz == L'"')
1117 {
1118 for (pch = psz + 1; *pch && *pch != L'"'; ++pch)
1119 {
1120 *(pch - 1) = *pch;
1121 }
1122
1123 if (*pch == L'"')
1124 *(pch - 1) = UNICODE_NULL;
1125 }
1126
1127 return psz;
1128}
1129
1130/*************************************************************************
1131 * SHEnumerateUnreadMailAccountsW [SHELL32.287]
1132 *
1133 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shenumerateunreadmailaccountsw
1134 */
1138 _In_opt_ HKEY hKeyUser,
1139 _In_ DWORD dwIndex,
1140 _Out_writes_(cchMailAddress) PWSTR pszMailAddress,
1141 _In_ INT cchMailAddress)
1142{
1143 if (!hKeyUser)
1144 hKeyUser = HKEY_CURRENT_USER;
1145
1146 HKEY hKey;
1147 LSTATUS error = RegOpenKeyExW(hKeyUser,
1148 L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
1150 if (error)
1151 return HRESULT_FROM_WIN32(error);
1152
1153 FILETIME FileTime;
1154 error = RegEnumKeyExW(hKey, dwIndex, pszMailAddress, (PDWORD)&cchMailAddress, NULL, NULL,
1155 NULL, &FileTime);
1156 if (error)
1157 *pszMailAddress = UNICODE_NULL;
1158
1160 return error ? HRESULT_FROM_WIN32(error) : S_OK;
1161}
1162
1163/*************************************************************************
1164 * SHFindComputer [SHELL32.91]
1165 *
1166 * Invokes the shell search in My Computer. Used in SHFindFiles.
1167 * Two parameters are ignored.
1168 */
1170WINAPI
1172{
1173 UNREFERENCED_PARAMETER(pidlRoot);
1174 UNREFERENCED_PARAMETER(pidlSavedSearch);
1175
1176 TRACE("%p %p\n", pidlRoot, pidlSavedSearch);
1177
1178 IContextMenu *pCM;
1179 HRESULT hr = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER,
1180 IID_IContextMenu, (void **)&pCM);
1181 if (FAILED(hr))
1182 {
1183 ERR("0x%08X\n", hr);
1184 return hr;
1185 }
1186
1187 CMINVOKECOMMANDINFO InvokeInfo = { sizeof(InvokeInfo) };
1188 InvokeInfo.lpParameters = "{996E1EB1-B524-11D1-9120-00A0C98BA67D}";
1189 InvokeInfo.nShow = SW_SHOWNORMAL;
1190 hr = pCM->InvokeCommand(&InvokeInfo);
1191 pCM->Release();
1192
1193 return SUCCEEDED(hr);
1194}
1195
1196static HRESULT
1198 _In_ LONGLONG llValue,
1199 _Out_writes_(cchValue) LPWSTR pszValue,
1200 _In_ UINT cchValue)
1201{
1202 WCHAR szBuff[40];
1203 UINT ich = 0, ichValue;
1204#if (WINVER >= _WIN32_WINNT_VISTA)
1205 BOOL bMinus = (llValue < 0);
1206
1207 if (bMinus)
1208 llValue = -llValue;
1209#endif
1210
1211 if (cchValue <= 0)
1212 return E_FAIL;
1213
1214 do
1215 {
1216 szBuff[ich++] = (WCHAR)(L'0' + (llValue % 10));
1217 llValue /= 10;
1218 } while (llValue != 0 && ich < _countof(szBuff) - 1);
1219
1220#if (WINVER >= _WIN32_WINNT_VISTA)
1221 if (bMinus && ich < _countof(szBuff))
1222 szBuff[ich++] = '-';
1223#endif
1224
1225 for (ichValue = 0; ich > 0 && ichValue < cchValue; ++ichValue)
1226 {
1227 --ich;
1228 pszValue[ichValue] = szBuff[ich];
1229 }
1230
1231 if (ichValue >= cchValue)
1232 {
1233 pszValue[cchValue - 1] = UNICODE_NULL;
1234 return E_FAIL;
1235 }
1236
1237 pszValue[ichValue] = UNICODE_NULL;
1238 return S_OK;
1239}
1240
1241static VOID
1243 _Out_ NUMBERFMTW *pDest,
1244 _In_opt_ const NUMBERFMTW *pSrc,
1245 _In_ DWORD dwNumberFlags,
1246 _Out_writes_(cchDecimal) LPWSTR pszDecimal,
1247 _In_ INT cchDecimal,
1248 _Out_writes_(cchThousand) LPWSTR pszThousand,
1249 _In_ INT cchThousand)
1250{
1251 WCHAR szBuff[20];
1252
1253 if (pSrc)
1254 *pDest = *pSrc;
1255 else
1256 dwNumberFlags = 0;
1257
1258 if (!(dwNumberFlags & FMT_USE_NUMDIGITS))
1259 {
1261 pDest->NumDigits = StrToIntW(szBuff);
1262 }
1263
1264 if (!(dwNumberFlags & FMT_USE_LEADZERO))
1265 {
1267 pDest->LeadingZero = StrToIntW(szBuff);
1268 }
1269
1270 if (!(dwNumberFlags & FMT_USE_GROUPING))
1271 {
1273 pDest->Grouping = StrToIntW(szBuff);
1274 }
1275
1276 if (!(dwNumberFlags & FMT_USE_DECIMAL))
1277 {
1278 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, pszDecimal, cchDecimal);
1279 pDest->lpDecimalSep = pszDecimal;
1280 }
1281
1282 if (!(dwNumberFlags & FMT_USE_THOUSAND))
1283 {
1284 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, pszThousand, cchThousand);
1285 pDest->lpThousandSep = pszThousand;
1286 }
1287
1288 if (!(dwNumberFlags & FMT_USE_NEGNUMBER))
1289 {
1291 pDest->NegativeOrder = StrToIntW(szBuff);
1292 }
1293}
1294
1295/*************************************************************************
1296 * Int64ToString [SHELL32.209]
1297 *
1298 * @see http://undoc.airesoft.co.uk/shell32.dll/Int64ToString.php
1299 */
1301INT WINAPI
1303 _In_ LONGLONG llValue,
1304 _Out_writes_(cchOut) LPWSTR pszOut,
1305 _In_ UINT cchOut,
1306 _In_ BOOL bUseFormat,
1307 _In_opt_ const NUMBERFMTW *pNumberFormat,
1308 _In_ DWORD dwNumberFlags)
1309{
1310 INT ret;
1311 NUMBERFMTW NumFormat;
1312 WCHAR szValue[80], szDecimalSep[6], szThousandSep[6];
1313
1314 Int64ToStr(llValue, szValue, _countof(szValue));
1315
1316 if (bUseFormat)
1317 {
1318 Int64GetNumFormat(&NumFormat, pNumberFormat, dwNumberFlags,
1319 szDecimalSep, _countof(szDecimalSep),
1320 szThousandSep, _countof(szThousandSep));
1321 ret = GetNumberFormatW(LOCALE_USER_DEFAULT, 0, szValue, &NumFormat, pszOut, cchOut);
1322 if (ret)
1323 --ret;
1324 return ret;
1325 }
1326
1327 if (FAILED(StringCchCopyW(pszOut, cchOut, szValue)))
1328 return 0;
1329
1330 return lstrlenW(pszOut);
1331}
1332
1333/*************************************************************************
1334 * LargeIntegerToString [SHELL32.210]
1335 *
1336 * @see http://undoc.airesoft.co.uk/shell32.dll/LargeIntegerToString.php
1337 */
1339INT WINAPI
1341 _In_ const LARGE_INTEGER *pLargeInt,
1342 _Out_writes_(cchOut) LPWSTR pszOut,
1343 _In_ UINT cchOut,
1344 _In_ BOOL bUseFormat,
1345 _In_opt_ const NUMBERFMTW *pNumberFormat,
1346 _In_ DWORD dwNumberFlags)
1347{
1348 return Int64ToString(pLargeInt->QuadPart, pszOut, cchOut, bUseFormat,
1349 pNumberFormat, dwNumberFlags);
1350}
1351
1352/*************************************************************************
1353 * CopyStreamUI [SHELL32.726]
1354 *
1355 * Copy a stream to another stream with optional progress display.
1356 */
1360 _In_ IStream *pSrc,
1361 _Out_ IStream *pDst,
1362 _Inout_opt_ IProgressDialog *pProgress,
1363 _In_opt_ DWORDLONG dwlSize)
1364{
1365 HRESULT hr = E_FAIL;
1366 DWORD cbBuff, cbRead, dwSizeToWrite;
1367 DWORDLONG cbDone;
1368 LPVOID pBuff;
1369 CComHeapPtr<BYTE> pHeapPtr;
1370 STATSTG Stat;
1371 BYTE abBuff[1024];
1372
1373 TRACE("(%p, %p, %p, %I64u)\n", pSrc, pDst, pProgress, dwlSize);
1374
1375 if (dwlSize == 0) // Invalid size?
1376 {
1377 // Get the stream size
1378 ZeroMemory(&Stat, sizeof(Stat));
1379 if (FAILED(pSrc->Stat(&Stat, STATFLAG_NONAME)))
1380 pProgress = NULL; // No size info. Disable progress
1381 else
1382 dwlSize = Stat.cbSize.QuadPart;
1383 }
1384
1385 if (!pProgress) // Progress is disabled?
1386 {
1387 ULARGE_INTEGER uliSize;
1388
1389 if (dwlSize > 0)
1390 uliSize.QuadPart = dwlSize;
1391 else
1392 uliSize.HighPart = uliSize.LowPart = INVALID_FILE_SIZE;
1393
1394 return pSrc->CopyTo(pDst, uliSize, NULL, NULL); // One punch
1395 }
1396
1397 // Allocate the buffer if necessary
1398 if (dwlSize > 0 && dwlSize <= sizeof(abBuff))
1399 {
1400 cbBuff = sizeof(abBuff);
1401 pBuff = abBuff;
1402 }
1403 else
1404 {
1405#define COPY_STREAM_DEFAULT_BUFFER_SIZE 0x4000
1407 if (pHeapPtr.AllocateBytes(cbBuff))
1408 {
1409 pBuff = pHeapPtr;
1410 }
1411 else // Low memory?
1412 {
1413 cbBuff = sizeof(abBuff);
1414 pBuff = abBuff;
1415 }
1416#undef COPY_STREAM_DEFAULT_BUFFER_SIZE
1417 }
1418
1419 // Start reading
1421 zero.QuadPart = 0;
1422 pSrc->Seek(zero, 0, NULL);
1423 pDst->Seek(zero, 0, NULL);
1424 cbDone = 0;
1425 pProgress->SetProgress64(cbDone, dwlSize);
1426
1427 // Repeat reading and writing until goal
1428 for (;;)
1429 {
1430 hr = pSrc->Read(pBuff, cbBuff, &cbRead);
1431 if (FAILED(hr))
1432 break;
1433
1434 // Calculate the size to write
1435 if (dwlSize > 0)
1436 dwSizeToWrite = (DWORD)min((DWORDLONG)(dwlSize - cbDone), (DWORDLONG)cbRead);
1437 else
1438 dwSizeToWrite = cbRead;
1439
1440 if (dwSizeToWrite == 0) // No need to write?
1441 {
1442 hr = S_OK;
1443 break;
1444 }
1445
1446 hr = pDst->Write(pBuff, dwSizeToWrite, NULL);
1447 if (hr != S_OK)
1448 break;
1449
1450 cbDone += dwSizeToWrite;
1451
1452 if (pProgress->HasUserCancelled()) // Cancelled?
1453 {
1455 break;
1456 }
1457 pProgress->SetProgress64(cbDone, dwlSize);
1458
1459 if (dwlSize > 0 && cbDone >= dwlSize) // Reached the goal?
1460 {
1461 hr = S_OK;
1462 break;
1463 }
1464 }
1465
1466 return hr;
1467}
1468
1469/*************************************************************************
1470 * Activate_RunDLL [SHELL32.105]
1471 *
1472 * Unlocks the foreground window and allows the shell window to become the
1473 * foreground window. Every parameter is unused.
1474 */
1478 _In_ HWND hwnd,
1481 _In_ INT cmdshow)
1482{
1483 DWORD dwProcessID;
1484
1488 UNREFERENCED_PARAMETER(cmdshow);
1489
1490 TRACE("(%p, %p, %s, %d)\n", hwnd, hinst, debugstr_w(cmdline), cmdline);
1491
1493 return AllowSetForegroundWindow(dwProcessID);
1494}
1495
1496/*************************************************************************
1497 * SHStartNetConnectionDialogA (SHELL32.12)
1498 *
1499 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shstartnetconnectiondialoga
1500 */
1504 _In_ HWND hwnd,
1505 _In_ LPCSTR pszRemoteName,
1506 _In_ DWORD dwType)
1507{
1508 LPCWSTR pszRemoteNameW = NULL;
1509 CStringW strRemoteNameW;
1510
1511 TRACE("(%p, %s, %lu)\n", hwnd, debugstr_a(pszRemoteName), dwType);
1512
1513 if (pszRemoteName)
1514 {
1515 strRemoteNameW = pszRemoteName;
1516 pszRemoteNameW = strRemoteNameW;
1517 }
1518
1519 return SHStartNetConnectionDialogW(hwnd, pszRemoteNameW, dwType);
1520}
1521
1522/*************************************************************************
1523 * Helper functions for PathIsEqualOrSubFolder
1524 */
1525
1526static INT
1528 _In_ LPCWSTR lpszPath1,
1529 _In_ LPCWSTR lpszPath2,
1530 _Out_ CStringW& strPath)
1531{
1532 SIZE_T cchPath1 = wcslen(lpszPath1);
1533 SIZE_T cchPath2 = wcslen(lpszPath2);
1534 LPWSTR lpszPath = strPath.GetBuffer((INT)max(cchPath1, cchPath2) + 16);
1535 INT ret = PathCommonPrefixW(lpszPath1, lpszPath2, lpszPath);
1536 strPath.ReleaseBuffer();
1537 return ret;
1538}
1539
1542
1543static HRESULT
1545 _In_ LPCITEMIDLIST pidl,
1546 _Out_ CStringW& strPath)
1547{
1548 HRESULT hr;
1549
1550 for (UINT cchPath = MAX_PATH;; cchPath *= 2)
1551 {
1552 LPWSTR lpszPath = strPath.GetBuffer(cchPath);
1553 if (!lpszPath)
1554 return E_OUTOFMEMORY;
1555
1556 hr = SHGetPathCchFromIDListW(pidl, lpszPath, cchPath);
1557 strPath.ReleaseBuffer();
1558
1560 break;
1561
1562 if (cchPath >= MAXUINT / 2)
1563 {
1564 hr = E_FAIL;
1565 break;
1566 }
1567 }
1568
1569 if (FAILED(hr))
1570 strPath.Empty();
1571
1572 return hr;
1573}
1574
1575static HRESULT
1577 _In_ HWND hwndOwner,
1578 _Out_ CStringW& strPath,
1579 _In_ INT nCSIDL,
1581{
1582 LPITEMIDLIST pidl;
1583 HRESULT hr = SHGetSpecialFolderLocation(hwndOwner, nCSIDL, &pidl);
1584 if (SUCCEEDED(hr))
1585 {
1586 hr = DynamicSHGetPathFromIDListW(pidl, strPath);
1587 CoTaskMemFree(pidl);
1588 }
1589
1590 if (FAILED(hr))
1591 strPath.Empty();
1592 else if (bCreate)
1593 CreateDirectoryW(strPath, NULL);
1594
1595 return hr;
1596}
1597
1598static VOID
1600 _Out_ CStringW& strPath)
1601{
1602 INT nLength = strPath.GetLength();
1603 if (nLength > 0 && strPath[nLength - 1] == L'\\')
1604 strPath = strPath.Left(nLength - 1);
1605}
1606
1607/*************************************************************************
1608 * PathIsEqualOrSubFolder (SHELL32.755)
1609 */
1613 _In_ LPCWSTR pszPath1OrCSIDL,
1614 _In_ LPCWSTR pszPath2)
1615{
1616 CStringW strCommon, strPath1;
1617
1618 TRACE("(%s %s)\n", debugstr_w(pszPath1OrCSIDL), debugstr_w(pszPath2));
1619
1620 if (IS_INTRESOURCE(pszPath1OrCSIDL))
1621 {
1623 NULL, strPath1, LOWORD(pszPath1OrCSIDL) | CSIDL_FLAG_DONT_VERIFY, FALSE);
1624 }
1625 else
1626 {
1627 strPath1 = pszPath1OrCSIDL;
1628 }
1629
1631
1632 if (!DynamicPathCommonPrefixW(strPath1, pszPath2, strCommon))
1633 return FALSE;
1634
1635 return strPath1.CompareNoCase(strCommon) == 0;
1636}
1637
1638/*************************************************************************
1639 * SHGetRealIDL [SHELL32.98]
1640 */
1644 _In_ IShellFolder *psf,
1645 _In_ PCUITEMID_CHILD pidlSimple,
1646 _Outptr_ PITEMID_CHILD *ppidlReal)
1647{
1648 HRESULT hr;
1649 STRRET strret;
1651 SFGAOF attrs;
1652
1653 *ppidlReal = NULL;
1654
1655 hr = IShellFolder_GetDisplayNameOf(psf, pidlSimple, SHGDN_INFOLDER | SHGDN_FORPARSING,
1656 &strret, 0);
1658 return hr;
1659
1660 hr = StrRetToBufW(&strret, pidlSimple, szPath, _countof(szPath));
1662 return hr;
1663
1664 attrs = SFGAO_FILESYSTEM;
1665 hr = psf->GetAttributesOf(1, &pidlSimple, &attrs);
1666 if (SUCCEEDED(hr) && !(attrs & SFGAO_FILESYSTEM))
1667 return SHILClone(pidlSimple, ppidlReal);
1668
1669 hr = IShellFolder_ParseDisplayName(psf, NULL, NULL, szPath, NULL, ppidlReal, NULL);
1670 if (hr == E_INVALIDARG || hr == E_NOTIMPL)
1671 return SHILClone(pidlSimple, ppidlReal);
1672
1673 return hr;
1674}
1675
1679 _In_ PCWSTR pszCommandName,
1681{
1682 HRESULT hr;
1684 if (SUCCEEDED(hr = pUnk->QueryInterface(IID_PPV_ARG(IInitializeCommand, &pIC))))
1685 hr = pIC->Initialize(pszCommandName, pPB);
1686 return hr;
1687}
1688
1691 _In_ IExecuteCommand *pEC,
1692 _In_ PCWSTR pszCommandName,
1694 _In_opt_ IShellItemArray *pSIA,
1695 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1696 _In_opt_ IUnknown *pSite)
1697{
1698 if (!pEC)
1699 return E_INVALIDARG;
1700
1701 if (pSite)
1702 IUnknown_SetSite(pEC, pSite);
1703 IUnknown_InitializeCommand(pEC, pszCommandName, pPB);
1704
1706 if (pSIA && SUCCEEDED(pEC->QueryInterface(IID_PPV_ARG(IObjectWithSelection, &pOWS))))
1707 pOWS->SetSelection(pSIA);
1708
1709 DWORD dwKeyState = 0, fMask = pICI ? pICI->fMask : 0;
1710 pEC->SetNoShowUI((fMask & CMIC_MASK_FLAG_NO_UI) != 0);
1711 pEC->SetShowWindow(pICI ? pICI->nShow : SW_SHOW);
1712 if (fMask & CMIC_MASK_SHIFT_DOWN)
1713 dwKeyState |= MK_SHIFT;
1714 if (fMask & CMIC_MASK_CONTROL_DOWN)
1715 dwKeyState |= MK_CONTROL;
1716 pEC->SetKeyState(dwKeyState);
1717 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpDirectoryW)
1718 pEC->SetDirectory(pICI->lpDirectoryW);
1719 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpParametersW)
1720 pEC->SetParameters(pICI->lpParametersW);
1721 if (fMask & CMIC_MASK_PTINVOKE)
1722 pEC->SetPosition(pICI->ptInvoke);
1723
1724 HRESULT hr = pEC->Execute();
1725 if (pSite)
1726 IUnknown_SetSite(pEC, NULL);
1727 return hr;
1728}
1729
1732 _In_ IExecuteCommand *pEC,
1733 _In_ PCWSTR pszCommandName,
1735 _In_ IDataObject *pDO,
1736 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1737 _In_opt_ IUnknown *pSite)
1738{
1740 HRESULT hr = SHCreateShellItemArrayFromDataObject(pDO, IID_PPV_ARG(IShellItemArray, &pSIA));
1741 return SUCCEEDED(hr) ? InvokeIExecuteCommand(pEC, pszCommandName, pPB, pSIA, pICI, pSite) : hr;
1742}
1743
1744static HRESULT
1746{
1747 HRESULT hr = pCM->GetCommandString(Id, GCS & ~GCS_UNICODE, NULL, Buf, cchMax);
1748 if (FAILED(hr))
1749 {
1751 hr = pCM->GetCommandString(Id, GCS | GCS_UNICODE, NULL, (LPSTR)buf, _countof(buf));
1752 if (SUCCEEDED(hr))
1753 hr = SHUnicodeToAnsi(buf, Buf, cchMax) > 0 ? S_OK : E_FAIL;
1754 }
1755 return hr;
1756}
1757
1758UINT
1760{
1761 CHAR buf[MAX_PATH];
1762 if (IS_INTRESOURCE(verba))
1763 {
1764 if (FAILED(GetCommandStringA(pCM, LOWORD(verba), GCS_VERB, buf, _countof(buf))))
1765 return 0;
1766 verba = buf;
1767 }
1768 return MapVerbToDfmCmd(verba); // Returns DFM_CMD_* or 0
1769}
1770
1771HRESULT
1772SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
1773{
1774 LPCSTR pVerbA = pICI->lpVerb;
1775 CHAR buf[MAX_PATH];
1776 LPCMINVOKECOMMANDINFOEX pICIX = (LPCMINVOKECOMMANDINFOEX)pICI;
1777 if (IsUnicode(*pICIX) && !IS_INTRESOURCE(pICIX->lpVerbW))
1778 {
1779 if (SHUnicodeToAnsi(pICIX->lpVerbW, buf, _countof(buf)))
1780 pVerbA = buf;
1781 }
1782
1783 if (IS_INTRESOURCE(pVerbA))
1784 return LOWORD(pVerbA);
1785 for (SIZE_T i = 0; pMap[i].Verb; ++i)
1786 {
1787 assert(SUCCEEDED((int)(pMap[i].CmdId))); // The id must be >= 0 and ideally in the 0..0x7fff range
1788 if (!lstrcmpiA(pMap[i].Verb, pVerbA) && pVerbA[0])
1789 return pMap[i].CmdId;
1790 }
1791 return E_FAIL;
1792}
1793
1794static const CMVERBMAP*
1796{
1797 for (SIZE_T i = 0; pMap[i].Verb; ++i)
1798 {
1799 if (pMap[i].CmdId == CmdId)
1800 return &pMap[i];
1801 }
1802 return NULL;
1803}
1804
1805HRESULT
1807{
1808 const CMVERBMAP* pEntry;
1809 switch (uFlags | GCS_UNICODE)
1810 {
1811 case GCS_VALIDATEW:
1812 case GCS_VERBW:
1813 pEntry = FindVerbMapEntry(CmdId, pMap);
1814 if ((uFlags | GCS_UNICODE) == GCS_VERBW)
1815 {
1816 if (!pEntry)
1817 return E_INVALIDARG;
1818 else if (uFlags & GCS_UNICODE)
1819 return SHAnsiToUnicode(pEntry->Verb, (LPWSTR)Buf, cchBuf) ? S_OK : E_FAIL;
1820 else
1821 return StringCchCopyA(Buf, cchBuf, pEntry->Verb);
1822 }
1823 return pEntry ? S_OK : S_FALSE; // GCS_VALIDATE
1824 }
1825 return E_NOTIMPL;
1826}
1827
1828HRESULT
1830{
1834 return hr;
1835 initIcon->SetNormalIcon(swShell32Name, IconIndex);
1836 return initIcon->QueryInterface(riid, ppvOut);
1837}
1838
1839/*************************************************************************
1840 * SHIsBadInterfacePtr [SHELL32.84]
1841 *
1842 * Retired in 6.0 from Windows Vista and higher.
1843 */
1847 _In_ LPCVOID pv,
1848 _In_ UINT_PTR ucb)
1849{
1850 struct CUnknownVtbl
1851 {
1855 };
1856 struct CUnknown { CUnknownVtbl *lpVtbl; };
1857 const CUnknown *punk = reinterpret_cast<const CUnknown *>(pv);
1858 return !punk || IsBadReadPtr(punk, sizeof(punk->lpVtbl)) ||
1859 IsBadReadPtr(punk->lpVtbl, ucb) ||
1860 IsBadCodePtr((FARPROC)punk->lpVtbl->Release);
1861}
1862
1863/*************************************************************************
1864 * SHGetUserDisplayName [SHELL32.241]
1865 *
1866 * @see https://undoc.airesoft.co.uk/shell32.dll/SHGetUserDisplayName.php
1867 */
1871 _Out_writes_to_(*puSize, *puSize) PWSTR pName,
1872 _Inout_ PULONG puSize)
1873{
1874 if (!pName || !puSize)
1875 return E_INVALIDARG;
1876
1877 if (GetUserNameExW(NameDisplay, pName, puSize))
1878 return S_OK;
1879
1880 LONG error = GetLastError(); // for ERROR_NONE_MAPPED
1882
1883 WCHAR UserName[MAX_PATH];
1884 DWORD cchUserName = _countof(UserName);
1885 if (!GetUserNameW(UserName, &cchUserName))
1887
1888 // Was the user name not available in the specified format (NameDisplay)?
1889 if (error == ERROR_NONE_MAPPED)
1890 {
1891 // Try to get the user name by using Network API
1892 PUSER_INFO_2 UserInfo;
1893 DWORD NetError = NetUserGetInfo(NULL, UserName, 2, (PBYTE*)&UserInfo);
1894 if (NetError)
1895 {
1896 hr = HRESULT_FROM_WIN32(NetError);
1897 }
1898 else
1899 {
1900 if (UserInfo->usri2_full_name)
1901 {
1902 hr = StringCchCopyW(pName, *puSize, UserInfo->usri2_full_name);
1903 if (SUCCEEDED(hr))
1904 {
1905 // Include the NUL-terminator
1906 *puSize = lstrlenW(UserInfo->usri2_full_name) + 1;
1907 }
1908 }
1909
1910 NetApiBufferFree(UserInfo);
1911 }
1912 }
1913
1914 if (FAILED(hr))
1915 {
1916 hr = StringCchCopyW(pName, *puSize, UserName);
1917 if (SUCCEEDED(hr))
1918 *puSize = cchUserName;
1919 }
1920
1921 return hr;
1922}
1923
1924// Skip leading backslashes
1925static PCWSTR
1927 _In_ PCWSTR pszPath)
1928{
1929 PCWSTR pch;
1930 for (pch = pszPath; *pch == L'\\'; ++pch)
1931 ;
1932 return pch;
1933}
1934
1935// The registry key for server computer descriptions cache
1936#define COMPUTER_DESCRIPTIONS_KEY \
1937 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComputerDescriptions"
1938
1939// Get server computer description from cache
1940static HRESULT
1942 _Out_writes_z_(cchDescMax) PWSTR pszDesc,
1943 _In_ DWORD cchDescMax,
1944 _In_ PCWSTR pszServerName)
1945{
1946 cchDescMax *= sizeof(WCHAR);
1948 SHELL_SkipServerSlashes(pszServerName), NULL, pszDesc, &cchDescMax);
1949 return HRESULT_FROM_WIN32(error);
1950}
1951
1952// Do cache a server computer description
1953static VOID
1955 _In_ PCWSTR pszServerName,
1956 _In_ PCWSTR pszDesc)
1957{
1958 if (!pszDesc)
1959 return;
1960
1961 SIZE_T cbDesc = (wcslen(pszDesc) + 1) * sizeof(WCHAR);
1963 SHELL_SkipServerSlashes(pszServerName), REG_SZ, pszDesc, (DWORD)cbDesc);
1964}
1965
1966// Get real server computer description
1967static HRESULT
1969 _Out_writes_z_(cchDescMax) PWSTR pszDesc,
1970 _In_ SIZE_T cchDescMax,
1971 _In_ PWSTR pszServerName)
1972{
1974 NET_API_STATUS error = NetServerGetInfo(pszServerName, 101, (PBYTE*)&bufptr);
1977 return hr;
1978
1979 PCWSTR comment = bufptr->sv101_comment;
1980 if (comment && comment[0])
1981 StringCchCopyW(pszDesc, cchDescMax, comment);
1982 else
1983 hr = E_FAIL;
1984
1986 return hr;
1987}
1988
1989// Build computer display name
1990static HRESULT
1992 _Out_writes_z_(cchNameMax) PWSTR pszName,
1993 _In_ DWORD cchNameMax,
1994 _In_ PCWSTR pszServerName,
1995 _In_ PCWSTR pszDescription)
1996{
1997 if (!pszDescription || !*pszDescription)
1998 return E_FAIL;
1999
2000 PCWSTR pszFormat = (SHRestricted(REST_ALLOWCOMMENTTOGGLE) ? L"%2 (%1)" : L"%1 (%2)");
2001 PCWSTR args[] = { pszDescription , SHELL_SkipServerSlashes(pszServerName) };
2003 pszFormat, 0, 0, pszName, cchNameMax, (va_list *)args) ? S_OK : E_FAIL);
2004}
2005
2006/*************************************************************************
2007 * SHGetComputerDisplayNameW [SHELL32.752]
2008 */
2012 _In_opt_ PWSTR pszServerName,
2014 _Out_writes_z_(cchNameMax) PWSTR pszName,
2015 _In_ DWORD cchNameMax)
2016{
2017 WCHAR szDesc[256], szCompName[MAX_COMPUTERNAME_LENGTH + 1];
2018
2019 // If no server name is specified, retrieve the local computer name
2020 if (!pszServerName)
2021 {
2022 // Use computer name as server name
2023 DWORD cchCompName = _countof(szCompName);
2024 if (!GetComputerNameW(szCompName, &cchCompName))
2025 return E_FAIL;
2026 pszServerName = szCompName;
2027
2028 // Don't use the cache for the local machine
2030 }
2031
2032 // Get computer description from cache if necessary
2033 HRESULT hr = E_FAIL;
2034 if (!(dwFlags & SHGCDN_NOCACHE))
2035 hr = SHELL_GetCachedComputerDescription(szDesc, _countof(szDesc), pszServerName);
2036
2037 // Actually retrieve the computer description if it is not in the cache
2038 if (FAILED(hr))
2039 {
2040 hr = SHELL_GetComputerDescription(szDesc, _countof(szDesc), pszServerName);
2041 if (FAILED(hr))
2042 szDesc[0] = UNICODE_NULL;
2043
2044 // Cache the description if necessary
2045 if (!(dwFlags & SHGCDN_NOCACHE))
2046 SHELL_CacheComputerDescription(pszServerName, szDesc);
2047 }
2048
2049 // If getting the computer description failed, store the server name only
2050 if (FAILED(hr) || !szDesc[0])
2051 {
2053 return hr; // Bail out if no server name is requested
2054
2055 StringCchCopyW(pszName, cchNameMax, SHELL_SkipServerSlashes(pszServerName));
2056 return S_OK;
2057 }
2058
2059 // If no server name is requested, store the description only
2061 {
2062 StringCchCopyW(pszName, cchNameMax, szDesc);
2063 return S_OK;
2064 }
2065
2066 // Build a string like "Description (SERVERNAME)"
2067 return SHELL_BuildDisplayMachineName(pszName, cchNameMax, pszServerName, szDesc);
2068}
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
char * va_list
Definition: acmsvcex.h:78
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:81
#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:559
STDMETHODIMP GetWindow(HWND *phWnd) override
Definition: utils.cpp:583
STDMETHODIMP_(ULONG) Release() override
Definition: utils.cpp:572
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override
Definition: utils.cpp:590
STDMETHODIMP_(ULONG) AddRef() override
Definition: utils.cpp:568
virtual ~CDummyOleWindow()
Definition: utils.cpp:556
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:203
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
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:519
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:4262
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4224
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1666
#define IS_INTRESOURCE(x)
Definition: loader.c:613
int WINAPI PathCommonPrefixW(const WCHAR *file1, const WCHAR *file2, WCHAR *path)
Definition: path.c:1563
void WINAPI PathRemoveExtensionW(WCHAR *path)
Definition: path.c:1889
BOOL WINAPI PathRemoveFileSpecW(WCHAR *path)
Definition: path.c:1088
BOOL WINAPI PathUnExpandEnvStringsW(const WCHAR *path, WCHAR *buffer, UINT buf_len)
Definition: path.c:2648
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
Definition: path.c:2164
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
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:193
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:406
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:910
BOOL WINAPI IsSuspendAllowed(VOID)
Definition: utils.cpp:850
HRESULT SHELL_CreateShell32DefaultExtractIcon(int IconIndex, REFIID riid, LPVOID *ppvOut)
Definition: utils.cpp:1829
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:2011
EXTERN_C HRESULT WINAPI SHEnumerateUnreadMailAccountsW(_In_opt_ HKEY hKeyUser, _In_ DWORD dwIndex, _Out_writes_(cchMailAddress) PWSTR pszMailAddress, _In_ INT cchMailAddress)
Definition: utils.cpp:1137
static const CMVERBMAP * FindVerbMapEntry(UINT_PTR CmdId, const CMVERBMAP *pMap)
Definition: utils.cpp:1795
#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:954
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:448
static HRESULT SHELL_GetComputerDescription(_Out_writes_z_(cchDescMax) PWSTR pszDesc, _In_ SIZE_T cchDescMax, _In_ PWSTR pszServerName)
Definition: utils.cpp:1968
static VOID DynamicPathRemoveBackslashW(_Out_ CStringW &strPath)
Definition: utils.cpp:1599
EXTERN_C WORD WINAPI ExtractIconResInfoA(_In_ HANDLE hHandle, _In_ LPCSTR lpFileName, _In_ WORD wIndex, _Out_ LPWORD lpSize, _Out_ LPHANDLE lpIcon)
Definition: utils.cpp:675
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:503
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:133
static HRESULT GetCommandStringA(_In_ IContextMenu *pCM, _In_ UINT_PTR Id, _In_ UINT GCS, _Out_writes_(cchMax) LPSTR Buf, _In_ UINT cchMax)
Definition: utils.cpp:1745
EXTERN_C BOOL WINAPI PathIsEqualOrSubFolder(_In_ LPCWSTR pszPath1OrCSIDL, _In_ LPCWSTR pszPath2)
Definition: utils.cpp:1612
EXTERN_C HRESULT WINAPI SHGetRealIDL(_In_ IShellFolder *psf, _In_ PCUITEMID_CHILD pidlSimple, _Outptr_ PITEMID_CHILD *ppidlReal)
Definition: utils.cpp:1643
EXTERN_C DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken)
Definition: utils.cpp:716
#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:1242
EXTERN_C BOOL WINAPI SHTestTokenPrivilegeW(_In_opt_ HANDLE hToken, _In_ LPCWSTR lpName)
Definition: utils.cpp:786
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:278
static HRESULT SHELL_BuildDisplayMachineName(_Out_writes_z_(cchNameMax) PWSTR pszName, _In_ DWORD cchNameMax, _In_ PCWSTR pszServerName, _In_ PCWSTR pszDescription)
Definition: utils.cpp:1991
static VOID SHELL_CacheComputerDescription(_In_ PCWSTR pszServerName, _In_ PCWSTR pszDesc)
Definition: utils.cpp:1954
EXTERN_C HRESULT WINAPI SHInvokePrivilegedFunctionW(_In_ LPCWSTR pszName, _In_ PRIVILEGED_FUNCTION fn, _In_opt_ LPARAM lParam)
Definition: utils.cpp:743
BOOL BindCtx_ContainsObject(_In_ IBindCtx *pBindCtx, _In_ LPCWSTR pszName)
Definition: utils.cpp:270
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:303
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:1690
EXTERN_C LPWSTR WINAPI ShortSizeFormatW(_In_ DWORD dwNumber, _Out_writes_(0x8FFF) LPWSTR pszBuffer)
Definition: utils.cpp:696
static PCSTR StrEndNA(_In_ PCSTR psz, _In_ INT_PTR cch)
Definition: utils.cpp:17
EXTERN_C LPSTR WINAPI SheRemoveQuotesA(LPSTR psz)
Definition: utils.cpp:1087
BOOL Shell_FailForceReturn(_In_ HRESULT hr)
Definition: utils.cpp:320
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:370
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:1527
EXTERN_C HRESULT IUnknown_InitializeCommand(_In_ IUnknown *pUnk, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB)
Definition: utils.cpp:1677
static HRESULT DynamicSHGetPathFromIDListW(_In_ LPCITEMIDLIST pidl, _Out_ CStringW &strPath)
Definition: utils.cpp:1544
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:1302
EXTERN_C BOOL WINAPI Activate_RunDLL(_In_ HWND hwnd, _In_ HINSTANCE hinst, _In_ LPCWSTR cmdline, _In_ INT cmdshow)
Definition: utils.cpp:1477
EXTERN_C BOOL WINAPI PathIsSlowA(_In_ LPCSTR pszFile, _In_ DWORD dwAttr)
Definition: utils.cpp:661
UINT GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba)
Definition: utils.cpp:1759
HRESULT SHELL_GetCommandStringImpl(SIZE_T CmdId, UINT uFlags, LPSTR Buf, UINT cchBuf, const CMVERBMAP *pMap)
Definition: utils.cpp:1806
EXTERN_C HRESULT WINAPI DisplayNameOfW(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_ LPWSTR pszBuf, _In_ UINT cchBuf)
Definition: utils.cpp:432
EXTERN_C HRESULT WINAPI SHSetUnreadMailCountW(_In_ PCWSTR pszMailAddress, _In_ DWORD dwCount, _In_ PCWSTR pszShellExecuteCommand)
Definition: utils.cpp:1032
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:1340
EXTERN_C HINSTANCE WINAPI SHGetShellStyleHInstance(VOID)
Definition: utils.cpp:861
EXTERN_C HRESULT SHELL_GetUIObjectOfAbsoluteItem(_In_opt_ HWND hWnd, _In_ PCIDLIST_ABSOLUTE pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:380
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:1941
EXTERN_C HRESULT BindCtx_RegisterObjectParam(_In_ IBindCtx *pBindCtx, _In_ LPOLESTR pszKey, _In_opt_ IUnknown *punk, _Out_ LPBC *ppbc)
Definition: utils.cpp:597
EXTERN_C HRESULT WINAPI CopyStreamUI(_In_ IStream *pSrc, _Out_ IStream *pDst, _Inout_opt_ IProgressDialog *pProgress, _In_opt_ DWORDLONG dwlSize)
Definition: utils.cpp:1359
EXTERN_C HRESULT WINAPI SHGetUserDisplayName(_Out_writes_to_(*puSize, *puSize) PWSTR pName, _Inout_ PULONG puSize)
Definition: utils.cpp:1870
#define COMPUTER_DESCRIPTIONS_KEY
Definition: utils.cpp:1936
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:1171
static HRESULT Int64ToStr(_In_ LONGLONG llValue, _Out_writes_(cchValue) LPWSTR pszValue, _In_ UINT cchValue)
Definition: utils.cpp:1197
HRESULT SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
Definition: utils.cpp:1772
EXTERN_C LPWSTR WINAPI SheRemoveQuotesW(LPWSTR psz)
Definition: utils.cpp:1112
EXTERN_C BOOL WINAPI SHIsBadInterfacePtr(_In_ LPCVOID pv, _In_ UINT_PTR ucb)
Definition: utils.cpp:1846
EXTERN_C HRESULT WINAPI SHCreatePropertyBag(_In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:903
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:1731
EXTERN_C HWND BindCtx_GetUIWindow(_In_ IBindCtx *pBindCtx)
Definition: utils.cpp:537
HRESULT SHBindToObjectEx(_In_opt_ IShellFolder *pShellFolder, _In_ LPCITEMIDLIST pidl, _In_opt_ IBindCtx *pBindCtx, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:337
EXTERN_C HRESULT WINAPI SHSetFolderPathA(_In_ INT csidl, _In_ HANDLE hToken, _In_ DWORD dwFlags, _In_ LPCSTR pszPath)
Definition: utils.cpp:643
HRESULT Shell_TranslateIDListAlias(_In_ LPCITEMIDLIST pidl, _In_ HANDLE hToken, _Out_ LPITEMIDLIST *ppidlAlias, _In_ DWORD dwFlags)
Definition: utils.cpp:261
BOOL IsShutdownAllowed(VOID)
Definition: utils.cpp:842
BOOL SHSkipJunctionBinding(_In_ IBindCtx *pbc, _In_ CLSID *pclsid)
Definition: utils.cpp:291
HRESULT SHELL_GetIDListTarget(_In_ LPCITEMIDLIST pidl, _Out_ PIDLIST_ABSOLUTE *ppidl)
Definition: utils.cpp:482
BOOL PathIsDotOrDotDotW(_In_ LPCWSTR pszPath)
Definition: utils.cpp:146
static PCWSTR SHELL_SkipServerSlashes(_In_ PCWSTR pszPath)
Definition: utils.cpp:1926
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogA(_In_ HWND hwnd, _In_ LPCSTR pszRemoteName, _In_ DWORD dwType)
Definition: utils.cpp:1503
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:193
EXTERN_C HRESULT WINAPI SHShouldShowWizards(_In_ IUnknown *pUnknown)
Definition: utils.cpp:216
EXTERN_C BOOL WINAPI SHOpenEffectiveToken(_Out_ LPHANDLE phToken)
Definition: utils.cpp:707
static HRESULT DynamicSHGetSpecialFolderPathW(_In_ HWND hwndOwner, _Out_ CStringW &strPath, _In_ INT nCSIDL, _In_ BOOL bCreate)
Definition: utils.cpp:1576
HRESULT SHCoInitializeAnyApartment(VOID)
Definition: utils.cpp:494
BOOL PathIsDosDevice(_In_ LPCWSTR pszName)
Definition: utils.cpp:172
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3384
DWORD WINAPI SHGetObjectCompatFlags(IUnknown *pUnk, const CLSID *clsid)
Definition: ordinal.c:6482
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:4762
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1411
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:2673
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2797
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2394
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:1530
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
Definition: string.c:1631
#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:971
static const WCHAR szColorName[]
Definition: system.c:42
#define assert(x)
Definition: debug.h:53
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
_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 int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
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
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
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
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
#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 DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
static HRESULT QueryInterface(REFIID, void **)
Definition: events.c:2587
static LPOLESTR
Definition: stg_prop.c:27
static ULONG WINAPI AddRef(IStream *iface)
Definition: clist.c:90
#define min(a, b)
Definition: monoChain.cc:55
DWORD NET_API_STATUS
Definition: ms-dtyp.idl:91
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int UINT
Definition: ndis.h:50
#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:1496
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1019
#define DWORD
Definition: nt_native.h:44
#define KEY_SET_VALUE
Definition: nt_native.h:1017
#define LOCALE_USER_DEFAULT
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define ANSI_NULL
#define L(x)
Definition: ntvdm.h:50
#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 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:1045
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1498
BOOLEAN WINAPI IsPwrSuspendAllowed(VOID)
Definition: powrprof.c:488
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 REFIID
Definition: guiddef.h:118
#define REG_DWORD
Definition: sdbapi.c:596
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
int zero
Definition: sehframes.cpp:29
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
Definition: shellord.c:225
HRESULT hr
Definition: shlfolder.c:183
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1528
#define CSIDL_FLAG_DONT_VERIFY
Definition: shlobj.h:2242
#define SSF_WEBVIEW
Definition: shlobj.h:1628
@ REST_ALLOWCOMMENTTOGGLE
Definition: shlobj.h:1879
#define QITABENT(Cthis, Ifoo)
Definition: shlwapi.h:2150
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
$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
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
uint16_t * LPWORD
Definition: typedefs.h:56
int64_t LONGLONG
Definition: typedefs.h:68
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:843
#define FMT_USE_GROUPING
Definition: undocshell.h:841
#define SHGCDN_NOSERVERNAME
Definition: undocshell.h:999
#define FMT_USE_NUMDIGITS
Definition: undocshell.h:839
#define FMT_USE_NEGNUMBER
Definition: undocshell.h:844
#define FMT_USE_LEADZERO
Definition: undocshell.h:840
HRESULT(CALLBACK * PRIVILEGED_FUNCTION)(LPARAM lParam)
Definition: undocshell.h:872
#define SHGCDN_NOCACHE
Definition: undocshell.h:998
#define FMT_USE_DECIMAL
Definition: undocshell.h:842
DWORD dwAttributes
Definition: vdmdbg.h:34
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2658
static GLenum _GLUfuncptr fn
Definition: wgl_font.c:159
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
#define ZeroMemory
Definition: winbase.h:1753
_In_opt_ LPSTR _In_opt_ LPSTR _In_ DWORD _In_ DWORD _Out_opt_ PHANDLE phToken
Definition: winbase.h:2756
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LPCSTR lpFileName
Definition: winbase.h:3112
#define FORMAT_MESSAGE_FROM_STRING
Definition: winbase.h:454
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1148
#define LPTR
Definition: winbase.h:414
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:375
_In_ LPCSTR lpName
Definition: winbase.h:2830
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define INVALID_FILE_SIZE
Definition: winbase.h:584
#define FORMAT_MESSAGE_ARGUMENT_ARRAY
Definition: winbase.h:457
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2808
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:276
WINBASEAPI _In_ DWORD nLength
Definition: wincon.h:682
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
CONST void * LPCVOID
Definition: windef.h:191
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define ERROR_BAD_NETPATH
Definition: winerror.h:145
#define S_FALSE
Definition: winerror.h:2357
#define E_NOT_SUFFICIENT_BUFFER
Definition: winerror.h:2345
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
#define ERROR_CANCELLED
Definition: winerror.h:726
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define HRESULT_CODE(hr)
Definition: winerror.h:76
#define ERROR_NO_TOKEN
Definition: winerror.h:587
#define ERROR_BAD_NET_NAME
Definition: winerror.h:159
#define ERROR_NONE_MAPPED
Definition: winerror.h:814
#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:413
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define MK_SHIFT
Definition: winuser.h:2388
#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:2389
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
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
char CHAR
Definition: xmlstorage.h:175
unsigned char BYTE
Definition: xxhash.c:193