#ifndef _SHLOBJ_H
#define _SHLOBJ_H

/* Windows Shell object definitions */

#ifndef _WINRESRC_H
#ifndef _WIN32_IE
#define _WIN32_IE  0x0501
#else
#if (_WIN32_IE < 0x0400) && defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0500)
#error _WIN32_IE setting conflicts with _WIN32_WINNT setting
#endif
#endif
#endif

#ifndef SNDMSG
#ifdef __cplusplus
#define SNDMSG ::SendMessage
#else
#define SNDMSG SendMessage
#endif
#endif /* SNDMSG */

#ifndef WINSHELLAPI
#define WINSHELLAPI  DECLSPEC_IMPORT
#endif

#ifndef SHSTDAPI
#define SHSTDAPI  EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
#define SHSTDAPI_(type)  EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
#endif

#ifndef SHDOCAPI
#define SHDOCAPI  EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
#define SHDOCAPI_(type)  EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
#endif

#ifndef SHSTDDOCAPI
#define SHSTDDOCAPI  EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
#define SHSTDDOCAPI_(type)  EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
#endif

#ifndef BROWSEUIAPI
#define BROWSEUIAPI  EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
#define BROWSEUIAPI_(type)  EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
#endif

#ifndef SHFOLDERAPI
#define SHFOLDERAPI  EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
#endif

#include <ole2.h>
#ifndef _PRSHT_H
#include <prsht.h>
#endif
#ifndef _COMMCTRL_H
#include <commctrl.h>
#endif

#ifndef INITGUID
#include <shlguid.h>
#endif

#include <pshpack1.h>

#ifdef __cplusplus
extern "C" {
#endif

#if __POCC__ >= 290
#pragma warn(push)
#pragma warn(disable:2198)  /* Nameless field is not standard */
#endif

#include <shtypes.h>
#include <shobjidl.h>

SHSTDAPI SHGetMalloc(LPMALLOC *);
SHSTDAPI_(void *) SHAlloc(SIZE_T);
SHSTDAPI_(void) SHFree(void*);

#define CMF_NORMAL  0x00000000
#define CMF_DEFAULTONLY  0x00000001
#define CMF_VERBSONLY  0x00000002
#define CMF_EXPLORE  0x00000004
#define CMF_NOVERBS  0x00000008
#define CMF_CANRENAME  0x00000010
#define CMF_NODEFAULT  0x00000020
#define CMF_INCLUDESTATIC  0x00000040
#define CMF_EXTENDEDVERBS  0x00000100
#define CMF_RESERVED  0xffff0000

#define GCS_VERBA  0x00000000
#define GCS_HELPTEXTA  0x00000001
#define GCS_VALIDATEA  0x00000002
#define GCS_VERBW  0x00000004
#define GCS_HELPTEXTW  0x00000005
#define GCS_VALIDATEW  0x00000006
#define GCS_UNICODE  0x00000004

#ifdef UNICODE
#define GCS_VERB  GCS_VERBW
#define GCS_HELPTEXT  GCS_HELPTEXTW
#define GCS_VALIDATE  GCS_VALIDATEW
#else
#define GCS_VERB  GCS_VERBA
#define GCS_HELPTEXT  GCS_HELPTEXTA
#define GCS_VALIDATE  GCS_VALIDATEA
#endif

#define CMDSTR_NEWFOLDERA  "NewFolder"
#define CMDSTR_VIEWLISTA  "ViewList"
#define CMDSTR_VIEWDETAILSA  "ViewDetails"
#define CMDSTR_NEWFOLDERW  L"NewFolder"
#define CMDSTR_VIEWLISTW  L"ViewList"
#define CMDSTR_VIEWDETAILSW  L"ViewDetails"

#ifdef UNICODE
#define CMDSTR_NEWFOLDER  CMDSTR_NEWFOLDERW
#define CMDSTR_VIEWLIST  CMDSTR_VIEWLISTW
#define CMDSTR_VIEWDETAILS  CMDSTR_VIEWDETAILSW
#else
#define CMDSTR_NEWFOLDER  CMDSTR_NEWFOLDERA
#define CMDSTR_VIEWLIST  CMDSTR_VIEWLISTA
#define CMDSTR_VIEWDETAILS  CMDSTR_VIEWDETAILSA
#endif

#define CMIC_MASK_HOTKEY  SEE_MASK_HOTKEY
#define CMIC_MASK_ICON  SEE_MASK_ICON
#define CMIC_MASK_FLAG_NO_UI  SEE_MASK_FLAG_NO_UI
#define CMIC_MASK_UNICODE  SEE_MASK_UNICODE
#define CMIC_MASK_NO_CONSOLE  SEE_MASK_NO_CONSOLE
#define CMIC_MASK_HASLINKNAME  SEE_MASK_HASLINKNAME
#define CMIC_MASK_FLAG_SEP_VDM  SEE_MASK_FLAG_SEPVDM
#define CMIC_MASK_HASTITLE  SEE_MASK_HASTITLE
#define CMIC_MASK_ASYNCOK  SEE_MASK_ASYNCOK
#define CMIC_MASK_NOZONECHECKS  SEE_MASK_NOZONECHECKS

#if (_WIN32_IE >= 0x0501)
#define CMIC_MASK_SHIFT_DOWN  0x10000000
#define CMIC_MASK_CONTROL_DOWN  0x40000000
#endif
#if (_WIN32_IE >= 0x0560)
#define CMIC_MASK_FLAG_LOG_USAGE  SEE_MASK_FLAG_LOG_USAGE
#endif

#if (_WIN32_IE >= 0x0400)
#define CMIC_MASK_PTINVOKE  0x20000000
#endif

#define GIL_OPENICON  0x0001
#define GIL_FORSHELL  0x0002
#define GIL_ASYNC  0x0020
#define GIL_DEFAULTICON  0x0040
#define GIL_FORSHORTCUT  0x0080

#define GIL_SIMULATEDOC  0x0001
#define GIL_PERINSTANCE  0x0002
#define GIL_PERCLASS  0x0004
#define GIL_NOTFILENAME  0x0008
#define GIL_DONTCACHE  0x0010

#define ISIOI_ICONFILE  0x00000001
#define ISIOI_ICONINDEX  0x00000002

#define SIOM_OVERLAYINDEX  1
#define SIOM_ICONINDEX  2

#define SIOM_RESERVED_SHARED  0
#define SIOM_RESERVED_LINK  1
#define SIOM_RESERVED_SLOWFILE  2

#define OI_ASYNC 0xFFFFEEEE

#define IDO_SHGIOI_SHARE  0x0FFFFFFF
#define IDO_SHGIOI_LINK   0x0FFFFFFE
#define IDO_SHGIOI_SLOWFILE 0x0FFFFFFFD

#include <pshpack8.h>
typedef struct _CMINVOKECOMMANDINFO {
    DWORD cbSize;
    DWORD fMask;
    HWND hwnd;
    LPCSTR lpVerb;
    LPCSTR lpParameters;
    LPCSTR lpDirectory;
    int nShow;
    DWORD dwHotKey;
    HANDLE hIcon;
} CMINVOKECOMMANDINFO, *LPCMINVOKECOMMANDINFO;

typedef struct _CMInvokeCommandInfoEx {
    DWORD cbSize;
    DWORD fMask;
    HWND hwnd;
    LPCSTR lpVerb;
    LPCSTR lpParameters;
    LPCSTR lpDirectory;
    int nShow;
    DWORD dwHotKey;
    HANDLE hIcon;
    LPCSTR lpTitle;
    LPCWSTR lpVerbW;
    LPCWSTR lpParametersW;
    LPCWSTR lpDirectoryW;
    LPCWSTR lpTitleW;
#if (_WIN32_IE >= 0x0400)
    POINT ptInvoke;
#endif
} CMINVOKECOMMANDINFOEX, *LPCMINVOKECOMMANDINFOEX;
#include <poppack.h>

#undef INTERFACE
#define INTERFACE IContextMenu
DECLARE_INTERFACE_(IContextMenu, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE;
    STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE;
    STDMETHOD(GetCommandString)(THIS_ UINT_PTR idCmd, UINT uType, UINT * pwReserved, LPSTR pszName, UINT cchMax) PURE;
};

typedef IContextMenu *LPCONTEXTMENU;

#undef INTERFACE
#define INTERFACE IContextMenu2
DECLARE_INTERFACE_(IContextMenu2, IContextMenu) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE;
    STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE;
    STDMETHOD(GetCommandString)(THIS_ UINT_PTR idCmd, UINT uType, UINT * pwReserved, LPSTR pszName, UINT cchMax) PURE;
    STDMETHOD(HandleMenuMsg)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE;
};

typedef IContextMenu2 *LPCONTEXTMENU2;

#undef INTERFACE
#define INTERFACE IContextMenu3
DECLARE_INTERFACE_(IContextMenu3, IContextMenu2) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(QueryContextMenu)(THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) PURE;
    STDMETHOD(InvokeCommand)(THIS_ LPCMINVOKECOMMANDINFO lpici) PURE;
    STDMETHOD(GetCommandString)(THIS_ UINT_PTR idCmd, UINT uType, UINT * pwReserved, LPSTR pszName, UINT cchMax) PURE;
    STDMETHOD(HandleMenuMsg)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE;
    STDMETHOD(HandleMenuMsg2)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT * plResult) PURE;
};

typedef IContextMenu3 *LPCONTEXTMENU3;

#if (_WIN32_IE >= 0x0500)

#define CSIDL_FLAG_PFTI_TRACKTARGET  CSIDL_FLAG_DONT_VERIFY

#include <pshpack8.h>
typedef struct {
    LPITEMIDLIST pidlTargetFolder;
    WCHAR szTargetParsingName[MAX_PATH];
    WCHAR szNetworkProvider[MAX_PATH];
    DWORD dwAttributes;
    int csidl;
} PERSIST_FOLDER_TARGET_INFO;
#include <poppack.h>

#undef INTERFACE
#define INTERFACE IPersistFolder3
DECLARE_INTERFACE_(IPersistFolder3, IPersistFolder2) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetClassID)(THIS_ LPCLSID lpClassID) PURE;
    STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST pidl) PURE;
    STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST * ppidl) PURE;
    STDMETHOD(InitializeEx)(THIS_ IBindCtx * pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO * ppfti) PURE;
    STDMETHOD(GetFolderTargetInfo)(THIS_ PERSIST_FOLDER_TARGET_INFO * ppfti) PURE;
};

#endif /* _WIN32_IE >= 0x0500 */

#undef INTERFACE
#define INTERFACE IExtractIconA
DECLARE_INTERFACE_(IExtractIconA, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetIconLocation)(THIS_ UINT uFlags, LPSTR szIconFile, UINT cchMax, int *piIndex, UINT * pwFlags) PURE;
    STDMETHOD(Extract)(THIS_ LPCSTR pszFile, UINT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIconSize) PURE;
};
typedef IExtractIconA *LPEXTRACTICONA;

#undef INTERFACE
#define INTERFACE IExtractIconW
DECLARE_INTERFACE_(IExtractIconW, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetIconLocation)(THIS_ UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT * pwFlags) PURE;
    STDMETHOD(Extract)(THIS_ LPCWSTR pszFile, UINT nIconIndex, HICON * phiconLarge, HICON * phiconSmall, UINT nIconSize) PURE;
};
typedef IExtractIconW *LPEXTRACTICONW;

#ifdef UNICODE
#define IExtractIcon  IExtractIconW
#define IExtractIconVtbl  IExtractIconWVtbl
#define LPEXTRACTICON  LPEXTRACTICONW
#else
#define IExtractIcon  IExtractIconA
#define IExtractIconVtbl  IExtractIconAVtbl
#define LPEXTRACTICON  LPEXTRACTICONA
#endif

#undef INTERFACE
#define INTERFACE IShellIcon
DECLARE_INTERFACE_(IShellIcon, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetIconOf)(THIS_ LPCITEMIDLIST pidl, UINT flags, LPINT lpIconIndex) PURE;
};
typedef IShellIcon *LPSHELLICON;

#undef INTERFACE
#define INTERFACE IShellIconOverlayIdentifier
DECLARE_INTERFACE_(IShellIconOverlayIdentifier, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(IsMemberOf)(THIS_ LPCWSTR pwszPath, DWORD dwAttrib) PURE;
    STDMETHOD(GetOverlayInfo)(THIS_ LPWSTR pwszIconFile, int cchMax, int *pIndex, DWORD * pdwFlags) PURE;
    STDMETHOD(GetPriority)(THIS_ int *pIPriority) PURE;
};

#undef INTERFACE
#define INTERFACE IShellIconOverlayManager
DECLARE_INTERFACE_(IShellIconOverlayManager, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetFileOverlayInfo)(THIS_ LPCWSTR pwszPath, DWORD dwAttrib, int *pIndex, DWORD dwflags) PURE;
    STDMETHOD(GetReservedOverlayInfo)(THIS_ LPCWSTR pwszPath, DWORD dwAttrib, int *pIndex, DWORD dwflags, int iReservedID) PURE;
    STDMETHOD(RefreshOverlayImages)(THIS_ DWORD dwFlags) PURE;
    STDMETHOD(LoadNonloadedOverlayIdentifiers)(THIS) PURE;
    STDMETHOD(OverlayIndexFromImageIndex)(THIS_ int iImage, int *piIndex, BOOL fAdd) PURE;
};

#undef INTERFACE
#define INTERFACE IShellIconOverlay
DECLARE_INTERFACE_(IShellIconOverlay, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetOverlayIndex)(THIS_ LPCITEMIDLIST pidl, int *pIndex) PURE;
    STDMETHOD(GetOverlayIconIndex)(THIS_ LPCITEMIDLIST pidl, int *pIconIndex) PURE;
};

SHSTDAPI_(int) SHGetIconOverlayIndexA(LPCSTR pszIconPath, int iIconIndex);
SHSTDAPI_(int) SHGetIconOverlayIndexW(LPCWSTR pszIconPath, int iIconIndex);
#ifdef UNICODE
#define SHGetIconOverlayIndex  SHGetIconOverlayIndexW
#else
#define SHGetIconOverlayIndex  SHGetIconOverlayIndexA
#endif

#if (_WIN32_IE >= 0x0400)
typedef enum {
    SLDF_HAS_ID_LIST = 0x00000001,
    SLDF_HAS_LINK_INFO = 0x00000002,
    SLDF_HAS_NAME = 0x00000004,
    SLDF_HAS_RELPATH = 0x00000008,
    SLDF_HAS_WORKINGDIR = 0x00000010,
    SLDF_HAS_ARGS = 0x00000020,
    SLDF_HAS_ICONLOCATION = 0x00000040,
    SLDF_UNICODE = 0x00000080,
    SLDF_FORCE_NO_LINKINFO = 0x00000100,
    SLDF_HAS_EXP_SZ = 0x00000200,
    SLDF_RUN_IN_SEPARATE = 0x00000400,
    SLDF_HAS_LOGO3ID = 0x00000800,
    SLDF_HAS_DARWINID = 0x00001000,
    SLDF_RUNAS_USER = 0x00002000,
    SLDF_HAS_EXP_ICON_SZ = 0x00004000,
    SLDF_NO_PIDL_ALIAS = 0x00008000,
    SLDF_FORCE_UNCNAME = 0x00010000,
    SLDF_RUN_WITH_SHIMLAYER = 0x00020000,
    SLDF_RESERVED = 0x80000000,
} SHELL_LINK_DATA_FLAGS;

typedef struct tagDATABLOCKHEADER {
    DWORD cbSize;
    DWORD dwSignature;
} DATABLOCK_HEADER, *LPDATABLOCK_HEADER, *LPDBLIST;

typedef struct {
#ifdef __cplusplus
    DATABLOCK_HEADER dbh;
#else
     DATABLOCK_HEADER;
#endif
    WORD wFillAttribute;
    WORD wPopupFillAttribute;
    COORD dwScreenBufferSize;
    COORD dwWindowSize;
    COORD dwWindowOrigin;
    DWORD nFont;
    DWORD nInputBufferSize;
    COORD dwFontSize;
    UINT uFontFamily;
    UINT uFontWeight;
    WCHAR FaceName[LF_FACESIZE];
    UINT uCursorSize;
    BOOL bFullScreen;
    BOOL bQuickEdit;
    BOOL bInsertMode;
    BOOL bAutoPosition;
    UINT uHistoryBufferSize;
    UINT uNumberOfHistoryBuffers;
    BOOL bHistoryNoDup;
    COLORREF ColorTable[16];
} NT_CONSOLE_PROPS, *LPNT_CONSOLE_PROPS;

#define NT_CONSOLE_PROPS_SIG  0xA0000002

typedef struct {
#ifdef __cplusplus
    DATABLOCK_HEADER dbh;
#else
     DATABLOCK_HEADER;
#endif
    UINT uCodePage;
    } NT_FE_CONSOLE_PROPS, *LPNT_FE_CONSOLE_PROPS;

#define NT_FE_CONSOLE_PROPS_SIG  0xA0000004

#if (_WIN32_IE >= 0x0500)
typedef struct {
#ifdef __cplusplus
    DATABLOCK_HEADER dbh;
#else
     DATABLOCK_HEADER;
#endif
    CHAR szDarwinID[MAX_PATH];
    WCHAR szwDarwinID[MAX_PATH];
} EXP_DARWIN_LINK, *LPEXP_DARWIN_LINK;

#define EXP_DARWIN_ID_SIG  0xA0000006
#define EXP_LOGO3_ID_SIG  0xA0000007
#endif /* _WIN32_IE >= 0x0500 */

#define EXP_SPECIAL_FOLDER_SIG  0xA0000005

typedef struct {
    DWORD cbSize;
    DWORD dwSignature;
    DWORD idSpecialFolder;
    DWORD cbOffset;
} EXP_SPECIAL_FOLDER, *LPEXP_SPECIAL_FOLDER;

typedef struct {
    DWORD cbSize;
    DWORD dwSignature;
    CHAR szTarget[MAX_PATH];
    WCHAR swzTarget[MAX_PATH];
} EXP_SZ_LINK, *LPEXP_SZ_LINK;

#define EXP_SZ_LINK_SIG  0xA0000001
#define EXP_SZ_ICON_SIG  0xA0000007

#undef INTERFACE
#define INTERFACE IShellLinkDataList
DECLARE_INTERFACE_(IShellLinkDataList, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(AddDataBlock)(THIS_ void *pDataBlock) PURE;
    STDMETHOD(CopyDataBlock)(THIS_ DWORD dwSig, void **ppDataBlock) PURE;
    STDMETHOD(RemoveDataBlock)(THIS_ DWORD dwSig) PURE;
    STDMETHOD(GetFlags)(THIS_ DWORD * pdwFlags) PURE;
    STDMETHOD(SetFlags)(THIS_ DWORD dwFlags) PURE;
};

#endif /* _WIN32_IE >= 0x0400 */

#if (_WIN32_IE >= 0x0500)
#undef INTERFACE
#define INTERFACE IResolveShellLink
DECLARE_INTERFACE_(IResolveShellLink, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(ResolveShellLink)(THIS_ IUnknown * punk, HWND hwnd, DWORD fFlags) PURE;
};
#endif

#ifdef _SHELLAPI_H

#undef INTERFACE
#define INTERFACE IShellExecuteHookA
DECLARE_INTERFACE_(IShellExecuteHookA, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOA pei) PURE;
};

#undef INTERFACE
#define INTERFACE IShellExecuteHookW
DECLARE_INTERFACE_(IShellExecuteHookW, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Execute)(THIS_ LPSHELLEXECUTEINFOW pei) PURE;
};

#ifdef UNICODE
#define IShellExecuteHook  IShellExecuteHookW
#define IShellExecuteHookVtbl  IShellExecuteHookWVtbl
#else
#define IShellExecuteHook  IShellExecuteHookA
#define IShellExecuteHookVtbl  IShellExecuteHookAVtbl
#endif

#endif /* _SHELLAPI_H */

#undef INTERFACE
#define INTERFACE IURLSearchHook
DECLARE_INTERFACE_(IURLSearchHook, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Translate)(THIS_ LPWSTR lpwszSearchURL, DWORD cchBufferSize) PURE;
};

#undef INTERFACE
#define INTERFACE ISearchContext
DECLARE_INTERFACE_(ISearchContext, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetSearchUrl)(THIS_ BSTR * pbstrSearchUrl) PURE;
    STDMETHOD(GetSearchText)(THIS_ BSTR * pbstrSearchText) PURE;
    STDMETHOD(GetSearchStyle)(THIS_ DWORD * pdwSearchStyle) PURE;
};

#undef INTERFACE
#define INTERFACE IURLSearchHook2
DECLARE_INTERFACE_(IURLSearchHook2, IURLSearchHook) {
    STDMETHOD(TranslateWithSearchContext)(THIS_ LPWSTR lpwszSearchURL, DWORD cchBufferSize, ISearchContext * pSearchContext) PURE;
};

#undef INTERFACE
#define INTERFACE INewShortcutHookA
DECLARE_INTERFACE_(INewShortcutHookA, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(SetReferent)(THIS_ LPCSTR pcszReferent, HWND hwnd) PURE;
    STDMETHOD(GetReferent)(THIS_ LPSTR pszReferent, int cchReferent) PURE;
    STDMETHOD(SetFolder)(THIS_ LPCSTR pcszFolder) PURE;
    STDMETHOD(GetFolder)(THIS_ LPSTR pszFolder, int cchFolder) PURE;
    STDMETHOD(GetName)(THIS_ LPSTR pszName, int cchName) PURE;
    STDMETHOD(GetExtension)(THIS_ LPSTR pszExtension, int cchExtension) PURE;
};

#undef INTERFACE
#define INTERFACE INewShortcutHookW
DECLARE_INTERFACE_(INewShortcutHookW, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(SetReferent)(THIS_ LPCWSTR pcszReferent, HWND hwnd) PURE;
    STDMETHOD(GetReferent)(THIS_ LPWSTR pszReferent, int cchReferent) PURE;
    STDMETHOD(SetFolder)(THIS_ LPCWSTR pcszFolder) PURE;
    STDMETHOD(GetFolder)(THIS_ LPWSTR pszFolder, int cchFolder) PURE;
    STDMETHOD(GetName)(THIS_ LPWSTR pszName, int cchName) PURE;
    STDMETHOD(GetExtension)(THIS_ LPWSTR pszExtension, int cchExtension) PURE;
};

#ifdef UNICODE
#define INewShortcutHook  INewShortcutHookW
#define INewShortcutHookVtbl  INewShortcutHookWVtbl
#else
#define INewShortcutHook  INewShortcutHookA
#define INewShortcutHookVtbl  INewShortcutHookAVtbl
#endif

#ifndef FO_MOVE
#define FO_MOVE  0x0001
#define FO_COPY  0x0002
#define FO_DELETE  0x0003
#define FO_RENAME  0x0004

#define FOF_MULTIDESTFILES  0x0001
#define FOF_CONFIRMMOUSE  0x0002
#define FOF_SILENT  0x0004
#define FOF_RENAMEONCOLLISION  0x0008
#define FOF_NOCONFIRMATION  0x0010
#define FOF_WANTMAPPINGHANDLE  0x0020

#define FOF_ALLOWUNDO  0x0040
#define FOF_FILESONLY  0x0080
#define FOF_SIMPLEPROGRESS  0x0100
#define FOF_NOCONFIRMMKDIR  0x0200
#define FOF_NOERRORUI  0x0400
#define FOF_NOCOPYSECURITYATTRIBS  0x0800
#define FOF_NORECURSION  0x1000
#if (_WIN32_IE >= 0x500)
#define FOF_NO_CONNECTED_ELEMENTS  0x2000
#define FOF_WANTNUKEWARNING  0x4000
#endif /* _WIN32_IE >= 0x500 */
#if (_WIN32_WINNT >= 0x0501)
#define FOF_NORECURSEREPARSE  0x8000
#endif /* _WIN32_WINNT >= 0x0501 */

#define PO_DELETE  0x0013
#define PO_RENAME  0x0014
#define PO_PORTCHANGE  0x0020
#define PO_REN_PORT  0x0034

typedef WORD FILEOP_FLAGS;
typedef UINT PRINTEROP_FLAGS;

#endif /* FO_MOVE */

#undef INTERFACE
#define INTERFACE ICopyHookA
DECLARE_INTERFACE_(ICopyHookA, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD_(UINT, CopyCallback)(THIS_ HWND hwnd, UINT wFunc, UINT wFlags, LPCSTR pszSrcFile, DWORD dwSrcAttribs, LPCSTR pszDestFile, DWORD dwDestAttribs) PURE;
};
typedef ICopyHookA *LPCOPYHOOKA;

#undef INTERFACE
#define INTERFACE ICopyHookW
DECLARE_INTERFACE_(ICopyHookW, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD_(UINT, CopyCallback)(THIS_ HWND hwnd, UINT wFunc, UINT wFlags, LPCWSTR pszSrcFile, DWORD dwSrcAttribs, LPCWSTR pszDestFile, DWORD dwDestAttribs) PURE;
};
typedef ICopyHookW *LPCOPYHOOKW;

#ifdef UNICODE
#define ICopyHook  ICopyHookW
#define ICopyHookVtbl  ICopyHookWVtbl
#define LPCOPYHOOK  LPCOPYHOOKW
#else
#define ICopyHook  ICopyHookA
#define ICopyHookVtbl  ICopyHookAVtbl
#define LPCOPYHOOK  LPCOPYHOOKA
#endif

#undef INTERFACE
#define INTERFACE IFileViewerSite
DECLARE_INTERFACE_(IFileViewerSite, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(SetPinnedWindow)(THIS_ HWND hwnd) PURE;
    STDMETHOD(GetPinnedWindow)(THIS_ HWND * phwnd) PURE;
};
typedef IFileViewerSite *LPFILEVIEWERSITE;

#include <pshpack8.h>
typedef struct {
    DWORD cbSize;
    HWND hwndOwner;
    int iShow;
    DWORD dwFlags;
    RECT rect;
    IUnknown *punkRel;
    OLECHAR strNewFile[MAX_PATH];
} FVSHOWINFO, *LPFVSHOWINFO;
#include <poppack.h>

#define FVSIF_RECT  0x00000001
#define FVSIF_PINNED  0x00000002
#define FVSIF_NEWFAILED  0x08000000
#define FVSIF_NEWFILE  0x80000000
#define FVSIF_CANVIEWIT  0x40000000

#undef INTERFACE
#define INTERFACE IFileViewerA
DECLARE_INTERFACE(IFileViewerA) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(ShowInitialize)(THIS_ LPFILEVIEWERSITE lpfsi) PURE;
    STDMETHOD(Show)(THIS_ LPFVSHOWINFO pvsi) PURE;
    STDMETHOD(PrintTo)(THIS_ LPSTR pszDriver, BOOL fSuppressUI) PURE;
};
typedef IFileViewerA *LPFILEVIEWERA;

#undef INTERFACE
#define INTERFACE IFileViewerW
DECLARE_INTERFACE(IFileViewerW) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(ShowInitialize)(THIS_ LPFILEVIEWERSITE lpfsi) PURE;
    STDMETHOD(Show)(THIS_ LPFVSHOWINFO pvsi) PURE;
    STDMETHOD(PrintTo)(THIS_ LPWSTR pszDriver, BOOL fSuppressUI) PURE;
};
typedef IFileViewerW *LPFILEVIEWERW;

#ifdef UNICODE
#define IFileViewer  IFileViewerW
#define LPFILEVIEWER  LPFILEVIEWERW
#else
#define IFileViewer  IFileViewerA
#define LPFILEVIEWER  LPFILEVIEWERA
#endif

#define FCIDM_SHVIEWFIRST  0x0000
#define FCIDM_SHVIEWLAST  0x7fff
#define FCIDM_BROWSERFIRST  0xa000
#define FCIDM_BROWSERLAST  0xbf00
#define FCIDM_GLOBALFIRST  0x8000
#define FCIDM_GLOBALLAST  0x9fff

#define FCIDM_MENU_FILE  (FCIDM_GLOBALFIRST+0x0000)
#define FCIDM_MENU_EDIT  (FCIDM_GLOBALFIRST+0x0040)
#define FCIDM_MENU_VIEW  (FCIDM_GLOBALFIRST+0x0080)
#define FCIDM_MENU_VIEW_SEP_OPTIONS  (FCIDM_GLOBALFIRST+0x0081)
#define FCIDM_MENU_TOOLS  (FCIDM_GLOBALFIRST+0x00c0)
#define FCIDM_MENU_TOOLS_SEP_GOTO  (FCIDM_GLOBALFIRST+0x00c1)
#define FCIDM_MENU_HELP  (FCIDM_GLOBALFIRST+0x0100)
#define FCIDM_MENU_FIND  (FCIDM_GLOBALFIRST+0x0140)
#define FCIDM_MENU_EXPLORE  (FCIDM_GLOBALFIRST+0x0150)
#define FCIDM_MENU_FAVORITES  (FCIDM_GLOBALFIRST+0x0170)

#define FCIDM_TOOLBAR  (FCIDM_BROWSERFIRST + 0)
#define FCIDM_STATUS  (FCIDM_BROWSERFIRST + 1)

#if (_WIN32_IE >= 0x0400)
#define IDC_OFFLINE_HAND  103
#endif

#define PANE_NONE  -1
#define PANE_ZONE  1
#define PANE_OFFLINE  2
#define PANE_PRINTER  3
#define PANE_SSL  4
#define PANE_NAVIGATION  5
#define PANE_PROGRESS  6
#define PANE_PRIVACY  7

#define CDBOSC_SETFOCUS  0x00000000
#define CDBOSC_KILLFOCUS  0x00000001
#define CDBOSC_SELCHANGE  0x00000002
#define CDBOSC_RENAME  0x00000003
#define CDBOSC_STATECHANGE  0x00000004

#undef INTERFACE
#define INTERFACE ICommDlgBrowser
DECLARE_INTERFACE_(ICommDlgBrowser, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(OnDefaultCommand)(THIS_ struct IShellView * ppshv) PURE;
    STDMETHOD(OnStateChange)(THIS_ struct IShellView * ppshv, ULONG uChange) PURE;
    STDMETHOD(IncludeObject)(THIS_ struct IShellView * ppshv, LPCITEMIDLIST pidl) PURE;
};
typedef ICommDlgBrowser *LPCOMMDLGBROWSER;

#define CDB2N_CONTEXTMENU_DONE  0x00000001
#define CDB2N_CONTEXTMENU_START  0x00000002

#define CDB2GVF_SHOWALLFILES  0x00000001

#undef INTERFACE
#define INTERFACE ICommDlgBrowser2
DECLARE_INTERFACE_(ICommDlgBrowser2, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(OnDefaultCommand)(THIS_ struct IShellView * ppshv) PURE;
    STDMETHOD(OnStateChange)(THIS_ struct IShellView * ppshv, ULONG uChange) PURE;
    STDMETHOD(IncludeObject)(THIS_ struct IShellView * ppshv, LPCITEMIDLIST pidl) PURE;
    STDMETHOD(Notify)(THIS_ struct IShellView * ppshv, DWORD dwNotifyType) PURE;
    STDMETHOD(GetDefaultMenuText)(THIS_ struct IShellView * ppshv, WCHAR * pszText, INT cchMax) PURE;
    STDMETHOD(GetViewFlags)(THIS_ DWORD * pdwFlags) PURE;
};
typedef ICommDlgBrowser2 *LPCOMMDLGBROWSER2;

SHSTDAPI_(BOOL) SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath);
SHSTDAPI_(BOOL) SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath);
#ifdef UNICODE
#define SHGetPathFromIDList  SHGetPathFromIDListW
#else
#define SHGetPathFromIDList  SHGetPathFromIDListA
#endif

SHSTDAPI_(int) SHCreateDirectory(HWND hwnd, LPCWSTR pszPath);
SHSTDAPI_(int) SHCreateDirectoryExA(HWND hwnd, LPCSTR pszPath, SECURITY_ATTRIBUTES * psa);
SHSTDAPI_(int) SHCreateDirectoryExW(HWND hwnd, LPCWSTR pszPath, SECURITY_ATTRIBUTES * psa);
#ifdef UNICODE
#define SHCreateDirectoryEx  SHCreateDirectoryExW
#else
#define SHCreateDirectoryEx  SHCreateDirectoryExA
#endif

SHSTDAPI SHOpenFolderAndSelectItems(LPCITEMIDLIST pidlFolder, UINT cidl, LPCITEMIDLIST * apidl, DWORD dwFlags);
SHSTDAPI SHCreateShellItem(LPCITEMIDLIST pidlParent, IShellFolder * psfParent, LPCITEMIDLIST pidl, IShellItem ** ppsi);

#define REGSTR_PATH_SPECIAL_FOLDERS  REGSTR_PATH_EXPLORER TEXT("\\Shell Folders")

#define CSIDL_DESKTOP  0x0000
#define CSIDL_INTERNET  0x0001
#define CSIDL_PROGRAMS  0x0002
#define CSIDL_CONTROLS  0x0003
#define CSIDL_PRINTERS  0x0004
#define CSIDL_PERSONAL  0x0005
#define CSIDL_FAVORITES  0x0006
#define CSIDL_STARTUP  0x0007
#define CSIDL_RECENT  0x0008
#define CSIDL_SENDTO  0x0009
#define CSIDL_BITBUCKET  0x000A
#define CSIDL_STARTMENU  0x000B
#define CSIDL_MYDOCUMENTS  0x000C
#define CSIDL_MYMUSIC  0x000D
#define CSIDL_MYVIDEO  0x000E
#define CSIDL_DESKTOPDIRECTORY  0x0010
#define CSIDL_DRIVES  0x0011
#define CSIDL_NETWORK  0x0012
#define CSIDL_NETHOOD  0x0013
#define CSIDL_FONTS  0x0014
#define CSIDL_TEMPLATES  0x0015
#define CSIDL_COMMON_STARTMENU  0x0016
#define CSIDL_COMMON_PROGRAMS  0X0017
#define CSIDL_COMMON_STARTUP  0x0018
#define CSIDL_COMMON_DESKTOPDIRECTORY  0x0019
#define CSIDL_APPDATA  0x001A
#define CSIDL_PRINTHOOD  0x001B
#ifndef CSIDL_LOCAL_APPDATA
#define CSIDL_LOCAL_APPDATA  0x001C
#endif
#define CSIDL_ALTSTARTUP  0x001D
#define CSIDL_COMMON_ALTSTARTUP  0x001E
#define CSIDL_COMMON_FAVORITES  0x001F
#ifndef _SHFOLDER_H
#define CSIDL_INTERNET_CACHE  0x0020
#define CSIDL_COOKIES  0x0021
#define CSIDL_HISTORY  0x0022
#define CSIDL_COMMON_APPDATA  0x0023
#define CSIDL_WINDOWS  0x0024
#define CSIDL_SYSTEM  0x0025
#define CSIDL_PROGRAM_FILES  0x0026
#define CSIDL_MYPICTURES  0x0027
#endif /* _SHFOLDER_H */
#define CSIDL_PROFILE  0x0028
#define CSIDL_SYSTEMX86  0x0029
#define CSIDL_PROGRAM_FILESX86  0x002A
#ifndef _SHFOLDER_H
#define CSIDL_PROGRAM_FILES_COMMON  0x002B
#endif /* _SHFOLDER_H */
#define CSIDL_PROGRAM_FILES_COMMONX86  0x002C
#define CSIDL_COMMON_TEMPLATES  0x002D
#ifndef _SHFOLDER_H
#define CSIDL_COMMON_DOCUMENTS  0x002E
#define CSIDL_COMMON_ADMINTOOLS  0x002F
#define CSIDL_ADMINTOOLS  0x0030
#endif /* _SHFOLDER_H */
#define CSIDL_CONNECTIONS  0x0031
#define CSIDL_COMMON_MUSIC  0x0035
#define CSIDL_COMMON_PICTURES  0x0036
#define CSIDL_COMMON_VIDEO  0x0037
#define CSIDL_RESOURCES  0x0038
#ifndef _SHFOLDER_H
#define CSIDL_RESOURCES_LOCALIZED  0x0039
#endif /* _SHFOLDER_H */
#define CSIDL_COMMON_OEM_LINKS  0x003A
#define CSIDL_CDBURN_AREA  0x003B
#define CSIDL_COMPUTERSNEARME  0x003D
#ifndef _SHFOLDER_H
#define CSIDL_FLAG_CREATE  0x8000
#endif /* _SHFOLDER_H */
#define CSIDL_FLAG_DONT_VERIFY  0x4000
#define CSIDL_FLAG_NO_ALIAS  0x1000
#define CSIDL_FLAG_PER_USER_INIT  0x0800
#define CSIDL_FLAG_MASK  0xFF00

SHSTDAPI SHGetSpecialFolderLocation(HWND hwnd, int csidl, LPITEMIDLIST * ppidl);

#if (_WIN32_IE >= 0x0400)
SHSTDAPI_(void) SHFlushSFCache(void);
SHSTDAPI_(LPITEMIDLIST) SHCloneSpecialIDList(HWND hwnd, int csidl, BOOL fCreate);
SHSTDAPI_(BOOL) SHGetSpecialFolderPathA(HWND hwnd, LPSTR pszPath, int csidl, BOOL fCreate);
SHSTDAPI_(BOOL) SHGetSpecialFolderPathW(HWND hwnd, LPWSTR pszPath, int csidl, BOOL fCreate);
#ifdef UNICODE
#define SHGetSpecialFolderPath  SHGetSpecialFolderPathW
#else
#define SHGetSpecialFolderPath  SHGetSpecialFolderPathA
#endif

#if (_WIN32_IE >= 0x0500)
typedef enum {
    SHGFP_TYPE_CURRENT = 0,
    SHGFP_TYPE_DEFAULT = 1,
} SHGFP_TYPE;

SHFOLDERAPI SHGetFolderPathA(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPSTR pszPath);
SHFOLDERAPI SHGetFolderPathW(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath);
#ifdef UNICODE
#define SHGetFolderPath  SHGetFolderPathW
#else
#define SHGetFolderPath  SHGetFolderPathA
#endif
SHSTDAPI SHGetFolderLocation(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPITEMIDLIST * ppidl);

SHFOLDERAPI SHGetFolderPathAndSubDirA(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPCSTR pszSubDir, LPSTR pszPath);
SHFOLDERAPI SHGetFolderPathAndSubDirW(HWND hwnd, int csidl, HANDLE hToken, DWORD dwFlags, LPCWSTR pszSubDir, LPWSTR pszPath);
#ifdef UNICODE
#define SHGetFolderPathAndSubDir  SHGetFolderPathAndSubDirW
#else
#define SHGetFolderPathAndSubDir  SHGetFolderPathAndSubDirA
#endif

#endif /* _WIN32_IE >= 0x0500 */
#endif /* _WIN32_IE >= 0x0400 */

#if (_WIN32_IE >= 0x0500)

#define FCS_READ  0x00000001
#define FCS_FORCEWRITE  0x00000002
#define FCS_WRITE  (FCS_READ|FCS_FORCEWRITE)

#define FCS_FLAG_DRAGDROP  2

#define FCSM_VIEWID  0x00000001
#define FCSM_WEBVIEWTEMPLATE  0x00000002
#define FCSM_INFOTIP  0x00000004
#define FCSM_CLSID  0x00000008
#define FCSM_ICONFILE  0x00000010
#define FCSM_LOGO  0x00000020
#define FCSM_FLAGS  0x00000040

#include <pshpack8.h>
typedef struct {
    DWORD dwSize;
    DWORD dwMask;
    SHELLVIEWID *pvid;
    LPSTR pszWebViewTemplate;
    DWORD cchWebViewTemplate;
    LPSTR pszWebViewTemplateVersion;
    LPSTR pszInfoTip;
    DWORD cchInfoTip;
    CLSID *pclsid;
    DWORD dwFlags;
    LPSTR pszIconFile;
    DWORD cchIconFile;
    int iIconIndex;
    LPSTR pszLogo;
    DWORD cchLogo;
} SHFOLDERCUSTOMSETTINGSA, *LPSHFOLDERCUSTOMSETTINGSA;

typedef struct {
    DWORD dwSize;
    DWORD dwMask;
    SHELLVIEWID *pvid;
    LPWSTR pszWebViewTemplate;
    DWORD cchWebViewTemplate;
    LPWSTR pszWebViewTemplateVersion;
    LPWSTR pszInfoTip;
    DWORD cchInfoTip;
    CLSID *pclsid;
    DWORD dwFlags;
    LPWSTR pszIconFile;
    DWORD cchIconFile;
    int iIconIndex;
    LPWSTR pszLogo;
    DWORD cchLogo;
} SHFOLDERCUSTOMSETTINGSW, *LPSHFOLDERCUSTOMSETTINGSW;
#include <poppack.h>

SHSTDAPI SHGetSetFolderCustomSettingsA(LPSHFOLDERCUSTOMSETTINGSA pfcs, LPCSTR pszPath, DWORD dwReadWrite);
SHSTDAPI SHGetSetFolderCustomSettingsW(LPSHFOLDERCUSTOMSETTINGSW pfcs, LPCWSTR pszPath, DWORD dwReadWrite);

#ifdef UNICODE
#define SHFOLDERCUSTOMSETTINGS  SHFOLDERCUSTOMSETTINGSW
#define SHGetSetFolderCustomSettings  SHGetSetFolderCustomSettingsW
#define LPSHFOLDERCUSTOMSETTINGS  LPSHFOLDERCUSTOMSETTINGSW
#else
#define SHFOLDERCUSTOMSETTINGS  SHFOLDERCUSTOMSETTINGSA
#define SHGetSetFolderCustomSettings  SHGetSetFolderCustomSettingsA
#define LPSHFOLDERCUSTOMSETTINGS  LPSHFOLDERCUSTOMSETTINGSA
#endif

#endif /* _WIN32_IE >= 0x0500 */

typedef int (CALLBACK * BFFCALLBACK)(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData);

#include <pshpack8.h>
typedef struct _browseinfoA {
    HWND hwndOwner;
    LPCITEMIDLIST pidlRoot;
    LPSTR pszDisplayName;
    LPCSTR lpszTitle;
    UINT ulFlags;
    BFFCALLBACK lpfn;
    LPARAM lParam;
    int iImage;
} BROWSEINFOA, *PBROWSEINFOA, *LPBROWSEINFOA;

typedef struct _browseinfoW {
    HWND hwndOwner;
    LPCITEMIDLIST pidlRoot;
    LPWSTR pszDisplayName;
    LPCWSTR lpszTitle;
    UINT ulFlags;
    BFFCALLBACK lpfn;
    LPARAM lParam;
    int iImage;
} BROWSEINFOW, *PBROWSEINFOW, *LPBROWSEINFOW;
#include <poppack.h>

#ifdef UNICODE
#define BROWSEINFO  BROWSEINFOW
#define PBROWSEINFO  PBROWSEINFOW
#define LPBROWSEINFO  LPBROWSEINFOW
#else
#define BROWSEINFO  BROWSEINFOA
#define PBROWSEINFO  PBROWSEINFOA
#define LPBROWSEINFO  LPBROWSEINFOA
#endif

#define BIF_RETURNONLYFSDIRS  0x0001
#define BIF_DONTGOBELOWDOMAIN  0x0002
#define BIF_STATUSTEXT  0x0004
#define BIF_RETURNFSANCESTORS  0x0008
#define BIF_EDITBOX  0x0010
#define BIF_VALIDATE  0x0020
#define BIF_NEWDIALOGSTYLE  0x0040
#define BIF_USENEWUI  (BIF_NEWDIALOGSTYLE|BIF_EDITBOX)
#define BIF_BROWSEINCLUDEURLS  0x0080
#define BIF_UAHINT  0x0100
#define BIF_NONEWFOLDERBUTTON  0x0200
#define BIF_NOTRANSLATETARGETS  0x0400
#define BIF_BROWSEFORCOMPUTER  0x1000
#define BIF_BROWSEFORPRINTER  0x2000
#define BIF_BROWSEINCLUDEFILES  0x4000
#define BIF_SHAREABLE  0x8000

#define BFFM_INITIALIZED  1
#define BFFM_SELCHANGED  2
#define BFFM_VALIDATEFAILEDA  3
#define BFFM_VALIDATEFAILEDW  4
#define BFFM_IUNKNOWN  5

#define BFFM_SETSTATUSTEXTA  (WM_USER + 100)
#define BFFM_ENABLEOK  (WM_USER + 101)
#define BFFM_SETSELECTIONA  (WM_USER + 102)
#define BFFM_SETSELECTIONW  (WM_USER + 103)
#define BFFM_SETSTATUSTEXTW  (WM_USER + 104)
#define BFFM_SETOKTEXT  (WM_USER + 105)
#define BFFM_SETEXPANDED  (WM_USER + 106)

SHSTDAPI_(LPITEMIDLIST) SHBrowseForFolderA(LPBROWSEINFOA lpbi);
SHSTDAPI_(LPITEMIDLIST) SHBrowseForFolderW(LPBROWSEINFOW lpbi);

#ifdef UNICODE
#define SHBrowseForFolder  SHBrowseForFolderW
#define BFFM_SETSTATUSTEXT  BFFM_SETSTATUSTEXTW
#define BFFM_SETSELECTION  BFFM_SETSELECTIONW
#define BFFM_VALIDATEFAILED  BFFM_VALIDATEFAILEDW
#else
#define SHBrowseForFolder  SHBrowseForFolderA
#define BFFM_SETSTATUSTEXT  BFFM_SETSTATUSTEXTA
#define BFFM_SETSELECTION  BFFM_SETSELECTIONA
#define BFFM_VALIDATEFAILED  BFFM_VALIDATEFAILEDA
#endif

SHSTDAPI SHLoadInProc(REFCLSID rclsid);

#if _WIN32_IE >= 0x0600
SHSTDAPI SHEnableServiceObject(REFCLSID rclsid, BOOL fEnable);
#endif

enum {
    ISHCUTCMDID_DOWNLOADICON = 0,
    ISHCUTCMDID_INTSHORTCUTCREATE = 1,
};
#define CMDID_INTSHORTCUTCREATE ISHCUTCMDID_INTSHORTCUTCREATE

SHSTDAPI SHGetDesktopFolder(IShellFolder ** ppshf);

#define STR_FILE_SYS_BIND_DATA  L"File System Bind Data"

#undef INTERFACE
#define INTERFACE IFileSystemBindData
DECLARE_INTERFACE_(IFileSystemBindData, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(SetFindData)(THIS_ const WIN32_FIND_DATAW * pfd) PURE;
    STDMETHOD(GetFindData)(THIS_ WIN32_FIND_DATAW * pfd) PURE;
};

#undef INTERFACE
#define INTERFACE IShellDetails
DECLARE_INTERFACE_(IShellDetails, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetDetailsOf)(THIS_ LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * pDetails) PURE;
    STDMETHOD(ColumnClick)(THIS_ UINT iColumn) PURE;
};

#undef INTERFACE
#define INTERFACE IObjMgr
DECLARE_INTERFACE_(IObjMgr, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Append)(THIS_ IUnknown * punk) PURE;
    STDMETHOD(Remove)(THIS_ IUnknown * punk) PURE;
};

#undef INTERFACE
#define INTERFACE ICurrentWorkingDirectory
DECLARE_INTERFACE_(ICurrentWorkingDirectory, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetDirectory)(THIS_ LPWSTR pwzPath, DWORD cchSize) PURE;
    STDMETHOD(SetDirectory)(THIS_ LPCWSTR pwzPath) PURE;
};

#undef INTERFACE
#define INTERFACE IACList
DECLARE_INTERFACE_(IACList, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Expand)(THIS_ LPCOLESTR pszExpand) PURE;
};

#undef INTERFACE
#define INTERFACE IACList2
typedef enum _tagAUTOCOMPLETELISTOPTIONS {
    ACLO_NONE = 0,
    ACLO_CURRENTDIR = 1,
    ACLO_MYCOMPUTER = 2,
    ACLO_DESKTOP = 4,
    ACLO_FAVORITES = 8,
    ACLO_FILESYSONLY = 16,
    ACLO_FILESYSDIRS = 32,
} AUTOCOMPLETELISTOPTIONS;

DECLARE_INTERFACE_(IACList2, IACList) {
    STDMETHOD(SetOptions)(THIS_ DWORD dwFlag) PURE;
    STDMETHOD(GetOptions)(THIS_ DWORD * pdwFlag) PURE;
};

#define PROGDLG_NORMAL  0x00000000
#define PROGDLG_MODAL  0x00000001
#define PROGDLG_AUTOTIME  0x00000002
#define PROGDLG_NOTIME  0x00000004
#define PROGDLG_NOMINIMIZE  0x00000008
#define PROGDLG_NOPROGRESSBAR  0x00000010

#define PDTIMER_RESET  0x00000001

#undef INTERFACE
#define INTERFACE  IProgressDialog
DECLARE_INTERFACE_(IProgressDialog, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(StartProgressDialog)(THIS_ HWND hwndParent, IUnknown * punkEnableModless, DWORD dwFlags, LPCVOID pvResevered) PURE;
    STDMETHOD(StopProgressDialog)(THIS) PURE;
    STDMETHOD(SetTitle)(THIS_ LPCWSTR pwzTitle) PURE;
    STDMETHOD(SetAnimation)(THIS_ HINSTANCE hInstAnimation, UINT idAnimation) PURE;
    STDMETHOD_(BOOL, HasUserCancelled)(THIS) PURE;
    STDMETHOD(SetProgress)(THIS_ DWORD dwCompleted, DWORD dwTotal) PURE;
    STDMETHOD(SetProgress64)(THIS_ ULONGLONG ullCompleted, ULONGLONG ullTotal) PURE;
    STDMETHOD(SetLine)(THIS_ DWORD dwLineNum, LPCWSTR pwzString, BOOL fCompactPath, LPCVOID pvResevered) PURE;
    STDMETHOD(SetCancelMsg)(THIS_ LPCWSTR pwzCancelMsg, LPCVOID pvResevered) PURE;
    STDMETHOD(Timer)(THIS_ DWORD dwTimerAction, LPCVOID pvResevered) PURE;
};

#undef INTERFACE
#define INTERFACE IInputObjectSite
DECLARE_INTERFACE_(IInputObjectSite, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(OnFocusChangeIS)(THIS_ IUnknown * punkObj, BOOL fSetFocus) PURE;
};

#undef INTERFACE
#define INTERFACE IInputObject
DECLARE_INTERFACE_(IInputObject, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(UIActivateIO)(THIS_ BOOL fActivate, LPMSG lpMsg) PURE;
    STDMETHOD(HasFocusIO)(THIS) PURE;
    STDMETHOD(TranslateAcceleratorIO)(THIS_ LPMSG lpMsg) PURE;
};

#undef INTERFACE
#define INTERFACE IDockingWindowSite
DECLARE_INTERFACE_(IDockingWindowSite, IOleWindow) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetWindow)(THIS_ HWND * lphwnd) PURE;
    STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE;
    STDMETHOD(GetBorderDW)(THIS_ IUnknown * punkObj, LPRECT prcBorder) PURE;
    STDMETHOD(RequestBorderSpaceDW)(THIS_ IUnknown * punkObj, LPCBORDERWIDTHS pbw) PURE;
    STDMETHOD(SetBorderSpaceDW)(THIS_ IUnknown * punkObj, LPCBORDERWIDTHS pbw) PURE;
};

#define DWFRF_NORMAL  0x0000
#define DWFRF_DELETECONFIGDATA  0x0001
#define DWFAF_HIDDEN  0x0001

#undef INTERFACE
#define INTERFACE IDockingWindowFrame
DECLARE_INTERFACE_(IDockingWindowFrame, IOleWindow) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetWindow)(THIS_ HWND * lphwnd) PURE;
    STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE;
    STDMETHOD(AddToolbar)(THIS_ IUnknown * punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags) PURE;
    STDMETHOD(RemoveToolbar)(THIS_ IUnknown * punkSrc, DWORD dwRemoveFlags) PURE;
    STDMETHOD(FindToolbar)(THIS_ LPCWSTR pwszItem, REFIID riid, void **ppv) PURE;
};

#if (_WIN32_IE >= 0x0400)

#define IRTIR_TASK_NOT_RUNNING  0
#define IRTIR_TASK_RUNNING  1
#define IRTIR_TASK_SUSPENDED  2
#define IRTIR_TASK_PENDING  3
#define IRTIR_TASK_FINISHED  4

#undef INTERFACE
#define INTERFACE IRunnableTask
DECLARE_INTERFACE_(IRunnableTask, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Run)(THIS) PURE;
    STDMETHOD(Kill)(THIS_ BOOL fWait) PURE;
    STDMETHOD(Suspend)(THIS) PURE;
    STDMETHOD(Resume)(THIS) PURE;
    STDMETHOD_(ULONG, IsRunning)(THIS) PURE;
};

typedef IRunnableTask *LPRUNNABLETASK;
#endif /* _WIN32_IE >= 0x0400 */

#if (_WIN32_IE >= 0x0400)

#define TASKOWNERID  GUID
#define REFTASKOWNERID  REFGUID

#define ITSSFLAG_COMPLETE_ON_DESTROY  0x0000
#define ITSSFLAG_KILL_ON_DESTROY  0x0001
#define ITSSFLAG_SUPPORTS_TERMINATE  0x0002
#define ITSSFLAG_FLAGS_MASK  0x0003
#define ITSSFLAG_THREAD_TERMINATE_TIMEOUT  0x0010
#define ITSSFLAG_THREAD_POOL_TIMEOUT  0x0020

#define ITSS_THREAD_DESTROY_DEFAULT_TIMEOUT  (60*1000)
#define ITSS_THREAD_TERMINATE_TIMEOUT  (INFINITE)
#define ITSS_THREAD_TIMEOUT_NO_CHANGE  (INFINITE-1)

#define ITSAT_DEFAULT_LPARAM  0xffffffff

#define ITSAT_DEFAULT_PRIORITY  0x10000000
#define ITSAT_MAX_PRIORITY  0x7fffffff
#define ITSAT_MIN_PRIORITY  0x00000000

#define TOID_NULL  CLSID_NULL

#undef INTERFACE
#define INTERFACE IShellTaskScheduler
DECLARE_INTERFACE_(IShellTaskScheduler, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(AddTask)(THIS_ IRunnableTask * pTask, REFTASKOWNERID rtoid, DWORD_PTR lParam, DWORD dwPriority) PURE;
    STDMETHOD(RemoveTasks)(THIS_ REFTASKOWNERID rtoid, DWORD_PTR lParam, BOOL fWaitIfRunning) PURE;
    STDMETHOD_(UINT, CountTasks)(THIS_ REFTASKOWNERID rtoid) PURE;
    STDMETHOD(Status)(THIS_ DWORD dwReleaseStatus, DWORD dwThreadTimeout) PURE;
};

typedef IShellTaskScheduler *LPSHELLTASKSCHEDULER;

#if (_WIN32_IE >= 0x0501)

#define ITSSFLAG_TASK_PLACEINFRONT  0x00000001
#define ITSSFLAG_TASK_PLACEINBACK  0x00000002

#undef INTERFACE
#define INTERFACE IShellTaskScheduler2
DECLARE_INTERFACE_(IShellTaskScheduler2, IShellTaskScheduler) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(AddTask)(THIS_ IRunnableTask * pTask, REFTASKOWNERID rtoid, DWORD_PTR lParam, DWORD dwPriority) PURE;
    STDMETHOD(RemoveTasks)(THIS_ REFTASKOWNERID rtoid, DWORD_PTR lParam, BOOL fWaitIfRunning) PURE;
    STDMETHOD_(UINT, CountTasks)(THIS_ REFTASKOWNERID rtoid) PURE;
    STDMETHOD(Status)(THIS_ DWORD dwReleaseStatus, DWORD dwThreadTimeout) PURE;
    STDMETHOD(AddTask2)(THIS_ IRunnableTask * pTask, REFTASKOWNERID rtoid, DWORD_PTR lParam, DWORD dwPriority, DWORD grfFlags) PURE;
    STDMETHOD(MoveTask)(THIS_ REFTASKOWNERID rtoid, DWORD_PTR lParam, DWORD dwPriority, DWORD grfFlags) PURE;
};

#endif /* _WIN32_IE >= 0x0501 */
#endif /* _WIN32_IE >= 0x0400 */

#if (_WIN32_IE >= 0x0400)

#undef INTERFACE
#define INTERFACE IThumbnailCapture
DECLARE_INTERFACE_(IThumbnailCapture, IUnknown) {
    STDMETHOD(CaptureThumbnail)(THIS_ const SIZE * pMaxSize, IUnknown * pHTMLDoc2, HBITMAP * phbmThumbnail) PURE;
};

typedef IThumbnailCapture *LPTHUMBNAILCAPTURE;

#endif /* _WIN32_IE >= 0x0400 */

#if (_WIN32_IE >= 0x0500)

#include <pshpack8.h>
typedef struct _EnumImageStoreDATAtag {
    WCHAR szPath[MAX_PATH];
    FILETIME ftTimeStamp;
} ENUMSHELLIMAGESTOREDATA, *PENUMSHELLIMAGESTOREDATA;
#include <poppack.h>

#undef INTERFACE
#define INTERFACE IEnumShellImageStore
DECLARE_INTERFACE_(IEnumShellImageStore, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Reset)(THIS) PURE;
    STDMETHOD(Next)(THIS_ ULONG celt, PENUMSHELLIMAGESTOREDATA * prgElt, ULONG * pceltFetched) PURE;
    STDMETHOD(Skip)(THIS_ ULONG celt) PURE;
    STDMETHOD(Clone)(THIS_ IEnumShellImageStore ** ppEnum) PURE;
};

typedef IEnumShellImageStore *LPENUMSHELLIMAGESTORE;

#define SHIMSTCAPFLAG_LOCKABLE  0x0001
#define SHIMSTCAPFLAG_PURGEABLE  0x0002

#undef INTERFACE
#define INTERFACE IShellImageStore
DECLARE_INTERFACE_(IShellImageStore, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Open)(THIS_ DWORD dwMode, DWORD * pdwLock) PURE;
    STDMETHOD(Create)(THIS_ DWORD dwMode, DWORD * pdwLock) PURE;
    STDMETHOD(ReleaseLock)(THIS_ DWORD const *pdwLock) PURE;
    STDMETHOD(Close)(THIS_ DWORD const *pdwLock) PURE;
    STDMETHOD(Commit)(THIS_ DWORD const *pdwLock) PURE;
    STDMETHOD(IsLocked)(THIS) PURE;
    STDMETHOD(GetMode)(THIS_ DWORD * pdwMode) PURE;
    STDMETHOD(GetCapabilities)(THIS_ DWORD * pdwCapMask) PURE;
    STDMETHOD(AddEntry)(THIS_ LPCWSTR pszName, const FILETIME * pftTimeStamp, DWORD dwMode, HBITMAP hImage) PURE;
    STDMETHOD(GetEntry)(THIS_ LPCWSTR pszName, DWORD dwMode, HBITMAP * phImage) PURE;
    STDMETHOD(DeleteEntry)(THIS_ LPCWSTR pszName) PURE;
    STDMETHOD(IsEntryInStore)(THIS_ LPCWSTR pszName, FILETIME * pftTimeStamp) PURE;
    STDMETHOD(Enum)(THIS_ LPENUMSHELLIMAGESTORE * ppEnum) PURE;
};

typedef IShellImageStore *LPSHELLIMAGESTORE;
#endif /* _WIN32_IE >= 0x0500 */

#if (_WIN32_IE >= 0x0400)

#define ISFB_MASK_STATE  0x00000001
#define ISFB_MASK_BKCOLOR  0x00000002
#define ISFB_MASK_VIEWMODE  0x00000004
#define ISFB_MASK_SHELLFOLDER  0x00000008
#define ISFB_MASK_IDLIST  0x00000010
#define ISFB_MASK_COLORS  0x00000020

#define ISFB_STATE_DEFAULT  0x00000000
#define ISFB_STATE_DEBOSSED  0x00000001
#define ISFB_STATE_ALLOWRENAME  0x00000002
#define ISFB_STATE_NOSHOWTEXT  0x00000004
#define ISFB_STATE_CHANNELBAR  0x00000010
#define ISFB_STATE_QLINKSMODE  0x00000020
#define ISFB_STATE_FULLOPEN  0x00000040
#define ISFB_STATE_NONAMESORT  0x00000080
#define ISFB_STATE_BTNMINSIZE  0x00000100

#define ISFBVIEWMODE_SMALLICONS  0x0001
#define ISFBVIEWMODE_LARGEICONS  0x0002
#define ISFBVIEWMODE_LOGOS  0x0003

#include <pshpack8.h>
typedef struct {
    DWORD dwMask;
    DWORD dwStateMask;
    DWORD dwState;
    COLORREF crBkgnd;
    COLORREF crBtnLt;
    COLORREF crBtnDk;
    WORD wViewMode;
    WORD wAlign;
    IShellFolder *psf;
    LPITEMIDLIST pidl;
} BANDINFOSFB, *PBANDINFOSFB;
#include <poppack.h>

#undef INTERFACE
#define INTERFACE IShellFolderBand
DECLARE_INTERFACE_(IShellFolderBand, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(InitializeSFB)(THIS_ IShellFolder * psf, LPCITEMIDLIST pidl) PURE;
    STDMETHOD(SetBandInfoSFB)(THIS_ PBANDINFOSFB pbi) PURE;
    STDMETHOD(GetBandInfoSFB)(THIS_ PBANDINFOSFB pbi) PURE;
};

enum {
    SFBID_PIDLCHANGED,
};

#undef INTERFACE
#define INTERFACE IDeskBarClient
 DECLARE_INTERFACE_(IDeskBarClient, IOleWindow) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetWindow)(THIS_ HWND * lphwnd) PURE;
    STDMETHOD(ContextSensitiveHelp)(THIS_ BOOL fEnterMode) PURE;
    STDMETHOD(SetDeskBarSite)(THIS_ IUnknown * punkSite) PURE;
    STDMETHOD(SetModeDBC)(THIS_ DWORD dwMode) PURE;
    STDMETHOD(UIActivateDBC)(THIS_ DWORD dwState) PURE;
    STDMETHOD(GetSize)(THIS_ DWORD dwWhich, LPRECT prc) PURE;
};

#define DBC_GS_IDEAL  0
#define DBC_GS_SIZEDOWN  1

#define DBC_HIDE  0
#define DBC_SHOW  1
#define DBC_SHOWOBSCURE  2

enum {
    DBCID_EMPTY = 0,
    DBCID_ONDRAG = 1,
    DBCID_CLSIDOFBAR = 2,
    DBCID_RESIZE = 3,
    DBCID_GETBAR = 4,
};

#endif /* _WIN32_IE >= 0x0400 */

#if (_WIN32_IE >= 0x400)

#ifdef _WININET_H
typedef struct _tagWALLPAPEROPT {
    DWORD dwSize;
    DWORD dwStyle;
} WALLPAPEROPT;

typedef WALLPAPEROPT *LPWALLPAPEROPT;
typedef const WALLPAPEROPT *LPCWALLPAPEROPT;

typedef struct _tagCOMPONENTSOPT {
    DWORD dwSize;
    BOOL fEnableComponents;
    BOOL fActiveDesktop;
} COMPONENTSOPT;

typedef COMPONENTSOPT *LPCOMPONENTSOPT;
typedef const COMPONENTSOPT *LPCCOMPONENTSOPT;

typedef struct _tagCOMPPOS {
    DWORD dwSize;
    int iLeft;
    int iTop;
    DWORD dwWidth;
    DWORD dwHeight;
    int izIndex;
    BOOL fCanResize;
    BOOL fCanResizeX;
    BOOL fCanResizeY;
    int iPreferredLeftPercent;
    int iPreferredTopPercent;
} COMPPOS;

typedef COMPPOS *LPCOMPPOS;
typedef const COMPPOS *LPCCOMPPOS;

typedef struct _tagCOMPSTATEINFO {
    DWORD dwSize;
    int iLeft;
    int iTop;
    DWORD dwWidth;
    DWORD dwHeight;
    DWORD dwItemState;
} COMPSTATEINFO;

typedef COMPSTATEINFO *LPCOMPSTATEINFO;
typedef const COMPSTATEINFO *LPCCOMPSTATEINFO;

#define COMPONENT_TOP  (0x3fffffff)

#define COMP_TYPE_HTMLDOC  0
#define COMP_TYPE_PICTURE  1
#define COMP_TYPE_WEBSITE  2
#define COMP_TYPE_CONTROL  3
#define COMP_TYPE_CFHTML  4
#define COMP_TYPE_MAX  4

typedef struct _tagIE4COMPONENT {
    DWORD dwSize;
    DWORD dwID;
    int iComponentType;
    BOOL fChecked;
    BOOL fDirty;
    BOOL fNoScroll;
    COMPPOS cpPos;
    WCHAR wszFriendlyName[MAX_PATH];
    WCHAR wszSource[INTERNET_MAX_URL_LENGTH];
    WCHAR wszSubscribedURL[INTERNET_MAX_URL_LENGTH];
} IE4COMPONENT;

typedef IE4COMPONENT *LPIE4COMPONENT;
typedef const IE4COMPONENT *LPCIE4COMPONENT;

typedef struct _tagCOMPONENT {
    DWORD dwSize;
    DWORD dwID;
    int iComponentType;
    BOOL fChecked;
    BOOL fDirty;
    BOOL fNoScroll;
    COMPPOS cpPos;
    WCHAR wszFriendlyName[MAX_PATH];
    WCHAR wszSource[INTERNET_MAX_URL_LENGTH];
    WCHAR wszSubscribedURL[INTERNET_MAX_URL_LENGTH];
    DWORD dwCurItemState;
    COMPSTATEINFO csiOriginal;
    COMPSTATEINFO csiRestored;
} COMPONENT;

typedef COMPONENT *LPCOMPONENT;
typedef const COMPONENT *LPCCOMPONENT;

#define IS_NORMAL  0x00000001
#define IS_FULLSCREEN  0x00000002
#define IS_SPLIT  0x00000004
#define IS_VALIDSIZESTATEBITS  (IS_NORMAL|IS_SPLIT|IS_FULLSCREEN)
#define IS_VALIDSTATEBITS  (IS_NORMAL|IS_SPLIT|IS_FULLSCREEN|0x80000000|0x40000000)

#define AD_APPLY_SAVE  0x00000001
#define AD_APPLY_HTMLGEN  0x00000002
#define AD_APPLY_REFRESH  0x00000004
#define AD_APPLY_ALL  (AD_APPLY_SAVE|AD_APPLY_HTMLGEN|AD_APPLY_REFRESH)
#define AD_APPLY_FORCE  0x00000008
#define AD_APPLY_BUFFERED_REFRESH  0x00000010
#define AD_APPLY_DYNAMICREFRESH  0x00000020

#define WPSTYLE_CENTER  0
#define WPSTYLE_TILE  1
#define WPSTYLE_STRETCH  2
#define WPSTYLE_MAX  3

#define COMP_ELEM_TYPE  0x00000001
#define COMP_ELEM_CHECKED  0x00000002
#define COMP_ELEM_DIRTY  0x00000004
#define COMP_ELEM_NOSCROLL  0x00000008
#define COMP_ELEM_POS_LEFT  0x00000010
#define COMP_ELEM_POS_TOP  0x00000020
#define COMP_ELEM_SIZE_WIDTH  0x00000040
#define COMP_ELEM_SIZE_HEIGHT  0x00000080
#define COMP_ELEM_POS_ZINDEX  0x00000100
#define COMP_ELEM_SOURCE  0x00000200
#define COMP_ELEM_FRIENDLYNAME  0x00000400
#define COMP_ELEM_SUBSCRIBEDURL  0x00000800
#define COMP_ELEM_ORIGINAL_CSI  0x00001000
#define COMP_ELEM_RESTORED_CSI  0x00002000
#define COMP_ELEM_CURITEMSTATE  0x00004000

#define COMP_ELEM_ALL  (COMP_ELEM_TYPE|COMP_ELEM_CHECKED|COMP_ELEM_DIRTY|COMP_ELEM_NOSCROLL|COMP_ELEM_POS_LEFT|COMP_ELEM_SIZE_WIDTH|COMP_ELEM_SIZE_HEIGHT|COMP_ELEM_POS_ZINDEX|COMP_ELEM_SOURCE|COMP_ELEM_FRIENDLYNAME|COMP_ELEM_POS_TOP|COMP_ELEM_SUBSCRIBEDURL|COMP_ELEM_ORIGINAL_CSI|COMP_ELEM_RESTORED_CSI|COMP_ELEM_CURITEMSTATE)

typedef enum tagDTI_ADTIWUI {
    DTI_ADDUI_DEFAULT = 0x00000000,
    DTI_ADDUI_DISPSUBWIZARD = 0x00000001,
    DTI_ADDUI_POSITIONITEM = 0x00000002,
};

#define ADDURL_SILENT  0X0001

#define COMPONENT_DEFAULT_LEFT  (0xFFFF)
#define COMPONENT_DEFAULT_TOP  (0xFFFF)

#undef INTERFACE
#define INTERFACE IActiveDesktop
DECLARE_INTERFACE_(IActiveDesktop, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(ApplyChanges)(THIS_ DWORD dwFlags) PURE;
    STDMETHOD(GetWallpaper)(THIS_ LPWSTR pwszWallpaper, UINT cchWallpaper, DWORD dwReserved) PURE;
    STDMETHOD(SetWallpaper)(THIS_ LPCWSTR pwszWallpaper, DWORD dwReserved) PURE;
    STDMETHOD(GetWallpaperOptions)(THIS_ LPWALLPAPEROPT pwpo, DWORD dwReserved) PURE;
    STDMETHOD(SetWallpaperOptions)(THIS_ LPCWALLPAPEROPT pwpo, DWORD dwReserved) PURE;
    STDMETHOD(GetPattern)(THIS_ LPWSTR pwszPattern, UINT cchPattern, DWORD dwReserved) PURE;
    STDMETHOD(SetPattern)(THIS_ LPCWSTR pwszPattern, DWORD dwReserved) PURE;
    STDMETHOD(GetDesktopItemOptions)(THIS_ LPCOMPONENTSOPT pco, DWORD dwReserved) PURE;
    STDMETHOD(SetDesktopItemOptions)(THIS_ LPCCOMPONENTSOPT pco, DWORD dwReserved) PURE;
    STDMETHOD(AddDesktopItem)(THIS_ LPCCOMPONENT pcomp, DWORD dwReserved) PURE;
    STDMETHOD(AddDesktopItemWithUI)(THIS_ HWND hwnd, LPCOMPONENT pcomp, DWORD dwReserved) PURE;
    STDMETHOD(ModifyDesktopItem)(THIS_ LPCCOMPONENT pcomp, DWORD dwFlags) PURE;
    STDMETHOD(RemoveDesktopItem)(THIS_ LPCCOMPONENT pcomp, DWORD dwReserved) PURE;
    STDMETHOD(GetDesktopItemCount)(THIS_ LPINT lpiCount, DWORD dwReserved) PURE;
    STDMETHOD(GetDesktopItem)(THIS_ int nComponent, LPCOMPONENT pcomp, DWORD dwReserved) PURE;
    STDMETHOD(GetDesktopItemByID)(THIS_ ULONG_PTR dwID, LPCOMPONENT pcomp, DWORD dwReserved) PURE;
    STDMETHOD(GenerateDesktopItemHtml)(THIS_ LPCWSTR pwszFileName, LPCOMPONENT pcomp, DWORD dwReserved) PURE;
    STDMETHOD(AddUrl)(THIS_ HWND hwnd, LPCWSTR pszSource, LPCOMPONENT pcomp, DWORD dwFlags) PURE;
    STDMETHOD(GetDesktopItemBySource)(THIS_ LPCWSTR pwszSource, LPCOMPONENT pcomp, DWORD dwReserved) PURE;
};

typedef IActiveDesktop *LPACTIVEDESKTOP;

#define SSM_CLEAR  0x0000
#define SSM_SET  0x0001
#define SSM_REFRESH  0x0002
#define SSM_UPDATE  0x0004

#define SCHEME_DISPLAY  0x0001
#define SCHEME_EDIT  0x0002
#define SCHEME_LOCAL  0x0004
#define SCHEME_GLOBAL  0x0008
#define SCHEME_REFRESH  0x0010
#define SCHEME_UPDATE  0x0020
#define SCHEME_DONOTUSE  0x0040
#define SCHEME_CREATE  0x0080

#undef INTERFACE
#define INTERFACE IActiveDesktopP
DECLARE_INTERFACE_(IActiveDesktopP, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(SetSafeMode)(THIS_ DWORD dwFlags) PURE;
    STDMETHOD(EnsureUpdateHTML)(THIS) PURE;
    STDMETHOD(SetScheme)(THIS_ LPCWSTR pwszSchemeName, DWORD dwFlags) PURE;
    STDMETHOD(GetScheme)(THIS_ LPWSTR pwszSchemeName, DWORD * lpdwcchBuffer, DWORD dwFlags) PURE;
};

typedef IActiveDesktopP *LPACTIVEDESKTOPP;

#define GADOF_DIRTY  0x00000001

#undef INTERFACE
#define INTERFACE IADesktopP2
DECLARE_INTERFACE_(IADesktopP2, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(ReReadWallpaper)(THIS) PURE;
    STDMETHOD(GetADObjectFlags)(THIS_ DWORD * lpdwFlags, DWORD dwMask) PURE;
    STDMETHOD(UpdateAllDesktopSubscriptions)(THIS) PURE;
    STDMETHOD(MakeDynamicChanges)(THIS_ IOleObject * pOleObj) PURE;
};

typedef IADesktopP2 *LPADESKTOPP2;

#endif /* _WIN32_IE >= 0x400 */

#if (_WIN32_IE >= 0x0500)

#define MAX_COLUMN_NAME_LEN  80
#define MAX_COLUMN_DESC_LEN  128

#include <pshpack1.h>
typedef struct {
    SHCOLUMNID scid;
    VARTYPE vt;
    DWORD fmt;
    UINT cChars;
    DWORD csFlags;
    WCHAR wszTitle[MAX_COLUMN_NAME_LEN];
    WCHAR wszDescription[MAX_COLUMN_DESC_LEN];
} SHCOLUMNINFO, *LPSHCOLUMNINFO;
typedef const SHCOLUMNINFO *LPCSHCOLUMNINFO;
#include <poppack.h>

#include <pshpack8.h>
typedef struct {
    ULONG dwFlags;
    ULONG dwReserved;
    WCHAR wszFolder[MAX_PATH];
} SHCOLUMNINIT, *LPSHCOLUMNINIT;
typedef const SHCOLUMNINIT *LPCSHCOLUMNINIT;

#define SHCDF_UPDATEITEM  0x00000001

typedef struct {
    ULONG dwFlags;
    DWORD dwFileAttributes;
    ULONG dwReserved;
    WCHAR *pwszExt;
    WCHAR wszFile[MAX_PATH];
} SHCOLUMNDATA, *LPSHCOLUMNDATA;
typedef const SHCOLUMNDATA *LPCSHCOLUMNDATA;
#include <poppack.h>

#undef INTERFACE
#define INTERFACE IColumnProvider
DECLARE_INTERFACE_(IColumnProvider, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Initialize)(THIS_ LPCSHCOLUMNINIT psci) PURE;
    STDMETHOD(GetColumnInfo)(THIS_ DWORD dwIndex, SHCOLUMNINFO * psci) PURE;
    STDMETHOD(GetItemData)(THIS_ LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, VARIANT * pvarData) PURE;
};

#include <pshpack8.h>
typedef struct {
    SIZE sizeDragImage;
    POINT ptOffset;
    HBITMAP hbmpDragImage;
    COLORREF crColorKey;
} SHDRAGIMAGE, *LPSHDRAGIMAGE;
#include <poppack.h>

#define DI_GETDRAGIMAGE  TEXT("ShellGetDragImage")

#undef INTERFACE
#define INTERFACE IDropTargetHelper
DECLARE_INTERFACE_(IDropTargetHelper, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(DragEnter)(THIS_ HWND hwndTarget, IDataObject * pDataObject, POINT * ppt, DWORD dwEffect) PURE;
    STDMETHOD(DragLeave)(THIS) PURE;
    STDMETHOD(DragOver)(THIS_ POINT * ppt, DWORD dwEffect) PURE;
    STDMETHOD(Drop)(THIS_ IDataObject * pDataObject, POINT * ppt, DWORD dwEffect) PURE;
    STDMETHOD(Show)(THIS_ BOOL fShow) PURE;
};

#undef INTERFACE
#define INTERFACE IDragSourceHelper
DECLARE_INTERFACE_(IDragSourceHelper, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(InitializeFromBitmap)(THIS_ LPSHDRAGIMAGE pshdi, IDataObject * pDataObject) PURE;
    STDMETHOD(InitializeFromWindow)(THIS_ HWND hwnd, POINT * ppt, IDataObject * pDataObject) PURE;
};
#endif /* _WIN32_IE >= 0x0500 */
#endif

#define CFSTR_SHELLIDLIST  TEXT("Shell IDList Array")
#define CFSTR_SHELLIDLISTOFFSET  TEXT("Shell Object Offsets")
#define CFSTR_NETRESOURCES  TEXT("Net Resource")
#define CFSTR_FILEDESCRIPTORA  TEXT("FileGroupDescriptor")
#define CFSTR_FILEDESCRIPTORW  TEXT("FileGroupDescriptorW")
#define CFSTR_FILECONTENTS  TEXT("FileContents")
#define CFSTR_FILENAMEA  TEXT("FileName")
#define CFSTR_FILENAMEW  TEXT("FileNameW")
#define CFSTR_PRINTERGROUP  TEXT("PrinterFriendlyName")
#define CFSTR_FILENAMEMAPA  TEXT("FileNameMap")
#define CFSTR_FILENAMEMAPW  TEXT("FileNameMapW")
#define CFSTR_SHELLURL  TEXT("UniformResourceLocator")
#define CFSTR_INETURLA  CFSTR_SHELLURL
#define CFSTR_INETURLW  TEXT("UniformResourceLocatorW")
#define CFSTR_PREFERREDDROPEFFECT  TEXT("Preferred DropEffect")
#define CFSTR_PERFORMEDDROPEFFECT  TEXT("Performed DropEffect")
#define CFSTR_PASTESUCCEEDED  TEXT("Paste Succeeded")
#define CFSTR_INDRAGLOOP  TEXT("InShellDragLoop")
#define CFSTR_DRAGCONTEXT  TEXT("DragContext")
#define CFSTR_MOUNTEDVOLUME  TEXT("MountedVolume")
#define CFSTR_PERSISTEDDATAOBJECT  TEXT("PersistedDataObject")
#define CFSTR_TARGETCLSID  TEXT("TargetCLSID")
#define CFSTR_LOGICALPERFORMEDDROPEFFECT  TEXT("Logical Performed DropEffect")
#define CFSTR_AUTOPLAY_SHELLIDLISTS  TEXT("Autoplay Enumerated IDList Array")

#ifdef UNICODE
#define CFSTR_FILEDESCRIPTOR  CFSTR_FILEDESCRIPTORW
#define CFSTR_FILENAME  CFSTR_FILENAMEW
#define CFSTR_FILENAMEMAP  CFSTR_FILENAMEMAPW
#define CFSTR_INETURL  CFSTR_INETURLW
#else
#define CFSTR_FILEDESCRIPTOR  CFSTR_FILEDESCRIPTORA
#define CFSTR_FILENAME  CFSTR_FILENAMEA
#define CFSTR_FILENAMEMAP  CFSTR_FILENAMEMAPA
#define CFSTR_INETURL  CFSTR_INETURLA
#endif

#define DVASPECT_SHORTNAME  2
#define DVASPECT_COPY  3
#define DVASPECT_LINK  4

#include <pshpack8.h>
typedef struct _NRESARRAY {
    UINT cItems;
    NETRESOURCE nr[1];
} NRESARRAY, *LPNRESARRAY;
#include <poppack.h>

typedef struct _IDA {
    UINT cidl;
    UINT aoffset[1];
} CIDA, *LPIDA;

typedef enum {
    FD_CLSID = 0x0001,
    FD_SIZEPOINT = 0x0002,
    FD_ATTRIBUTES = 0x0004,
    FD_CREATETIME = 0x0008,
    FD_ACCESSTIME = 0x0010,
    FD_WRITESTIME = 0x0020,
    FD_FILESIZE = 0x0040,
    FD_PROGRESSUI = 0x4000,
    FD_LINKUI = 0x8000,
} FD_FLAGS;

typedef struct _FILEDESCRIPTORA {
    DWORD dwFlags;
    CLSID clsid;
    SIZEL sizel;
    POINTL pointl;
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    CHAR cFileName[MAX_PATH];
} FILEDESCRIPTORA, *LPFILEDESCRIPTORA;

typedef struct _FILEDESCRIPTORW {
    DWORD dwFlags;
    CLSID clsid;
    SIZEL sizel;
    POINTL pointl;
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    WCHAR cFileName[MAX_PATH];
} FILEDESCRIPTORW, *LPFILEDESCRIPTORW;

#ifdef UNICODE
#define FILEDESCRIPTOR  FILEDESCRIPTORW
#define LPFILEDESCRIPTOR  LPFILEDESCRIPTORW
#else
#define FILEDESCRIPTOR  FILEDESCRIPTORA
#define LPFILEDESCRIPTOR  LPFILEDESCRIPTORA
#endif

typedef struct _FILEGROUPDESCRIPTORA {
    UINT cItems;
    FILEDESCRIPTORA fgd[1];
} FILEGROUPDESCRIPTORA, *LPFILEGROUPDESCRIPTORA;

typedef struct _FILEGROUPDESCRIPTORW {
    UINT cItems;
    FILEDESCRIPTORW fgd[1];
} FILEGROUPDESCRIPTORW, *LPFILEGROUPDESCRIPTORW;

#ifdef UNICODE
#define FILEGROUPDESCRIPTOR  FILEGROUPDESCRIPTORW
#define LPFILEGROUPDESCRIPTOR  LPFILEGROUPDESCRIPTORW
#else
#define FILEGROUPDESCRIPTOR  FILEGROUPDESCRIPTORA
#define LPFILEGROUPDESCRIPTOR  LPFILEGROUPDESCRIPTORA
#endif

typedef struct _DROPFILES {
    DWORD pFiles;
    POINT pt;
    BOOL fNC;
    BOOL fWide;
} DROPFILES, *LPDROPFILES;

typedef struct _SHChangeNotifyEntry {
    LPCITEMIDLIST pidl;
    BOOL fRecursive;
} SHChangeNotifyEntry;

#define SHCNE_RENAMEITEM  0x00000001L
#define SHCNE_CREATE  0x00000002L
#define SHCNE_DELETE  0x00000004L
#define SHCNE_MKDIR  0x00000008L
#define SHCNE_RMDIR  0x00000010L
#define SHCNE_MEDIAINSERTED  0x00000020L
#define SHCNE_MEDIAREMOVED  0x00000040L
#define SHCNE_DRIVEREMOVED  0x00000080L
#define SHCNE_DRIVEADD  0x00000100L
#define SHCNE_NETSHARE  0x00000200L
#define SHCNE_NETUNSHARE  0x00000400L
#define SHCNE_ATTRIBUTES  0x00000800L
#define SHCNE_UPDATEDIR  0x00001000L
#define SHCNE_UPDATEITEM  0x00002000L
#define SHCNE_SERVERDISCONNECT  0x00004000L
#define SHCNE_UPDATEIMAGE  0x00008000L
#define SHCNE_DRIVEADDGUI  0x00010000L
#define SHCNE_RENAMEFOLDER  0x00020000L
#define SHCNE_FREESPACE  0x00040000L

#if (_WIN32_IE >= 0x0400)
#define SHCNE_EXTENDED_EVENT  0x04000000L
#endif

#define SHCNE_ASSOCCHANGED  0x08000000L
#define SHCNE_DISKEVENTS  0x0002381FL
#define SHCNE_GLOBALEVENTS  0x0C0581E0L
#define SHCNE_ALLEVENTS  0x7FFFFFFFL
#define SHCNE_INTERRUPT  0x80000000L

#if (_WIN32_IE >= 0x0400)
#define SHCNEE_ORDERCHANGED  2L
#define SHCNEE_MSI_CHANGE  4L
#define SHCNEE_MSI_UNINSTALL  5L
#endif

#define SHCNF_IDLIST  0x0000
#define SHCNF_PATHA  0x0001
#define SHCNF_PRINTERA  0x0002
#define SHCNF_DWORD  0x0003
#define SHCNF_PATHW  0x0005
#define SHCNF_PRINTERW  0x0006
#define SHCNF_TYPE  0x00FF
#define SHCNF_FLUSH  0x1000
#define SHCNF_FLUSHNOWAIT  0x2000

#ifdef UNICODE
#define SHCNF_PATH  SHCNF_PATHW
#define SHCNF_PRINTER  SHCNF_PRINTERW
#else
#define SHCNF_PATH  SHCNF_PATHA
#define SHCNF_PRINTER  SHCNF_PRINTERA
#endif

SHSTDAPI_(void) SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2);

#undef INTERFACE
#define INTERFACE IShellChangeNotify
DECLARE_INTERFACE_(IShellChangeNotify, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(OnChange)(THIS_ LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE;
};

#undef INTERFACE
#define INTERFACE IQueryInfo
DECLARE_INTERFACE_(IQueryInfo, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetInfoTip)(THIS_ DWORD dwFlags, WCHAR ** ppwszTip) PURE;
    STDMETHOD(GetInfoFlags)(THIS_ DWORD * pdwFlags) PURE;
};

#define QITIPF_DEFAULT  0x00000000
#define QITIPF_USENAME  0x00000001
#define QITIPF_LINKNOTARGET  0x00000002
#define QITIPF_LINKUSETARGET  0x00000004
#define QITIPF_USESLOWTIP  0x00000008

#define QIF_CACHED  0x00000001
#define QIF_DONTEXPANDFOLDER  0x00000002

#define SHARD_PIDL  0x00000001L
#define SHARD_PATHA  0x00000002L
#define SHARD_PATHW  0x00000003L

#ifdef UNICODE
#define SHARD_PATH  SHARD_PATHW
#else
#define SHARD_PATH  SHARD_PATHA
#endif

SHSTDAPI_(void) SHAddToRecentDocs(UINT uFlags, LPCVOID pv);

typedef struct _SHChangeDWORDAsIDList {
    USHORT cb;
    DWORD dwItem1;
    DWORD dwItem2;
    USHORT cbZero;
} SHChangeDWORDAsIDList, *LPSHChangeDWORDAsIDList;

#if (_WIN32_IE >= 0x0400)
typedef struct _SHChangeUpdateImageIDList {
    USHORT cb;
    int iIconIndex;
    int iCurIndex;
    UINT uFlags;
    DWORD dwProcessID;
    WCHAR szName[MAX_PATH];
    USHORT cbZero;
} SHChangeUpdateImageIDList, *LPSHChangeUpdateImageIDList;

SHSTDAPI_(int) SHHandleUpdateImage(LPCITEMIDLIST pidlExtra);

typedef struct _SHChangeProductKeyAsIDList {
    USHORT cb;
    WCHAR wszProductKey[39];
    USHORT cbZero;
} SHChangeProductKeyAsIDList, *LPSHChangeProductKeyAsIDList;

SHSTDAPI_(void) SHUpdateImageA(LPCSTR pszHashItem, int iIndex, UINT uFlags, int iImageIndex);
SHSTDAPI_(void) SHUpdateImageW(LPCWSTR pszHashItem, int iIndex, UINT uFlags, int iImageIndex);
#ifdef UNICODE
#define SHUpdateImage  SHUpdateImageW
#else
#define SHUpdateImage  SHUpdateImageA
#endif
#endif

SHSTDAPI_(ULONG) SHChangeNotifyRegister(HWND hwnd, int fSources, LONG fEvents, UINT wMsg, int cEntries, SHChangeNotifyEntry * pshcne);
SHSTDAPI_(BOOL) SHChangeNotifyDeregister(unsigned long ulID);
SHSTDAPI_(HANDLE) SHChangeNotification_Lock(HANDLE hChangeNotification, DWORD dwProcessId, LPITEMIDLIST ** pppidl, LONG * plEvent);
SHSTDAPI_(BOOL) SHChangeNotification_Unlock(HANDLE hLock);
#if (_WIN32_IE >= 0x0400)
SHSTDAPI SHGetRealIDL(IShellFolder * psf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST * ppidlReal);
#endif

SHSTDAPI SHGetInstanceExplorer(IUnknown ** ppunk);

#define SHGDFIL_FINDDATA  1
#define SHGDFIL_NETRESOURCE  2
#define SHGDFIL_DESCRIPTIONID  3

#define SHDID_ROOT_REGITEM  1
#define SHDID_FS_FILE  2
#define SHDID_FS_DIRECTORY  3
#define SHDID_FS_OTHER  4
#define SHDID_COMPUTER_DRIVE35  5
#define SHDID_COMPUTER_DRIVE525  6
#define SHDID_COMPUTER_REMOVABLE  7
#define SHDID_COMPUTER_FIXED  8
#define SHDID_COMPUTER_NETDRIVE  9
#define SHDID_COMPUTER_CDROM  10
#define SHDID_COMPUTER_RAMDISK  11
#define SHDID_COMPUTER_OTHER  12
#define SHDID_NET_DOMAIN  13
#define SHDID_NET_SERVER  14
#define SHDID_NET_SHARE  15
#define SHDID_NET_RESTOFNET  16
#define SHDID_NET_OTHER  17
#define SHDID_COMPUTER_IMAGING  18
#define SHDID_COMPUTER_AUDIO  19
#define SHDID_COMPUTER_SHAREDDOCS  20

#include <pshpack8.h>
typedef struct _SHDESCRIPTIONID {
    DWORD dwDescriptionId;
    CLSID clsid;
} SHDESCRIPTIONID, *LPSHDESCRIPTIONID;
#include <poppack.h>

SHSTDAPI SHGetDataFromIDListA(IShellFolder * psf, LPCITEMIDLIST pidl, int nFormat, void *pv, int cb);
SHSTDAPI SHGetDataFromIDListW(IShellFolder * psf, LPCITEMIDLIST pidl, int nFormat, void *pv, int cb);
#ifdef UNICODE
#define SHGetDataFromIDList  SHGetDataFromIDListW
#else
#define SHGetDataFromIDList  SHGetDataFromIDListA
#endif

#define PRF_VERIFYEXISTS  0x0001
#define PRF_TRYPROGRAMEXTENSIONS  (0x0002|PRF_VERIFYEXISTS)
#define PRF_FIRSTDIRDEF  0x0004
#define PRF_DONTFINDLNK  0x0008

SHSTDAPI_(int) RestartDialog(HWND hwnd, LPCWSTR lpPrompt, DWORD dwReturn);
SHSTDAPI_(int) RestartDialogEx(HWND hwnd, LPCWSTR lpPrompt, DWORD dwReturn, DWORD dwReasonCode);

SHSTDAPI SHCoCreateInstance(LPCWSTR pszCLSID, const CLSID * pclsid, IUnknown * pUnkOuter, REFIID riid, void **ppv);

DECLARE_HANDLE(FARPROC16);
SHSTDAPI_(LRESULT) CallCPLEntry16(HINSTANCE hinst, FARPROC16 lpfnEntry, HWND hwndCPL, UINT msg, LPARAM lParam1, LPARAM lParam2);
SHSTDAPI SHCreateStdEnumFmtEtc(UINT cfmt, const FORMATETC afmt[], IEnumFORMATETC ** ppenumFormatEtc);
SHSTDAPI SHDoDragDrop(HWND hwnd, IDataObject * pdata, IDropSource * pdsrc, DWORD dwEffect, DWORD * pdwEffect);

#define NUM_POINTS  3

typedef struct {
    int iNextSample;
    DWORD dwLastScroll;
    BOOL bFull;
    POINT pts[NUM_POINTS];
    DWORD dwTimes[NUM_POINTS];
} AUTO_SCROLL_DATA;

SHSTDAPI_(BOOL) DAD_SetDragImage(HIMAGELIST him, POINT * pptOffset);
SHSTDAPI_(BOOL) DAD_DragEnterEx(HWND hwndTarget, const POINT ptStart);
SHSTDAPI_(BOOL) DAD_DragEnterEx2(HWND hwndTarget, const POINT ptStart, IDataObject * pdtObject);
SHSTDAPI_(BOOL) DAD_ShowDragImage(BOOL fShow);
SHSTDAPI_(BOOL) DAD_DragMove(POINT pt);
SHSTDAPI_(BOOL) DAD_DragLeave(void);
SHSTDAPI_(BOOL) DAD_AutoScroll(HWND hwnd, AUTO_SCROLL_DATA * pad, const POINT * pptNow);

typedef struct {
    WORD cLength;
    WORD nVersion;
    BOOL fFullPathTitle:1;
    BOOL fSaveLocalView:1;
    BOOL fNotShell:1;
    BOOL fSimpleDefault:1;
    BOOL fDontShowDescBar:1;
    BOOL fNewWindowMode:1;
    BOOL fShowCompColor:1;
    BOOL fDontPrettyNames:1;
    BOOL fAdminsCreateCommonGroups:1;
    UINT fUnusedFlags:7;
    UINT fMenuEnumFilter;
} CABINETSTATE, *LPCABINETSTATE;

#define CABINETSTATE_VERSION  2

SHSTDAPI_(BOOL) ReadCabinetState(LPCABINETSTATE lpState, int iSize);
SHSTDAPI_(BOOL) WriteCabinetState(LPCABINETSTATE lpState);
SHSTDAPI_(BOOL) PathMakeUniqueName(LPWSTR pszUniqueName, UINT cchMax, LPCWSTR pszTemplate, LPCWSTR pszLongPlate, LPCWSTR pszDir);
SHSTDAPI_(void) PathQualify(LPWSTR psz);
SHSTDAPI_(BOOL) PathIsExe(LPCWSTR pszPath);
SHSTDAPI_(BOOL) PathIsSlowA(LPCSTR pszFile, DWORD dwAttr);
SHSTDAPI_(BOOL) PathIsSlowW(LPCWSTR pszFile, DWORD dwAttr);
#ifdef UNICODE
#define PathIsSlow  PathIsSlowW
#else
#define PathIsSlow  PathIsSlowA
#endif

#define PCS_FATAL  0x80000000
#define PCS_REPLACEDCHAR  0x00000001
#define PCS_REMOVEDCHAR  0x00000002
#define PCS_TRUNCATED  0x00000004
#define PCS_PATHTOOLONG  0x00000008

SHSTDAPI_(int) PathCleanupSpec(LPCWSTR pszDir, LPWSTR pszSpec);
SHSTDAPI_(int) PathResolve(LPWSTR pszPath, LPCWSTR dirs[], UINT fFlags);
SHSTDAPI_(BOOL) GetFileNameFromBrowse(HWND hwnd, LPWSTR pszFilePath, UINT cbFilePath, LPCWSTR pszWorkingDir, LPCWSTR pszDefExt, LPCWSTR pszFilters, LPCWSTR pszTitle);
SHSTDAPI_(int) DriveType(int iDrive);
SHSTDAPI_(int) RealDriveType(int iDrive, BOOL fOKToHitNet);
SHSTDAPI_(int) IsNetDrive(int iDrive);

#define MM_ADDSEPARATOR  0x00000001L
#define MM_SUBMENUSHAVEIDS  0x00000002L
#define MM_DONTREMOVESEPS  0x00000004L

SHSTDAPI_(UINT) Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags);
SHSTDAPI_(BOOL) SHObjectProperties(HWND hwnd, DWORD dwType, LPCWSTR lpObject, LPCWSTR lpPage);

#define SHOP_PRINTERNAME 0x00000001
#define SHOP_FILEPATH    0x00000002
#define SHOP_VOLUMEGUID  0x00000004

SHSTDAPI_(DWORD) SHFormatDrive(HWND hwnd, UINT drive, UINT fmtID, UINT options);

#define SHFMT_ID_DEFAULT  0xFFFF

#define SHFMT_OPT_FULL  0x0001
#define SHFMT_OPT_SYSONLY  0x0002

#define SHFMT_ERROR  0xFFFFFFFFL
#define SHFMT_CANCEL  0xFFFFFFFEL
#define SHFMT_NOFORMAT  0xFFFFFFFDL

#ifndef HPSXA_DEFINED
#define HPSXA_DEFINED
DECLARE_HANDLE(HPSXA);
#endif

WINSHELLAPI HPSXA SHCreatePropSheetExtArray(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface);
WINSHELLAPI void SHDestroyPropSheetExtArray(HPSXA hpsxa);
WINSHELLAPI UINT SHAddFromPropSheetExtArray(HPSXA hpsxa, LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam);
WINSHELLAPI UINT SHReplaceFromPropSheetExtArray(HPSXA hpsxa, UINT uPageID, LPFNADDPROPSHEETPAGE lpfnReplaceWith, LPARAM lParam);
SHSTDAPI_(LPITEMIDLIST) ILClone(LPCITEMIDLIST pidl);
SHSTDAPI_(LPITEMIDLIST) ILGetNext(LPCITEMIDLIST pidl);
SHSTDAPI_(UINT) ILGetSize(LPCITEMIDLIST pidl);
SHSTDAPI_(LPITEMIDLIST) ILFindLastID(LPCITEMIDLIST pidl);
SHSTDAPI_(BOOL) ILRemoveLastID(LPITEMIDLIST pidl);
SHSTDAPI_(LPITEMIDLIST) ILAppendID(LPITEMIDLIST pidl, LPCSHITEMID pmkid, BOOL fAppend);
SHSTDAPI_(void) ILFree(LPITEMIDLIST pidl);
SHSTDAPI_(LPITEMIDLIST) ILCloneFirst(LPCITEMIDLIST pidl);
SHSTDAPI_(BOOL) ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
SHSTDAPI_(BOOL) ILIsParent(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, BOOL fImmediate);
SHSTDAPI_(LPITEMIDLIST) ILFindChild(LPCITEMIDLIST pidlParent, LPCITEMIDLIST pidlChild);
SHSTDAPI_(LPITEMIDLIST) ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
SHSTDAPI ILLoadFromStream(IStream * pstm, LPITEMIDLIST * pidl);
SHSTDAPI ILSaveToStream(IStream * pstm, LPCITEMIDLIST pidl);

#if (_WIN32_IE >= 0x0400)
SHSTDAPI_(LPITEMIDLIST) ILCreateFromPathA(LPCSTR pszPath);
SHSTDAPI_(LPITEMIDLIST) ILCreateFromPathW(LPCWSTR pszPath);

#ifdef NO_WRAPPERS_FOR_ILCREATEFROMPATH
SHSTDAPI_(LPITEMIDLIST) ILCreateFromPath(LPCTSTR pszPath);
#else
#ifdef UNICODE
#define ILCreateFromPath  ILCreateFromPathW
#else
#define ILCreateFromPath  ILCreateFromPathA
#endif
#endif /* NO_WRAPPERS_FOR_ILCREATEFROMPATH */
#endif /* _WIN32_IE >= 0x0400 */

SHSTDAPI SHILCreateFromPath(LPCWSTR szPath, LPITEMIDLIST * ppidl, DWORD * rgfInOut);

#undef INTERFACE
#define INTERFACE IDefViewFrame
DECLARE_INTERFACE_(IDefViewFrame, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(GetWindowLV)(THIS_ HWND * phwnd) PURE;
    STDMETHOD(ReleaseWindowLV)(THIS) PURE;
    STDMETHOD(GetShellFolder)(THIS_ IShellFolder ** ppsf) PURE;
};

typedef enum RESTRICTIONS {
    REST_NONE = 0x00000000,
    REST_NORUN = 0x00000001,
    REST_NOCLOSE = 0x00000002,
    REST_NOSAVESET = 0x00000004,
    REST_NOFILEMENU = 0x00000008,
    REST_NOSETFOLDERS = 0x00000010,
    REST_NOSETTASKBAR = 0x00000020,
    REST_NODESKTOP = 0x00000040,
    REST_NOFIND = 0x00000080,
    REST_NODRIVES = 0x00000100,
    REST_NODRIVEAUTORUN = 0x00000200,
    REST_NODRIVETYPEAUTORUN = 0x00000400,
    REST_NONETHOOD = 0x00000800,
    REST_STARTBANNER = 0x00001000,
    REST_RESTRICTRUN = 0x00002000,
    REST_NOPRINTERTABS = 0x00004000,
    REST_NOPRINTERDELETE = 0x00008000,
    REST_NOPRINTERADD = 0x00010000,
    REST_NOSTARTMENUSUBFOLDERS = 0x00020000,
    REST_MYDOCSONNET = 0x00040000,
    REST_NOEXITTODOS = 0x00080000,
    REST_ENFORCESHELLEXTSECURITY = 0x00100000,
    REST_LINKRESOLVEIGNORELINKINFO = 0x00200000,
    REST_NOCOMMONGROUPS = 0x00400000,
    REST_SEPARATEDESKTOPPROCESS = 0x00800000,
    REST_NOWEB = 0x01000000,
    REST_NOTRAYCONTEXTMENU = 0x02000000,
    REST_NOVIEWCONTEXTMENU = 0x04000000,
    REST_NONETCONNECTDISCONNECT = 0x08000000,
    REST_STARTMENULOGOFF = 0x10000000,
    REST_NOSETTINGSASSIST = 0x20000000,
    REST_NOINTERNETICON = 0x40000001,
    REST_NORECENTDOCSHISTORY = 0x40000002,
    REST_NORECENTDOCSMENU = 0x40000003,
    REST_NOACTIVEDESKTOP = 0x40000004,
    REST_NOACTIVEDESKTOPCHANGES = 0x40000005,
    REST_NOFAVORITESMENU = 0x40000006,
    REST_CLEARRECENTDOCSONEXIT = 0x40000007,
    REST_CLASSICSHELL = 0x40000008,
    REST_NOCUSTOMIZEWEBVIEW = 0x40000009,
    REST_NOHTMLWALLPAPER = 0x40000010,
    REST_NOCHANGINGWALLPAPER = 0x40000011,
    REST_NODESKCOMP = 0x40000012,
    REST_NOADDDESKCOMP = 0x40000013,
    REST_NODELDESKCOMP = 0x40000014,
    REST_NOCLOSEDESKCOMP = 0x40000015,
    REST_NOCLOSE_DRAGDROPBAND = 0x40000016,
    REST_NOMOVINGBAND = 0x40000017,
    REST_NOEDITDESKCOMP = 0x40000018,
    REST_NORESOLVESEARCH = 0x40000019,
    REST_NORESOLVETRACK = 0x4000001A,
    REST_FORCECOPYACLWITHFILE = 0X4000001B,
    REST_NOLOGO3CHANNELNOTIFY = 0x4000001C,
    REST_NOFORGETSOFTWAREUPDATE = 0x4000001D,
    REST_NOSETACTIVEDESKTOP = 0x4000001E,
    REST_NOUPDATEWINDOWS = 0x4000001F,
    REST_NOCHANGESTARMENU = 0x40000020,
    REST_NOFOLDEROPTIONS = 0x40000021,
    REST_HASFINDCOMPUTERS = 0x40000022,
    REST_INTELLIMENUS = 0x40000023,
    REST_RUNDLGMEMCHECKBOX = 0x40000024,
    REST_ARP_ShowPostSetup = 0x40000025,
    REST_NOCSC = 0x40000026,
    REST_NOCONTROLPANEL = 0x40000027,
    REST_ENUMWORKGROUP = 0x40000028,
    REST_ARP_NOARP = 0x40000029,
    REST_ARP_NOREMOVEPAGE = 0x4000002A,
    REST_ARP_NOADDPAGE = 0x4000002B,
    REST_ARP_NOWINSETUPPAGE = 0x4000002C,
    REST_GREYMSIADS = 0x4000002D,
    REST_NOCHANGEMAPPEDDRIVELABEL = 0x4000002E,
    REST_NOCHANGEMAPPEDDRIVECOMMENT = 0x4000002F,
    REST_MaxRecentDocs = 0x40000030,
    REST_NONETWORKCONNECTIONS = 0x40000031,
    REST_FORCESTARTMENULOGOFF = 0x40000032,
    REST_NOWEBVIEW = 0x40000033,
    REST_NOCUSTOMIZETHISFOLDER = 0x40000034,
    REST_NOENCRYPTION = 0x40000035,
    REST_DONTSHOWSUPERHIDDEN = 0x40000037,
    REST_NOSHELLSEARCHBUTTON = 0x40000038,
    REST_NOHARDWARETAB = 0x40000039,
    REST_NORUNASINSTALLPROMPT = 0x4000003A,
    REST_PROMPTRUNASINSTALLNETPATH = 0x4000003B,
    REST_NOMANAGEMYCOMPUTERVERB = 0x4000003C,
    REST_NORECENTDOCSNETHOOD = 0x4000003D,
    REST_DISALLOWRUN = 0x4000003E,
    REST_NOWELCOMESCREEN = 0x4000003F,
    REST_RESTRICTCPL = 0x40000040,
    REST_DISALLOWCPL = 0x40000041,
    REST_NOSMBALLOONTIP = 0x40000042,
    REST_NOSMHELP = 0x40000043,
    REST_NOWINKEYS = 0x40000044,
    REST_NOENCRYPTONMOVE = 0x40000045,
    REST_NOLOCALMACHINERUN = 0x40000046,
    REST_NOCURRENTUSERRUN = 0x40000047,
    REST_NOLOCALMACHINERUNONCE = 0x40000048,
    REST_NOCURRENTUSERRUNONCE = 0x40000049,
    REST_FORCEACTIVEDESKTOPON = 0x4000004A,
    REST_NOCOMPUTERSNEARME = 0x4000004B,
    REST_NOVIEWONDRIVE = 0x4000004C,
    REST_NONETCRAWL = 0x4000004D,
    REST_NOSHAREDDOCUMENTS = 0x4000004E,
    REST_NOSMMYDOCS = 0x4000004F,
    REST_NOSMMYPICS = 0x40000050,
    REST_ALLOWBITBUCKDRIVES = 0x40000051,
    REST_NONLEGACYSHELLMODE = 0x40000052,
    REST_NOCONTROLPANELBARRICADE = 0x40000053,
    REST_NOSTARTPAGE = 0x40000054,
    REST_NOAUTOTRAYNOTIFY = 0x40000055,
    REST_NOTASKGROUPING = 0x40000056,
    REST_NOCDBURNING = 0x40000057,
    REST_MYCOMPNOPROP = 0x40000058,
    REST_MYDOCSNOPROP = 0x40000059,
    REST_NOSTARTPANEL = 0x4000005A,
    REST_NODISPLAYAPPEARANCEPAGE = 0x4000005B,
    REST_NOTHEMESTAB = 0x4000005C,
    REST_NOVISUALSTYLECHOICE = 0x4000005D,
    REST_NOSIZECHOICE = 0x4000005E,
    REST_NOCOLORCHOICE = 0x4000005F,
    REST_SETVISUALSTYLE = 0x40000060,
    REST_STARTRUNNOHOMEPATH = 0x40000061,
    REST_NOUSERNAMEINSTARTPANEL = 0x40000062,
    REST_NOMYCOMPUTERICON = 0x40000063,
    REST_NOSMNETWORKPLACES = 0x40000064,
    REST_NOSMPINNEDLIST = 0x40000065,
    REST_NOSMMYMUSIC = 0x40000066,
    REST_NOSMEJECTPC = 0x40000067,
    REST_NOSMMOREPROGRAMS = 0x40000068,
    REST_NOSMMFUPROGRAMS = 0x40000069,
    REST_NOTRAYITEMSDISPLAY = 0x4000006A,
    REST_NOTOOLBARSONTASKBAR = 0x4000006B,
    REST_NOSMCONFIGUREPROGRAMS = 0x4000006F,
    REST_HIDECLOCK = 0x40000070,
    REST_NOLOWDISKSPACECHECKS = 0x40000071,
    REST_NOENTIRENETWORK = 0x40000072,
    REST_NODESKTOPCLEANUP = 0x40000073,
    REST_BITBUCKNUKEONDELETE = 0x40000074,
    REST_BITBUCKCONFIRMDELETE = 0x40000075,
    REST_BITBUCKNOPROP = 0x40000076,
    REST_NODISPBACKGROUND = 0x40000077,
    REST_NODISPSCREENSAVEPG = 0x40000078,
    REST_NODISPSETTINGSPG = 0x40000079,
    REST_NODISPSCREENSAVEPREVIEW = 0x4000007A,
    REST_NODISPLAYCPL = 0x4000007B,
    REST_HIDERUNASVERB = 0x4000007C,
    REST_NOTHUMBNAILCACHE = 0x4000007D,
    REST_NOSTRCMPLOGICAL = 0x4000007E,
    REST_ALLOWUNHASHEDWEBVIEW = 0x40000082,
    REST_ALLOWLEGACYWEBVIEW = 0x40000083,
    REST_REVERTWEBVIEWSECURITY = 0x40000084,
    REST_INHERITCONSOLEHANDLES = 0x40000086,
    REST_NODISCONNECT = 0x41000001,
    REST_NOSECURITY = 0x41000002,
    REST_NOFILEASSOCIATE = 0x41000003,
} RESTRICTIONS;

SHSTDAPI_(IStream *) OpenRegStream(HKEY hkey, LPCWSTR pszSubkey, LPCWSTR pszValue, DWORD grfMode);
SHSTDAPI_(BOOL) SHFindFiles(LPCITEMIDLIST pidlFolder, LPCITEMIDLIST pidlSaveFile);
SHSTDAPI_(void) PathGetShortPath(LPWSTR pszLongPath);
SHSTDAPI_(BOOL) PathYetAnotherMakeUniqueName(LPWSTR pszUniqueName, LPCWSTR pszPath, LPCWSTR pszShort, LPCWSTR pszFileSpec);
SHSTDAPI_(BOOL) Win32DeleteFile(LPCWSTR pszPath);

#define PPCF_ADDQUOTES  0x00000001
#define PPCF_ADDARGUMENTS  0x00000003
#define PPCF_NODIRECTORIES  0x00000010
#define PPCF_NORELATIVEOBJECTQUALIFY  0x00000020
#define PPCF_FORCEQUALIFY  0x00000040
#define PPCF_LONGESTPOSSIBLE  0x00000080

SHSTDAPI_(LONG) PathProcessCommand(LPCWSTR lpSrc, LPWSTR lpDest, int iMax, DWORD dwFlags);
SHSTDAPI_(DWORD) SHRestricted(RESTRICTIONS rest);
SHSTDAPI_(BOOL) SignalFileOpen(LPCITEMIDLIST pidl);
SHSTDAPI_(LPITEMIDLIST) SHSimpleIDListFromPath(LPCWSTR pszPath);
SHSTDAPI SHLoadOLE(LPARAM lParam);
SHSTDAPI SHStartNetConnectionDialogA(HWND hwnd, LPCSTR pszRemoteName, DWORD dwType);
SHSTDAPI SHStartNetConnectionDialogW(HWND hwnd, LPCWSTR pszRemoteName, DWORD dwType);
#ifdef UNICODE
#define SHStartNetConnectionDialog  SHStartNetConnectionDialogW
#else
#define SHStartNetConnectionDialog  SHStartNetConnectionDialogA
#endif
SHSTDAPI SHDefExtractIconA(LPCSTR pszIconFile, int iIndex, UINT uFlags, HICON * phiconLarge, HICON * phiconSmall, UINT nIconSize);
SHSTDAPI SHDefExtractIconW(LPCWSTR pszIconFile, int iIndex, UINT uFlags, HICON * phiconLarge, HICON * phiconSmall, UINT nIconSize);
#ifdef UNICODE
#define SHDefExtractIcon  SHDefExtractIconW
#else
#define SHDefExtractIcon  SHDefExtractIconA
#endif
SHSTDAPI_(BOOL) Shell_GetImageLists(HIMAGELIST * phiml, HIMAGELIST * phimlSmall);
SHSTDAPI_(int) Shell_GetCachedImageIndex(LPCWSTR pszIconPath, int iIconIndex, UINT uIconFlags);

#undef INTERFACE
#define INTERFACE  IDocViewSite
DECLARE_INTERFACE_(IDocViewSite, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(OnSetTitle)(THIS_ VARIANTARG * pvTitle) PURE;
};

#define VALIDATEUNC_NOUI  0x0002
#define VALIDATEUNC_CONNECT  0x0001
#define VALIDATEUNC_PRINT  0x0004
#define VALIDATEUNC_VALID  0x0007

SHSTDAPI_(BOOL) SHValidateUNC(HWND hwndOwner, LPWSTR pszFile, UINT fConnect);

#define OPENPROPS_NONE  0x0000
#define OPENPROPS_INHIBITPIF  0x8000
#define GETPROPS_NONE  0x0000
#define SETPROPS_NONE  0x0000
#define CLOSEPROPS_NONE  0x0000
#define CLOSEPROPS_DISCARD  0x0001

#define PIFNAMESIZE  30
#define PIFSTARTLOCSIZE  63
#define PIFDEFPATHSIZE  64
#define PIFPARAMSSIZE  64
#define PIFSHPROGSIZE  64
#define PIFSHDATASIZE  64
#define PIFDEFFILESIZE  80
#define PIFMAXFILEPATH  260

typedef struct PROPPRG {
    WORD flPrg;
    WORD flPrgInit;
    CHAR achTitle[PIFNAMESIZE];
    CHAR achCmdLine[PIFSTARTLOCSIZE + PIFPARAMSSIZE + 1];
    CHAR achWorkDir[PIFDEFPATHSIZE];
    WORD wHotKey;
    CHAR achIconFile[PIFDEFFILESIZE];
    WORD wIconIndex;
    DWORD dwEnhModeFlags;
    DWORD dwRealModeFlags;
    CHAR achOtherFile[PIFDEFFILESIZE];
    CHAR achPIFFile[PIFMAXFILEPATH];
} PROPPRG;
typedef UNALIGNED PROPPRG *PPROPPRG;
typedef UNALIGNED PROPPRG *LPPROPPRG;
typedef const UNALIGNED PROPPRG *LPCPROPPRG;

SHSTDAPI_(HANDLE) PifMgr_OpenProperties(LPCWSTR pszApp, LPCWSTR pszPIF, UINT hInf, UINT flOpt);
SHSTDAPI_(int) PifMgr_GetProperties(HANDLE hProps, LPCSTR pszGroup, void *lpProps, int cbProps, UINT flOpt);
SHSTDAPI_(int) PifMgr_SetProperties(HANDLE hProps, LPCSTR pszGroup, const VOID * lpProps, int cbProps, UINT flOpt);
SHSTDAPI_(HANDLE) PifMgr_CloseProperties(HANDLE hProps, UINT flOpt);
SHSTDAPI_(void) SHSetInstanceExplorer(IUnknown * punk);
SHSTDAPI_(BOOL) IsUserAnAdmin(void);

#undef INTERFACE
#define INTERFACE IInitializeObject
DECLARE_INTERFACE_(IInitializeObject, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(Initialize)(THIS) PURE;
};

enum {
    BMICON_LARGE = 0,
    BMICON_SMALL
};

#undef INTERFACE
#define INTERFACE IBanneredBar
DECLARE_INTERFACE_(IBanneredBar, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(SetIconSize)(THIS_ DWORD iIcon) PURE;
    STDMETHOD(GetIconSize)(THIS_ DWORD * piIcon) PURE;
    STDMETHOD(SetBitmap)(THIS_ HBITMAP hBitmap) PURE;
    STDMETHOD(GetBitmap)(THIS_ HBITMAP * phBitmap) PURE;
};

SHSTDAPI_(LRESULT) SHShellFolderView_Message(HWND hwndMain, UINT uMsg, LPARAM lParam);

#undef INTERFACE
#define INTERFACE IShellFolderViewCB
DECLARE_INTERFACE_(IShellFolderViewCB, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(MessageSFVCB)(THIS_ UINT uMsg, WPARAM wParam, LPARAM lParam) PURE;
};

#include <pshpack8.h>

#undef UNSIZED_ARRAY2
#undef EMPTY_SIZE2
#define UNSIZED_ARRAY2
#define EMPTY_SIZE2  UNSIZED_ARRAY2

#define QCMINFO_PLACE_BEFORE  0
#define QCMINFO_PLACE_AFTER  1

typedef struct _QCMINFO_IDMAP_PLACEMENT {
    UINT id;
    UINT fFlags;
} QCMINFO_IDMAP_PLACEMENT;

typedef struct _QCMINFO_IDMAP {
    UINT nMaxIds;
    QCMINFO_IDMAP_PLACEMENT pIdList[1];
} QCMINFO_IDMAP;

typedef struct _QCMINFO {
    HMENU hmenu;
    UINT indexMenu;
    UINT idCmdFirst;
    UINT idCmdLast;
    QCMINFO_IDMAP const *pIdMap;
} QCMINFO;
typedef QCMINFO *LPQCMINFO;

#define TBIF_APPEND  0
#define TBIF_PREPEND  1
#define TBIF_REPLACE  2
#define TBIF_DEFAULT  0x00000000
#define TBIF_INTERNETBAR  0x00010000
#define TBIF_STANDARDTOOLBAR  0x00020000
#define TBIF_NOTOOLBAR  0x00030000

typedef struct _TBINFO {
    UINT cbuttons;
    UINT uFlags;
} TBINFO;

typedef struct _DETAILSINFO {
    LPCITEMIDLIST pidl;
    int fmt;
    int cxChar;
    STRRET str;
    int iImage;
} DETAILSINFO;

typedef struct _SFVM_PROPPAGE_DATA {
    DWORD dwReserved;
    LPFNADDPROPSHEETPAGE pfn;
    LPARAM lParam;
} SFVM_PROPPAGE_DATA;

typedef struct _SFVM_HELPTOPIC_DATA {
    WCHAR wszHelpFile[MAX_PATH];
    WCHAR wszHelpTopic[MAX_PATH];
} SFVM_HELPTOPIC_DATA;

#define SFVM_MERGEMENU  1
#define SFVM_INVOKECOMMAND  2
#define SFVM_GETHELPTEXT  3
#define SFVM_GETTOOLTIPTEXT  4
#define SFVM_GETBUTTONINFO  5
#define SFVM_GETBUTTONS  6
#define SFVM_INITMENUPOPUP  7
#define SFVM_WINDOWCREATED  15
#define SFVM_GETDETAILSOF  23
#define SFVM_COLUMNCLICK  24
#define SFVM_QUERYFSNOTIFY  25
#define SFVM_DEFITEMCOUNT  26
#define SFVM_DEFVIEWMODE  27
#define SFVM_UNMERGEMENU  28
#define SFVM_UPDATESTATUSBAR  31
#define SFVM_BACKGROUNDENUM  32
#define SFVM_DIDDRAGDROP  36
#define SFVM_SETISFV  39
#define SFVM_THISIDLIST  41
#define SFVM_ADDPROPERTYPAGES  47
#define SFVM_BACKGROUNDENUMDONE  48
#define SFVM_GETNOTIFY  49
#define SFVM_GETSORTDEFAULTS  53
#define SFVM_SIZE  57
#define SFVM_GETZONE  58
#define SFVM_GETPANE  59
#define SFVM_GETHELPTOPIC  63

typedef struct _SFV_CREATE {
    UINT cbSize;
    IShellFolder *pshf;
    IShellView *psvOuter;
    IShellFolderViewCB *psfvcb;
} SFV_CREATE;

SHSTDAPI SHCreateShellFolderView(const SFV_CREATE * pcsfv, IShellView ** ppsv);
typedef HRESULT(CALLBACK * LPFNDFMCALLBACK)(IShellFolder * psf, HWND hwnd, IDataObject * pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam);

SHSTDAPI CDefFolderMenu_Create2(LPCITEMIDLIST pidlFolder, HWND hwnd, UINT cidl, LPCITEMIDLIST * apidl, IShellFolder * psf, LPFNDFMCALLBACK lpfn, UINT nKeys, const HKEY * ahkeyClsKeys, IContextMenu ** ppcm);

SHSTDAPI_(BOOL) SHOpenPropSheetA(LPCSTR pszCaption, HKEY ahkeys[], UINT cikeys, const CLSID * pclsidDefault, IDataObject * pdtobj, IShellBrowser * psb, LPCSTR pStartPage);
SHSTDAPI_(BOOL) SHOpenPropSheetW(LPCWSTR pszCaption, HKEY ahkeys[], UINT cikeys, const CLSID * pclsidDefault, IDataObject * pdtobj, IShellBrowser * psb, LPCWSTR pStartPage);
#ifdef UNICODE
#define SHOpenPropSheet  SHOpenPropSheetW
#else
#define SHOpenPropSheet  SHOpenPropSheetA
#endif

#define DFM_MERGECONTEXTMENU  1
#define DFM_INVOKECOMMAND  2
#define DFM_GETDEFSTATICID  14
#define DFM_CMD_PROPERTIES  ((UINT)-5)
typedef TBINFO *LPTBINFO;

typedef DETAILSINFO *PDETAILSINFO;

typedef HRESULT(CALLBACK * LPFNVIEWCALLBACK)(IShellView * psvOuter, IShellFolder * psf, HWND hwndMain, UINT uMsg, WPARAM wParam, LPARAM lParam);

typedef struct _CSFV {
    UINT cbSize;
    IShellFolder *pshf;
    IShellView *psvOuter;
    LPCITEMIDLIST pidl;
    LONG lEvents;
    LPFNVIEWCALLBACK pfnCallback;
    FOLDERVIEWMODE fvm;
} CSFV, *LPCSFV;

#define SFVM_REARRANGE  0x00000001
#define ShellFolderView_ReArrange(_hwnd, _lparam)  (BOOL)SHShellFolderView_Message(_hwnd, SFVM_REARRANGE, _lparam)
#define SFVM_ADDOBJECT  0x00000003
#define ShellFolderView_AddObject(_hwnd, _pidl)  (LPARAM)SHShellFolderView_Message(_hwnd, SFVM_ADDOBJECT, (LPARAM)_pidl)
#define SFVM_REMOVEOBJECT  0x00000006
#define ShellFolderView_RemoveObject(_hwnd, _pidl)  (LPARAM)SHShellFolderView_Message(_hwnd, SFVM_REMOVEOBJECT, (LPARAM)_pidl)
#define SFVM_UPDATEOBJECT  0x00000007
#define ShellFolderView_UpdateObject(_hwnd, _ppidl)  (LPARAM)SHShellFolderView_Message(_hwnd, SFVM_UPDATEOBJECT, (LPARAM)_ppidl)
#define SFVM_GETSELECTEDOBJECTS  0x00000009
#define ShellFolderView_GetSelectedObjects(_hwnd, ppidl)  (LPARAM)SHShellFolderView_Message(_hwnd, SFVM_GETSELECTEDOBJECTS, (LPARAM)ppidl)

typedef struct _SFV_SETITEMPOS {
    LPCITEMIDLIST pidl;
    POINT pt;
} SFV_SETITEMPOS, *LPSFV_SETITEMPOS;

#define SFVM_SETITEMPOS  0x0000000e
#define ShellFolderView_SetItemPos(_hwnd, _pidl, _x, _y)  {SFV_SETITEMPOS _sip = {_pidl, {_x, _y}}; \
        SHShellFolderView_Message(_hwnd, SFVM_SETITEMPOS, (LPARAM)(LPSFV_SETITEMPOS)&_sip);}

#define SFVM_SETCLIPBOARD  0x00000010
#define ShellFolderView_SetClipboard(_hwnd, _dwEffect)  (void)SHShellFolderView_Message(_hwnd, SFVM_SETCLIPBOARD, (LPARAM)(DWORD)(_dwEffect))
#define SFVM_SETPOINTS  0x00000017
#define ShellFolderView_SetPoints(_hwnd, _pdtobj)  (void)SHShellFolderView_Message(_hwnd, SFVM_SETPOINTS, (LPARAM)_pdtobj)

#include <poppack.h>
SHSTDAPI_(IContextMenu *) SHFind_InitMenuPopup(HMENU hmenu, HWND hwndOwner, UINT idCmdFirst, UINT idCmdLast);
SHSTDAPI SHCreateShellFolderViewEx(LPCSFV pcsfv, IShellView ** ppsv);

#define PID_IS_URL  2
#define PID_IS_NAME  4
#define PID_IS_WORKINGDIR  5
#define PID_IS_HOTKEY  6
#define PID_IS_SHOWCMD  7
#define PID_IS_ICONINDEX  8
#define PID_IS_ICONFILE  9
#define PID_IS_WHATSNEW  10
#define PID_IS_AUTHOR  11
#define PID_IS_DESCRIPTION  12
#define PID_IS_COMMENT  13

#define PID_INTSITE_WHATSNEW  2
#define PID_INTSITE_AUTHOR  3
#define PID_INTSITE_LASTVISIT  4
#define PID_INTSITE_LASTMOD  5
#define PID_INTSITE_VISITCOUNT  6
#define PID_INTSITE_DESCRIPTION  7
#define PID_INTSITE_COMMENT  8
#define PID_INTSITE_FLAGS  9
#define PID_INTSITE_CONTENTLEN  10
#define PID_INTSITE_CONTENTCODE  11
#define PID_INTSITE_RECURSE  12
#define PID_INTSITE_WATCH  13
#define PID_INTSITE_SUBSCRIPTION  14
#define PID_INTSITE_URL  15
#define PID_INTSITE_TITLE  16
#define PID_INTSITE_CODEPAGE  18
#define PID_INTSITE_TRACKING  19
#define PID_INTSITE_ICONINDEX  20
#define PID_INTSITE_ICONFILE  21

#define PIDISF_RECENTLYCHANGED  0x00000001
#define PIDISF_CACHEDSTICKY  0x00000002
#define PIDISF_CACHEIMAGES  0x00000010
#define PIDISF_FOLLOWALLLINKS  0x00000020

#define PIDISM_GLOBAL  0
#define PIDISM_WATCH  1
#define PIDISM_DONTWATCH  2

typedef struct {
    BOOL fShowAllObjects:1;
    BOOL fShowExtensions:1;
    BOOL fNoConfirmRecycle:1;
    BOOL fShowSysFiles:1;
    BOOL fShowCompColor:1;
    BOOL fDoubleClickInWebView:1;
    BOOL fDesktopHTML:1;
    BOOL fWin95Classic:1;
    BOOL fDontPrettyPath:1;
    BOOL fShowAttribCol:1;
    BOOL fMapNetDrvBtn:1;
    BOOL fShowInfoTip:1;
    BOOL fHideIcons:1;
    BOOL fWebView:1;
    BOOL fFilter:1;
    BOOL fShowSuperHidden:1;
    BOOL fNoNetCrawling:1;
    DWORD dwWin95Unused;
    UINT uWin95Unused;
    LONG lParamSort;
    int iSortDirection;
    UINT version;
    UINT uNotUsed;
    BOOL fSepProcess:1;
    BOOL fStartPanelOn:1;
    BOOL fShowStartPage:1;
    UINT fSpareFlags:13;
} SHELLSTATEA, *LPSHELLSTATEA;

typedef struct {
    BOOL fShowAllObjects:1;
    BOOL fShowExtensions:1;
    BOOL fNoConfirmRecycle:1;
    BOOL fShowSysFiles:1;
    BOOL fShowCompColor:1;
    BOOL fDoubleClickInWebView:1;
    BOOL fDesktopHTML:1;
    BOOL fWin95Classic:1;
    BOOL fDontPrettyPath:1;
    BOOL fShowAttribCol:1;
    BOOL fMapNetDrvBtn:1;
    BOOL fShowInfoTip:1;
    BOOL fHideIcons:1;
    BOOL fWebView:1;
    BOOL fFilter:1;
    BOOL fShowSuperHidden:1;
    BOOL fNoNetCrawling:1;
    DWORD dwWin95Unused;
    UINT uWin95Unused;
    LONG lParamSort;
    int iSortDirection;
    UINT version;
    UINT uNotUsed;
    BOOL fSepProcess:1;
    BOOL fStartPanelOn:1;
    BOOL fShowStartPage:1;
    UINT fSpareFlags:13;
} SHELLSTATEW, *LPSHELLSTATEW;

#define SHELLSTATEVERSION_IE4  9
#define SHELLSTATEVERSION_WIN2K  10

#ifdef UNICODE
#define SHELLSTATE  SHELLSTATEW
#define LPSHELLSTATE  LPSHELLSTATEW
#else
#define SHELLSTATE  SHELLSTATEA
#define LPSHELLSTATE  LPSHELLSTATEA
#endif

#define SHELLSTATE_SIZE_WIN95  FIELD_OFFSET(SHELLSTATE,lParamSort)
#define SHELLSTATE_SIZE_NT4  FIELD_OFFSET(SHELLSTATE,version)
#define SHELLSTATE_SIZE_IE4  FIELD_OFFSET(SHELLSTATE,uNotUsed)
#define SHELLSTATE_SIZE_WIN2K  sizeof(SHELLSTATE)

SHSTDAPI_(void) SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet);

typedef struct {
    BOOL fShowAllObjects:1;
    BOOL fShowExtensions:1;
    BOOL fNoConfirmRecycle:1;
    BOOL fShowSysFiles:1;
    BOOL fShowCompColor:1;
    BOOL fDoubleClickInWebView:1;
    BOOL fDesktopHTML:1;
    BOOL fWin95Classic:1;
    BOOL fDontPrettyPath:1;
    BOOL fShowAttribCol:1;
    BOOL fMapNetDrvBtn:1;
    BOOL fShowInfoTip:1;
    BOOL fHideIcons:1;
    UINT fRestFlags:3;
} SHELLFLAGSTATE, *LPSHELLFLAGSTATE;

#define SSF_SHOWALLOBJECTS  0x00000001
#define SSF_SHOWEXTENSIONS  0x00000002
#define SSF_SHOWCOMPCOLOR  0x00000008
#define SSF_SHOWSYSFILES  0x00000020
#define SSF_DOUBLECLICKINWEBVIEW  0x00000080
#define SSF_SHOWATTRIBCOL  0x00000100
#define SSF_DESKTOPHTML  0x00000200
#define SSF_WIN95CLASSIC  0x00000400
#define SSF_DONTPRETTYPATH  0x00000800
#define SSF_SHOWINFOTIP  0x00002000
#define SSF_MAPNETDRVBUTTON  0x00001000
#define SSF_NOCONFIRMRECYCLE  0x00008000
#define SSF_HIDEICONS  0x00004000

SHSTDAPI_(void) SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
SHSTDAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, void **ppv, LPCITEMIDLIST * ppidlLast);
SHSTDAPI SHParseDisplayName(PCWSTR pszName, IBindCtx * pbc, LPITEMIDLIST * ppidl, SFGAOF sfgaoIn, SFGAOF * psfgaoOut);

#define SHPPFW_NONE  0x00000000
#define SHPPFW_DEFAULT  SHPPFW_DIRCREATE
#define SHPPFW_DIRCREATE  0x00000001
#define SHPPFW_ASKDIRCREATE  0x00000002
#define SHPPFW_IGNOREFILENAME  0x00000004
#define SHPPFW_NOWRITECHECK  0x00000008
#define SHPPFW_MEDIACHECKONLY  0x00000010

SHSTDAPI SHPathPrepareForWriteA(HWND hwnd, IUnknown * punkEnableModless, LPCSTR pszPath, DWORD dwFlags);
SHSTDAPI SHPathPrepareForWriteW(HWND hwnd, IUnknown * punkEnableModless, LPCWSTR pszPath, DWORD dwFlags);
#ifdef UNICODE
#define SHPathPrepareForWrite  SHPathPrepareForWriteW
#else
#define SHPathPrepareForWrite  SHPathPrepareForWriteA
#endif

#undef INTERFACE
#define INTERFACE  INamedPropertyBag
DECLARE_INTERFACE_(INamedPropertyBag, IUnknown) {
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
    STDMETHOD_(ULONG, AddRef)(THIS) PURE;
    STDMETHOD_(ULONG, Release)(THIS) PURE;
    STDMETHOD(ReadPropertyNPB)(THIS_ LPCOLESTR pszBagname, LPCOLESTR pszPropName, PROPVARIANT * pVar) PURE;
    STDMETHOD(WritePropertyNPB)(THIS_ LPCOLESTR pszBagname, LPCOLESTR pszPropName, PROPVARIANT * pVar) PURE;
    STDMETHOD(RemovePropertyNPB)(THIS_ LPCOLESTR pszBagname, LPCOLESTR pszPropName) PURE;
};

#ifdef _URLMON_H
SHDOCAPI_(DWORD) SoftwareUpdateMessageBox(HWND hWnd, LPCWSTR szDistUnit, DWORD dwFlags, LPSOFTDISTINFO psdi);
#endif

SHSTDAPI SHPropStgCreate(IPropertySetStorage * psstg, REFFMTID fmtid, CLSID * pclsid, DWORD grfFlags, DWORD grfMode, DWORD dwDisposition, IPropertyStorage ** ppstg, UINT * puCodePage);
SHSTDAPI SHPropStgReadMultiple(IPropertyStorage * pps, UINT uCodePage, ULONG cpspec, PROPSPEC const rgpspec[], PROPVARIANT rgvar[]);
SHSTDAPI SHPropStgWriteMultiple(IPropertyStorage * pps, UINT * puCodePage, ULONG cpspec, PROPSPEC const rgpspec[], PROPVARIANT rgvar[], PROPID propidNameFirst);
SHSTDAPI SHCreateFileExtractIconA(LPCSTR pszFile, DWORD dwFileAttributes, REFIID riid, void **ppv);
SHSTDAPI SHCreateFileExtractIconW(LPCWSTR pszFile, DWORD dwFileAttributes, REFIID riid, void **ppv);
#ifdef UNICODE
#define SHCreateFileExtractIcon  SHCreateFileExtractIconW
#else
#define SHCreateFileExtractIcon  SHCreateFileExtractIconA
#endif

#include <pshpack8.h>
SHSTDAPI SHLimitInputEdit(HWND hwndEdit, IShellFolder * psf);

#if (_WIN32_WINNT >= 0x0500) || (_WIN32_WINDOWS >= 0x0500)
SHSTDAPI SHMultiFileProperties(IDataObject * pdtobj, DWORD dwFlags);
#endif

#if (_WIN32_IE >= 0x0600)
typedef void (CALLBACK * PFNASYNCICONTASKBALLBACK)(LPCITEMIDLIST pidl, LPVOID pvData, LPVOID pvHint, INT iIconIndex, INT iOpenIconIndex);
SHSTDAPI SHMapIDListToImageListIndexAsync(IShellTaskScheduler * pts, IShellFolder * psf, LPCITEMIDLIST pidl, UINT flags, PFNASYNCICONTASKBALLBACK pfn, LPVOID pvData, LPVOID pvHint, int *piIndex, int *piIndexSel);
#endif

SHSTDAPI_(int) SHMapPIDLToSystemImageListIndex(IShellFolder * pshf, LPCITEMIDLIST pidl, int *piIndexSel);

EXTERN_C WINSHELLAPI HRESULT STDAPICALLTYPE SHCLSIDFromString(LPCWSTR lpsz, LPCLSID lpclsid);
HANDLE _SHAllocShared(LPCVOID pvData, DWORD dwSize, DWORD dwDestinationProcessId);
BOOL _SHFreeShared(HANDLE hData, DWORD dwSourceProcessId);
void *_SHLockShared(HANDLE hData, DWORD dwSourceProcessId);
BOOL _SHUnlockShared(void *pvData);
STDAPI SHFlushClipboard(void);
STDAPI SHCreateQueryCancelAutoPlayMoniker(IMoniker ** ppmoniker);
HINSTANCE WINAPI SHGetShellStyleHInstance(void);
STDAPI_(void) PerUserInit(void);
WINSHELLAPI BOOL WINAPI SHRunControlPanel(LPCWSTR lpcszCmdLine, HWND hwndMsgParent);

#ifndef _SHLOBJ_NO_PICKICONDLG
WINSHELLAPI int WINAPI PickIconDlg(HWND hwnd, LPWSTR pszIconPath, UINT cbIconPath, int *piIconIndex);
#endif

typedef struct tagAAMENUFILENAME {
    SHORT cbTotal;
    BYTE rgbReserved[12];
    WCHAR szFileName[1];
} AASHELLMENUFILENAME, *LPAASHELLMENUFILENAME;

typedef struct tagAASHELLMENUITEM {
    void *lpReserved1;
    int iReserved;
    UINT uiReserved;
    LPAASHELLMENUFILENAME lpName;
    LPWSTR psz;
} AASHELLMENUITEM, *LPAASHELLMENUITEM;

STDAPI SHGetAttributesFromDataObject(IDataObject * pdo, DWORD dwAttributeMask, DWORD * pdwAttributes, UINT * pcItems);

#include <poppack.h>

#if __POCC__ >= 290
#pragma warn(pop)
#endif

#ifdef __cplusplus
}

#endif

#include <poppack.h>

SHDOCAPI_(BOOL) ImportPrivacySettings(LPCWSTR szFilename, BOOL * pfParsePrivacyPreferences, BOOL * pfParsePerSiteRules);
#ifndef IEnumPrivacyRecords
typedef interface IEnumPrivacyRecords IEnumPrivacyRecords;
#endif
SHDOCAPI DoPrivacyDlg(HWND hwndParent, LPOLESTR pszUrl, IEnumPrivacyRecords * pPrivacyEnum, BOOL fReportAllSites);

#endif /* _SHLOBJ_H */
