ReactOS 0.4.15-dev-8434-g155a7c7
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
11
16{
17 if (!pidl)
18 {
19 *ppidl = NULL;
20 return S_OK;
21 }
22 *ppidl = ILClone(pidl);
23 return (*ppidl ? S_OK : E_OUTOFMEMORY);
24}
25
27{
28 if (pszPath[0] != L'.')
29 return FALSE;
30 return !pszPath[1] || (pszPath[1] == L'.' && !pszPath[2]);
31}
32
33#define PATH_VALID_ELEMENT ( \
34 PATH_CHAR_CLASS_DOT | PATH_CHAR_CLASS_SEMICOLON | PATH_CHAR_CLASS_COMMA | \
35 PATH_CHAR_CLASS_SPACE | PATH_CHAR_CLASS_OTHER_VALID \
36)
37
39{
40 if (!*pszPath || PathIsDotOrDotDotW(pszPath))
41 return FALSE;
42
43 for (LPCWSTR pch = pszPath; *pch; ++pch)
44 {
46 return FALSE;
47 }
48
49 return TRUE;
50}
51
53{
57
58 if (lstrcmpiW(szPath, L"NUL") == 0 || lstrcmpiW(szPath, L"PRN") == 0 ||
59 lstrcmpiW(szPath, L"CON") == 0 || lstrcmpiW(szPath, L"AUX") == 0)
60 {
61 return TRUE;
62 }
63
64 if (_wcsnicmp(szPath, L"LPT", 3) == 0 || _wcsnicmp(szPath, L"COM", 3) == 0)
65 {
66 if ((L'0' <= szPath[3] && szPath[3] <= L'9') && szPath[4] == UNICODE_NULL)
67 return TRUE;
68 }
69
70 return FALSE;
71}
72
74{
75 LPITEMIDLIST pidlOld = *ppidl;
76 if (!pidlOld)
77 {
78 *ppidl = pidl;
79 return S_OK;
80 }
81
82 HRESULT hr = SHILCombine(*ppidl, pidl, ppidl);
83 ILFree(pidlOld);
84 ILFree(pidl);
85 return hr;
86}
87
88static BOOL
92{
93 BOOL ret;
94
95 if (phToken == NULL)
96 {
98 return FALSE;
99 }
100
101 *phToken = NULL;
102
104 if (!ret && GetLastError() == ERROR_NO_TOKEN)
106
107 return ret;
108}
109
112 _In_ LPCITEMIDLIST pidl,
113 _In_ HANDLE hToken,
114 _Out_ LPITEMIDLIST *ppidlAlias,
116{
117 return E_FAIL; //FIXME
118}
119
121{
123 if (!pBindCtx || FAILED(pBindCtx->GetObjectParam(const_cast<LPWSTR>(pszName), &punk)))
124 return FALSE;
125 return TRUE;
126}
127
129{
130 if (!pbc)
131 return dwDefault;
132
133 BIND_OPTS BindOpts = { sizeof(BindOpts) };
134 HRESULT hr = pbc->GetBindOptions(&BindOpts);
135 if (FAILED(hr))
136 return dwDefault;
137
138 return BindOpts.grfMode;
139}
140
142{
143 if (!pbc)
144 return FALSE;
145
146 BIND_OPTS BindOps = { sizeof(BindOps) };
147 if (SUCCEEDED(pbc->GetBindOptions(&BindOps)) && BindOps.grfFlags == OLECONTF_LINKS)
148 return TRUE;
149
150 return pclsid && SHSkipJunction(pbc, pclsid);
151}
152
154{
157
158 if (!pBindCtx || FAILED(pBindCtx->GetObjectParam((LPWSTR)STR_FILE_SYS_BIND_DATA, &punk)))
159 return S_FALSE;
160
161 if (FAILED(punk->QueryInterface(IID_PPV_ARG(IFileSystemBindData, &pBindData))))
162 return S_FALSE;
163
164 if (pFindData)
165 pBindData->GetFindData(pFindData);
166
167 return S_OK;
168}
169
171{
173
174 switch (code)
175 {
178 case ERROR_CANCELLED:
179 return TRUE;
180
181 default:
183 }
184}
185
188 _In_opt_ IShellFolder *pShellFolder,
189 _In_ LPCITEMIDLIST pidl,
190 _In_opt_ IBindCtx *pBindCtx,
192 _Out_ void **ppvObj)
193{
194 CComPtr<IShellFolder> psfDesktop;
195
196 *ppvObj = NULL;
197
198 if (!pShellFolder)
199 {
200 SHGetDesktopFolder(&psfDesktop);
201 if (!psfDesktop)
202 return E_FAIL;
203
204 pShellFolder = psfDesktop;
205 }
206
207 HRESULT hr;
208 if (_ILIsDesktop(pidl))
209 hr = pShellFolder->QueryInterface(riid, ppvObj);
210 else
211 hr = pShellFolder->BindToObject(pidl, pBindCtx, riid, ppvObj);
212
213 if (SUCCEEDED(hr) && !*ppvObj)
214 hr = E_FAIL;
215
216 return hr;
217}
218
222 _In_ LPCITEMIDLIST pidl,
224 _Out_ void **ppvObj)
225{
226 return SHBindToObjectEx(psf, pidl, NULL, riid, ppvObj);
227}
228
231 _In_ IShellFolder *psf,
232 _In_ LPCITEMIDLIST pidl,
234 _Out_ LPWSTR pszBuf,
235 _In_ UINT cchBuf)
236{
237 *pszBuf = UNICODE_NULL;
238 STRRET sr;
239 HRESULT hr = psf->GetDisplayNameOf(pidl, dwFlags, &sr);
240 if (FAILED(hr))
241 return hr;
242 return StrRetToBufW(&sr, pidl, pszBuf, cchBuf);
243}
244
245DWORD
247{
248 LPCITEMIDLIST pidlLast = pidl;
249 IShellFolder *release = NULL;
250
251 if (!psf)
252 {
253 SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlLast);
254 if (!psf)
255 return 0;
256 release = psf;
257 }
258
259 DWORD oldAttrs = dwAttributes;
260 if (FAILED(psf->GetAttributesOf(1, &pidlLast, &dwAttributes)))
261 dwAttributes = 0;
262 else
263 dwAttributes &= oldAttrs;
264
265 if ((dwAttributes & SFGAO_FOLDER) &&
266 (dwAttributes & SFGAO_STREAM) &&
267 !(dwAttributes & SFGAO_STORAGEANCESTOR) &&
268 (oldAttrs & SFGAO_STORAGEANCESTOR) &&
269 (SHGetObjectCompatFlags(psf, NULL) & 0x200))
270 {
271 dwAttributes &= ~(SFGAO_STREAM | SFGAO_STORAGEANCESTOR);
272 dwAttributes |= SFGAO_STORAGEANCESTOR;
273 }
274
275 if (release)
276 release->Release();
277 return dwAttributes;
278}
279
281{
283 if (FAILED(hr))
285 return hr;
286}
287
290 _In_ LPCITEMIDLIST pidl,
292 _Out_opt_ LPWSTR pszText,
293 _In_ UINT cchBuf,
294 _Inout_opt_ DWORD *pdwAttributes)
295{
296 if (pszText)
297 *pszText = UNICODE_NULL;
298
300
301 CComPtr<IShellFolder> psfFolder;
302 LPCITEMIDLIST ppidlLast;
303 HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psfFolder), &ppidlLast);
304 if (SUCCEEDED(hr))
305 {
306 if (pszText)
307 hr = Shell_DisplayNameOf(psfFolder, ppidlLast, dwFlags, pszText, cchBuf);
308
309 if (SUCCEEDED(hr))
310 {
311 if (pdwAttributes)
312 *pdwAttributes = SHGetAttributes(psfFolder, ppidlLast, *pdwAttributes);
313 }
314 }
315
316 if (SUCCEEDED(hrCoInit))
318
319 return hr;
320}
321
324{
325 HWND hWnd = NULL;
326
328 if (pBindCtx && SUCCEEDED(pBindCtx->GetObjectParam((LPWSTR)L"UI During Binding", &punk)))
329 IUnknown_GetWindow(punk, &hWnd);
330
331 return hWnd;
332}
333
335{
336protected:
339
340public:
342 virtual ~CDummyOleWindow() { }
343
344 // IUnknown methods
346 {
347 static const QITAB c_tab[] =
348 {
350 { NULL }
351 };
352 return ::QISearch(this, c_tab, riid, ppvObj);
353 }
355 {
356 return ++m_cRefs;
357 }
359 {
360 if (--m_cRefs == 0)
361 {
362 delete this;
363 return 0;
364 }
365 return m_cRefs;
366 }
367
368 // IOleWindow methods
369 STDMETHODIMP GetWindow(HWND *phWnd) override
370 {
371 *phWnd = m_hWnd;
372 if (!m_hWnd)
373 return E_NOTIMPL;
374 return S_OK;
375 }
377 {
378 return E_NOTIMPL;
379 }
380};
381
384 _In_ IBindCtx *pBindCtx,
385 _In_ LPOLESTR pszKey,
386 _In_opt_ IUnknown *punk,
387 _Out_ LPBC *ppbc)
388{
389 HRESULT hr = S_OK;
391
392 *ppbc = pBindCtx;
393
394 if (pBindCtx)
395 {
396 pBindCtx->AddRef();
397 }
398 else
399 {
400 hr = CreateBindCtx(0, ppbc);
401 if (FAILED(hr))
402 return hr;
403 }
404
405 if (!punk)
406 punk = pUnknown = new CDummyOleWindow();
407
408 hr = (*ppbc)->RegisterObjectParam(pszKey, punk);
409
410 if (pUnknown)
411 pUnknown->Release();
412
413 if (FAILED(hr))
414 {
415 (*ppbc)->Release();
416 *ppbc = NULL;
417 }
418
419 return hr;
420}
421
422/*************************************************************************
423 * SHSetFolderPathA (SHELL32.231)
424 *
425 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shsetfolderpatha
426 */
430 _In_ INT csidl,
431 _In_ HANDLE hToken,
433 _In_ LPCSTR pszPath)
434{
435 TRACE("(%d, %p, 0x%X, %s)\n", csidl, hToken, dwFlags, debugstr_a(pszPath));
436 CStringW strPathW(pszPath);
437 return SHSetFolderPathW(csidl, hToken, dwFlags, strPathW);
438}
439
440/*************************************************************************
441 * PathIsSlowA (SHELL32.240)
442 *
443 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj/nf-shlobj-pathisslowa
444 */
448 _In_ LPCSTR pszFile,
449 _In_ DWORD dwAttr)
450{
451 TRACE("(%s, 0x%X)\n", debugstr_a(pszFile), dwAttr);
452 CStringW strFileW(pszFile);
453 return PathIsSlowW(strFileW, dwAttr);
454}
455
456/*************************************************************************
457 * ExtractIconResInfoA (SHELL32.221)
458 */
462 _In_ HANDLE hHandle,
464 _In_ WORD wIndex,
465 _Out_ LPWORD lpSize,
466 _Out_ LPHANDLE lpIcon)
467{
468 TRACE("(%p, %s, %u, %p, %p)\n", hHandle, debugstr_a(lpFileName), wIndex, lpSize, lpIcon);
469
470 if (!lpFileName)
471 return 0;
472
473 CStringW strFileNameW(lpFileName);
474 return ExtractIconResInfoW(hHandle, strFileNameW, wIndex, lpSize, lpIcon);
475}
476
477/*************************************************************************
478 * ShortSizeFormatW (SHELL32.204)
479 */
483 _In_ DWORD dwNumber,
484 _Out_writes_(0x8FFF) LPWSTR pszBuffer)
485{
486 TRACE("(%lu, %p)\n", dwNumber, pszBuffer);
487 return StrFormatByteSizeW(dwNumber, pszBuffer, 0x8FFF);
488}
489
490/*************************************************************************
491 * SHOpenEffectiveToken (SHELL32.235)
492 */
494{
495 TRACE("%p\n", phToken);
497}
498
499/*************************************************************************
500 * SHGetUserSessionId (SHELL32.248)
501 */
503{
504 DWORD dwSessionId, dwLength;
505 BOOL bOpenToken = FALSE;
506
507 TRACE("%p\n", hToken);
508
509 if (!hToken)
510 bOpenToken = SHOpenEffectiveToken(&hToken);
511
512 if (!hToken ||
513 !GetTokenInformation(hToken, TokenSessionId, &dwSessionId, sizeof(dwSessionId), &dwLength))
514 {
515 dwSessionId = 0;
516 }
517
518 if (bOpenToken)
519 CloseHandle(hToken);
520
521 return dwSessionId;
522}
523
524/*************************************************************************
525 * SHInvokePrivilegedFunctionW (SHELL32.246)
526 */
530 _In_ LPCWSTR pszName,
533{
534 TRACE("(%s %p %p)\n", debugstr_w(pszName), fn, lParam);
535
536 if (!pszName || !fn)
537 return E_INVALIDARG;
538
539 HANDLE hToken = NULL;
540 TOKEN_PRIVILEGES NewPriv, PrevPriv;
541 BOOL bAdjusted = FALSE;
542
543 if (SHOpenEffectiveToken(&hToken) &&
544 ::LookupPrivilegeValueW(NULL, pszName, &NewPriv.Privileges[0].Luid))
545 {
546 NewPriv.PrivilegeCount = 1;
548
549 DWORD dwReturnSize;
550 bAdjusted = ::AdjustTokenPrivileges(hToken, FALSE, &NewPriv,
551 sizeof(PrevPriv), &PrevPriv, &dwReturnSize);
552 }
553
554 HRESULT hr = fn(lParam);
555
556 if (bAdjusted)
557 ::AdjustTokenPrivileges(hToken, FALSE, &PrevPriv, 0, NULL, NULL);
558
559 if (hToken)
560 ::CloseHandle(hToken);
561
562 return hr;
563}
564
565/*************************************************************************
566 * SHTestTokenPrivilegeW (SHELL32.236)
567 *
568 * @see http://undoc.airesoft.co.uk/shell32.dll/SHTestTokenPrivilegeW.php
569 */
573 _In_opt_ HANDLE hToken,
575{
576 LUID Luid;
578 PTOKEN_PRIVILEGES pTokenPriv;
579 HANDLE hNewToken = NULL;
580 BOOL ret = FALSE;
581
582 TRACE("(%p, %s)\n", hToken, debugstr_w(lpName));
583
584 if (!lpName)
585 return FALSE;
586
587 if (!hToken)
588 {
589 if (!SHOpenEffectiveToken(&hNewToken))
590 goto Quit;
591
592 if (!hNewToken)
593 return FALSE;
594
595 hToken = hNewToken;
596 }
597
598 if (!LookupPrivilegeValueW(NULL, lpName, &Luid))
599 return FALSE;
600
601 dwLength = 0;
603 goto Quit;
604
606 if (!pTokenPriv)
607 goto Quit;
608
609 if (GetTokenInformation(hToken, TokenPrivileges, pTokenPriv, dwLength, &dwLength))
610 {
611 UINT iPriv, cPrivs;
612 cPrivs = pTokenPriv->PrivilegeCount;
613 for (iPriv = 0; !ret && iPriv < cPrivs; ++iPriv)
614 {
615 ret = RtlEqualLuid(&Luid, &pTokenPriv->Privileges[iPriv].Luid);
616 }
617 }
618
619 LocalFree(pTokenPriv);
620
621Quit:
622 if (hToken == hNewToken)
623 CloseHandle(hNewToken);
624
625 return ret;
626}
627
629{
631}
632
633/*************************************************************************
634 * IsSuspendAllowed (SHELL32.53)
635 */
637{
638 TRACE("()\n");
640}
641
642/*************************************************************************
643 * SHGetShellStyleHInstance (SHELL32.749)
644 */
646WINAPI
648{
651 HRESULT hr;
652 CStringW strShellStyle;
653
654 TRACE("SHGetShellStyleHInstance called\n");
655
656 /* First, attempt to load the shellstyle dll from the current active theme */
658 if (FAILED(hr))
659 goto DoDefault;
660
661 /* Strip the theme filename */
663
664 strShellStyle = szPath;
665 strShellStyle += L"\\Shell\\";
666 strShellStyle += szColorName;
667 strShellStyle += L"\\ShellStyle.dll";
668
670 if (hInst)
671 return hInst;
672
673 /* Otherwise, use the version stored in the System32 directory */
674DoDefault:
675 if (!ExpandEnvironmentStringsW(L"%SystemRoot%\\System32\\ShellStyle.dll",
677 {
678 ERR("Expand failed\n");
679 return NULL;
680 }
682}
683
684/*************************************************************************
685 * SHCreatePropertyBag (SHELL32.715)
686 */
688WINAPI
690{
692}
693
694/*************************************************************************
695 * SheRemoveQuotesA (SHELL32.@)
696 */
698WINAPI
700{
701 PCHAR pch;
702
703 if (*psz == '"')
704 {
705 for (pch = psz + 1; *pch && *pch != '"'; ++pch)
706 {
707 *(pch - 1) = *pch;
708 }
709
710 if (*pch == '"')
711 *(pch - 1) = ANSI_NULL;
712 }
713
714 return psz;
715}
716
717/*************************************************************************
718 * SheRemoveQuotesW (SHELL32.@)
719 *
720 * ExtractAssociatedIconExW uses this function.
721 */
723WINAPI
725{
726 PWCHAR pch;
727
728 if (*psz == L'"')
729 {
730 for (pch = psz + 1; *pch && *pch != L'"'; ++pch)
731 {
732 *(pch - 1) = *pch;
733 }
734
735 if (*pch == L'"')
736 *(pch - 1) = UNICODE_NULL;
737 }
738
739 return psz;
740}
741
742/*************************************************************************
743 * SHFindComputer [SHELL32.91]
744 *
745 * Invokes the shell search in My Computer. Used in SHFindFiles.
746 * Two parameters are ignored.
747 */
749WINAPI
751{
752 UNREFERENCED_PARAMETER(pidlRoot);
753 UNREFERENCED_PARAMETER(pidlSavedSearch);
754
755 TRACE("%p %p\n", pidlRoot, pidlSavedSearch);
756
757 IContextMenu *pCM;
758 HRESULT hr = CoCreateInstance(CLSID_ShellSearchExt, NULL, CLSCTX_INPROC_SERVER,
759 IID_IContextMenu, (void **)&pCM);
760 if (FAILED(hr))
761 {
762 ERR("0x%08X\n", hr);
763 return hr;
764 }
765
766 CMINVOKECOMMANDINFO InvokeInfo = { sizeof(InvokeInfo) };
767 InvokeInfo.lpParameters = "{996E1EB1-B524-11D1-9120-00A0C98BA67D}";
768 InvokeInfo.nShow = SW_SHOWNORMAL;
769 hr = pCM->InvokeCommand(&InvokeInfo);
770 pCM->Release();
771
772 return SUCCEEDED(hr);
773}
774
775static HRESULT
777 _In_ LONGLONG llValue,
778 _Out_writes_(cchValue) LPWSTR pszValue,
779 _In_ UINT cchValue)
780{
781 WCHAR szBuff[40];
782 UINT ich = 0, ichValue;
783#if (WINVER >= _WIN32_WINNT_VISTA)
784 BOOL bMinus = (llValue < 0);
785
786 if (bMinus)
787 llValue = -llValue;
788#endif
789
790 if (cchValue <= 0)
791 return E_FAIL;
792
793 do
794 {
795 szBuff[ich++] = (WCHAR)(L'0' + (llValue % 10));
796 llValue /= 10;
797 } while (llValue != 0 && ich < _countof(szBuff) - 1);
798
799#if (WINVER >= _WIN32_WINNT_VISTA)
800 if (bMinus && ich < _countof(szBuff))
801 szBuff[ich++] = '-';
802#endif
803
804 for (ichValue = 0; ich > 0 && ichValue < cchValue; ++ichValue)
805 {
806 --ich;
807 pszValue[ichValue] = szBuff[ich];
808 }
809
810 if (ichValue >= cchValue)
811 {
812 pszValue[cchValue - 1] = UNICODE_NULL;
813 return E_FAIL;
814 }
815
816 pszValue[ichValue] = UNICODE_NULL;
817 return S_OK;
818}
819
820static VOID
822 _Out_ NUMBERFMTW *pDest,
823 _In_opt_ const NUMBERFMTW *pSrc,
824 _In_ DWORD dwNumberFlags,
825 _Out_writes_(cchDecimal) LPWSTR pszDecimal,
826 _In_ INT cchDecimal,
827 _Out_writes_(cchThousand) LPWSTR pszThousand,
828 _In_ INT cchThousand)
829{
830 WCHAR szBuff[20];
831
832 if (pSrc)
833 *pDest = *pSrc;
834 else
835 dwNumberFlags = 0;
836
837 if (!(dwNumberFlags & FMT_USE_NUMDIGITS))
838 {
840 pDest->NumDigits = StrToIntW(szBuff);
841 }
842
843 if (!(dwNumberFlags & FMT_USE_LEADZERO))
844 {
846 pDest->LeadingZero = StrToIntW(szBuff);
847 }
848
849 if (!(dwNumberFlags & FMT_USE_GROUPING))
850 {
852 pDest->Grouping = StrToIntW(szBuff);
853 }
854
855 if (!(dwNumberFlags & FMT_USE_DECIMAL))
856 {
857 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, pszDecimal, cchDecimal);
858 pDest->lpDecimalSep = pszDecimal;
859 }
860
861 if (!(dwNumberFlags & FMT_USE_THOUSAND))
862 {
863 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, pszThousand, cchThousand);
864 pDest->lpThousandSep = pszThousand;
865 }
866
867 if (!(dwNumberFlags & FMT_USE_NEGNUMBER))
868 {
870 pDest->NegativeOrder = StrToIntW(szBuff);
871 }
872}
873
874/*************************************************************************
875 * Int64ToString [SHELL32.209]
876 *
877 * @see http://undoc.airesoft.co.uk/shell32.dll/Int64ToString.php
878 */
882 _In_ LONGLONG llValue,
883 _Out_writes_(cchOut) LPWSTR pszOut,
884 _In_ UINT cchOut,
885 _In_ BOOL bUseFormat,
886 _In_opt_ const NUMBERFMTW *pNumberFormat,
887 _In_ DWORD dwNumberFlags)
888{
889 INT ret;
890 NUMBERFMTW NumFormat;
891 WCHAR szValue[80], szDecimalSep[6], szThousandSep[6];
892
893 Int64ToStr(llValue, szValue, _countof(szValue));
894
895 if (bUseFormat)
896 {
897 Int64GetNumFormat(&NumFormat, pNumberFormat, dwNumberFlags,
898 szDecimalSep, _countof(szDecimalSep),
899 szThousandSep, _countof(szThousandSep));
900 ret = GetNumberFormatW(LOCALE_USER_DEFAULT, 0, szValue, &NumFormat, pszOut, cchOut);
901 if (ret)
902 --ret;
903 return ret;
904 }
905
906 if (FAILED(StringCchCopyW(pszOut, cchOut, szValue)))
907 return 0;
908
909 return lstrlenW(pszOut);
910}
911
912/*************************************************************************
913 * LargeIntegerToString [SHELL32.210]
914 *
915 * @see http://undoc.airesoft.co.uk/shell32.dll/LargeIntegerToString.php
916 */
920 _In_ const LARGE_INTEGER *pLargeInt,
921 _Out_writes_(cchOut) LPWSTR pszOut,
922 _In_ UINT cchOut,
923 _In_ BOOL bUseFormat,
924 _In_opt_ const NUMBERFMTW *pNumberFormat,
925 _In_ DWORD dwNumberFlags)
926{
927 return Int64ToString(pLargeInt->QuadPart, pszOut, cchOut, bUseFormat,
928 pNumberFormat, dwNumberFlags);
929}
930
931/*************************************************************************
932 * CopyStreamUI [SHELL32.726]
933 *
934 * Copy a stream to another stream with optional progress display.
935 */
939 _In_ IStream *pSrc,
940 _Out_ IStream *pDst,
941 _Inout_opt_ IProgressDialog *pProgress,
942 _In_opt_ DWORDLONG dwlSize)
943{
944 HRESULT hr = E_FAIL;
945 DWORD cbBuff, cbRead, dwSizeToWrite;
946 DWORDLONG cbDone;
947 LPVOID pBuff;
948 CComHeapPtr<BYTE> pHeapPtr;
949 STATSTG Stat;
950 BYTE abBuff[1024];
951
952 TRACE("(%p, %p, %p, %I64u)\n", pSrc, pDst, pProgress, dwlSize);
953
954 if (dwlSize == 0) // Invalid size?
955 {
956 // Get the stream size
957 ZeroMemory(&Stat, sizeof(Stat));
958 if (FAILED(pSrc->Stat(&Stat, STATFLAG_NONAME)))
959 pProgress = NULL; // No size info. Disable progress
960 else
961 dwlSize = Stat.cbSize.QuadPart;
962 }
963
964 if (!pProgress) // Progress is disabled?
965 {
966 ULARGE_INTEGER uliSize;
967
968 if (dwlSize > 0)
969 uliSize.QuadPart = dwlSize;
970 else
971 uliSize.HighPart = uliSize.LowPart = INVALID_FILE_SIZE;
972
973 return pSrc->CopyTo(pDst, uliSize, NULL, NULL); // One punch
974 }
975
976 // Allocate the buffer if necessary
977 if (dwlSize > 0 && dwlSize <= sizeof(abBuff))
978 {
979 cbBuff = sizeof(abBuff);
980 pBuff = abBuff;
981 }
982 else
983 {
984#define COPY_STREAM_DEFAULT_BUFFER_SIZE 0x4000
986 if (pHeapPtr.AllocateBytes(cbBuff))
987 {
988 pBuff = pHeapPtr;
989 }
990 else // Low memory?
991 {
992 cbBuff = sizeof(abBuff);
993 pBuff = abBuff;
994 }
995#undef COPY_STREAM_DEFAULT_BUFFER_SIZE
996 }
997
998 // Start reading
1000 zero.QuadPart = 0;
1001 pSrc->Seek(zero, 0, NULL);
1002 pDst->Seek(zero, 0, NULL);
1003 cbDone = 0;
1004 pProgress->SetProgress64(cbDone, dwlSize);
1005
1006 // Repeat reading and writing until goal
1007 for (;;)
1008 {
1009 hr = pSrc->Read(pBuff, cbBuff, &cbRead);
1010 if (FAILED(hr))
1011 break;
1012
1013 // Calculate the size to write
1014 if (dwlSize > 0)
1015 dwSizeToWrite = (DWORD)min((DWORDLONG)(dwlSize - cbDone), (DWORDLONG)cbRead);
1016 else
1017 dwSizeToWrite = cbRead;
1018
1019 if (dwSizeToWrite == 0) // No need to write?
1020 {
1021 hr = S_OK;
1022 break;
1023 }
1024
1025 hr = pDst->Write(pBuff, dwSizeToWrite, NULL);
1026 if (hr != S_OK)
1027 break;
1028
1029 cbDone += dwSizeToWrite;
1030
1031 if (pProgress->HasUserCancelled()) // Cancelled?
1032 {
1034 break;
1035 }
1036 pProgress->SetProgress64(cbDone, dwlSize);
1037
1038 if (dwlSize > 0 && cbDone >= dwlSize) // Reached the goal?
1039 {
1040 hr = S_OK;
1041 break;
1042 }
1043 }
1044
1045 return hr;
1046}
1047
1048/*************************************************************************
1049 * SHOpenPropSheetA [SHELL32.707]
1050 *
1051 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj/nf-shlobj-shopenpropsheeta
1052 */
1056 _In_opt_ LPCSTR pszCaption,
1057 _In_opt_ HKEY *ahKeys,
1058 _In_ UINT cKeys,
1059 _In_ const CLSID *pclsidDefault,
1060 _In_ IDataObject *pDataObject,
1061 _In_opt_ IShellBrowser *pShellBrowser,
1062 _In_opt_ LPCSTR pszStartPage)
1063{
1064 CStringW strStartPageW, strCaptionW;
1065 LPCWSTR pszCaptionW = NULL, pszStartPageW = NULL;
1066
1067 TRACE("(%s, %p, %u, %p, %p, %p, %s)", debugstr_a(pszCaption), ahKeys, cKeys, pclsidDefault,
1068 pDataObject, pShellBrowser, debugstr_a(pszStartPage));
1069
1070 if (pszCaption)
1071 {
1072 strStartPageW = pszCaption;
1073 pszCaptionW = strCaptionW;
1074 }
1075
1076 if (pszStartPage)
1077 {
1078 strStartPageW = pszStartPage;
1079 pszStartPageW = strStartPageW;
1080 }
1081
1082 return SHOpenPropSheetW(pszCaptionW, ahKeys, cKeys, pclsidDefault,
1083 pDataObject, pShellBrowser, pszStartPageW);
1084}
1085
1086/*************************************************************************
1087 * Activate_RunDLL [SHELL32.105]
1088 *
1089 * Unlocks the foreground window and allows the shell window to become the
1090 * foreground window. Every parameter is unused.
1091 */
1095 _In_ HWND hwnd,
1098 _In_ INT cmdshow)
1099{
1100 DWORD dwProcessID;
1101
1105 UNREFERENCED_PARAMETER(cmdshow);
1106
1107 TRACE("(%p, %p, %s, %d)\n", hwnd, hinst, debugstr_w(cmdline), cmdline);
1108
1110 return AllowSetForegroundWindow(dwProcessID);
1111}
1112
1113/*************************************************************************
1114 * SHStartNetConnectionDialogA (SHELL32.12)
1115 *
1116 * @see https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shstartnetconnectiondialoga
1117 */
1121 _In_ HWND hwnd,
1122 _In_ LPCSTR pszRemoteName,
1123 _In_ DWORD dwType)
1124{
1125 LPCWSTR pszRemoteNameW = NULL;
1126 CStringW strRemoteNameW;
1127
1128 TRACE("(%p, %s, %lu)\n", hwnd, debugstr_a(pszRemoteName), dwType);
1129
1130 if (pszRemoteName)
1131 {
1132 strRemoteNameW = pszRemoteName;
1133 pszRemoteNameW = strRemoteNameW;
1134 }
1135
1136 return SHStartNetConnectionDialogW(hwnd, pszRemoteNameW, dwType);
1137}
1138
1139/*************************************************************************
1140 * Helper functions for PathIsEqualOrSubFolder
1141 */
1142
1143static INT
1145 _In_ LPCWSTR lpszPath1,
1146 _In_ LPCWSTR lpszPath2,
1147 _Out_ CStringW& strPath)
1148{
1149 SIZE_T cchPath1 = wcslen(lpszPath1);
1150 SIZE_T cchPath2 = wcslen(lpszPath2);
1151 LPWSTR lpszPath = strPath.GetBuffer((INT)max(cchPath1, cchPath2) + 16);
1152 INT ret = PathCommonPrefixW(lpszPath1, lpszPath2, lpszPath);
1153 strPath.ReleaseBuffer();
1154 return ret;
1155}
1156
1159
1160static HRESULT
1162 _In_ LPCITEMIDLIST pidl,
1163 _Out_ CStringW& strPath)
1164{
1165 HRESULT hr;
1166
1167 for (UINT cchPath = MAX_PATH;; cchPath *= 2)
1168 {
1169 LPWSTR lpszPath = strPath.GetBuffer(cchPath);
1170 if (!lpszPath)
1171 return E_OUTOFMEMORY;
1172
1173 hr = SHGetPathCchFromIDListW(pidl, lpszPath, cchPath);
1174 strPath.ReleaseBuffer();
1175
1177 break;
1178
1179 if (cchPath >= MAXUINT / 2)
1180 {
1181 hr = E_FAIL;
1182 break;
1183 }
1184 }
1185
1186 if (FAILED(hr))
1187 strPath.Empty();
1188
1189 return hr;
1190}
1191
1192static HRESULT
1194 _In_ HWND hwndOwner,
1195 _Out_ CStringW& strPath,
1196 _In_ INT nCSIDL,
1198{
1199 LPITEMIDLIST pidl;
1200 HRESULT hr = SHGetSpecialFolderLocation(hwndOwner, nCSIDL, &pidl);
1201 if (SUCCEEDED(hr))
1202 {
1203 hr = DynamicSHGetPathFromIDListW(pidl, strPath);
1204 CoTaskMemFree(pidl);
1205 }
1206
1207 if (FAILED(hr))
1208 strPath.Empty();
1209 else if (bCreate)
1210 CreateDirectoryW(strPath, NULL);
1211
1212 return hr;
1213}
1214
1215static VOID
1217 _Out_ CStringW& strPath)
1218{
1219 INT nLength = strPath.GetLength();
1220 if (nLength > 0 && strPath[nLength - 1] == L'\\')
1221 strPath = strPath.Left(nLength - 1);
1222}
1223
1224/*************************************************************************
1225 * PathIsEqualOrSubFolder (SHELL32.755)
1226 */
1230 _In_ LPCWSTR pszPath1OrCSIDL,
1231 _In_ LPCWSTR pszPath2)
1232{
1233 CStringW strCommon, strPath1;
1234
1235 TRACE("(%s %s)\n", debugstr_w(pszPath1OrCSIDL), debugstr_w(pszPath2));
1236
1237 if (IS_INTRESOURCE(pszPath1OrCSIDL))
1238 {
1240 NULL, strPath1, LOWORD(pszPath1OrCSIDL) | CSIDL_FLAG_DONT_VERIFY, FALSE);
1241 }
1242 else
1243 {
1244 strPath1 = pszPath1OrCSIDL;
1245 }
1246
1248
1249 if (!DynamicPathCommonPrefixW(strPath1, pszPath2, strCommon))
1250 return FALSE;
1251
1252 return strPath1.CompareNoCase(strCommon) == 0;
1253}
1254
1255/*************************************************************************
1256 * SHGetRealIDL [SHELL32.98]
1257 */
1261 _In_ IShellFolder *psf,
1262 _In_ PCUITEMID_CHILD pidlSimple,
1263 _Outptr_ PITEMID_CHILD *ppidlReal)
1264{
1265 HRESULT hr;
1266 STRRET strret;
1268 SFGAOF attrs;
1269
1270 *ppidlReal = NULL;
1271
1272 hr = IShellFolder_GetDisplayNameOf(psf, pidlSimple, SHGDN_INFOLDER | SHGDN_FORPARSING,
1273 &strret, 0);
1275 return hr;
1276
1277 hr = StrRetToBufW(&strret, pidlSimple, szPath, _countof(szPath));
1279 return hr;
1280
1281 attrs = SFGAO_FILESYSTEM;
1282 hr = psf->GetAttributesOf(1, &pidlSimple, &attrs);
1283 if (SUCCEEDED(hr) && !(attrs & SFGAO_FILESYSTEM))
1284 return SHILClone(pidlSimple, ppidlReal);
1285
1286 hr = IShellFolder_ParseDisplayName(psf, NULL, NULL, szPath, NULL, ppidlReal, NULL);
1287 if (hr == E_INVALIDARG || hr == E_NOTIMPL)
1288 return SHILClone(pidlSimple, ppidlReal);
1289
1290 return hr;
1291}
1292
1296 _In_ PCWSTR pszCommandName,
1298{
1299 HRESULT hr;
1301 if (SUCCEEDED(hr = pUnk->QueryInterface(IID_PPV_ARG(IInitializeCommand, &pIC))))
1302 hr = pIC->Initialize(pszCommandName, pPB);
1303 return hr;
1304}
1305
1308 _In_ IExecuteCommand *pEC,
1309 _In_ PCWSTR pszCommandName,
1311 _In_opt_ IShellItemArray *pSIA,
1312 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1313 _In_opt_ IUnknown *pSite)
1314{
1315 if (!pEC)
1316 return E_INVALIDARG;
1317
1318 if (pSite)
1319 IUnknown_SetSite(pEC, pSite);
1320 IUnknown_InitializeCommand(pEC, pszCommandName, pPB);
1321
1323 if (pSIA && SUCCEEDED(pEC->QueryInterface(IID_PPV_ARG(IObjectWithSelection, &pOWS))))
1324 pOWS->SetSelection(pSIA);
1325
1326 DWORD dwKeyState = 0, fMask = pICI ? pICI->fMask : 0;
1327 pEC->SetNoShowUI((fMask & CMIC_MASK_FLAG_NO_UI) != 0);
1328 pEC->SetShowWindow(pICI ? pICI->nShow : SW_SHOW);
1329 if (fMask & CMIC_MASK_SHIFT_DOWN)
1330 dwKeyState |= MK_SHIFT;
1331 if (fMask & CMIC_MASK_CONTROL_DOWN)
1332 dwKeyState |= MK_CONTROL;
1333 pEC->SetKeyState(dwKeyState);
1334 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpDirectoryW)
1335 pEC->SetDirectory(pICI->lpDirectoryW);
1336 if ((fMask & CMIC_MASK_UNICODE) && pICI->lpParametersW)
1337 pEC->SetParameters(pICI->lpParametersW);
1338 if (fMask & CMIC_MASK_PTINVOKE)
1339 pEC->SetPosition(pICI->ptInvoke);
1340
1341 HRESULT hr = pEC->Execute();
1342 if (pSite)
1343 IUnknown_SetSite(pEC, NULL);
1344 return hr;
1345}
1346
1349 _In_ IExecuteCommand *pEC,
1350 _In_ PCWSTR pszCommandName,
1352 _In_ IDataObject *pDO,
1353 _In_opt_ LPCMINVOKECOMMANDINFOEX pICI,
1354 _In_opt_ IUnknown *pSite)
1355{
1357 HRESULT hr = SHCreateShellItemArrayFromDataObject(pDO, IID_PPV_ARG(IShellItemArray, &pSIA));
1358 return SUCCEEDED(hr) ? InvokeIExecuteCommand(pEC, pszCommandName, pPB, pSIA, pICI, pSite) : hr;
1359}
1360
1361static HRESULT
1363{
1364 HRESULT hr = pCM->GetCommandString(Id, GCS & ~GCS_UNICODE, NULL, Buf, cchMax);
1365 if (FAILED(hr))
1366 {
1368 hr = pCM->GetCommandString(Id, GCS | GCS_UNICODE, NULL, (LPSTR)buf, _countof(buf));
1369 if (SUCCEEDED(hr))
1370 hr = SHUnicodeToAnsi(buf, Buf, cchMax) > 0 ? S_OK : E_FAIL;
1371 }
1372 return hr;
1373}
1374
1375UINT
1377{
1378 CHAR buf[MAX_PATH];
1379 if (IS_INTRESOURCE(verba))
1380 {
1381 if (FAILED(GetCommandStringA(pCM, LOWORD(verba), GCS_VERB, buf, _countof(buf))))
1382 return 0;
1383 verba = buf;
1384 }
1385 return MapVerbToDfmCmd(verba); // Returns DFM_CMD_* or 0
1386}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
UINT MapVerbToDfmCmd(_In_ LPCSTR verba)
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
DWORD Id
EXTERN_C HRESULT WINAPI SHCreateShellItemArrayFromDataObject(_In_ IDataObject *pdo, _In_ REFIID riid, _Out_ void **ppv)
Definition: CShellItem.cpp:429
UINT cchMax
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
#define ERR(fmt,...)
Definition: precomp.h:57
#define EXTERN_C
Definition: basetyps.h:12
#define STDMETHODIMP
Definition: basetyps.h:43
int CompareNoCase(_In_z_ PCXSTR psz) const
Definition: cstringt.h:743
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppvObj) override
Definition: utils.cpp:345
STDMETHODIMP GetWindow(HWND *phWnd) override
Definition: utils.cpp:369
STDMETHODIMP_(ULONG) Release() override
Definition: utils.cpp:358
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override
Definition: utils.cpp:376
STDMETHODIMP_(ULONG) AddRef() override
Definition: utils.cpp:354
virtual ~CDummyOleWindow()
Definition: utils.cpp:342
bool AllocateBytes(_In_ size_t nBytes)
Definition: atlalloc.h:127
LPARAM lParam
Definition: combotst.c:139
#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 NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOL WINAPI LookupPrivilegeValueW(LPCWSTR lpSystemName, LPCWSTR lpPrivilegeName, PLUID lpLuid)
Definition: misc.c:782
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
INT WINAPI StrToIntW(LPCWSTR lpString)
Definition: string.c:411
#define CloseHandle
Definition: compat.h:739
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define SetLastError(x)
Definition: compat.h:752
#define GetCurrentProcess()
Definition: compat.h:759
#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 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
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4261
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
Definition: locale.c:1665
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
EXTERN_C WORD WINAPI ExtractIconResInfoW(_In_ HANDLE hHandle, _In_ LPCWSTR lpFileName, _In_ WORD wIndex, _Out_ LPWORD lpSize, _Out_ LPHANDLE lpIcon)
Definition: stubs.cpp:811
EXTERN_C HRESULT WINAPI SHSetFolderPathW(_In_ INT csidl, _In_ HANDLE hToken, _In_ DWORD dwFlags, _In_ LPCWSTR pszPath)
Definition: stubs.cpp:886
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogW(_In_ HWND hwnd, _In_ LPCWSTR pszRemoteName, _In_ DWORD dwType)
Definition: stubs.cpp:618
BOOL WINAPI SHOpenPropSheetW(_In_opt_ LPCWSTR pszCaption, _In_opt_ HKEY *ahKeys, _In_ UINT cKeys, _In_ const CLSID *pclsidDefault, _In_ IDataObject *pDataObject, _In_opt_ IShellBrowser *pShellBrowser, _In_opt_ LPCWSTR pszStartPage)
Definition: stubs.cpp:219
EXTERN_C BOOL WINAPI PathIsSlowW(_In_ LPCWSTR pszFile, _In_ DWORD dwAttr)
Definition: stubs.cpp:934
EXTERN_C BOOL WINAPI SHOpenPropSheetA(_In_opt_ LPCSTR pszCaption, _In_opt_ HKEY *ahKeys, _In_ UINT cKeys, _In_ const CLSID *pclsidDefault, _In_ IDataObject *pDataObject, _In_opt_ IShellBrowser *pShellBrowser, _In_opt_ LPCSTR pszStartPage)
Definition: utils.cpp:1055
BOOL WINAPI IsSuspendAllowed(VOID)
Definition: utils.cpp:636
EXTERN_C HRESULT WINAPI SHGetPathCchFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, SIZE_T cchPathMax)
#define PATH_VALID_ELEMENT
Definition: utils.cpp:33
HRESULT Shell_DisplayNameOf(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_ LPWSTR pszBuf, _In_ UINT cchBuf)
Definition: utils.cpp:230
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:246
static VOID DynamicPathRemoveBackslashW(_Out_ CStringW &strPath)
Definition: utils.cpp:1216
EXTERN_C WORD WINAPI ExtractIconResInfoA(_In_ HANDLE hHandle, _In_ LPCSTR lpFileName, _In_ WORD wIndex, _Out_ LPWORD lpSize, _Out_ LPHANDLE lpIcon)
Definition: utils.cpp:461
HRESULT SHGetNameAndFlagsW(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_opt_ LPWSTR pszText, _In_ UINT cchBuf, _Inout_opt_ DWORD *pdwAttributes)
Definition: utils.cpp:289
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:13
static HRESULT GetCommandStringA(_In_ IContextMenu *pCM, _In_ UINT_PTR Id, _In_ UINT GCS, _Out_writes_(cchMax) LPSTR Buf, _In_ UINT cchMax)
Definition: utils.cpp:1362
EXTERN_C BOOL WINAPI PathIsEqualOrSubFolder(_In_ LPCWSTR pszPath1OrCSIDL, _In_ LPCWSTR pszPath2)
Definition: utils.cpp:1229
EXTERN_C HRESULT WINAPI SHGetRealIDL(_In_ IShellFolder *psf, _In_ PCUITEMID_CHILD pidlSimple, _Outptr_ PITEMID_CHILD *ppidlReal)
Definition: utils.cpp:1260
EXTERN_C DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken)
Definition: utils.cpp:502
#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:821
EXTERN_C BOOL WINAPI SHTestTokenPrivilegeW(_In_opt_ HANDLE hToken, _In_ LPCWSTR lpName)
Definition: utils.cpp:572
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:128
EXTERN_C HRESULT WINAPI SHInvokePrivilegedFunctionW(_In_ LPCWSTR pszName, _In_ PRIVILEGED_FUNCTION fn, _In_opt_ LPARAM lParam)
Definition: utils.cpp:529
BOOL BindCtx_ContainsObject(_In_ IBindCtx *pBindCtx, _In_ LPCWSTR pszName)
Definition: utils.cpp:120
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:153
BOOL PathIsValidElement(_In_ LPCWSTR pszPath)
Definition: utils.cpp:38
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:1307
EXTERN_C LPWSTR WINAPI ShortSizeFormatW(_In_ DWORD dwNumber, _Out_writes_(0x8FFF) LPWSTR pszBuffer)
Definition: utils.cpp:482
EXTERN_C LPSTR WINAPI SheRemoveQuotesA(LPSTR psz)
Definition: utils.cpp:699
BOOL Shell_FailForceReturn(_In_ HRESULT hr)
Definition: utils.cpp:170
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:220
static INT DynamicPathCommonPrefixW(_In_ LPCWSTR lpszPath1, _In_ LPCWSTR lpszPath2, _Out_ CStringW &strPath)
Definition: utils.cpp:1144
EXTERN_C HRESULT IUnknown_InitializeCommand(_In_ IUnknown *pUnk, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB)
Definition: utils.cpp:1294
static HRESULT DynamicSHGetPathFromIDListW(_In_ LPCITEMIDLIST pidl, _Out_ CStringW &strPath)
Definition: utils.cpp:1161
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:881
EXTERN_C BOOL WINAPI Activate_RunDLL(_In_ HWND hwnd, _In_ HINSTANCE hinst, _In_ LPCWSTR cmdline, _In_ INT cmdshow)
Definition: utils.cpp:1094
EXTERN_C BOOL WINAPI PathIsSlowA(_In_ LPCSTR pszFile, _In_ DWORD dwAttr)
Definition: utils.cpp:447
UINT GetDfmCmd(_In_ IContextMenu *pCM, _In_ LPCSTR verba)
Definition: utils.cpp:1376
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:919
EXTERN_C HINSTANCE WINAPI SHGetShellStyleHInstance(VOID)
Definition: utils.cpp:647
EXTERN_C HRESULT BindCtx_RegisterObjectParam(_In_ IBindCtx *pBindCtx, _In_ LPOLESTR pszKey, _In_opt_ IUnknown *punk, _Out_ LPBC *ppbc)
Definition: utils.cpp:383
EXTERN_C HRESULT WINAPI CopyStreamUI(_In_ IStream *pSrc, _Out_ IStream *pDst, _Inout_opt_ IProgressDialog *pProgress, _In_opt_ DWORDLONG dwlSize)
Definition: utils.cpp:938
static BOOL OpenEffectiveToken(_In_ DWORD DesiredAccess, _Out_ HANDLE *phToken)
Definition: utils.cpp:89
EXTERN_C BOOL WINAPI SHFindComputer(LPCITEMIDLIST pidlRoot, LPCITEMIDLIST pidlSavedSearch)
Definition: utils.cpp:750
static HRESULT Int64ToStr(_In_ LONGLONG llValue, _Out_writes_(cchValue) LPWSTR pszValue, _In_ UINT cchValue)
Definition: utils.cpp:776
EXTERN_C LPWSTR WINAPI SheRemoveQuotesW(LPWSTR psz)
Definition: utils.cpp:724
EXTERN_C HRESULT WINAPI SHCreatePropertyBag(_In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:689
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:1348
EXTERN_C HWND BindCtx_GetUIWindow(_In_ IBindCtx *pBindCtx)
Definition: utils.cpp:323
HRESULT SHBindToObjectEx(_In_opt_ IShellFolder *pShellFolder, _In_ LPCITEMIDLIST pidl, _In_opt_ IBindCtx *pBindCtx, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:187
EXTERN_C HRESULT WINAPI SHSetFolderPathA(_In_ INT csidl, _In_ HANDLE hToken, _In_ DWORD dwFlags, _In_ LPCSTR pszPath)
Definition: utils.cpp:429
HRESULT Shell_TranslateIDListAlias(_In_ LPCITEMIDLIST pidl, _In_ HANDLE hToken, _Out_ LPITEMIDLIST *ppidlAlias, _In_ DWORD dwFlags)
Definition: utils.cpp:111
BOOL IsShutdownAllowed(VOID)
Definition: utils.cpp:628
BOOL SHSkipJunctionBinding(_In_ IBindCtx *pbc, _In_ CLSID *pclsid)
Definition: utils.cpp:141
BOOL PathIsDotOrDotDotW(_In_ LPCWSTR pszPath)
Definition: utils.cpp:26
EXTERN_C HRESULT WINAPI SHStartNetConnectionDialogA(_In_ HWND hwnd, _In_ LPCSTR pszRemoteName, _In_ DWORD dwType)
Definition: utils.cpp:1120
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:73
EXTERN_C BOOL WINAPI SHOpenEffectiveToken(_Out_ LPHANDLE phToken)
Definition: utils.cpp:493
static HRESULT DynamicSHGetSpecialFolderPathW(_In_ HWND hwndOwner, _Out_ CStringW &strPath, _In_ INT nCSIDL, _In_ BOOL bCreate)
Definition: utils.cpp:1193
HRESULT SHCoInitializeAnyApartment(VOID)
Definition: utils.cpp:280
BOOL PathIsDosDevice(_In_ LPCWSTR pszName)
Definition: utils.cpp:52
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3260
DWORD WINAPI SHGetObjectCompatFlags(IUnknown *pUnk, const CLSID *clsid)
Definition: ordinal.c:6278
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
Definition: ordinal.c:1332
BOOL WINAPI SHSkipJunction(IBindCtx *pbc, const CLSID *pclsid)
Definition: ordinal.c:4558
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1407
int WINAPI PathCommonPrefixW(LPCWSTR lpszFile1, LPCWSTR lpszFile2, LPWSTR achPath)
Definition: path.c:2806
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
Definition: path.c:629
void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
Definition: path.c:823
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
Definition: path.c:4419
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2791
LPWSTR WINAPI StrFormatByteSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:2388
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:894
static const WCHAR szColorName[]
Definition: system.c:40
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
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
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)
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
INT WINAPI GetNumberFormatW(LCID lcid, DWORD dwFlags, LPCWSTR lpszValue, const NUMBERFMTW *lpFormat, LPWSTR lpNumberStr, int cchOut)
Definition: lcformat.c:1212
#define Stat
Definition: syshdrs.h:78
#define pch(ap)
Definition: match.c:418
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
LPCWSTR szPath
Definition: env.c:37
static HINSTANCE hinst
Definition: edit.c:551
static LPOLESTR
Definition: stg_prop.c:27
#define min(a, b)
Definition: monoChain.cc:55
#define _Out_opt_
Definition: ms_sal.h:346
#define _Inout_
Definition: ms_sal.h:378
#define _Outptr_
Definition: ms_sal.h:427
#define _Out_writes_(size)
Definition: ms_sal.h:348
#define _Inout_opt_
Definition: ms_sal.h:379
#define _Out_
Definition: ms_sal.h:345
#define _In_
Definition: ms_sal.h:308
#define _In_opt_
Definition: ms_sal.h:309
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int UINT
Definition: ndis.h:50
#define DWORD
Definition: nt_native.h:44
#define LOCALE_USER_DEFAULT
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
#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
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:940
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1350
BOOLEAN WINAPI IsPwrSuspendAllowed(VOID)
Definition: powrprof.c:488
EXTERN_C HRESULT WINAPI SHCreatePropertyBagOnMemory(_In_ DWORD dwMode, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: propbag.cpp:254
#define REFIID
Definition: guiddef.h:118
_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
HRESULT hr
Definition: shlfolder.c:183
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1519
#define CSIDL_FLAG_DONT_VERIFY
Definition: shlobj.h:2233
#define QITABENT(Cthis, Ifoo)
Definition: shlwapi.h:2094
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
TCHAR * cmdline
Definition: stretchblt.cpp:32
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
$ULONG PrivilegeCount
Definition: setypes.h:1023
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY]
Definition: setypes.h:1024
$ULONG LowPart
Definition: ntbasedef.h:569
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
$ULONG HighPart
Definition: ntbasedef.h:570
Definition: inflate.c:139
#define max(a, b)
Definition: svc.c:63
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
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:760
#define FMT_USE_GROUPING
Definition: undocshell.h:758
#define FMT_USE_NUMDIGITS
Definition: undocshell.h:756
#define FMT_USE_NEGNUMBER
Definition: undocshell.h:761
#define FMT_USE_LEADZERO
Definition: undocshell.h:757
HRESULT(CALLBACK * PRIVILEGED_FUNCTION)(LPARAM lParam)
Definition: undocshell.h:789
#define FMT_USE_DECIMAL
Definition: undocshell.h:759
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
HWND WINAPI GetShellWindow(VOID)
Definition: desktop.c:651
BOOL WINAPI AllowSetForegroundWindow(DWORD dwProcessId)
Definition: window.c:49
#define ZeroMemory
Definition: winbase.h:1712
_In_opt_ LPSTR _In_opt_ LPSTR _In_ DWORD _In_ DWORD _Out_opt_ PHANDLE phToken
Definition: winbase.h:2715
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LPCSTR lpFileName
Definition: winbase.h:3071
HANDLE WINAPI GetCurrentThread(void)
Definition: proc.c:1148
#define LPTR
Definition: winbase.h:381
#define LOAD_LIBRARY_AS_DATAFILE
Definition: winbase.h:342
_In_ LPCSTR lpName
Definition: winbase.h:2789
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define INVALID_FILE_SIZE
Definition: winbase.h:548
_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
#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 LOCALE_SGROUPING
Definition: winnls.h:44
#define LOCALE_SDECIMAL
Definition: winnls.h:42
#define LOCALE_IDIGITS
Definition: winnls.h:45
#define LOCALE_STHOUSAND
Definition: winnls.h:43
#define LOCALE_INEGNUMBER
Definition: winnls.h:47
#define LOCALE_ILZERO
Definition: winnls.h:46
#define SE_SHUTDOWN_NAME
Definition: winnt_old.h:384
#define SW_SHOWNORMAL
Definition: winuser.h:770
#define MK_SHIFT
Definition: winuser.h:2369
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
#define MK_CONTROL
Definition: winuser.h:2370
#define SW_SHOW
Definition: winuser.h:775
#define RtlEqualLuid(Luid1, Luid2)
Definition: rtlfuncs.h:301
#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