ReactOS 0.4.16-dev-976-g18fc5a1
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
405/***********************************************************************
406 * DisplayNameOfW [SHELL32.757] (Vista+)
407 */
410 _In_ IShellFolder *psf,
411 _In_ LPCITEMIDLIST pidl,
413 _Out_ LPWSTR pszBuf,
414 _In_ UINT cchBuf)
415{
416 *pszBuf = UNICODE_NULL;
417 STRRET sr;
418 HRESULT hr = psf->GetDisplayNameOf(pidl, dwFlags, &sr);
419 if (FAILED(hr))
420 return hr;
421 return StrRetToBufW(&sr, pidl, pszBuf, cchBuf);
422}
423
424DWORD
426{
427 LPCITEMIDLIST pidlLast = pidl;
428 IShellFolder *release = NULL;
429
430 if (!psf)
431 {
432 SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlLast);
433 if (!psf)
434 return 0;
435 release = psf;
436 }
437
438 DWORD oldAttrs = dwAttributes;
439 if (FAILED(psf->GetAttributesOf(1, &pidlLast, &dwAttributes)))
440 dwAttributes = 0;
441 else
442 dwAttributes &= oldAttrs;
443
444 if ((dwAttributes & SFGAO_FOLDER) &&
445 (dwAttributes & SFGAO_STREAM) &&
446 !(dwAttributes & SFGAO_STORAGEANCESTOR) &&
447 (oldAttrs & SFGAO_STORAGEANCESTOR) &&
448 (SHGetObjectCompatFlags(psf, NULL) & 0x200))
449 {
450 dwAttributes &= ~(SFGAO_STREAM | SFGAO_STORAGEANCESTOR);
451 dwAttributes |= SFGAO_STORAGEANCESTOR;
452 }
453
454 if (release)
455 release->Release();
456 return dwAttributes;
457}
458
460{
461 IShellLink *pSL;
462 HRESULT hr = SHBindToObject(NULL, pidl, IID_PPV_ARG(IShellLink, &pSL));
463 if (SUCCEEDED(hr))
464 {
465 hr = pSL->GetIDList(ppidl); // Note: Returns S_FALSE if no target pidl
466 pSL->Release();
467 }
468 return hr;
469}
470
472{
474 if (FAILED(hr))
476 return hr;
477}
478
481 _In_ LPCITEMIDLIST pidl,
483 _Out_opt_ LPWSTR pszText,
484 _In_ UINT cchBuf,
485 _Inout_opt_ DWORD *pdwAttributes)
486{
487 if (pszText)
488 *pszText = UNICODE_NULL;
489
491
492 CComPtr<IShellFolder> psfFolder;
493 LPCITEMIDLIST ppidlLast;
494 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfFolder), &ppidlLast);
495 if (SUCCEEDED(hr))
496 {
497 if (pszText)
498 hr = DisplayNameOfW(psfFolder, ppidlLast, dwFlags, pszText, cchBuf);
499
500 if (SUCCEEDED(hr))
501 {
502 if (pdwAttributes)
503 *pdwAttributes = SHGetAttributes(psfFolder, ppidlLast, *pdwAttributes);
504 }
505 }
506
507 if (SUCCEEDED(hrCoInit))
509
510 return hr;
511}
512
515{
516 HWND hWnd = NULL;
517
519 if (pBindCtx && SUCCEEDED(pBindCtx->GetObjectParam((LPWSTR)L"UI During Binding", &punk)))
520 IUnknown_GetWindow(punk, &hWnd);
521
522 return hWnd;
523}
524
526{
527protected:
530
531public:
533 virtual ~CDummyOleWindow() { }
534
535 // IUnknown methods
537 {
538 static const QITAB c_tab[] =
539 {
541 { NULL }
542 };
543 return ::QISearch(this, c_tab, riid, ppvObj);
544 }
546 {
547 return ++m_cRefs;
548 }
550 {
551 if (--m_cRefs == 0)
552 {
553 delete this;
554 return 0;
555 }
556 return m_cRefs;
557 }
558
559 // IOleWindow methods
560 STDMETHODIMP GetWindow(HWND *phWnd) override
561 {
562 *phWnd = m_hWnd;
563 if (!m_hWnd)
564 return E_NOTIMPL;
565 return S_OK;
566 }
568 {
569 return E_NOTIMPL;
570 }
571};
572
575 _In_ IBindCtx *pBindCtx,
576 _In_ LPOLESTR pszKey,
577 _In_opt_ IUnknown *punk,
578 _Out_ LPBC *ppbc)
579{
580 HRESULT hr = S_OK;
582
583 *ppbc = pBindCtx;
584
585 if (pBindCtx)
586 {
587 pBindCtx->AddRef();
588 }
589 else
590 {
591 hr = CreateBindCtx(0, ppbc);
592 if (FAILED(hr))
593 return hr;
594 }
595
596 if (!punk)
597 punk = pUnknown = new CDummyOleWindow();
598
599 hr = (*ppbc)->RegisterObjectParam(pszKey, punk);
600
601 if (pUnknown)
602 pUnknown->Release();
603
604 if (FAILED(hr))
605 {
606 (*ppbc)->Release();
607 *ppbc = NULL;
608 }
609
610 return hr;
611}
612
613/*************************************************************************
614 * SHSetFolderPathA (SHELL32.231)
615 *
616 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shsetfolderpatha
617 */
621 _In_ INT csidl,
622 _In_ HANDLE hToken,
624 _In_ LPCSTR pszPath)
625{
626 TRACE("(%d, %p, 0x%X, %s)\n", csidl, hToken, dwFlags, debugstr_a(pszPath));
627 CStringW strPathW(pszPath);
628 return SHSetFolderPathW(csidl, hToken, dwFlags, strPathW);
629}
630
631/*************************************************************************
632 * PathIsSlowA (SHELL32.240)
633 *
634 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj/nf-shlobj-pathisslowa
635 */
639 _In_ LPCSTR pszFile,
640 _In_ DWORD dwAttr)
641{
642 TRACE("(%s, 0x%X)\n", debugstr_a(pszFile), dwAttr);
643 CStringW strFileW(pszFile);
644 return PathIsSlowW(strFileW, dwAttr);
645}
646
647/*************************************************************************
648 * ExtractIconResInfoA (SHELL32.221)
649 */
653 _In_ HANDLE hHandle,
655 _In_ WORD wIndex,
656 _Out_ LPWORD lpSize,
657 _Out_ LPHANDLE lpIcon)
658{
659 TRACE("(%p, %s, %u, %p, %p)\n", hHandle, debugstr_a(lpFileName), wIndex, lpSize, lpIcon);
660
661 if (!lpFileName)
662 return 0;
663
664 CStringW strFileNameW(lpFileName);
665 return ExtractIconResInfoW(hHandle, strFileNameW, wIndex, lpSize, lpIcon);
666}
667
668/*************************************************************************
669 * ShortSizeFormatW (SHELL32.204)
670 */
674 _In_ DWORD dwNumber,
675 _Out_writes_(0x8FFF) LPWSTR pszBuffer)
676{
677 TRACE("(%lu, %p)\n", dwNumber, pszBuffer);
678 return StrFormatByteSizeW(dwNumber, pszBuffer, 0x8FFF);
679}
680
681/*************************************************************************
682 * SHOpenEffectiveToken (SHELL32.235)
683 */
685{
686 TRACE("%p\n", phToken);
688}
689
690/*************************************************************************
691 * SHGetUserSessionId (SHELL32.248)
692 */
694{
695 DWORD dwSessionId, dwLength;
696 BOOL bOpenToken = FALSE;
697
698 TRACE("%p\n", hToken);
699
700 if (!hToken)
701 bOpenToken = SHOpenEffectiveToken(&hToken);
702
703 if (!hToken ||
704 !GetTokenInformation(hToken, TokenSessionId, &dwSessionId, sizeof(dwSessionId), &dwLength))
705 {
706 dwSessionId = 0;
707 }
708
709 if (bOpenToken)
710 CloseHandle(hToken);
711
712 return dwSessionId;
713}
714
715/*************************************************************************
716 * SHInvokePrivilegedFunctionW (SHELL32.246)
717 */
721 _In_ LPCWSTR pszName,
724{
725 TRACE("(%s %p %p)\n", debugstr_w(pszName), fn, lParam);
726
727 if (!pszName || !fn)
728 return E_INVALIDARG;
729
730 HANDLE hToken = NULL;
731 TOKEN_PRIVILEGES NewPriv, PrevPriv;
732 BOOL bAdjusted = FALSE;
733
734 if (SHOpenEffectiveToken(&hToken) &&
735 ::LookupPrivilegeValueW(NULL, pszName, &NewPriv.Privileges[0].Luid))
736 {
737 NewPriv.PrivilegeCount = 1;
739
740 DWORD dwReturnSize;
741 bAdjusted = ::AdjustTokenPrivileges(hToken, FALSE, &NewPriv,
742 sizeof(PrevPriv), &PrevPriv, &dwReturnSize);
743 }
744
745 HRESULT hr = fn(lParam);
746
747 if (bAdjusted)
748 ::AdjustTokenPrivileges(hToken, FALSE, &PrevPriv, 0, NULL, NULL);
749
750 if (hToken)
751 ::CloseHandle(hToken);
752
753 return hr;
754}
755
756/*************************************************************************
757 * SHTestTokenPrivilegeW (SHELL32.236)
758 *
759 * @see http://undoc.airesoft.co.uk/shell32.dll/SHTestTokenPrivilegeW.php
760 */
764 _In_opt_ HANDLE hToken,
766{
767 LUID Luid;
769 PTOKEN_PRIVILEGES pTokenPriv;
770 HANDLE hNewToken = NULL;
771 BOOL ret = FALSE;
772
773 TRACE("(%p, %s)\n", hToken, debugstr_w(lpName));
774
775 if (!lpName)
776 return FALSE;
777
778 if (!hToken)
779 {
780 if (!SHOpenEffectiveToken(&hNewToken))
781 goto Quit;
782
783 if (!hNewToken)
784 return FALSE;
785
786 hToken = hNewToken;
787 }
788
789 if (!LookupPrivilegeValueW(NULL, lpName, &Luid))
790 return FALSE;
791
792 dwLength = 0;
794 goto Quit;
795
797 if (!pTokenPriv)
798 goto Quit;
799
800 if (GetTokenInformation(hToken, TokenPrivileges, pTokenPriv, dwLength, &dwLength))
801 {
802 UINT iPriv, cPrivs;
803 cPrivs = pTokenPriv->PrivilegeCount;
804 for (iPriv = 0; !ret && iPriv < cPrivs; ++iPriv)
805 {
806 ret = RtlEqualLuid(&Luid, &pTokenPriv->Privileges[iPriv].Luid);
807 }
808 }
809
810 LocalFree(pTokenPriv);
811
812Quit:
813 if (hToken == hNewToken)
814 CloseHandle(hNewToken);
815
816 return ret;
817}
818
820{
822}
823
824/*************************************************************************
825 * IsSuspendAllowed (SHELL32.53)
826 */
828{
829 TRACE("()\n");
831}
832
833/*************************************************************************
834 * SHGetShellStyleHInstance (SHELL32.749)
835 */
837WINAPI
839{
842 HRESULT hr;
843 CStringW strShellStyle;
844
845 TRACE("SHGetShellStyleHInstance called\n");
846
847 /* First, attempt to load the shellstyle dll from the current active theme */
849 if (FAILED(hr))
850 goto DoDefault;
851
852 /* Strip the theme filename */
854
855 strShellStyle = szPath;
856 strShellStyle += L"\\Shell\\";
857 strShellStyle += szColorName;
858 strShellStyle += L"\\ShellStyle.dll";
859
861 if (hInst)
862 return hInst;
863
864 /* Otherwise, use the version stored in the System32 directory */
865DoDefault:
866 if (!ExpandEnvironmentStringsW(L"%SystemRoot%\\System32\\ShellStyle.dll",
868 {
869 ERR("Expand failed\n");
870 return NULL;
871 }
873}
874
875/*************************************************************************
876 * SHCreatePropertyBag (SHELL32.715)
877 */
879WINAPI
881{
883}
884
885// The helper function for SHGetUnreadMailCountW
886static DWORD
888 _In_ HKEY hKey,
889 _Out_opt_ PDWORD pdwCount,
890 _Out_opt_ PFILETIME pFileTime,
891 _Out_writes_opt_(cchShellExecuteCommand) LPWSTR pszShellExecuteCommand,
892 _In_ INT cchShellExecuteCommand)
893{
894 DWORD dwType, dwCount, cbSize = sizeof(dwCount);
895 DWORD error = SHQueryValueExW(hKey, L"MessageCount", 0, &dwType, &dwCount, &cbSize);
896 if (error)
897 return error;
898 if (pdwCount && dwType == REG_DWORD)
899 *pdwCount = dwCount;
900
901 FILETIME FileTime;
902 cbSize = sizeof(FileTime);
903 error = SHQueryValueExW(hKey, L"TimeStamp", 0, &dwType, &FileTime, &cbSize);
904 if (error)
905 return error;
906 if (pFileTime && dwType == REG_BINARY)
907 *pFileTime = FileTime;
908
909 WCHAR szName[2 * MAX_PATH];
910 cbSize = sizeof(szName);
911 error = SHQueryValueExW(hKey, L"Application", 0, &dwType, szName, &cbSize);
912 if (error)
913 return error;
914
915 if (pszShellExecuteCommand && dwType == REG_SZ &&
916 FAILED(StringCchCopyW(pszShellExecuteCommand, cchShellExecuteCommand, szName)))
917 {
919 }
920
921 return ERROR_SUCCESS;
922}
923
924/*************************************************************************
925 * SHGetUnreadMailCountW [SHELL32.320]
926 *
927 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shgetunreadmailcountw
928 */
932 _In_opt_ HKEY hKeyUser,
933 _In_opt_ PCWSTR pszMailAddress,
934 _Out_opt_ PDWORD pdwCount,
935 _Inout_opt_ PFILETIME pFileTime,
936 _Out_writes_opt_(cchShellExecuteCommand) PWSTR pszShellExecuteCommand,
937 _In_ INT cchShellExecuteCommand)
938{
940 HKEY hKey;
941
942 if (!hKeyUser)
943 hKeyUser = HKEY_CURRENT_USER;
944
945 if (pszMailAddress)
946 {
947 CStringW strKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail";
948 strKey += L'\\';
949 strKey += pszMailAddress;
950
951 error = RegOpenKeyExW(hKeyUser, strKey, 0, KEY_QUERY_VALUE, &hKey);
952 if (error)
954
955 error = SHELL_ReadSingleUnreadMailCount(hKey, pdwCount, pFileTime,
956 pszShellExecuteCommand, cchShellExecuteCommand);
957 }
958 else
959 {
960 if (pszShellExecuteCommand || cchShellExecuteCommand)
961 return E_INVALIDARG;
962
963 *pdwCount = 0;
964
965 error = RegOpenKeyExW(hKeyUser, L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
967 if (error)
969
970 for (DWORD dwIndex = 0; !error; ++dwIndex)
971 {
972 WCHAR Name[2 * MAX_PATH];
974 FILETIME LastWritten;
975 error = RegEnumKeyExW(hKey, dwIndex, Name, &cchName, NULL, NULL, NULL, &LastWritten);
976 if (error)
977 break;
978
979 HKEY hSubKey;
980 error = RegOpenKeyExW(hKey, Name, 0, KEY_QUERY_VALUE, &hSubKey);
981 if (error)
982 break;
983
984 FILETIME FileTime;
985 DWORD dwCount;
986 error = SHELL_ReadSingleUnreadMailCount(hSubKey, &dwCount, &FileTime, NULL, 0);
987 if (!error && (!pFileTime || CompareFileTime(&FileTime, pFileTime) >= 0))
988 *pdwCount += dwCount;
989
990 RegCloseKey(hSubKey);
991 }
992
995 }
996
998
1000}
1001
1002/*************************************************************************
1003 * SHSetUnreadMailCountW [SHELL32.336]
1004 *
1005 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shsetunreadmailcountw
1006 */
1010 _In_ PCWSTR pszMailAddress,
1011 _In_ DWORD dwCount,
1012 _In_ PCWSTR pszShellExecuteCommand)
1013{
1014 CString strKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail\\";
1015 strKey += pszMailAddress;
1016
1017 HKEY hKey;
1018 DWORD dwDisposition;
1020 &hKey, &dwDisposition);
1021 if (error)
1022 return HRESULT_FROM_WIN32(error);
1023
1024 error = RegSetValueExW(hKey, L"MessageCount", 0, REG_DWORD, (PBYTE)&dwCount, sizeof(dwCount));
1025 if (error)
1026 {
1028 return HRESULT_FROM_WIN32(error);
1029 }
1030
1031 FILETIME FileTime;
1032 GetSystemTimeAsFileTime(&FileTime);
1033
1034 error = RegSetValueExW(hKey, L"TimeStamp", 0, REG_BINARY, (PBYTE)&FileTime, sizeof(FileTime));
1035 if (error)
1036 {
1038 return HRESULT_FROM_WIN32(error);
1039 }
1040
1041 WCHAR szBuff[2 * MAX_PATH];
1042 if (!PathUnExpandEnvStringsW(pszShellExecuteCommand, szBuff, _countof(szBuff)))
1043 {
1044 HRESULT hr = StringCchCopyW(szBuff, _countof(szBuff), pszShellExecuteCommand);
1046 {
1048 return hr;
1049 }
1050 }
1051
1052 DWORD cbValue = (lstrlenW(szBuff) + 1) * sizeof(WCHAR);
1053 error = RegSetValueExW(hKey, L"Application", 0, REG_SZ, (PBYTE)szBuff, cbValue);
1054
1056 return (error ? HRESULT_FROM_WIN32(error) : S_OK);
1057}
1058
1059/*************************************************************************
1060 * SheRemoveQuotesA (SHELL32.@)
1061 */
1063WINAPI
1065{
1066 PCHAR pch;
1067
1068 if (*psz == '"')
1069 {
1070 for (pch = psz + 1; *pch && *pch != '"'; ++pch)
1071 {
1072 *(pch - 1) = *pch;
1073 }
1074
1075 if (*pch == '"')
1076 *(pch - 1) = ANSI_NULL;
1077 }
1078
1079 return psz;
1080}
1081
1082/*************************************************************************
1083 * SheRemoveQuotesW (SHELL32.@)
1084 *
1085 * ExtractAssociatedIconExW uses this function.
1086 */
1088WINAPI
1090{
1091 PWCHAR pch;
1092
1093 if (*psz == L'"')
1094 {
1095 for (pch = psz + 1; *pch && *pch != L'"'; ++pch)
1096 {
1097 *(pch - 1) = *pch;
1098 }
1099
1100 if (*pch == L'"')
1101 *(pch - 1) = UNICODE_NULL;
1102 }
1103
1104 return psz;
1105}
1106
1107/*************************************************************************
1108 * SHEnumerateUnreadMailAccountsW [SHELL32.287]
1109 *
1110 * @see https://learn.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shenumerateunreadmailaccountsw
1111 */
1115 _In_opt_ HKEY hKeyUser,
1116 _In_ DWORD dwIndex,
1117 _Out_writes_(cchMailAddress) PWSTR pszMailAddress,
1118 _In_ INT cchMailAddress)
1119{
1120 if (!hKeyUser)
1121 hKeyUser = HKEY_CURRENT_USER;
1122
1123 HKEY hKey;
1124 LSTATUS error = RegOpenKeyExW(hKeyUser,
1125 L"Software\\Microsoft\\Windows\\CurrentVersion\\UnreadMail",
1127 if (error)
1128 return HRESULT_FROM_WIN32(error);
1129
1130 FILETIME FileTime;
1131 error = RegEnumKeyExW(hKey, dwIndex, pszMailAddress, (PDWORD)&cchMailAddress, NULL, NULL,
1132 NULL, &FileTime);
1133 if (error)
1134 *pszMailAddress = UNICODE_NULL;
1135
1137 return error ? HRESULT_FROM_WIN32(error) : S_OK;
1138}
1139
1140/*************************************************************************
1141 * SHFindComputer [SHELL32.91]
1142 *
1143 * Invokes the shell search in My Computer. Used in SHFindFiles.
1144 * Two parameters are ignored.
1145 */
1147WINAPI
1149{
1150 UNREFERENCED_PARAMETER(pidlRoot);
1151 UNREFERENCED_PARAMETER(pidlSavedSearch);
1152
1153 TRACE("%p %p\n", pidlRoot, pidlSavedSearch);
1154
1155 IContextMenu *pCM;
1156 HRESULT hr = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER,
1157 IID_IContextMenu, (void **)&pCM);
1158 if (FAILED(hr))
1159 {
1160 ERR("0x%08X\n", hr);
1161 return hr;
1162 }
1163
1164 CMINVOKECOMMANDINFO InvokeInfo = { sizeof(InvokeInfo) };
1165 InvokeInfo.lpParameters = "{996E1EB1-B524-11D1-9120-00A0C98BA67D}";
1166 InvokeInfo.nShow = SW_SHOWNORMAL;
1167 hr = pCM->InvokeCommand(&InvokeInfo);
1168 pCM->Release();
1169
1170 return SUCCEEDED(hr);
1171}
1172
1173static HRESULT
1175 _In_ LONGLONG llValue,
1176 _Out_writes_(cchValue) LPWSTR pszValue,
1177 _In_ UINT cchValue)
1178{
1179 WCHAR szBuff[40];
1180 UINT ich = 0, ichValue;
1181#if (WINVER >= _WIN32_WINNT_VISTA)
1182 BOOL bMinus = (llValue < 0);
1183
1184 if (bMinus)
1185 llValue = -llValue;
1186#endif
1187
1188 if (cchValue <= 0)
1189 return E_FAIL;
1190
1191 do
1192 {
1193 szBuff[ich++] = (WCHAR)(L'0' + (llValue % 10));
1194 llValue /= 10;
1195 } while (llValue != 0 && ich < _countof(szBuff) - 1);
1196
1197#if (WINVER >= _WIN32_WINNT_VISTA)
1198 if (bMinus && ich < _countof(szBuff))
1199 szBuff[ich++] = '-';
1200#endif
1201
1202 for (ichValue = 0; ich > 0 && ichValue < cchValue; ++ichValue)
1203 {
1204 --ich;
1205 pszValue[ichValue] = szBuff[ich];
1206 }
1207
1208 if (ichValue >= cchValue)
1209 {
1210 pszValue[cchValue - 1] = UNICODE_NULL;
1211 return E_FAIL;
1212 }
1213
1214 pszValue[ichValue] = UNICODE_NULL;
1215 return S_OK;
1216}
1217
1218static VOID
1220 _Out_ NUMBERFMTW *pDest,
1221 _In_opt_ const NUMBERFMTW *pSrc,
1222 _In_ DWORD dwNumberFlags,
1223 _Out_writes_(cchDecimal) LPWSTR pszDecimal,
1224 _In_ INT cchDecimal,
1225 _Out_writes_(cchThousand) LPWSTR pszThousand,
1226 _In_ INT cchThousand)
1227{
1228 WCHAR szBuff[20];
1229
1230 if (pSrc)
1231 *pDest = *pSrc;
1232 else
1233 dwNumberFlags = 0;
1234
1235 if (!(dwNumberFlags & FMT_USE_NUMDIGITS))
1236 {
1238 pDest->NumDigits = StrToIntW(szBuff);
1239 }
1240
1241 if (!(dwNumberFlags & FMT_USE_LEADZERO))
1242 {
1244 pDest->LeadingZero = StrToIntW(szBuff);
1245 }
1246
1247 if (!(dwNumberFlags & FMT_USE_GROUPING))
1248 {
1250 pDest->Grouping = StrToIntW(szBuff);
1251 }
1252
1253 if (!(dwNumberFlags & FMT_USE_DECIMAL))
1254 {
1255 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, pszDecimal, cchDecimal);
1256 pDest->lpDecimalSep = pszDecimal;
1257 }
1258
1259 if (!(dwNumberFlags & FMT_USE_THOUSAND))
1260 {
1261 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, pszThousand, cchThousand);
1262 pDest->lpThousandSep = pszThousand;
1263 }
1264
1265 if (!(dwNumberFlags & FMT_USE_NEGNUMBER))
1266 {
1268 pDest->NegativeOrder = StrToIntW(szBuff);
1269 }
1270}
1271
1272/*************************************************************************
1273 * Int64ToString [SHELL32.209]
1274 *
1275 * @see http://undoc.airesoft.co.uk/shell32.dll/Int64ToString.php
1276 */
1278INT WINAPI
1280 _In_ LONGLONG llValue,
1281 _Out_writes_(cchOut) LPWSTR pszOut,
1282 _In_ UINT cchOut,
1283 _In_ BOOL bUseFormat,
1284 _In_opt_ const NUMBERFMTW *pNumberFormat,
1285 _In_ DWORD dwNumberFlags)
1286{
1287 INT ret;
1288 NUMBERFMTW NumFormat;
1289 WCHAR szValue[80], szDecimalSep[6], szThousandSep[6];
1290
1291 Int64ToStr(llValue, szValue, _countof(szValue));
1292
1293 if (bUseFormat)
1294 {
1295 Int64GetNumFormat(&NumFormat, pNumberFormat, dwNumberFlags,
1296 szDecimalSep, _countof(szDecimalSep),
1297 szThousandSep, _countof(szThousandSep));
1298 ret = GetNumberFormatW(LOCALE_USER_DEFAULT, 0, szValue, &NumFormat, pszOut, cchOut);
1299 if (ret)
1300 --ret;
1301 return ret;
1302 }
1303
1304 if (FAILED(StringCchCopyW(pszOut, cchOut, szValue)))
1305 return 0;
1306
1307 return lstrlenW(pszOut);
1308}
1309
1310/*************************************************************************
1311 * LargeIntegerToString [SHELL32.210]
1312 *
1313 * @see http://undoc.airesoft.co.uk/shell32.dll/LargeIntegerToString.php
1314 */
1316INT WINAPI
1318 _In_ const LARGE_INTEGER *pLargeInt,
1319 _Out_writes_(cchOut) LPWSTR pszOut,
1320 _In_ UINT cchOut,
1321 _In_ BOOL bUseFormat,
1322 _In_opt_ const NUMBERFMTW *pNumberFormat,
1323 _In_ DWORD dwNumberFlags)
1324{
1325 return Int64ToString(pLargeInt->QuadPart, pszOut, cchOut, bUseFormat,
1326 pNumberFormat, dwNumberFlags);
1327}
1328
1329/*************************************************************************
1330 * CopyStreamUI [SHELL32.726]
1331 *
1332 * Copy a stream to another stream with optional progress display.
1333 */
1337 _In_ IStream *pSrc,
1338 _Out_ IStream *pDst,
1339 _Inout_opt_ IProgressDialog *pProgress,
1340 _In_opt_ DWORDLONG dwlSize)
1341{
1342 HRESULT hr = E_FAIL;
1343 DWORD cbBuff, cbRead, dwSizeToWrite;
1344 DWORDLONG cbDone;
1345 LPVOID pBuff;
1346 CComHeapPtr<BYTE> pHeapPtr;
1347 STATSTG Stat;
1348 BYTE abBuff[1024];
1349
1350 TRACE("(%p, %p, %p, %I64u)\n", pSrc, pDst, pProgress, dwlSize);
1351
1352 if (dwlSize == 0) // Invalid size?
1353 {
1354 // Get the stream size
1355 ZeroMemory(&Stat, sizeof(Stat));
1356 if (FAILED(pSrc->Stat(&Stat, STATFLAG_NONAME)))
1357 pProgress = NULL; // No size info. Disable progress
1358 else
1359 dwlSize = Stat.cbSize.QuadPart;
1360 }
1361
1362 if (!pProgress) // Progress is disabled?
1363 {
1364 ULARGE_INTEGER uliSize;
1365
1366 if (dwlSize > 0)
1367 uliSize.QuadPart = dwlSize;
1368 else
1369 uliSize.HighPart = uliSize.LowPart = INVALID_FILE_SIZE;
1370
1371 return pSrc->CopyTo(pDst, uliSize, NULL, NULL); // One punch
1372 }
1373
1374 // Allocate the buffer if necessary
1375 if (dwlSize > 0 && dwlSize <= sizeof(abBuff))
1376 {
1377 cbBuff = sizeof(abBuff);
1378 pBuff = abBuff;
1379 }
1380 else
1381 {
1382#define COPY_STREAM_DEFAULT_BUFFER_SIZE 0x4000
1384 if (pHeapPtr.AllocateBytes(cbBuff))
1385 {
1386 pBuff = pHeapPtr;
1387 }
1388 else // Low memory?
1389 {
1390 cbBuff = sizeof(abBuff);
1391 pBuff = abBuff;
1392 }
1393#undef COPY_STREAM_DEFAULT_BUFFER_SIZE
1394 }
1395
1396 // Start reading
1398 zero.QuadPart = 0;
1399 pSrc->Seek(zero, 0, NULL);
1400 pDst->Seek(zero, 0, NULL);
1401 cbDone = 0;
1402 pProgress->SetProgress64(cbDone, dwlSize);
1403
1404 // Repeat reading and writing until goal
1405 for (;;)
1406 {
1407 hr = pSrc->Read(pBuff, cbBuff, &cbRead);
1408 if (FAILED(hr))
1409 break;
1410
1411 // Calculate the size to write
1412 if (dwlSize > 0)
1413 dwSizeToWrite = (DWORD)min((DWORDLONG)(dwlSize - cbDone), (DWORDLONG)cbRead);
1414 else
1415 dwSizeToWrite = cbRead;
1416
1417 if (dwSizeToWrite == 0) // No need to write?
1418 {
1419 hr = S_OK;
1420 break;
1421 }
1422
1423 hr = pDst->Write(pBuff, dwSizeToWrite, NULL);
1424 if (hr != S_OK)
1425 break;
1426
1427 cbDone += dwSizeToWrite;
1428
1429 if (pProgress->HasUserCancelled()) // Cancelled?
1430 {
1432 break;
1433 }
1434 pProgress->SetProgress64(cbDone, dwlSize);
1435
1436 if (dwlSize > 0 && cbDone >= dwlSize) // Reached the goal?
1437 {
1438 hr = S_OK;
1439 break;
1440 }
1441 }
1442
1443 return hr;
1444}
1445
1446/*************************************************************************
1447 * Activate_RunDLL [SHELL32.105]
1448 *
1449 * Unlocks the foreground window and allows the shell window to become the
1450 * foreground window. Every parameter is unused.
1451 */
1455 _In_ HWND hwnd,
1458 _In_ INT cmdshow)
1459{
1460 DWORD dwProcessID;
1461
1465 UNREFERENCED_PARAMETER(cmdshow);
1466
1467 TRACE("(%p, %p, %s, %d)\n", hwnd, hinst, debugstr_w(cmdline), cmdline);
1468
1470 return AllowSetForegroundWindow(dwProcessID);
1471}
1472
1473/*************************************************************************
1474 * SHStartNetConnectionDialogA (SHELL32.12)
1475 *
1476 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shstartnetconnectiondialoga
1477 */
1481 _In_ HWND hwnd,
1482 _In_ LPCSTR pszRemoteName,
1483 _In_ DWORD dwType)
1484{
1485 LPCWSTR pszRemoteNameW = NULL;
1486 CStringW strRemoteNameW;
1487
1488 TRACE("(%p, %s, %lu)\n", hwnd, debugstr_a(pszRemoteName), dwType);
1489
1490 if (pszRemoteName)
1491 {
1492 strRemoteNameW = pszRemoteName;
1493 pszRemoteNameW = strRemoteNameW;
1494 }
1495
1496 return SHStartNetConnectionDialogW(hwnd, pszRemoteNameW, dwType);
1497}
1498
1499/*************************************************************************
1500 * Helper functions for PathIsEqualOrSubFolder
1501 */
1502
1503static INT
1505 _In_ LPCWSTR lpszPath1,
1506 _In_ LPCWSTR lpszPath2,
1507 _Out_ CStringW& strPath)
1508{
1509 SIZE_T cchPath1 = wcslen(lpszPath1);
1510 SIZE_T cchPath2 = wcslen(lpszPath2);
1511 LPWSTR lpszPath = strPath.GetBuffer((INT)max(cchPath1, cchPath2) + 16);
1512 INT ret = PathCommonPrefixW(lpszPath1, lpszPath2, lpszPath);
1513 strPath.ReleaseBuffer();
1514 return ret;
1515}
1516
1519
1520static HRESULT
1522 _In_ LPCITEMIDLIST pidl,
1523 _Out_ CStringW& strPath)
1524{
1525 HRESULT hr;
1526
1527 for (UINT cchPath = MAX_PATH;; cchPath *= 2)
1528 {
1529 LPWSTR lpszPath = strPath.GetBuffer(cchPath);
1530 if (!lpszPath)
1531 return E_OUTOFMEMORY;
1532
1533 hr = SHGetPathCchFromIDListW(pidl, lpszPath, cchPath);
1534 strPath.ReleaseBuffer();
1535
1537 break;
1538
1539 if (cchPath >= MAXUINT / 2)
1540 {
1541 hr = E_FAIL;
1542 break;
1543 }
1544 }
1545
1546 if (FAILED(hr))
1547 strPath.Empty();
1548
1549 return hr;
1550}
1551
1552static HRESULT
1554 _In_ HWND hwndOwner,
1555 _Out_ CStringW& strPath,
1556 _In_ INT nCSIDL,
1558{
1559 LPITEMIDLIST pidl;
1560 HRESULT hr = SHGetSpecialFolderLocation(hwndOwner, nCSIDL, &pidl);
1561 if (SUCCEEDED(hr))
1562 {
1563 hr = DynamicSHGetPathFromIDListW(pidl, strPath);
1564 CoTaskMemFree(pidl);
1565 }
1566
1567 if (FAILED(hr))
1568 strPath.Empty();
1569 else if (bCreate)
1570 CreateDirectoryW(strPath, NULL);
1571
1572 return hr;
1573}
1574
1575static VOID
1577 _Out_ CStringW& strPath)
1578{
1579 INT nLength = strPath.GetLength();
1580 if (nLength > 0 && strPath[nLength - 1] == L'\\')
1581 strPath = strPath.Left(nLength - 1);
1582}
1583
1584/*************************************************************************
1585 * PathIsEqualOrSubFolder (SHELL32.755)
1586 */
1590 _In_ LPCWSTR pszPath1OrCSIDL,
1591 _In_ LPCWSTR pszPath2)
1592{
1593 CStringW strCommon, strPath1;
1594
1595 TRACE("(%s %s)\n", debugstr_w(pszPath1OrCSIDL), debugstr_w(pszPath2));
1596
1597 if (IS_INTRESOURCE(pszPath1OrCSIDL))
1598 {
1600 NULL, strPath1, LOWORD(pszPath1OrCSIDL) | CSIDL_FLAG_DONT_VERIFY, FALSE);
1601 }
1602 else
1603 {
1604 strPath1 = pszPath1OrCSIDL;
1605 }
1606
1608
1609 if (!DynamicPathCommonPrefixW(strPath1, pszPath2, strCommon))
1610 return FALSE;
1611
1612 return strPath1.CompareNoCase(strCommon) == 0;
1613}
1614
1615/*************************************************************************
1616 * SHGetRealIDL [SHELL32.98]
1617 */
1621 _In_ IShellFolder *psf,
1622 _In_ PCUITEMID_CHILD pidlSimple,
1623 _Outptr_ PITEMID_CHILD *ppidlReal)
1624{
1625 HRESULT hr;
1626 STRRET strret;
1628 SFGAOF attrs;
1629
1630 *ppidlReal = NULL;
1631
1632 hr = IShellFolder_GetDisplayNameOf(psf, pidlSimple, SHGDN_INFOLDER | SHGDN_FORPARSING,
1633 &strret, 0);
1635 return hr;
1636
1637 hr = StrRetToBufW(&strret, pidlSimple, szPath, _countof(szPath));
1639 return hr;
1640
1641 attrs = SFGAO_FILESYSTEM;
1642 hr = psf->GetAttributesOf(1, &pidlSimple, &attrs);
1643 if (SUCCEEDED(hr) && !(attrs & SFGAO_FILESYSTEM))
1644 return SHILClone(pidlSimple, ppidlReal);
1645
1646 hr = IShellFolder_ParseDisplayName(psf, NULL, NULL, szPath, NULL, ppidlReal, NULL);
1647 if (hr == E_INVALIDARG || hr == E_NOTIMPL)
1648 return SHILClone(pidlSimple, ppidlReal);
1649
1650 return hr;
1651}
1652
1656 _In_ PCWSTR pszCommandName,
1658{
1659 HRESULT hr;
1661 if (SUCCEEDED(hr = pUnk->QueryInterface(IID_PPV_ARG(IInitializeCommand, &pIC))))
1662 hr = pIC->Initialize(pszCommandName, pPB);
1663 return hr;
1664}
1665
1668 _In_ IExecuteCommand *pEC,
1669 _In_ PCWSTR pszCommandName,
1671 _In_opt_ IShellItemArray *pSIA,
1672 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1673 _In_opt_ IUnknown *pSite)
1674{
1675 if (!pEC)
1676 return E_INVALIDARG;
1677
1678 if (pSite)
1679 IUnknown_SetSite(pEC, pSite);
1680 IUnknown_InitializeCommand(pEC, pszCommandName, pPB);
1681
1683 if (pSIA && SUCCEEDED(pEC->QueryInterface(IID_PPV_ARG(IObjectWithSelection, &pOWS))))
1684 pOWS->SetSelection(pSIA);
1685
1686 DWORD dwKeyState = 0, fMask = pICI ? pICI->fMask : 0;
1687 pEC->SetNoShowUI((fMask & CMIC_MASK_FLAG_NO_UI) != 0);
1688 pEC->SetShowWindow(pICI ? pICI->nShow : SW_SHOW);
1689 if (fMask & CMIC_MASK_SHIFT_DOWN)
1690 dwKeyState |= MK_SHIFT;
1691 if (fMask & CMIC_MASK_CONTROL_DOWN)
1692 dwKeyState |= MK_CONTROL;
1693 pEC->SetKeyState(dwKeyState);
1694 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpDirectoryW)
1695 pEC->SetDirectory(pICI->lpDirectoryW);
1696 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpParametersW)
1697 pEC->SetParameters(pICI->lpParametersW);
1698 if (fMask & CMIC_MASK_PTINVOKE)
1699 pEC->SetPosition(pICI->ptInvoke);
1700
1701 HRESULT hr = pEC->Execute();
1702 if (pSite)
1703 IUnknown_SetSite(pEC, NULL);
1704 return hr;
1705}
1706
1709 _In_ IExecuteCommand *pEC,
1710 _In_ PCWSTR pszCommandName,
1712 _In_ IDataObject *pDO,
1713 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1714 _In_opt_ IUnknown *pSite)
1715{
1717 HRESULT hr = SHCreateShellItemArrayFromDataObject(pDO, IID_PPV_ARG(IShellItemArray, &pSIA));
1718 return SUCCEEDED(hr) ? InvokeIExecuteCommand(pEC, pszCommandName, pPB, pSIA, pICI, pSite) : hr;
1719}
1720
1721static HRESULT
1723{
1724 HRESULT hr = pCM->GetCommandString(Id, GCS & ~GCS_UNICODE, NULL, Buf, cchMax);
1725 if (FAILED(hr))
1726 {
1728 hr = pCM->GetCommandString(Id, GCS | GCS_UNICODE, NULL, (LPSTR)buf, _countof(buf));
1729 if (SUCCEEDED(hr))
1730 hr = SHUnicodeToAnsi(buf, Buf, cchMax) > 0 ? S_OK : E_FAIL;
1731 }
1732 return hr;
1733}
1734
1735UINT
1737{
1738 CHAR buf[MAX_PATH];
1739 if (IS_INTRESOURCE(verba))
1740 {
1741 if (FAILED(GetCommandStringA(pCM, LOWORD(verba), GCS_VERB, buf, _countof(buf))))
1742 return 0;
1743 verba = buf;
1744 }
1745 return MapVerbToDfmCmd(verba); // Returns DFM_CMD_* or 0
1746}
1747
1748HRESULT
1749SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
1750{
1751 LPCSTR pVerbA = pICI->lpVerb;
1752 CHAR buf[MAX_PATH];
1753 LPCMINVOKECOMMANDINFOEX pICIX = (LPCMINVOKECOMMANDINFOEX)pICI;
1754 if (IsUnicode(*pICIX) && !IS_INTRESOURCE(pICIX->lpVerbW))
1755 {
1756 if (SHUnicodeToAnsi(pICIX->lpVerbW, buf, _countof(buf)))
1757 pVerbA = buf;
1758 }
1759
1760 if (IS_INTRESOURCE(pVerbA))
1761 return LOWORD(pVerbA);
1762 for (SIZE_T i = 0; pMap[i].Verb; ++i)
1763 {
1764 assert(SUCCEEDED((int)(pMap[i].CmdId))); // The id must be >= 0 and ideally in the 0..0x7fff range
1765 if (!lstrcmpiA(pMap[i].Verb, pVerbA) && pVerbA[0])
1766 return pMap[i].CmdId;
1767 }
1768 return E_FAIL;
1769}
1770
1771static const CMVERBMAP*
1773{
1774 for (SIZE_T i = 0; pMap[i].Verb; ++i)
1775 {
1776 if (pMap[i].CmdId == CmdId)
1777 return &pMap[i];
1778 }
1779 return NULL;
1780}
1781
1782HRESULT
1784{
1785 const CMVERBMAP* pEntry;
1786 switch (uFlags | GCS_UNICODE)
1787 {
1788 case GCS_VALIDATEW:
1789 case GCS_VERBW:
1790 pEntry = FindVerbMapEntry(CmdId, pMap);
1791 if ((uFlags | GCS_UNICODE) == GCS_VERBW)
1792 {
1793 if (!pEntry)
1794 return E_INVALIDARG;
1795 else if (uFlags & GCS_UNICODE)
1796 return SHAnsiToUnicode(pEntry->Verb, (LPWSTR)Buf, cchBuf) ? S_OK : E_FAIL;
1797 else
1798 return StringCchCopyA(Buf, cchBuf, pEntry->Verb);
1799 }
1800 return pEntry ? S_OK : S_FALSE; // GCS_VALIDATE
1801 }
1802 return E_NOTIMPL;
1803}
1804
1805HRESULT
1807{
1811 return hr;
1812 initIcon->SetNormalIcon(swShell32Name, IconIndex);
1813 return initIcon->QueryInterface(riid, ppvOut);
1814}
1815
1816/*************************************************************************
1817 * SHIsBadInterfacePtr [SHELL32.84]
1818 *
1819 * Retired in 6.0 from Windows Vista and higher.
1820 */
1824 _In_ LPCVOID pv,
1825 _In_ UINT_PTR ucb)
1826{
1827 struct CUnknownVtbl
1828 {
1832 };
1833 struct CUnknown { CUnknownVtbl *lpVtbl; };
1834 const CUnknown *punk = reinterpret_cast<const CUnknown *>(pv);
1835 return !punk || IsBadReadPtr(punk, sizeof(punk->lpVtbl)) ||
1836 IsBadReadPtr(punk->lpVtbl, ucb) ||
1837 IsBadCodePtr((FARPROC)punk->lpVtbl->Release);
1838}
1839
1840/*************************************************************************
1841 * SHGetUserDisplayName [SHELL32.241]
1842 *
1843 * @see https://undoc.airesoft.co.uk/shell32.dll/SHGetUserDisplayName.php
1844 */
1848 _Out_writes_to_(*puSize, *puSize) PWSTR pName,
1849 _Inout_ PULONG puSize)
1850{
1851 if (!pName || !puSize)
1852 return E_INVALIDARG;
1853
1854 if (GetUserNameExW(NameDisplay, pName, puSize))
1855 return S_OK;
1856
1857 LONG error = GetLastError(); // for ERROR_NONE_MAPPED
1859
1860 WCHAR UserName[MAX_PATH];
1861 DWORD cchUserName = _countof(UserName);
1862 if (!GetUserNameW(UserName, &cchUserName))
1864
1865 // Was the user name not available in the specified format (NameDisplay)?
1866 if (error == ERROR_NONE_MAPPED)
1867 {
1868 // Try to get the user name by using Network API
1869 PUSER_INFO_2 UserInfo;
1870 DWORD NetError = NetUserGetInfo(NULL, UserName, 2, (PBYTE*)&UserInfo);
1871 if (NetError)
1872 {
1873 hr = HRESULT_FROM_WIN32(NetError);
1874 }
1875 else
1876 {
1877 if (UserInfo->usri2_full_name)
1878 {
1879 hr = StringCchCopyW(pName, *puSize, UserInfo->usri2_full_name);
1880 if (SUCCEEDED(hr))
1881 {
1882 // Include the NUL-terminator
1883 *puSize = lstrlenW(UserInfo->usri2_full_name) + 1;
1884 }
1885 }
1886
1887 NetApiBufferFree(UserInfo);
1888 }
1889 }
1890
1891 if (FAILED(hr))
1892 {
1893 hr = StringCchCopyW(pName, *puSize, UserName);
1894 if (SUCCEEDED(hr))
1895 *puSize = cchUserName;
1896 }
1897
1898 return hr;
1899}
1900
1901// Skip leading backslashes
1902static PCWSTR
1904 _In_ PCWSTR pszPath)
1905{
1906 PCWSTR pch;
1907 for (pch = pszPath; *pch == L'\\'; ++pch)
1908 ;
1909 return pch;
1910}
1911
1912// The registry key for server computer descriptions cache
1913#define COMPUTER_DESCRIPTIONS_KEY \
1914 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComputerDescriptions"
1915
1916// Get server computer description from cache
1917static HRESULT
1919 _Out_writes_z_(cchDescMax) PWSTR pszDesc,
1920 _In_ DWORD cchDescMax,
1921 _In_ PCWSTR pszServerName)
1922{
1923 cchDescMax *= sizeof(WCHAR);
1925 SHELL_SkipServerSlashes(pszServerName), NULL, pszDesc, &cchDescMax);
1926 return HRESULT_FROM_WIN32(error);
1927}
1928
1929// Do cache a server computer description
1930static VOID
1932 _In_ PCWSTR pszServerName,
1933 _In_ PCWSTR pszDesc)
1934{
1935 if (!pszDesc)
1936 return;
1937
1938 SIZE_T cbDesc = (wcslen(pszDesc) + 1) * sizeof(WCHAR);
1940 SHELL_SkipServerSlashes(pszServerName), REG_SZ, pszDesc, (DWORD)cbDesc);
1941}
1942
1943// Get real server computer description
1944static HRESULT
1946 _Out_writes_z_(cchDescMax) PWSTR pszDesc,
1947 _In_ SIZE_T cchDescMax,
1948 _In_ PWSTR pszServerName)
1949{
1951 NET_API_STATUS error = NetServerGetInfo(pszServerName, 101, (PBYTE*)&bufptr);
1954 return hr;
1955
1956 PCWSTR comment = bufptr->sv101_comment;
1957 if (comment && comment[0])
1958 StringCchCopyW(pszDesc, cchDescMax, comment);
1959 else
1960 hr = E_FAIL;
1961
1963 return hr;
1964}
1965
1966// Build computer display name
1967static HRESULT
1969 _Out_writes_z_(cchNameMax) PWSTR pszName,
1970 _In_ DWORD cchNameMax,
1971 _In_ PCWSTR pszServerName,
1972 _In_ PCWSTR pszDescription)
1973{
1974 if (!pszDescription || !*pszDescription)
1975 return E_FAIL;
1976
1977 PCWSTR pszFormat = (SHRestricted(REST_ALLOWCOMMENTTOGGLE) ? L"%2 (%1)" : L"%1 (%2)");
1978 PCWSTR args[] = { pszDescription , SHELL_SkipServerSlashes(pszServerName) };
1980 pszFormat, 0, 0, pszName, cchNameMax, (va_list *)args) ? S_OK : E_FAIL);
1981}
1982
1983/*************************************************************************
1984 * SHGetComputerDisplayNameW [SHELL32.752]
1985 */
1989 _In_opt_ PWSTR pszServerName,
1991 _Out_writes_z_(cchNameMax) PWSTR pszName,
1992 _In_ DWORD cchNameMax)
1993{
1994 WCHAR szDesc[256], szCompName[MAX_COMPUTERNAME_LENGTH + 1];
1995
1996 // If no server name is specified, retrieve the local computer name
1997 if (!pszServerName)
1998 {
1999 // Use computer name as server name
2000 DWORD cchCompName = _countof(szCompName);
2001 if (!GetComputerNameW(szCompName, &cchCompName))
2002 return E_FAIL;
2003 pszServerName = szCompName;
2004
2005 // Don't use the cache for the local machine
2007 }
2008
2009 // Get computer description from cache if necessary
2010 HRESULT hr = E_FAIL;
2011 if (!(dwFlags & SHGCDN_NOCACHE))
2012 hr = SHELL_GetCachedComputerDescription(szDesc, _countof(szDesc), pszServerName);
2013
2014 // Actually retrieve the computer description if it is not in the cache
2015 if (FAILED(hr))
2016 {
2017 hr = SHELL_GetComputerDescription(szDesc, _countof(szDesc), pszServerName);
2018 if (FAILED(hr))
2019 szDesc[0] = UNICODE_NULL;
2020
2021 // Cache the description if necessary
2022 if (!(dwFlags & SHGCDN_NOCACHE))
2023 SHELL_CacheComputerDescription(pszServerName, szDesc);
2024 }
2025
2026 // If getting the computer description failed, store the server name only
2027 if (FAILED(hr) || !szDesc[0])
2028 {
2030 return hr; // Bail out if no server name is requested
2031
2032 StringCchCopyW(pszName, cchNameMax, SHELL_SkipServerSlashes(pszServerName));
2033 return S_OK;
2034 }
2035
2036 // If no server name is requested, store the description only
2038 {
2039 StringCchCopyW(pszName, cchNameMax, szDesc);
2040 return S_OK;
2041 }
2042
2043 // Build a string like "Description (SERVERNAME)"
2044 return SHELL_BuildDisplayMachineName(pszName, cchNameMax, pszServerName, szDesc);
2045}
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:71
const DWORD ExStyle
Definition: appswitch.c:72
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:536
STDMETHODIMP GetWindow(HWND *phWnd) override
Definition: utils.cpp:560
STDMETHODIMP_(ULONG) Release() override
Definition: utils.cpp:549
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override
Definition: utils.cpp:567
STDMETHODIMP_(ULONG) AddRef() override
Definition: utils.cpp:545
virtual ~CDummyOleWindow()
Definition: utils.cpp:533
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:211
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
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
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
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:201
EXTERN_C WORD WINAPI ExtractIconResInfoW(_In_ HANDLE hHandle, _In_ LPCWSTR lpFileName, _In_ WORD wIndex, _Out_ LPWORD lpSize, _Out_ LPHANDLE lpIcon)
Definition: stubs.cpp:676
EXTERN_C HRESULT WINAPI SHSetFolderPathW(_In_ INT csidl, _In_ HANDLE hToken, _In_ DWORD dwFlags, _In_ LPCWSTR pszPath)
Definition: stubs.cpp:751
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogW(_In_ HWND hwnd, _In_ LPCWSTR pszRemoteName, _In_ DWORD dwType)
Definition: stubs.cpp:494
EXTERN_C BOOL WINAPI PathIsSlowW(_In_ LPCWSTR pszFile, _In_ DWORD dwAttr)
Definition: stubs.cpp:788
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:887
BOOL WINAPI IsSuspendAllowed(VOID)
Definition: utils.cpp:827
HRESULT SHELL_CreateShell32DefaultExtractIcon(int IconIndex, REFIID riid, LPVOID *ppvOut)
Definition: utils.cpp:1806
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:1988
EXTERN_C HRESULT WINAPI SHEnumerateUnreadMailAccountsW(_In_opt_ HKEY hKeyUser, _In_ DWORD dwIndex, _Out_writes_(cchMailAddress) PWSTR pszMailAddress, _In_ INT cchMailAddress)
Definition: utils.cpp:1114
static const CMVERBMAP * FindVerbMapEntry(UINT_PTR CmdId, const CMVERBMAP *pMap)
Definition: utils.cpp:1772
#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:931
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:425
static HRESULT SHELL_GetComputerDescription(_Out_writes_z_(cchDescMax) PWSTR pszDesc, _In_ SIZE_T cchDescMax, _In_ PWSTR pszServerName)
Definition: utils.cpp:1945
static VOID DynamicPathRemoveBackslashW(_Out_ CStringW &strPath)
Definition: utils.cpp:1576
EXTERN_C WORD WINAPI ExtractIconResInfoA(_In_ HANDLE hHandle, _In_ LPCSTR lpFileName, _In_ WORD wIndex, _Out_ LPWORD lpSize, _Out_ LPHANDLE lpIcon)
Definition: utils.cpp:652
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:480
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:1722
EXTERN_C BOOL WINAPI PathIsEqualOrSubFolder(_In_ LPCWSTR pszPath1OrCSIDL, _In_ LPCWSTR pszPath2)
Definition: utils.cpp:1589
EXTERN_C HRESULT WINAPI SHGetRealIDL(_In_ IShellFolder *psf, _In_ PCUITEMID_CHILD pidlSimple, _Outptr_ PITEMID_CHILD *ppidlReal)
Definition: utils.cpp:1620
EXTERN_C DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken)
Definition: utils.cpp:693
#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:1219
EXTERN_C BOOL WINAPI SHTestTokenPrivilegeW(_In_opt_ HANDLE hToken, _In_ LPCWSTR lpName)
Definition: utils.cpp:763
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:1968
static VOID SHELL_CacheComputerDescription(_In_ PCWSTR pszServerName, _In_ PCWSTR pszDesc)
Definition: utils.cpp:1931
EXTERN_C HRESULT WINAPI SHInvokePrivilegedFunctionW(_In_ LPCWSTR pszName, _In_ PRIVILEGED_FUNCTION fn, _In_opt_ LPARAM lParam)
Definition: utils.cpp:720
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:1667
EXTERN_C LPWSTR WINAPI ShortSizeFormatW(_In_ DWORD dwNumber, _Out_writes_(0x8FFF) LPWSTR pszBuffer)
Definition: utils.cpp:673
static PCSTR StrEndNA(_In_ PCSTR psz, _In_ INT_PTR cch)
Definition: utils.cpp:17
EXTERN_C LPSTR WINAPI SheRemoveQuotesA(LPSTR psz)
Definition: utils.cpp:1064
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:1504
EXTERN_C HRESULT IUnknown_InitializeCommand(_In_ IUnknown *pUnk, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB)
Definition: utils.cpp:1654
static HRESULT DynamicSHGetPathFromIDListW(_In_ LPCITEMIDLIST pidl, _Out_ CStringW &strPath)
Definition: utils.cpp:1521
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:1279
EXTERN_C BOOL WINAPI Activate_RunDLL(_In_ HWND hwnd, _In_ HINSTANCE hinst, _In_ LPCWSTR cmdline, _In_ INT cmdshow)
Definition: utils.cpp:1454
EXTERN_C BOOL WINAPI PathIsSlowA(_In_ LPCSTR pszFile, _In_ DWORD dwAttr)
Definition: utils.cpp:638
UINT GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba)
Definition: utils.cpp:1736
HRESULT SHELL_GetCommandStringImpl(SIZE_T CmdId, UINT uFlags, LPSTR Buf, UINT cchBuf, const CMVERBMAP *pMap)
Definition: utils.cpp:1783
EXTERN_C HRESULT WINAPI DisplayNameOfW(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_ LPWSTR pszBuf, _In_ UINT cchBuf)
Definition: utils.cpp:409
EXTERN_C HRESULT WINAPI SHSetUnreadMailCountW(_In_ PCWSTR pszMailAddress, _In_ DWORD dwCount, _In_ PCWSTR pszShellExecuteCommand)
Definition: utils.cpp:1009
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:1317
EXTERN_C HINSTANCE WINAPI SHGetShellStyleHInstance(VOID)
Definition: utils.cpp:838
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:1918
EXTERN_C HRESULT BindCtx_RegisterObjectParam(_In_ IBindCtx *pBindCtx, _In_ LPOLESTR pszKey, _In_opt_ IUnknown *punk, _Out_ LPBC *ppbc)
Definition: utils.cpp:574
EXTERN_C HRESULT WINAPI CopyStreamUI(_In_ IStream *pSrc, _Out_ IStream *pDst, _Inout_opt_ IProgressDialog *pProgress, _In_opt_ DWORDLONG dwlSize)
Definition: utils.cpp:1336
EXTERN_C HRESULT WINAPI SHGetUserDisplayName(_Out_writes_to_(*puSize, *puSize) PWSTR pName, _Inout_ PULONG puSize)
Definition: utils.cpp:1847
#define COMPUTER_DESCRIPTIONS_KEY
Definition: utils.cpp:1913
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:1148
static HRESULT Int64ToStr(_In_ LONGLONG llValue, _Out_writes_(cchValue) LPWSTR pszValue, _In_ UINT cchValue)
Definition: utils.cpp:1174
HRESULT SHELL_MapContextMenuVerbToCmdId(LPCMINVOKECOMMANDINFO pICI, const CMVERBMAP *pMap)
Definition: utils.cpp:1749
EXTERN_C LPWSTR WINAPI SheRemoveQuotesW(LPWSTR psz)
Definition: utils.cpp:1089
EXTERN_C BOOL WINAPI SHIsBadInterfacePtr(_In_ LPCVOID pv, _In_ UINT_PTR ucb)
Definition: utils.cpp:1823
EXTERN_C HRESULT WINAPI SHCreatePropertyBag(_In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:880
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:1708
EXTERN_C HWND BindCtx_GetUIWindow(_In_ IBindCtx *pBindCtx)
Definition: utils.cpp:514
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:620
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:819
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:459
BOOL PathIsDotOrDotDotW(_In_ LPCWSTR pszPath)
Definition: utils.cpp:146
static PCWSTR SHELL_SkipServerSlashes(_In_ PCWSTR pszPath)
Definition: utils.cpp:1903
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogA(_In_ HWND hwnd, _In_ LPCSTR pszRemoteName, _In_ DWORD dwType)
Definition: utils.cpp:1480
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:684
static HRESULT DynamicSHGetSpecialFolderPathW(_In_ HWND hwndOwner, _Out_ CStringW &strPath, _In_ INT nCSIDL, _In_ BOOL bCreate)
Definition: utils.cpp:1553
HRESULT SHCoInitializeAnyApartment(VOID)
Definition: utils.cpp:471
BOOL PathIsDosDevice(_In_ LPCWSTR pszName)
Definition: utils.cpp:172
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3408
DWORD WINAPI SHGetObjectCompatFlags(IUnknown *pUnk, const CLSID *clsid)
Definition: ordinal.c:6315
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:4595
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1411
int WINAPI PathCommonPrefixW(LPCWSTR lpszFile1, LPCWSTR lpszFile2, LPWSTR achPath)
Definition: path.c:2812
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
Definition: path.c:629
BOOL WINAPI PathUnExpandEnvStringsW(LPCWSTR path, LPWSTR buffer, UINT buf_len)
Definition: path.c:4181
void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
Definition: path.c:823
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
Definition: path.c:4409
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
BOOL WINAPI SHRegGetBoolUSValueW(LPCWSTR pszSubKey, LPCWSTR pszValue, BOOL fIgnoreHKCU, BOOL fDefault)
Definition: reg.c:770
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
#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:909
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:325
#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:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1462
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:2139
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
Definition: shpolicy.c:150
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:75
LPCSTR Verb
Definition: utils.h:74
$ULONG PrivilegeCount
Definition: setypes.h:1023
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]
Definition: setypes.h:1024
$ULONG LowPart
Definition: ntbasedef.h:577
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
$ULONG HighPart
Definition: ntbasedef.h:578
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:835
#define FMT_USE_GROUPING
Definition: undocshell.h:833
#define SHGCDN_NOSERVERNAME
Definition: undocshell.h:988
#define FMT_USE_NUMDIGITS
Definition: undocshell.h:831
#define FMT_USE_NEGNUMBER
Definition: undocshell.h:836
#define FMT_USE_LEADZERO
Definition: undocshell.h:832
HRESULT(CALLBACK * PRIVILEGED_FUNCTION)(LPARAM lParam)
Definition: undocshell.h:864
#define SHGCDN_NOCACHE
Definition: undocshell.h:987
#define FMT_USE_DECIMAL
Definition: undocshell.h:834
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:1743
_In_opt_ LPSTR _In_opt_ LPSTR _In_ DWORD _In_ DWORD _Out_opt_ PHANDLE phToken
Definition: winbase.h:2746
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LPCSTR lpFileName
Definition: winbase.h:3102
#define FORMAT_MESSAGE_FROM_STRING
Definition: winbase.h:447
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1148
#define LPTR
Definition: winbase.h:407
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:368
_In_ LPCSTR lpName
Definition: winbase.h:2820
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define INVALID_FILE_SIZE
Definition: winbase.h:574
#define FORMAT_MESSAGE_ARGUMENT_ARRAY
Definition: winbase.h:450
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2798
#define MAX_COMPUTERNAME_LENGTH
Definition: winbase.h:269
_In_ DWORD nLength
Definition: wincon.h:473
_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:46
#define LOCALE_SDECIMAL
Definition: winnls.h:44
#define LOCALE_IDIGITS
Definition: winnls.h:47
#define LOCALE_STHOUSAND
Definition: winnls.h:45
#define LOCALE_INEGNUMBER
Definition: winnls.h:49
#define LOCALE_ILZERO
Definition: winnls.h:48
#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:2380
#define WS_EX_APPWINDOW
Definition: winuser.h:383
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
LPSTR WINAPI CharNextA(_In_ LPCSTR)
HWND WINAPI FindWindowExW(_In_opt_ HWND, _In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR)
#define MK_CONTROL
Definition: winuser.h:2381
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
#define RtlEqualLuid(Luid1, Luid2)
Definition: rtlfuncs.h:304
#define TOKEN_ADJUST_PRIVILEGES
Definition: setypes.h:930
#define TOKEN_QUERY
Definition: setypes.h:928
@ TokenPrivileges
Definition: setypes.h:968
@ TokenSessionId
Definition: setypes.h:977
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