/*****************************************************************************\ * * * shellapi.h - SHELL.DLL functions, types, and definitions * * * * Copyright (c) Microsoft Corporation. All rights reserved. * * * \*****************************************************************************/ #ifndef _INC_SHELLAPI #define _INC_SHELLAPI #include // // 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 #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: #define PRINTACTION_PROPERTIES 1 // pszBuf1:, pszBuf2:optional #define PRINTACTION_NETINSTALL 2 // pszBuf1: #define PRINTACTION_NETINSTALLLINK 3 // pszBuf1:, pszBuf2: #define PRINTACTION_TESTPAGE 4 // pszBuf1: #define PRINTACTION_OPENNETPRN 5 // pszBuf1: #define PRINTACTION_DOCUMENTDEFAULTS 6 // pszBuf1: #define PRINTACTION_SERVERPROPERTIES 7 // pszBuf1: or // 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 #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 */