You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
872 lines
29 KiB
872 lines
29 KiB
#ifndef _SHELLPRV_H_
|
|
#define _SHELLPRV_H_
|
|
|
|
// We now always rely on Win2k or Millennium at least.
|
|
#define OVERRIDE_SHLWAPI_PATH_FUNCTIONS // see comment in shsemip.h
|
|
|
|
#define _SHELL32_
|
|
#define _WIN32_DCOM // for COINIT_DISABLE_OLE1DDE
|
|
|
|
#ifdef __cplusplus
|
|
#define NO_INCLUDE_UNION
|
|
#endif /* __cplusplus */
|
|
|
|
#define NOWINDOWSX
|
|
#ifndef STRICT
|
|
#define STRICT
|
|
#endif
|
|
#define OEMRESOURCE // FSMenu needs the menu triangle
|
|
|
|
#define INC_OLE2
|
|
#define CONST_VTABLE
|
|
|
|
// Disable a few warnings so we can include the system header files at /W4.
|
|
#include "w4warn.h"
|
|
#pragma warning(disable:4706) // assignment within conditional expression
|
|
#pragma warning(disable:4127) // conditional expression is constant
|
|
#pragma warning(disable:4131) // 'CreateInfoFile' : uses old-style declarator
|
|
#pragma warning(disable:4221) // nonstandard extension used : 'pFrom' : cannot be initialized using address of automatic variable 'szBBPathToNuke'
|
|
#pragma warning(disable:4245) // 'initializing' : conversion from 'const int' to 'const DWORD', signed/unsigned mismatch
|
|
#pragma warning(disable:4057) // '=' : 'CHAR *' differs in indirection to slightly different base types from 'PBYTE '
|
|
#pragma warning(disable:4189) // 'fWrite' : local variable is initialized but not referenced
|
|
#pragma warning(disable:4701) // local variable 'lListIndex' may be used without having been initialized
|
|
#pragma warning(disable:4213) // nonstandard extension used : cast on l-value
|
|
#pragma warning(disable:4702) // unreachable code
|
|
#pragma warning(disable:4127) // conditional expression is constant
|
|
#pragma warning(disable:4210) // nonstandard extension used : function given file scope
|
|
#pragma warning(disable:4055) // 'type cast' : from data pointer 'IDataObject *' to function pointer 'FARPROC '
|
|
#pragma warning(disable:4267) // '=' : conversion from 'size_t' to 'UINT', possible loss of data
|
|
#pragma warning(disable:4328) // indirection alignment of formal parameter 4 (2) is greater than the actual argument alignment (1)
|
|
|
|
// These NT headers must come before <windows.h> or you get redefinition
|
|
// errors! It's a miracle the system builds at all...
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
#include <nt.h> // Some of the NT specific code needs Rtl functions
|
|
#include <ntrtl.h> // which requires all of these header files...
|
|
#include <nturtl.h>
|
|
#include <ntseapi.h>
|
|
#include <dfsfsctl.h>
|
|
|
|
#ifdef __cplusplus
|
|
} /* End of extern "C" */
|
|
#endif /* __cplusplus */
|
|
|
|
#define CC_INTERNAL // this is because docfind uses the commctrl internal prop sheet structures
|
|
|
|
//--------------------------------------------------------------------------
|
|
//
|
|
// The order of these is critical for ATL.
|
|
//
|
|
// 1. ATL has its own definition of InlineIsEqualGUID that conflicts with
|
|
// the definition in <objbase.h>, so we must explicitly include
|
|
// <ole2.h> to get the <objbase.h> definition, then use a hacky macro
|
|
// to disable the ATL version so it doesn't conflict with the OLE one.
|
|
//
|
|
// 2. ATL has methods called SubclassWindow, which conflicts with a
|
|
// macro in <windowsx.h>, so we must include <windowsx.h> after ATL.
|
|
//
|
|
// 3. We want ATL to use the shell debug macros, so we must include
|
|
// <debug.h> before ATL so it can see the shell debug macros.
|
|
//
|
|
// 4. VariantInit is such a trivial function that we inline it in order
|
|
// to avoid pulling in OleAut32.
|
|
//
|
|
// 5. We want ATL to use the shell version of the ANSI/UNICODE conversion
|
|
// functions (because the shell versions can be called from C).
|
|
//
|
|
|
|
#include <oaidl.h>
|
|
#include <docobj.h>
|
|
|
|
#include <windows.h>
|
|
#include "shfusion.h"
|
|
#include <ole2.h> // Get the real InlineIsEqualGUID
|
|
#define _ATL_NO_DEBUG_CRT // Use the shell debug macros
|
|
#include <stddef.h>
|
|
#include <debug.h> // Get the shell debug macros
|
|
#include <shconv.h> // Shell version of <atlconv.h>
|
|
|
|
|
|
#define VariantInit(p) memset(p, 0, sizeof(*(p)))
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#define _ATL_APARTMENT_THREADED
|
|
|
|
#ifndef _SYS_GUID_OPERATORS_
|
|
// Re-route the ATL version of InlineIsEqualGUID
|
|
#define InlineIsEqualGUID ATL_InlineIsEqualGUID
|
|
#endif
|
|
|
|
#include <atlbase.h>
|
|
//You may derive a class from CComModule and use it if you want to override
|
|
//something, but do not change the name of _Module
|
|
extern CComModule _Module;
|
|
|
|
#include <atlcom.h>
|
|
#include <atlhost.h>
|
|
#include <atlctl.h>
|
|
#include <atliface.h>
|
|
#include <atlwin.h>
|
|
|
|
#ifndef _SYS_GUID_OPERATORS_
|
|
#undef InlineIsEqualGUID // Return InlineIsEqualGUID to its normal state
|
|
#endif
|
|
|
|
#include <memt.h>
|
|
|
|
#endif /* __cplusplus */
|
|
|
|
// end of ATL Stuff
|
|
//--------------------------------------------------------------------------
|
|
#ifndef _SYS_GUID_OPERATORS_
|
|
#ifdef _OLE32_ // {
|
|
// turning on _OLE32_ (which we did for delay load stuff) gives us f-a-t
|
|
// versions of IsEqualGUID. undo that here (hack on top of a hack...)
|
|
#undef IsEqualGUID
|
|
#ifdef __cplusplus
|
|
__inline BOOL IsEqualGUID(IN REFGUID rguid1, IN REFGUID rguid2)
|
|
{
|
|
return !memcmp(&rguid1, &rguid2, sizeof(GUID));
|
|
}
|
|
#else // ! __cplusplus
|
|
#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))
|
|
#endif // __cplusplus
|
|
#endif // }
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" { /* Assume C declarations for C++ */
|
|
#endif /* __cplusplus */
|
|
|
|
// This flag indicates that we are on a system where data alignment is a concern
|
|
|
|
#if (defined(UNICODE) && (defined(_MIPS_) || defined(_ALPHA_) || defined(_PPC_)))
|
|
#define ALIGNMENT_SCENARIO
|
|
#endif
|
|
|
|
#include <windowsx.h>
|
|
#include <winnetp.h>
|
|
|
|
// Dependencies among header files:
|
|
//
|
|
// <oaidl.h> must come before <shlwapi.h> if you want to have
|
|
// OLE command target helper functions.
|
|
//
|
|
#include <hlink.h> // must include before shellp in order to get IBrowserService2!
|
|
#include <commctrl.h>
|
|
#include <shellapi.h>
|
|
#include <wininet.h>
|
|
#include <shlobj.h>
|
|
|
|
#include <shlwapi.h>
|
|
#include <commdlg.h>
|
|
#include <port32.h> // in shell\inc
|
|
#define DISALLOW_Assert
|
|
#include <linkinfo.h>
|
|
#include <shlobjp.h>
|
|
#include <shsemip.h>
|
|
#include <docobj.h>
|
|
#include <shguidp.h>
|
|
#include <ieguidp.h>
|
|
#include <shellp.h>
|
|
#include <shdocvw.h>
|
|
#include <iethread.h>
|
|
#include "browseui.h"
|
|
#include <ccstock.h>
|
|
#include <ccstock2.h>
|
|
#include <objidl.h>
|
|
#include "apithk.h"
|
|
#define SECURITY_WIN32
|
|
#include <security.h>
|
|
#include <mlang.h>
|
|
#include <regapix.h> // MAXIMUM_SUB_KEY_LENGTH, MAXIMUM_VALUE_NAME_LENGTH, MAXIMUM_DATA_LENGTH
|
|
#include <heapaloc.h>
|
|
#include <fmifs.h>
|
|
|
|
#define STRSAFE_NO_DEPRECATE
|
|
#include <strsafe.h>
|
|
|
|
#include "util.h"
|
|
#include "varutil.h"
|
|
#include "cstrings.h"
|
|
#include "securent.h"
|
|
#include "winprtp.h"
|
|
|
|
#include "qistub.h"
|
|
#ifdef DEBUG
|
|
#include "dbutil.h"
|
|
#endif
|
|
|
|
#define CP_HEBREW 1255
|
|
#define CP_ARABIC 1256
|
|
|
|
EXTERN_C const ITEMIDLIST c_idlDesktop; // NULL IDList
|
|
|
|
#undef CharNext
|
|
#undef CharPrev
|
|
|
|
#define CharNext(x) ((x)+1)
|
|
#define CharPrev(y,x) ((x)-1)
|
|
#define IsDBCSLeadByte(x) ((x), FALSE)
|
|
|
|
// these functions are not available on NT
|
|
#undef ReinitializeCriticalSection
|
|
#undef LoadLibrary16
|
|
#undef FreeLibrary16
|
|
#undef GetProcAddress16
|
|
#define ReinitializeCriticalSection #error_ReinitializeCriticalSection_not_available_on_NT
|
|
#define LoadLibrary16 #error_LoadLibrary16_not_available_on_NT
|
|
#define FreeLibrary16 #error_FreeLibrary16_not_available_on_NT
|
|
#define GetProcAddress16 #error_GetProcAddress16_not_available_on_NT
|
|
#define GetModuleHandle16(sz) (0)
|
|
#define GetModuleFileName16(hinst, buf, cch) buf[0]='\0'
|
|
|
|
DWORD
|
|
SetPrivilegeAttribute(
|
|
IN LPCTSTR PrivilegeName,
|
|
IN DWORD NewPrivilegeAttributes,
|
|
OUT DWORD *OldPrivilegeAttribute
|
|
);
|
|
|
|
|
|
// drivesx.c
|
|
BOOL IsUnavailableNetDrive(int iDrive);
|
|
BOOL IsDisconnectedNetDrive(int iDrive);
|
|
BOOL IsAudioDisc(LPTSTR pszDrive);
|
|
BOOL IsDVDDisc(int iDrive);
|
|
|
|
// futil.c
|
|
BOOL IsShared(LPNCTSTR pszPath, BOOL fUpdateCache);
|
|
DWORD GetConnection(LPCTSTR lpDev, LPTSTR lpPath, UINT cbPath, BOOL bConvertClosed);
|
|
|
|
// rundll32.c
|
|
HWND _CreateStubWindow(POINT* ppt, HWND hwndParent);
|
|
#define STUBM_SETDATA (WM_USER)
|
|
#define STUBM_GETDATA (WM_USER + 1)
|
|
#define STUBM_SETICONTITLE (WM_USER + 2)
|
|
|
|
#define STUBCLASS_PROPSHEET 1
|
|
#define STUBCLASS_FORMAT 2
|
|
|
|
// shlexe.c
|
|
BOOL IsDarwinEnabled();
|
|
STDAPI ParseDarwinID(LPTSTR pszDarwinDescriptor, LPTSTR pszDarwinCommand, DWORD cchDarwinCommand);
|
|
|
|
// shprsht.c
|
|
typedef struct {
|
|
HWND hwndStub;
|
|
HANDLE hClassPidl;
|
|
HICON hicoStub;
|
|
} UNIQUESTUBINFO;
|
|
STDAPI_(BOOL) EnsureUniqueStub(LPITEMIDLIST pidl, int iClass, POINT *ppt, UNIQUESTUBINFO *pusi);
|
|
STDAPI_(void) FreeUniqueStub(UNIQUESTUBINFO *pusi);
|
|
STDAPI_(void) SHFormatDriveAsync(HWND hwnd, UINT drive, UINT fmtID, UINT options);
|
|
|
|
// bitbuck.c
|
|
void RelayMessageToChildren(HWND hwnd, UINT uMessage, WPARAM wParam, LPARAM lParam);
|
|
BOOL IsFileInBitBucket(LPCTSTR pszPath);
|
|
|
|
BOOL CreateWriteCloseFile(HWND hwnd, LPCTSTR pszFileName, void *pv, DWORD cbData);
|
|
|
|
// idlist.c
|
|
STDAPI_(BOOL) SHIsValidPidl(LPCITEMIDLIST pidl);
|
|
|
|
STDAPI_(BOOL) IsExeTSAware(LPCTSTR pszExe);
|
|
|
|
// exec stuff
|
|
|
|
/* common exe code with error handling */
|
|
#define SECL_USEFULLPATHDIR 0x00000001
|
|
#define SECL_NO_UI 0x00000002
|
|
#define SECL_SEPARATE_VDM 0x00000004
|
|
#define SECL_LOG_USAGE 0x00000008
|
|
BOOL ShellExecCmdLine(HWND hwnd, LPCTSTR lpszCommand, LPCTSTR lpszDir,
|
|
int nShow, LPCTSTR lpszTitle, DWORD dwFlags);
|
|
#define ISSHELLEXECSUCCEEDED(hinst) ((UINT_PTR)hinst>32)
|
|
#define ISWINEXECSUCCEEDED(hinst) ((UINT_PTR)hinst>=32)
|
|
void _ShellExecuteError(LPSHELLEXECUTEINFO pei, LPCTSTR lpTitle, DWORD dwErr);
|
|
|
|
// fsnotify.c (private stuff) ----------------------
|
|
|
|
BOOL SHChangeNotifyInit();
|
|
STDAPI_(void) SHChangeNotifyTerminate(BOOL bLastTerm, BOOL bProcessShutdown);
|
|
void SHChangeNotifyReceiveEx(LONG lEvent, UINT uFlags, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlExtra, DWORD dwEventTime);
|
|
LRESULT SHChangeNotify_OnNotify(WPARAM wParam, LPARAM lParam);
|
|
LRESULT SHChangeNotify_OnChangeRegistration(WPARAM wParam, LPARAM lParam);
|
|
LRESULT SHChangeNotify_OnNotifySuspendResume(WPARAM wParam, LPARAM lParam);
|
|
LRESULT SHChangeNotify_OnDeviceChange(ULONG_PTR code, struct _DEV_BROADCAST_HDR *pbh);
|
|
void SHChangeNotify_DesktopInit();
|
|
void SHChangeNotify_DesktopTerm();
|
|
STDAPI_(void) SHChangeNotifyRegisterAlias(LPCITEMIDLIST pidlReal, LPCITEMIDLIST pidlAlias);
|
|
|
|
void _Shell32ThreadAddRef(BOOL fLeaveSuspended);
|
|
void _Shell32ThreadRelease(UINT nClients);
|
|
void _Shell32ThreadAwake(void);
|
|
|
|
// Entry points for managing registering name to IDList translations.
|
|
void NPTRegisterNameToPidlTranslation(LPCTSTR pszPath, LPCITEMIDLIST pidl);
|
|
LPWSTR NPTMapNameToPidl(LPCWSTR pszPath, LPCITEMIDLIST *ppidl);
|
|
|
|
// path.c (private stuff) ---------------------
|
|
|
|
#define PQD_NOSTRIPDOTS 0x00000001
|
|
|
|
STDAPI_(void) PathQualifyDef(LPTSTR psz, LPCTSTR szDefDir, DWORD dwFlags);
|
|
|
|
STDAPI_(BOOL) PathIsRemovable(LPCTSTR pszPath);
|
|
STDAPI_(BOOL) PathIsRemote(LPCTSTR pszPath);
|
|
STDAPI_(BOOL) PathIsTemporary(LPCTSTR pszPath);
|
|
STDAPI_(BOOL) PathIsWild(LPCTSTR pszPath);
|
|
STDAPI_(BOOL) PathIsLnk(LPCTSTR pszFile);
|
|
STDAPI_(BOOL) PathIsSlow(LPCTSTR pszFile, DWORD dwFileAttr);
|
|
STDAPI_(BOOL) PathIsInvalid(LPCTSTR pPath);
|
|
STDAPI_(BOOL) PathIsBinaryExe(LPCTSTR szFile);
|
|
STDAPI_(BOOL) PathMergePathName(LPTSTR pPath, LPCTSTR pName);
|
|
STDAPI_(BOOL) PathGetMountPointFromPath(LPCTSTR pcszPath, LPTSTR pszMountPoint, int cchMountPoint);
|
|
STDAPI_(BOOL) PathIsShortcutToProgram(LPCTSTR pszFile);
|
|
|
|
#if (defined(UNICODE) && (defined(_MIPS_) || defined(_ALPHA_) || defined(_PPC_)))
|
|
|
|
#else
|
|
|
|
#define uaPathFindExtension PathFindExtension
|
|
|
|
#endif
|
|
|
|
void SpecialFolderIDTerminate();
|
|
void ReleaseRootFolders();
|
|
extern HINSTANCE g_hinst;
|
|
|
|
// get the desktop HWND if it is this process...
|
|
HWND GetInProcDesktop();
|
|
|
|
// Is Mirroring APIs enabled (BiDi Memphis and NT5 only)
|
|
extern BOOL g_bMirroredOS;
|
|
|
|
// Is DATE_LTRREADING supported by GetDateFormat() API? (it is supported in all the BiDi platforms.)
|
|
extern BOOL g_bBiDiPlatform;
|
|
|
|
// for control panel and printers folder:
|
|
extern TCHAR const c_szNull[];
|
|
extern TCHAR const c_szDotDot[];
|
|
extern TCHAR const c_szRunDll[];
|
|
extern TCHAR const c_szNewObject[];
|
|
|
|
|
|
// lang platform
|
|
extern UINT g_uCodePage;
|
|
|
|
|
|
// other stuff
|
|
#define HINST_THISDLL g_hinst
|
|
|
|
//
|
|
// Trace/dump/break flags specific to shell32.
|
|
// (Standard flags defined in shellp.h)
|
|
//
|
|
|
|
// Trace flags
|
|
#define TF_IMAGE 0x00000010 // Image/icon related stuff
|
|
#define TF_PROPERTY 0x00000020 // Property traces
|
|
#define TF_PATH 0x00000040 // Path whacking traces
|
|
#define TF_MENU 0x00000080 // Menu stuff
|
|
#define TF_ALLOC 0x00000100 // Allocation traces
|
|
#define TF_REG 0x00000200 // Registry traces
|
|
#define TF_DDE 0x00000400 // Shell progman DDE message tracing
|
|
#define TF_HASH 0x00000800 // Hash table stuff
|
|
#define TF_ASSOC 0x00001000 // File/URL Association traces
|
|
#define TF_FILETYPE 0x00002000 // File Type stuff
|
|
#define TF_SHELLEXEC 0x00004000 // ShellExecute stuff
|
|
#define TF_OLE 0x00008000 // OLE-specific stuff
|
|
#define TF_DEFVIEW 0x00010000 // Defview
|
|
#define TF_PERF 0x00020000 // Performance timings
|
|
#define TF_FSNOTIFY 0x00040000 // FSNotify stuff
|
|
#define TF_LIFE 0x00080000 // Object lifetime traces
|
|
#define TF_IDLIST 0x00100000 // "PIDLy" things
|
|
#define TF_FSTREE 0x00200000 // FSTree traces
|
|
#define TF_PRINTER 0x00400000 // Printer traces
|
|
//#define TF_QISTUB 0x00800000 // defined in unicpp\shellprv.h
|
|
#define TF_DOCFIND 0x01000000 // DocFind
|
|
#define TF_MENUBAND 0x02000000 // menubands
|
|
#define TF_CPANEL 0x10000000 // Control Panel
|
|
#define TF_CUSTOM1 0x40000000 // Custom messages #1
|
|
#define TF_CUSTOM2 0x80000000 // Custom messages #2
|
|
|
|
|
|
// "Olde names"
|
|
#define DM_ALLOC TF_ALLOC
|
|
#define DM_REG TF_REG
|
|
|
|
// Function trace flags
|
|
#define FTF_DEFVIEW 0x00000004 // DefView calls
|
|
#define FTF_DDE 0x00000008 // DDE functions
|
|
#define FTF_CPANEL 0x00000010 // Control Panel
|
|
|
|
// Dump flags
|
|
#define DF_INTSHCUT 0x00000001 // Internet shortcut structures
|
|
#define DF_HASH 0x00000002 // Hash table
|
|
#define DF_FSNPIDL 0x00000004 // Pidl for FSNotify
|
|
#define DF_URLPROP 0x00000008 // URL property structures
|
|
#define DF_DEBUGQI 0x00000010
|
|
#define DF_DEBUGQINOREF 0x00000020
|
|
#define DF_ICONCACHE 0x00000040 // Icon cache
|
|
#define DF_CLASSFLAGS 0x00000080 // File class cache
|
|
#define DF_DELAYLOADDLL 0x00000100 // Delay load
|
|
|
|
// Break flags
|
|
#define BF_ONLOADED 0x00000010 // Stop when loaded
|
|
#define BF_COCREATEINSTANCE 0x10000000 // On CoCreateInstance failure
|
|
|
|
// Debugging strings
|
|
#define GEN_DEBUGSTRW(str) ((str) ? (str) : L"<Null Str>")
|
|
#define GEN_DEBUGSTRA(str) ((str) ? (str) : "<Null Str>")
|
|
|
|
#ifdef UNICODE
|
|
#define GEN_DEBUGSTR GEN_DEBUGSTRW
|
|
#else // UNICODE
|
|
#define GEN_DEBUGSTR GEN_DEBUGSTRA
|
|
#endif // UNICODE
|
|
|
|
// Note: raymondc - ATOMICRELEASE isn't particularly atomic. There is a race
|
|
// condition if two people try to ATOMICRELEASE the same thing simultaneously.
|
|
|
|
// shorthand
|
|
#ifndef ATOMICRELEASE
|
|
#ifdef __cplusplus
|
|
#define ATOMICRELEASET(p, type) { if(p) { type* punkT=p; p=NULL; punkT->Release();} }
|
|
#else
|
|
#define ATOMICRELEASET(p, type) { if(p) { type* punkT=p; p=NULL; punkT->lpVtbl->Release(punkT);} }
|
|
#endif
|
|
|
|
// doing this as a function instead of inline seems to be a size win.
|
|
//
|
|
#ifdef NOATOMICRELESEFUNC
|
|
#define ATOMICRELEASE(p) ATOMICRELEASET(p, IUnknown)
|
|
#else
|
|
# ifdef __cplusplus
|
|
# define ATOMICRELEASE(p) IUnknown_SafeReleaseAndNullPtr(p)
|
|
# else
|
|
# define ATOMICRELEASE(p) IUnknown_AtomicRelease((void **)&p)
|
|
# endif
|
|
#endif
|
|
#endif //ATOMICRELEASE
|
|
|
|
#ifdef SAFERELEASE
|
|
#undef SAFERELEASE
|
|
#endif
|
|
#define SAFERELEASE(p) ATOMICRELEASE(p)
|
|
|
|
|
|
// fileicon.c
|
|
void FileIconTerm(void);
|
|
|
|
|
|
#define CCH_KEYMAX 64 // DOC: max size of a reg key (under shellex)
|
|
|
|
void ReplaceParams(LPTSTR szDst, LPCTSTR szFile);
|
|
|
|
|
|
#ifdef __IPropertyStorage_INTERFACE_DEFINED__
|
|
WINSHELLAPI HRESULT SHPropVariantClear(PROPVARIANT * ppropvar);
|
|
WINSHELLAPI HRESULT SHFreePropVariantArray(ULONG cel, PROPVARIANT * ppropvar);
|
|
WINSHELLAPI HRESULT SHPropVariantCopy(PROPVARIANT * ppropvar, const PROPVARIANT * ppropvarFrom);
|
|
#endif
|
|
|
|
|
|
//
|
|
// fsassoc.c
|
|
//
|
|
|
|
#define GCD_MUSTHAVEOPENCMD 0x0001
|
|
#define GCD_ADDEXETODISPNAME 0x0002 // must be used with GCD_MUSTHAVEOPENCMD
|
|
#define GCD_ALLOWPSUDEOCLASSES 0x0004 // .ext type extensions
|
|
|
|
// Only valid when used with FillListWithClasses
|
|
#define GCD_MUSTHAVEEXTASSOC 0x0008 // There must be at least one extension assoc
|
|
|
|
BOOL GetClassDescription(HKEY hkClasses, LPCTSTR pszClass, LPTSTR szDisplayName, int cbDisplayName, UINT uFlags);
|
|
|
|
//
|
|
// Registry key handles
|
|
//
|
|
extern HKEY g_hklmApprovedExt; // For approved shell extensions
|
|
|
|
// always zero, see init.c
|
|
extern const LARGE_INTEGER g_li0;
|
|
extern const ULARGE_INTEGER g_uli0;
|
|
|
|
|
|
// from fstree.cpp and drives.cpp
|
|
|
|
STDAPI SFVCB_OnAddPropertyPages(IN DWORD pv, IN SFVM_PROPPAGE_DATA * ppagedata);
|
|
|
|
//
|
|
// this used to be in shprst.c
|
|
//
|
|
|
|
#define MAX_FILE_PROP_PAGES 32
|
|
|
|
HKEY NetOpenProviderClass(HDROP);
|
|
void OpenNetResourceProperties(HWND, HDROP);
|
|
|
|
// msgbox.c
|
|
// Constructs strings like ShellMessagebox "xxx %1%s yyy %2%s..."
|
|
LPTSTR WINCAPI ShellConstructMessageString(HINSTANCE hAppInst, LPCTSTR lpcText, ...);
|
|
|
|
// Copy.c
|
|
#define SPEED_SLOW 400
|
|
DWORD GetPathSpeed(LPCTSTR pszPath);
|
|
|
|
|
|
// SharedFldr.cpp
|
|
STDAPI_(BOOL) SHShowSharedFolders();
|
|
|
|
|
|
// mulprsht.c
|
|
|
|
STDAPI_(BOOL) SHEncryptFile(LPCTSTR pszPath, BOOL fEncrypt);
|
|
// wuutil.c
|
|
void cdecl SetFolderStatusText(HWND hwndStatus, int iField, UINT ids,...);
|
|
|
|
#ifdef DEBUG
|
|
extern BOOL g_bInDllEntry;
|
|
|
|
#undef SendMessage
|
|
#define SendMessage SendMessageD
|
|
LRESULT WINAPI SendMessageD(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
|
|
|
|
//
|
|
// The DEBUG build validates that every class we register is in the
|
|
// unregister list so we don't leak classes at unload.
|
|
//
|
|
#undef RegisterClass
|
|
#undef RegisterClassEx
|
|
#define RegisterClass RegisterClassD
|
|
#define RegisterClassEx RegisterClassExD
|
|
ATOM WINAPI RegisterClassD(CONST WNDCLASS *lpWndClass);
|
|
ATOM WINAPI RegisterClassExD(CONST WNDCLASSEX *lpWndClass);
|
|
#endif // DEBUG
|
|
|
|
#ifdef UNICODE
|
|
#define RealRegisterClass RegisterClassW
|
|
#define RealRegisterClassEx RegisterClassExW
|
|
#else
|
|
#define RealRegisterClass RegisterClassA
|
|
#define RealRegisterClassEx RegisterClassExA
|
|
#endif
|
|
|
|
//
|
|
// In DEBUG, send FindWindow through a wrapper that ensures that the
|
|
// critical section is not taken. FindWindow sends interthreadmessages,
|
|
// which is not obvious.
|
|
//
|
|
#ifdef DEBUG
|
|
#undef FindWindow
|
|
#undef FindWindowEx
|
|
#define FindWindow FindWindowD
|
|
#define FindWindowEx FindWindowExD
|
|
|
|
STDAPI_(HWND) FindWindowD (LPCTSTR lpClassName, LPCTSTR lpWindowName);
|
|
STDAPI_(HWND) FindWindowExD(HWND hwndParent, HWND hwndChildAfter, LPCTSTR lpClassName, LPCTSTR lpWindowName);
|
|
#ifdef UNICODE
|
|
#define RealFindWindowEx FindWindowExW
|
|
#else
|
|
#define RealFindWindowEx FindWindowExA
|
|
#endif // UNICODE
|
|
#endif // DEBUG
|
|
|
|
// our wrapper for GetCompressedFileSize, which is NT only
|
|
STDAPI_(DWORD) SHGetCompressedFileSizeW(LPCWSTR pszFileName, LPDWORD pFileSizeHigh);
|
|
|
|
#undef GetCompressedFileSize
|
|
#define GetCompressedFileSize SHGetCompressedFileSize
|
|
|
|
#ifdef UNICODE
|
|
#define SHGetCompressedFileSize SHGetCompressedFileSizeW
|
|
#else
|
|
#define SHGetCompressedFileSize #error // not implemented, because its an nt only API
|
|
#endif // UNICODE
|
|
|
|
#define ASSERTDLLENTRY ASSERT(g_bInDllEntry);
|
|
|
|
//
|
|
// STATIC macro
|
|
//
|
|
#ifndef STATIC
|
|
#ifdef DEBUG
|
|
#define STATIC
|
|
#else
|
|
#define STATIC static
|
|
#endif
|
|
#endif
|
|
|
|
//
|
|
// Debug helper functions
|
|
//
|
|
|
|
|
|
//
|
|
// Validation functions
|
|
//
|
|
|
|
BOOL IsValidPSHELLEXECUTEINFO(LPSHELLEXECUTEINFO pei);
|
|
|
|
|
|
#define FillExecInfo(_info, _hwnd, _verb, _file, _params, _dir, _show) \
|
|
(_info).hwnd = _hwnd; \
|
|
(_info).lpVerb = _verb; \
|
|
(_info).lpFile = _file; \
|
|
(_info).lpParameters = _params; \
|
|
(_info).lpDirectory = _dir; \
|
|
(_info).nShow = _show; \
|
|
(_info).fMask = 0; \
|
|
(_info).cbSize = SIZEOF(SHELLEXECUTEINFO);
|
|
|
|
#ifdef DEBUG
|
|
#if 1
|
|
__inline DWORD clockrate() {LARGE_INTEGER li; QueryPerformanceFrequency(&li); return li.LowPart;}
|
|
__inline DWORD clock() {LARGE_INTEGER li; QueryPerformanceCounter(&li); return li.LowPart;}
|
|
#else
|
|
__inline DWORD clockrate() {return 1000;}
|
|
__inline DWORD clock() {return GetTickCount();}
|
|
#endif
|
|
|
|
#define TIMEVAR(t) DWORD t ## T; DWORD t ## N
|
|
#define TIMEIN(t) t ## T = 0, t ## N = 0
|
|
#define TIMESTART(t) t ## T -= clock(), t ## N ++
|
|
#define TIMESTOP(t) t ## T += clock()
|
|
#define TIMEFMT(t) ((DWORD)(t) / clockrate()), (((DWORD)(t) * 1000 / clockrate())%1000)
|
|
#define TIMEOUT(t) if (t ## N) TraceMsg(TF_PERF, #t ": %ld calls, %ld.%03ld sec (%ld.%03ld)", t ## N, TIMEFMT(t ## T), TIMEFMT(t ## T / t ## N))
|
|
#else
|
|
#define TIMEVAR(t)
|
|
#define TIMEIN(t)
|
|
#define TIMESTART(t)
|
|
#define TIMESTOP(t)
|
|
#define TIMEFMT(t)
|
|
#define TIMEOUT(t)
|
|
#endif
|
|
|
|
// in extract.c
|
|
STDAPI_(DWORD) GetExeType(LPCTSTR pszFile);
|
|
STDAPI_(UINT) ExtractIcons(LPCTSTR szFileName, int nIconIndex, int cxIcon, int cyIcon, HICON *phicon, UINT *piconid, UINT nIcons, UINT flags);
|
|
|
|
/*
|
|
in pickicon.c
|
|
Return Values for PickIconDlgWithTitle()
|
|
|
|
User Operation Return Values
|
|
Cancel -> HRESULT_FROM_WIN32(ERROR_CANCELLED)
|
|
Ok -> S_OK
|
|
RestoreDefault -> S_FALSE
|
|
*/
|
|
STDAPI PickIconDlgWithTitle(HWND hwnd, LPCTSTR pszTitle, BOOL bShowRestoreButton, LPTSTR pszIconPath, UINT cbIconPath, int *piIconIndex);
|
|
|
|
|
|
// defxicon.c
|
|
|
|
STDAPI SHCreateDefExtIconKey(HKEY hkey, LPCTSTR pszModule, int iIcon, int iIconOpen, int iDefIcon, int iShortcutIcon, UINT uFlags, REFIID riid, void **pxiconOut);
|
|
STDAPI SHCreateDefExtIcon(LPCTSTR pszModule, int iIcon, int iIconOpen, UINT uFlags, int iDefIcon, REFIID riid, void **pxiconOut);
|
|
|
|
|
|
STDAPI_(UINT) SHSysErrorMessageBox(HWND hwnd, LPCTSTR pszTitle, UINT idTemplate, DWORD err, LPCTSTR pszParam, UINT dwFlags);
|
|
|
|
//======Hash Item=============================================================
|
|
typedef struct _HashTable **HHASHTABLE;
|
|
#define PHASHITEM LPCTSTR
|
|
|
|
typedef void (CALLBACK *HASHITEMCALLBACK)(HHASHTABLE hht, LPCTSTR sz, UINT wUsage, DWORD_PTR param);
|
|
|
|
STDAPI_(LPCTSTR) FindHashItem (HHASHTABLE hht, LPCTSTR lpszStr);
|
|
STDAPI_(LPCTSTR) AddHashItem (HHASHTABLE hht, LPCTSTR lpszStr);
|
|
STDAPI_(LPCTSTR) DeleteHashItem(HHASHTABLE hht, LPCTSTR lpszStr);
|
|
STDAPI_(LPCTSTR) PurgeHashItem (HHASHTABLE hht, LPCTSTR lpszStr);
|
|
|
|
#define GetHashItemName(pht, sz, lpsz, cch) StringCchCopy(lpsz, cch, sz)
|
|
|
|
HHASHTABLE WINAPI CreateHashItemTable(UINT wBuckets, UINT wExtra);
|
|
void WINAPI DestroyHashItemTable(HHASHTABLE hht);
|
|
|
|
void WINAPI SetHashItemData(HHASHTABLE hht, LPCTSTR lpszStr, int n, DWORD_PTR dwData);
|
|
DWORD_PTR WINAPI GetHashItemData(HHASHTABLE hht, LPCTSTR lpszStr, int n);
|
|
void * WINAPI GetHashItemDataPtr(HHASHTABLE hht, LPCTSTR lpszStr);
|
|
|
|
void WINAPI EnumHashItems(HHASHTABLE hht, HASHITEMCALLBACK callback, DWORD_PTR dwParam);
|
|
|
|
#ifdef DEBUG
|
|
void WINAPI DumpHashItemTable(HHASHTABLE hht);
|
|
#endif
|
|
|
|
|
|
//======== Text thunking stuff ===========================================================
|
|
typedef struct _THUNK_TEXT_
|
|
{
|
|
LPTSTR m_pStr[1];
|
|
} ThunkText;
|
|
|
|
#ifdef UNICODE
|
|
typedef CHAR XCHAR;
|
|
typedef LPSTR LPXSTR;
|
|
typedef const XCHAR * LPCXSTR;
|
|
#define lstrlenX(r) lstrlenA(r)
|
|
#else // unicode
|
|
typedef WCHAR XCHAR;
|
|
typedef LPWSTR LPXSTR;
|
|
typedef const XCHAR * LPCXSTR;
|
|
#define lstrlenX(r) lstrlenW(r)
|
|
#endif // unicode
|
|
|
|
ThunkText * ConvertStrings(UINT cCount, ...);
|
|
|
|
#include "uastrfnc.h"
|
|
#ifdef __cplusplus
|
|
} /* End of extern "C" { */
|
|
#endif /* __cplusplus */
|
|
|
|
#include <help.h>
|
|
|
|
|
|
//======== Discriminate inclusion ========================================
|
|
|
|
#ifndef NO_INCLUDE_UNION // define this to avoid including all
|
|
// of the extra files that were not
|
|
// previously included in shellprv.h
|
|
#include <wchar.h>
|
|
#include <tchar.h>
|
|
|
|
#include <process.h>
|
|
#include <wowshlp.h>
|
|
#include <vdmapi.h>
|
|
#include "shell.h"
|
|
#include "dde.h"
|
|
#include <regstr.h>
|
|
#include "findhlp.h"
|
|
#include <dlgs.h>
|
|
#include <msprintx.h>
|
|
#include <pif.h>
|
|
#include <windisk.h>
|
|
#include <brfcasep.h>
|
|
#include <trayp.h>
|
|
#include <brfcasep.h>
|
|
#include <wutilsp.h>
|
|
#include "bitbuck.h"
|
|
#include "drawpie.h"
|
|
#include "fileop.h"
|
|
#include "pidl.h"
|
|
#include "ids.h"
|
|
#include <newexe.h>
|
|
#include "ole2dup.h"
|
|
#include "os.h"
|
|
#include "privshl.h"
|
|
#include "reglist.h"
|
|
#include "shell32p.h"
|
|
#include "shitemid.h"
|
|
#include "undo.h"
|
|
#include "views.h"
|
|
|
|
// NT shell uses 32-bit version of this pifmgr code.
|
|
#ifndef NO_PIF_HDRS
|
|
#include "pifmgrp.h"
|
|
#include "piffntp.h"
|
|
#include "pifinfp.h"
|
|
#include "doshelp.h"
|
|
#include "machinep.h" // Japanese domestic machine (NEC) support
|
|
#endif
|
|
|
|
#endif // NO_INCLUDE_UNION
|
|
|
|
#include "shdguid.h"
|
|
|
|
#define SetWindowBits SHSetWindowBits
|
|
#define IsSameObject SHIsSameObject
|
|
#define IsChildOrSelf SHIsChildOrSelf
|
|
#define MenuIndexFromID SHMenuIndexFromID
|
|
#define _GetMenuFromID SHGetMenuFromID
|
|
#define GetCurColorRes SHGetCurColorRes
|
|
#define WaitForSendMessageThread SHWaitForSendMessageThread
|
|
|
|
#define MAX_URL_STRING INTERNET_MAX_URL_LENGTH
|
|
|
|
// Stack allocated BSTR (to avoid calling SysAllocString)
|
|
typedef struct _SA_BSTR {
|
|
ULONG cb;
|
|
WCHAR wsz[MAX_URL_STRING];
|
|
} SA_BSTR;
|
|
|
|
// A "fake" variants for use on the stack - usable for [in] parameters only!!!
|
|
typedef struct _SA_BSTRGUID {
|
|
UINT cb;
|
|
WCHAR wsz[39];
|
|
} SA_BSTRGUID;
|
|
#define InitFakeBSTR(pSA_BSTR, guid) SHStringFromGUIDW((guid), (pSA_BSTR)->wsz, ARRAYSIZE((pSA_BSTR)->wsz)), (pSA_BSTR)->cb = (38*sizeof(WCHAR))
|
|
|
|
//
|
|
// The cb field of a BSTR is the count of bytes, not including the
|
|
// terminating L('\0').
|
|
//
|
|
//
|
|
// DECLARE_CONST_BSTR - Goes into header file (if any)
|
|
// DEFINE_CONST_BSTR - Creates the variable, must already be declared
|
|
// MAKE_CONST_BSTR - Combines DECLARE and DEFINE
|
|
//
|
|
#define DECLARE_CONST_BSTR(name, str) \
|
|
extern const struct BSTR##name { ULONG cb; WCHAR wsz[sizeof(str)/sizeof(WCHAR)]; } name
|
|
|
|
#define DEFINE_CONST_BSTR(name, str) \
|
|
const struct BSTR##name name = { sizeof(str) - sizeof(WCHAR), str }
|
|
|
|
#define MAKE_CONST_BSTR(name, str) \
|
|
const struct BSTR##name { ULONG cb; WCHAR wsz[sizeof(str)/sizeof(WCHAR)]; } \
|
|
name = { sizeof(str) - sizeof(WCHAR), str }
|
|
|
|
DECLARE_CONST_BSTR(s_sstrIDMember, L"id");
|
|
DECLARE_CONST_BSTR(s_sstrSubSRCMember, L"subscribed_url");
|
|
DECLARE_CONST_BSTR(s_sstrSRCMember, L"src");
|
|
|
|
//======== Header file hacks =============================================================
|
|
|
|
//
|
|
// The compiler will tell us if we are defining these NT5-only parameters
|
|
// incorrectly. If you get "invalid redefinition" errors, it means that
|
|
// the definition in windows.h changed and we need to change to match.
|
|
//
|
|
|
|
#define ASFW_ANY ((DWORD)-1)
|
|
|
|
#define CMIDM_LINK 0x0001
|
|
#define CMIDM_COPY 0x0002
|
|
#define CMIDM_MOVE 0x0003
|
|
|
|
// Downlevel shutdown dialog function
|
|
DWORD DownlevelShellShutdownDialog(HWND hwndParent, DWORD dwItems, LPCTSTR szUsername);
|
|
|
|
// from shell32\unicode\format.c
|
|
STDAPI_(DWORD) SHChkDskDriveEx(HWND hwnd, LPWSTR pszDrive);
|
|
|
|
//
|
|
// On NT, sometimes CreateDirectory succeeds in creating the directory, but, you can not do
|
|
// anything with it that directory. This happens if the directory name being created does
|
|
// not have room for an 8.3 name to be tagged onto the end of it,
|
|
// i.e., lstrlen(new_directory_name)+12 must be less or equal to MAX_PATH.
|
|
//
|
|
// the magic # "12" is 8 + 1 + 3 for and 8.3 name.
|
|
//
|
|
// The following macro is used in places where we need to detect this to make
|
|
// MoveFile to be consistent with CreateDir(files os.c and copy.c use this)
|
|
//
|
|
|
|
#define IsDirPathTooLongForCreateDir(pszDir) ((lstrlen(pszDir) + 12) > MAX_PATH)
|
|
|
|
// call the shlwapi version of this, note we have an export from shell32 that forwards to this
|
|
#define ShellMessageBoxW ShellMessageBoxWrapW
|
|
|
|
#define REGSTR_EXPLORER_ADVANCED (REGSTR_PATH_EXPLORER TEXT("\\Advanced"))
|
|
|
|
#define RECTHEIGHT(rc) ((rc).bottom - (rc).top)
|
|
#define RECTWIDTH(rc) ((rc).right - (rc).left)
|
|
|
|
STDAPI_(BOOL) IsGuimodeSetupRunning();
|
|
|
|
#endif // _SHELLPRV_H_
|