Reactos
1/*
2 * PROJECT: ReactOS SDK
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: shlwapi header
5 * COPYRIGHT: Copyright 2025 Carl Bialorucki (carl.bialorucki@reactos.org)
6 */
7
8#ifndef _INC_SHLWAPI
9#define _INC_SHLWAPI
10#ifndef NOSHLWAPI
11
12#include <specstrings.h>
13#include <objbase.h>
14#include <shtypes.h>
15#include <pshpack8.h>
16
17#ifndef WINSHLWAPI
18#ifdef __GNUC__
19/* FIXME: HACK: CORE-6504 */
20#define LWSTDAPI_(t) t WINAPI
21#define LWSTDAPIV_(t) t WINAPIV
22#else
23#ifndef _SHLWAPI_
24#define LWSTDAPI_(t) EXTERN_C DECLSPEC_IMPORT t STDAPICALLTYPE
25#define LWSTDAPIV_(t) EXTERN_C DECLSPEC_IMPORT t STDAPIVCALLTYPE
26#else
27#define LWSTDAPI_(t) STDAPI_(t)
28#define LWSTDAPIV_(t) STDAPIV_(t)
29#endif // _SHLWAPI_
30#endif // __GNUC__
31#define LWSTDAPI LWSTDAPI_(HRESULT)
32#define LWSTDAPIV LWSTDAPIV_(HRESULT)
33#endif // WINSHLWAPI
34
35#ifdef __cplusplus
36extern "C" {
37#endif
38
39/*
40 * GLOBAL SHLWAPI DEFINITIONS
41 * These definitions are always available.
42 */
43
44/* SHAutoComplete definitions */
45#define SHACF_DEFAULT 0x00000000
46#define SHACF_FILESYSTEM 0x00000001
47#define SHACF_URLHISTORY 0x00000002
48#define SHACF_URLMRU 0x00000004
49#define SHACF_URLALL (SHACF_URLHISTORY|SHACF_URLMRU)
50#define SHACF_USETAB 0x00000008
51#define SHACF_FILESYS_ONLY 0x00000010
52#if (_WIN32_IE >= _WIN32_IE_IE60)
53#define SHACF_FILESYS_DIRS 0x00000020
54#endif // _WIN32_IE_IE60
55#if (_WIN32_IE >= _WIN32_IE_IE70)
56#define SHACF_VIRTUAL_NAMESPACE 0x00000040
57#endif // _WIN32_IE_IE70
58#define SHACF_AUTOSUGGEST_FORCE_ON 0x10000000
59#define SHACF_AUTOSUGGEST_FORCE_OFF 0x20000000
60#define SHACF_AUTOAPPEND_FORCE_ON 0x40000000
61#define SHACF_AUTOAPPEND_FORCE_OFF 0x80000000
62
63LWSTDAPI SHAutoComplete(_In_ HWND, DWORD);
64LWSTDAPI SHGetThreadRef(_Outptr_ IUnknown**);
65LWSTDAPI SHSetThreadRef(_In_opt_ IUnknown*);
66LWSTDAPI_(BOOL) SHCreateThread(_In_ LPTHREAD_START_ROUTINE pfnThreadProc, _In_opt_ void* pData, _In_ DWORD flags, _In_opt_ LPTHREAD_START_ROUTINE pfnCallback);
67LWSTDAPI_(BOOL) SHSkipJunction(_In_opt_ struct IBindCtx*, _In_ const CLSID*);
68
69/* SHCreateThread definitions */
70enum {
71 CTF_INSIST = 0x0001,
72 CTF_THREAD_REF = 0x0002,
73 CTF_PROCESS_REF = 0x0004,
74 CTF_COINIT_STA = 0x0008,
75 CTF_COINIT = 0x0008,
76#if (_WIN32_IE >= _WIN32_IE_IE60)
77 CTF_FREELIBANDEXIT = 0x0010,
78 CTF_REF_COUNTED = 0x0020,
79 CTF_WAIT_ALLOWCOM = 0x0040,
80#endif // _WIN32_IE_IE60
81#if (_WIN32_IE >= _WIN32_IE_IE70)
82 CTF_UNUSED = 0x0080,
83 CTF_INHERITWOW64 = 0x0100,
84#endif // _WIN32_IE_IE70
85#if (NTDDI_VERSION >= NTDDI_VISTA)
86 CTF_WAIT_NO_REENTRANCY = 0x0200,
87#endif // NTDDI_VERSION >= NTDDI_VISTA
88#if (NTDDI_VERSION >= NTDDI_WIN7)
89 CTF_KEYBOARD_LOCALE = 0x0400,
90 CTF_OLEINITIALIZE = 0x0800,
91 CTF_COINIT_MTA = 0x1000,
92 CTF_NOADDREFLIB = 0x2000,
93#endif // NTDDI_VERSION >= NTDDI_WIN7
94};
95
96/* SHFormatDateTime definitions */
97#define FDTF_SHORTTIME 0x00000001
98#define FDTF_SHORTDATE 0x00000002
99#define FDTF_DEFAULT (FDTF_SHORTDATE | FDTF_SHORTTIME)
100#define FDTF_LONGDATE 0x00000004
101#define FDTF_LONGTIME 0x00000008
102#define FDTF_RELATIVE 0x00000010
103#define FDTF_LTRDATE 0x00000100
104#define FDTF_RTLDATE 0x00000200
105#define FDTF_NOAUTOREADINGORDER 0x00000400
106
107/* DLL version definitions */
108#define DLLVER_MAJOR_MASK 0xFFFF000000000000
109#define DLLVER_MINOR_MASK 0x0000FFFF00000000
110#define DLLVER_BUILD_MASK 0x00000000FFFF0000
111#define DLLVER_QFE_MASK 0x000000000000FFFF
112
113#define MAKEDLLVERULL(major, minor, build, qfe) \
114 (((ULONGLONG)(major) << 48) | ((ULONGLONG)(minor) << 32) | ((ULONGLONG)(build) << 16) | (ULONGLONG)(qfe))
115
116#define DLLVER_PLATFORM_WINDOWS 0x01 // Windows 9.x
117#define DLLVER_PLATFORM_NT 0x02 // Windows NT
118
119typedef struct _DllVersionInfo {
120 DWORD cbSize;
121 DWORD dwMajorVersion;
122 DWORD dwMinorVersion;
123 DWORD dwBuildNumber;
124 DWORD dwPlatformID;
125} DLLVERSIONINFO;
126
127typedef HRESULT (CALLBACK *DLLGETVERSIONPROC)(DLLVERSIONINFO *);
128
129typedef struct _DLLVERSIONINFO2 {
130 DLLVERSIONINFO info1;
131 DWORD dwFlags;
132 ULONGLONG ullVersion;
133} DLLVERSIONINFO2;
134
135STDAPI DllInstall(BOOL, _In_opt_ LPCWSTR) DECLSPEC_HIDDEN;
136
137/* QueryInterface definitions */
138typedef struct
139{
140 const IID *piid;
141#if defined(__REACTOS__) || (WINVER >= _WIN32_WINNT_WIN10)
142 DWORD dwOffset;
143#else
144 int dwOffset;
145#endif
146} QITAB, *LPQITAB;
147
148#define OFFSETOFCLASS(base, derived) \
149 ((DWORD)(DWORD_PTR)(static_cast<base*>((derived*)8))-8)
150
151#define QITABENTMULTI(Cthis, Ifoo, Iimpl) { &IID_##Ifoo, OFFSETOFCLASS(Iimpl, Cthis) }
152#define QITABENT(Cthis, Ifoo) QITABENTMULTI(Cthis, Ifoo, Ifoo)
153STDAPI QISearch(_Inout_ void* base, _In_ const QITAB *pqit, _In_ REFIID riid, _Outptr_ void **ppv);
154
155/* Miscellaneous shell functions */
156LWSTDAPI_(int) GetMenuPosFromID(_In_ HMENU hMenu, _In_ UINT uID);
157LWSTDAPI_(void) IUnknown_AtomicRelease(_Inout_opt_ IUnknown **punk);
158LWSTDAPI_(void) IUnknown_Set(_Inout_ IUnknown **ppunk, _In_opt_ IUnknown *punk);
159LWSTDAPI IUnknown_GetWindow(_In_ IUnknown *punk, _Out_ HWND *phwnd);
160LWSTDAPI IUnknown_SetSite(_In_ IUnknown *punk, _In_opt_ IUnknown *punkSite);
161LWSTDAPI IUnknown_GetSite(_In_ IUnknown *punk, _In_ REFIID riid, _Outptr_ void **ppv);
162LWSTDAPI IUnknown_QueryService(_In_opt_ IUnknown *punk, _In_ REFGUID guidService, _In_ REFIID riid, _Outptr_ void **ppvOut);
163LWSTDAPI IStream_Size(_In_ IStream *pstm, _Out_ ULARGE_INTEGER *pui);
164
165/* Version gated definitions */
166#if (_WIN32_IE >= _WIN32_IE_IE60)
167#define SHGVSPB_PERUSER 0x00000001
168#define SHGVSPB_ALLUSERS 0x00000002
169#define SHGVSPB_PERFOLDER 0x00000004
170#define SHGVSPB_ALLFOLDERS 0x00000008
171#define SHGVSPB_INHERIT 0x00000010
172#define SHGVSPB_ROAM 0x00000020
173#define SHGVSPB_NOAUTODEFAULTS 0x80000000
174#define SHGVSPB_FOLDER (SHGVSPB_PERUSER | SHGVSPB_PERFOLDER)
175#define SHGVSPB_FOLDERNODEFAULTS (SHGVSPB_PERUSER | SHGVSPB_PERFOLDER | SHGVSPB_NOAUTODEFAULTS)
176#define SHGVSPB_USERDEFAULTS (SHGVSPB_PERUSER | SHGVSPB_ALLFOLDERS)
177#define SHGVSPB_GLOBALDEFAULTS (SHGVSPB_ALLUSERS | SHGVSPB_ALLFOLDERS)
178
179LWSTDAPI SHGetViewStatePropertyBag(_In_opt_ PCIDLIST_ABSOLUTE pidl, _In_opt_ LPCWSTR bag_name, _In_ DWORD flags, _In_ REFIID riid, _Outptr_ void **ppv);
180LWSTDAPI SHReleaseThreadRef(void);
181#endif // (_WIN32_IE >= _WIN32_IE_IE60)
182
183#if (_WIN32_IE >= 0x0602)
184LWSTDAPI_(BOOL) IsInternetESCEnabled(void);
185#endif // (_WIN32_IE >= 0x0602)
186
187/* According to Geoff Chappell, SHAllocShared, SHFreeShared, SHLockShared, and SHUnlockShared
188 * were available in shlwapi.dll starting with IE40. However, Microsoft didn't expose them
189 * in their public shlwapi header until IE60SP2.
190 */
191#if (_WIN32_IE >= _WIN32_IE_IE60SP2)
192LWSTDAPI_(HANDLE) SHAllocShared(_In_opt_ const void *pvData, _In_ DWORD dwSize, _In_ DWORD dwDestinationProcessId);
193LWSTDAPI_(BOOL) SHFreeShared(_In_ HANDLE hData, _In_ DWORD dwProcessId);
194LWSTDAPI_(PVOID) SHLockShared(_In_ HANDLE hData, _In_ DWORD dwProcessId);
195LWSTDAPI_(BOOL) SHUnlockShared(_In_ void *pvData);
196LWSTDAPI SHCreateThreadRef(_Inout_ LONG*, _Outptr_ IUnknown**);
197#endif // _WIN32_IE >= _WIN32_IE_IE60SP2
198
199/*
200 * OPTIONAL SHLWAPI DEFINITIONS
201 * These definitions can be turned on or off depending on what constants are defined.
202 *
203 * | Constant | Effect |
204 * |--------------------|-----------------------------|
205 * | NO_SHLWAPI_GDI | Disables GDI functions |
206 * | NO_SHLWAPI_ISOS | Disables IsOS function |
207 * | NO_SHLWAPI_PATH | Disables path functions |
208 * | NO_SHLWAPI_REG | Disables registry functions |
209 * | NO_SHLWAPI_STREAM | Disables stream functions |
210 * | NO_SHLWAPI_STRFCNS | Disables string functions |
211 */
212
213/* GDI functions */
214#ifndef NO_SHLWAPI_GDI
215
216LWSTDAPI_(COLORREF) ColorAdjustLuma(COLORREF,int,BOOL);
217LWSTDAPI_(COLORREF) ColorHLSToRGB(WORD,WORD,WORD);
218LWSTDAPI_(void) ColorRGBToHLS(COLORREF, _Out_ LPWORD, _Out_ LPWORD, _Out_ LPWORD);
219LWSTDAPI_(HPALETTE) SHCreateShellPalette(_In_opt_ HDC);
220
221#endif // NO_SHLWAPI_GDI
222
223/* IsOS function */
224#ifndef NO_SHLWAPI_ISOS
225
226#define OS_WINDOWS 0
227#define OS_NT 1
228#define OS_WIN95ORGREATER 2
229#define OS_NT4ORGREATER 3
230/* 4 is omitted on purpose */
231#define OS_WIN98ORGREATER 5
232#define OS_WIN98_GOLD 6
233#define OS_WIN2000ORGREATER 7
234#define OS_WIN2000PRO 8
235#define OS_WIN2000SERVER 9
236#define OS_WIN2000ADVSERVER 10
237#define OS_WIN2000DATACENTER 11
238#define OS_WIN2000TERMINAL 12
239#define OS_EMBEDDED 13
240#define OS_TERMINALCLIENT 14
241#define OS_TERMINALREMOTEADMIN 15
242#define OS_WIN95_GOLD 16
243#define OS_MEORGREATER 17
244#define OS_XPORGREATER 18
245#define OS_HOME 19
246#define OS_PROFESSIONAL 20
247#define OS_DATACENTER 21
248#define OS_ADVSERVER 22
249#define OS_SERVER 23
250#define OS_TERMINALSERVER 24
251#define OS_PERSONALTERMINALSERVER 25
252#define OS_FASTUSERSWITCHING 26
253#define OS_WELCOMELOGONUI 27
254#define OS_DOMAINMEMBER 28
255#define OS_ANYSERVER 29
256#define OS_WOW6432 30
257#define OS_WEBSERVER 31
258#define OS_SMALLBUSINESSSERVER 32
259#define OS_TABLETPC 33
260#define OS_SERVERADMINUI 34
261#define OS_MEDIACENTER 35
262#define OS_APPLIANCE 36
263
264LWSTDAPI_(BOOL) IsOS(DWORD dwOS);
265
266#endif // NO_SHLWAPI_ISOS
267
268/* Path functions */
269#ifndef NO_SHLWAPI_PATH
270
271#define GCT_INVALID 0x0
272#define GCT_LFNCHAR 0x1
273#define GCT_SHORTCHAR 0x2
274#define GCT_WILD 0x4
275#define GCT_SEPARATOR 0x8
276
277LWSTDAPI HashData(_In_reads_bytes_(cbData) const unsigned char *, DWORD cbData, _Out_writes_bytes_(cbHash) unsigned char *lpDest, DWORD cbHash);
278#if (_WIN32_IE >= _WIN32_IE_IE70)
279LWSTDAPI PathCreateFromUrlAlloc(_In_ LPCWSTR pszUrl, _Outptr_ LPWSTR* pszPath, DWORD dwReserved);
280#endif // _WIN32_IE_IE70
281
282LWSTDAPI_(LPSTR) PathAddBackslashA(_Inout_updates_(MAX_PATH) LPSTR);
283LWSTDAPI_(LPWSTR) PathAddBackslashW(_Inout_updates_(MAX_PATH) LPWSTR);
284LWSTDAPI_(BOOL) PathAddExtensionA(_Inout_updates_(MAX_PATH) LPSTR, _In_opt_ LPCSTR);
285LWSTDAPI_(BOOL) PathAddExtensionW(_Inout_updates_(MAX_PATH) LPWSTR,_In_opt_ LPCWSTR);
286LWSTDAPI_(BOOL) PathAppendA(_Inout_updates_(MAX_PATH) LPSTR, _In_ LPCSTR);
287LWSTDAPI_(BOOL) PathAppendW(_Inout_updates_(MAX_PATH) LPWSTR, _In_ LPCWSTR);
288LWSTDAPI_(LPSTR) PathBuildRootA(_Out_writes_(4) LPSTR, int);
289LWSTDAPI_(LPWSTR) PathBuildRootW(_Out_writes_(4) LPWSTR, int);
290LWSTDAPI_(BOOL) PathCanonicalizeA(_Out_writes_(MAX_PATH) LPSTR, _In_ LPCSTR);
291LWSTDAPI_(BOOL) PathCanonicalizeW(_Out_writes_(MAX_PATH) LPWSTR, _In_ LPCWSTR);
292LWSTDAPI_(LPSTR) PathCombineA(_Out_writes_(MAX_PATH) LPSTR, _In_opt_ LPCSTR, _In_opt_ LPCSTR);
293LWSTDAPI_(LPWSTR) PathCombineW(_Out_writes_(MAX_PATH) LPWSTR, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR);
294LWSTDAPI_(BOOL) PathCompactPathA(_In_opt_ HDC, _Inout_updates_(MAX_PATH) LPSTR, _In_ UINT);
295LWSTDAPI_(BOOL) PathCompactPathW(_In_opt_ HDC, _Inout_updates_(MAX_PATH) LPWSTR, _In_ UINT);
296LWSTDAPI_(BOOL) PathCompactPathExA(_Out_writes_(cchMax) LPSTR, _In_ LPCSTR, _In_ UINT cchMax, _In_ DWORD);
297LWSTDAPI_(BOOL) PathCompactPathExW(_Out_writes_(cchMax) LPWSTR, _In_ LPCWSTR, _In_ UINT cchMax, _In_ DWORD);
298LWSTDAPI_(int) PathCommonPrefixA(_In_ LPCSTR, _In_ LPCSTR, _Out_writes_opt_(MAX_PATH) LPSTR);
299LWSTDAPI_(int) PathCommonPrefixW(_In_ LPCWSTR, _In_ LPCWSTR, _Out_writes_opt_(MAX_PATH) LPWSTR);
300LWSTDAPI PathCreateFromUrlA(_In_ LPCSTR, _Out_writes_to_(*pcchPath, *pcchPath) LPSTR, _Inout_ LPDWORD pcchPath, DWORD);
301LWSTDAPI PathCreateFromUrlW(_In_ LPCWSTR pszUrl, _Out_writes_to_(*pcchPath, *pcchPath) LPWSTR pszPath, _Inout_ LPDWORD pcchPath, DWORD dwFlags);
302LWSTDAPI_(BOOL) PathFileExistsA(_In_ LPCSTR pszPath);
303LWSTDAPI_(BOOL) PathFileExistsW(_In_ LPCWSTR pszPath);
304LWSTDAPI_(LPSTR) PathFindExtensionA(_In_ LPCSTR pszPath);
305LWSTDAPI_(LPWSTR) PathFindExtensionW(_In_ LPCWSTR pszPath);
306LWSTDAPI_(LPSTR) PathFindFileNameA(_In_ LPCSTR pszPath);
307LWSTDAPI_(LPWSTR) PathFindFileNameW(_In_ LPCWSTR pszPath);
308LWSTDAPI_(LPSTR) PathFindNextComponentA(_In_ LPCSTR);
309LWSTDAPI_(LPWSTR) PathFindNextComponentW(_In_ LPCWSTR);
310LWSTDAPI_(BOOL) PathFindOnPathA(_Inout_updates_(MAX_PATH) LPSTR, _In_opt_ LPCSTR*);
311LWSTDAPI_(BOOL) PathFindOnPathW(_Inout_updates_(MAX_PATH) LPWSTR, _In_opt_ LPCWSTR*);
312LWSTDAPI_(LPCSTR) PathFindSuffixArrayA(_In_ LPCSTR, _In_reads_(iArraySize) LPCSTR *, int iArraySize);
313LWSTDAPI_(LPCWSTR) PathFindSuffixArrayW(_In_ LPCWSTR, _In_reads_(iArraySize) LPCWSTR *, int iArraySize);
314LWSTDAPI_(LPSTR) PathGetArgsA(_In_ LPCSTR pszPath);
315LWSTDAPI_(LPWSTR) PathGetArgsW(_In_ LPCWSTR pszPath);
316LWSTDAPI_(UINT) PathGetCharTypeA(_In_ UCHAR ch);
317LWSTDAPI_(UINT) PathGetCharTypeW(_In_ WCHAR ch);
318LWSTDAPI_(int) PathGetDriveNumberA(_In_ LPCSTR);
319LWSTDAPI_(int) PathGetDriveNumberW(_In_ LPCWSTR);
320LWSTDAPI_(BOOL) PathIsContentTypeA(_In_ LPCSTR, _In_ LPCSTR);
321LWSTDAPI_(BOOL) PathIsContentTypeW(_In_ LPCWSTR, _In_ LPCWSTR);
322LWSTDAPI_(BOOL) PathIsDirectoryA(_In_ LPCSTR);
323LWSTDAPI_(BOOL) PathIsDirectoryW(_In_ LPCWSTR);
324LWSTDAPI_(BOOL) PathIsDirectoryEmptyA(_In_ LPCSTR);
325LWSTDAPI_(BOOL) PathIsDirectoryEmptyW(_In_ LPCWSTR);
326LWSTDAPI_(BOOL) PathIsFileSpecA(_In_ LPCSTR);
327LWSTDAPI_(BOOL) PathIsFileSpecW(_In_ LPCWSTR);
328LWSTDAPI_(BOOL) PathIsLFNFileSpecA(_In_ LPCSTR);
329LWSTDAPI_(BOOL) PathIsLFNFileSpecW(_In_ LPCWSTR);
330LWSTDAPI_(BOOL) PathIsNetworkPathA(_In_ LPCSTR);
331LWSTDAPI_(BOOL) PathIsNetworkPathW(_In_ LPCWSTR);
332LWSTDAPI_(BOOL) PathIsPrefixA(_In_ LPCSTR, _In_ LPCSTR);
333LWSTDAPI_(BOOL) PathIsPrefixW(_In_ LPCWSTR, _In_ LPCWSTR);
334LWSTDAPI_(BOOL) PathIsRelativeA(_In_ LPCSTR);
335LWSTDAPI_(BOOL) PathIsRelativeW(_In_ LPCWSTR);
336LWSTDAPI_(BOOL) PathIsRootA(_In_ LPCSTR);
337LWSTDAPI_(BOOL) PathIsRootW(_In_ LPCWSTR);
338LWSTDAPI_(BOOL) PathIsSameRootA(_In_ LPCSTR, _In_ LPCSTR);
339LWSTDAPI_(BOOL) PathIsSameRootW(_In_ LPCWSTR, _In_ LPCWSTR);
340LWSTDAPI_(BOOL) PathIsSystemFolderA(_In_opt_ LPCSTR, _In_ DWORD);
341LWSTDAPI_(BOOL) PathIsSystemFolderW(_In_opt_ LPCWSTR, _In_ DWORD);
342LWSTDAPI_(BOOL) PathIsUNCA(_In_ LPCSTR);
343LWSTDAPI_(BOOL) PathIsUNCW(_In_ LPCWSTR);
344LWSTDAPI_(BOOL) PathIsUNCServerA(_In_ LPCSTR);
345LWSTDAPI_(BOOL) PathIsUNCServerW(_In_ LPCWSTR);
346LWSTDAPI_(BOOL) PathIsUNCServerShareA(_In_ LPCSTR);
347LWSTDAPI_(BOOL) PathIsUNCServerShareW(_In_ LPCWSTR);
348LWSTDAPI_(BOOL) PathIsURLA(_In_ LPCSTR);
349LWSTDAPI_(BOOL) PathIsURLW(_In_ LPCWSTR);
350LWSTDAPI_(BOOL) PathMakePrettyA(_Inout_ LPSTR);
351LWSTDAPI_(BOOL) PathMakePrettyW(_Inout_ LPWSTR);
352LWSTDAPI_(BOOL) PathMakeSystemFolderA(_In_ LPCSTR);
353LWSTDAPI_(BOOL) PathMakeSystemFolderW(_In_ LPCWSTR);
354LWSTDAPI_(BOOL) PathMatchSpecA(_In_ LPCSTR pszFile, _In_ LPCSTR pszSpec);
355LWSTDAPI_(BOOL) PathMatchSpecW(_In_ LPCWSTR pszFile, _In_ LPCWSTR pszSpec);
356#if (_WIN32_IE >= _WIN32_IE_IE70)
357LWSTDAPI PathMatchSpecExA(_In_ LPCSTR, _In_ LPCSTR, _In_ DWORD);
358LWSTDAPI PathMatchSpecExW(_In_ LPCWSTR, _In_ LPCWSTR, _In_ DWORD);
359#endif // _WIN32_IE_IE70
360LWSTDAPI_(int) PathParseIconLocationA(_Inout_ LPSTR);
361LWSTDAPI_(int) PathParseIconLocationW(_Inout_ LPWSTR);
362LWSTDAPI_(BOOL) PathQuoteSpacesA(_Inout_updates_(MAX_PATH) LPSTR);
363LWSTDAPI_(BOOL) PathQuoteSpacesW(_Inout_updates_(MAX_PATH) LPWSTR);
364LWSTDAPI_(BOOL) PathRelativePathToA(_Out_writes_(MAX_PATH) LPSTR, _In_ LPCSTR, _In_ DWORD, _In_ LPCSTR, _In_ DWORD);
365LWSTDAPI_(BOOL) PathRelativePathToW(_Out_writes_(MAX_PATH) LPWSTR, _In_ LPCWSTR, _In_ DWORD, _In_ LPCWSTR, _In_ DWORD);
366LWSTDAPI_(void) PathRemoveArgsA(_Inout_ LPSTR);
367LWSTDAPI_(void) PathRemoveArgsW(_Inout_ LPWSTR);
368LWSTDAPI_(LPSTR) PathRemoveBackslashA(_Inout_ LPSTR);
369LWSTDAPI_(LPWSTR) PathRemoveBackslashW(_Inout_ LPWSTR);
370LWSTDAPI_(void) PathRemoveBlanksA(_Inout_ LPSTR);
371LWSTDAPI_(void) PathRemoveBlanksW(_Inout_ LPWSTR);
372LWSTDAPI_(void) PathRemoveExtensionA(_Inout_ LPSTR);
373LWSTDAPI_(void) PathRemoveExtensionW(_Inout_ LPWSTR);
374LWSTDAPI_(BOOL) PathRemoveFileSpecA(_Inout_ LPSTR);
375LWSTDAPI_(BOOL) PathRemoveFileSpecW(_Inout_ LPWSTR);
376LWSTDAPI_(BOOL) PathRenameExtensionA(_Inout_updates_(MAX_PATH) LPSTR, _In_ LPCSTR);
377LWSTDAPI_(BOOL) PathRenameExtensionW(_Inout_updates_(MAX_PATH) LPWSTR, _In_ LPCWSTR);
378LWSTDAPI_(BOOL) PathSearchAndQualifyA(_In_ LPCSTR, _Out_writes_(cchBuf) LPSTR, _In_ UINT cchBuf);
379LWSTDAPI_(BOOL) PathSearchAndQualifyW(_In_ LPCWSTR, _Out_writes_(cchBuf) LPWSTR, _In_ UINT cchBuf);
380LWSTDAPI_(void) PathSetDlgItemPathA(_In_ HWND, int, LPCSTR);
381LWSTDAPI_(void) PathSetDlgItemPathW(_In_ HWND, int, LPCWSTR);
382LWSTDAPI_(LPSTR) PathSkipRootA(_In_ LPCSTR);
383LWSTDAPI_(LPWSTR) PathSkipRootW(_In_ LPCWSTR);
384LWSTDAPI_(void) PathStripPathA(_Inout_ LPSTR);
385LWSTDAPI_(void) PathStripPathW(_Inout_ LPWSTR);
386LWSTDAPI_(BOOL) PathStripToRootA(_Inout_ LPSTR);
387LWSTDAPI_(BOOL) PathStripToRootW(_Inout_ LPWSTR);
388LWSTDAPI_(void) PathUndecorateA(_Inout_ LPSTR);
389LWSTDAPI_(void) PathUndecorateW(_Inout_ LPWSTR);
390LWSTDAPI_(BOOL) PathUnExpandEnvStringsA(_In_ LPCSTR, _Out_writes_(cchBuf) LPSTR, _In_ UINT cchBuf);
391LWSTDAPI_(BOOL) PathUnExpandEnvStringsW(_In_ LPCWSTR, _Out_writes_(cchBuf) LPWSTR, _In_ UINT cchBuf);
392LWSTDAPI_(BOOL) PathUnmakeSystemFolderA(_In_ LPCSTR);
393LWSTDAPI_(BOOL) PathUnmakeSystemFolderW(_In_ LPCWSTR);
394LWSTDAPI_(BOOL) PathUnquoteSpacesA(_Inout_ LPSTR);
395LWSTDAPI_(BOOL) PathUnquoteSpacesW(_Inout_ LPWSTR);
396
397#ifdef UNICODE
398#define PathAddBackslash PathAddBackslashW
399#define PathAddExtension PathAddExtensionW
400#define PathAppend PathAppendW
401#define PathBuildRoot PathBuildRootW
402#define PathCanonicalize PathCanonicalizeW
403#define PathCombine PathCombineW
404#define PathCompactPath PathCompactPathW
405#define PathCompactPathEx PathCompactPathExW
406#define PathCommonPrefix PathCommonPrefixW
407#define PathCreateFromUrl PathCreateFromUrlW
408#define PathFileExists PathFileExistsW
409#define PathFindExtension PathFindExtensionW
410#define PathFindFileName PathFindFileNameW
411#define PathFindNextComponent PathFindNextComponentW
412#define PathFindOnPath PathFindOnPathW
413#define PathFindSuffixArray PathFindSuffixArrayW
414#define PathGetArgs PathGetArgsW
415#define PathGetCharType PathGetCharTypeW
416#define PathGetDriveNumber PathGetDriveNumberW
417#define PathIsContentType PathIsContentTypeW
418#define PathIsDirectory PathIsDirectoryW
419#define PathIsDirectoryEmpty PathIsDirectoryEmptyW
420#define PathIsFileSpec PathIsFileSpecW
421#define PathIsLFNFileSpec PathIsLFNFileSpecW
422#define PathIsNetworkPath PathIsNetworkPathW
423#define PathIsPrefix PathIsPrefixW
424#define PathIsRelative PathIsRelativeW
425#define PathIsRoot PathIsRootW
426#define PathIsSameRoot PathIsSameRootW
427#define PathIsSystemFolder PathIsSystemFolderW
428#define PathIsUNC PathIsUNCW
429#define PathIsUNCServer PathIsUNCServerW
430#define PathIsUNCServerShare PathIsUNCServerShareW
431#define PathIsURL PathIsURLW
432#define PathMakePretty PathMakePrettyW
433#define PathMakeSystemFolder PathMakeSystemFolderW
434#define PathMatchSpec PathMatchSpecW
435#if (_WIN32_IE >= _WIN32_IE_IE70)
436#define PathMatchSpecEx PathMatchSpecExW
437#endif // _WIN32_IE_IE70
438#define PathParseIconLocation PathParseIconLocationW
439#define PathQuoteSpaces PathQuoteSpacesW
440#define PathRelativePathTo PathRelativePathToW
441#define PathRemoveArgs PathRemoveArgsW
442#define PathRemoveBackslash PathRemoveBackslashW
443#define PathRemoveBlanks PathRemoveBlanksW
444#define PathRemoveExtension PathRemoveExtensionW
445#define PathRemoveFileSpec PathRemoveFileSpecW
446#define PathRenameExtension PathRenameExtensionW
447#define PathSearchAndQualify PathSearchAndQualifyW
448#define PathSetDlgItemPath PathSetDlgItemPathW
449#define PathSkipRoot PathSkipRootW
450#define PathStripPath PathStripPathW
451#define PathStripToRoot PathStripToRootW
452#define PathUndecorate PathUndecorateW
453#define PathUnExpandEnvStrings PathUnExpandEnvStringsW
454#define PathUnmakeSystemFolder PathUnmakeSystemFolderW
455#define PathUnquoteSpaces PathUnquoteSpacesW
456#else
457#define PathAddBackslash PathAddBackslashA
458#define PathAddExtension PathAddExtensionA
459#define PathAppend PathAppendA
460#define PathBuildRoot PathBuildRootA
461#define PathCanonicalize PathCanonicalizeA
462#define PathCombine PathCombineA
463#define PathCompactPath PathCompactPathA
464#define PathCompactPathEx PathCompactPathExA
465#define PathCommonPrefix PathCommonPrefixA
466#define PathCreateFromUrl PathCreateFromUrlA
467#define PathFileExists PathFileExistsA
468#define PathFindExtension PathFindExtensionA
469#define PathFindFileName PathFindFileNameA
470#define PathFindNextComponent PathFindNextComponentA
471#define PathFindOnPath PathFindOnPathA
472#define PathFindSuffixArray PathFindSuffixArrayA
473#define PathGetArgs PathGetArgsA
474#define PathGetCharType PathGetCharTypeA
475#define PathGetDriveNumber PathGetDriveNumberA
476#define PathIsContentType PathIsContentTypeA
477#define PathIsDirectory PathIsDirectoryA
478#define PathIsDirectoryEmpty PathIsDirectoryEmptyA
479#define PathIsFileSpec PathIsFileSpecA
480#define PathIsLFNFileSpec PathIsLFNFileSpecA
481#define PathIsNetworkPath PathIsNetworkPathA
482#define PathIsPrefix PathIsPrefixA
483#define PathIsRelative PathIsRelativeA
484#define PathIsRoot PathIsRootA
485#define PathIsSameRoot PathIsSameRootA
486#define PathIsSystemFolder PathIsSystemFolderA
487#define PathIsUNC PathIsUNCA
488#define PathIsUNCServer PathIsUNCServerA
489#define PathIsUNCServerShare PathIsUNCServerShareA
490#define PathIsURL PathIsURLA
491#define PathMakePretty PathMakePrettyA
492#define PathMakeSystemFolder PathMakeSystemFolderA
493#define PathMatchSpec PathMatchSpecA
494#if (_WIN32_IE >= _WIN32_IE_IE70)
495#define PathMatchSpecEx PathMatchSpecExA
496#endif // _WIN32_IE_IE70
497#define PathParseIconLocation PathParseIconLocationA
498#define PathQuoteSpaces PathQuoteSpacesA
499#define PathRelativePathTo PathRelativePathToA
500#define PathRemoveArgs PathRemoveArgsA
501#define PathRemoveBackslash PathRemoveBackslashA
502#define PathRemoveBlanks PathRemoveBlanksA
503#define PathRemoveExtension PathRemoveExtensionA
504#define PathRemoveFileSpec PathRemoveFileSpecA
505#define PathRenameExtension PathRenameExtensionA
506#define PathSearchAndQualify PathSearchAndQualifyA
507#define PathSetDlgItemPath PathSetDlgItemPathA
508#define PathSkipRoot PathSkipRootA
509#define PathStripPath PathStripPathA
510#define PathStripToRoot PathStripToRootA
511#define PathUndecorate PathUndecorateA
512#define PathUnExpandEnvStrings PathUnExpandEnvStringsA
513#define PathUnmakeSystemFolder PathUnmakeSystemFolderA
514#define PathUnquoteSpaces PathUnquoteSpacesA
515#endif // UNICODE
516
517#define URL_APPLY_DEFAULT 0x00000001
518#define URL_APPLY_GUESSSCHEME 0x00000002
519#define URL_APPLY_GUESSFILE 0x00000004
520#define URL_APPLY_FORCEAPPLY 0x00000008
521#define URL_ESCAPE_PERCENT 0x00001000
522#define URL_ESCAPE_SEGMENT_ONLY 0x00002000
523#define URL_FILE_USE_PATHURL 0x00010000
524#define URL_ESCAPE_AS_UTF8 0x00040000
525#define URL_UNESCAPE_INPLACE 0x00100000
526#define URL_CONVERT_IF_DOSPATH 0x00200000
527#define URL_UNESCAPE_HIGH_ANSI_ONLY 0x00400000
528#define URL_INTERNAL_PATH 0x00800000
529#define URL_DONT_ESCAPE_EXTRA_INFO 0x02000000
530#define URL_ESCAPE_SPACES_ONLY 0x04000000
531#define URL_DONT_SIMPLIFY 0x08000000
532#define URL_UNESCAPE 0x10000000
533#define URL_ESCAPE_UNSAFE 0x20000000
534#define URL_PLUGGABLE_PROTOCOL 0x40000000
535#define URL_WININET_COMPATIBILITY 0x80000000
536#define URL_UNESCAPE_AS_UTF8 URL_ESCAPE_AS_UTF8
537#define URL_UNESCAPE_URI_COMPONENT URL_UNESCAPE_AS_UTF8
538#define URL_NO_META URL_DONT_SIMPLIFY
539#define URL_DONT_UNESCAPE_EXTRA_INFO URL_DONT_ESCAPE_EXTRA_INFO
540#define URL_BROWSER_MODE URL_DONT_ESCAPE_EXTRA_INFO
541
542typedef enum {
543 URL_SCHEME_INVALID = -1,
544 URL_SCHEME_UNKNOWN = 0,
545 URL_SCHEME_FTP,
546 URL_SCHEME_HTTP,
547 URL_SCHEME_GOPHER,
548 URL_SCHEME_MAILTO,
549 URL_SCHEME_NEWS,
550 URL_SCHEME_NNTP,
551 URL_SCHEME_TELNET,
552 URL_SCHEME_WAIS,
553 URL_SCHEME_FILE,
554 URL_SCHEME_MK,
555 URL_SCHEME_HTTPS,
556 URL_SCHEME_SHELL,
557 URL_SCHEME_SNEWS,
558 URL_SCHEME_LOCAL,
559 URL_SCHEME_JAVASCRIPT,
560 URL_SCHEME_VBSCRIPT,
561 URL_SCHEME_ABOUT,
562 URL_SCHEME_RES,
563#if (_WIN32_IE >= _WIN32_IE_IE60)
564 URL_SCHEME_MSSHELLROOTED,
565 URL_SCHEME_MSSHELLIDLIST,
566 URL_SCHEME_MSHELP,
567#endif // _WIN32_IE_IE60
568#if (_WIN32_IE >= _WIN32_IE_IE70)
569 URL_SCHEME_MSSHELLDEVICE,
570 URL_SCHEME_WILDCARD,
571#endif // _WIN32_IE_IE70
572#if (NTDDI_VERSION >= NTDDI_VISTA)
573 URL_SCHEME_SEARCH_MS,
574#endif // NTDDI_VISTA
575#if (NTDDI_VERSION >= NTDDI_VISTASP1)
576 URL_SCHEME_SEARCH,
577#endif // NTDDI_VISTASP1
578#if (NTDDI_VERSION >= NTDDI_WIN7)
579 URL_SCHEME_KNOWNFOLDER,
580#endif // NTDDI_WIN7
581 URL_SCHEME_MAXVALUE
582} URL_SCHEME;
583
584typedef enum {
585 URL_PART_NONE = 0,
586 URL_PART_SCHEME = 1,
587 URL_PART_HOSTNAME,
588 URL_PART_USERNAME,
589 URL_PART_PASSWORD,
590 URL_PART_PORT,
591 URL_PART_QUERY
592} URL_PART;
593
594#define URL_PARTFLAG_KEEPSCHEME 0x00000001
595
596typedef enum {
597 URLIS_URL,
598 URLIS_OPAQUE,
599 URLIS_NOHISTORY,
600 URLIS_FILEURL,
601 URLIS_APPLIABLE,
602 URLIS_DIRECTORY,
603 URLIS_HASQUERY
604} URLIS;
605
606typedef struct tagPARSEDURLA {
607 DWORD cbSize;
608 LPCSTR pszProtocol;
609 UINT cchProtocol;
610 LPCSTR pszSuffix;
611 UINT cchSuffix;
612 UINT nScheme;
613} PARSEDURLA, *PPARSEDURLA;
614
615typedef struct tagPARSEDURLW {
616 DWORD cbSize;
617 LPCWSTR pszProtocol;
618 UINT cchProtocol;
619 LPCWSTR pszSuffix;
620 UINT cchSuffix;
621 UINT nScheme;
622} PARSEDURLW, *PPARSEDURLW;
623
624LWSTDAPI UrlApplySchemeA(_In_ LPCSTR, _Out_writes_(*pcchOut) LPSTR, _Inout_ LPDWORD pcchOut, DWORD);
625LWSTDAPI UrlApplySchemeW(_In_ LPCWSTR, _Out_writes_(*pcchOut) LPWSTR, _Inout_ LPDWORD pcchOut, DWORD);
626LWSTDAPI UrlCanonicalizeA(_In_ LPCSTR, _Out_writes_to_(*pcchCanonicalized, *pcchCanonicalized) LPSTR, _Inout_ LPDWORD pcchCanonicalized, DWORD);
627LWSTDAPI UrlCanonicalizeW(_In_ LPCWSTR, _Out_writes_to_(*pcchCanonicalized, *pcchCanonicalized) LPWSTR, _Inout_ LPDWORD pcchCanonicalized, DWORD);
628LWSTDAPI UrlCombineA(_In_ LPCSTR, _In_ LPCSTR, _Out_writes_to_opt_(*pcchCombined, *pcchCombined) LPSTR, _Inout_ LPDWORD pcchCombined, DWORD);
629LWSTDAPI UrlCombineW(_In_ LPCWSTR, _In_ LPCWSTR, _Out_writes_to_opt_(*pcchCombined, *pcchCombined) LPWSTR, _Inout_ LPDWORD pcchCombined, DWORD);
630LWSTDAPI_(int) UrlCompareA(_In_ LPCSTR, _In_ LPCSTR, BOOL);
631LWSTDAPI_(int) UrlCompareW(_In_ LPCWSTR, _In_ LPCWSTR, BOOL);
632LWSTDAPI UrlEscapeA(_In_ LPCSTR, _Out_writes_to_(*pcchEscaped, *pcchEscaped) LPSTR, _Inout_ LPDWORD pcchEscaped, DWORD);
633LWSTDAPI UrlEscapeW(_In_ LPCWSTR, _Out_writes_to_(*pcchEscaped, *pcchEscaped) LPWSTR, _Inout_ LPDWORD pcchEscaped, DWORD);
634LWSTDAPI_(LPCSTR) UrlGetLocationA(_In_ LPCSTR);
635LWSTDAPI_(LPCWSTR) UrlGetLocationW(_In_ LPCWSTR);
636LWSTDAPI UrlGetPartA(_In_ LPCSTR, _Out_writes_(*pcchOut) LPSTR, _Inout_ LPDWORD pcchOut, DWORD, DWORD);
637LWSTDAPI UrlGetPartW(_In_ LPCWSTR, _Out_writes_(*pcchOut) LPWSTR, _Inout_ LPDWORD pcchOut, DWORD, DWORD);
638LWSTDAPI UrlHashA(_In_ LPCSTR, _Out_writes_bytes_(cbHash) unsigned char *, DWORD cbHash);
639LWSTDAPI UrlHashW(_In_ LPCWSTR, _Out_writes_bytes_(cbHash) unsigned char *, DWORD cbHash);
640LWSTDAPI_(BOOL) UrlIsA(_In_ LPCSTR, URLIS);
641LWSTDAPI_(BOOL) UrlIsW(_In_ LPCWSTR, URLIS);
642#define UrlIsFileUrlA(x) UrlIsA(x, URLIS_FILEURL)
643#define UrlIsFileUrlW(x) UrlIsW(x, URLIS_FILEURL)
644LWSTDAPI_(BOOL) UrlIsNoHistoryA(_In_ LPCSTR);
645LWSTDAPI_(BOOL) UrlIsNoHistoryW(_In_ LPCWSTR);
646LWSTDAPI_(BOOL) UrlIsOpaqueA(_In_ LPCSTR);
647LWSTDAPI_(BOOL) UrlIsOpaqueW(_In_ LPCWSTR);
648LWSTDAPI UrlUnescapeA(_Inout_ LPSTR, _Out_writes_to_opt_(*pcchUnescaped, *pcchUnescaped) LPSTR, _Inout_opt_ LPDWORD pcchUnescaped, DWORD);
649LWSTDAPI UrlUnescapeW(_Inout_ LPWSTR, _Out_writes_to_opt_(*pcchUnescaped, *pcchUnescaped) LPWSTR, _Inout_opt_ LPDWORD pcchUnescaped, DWORD);
650LWSTDAPI UrlCreateFromPathA(_In_ LPCSTR, _Out_writes_to_(*pcchUrl, *pcchUrl) LPSTR, _Inout_ LPDWORD pcchUrl, DWORD);
651LWSTDAPI UrlCreateFromPathW(_In_ LPCWSTR, _Out_writes_to_(*pcchUrl, *pcchUrl) LPWSTR, _Inout_ LPDWORD pcchUrl, DWORD);
652LWSTDAPI ParseURLA(_In_ LPCSTR pszUrl, _Inout_ PARSEDURLA *ppu);
653LWSTDAPI ParseURLW(_In_ LPCWSTR pszUrl, _Inout_ PARSEDURLW *ppu);
654
655#ifdef UNICODE
656#define UrlApplyScheme UrlApplySchemeW
657#define UrlCanonicalize UrlCanonicalizeW
658#define UrlCombine UrlCombineW
659#define UrlCompare UrlCompareW
660#define UrlEscape UrlEscapeW
661#define UrlGetLocation UrlGetLocationW
662#define UrlGetPart UrlGetPartW
663#define UrlHash UrlHashW
664#define UrlIs UrlIsW
665#define UrlIsFileUrl UrlIsFileUrlW
666#define UrlIsNoHistory UrlIsNoHistoryW
667#define UrlIsOpaque UrlIsOpaqueW
668#define UrlUnescape UrlUnescapeW
669#define UrlCreateFromPath UrlCreateFromPathW
670#define ParseURL ParseURLW
671#else
672#define UrlApplyScheme UrlApplySchemeA
673#define UrlCanonicalize UrlCanonicalizeA
674#define UrlCombine UrlCombineA
675#define UrlCompare UrlCompareA
676#define UrlEscape UrlEscapeA
677#define UrlGetLocation UrlGetLocationA
678#define UrlGetPart UrlGetPartA
679#define UrlHash UrlHashA
680#define UrlIs UrlIsA
681#define UrlIsFileUrl UrlIsFileUrlA
682#define UrlIsNoHistory UrlIsNoHistoryA
683#define UrlIsOpaque UrlIsOpaqueA
684#define UrlUnescape UrlUnescapeA
685#define UrlCreateFromPath UrlCreateFromPathA
686#define ParseURL ParseURLA
687#endif // UNICODE
688
689#define UrlEscapeSpaces(x, y, z) UrlCanonicalize(x, y, z, URL_ESCAPE_SPACES_ONLY | URL_DONT_ESCAPE_EXTRA_INFO)
690#define UrlUnescapeInPlace(x, y) UrlUnescape(x, NULL, NULL, y | URL_UNESCAPE_INPLACE)
691
692#endif // NO_SHLWAPI_PATH
693
694/* Registry functions */
695#ifndef NO_SHLWAPI_REG
696
697#define SRRF_RT_REG_NONE 0x0001
698#define SRRF_RT_REG_SZ 0x0002
699#define SRRF_RT_REG_EXPAND_SZ 0x0004
700#define SRRF_RT_REG_BINARY 0x0008
701#define SRRF_RT_REG_DWORD 0x0010
702#define SRRF_RT_REG_MULTI_SZ 0x0020
703#define SRRF_RT_REG_QWORD 0x0040
704#define SRRF_RT_ANY 0xFFFF
705#define SRRF_RT_DWORD (SRRF_RT_REG_BINARY | SRRF_RT_REG_DWORD)
706#define SRRF_RT_QWORD (SRRF_RT_REG_BINARY | SRRF_RT_REG_QWORD)
707
708#define SRRF_RM_ANY 0x00000
709#define SRRF_RM_NORMAL 0x10000
710#define SRRF_RM_SAFE 0x20000
711#define SRRF_RM_SAFENETWORK 0x40000
712
713#define SRRF_NOEXPAND 0x10000000
714#define SRRF_ZEROONFAILURE 0x20000000
715#define SRRF_NOVIRT 0x40000000
716
717typedef INT SRRF;
718
719#define SHREGSET_HKCU 0x1
720#define SHREGSET_FORCE_HKCU 0x2
721#define SHREGSET_HKLM 0x4
722#define SHREGSET_FORCE_HKLM 0x8
723#define SHREGSET_DEFAULT (SHREGSET_FORCE_HKCU | SHREGSET_HKLM)
724
725typedef enum {
726 SHREGDEL_DEFAULT = 0,
727 SHREGDEL_HKCU = 0x1,
728 SHREGDEL_HKLM = 0x10,
729 SHREGDEL_BOTH = SHREGDEL_HKLM | SHREGDEL_HKCU
730} SHREGDEL_FLAGS;
731
732typedef enum {
733 SHREGENUM_DEFAULT = 0,
734 SHREGENUM_HKCU = 0x1,
735 SHREGENUM_HKLM = 0x10,
736 SHREGENUM_BOTH = SHREGENUM_HKLM | SHREGENUM_HKCU
737} SHREGENUM_FLAGS;
738
739typedef HANDLE HUSKEY;
740typedef HUSKEY *PHUSKEY;
741
742LWSTDAPI_(LONG) SHRegCloseUSKey(_In_ HUSKEY);
743LWSTDAPI_(HKEY) SHRegDuplicateHKey(_In_ HKEY);
744
745LWSTDAPI_(DWORD) SHCopyKeyA(_In_ HKEY, _In_opt_ LPCSTR, _In_ HKEY, _Reserved_ DWORD);
746LWSTDAPI_(DWORD) SHCopyKeyW(_In_ HKEY, _In_opt_ LPCWSTR, _In_ HKEY, _Reserved_ DWORD);
747LWSTDAPI_(DWORD) SHDeleteEmptyKeyA(_In_ HKEY, _In_opt_ LPCSTR);
748LWSTDAPI_(DWORD) SHDeleteEmptyKeyW(_In_ HKEY, _In_opt_ LPCWSTR);
749LWSTDAPI_(DWORD) SHDeleteKeyA(_In_ HKEY, _In_opt_ LPCSTR);
750LWSTDAPI_(DWORD) SHDeleteKeyW(_In_ HKEY, _In_opt_ LPCWSTR);
751LWSTDAPI_(DWORD) SHDeleteOrphanKeyA(HKEY, LPCSTR);
752LWSTDAPI_(DWORD) SHDeleteOrphanKeyW(HKEY, LPCWSTR);
753LWSTDAPI_(DWORD) SHDeleteValueA(_In_ HKEY, _In_opt_ LPCSTR, _In_ LPCSTR);
754LWSTDAPI_(DWORD) SHDeleteValueW(_In_ HKEY, _In_opt_ LPCWSTR, _In_ LPCWSTR);
755LWSTDAPI_(LONG) SHEnumKeyExA(_In_ HKEY, _In_ DWORD, _Out_writes_(*pcchName) LPSTR, _Inout_ LPDWORD pcchName);
756LWSTDAPI_(LONG) SHEnumKeyExW(_In_ HKEY, _In_ DWORD, _Out_writes_(*pcchName) LPWSTR, _Inout_ LPDWORD pcchName);
757LWSTDAPI_(LONG) SHEnumValueA(_In_ HKEY, _In_ DWORD, _Out_writes_opt_(*pcchValueName) LPSTR, _Inout_opt_ LPDWORD pcchValueName, _Out_opt_ LPDWORD, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData);
758LWSTDAPI_(LONG) SHEnumValueW(_In_ HKEY, _In_ DWORD, _Out_writes_opt_(*pcchValueName) LPWSTR, _Inout_opt_ LPDWORD pcchValueName, _Out_opt_ LPDWORD, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData);
759LWSTDAPI_(DWORD) SHGetValueA(_In_ HKEY, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _Out_opt_ LPDWORD, _Out_writes_bytes_opt_(*pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData);
760LWSTDAPI_(DWORD) SHGetValueW(_In_ HKEY, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _Out_opt_ LPDWORD, _Out_writes_bytes_opt_(*pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData);
761LWSTDAPI_(DWORD) SHSetValueA(_In_ HKEY, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_ DWORD, _In_reads_bytes_opt_(cbData) LPCVOID, _In_ DWORD cbData);
762LWSTDAPI_(DWORD) SHSetValueW(_In_ HKEY, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ DWORD, _In_reads_bytes_opt_(cbData) LPCVOID, _In_ DWORD cbData);
763LWSTDAPI_(DWORD) SHQueryValueExA(_In_ HKEY, _In_opt_ LPCSTR, _Reserved_ LPDWORD, _Out_opt_ LPDWORD, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData);
764LWSTDAPI_(DWORD) SHQueryValueExW(_In_ HKEY, _In_opt_ LPCWSTR, _Reserved_ LPDWORD, _Out_opt_ LPDWORD, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData);
765LWSTDAPI_(LONG) SHQueryInfoKeyA(_In_ HKEY, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD);
766LWSTDAPI_(LONG) SHQueryInfoKeyW(_In_ HKEY, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD);
767LWSTDAPI_(LONG) SHRegCreateUSKeyA(_In_ LPCSTR, _In_ REGSAM, _In_opt_ HUSKEY, _Out_ PHUSKEY, _In_ DWORD);
768LWSTDAPI_(LONG) SHRegCreateUSKeyW(_In_ LPCWSTR, _In_ REGSAM, _In_opt_ HUSKEY, _Out_ PHUSKEY, _In_ DWORD);
769LWSTDAPI_(LONG) SHRegDeleteEmptyUSKeyA(_In_ HUSKEY, _In_ LPCSTR, _In_ SHREGDEL_FLAGS);
770LWSTDAPI_(LONG) SHRegDeleteEmptyUSKeyW(_In_ HUSKEY, _In_ LPCWSTR, _In_ SHREGDEL_FLAGS);
771LWSTDAPI_(LONG) SHRegDeleteUSValueA(_In_ HUSKEY, _In_ LPCSTR, _In_ SHREGDEL_FLAGS);
772LWSTDAPI_(LONG) SHRegDeleteUSValueW(_In_ HUSKEY, _In_ LPCWSTR, _In_ SHREGDEL_FLAGS);
773LWSTDAPI_(LONG) SHRegEnumUSKeyA(_In_ HUSKEY, _In_ DWORD, _Out_writes_to_(*pcchName, *pcchName) LPSTR, _Inout_ LPDWORD pcchName, _In_ SHREGENUM_FLAGS);
774LWSTDAPI_(LONG) SHRegEnumUSKeyW(_In_ HUSKEY, _In_ DWORD, _Out_writes_to_(*pcchName, *pcchName) LPWSTR, _Inout_ LPDWORD pcchName, _In_ SHREGENUM_FLAGS);
775LWSTDAPI_(LONG) SHRegEnumUSValueA(_In_ HUSKEY, _In_ DWORD, _Out_writes_to_(*pcchValueName, *pcchValueName) LPSTR, _Inout_ LPDWORD pcchValueName, _Out_opt_ LPDWORD, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData, _In_ SHREGENUM_FLAGS);
776LWSTDAPI_(LONG) SHRegEnumUSValueW(_In_ HUSKEY, _In_ DWORD, _Out_writes_to_(*pcchValueName, *pcchValueName) LPWSTR, _Inout_ LPDWORD pcchValueName, _Out_opt_ LPDWORD, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData, _In_ SHREGENUM_FLAGS);
777LWSTDAPI_(BOOL) SHRegGetBoolUSValueA(_In_ LPCSTR, _In_opt_ LPCSTR, _In_ BOOL, _In_ BOOL);
778LWSTDAPI_(BOOL) SHRegGetBoolUSValueW(_In_ LPCWSTR, _In_opt_ LPCWSTR, _In_ BOOL, _In_ BOOL);
779LWSTDAPI_(DWORD) SHRegGetPathA(_In_ HKEY, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _Out_writes_(MAX_PATH) LPSTR, _In_ DWORD);
780LWSTDAPI_(DWORD) SHRegGetPathW(_In_ HKEY, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _Out_writes_(MAX_PATH) LPWSTR, _In_ DWORD);
781LWSTDAPI_(LONG) SHRegGetUSValueA(_In_ LPCSTR, _In_opt_ LPCSTR, _Inout_opt_ LPDWORD, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData, _In_ BOOL, _In_reads_bytes_opt_(dwDefaultDataSize) LPVOID, _In_ DWORD dwDefaultDataSize);
782LWSTDAPI_(LONG) SHRegGetUSValueW(_In_ LPCWSTR, _In_opt_ LPCWSTR, _Inout_opt_ LPDWORD, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData, _In_ BOOL, _In_reads_bytes_opt_(dwDefaultDataSize) LPVOID, _In_ DWORD dwDefaultDataSize);
783LWSTDAPI_(LSTATUS) SHRegGetValueA(_In_ HKEY hkey, _In_opt_ LPCSTR pszSubKey, _In_opt_ LPCSTR pszValue, _In_ SRRF srrfFlags, _Out_opt_ LPDWORD pdwType, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID pvData, _Inout_opt_ LPDWORD pcbData);
784LWSTDAPI_(LSTATUS) SHRegGetValueW(_In_ HKEY hkey, _In_opt_ LPCWSTR pszSubKey, _In_opt_ LPCWSTR pszValue, _In_ SRRF srrfFlags, _Out_opt_ LPDWORD pdwType, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID pvData, _Inout_opt_ LPDWORD pcbData);
785LWSTDAPI_(LONG) SHRegOpenUSKeyA(_In_ LPCSTR, _In_ REGSAM, _In_opt_ HUSKEY, _Out_ PHUSKEY, _In_ BOOL);
786LWSTDAPI_(LONG) SHRegOpenUSKeyW(_In_ LPCWSTR, _In_ REGSAM, _In_opt_ HUSKEY, _Out_ PHUSKEY, _In_ BOOL);
787LWSTDAPI_(LONG) SHRegQueryInfoUSKeyA(_In_ HUSKEY, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD, _In_ SHREGENUM_FLAGS);
788LWSTDAPI_(LONG) SHRegQueryInfoUSKeyW(_In_ HUSKEY, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD, _Out_opt_ LPDWORD, _In_ SHREGENUM_FLAGS);
789LWSTDAPI_(LONG) SHRegQueryUSValueA(_In_ HUSKEY, _In_opt_ LPCSTR, _Inout_opt_ LPDWORD, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData, _In_ BOOL, _In_reads_bytes_opt_(dwDefaultDataSize) LPVOID, _In_opt_ DWORD dwDefaultDataSize);
790LWSTDAPI_(LONG) SHRegQueryUSValueW(_In_ HUSKEY, _In_opt_ LPCWSTR, _Inout_opt_ LPDWORD, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID, _Inout_opt_ LPDWORD pcbData, _In_ BOOL, _In_reads_bytes_opt_(dwDefaultDataSize) LPVOID, _In_opt_ DWORD dwDefaultDataSize);
791LWSTDAPI_(DWORD) SHRegSetPathA(_In_ HKEY, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_ LPCSTR, _In_ DWORD);
792LWSTDAPI_(DWORD) SHRegSetPathW(_In_ HKEY, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ LPCWSTR, _In_ DWORD);
793LWSTDAPI_(LONG) SHRegSetUSValueA(_In_ LPCSTR, _In_ LPCSTR, _In_ DWORD, _In_reads_bytes_opt_(cbData) LPVOID, _In_opt_ DWORD cbData, _In_opt_ DWORD);
794LWSTDAPI_(LONG) SHRegSetUSValueW(_In_ LPCWSTR, _In_ LPCWSTR, _In_ DWORD, _In_reads_bytes_opt_(cbData) LPVOID, _In_opt_ DWORD cbData, _In_opt_ DWORD);
795LWSTDAPI_(LONG) SHRegWriteUSValueA(_In_ HUSKEY, _In_ LPCSTR, _In_ DWORD, _In_reads_bytes_(cbData) LPVOID, _In_ DWORD cbData, _In_ DWORD);
796LWSTDAPI_(LONG) SHRegWriteUSValueW(_In_ HUSKEY, _In_ LPCWSTR, _In_ DWORD, _In_reads_bytes_(cbData) LPVOID, _In_ DWORD cbData, _In_ DWORD);
797/* This only exists for the -W variant. */
798LWSTDAPI_(int) SHRegGetIntW(_In_ HKEY, _In_opt_ LPCWSTR, _In_ int);
799
800#ifdef UNICODE
801#define SHCopyKey SHCopyKeyW
802#define SHDeleteEmptyKey SHDeleteEmptyKeyW
803#define SHDeleteKey SHDeleteKeyW
804#define SHDeleteOrphanKey SHDeleteOrphanKeyW
805#define SHDeleteValue SHDeleteValueW
806#define SHEnumKeyEx SHEnumKeyExW
807#define SHEnumValue SHEnumValueW
808#define SHGetValue SHGetValueW
809#define SHSetValue SHSetValueW
810#define SHQueryValueEx SHQueryValueExW
811#define SHQueryInfoKey SHQueryInfoKeyW
812#define SHRegCreateUSKey SHRegCreateUSKeyW
813#define SHRegDeleteEmptyUSKey SHRegDeleteEmptyUSKeyW
814#define SHRegDeleteUSValue SHRegDeleteUSValueW
815#define SHRegEnumUSKey SHRegEnumUSKeyW
816#define SHRegEnumUSValue SHRegEnumUSValueW
817#define SHRegGetBoolUSValue SHRegGetBoolUSValueW
818#define SHRegGetPath SHRegGetPathW
819#define SHRegGetUSValue SHRegGetUSValueW
820#define SHRegGetValue SHRegGetValueW
821#define SHRegOpenUSKey SHRegOpenUSKeyW
822#define SHRegQueryInfoUSKey SHRegQueryInfoUSKeyW
823#define SHRegQueryUSValue SHRegQueryUSValueW
824#define SHRegSetPath SHRegSetPathW
825#define SHRegSetUSValue SHRegSetUSValueW
826#define SHRegWriteUSValue SHRegWriteUSValueW
827#define SHRegGetInt SHRegGetIntW
828#else
829#define SHCopyKey SHCopyKeyA
830#define SHDeleteEmptyKey SHDeleteEmptyKeyA
831#define SHDeleteKey SHDeleteKeyA
832#define SHDeleteOrphanKey SHDeleteOrphanKeyA
833#define SHDeleteValue SHDeleteValueA
834#define SHEnumKeyEx SHEnumKeyExA
835#define SHEnumValue SHEnumValueA
836#define SHGetValue SHGetValueA
837#define SHSetValue SHSetValueA
838#define SHQueryValueEx SHQueryValueExA
839#define SHQueryInfoKey SHQueryInfoKeyA
840#define SHRegCreateUSKey SHRegCreateUSKeyA
841#define SHRegDeleteEmptyUSKey SHRegDeleteEmptyUSKeyA
842#define SHRegDeleteUSValue SHRegDeleteUSValueA
843#define SHRegEnumUSKey SHRegEnumUSKeyA
844#define SHRegEnumUSValue SHRegEnumUSValueA
845#define SHRegGetBoolUSValue SHRegGetBoolUSValueA
846#define SHRegGetPath SHRegGetPathA
847#define SHRegGetUSValue SHRegGetUSValueA
848#define SHRegGetValue SHRegGetValueA
849#define SHRegOpenUSKey SHRegOpenUSKeyA
850#define SHRegQueryInfoUSKey SHRegQueryInfoUSKeyA
851#define SHRegQueryUSValue SHRegQueryUSValueA
852#define SHRegSetPath SHRegSetPathA
853#define SHRegSetUSValue SHRegSetUSValueA
854#define SHRegWriteUSValue SHRegWriteUSValueA
855#endif // UNICODE
856
857enum {
858 ASSOCF_NONE = 0x00000000,
859 ASSOCF_INIT_NOREMAPCLSID = 0x00000001,
860 ASSOCF_INIT_BYEXENAME = 0x00000002,
861 ASSOCF_OPEN_BYEXENAME = 0x00000002,
862 ASSOCF_INIT_DEFAULTTOSTAR = 0x00000004,
863 ASSOCF_INIT_DEFAULTTOFOLDER = 0x00000008,
864 ASSOCF_NOUSERSETTINGS = 0x00000010,
865 ASSOCF_NOTRUNCATE = 0x00000020,
866 ASSOCF_VERIFY = 0x00000040,
867 ASSOCF_REMAPRUNDLL = 0x00000080,
868 ASSOCF_NOFIXUPS = 0x00000100,
869 ASSOCF_IGNOREBASECLASS = 0x00000200,
870 ASSOCF_INIT_IGNOREUNKNOWN = 0x00000400,
871#if (NTDDI_VERSION >= NTDDI_WIN8)
872 ASSOCF_INIT_FIXED_PROGID = 0x00000800,
873 ASSOCF_IS_PROTOCOL = 0x00001000,
874 ASSOCF_INIT_FOR_FILE = 0x00002000,
875#endif // NTDDI_WIN8
876#if (NTDDI_VERSION >= NTDDI_WIN10_RS1)
877 ASSOCF_IS_FULL_URI = 0x00004000,
878 ASSOCF_PER_MACHINE_ONLY = 0x00008000,
879#endif // NTDDI_WIN10_RS1
880#if (NTDDI_VERSION >= NTDDI_WIN10_RS4)
881ASSOCF_APP_TO_APP = 0x00010000,
882#endif // NTDDI_WIN10_RS4
883};
884
885typedef enum {
886 ASSOCSTR_COMMAND = 1,
887 ASSOCSTR_EXECUTABLE,
888 ASSOCSTR_FRIENDLYDOCNAME,
889 ASSOCSTR_FRIENDLYAPPNAME,
890 ASSOCSTR_NOOPEN,
891 ASSOCSTR_SHELLNEWVALUE,
892 ASSOCSTR_DDECOMMAND,
893 ASSOCSTR_DDEIFEXEC,
894 ASSOCSTR_DDEAPPLICATION,
895 ASSOCSTR_DDETOPIC,
896 ASSOCSTR_INFOTIP,
897#if (_WIN32_IE >= _WIN32_IE_IE60)
898 ASSOCSTR_QUICKTIP,
899 ASSOCSTR_TILEINFO,
900 ASSOCSTR_CONTENTTYPE,
901 ASSOCSTR_DEFAULTICON,
902 ASSOCSTR_SHELLEXTENSION,
903#endif // _WIN32_IE_IE60
904#if (_WIN32_IE >= _WIN32_IE_IE80)
905 ASSOCSTR_DROPTARGET,
906 ASSOCSTR_DELEGATEEXECUTE,
907#endif // _WIN32_IE_IE80
908 ASSOCSTR_SUPPORTED_URI_PROTOCOLS,
909#if (NTDDI_VERSION >= NTDDI_WIN10)
910 ASSOCSTR_PROGID,
911 ASSOCSTR_APPID,
912 ASSOCSTR_APPPUBLISHER,
913 ASSOCSTR_APPICONREFERENCE,
914#endif // NTDDI_WIN10
915 ASSOCSTR_MAX
916} ASSOCSTR;
917
918typedef enum {
919 ASSOCKEY_SHELLEXECCLASS = 1,
920 ASSOCKEY_APP,
921 ASSOCKEY_CLASS,
922 ASSOCKEY_BASECLASS,
923 ASSOCKEY_MAX
924} ASSOCKEY;
925
926typedef enum {
927 ASSOCDATA_MSIDESCRIPTOR = 1,
928 ASSOCDATA_NOACTIVATEHANDLER,
929 ASSOCDATA_QUERYCLASSSTORE,
930 ASSOCDATA_HASPERUSERASSOC,
931#if (_WIN32_IE >= _WIN32_IE_IE60)
932 ASSOCDATA_EDITFLAGS,
933 ASSOCDATA_VALUE,
934#endif // _WIN32_IE_IE60
935 ASSOCDATA_MAX
936} ASSOCDATA;
937
938typedef enum {
939 ASSOCENUM_NONE
940} ASSOCENUM;
941
942typedef enum {
943 FTA_None = 0x00000000,
944 FTA_Exclude = 0x00000001,
945 FTA_Show = 0x00000002,
946 FTA_HasExtension = 0x00000004,
947 FTA_NoEdit = 0x00000008,
948 FTA_NoRemove = 0x00000010,
949 FTA_NoNewVerb = 0x00000020,
950 FTA_NoEditVerb = 0x00000040,
951 FTA_NoRemoveVerb = 0x00000080,
952 FTA_NoEditDesc = 0x00000100,
953 FTA_NoEditIcon = 0x00000200,
954 FTA_NoEditDflt = 0x00000400,
955 FTA_NoEditVerbCmd = 0x00000800,
956 FTA_NoEditVerbExe = 0x00001000,
957 FTA_NoDDE = 0x00002000,
958 FTA_NoEditMIME = 0x00008000,
959 FTA_OpenIsSafe = 0x00010000,
960 FTA_AlwaysUnsafe = 0x00020000,
961 FTA_NoRecentDocs = 0x00100000,
962 FTA_SafeForElevation = 0x00200000,
963 FTA_AlwaysUseDirectInvoke = 0x00400000
964} FILETYPEATTRIBUTEFLAGS;
965DEFINE_ENUM_FLAG_OPERATORS(FILETYPEATTRIBUTEFLAGS)
966
967typedef DWORD ASSOCF;
968
969#define INTERFACE IQueryAssociations
970DECLARE_INTERFACE_(IQueryAssociations,IUnknown)
971{
972 STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE;
973 STDMETHOD_(ULONG,AddRef)(THIS) PURE;
974 STDMETHOD_(ULONG,Release)(THIS) PURE;
975
976 STDMETHOD(Init)(THIS_ _In_ ASSOCF flags, _In_opt_ LPCWSTR pszAssoc, _In_opt_ HKEY hkProgid, _In_opt_ HWND hwnd) PURE;
977 STDMETHOD(GetString)(THIS_ _In_ ASSOCF flags, _In_ ASSOCSTR str, _In_opt_ LPCWSTR pszExtra, _Out_writes_opt_(*pcchOut) LPWSTR pszOut, _Inout_ DWORD *pcchOut) PURE;
978 STDMETHOD(GetKey)(THIS_ _In_ ASSOCF flags, _In_ ASSOCKEY key, _In_opt_ LPCWSTR pszExtra, _Out_ HKEY *phkeyOut) PURE;
979 STDMETHOD(GetData)(THIS_ _In_ ASSOCF flags, _In_ ASSOCDATA data, _In_opt_ LPCWSTR pszExtra, _Out_writes_bytes_opt_(*pcbOut) LPVOID pvOut, _Inout_opt_ DWORD *pcbOut) PURE;
980 STDMETHOD(GetEnum)(THIS_ _In_ ASSOCF flags, _In_ ASSOCENUM assocenum, _In_opt_ LPCWSTR pszExtra, _In_ REFIID riid, _Outptr_ LPVOID *ppvOut) PURE;
981};
982#undef INTERFACE
983
984#if !defined(__cplusplus) || defined(CINTERFACE)
985#define IQueryAssociations_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
986#define IQueryAssociations_AddRef(p) (p)->lpVtbl->AddRef(p)
987#define IQueryAssociations_Release(p) (p)->lpVtbl->Release(p)
988#define IQueryAssociations_Init(p,a,b,c,d) (p)->lpVtbl->Init(p,a,b,c,d)
989#define IQueryAssociations_GetString(p,a,b,c,d,e) (p)->lpVtbl->GetString(p,a,b,c,d,e)
990#define IQueryAssociations_GetKey(p,a,b,c,d) (p)->lpVtbl->GetKey(p,a,b,c,d)
991#define IQueryAssociations_GetData(p,a,b,c,d,e) (p)->lpVtbl->GetData(p,a,b,c,d,e)
992#define IQueryAssociations_GetEnum(p,a,b,c,d,e) (p)->lpVtbl->GetEnum(p,a,b,c,d,e)
993#endif
994
995typedef struct IQueryAssociations *LPQUERYASSOCIATIONS;
996
997LWSTDAPI AssocCreate(_In_ CLSID, _In_ REFIID, _Outptr_ LPVOID*);
998#if (_WIN32_IE >= _WIN32_IE_IE60SP1)
999LWSTDAPI_(BOOL) AssocIsDangerous(_In_ LPCWSTR);
1000#endif // _WIN32_IE_IE60SP1
1001
1002LWSTDAPI AssocQueryStringA(_In_ ASSOCF, _In_ ASSOCSTR, _In_ LPCSTR, _In_opt_ LPCSTR, _Out_writes_opt_(*pcchOut) LPSTR, _Inout_ LPDWORD pcchOut);
1003LWSTDAPI AssocQueryStringW(_In_ ASSOCF, _In_ ASSOCSTR, _In_ LPCWSTR, _In_opt_ LPCWSTR, _Out_writes_opt_(*pcchOut) LPWSTR, _Inout_ LPDWORD pcchOut);
1004LWSTDAPI AssocQueryStringByKeyA(_In_ ASSOCF, _In_ ASSOCSTR, _In_ HKEY, _In_opt_ LPCSTR, _Out_writes_opt_(*pcchOut) LPSTR, _Inout_ LPDWORD pcchOut);
1005LWSTDAPI AssocQueryStringByKeyW(_In_ ASSOCF, _In_ ASSOCSTR, _In_ HKEY, _In_opt_ LPCWSTR, _Out_writes_opt_(*pcchOut) LPWSTR, _Inout_ LPDWORD pcchOut);
1006LWSTDAPI AssocQueryKeyA(_In_ ASSOCF, _In_ ASSOCKEY, _In_ LPCSTR, _In_opt_ LPCSTR, _Out_ PHKEY);
1007LWSTDAPI AssocQueryKeyW(_In_ ASSOCF, _In_ ASSOCKEY, _In_ LPCWSTR, _In_opt_ LPCWSTR, _Out_ PHKEY);
1008
1009#ifdef UNICODE
1010#define AssocQueryString AssocQueryStringW
1011#define AssocQueryStringByKey AssocQueryStringByKeyW
1012#define AssocQueryKey AssocQueryKeyW
1013#else
1014#define AssocQueryString AssocQueryStringA
1015#define AssocQueryStringByKey AssocQueryStringByKeyA
1016#define AssocQueryKey AssocQueryKeyA
1017#endif
1018
1019#endif // NO_SHLWAPI_REG
1020
1021/* Stream functions */
1022#ifndef NO_SHLWAPI_STREAM
1023
1024LWSTDAPI SHCreateStreamWrapper(LPBYTE,DWORD,DWORD,struct IStream**);
1025LWSTDAPI_(IStream *) SHCreateMemStream(_In_reads_bytes_opt_(cbInit) const BYTE *pInit, _In_ UINT cbInit);
1026LWSTDAPI SHCreateStreamOnFileEx(_In_ LPCWSTR, _In_ DWORD, _In_ DWORD, _In_ BOOL, _In_opt_ struct IStream*, _Outptr_ struct IStream**);
1027
1028LWSTDAPI SHCreateStreamOnFileA(_In_ LPCSTR, _In_ DWORD, _Outptr_ struct IStream**);
1029LWSTDAPI SHCreateStreamOnFileW(_In_ LPCWSTR, _In_ DWORD, _Outptr_ struct IStream**);
1030LWSTDAPI_(IStream *) SHOpenRegStreamA(_In_ HKEY, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_ DWORD);
1031LWSTDAPI_(IStream *) SHOpenRegStreamW(_In_ HKEY, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ DWORD);
1032LWSTDAPI_(IStream *) SHOpenRegStream2A(_In_ HKEY, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_ DWORD);
1033LWSTDAPI_(IStream *) SHOpenRegStream2W(_In_ HKEY, _In_opt_ LPCWSTR, _In_opt_ LPCWSTR, _In_ DWORD);
1034
1035#ifdef UNICODE
1036#define SHCreateStreamOnFile SHCreateStreamOnFileW
1037#define SHOpenRegStream SHOpenRegStream2W
1038#define SHOpenRegStream2 SHOpenRegStream2W
1039#else
1040#define SHCreateStreamOnFile SHCreateStreamOnFileA
1041#define SHOpenRegStream SHOpenRegStream2A
1042#define SHOpenRegStream2 SHOpenRegStream2A
1043#endif // UNICODE
1044
1045#ifndef _SHLWAPI_
1046LWSTDAPI IStream_Reset(_In_ struct IStream*);
1047#if !defined(IStream_Read) && defined(__cplusplus)
1048LWSTDAPI IStream_Read(_In_ struct IStream*, _Out_ void*, _In_ ULONG);
1049LWSTDAPI IStream_Write(_In_ struct IStream*, _In_ const void*, _In_ ULONG);
1050#endif
1051#endif // _SHLWAPI_
1052
1053#endif // NO_SHLWAPI_STREAM
1054
1055/* String functions */
1056#ifndef NO_SHLWAPI_STRFCNS
1057
1058#define STIF_DEFAULT 0x0L
1059#define STIF_SUPPORT_HEX 0x1L
1060
1061// These functions don't have -A and -W variants
1062LWSTDAPI SHLoadIndirectString(_In_ LPCWSTR, _Out_writes_(cchOutBuf) LPWSTR, _In_ UINT cchOutBuf, _Reserved_ PVOID*);
1063LWSTDAPI StrRetToBSTR(_Inout_ STRRET*, _In_opt_ PCUITEMID_CHILD, _Outptr_ BSTR*);
1064
1065// These functions only exist as -W variants and don't have suffixless definitions
1066LWSTDAPI_(DWORD) StrCatChainW(_Out_writes_(cchDst) LPWSTR, DWORD cchDst, DWORD, _In_ LPCWSTR);
1067LWSTDAPI_(int) StrCmpLogicalW(_In_ LPCWSTR, _In_ LPCWSTR);
1068#if (_WIN32_IE >= _WIN32_IE_IE60)
1069LWSTDAPI_(LPWSTR) StrStrNW(_In_ LPCWSTR, _In_ LPCWSTR, UINT);
1070LWSTDAPI_(LPWSTR) StrStrNIW(_In_ LPCWSTR, _In_ LPCWSTR, UINT);
1071#endif // _WIN32_IE_IE60
1072
1073// IntlStrEqWorker exists in both an -A and -W variant but doesn't have a suffixless definition
1074LWSTDAPI_(BOOL) IntlStrEqWorkerA(BOOL, _In_reads_(nChar) LPCSTR, _In_reads_(nChar) LPCSTR, int nChar);
1075LWSTDAPI_(BOOL) IntlStrEqWorkerW(BOOL, _In_reads_(nChar) LPCWSTR, _In_reads_(nChar) LPCWSTR, int nChar);
1076
1077// Normal -A and -W functions with a suffixless definition
1078LWSTDAPI_(BOOL) ChrCmpIA (WORD,WORD);
1079LWSTDAPI_(BOOL) ChrCmpIW (WCHAR,WCHAR);
1080#define IntlStrEqNA(s1,s2,n) IntlStrEqWorkerA(TRUE,s1,s2,n)
1081#define IntlStrEqNW(s1,s2,n) IntlStrEqWorkerW(TRUE,s1,s2,n)
1082#define IntlStrEqNIA(s1,s2,n) IntlStrEqWorkerA(FALSE,s1,s2,n)
1083#define IntlStrEqNIW(s1,s2,n) IntlStrEqWorkerW(FALSE,s1,s2,n)
1084LWSTDAPI SHStrDupA(_In_ LPCSTR psz, _Outptr_ WCHAR** ppwsz);
1085LWSTDAPI SHStrDupW(_In_ LPCWSTR psz, _Outptr_ WCHAR** ppwsz);
1086#define StrCatA lstrcatA
1087LWSTDAPI_(LPWSTR) StrCatW(_Inout_ LPWSTR, _In_ LPCWSTR);
1088LWSTDAPI_(LPSTR) StrCatBuffA(_Inout_updates_(cchDestBuffSize) LPSTR, _In_ LPCSTR, int cchDestBuffSize);
1089LWSTDAPI_(LPWSTR) StrCatBuffW(_Inout_updates_(cchDestBuffSize) LPWSTR, _In_ LPCWSTR, int cchDestBuffSize);
1090LWSTDAPI_(LPSTR) StrChrA(_In_ LPCSTR, WORD);
1091LWSTDAPI_(LPWSTR) StrChrW(_In_ LPCWSTR, WCHAR);
1092LWSTDAPI_(LPSTR) StrChrIA(_In_ LPCSTR, WORD);
1093LWSTDAPI_(LPWSTR) StrChrIW(_In_ LPCWSTR, WCHAR);
1094#define StrCmpA lstrcmpA
1095LWSTDAPI_(int) StrCmpW(_In_ LPCWSTR, _In_ LPCWSTR);
1096#define StrCmpIA lstrcmpiA
1097LWSTDAPI_(int) StrCmpIW(_In_ LPCWSTR, _In_ LPCWSTR);
1098LWSTDAPI_(int) StrCmpNA(_In_ LPCSTR, _In_ LPCSTR, INT);
1099LWSTDAPI_(int) StrCmpNW(_In_ LPCWSTR, _In_ LPCWSTR, INT);
1100LWSTDAPI_(int) StrCmpNIA(_In_ LPCSTR, _In_ LPCSTR, INT);
1101LWSTDAPI_(int) StrCmpNIW(_In_ LPCWSTR, _In_ LPCWSTR, INT);
1102#define StrCpyA lstrcpyA
1103LWSTDAPI_(LPWSTR) StrCpyW(_Out_ LPWSTR, _In_ LPCWSTR);
1104#define StrCpyNA lstrcpynA
1105LWSTDAPI_(LPWSTR) StrCpyNW(_Out_writes_(cchMax) LPWSTR, _In_ LPCWSTR, int cchMax);
1106LWSTDAPI_(int) StrCSpnA(_In_ LPCSTR, _In_ LPCSTR);
1107LWSTDAPI_(int) StrCSpnW(_In_ LPCWSTR, _In_ LPCWSTR);
1108LWSTDAPI_(int) StrCSpnIA(_In_ LPCSTR, _In_ LPCSTR);
1109LWSTDAPI_(int) StrCSpnIW(_In_ LPCWSTR, _In_ LPCWSTR);
1110LWSTDAPI_(LPSTR) StrDupA(_In_ LPCSTR);
1111LWSTDAPI_(LPWSTR) StrDupW(_In_ LPCWSTR);
1112LWSTDAPI_(LPSTR) StrFormatByteSize64A(LONGLONG, _Out_writes_(cchBuf) LPSTR, UINT cchBuf);
1113LWSTDAPI_(LPSTR) StrFormatByteSizeA(DWORD, _Out_writes_(cchBuf) LPSTR, UINT cchBuf);
1114LWSTDAPI_(LPWSTR) StrFormatByteSizeW(LONGLONG, _Out_writes_(cchBuf) LPWSTR, UINT cchBuf);
1115LWSTDAPI_(LPSTR) StrFormatKBSizeA(LONGLONG, _Out_writes_(cchBuf) LPSTR, UINT cchBuf);
1116LWSTDAPI_(LPWSTR) StrFormatKBSizeW(LONGLONG, _Out_writes_(cchBuf) LPWSTR, UINT cchBuf);
1117LWSTDAPI_(int) StrFromTimeIntervalA(_Out_writes_(cchMax) LPSTR, UINT cchMax, DWORD, int);
1118LWSTDAPI_(int) StrFromTimeIntervalW(_Out_writes_(cchMax) LPWSTR, UINT cchMax, DWORD, int);
1119#define StrIntlEqNA(a,b,c) StrIsIntlEqualA(TRUE,a,b,c)
1120#define StrIntlEqNW(a,b,c) StrIsIntlEqualW(TRUE,a,b,c)
1121#define StrIntlEqNIA(a,b,c) StrIsIntlEqualA(FALSE,a,b,c)
1122#define StrIntlEqNIW(a,b,c) StrIsIntlEqualW(FALSE,a,b,c)
1123LWSTDAPI_(BOOL) StrIsIntlEqualA(BOOL, _In_ LPCSTR, _In_ LPCSTR, int);
1124LWSTDAPI_(BOOL) StrIsIntlEqualW(BOOL, _In_ LPCWSTR, _In_ LPCWSTR, int);
1125LWSTDAPI_(LPSTR) StrNCatA(_Inout_updates_(cchMax) LPSTR, LPCSTR, int cchMax);
1126LWSTDAPI_(LPWSTR) StrNCatW(_Inout_updates_(cchMax) LPWSTR, LPCWSTR, int cchMax);
1127LWSTDAPI_(LPSTR) StrPBrkA(_In_ LPCSTR, _In_ LPCSTR);
1128LWSTDAPI_(LPWSTR) StrPBrkW(_In_ LPCWSTR, _In_ LPCWSTR);
1129LWSTDAPI_(LPSTR) StrRChrA(_In_ LPCSTR, _In_opt_ LPCSTR, WORD);
1130LWSTDAPI_(LPWSTR) StrRChrW(_In_ LPCWSTR, _In_opt_ LPCWSTR, WCHAR);
1131LWSTDAPI_(LPSTR) StrRChrIA(_In_ LPCSTR, _In_opt_ LPCSTR, WORD);
1132LWSTDAPI_(LPWSTR) StrRChrIW(_In_ LPCWSTR, _In_opt_ LPCWSTR, WCHAR);
1133LWSTDAPI_(LPSTR) StrRStrIA(_In_ LPCSTR, _In_opt_ LPCSTR, _In_ LPCSTR);
1134LWSTDAPI_(LPWSTR) StrRStrIW(_In_ LPCWSTR, _In_opt_ LPCWSTR, _In_ LPCWSTR);
1135LWSTDAPI StrRetToBufA(_Inout_ STRRET*, _In_opt_ PCUITEMID_CHILD, _Out_writes_(cchBuf) LPSTR, UINT cchBuf);
1136LWSTDAPI StrRetToBufW(_Inout_ STRRET*, _In_opt_ PCUITEMID_CHILD, _Out_writes_(cchBuf) LPWSTR, UINT cchBuf);
1137LWSTDAPI StrRetToStrA(_Inout_ STRRET*, _In_opt_ PCUITEMID_CHILD, _Outptr_ LPSTR*);
1138LWSTDAPI StrRetToStrW(_Inout_ STRRET*, _In_opt_ PCUITEMID_CHILD, _Outptr_ LPWSTR*);
1139LWSTDAPI_(int) StrSpnA(_In_ LPCSTR psz, _In_ LPCSTR pszSet);
1140LWSTDAPI_(int) StrSpnW(_In_ LPCWSTR psz, _In_ LPCWSTR pszSet);
1141LWSTDAPI_(LPSTR) StrStrA(_In_ LPCSTR pszFirst, _In_ LPCSTR pszSrch);
1142LWSTDAPI_(LPWSTR) StrStrW(_In_ LPCWSTR pszFirst, _In_ LPCWSTR pszSrch);
1143LWSTDAPI_(LPSTR) StrStrIA(_In_ LPCSTR pszFirst, _In_ LPCSTR pszSrch);
1144LWSTDAPI_(LPWSTR) StrStrIW(_In_ LPCWSTR pszFirst, _In_ LPCWSTR pszSrch);
1145LWSTDAPI_(int) StrToIntA(_In_ LPCSTR);
1146LWSTDAPI_(int) StrToIntW(_In_ LPCWSTR);
1147LWSTDAPI_(BOOL) StrToIntExA(_In_ LPCSTR, DWORD, _Out_ int*);
1148LWSTDAPI_(BOOL) StrToIntExW(_In_ LPCWSTR, DWORD, _Out_ int*);
1149LWSTDAPI_(BOOL) StrTrimA(_Inout_ LPSTR, _In_ LPCSTR);
1150LWSTDAPI_(BOOL) StrTrimW(_Inout_ LPWSTR, _In_ LPCWSTR);
1151LWSTDAPIV_(int) wnsprintfA(_Out_writes_(cchDest) LPSTR, _In_ INT cchDest, _In_ _Printf_format_string_ LPCSTR, ...);
1152LWSTDAPIV_(int) wnsprintfW(_Out_writes_(cchDest) LPWSTR, _In_ INT cchDest, _In_ _Printf_format_string_ LPCWSTR, ...);
1153LWSTDAPI_(int) wvnsprintfA(_Out_writes_(cchDest) LPSTR, _In_ INT cchDest, _In_ _Printf_format_string_ LPCSTR, _In_ va_list);
1154LWSTDAPI_(int) wvnsprintfW(_Out_writes_(cchDest) LPWSTR, _In_ INT cchDest, _In_ _Printf_format_string_ LPCWSTR, _In_ va_list);
1155#if (_WIN32_IE >= _WIN32_IE_IE60)
1156LWSTDAPI_(BOOL) StrToInt64ExA(_In_ LPCSTR, DWORD, _Out_ LONGLONG*);
1157LWSTDAPI_(BOOL) StrToInt64ExW(_In_ LPCWSTR, DWORD, _Out_ LONGLONG*);
1158#endif // _WIN32_IE_IE60
1159#if (_WIN32_IE >= _WIN32_IE_IE60SP2)
1160LWSTDAPI_(BOOL) IsCharSpaceA(CHAR);
1161LWSTDAPI_(BOOL) IsCharSpaceW(WCHAR);
1162#endif // _WIN32_IE_IE60SP2
1163
1164
1165#ifdef UNICODE
1166#define ChrCmpI ChrCmpIW
1167#define IntlStrEqN IntlStrEqNW
1168#define IntlStrEqNI IntlStrEqNIW
1169#define SHStrDup SHStrDupW
1170#define StrCat StrCatW
1171#define StrCatBuff StrCatBuffW
1172#define StrChr StrChrW
1173#define StrChrI StrChrIW
1174#define StrCmp StrCmpW
1175#define StrCmpI StrCmpIW
1176#define StrCmpN StrCmpNW
1177#define StrCmpNI StrCmpNIW
1178#define StrCpy StrCpyW
1179#define StrCpyN StrCpyNW
1180#define StrCSpn StrCSpnW
1181#define StrCSpnI StrCSpnIW
1182#define StrDup StrDupW
1183#define StrFormatByteSize StrFormatByteSizeW
1184#define StrFormatByteSize64 StrFormatByteSizeW
1185#define StrFormatKBSize StrFormatKBSizeW
1186#define StrFromTimeInterval StrFromTimeIntervalW
1187#define StrIntlEqN StrIntlEqNW
1188#define StrIntlEqNI StrIntlEqNIW
1189#define StrIsIntlEqual StrIsIntlEqualW
1190#define StrNCat StrNCatW
1191#define StrPBrk StrPBrkW
1192#define StrRChr StrRChrW
1193#define StrRChrI StrRChrIW
1194#define StrRStrI StrRStrIW
1195#define StrRetToBuf StrRetToBufW
1196#define StrRetToStr StrRetToStrW
1197#define StrSpn StrSpnW
1198#define StrStr StrStrW
1199#define StrStrI StrStrIW
1200#define StrToInt StrToIntW
1201#define StrToIntEx StrToIntExW
1202#define StrTrim StrTrimW
1203#define wnsprintf wnsprintfW
1204#define wvnsprintf wvnsprintfW
1205#if (_WIN32_IE >= _WIN32_IE_IE60)
1206#define StrToInt64Ex StrToInt64ExW
1207#endif // _WIN32_IE_IE60
1208#if (_WIN32_IE >= _WIN32_IE_IE60SP2)
1209#define IsCharSpace IsCharSpaceW
1210#endif // _WIN32_IE_IE60SP2
1211#else
1212#define ChrCmpI ChrCmpIA
1213#define IntlStrEqN IntlStrEqNA
1214#define IntlStrEqNI IntlStrEqNIA
1215#define SHStrDup SHStrDupA
1216#define StrCat StrCatA
1217#define StrCatBuff StrCatBuffA
1218#define StrChr StrChrA
1219#define StrChrI StrChrIA
1220#define StrCmp StrCmpA
1221#define StrCmpI StrCmpIA
1222#define StrCmpN StrCmpNA
1223#define StrCmpNI StrCmpNIA
1224#define StrCpy StrCpyA
1225#define StrCpyN StrCpyNA
1226#define StrCSpn StrCSpnA
1227#define StrCSpnI StrCSpnIA
1228#define StrDup StrDupA
1229#define StrFormatByteSize StrFormatByteSizeA
1230#define StrFormatByteSize64 StrFormatByteSize64A
1231#define StrFormatKBSize StrFormatKBSizeA
1232#define StrFromTimeInterval StrFromTimeIntervalA
1233#define StrIntlEqN StrIntlEqNA
1234#define StrIntlEqNI StrIntlEqNIA
1235#define StrIsIntlEqual StrIsIntlEqualA
1236#define StrNCat StrNCatA
1237#define StrPBrk StrPBrkA
1238#define StrRChr StrRChrA
1239#define StrRChrI StrRChrIA
1240#define StrRStrI StrRStrIA
1241#define StrRetToBuf StrRetToBufA
1242#define StrRetToStr StrRetToStrA
1243#define StrSpn StrSpnA
1244#define StrStr StrStrA
1245#define StrStrI StrStrIA
1246#define StrToInt StrToIntA
1247#define StrToIntEx StrToIntExA
1248#define StrTrim StrTrimA
1249#define wnsprintf wnsprintfA
1250#define wvnsprintf wvnsprintfA
1251#if (_WIN32_IE >= _WIN32_IE_IE60)
1252#define StrToInt64Ex StrToInt64ExA
1253#endif // _WIN32_IE_IE60
1254#if (_WIN32_IE >= _WIN32_IE_IE60SP2)
1255#define IsCharSpace IsCharSpaceA
1256#endif // _WIN32_IE_IE60SP2
1257#endif // UNICODE
1258
1259#if (NTDDI_VERSION >= NTDDI_VISTASP1)
1260typedef int SFBS_FLAGS;
1261
1262enum tagSFBS_FLAGS
1263{
1264 SFBS_FLAGS_ROUND_TO_NEAREST_DISPLAYED_DIGIT = 0x0001,
1265 SFBS_FLAGS_TRUNCATE_UNDISPLAYED_DECIMAL_DIGITS = 0x0002
1266};
1267
1268LWSTDAPI StrFormatByteSizeEx(ULONGLONG ull, SFBS_FLAGS flags, _Out_writes_(cchBuf) PWSTR pszBuf, _In_range_(>,0) UINT cchBuf);
1269#endif // NTDDI_VISTASP1
1270
1271#endif // NO_SHLWAPI_STRFCNS
1272
1273#ifdef __cplusplus
1274}
1275#endif // __cplusplus
1276
1277#include <poppack.h>
1278
1279#endif // NOSHLWAPI
1280#endif // _INC_SHLWAPI