ReactOS 0.4.15-dev-7842-g558ab78
CFindFolder.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Search Shell Extension
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Search results folder
5 * COPYRIGHT: Copyright 2019 Brock Mammen
6 */
7
8#include "CFindFolder.h"
9#include <exdispid.h>
10
12
13static HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO* ppfti,
14 LPCITEMIDLIST pidlChild, const GUID* clsid, REFIID riid, LPVOID *ppvOut)
15{
16 HRESULT hr;
17 CComPtr<IShellFolder> pShellFolder;
18
20 if (FAILED(hr))
21 return hr;
22
23 LPITEMIDLIST pidlAbsolute = ILCombine (pidlRoot, pidlChild);
26
27 if (ppfti && SUCCEEDED(pShellFolder->QueryInterface(IID_PPV_ARG(IPersistFolder3, &ppf3))))
28 {
29 ppf3->InitializeEx(NULL, pidlAbsolute, ppfti);
30 }
31 else if (SUCCEEDED(pShellFolder->QueryInterface(IID_PPV_ARG(IPersistFolder, &ppf))))
32 {
33 ppf->Initialize(pidlAbsolute);
34 }
35 ILFree (pidlAbsolute);
36
37 return pShellFolder->QueryInterface(riid, ppvOut);
38}
39
41 HMENU hMenu,
42 UINT indexMenu,
43 BOOL fByPosition,
44 UINT wID,
45 UINT fType,
46 LPCWSTR dwTypeData,
47 UINT fState)
48{
49 MENUITEMINFOW mii;
50 WCHAR wszText[100];
51
52 ZeroMemory(&mii, sizeof(mii));
53 mii.cbSize = sizeof(mii);
54 if (fType == MFT_SEPARATOR)
55 mii.fMask = MIIM_ID | MIIM_TYPE;
56 else if (fType == MFT_STRING)
57 {
59 if (IS_INTRESOURCE(dwTypeData))
60 {
61 if (LoadStringW(_AtlBaseModule.GetResourceInstance(), LOWORD((ULONG_PTR)dwTypeData), wszText, _countof(wszText)))
62 mii.dwTypeData = wszText;
63 else
64 {
65 ERR("failed to load string %p\n", dwTypeData);
66 return;
67 }
68 }
69 else
70 mii.dwTypeData = (LPWSTR)dwTypeData;
71 mii.fState = fState;
72 }
73
74 mii.wID = wID;
75 mii.fType = fType;
76 InsertMenuItemW(hMenu, indexMenu, fByPosition, &mii);
77}
78
80{
81 int iResource;
83 int fmt;
84 int cxChar;
85};
86
88{
92};
93
95 m_hStopEvent(NULL)
96{
97}
98
100{
101 CComHeapPtr<ITEMIDLIST> lpFSPidl(ILCreateFromPathW(lpszPath));
102 if (!lpFSPidl)
103 {
104 ERR("Failed to create pidl from path\n");
105 return NULL;
106 }
107 LPITEMIDLIST lpLastFSPidl = ILFindLastID(lpFSPidl);
108
109 int pathLen = (PathFindFileNameW(lpszPath) - lpszPath) * sizeof(WCHAR);
110 int cbData = sizeof(WORD) + pathLen + lpLastFSPidl->mkid.cb;
111 LPITEMIDLIST pidl = (LPITEMIDLIST) SHAlloc(cbData + sizeof(WORD));
112 if (!pidl)
113 return NULL;
114
115 LPBYTE p = (LPBYTE) pidl;
116 *((WORD *) p) = cbData;
117 p += sizeof(WORD);
118
119 memcpy(p, lpszPath, pathLen);
120 p += pathLen - sizeof(WCHAR);
121 *((WCHAR *) p) = '\0';
122 p += sizeof(WCHAR);
123
124 memcpy(p, lpLastFSPidl, lpLastFSPidl->mkid.cb);
125 p += lpLastFSPidl->mkid.cb;
126
127 *((WORD *) p) = 0;
128
129 return pidl;
130}
131
133{
134 if (!pidl || !pidl->mkid.cb)
135 return NULL;
136 return (LPCWSTR) pidl->mkid.abID;
137}
138
140{
141 if (!pidl || !pidl->mkid.cb)
142 return pidl;
143 return (LPCITEMIDLIST) ((LPBYTE) pidl->mkid.abID
144 + ((wcslen((LPCWSTR) pidl->mkid.abID) + 1) * sizeof(WCHAR)));
145}
146
148{
159};
160
161template<typename TChar, typename TString, int (&StrNCmp)(const TChar *, const TChar *, size_t)>
162static const TChar* StrStrN(const TChar *lpFirst, const TString &lpSrch, UINT cchMax)
163{
164 if (!lpFirst || lpSrch.IsEmpty() || !cchMax)
165 return NULL;
166
167 for (UINT i = cchMax; i > 0 && *lpFirst; i--, lpFirst++)
168 {
169 if (!StrNCmp(lpFirst, lpSrch, lpSrch.GetLength()))
170 return (const TChar*)lpFirst;
171 }
172
173 return NULL;
174}
175
176static inline BOOL
177StrFindNIA(const CHAR *lpFirst, const CStringA &lpSrch, UINT cchMax)
178{
179 return StrStrN<CHAR, CStringA, _strnicmp>(lpFirst, lpSrch, cchMax) != NULL;
180}
181
182static inline BOOL
183StrFindNIW(const WCHAR *lpFirst, const CStringW &lpSrch, UINT cchMax)
184{
185 return StrStrN<WCHAR, CStringW, _wcsnicmp>(lpFirst, lpSrch, cchMax) != NULL;
186}
187
188/*
189 * The following code is borrowed from base/applications/cmdutils/more/more.c .
190 */
191typedef enum
192{
196 ENCODING_UTF8 = 3
198
199static BOOL
203 OUT ENCODING* Encoding OPTIONAL,
205{
206 PBYTE pBytes = (PBYTE)Buffer;
207 ENCODING encFile = ENCODING_ANSI;
208 DWORD dwPos = 0;
209
210 /*
211 * See http://archives.miloush.net/michkap/archive/2007/04/22/2239345.html
212 * for more details about the algorithm and the pitfalls behind it.
213 * Of course it would be actually great to make a nice function that
214 * would work, once and for all, and put it into a library.
215 */
216
217 /* Look for Byte Order Marks */
218 if ((BufferSize >= 2) && (pBytes[0] == 0xFF) && (pBytes[1] == 0xFE))
219 {
220 encFile = ENCODING_UTF16LE;
221 dwPos = 2;
222 }
223 else if ((BufferSize >= 2) && (pBytes[0] == 0xFE) && (pBytes[1] == 0xFF))
224 {
225 encFile = ENCODING_UTF16BE;
226 dwPos = 2;
227 }
228 else if ((BufferSize >= 3) && (pBytes[0] == 0xEF) && (pBytes[1] == 0xBB) && (pBytes[2] == 0xBF))
229 {
230 encFile = ENCODING_UTF8;
231 dwPos = 3;
232 }
233 else
234 {
235 /*
236 * Try using statistical analysis. Do not rely on the return value of
237 * IsTextUnicode as we can get FALSE even if the text is in UTF-16 BE
238 * (i.e. we have some of the IS_TEXT_UNICODE_REVERSE_MASK bits set).
239 * Instead, set all the tests we want to perform, then just check
240 * the passed tests and try to deduce the string properties.
241 */
242
243/*
244 * This mask contains the 3 highest bits from IS_TEXT_UNICODE_NOT_ASCII_MASK
245 * and the 1st highest bit from IS_TEXT_UNICODE_NOT_UNICODE_MASK.
246 */
247#define IS_TEXT_UNKNOWN_FLAGS_MASK ((7 << 13) | (1 << 11))
248
249 /* Flag out the unknown flags here, the passed tests will not have them either */
254 INT Results;
255
257 Results = Tests;
258
259 /*
260 * As the IS_TEXT_UNICODE_NULL_BYTES or IS_TEXT_UNICODE_ILLEGAL_CHARS
261 * flags are expected to be potentially present in the result without
262 * modifying our expectations, filter them out now.
263 */
265
266 /*
267 * NOTE: The flags IS_TEXT_UNICODE_ASCII16 and
268 * IS_TEXT_UNICODE_REVERSE_ASCII16 are not reliable.
269 *
270 * NOTE2: Check for potential "bush hid the facts" effect by also
271 * checking the original results (in 'Tests') for the absence of
272 * the IS_TEXT_UNICODE_NULL_BYTES flag, as we may presumably expect
273 * that in UTF-16 text there will be at some point some NULL bytes.
274 * If not, fall back to ANSI. This shows the limitations of using the
275 * IsTextUnicode API to perform such tests, and the usage of a more
276 * improved encoding detection algorithm would be really welcome.
277 */
278 if (!(Results & IS_TEXT_UNICODE_NOT_UNICODE_MASK) &&
279 !(Results & IS_TEXT_UNICODE_REVERSE_MASK) &&
280 (Results & IS_TEXT_UNICODE_UNICODE_MASK) &&
282 {
283 encFile = ENCODING_UTF16LE;
284 dwPos = (Results & IS_TEXT_UNICODE_SIGNATURE) ? 2 : 0;
285 }
286 else
287 if (!(Results & IS_TEXT_UNICODE_NOT_UNICODE_MASK) &&
288 !(Results & IS_TEXT_UNICODE_UNICODE_MASK) &&
289 (Results & IS_TEXT_UNICODE_REVERSE_MASK) &&
291 {
292 encFile = ENCODING_UTF16BE;
293 dwPos = (Results & IS_TEXT_UNICODE_REVERSE_SIGNATURE) ? 2 : 0;
294 }
295 else
296 {
297 /*
298 * Either 'Results' has neither of those masks set, as it can be
299 * the case for UTF-8 text (or ANSI), or it has both as can be the
300 * case when analysing pure binary data chunk. This is therefore
301 * invalid and we fall back to ANSI encoding.
302 * FIXME: In case of failure, assume ANSI (as long as we do not have
303 * correct tests for UTF8, otherwise we should do them, and at the
304 * very end, assume ANSI).
305 */
306 encFile = ENCODING_ANSI; // ENCODING_UTF8;
307 dwPos = 0;
308 }
309 }
310
311 if (Encoding)
312 *Encoding = encFile;
313 if (SkipBytes)
314 *SkipBytes = dwPos;
315
316 return (encFile != ENCODING_ANSI);
317}
318
319static BOOL SearchFile(LPCWSTR lpFilePath, _SearchData *pSearchData)
320{
323 return FALSE;
324
325 // FIXME: support large file
327 if (size == 0 || size == INVALID_FILE_SIZE)
328 {
330 return FALSE;
331 }
332
335 if (hFileMap == INVALID_HANDLE_VALUE)
336 return FALSE;
337
338 LPBYTE pbContents = (LPBYTE)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, size);
339 CloseHandle(hFileMap);
340 if (!pbContents)
341 return FALSE;
342
344 IsDataUnicode(pbContents, size, &encoding, NULL);
345
346 BOOL bFound;
347 switch (encoding)
348 {
349 case ENCODING_UTF16LE:
350 // UTF-16
351 bFound = StrFindNIW((LPCWSTR)pbContents, pSearchData->szQueryW, size / sizeof(WCHAR));
352 break;
353 case ENCODING_UTF16BE:
354 // UTF-16 BE
355 bFound = StrFindNIW((LPCWSTR)pbContents, pSearchData->szQueryU16BE, size / sizeof(WCHAR));
356 break;
357 case ENCODING_UTF8:
358 // UTF-8
359 bFound = StrFindNIA((LPCSTR)pbContents, pSearchData->szQueryU8, size / sizeof(CHAR));
360 break;
361 case ENCODING_ANSI:
362 default:
363 // ANSI or UTF-8 without BOM
364 bFound = StrFindNIA((LPCSTR)pbContents, pSearchData->szQueryA, size / sizeof(CHAR));
365 if (!bFound && pSearchData->szQueryA != pSearchData->szQueryU8)
366 bFound = StrFindNIA((LPCSTR)pbContents, pSearchData->szQueryU8, size / sizeof(CHAR));
367 break;
368 }
369
370 UnmapViewOfFile(pbContents);
371 return bFound;
372}
373
374static BOOL FileNameMatch(LPCWSTR FindDataFileName, _SearchData *pSearchData)
375{
376 if (pSearchData->szFileName.IsEmpty() || PathMatchSpecW(FindDataFileName, pSearchData->szFileName))
377 {
378 return TRUE;
379 }
380 return FALSE;
381}
382
384{
385 if (pSearchData->szQueryA.IsEmpty() || SearchFile(szPath, pSearchData))
386 {
387 return TRUE;
388 }
389 return FALSE;
390}
391
393{
394 if (!(FileAttributes & FILE_ATTRIBUTE_HIDDEN) || (pSearchData->SearchHidden))
395 {
396 return TRUE;
397 }
398 return FALSE;
399}
400
401static UINT RecursiveFind(LPCWSTR lpPath, _SearchData *pSearchData)
402{
403 if (WaitForSingleObject(pSearchData->hStopEvent, 0) != WAIT_TIMEOUT)
404 return 0;
405
407 WIN32_FIND_DATAW FindData;
408 HANDLE hFindFile;
409 BOOL bMoreFiles = TRUE;
410 UINT uTotalFound = 0;
411
412 PathCombineW(szPath, lpPath, L"*");
413
414 for (hFindFile = FindFirstFileW(szPath, &FindData);
415 bMoreFiles && hFindFile != INVALID_HANDLE_VALUE;
416 bMoreFiles = FindNextFileW(hFindFile, &FindData))
417 {
418#define IS_DOTS(psz) ((psz)[0] == L'.' && ((psz)[1] == 0 || ((psz)[1] == L'.' && (psz)[2] == 0)))
419 if (IS_DOTS(FindData.cFileName))
420 continue;
421
422 PathCombineW(szPath, lpPath, FindData.cFileName);
423
424 if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
425 {
427 if (pSearchData->szQueryW.IsEmpty() &&
428 FileNameMatch(FindData.cFileName, pSearchData) &&
429 AttribHiddenMatch(FindData.dwFileAttributes, pSearchData))
430 {
432 uTotalFound++;
433 }
434 status.Format(IDS_SEARCH_FOLDER, FindData.cFileName);
435 PostMessageW(pSearchData->hwnd, WM_SEARCH_UPDATE_STATUS, 0, (LPARAM) StrDupW(status.GetBuffer()));
436
437 uTotalFound += RecursiveFind(szPath, pSearchData);
438 }
439 else if (FileNameMatch(FindData.cFileName, pSearchData)
440 && AttribHiddenMatch(FindData.dwFileAttributes, pSearchData)
441 && ContentsMatch(szPath, pSearchData))
442 {
443 uTotalFound++;
445 }
446 }
447
448 if (hFindFile != INVALID_HANDLE_VALUE)
449 FindClose(hFindFile);
450
451 return uTotalFound;
452}
453
455{
456 _SearchData *data = static_cast<_SearchData*>(lpParameter);
457
459
460 data->pFindFolder->NotifyConnections(DISPID_SEARCHSTART);
461
462 UINT uTotalFound = RecursiveFind(data->szPath, data);
463
464 data->pFindFolder->NotifyConnections(DISPID_SEARCHCOMPLETE);
465
467 status.Format(IDS_SEARCH_FILES_FOUND, uTotalFound);
469 ::SendMessageW(data->hwnd, WM_SEARCH_STOP, 0, 0);
470
471 CloseHandle(data->hStopEvent);
472 delete data;
473
474 if (SUCCEEDED(hrCoInit))
476
477 return 0;
478}
479
481{
482 DISPPARAMS dispatchParams = {0};
483 CComDynamicUnkArray &subscribers =
485 for (IUnknown** pSubscriber = subscribers.begin(); pSubscriber < subscribers.end(); pSubscriber++)
486 {
487 if (!*pSubscriber)
488 continue;
489
490 CComPtr<IDispatch> pDispatch;
491 HRESULT hResult = (*pSubscriber)->QueryInterface(IID_PPV_ARG(IDispatch, &pDispatch));
492 if (!FAILED_UNEXPECTEDLY(hResult))
493 pDispatch->Invoke(id, GUID_NULL, 0, DISPATCH_METHOD, &dispatchParams, NULL, NULL, NULL);
494 }
495}
496
498{
499 HKEY hkey;
500 DWORD size = sizeof(DWORD);
502 DWORD SearchHiddenValue = 0;
503
504 if (!lParam)
505 return 0;
506
507 // Clear all previous search results
508 UINT uItemIndex;
509 m_shellFolderView->RemoveObject(NULL, &uItemIndex);
510
511 _SearchData* pSearchData = new _SearchData();
512 pSearchData->pFindFolder = this;
513 pSearchData->hwnd = m_hWnd;
514
515 SearchStart *pSearchParams = (SearchStart *) lParam;
516 pSearchData->szPath = pSearchParams->szPath;
517 pSearchData->szFileName = pSearchParams->szFileName;
518 pSearchData->szQueryA = pSearchParams->szQuery;
519 pSearchData->szQueryW = pSearchParams->szQuery;
520
521 // UTF-16 BE
522 {
523 CStringW utf16 = pSearchData->szQueryW;
524 LPWSTR psz = utf16.GetBuffer();
525 for (SIZE_T i = 0; psz[i]; ++i)
526 {
527 psz[i] = MAKEWORD(HIBYTE(psz[i]), LOBYTE(psz[i]));
528 }
529 utf16.ReleaseBuffer();
530 pSearchData->szQueryU16BE = utf16;
531 }
532
533 // UTF-8
534 {
535 CStringA utf8;
536 INT cch = WideCharToMultiByte(CP_UTF8, 0, pSearchData->szQueryW, -1, NULL, 0, NULL, NULL);
537 if (cch > 0)
538 {
539 LPSTR psz = utf8.GetBuffer(cch);
540 WideCharToMultiByte(CP_UTF8, 0, pSearchData->szQueryW, -1, psz, cch, NULL, NULL);
541 utf8.ReleaseBuffer();
542 pSearchData->szQueryU8 = utf8;
543 }
544 else
545 {
546 pSearchData->szQueryU8 = pSearchData->szQueryA;
547 }
548 }
549
550 pSearchData->SearchHidden = pSearchParams->SearchHidden;
551 SHFree(pSearchParams);
552
553 TRACE("pSearchParams->SearchHidden is '%d'.\n", pSearchData->SearchHidden);
554
555 if (pSearchData->SearchHidden)
556 SearchHiddenValue = 1;
557 else
558 SearchHiddenValue = 0;
559
560 /* Placing the code to save the changed settings to the registry here has the effect of not saving any changes */
561 /* to the registry unless the user clicks on the "Search" button. This is the same as what we see in Windows. */
562 result = RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", 0, KEY_SET_VALUE, &hkey);
563 if (result == ERROR_SUCCESS)
564 {
565 if (RegSetValueExW(hkey, L"SearchHidden", NULL, REG_DWORD, (const BYTE*)&SearchHiddenValue, size) == ERROR_SUCCESS)
566 {
567 TRACE("SearchHidden is '%d'.\n", SearchHiddenValue);
568 }
569 else
570 {
571 ERR("RegSetValueEx for \"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\SearchHidden\" Failed.\n");
572 }
573 RegCloseKey(hkey);
574 }
575 else
576 {
577 ERR("RegOpenKey for \"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\" Failed.\n");
578 }
579
580 if (m_hStopEvent)
583
584 if (!SHCreateThread(SearchThreadProc, pSearchData, NULL, NULL))
585 {
586 SHFree(pSearchData);
587 return 0;
588 }
589
590 return 0;
591}
592
594{
595 if (m_hStopEvent)
596 {
599 }
600 return 0;
601}
602
604{
605 if (!lParam)
606 return 0;
607
609
610 CComHeapPtr<ITEMIDLIST> lpSearchPidl(_ILCreate(lpPath));
611 if (lpSearchPidl)
612 {
613 UINT uItemIndex;
614 m_shellFolderView->AddObject(lpSearchPidl, &uItemIndex);
615 }
616
617 return 0;
618}
619
621{
623 if (m_shellBrowser)
624 {
625 m_shellBrowser->SetStatusTextSB(status);
626 }
627
628 return 0;
629}
630
631// *** IShellFolder2 methods ***
633{
635 return E_NOTIMPL;
636}
637
639{
641 return E_NOTIMPL;
642}
643
645{
646 if (pSort)
647 *pSort = 0;
648 if (pDisplay)
649 *pDisplay = 0;
650 return S_OK;
651}
652
654{
655 if (!pcsFlags)
656 return E_INVALIDARG;
657 if (iColumn >= _countof(g_ColumnDefs))
658 return m_pisfInner->GetDefaultColumnState(iColumn - _countof(g_ColumnDefs) + 1, pcsFlags);
659 *pcsFlags = g_ColumnDefs[iColumn].dwDefaultState;
660 return S_OK;
661}
662
664{
665 return m_pisfInner->GetDetailsEx(pidl, pscid, pv);
666}
667
669{
670 if (iColumn >= _countof(g_ColumnDefs))
671 return m_pisfInner->GetDetailsOf(_ILGetFSPidl(pidl), iColumn - _countof(g_ColumnDefs) + 1, pDetails);
672
673 pDetails->cxChar = g_ColumnDefs[iColumn].cxChar;
674 pDetails->fmt = g_ColumnDefs[iColumn].fmt;
675
676 if (!pidl)
677 return SHSetStrRet(&pDetails->str, _AtlBaseModule.GetResourceInstance(), g_ColumnDefs[iColumn].iResource);
678
679 if (iColumn == COL_LOCATION_INDEX)
680 {
681 return SHSetStrRet(&pDetails->str, _ILGetPath(pidl));
682 }
683
684 if (iColumn == COL_RELEVANCE_INDEX)
685 {
686 // TODO: Fill once the relevance is calculated
687 return SHSetStrRet(&pDetails->str, "");
688 }
689
690 return GetDisplayNameOf(pidl, SHGDN_NORMAL, &pDetails->str);
691}
692
694{
696 return E_NOTIMPL;
697}
698
699// *** IShellFolder methods ***
700STDMETHODIMP CFindFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten,
701 PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes)
702{
704 return E_NOTIMPL;
705}
706
707STDMETHODIMP CFindFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
708{
709 *ppEnumIDList = NULL;
710 return S_FALSE;
711}
712
714{
716 return E_NOTIMPL;
717}
718
720{
722 return E_NOTIMPL;
723}
724
726{
727 WORD wColumn = LOWORD(lParam);
728 switch (wColumn)
729 {
730 case COL_NAME_INDEX: // Name
731 break;
732 case COL_LOCATION_INDEX: // Path
733 return MAKE_COMPARE_HRESULT(StrCmpW(_ILGetPath(pidl1), _ILGetPath(pidl2)));
734 case COL_RELEVANCE_INDEX: // Relevance
735 return E_NOTIMPL;
736 default: // Default columns
737 wColumn -= _countof(g_ColumnDefs) - 1;
738 break;
739 }
740 return m_pisfInner->CompareIDs(HIWORD(lParam) | wColumn, _ILGetFSPidl(pidl1), _ILGetFSPidl(pidl2));
741}
742
744{
745 if (riid == IID_IShellView)
746 {
747 SFV_CREATE sfvparams = {};
748 sfvparams.cbSize = sizeof(SFV_CREATE);
749 sfvparams.pshf = this;
750 sfvparams.psfvcb = this;
751 HRESULT hr = SHCreateShellFolderView(&sfvparams, (IShellView **) ppvOut);
753 {
754 return hr;
755 }
756
757 return ((IShellView * ) * ppvOut)->QueryInterface(IID_PPV_ARG(IShellFolderView, &m_shellFolderView));
758 }
759 return E_NOINTERFACE;
760}
761
763{
765 aFSPidl.Allocate(cidl);
766 for (UINT i = 0; i < cidl; i++)
767 {
768 aFSPidl[i] = _ILGetFSPidl(apidl[i]);
769 }
770
771 return m_pisfInner->GetAttributesOf(cidl, aFSPidl, rgfInOut);
772}
773
775 public IContextMenu,
776 public CComObjectRootEx<CComMultiThreadModelNoCS>
777{
781 static const UINT ADDITIONAL_MENU_ITEMS = 2;
782
784 STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
785 {
786 m_firstCmdId = indexMenu;
788 _InsertMenuItemW(hMenu, indexMenu++, TRUE, idCmdFirst++, MFT_SEPARATOR, NULL, 0);
789 return m_pInner->QueryContextMenu(hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
790 }
791
793 {
794 if (!IS_INTRESOURCE(lpcmi->lpVerb))
795 {
796 return m_pInner->InvokeCommand(lpcmi);
797 }
798
800 {
801 PCUITEMID_CHILD *apidl;
802 UINT cidl;
803 HRESULT hResult = m_shellFolderView->GetSelectedObjects(&apidl, &cidl);
804 if (FAILED_UNEXPECTEDLY(hResult))
805 return hResult;
806
807 for (UINT i = 0; i < cidl; i++)
808 {
810 if (!folderPidl)
811 return E_OUTOFMEMORY;
813 SHOpenFolderAndSelectItems(folderPidl, 1, &child, 0);
814 }
815 LocalFree(apidl); // Yes, LocalFree
816 return S_OK;
817 }
818
819 CMINVOKECOMMANDINFOEX actualCmdInfo;
820 memcpy(&actualCmdInfo, lpcmi, lpcmi->cbSize);
821 actualCmdInfo.lpVerb -= ADDITIONAL_MENU_ITEMS;
822 return m_pInner->InvokeCommand((CMINVOKECOMMANDINFO *)&actualCmdInfo);
823 }
824
825 STDMETHODIMP GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen)
826 {
827 return m_pInner->GetCommandString(idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
828 }
829
830public:
831 static HRESULT Create(IShellFolderView *pShellFolderView, IContextMenu *pInnerContextMenu, IContextMenu **pContextMenu)
832 {
835 if (FAILED_UNEXPECTEDLY(hResult))
836 return hResult;
837 pObj->m_shellFolderView = pShellFolderView;
838 pObj->m_pInner = pInnerContextMenu;
839 return pObj->QueryInterface(IID_PPV_ARG(IContextMenu, pContextMenu));
840 }
841
843 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
845};
846
848 UINT *prgfInOut, LPVOID *ppvOut)
849{
850 if (cidl <= 0)
851 {
852 return m_pisfInner->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, ppvOut);
853 }
854
856 aFSPidl.Allocate(cidl);
857 for (UINT i = 0; i < cidl; i++)
858 {
859 aFSPidl[i] = _ILGetFSPidl(apidl[i]);
860 }
861
862 if (riid == IID_IContextMenu)
863 {
865 if (!folderPidl)
866 return E_OUTOFMEMORY;
867 CComPtr<IShellFolder> pDesktopFolder;
868 HRESULT hResult = SHGetDesktopFolder(&pDesktopFolder);
869 if (FAILED_UNEXPECTEDLY(hResult))
870 return hResult;
871 CComPtr<IShellFolder> pShellFolder;
872 hResult = pDesktopFolder->BindToObject(folderPidl, NULL, IID_PPV_ARG(IShellFolder, &pShellFolder));
873 if (FAILED_UNEXPECTEDLY(hResult))
874 return hResult;
875 CComPtr<IContextMenu> pContextMenu;
876 hResult = pShellFolder->GetUIObjectOf(hwndOwner, cidl, aFSPidl, riid, prgfInOut, (LPVOID *)&pContextMenu);
877 if (FAILED_UNEXPECTEDLY(hResult))
878 return hResult;
879 return CFindFolderContextMenu::Create(m_shellFolderView, pContextMenu, (IContextMenu **)ppvOut);
880 }
881
882 return m_pisfInner->GetUIObjectOf(hwndOwner, cidl, aFSPidl, riid, prgfInOut, ppvOut);
883}
884
886{
887 return m_pisfInner->GetDisplayNameOf(_ILGetFSPidl(pidl), dwFlags, pName);
888}
889
891 PITEMID_CHILD *pPidlOut)
892{
894 return E_NOTIMPL;
895}
896
899{
900 switch (uMsg)
901 {
902 case SFVM_DEFVIEWMODE:
903 {
904 FOLDERVIEWMODE *pViewMode = (FOLDERVIEWMODE *) lParam;
905 *pViewMode = FVM_DETAILS;
906 return S_OK;
907 }
909 {
910 // Subclass window to receive window messages
912
913 // Get shell browser for updating status bar text
914 CComPtr<IServiceProvider> pServiceProvider;
915 HRESULT hr = m_shellFolderView->QueryInterface(IID_PPV_ARG(IServiceProvider, &pServiceProvider));
917 return hr;
918 hr = pServiceProvider->QueryService(SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, &m_shellBrowser));
920 return hr;
921
922 // Open search bar
923 CComPtr<IWebBrowser2> pWebBrowser2;
924 hr = m_shellBrowser->QueryInterface(IID_PPV_ARG(IWebBrowser2, &pWebBrowser2));
926 return hr;
927 WCHAR pwszGuid[MAX_PATH];
928 StringFromGUID2(CLSID_FileSearchBand, pwszGuid, _countof(pwszGuid));
929 CComVariant searchBar(pwszGuid);
930 return pWebBrowser2->ShowBrowserBar(&searchBar, NULL, NULL);
931 }
932 }
933 return E_NOTIMPL;
934}
935
938{
939 *pidl = ILClone(m_pidl);
940 return S_OK;
941}
942
943// *** IPersistFolder methods ***
945{
946 m_pidl = ILClone(pidl);
947 if (!m_pidl)
948 return E_OUTOFMEMORY;
949
951 NULL,
952 NULL,
953 &CLSID_ShellFSFolder,
955}
956
957// *** IPersist methods ***
959{
960 if (pClassId == NULL)
961 return E_INVALIDARG;
962 *pClassId = CLSID_FindFolder;
963 return S_OK;
964}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:3855
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
static HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: CFindFolder.cpp:13
static BOOL StrFindNIW(const WCHAR *lpFirst, const CStringW &lpSrch, UINT cchMax)
static const TChar * StrStrN(const TChar *lpFirst, const TString &lpSrch, UINT cchMax)
static BOOL AttribHiddenMatch(DWORD FileAttributes, _SearchData *pSearchData)
static void WINAPI _InsertMenuItemW(HMENU hMenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
Definition: CFindFolder.cpp:40
static BOOL SearchFile(LPCWSTR lpFilePath, _SearchData *pSearchData)
static BOOL FileNameMatch(LPCWSTR FindDataFileName, _SearchData *pSearchData)
#define IS_TEXT_UNKNOWN_FLAGS_MASK
ENCODING
@ ENCODING_UTF16BE
@ ENCODING_UTF8
@ ENCODING_UTF16LE
@ ENCODING_ANSI
static BOOL ContentsMatch(LPCWSTR szPath, _SearchData *pSearchData)
#define IS_DOTS(psz)
static LPITEMIDLIST _ILCreate(LPCWSTR lpszPath)
Definition: CFindFolder.cpp:99
static FolderViewColumns g_ColumnDefs[]
Definition: CFindFolder.cpp:87
static UINT RecursiveFind(LPCWSTR lpPath, _SearchData *pSearchData)
static BOOL IsDataUnicode(IN PVOID Buffer, IN DWORD BufferSize, OUT ENCODING *Encoding OPTIONAL, OUT PDWORD SkipBytes OPTIONAL)
static BOOL StrFindNIA(const CHAR *lpFirst, const CStringA &lpSrch, UINT cchMax)
static LPCWSTR _ILGetPath(LPCITEMIDLIST pidl)
static LPCITEMIDLIST _ILGetFSPidl(LPCITEMIDLIST pidl)
static FolderViewColumns g_ColumnDefs[]
Definition: CFontExt.cpp:35
struct test_data Tests[]
UINT cchMax
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define STDMETHODIMP
Definition: basetyps.h:43
#define UNIMPLEMENTED
Definition: debug.h:115
#define ERR(fmt,...)
Definition: debug.h:110
#define RegCloseKey(hKey)
Definition: registry.h:49
IUnknown ** end()
Definition: atlcom.h:1128
IUnknown ** begin()
Definition: atlcom.h:1123
static HRESULT WINAPI CreateInstance(CComObject< Base > **pp)
Definition: atlcom.h:171
STDMETHOD() QueryInterface(REFIID iid, void **ppvObject)
Definition: atlcom.h:166
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
void ReleaseBuffer(_In_ int nNewLength=-1)
Definition: atlsimpstr.h:387
HWND m_hWnd
Definition: atlwin.h:273
Definition: bufpool.h:45
CComPtr< IContextMenu > m_pInner
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
STDMETHODIMP GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen)
static HRESULT Create(IShellFolderView *pShellFolderView, IContextMenu *pInnerContextMenu, IContextMenu **pContextMenu)
static const UINT ADDITIONAL_MENU_ITEMS
CComPtr< IShellFolderView > m_shellFolderView
STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
STDMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET pName)
LRESULT StartSearch(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
HANDLE m_hStopEvent
Definition: CFindFolder.h:70
STDMETHODIMP GetClassID(CLSID *pClassId)
CComPtr< IShellFolder2 > m_pisfInner
Definition: CFindFolder.h:67
STDMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv)
STDMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
STDMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
STDMETHODIMP GetCurFolder(PIDLIST_ABSOLUTE *pidl)
static DWORD WINAPI SearchThreadProc(LPVOID lpParameter)
STDMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
LRESULT AddResult(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
LRESULT UpdateStatus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
STDMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut)
STDMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay)
STDMETHODIMP MapColumnToSCID(UINT iColumn, SHCOLUMNID *pscid)
STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
CComPtr< IShellFolderView > m_shellFolderView
Definition: CFindFolder.h:68
STDMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
STDMETHODIMP EnumSearches(IEnumExtraSearch **ppenum)
LRESULT StopSearch(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
STDMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *pDetails)
STDMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidl)
STDMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes)
void NotifyConnections(DISPID id)
STDMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
STDMETHODIMP GetDefaultSearchGUID(GUID *pguid)
LPITEMIDLIST m_pidl
Definition: CFindFolder.h:66
STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
CComPtr< IShellBrowser > m_shellBrowser
Definition: CFindFolder.h:69
STDMETHODIMP GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut)
bool Allocate(_In_ size_t nElements=1)
Definition: atlalloc.h:143
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define IDS_COL_NAME
Definition: resource.h:6
BOOL WINAPI IsTextUnicode(IN CONST VOID *lpv, IN INT iSize, IN OUT LPINT lpiResult OPTIONAL)
Definition: unicode.c:27
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
UINT uFlags
Definition: api.c:59
#define COL_NAME_INDEX
Definition: resource.h:185
#define IDS_COL_RELEVANCE
Definition: resource.h:175
#define IDS_SEARCH_OPEN_FOLDER
Definition: resource.h:179
#define IDS_COL_LOCATION
Definition: resource.h:174
#define COL_RELEVANCE_INDEX
Definition: resource.h:187
#define IDS_SEARCH_FOLDER
Definition: resource.h:177
#define COL_LOCATION_INDEX
Definition: resource.h:186
#define IDS_SEARCH_FILES_FOUND
Definition: resource.h:176
#define CloseHandle
Definition: compat.h:739
#define PAGE_READONLY
Definition: compat.h:138
#define UnmapViewOfFile
Definition: compat.h:746
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileMappingW(a, b, c, d, e, f)
Definition: compat.h:744
#define GENERIC_READ
Definition: compat.h:135
#define MAX_PATH
Definition: compat.h:34
#define CreateFileW
Definition: compat.h:741
#define FILE_MAP_READ
Definition: compat.h:776
#define WideCharToMultiByte
Definition: compat.h:111
#define MapViewOfFile
Definition: compat.h:745
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
DWORD WINAPI GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh)
Definition: fileinfo.c:331
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
BOOL WINAPI FindNextFileW(IN HANDLE hFindFile, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:382
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
Definition: compobj.c:2002
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
Definition: shellole.c:105
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
BOOL WINAPI PathMatchSpecW(LPCWSTR lpszPath, LPCWSTR lpszMask)
Definition: path.c:1964
int WINAPI StrCmpW(LPCWSTR lpszStr, LPCWSTR lpszComp)
Definition: string.c:434
LPWSTR WINAPI StrDupW(LPCWSTR lpszStr)
Definition: string.c:1089
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, VOID *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback)
Definition: thread.c:356
#define DISPID_SEARCHSTART
Definition: exdispid.h:172
#define DISPID_SEARCHCOMPLETE
Definition: exdispid.h:173
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE _In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Out_ PIO_STATUS_BLOCK _In_opt_ PLARGE_INTEGER _In_ ULONG FileAttributes
Definition: fltkernel.h:1236
LPITEMIDLIST _ILCreate(LPCWSTR lpString, ULONG Index)
Definition: fontpidl.cpp:10
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLfloat GLfloat p
Definition: glext.h:8902
GLuint64EXT * result
Definition: glext.h:11304
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 LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
REFIID riid
Definition: atlbase.h:39
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define LOBYTE(W)
Definition: jmemdos.c:487
#define HIBYTE(W)
Definition: jmemdos.c:486
#define GUID_NULL
Definition: ks.h:106
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define END_COM_MAP()
Definition: atlcom.h:592
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
LPCWSTR szPath
Definition: env.c:37
static LPSTR pName
Definition: security.c:75
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
static LPOLESTR
Definition: stg_prop.c:27
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
static VARIANTARG static DISPID
Definition: ordinal.c:52
static HWND child
Definition: cursoricon.c:298
ENCODING
Definition: more.c:492
REFCLSID clsid
Definition: msctf.c:82
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
_In_ HANDLE hFile
Definition: mswsock.h:90
unsigned int UINT
Definition: ndis.h:50
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define DWORD
Definition: nt_native.h:44
#define KEY_SET_VALUE
Definition: nt_native.h:1017
#define L(x)
Definition: ntvdm.h:50
@ COINIT_MULTITHREADED
Definition: objbase.h:279
interface IBindCtx * LPBC
Definition: objfwd.h:18
#define DISPATCH_METHOD
Definition: oleauto.h:1006
#define PathCombineW
Definition: pathcch.h:317
#define LOWORD(l)
Definition: pedump.c:82
BYTE * PBYTE
Definition: pedump.c:66
DWORD * PDWORD
Definition: pedump.c:68
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:929
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:189
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:703
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
Definition: pidl.c:986
#define LVCFMT_LEFT
Definition: commctrl.h:2598
#define REFIID
Definition: guiddef.h:118
#define REG_DWORD
Definition: sdbapi.c:596
#define CP_UTF8
Definition: nls.h:20
@ TString
Definition: dwarf.h:133
#define WM_SEARCH_ADD_RESULT
Definition: shellfind.h:31
#define WM_SEARCH_UPDATE_STATUS
Definition: shellfind.h:32
#define WM_SEARCH_STOP
Definition: shellfind.h:30
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:573
HRESULT hr
Definition: shlfolder.c:183
EXTERN_C HRESULT WINAPI SHOpenFolderAndSelectItems(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD dwFlags)
Definition: shlfolder.cpp:393
#define SID_SShellBrowser
Definition: shlguid.h:128
#define SFVM_DEFVIEWMODE
Definition: shlobj.h:1311
#define SFVM_WINDOWCREATED
Definition: shlobj.h:1301
struct _SFV_CREATE SFV_CREATE
#define StrNCmp
Definition: shlwapi.h:1524
FOLDERVIEWMODE
Definition: shobjidl.idl:666
@ FVM_DETAILS
Definition: shobjidl.idl:672
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
@ SHCOLSTATE_TYPE_STR
Definition: shtypes.idl:121
@ SHCOLSTATE_ONBYDEFAULT
Definition: shtypes.idl:125
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
DWORD dwDefaultState
Definition: CFontExt.cpp:21
STRRET str
Definition: shtypes.idl:108
WCHAR szFileName[MAX_PATH]
Definition: shellfind.h:37
WCHAR szPath[MAX_PATH]
Definition: shellfind.h:36
BOOL SearchHidden
Definition: shellfind.h:39
WCHAR szQuery[MAX_PATH]
Definition: shellfind.h:38
IShellFolderViewCB * psfvcb
Definition: shlobj.h:1351
UINT cbSize
Definition: shlobj.h:1348
IShellFolder * pshf
Definition: shlobj.h:1349
CStringA szQueryA
CStringW szQueryW
CStringW szFileName
CStringW szPath
CStringW szQueryU16BE
HANDLE hStopEvent
CStringA szQueryU8
CComPtr< CFindFolder > pFindFolder
Definition: ps.c:97
LPWSTR dwTypeData
Definition: winuser.h:3269
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
#define MAKEWORD(a, b)
Definition: typedefs.h:248
unsigned char * LPBYTE
Definition: typedefs.h:53
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
#define OUT
Definition: typedefs.h:40
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:254
#define ZeroMemory
Definition: winbase.h:1712
_In_ LPCSTR lpName
Definition: winbase.h:2789
#define CreateEvent
Definition: winbase.h:3683
#define INVALID_FILE_SIZE
Definition: winbase.h:548
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define SubclassWindow(hwnd, lpfn)
Definition: windowsx.h:542
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define IS_TEXT_UNICODE_ILLEGAL_CHARS
Definition: winnt_old.h:894
#define IS_TEXT_UNICODE_UNICODE_MASK
Definition: winnt_old.h:898
#define IS_TEXT_UNICODE_NOT_ASCII_MASK
Definition: winnt_old.h:901
#define IS_TEXT_UNICODE_NULL_BYTES
Definition: winnt_old.h:897
#define IS_TEXT_UNICODE_REVERSE_MASK
Definition: winnt_old.h:899
#define IS_TEXT_UNICODE_REVERSE_SIGNATURE
Definition: winnt_old.h:893
#define IS_TEXT_UNICODE_NOT_UNICODE_MASK
Definition: winnt_old.h:900
#define IS_TEXT_UNICODE_SIGNATURE
Definition: winnt_old.h:892
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define RegOpenKeyEx
Definition: winreg.h:520
#define MIIM_ID
Definition: winuser.h:722
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
#define MFT_SEPARATOR
Definition: winuser.h:744
#define MIIM_STATE
Definition: winuser.h:721
#define MFS_ENABLED
Definition: winuser.h:750
#define MFT_STRING
Definition: winuser.h:746
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define MIIM_TYPE
Definition: winuser.h:725
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS _In_ PHYSICAL_ADDRESS SkipBytes
Definition: mmfuncs.h:227
#define IID_PPV_ARG(Itype, ppType)
static char * encoding
Definition: xmllint.c:155
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