ReactOS  0.4.14-dev-583-g2a1ba2c
CNewMenu.cpp
Go to the documentation of this file.
1 /*
2  * provides new shell item service
3  *
4  * Copyright 2007 Johannes Anderwald (johannes.anderwald@reactos.org)
5  * Copyright 2009 Andrew Hill
6  * Copyright 2012 Rafal Harabien
7  * Copyright 2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 #include "precomp.h"
25 
27 
29  m_pidlFolder(NULL),
30  m_pItems(NULL),
31  m_pLinkItem(NULL),
32  m_pSite(NULL),
33  m_idCmdFirst(0),
34  m_idCmdFolder(-1),
35  m_idCmdLink(-1),
36  m_hIconFolder(NULL),
37  m_hIconLink(NULL)
38 {
39 }
40 
42 {
44 
45  if (m_pidlFolder)
47 }
48 
50 {
51  /* Note: free allows NULL as argument */
52  free(pItem->pData);
53  free(pItem->pwszDesc);
54  free(pItem->pwszExt);
55 
56  if (pItem->hIcon)
57  DestroyIcon(pItem->hIcon);
58 
59  HeapFree(GetProcessHeap(), 0, pItem);
60 }
61 
63 {
64  SHELLNEW_ITEM *pCurItem;
65 
66  /* Unload the handler items, including the link item */
67  while (m_pItems)
68  {
69  pCurItem = m_pItems;
71  UnloadItem(pCurItem);
72  }
73  m_pItems = NULL;
74  m_pLinkItem = NULL;
75 }
76 
78 {
79  HKEY hKey;
80  WCHAR wszBuf[MAX_PATH];
81  PBYTE pData = NULL;
82  DWORD cbData;
83 
84  StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s\\ShellNew", pwszExt);
85 
86  TRACE("LoadItem Keyname %s Name %s\n", debugstr_w(pwszExt), debugstr_w(wszBuf));
87 
88  if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszBuf, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
89  {
90  TRACE("Failed to open key\n");
91  return NULL;
92  }
93 
94  /* Find first valid value */
95  struct
96  {
97  LPCWSTR pszName;
99  BOOL bNeedData;
100  BOOL bStr;
101  } Types[] = {
102  {L"FileName", SHELLNEW_TYPE_FILENAME, TRUE, TRUE},
103  {L"Command", SHELLNEW_TYPE_COMMAND, TRUE, TRUE},
104  {L"Data", SHELLNEW_TYPE_DATA, TRUE, FALSE},
105  {L"NullFile", SHELLNEW_TYPE_NULLFILE, FALSE},
106  {NULL}
107  };
108  UINT i;
109 
110  for (i = 0; Types[i].pszName; ++i)
111  {
112  /* Note: We are using ANSI function because strings can be treated as data */
113  cbData = 0;
115  DWORD dwType;
116  if (RegGetValueW(hKey, NULL, Types[i].pszName, dwFlags, NULL, NULL, &cbData) == ERROR_SUCCESS)
117  {
118  if (Types[i].bNeedData && cbData > 0)
119  {
120  pData = (PBYTE)malloc(cbData);
121  RegGetValueW(hKey, NULL, Types[i].pszName, dwFlags, &dwType, pData, &cbData);
122  if (!Types[i].bStr && (dwType == REG_SZ || dwType == REG_EXPAND_SZ))
123  {
124  PBYTE pData2 = (PBYTE)malloc(cbData);
125  cbData = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)pData, -1, (LPSTR)pData2, cbData, NULL, NULL);
126  free(pData);
127  pData = pData2;
128  }
129  }
130  break;
131  }
132  }
133  RegCloseKey(hKey);
134 
135  /* Was any key found? */
136  if (!Types[i].pszName)
137  {
138  free(pData);
139  return NULL;
140  }
141 
142  SHFILEINFOW fi;
144  {
145  free(pData);
146  return NULL;
147  }
148 
149  /* Create new item */
150  SHELLNEW_ITEM *pNewItem = static_cast<SHELLNEW_ITEM *>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(SHELLNEW_ITEM)));
151  if (!pNewItem)
152  {
153  free(pData);
154  return NULL;
155  }
156 
157  TRACE("new item %ls\n", fi.szTypeName);
158  pNewItem->Type = Types[i].Type;
159  pNewItem->pData = pData;
160  pNewItem->cbData = pData ? cbData : 0;
161  pNewItem->pwszExt = _wcsdup(pwszExt);
162  pNewItem->pwszDesc = _wcsdup(fi.szTypeName);
163  if (fi.hIcon)
164  pNewItem->hIcon = fi.hIcon;
165 
166  return pNewItem;
167 }
168 
169 BOOL
171 {
172  HKEY hKey;
173  DWORD dwSize = 0;
174  DWORD dwIndex = 0;
175  LPWSTR lpValue;
176  LPWSTR lpValues;
177  WCHAR wszName[MAX_PATH];
178  SHELLNEW_ITEM *pNewItem;
179  SHELLNEW_ITEM *pCurItem = NULL;
180 
181  /* Enumerate all extensions */
182  while (RegEnumKeyW(HKEY_CLASSES_ROOT, dwIndex++, wszName, _countof(wszName)) == ERROR_SUCCESS)
183  {
184  if (wszName[0] != L'.')
185  continue;
186 
187  pNewItem = LoadItem(wszName);
188  if (pNewItem)
189  {
190  dwSize += wcslen(wszName) + 1;
191  if (!m_pLinkItem && wcsicmp(pNewItem->pwszExt, L".lnk") == 0)
192  {
193  /* The unique link handler */
194  m_pLinkItem = pNewItem;
195  }
196 
197  /* Add at the end of the list */
198  if (pCurItem)
199  {
200  pCurItem->pNext = pNewItem;
201  pCurItem = pNewItem;
202  }
203  else
204  {
205  pCurItem = m_pItems = pNewItem;
206  }
207  }
208  }
209 
210  dwSize++;
211 
212  lpValues = (LPWSTR) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize * sizeof(WCHAR));
213  if (!lpValues)
214  return FALSE;
215 
216  for (pCurItem = m_pItems, lpValue = lpValues; pCurItem; pCurItem = pCurItem->pNext)
217  {
218  memcpy(lpValue, pCurItem->pwszExt, (wcslen(pCurItem->pwszExt) + 1) * sizeof(WCHAR));
219  lpValue += wcslen(pCurItem->pwszExt) + 1;
220  }
221 
223  {
224  HeapFree(GetProcessHeap(), 0, lpValues);
225  return FALSE;
226  }
227 
228  if (RegSetValueExW(hKey, L"Classes", NULL, REG_MULTI_SZ, (LPBYTE)lpValues, dwSize * sizeof(WCHAR)) != ERROR_SUCCESS)
229  {
230  HeapFree(GetProcessHeap(), 0, lpValues);
231  RegCloseKey(hKey);
232  return FALSE;
233  }
234 
235  HeapFree(GetProcessHeap(), 0, lpValues);
236  RegCloseKey(hKey);
237 
238  return TRUE;
239 }
240 
241 BOOL
243 {
244  LPWSTR wszName;
245  LPWSTR lpValues;
246  DWORD dwSize;
247  HKEY hKey;
248  SHELLNEW_ITEM *pNewItem;
249  SHELLNEW_ITEM *pCurItem = NULL;
250 
252  return FALSE;
253 
254  if (RegQueryValueExW(hKey, L"Classes", NULL, NULL, NULL, &dwSize) != ERROR_SUCCESS)
255  return FALSE;
256 
257  lpValues = (LPWSTR) HeapAlloc(GetProcessHeap(), 0, dwSize);
258  if (!lpValues)
259  return FALSE;
260 
261  if (RegQueryValueExW(hKey, L"Classes", NULL, NULL, (LPBYTE)lpValues, &dwSize) != ERROR_SUCCESS)
262  {
263  HeapFree(GetProcessHeap(), 0, lpValues);
264  return FALSE;
265  }
266 
267  wszName = lpValues;
268 
269  for (; *wszName != '\0'; wszName += wcslen(wszName) + 1)
270  {
271  pNewItem = LoadItem(wszName);
272  if (pNewItem)
273  {
274  if (!m_pLinkItem && wcsicmp(pNewItem->pwszExt, L".lnk") == 0)
275  {
276  /* The unique link handler */
277  m_pLinkItem = pNewItem;
278  }
279 
280  /* Add at the end of the list */
281  if (pCurItem)
282  {
283  pCurItem->pNext = pNewItem;
284  pCurItem = pNewItem;
285  }
286  else
287  {
288  pCurItem = m_pItems = pNewItem;
289  }
290  }
291  }
292 
293  HeapFree(GetProcessHeap(), 0, lpValues);
294  RegCloseKey(hKey);
295 
296  return TRUE;
297 }
298 
299 BOOL
301 {
302  // TODO: We need to find a way to refresh the cache from time to time, when
303  // e.g. new extensions with ShellNew handlers have been added or removed.
304 
305  /* If there are any unload them */
306  UnloadAllItems();
307 
308  if (!LoadCachedItems())
309  {
310  CacheItems();
311  }
312 
313  return (m_pItems != NULL);
314 }
315 
316 UINT
318 {
319  MENUITEMINFOW mii;
320  UINT idCmd = idCmdFirst;
321  WCHAR wszBuf[256];
322 
323  if (m_pItems == NULL)
324  {
325  if (!LoadAllItems())
326  return 0;
327  }
328 
329  ZeroMemory(&mii, sizeof(mii));
330  mii.cbSize = sizeof(mii);
331 
332  m_idCmdFirst = idCmd;
333 
334  /* Insert the new folder action */
336  wszBuf[0] = 0;
338  mii.dwTypeData = wszBuf;
339  mii.cch = wcslen(mii.dwTypeData);
340  mii.wID = idCmd;
341  mii.hbmpItem = HBMMENU_CALLBACK;
342  if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii))
343  m_idCmdFolder = idCmd++;
344 
345  /* Insert the new shortcut action */
346  if (m_pLinkItem)
347  {
349  wszBuf[0] = 0;
350  mii.dwTypeData = wszBuf;
351  mii.cch = wcslen(mii.dwTypeData);
352  mii.wID = idCmd;
353  if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii))
354  m_idCmdLink = idCmd++;
355  }
356 
357  /* Insert a seperator for the custom new action */
358  mii.fMask = MIIM_TYPE | MIIM_ID;
359  mii.fType = MFT_SEPARATOR;
360  mii.wID = -1;
361  InsertMenuItemW(hMenu, Pos++, TRUE, &mii);
362 
363  /* Insert the rest of the items */
365  mii.fType = 0;
366 
367  for (SHELLNEW_ITEM *pCurItem = m_pItems; pCurItem; pCurItem = pCurItem->pNext)
368  {
369  /* Skip shortcut item */
370  if (pCurItem == m_pLinkItem)
371  continue;
372 
373  TRACE("szDesc %s\n", debugstr_w(pCurItem->pwszDesc));
374  mii.dwItemData = (ULONG_PTR)pCurItem;
375  mii.dwTypeData = pCurItem->pwszDesc;
376  mii.cch = wcslen(mii.dwTypeData);
377  mii.wID = idCmd;
378  if (InsertMenuItemW(hMenu, Pos++, TRUE, &mii))
379  ++idCmd;
380  }
381 
382  return idCmd - idCmdFirst;
383 }
384 
386 {
387  /* Folder */
388  if (m_idCmdFirst + IdOffset == m_idCmdFolder)
389  return NULL;
390 
391  /* Shortcut */
392  if (m_idCmdFirst + IdOffset == m_idCmdLink)
393  return m_pLinkItem;
394 
395  /* Find shell new item - Retrieve menu item info */
396  MENUITEMINFOW mii;
397  ZeroMemory(&mii, sizeof(mii));
398  mii.cbSize = sizeof(mii);
399  mii.fMask = MIIM_DATA;
400 
401  if (GetMenuItemInfoW(m_hSubMenu, m_idCmdFirst + IdOffset, FALSE, &mii) && mii.dwItemData)
402  return (SHELLNEW_ITEM *)mii.dwItemData;
403  else
404  return NULL;
405 }
406 
408 {
410  CComPtr<IShellView> lpSV;
411  HRESULT hr = E_FAIL;
412  LPITEMIDLIST pidl;
413  PITEMID_CHILD pidlNewItem;
414  DWORD dwSelectFlags;
415 
416  dwSelectFlags = SVSI_DESELECTOTHERS | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
417  if (bRename)
418  dwSelectFlags |= SVSI_EDIT;
419 
420  /* Notify the view object about the new item */
421  SHChangeNotify(wEventId, uFlags, (LPCVOID) pszName, NULL);
422 
423  if (!m_pSite)
424  return S_OK;
425 
426  /* Get a pointer to the shell view */
428  if (FAILED_UNEXPECTEDLY(hr))
429  return S_OK;
430 
431  /* Attempt to get the pidl of the new item */
432  hr = SHILCreateFromPathW(pszName, &pidl, NULL);
433  if (FAILED_UNEXPECTEDLY(hr))
434  return hr;
435 
436  pidlNewItem = ILFindLastID(pidl);
437 
438  hr = lpSV->SelectItem(pidlNewItem, dwSelectFlags);
439 
440  SHFree(pidl);
441 
442  return hr;
443 }
444 
445 // Code is duplicated in CDefaultContextMenu
447 {
448  WCHAR wszPath[MAX_PATH];
449  WCHAR wszName[MAX_PATH];
450  WCHAR wszNewFolder[25];
451  HRESULT hr;
452 
453  /* Get folder path */
455  if (FAILED_UNEXPECTEDLY(hr))
456  return hr;
457 
458  if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
459  return E_FAIL;
460 
461  /* Create the name of the new directory */
462  if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFolder))
463  return E_FAIL;
464 
465  /* Create the new directory and show the appropriate dialog in case of error */
466  if (SHCreateDirectory(lpici->hwnd, wszName) != ERROR_SUCCESS)
467  return E_FAIL;
468 
469  /* Show and select the new item in the def view */
471 
472  return S_OK;
473 }
474 
476 {
477  WCHAR wszBuf[MAX_PATH];
478  LPWSTR Ptr, pwszCmd;
479  WCHAR wszTemp[MAX_PATH];
480  STARTUPINFOW si;
482 
483  if (!ExpandEnvironmentStringsW((LPWSTR)pItem->pData, wszBuf, _countof(wszBuf)))
484  {
485  TRACE("ExpandEnvironmentStrings failed\n");
486  return E_FAIL;
487  }
488 
489  /* Expand command parameter, FIXME: there can be more modifiers */
490  Ptr = wcsstr(wszBuf, L"%1");
491  if (Ptr)
492  {
493  Ptr[1] = L's';
494  StringCbPrintfW(wszTemp, sizeof(wszTemp), wszBuf, wszPath);
495  pwszCmd = wszTemp;
496  }
497  else
498  {
499  pwszCmd = wszBuf;
500  }
501 
502  /* Create process */
503  ZeroMemory(&si, sizeof(si));
504  si.cb = sizeof(si);
505  if (CreateProcessW(NULL, pwszCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
506  {
507  CloseHandle(pi.hProcess);
508  CloseHandle(pi.hThread);
509  return S_OK;
510  }
511  else
512  {
513  ERR("Failed to create process\n");
514  return E_FAIL;
515  }
516 }
517 
519  DWORD cchNameMax, LPCWSTR wszPath)
520 {
521  WCHAR wszBuf[MAX_PATH];
522  WCHAR wszNewFile[MAX_PATH];
523  BOOL bSuccess = TRUE;
524 
525  if (!LoadStringW(shell32_hInstance, FCIDM_SHVIEW_NEW, wszBuf, _countof(wszBuf)))
526  return E_FAIL;
527 
528  StringCchPrintfW(wszNewFile, _countof(wszNewFile), L"%s %s%s", wszBuf, pItem->pwszDesc, pItem->pwszExt);
529 
530  /* Create the name of the new file */
531  if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFile))
532  return E_FAIL;
533 
534  /* Create new file */
537  {
538  if (pItem->Type == SHELLNEW_TYPE_DATA)
539  {
540  /* Write a content */
541  DWORD cbWritten;
542  WriteFile(hFile, pItem->pData, pItem->cbData, &cbWritten, NULL);
543  }
544 
545  /* Close file now */
547  }
548  else
549  {
550  bSuccess = FALSE;
551  }
552 
553  if (pItem->Type == SHELLNEW_TYPE_FILENAME)
554  {
555  /* Copy file */
556  if (!CopyFileW((LPWSTR)pItem->pData, wszName, FALSE))
557  ERR("Copy file failed: %ls\n", (LPWSTR)pItem->pData);
558  }
559 
560  /* Show message if we failed */
561  if (bSuccess)
562  {
563  TRACE("Notifying fs %s\n", debugstr_w(wszName));
564  SelectNewItem(SHCNE_CREATE, SHCNF_PATHW, wszName, pItem != m_pLinkItem);
565  }
566  else
567  {
568  StringCbPrintfW(wszBuf, sizeof(wszBuf), L"Cannot create file: %s", wszName);
569  MessageBoxW(NULL, wszBuf, L"Cannot create file", MB_OK | MB_ICONERROR); // FIXME load localized error msg
570  }
571 
572  return S_OK;
573 }
574 
576 {
577  HRESULT hr;
578  WCHAR wszPath[MAX_PATH], wszName[MAX_PATH];
579 
580  /* Get folder path */
582  if (FAILED_UNEXPECTEDLY(hr))
583  return hr;
584 
585  if (pItem == m_pLinkItem)
586  {
587  NewItemByNonCommand(pItem, wszName, _countof(wszName), wszPath);
588  NewItemByCommand(pItem, wszName);
589  return S_OK;
590  }
591 
592  switch (pItem->Type)
593  {
595  NewItemByCommand(pItem, wszPath);
596  break;
597 
598  case SHELLNEW_TYPE_DATA:
601  NewItemByNonCommand(pItem, wszName, _countof(wszName), wszPath);
602  break;
603 
605  ERR("Invalid type\n");
606  break;
607  }
608 
609  return S_OK;
610 }
611 
613 {
614  m_pSite = pUnkSite;
615  return S_OK;
616 }
617 
619 {
620  return m_pSite->QueryInterface(riid, ppvSite);
621 }
622 
623 HRESULT
624 WINAPI
626  UINT indexMenu,
627  UINT idCmdFirst,
628  UINT idCmdLast,
629  UINT uFlags)
630 {
631  MENUITEMINFOW mii;
632  UINT cItems = 0;
633  WCHAR wszNew[200];
634 
635  TRACE("%p %p %u %u %u %u\n", this,
636  hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
637 
638  if (!LoadStringW(shell32_hInstance, FCIDM_SHVIEW_NEW, wszNew, _countof(wszNew)))
639  return E_FAIL;
640 
642  if (!m_hSubMenu)
643  return E_FAIL;
644 
645  cItems = InsertShellNewItems(m_hSubMenu, idCmdFirst, 0);
646 
647  ZeroMemory(&mii, sizeof(mii));
648  mii.cbSize = sizeof(mii);
650  mii.fType = MFT_STRING;
651  mii.wID = -1;
652  mii.dwTypeData = wszNew;
653  mii.cch = wcslen(mii.dwTypeData);
654  mii.fState = MFS_ENABLED;
655  mii.hSubMenu = m_hSubMenu;
656 
657  if (!InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
658  return E_FAIL;
659 
660  return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cItems);
661 }
662 
663 HRESULT
664 WINAPI
666 {
667  HRESULT hr = E_FAIL;
668 
669  if (m_idCmdFirst + LOWORD(lpici->lpVerb) == m_idCmdFolder)
670  {
671  hr = CreateNewFolder(lpici);
672  }
673  else
674  {
676  if (pItem)
677  hr = CreateNewItem(pItem, lpici);
678  }
679 
680  TRACE("CNewMenu::InvokeCommand %x\n", hr);
681  return hr;
682 }
683 
684 HRESULT
685 WINAPI
687  UINT uType,
688  UINT *pwReserved,
689  LPSTR pszName,
690  UINT cchMax)
691 {
692  FIXME("%p %lu %u %p %p %u\n", this,
693  idCmd, uType, pwReserved, pszName, cchMax );
694 
695  return E_NOTIMPL;
696 }
697 
698 HRESULT
699 WINAPI
701 {
702  return S_OK;
703 }
704 
705 HRESULT
706 WINAPI
708 {
709  switch (uMsg)
710  {
711  case WM_MEASUREITEM:
712  {
713  MEASUREITEMSTRUCT* lpmis = reinterpret_cast<MEASUREITEMSTRUCT*>(lParam);
714  if (!lpmis || lpmis->CtlType != ODT_MENU)
715  break;
716 
719  if (lpmis->itemHeight < 16)
720  lpmis->itemHeight = 16;
721 
722  if (plResult)
723  *plResult = TRUE;
724  break;
725  }
726  case WM_DRAWITEM:
727  {
728  DRAWITEMSTRUCT* lpdis = reinterpret_cast<DRAWITEMSTRUCT*>(lParam);
729  if (!lpdis || lpdis->CtlType != ODT_MENU)
730  break;
731 
732  DWORD id = LOWORD(lpdis->itemID);
733  HICON hIcon = NULL;
734  if (m_idCmdFirst + id == m_idCmdFolder)
735  {
737  }
738  else if (m_idCmdFirst + id == m_idCmdLink)
739  {
740  hIcon = m_hIconLink;
741  }
742  else
743  {
744  SHELLNEW_ITEM *pItem = FindItemFromIdOffset(id);
745  if (pItem)
746  hIcon = pItem->hIcon;
747  }
748 
749  if (!hIcon)
750  break;
751 
752  DrawIconEx(lpdis->hDC,
753  2,
754  lpdis->rcItem.top + (lpdis->rcItem.bottom - lpdis->rcItem.top - 16) / 2,
755  hIcon,
756  16,
757  16,
758  0, NULL, DI_NORMAL);
759 
760  if(plResult)
761  *plResult = TRUE;
762  }
763  }
764 
765  return S_OK;
766 }
767 
770  IDataObject *pdtobj, HKEY hkeyProgID)
771 {
772  m_pidlFolder = ILClone(pidlFolder);
773 
774  /* Load folder and shortcut icons */
777  return S_OK;
778 }
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1965
#define SHCNE_MKDIR
Definition: shlobj.h:1723
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
#define MAKEINTRESOURCE
Definition: winuser.h:591
HMENU WINAPI CreateMenu(void)
Definition: menu.c:837
static HICON
Definition: imagelist.c:84
#define IDS_NEWFOLDER
#define MFT_STRING
Definition: winuser.h:741
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
#define CloseHandle
Definition: compat.h:406
#define LR_SHARED
Definition: winuser.h:1090
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:925
#define IMAGE_ICON
Definition: winuser.h:212
~CNewMenu()
Definition: CNewMenu.cpp:41
UINT m_idCmdLink
Definition: CNewMenu.h:61
#define SHGFI_TYPENAME
Definition: shellapi.h:165
Type
Definition: Type.h:6
#define ERROR_SUCCESS
Definition: deptool.c:10
#define WideCharToMultiByte
Definition: compat.h:101
virtual HRESULT STDMETHODCALLTYPE Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID)
Definition: CNewMenu.cpp:769
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022
#define KEY_READ
Definition: nt_native.h:1023
_CONST_RETURN wchar_t *__cdecl wcsstr(_In_z_ const wchar_t *_Str, _In_z_ const wchar_t *_SubStr)
REFIID riid
Definition: precomp.h:44
#define CP_ACP
Definition: compat.h:99
#define _countof(array)
Definition: fontsub.cpp:30
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define free
Definition: debug_ros.c:5
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
HICON m_hIconLink
Definition: CNewMenu.h:62
#define ODT_MENU
Definition: winuser.h:2512
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1280
ush Pos
Definition: deflate.h:92
#define SM_CXMENUCHECK
Definition: winuser.h:1021
LONG top
Definition: windef.h:307
SHELLNEW_TYPE
Definition: CNewMenu.h:36
#define INVALID_HANDLE_VALUE
Definition: compat.h:399
#define RRF_RT_REG_SZ
Definition: driver.c:575
#define ZeroMemory
Definition: winbase.h:1642
UINT m_idCmdFolder
Definition: CNewMenu.h:61
LPWSTR dwTypeData
Definition: winuser.h:3244
UINT_PTR WPARAM
Definition: windef.h:207
#define FCIDM_SHVIEW_NEWLINK
Definition: shresdef.h:768
UINT uFlags
Definition: api.c:59
char * LPSTR
Definition: xmlstorage.h:182
#define SID_IFolderView
WCHAR szTypeName[80]
Definition: shellapi.h:374
#define IID_PPV_ARG(Itype, ppType)
#define E_FAIL
Definition: ddrawi.h:102
#define SHGFI_SMALLICON
Definition: shellapi.h:174
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
static BOOLEAN bSuccess
Definition: drive.cpp:419
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1448
WPARAM wParam
Definition: combotst.c:138
#define MIIM_BITMAP
Definition: winuser.h:723
#define SEVERITY_SUCCESS
Definition: winerror.h:64
HRESULT NewItemByCommand(SHELLNEW_ITEM *pItem, LPCWSTR wszPath)
Definition: CNewMenu.cpp:475
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
SHELLNEW_ITEM * LoadItem(LPCWSTR pwszExt)
Definition: CNewMenu.cpp:77
LPITEMIDLIST m_pidlFolder
Definition: CNewMenu.h:56
#define MIIM_SUBMENU
Definition: winuser.h:718
LONG WINAPI RegCloseKey(HKEY hKey)
Definition: reg.c:423
BOOL LoadCachedItems()
Definition: CNewMenu.cpp:242
unsigned char * LPBYTE
Definition: typedefs.h:52
#define MFS_ENABLED
Definition: winuser.h:745
SHELLNEW_ITEM * m_pItems
Definition: CNewMenu.h:57
HINSTANCE shell32_hInstance
Definition: misc.cpp:82
#define MIIM_STATE
Definition: winuser.h:716
unsigned int BOOL
Definition: ntddk_ex.h:94
CNewMenu()
Definition: CNewMenu.cpp:28
long LONG
Definition: pedump.c:60
#define REG_MULTI_SZ
Definition: nt_native.h:1501
#define GENERIC_WRITE
Definition: nt_native.h:90
virtual HRESULT WINAPI InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
Definition: CNewMenu.cpp:665
#define debugstr_w
Definition: kernel32.h:32
#define FIXME(fmt,...)
Definition: debug.h:110
SHELLNEW_ITEM * m_pLinkItem
Definition: CNewMenu.h:58
smooth NULL
Definition: ftsmooth.c:416
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
LONG_PTR LPARAM
Definition: windef.h:208
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:189
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
virtual HRESULT WINAPI GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen)
Definition: CNewMenu.cpp:686
#define FCIDM_SHVIEW_NEWFOLDER
Definition: shresdef.h:769
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessW(LPCWSTR lpApplicationName, LPWSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory, LPSTARTUPINFOW lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation)
Definition: proc.c:4593
#define MIIM_ID
Definition: winuser.h:717
#define IDI_SHELL_SHORTCUT
Definition: shresdef.h:505
const WCHAR ShellNewKey[]
Definition: CNewMenu.h:26
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define HBMMENU_CALLBACK
Definition: winuser.h:2605
#define KEY_WRITE
Definition: nt_native.h:1031
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:4895
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
#define FCIDM_SHVIEW_NEW
Definition: shresdef.h:130
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:403
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
DWORD cb
Definition: winbase.h:824
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4116
HICON m_hIconFolder
Definition: CNewMenu.h:62
int WINAPI MessageBoxW(_In_opt_ HWND, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ UINT)
__wchar_t WCHAR
Definition: xmlstorage.h:180
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:410
BOOL WINAPI DrawIconEx(_In_ HDC, _In_ int, _In_ int, _In_ HICON, _In_ int, _In_ int, _In_ UINT, _In_opt_ HBRUSH, _In_ UINT)
Definition: cursoricon.c:1997
static refpint_t pi[]
Definition: server.c:96
LONG HRESULT
Definition: typedefs.h:77
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:439
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
#define MAX_PATH
Definition: compat.h:26
#define WINAPI
Definition: msvc.h:6
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
int WINAPI GetSystemMetrics(_In_ int)
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT NewItemByNonCommand(SHELLNEW_ITEM *pItem, LPWSTR wszName, DWORD cchNameMax, LPCWSTR wszPath)
Definition: CNewMenu.cpp:518
UINT m_idCmdFirst
Definition: CNewMenu.h:61
#define WM_MEASUREITEM
Definition: winuser.h:1628
HRESULT CreateNewItem(SHELLNEW_ITEM *pItem, LPCMINVOKECOMMANDINFO lpcmi)
Definition: CNewMenu.cpp:575
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
#define SHGFI_USEFILEATTRIBUTES
Definition: shellapi.h:179
UINT cchMax
#define MFT_SEPARATOR
Definition: winuser.h:739
SHELLNEW_ITEM * FindItemFromIdOffset(UINT IdOffset)
Definition: CNewMenu.cpp:385
WINE_DEFAULT_DEBUG_CHANNEL(shell)
#define IDI_SHELL_FOLDER
Definition: shresdef.h:479
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:126
static const WCHAR L[]
Definition: oid.c:1250
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
#define MIIM_TYPE
Definition: winuser.h:720
#define MB_ICONERROR
Definition: winuser.h:781
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define DI_NORMAL
Definition: wingdi.h:72
void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
Definition: changenotify.c:340
_In_ HANDLE hFile
Definition: mswsock.h:90
HICON hIcon
Definition: shellapi.h:370
BOOL CacheItems()
Definition: CNewMenu.cpp:170
#define wcsicmp
Definition: string.h:1152
#define SHCNF_PATHW
Definition: shlobj.h:1755
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2416
virtual HRESULT WINAPI HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CNewMenu.cpp:700
#define ERR(fmt,...)
Definition: debug.h:109
int WINAPI SHCreateDirectory(HWND hWnd, LPCWSTR path)
Definition: shlfileop.cpp:788
#define MIIM_STRING
Definition: winuser.h:722
#define S_OK
Definition: intsafe.h:59
void UnloadAllItems()
Definition: CNewMenu.cpp:62
char ACPI_OBJECT_TYPE * Types
Definition: acdebug.h:347
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
HICON hIcon
Definition: msconfig.c:44
SHELLNEW_ITEM * pNext
Definition: CNewMenu.h:53
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
#define REG_EXPAND_SZ
Definition: nt_native.h:1494
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
#define E_NOTIMPL
Definition: ddrawi.h:99
virtual HRESULT WINAPI QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
Definition: CNewMenu.cpp:625
HRESULT CreateNewFolder(LPCMINVOKECOMMANDINFO lpici)
Definition: CNewMenu.cpp:446
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
unsigned int UINT
Definition: ndis.h:50
#define MB_OK
Definition: winuser.h:784
BOOL LoadAllItems()
Definition: CNewMenu.cpp:300
DWORD WINAPI ExpandEnvironmentStringsW(IN LPCWSTR lpSrc, IN LPWSTR lpDst, IN DWORD nSize)
Definition: environ.c:519
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST *ppidl, DWORD *attributes)
Definition: pidl.c:392
virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite)
Definition: CNewMenu.cpp:618
#define CreateFileW
Definition: compat.h:408
#define WM_DRAWITEM
Definition: winuser.h:1627
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:331
CONST void * LPCVOID
Definition: windef.h:191
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3366
CComPtr< IUnknown > m_pSite
Definition: CNewMenu.h:59
HMENU m_hSubMenu
Definition: CNewMenu.h:60
LONG bottom
Definition: windef.h:309
#define ULONG_PTR
Definition: config.h:101
void UnloadItem(SHELLNEW_ITEM *pItem)
Definition: CNewMenu.cpp:49
#define malloc
Definition: debug_ros.c:4
#define LoadImage
Definition: winuser.h:5790
#define CREATE_NEW
Definition: disk.h:69
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
Definition: shellpath.c:320
virtual HRESULT WINAPI HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult)
Definition: CNewMenu.cpp:707
#define RRF_RT_ANY
Definition: winreg.h:64
#define SHCNE_CREATE
Definition: shlobj.h:1721
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define MIIM_DATA
Definition: winuser.h:721
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1827
LONG_PTR LRESULT
Definition: windef.h:209
_Check_return_ _CRTIMP wchar_t *__cdecl _wcsdup(_In_z_ const wchar_t *_Str)
#define SHGFI_ICON
Definition: shellapi.h:162
virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite)
Definition: CNewMenu.cpp:612
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
ULONG_PTR dwItemData
Definition: winuser.h:3243
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
BYTE * PBYTE
Definition: pedump.c:66
LPARAM lParam
Definition: combotst.c:139
#define LOWORD(l)
Definition: pedump.c:82
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
Definition: compat.h:402
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
#define RegCreateKeyEx
Definition: winreg.h:501
UINT InsertShellNewItems(HMENU hMenu, UINT idFirst, UINT idMenu)
Definition: CNewMenu.cpp:317
SHELLNEW_TYPE Type
Definition: CNewMenu.h:47
HRESULT SelectNewItem(LONG wEventId, UINT uFlags, LPWSTR pszName, BOOL bRename)
Definition: CNewMenu.cpp:407
#define REG_SZ
Definition: layer.c:22