mirror of https://github.com/UMSKT/xpmgr.git
1712 lines
67 KiB
C
1712 lines
67 KiB
C
/*****************************************************************************\
|
|
* *
|
|
* shellapi.h - SHELL.DLL functions, types, and definitions *
|
|
* *
|
|
* Copyright (c) Microsoft Corporation. All rights reserved. *
|
|
* *
|
|
\*****************************************************************************/
|
|
|
|
#ifndef _INC_SHELLAPI
|
|
#define _INC_SHELLAPI
|
|
|
|
#include <SpecStrings.h>
|
|
|
|
//
|
|
// Define API decoration for direct importing of DLL references.
|
|
//
|
|
#ifndef WINSHELLAPI
|
|
#if !defined(_SHELL32_)
|
|
#define WINSHELLAPI DECLSPEC_IMPORT
|
|
#else
|
|
#define WINSHELLAPI
|
|
#endif
|
|
#endif // WINSHELLAPI
|
|
|
|
#ifndef SHSTDAPI
|
|
#if !defined(_SHELL32_)
|
|
#define SHSTDAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
|
|
#define SHSTDAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
|
|
#else
|
|
#define SHSTDAPI STDAPI
|
|
#define SHSTDAPI_(type) STDAPI_(type)
|
|
#endif
|
|
#endif // SHSTDAPI
|
|
|
|
#ifndef SHDOCAPI
|
|
#if !defined(_SHDOCVW_)
|
|
#define SHDOCAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
|
|
#define SHDOCAPI_(type) EXTERN_C DECLSPEC_IMPORT type STDAPICALLTYPE
|
|
#else
|
|
#define SHDOCAPI STDAPI
|
|
#define SHDOCAPI_(type) STDAPI_(type)
|
|
#endif
|
|
#endif // SHDOCAPI
|
|
|
|
|
|
#if !defined(_WIN64)
|
|
#include <pshpack1.h>
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" { /* Assume C declarations for C++ */
|
|
#endif /* __cplusplus */
|
|
|
|
|
|
|
|
DECLARE_HANDLE(HDROP);
|
|
|
|
__success(return != 0)
|
|
SHSTDAPI_(UINT) DragQueryFileA(__in HDROP hDrop, __in UINT iFile, __out_ecount_opt(cch) LPSTR lpszFile, __in UINT cch);
|
|
__success(return != 0)
|
|
SHSTDAPI_(UINT) DragQueryFileW(__in HDROP hDrop, __in UINT iFile, __out_ecount_opt(cch) LPWSTR lpszFile, __in UINT cch);
|
|
#ifdef UNICODE
|
|
#define DragQueryFile DragQueryFileW
|
|
#else
|
|
#define DragQueryFile DragQueryFileA
|
|
#endif // !UNICODE
|
|
SHSTDAPI_(BOOL) DragQueryPoint(__in HDROP hDrop,__out LPPOINT lppt);
|
|
SHSTDAPI_(void) DragFinish(__in HDROP hDrop);
|
|
SHSTDAPI_(void) DragAcceptFiles(__in HWND hWnd, __in BOOL fAccept);
|
|
|
|
SHSTDAPI_(HINSTANCE) ShellExecuteA(__in_opt HWND hwnd, __in_opt LPCSTR lpOperation, __in LPCSTR lpFile, __in_opt LPCSTR lpParameters,
|
|
__in_opt LPCSTR lpDirectory, __in INT nShowCmd);
|
|
SHSTDAPI_(HINSTANCE) ShellExecuteW(__in_opt HWND hwnd, __in_opt LPCWSTR lpOperation, __in LPCWSTR lpFile, __in_opt LPCWSTR lpParameters,
|
|
__in_opt LPCWSTR lpDirectory, __in INT nShowCmd);
|
|
#ifdef UNICODE
|
|
#define ShellExecute ShellExecuteW
|
|
#else
|
|
#define ShellExecute ShellExecuteA
|
|
#endif // !UNICODE
|
|
__success(return > 32) // SE_ERR_DLLNOTFOUND
|
|
SHSTDAPI_(HINSTANCE) FindExecutableA(__in LPCSTR lpFile, __in_opt LPCSTR lpDirectory, __out_ecount(MAX_PATH) LPSTR lpResult);
|
|
__success(return > 32) // SE_ERR_DLLNOTFOUND
|
|
SHSTDAPI_(HINSTANCE) FindExecutableW(__in LPCWSTR lpFile, __in_opt LPCWSTR lpDirectory, __out_ecount(MAX_PATH) LPWSTR lpResult);
|
|
#ifdef UNICODE
|
|
#define FindExecutable FindExecutableW
|
|
#else
|
|
#define FindExecutable FindExecutableA
|
|
#endif // !UNICODE
|
|
SHSTDAPI_(LPWSTR *) CommandLineToArgvW(__in LPCWSTR lpCmdLine, __out int* pNumArgs);
|
|
|
|
SHSTDAPI_(INT) ShellAboutA(__in_opt HWND hWnd, __in LPCSTR szApp, __in_opt LPCSTR szOtherStuff, __in_opt HICON hIcon);
|
|
SHSTDAPI_(INT) ShellAboutW(__in_opt HWND hWnd, __in LPCWSTR szApp, __in_opt LPCWSTR szOtherStuff, __in_opt HICON hIcon);
|
|
#ifdef UNICODE
|
|
#define ShellAbout ShellAboutW
|
|
#else
|
|
#define ShellAbout ShellAboutA
|
|
#endif // !UNICODE
|
|
SHSTDAPI_(HICON) DuplicateIcon(__reserved HINSTANCE hInst, __in HICON hIcon);
|
|
SHSTDAPI_(HICON) ExtractAssociatedIconA(__reserved HINSTANCE hInst, __inout_ecount(128) LPSTR pszIconPath, __inout WORD *piIcon);
|
|
SHSTDAPI_(HICON) ExtractAssociatedIconW(__reserved HINSTANCE hInst, __inout_ecount(128) LPWSTR pszIconPath, __inout WORD *piIcon);
|
|
#ifdef UNICODE
|
|
#define ExtractAssociatedIcon ExtractAssociatedIconW
|
|
#else
|
|
#define ExtractAssociatedIcon ExtractAssociatedIconA
|
|
#endif // !UNICODE
|
|
SHSTDAPI_(HICON) ExtractAssociatedIconExA(__reserved HINSTANCE hInst, __inout_ecount(128) LPSTR pszIconPath, __inout WORD *piIconIndex, __inout WORD *piIconId);
|
|
SHSTDAPI_(HICON) ExtractAssociatedIconExW(__reserved HINSTANCE hInst, __inout_ecount(128) LPWSTR pszIconPath, __inout WORD *piIconIndex, __inout WORD *piIconId);
|
|
#ifdef UNICODE
|
|
#define ExtractAssociatedIconEx ExtractAssociatedIconExW
|
|
#else
|
|
#define ExtractAssociatedIconEx ExtractAssociatedIconExA
|
|
#endif // !UNICODE
|
|
SHSTDAPI_(HICON) ExtractIconA(__reserved HINSTANCE hInst, __in LPCSTR lpszExeFileName, __in UINT nIconIndex);
|
|
SHSTDAPI_(HICON) ExtractIconW(__reserved HINSTANCE hInst, __in LPCWSTR lpszExeFileName, __in UINT nIconIndex);
|
|
#ifdef UNICODE
|
|
#define ExtractIcon ExtractIconW
|
|
#else
|
|
#define ExtractIcon ExtractIconA
|
|
#endif // !UNICODE
|
|
|
|
|
|
#if(WINVER >= 0x0400)
|
|
typedef struct _DRAGINFOA {
|
|
UINT uSize; /* init with sizeof(DRAGINFO) */
|
|
POINT pt;
|
|
BOOL fNC;
|
|
LPSTR lpFileList;
|
|
DWORD grfKeyState;
|
|
} DRAGINFOA, *LPDRAGINFOA;
|
|
typedef struct _DRAGINFOW {
|
|
UINT uSize; /* init with sizeof(DRAGINFO) */
|
|
POINT pt;
|
|
BOOL fNC;
|
|
LPWSTR lpFileList;
|
|
DWORD grfKeyState;
|
|
} DRAGINFOW, *LPDRAGINFOW;
|
|
#ifdef UNICODE
|
|
typedef DRAGINFOW DRAGINFO;
|
|
typedef LPDRAGINFOW LPDRAGINFO;
|
|
#else
|
|
typedef DRAGINFOA DRAGINFO;
|
|
typedef LPDRAGINFOA LPDRAGINFO;
|
|
#endif // UNICODE
|
|
|
|
|
|
////
|
|
//// AppBar stuff
|
|
////
|
|
#define ABM_NEW 0x00000000
|
|
#define ABM_REMOVE 0x00000001
|
|
#define ABM_QUERYPOS 0x00000002
|
|
#define ABM_SETPOS 0x00000003
|
|
#define ABM_GETSTATE 0x00000004
|
|
#define ABM_GETTASKBARPOS 0x00000005
|
|
#define ABM_ACTIVATE 0x00000006 // lParam == TRUE/FALSE means activate/deactivate
|
|
#define ABM_GETAUTOHIDEBAR 0x00000007
|
|
#define ABM_SETAUTOHIDEBAR 0x00000008 // this can fail at any time. MUST check the result
|
|
// lParam = TRUE/FALSE Set/Unset
|
|
// uEdge = what edge
|
|
#define ABM_WINDOWPOSCHANGED 0x0000009
|
|
#if (NTDDI_VERSION >= NTDDI_WINXP)
|
|
#define ABM_SETSTATE 0x0000000a
|
|
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
|
|
|
|
// these are put in the wparam of callback messages
|
|
#define ABN_STATECHANGE 0x0000000
|
|
#define ABN_POSCHANGED 0x0000001
|
|
#define ABN_FULLSCREENAPP 0x0000002
|
|
#define ABN_WINDOWARRANGE 0x0000003 // lParam == TRUE means hide
|
|
|
|
// flags for get state
|
|
#define ABS_AUTOHIDE 0x0000001
|
|
#define ABS_ALWAYSONTOP 0x0000002
|
|
|
|
#define ABE_LEFT 0
|
|
#define ABE_TOP 1
|
|
#define ABE_RIGHT 2
|
|
#define ABE_BOTTOM 3
|
|
|
|
typedef struct _AppBarData
|
|
{
|
|
DWORD cbSize;
|
|
HWND hWnd;
|
|
UINT uCallbackMessage;
|
|
UINT uEdge;
|
|
RECT rc;
|
|
LPARAM lParam; // message specific
|
|
} APPBARDATA, *PAPPBARDATA;
|
|
|
|
|
|
SHSTDAPI_(UINT_PTR) SHAppBarMessage(__in DWORD dwMessage, __inout PAPPBARDATA pData);
|
|
|
|
////
|
|
//// EndAppBar
|
|
////
|
|
|
|
SHSTDAPI_(DWORD) DoEnvironmentSubstA(__inout_ecount(cchString) LPSTR szString, UINT cchString);
|
|
SHSTDAPI_(DWORD) DoEnvironmentSubstW(__inout_ecount(cchString) LPWSTR szString, UINT cchString);
|
|
#ifdef UNICODE
|
|
#define DoEnvironmentSubst DoEnvironmentSubstW
|
|
#else
|
|
#define DoEnvironmentSubst DoEnvironmentSubstA
|
|
#endif // !UNICODE
|
|
|
|
#define EIRESID(x) (-1 * (int)(x))
|
|
SHSTDAPI_(UINT) ExtractIconExA(LPCSTR lpszFile, int nIconIndex, __out_ecount_opt(nIcons) HICON *phiconLarge, __out_ecount_opt(nIcons) HICON *phiconSmall, UINT nIcons);
|
|
SHSTDAPI_(UINT) ExtractIconExW(LPCWSTR lpszFile, int nIconIndex, __out_ecount_opt(nIcons) HICON *phiconLarge, __out_ecount_opt(nIcons) HICON *phiconSmall, UINT nIcons);
|
|
#ifdef UNICODE
|
|
#define ExtractIconEx ExtractIconExW
|
|
#else
|
|
#define ExtractIconEx ExtractIconExA
|
|
#endif // !UNICODE
|
|
|
|
// Shell File Operations
|
|
|
|
#define FO_MOVE 0x0001
|
|
#define FO_COPY 0x0002
|
|
#define FO_DELETE 0x0003
|
|
#define FO_RENAME 0x0004
|
|
|
|
// SHFILEOPSTRUCT.fFlags and IFileOperation::SetOperationFlags() flag values
|
|
|
|
#define FOF_MULTIDESTFILES 0x0001
|
|
#define FOF_CONFIRMMOUSE 0x0002
|
|
#define FOF_SILENT 0x0004 // don't display progress UI (confirm prompts may be displayed still)
|
|
#define FOF_RENAMEONCOLLISION 0x0008 // automatically rename the source files to avoid the collisions
|
|
#define FOF_NOCONFIRMATION 0x0010 // don't display confirmation UI, assume "yes" for cases that can be bypassed, "no" for those that can not
|
|
#define FOF_WANTMAPPINGHANDLE 0x0020 // Fill in SHFILEOPSTRUCT.hNameMappings
|
|
// Must be freed using SHFreeNameMappings
|
|
#define FOF_ALLOWUNDO 0x0040 // enable undo including Recycle behavior for IFileOperation::Delete()
|
|
#define FOF_FILESONLY 0x0080 // only operate on the files (non folders), both files and folders are assumed without this
|
|
#define FOF_SIMPLEPROGRESS 0x0100 // means don't show names of files
|
|
#define FOF_NOCONFIRMMKDIR 0x0200 // don't dispplay confirmatino UI before making any needed directories, assume "Yes" in these cases
|
|
#define FOF_NOERRORUI 0x0400 // don't put up error UI, other UI may be displayed, progress, confirmations
|
|
#if (_WIN32_IE >= 0x0500)
|
|
#define FOF_NOCOPYSECURITYATTRIBS 0x0800 // dont copy file security attributes (ACLs)
|
|
#define FOF_NORECURSION 0x1000 // don't recurse into directories for operations that would recurse
|
|
#define FOF_NO_CONNECTED_ELEMENTS 0x2000 // don't operate on connected elements ("xxx_files" folders that go with .htm files)
|
|
#define FOF_WANTNUKEWARNING 0x4000 // during delete operation, warn if nuking instead of recycling (partially overrides FOF_NOCONFIRMATION)
|
|
#endif // (_WIN32_IE >= 0x500)
|
|
#if (_WIN32_WINNT >= 0x0501)
|
|
#define FOF_NORECURSEREPARSE 0x8000 // deprecated; the operations engine always does the right thing on FolderLink objects (symlinks, reparse points, folder shortcuts)
|
|
#endif // (_WIN32_WINNT >= 0x501)
|
|
#define FOF_NO_UI (FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_NOCONFIRMMKDIR) // don't display any UI at all
|
|
|
|
typedef WORD FILEOP_FLAGS;
|
|
|
|
#define PO_DELETE 0x0013 // printer is being deleted
|
|
#define PO_RENAME 0x0014 // printer is being renamed
|
|
#define PO_PORTCHANGE 0x0020 // port this printer connected to is being changed
|
|
// if this id is set, the strings received by
|
|
// the copyhook are a doubly-null terminated
|
|
// list of strings. The first is the printer
|
|
// name and the second is the printer port.
|
|
#define PO_REN_PORT 0x0034 // PO_RENAME and PO_PORTCHANGE at same time.
|
|
|
|
// no POF_ flags currently defined
|
|
|
|
typedef WORD PRINTEROP_FLAGS;
|
|
|
|
// implicit parameters are:
|
|
// if pFrom or pTo are unqualified names the current directories are
|
|
// taken from the global current drive/directory settings managed
|
|
// by Get/SetCurrentDrive/Directory
|
|
//
|
|
// the global confirmation settings
|
|
|
|
typedef struct _SHFILEOPSTRUCTA
|
|
{
|
|
HWND hwnd;
|
|
UINT wFunc;
|
|
LPCSTR pFrom;
|
|
LPCSTR pTo;
|
|
FILEOP_FLAGS fFlags;
|
|
BOOL fAnyOperationsAborted;
|
|
LPVOID hNameMappings;
|
|
LPCSTR lpszProgressTitle; // only used if FOF_SIMPLEPROGRESS
|
|
} SHFILEOPSTRUCTA, *LPSHFILEOPSTRUCTA;
|
|
typedef struct _SHFILEOPSTRUCTW
|
|
{
|
|
HWND hwnd;
|
|
UINT wFunc;
|
|
LPCWSTR pFrom;
|
|
LPCWSTR pTo;
|
|
FILEOP_FLAGS fFlags;
|
|
BOOL fAnyOperationsAborted;
|
|
LPVOID hNameMappings;
|
|
LPCWSTR lpszProgressTitle; // only used if FOF_SIMPLEPROGRESS
|
|
} SHFILEOPSTRUCTW, *LPSHFILEOPSTRUCTW;
|
|
#ifdef UNICODE
|
|
typedef SHFILEOPSTRUCTW SHFILEOPSTRUCT;
|
|
typedef LPSHFILEOPSTRUCTW LPSHFILEOPSTRUCT;
|
|
#else
|
|
typedef SHFILEOPSTRUCTA SHFILEOPSTRUCT;
|
|
typedef LPSHFILEOPSTRUCTA LPSHFILEOPSTRUCT;
|
|
#endif // UNICODE
|
|
|
|
SHSTDAPI_(int) SHFileOperationA(__inout LPSHFILEOPSTRUCTA lpFileOp);
|
|
SHSTDAPI_(int) SHFileOperationW(__inout LPSHFILEOPSTRUCTW lpFileOp);
|
|
#ifdef UNICODE
|
|
#define SHFileOperation SHFileOperationW
|
|
#else
|
|
#define SHFileOperation SHFileOperationA
|
|
#endif // !UNICODE
|
|
SHSTDAPI_(void) SHFreeNameMappings(HANDLE hNameMappings);
|
|
|
|
typedef struct _SHNAMEMAPPINGA
|
|
{
|
|
LPSTR pszOldPath;
|
|
LPSTR pszNewPath;
|
|
int cchOldPath;
|
|
int cchNewPath;
|
|
} SHNAMEMAPPINGA, *LPSHNAMEMAPPINGA;
|
|
typedef struct _SHNAMEMAPPINGW
|
|
{
|
|
LPWSTR pszOldPath;
|
|
LPWSTR pszNewPath;
|
|
int cchOldPath;
|
|
int cchNewPath;
|
|
} SHNAMEMAPPINGW, *LPSHNAMEMAPPINGW;
|
|
#ifdef UNICODE
|
|
typedef SHNAMEMAPPINGW SHNAMEMAPPING;
|
|
typedef LPSHNAMEMAPPINGW LPSHNAMEMAPPING;
|
|
#else
|
|
typedef SHNAMEMAPPINGA SHNAMEMAPPING;
|
|
typedef LPSHNAMEMAPPINGA LPSHNAMEMAPPING;
|
|
#endif // UNICODE
|
|
|
|
|
|
////
|
|
//// End Shell File Operations
|
|
////
|
|
|
|
////
|
|
//// Begin ShellExecuteEx and family
|
|
////
|
|
|
|
/* ShellExecute() and ShellExecuteEx() error codes */
|
|
|
|
/* regular WinExec() codes */
|
|
#define SE_ERR_FNF 2 // file not found
|
|
#define SE_ERR_PNF 3 // path not found
|
|
#define SE_ERR_ACCESSDENIED 5 // access denied
|
|
#define SE_ERR_OOM 8 // out of memory
|
|
#define SE_ERR_DLLNOTFOUND 32
|
|
|
|
#endif /* WINVER >= 0x0400 */
|
|
|
|
/* error values for ShellExecute() beyond the regular WinExec() codes */
|
|
#define SE_ERR_SHARE 26
|
|
#define SE_ERR_ASSOCINCOMPLETE 27
|
|
#define SE_ERR_DDETIMEOUT 28
|
|
#define SE_ERR_DDEFAIL 29
|
|
#define SE_ERR_DDEBUSY 30
|
|
#define SE_ERR_NOASSOC 31
|
|
|
|
#if(WINVER >= 0x0400)
|
|
|
|
// Note CLASSKEY overrides CLASSNAME
|
|
#define SEE_MASK_DEFAULT 0x00000000
|
|
#define SEE_MASK_CLASSNAME 0x00000001 // SHELLEXECUTEINFO.lpClass is valid
|
|
#define SEE_MASK_CLASSKEY 0x00000003 // SHELLEXECUTEINFO.hkeyClass is valid
|
|
// Note SEE_MASK_INVOKEIDLIST(0xC) implies SEE_MASK_IDLIST(0x04)
|
|
#define SEE_MASK_IDLIST 0x00000004 // SHELLEXECUTEINFO.lpIDList is valid
|
|
#define SEE_MASK_INVOKEIDLIST 0x0000000c // enable IContextMenu based verbs
|
|
#if (NTDDI_VERSION < NTDDI_VISTA)
|
|
#define SEE_MASK_ICON 0x00000010 // not used
|
|
#endif // (NTDDI_VERSION < NTDDI_VISTA)
|
|
#define SEE_MASK_HOTKEY 0x00000020 // SHELLEXECUTEINFO.dwHotKey is valid
|
|
#define SEE_MASK_NOCLOSEPROCESS 0x00000040 // SHELLEXECUTEINFO.hProcess
|
|
#define SEE_MASK_CONNECTNETDRV 0x00000080 // enables re-connecting disconnected network drives
|
|
#define SEE_MASK_NOASYNC 0x00000100 // block on the call until the invoke has completed, use for callers that exit after calling ShellExecuteEx()
|
|
#define SEE_MASK_FLAG_DDEWAIT SEE_MASK_NOASYNC // Use SEE_MASK_NOASYNC instead of SEE_MASK_FLAG_DDEWAIT as it more accuratly describes the behavior
|
|
#define SEE_MASK_DOENVSUBST 0x00000200 // indicates that SHELLEXECUTEINFO.lpFile contains env vars that should be expanded
|
|
#define SEE_MASK_FLAG_NO_UI 0x00000400 // disable UI including error messages
|
|
#define SEE_MASK_UNICODE 0x00004000
|
|
#define SEE_MASK_NO_CONSOLE 0x00008000
|
|
#define SEE_MASK_ASYNCOK 0x00100000
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
#define SEE_MASK_HMONITOR 0x00200000 // SHELLEXECUTEINFO.hMonitor
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
#if (NTDDI_VERSION >= NTDDI_WINXPSP1)
|
|
#define SEE_MASK_NOZONECHECKS 0x00800000
|
|
#endif // (NTDDI_VERSION >= NTDDI_WINXPSP1)
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
#define SEE_MASK_NOQUERYCLASSSTORE 0x01000000
|
|
#define SEE_MASK_WAITFORINPUTIDLE 0x02000000
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
#if (NTDDI_VERSION >= NTDDI_WINXP)
|
|
#define SEE_MASK_FLAG_LOG_USAGE 0x04000000
|
|
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
|
|
|
|
|
|
|
|
//
|
|
// For compilers that don't support nameless unions
|
|
//
|
|
#ifndef DUMMYUNIONNAME
|
|
#ifdef NONAMELESSUNION
|
|
#define DUMMYUNIONNAME u
|
|
#define DUMMYUNIONNAME2 u2
|
|
#define DUMMYUNIONNAME3 u3
|
|
#define DUMMYUNIONNAME4 u4
|
|
#define DUMMYUNIONNAME5 u5
|
|
#else
|
|
#define DUMMYUNIONNAME
|
|
#define DUMMYUNIONNAME2
|
|
#define DUMMYUNIONNAME3
|
|
#define DUMMYUNIONNAME4
|
|
#define DUMMYUNIONNAME5
|
|
#endif
|
|
#endif // DUMMYUNIONNAME
|
|
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
|
|
#pragma warning(push)
|
|
#pragma warning(disable:4201) /* nonstandard extension used : nameless struct/union */
|
|
#pragma once
|
|
#endif
|
|
|
|
typedef struct _SHELLEXECUTEINFOA
|
|
{
|
|
DWORD cbSize; // in, required, sizeof of this structure
|
|
ULONG fMask; // in, SEE_MASK_XXX values
|
|
HWND hwnd; // in, optional
|
|
LPCSTR lpVerb; // in, optional when unspecified the default verb is choosen
|
|
LPCSTR lpFile; // in, either this value or lpIDList must be specified
|
|
LPCSTR lpParameters; // in, optional
|
|
LPCSTR lpDirectory; // in, optional
|
|
int nShow; // in, required
|
|
HINSTANCE hInstApp; // out when SEE_MASK_NOCLOSEPROCESS is specified
|
|
void *lpIDList; // in, valid when SEE_MASK_IDLIST is specified, PCIDLIST_ABSOLUTE, for use with SEE_MASK_IDLIST & SEE_MASK_INVOKEIDLIST
|
|
LPCSTR lpClass; // in, valid when SEE_MASK_CLASSNAME is specified
|
|
HKEY hkeyClass; // in, valid when SEE_MASK_CLASSKEY is specified
|
|
DWORD dwHotKey; // in, valid when SEE_MASK_HOTKEY is specified
|
|
union
|
|
{
|
|
HANDLE hIcon; // not used
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
HANDLE hMonitor; // in, valid when SEE_MASK_HMONITOR specified
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
} DUMMYUNIONNAME;
|
|
HANDLE hProcess; // out, valid when SEE_MASK_NOCLOSEPROCESS specified
|
|
} SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;
|
|
typedef struct _SHELLEXECUTEINFOW
|
|
{
|
|
DWORD cbSize; // in, required, sizeof of this structure
|
|
ULONG fMask; // in, SEE_MASK_XXX values
|
|
HWND hwnd; // in, optional
|
|
LPCWSTR lpVerb; // in, optional when unspecified the default verb is choosen
|
|
LPCWSTR lpFile; // in, either this value or lpIDList must be specified
|
|
LPCWSTR lpParameters; // in, optional
|
|
LPCWSTR lpDirectory; // in, optional
|
|
int nShow; // in, required
|
|
HINSTANCE hInstApp; // out when SEE_MASK_NOCLOSEPROCESS is specified
|
|
void *lpIDList; // in, valid when SEE_MASK_IDLIST is specified, PCIDLIST_ABSOLUTE, for use with SEE_MASK_IDLIST & SEE_MASK_INVOKEIDLIST
|
|
LPCWSTR lpClass; // in, valid when SEE_MASK_CLASSNAME is specified
|
|
HKEY hkeyClass; // in, valid when SEE_MASK_CLASSKEY is specified
|
|
DWORD dwHotKey; // in, valid when SEE_MASK_HOTKEY is specified
|
|
union
|
|
{
|
|
HANDLE hIcon; // not used
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
HANDLE hMonitor; // in, valid when SEE_MASK_HMONITOR specified
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
} DUMMYUNIONNAME;
|
|
HANDLE hProcess; // out, valid when SEE_MASK_NOCLOSEPROCESS specified
|
|
} SHELLEXECUTEINFOW, *LPSHELLEXECUTEINFOW;
|
|
#ifdef UNICODE
|
|
typedef SHELLEXECUTEINFOW SHELLEXECUTEINFO;
|
|
typedef LPSHELLEXECUTEINFOW LPSHELLEXECUTEINFO;
|
|
#else
|
|
typedef SHELLEXECUTEINFOA SHELLEXECUTEINFO;
|
|
typedef LPSHELLEXECUTEINFOA LPSHELLEXECUTEINFO;
|
|
#endif // UNICODE
|
|
|
|
SHSTDAPI_(BOOL) ShellExecuteExA(__inout SHELLEXECUTEINFOA *pExecInfo);
|
|
SHSTDAPI_(BOOL) ShellExecuteExW(__inout SHELLEXECUTEINFOW *pExecInfo);
|
|
#ifdef UNICODE
|
|
#define ShellExecuteEx ShellExecuteExW
|
|
#else
|
|
#define ShellExecuteEx ShellExecuteExA
|
|
#endif // !UNICODE
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
// deprecated, no longer implemented
|
|
typedef struct _SHCREATEPROCESSINFOW
|
|
{
|
|
DWORD cbSize;
|
|
ULONG fMask;
|
|
HWND hwnd;
|
|
LPCWSTR pszFile;
|
|
LPCWSTR pszParameters;
|
|
LPCWSTR pszCurrentDirectory;
|
|
HANDLE hUserToken;
|
|
LPSECURITY_ATTRIBUTES lpProcessAttributes;
|
|
LPSECURITY_ATTRIBUTES lpThreadAttributes;
|
|
BOOL bInheritHandles;
|
|
DWORD dwCreationFlags;
|
|
LPSTARTUPINFOW lpStartupInfo;
|
|
LPPROCESS_INFORMATION lpProcessInformation;
|
|
} SHCREATEPROCESSINFOW, *PSHCREATEPROCESSINFOW;
|
|
|
|
SHSTDAPI_(BOOL) SHCreateProcessAsUserW(__inout PSHCREATEPROCESSINFOW pscpi);
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
|
|
SHSTDAPI SHEvaluateSystemCommandTemplate(__in PCWSTR pszCmdTemplate, __deref_out PWSTR *ppszApplication, __deref_opt_out PWSTR *ppszCommandLine, __deref_opt_out PWSTR *ppszParameters);
|
|
//
|
|
// SHEvaluateSystemCommandTemplate()
|
|
// * enforces stricter validation before calling CreateProcess(). may also be
|
|
// used before calling ShellExecute().
|
|
// * should be used when caller wants the deterministic behavior from a command template
|
|
// regardless of execution context. it ignores the current process state,
|
|
// such as the %PATH%, GetCurrentDirectory(), and parent process directory.
|
|
// * should be used when the command is hardcoded.
|
|
// * is used by ShellExecute() when handling file associations from HKCR.
|
|
// * reduces CreateProcess() commandline exploits
|
|
// * is not designed for processing user input, and may generate unexpected failures.
|
|
//
|
|
// INPUT:
|
|
// pszCmdTemplate = command line, this may or may not include parameters.
|
|
// if the parameters are substitution parameters then this API
|
|
// should be called before parameters have been replaced.
|
|
// (check the examples below to see sample supported inputs.)
|
|
//
|
|
// OUTPUT on return: S_OK
|
|
// ppszApplication = verified path to the Application. this should be passed as the lpApplication
|
|
// parameter to CreateProcess() or the lpFile parameter to ShellExecute().
|
|
// (allocated using CoTaskMemAlloc(), free with CoTaskMemFree())
|
|
//
|
|
// ppszCommandLine = OPTIONAL - use if planning to call CreateProcess().
|
|
// resulting command line template. parameters should be replaced based on this template,
|
|
// and then passed as the lpCommandLine parameter to CreateProcess().
|
|
// it is guaranteed to be of a form that PathGetArgs() will always succeed correctly.
|
|
// (allocated using CoTaskMemAlloc(), free with CoTaskMemFree())
|
|
//
|
|
// ppszParameters = OPTIONAL - use if planning to call ShellExecute().
|
|
// resulting parameter list template. parameters should be replaced based on this template,
|
|
// and then passed as the lpParameters parameter to ShellExecute().
|
|
// NOTE: identical to PathGetArgs(*ppszCommandLine).
|
|
// (allocated using CoTaskMemAlloc(), free with CoTaskMemFree())
|
|
//
|
|
// OUTPUT on return: FAILED()
|
|
// all outputs will be NULL'ed on failure
|
|
//
|
|
// NOTES: the parsing logic to determine a valid Application path is non-trivial, although
|
|
// the extension is not required and if missing will be completed
|
|
// in the following standard order: { .PIF, .COM, .EXE, .BAT, .CMD }
|
|
//
|
|
// Relative Paths are System Paths - if the first token has no path qualifiers
|
|
// then the token is first checked to see if a key of the same name has
|
|
// been installed under HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths.
|
|
// if the key or default value does not exist, it is assumed to be a child
|
|
// of the system directories. the following directories will be searched
|
|
// in order for the relative token: { CSIDL_SYSTEM, CSIDL_WINDOWS }
|
|
//
|
|
// Prefer Quoted Paths - if the first token in pszCmdTemplate is quoted and appears
|
|
// to be an absolute path then the token is the only possible result.
|
|
//
|
|
// Limit Forms of Unquoted Paths - if the first token is unquoted and appears
|
|
// to be an absolute path, then it is subject to more stringent limitations.
|
|
// if the token is a substring of CSIDL_PROGRAM_FILES or does not
|
|
// exist on the file system, then SHEvaluateSystemCommandTemplate() will
|
|
// attempt to complete using a token delimited by the first space of the
|
|
// last valid path segment (usually the file name). if this token also doesnt exist,
|
|
// then the next space will be used, etc.
|
|
//
|
|
// USAGE: used before calling into CreateProcess() or ShellExecute(), callers
|
|
// would typically look like the following:
|
|
/* #if 0 // SAMPLE CODE
|
|
HRESULT MyCreateProcessPriv(PCWSTR pszCmd)
|
|
{
|
|
PWSTR pszApp;
|
|
PWSTR pszCmdLine;
|
|
HRESULT hr = SHEvaluateSystemCommandTemplate(pszCmd, &pszApp, &pszCmdLine);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// if this was a real template, maybe some kind of wnsprintf() first?
|
|
PROCESS_INFORMATION pi;
|
|
STARTUPINFO si = {0};
|
|
si.cb = sizeof(startup);
|
|
si.wShowWindow = SW_SHOWNORMAL;
|
|
|
|
if (CreateProcess(pszApp, pszCmdLine, NULL, NULL, FALSE,
|
|
CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &si, &pi))
|
|
{
|
|
// we are good
|
|
ASSERT(hr == S_OK);
|
|
CloseHandle(pi.hProcess);
|
|
CloseHandle(pi.hThread);
|
|
}
|
|
else
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
}
|
|
|
|
CoTaskMemFree(pszApp);
|
|
CoTaskMemFree(pszCmdLine);
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
HRESULT MyShellExec(PCWSTR pszCmd)
|
|
{
|
|
PWSTR pszApp;
|
|
PWSTR pszCmdLine;
|
|
HRESULT hr = SHEvaluateSystemCommandTemplate(pszCmd, &pszApp, &pszCmdLine);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// if this was a real template, maybe some kind of wnsprintf() first?
|
|
SHELLEXECUTEINFOW sei = {
|
|
sizeof(sei), // cbSize;
|
|
0, // fMask
|
|
NULL, // hwnd
|
|
NULL, // lpVerb
|
|
pszApp, // lpFile
|
|
PathGetArgs(pszCmdLine), // lpParameters
|
|
NULL, // lpDirectory
|
|
SW_SHOWNORMAL, // nShow
|
|
0, // hInstApp
|
|
NULL, // lpIDList
|
|
NULL, // lpClass
|
|
NULL, // hkeyClass
|
|
0, // dwHotKey
|
|
NULL, // hIcon
|
|
NULL // hProcess
|
|
};
|
|
|
|
if (ShellExecuteEx(&sei))
|
|
{
|
|
// we are good
|
|
ASSERT(hr == S_OK);
|
|
}
|
|
else
|
|
{
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
}
|
|
|
|
CoTaskMemFree(pszApp);
|
|
CoTaskMemFree(pszCmdLine);
|
|
}
|
|
return hr;
|
|
}
|
|
#endif // 0 // SAMPLE CODE
|
|
*/
|
|
|
|
// EXAMPLE: Each example will show an input parameter and the results returned by
|
|
// SHEvaluateSystemCommandTemplate(). Also included is the alternate result
|
|
// of what CreateProcess() would have created if pszCmdTemplate were
|
|
// passed directly as lpCommandLine and lpApplication were NULL.
|
|
// (results marked with an asterisk (*) indicate differences.)
|
|
//
|
|
// Assume for the examples that the following paths and values exist:
|
|
//
|
|
// SHGetFolderPath() values:
|
|
// CSIDL_SYSTEM = C:\windows\system32
|
|
// CSIDL_WINDOWS = C:\windows
|
|
// CSIDL_PROGRAM_FILES = C:\Program Files
|
|
//
|
|
// Environment settings
|
|
// GetModuleFileName(NULL) = C:\Program Files\Example\sample.exe
|
|
// GetCurrentDirectory() = \\server\share\foo
|
|
// HKLM\...\App Paths\pbrush.exe = C:\windows\system32\mspaint.exe
|
|
// HKLM\...\App Paths\mycl.exe = C:\Program Files\Compilers\mycl.exe
|
|
// PATH = c:\windows\system32;C:\windows;c:\;C:\Program Files\Compilers\
|
|
//
|
|
// Valid Application paths:
|
|
// C:\Program Files\Internet Explorer\iexplore.exe
|
|
// C:\windows\system32\rundll32.exe
|
|
// C:\windows\system32\notepad.exe
|
|
// C:\windows\notepad.exe
|
|
// C:\Program Files\Example\sample.exe
|
|
// C:\Program Files\Compilers\cl.exe
|
|
// C:\Other Programs\prog.exe
|
|
//
|
|
// Suspicious (possibly hostile) Application paths:
|
|
// C:\Program.exe
|
|
// C:\Program Files\Internet.exe
|
|
// C:\Program Files\Example\regedit.bat
|
|
// C:\mycl.exe
|
|
// \\server\share\foo\rundll32.exe
|
|
// \\server\share\foo\myapp.exe
|
|
//
|
|
//
|
|
// Relative Path Example #1
|
|
// pszCmdTemplate = notepad.exe %1
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\windows\system32\notepad.exe
|
|
// pszCommandLine = "notepad.exe" %1
|
|
// CreateProcess() would return TRUE
|
|
// new process = C:\windows\system32\notepad.exe
|
|
//
|
|
// Relative Path Example #2
|
|
// pszCmdTemplate = rundll32.exe shell32.dll,RunDll
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\windows\system32\rundll32.exe
|
|
// pszCommandLine = "rundll32.exe" shell32.dll,RunDll
|
|
// * CreateProcess() would return TRUE
|
|
// new process = \\server\share\foo\rundll32.exe
|
|
//
|
|
// Relative Path Example #3
|
|
// pszCmdTemplate = regedit %1
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\windows\system32\regedit.exe
|
|
// pszCommandLine = "regedit.exe" %1
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Program Files\Example\regedit.bat
|
|
//
|
|
// Relative Path Example #4
|
|
// pszCmdTemplate = pbrush "%1"
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\windows\system32\mspaint.exe
|
|
// pszCommandLine = "mspaint.exe" "%1"
|
|
// * CreateProcess() would return FALSE
|
|
//
|
|
// Relative Path Example #5
|
|
// pszCmdTemplate = mycl "%1" "%2"
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\Program Files\Compilers\mycl.exe
|
|
// pszCommandLine = "mycl.exe" "%1" "%2"
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\mycl.exe
|
|
//
|
|
// Relative Path Example #6
|
|
// pszCmdTemplate = myapp.exe
|
|
// SHEvaluateSystemCommandTemplate() returns: CO_E_APPNOTFOUND
|
|
// * CreateProcess() would return TRUE
|
|
// new process = \\server\share\foo\myapp.exe
|
|
//
|
|
// Quoted Path Example #1
|
|
// pszCmdTemplate = "C:\Program Files\Internet Explorer\iexplore.exe" -nohome
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\Program Files\Internet Explorer\iexplore.exe
|
|
// pszCommandLine = "C:\Program Files\Internet Explorer\iexplore.exe" -nohome
|
|
// CreateProcess() would return TRUE
|
|
// new process = C:\Program Files\Internet Explorer\iexplore.exe
|
|
//
|
|
// Quoted Path Example #2
|
|
// pszCmdTemplate = "C:\Program Files\Internet" -url
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\Program Files\Internet.exe
|
|
// pszCommandLine = "C:\Program Files\Internet.exe" -url
|
|
// CreateProcess() would return TRUE
|
|
// new process = C:\Program Files\internet.exe
|
|
//
|
|
// Quoted Path Example #3
|
|
// pszCmdTemplate = "C:\Program" -url
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\Program.exe
|
|
// pszCommandLine = "C:\Program.exe" -url
|
|
// CreateProcess() would return TRUE
|
|
// new process = C:\Program.exe
|
|
//
|
|
// Unquoted Example #1
|
|
// pszCmdTemplate = C:\Program Files\Internet Explorer\iexplore.exe -nohome
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\Program Files\Internet Explorer\iexplore.exe
|
|
// pszCommandLine = "C:\Program Files\Internet Explorer\iexplore.exe" -nohome
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Program.exe
|
|
//
|
|
// Unquoted Example #2
|
|
// pszCmdTemplate = C:\Program Files\Internet Explorer\iexplore.exe -url fool.htm
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\Program Files\Internet Explorer\iexplore.exe
|
|
// pszCommandLine = "C:\Program Files\Internet Explorer\iexplore.exe" -url fool.htm
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Program.exe
|
|
//
|
|
// Unquoted Example #3
|
|
// pszCmdTemplate = C:\Program Files\Internet Explorer\iexplore.exe -url C:\fool.htm
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\Program Files\Internet Explorer\iexplore.exe
|
|
// pszCommandLine = "C:\Program Files\Internet Explorer\iexplore.exe" -url C:\fool.htm
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Program.exe
|
|
//
|
|
// Unquoted Example #4
|
|
// pszCmdTemplate = C:\Program Files\Internet -url
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\Program Files\Internet.exe
|
|
// pszCommandLine = "C:\Program Files\Internet.exe" -url
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Program.exe
|
|
//
|
|
// Unquoted Example #5
|
|
// pszCmdTemplate = C:\Other Programs\prog.exe -go %1 \fool %2
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\Other Programs\prog.exe
|
|
// pszCommandLine = "C:\Other Programs\prog.exe" %1 \fool %2
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Other Programs\prog.exe
|
|
//
|
|
// Unquoted Example #6
|
|
// pszCmdTemplate = C:\Other Programs\prog.exe -go "\fool" "%1"
|
|
// SHEvaluateSystemCommandTemplate() returns: S_OK
|
|
// pszApplication = C:\Other Programs\prog.exe
|
|
// pszCommandLine = "C:\Other Programs\prog.exe" -go "\fool" "%1"
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Other Programs\prog.exe
|
|
//
|
|
// Unquoted Example #7
|
|
// pszCmdTemplate = C:\Program Files\Internet Explorer\iexplore.exe -url \fool.htm
|
|
// SHEvaluateSystemCommandTemplate() returns: CO_E_APPNOTFOUND
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Program.exe
|
|
//
|
|
// Unquoted Example #8
|
|
// pszCmdTemplate = C:\Program -url
|
|
// SHEvaluateSystemCommandTemplate() returns: CO_E_APPNOTFOUND
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Program.exe
|
|
//
|
|
// Unquoted Example #9
|
|
// pszCmdTemplate = C:\Other Programs\prog.exe -go \fool us
|
|
// SHEvaluateSystemCommandTemplate() returns: CO_E_APPNOTFOUND
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Other Programs\prog.exe
|
|
//
|
|
// Unquoted Example #10
|
|
// pszCmdTemplate = C:\Other Programs\prog.exe -go \fool %1
|
|
// SHEvaluateSystemCommandTemplate() returns: CO_E_APPNOTFOUND
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Other Programs\prog.exe
|
|
//
|
|
// Unquoted Example #11
|
|
// pszCmdTemplate = C:\Program "%1"
|
|
// SHEvaluateSystemCommandTemplate() returns: E_ACCESSDENIED
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Program.exe
|
|
//
|
|
// Unquoted Example #12
|
|
// pszCmdTemplate = C:\Program
|
|
// SHEvaluateSystemCommandTemplate() returns: E_ACCESSDENIED
|
|
// * CreateProcess() would return TRUE
|
|
// new process = C:\Program.exe
|
|
//
|
|
|
|
// used for implementing IShellFolder::GetUIObject(IID_IQueryAssociations)
|
|
// designed for namespace extensions with registered extensible types
|
|
// SHCreateDefaultContextMenu() and others use IQueryAssociations to build up data sets
|
|
|
|
typedef enum ASSOCCLASS
|
|
{ // which other members are used
|
|
ASSOCCLASS_SHELL_KEY = 0, // hkeyClass
|
|
ASSOCCLASS_PROGID_KEY, // hkeyClass
|
|
ASSOCCLASS_PROGID_STR, // pszClass (HKCR\pszClass)
|
|
ASSOCCLASS_CLSID_KEY, // hkeyClass
|
|
ASSOCCLASS_CLSID_STR, // pszClass (HKCR\CLSID\pszClass)
|
|
ASSOCCLASS_APP_KEY, // hkeyClass
|
|
ASSOCCLASS_APP_STR, // pszClass (HKCR\Applications\PathFindFileName(pszClass))
|
|
ASSOCCLASS_SYSTEM_STR, // pszClass
|
|
ASSOCCLASS_FOLDER, // none
|
|
ASSOCCLASS_STAR, // none
|
|
} ASSOCCLASS;
|
|
typedef struct ASSOCIATIONELEMENT_
|
|
{
|
|
ASSOCCLASS ac; // required
|
|
HKEY hkClass; // may be NULL
|
|
PCWSTR pszClass; // may be NULL
|
|
} ASSOCIATIONELEMENT;
|
|
|
|
// the object returned from this API implements IQueryAssociations
|
|
|
|
SHSTDAPI AssocCreateForClasses(__in const ASSOCIATIONELEMENT *rgClasses, ULONG cClasses, REFIID riid, __out void **ppv);
|
|
|
|
/* #if 0 // SAMPLE CODE
|
|
HRESULT CCustomFolder::_AssocCreate(PCUITEMID_CHILD pidl, REFIID riid, __out void **ppv)
|
|
{
|
|
*ppv = NULL;
|
|
ASSOCIATIONELEMENT rgAssoc[] =
|
|
{
|
|
{ ASSOCCLASS_PROGID_STR, NULL, CCustomFolder::_MapChildToType(pidl)},
|
|
{ ASSOCCLASS_FOLDER, NULL, NULL},
|
|
};
|
|
if (CCustomFolder::_IsFolder(pidl))
|
|
{
|
|
return AssocCreateForClasses(rgAssoc, ARRAYSIZE(rgAssoc), riid, ppv);
|
|
}
|
|
else
|
|
{
|
|
// skip FOLDER at the end
|
|
return AssocCreateForClasses(rgAssoc, ARRAYSIZE(rgAssoc)-1, riid, ppv);
|
|
}
|
|
}
|
|
|
|
HRESULT CCustomFolder::GetUIObjectOf(...)
|
|
{
|
|
// validate parameters
|
|
if (riid == IID_IQueryAssociations)
|
|
{
|
|
hr = _AssocCreate(apidl[0], riid, ppv);
|
|
}
|
|
// else if ...
|
|
}
|
|
#endif // SAMPLE CODE
|
|
*/
|
|
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
|
|
////
|
|
//// End ShellExecuteEx and family
|
|
////
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
//
|
|
// RecycleBin
|
|
//
|
|
|
|
// struct for query recycle bin info
|
|
typedef struct _SHQUERYRBINFO {
|
|
DWORD cbSize;
|
|
#if !defined(_MAC) || defined(_MAC_INT_64)
|
|
__int64 i64Size;
|
|
__int64 i64NumItems;
|
|
#else
|
|
DWORDLONG i64Size;
|
|
DWORDLONG i64NumItems;
|
|
#endif
|
|
} SHQUERYRBINFO, *LPSHQUERYRBINFO;
|
|
|
|
|
|
// flags for SHEmptyRecycleBin
|
|
//
|
|
#define SHERB_NOCONFIRMATION 0x00000001
|
|
#define SHERB_NOPROGRESSUI 0x00000002
|
|
#define SHERB_NOSOUND 0x00000004
|
|
|
|
|
|
SHSTDAPI SHQueryRecycleBinA(LPCSTR pszRootPath, __inout LPSHQUERYRBINFO pSHQueryRBInfo);
|
|
SHSTDAPI SHQueryRecycleBinW(LPCWSTR pszRootPath, __inout LPSHQUERYRBINFO pSHQueryRBInfo);
|
|
#ifdef UNICODE
|
|
#define SHQueryRecycleBin SHQueryRecycleBinW
|
|
#else
|
|
#define SHQueryRecycleBin SHQueryRecycleBinA
|
|
#endif // !UNICODE
|
|
SHSTDAPI SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags);
|
|
SHSTDAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags);
|
|
#ifdef UNICODE
|
|
#define SHEmptyRecycleBin SHEmptyRecycleBinW
|
|
#else
|
|
#define SHEmptyRecycleBin SHEmptyRecycleBinA
|
|
#endif // !UNICODE
|
|
|
|
////
|
|
//// end of RecycleBin
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
|
|
|
|
////
|
|
//// Taskbar notification definitions
|
|
////
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
typedef enum
|
|
{
|
|
QUNS_NOT_PRESENT = 1, // The user is not present. Heuristic check for modes like: screen saver, locked machine, non-active FUS session
|
|
QUNS_BUSY = 2, // The user is busy. Heuristic check for modes like: full-screen app
|
|
QUNS_RUNNING_D3D_FULL_SCREEN = 3, // full-screen (exlusive-mode) D3D app
|
|
QUNS_PRESENTATION_MODE = 4, // Windows presentation mode (laptop feature) is turned on
|
|
QUNS_ACCEPTS_NOTIFICATIONS = 5, // notifications can be freely sent
|
|
#if (NTDDI_VERSION >= NTDDI_WIN7)
|
|
QUNS_QUIET_TIME = 6, // We are in OOBE quiet period
|
|
#endif
|
|
} QUERY_USER_NOTIFICATION_STATE;
|
|
|
|
SHSTDAPI SHQueryUserNotificationState(__out QUERY_USER_NOTIFICATION_STATE *pquns);
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WIN7)
|
|
// This api retrieves an IPropertyStore that stores the window's properties.
|
|
SHSTDAPI SHGetPropertyStoreForWindow(__in HWND hwnd, __in REFIID riid, __out void** ppv);
|
|
#endif
|
|
|
|
|
|
typedef struct _NOTIFYICONDATAA {
|
|
DWORD cbSize;
|
|
HWND hWnd;
|
|
UINT uID;
|
|
UINT uFlags;
|
|
UINT uCallbackMessage;
|
|
HICON hIcon;
|
|
#if (NTDDI_VERSION < NTDDI_WIN2K)
|
|
CHAR szTip[64];
|
|
#endif
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
CHAR szTip[128];
|
|
DWORD dwState;
|
|
DWORD dwStateMask;
|
|
CHAR szInfo[256];
|
|
union {
|
|
UINT uTimeout;
|
|
UINT uVersion; // used with NIM_SETVERSION, values 0, 3 and 4
|
|
} DUMMYUNIONNAME;
|
|
CHAR szInfoTitle[64];
|
|
DWORD dwInfoFlags;
|
|
#endif
|
|
#if (NTDDI_VERSION >= NTDDI_WINXP)
|
|
GUID guidItem;
|
|
#endif
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
HICON hBalloonIcon;
|
|
#endif
|
|
} NOTIFYICONDATAA, *PNOTIFYICONDATAA;
|
|
typedef struct _NOTIFYICONDATAW {
|
|
DWORD cbSize;
|
|
HWND hWnd;
|
|
UINT uID;
|
|
UINT uFlags;
|
|
UINT uCallbackMessage;
|
|
HICON hIcon;
|
|
#if (NTDDI_VERSION < NTDDI_WIN2K)
|
|
WCHAR szTip[64];
|
|
#endif
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
WCHAR szTip[128];
|
|
DWORD dwState;
|
|
DWORD dwStateMask;
|
|
WCHAR szInfo[256];
|
|
union {
|
|
UINT uTimeout;
|
|
UINT uVersion; // used with NIM_SETVERSION, values 0, 3 and 4
|
|
} DUMMYUNIONNAME;
|
|
WCHAR szInfoTitle[64];
|
|
DWORD dwInfoFlags;
|
|
#endif
|
|
#if (NTDDI_VERSION >= NTDDI_WINXP)
|
|
GUID guidItem;
|
|
#endif
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
HICON hBalloonIcon;
|
|
#endif
|
|
} NOTIFYICONDATAW, *PNOTIFYICONDATAW;
|
|
#ifdef UNICODE
|
|
typedef NOTIFYICONDATAW NOTIFYICONDATA;
|
|
typedef PNOTIFYICONDATAW PNOTIFYICONDATA;
|
|
#else
|
|
typedef NOTIFYICONDATAA NOTIFYICONDATA;
|
|
typedef PNOTIFYICONDATAA PNOTIFYICONDATA;
|
|
#endif // UNICODE
|
|
|
|
|
|
#define NOTIFYICONDATAA_V1_SIZE FIELD_OFFSET(NOTIFYICONDATAA, szTip[64])
|
|
#define NOTIFYICONDATAW_V1_SIZE FIELD_OFFSET(NOTIFYICONDATAW, szTip[64])
|
|
#ifdef UNICODE
|
|
#define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAW_V1_SIZE
|
|
#else
|
|
#define NOTIFYICONDATA_V1_SIZE NOTIFYICONDATAA_V1_SIZE
|
|
#endif
|
|
|
|
#define NOTIFYICONDATAA_V2_SIZE FIELD_OFFSET(NOTIFYICONDATAA, guidItem)
|
|
#define NOTIFYICONDATAW_V2_SIZE FIELD_OFFSET(NOTIFYICONDATAW, guidItem)
|
|
#ifdef UNICODE
|
|
#define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAW_V2_SIZE
|
|
#else
|
|
#define NOTIFYICONDATA_V2_SIZE NOTIFYICONDATAA_V2_SIZE
|
|
#endif
|
|
|
|
#define NOTIFYICONDATAA_V3_SIZE FIELD_OFFSET(NOTIFYICONDATAA, hBalloonIcon)
|
|
#define NOTIFYICONDATAW_V3_SIZE FIELD_OFFSET(NOTIFYICONDATAW, hBalloonIcon)
|
|
#ifdef UNICODE
|
|
#define NOTIFYICONDATA_V3_SIZE NOTIFYICONDATAW_V3_SIZE
|
|
#else
|
|
#define NOTIFYICONDATA_V3_SIZE NOTIFYICONDATAA_V3_SIZE
|
|
#endif
|
|
|
|
|
|
#if (_WIN32_IE >= 0x0500)
|
|
#define NIN_SELECT (WM_USER + 0)
|
|
#define NINF_KEY 0x1
|
|
#define NIN_KEYSELECT (NIN_SELECT | NINF_KEY)
|
|
#endif
|
|
|
|
#if (_WIN32_IE >= 0x0501)
|
|
#define NIN_BALLOONSHOW (WM_USER + 2)
|
|
#define NIN_BALLOONHIDE (WM_USER + 3)
|
|
#define NIN_BALLOONTIMEOUT (WM_USER + 4)
|
|
#define NIN_BALLOONUSERCLICK (WM_USER + 5)
|
|
#endif
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
#define NIN_POPUPOPEN (WM_USER + 6)
|
|
#define NIN_POPUPCLOSE (WM_USER + 7)
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
#if (NTDDI_VERSION >= NTDDI_WIN7)
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN7)
|
|
|
|
|
|
#define NIM_ADD 0x00000000
|
|
#define NIM_MODIFY 0x00000001
|
|
#define NIM_DELETE 0x00000002
|
|
#if (_WIN32_IE >= 0x0500)
|
|
#define NIM_SETFOCUS 0x00000003
|
|
#define NIM_SETVERSION 0x00000004
|
|
|
|
|
|
// set NOTIFYICONDATA.uVersion with 0, 3 or 4
|
|
// please read the documentation on the behavior difference that the different versions imply
|
|
#define NOTIFYICON_VERSION 3
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
#define NOTIFYICON_VERSION_4 4
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
#endif
|
|
|
|
#define NIF_MESSAGE 0x00000001
|
|
#define NIF_ICON 0x00000002
|
|
#define NIF_TIP 0x00000004
|
|
#if (_WIN32_IE >= 0x0500)
|
|
#define NIF_STATE 0x00000008
|
|
#define NIF_INFO 0x00000010
|
|
#endif
|
|
#if (_WIN32_IE >= 0x600)
|
|
#define NIF_GUID 0x00000020
|
|
#endif
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
#define NIF_REALTIME 0x00000040
|
|
#define NIF_SHOWTIP 0x00000080
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
|
|
#if (_WIN32_IE >= 0x0500)
|
|
#define NIS_HIDDEN 0x00000001
|
|
#define NIS_SHAREDICON 0x00000002
|
|
|
|
// says this is the source of a shared icon
|
|
|
|
// Notify Icon Infotip flags
|
|
#define NIIF_NONE 0x00000000
|
|
// icon flags are mutually exclusive
|
|
// and take only the lowest 2 bits
|
|
#define NIIF_INFO 0x00000001
|
|
#define NIIF_WARNING 0x00000002
|
|
#define NIIF_ERROR 0x00000003
|
|
#if (NTDDI_VERSION >= NTDDI_XPSP2) // also available in NTDDI_WS03SP1
|
|
#define NIIF_USER 0x00000004
|
|
#endif // (NTDDI_VERSION >= NTDDI_XPSP2)
|
|
#define NIIF_ICON_MASK 0x0000000F
|
|
#if (_WIN32_IE >= 0x0501)
|
|
#define NIIF_NOSOUND 0x00000010
|
|
#endif
|
|
#endif
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
#define NIIF_LARGE_ICON 0x00000020
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WIN7)
|
|
#define NIIF_RESPECT_QUIET_TIME 0x00000080
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN7)
|
|
|
|
|
|
|
|
typedef struct _NOTIFYICONIDENTIFIER {
|
|
DWORD cbSize;
|
|
HWND hWnd;
|
|
UINT uID;
|
|
GUID guidItem;
|
|
} NOTIFYICONIDENTIFIER, *PNOTIFYICONIDENTIFIER;
|
|
|
|
|
|
SHSTDAPI_(BOOL) Shell_NotifyIconA(DWORD dwMessage, __in PNOTIFYICONDATAA lpData);
|
|
SHSTDAPI_(BOOL) Shell_NotifyIconW(DWORD dwMessage, __in PNOTIFYICONDATAW lpData);
|
|
#ifdef UNICODE
|
|
#define Shell_NotifyIcon Shell_NotifyIconW
|
|
#else
|
|
#define Shell_NotifyIcon Shell_NotifyIconA
|
|
#endif // !UNICODE
|
|
|
|
SHSTDAPI Shell_NotifyIconGetRect(__in const NOTIFYICONIDENTIFIER* identifier, __out RECT* iconLocation);
|
|
|
|
////
|
|
//// End Taskbar Notification Icons
|
|
////
|
|
|
|
#ifndef SHFILEINFO_DEFINED
|
|
#define SHFILEINFO_DEFINED
|
|
////
|
|
//// Begin SHGetFileInfo
|
|
////
|
|
|
|
/*
|
|
* The SHGetFileInfo API provides an easy way to get attributes
|
|
* for a file given a pathname.
|
|
*
|
|
* PARAMETERS
|
|
*
|
|
* pszPath file name to get info about
|
|
* dwFileAttributes file attribs, only used with SHGFI_USEFILEATTRIBUTES
|
|
* psfi place to return file info
|
|
* cbFileInfo size of structure
|
|
* uFlags flags
|
|
*
|
|
* RETURN
|
|
* TRUE if things worked
|
|
*/
|
|
|
|
typedef struct _SHFILEINFOA
|
|
{
|
|
HICON hIcon; // out: icon
|
|
int iIcon; // out: icon index
|
|
DWORD dwAttributes; // out: SFGAO_ flags
|
|
CHAR szDisplayName[MAX_PATH]; // out: display name (or path)
|
|
CHAR szTypeName[80]; // out: type name
|
|
} SHFILEINFOA;
|
|
typedef struct _SHFILEINFOW
|
|
{
|
|
HICON hIcon; // out: icon
|
|
int iIcon; // out: icon index
|
|
DWORD dwAttributes; // out: SFGAO_ flags
|
|
WCHAR szDisplayName[MAX_PATH]; // out: display name (or path)
|
|
WCHAR szTypeName[80]; // out: type name
|
|
} SHFILEINFOW;
|
|
#ifdef UNICODE
|
|
typedef SHFILEINFOW SHFILEINFO;
|
|
#else
|
|
typedef SHFILEINFOA SHFILEINFO;
|
|
#endif // UNICODE
|
|
|
|
|
|
// NOTE: This is also in shlwapi.h. Please keep in synch.
|
|
#endif // !SHFILEINFO_DEFINED
|
|
|
|
#define SHGFI_ICON 0x000000100 // get icon
|
|
#define SHGFI_DISPLAYNAME 0x000000200 // get display name
|
|
#define SHGFI_TYPENAME 0x000000400 // get type name
|
|
#define SHGFI_ATTRIBUTES 0x000000800 // get attributes
|
|
#define SHGFI_ICONLOCATION 0x000001000 // get icon location
|
|
#define SHGFI_EXETYPE 0x000002000 // return exe type
|
|
#define SHGFI_SYSICONINDEX 0x000004000 // get system icon index
|
|
#define SHGFI_LINKOVERLAY 0x000008000 // put a link overlay on icon
|
|
#define SHGFI_SELECTED 0x000010000 // show icon in selected state
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
#define SHGFI_ATTR_SPECIFIED 0x000020000 // get only specified attributes
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
#define SHGFI_LARGEICON 0x000000000 // get large icon
|
|
#define SHGFI_SMALLICON 0x000000001 // get small icon
|
|
#define SHGFI_OPENICON 0x000000002 // get open icon
|
|
#define SHGFI_SHELLICONSIZE 0x000000004 // get shell size icon
|
|
#define SHGFI_PIDL 0x000000008 // pszPath is a pidl
|
|
#define SHGFI_USEFILEATTRIBUTES 0x000000010 // use passed dwFileAttribute
|
|
|
|
#if (_WIN32_IE >= 0x0500)
|
|
#define SHGFI_ADDOVERLAYS 0x000000020 // apply the appropriate overlays
|
|
#define SHGFI_OVERLAYINDEX 0x000000040 // Get the index of the overlay
|
|
// in the upper 8 bits of the iIcon
|
|
#endif
|
|
|
|
SHSTDAPI_(DWORD_PTR) SHGetFileInfoA(LPCSTR pszPath, DWORD dwFileAttributes, __inout_bcount_opt(cbFileInfo) SHFILEINFOA *psfi,
|
|
UINT cbFileInfo, UINT uFlags);
|
|
SHSTDAPI_(DWORD_PTR) SHGetFileInfoW(LPCWSTR pszPath, DWORD dwFileAttributes, __inout_bcount_opt(cbFileInfo) SHFILEINFOW *psfi,
|
|
UINT cbFileInfo, UINT uFlags);
|
|
#ifdef UNICODE
|
|
#define SHGetFileInfo SHGetFileInfoW
|
|
#else
|
|
#define SHGetFileInfo SHGetFileInfoA
|
|
#endif // !UNICODE
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
typedef struct _SHSTOCKICONINFO
|
|
{
|
|
DWORD cbSize;
|
|
HICON hIcon;
|
|
int iSysImageIndex;
|
|
int iIcon;
|
|
WCHAR szPath[MAX_PATH];
|
|
} SHSTOCKICONINFO;
|
|
|
|
#define SHGSI_ICONLOCATION 0 // you always get the icon location
|
|
#define SHGSI_ICON SHGFI_ICON
|
|
#define SHGSI_SYSICONINDEX SHGFI_SYSICONINDEX
|
|
#define SHGSI_LINKOVERLAY SHGFI_LINKOVERLAY
|
|
#define SHGSI_SELECTED SHGFI_SELECTED
|
|
#define SHGSI_LARGEICON SHGFI_LARGEICON
|
|
#define SHGSI_SMALLICON SHGFI_SMALLICON
|
|
#define SHGSI_SHELLICONSIZE SHGFI_SHELLICONSIZE
|
|
|
|
// Shell icons
|
|
|
|
|
|
typedef enum SHSTOCKICONID
|
|
{
|
|
SIID_DOCNOASSOC = 0, // document (blank page), no associated program
|
|
SIID_DOCASSOC = 1, // document with an associated program
|
|
SIID_APPLICATION = 2, // generic application with no custom icon
|
|
SIID_FOLDER = 3, // folder (closed)
|
|
SIID_FOLDEROPEN = 4, // folder (open)
|
|
SIID_DRIVE525 = 5, // 5.25" floppy disk drive
|
|
SIID_DRIVE35 = 6, // 3.5" floppy disk drive
|
|
SIID_DRIVEREMOVE = 7, // removable drive
|
|
SIID_DRIVEFIXED = 8, // fixed (hard disk) drive
|
|
SIID_DRIVENET = 9, // network drive
|
|
SIID_DRIVENETDISABLED = 10, // disconnected network drive
|
|
SIID_DRIVECD = 11, // CD drive
|
|
SIID_DRIVERAM = 12, // RAM disk drive
|
|
SIID_WORLD = 13, // entire network
|
|
SIID_SERVER = 15, // a computer on the network
|
|
SIID_PRINTER = 16, // printer
|
|
SIID_MYNETWORK = 17, // My network places
|
|
SIID_FIND = 22, // Find
|
|
SIID_HELP = 23, // Help
|
|
SIID_SHARE = 28, // overlay for shared items
|
|
SIID_LINK = 29, // overlay for shortcuts to items
|
|
SIID_SLOWFILE = 30, // overlay for slow items
|
|
SIID_RECYCLER = 31, // empty recycle bin
|
|
SIID_RECYCLERFULL = 32, // full recycle bin
|
|
SIID_MEDIACDAUDIO = 40, // Audio CD Media
|
|
SIID_LOCK = 47, // Security lock
|
|
SIID_AUTOLIST = 49, // AutoList
|
|
SIID_PRINTERNET = 50, // Network printer
|
|
SIID_SERVERSHARE = 51, // Server share
|
|
SIID_PRINTERFAX = 52, // Fax printer
|
|
SIID_PRINTERFAXNET = 53, // Networked Fax Printer
|
|
SIID_PRINTERFILE = 54, // Print to File
|
|
SIID_STACK = 55, // Stack
|
|
SIID_MEDIASVCD = 56, // SVCD Media
|
|
SIID_STUFFEDFOLDER = 57, // Folder containing other items
|
|
SIID_DRIVEUNKNOWN = 58, // Unknown drive
|
|
SIID_DRIVEDVD = 59, // DVD Drive
|
|
SIID_MEDIADVD = 60, // DVD Media
|
|
SIID_MEDIADVDRAM = 61, // DVD-RAM Media
|
|
SIID_MEDIADVDRW = 62, // DVD-RW Media
|
|
SIID_MEDIADVDR = 63, // DVD-R Media
|
|
SIID_MEDIADVDROM = 64, // DVD-ROM Media
|
|
SIID_MEDIACDAUDIOPLUS = 65, // CD+ (Enhanced CD) Media
|
|
SIID_MEDIACDRW = 66, // CD-RW Media
|
|
SIID_MEDIACDR = 67, // CD-R Media
|
|
SIID_MEDIACDBURN = 68, // Burning CD
|
|
SIID_MEDIABLANKCD = 69, // Blank CD Media
|
|
SIID_MEDIACDROM = 70, // CD-ROM Media
|
|
SIID_AUDIOFILES = 71, // Audio files
|
|
SIID_IMAGEFILES = 72, // Image files
|
|
SIID_VIDEOFILES = 73, // Video files
|
|
SIID_MIXEDFILES = 74, // Mixed files
|
|
SIID_FOLDERBACK = 75, // Folder back
|
|
SIID_FOLDERFRONT = 76, // Folder front
|
|
SIID_SHIELD = 77, // Security shield. Use for UAC prompts only.
|
|
SIID_WARNING = 78, // Warning
|
|
SIID_INFO = 79, // Informational
|
|
SIID_ERROR = 80, // Error
|
|
SIID_KEY = 81, // Key / Secure
|
|
SIID_SOFTWARE = 82, // Software
|
|
SIID_RENAME = 83, // Rename
|
|
SIID_DELETE = 84, // Delete
|
|
SIID_MEDIAAUDIODVD = 85, // Audio DVD Media
|
|
SIID_MEDIAMOVIEDVD = 86, // Movie DVD Media
|
|
SIID_MEDIAENHANCEDCD = 87, // Enhanced CD Media
|
|
SIID_MEDIAENHANCEDDVD = 88, // Enhanced DVD Media
|
|
SIID_MEDIAHDDVD = 89, // HD-DVD Media
|
|
SIID_MEDIABLURAY = 90, // BluRay Media
|
|
SIID_MEDIAVCD = 91, // VCD Media
|
|
SIID_MEDIADVDPLUSR = 92, // DVD+R Media
|
|
SIID_MEDIADVDPLUSRW = 93, // DVD+RW Media
|
|
SIID_DESKTOPPC = 94, // desktop computer
|
|
SIID_MOBILEPC = 95, // mobile computer (laptop/notebook)
|
|
SIID_USERS = 96, // users
|
|
SIID_MEDIASMARTMEDIA = 97, // Smart Media
|
|
SIID_MEDIACOMPACTFLASH = 98, // Compact Flash
|
|
SIID_DEVICECELLPHONE = 99, // Cell phone
|
|
SIID_DEVICECAMERA = 100, // Camera
|
|
SIID_DEVICEVIDEOCAMERA = 101, // Video camera
|
|
SIID_DEVICEAUDIOPLAYER = 102, // Audio player
|
|
SIID_NETWORKCONNECT = 103, // Connect to network
|
|
SIID_INTERNET = 104, // Internet
|
|
SIID_ZIPFILE = 105, // ZIP file
|
|
SIID_SETTINGS = 106, // Settings
|
|
// 107-131 are internal Vista RTM icons
|
|
// 132-159 for SP1 icons
|
|
SIID_DRIVEHDDVD = 132, // HDDVD Drive (all types)
|
|
SIID_DRIVEBD = 133, // BluRay Drive (all types)
|
|
SIID_MEDIAHDDVDROM = 134, // HDDVD-ROM Media
|
|
SIID_MEDIAHDDVDR = 135, // HDDVD-R Media
|
|
SIID_MEDIAHDDVDRAM = 136, // HDDVD-RAM Media
|
|
SIID_MEDIABDROM = 137, // BluRay ROM Media
|
|
SIID_MEDIABDR = 138, // BluRay R Media
|
|
SIID_MEDIABDRE = 139, // BluRay RE Media (Rewriable and RAM)
|
|
SIID_CLUSTEREDDRIVE = 140, // Clustered disk
|
|
// 160+ are for Windows 7 icons
|
|
SIID_MAX_ICONS = 174,
|
|
} SHSTOCKICONID;
|
|
|
|
#define SIID_INVALID ((SHSTOCKICONID)-1)
|
|
|
|
SHSTDAPI SHGetStockIconInfo(SHSTOCKICONID siid, UINT uFlags, __inout SHSTOCKICONINFO *psii);
|
|
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
#define SHGetDiskFreeSpace SHGetDiskFreeSpaceEx
|
|
|
|
SHSTDAPI_(BOOL) SHGetDiskFreeSpaceExA(LPCSTR pszDirectoryName, __out_opt ULARGE_INTEGER* pulFreeBytesAvailableToCaller,
|
|
__out_opt ULARGE_INTEGER* pulTotalNumberOfBytes, __out_opt ULARGE_INTEGER* pulTotalNumberOfFreeBytes);
|
|
SHSTDAPI_(BOOL) SHGetDiskFreeSpaceExW(LPCWSTR pszDirectoryName, __out_opt ULARGE_INTEGER* pulFreeBytesAvailableToCaller,
|
|
__out_opt ULARGE_INTEGER* pulTotalNumberOfBytes, __out_opt ULARGE_INTEGER* pulTotalNumberOfFreeBytes);
|
|
#ifdef UNICODE
|
|
#define SHGetDiskFreeSpaceEx SHGetDiskFreeSpaceExW
|
|
#else
|
|
#define SHGetDiskFreeSpaceEx SHGetDiskFreeSpaceExA
|
|
#endif // !UNICODE
|
|
__success(return != 0)
|
|
SHSTDAPI_(BOOL) SHGetNewLinkInfoA(__in LPCSTR pszLinkTo, __in LPCSTR pszDir, __out_ecount(MAX_PATH) LPSTR pszName, __out BOOL *pfMustCopy, __in UINT uFlags);
|
|
__success(return != 0)
|
|
SHSTDAPI_(BOOL) SHGetNewLinkInfoW(__in LPCWSTR pszLinkTo, __in LPCWSTR pszDir, __out_ecount(MAX_PATH) LPWSTR pszName, __out BOOL *pfMustCopy, __in UINT uFlags);
|
|
#ifdef UNICODE
|
|
#define SHGetNewLinkInfo SHGetNewLinkInfoW
|
|
#else
|
|
#define SHGetNewLinkInfo SHGetNewLinkInfoA
|
|
#endif // !UNICODE
|
|
|
|
#define SHGNLI_PIDL 0x000000001 // pszLinkTo is a pidl
|
|
#define SHGNLI_PREFIXNAME 0x000000002 // Make name "Shortcut to xxx"
|
|
#define SHGNLI_NOUNIQUE 0x000000004 // don't do the unique name generation
|
|
#if (_WIN32_IE >= 0x0501)
|
|
#define SHGNLI_NOLNK 0x000000008 // don't add ".lnk" extension
|
|
#endif // _WIN2_IE >= 0x0501
|
|
#if (_WIN32_IE >= 0x0600)
|
|
#define SHGNLI_NOLOCNAME 0x000000010 // use non localized (parsing) name from the target
|
|
#endif
|
|
#if (NTDDI_VERSION >= NTDDI_WIN7)
|
|
#define SHGNLI_USEURLEXT 0x000000020 // use ".url" extension instead of ".lnk"
|
|
#endif
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
#define PRINTACTION_OPEN 0 // pszBuf1:<PrinterName>
|
|
#define PRINTACTION_PROPERTIES 1 // pszBuf1:<PrinterName>, pszBuf2:optional <PageName>
|
|
#define PRINTACTION_NETINSTALL 2 // pszBuf1:<NetPrinterName>
|
|
#define PRINTACTION_NETINSTALLLINK 3 // pszBuf1:<NetPrinterName>, pszBuf2:<path to store link>
|
|
#define PRINTACTION_TESTPAGE 4 // pszBuf1:<PrinterName>
|
|
#define PRINTACTION_OPENNETPRN 5 // pszBuf1:<NetPrinterName>
|
|
#define PRINTACTION_DOCUMENTDEFAULTS 6 // pszBuf1:<PrinterName>
|
|
#define PRINTACTION_SERVERPROPERTIES 7 // pszBuf1:<Server> or <NetPrinterName>
|
|
|
|
// deprecated, instead invoke verbs on printers/netprinters using IContextMenu or ShellExecute()
|
|
|
|
SHSTDAPI_(BOOL) SHInvokePrinterCommandA(HWND hwnd, UINT uAction, LPCSTR lpBuf1, LPCSTR lpBuf2, BOOL fModal);
|
|
SHSTDAPI_(BOOL) SHInvokePrinterCommandW(HWND hwnd, UINT uAction, LPCWSTR lpBuf1, LPCWSTR lpBuf2, BOOL fModal);
|
|
#ifdef UNICODE
|
|
#define SHInvokePrinterCommand SHInvokePrinterCommandW
|
|
#else
|
|
#define SHInvokePrinterCommand SHInvokePrinterCommandA
|
|
#endif // !UNICODE
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
typedef struct _OPEN_PRINTER_PROPS_INFOA
|
|
{
|
|
DWORD dwSize;
|
|
LPSTR pszSheetName;
|
|
UINT uSheetIndex;
|
|
DWORD dwFlags;
|
|
BOOL bModal;
|
|
} OPEN_PRINTER_PROPS_INFOA, *POPEN_PRINTER_PROPS_INFOA;
|
|
typedef struct _OPEN_PRINTER_PROPS_INFOW
|
|
{
|
|
DWORD dwSize;
|
|
LPWSTR pszSheetName;
|
|
UINT uSheetIndex;
|
|
DWORD dwFlags;
|
|
BOOL bModal;
|
|
} OPEN_PRINTER_PROPS_INFOW, *POPEN_PRINTER_PROPS_INFOW;
|
|
#ifdef UNICODE
|
|
typedef OPEN_PRINTER_PROPS_INFOW OPEN_PRINTER_PROPS_INFO;
|
|
typedef POPEN_PRINTER_PROPS_INFOW POPEN_PRINTER_PROPS_INFO;
|
|
#else
|
|
typedef OPEN_PRINTER_PROPS_INFOA OPEN_PRINTER_PROPS_INFO;
|
|
typedef POPEN_PRINTER_PROPS_INFOA POPEN_PRINTER_PROPS_INFO;
|
|
#endif // UNICODE
|
|
#define PRINT_PROP_FORCE_NAME 0x01
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
|
|
|
|
#endif /* WINVER >= 0x0400 */
|
|
|
|
#if (_WIN32_WINNT >= 0x0500) || (_WIN32_WINDOWS >= 0x0500)
|
|
|
|
//
|
|
// The SHLoadNonloadedIconOverlayIdentifiers API causes the shell's
|
|
// icon overlay manager to load any registered icon overlay
|
|
// identifers that are not currently loaded. This is useful if an
|
|
// overlay identifier did not load at shell startup but is needed
|
|
// and can be loaded at a later time. Identifiers already loaded
|
|
// are not affected. Overlay identifiers implement the
|
|
// IShellIconOverlayIdentifier interface.
|
|
//
|
|
// Returns:
|
|
// S_OK
|
|
//
|
|
SHSTDAPI SHLoadNonloadedIconOverlayIdentifiers(void);
|
|
|
|
//
|
|
// The SHIsFileAvailableOffline API determines whether a file
|
|
// or folder is available for offline use.
|
|
//
|
|
// Parameters:
|
|
// pwszPath file name to get info about
|
|
// pdwStatus (optional) OFFLINE_STATUS_* flags returned here
|
|
//
|
|
// Returns:
|
|
// S_OK File/directory is available offline, unless
|
|
// OFFLINE_STATUS_INCOMPLETE is returned.
|
|
// E_INVALIDARG Path is invalid, or not a net path
|
|
// E_FAIL File/directory is not available offline
|
|
//
|
|
// Notes:
|
|
// OFFLINE_STATUS_INCOMPLETE is never returned for directories.
|
|
// Both OFFLINE_STATUS_LOCAL and OFFLINE_STATUS_REMOTE may be returned,
|
|
// indicating "open in both places." This is common when the server is online.
|
|
//
|
|
SHSTDAPI SHIsFileAvailableOffline(__in LPCWSTR pwszPath, __out_opt LPDWORD pdwStatus);
|
|
|
|
#define OFFLINE_STATUS_LOCAL 0x0001 // If open, it's open locally
|
|
#define OFFLINE_STATUS_REMOTE 0x0002 // If open, it's open remotely
|
|
#define OFFLINE_STATUS_INCOMPLETE 0x0004 // The local copy is currently imcomplete.
|
|
// The file will not be available offline
|
|
// until it has been synchronized.
|
|
|
|
#endif
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WINXP)
|
|
// sets the specified path to use the string resource
|
|
// as the UI instead of the file system name
|
|
SHSTDAPI SHSetLocalizedName(LPCWSTR pszPath, LPCWSTR pszResModule, int idsRes);
|
|
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
// sets the specified path to use the string resource
|
|
// as the UI instead of the file system name
|
|
SHSTDAPI SHRemoveLocalizedName(LPCWSTR pszPath);
|
|
// gets the string resource for the specified path
|
|
SHSTDAPI SHGetLocalizedName(__in LPCWSTR pszPath, __out_ecount(cch) LPWSTR pszResModule, UINT cch, __out int *pidsRes);
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
|
|
|
|
//====== ShellMessageBox ================================================
|
|
|
|
// If lpcTitle is NULL, the title is taken from hWnd
|
|
// If lpcText is NULL, this is assumed to be an Out Of Memory message
|
|
// If the selector of lpcTitle or lpcText is NULL, the offset should be a
|
|
// string resource ID
|
|
// The variable arguments must all be 32-bit values (even if fewer bits
|
|
// are actually used)
|
|
// lpcText (or whatever string resource it causes to be loaded) should
|
|
// be a formatting string similar to wsprintf except that only the
|
|
// following formats are available:
|
|
// %% formats to a single '%'
|
|
// %nn%s the nn-th arg is a string which is inserted
|
|
// %nn%ld the nn-th arg is a DWORD, and formatted decimal
|
|
// %nn%lx the nn-th arg is a DWORD, and formatted hex
|
|
// note that lengths are allowed on the %s, %ld, and %lx, just
|
|
// like wsprintf
|
|
//
|
|
|
|
#if !defined(_SHLWAPI_)
|
|
#define LWSTDAPIV_(type) EXTERN_C DECLSPEC_IMPORT type STDAPIVCALLTYPE
|
|
#else
|
|
#define LWSTDAPIV_(type) STDAPIV_(type)
|
|
#endif
|
|
|
|
LWSTDAPIV_(int) ShellMessageBoxA(
|
|
__in_opt HINSTANCE hAppInst,
|
|
__in_opt HWND hWnd,
|
|
__in LPCSTR lpcText,
|
|
__in_opt LPCSTR lpcTitle,
|
|
__in UINT fuStyle, ...);
|
|
LWSTDAPIV_(int) ShellMessageBoxW(
|
|
__in_opt HINSTANCE hAppInst,
|
|
__in_opt HWND hWnd,
|
|
__in LPCWSTR lpcText,
|
|
__in_opt LPCWSTR lpcTitle,
|
|
__in UINT fuStyle, ...);
|
|
#ifdef UNICODE
|
|
#define ShellMessageBox ShellMessageBoxW
|
|
#else
|
|
#define ShellMessageBox ShellMessageBoxA
|
|
#endif // !UNICODE
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
SHSTDAPI_(BOOL) IsLFNDriveA(__in_opt LPCSTR pszPath);
|
|
SHSTDAPI_(BOOL) IsLFNDriveW(__in_opt LPCWSTR pszPath);
|
|
#ifdef UNICODE
|
|
#define IsLFNDrive IsLFNDriveW
|
|
#else
|
|
#define IsLFNDrive IsLFNDriveA
|
|
#endif // !UNICODE
|
|
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
|
|
|
|
|
|
#if _WIN32_IE >= 0x0600
|
|
|
|
STDAPI SHEnumerateUnreadMailAccountsA(HKEY hKeyUser, DWORD dwIndex, __out_ecount(cchMailAddress) LPSTR pszMailAddress, int cchMailAddress);
|
|
STDAPI SHEnumerateUnreadMailAccountsW(HKEY hKeyUser, DWORD dwIndex, __out_ecount(cchMailAddress) LPWSTR pszMailAddress, int cchMailAddress);
|
|
#ifdef UNICODE
|
|
#define SHEnumerateUnreadMailAccounts SHEnumerateUnreadMailAccountsW
|
|
#else
|
|
#define SHEnumerateUnreadMailAccounts SHEnumerateUnreadMailAccountsA
|
|
#endif // !UNICODE
|
|
STDAPI SHGetUnreadMailCountA(HKEY hKeyUser, LPCSTR pszMailAddress, __out_opt DWORD *pdwCount, __out_opt FILETIME *pFileTime, __out_ecount_opt(cchShellExecuteCommand) LPSTR pszShellExecuteCommand, int cchShellExecuteCommand);
|
|
STDAPI SHGetUnreadMailCountW(HKEY hKeyUser, LPCWSTR pszMailAddress, __out_opt DWORD *pdwCount, __out_opt FILETIME *pFileTime, __out_ecount_opt(cchShellExecuteCommand) LPWSTR pszShellExecuteCommand, int cchShellExecuteCommand);
|
|
#ifdef UNICODE
|
|
#define SHGetUnreadMailCount SHGetUnreadMailCountW
|
|
#else
|
|
#define SHGetUnreadMailCount SHGetUnreadMailCountA
|
|
#endif // !UNICODE
|
|
STDAPI SHSetUnreadMailCountA(LPCSTR pszMailAddress, DWORD dwCount, LPCSTR pszShellExecuteCommand);
|
|
STDAPI SHSetUnreadMailCountW(LPCWSTR pszMailAddress, DWORD dwCount, LPCWSTR pszShellExecuteCommand);
|
|
#ifdef UNICODE
|
|
#define SHSetUnreadMailCount SHSetUnreadMailCountW
|
|
#else
|
|
#define SHSetUnreadMailCount SHSetUnreadMailCountA
|
|
#endif // !UNICODE
|
|
|
|
#endif /* _WIN32_IE >= 0x0600 */
|
|
|
|
#if (_WIN32_IE >= 0x0601)
|
|
STDAPI_(BOOL) SHTestTokenMembership(__in_opt HANDLE hToken, __in ULONG ulRID);
|
|
#endif // (_WIN32_IE >= 0x0601)
|
|
|
|
#if _WIN32_IE >= 0x0600
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WINXP)
|
|
SHSTDAPI SHGetImageList(__in int iImageList, __in REFIID riid, __deref_out void **ppvObj);
|
|
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_WINXP)
|
|
#define SHIL_LARGE 0 // normally 32x32
|
|
#define SHIL_SMALL 1 // normally 16x16
|
|
#define SHIL_EXTRALARGE 2
|
|
#define SHIL_SYSSMALL 3 // like SHIL_SMALL, but tracks system small icon metric correctly
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
#define SHIL_JUMBO 4 // normally 256x256
|
|
#define SHIL_LAST SHIL_JUMBO
|
|
#else
|
|
#define SHIL_LAST SHIL_SYSSMALL
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
#endif // (NTDDI_VERSION >= NTDDI_WINXP)
|
|
|
|
|
|
// Function call types for ntshrui folder sharing helpers
|
|
typedef HRESULT (STDMETHODCALLTYPE *PFNCANSHAREFOLDERW)(LPCWSTR pszPath);
|
|
typedef HRESULT (STDMETHODCALLTYPE *PFNSHOWSHAREFOLDERUIW)(HWND hwndParent, LPCWSTR pszPath);
|
|
|
|
#endif /* _WIN32_IE >= 0x0600 */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#if !defined(_WIN64)
|
|
#include <poppack.h>
|
|
#endif
|
|
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
|
|
#pragma warning(pop)
|
|
#endif
|
|
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
// API for new Network Address Control
|
|
|
|
// Instantiation
|
|
#define WC_NETADDRESS L"msctls_netaddress"
|
|
SHSTDAPI_(BOOL) InitNetworkAddressControl(void);
|
|
|
|
// Address Control Messages
|
|
|
|
// NCM_GETADDRESS returns the type of address that is present in the
|
|
// control (based on TBD Net Address flags). If the input string has
|
|
// not been validated using this message will force the validation of
|
|
// the input string. The WPARAM is a BOOL to determine to show the
|
|
// balloon tip. The LPARAM is a pointer to the structure to fill in
|
|
// with the address type and address string.
|
|
#define NCM_GETADDRESS (WM_USER+1)
|
|
#define NetAddr_GetAddress(hwnd,pv) \
|
|
(HRESULT)SNDMSG(hwnd,NCM_GETADDRESS,0,(LPARAM)pv)
|
|
typedef struct tagNC_ADDRESS
|
|
{
|
|
struct NET_ADDRESS_INFO_ *pAddrInfo; // defined in iphlpapi.h
|
|
USHORT PortNumber;
|
|
BYTE PrefixLength;
|
|
} NC_ADDRESS, *PNC_ADDRESS;
|
|
|
|
// NCM_SETALLOWTYPE sets the type of addresses that the control will allow.
|
|
// The address flags are defined in iphlpapi.h
|
|
#define NCM_SETALLOWTYPE (WM_USER+2)
|
|
#define NetAddr_SetAllowType(hwnd,addrMask) \
|
|
(HRESULT)SNDMSG(hwnd,NCM_SETALLOWTYPE,(WPARAM)addrMask,0)
|
|
// NCM_GETALLOWTYPE returns the currently allowed type mask.
|
|
#define NCM_GETALLOWTYPE (WM_USER+3)
|
|
#define NetAddr_GetAllowType(hwnd) \
|
|
(DWORD)SNDMSG(hwnd,NCM_GETALLOWTYPE,0,0)
|
|
|
|
// NCM_DISPLAYERRORTIP displays the error balloon tip with the correct
|
|
// error string (based on the last failure from the NCM_GETADDRESS call
|
|
#define NCM_DISPLAYERRORTIP (WM_USER+4)
|
|
#define NetAddr_DisplayErrorTip(hwnd) \
|
|
(HRESULT)SNDMSG(hwnd,NCM_DISPLAYERRORTIP,0,0)
|
|
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
// Returns the type of media (CD, DVD, Blank, etc) that is in the drive.
|
|
// dwMediaContent is set to a combination of ARCONTENT flags.
|
|
STDAPI SHGetDriveMedia(LPCWSTR pszDrive, __out DWORD *pdwMediaContent);
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
|
|
// Windows Parental Controls (WPC) query apis
|
|
#if (NTDDI_VERSION >= NTDDI_VISTA)
|
|
#endif // (NTDDI_VERSION >= NTDDI_VISTA)
|
|
|
|
#endif /* _INC_SHELLAPI */
|
|
|
|
|