xref: /reactos/sdk/include/reactos/undocshell.h (revision 53e930e9)
1 /*
2  * Copyright 1999, 2000 Juergen Schmied
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #ifndef __WINE_UNDOCSHELL_H
20 #define __WINE_UNDOCSHELL_H
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif /* defined(__cplusplus) */
25 
26 #if (NTDDI_VERSION < NTDDI_LONGHORN)
27 #define DBIMF_NOGRIPPER         0x0800
28 #define DBIMF_ALWAYSGRIPPER     0x1000
29 #define DBIMF_NOMARGINS         0x2000
30 #endif  // NTDDI_LONGHORN
31 
32 #if defined (_SHELLAPI_H) || defined (_INC_SHELLAPI)
33 
34 /****************************************************************************
35  * Taskbar interface WM_COPYDATA structures
36  * See http://www.geoffchappell.com/studies/windows/shell/shell32/api/shlnot/copydata.htm
37  */
38 /* Data structure for Shell_NotifyIcon messages */
39 typedef struct _TRAYNOTIFYDATAW
40 {
41     DWORD dwSignature;
42     DWORD dwMessage;
43     NOTIFYICONDATAW nid; // Always use the latest NOTIFYICONDATAW structure version.
44 } TRAYNOTIFYDATAW, *PTRAYNOTIFYDATAW;
45 // Note: One could also introduce TRAYNOTIFYDATAA
46 
47 #define NI_NOTIFY_SIG 0x34753423 /* TRAYNOTIFYDATA */
48 
49 #endif /* defined (_SHELLAPI_H) || defined (_INC_SHELLAPI) */
50 
51 /****************************************************************************
52  * Taskbar WM_COMMAND identifiers
53  */
54 #define TWM_DOEXITWINDOWS (WM_USER + 342)
55 #define TWM_CYCLEFOCUS (WM_USER + 348)
56 
57 /****************************************************************************
58  * ProgMan messages
59  */
60 #define WM_PROGMAN_OPENSHELLSETTINGS (WM_USER + 22) /* wParam specifies the dialog (and tab page) */
61 #define WM_PROGMAN_SAVESTATE         (WM_USER + 77)
62 
63 /****************************************************************************
64  *  IDList Functions
65  */
66 BOOL WINAPI ILGetDisplayName(
67     LPCITEMIDLIST pidl,
68     LPVOID path);
69 
70 /* type parameter for ILGetDisplayNameEx() */
71 #define ILGDN_FORPARSING  0
72 #define ILGDN_NORMAL      1
73 #define ILGDN_INFOLDER    2
74 
75 BOOL WINAPI ILGetDisplayNameEx(
76     LPSHELLFOLDER psf,
77     LPCITEMIDLIST pidl,
78     LPVOID path,
79     DWORD type);
80 
81 LPITEMIDLIST WINAPI ILGlobalClone(LPCITEMIDLIST pidl);
82 void WINAPI ILGlobalFree(LPITEMIDLIST pidl);
83 LPITEMIDLIST WINAPI SHSimpleIDListFromPathA (LPCSTR lpszPath); //FIXME
84 LPITEMIDLIST WINAPI SHSimpleIDListFromPathW (LPCWSTR lpszPath);
85 
86 HRESULT WINAPI SHILCreateFromPathA (
87     LPCSTR path,
88     LPITEMIDLIST * ppidl,
89     DWORD *attributes);
90 
91 HRESULT WINAPI SHILCreateFromPathW (
92     LPCWSTR path,
93     LPITEMIDLIST * ppidl,
94     DWORD *attributes);
95 
96 HRESULT WINAPI SHInvokeCommand(
97     HWND hWnd,
98     IShellFolder* lpFolder,
99     LPCITEMIDLIST lpApidl,
100     LPCSTR lpVerb);
101 HRESULT WINAPI SHInvokeCommandOnContextMenu(
102     _In_opt_ HWND hWnd,
103     _In_opt_ IUnknown* pUnk,
104     _In_ IContextMenu* pCM,
105     _In_ UINT fCMIC,
106     _In_opt_ LPCSTR pszVerb);
107 BOOL WINAPI IContextMenu_Invoke(
108     _In_ IContextMenu *pContextMenu,
109     _In_ HWND hwnd,
110     _In_ LPCSTR lpVerb,
111     _In_ UINT uFlags);
112 
113 /*
114     string functions
115 */
116 BOOL WINAPI StrRetToStrNA(LPSTR,DWORD,LPSTRRET,const ITEMIDLIST*);
117 BOOL WINAPI StrRetToStrNW(LPWSTR,DWORD,LPSTRRET,const ITEMIDLIST*);
118 
119 /****************************************************************************
120  * SHChangeNotifyRegister API
121  */
122 #define SHCNRF_InterruptLevel       0x0001
123 #define SHCNRF_ShellLevel           0x0002
124 #define SHCNRF_RecursiveInterrupt   0x1000  /* Must be combined with SHCNRF_InterruptLevel */
125 #define SHCNRF_NewDelivery          0x8000  /* Messages use shared memory */
126 
127 /****************************************************************************
128  * SHChangeNotify
129  */
130 
131 typedef struct _SHCNF_PRINTJOB_INFO
132 {
133     DWORD JobId;
134     // More info,,,
135 } SHCNF_PRINTJOB_INFO, *PSHCNF_PRINTJOB_INFO;
136 
137 //
138 // Add missing types for print job notifications.
139 //
140 #define SHCNF_PRINTJOBA 0x0004
141 #define SHCNF_PRINTJOBW 0x0007
142 
143 HRESULT WINAPI SHUpdateRecycleBinIcon(void);
144 
145 /****************************************************************************
146  * Shell Common Dialogs
147  */
148 
149 /* RunFileDlg flags */
150 #define RFF_NOBROWSE        0x01    /* Removes the browse button */
151 #define RFF_NODEFAULT       0x02    /* No default item selected */
152 #define RFF_CALCDIRECTORY   0x04    /* Calculates the working directory from the file name */
153 #define RFF_NOLABEL         0x08    /* Removes the edit box label */
154 #define RFF_NOSEPARATEMEM   0x20    /* Removes the Separate Memory Space check box (Windows NT only) */
155 
156 /* RunFileFlg notification value and structure */
157 #define RFN_VALIDATE    (-510)
158 #if 0 // Deprecated ANSI structure
159 typedef struct _NMRUNFILEDLGA
160 {
161     NMHDR   hdr;
162     LPCSTR  lpFile;
163     LPCSTR  lpDirectory;
164     UINT    nShow;
165 } NMRUNFILEDLGA, *PNMRUNFILEDLGA, *LPNMRUNFILEDLGA;
166 #endif
167 typedef struct _NMRUNFILEDLGW
168 {
169     NMHDR   hdr;
170     LPCWSTR lpFile;
171     LPCWSTR lpDirectory;
172     UINT    nShow;
173 } NMRUNFILEDLGW, *PNMRUNFILEDLGW, *LPNMRUNFILEDLGW;
174 
175 typedef NMRUNFILEDLGW NMRUNFILEDLG;
176 typedef PNMRUNFILEDLGW PNMRUNFILEDLG;
177 typedef LPNMRUNFILEDLGW LPNMRUNFILEDLG;
178 
179 /* RunFileDlg notification return values */
180 #define RF_OK      0x00
181 #define RF_CANCEL  0x01
182 #define RF_RETRY   0x02
183 
184 void WINAPI RunFileDlg(
185     HWND hWndOwner,
186     HICON hIcon,
187     LPCWSTR lpstrDirectory,
188     LPCWSTR lpstrTitle,
189     LPCWSTR lpstrDescription,
190     UINT uFlags);
191 
192 int WINAPI LogoffWindowsDialog(HWND hWndOwner);
193 void WINAPI ExitWindowsDialog(HWND hWndOwner);
194 
195 BOOL WINAPI SHFindComputer(
196     LPCITEMIDLIST pidlRoot,
197     LPCITEMIDLIST pidlSavedSearch);
198 
199 void WINAPI SHHandleDiskFull(HWND hwndOwner,
200     UINT uDrive);
201 
202 int  WINAPI SHOutOfMemoryMessageBox(
203     HWND hwndOwner,
204     LPCSTR lpCaption,
205     UINT uType);
206 
207 DWORD WINAPI SHNetConnectionDialog(
208     HWND hwndOwner,
209     LPCWSTR lpstrRemoteName,
210     DWORD dwType);
211 
212 BOOL WINAPI SHIsTempDisplayMode(VOID);
213 
214 /****************************************************************************
215  * Cabinet Window Messages
216  */
217 
218 #define CWM_SETPATH           (WM_USER + 2)
219 #define CWM_WANTIDLE          (WM_USER + 3)
220 #define CWM_GETSETCURRENTINFO (WM_USER + 4)
221 #define CWM_SELECTITEM        (WM_USER + 5)
222 #define CWM_SELECTITEMSTR     (WM_USER + 6)
223 #define CWM_GETISHELLBROWSER  (WM_USER + 7)
224 #define CWM_TESTPATH          (WM_USER + 9)
225 #define CWM_STATECHANGE       (WM_USER + 10)
226 #define CWM_GETPATH           (WM_USER + 12)
227 
228 #define WM_GETISHELLBROWSER CWM_GETISHELLBROWSER
229 
230 /* CWM_TESTPATH types */
231 #define CWTP_ISEQUAL  0
232 #define CWTP_ISCHILD  1
233 
234 /* CWM_TESTPATH structure */
235 typedef struct
236 {
237     DWORD dwType;
238     ITEMIDLIST idl;
239 } CWTESTPATHSTRUCT,* LPCWTESTPATHSTRUCT;
240 
241 /****************************************************************************
242  * System Imagelist Routines
243  */
244 
245 int WINAPI Shell_GetCachedImageIndexA(
246     LPCSTR lpszFileName,
247     int nIconIndex,
248     UINT bSimulateDoc);
249 
250 BOOL WINAPI Shell_GetImageLists(
251     HIMAGELIST *lphimlLarge,
252     HIMAGELIST *lphimlSmall);
253 
254 HICON WINAPI SHGetFileIcon(
255     DWORD dwReserved,
256     LPCSTR lpszPath,
257     DWORD dwFileAttributes,
258     UINT uFlags);
259 
260 BOOL WINAPI FileIconInit(BOOL bFullInit);
261 
262 WORD WINAPI
263 ExtractIconResInfoA(
264     _In_ HANDLE hHandle,
265     _In_ LPCSTR lpFileName,
266     _In_ WORD wIndex,
267     _Out_ LPWORD lpSize,
268     _Out_ LPHANDLE lpIcon);
269 
270 WORD WINAPI
271 ExtractIconResInfoW(
272     _In_ HANDLE hHandle,
273     _In_ LPCWSTR lpFileName,
274     _In_ WORD wIndex,
275     _Out_ LPWORD lpSize,
276     _Out_ LPHANDLE lpIcon);
277 
278 /****************************************************************************
279  * File Menu Routines
280  */
281 
282 /* FileMenu_Create nSelHeight constants */
283 #define FM_DEFAULT_SELHEIGHT  -1
284 #define FM_FULL_SELHEIGHT     0
285 
286 /* FileMenu_Create flags */
287 #define FMF_SMALL_ICONS      0x00
288 #define FMF_LARGE_ICONS      0x08
289 #define FMF_NO_COLUMN_BREAK  0x10
290 
291 HMENU WINAPI FileMenu_Create(
292     COLORREF crBorderColor,
293     int nBorderWidth,
294     HBITMAP hBorderBmp,
295     int nSelHeight,
296     UINT uFlags);
297 
298 void WINAPI FileMenu_Destroy(HMENU hMenu);
299 
300 /* FileMenu_AppendItem constants */
301 #define FM_SEPARATOR       (LPCSTR)1
302 #define FM_BLANK_ICON      -1
303 #define FM_DEFAULT_HEIGHT  0
304 
305 BOOL WINAPI FileMenu_AppendItem(
306     HMENU hMenu,
307     LPCSTR lpszText,
308     UINT uID,
309     int iIcon,
310     HMENU hMenuPopup,
311     int nItemHeight);
312 
313 /* FileMenu_InsertUsingPidl flags */
314 #define FMF_NO_EMPTY_ITEM      0x01
315 #define FMF_NO_PROGRAM_GROUPS  0x04
316 
317 /* FileMenu_InsertUsingPidl callback function */
318 typedef void (CALLBACK *LPFNFMCALLBACK)(LPCITEMIDLIST pidlFolder, LPCITEMIDLIST pidlFile);
319 
320 int WINAPI FileMenu_InsertUsingPidl(
321     HMENU hMenu,
322     UINT uID,
323     LPCITEMIDLIST pidl,
324     UINT uFlags,
325     UINT uEnumFlags,
326     LPFNFMCALLBACK lpfnCallback);
327 
328 int WINAPI FileMenu_ReplaceUsingPidl(
329     HMENU hMenu,
330     UINT uID,
331     LPCITEMIDLIST pidl,
332     UINT uEnumFlags,
333     LPFNFMCALLBACK lpfnCallback);
334 
335 void WINAPI FileMenu_Invalidate(HMENU hMenu);
336 
337 HMENU WINAPI FileMenu_FindSubMenuByPidl(
338     HMENU hMenu,
339     LPCITEMIDLIST pidl);
340 
341 BOOL WINAPI FileMenu_TrackPopupMenuEx(
342     HMENU hMenu,
343     UINT uFlags,
344     int x,
345     int y,
346     HWND hWnd,
347     LPTPMPARAMS lptpm);
348 
349 BOOL WINAPI FileMenu_GetLastSelectedItemPidls(
350     UINT uReserved,
351     LPCITEMIDLIST *ppidlFolder,
352     LPCITEMIDLIST *ppidlItem);
353 
354 LRESULT WINAPI FileMenu_MeasureItem(
355     HWND hWnd,
356     LPMEASUREITEMSTRUCT lpmis);
357 
358 LRESULT WINAPI FileMenu_DrawItem(
359     HWND hWnd,
360     LPDRAWITEMSTRUCT lpdis);
361 
362 BOOL WINAPI FileMenu_InitMenuPopup(HMENU hMenu);
363 
364 void WINAPI FileMenu_AbortInitMenu(void);
365 
366 LRESULT WINAPI FileMenu_HandleMenuChar(
367     HMENU hMenu,
368     WPARAM wParam);
369 
370 BOOL WINAPI FileMenu_DeleteAllItems(HMENU hMenu);
371 
372 BOOL WINAPI FileMenu_DeleteItemByCmd(
373     HMENU hMenu,
374     UINT uID);
375 
376 BOOL WINAPI FileMenu_DeleteItemByIndex(
377     HMENU hMenu,
378     UINT uPos);
379 
380 BOOL WINAPI FileMenu_DeleteMenuItemByFirstID(
381     HMENU hMenu,
382     UINT uID);
383 
384 BOOL WINAPI FileMenu_DeleteSeparator(HMENU hMenu);
385 
386 BOOL WINAPI FileMenu_EnableItemByCmd(
387     HMENU hMenu,
388     UINT uID,
389     BOOL bEnable);
390 
391 DWORD WINAPI FileMenu_GetItemExtent(
392     HMENU hMenu,
393     UINT uPos);
394 
395 int WINAPI FileMenu_AppendFilesForPidl(
396     HMENU hMenu,
397     LPCITEMIDLIST pidl,
398     BOOL bAddSeparator);
399 
400 int WINAPI FileMenu_AddFilesForPidl(
401     HMENU hMenu,
402     UINT uReserved,
403     UINT uID,
404     LPCITEMIDLIST pidl,
405     UINT uFlags,
406     UINT uEnumFlags,
407     LPFNFMCALLBACK lpfnCallback);
408 
409 /****************************************************************************
410  * Drag And Drop Routines
411  */
412 
413 HRESULT WINAPI SHRegisterDragDrop(
414     HWND hWnd,
415     LPDROPTARGET lpDropTarget);
416 
417 HRESULT WINAPI SHRevokeDragDrop(HWND hWnd);
418 
419 BOOL WINAPI DAD_DragEnter(HWND hWnd);
420 
421 BOOL WINAPI DAD_SetDragImageFromListView(
422     HWND hWnd,
423     POINT pt);
424 
425 BOOL WINAPI DAD_ShowDragImage(BOOL bShow);
426 
427 /****************************************************************************
428  * Path Manipulation Routines
429  */
430 
431 BOOL WINAPI PathAppendAW(LPVOID lpszPath1, LPCVOID lpszPath2);
432 
433 LPVOID WINAPI PathCombineAW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile);
434 
435 LPVOID  WINAPI PathAddBackslashAW(LPVOID path);
436 
437 LPVOID WINAPI PathBuildRootAW(LPVOID lpszPath, int drive);
438 
439 LPVOID WINAPI PathFindExtensionAW(LPCVOID path);
440 
441 LPVOID WINAPI PathFindFileNameAW(LPCVOID path);
442 
443 LPVOID WINAPI PathGetExtensionAW(LPCVOID lpszPath,  DWORD void1, DWORD void2);
444 
445 LPVOID WINAPI PathGetArgsAW(LPVOID lpszPath);
446 
447 BOOL WINAPI PathRemoveFileSpecAW(LPVOID lpszPath);
448 
449 void WINAPI PathRemoveBlanksAW(LPVOID lpszPath);
450 
451 VOID  WINAPI PathQuoteSpacesAW(LPVOID path);
452 
453 void WINAPI PathUnquoteSpacesAW(LPVOID lpszPath);
454 
455 BOOL WINAPI PathIsUNCAW(LPCVOID lpszPath);
456 
457 BOOL WINAPI PathIsRelativeAW(LPCVOID lpszPath);
458 
459 BOOL WINAPI PathIsRootAW(LPCVOID x);
460 
461 BOOL WINAPI PathIsExeAW(LPCVOID lpszPath);
462 
463 BOOL WINAPI PathIsDirectoryAW(LPCVOID lpszPath);
464 
465 BOOL WINAPI PathFileExistsAW(LPCVOID lpszPath);
466 
467 BOOL WINAPI PathMatchSpecAW(LPVOID lpszPath, LPVOID lpszSpec);
468 
469 BOOL WINAPI PathMakeUniqueNameAW(
470     LPVOID lpszBuffer,
471     DWORD dwBuffSize,
472     LPCVOID lpszShortName,
473     LPCVOID lpszLongName,
474     LPCVOID lpszPathName);
475 
476 BOOL WINAPI PathYetAnotherMakeUniqueName(
477     LPWSTR lpszBuffer,
478     LPCWSTR lpszPathName,
479     LPCWSTR lpszShortName,
480     LPCWSTR lpszLongName);
481 
482 VOID WINAPI PathQualifyA(LPSTR pszPath);
483 VOID WINAPI PathQualifyW(LPWSTR pszPath);
484 VOID WINAPI PathQualifyAW(LPVOID path);
485 
486 /* PathResolve flags */
487 #define PRF_CHECKEXISTANCE  0x01
488 #define PRF_EXECUTABLE      0x02
489 #define PRF_QUALIFYONPATH   0x04
490 #define PRF_WINDOWS31       0x08
491 
492 BOOL WINAPI PathResolveA(LPSTR path, LPCSTR *dirs, DWORD flags);
493 BOOL WINAPI PathResolveW(LPWSTR path, LPCWSTR *dirs, DWORD flags);
494 BOOL WINAPI PathResolveAW(LPVOID lpszPath, LPCVOID *alpszPaths, DWORD dwFlags);
495 
496 VOID WINAPI PathSetDlgItemPathAW(HWND hDlg, int nIDDlgItem, LPCVOID lpszPath);
497 
498 /* PathProcessCommand flags */
499 #define PPCF_QUOTEPATH        0x01 /* implies PPCF_INCLUDEARGS */
500 #define PPCF_INCLUDEARGS      0x02
501 //#define PPCF_NODIRECTORIES    0x10 move to shlobj
502 #define PPCF_DONTRESOLVE      0x20
503 #define PPCF_PATHISRELATIVE   0x40
504 
505 HRESULT WINAPI PathProcessCommandAW(LPCVOID lpszPath, LPVOID lpszBuff,
506                                     DWORD dwBuffSize, DWORD dwFlags);
507 
508 void WINAPI PathStripPathAW(LPVOID lpszPath);
509 
510 BOOL WINAPI PathStripToRootAW(LPVOID lpszPath);
511 
512 void WINAPI PathRemoveArgsAW(LPVOID lpszPath);
513 
514 void WINAPI PathRemoveExtensionAW(LPVOID lpszPath);
515 
516 int WINAPI PathParseIconLocationAW(LPVOID lpszPath);
517 
518 BOOL WINAPI PathIsSameRootAW(LPCVOID lpszPath1, LPCVOID lpszPath2);
519 
520 BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID *sOtherDirs);
521 
522 BOOL WINAPI PathIsEqualOrSubFolder(_In_ LPCWSTR pszFile1OrCSIDL, _In_ LPCWSTR pszFile2);
523 
524 BOOL WINAPI PathIsTemporaryA(_In_ LPCSTR Str);
525 BOOL WINAPI PathIsTemporaryW(_In_ LPCWSTR Str);
526 
527 /****************************************************************************
528  * Shell File Operations error codes - SHFileOperationA/W
529  */
530 
531 /* Error codes could be pre-Win32 */
532 #define DE_SAMEFILE         0x71
533 #define DE_MANYSRC1DEST     0x72
534 #define DE_DIFFDIR          0x73
535 #define DE_ROOTDIR          0x74
536 #define DE_OPCANCELLED      0x75
537 #define DE_DESTSUBTREE      0x76
538 #define DE_ACCESSDENIEDSRC  0x78
539 #define DE_PATHTOODEEP      0x79
540 #define DE_MANYDEST         0x7A
541 #define DE_INVALIDFILES     0x7C
542 #define DE_DESTSAMETREE     0x7D
543 #define DE_FLDDESTISFILE    0x7E
544 #define DE_FILEDESTISFLD    0x80
545 #define DE_FILENAMETOOLONG  0x81
546 #define DE_DEST_IS_CDROM    0x82
547 #define DE_DEST_IS_DVD      0x83
548 #define DE_DEST_IS_CDRECORD 0x84
549 #define DE_FILE_TOO_LARGE   0x85
550 #define DE_SRC_IS_CDROM     0x86
551 #define DE_SRC_IS_DVD       0x87
552 #define DE_SRC_IS_CDRECORD  0x88
553 // #define DE_ERROR_MAX
554 #define ERRORONDEST         0x10000
555 
556 /****************************************************************************
557  * Shell settings
558  */
559 
560 typedef struct _REGSHELLSTATE
561 {
562     DWORD dwSize;
563     SHELLSTATE ss;
564 } REGSHELLSTATE, *PREGSHELLSTATE;
565 #define REGSHELLSTATE_SIZE 0x24
566 #define REGSHELLSTATE_VERSION 0xD
567 C_ASSERT(sizeof(REGSHELLSTATE) == REGSHELLSTATE_SIZE);
568 
569 /****************************************************************************
570  * Shell Namespace Routines
571  */
572 
573 /* Generic structure used by several messages */
574 typedef struct
575 {
576   DWORD          dwReserved;
577   DWORD          dwReserved2;
578   LPCITEMIDLIST  pidl;
579   LPDWORD        lpdwUser;
580 } SFVCBINFO, * LPSFVCBINFO;
581 typedef const SFVCBINFO * LPCSFVCBINFO;
582 
583 /* SFVCB_SELECTIONCHANGED structure */
584 typedef struct
585 {
586   UINT           uOldState;
587   UINT           uNewState;
588   LPCITEMIDLIST  pidl;
589   LPDWORD        lpdwUser;
590 } SFVSELECTSTATE, * LPSFVSELECTSTATE;
591 typedef const SFVSELECTSTATE * LPCSFVSELECTSTATE;
592 
593 /* SFVCB_COPYHOOKCALLBACK structure */
594 typedef struct
595 {
596   HWND    hwnd;
597   UINT    wFunc;
598   UINT    wFlags;
599   LPCSTR  pszSrcFile;
600   DWORD   dwSrcAttribs;
601   LPCSTR  pszDestFile;
602   DWORD   dwDestAttribs;
603 } SFVCOPYHOOKINFO, * LPSFVCOPYHOOKINFO;
604 typedef const SFVCOPYHOOKINFO * LPCSFVCOPYHOOKINFO;
605 
606 /* SFVCB_GETDETAILSOF structure */
607 typedef struct
608 {
609   LPCITEMIDLIST  pidl;
610   int            fmt;
611   int            cx;
612   STRRET         lpText;
613 } SFVCOLUMNINFO, * LPSFVCOLUMNINFO;
614 
615 /****************************************************************************
616  * Misc Stuff
617  */
618 
619 BOOL WINAPI
620 RegenerateUserEnvironment(LPVOID *lpEnvironment, BOOL bUpdateSelf);
621 
622 /* SHWaitForFileToOpen flags */
623 #define SHWFF_ADD     0x01
624 #define SHWFF_REMOVE  0x02
625 #define SHWFF_WAIT    0x04
626 
627 BOOL WINAPI SHWaitForFileToOpen(
628     LPCITEMIDLIST pidl,
629     DWORD dwFlags,
630     DWORD dwTimeout);
631 
632 WORD WINAPI ArrangeWindows(
633     HWND hwndParent,
634     DWORD dwReserved,
635     LPCRECT lpRect,
636     WORD cKids,
637     CONST HWND * lpKids);
638 
639 /* Flags for ShellExecCmdLine */
640 #define SECL_NO_UI          0x2
641 #define SECL_LOG_USAGE      0x8
642 #define SECL_USE_IDLIST     0x10
643 #define SECL_ALLOW_NONEXE   0x20
644 #define SECL_RUNAS          0x40
645 
646 HRESULT WINAPI ShellExecCmdLine(
647     HWND hwnd,
648     LPCWSTR pwszCommand,
649     LPCWSTR pwszStartDir,
650     int nShow,
651     LPVOID pUnused,
652     DWORD dwSeclFlags);
653 
654 HINSTANCE WINAPI
655 RealShellExecuteA(
656     _In_opt_ HWND hwnd,
657     _In_opt_ LPCSTR lpOperation,
658     _In_opt_ LPCSTR lpFile,
659     _In_opt_ LPCSTR lpParameters,
660     _In_opt_ LPCSTR lpDirectory,
661     _In_opt_ LPSTR lpReturn,
662     _In_opt_ LPCSTR lpTitle,
663     _In_opt_ LPVOID lpReserved,
664     _In_ INT nCmdShow,
665     _Out_opt_ PHANDLE lphProcess);
666 
667 HINSTANCE WINAPI
668 RealShellExecuteW(
669     _In_opt_ HWND hwnd,
670     _In_opt_ LPCWSTR lpOperation,
671     _In_opt_ LPCWSTR lpFile,
672     _In_opt_ LPCWSTR lpParameters,
673     _In_opt_ LPCWSTR lpDirectory,
674     _In_opt_ LPWSTR lpReturn,
675     _In_opt_ LPCWSTR lpTitle,
676     _In_opt_ LPVOID lpReserved,
677     _In_ INT nCmdShow,
678     _Out_opt_ PHANDLE lphProcess);
679 
680 HINSTANCE WINAPI
681 RealShellExecuteExA(
682     _In_opt_ HWND hwnd,
683     _In_opt_ LPCSTR lpOperation,
684     _In_opt_ LPCSTR lpFile,
685     _In_opt_ LPCSTR lpParameters,
686     _In_opt_ LPCSTR lpDirectory,
687     _In_opt_ LPSTR lpReturn,
688     _In_opt_ LPCSTR lpTitle,
689     _In_opt_ LPVOID lpReserved,
690     _In_ INT nCmdShow,
691     _Out_opt_ PHANDLE lphProcess,
692     _In_ DWORD dwFlags);
693 
694 HINSTANCE WINAPI
695 RealShellExecuteExW(
696     _In_opt_ HWND hwnd,
697     _In_opt_ LPCWSTR lpOperation,
698     _In_opt_ LPCWSTR lpFile,
699     _In_opt_ LPCWSTR lpParameters,
700     _In_opt_ LPCWSTR lpDirectory,
701     _In_opt_ LPWSTR lpReturn,
702     _In_opt_ LPCWSTR lpTitle,
703     _In_opt_ LPVOID lpReserved,
704     _In_ INT nCmdShow,
705     _Out_opt_ PHANDLE lphProcess,
706     _In_ DWORD dwFlags);
707 
708 /* RegisterShellHook types */
709 #define RSH_DEREGISTER        0
710 #define RSH_REGISTER          1
711 #define RSH_REGISTER_PROGMAN  2
712 #define RSH_REGISTER_TASKMAN  3
713 
714 BOOL WINAPI RegisterShellHook(
715     HWND hWnd,
716     DWORD dwType);
717 
718 /* SHCreateDefClassObject callback function */
719 typedef HRESULT (CALLBACK *LPFNCDCOCALLBACK)(
720     LPUNKNOWN pUnkOuter,
721     REFIID riidObject,
722     LPVOID *ppvObject);
723 
724 HRESULT WINAPI SHCreateDefClassObject(
725     REFIID riidFactory,
726     LPVOID *ppvFactory,
727     LPFNCDCOCALLBACK lpfnCallback,
728     LPDWORD lpdwUsage,
729     REFIID riidObject);
730 
731 void WINAPI SHFreeUnusedLibraries(void);
732 
733 /* SHCreateLinks flags */
734 #define SHCLF_PREFIXNAME       0x01
735 #define SHCLF_CREATEONDESKTOP  0x02
736 
737 HRESULT WINAPI SHCreateLinks(
738     HWND hWnd,
739     LPCSTR lpszDir,
740     LPDATAOBJECT lpDataObject,
741     UINT uFlags,
742     LPITEMIDLIST *lppidlLinks);
743 
744 VOID WINAPI CheckEscapesA(LPSTR string, DWORD len);
745 VOID WINAPI CheckEscapesW(LPWSTR string, DWORD len);
746 
747 /* policy functions */
748 BOOL WINAPI SHInitRestricted(LPCVOID unused, LPCVOID inpRegKey);
749 
750 #define CSIDL_FOLDER_MASK   0x00ff
751 
752 /* Utility functions */
753 #include <stdio.h>
754 
755 #define SMC_EXEC 4
756 INT WINAPI Shell_GetCachedImageIndex(LPCWSTR szPath, INT nIndex, UINT bSimulateDoc);
757 
758 HRESULT WINAPI SHCreatePropertyBag(_In_ REFIID riid, _Out_ void **ppvObj);
759 HRESULT WINAPI SHLimitInputCombo(HWND hWnd, IShellFolder *psf);
760 HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv);
761 
762 BOOL WINAPI GUIDFromStringA(
763     _In_   PCSTR psz,
764     _Out_  LPGUID pguid);
765 BOOL WINAPI GUIDFromStringW(
766     _In_   PCWSTR psz,
767     _Out_  LPGUID pguid);
768 
769 LPSTR WINAPI SheRemoveQuotesA(LPSTR psz);
770 LPWSTR WINAPI SheRemoveQuotesW(LPWSTR psz);
771 
772 /* Flags for Int64ToString and LargeIntegerToString */
773 #define FMT_USE_NUMDIGITS 0x01
774 #define FMT_USE_LEADZERO  0x02
775 #define FMT_USE_GROUPING  0x04
776 #define FMT_USE_DECIMAL   0x08
777 #define FMT_USE_THOUSAND  0x10
778 #define FMT_USE_NEGNUMBER 0x20
779 
780 INT WINAPI
781 Int64ToString(
782     _In_ LONGLONG llValue,
783     _Out_writes_z_(cchOut) LPWSTR pszOut,
784     _In_ UINT cchOut,
785     _In_ BOOL bUseFormat,
786     _In_opt_ const NUMBERFMTW *pNumberFormat,
787     _In_ DWORD dwNumberFlags);
788 
789 INT WINAPI
790 LargeIntegerToString(
791     _In_ const LARGE_INTEGER *pLargeInt,
792     _Out_writes_z_(cchOut) LPWSTR pszOut,
793     _In_ UINT cchOut,
794     _In_ BOOL bUseFormat,
795     _In_opt_ const NUMBERFMTW *pNumberFormat,
796     _In_ DWORD dwNumberFlags);
797 
798 LPWSTR WINAPI
799 ShortSizeFormatW(
800     _In_ DWORD dwNumber,
801     _Out_writes_(0x8FFF) LPWSTR pszBuffer);
802 
803 BOOL WINAPI SHOpenEffectiveToken(_Out_ LPHANDLE phToken);
804 DWORD WINAPI SHGetUserSessionId(_In_opt_ HANDLE hToken);
805 
806 typedef HRESULT (CALLBACK *PRIVILEGED_FUNCTION)(LPARAM lParam);
807 
808 HRESULT WINAPI
809 SHInvokePrivilegedFunctionW(
810     _In_z_ LPCWSTR pszName,
811     _In_ PRIVILEGED_FUNCTION fn,
812     _In_opt_ LPARAM lParam);
813 
814 BOOL WINAPI
815 SHTestTokenPrivilegeW(_In_opt_ HANDLE hToken, _In_z_ LPCWSTR lpName);
816 BOOL WINAPI IsSuspendAllowed(VOID);
817 
818 BOOL WINAPI
819 Activate_RunDLL(
820     _In_ HWND hwnd,
821     _In_ HINSTANCE hinst,
822     _In_ LPCWSTR cmdline,
823     _In_ INT cmdshow);
824 
825 BOOL WINAPI SHSettingsChanged(LPCVOID unused, LPCWSTR pszKey);
826 
827 /*****************************************************************************
828  * Shell32 resources
829  */
830 // these resources are in shell32.dll
831 #define IDB_GOBUTTON_NORMAL         0x0e6
832 #define IDB_GOBUTTON_HOT            0x0e7
833 
834 // band ids in internet toolbar
835 #define ITBBID_MENUBAND             1
836 #define ITBBID_BRANDBAND            5
837 #define ITBBID_TOOLSBAND            2
838 #define ITBBID_ADDRESSBAND          4
839 
840 // commands in the CGID_PrivCITCommands command group handled by the internet toolbar
841 // there seems to be some support for hiding the menubar and an auto hide feature that are
842 // unavailable in the UI
843 #define ITID_TEXTLABELS             3
844 #define ITID_TOOLBARBANDSHOWN       4
845 #define ITID_ADDRESSBANDSHOWN       5
846 #define ITID_LINKSBANDSHOWN         6
847 #define ITID_MENUBANDSHOWN          12
848 #define ITID_AUTOHIDEENABLED        13
849 #define ITID_CUSTOMIZEENABLED       20
850 #define ITID_TOOLBARLOCKED          27
851 
852 // commands in the CGID_BrandCmdGroup command group handled by the brand band
853 #define BBID_STARTANIMATION         1
854 #define BBID_STOPANIMATION          2
855 
856 // undocumented flags for IShellMenu::SetShellFolder
857 #define SMSET_UNKNOWN08             0x08
858 #define SMSET_UNKNOWN10             0x10
859 
860 // explorer tray commands
861 #define TRAYCMD_STARTMENU           305
862 #define TRAYCMD_RUN_DIALOG          401
863 #define TRAYCMD_LOGOFF_DIALOG       402
864 #define TRAYCMD_CASCADE             403
865 #define TRAYCMD_TILE_H              404
866 #define TRAYCMD_TILE_V              405
867 #define TRAYCMD_TOGGLE_DESKTOP      407
868 #define TRAYCMD_DATE_AND_TIME       408
869 #define TRAYCMD_TASKBAR_PROPERTIES  413
870 #define TRAYCMD_MINIMIZE_ALL        415
871 #define TRAYCMD_RESTORE_ALL         416
872 #define TRAYCMD_SHOW_DESKTOP        419
873 #define TRAYCMD_SHOW_TASK_MGR       420
874 #define TRAYCMD_CUSTOMIZE_TASKBAR   421
875 #define TRAYCMD_LOCK_TASKBAR        424
876 #define TRAYCMD_HELP_AND_SUPPORT    503
877 #define TRAYCMD_CONTROL_PANEL       505
878 #define TRAYCMD_SHUTDOWN_DIALOG     506
879 #define TRAYCMD_PRINTERS_AND_FAXES  510
880 #define TRAYCMD_LOCK_DESKTOP        517
881 #define TRAYCMD_SWITCH_USER_DIALOG  5000
882 #define TRAYCMD_SEARCH_FILES        41093
883 #define TRAYCMD_SEARCH_COMPUTERS    41094
884 
885 // Explorer Tray Application Bar Data Message Commands
886 #define TABDMC_APPBAR     0
887 #define TABDMC_NOTIFY     1
888 #define TABDMC_LOADINPROC 2
889 
890 void WINAPI ShellDDEInit(BOOL bInit);
891 DWORD WINAPI WinList_Init(void);
892 
893 IStream* WINAPI SHGetViewStream(LPCITEMIDLIST, DWORD, LPCTSTR, LPCTSTR, LPCTSTR);
894 
895 HRESULT WINAPI SHCreateSessionKey(REGSAM samDesired, PHKEY phKey);
896 
897 LONG WINAPI SHRegQueryValueExA(
898     HKEY hkey,
899     LPCSTR lpValueName,
900     LPDWORD lpReserved,
901     LPDWORD lpType,
902     LPBYTE lpData,
903     LPDWORD lpcbData);
904 LONG WINAPI SHRegQueryValueExW(
905     HKEY hkey,
906     LPCWSTR pszValue,
907     LPDWORD pdwReserved,
908     LPDWORD pdwType,
909     LPVOID pvData,
910     LPDWORD pcbData);
911 #ifdef UNICODE
912     #define SHRegQueryValueEx SHRegQueryValueExW
913 #else
914     #define SHRegQueryValueEx SHRegQueryValueExA
915 #endif
916 
917 HRESULT WINAPI
918 CopyStreamUI(
919     _In_ IStream *pSrc,
920     _Out_ IStream *pDst,
921     _Inout_opt_ IProgressDialog *pProgress,
922     _In_opt_ DWORDLONG dwlSize);
923 
924 /*****************************************************************************
925  * INVALID_FILETITLE_CHARACTERS
926  */
927 
928 #define INVALID_FILETITLE_CHARACTERSA "\\/:*?\"<>|"
929 #define INVALID_FILETITLE_CHARACTERSW L"\\/:*?\"<>|"
930 
931 #ifdef UNICODE
932     #define INVALID_FILETITLE_CHARACTERS INVALID_FILETITLE_CHARACTERSW
933 #else
934     #define INVALID_FILETITLE_CHARACTERS INVALID_FILETITLE_CHARACTERSA
935 #endif
936 
937 /*****************************************************************************
938  * Shell Link
939  */
940 #include <pshpack1.h>
941 
942 typedef struct tagSHELL_LINK_HEADER
943 {
944     /* The size of this structure (always 0x0000004C) */
945     DWORD dwSize;
946     /* CLSID = class identifier (always 00021401-0000-0000-C000-000000000046) */
947     CLSID clsid;
948     /* Flags (SHELL_LINK_DATA_FLAGS) */
949     DWORD dwFlags;
950     /* Informations about the link target: */
951     DWORD dwFileAttributes;
952     FILETIME ftCreationTime;
953     FILETIME ftLastAccessTime;
954     FILETIME ftLastWriteTime;
955     DWORD nFileSizeLow; /* only the least significant 32 bits */
956     /* The index of an icon (signed?) */
957     DWORD nIconIndex;
958     /* The expected window state of an application launched by the link */
959     DWORD nShowCommand;
960     /* The keystrokes used to launch the application */
961     WORD wHotKey;
962     /* Reserved (must be zero) */
963     WORD wReserved1;
964     DWORD dwReserved2;
965     DWORD dwReserved3;
966 } SHELL_LINK_HEADER, *LPSHELL_LINK_HEADER;
967 
968 /*****************************************************************************
969  * SHELL_LINK_INFOA/W
970  * If cbHeaderSize == 0x0000001C then use SHELL_LINK_INFOA
971  * If cbHeaderSize >= 0x00000024 then use SHELL_LINK_INFOW
972  */
973 typedef struct tagSHELL_LINK_INFOA
974 {
975     /* Size of the link info data */
976     DWORD cbSize;
977     /* Size of this structure (ANSI: = 0x0000001C) */
978     DWORD cbHeaderSize;
979     /* Specifies which fields are present/populated (SLI_*) */
980     DWORD dwFlags;
981     /* Offset of the VolumeID field (SHELL_LINK_INFO_VOLUME_ID) */
982     DWORD cbVolumeIDOffset;
983     /* Offset of the LocalBasePath field (ANSI, NULL-terminated string) */
984     DWORD cbLocalBasePathOffset;
985     /* Offset of the CommonNetworkRelativeLink field (SHELL_LINK_INFO_CNR_LINK) */
986     DWORD cbCommonNetworkRelativeLinkOffset;
987     /* Offset of the CommonPathSuffix field (ANSI, NULL-terminated string) */
988     DWORD cbCommonPathSuffixOffset;
989 } SHELL_LINK_INFOA, *LPSHELL_LINK_INFOA;
990 
991 typedef struct tagSHELL_LINK_INFOW
992 {
993     /* Size of the link info data */
994     DWORD cbSize;
995     /* Size of this structure (Unicode: >= 0x00000024) */
996     DWORD cbHeaderSize;
997     /* Specifies which fields are present/populated (SLI_*) */
998     DWORD dwFlags;
999     /* Offset of the VolumeID field (SHELL_LINK_INFO_VOLUME_ID) */
1000     DWORD cbVolumeIDOffset;
1001     /* Offset of the LocalBasePath field (ANSI, NULL-terminated string) */
1002     DWORD cbLocalBasePathOffset;
1003     /* Offset of the CommonNetworkRelativeLink field (SHELL_LINK_INFO_CNR_LINK) */
1004     DWORD cbCommonNetworkRelativeLinkOffset;
1005     /* Offset of the CommonPathSuffix field (ANSI, NULL-terminated string) */
1006     DWORD cbCommonPathSuffixOffset;
1007     /* Offset of the LocalBasePathUnicode field (Unicode, NULL-terminated string) */
1008     DWORD cbLocalBasePathUnicodeOffset;
1009     /* Offset of the CommonPathSuffixUnicode field (Unicode, NULL-terminated string) */
1010     DWORD cbCommonPathSuffixUnicodeOffset;
1011 } SHELL_LINK_INFOW, *LPSHELL_LINK_INFOW;
1012 
1013 /* VolumeID, LocalBasePath, LocalBasePathUnicode(cbHeaderSize >= 0x24) are present */
1014 #define SLI_VALID_LOCAL   0x00000001
1015 /* CommonNetworkRelativeLink is present */
1016 #define SLI_VALID_NETWORK 0x00000002
1017 
1018 /*****************************************************************************
1019  * SHELL_LINK_INFO_VOLUME_IDA/W
1020  * If cbVolumeLabelOffset != 0x00000014 (should be 0x00000010) then use
1021  * SHELL_LINK_INFO_VOLUME_IDA
1022  * If cbVolumeLabelOffset == 0x00000014 then use SHELL_LINK_INFO_VOLUME_IDW
1023  */
1024 typedef struct tagSHELL_LINK_INFO_VOLUME_IDA
1025 {
1026     /* Size of the VolumeID field (> 0x00000010) */
1027     DWORD cbSize;
1028     /* Drive type of the drive the link target is stored on (DRIVE_*) */
1029     DWORD dwDriveType;
1030     /* Serial number of the volume the link target is stored on */
1031     DWORD nDriveSerialNumber;
1032     /* Offset of the volume label (ANSI, NULL-terminated string).
1033        Must be != 0x00000014 (see tagSHELL_LINK_INFO_VOLUME_IDW) */
1034     DWORD cbVolumeLabelOffset;
1035 } SHELL_LINK_INFO_VOLUME_IDA, *LPSHELL_LINK_INFO_VOLUME_IDA;
1036 
1037 typedef struct tagSHELL_LINK_INFO_VOLUME_IDW
1038 {
1039     /* Size of the VolumeID field (> 0x00000010) */
1040     DWORD cbSize;
1041     /* Drive type of the drive the link target is stored on (DRIVE_*) */
1042     DWORD dwDriveType;
1043     /* Serial number of the volume the link target is stored on */
1044     DWORD nDriveSerialNumber;
1045     /* Offset of the volume label (ANSI, NULL-terminated string).
1046        If the value of this field is 0x00000014, ignore it and use
1047        cbVolumeLabelUnicodeOffset! */
1048     DWORD cbVolumeLabelOffset;
1049     /* Offset of the volume label (Unicode, NULL-terminated string).
1050        If the value of the VolumeLabelOffset field is not 0x00000014,
1051        this field must be ignored (==> it doesn't exists ==> ANSI). */
1052     DWORD cbVolumeLabelUnicodeOffset;
1053 } SHELL_LINK_INFO_VOLUME_IDW, *LPSHELL_LINK_INFO_VOLUME_IDW;
1054 
1055 /*****************************************************************************
1056  * SHELL_LINK_INFO_CNR_LINKA/W (CNR = Common Network Relative)
1057  * If cbNetNameOffset == 0x00000014 then use SHELL_LINK_INFO_CNR_LINKA
1058  * If cbNetNameOffset > 0x00000014 then use SHELL_LINK_INFO_CNR_LINKW
1059  */
1060 typedef struct tagSHELL_LINK_INFO_CNR_LINKA
1061 {
1062     /* Size of the CommonNetworkRelativeLink field (>= 0x00000014) */
1063     DWORD cbSize;
1064     /* Specifies which fields are present/populated (SLI_CNR_*) */
1065     DWORD dwFlags;
1066     /* Offset of the NetName field (ANSI, NULL–terminated string) */
1067     DWORD cbNetNameOffset;
1068     /* Offset of the DeviceName field (ANSI, NULL–terminated string) */
1069     DWORD cbDeviceNameOffset;
1070     /* Type of the network provider (WNNC_NET_* defined in winnetwk.h) */
1071     DWORD dwNetworkProviderType;
1072 } SHELL_LINK_INFO_CNR_LINKA, *LPSHELL_LINK_INFO_CNR_LINKA;
1073 
1074 typedef struct tagSHELL_LINK_INFO_CNR_LINKW
1075 {
1076     /* Size of the CommonNetworkRelativeLink field (>= 0x00000014) */
1077     DWORD cbSize;
1078     /* Specifies which fields are present/populated (SLI_CNR_*) */
1079     DWORD dwFlags;
1080     /* Offset of the NetName field (ANSI, NULL–terminated string) */
1081     DWORD cbNetNameOffset;
1082     /* Offset of the DeviceName field (ANSI, NULL–terminated string) */
1083     DWORD cbDeviceNameOffset;
1084     /* Type of the network provider (WNNC_NET_* defined in winnetwk.h) */
1085     DWORD dwNetworkProviderType;
1086     /* Offset of the NetNameUnicode field (Unicode, NULL–terminated string) */
1087     DWORD cbNetNameUnicodeOffset;
1088     /* Offset of the DeviceNameUnicode field (Unicode, NULL–terminated string) */
1089     DWORD cbDeviceNameUnicodeOffset;
1090 } SHELL_LINK_INFO_CNR_LINKW, *LPSHELL_LINK_INFO_CNR_LINKW;
1091 
1092 /* DeviceName is present */
1093 #define SLI_CNR_VALID_DEVICE   0x00000001
1094 /* NetworkProviderType is present */
1095 #define SLI_CNR_VALID_NET_TYPE 0x00000002
1096 
1097 /*****************************************************************************
1098  * Shell Link Extra Data (IShellLinkDataList)
1099  */
1100 typedef struct tagEXP_TRACKER
1101 {
1102     /* .cbSize = 0x00000060, .dwSignature = 0xa0000003 */
1103     DATABLOCK_HEADER dbh;
1104     /* Length >= 0x00000058 */
1105     DWORD nLength;
1106     /* Must be 0x00000000 */
1107     DWORD nVersion;
1108     /* NetBIOS name (ANSI, unused bytes are set to zero) */
1109     CHAR szMachineID[16]; /* "variable" >= 16 (?) */
1110     /* Some GUIDs for the Link Tracking service (from the FS?) */
1111     GUID guidDroidVolume;
1112     GUID guidDroidObject;
1113     GUID guidDroidBirthVolume;
1114     GUID guidDroidBirthObject;
1115 } EXP_TRACKER, *LPEXP_TRACKER;
1116 
1117 typedef struct tagEXP_SHIM
1118 {
1119     /* .cbSize >= 0x00000088, .dwSignature = 0xa0000008 */
1120     DATABLOCK_HEADER dbh;
1121     /* Name of a shim layer to apply (Unicode, unused bytes are set to zero) */
1122     WCHAR szwLayerName[64]; /* "variable" >= 64 */
1123 } EXP_SHIM, *LPEXP_SHIM;
1124 
1125 typedef struct tagEXP_KNOWN_FOLDER
1126 {
1127     /* .cbSize = 0x0000001c, .dwSignature = 0xa000000b */
1128     DATABLOCK_HEADER dbh;
1129     /* A GUID value that identifies a known folder */
1130     GUID guidKnownFolder;
1131     /* Specifies the location of the ItemID of the first child
1132        segment of the IDList specified by guidKnownFolder */
1133     DWORD cbOffset;
1134 } EXP_KNOWN_FOLDER, *LPEXP_KNOWN_FOLDER;
1135 
1136 typedef struct tagEXP_VISTA_ID_LIST
1137 {
1138     /* .cbSize >= 0x0000000a, .dwSignature = 0xa000000c */
1139     DATABLOCK_HEADER dbh;
1140     /* Specifies an alternate IDList that can be used instead
1141        of the "normal" IDList (SLDF_HAS_ID_LIST) */
1142     /* LPITEMIDLIST pIDList; (variable) */
1143 } EXP_VISTA_ID_LIST, *LPEXP_VISTA_ID_LIST;
1144 
1145 #define EXP_TRACKER_SIG       0xa0000003
1146 #define EXP_SHIM_SIG          0xa0000008
1147 #define EXP_KNOWN_FOLDER_SIG  0xa000000b
1148 #define EXP_VISTA_ID_LIST_SIG 0xa000000c
1149 
1150 /* Not compatible yet */
1151 typedef struct SFVM_CUSTOMVIEWINFO_DATA
1152 {
1153     ULONG cbSize;
1154     HBITMAP hbmBack;
1155     COLORREF clrText;
1156     COLORREF clrTextBack;
1157 } SFVM_CUSTOMVIEWINFO_DATA, *LPSFVM_CUSTOMVIEWINFO_DATA;
1158 
1159 #include <poppack.h>
1160 
1161 #ifdef __cplusplus
1162 } /* extern "C" */
1163 #endif /* defined(__cplusplus) */
1164 
1165 #endif /* __WINE_UNDOCSHELL_H */
1166