1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW API for MS-Windows 4.0
5  *
6  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
7  * Source: $(DRUNTIMESRC core/sys/windows/_shlobj.d)
8  */
9 /// Automatically imported and edited from the druntime module
10 /// core.sys.windows.shlobj for the auto-generated win32 package.
11 module win32.shlobj;
12 //version (Windows):
13 @system:
14 
15 version (ANSI) {} else version = Unicode;
16 version (Win32_UseLib) pragma(lib, "shell32");
17 
18 // TODO: fix bitfields
19 // TODO: CMIC_VALID_SEE_FLAGS
20 // SHGetFolderPath in shfolder.dll on W9x, NT4, also in shell32.dll on W2K
21 
22 import win32.commctrl, win32.ole2, win32.shlguid, win32.shellapi;
23 import win32.prsht, win32.unknwn, win32.w32api, win32.winbase,
24   win32.winnt, win32.winuser, win32.wtypes, win32.objfwd, win32.objidl;
25 import win32.winnetwk; // for NETRESOURCE
26 import win32.oaidl : VARIANT;
27 
28 
29 // FIXME: clean up Windows version support
30 
31 align(1):
32 
33 enum BIF_RETURNONLYFSDIRS = 1;
34 enum BIF_DONTGOBELOWDOMAIN = 2;
35 enum BIF_STATUSTEXT = 4;
36 enum BIF_RETURNFSANCESTORS = 8;
37 enum BIF_EDITBOX = 16;
38 enum BIF_VALIDATE = 32;
39 enum BIF_NEWDIALOGSTYLE = 64;
40 enum BIF_BROWSEINCLUDEURLS = 128;
41 enum BIF_USENEWUI =  BIF_EDITBOX | BIF_NEWDIALOGSTYLE;
42 enum BIF_BROWSEFORCOMPUTER = 0x1000;
43 enum BIF_BROWSEFORPRINTER = 0x2000;
44 enum BIF_BROWSEINCLUDEFILES = 0x4000;
45 enum BIF_SHAREABLE = 0x8000;
46 enum BFFM_INITIALIZED = 1;
47 enum BFFM_SELCHANGED = 2;
48 enum BFFM_VALIDATEFAILEDA = 3;
49 enum BFFM_VALIDATEFAILEDW = 4;
50 enum BFFM_SETSTATUSTEXTA = WM_USER + 100;
51 enum BFFM_ENABLEOK = WM_USER + 101;
52 enum BFFM_SETSELECTIONA = WM_USER + 102;
53 enum BFFM_SETSELECTIONW = WM_USER + 103;
54 enum BFFM_SETSTATUSTEXTW = WM_USER + 104;
55 enum BFFM_SETOKTEXT = WM_USER + 105;
56 enum BFFM_SETEXPANDED = WM_USER + 106;
57 
58 version (Unicode) {
59     alias BFFM_SETSTATUSTEXTW BFFM_SETSTATUSTEXT;
60     alias BFFM_SETSELECTIONW BFFM_SETSELECTION;
61     alias BFFM_VALIDATEFAILEDW BFFM_VALIDATEFAILED;
62 } else {
63     alias BFFM_SETSTATUSTEXTA BFFM_SETSTATUSTEXT;
64     alias BFFM_SETSELECTIONA BFFM_SETSELECTION;
65     alias BFFM_VALIDATEFAILEDA BFFM_VALIDATEFAILED;
66 }
67 
68 enum DVASPECT_SHORTNAME = 2;
69 
70 enum SHARD {
71     SHARD_PIDL            = 1,
72     SHARD_PATHA,
73     SHARD_PATHW,
74     SHARD_APPIDINFO,
75     SHARD_APPIDINFOIDLIST,
76     SHARD_LINK,
77     SHARD_APPIDINFOLINK,
78     SHARD_SHELLITEM,   // = 8
79     SHARD_PATH = (_WIN32_UNICODE ? SHARD_PATHW : SHARD_PATHA)
80 }
81 
82 enum SHCNE_RENAMEITEM = 1;
83 enum SHCNE_CREATE = 2;
84 enum SHCNE_DELETE = 4;
85 enum SHCNE_MKDIR = 8;
86 enum SHCNE_RMDIR = 16;
87 enum SHCNE_MEDIAINSERTED = 32;
88 enum SHCNE_MEDIAREMOVED = 64;
89 enum SHCNE_DRIVEREMOVED = 128;
90 enum SHCNE_DRIVEADD = 256;
91 enum SHCNE_NETSHARE = 512;
92 enum SHCNE_NETUNSHARE = 1024;
93 enum SHCNE_ATTRIBUTES = 2048;
94 enum SHCNE_UPDATEDIR = 4096;
95 enum SHCNE_UPDATEITEM = 8192;
96 enum SHCNE_SERVERDISCONNECT = 16384;
97 enum SHCNE_UPDATEIMAGE = 32768;
98 enum SHCNE_DRIVEADDGUI = 65536;
99 enum SHCNE_RENAMEFOLDER = 0x20000;
100 enum SHCNE_FREESPACE = 0x40000;
101 enum SHCNE_ASSOCCHANGED = 0x8000000;
102 enum SHCNE_DISKEVENTS = 0x2381F;
103 enum SHCNE_GLOBALEVENTS = 0xC0581E0;
104 enum SHCNE_ALLEVENTS = 0x7FFFFFFF;
105 enum SHCNE_INTERRUPT = 0x80000000;
106 
107 enum SHCNF_IDLIST = 0;
108 enum SHCNF_PATHA = 1;
109 enum SHCNF_PRINTERA = 2;
110 enum SHCNF_DWORD = 3;
111 enum SHCNF_PATHW = 5;
112 enum SHCNF_PRINTERW = 6;
113 enum SHCNF_TYPE = 0xFF;
114 enum SHCNF_FLUSH = 0x1000;
115 enum SHCNF_FLUSHNOWAIT = 0x2000;
116 
117 version (Unicode) {
118     alias SHCNF_PATHW SHCNF_PATH;
119     alias SHCNF_PRINTERW SHCNF_PRINTER;
120 } else {
121     alias SHCNF_PATHA SHCNF_PATH;
122     alias SHCNF_PRINTERA SHCNF_PRINTER;
123 }
124 
125 enum SFGAOF : DWORD {
126     SFGAO_CANCOPY         = DROPEFFECT.DROPEFFECT_COPY,
127     SFGAO_CANMOVE         = DROPEFFECT.DROPEFFECT_MOVE,
128     SFGAO_CANLINK         = DROPEFFECT.DROPEFFECT_LINK,
129     SFGAO_CANRENAME       = 0x00000010L,
130     SFGAO_CANDELETE       = 0x00000020L,
131     SFGAO_HASPROPSHEET    = 0x00000040L,
132     SFGAO_DROPTARGET      = 0x00000100L,
133     SFGAO_CAPABILITYMASK  = 0x00000177L,
134     SFGAO_ISSLOW          = 0x00004000L,
135     SFGAO_GHOSTED         = 0x00008000L,
136     SFGAO_LINK            = 0x00010000L,
137     SFGAO_SHARE           = 0x00020000L,
138     SFGAO_READONLY        = 0x00040000L,
139     SFGAO_HIDDEN          = 0x00080000L,
140     SFGAO_DISPLAYATTRMASK = (SFGAO_ISSLOW | SFGAO_GHOSTED | SFGAO_LINK
141                             | SFGAO_SHARE | SFGAO_READONLY | SFGAO_HIDDEN),
142     SFGAO_FILESYSANCESTOR = 0x10000000L,
143     SFGAO_FOLDER          = 0x20000000L,
144     SFGAO_FILESYSTEM      = 0x40000000L,
145     SFGAO_HASSUBFOLDER    = 0x80000000L,
146     SFGAO_CONTENTSMASK    = 0x80000000L,
147     SFGAO_VALIDATE        = 0x01000000L,
148     SFGAO_REMOVABLE       = 0x02000000L,
149     SFGAO_COMPRESSED      = 0x04000000L
150 }
151 enum STRRET_WSTR = 0;
152 enum STRRET_OFFSET = 1;
153 enum STRRET_CSTR = 2;
154 
155 enum {
156     SHGDFIL_FINDDATA = 1,
157     SHGDFIL_NETRESOURCE,
158     SHGDFIL_DESCRIPTIONID
159 }
160 
161 enum {
162     SHDID_ROOT_REGITEM = 1,
163     SHDID_FS_FILE,
164     SHDID_FS_DIRECTORY,
165     SHDID_FS_OTHER,
166     SHDID_COMPUTER_DRIVE35,
167     SHDID_COMPUTER_DRIVE525,
168     SHDID_COMPUTER_REMOVABLE,
169     SHDID_COMPUTER_FIXED,
170     SHDID_COMPUTER_NETDRIVE,
171     SHDID_COMPUTER_CDROM,
172     SHDID_COMPUTER_RAMDISK,
173     SHDID_COMPUTER_OTHER,
174     SHDID_NET_DOMAIN,
175     SHDID_NET_SERVER,
176     SHDID_NET_SHARE,
177     SHDID_NET_RESTOFNET,
178     SHDID_NET_OTHER
179 }
180 
181 const TCHAR[] REGSTR_PATH_EXPLORER = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer";
182 const TCHAR[] REGSTR_PATH_SPECIAL_FOLDERS=REGSTR_PATH_EXPLORER ~ "\\Shell Folders";
183 
184 enum {
185     CSIDL_DESKTOP            =  0,
186     CSIDL_INTERNET,
187     CSIDL_PROGRAMS,
188     CSIDL_CONTROLS,
189     CSIDL_PRINTERS,
190     CSIDL_PERSONAL,
191     CSIDL_FAVORITES,
192     CSIDL_STARTUP,
193     CSIDL_RECENT,
194     CSIDL_SENDTO,
195     CSIDL_BITBUCKET,
196     CSIDL_STARTMENU,      // = 11
197     CSIDL_MYMUSIC            = 13,
198     CSIDL_MYVIDEO,        // = 14
199     CSIDL_DESKTOPDIRECTORY   = 16,
200     CSIDL_DRIVES,
201     CSIDL_NETWORK,
202     CSIDL_NETHOOD,
203     CSIDL_FONTS,
204     CSIDL_TEMPLATES,
205     CSIDL_COMMON_STARTMENU,
206     CSIDL_COMMON_PROGRAMS,
207     CSIDL_COMMON_STARTUP,
208     CSIDL_COMMON_DESKTOPDIRECTORY,
209     CSIDL_APPDATA,
210     CSIDL_PRINTHOOD,
211     CSIDL_LOCAL_APPDATA,
212     CSIDL_ALTSTARTUP,
213     CSIDL_COMMON_ALTSTARTUP,
214     CSIDL_COMMON_FAVORITES,
215     CSIDL_INTERNET_CACHE,
216     CSIDL_COOKIES,
217     CSIDL_HISTORY,
218     CSIDL_COMMON_APPDATA,
219     CSIDL_WINDOWS,
220     CSIDL_SYSTEM,
221     CSIDL_PROGRAM_FILES,
222     CSIDL_MYPICTURES,
223     CSIDL_PROFILE,
224     CSIDL_SYSTEMX86,
225     CSIDL_PROGRAM_FILESX86,
226     CSIDL_PROGRAM_FILES_COMMON,
227     CSIDL_PROGRAM_FILES_COMMONX86,
228     CSIDL_COMMON_TEMPLATES,
229     CSIDL_COMMON_DOCUMENTS,
230     CSIDL_COMMON_ADMINTOOLS,
231     CSIDL_ADMINTOOLS,
232     CSIDL_CONNECTIONS,  // = 49
233     CSIDL_COMMON_MUSIC     = 53,
234     CSIDL_COMMON_PICTURES,
235     CSIDL_COMMON_VIDEO,
236     CSIDL_RESOURCES,
237     CSIDL_RESOURCES_LOCALIZED,
238     CSIDL_COMMON_OEM_LINKS,
239     CSIDL_CDBURN_AREA,  // = 59
240     CSIDL_COMPUTERSNEARME  = 61,
241     CSIDL_FLAG_DONT_VERIFY = 0x4000,
242     CSIDL_FLAG_CREATE      = 0x8000,
243     CSIDL_FLAG_MASK        = 0xFF00
244 }
245 
246 const TCHAR[]
247     CFSTR_SHELLIDLIST       = "Shell IDList Array",
248     CFSTR_SHELLIDLISTOFFSET = "Shell Object Offsets",
249     CFSTR_NETRESOURCES      = "Net Resource",
250     CFSTR_FILECONTENTS      = "FileContents",
251     CFSTR_FILENAMEA         = "FileName",
252     CFSTR_FILENAMEMAPA      = "FileNameMap",
253     CFSTR_FILEDESCRIPTORA   = "FileGroupDescriptor",
254     CFSTR_INETURLA          = "UniformResourceLocator",
255     CFSTR_SHELLURL          = CFSTR_INETURLA,
256     CFSTR_FILENAMEW         = "FileNameW",
257     CFSTR_FILENAMEMAPW      = "FileNameMapW",
258     CFSTR_FILEDESCRIPTORW   = "FileGroupDescriptorW",
259     CFSTR_INETURLW          = "UniformResourceLocatorW";
260 
261 version (Unicode) {
262     alias CFSTR_FILENAMEW CFSTR_FILENAME;
263     alias CFSTR_FILENAMEMAPW CFSTR_FILENAMEMAP;
264     alias CFSTR_FILEDESCRIPTORW CFSTR_FILEDESCRIPTOR;
265     alias CFSTR_INETURLW CFSTR_INETURL;
266 } else {
267     alias CFSTR_FILENAMEA CFSTR_FILENAME;
268     alias CFSTR_FILENAMEMAPA CFSTR_FILENAMEMAP;
269     alias CFSTR_FILEDESCRIPTORA CFSTR_FILEDESCRIPTOR;
270     alias CFSTR_INETURLA CFSTR_INETURL;
271 }
272 const TCHAR[]
273     CFSTR_PRINTERGROUP        = "PrinterFriendlyName",
274     CFSTR_INDRAGLOOP          = "InShellDragLoop",
275     CFSTR_PASTESUCCEEDED      = "Paste Succeeded",
276     CFSTR_PERFORMEDDROPEFFECT = "Performed DropEffect",
277     CFSTR_PREFERREDDROPEFFECT = "Preferred DropEffect";
278 
279 enum CMF_NORMAL=0;
280 enum CMF_DEFAULTONLY=1;
281 enum CMF_VERBSONLY=2;
282 enum CMF_EXPLORE=4;
283 enum CMF_NOVERBS=8;
284 enum CMF_CANRENAME=16;
285 enum CMF_NODEFAULT=32;
286 enum CMF_INCLUDESTATIC=64;
287 enum CMF_RESERVED=0xffff0000;
288 enum GCS_VERBA=0;
289 enum GCS_HELPTEXTA=1;
290 enum GCS_VALIDATEA=2;
291 enum GCS_VERBW=4;
292 enum GCS_HELPTEXTW=5;
293 enum GCS_VALIDATEW=6;
294 enum GCS_UNICODE=4;
295 
296 version (Unicode) {
297     alias GCS_VERBW GCS_VERB;
298     alias GCS_HELPTEXTW GCS_HELPTEXT;
299     alias GCS_VALIDATEW GCS_VALIDATE;
300 } else {
301     alias GCS_VERBA GCS_VERB;
302     alias GCS_HELPTEXTA GCS_HELPTEXT;
303     alias GCS_VALIDATEA GCS_VALIDATE;
304 }
305 
306 const TCHAR[]
307     CMDSTR_NEWFOLDER   = "NewFolder",
308     CMDSTR_VIEWLIST    = "ViewList",
309     CMDSTR_VIEWDETAILS = "ViewDetails";
310 
311 enum CMIC_MASK_HOTKEY     = SEE_MASK_HOTKEY;
312 enum CMIC_MASK_ICON       = SEE_MASK_ICON;
313 enum CMIC_MASK_FLAG_NO_UI = SEE_MASK_FLAG_NO_UI;
314 enum CMIC_MASK_MODAL      = 0x80000000;
315 // TODO: This isn't defined anywhere in MinGW.
316 //const CMIC_VALID_SEE_FLAGS=SEE_VALID_CMIC_FLAGS;
317 
318 enum GIL_OPENICON = 1;
319 enum GIL_FORSHELL = 2;
320 enum GIL_SIMULATEDOC = 1;
321 enum GIL_PERINSTANCE = 2;
322 enum GIL_PERCLASS = 4;
323 enum GIL_NOTFILENAME = 8;
324 enum GIL_DONTCACHE = 16;
325 
326 enum FVSIF_RECT = 1;
327 enum FVSIF_PINNED = 2;
328 enum FVSIF_NEWFAILED = 0x8000000;
329 enum FVSIF_NEWFILE = 0x80000000;
330 enum FVSIF_CANVIEWIT = 0x40000000;
331 
332 enum CDBOSC_SETFOCUS = 0;
333 enum CDBOSC_KILLFOCUS = 1;
334 enum CDBOSC_SELCHANGE = 2;
335 enum CDBOSC_RENAME = 3;
336 
337 enum FCIDM_SHVIEWFIRST = 0;
338 enum FCIDM_SHVIEWLAST = 0x7fff;
339 enum FCIDM_BROWSERFIRST = 0xa000;
340 enum FCIDM_BROWSERLAST = 0xbf00;
341 enum FCIDM_GLOBALFIRST = 0x8000;
342 enum FCIDM_GLOBALLAST = 0x9fff;
343 enum FCIDM_MENU_FILE = FCIDM_GLOBALFIRST;
344 enum FCIDM_MENU_EDIT = FCIDM_GLOBALFIRST+0x0040;
345 enum FCIDM_MENU_VIEW = FCIDM_GLOBALFIRST+0x0080;
346 enum FCIDM_MENU_VIEW_SEP_OPTIONS = FCIDM_GLOBALFIRST+0x0081;
347 enum FCIDM_MENU_TOOLS = FCIDM_GLOBALFIRST+0x00c0;
348 enum FCIDM_MENU_TOOLS_SEP_GOTO = FCIDM_GLOBALFIRST+0x00c1;
349 enum FCIDM_MENU_HELP = FCIDM_GLOBALFIRST+0x0100;
350 enum FCIDM_MENU_FIND = FCIDM_GLOBALFIRST+0x0140;
351 enum FCIDM_MENU_EXPLORE = FCIDM_GLOBALFIRST+0x0150;
352 enum FCIDM_MENU_FAVORITES = FCIDM_GLOBALFIRST+0x0170;
353 enum FCIDM_TOOLBAR = FCIDM_BROWSERFIRST;
354 enum FCIDM_STATUS = FCIDM_BROWSERFIRST+1;
355 
356 enum SBSP_DEFBROWSER = 0;
357 enum SBSP_SAMEBROWSER = 1;
358 enum SBSP_NEWBROWSER = 2;
359 enum SBSP_DEFMODE = 0;
360 enum SBSP_OPENMODE = 16;
361 enum SBSP_EXPLOREMODE = 32;
362 enum SBSP_ABSOLUTE = 0;
363 enum SBSP_RELATIVE = 0x1000;
364 enum SBSP_PARENT = 0x2000;
365 enum SBSP_INITIATEDBYHLINKFRAME = 0x80000000;
366 enum SBSP_REDIRECT = 0x40000000;
367 
368 enum {
369     FCW_STATUS=1,
370     FCW_TOOLBAR,
371     FCW_TREE
372 }
373 
374 enum FCT_MERGE=1;
375 enum FCT_CONFIGABLE=2;
376 enum FCT_ADDTOEND=4;
377 
378 enum SVSI_DESELECT=0;
379 enum SVSI_SELECT=1;
380 enum SVSI_EDIT=3;
381 enum SVSI_DESELECTOTHERS=4;
382 enum SVSI_ENSUREVISIBLE=8;
383 enum SVSI_FOCUSED=16;
384 
385 enum SVGIO_BACKGROUND=0;
386 enum SVGIO_SELECTION=1;
387 enum SVGIO_ALLVIEW=2;
388 
389 enum UINT SV2GV_CURRENTVIEW=-1;
390 enum UINT SV2GV_DEFAULTVIEW=-2;
391 
392 alias DWORD SHGDNF;
393 
394 struct CIDA {
395     UINT    cidl;
396     UINT[1] aoffset;
397 }
398 alias CIDA* LPIDA;
399 
400 struct SHITEMID {
401     USHORT  cb;
402     BYTE[1] abID;
403 }
404 alias SHITEMID*        LPSHITEMID;
405 alias const(SHITEMID)* LPCSHITEMID;
406 
407 struct ITEMIDLIST {
408     SHITEMID mkid;
409 }
410 alias ITEMIDLIST*        LPITEMIDLIST;
411 alias const(ITEMIDLIST)* LPCITEMIDLIST;
412 
413 extern (Windows) alias int function(HWND, UINT, LPARAM, LPARAM) BFFCALLBACK;
414 
415 align (8) {
416 struct BROWSEINFOA {
417     HWND          hwndOwner;
418     LPCITEMIDLIST pidlRoot;
419     LPSTR         pszDisplayName;
420     LPCSTR        lpszTitle;
421     UINT          ulFlags;
422     BFFCALLBACK   lpfn;
423     LPARAM        lParam;
424     int           iImage;
425 }
426 alias BROWSEINFOA* PBROWSEINFOA, LPBROWSEINFOA;
427 
428 struct BROWSEINFOW {
429     HWND          hwndOwner;
430     LPCITEMIDLIST pidlRoot;
431     LPWSTR        pszDisplayName;
432     LPCWSTR       lpszTitle;
433     UINT          ulFlags;
434     BFFCALLBACK   lpfn;
435     LPARAM        lParam;
436     int           iImage;
437 }
438 alias BROWSEINFOW* PBROWSEINFOW, LPBROWSEINFOW;
439 } // align (8)
440 
441 struct CMINVOKECOMMANDINFO {
442     DWORD cbSize = this.sizeof;
443     DWORD fMask;
444     HWND hwnd;
445     LPCSTR lpVerb;
446     LPCSTR lpParameters;
447     LPCSTR lpDirectory;
448     int nShow;
449     DWORD dwHotKey;
450     HANDLE hIcon;
451 }
452 alias CMINVOKECOMMANDINFO* LPCMINVOKECOMMANDINFO;
453 
454 struct DROPFILES {
455     DWORD pFiles;
456     POINT pt;
457     BOOL fNC;
458     BOOL fWide;
459 }
460 alias DROPFILES* LPDROPFILES;
461 
462 enum SHGNO {
463     SHGDN_NORMAL             = 0,
464     SHGDN_INFOLDER,
465     SHGDN_FOREDITING         = 0x1000,
466     SHGDN_INCLUDE_NONFILESYS = 0x2000,
467     SHGDN_FORADDRESSBAR      = 0x4000,
468     SHGDN_FORPARSING         = 0x8000
469 }
470 
471 enum SHCONTF {
472     SHCONTF_FOLDERS            = 32,
473     SHCONTF_NONFOLDERS         = 64,
474     SHCONTF_INCLUDEHIDDEN      = 128,
475     SHCONTF_INIT_ON_FIRST_NEXT = 256,
476     SHCONTF_NETPRINTERSRCH     = 512,
477     SHCONTF_SHAREABLE          = 1024,
478     SHCONTF_STORAGE            = 2048
479 }
480 
481 align(8) struct STRRET {
482     UINT uType;
483     union {
484         LPWSTR pOleStr;
485         UINT uOffset;
486         char[MAX_PATH] cStr;
487     }
488 }
489 alias STRRET* LPSTRRET;
490 
491 enum FD_FLAGS {
492     FD_CLSID      = 1,
493     FD_SIZEPOINT  = 2,
494     FD_ATTRIBUTES = 4,
495     FD_CREATETIME = 8,
496     FD_ACCESSTIME = 16,
497     FD_WRITESTIME = 32,
498     FD_FILESIZE   = 64,
499     FD_LINKUI     = 0x8000
500 }
501 
502 struct FILEDESCRIPTORA {
503     DWORD dwFlags;
504     CLSID clsid;
505     SIZEL sizel;
506     POINTL pointl;
507     DWORD dwFileAttributes;
508     FILETIME ftCreationTime;
509     FILETIME ftLastAccessTime;
510     FILETIME ftLastWriteTime;
511     DWORD nFileSizeHigh;
512     DWORD nFileSizeLow;
513     CHAR[MAX_PATH] cFileName = 0;
514 }
515 alias FILEDESCRIPTORA* LPFILEDESCRIPTORA;
516 
517 struct FILEDESCRIPTORW {
518     DWORD dwFlags;
519     CLSID clsid;
520     SIZEL sizel;
521     POINTL pointl;
522     DWORD dwFileAttributes;
523     FILETIME ftCreationTime;
524     FILETIME ftLastAccessTime;
525     FILETIME ftLastWriteTime;
526     DWORD nFileSizeHigh;
527     DWORD nFileSizeLow;
528     WCHAR[MAX_PATH] cFileName = 0;
529 }
530 alias FILEDESCRIPTORW* LPFILEDESCRIPTORW;
531 
532 struct FILEGROUPDESCRIPTORA {
533     UINT cItems;
534     FILEDESCRIPTORA[1] fgd;
535 }
536 alias FILEGROUPDESCRIPTORA* LPFILEGROUPDESCRIPTORA;
537 
538 struct FILEGROUPDESCRIPTORW {
539     UINT cItems;
540     FILEDESCRIPTORW[1] fgd;
541 }
542 alias FILEGROUPDESCRIPTORW* LPFILEGROUPDESCRIPTORW;
543 
544 enum SLR_FLAGS {
545     SLR_NO_UI      = 1,
546     SLR_ANY_MATCH  = 2,
547     SLR_UPDATE     = 4,
548     SLR_NOUPDATE   = 8,
549     SLR_NOSEARCH   = 16,
550     SLR_NOTRACK    = 32,
551     SLR_NOLINKINFO = 64,
552     SLR_INVOKE_MSI = 128
553 }
554 
555 enum SLGP_FLAGS {
556     SLGP_SHORTPATH=1,
557     SLGP_UNCPRIORITY=2,
558     SLGP_RAWPATH=4
559 }
560 
561 alias PBYTE LPVIEWSETTINGS;
562 
563 enum FOLDERFLAGS {
564     FWF_AUTOARRANGE         = 1,
565     FWF_ABBREVIATEDNAMES    = 2,
566     FWF_SNAPTOGRID          = 4,
567     FWF_OWNERDATA           = 8,
568     FWF_BESTFITWINDOW       = 16,
569     FWF_DESKTOP             = 32,
570     FWF_SINGLESEL           = 64,
571     FWF_NOSUBFOLDERS        = 128,
572     FWF_TRANSPARENT         = 256,
573     FWF_NOCLIENTEDGE        = 512,
574     FWF_NOSCROLL            = 0x400,
575     FWF_ALIGNLEFT           = 0x800,
576     FWF_SINGLECLICKACTIVATE = 0x8000
577 }
578 
579 enum FOLDERVIEWMODE {
580     FVM_ICON      = 1,
581     FVM_SMALLICON,
582     FVM_LIST,
583     FVM_DETAILS
584 }
585 
586 struct FOLDERSETTINGS {
587     UINT ViewMode;
588     UINT fFlags;
589 }
590 alias FOLDERSETTINGS*        LPFOLDERSETTINGS;
591 alias const(FOLDERSETTINGS)* LPCFOLDERSETTINGS;
592 
593 struct FVSHOWINFO {
594     DWORD cbSize = this.sizeof;
595     HWND hwndOwner;
596     int iShow;
597     DWORD dwFlags;
598     RECT rect;
599     LPUNKNOWN punkRel;
600     OLECHAR[MAX_PATH] strNewFile = 0;
601 }
602 alias FVSHOWINFO* LPFVSHOWINFO;
603 
604 struct NRESARRAY {
605     UINT cItems;
606     NETRESOURCE[1] nr;
607 }
608 alias NRESARRAY* LPNRESARRAY;
609 
610 enum {
611     SBSC_HIDE,
612     SBSC_SHOW,
613     SBSC_TOGGLE,
614     SBSC_QUERY
615 }
616 
617 enum {
618     SBCMDID_ENABLESHOWTREE,
619     SBCMDID_SHOWCONTROL,
620     SBCMDID_CANCELNAVIGATION,
621     SBCMDID_MAYSAVECHANGES,
622     SBCMDID_SETHLINKFRAME,
623     SBCMDID_ENABLESTOP,
624     SBCMDID_OPTIONS
625 }
626 enum SVUIA_STATUS {
627     SVUIA_DEACTIVATE,
628     SVUIA_ACTIVATE_NOFOCUS,
629     SVUIA_ACTIVATE_FOCUS,
630     SVUIA_INPLACEACTIVATE
631 }
632 
633 static if (_WIN32_IE >= 0x500) {
634 
635     struct EXTRASEARCH
636      {
637         GUID guidSearch;
638         WCHAR[80] wszFriendlyName = 0;
639         WCHAR[2084] wszUrl = 0;
640     }
641     alias EXTRASEARCH* LPEXTRASEARCH;
642 
643     alias DWORD SHCOLSTATEF;
644 
645     struct SHCOLUMNID {
646         GUID fmtid;
647         DWORD pid;
648     }
649     alias SHCOLUMNID*        LPSHCOLUMNID;
650     alias const(SHCOLUMNID)* LPCSHCOLUMNID;
651 
652     struct SHELLDETAILS {
653         int fmt;
654         int cxChar;
655         STRRET str;
656     }
657     alias SHELLDETAILS* LPSHELLDETAILS;
658 
659     struct PERSIST_FOLDER_TARGET_INFO
660      {
661         LPITEMIDLIST pidlTargetFolder;
662         WCHAR[MAX_PATH] szTargetParsingName = 0;
663         WCHAR[MAX_PATH] szNetworkProvider = 0;
664         DWORD dwAttributes;
665         int csidl;
666     }
667 
668     enum SHGFP_TYPE {
669         SHGFP_TYPE_CURRENT = 0,
670         SHGFP_TYPE_DEFAULT = 1,
671     }
672 
673 }
674 
675 interface IEnumIDList : IUnknown {
676     HRESULT Next(ULONG, LPITEMIDLIST*, ULONG*);
677     HRESULT Skip(ULONG);
678     HRESULT Reset();
679     HRESULT Clone(IEnumIDList*);
680 }
681 alias IEnumIDList LPENUMIDLIST;
682 
683 interface IObjMgr : IUnknown {
684     HRESULT Append(IUnknown);
685     HRESULT Remove(IUnknown);
686 }
687 
688 interface IContextMenu : IUnknown {
689     HRESULT QueryContextMenu(HMENU, UINT, UINT, UINT, UINT);
690     HRESULT InvokeCommand(LPCMINVOKECOMMANDINFO);
691     HRESULT GetCommandString(UINT_PTR, UINT, PUINT, LPSTR, UINT);
692 }
693 alias IContextMenu LPCONTEXTMENU;
694 
695 interface IContextMenu2 : IContextMenu {
696     HRESULT HandleMenuMsg(UINT, WPARAM, LPARAM);
697 }
698 alias IContextMenu2 LPCONTEXTMENU2;
699 
700 static if (_WIN32_IE >= 0x500) {
701     align(8) {
702         struct SHCOLUMNINIT {
703             ULONG dwFlags;
704             ULONG dwReserved;
705             WCHAR[MAX_PATH] wszFolder = 0;
706         }
707         alias SHCOLUMNINIT*        LPSHCOLUMNINIT;
708         alias const(SHCOLUMNINIT)* LPCSHCOLUMNINIT;
709 
710         struct SHCOLUMNDATA {
711             ULONG dwFlags;
712             DWORD dwFileAttributes;
713             ULONG dwReserved;
714             WCHAR *pwszExt = null;
715             WCHAR[MAX_PATH] wszFile = 0;
716         }
717         alias SHCOLUMNDATA*        LPSHCOLUMNDATA;
718         alias const(SHCOLUMNDATA)* LPCSHCOLUMNDATA;
719     }
720 
721 enum MAX_COLUMN_NAME_LEN = 80;
722 enum MAX_COLUMN_DESC_LEN = 128;
723 
724     align(1) struct SHCOLUMNINFO {
725         align(1):
726         SHCOLUMNID scid;
727         VARTYPE vt;
728         DWORD fmt;
729         UINT cChars;
730         DWORD csFlags;
731         WCHAR[MAX_COLUMN_NAME_LEN] wszTitle = 0;
732         WCHAR[MAX_COLUMN_DESC_LEN] wszDescription = 0;
733     }
734     alias SHCOLUMNINFO*        LPSHCOLUMNINFO;
735     alias const(SHCOLUMNINFO)* LPCSHCOLUMNINFO;
736 
737     enum SHCOLSTATE {
738         SHCOLSTATE_TYPE_STR      = 0x00000001,
739         SHCOLSTATE_TYPE_INT      = 0x00000002,
740         SHCOLSTATE_TYPE_DATE     = 0x00000003,
741         SHCOLSTATE_TYPEMASK      = 0x0000000f,
742         SHCOLSTATE_ONBYDEFAULT   = 0x00000010,
743         SHCOLSTATE_SLOW          = 0x00000020,
744         SHCOLSTATE_EXTENDED      = 0x00000040,
745         SHCOLSTATE_SECONDARYUI   = 0x00000080,
746         SHCOLSTATE_HIDDEN        = 0x00000100,
747         SHCOLSTATE_PREFER_VARCMP = 0x00000200
748     }
749 
750     interface IColumnProvider : IUnknown {
751         HRESULT Initialize(LPCSHCOLUMNINIT);
752         HRESULT GetColumnInfo(DWORD, SHCOLUMNINFO*);
753         HRESULT GetItemData(LPCSHCOLUMNID, LPCSHCOLUMNDATA, VARIANT*);
754     }
755 }/* _WIN32_IE >= 0x500 */
756 
757 interface IQueryInfo : IUnknown {
758     HRESULT GetInfoTip(DWORD, WCHAR**);
759     HRESULT GetInfoFlags(DWORD*);
760 }
761 
762 interface IShellExtInit : IUnknown {
763     HRESULT Initialize(LPCITEMIDLIST, LPDATAOBJECT, HKEY);
764 }
765 alias IShellExtInit LPSHELLEXTINIT;
766 
767 interface IShellPropSheetExt : IUnknown {
768     HRESULT AddPages(LPFNADDPROPSHEETPAGE, LPARAM);
769     HRESULT ReplacePage(UINT, LPFNADDPROPSHEETPAGE, LPARAM);
770 }
771 alias IShellPropSheetExt LPSHELLPROPSHEETEXT;
772 
773 interface IExtractIconA : IUnknown {
774     HRESULT GetIconLocation(UINT, LPSTR, UINT, int*, PUINT);
775     HRESULT Extract(LPCSTR, UINT, HICON*, HICON*, UINT);
776 }
777 alias IExtractIconA LPEXTRACTICONA;
778 
779 interface IExtractIconW : IUnknown {
780     HRESULT GetIconLocation(UINT, LPWSTR, UINT, int*, PUINT);
781     HRESULT Extract(LPCWSTR, UINT, HICON*, HICON*, UINT);
782 }
783 alias IExtractIconW LPEXTRACTICONW;
784 
785 version (Unicode) {
786     alias IExtractIconW IExtractIcon;
787     alias LPEXTRACTICONW LPEXTRACTICON;
788 } else {
789     alias IExtractIconA IExtractIcon;
790     alias LPEXTRACTICONA LPEXTRACTICON;
791 }
792 
793 interface IShellLinkA : IUnknown {
794     HRESULT GetPath(LPSTR, int, WIN32_FIND_DATAA*, DWORD);
795     HRESULT GetIDList(LPITEMIDLIST*);
796     HRESULT SetIDList(LPCITEMIDLIST);
797     HRESULT GetDescription(LPSTR, int);
798     HRESULT SetDescription(LPCSTR);
799     HRESULT GetWorkingDirectory(LPSTR, int);
800     HRESULT SetWorkingDirectory(LPCSTR);
801     HRESULT GetArguments(LPSTR, int);
802     HRESULT SetArguments(LPCSTR);
803     HRESULT GetHotkey(PWORD);
804     HRESULT SetHotkey(WORD);
805     HRESULT GetShowCmd(int*);
806     HRESULT SetShowCmd(int);
807     HRESULT GetIconLocation(LPSTR, int, int*);
808     HRESULT SetIconLocation(LPCSTR, int);
809     HRESULT SetRelativePath(LPCSTR , DWORD);
810     HRESULT Resolve(HWND, DWORD);
811     HRESULT SetPath(LPCSTR);
812 }
813 
814 interface IShellLinkW : IUnknown {
815     HRESULT GetPath(LPWSTR, int, WIN32_FIND_DATAW*, DWORD);
816     HRESULT GetIDList(LPITEMIDLIST*);
817     HRESULT SetIDList(LPCITEMIDLIST);
818     HRESULT GetDescription(LPWSTR, int);
819     HRESULT SetDescription(LPCWSTR);
820     HRESULT GetWorkingDirectory(LPWSTR, int);
821     HRESULT SetWorkingDirectory(LPCWSTR);
822     HRESULT GetArguments(LPWSTR, int);
823     HRESULT SetArguments(LPCWSTR);
824     HRESULT GetHotkey(PWORD);
825     HRESULT SetHotkey(WORD);
826     HRESULT GetShowCmd(int*);
827     HRESULT SetShowCmd(int);
828     HRESULT GetIconLocation(LPWSTR, int, int*);
829     HRESULT SetIconLocation(LPCWSTR, int);
830     HRESULT SetRelativePath(LPCWSTR , DWORD);
831     HRESULT Resolve(HWND, DWORD);
832     HRESULT SetPath(LPCWSTR);
833 }
834 
835 
836 interface IShellFolder : IUnknown {
837     HRESULT ParseDisplayName(HWND, LPBC, LPOLESTR, PULONG, LPITEMIDLIST*, PULONG);
838     HRESULT EnumObjects(HWND, DWORD, LPENUMIDLIST*);
839     HRESULT BindToObject(LPCITEMIDLIST, LPBC, REFIID, PVOID*);
840     HRESULT BindToStorage(LPCITEMIDLIST, LPBC, REFIID, PVOID*);
841     HRESULT CompareIDs(LPARAM, LPCITEMIDLIST, LPCITEMIDLIST);
842     HRESULT CreateViewObject(HWND, REFIID, PVOID*);
843     HRESULT GetAttributesOf(UINT, LPCITEMIDLIST*, PULONG);
844     HRESULT GetUIObjectOf(HWND, UINT, LPCITEMIDLIST*, REFIID, PUINT, PVOID*);
845     HRESULT GetDisplayNameOf(LPCITEMIDLIST, DWORD, LPSTRRET);
846     HRESULT SetNameOf(HWND, LPCITEMIDLIST, LPCOLESTR, DWORD, LPITEMIDLIST*);
847 }
848 alias IShellFolder LPSHELLFOLDER;
849 
850 static if (_WIN32_IE >= 0x500) {
851 
852 interface IEnumExtraSearch: IUnknown {
853     HRESULT Next(ULONG, LPEXTRASEARCH*, ULONG*);
854     HRESULT Skip(ULONG);
855     HRESULT Reset();
856     HRESULT Clone(IEnumExtraSearch*);
857 }
858 alias IEnumExtraSearch LPENUMEXTRASEARCH;
859 
860 interface IShellFolder2 : IShellFolder {
861     HRESULT GetDefaultSearchGUID(GUID*);
862     HRESULT EnumSearches(IEnumExtraSearch*);
863     HRESULT GetDefaultColumn(DWORD, ULONG*, ULONG*);
864     HRESULT GetDefaultColumnState(UINT, SHCOLSTATEF*);
865     HRESULT GetDetailsEx(LPCITEMIDLIST, const(SHCOLUMNID)*, VARIANT*);
866     HRESULT GetDetailsOf(LPCITEMIDLIST, UINT, SHELLDETAILS*);
867     HRESULT MapColumnToSCID(UINT, SHCOLUMNID*);
868 }
869 alias IShellFolder2 LPSHELLFOLDER2;
870 
871 } /* _WIN32_IE >= 0x500 */
872 
873 interface ICopyHook : IUnknown {
874     UINT CopyCallback(HWND, UINT, UINT, LPCSTR, DWORD, LPCSTR, DWORD);
875 }
876 alias ICopyHook LPCOPYHOOK;
877 
878 interface IFileViewerSite : IUnknown {
879     HRESULT SetPinnedWindow(HWND);
880     HRESULT GetPinnedWindow(HWND*);
881 }
882 alias IFileViewerSite LPFILEVIEWERSITE;
883 
884 interface IFileViewer : IUnknown {
885     HRESULT ShowInitialize(LPFILEVIEWERSITE);
886     HRESULT Show(LPFVSHOWINFO);
887     HRESULT PrintTo(LPSTR, BOOL);
888 }
889 alias IFileViewer LPFILEVIEWER;
890 
891 interface IFileSystemBindData : IUnknown {
892     HRESULT SetFindData(const(WIN32_FIND_DATAW)*);
893     HRESULT GetFindData(WIN32_FIND_DATAW*);
894 }
895 
896 interface IPersistFolder : IPersist {
897     HRESULT GetClassID(CLSID*);
898     HRESULT Initialize(LPCITEMIDLIST);
899 }
900 alias IPersistFolder LPPERSISTFOLDER;
901 
902 static if (_WIN32_IE >= 0x400 || _WIN32_WINNT >= 0x500) {
903 
904 interface IPersistFolder2 : IPersistFolder {
905     HRESULT GetClassID(CLSID*);
906     HRESULT Initialize(LPCITEMIDLIST);
907     HRESULT GetCurFolder(LPITEMIDLIST*);
908 }
909 alias IPersistFolder2 LPPERSISTFOLDER2;
910 
911 }/* _WIN32_IE >= 0x400 || _WIN32_WINNT >= 0x500 */
912 
913 static if (_WIN32_IE >= 0x500) {
914 
915 interface IPersistFolder3 : IPersistFolder2 {
916     HRESULT GetClassID(CLSID*);
917     HRESULT Initialize(LPCITEMIDLIST);
918     HRESULT GetCurFolder(LPITEMIDLIST*);
919     HRESULT InitializeEx(IBindCtx, LPCITEMIDLIST, const(PERSIST_FOLDER_TARGET_INFO)*);
920     HRESULT GetFolderTargetInfo(PERSIST_FOLDER_TARGET_INFO*);
921 }
922 alias IPersistFolder3 LPPERSISTFOLDER3;
923 
924 } /* _WIN32_IE >= 0x500 */
925 
926 alias IShellBrowser LPSHELLBROWSER;
927 alias IShellView LPSHELLVIEW;
928 
929 interface IShellBrowser : IOleWindow {
930     HRESULT GetWindow(HWND*);
931     HRESULT ContextSensitiveHelp(BOOL);
932     HRESULT InsertMenusSB(HMENU, LPOLEMENUGROUPWIDTHS);
933     HRESULT SetMenuSB(HMENU, HOLEMENU, HWND);
934     HRESULT RemoveMenusSB(HMENU);
935     HRESULT SetStatusTextSB(LPCOLESTR);
936     HRESULT EnableModelessSB(BOOL);
937     HRESULT TranslateAcceleratorSB(LPMSG, WORD);
938     HRESULT BrowseObject(LPCITEMIDLIST, UINT);
939     HRESULT GetViewStateStream(DWORD, LPSTREAM*);
940     HRESULT GetControlWindow(UINT, HWND*);
941     HRESULT SendControlMsg(UINT, UINT, WPARAM, LPARAM, LRESULT*);
942     HRESULT QueryActiveShellView(LPSHELLVIEW*);
943     HRESULT OnViewWindowActive(LPSHELLVIEW);
944     HRESULT SetToolbarItems(LPTBBUTTON, UINT, UINT);
945 }
946 
947 interface IShellView : IOleWindow {
948     HRESULT GetWindow(HWND*);
949     HRESULT ContextSensitiveHelp(BOOL);
950     HRESULT TranslateAccelerator(LPMSG);
951 //[No] #ifdef _FIX_ENABLEMODELESS_CONFLICT
952 //[No]  STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE;
953 //[Yes] #else
954     HRESULT EnableModeless(BOOL);
955 //[Yes] #endif
956     HRESULT UIActivate(UINT);
957     HRESULT Refresh();
958     HRESULT CreateViewWindow(IShellView, LPCFOLDERSETTINGS, LPSHELLBROWSER, RECT*, HWND*);
959     HRESULT DestroyViewWindow();
960     HRESULT GetCurrentInfo(LPFOLDERSETTINGS);
961     HRESULT AddPropertySheetPages(DWORD, LPFNADDPROPSHEETPAGE, LPARAM);
962     HRESULT SaveViewState();
963     HRESULT SelectItem(LPCITEMIDLIST, UINT);
964     HRESULT GetItemObject(UINT, REFIID, PVOID*);
965 }
966 
967 interface ICommDlgBrowser : IUnknown {
968     HRESULT OnDefaultCommand(IShellView);
969     HRESULT OnStateChange(IShellView, ULONG);
970     HRESULT IncludeObject(IShellView, LPCITEMIDLIST);
971 }
972 alias ICommDlgBrowser LPCOMMDLGBROWSER;
973 
974 alias GUID SHELLVIEWID;
975 
976 struct SV2CVW2_PARAMS {
977     DWORD cbSize = this.sizeof;
978     IShellView psvPrev;
979     FOLDERSETTINGS  *pfs;
980     IShellBrowser psbOwner;
981     RECT *prcView;
982 const(SHELLVIEWID)* pvid;
983     HWND hwndView;
984 }
985 alias SV2CVW2_PARAMS* LPSV2CVW2_PARAMS;
986 
987 interface IShellView2 : IShellView {
988     HRESULT GetWindow(HWND*);
989     HRESULT ContextSensitiveHelp(BOOL);
990     HRESULT TranslateAccelerator(LPMSG);
991 //[No] #ifdef _FIX_ENABLEMODELESS_CONFLICT
992 //[No]  STDMETHOD(EnableModelessSV)(THIS_ BOOL) PURE;
993 //[Yes] #else
994     HRESULT EnableModeless(BOOL);
995 //[Yes] #endif
996     HRESULT UIActivate(UINT);
997     HRESULT Refresh();
998     HRESULT CreateViewWindow(IShellView, LPCFOLDERSETTINGS, LPSHELLBROWSER, RECT*, HWND*);
999     HRESULT DestroyViewWindow();
1000     HRESULT GetCurrentInfo(LPFOLDERSETTINGS);
1001     HRESULT AddPropertySheetPages(DWORD, LPFNADDPROPSHEETPAGE, LPARAM);
1002     HRESULT SaveViewState();
1003     HRESULT SelectItem(LPCITEMIDLIST, UINT);
1004     HRESULT GetItemObject(UINT, REFIID, PVOID*);
1005     HRESULT GetView(SHELLVIEWID*, ULONG);
1006     HRESULT CreateViewWindow2(LPSV2CVW2_PARAMS);
1007 }
1008 
1009 interface IShellExecuteHookA : IUnknown {
1010     HRESULT Execute(LPSHELLEXECUTEINFOA);
1011 }
1012 
1013 interface IShellExecuteHookW : IUnknown {
1014     HRESULT Execute(LPSHELLEXECUTEINFOW);
1015 }
1016 
1017 interface IShellIcon : IUnknown {
1018     HRESULT GetIconOf(LPCITEMIDLIST, UINT, PINT);
1019 }
1020 alias IShellIcon LPSHELLICON;
1021 
1022 struct SHELLFLAGSTATE {
1023     short _bf;
1024 /*
1025     BOOL fShowAllObjects : 1;
1026     BOOL fShowExtensions : 1;
1027     BOOL fNoConfirmRecycle : 1;
1028     BOOL fShowSysFiles : 1;
1029     BOOL fShowCompColor : 1;
1030     BOOL fDoubleClickInWebView : 1;
1031     BOOL fDesktopHTML : 1;
1032     BOOL fWin95Classic : 1;
1033     BOOL fDontPrettyPath : 1;
1034     BOOL fShowAttribCol : 1;
1035     BOOL fMapNetDrvBtn : 1;
1036     BOOL fShowInfoTip : 1;
1037     BOOL fHideIcons : 1;
1038     UINT fRestFlags : 3;
1039 */
1040     @property bool fShowAllObjects()       { return cast(bool) (_bf & 0x0001); }
1041     @property bool fShowExtensions()       { return cast(bool) (_bf & 0x0002); }
1042     @property bool fNoConfirmRecycle()     { return cast(bool) (_bf & 0x0004); }
1043     @property bool fShowSysFiles()         { return cast(bool) (_bf & 0x0008); }
1044     @property bool fShowCompColor()        { return cast(bool) (_bf & 0x0010); }
1045     @property bool fDoubleClickInWebView() { return cast(bool) (_bf & 0x0020); }
1046     @property bool fDesktopHTML()          { return cast(bool) (_bf & 0x0040); }
1047     @property bool fWin95Classic()         { return cast(bool) (_bf & 0x0080); }
1048     @property bool fDontPrettyPath()       { return cast(bool) (_bf & 0x0100); }
1049     @property bool fShowAttribCol()        { return cast(bool) (_bf & 0x0200); }
1050     @property bool fMapNetDrvBtn()         { return cast(bool) (_bf & 0x0400); }
1051     @property bool fShowInfoTip()          { return cast(bool) (_bf & 0x0800); }
1052     @property bool fHideIcons()            { return cast(bool) (_bf & 0x1000); }
1053     @property ubyte fRestFlags()           { return cast(ubyte) (_bf >> 13); }
1054 
1055     @property bool fShowAllObjects(bool f)       { _bf = cast(ushort) ((_bf & ~0xFFFE) | f);        return f; }
1056     @property bool fShowExtensions(bool f)       { _bf = cast(ushort) ((_bf & ~0xFFFD) | (f <<  1)); return f; }
1057     @property bool fNoConfirmRecycle(bool f)     { _bf = cast(ushort) ((_bf & ~0xFFFB) | (f <<  2)); return f; }
1058     @property bool fShowSysFiles(bool f)         { _bf = cast(ushort) ((_bf & ~0xFFF8) | (f <<  3)); return f; }
1059     @property bool fShowCompColor(bool f)        { _bf = cast(ushort) ((_bf & ~0xFFEF) | (f <<  4)); return f; }
1060     @property bool fDoubleClickInWebView(bool f) { _bf = cast(ushort) ((_bf & ~0xFFDF) | (f <<  5)); return f; }
1061     @property bool fDesktopHTML(bool f)          { _bf = cast(ushort) ((_bf & ~0xFFBF) | (f <<  6)); return f; }
1062     @property bool fWin95Classic(bool f)         { _bf = cast(ushort) ((_bf & ~0xFF8F) | (f <<  7)); return f; }
1063     @property bool fDontPrettyPath(bool f)       { _bf = cast(ushort) ((_bf & ~0xFEFF) | (f <<  8)); return f; }
1064     @property bool fShowAttribCol(bool f)        { _bf = cast(ushort) ((_bf & ~0xFDFF) | (f <<  9)); return f; }
1065     @property bool fMapNetDrvBtn(bool f)         { _bf = cast(ushort) ((_bf & ~0xFBFF) | (f << 10)); return f; }
1066     @property bool fShowInfoTip(bool f)          { _bf = cast(ushort) ((_bf & ~0xF8FF) | (f << 11)); return f; }
1067     @property bool fHideIcons(bool f)            { _bf = cast(ushort) ((_bf & ~0xEFFF) | (f << 12)); return f; }
1068     @property ubyte fRestFlags(ubyte f)          { _bf = cast(ushort) ((_bf & ~0x1FFF) | (f << 13)); return cast(ubyte) (f & 7); }
1069 }
1070 alias SHELLFLAGSTATE* LPSHELLFLAGSTATE;
1071 
1072 enum SSF_SHOWALLOBJECTS = 0x1;
1073 enum SSF_SHOWEXTENSIONS = 0x2;
1074 enum SSF_SHOWCOMPCOLOR = 0x8;
1075 enum SSF_SHOWSYSFILES = 0x20;
1076 enum SSF_DOUBLECLICKINWEBVIEW = 0x80;
1077 enum SSF_SHOWATTRIBCOL = 0x100;
1078 enum SSF_DESKTOPHTML = 0x200;
1079 enum SSF_WIN95CLASSIC = 0x400;
1080 enum SSF_DONTPRETTYPATH = 0x800;
1081 enum SSF_MAPNETDRVBUTTON = 0x1000;
1082 enum SSF_SHOWINFOTIP = 0x2000;
1083 enum SSF_HIDEICONS = 0x4000;
1084 enum SSF_NOCONFIRMRECYCLE = 0x8000;
1085 
1086 interface IShellIconOverlayIdentifier : IUnknown {
1087     HRESULT IsMemberOf(LPCWSTR, DWORD);
1088     HRESULT GetOverlayInfo(LPWSTR, int, int*, DWORD*);
1089     HRESULT GetPriority(int*);
1090 }
1091 
1092 enum ISIOI_ICONFILE  = 0x00000001;
1093 enum ISIOI_ICONINDEX = 0x00000002;
1094 
1095 static if (_WIN32_WINNT >= 0x500) {
1096     struct SHELLSTATE {
1097         uint _bf1;
1098         DWORD dwWin95Unused;
1099         UINT uWin95Unused;
1100         LONG lParamSort;
1101         int iSortDirection;
1102         UINT _version;
1103         UINT uNotUsed;
1104         uint _bf2;
1105     /*
1106         BOOL fShowAllObjects : 1;
1107         BOOL fShowExtensions : 1;
1108         BOOL fNoConfirmRecycle : 1;
1109         BOOL fShowSysFiles : 1;
1110         BOOL fShowCompColor : 1;
1111         BOOL fDoubleClickInWebView : 1;
1112         BOOL fDesktopHTML : 1;
1113         BOOL fWin95Classic : 1;
1114         BOOL fDontPrettyPath : 1;
1115         BOOL fShowAttribCol : 1;
1116         BOOL fMapNetDrvBtn : 1;
1117         BOOL fShowInfoTip : 1;
1118         BOOL fHideIcons : 1;
1119         BOOL fWebView : 1;
1120         BOOL fFilter : 1;
1121         BOOL fShowSuperHidden : 1;
1122         BOOL fNoNetCrawling : 1;
1123     */
1124         @property bool fShowAllObjects()       { return cast(bool) (_bf1 & 0x00000001); }
1125         @property bool fShowExtensions()       { return cast(bool) (_bf1 & 0x00000002); }
1126         @property bool fNoConfirmRecycle()     { return cast(bool) (_bf1 & 0x00000004); }
1127         @property bool fShowSysFiles()         { return cast(bool) (_bf1 & 0x00000008); }
1128         @property bool fShowCompColor()        { return cast(bool) (_bf1 & 0x00000010); }
1129         @property bool fDoubleClickInWebView() { return cast(bool) (_bf1 & 0x00000020); }
1130         @property bool fDesktopHTML()          { return cast(bool) (_bf1 & 0x00000040); }
1131         @property bool fWin95Classic()         { return cast(bool) (_bf1 & 0x00000080); }
1132         @property bool fDontPrettyPath()       { return cast(bool) (_bf1 & 0x00000100); }
1133         @property bool fShowAttribCol()        { return cast(bool) (_bf1 & 0x00000200); }
1134         @property bool fMapNetDrvBtn()         { return cast(bool) (_bf1 & 0x00000400); }
1135         @property bool fShowInfoTip()          { return cast(bool) (_bf1 & 0x00000800); }
1136         @property bool fHideIcons()            { return cast(bool) (_bf1 & 0x00001000); }
1137         @property bool fWebView()              { return cast(bool) (_bf1 & 0x00002000); }
1138         @property bool fFilter()               { return cast(bool) (_bf1 & 0x00004000); }
1139         @property bool fShowSuperHidden()      { return cast(bool) (_bf1 & 0x00008000); }
1140         @property bool fNoNetCrawling()        { return cast(bool) (_bf1 & 0x00010000); }
1141 
1142         @property bool fShowAllObjects(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFE) | f);         return f; }
1143         @property bool fShowExtensions(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFD) | (f <<  1)); return f; }
1144         @property bool fNoConfirmRecycle(bool f)     { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFFB) | (f <<  2)); return f; }
1145         @property bool fShowSysFiles(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFF8) | (f <<  3)); return f; }
1146         @property bool fShowCompColor(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFEF) | (f <<  4)); return f; }
1147         @property bool fDoubleClickInWebView(bool f) { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFDF) | (f <<  5)); return f; }
1148         @property bool fDesktopHTML(bool f)          { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFFBF) | (f <<  6)); return f; }
1149         @property bool fWin95Classic(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFF8F) | (f <<  7)); return f; }
1150         @property bool fDontPrettyPath(bool f)       { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFEFF) | (f <<  8)); return f; }
1151         @property bool fShowAttribCol(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFDFF) | (f <<  9)); return f; }
1152         @property bool fMapNetDrvBtn(bool f)         { _bf1 = cast(uint) ((_bf1 & ~0xFFFFFBFF) | (f << 10)); return f; }
1153         @property bool fShowInfoTip(bool f)          { _bf1 = cast(uint) ((_bf1 & ~0xFFFFF8FF) | (f << 11)); return f; }
1154         @property bool fHideIcons(bool f)            { _bf1 = cast(uint) ((_bf1 & ~0xFFFFEFFF) | (f << 12)); return f; }
1155         @property bool fWebView(bool f)              { _bf1 = cast(uint) ((_bf1 & ~0xFFFFDFFF) | (f << 13)); return f; }
1156         @property bool fFilter(bool f)               { _bf1 = cast(uint) ((_bf1 & ~0xFFFFBFFF) | (f << 14)); return f; }
1157         @property bool fShowSuperHidden(bool f)      { _bf1 = cast(uint) ((_bf1 & ~0xFFFF8FFF) | (f << 15)); return f; }
1158         @property bool fNoNetCrawling(bool f)        { _bf1 = cast(uint) ((_bf1 & ~0xFFFEFFFF) | (f << 16)); return f; }
1159     /*
1160         BOOL fSepProcess : 1;
1161         BOOL fStartPanelOn : 1;
1162         BOOL fShowStartPage : 1;
1163         UINT fSpareFlags : 13;
1164     */
1165         @property bool fSepProcess()           { return cast(bool) (_bf2 & 0x00000001); }
1166         @property bool fStartPanelOn()         { return cast(bool) (_bf2 & 0x00000002); }
1167         @property bool fShowStartPage()        { return cast(bool) (_bf2 & 0x00000004); }
1168         @property ushort fSpareFlags()         { return cast(ushort) ((_bf2 & 0x0000FFF8) >> 3); }
1169 
1170         @property bool fSepProcess(bool f)     { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFE) | f);        return f; }
1171         @property bool fStartPanelOn(bool f)   { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFD) | (f << 1)); return f; }
1172         @property bool fShowStartPage(bool f)  { _bf2 = cast(uint) ((_bf2 & ~0xFFFFFFFB) | (f << 2)); return f; }
1173         @property ushort fSpareFlags(ushort f) {
1174             _bf2 = cast(ushort) ((_bf2 & ~0xFFFF0007) | ((f & 0x1FFF) << 3));
1175             return cast(ushort) (f & 0x1FFF);
1176         }
1177     }
1178     alias SHELLSTATE* LPSHELLSTATE;
1179 }
1180 
1181 static if (_WIN32_IE >= 0x500) {
1182     align(8) {
1183         struct SHDRAGIMAGE {
1184             SIZE sizeDragImage;
1185             POINT ptOffset;
1186             HBITMAP hbmpDragImage;
1187             COLORREF crColorKey;
1188         }
1189         alias SHDRAGIMAGE* LPSHDRAGIMAGE;
1190     }
1191 
1192     interface IDragSourceHelper : IUnknown {
1193         HRESULT InitializeFromBitmap(LPSHDRAGIMAGE pshdi, IDataObject pDataObject);
1194         HRESULT InitializeFromWindow(HWND hwnd, POINT* ppt, IDataObject pDataObject);
1195     }
1196 
1197     interface IDropTargetHelper : IUnknown {
1198         HRESULT DragEnter(HWND hwndTarget, IDataObject pDataObject, POINT* ppt, DWORD dwEffect);
1199         HRESULT DragLeave();
1200         HRESULT DragOver(POINT* ppt, DWORD dwEffect);
1201         HRESULT Drop(IDataObject pDataObject, POINT* ppt, DWORD dwEffect);
1202         HRESULT Show(BOOL fShow);
1203     }
1204 }
1205 
1206 extern (Windows):
1207 void SHAddToRecentDocs(UINT, PCVOID);
1208 LPITEMIDLIST SHBrowseForFolderA(PBROWSEINFOA);
1209 LPITEMIDLIST SHBrowseForFolderW(PBROWSEINFOW);
1210 void SHChangeNotify(LONG, UINT, PCVOID, PCVOID);
1211 HRESULT SHGetDataFromIDListA(LPSHELLFOLDER, LPCITEMIDLIST, int, PVOID, int);
1212 HRESULT SHGetDataFromIDListW(LPSHELLFOLDER, LPCITEMIDLIST, int, PVOID, int);
1213 HRESULT SHGetDesktopFolder(LPSHELLFOLDER*);
1214 HRESULT SHGetInstanceExplorer(IUnknown*);
1215 HRESULT SHGetMalloc(LPMALLOC*);
1216 BOOL SHGetPathFromIDListA(LPCITEMIDLIST, LPSTR);
1217 BOOL SHGetPathFromIDListW(LPCITEMIDLIST, LPWSTR);
1218 HRESULT SHGetSpecialFolderLocation(HWND, int, LPITEMIDLIST*);
1219 HRESULT SHLoadInProc(REFCLSID);
1220 
1221 static if (_WIN32_IE >= 0x400) {
1222     BOOL SHGetSpecialFolderPathA(HWND, LPSTR, int, BOOL);
1223     BOOL SHGetSpecialFolderPathW(HWND, LPWSTR, int, BOOL);
1224 }
1225 
1226 /* SHGetFolderPath in shfolder.dll on W9x, NT4, also in shell32.dll on W2K */
1227 HRESULT SHGetFolderPathA(HWND, int, HANDLE, DWORD, LPSTR);
1228 HRESULT SHGetFolderPathW(HWND, int, HANDLE, DWORD, LPWSTR);
1229 
1230 static if (_WIN32_WINNT >= 0x500) {
1231     INT SHGetIconOverlayIndexW(LPCWSTR pszIconPath, int iIconIndex);
1232     INT SHGetIconOverlayIndexA(LPCSTR pszIconPath, int iIconIndex);
1233     HRESULT SHGetFolderLocation(HWND, int, HANDLE, DWORD, LPITEMIDLIST*);
1234     INT SHCreateDirectoryExA(HWND, LPCSTR, LPSECURITY_ATTRIBUTES);
1235     INT SHCreateDirectoryExW(HWND, LPCWSTR, LPSECURITY_ATTRIBUTES);
1236     HRESULT SHBindToParent(LPCITEMIDLIST, REFIID, VOID**, LPCITEMIDLIST*);
1237 }
1238 
1239 static if (_WIN32_WINNT >= 0x501) {
1240     enum {
1241         PRF_VERIFYEXISTS         = 0x0001,
1242         PRF_TRYPROGRAMEXTENSIONS = (0x0002 | PRF_VERIFYEXISTS),
1243         PRF_FIRSTDIRDEF          = 0x0004,
1244         PRF_DONTFINDLNK          = 0x0008,
1245         IDO_SHGIOI_SHARE         = 0x0FFFFFFF,
1246         IDO_SHGIOI_LINK          = 0x0FFFFFFE,
1247         IDO_SHGIOI_SLOWFILE      = 0x0FFFFFFD,
1248         IDO_SHGIOI_DEFAULT       = 0x0FFFFFFC
1249     }
1250 
1251     struct SHDESCRIPTIONID {
1252         DWORD dwDescriptionId;
1253         CLSID clsid;
1254     }
1255     alias SHDESCRIPTIONID* LPSHDESCRIPTIONID;
1256 
1257     BOOL PathResolve(LPWSTR, LPCWSTR*, UINT);
1258     HRESULT SHGetFolderPathAndSubDirA(HWND, int, HANDLE, DWORD, LPCSTR, LPSTR);
1259     HRESULT SHGetFolderPathAndSubDirW(HWND, int, HANDLE, DWORD, LPCWSTR, LPWSTR);
1260     HRESULT SHParseDisplayName(LPCWSTR, IBindCtx, LPITEMIDLIST, SFGAOF, SFGAOF*);
1261 }
1262 
1263 void SHGetSettings(LPSHELLFLAGSTATE, DWORD);
1264 
1265 static if (_WIN32_WINNT >= 0x500) {
1266     void SHGetSetSettings(LPSHELLSTATE, DWORD, BOOL);
1267     BOOL ILIsEqual(LPCITEMIDLIST, LPCITEMIDLIST);
1268     BOOL ILIsParent(LPCITEMIDLIST, LPCITEMIDLIST, BOOL);
1269     BOOL ILRemoveLastID(LPITEMIDLIST);
1270     HRESULT ILLoadFromStream(IStream, LPITEMIDLIST*);
1271     HRESULT ILSaveToStream(IStream, LPCITEMIDLIST);
1272     LPITEMIDLIST ILAppendID(LPITEMIDLIST, LPCSHITEMID, BOOL);
1273     LPITEMIDLIST ILClone(LPCITEMIDLIST);
1274     LPITEMIDLIST ILCloneFirst(LPCITEMIDLIST);
1275     LPITEMIDLIST ILCombine(LPCITEMIDLIST, LPCITEMIDLIST);
1276     LPITEMIDLIST ILFindChild(LPCITEMIDLIST, LPCITEMIDLIST);
1277     LPITEMIDLIST ILFindLastID(LPCITEMIDLIST);
1278     LPITEMIDLIST ILGetNext(LPCITEMIDLIST);
1279     UINT ILGetSize(LPCITEMIDLIST);
1280     void ILFree(LPITEMIDLIST);
1281 
1282     HRESULT SHCoCreateInstance(LPCWSTR, REFCLSID, IUnknown, REFIID, void**);
1283 }
1284 
1285 version (Unicode) {
1286     alias IShellExecuteHookW IShellExecuteHook;
1287     alias IShellLinkW IShellLink;
1288     alias BROWSEINFOW BROWSEINFO;
1289     alias SHBrowseForFolderW SHBrowseForFolder;
1290     alias SHGetDataFromIDListW SHGetDataFromIDList;
1291     alias SHGetPathFromIDListW SHGetPathFromIDList;
1292     static if (_WIN32_IE >= 0x400) {
1293         alias SHGetSpecialFolderPathW SHGetSpecialFolderPath;
1294     }
1295     alias SHGetFolderPathW SHGetFolderPath;
1296     static if (_WIN32_WINNT >= 0x500) {
1297         alias SHGetIconOverlayIndexW SHGetIconOverlayIndex;
1298         alias SHCreateDirectoryExW SHCreateDirectoryEx;
1299     }
1300     static if (_WIN32_WINNT >= 0x501) {
1301         alias SHGetFolderPathAndSubDirW SHGetFolderPathAndSubDir;
1302     }
1303     alias FILEDESCRIPTORW FILEDESCRIPTOR;
1304     alias LPFILEDESCRIPTORW LPFILEDESCRIPTOR;
1305     alias FILEGROUPDESCRIPTORW FILEGROUPDESCRIPTOR;
1306     alias LPFILEGROUPDESCRIPTORW LPFILEGROUPDESCRIPTOR;
1307 
1308 } else {
1309     alias IShellExecuteHookA IShellExecuteHook;
1310     alias IShellLinkA IShellLink;
1311     alias BROWSEINFOA BROWSEINFO;
1312     alias SHBrowseForFolderA SHBrowseForFolder;
1313     alias SHGetDataFromIDListA SHGetDataFromIDList;
1314     alias SHGetPathFromIDListA SHGetPathFromIDList;
1315     static if (_WIN32_IE >= 0x400) {
1316         alias SHGetSpecialFolderPathA SHGetSpecialFolderPath;
1317     }
1318     alias SHGetFolderPathA SHGetFolderPath;
1319     static if (_WIN32_WINNT >= 0x500) {
1320         alias SHGetIconOverlayIndexA SHGetIconOverlayIndex;
1321         alias SHCreateDirectoryExA SHCreateDirectoryEx;
1322     }
1323     static if (_WIN32_WINNT >= 0x501) {
1324         alias SHGetFolderPathAndSubDirA SHGetFolderPathAndSubDir;
1325     }
1326     alias FILEDESCRIPTORA FILEDESCRIPTOR;
1327     alias LPFILEDESCRIPTORA LPFILEDESCRIPTOR;
1328     alias FILEGROUPDESCRIPTORA FILEGROUPDESCRIPTOR;
1329     alias LPFILEGROUPDESCRIPTORA LPFILEGROUPDESCRIPTOR;
1330 }
1331 alias BROWSEINFO* PBROWSEINFO, LPBROWSEINFO;
1332 
1333 static if (_WIN32_WINNT >= 0x501) {
1334     interface IFolderView : IUnknown {
1335        HRESULT GetAutoArrange();
1336        HRESULT GetCurrentViewMode(UINT);
1337        HRESULT GetDefaultSpacing(POINT*);
1338        HRESULT GetFocusedItem(int*);
1339        HRESULT GetFolder(REFIID, PVOID*);
1340        HRESULT GetItemPosition(LPCITEMIDLIST, POINT*);
1341        HRESULT GetSelectionMarkedItem(int*);
1342        HRESULT GetSpacing(POINT*);
1343        HRESULT Item(int, LPITEMIDLIST*);
1344        HRESULT ItemCount(UINT, int*);
1345        HRESULT Items(UINT, REFIID, PVOID*);
1346        HRESULT SelectAndPositionItems(UINT, LPCITEMIDLIST*, POINT*, DWORD);
1347        HRESULT SelectItem(int, DWORD);
1348        HRESULT SetCurrentViewMode(UINT);
1349     }
1350     alias IFolderView LPFOLDERVIEW;
1351 }