ReactOS 0.4.17-dev-684-ga6524ef
querysrc.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Shell
3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later)
4 * PURPOSE: Implement QuerySourceCreateFromKey
5 * COPYRIGHT: Copyright 2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "precomp.h"
9#include <shlwapi.h>
10#include <shlwapi_undoc.h>
11#include <shlobj_undoc.h>
12#include <shlguid_undoc.h>
13#include <new>
14#include "evalcmd.h" // SHELL32_CAssocElement_Version
15
17
19
20static HRESULT SHAllocBlob(ULONG cbData, const BYTE *pbData, FLAGGED_BYTE_BLOB** ppBlob)
21{
22 FLAGGED_BYTE_BLOB* pBlob =
23 (FLAGGED_BYTE_BLOB*)CoTaskMemAlloc(sizeof(FLAGGED_BYTE_BLOB) + cbData);
24 if (!pBlob)
25 return E_OUTOFMEMORY;
26
27 pBlob->clSize = cbData;
28 if (pbData)
29 CopyMemory(pBlob->abData, pbData, cbData);
30
31 *ppBlob = pBlob;
32 return S_OK;
33}
34
35class CRegistrySource;
36
37/******************************************************************************
38 * CRegistryEnumBase
39 */
41{
42protected:
48 WCHAR m_szBuf[64] = {};
50
51 BOOL _Next(PWSTR *ppwsz);
52 virtual BOOL _RegNext(DWORD dwIndex) = 0;
53 virtual DWORD _MaxLen() = 0;
54
55public:
56 virtual ~CRegistryEnumBase();
57
59
60 // IUnknown methods
61 STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) override;
64 // IEnumString methods
65 STDMETHODIMP Next(ULONG celt, LPWSTR* rgelt, ULONG* pceltFetched) override;
66 STDMETHODIMP Skip(ULONG celt) override;
67 STDMETHODIMP Reset() override;
68 STDMETHODIMP Clone(IEnumString ** ppenum) override;
69};
70
71/******************************************************************************
72 * CRegistryEnumValues
73 */
75{
76public:
77 BOOL _RegNext(DWORD dwIndex) override;
78 DWORD _MaxLen() override;
79};
80
81/******************************************************************************
82 * CRegistryEnumKeys
83 */
85{
86public:
87 BOOL _RegNext(DWORD dwIndex) override;
88 DWORD _MaxLen() override;
89};
90
91/******************************************************************************
92 * CRegistrySource
93 */
95 : public IQuerySourceOld, public IQuerySource
96 , public IObjectWithRegistryKeyOld, public IObjectWithRegistryKey
97{
100
101 template<WORD Ver> static bool ExposeFeature()
102 {
104 return true;
106 return true;
107
110 if (Ver >= _WIN32_WINNT_VISTA)
111 return W32Nt >= _WIN32_WINNT_VISTA;
112#if 0
113 if (Ver < _WIN32_WINNT_VISTA)
114 return W32Nt < _WIN32_WINNT_VISTA;
115 return false;
116#else
117 return Ver < _WIN32_WINNT_VISTA; // FIXME: The apitest currently only uses the NT5 interface
118#endif
119 }
120
121public:
122 virtual ~CRegistrySource();
123
125
126 // IUnknown methods
127 STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) override;
130 // IQuerySource methods
131 STDMETHODIMP EnumValues(IEnumString **ppEnum) override;
132 STDMETHODIMP EnumSources(IEnumString **ppEnum) override;
133 STDMETHODIMP QueryValueString(PCWSTR keyName, PCWSTR valueName, PWSTR *ppszValue) override;
134 STDMETHODIMP QueryValueDword(PCWSTR keyName, PCWSTR valueName, DWORD *pdwValue) override;
135 STDMETHODIMP QueryValueExists(PCWSTR keyName, PCWSTR valueName) override;
136 STDMETHODIMP QueryValueDirect(PCWSTR keyName, PCWSTR valueName,
137 FLAGGED_BYTE_BLOB **ppBlob) override;
138 STDMETHODIMP OpenSource(PCWSTR keyName, BOOL bCreate, IQuerySourceOld **ppSource) override;
139 STDMETHODIMP SetValueDirect(PCWSTR keyName, PCWSTR valueName, DWORD dwType, DWORD cbData,
140 LPCVOID pvData) override;
141 STDMETHOD(QueryValueGuid)(PCWSTR keyName, PCWSTR valueName, GUID *guid) override;
142 STDMETHOD(OpenSource)(PCWSTR keyName, IQuerySource **ppSource) override;
143 // IObjectWithRegistryKey methods
144 STDMETHODIMP SetKey(HKEY hKey) override;
145 STDMETHODIMP GetKey(HKEY *phKey) override;
146 STDMETHODIMP GetKey(REGSAM samDesired, HKEY *phKey) override;
147};
148
149/******************************************************************************/
150
152{
153 if (m_pszName && m_pszName != m_szBuf)
155 if (m_pSource)
156 m_pSource->Release();
157}
158
160{
161 m_hKey = hKey;
162 m_pSource = pSource;
163 m_pSource->AddRef();
166 {
168 }
169 else
170 {
173 }
174 return m_pszName ? S_OK : E_OUTOFMEMORY;
175}
176
178{
179 return _RegNext(m_dwIndex) && SUCCEEDED(SHStrDupW(m_pszName, ppwsz));
180}
181
183{
184 if (!ppv)
185 return E_POINTER;
186
187 if (riid == IID_IEnumString)
188 {
189 *ppv = static_cast<IEnumString*>(this);
190 AddRef();
191 return S_OK;
192 }
193 return E_NOINTERFACE;
194}
195
197{
198 return ::InterlockedIncrement(&m_cRefs);
199}
200
202{
204 if (!refs)
205 delete this;
206 return refs;
207}
208
210{
211 if (!rgelt || (celt > 1 && !pceltFetched))
212 return E_INVALIDARG;
213
214 ULONG cFetched = 0;
215
216 while (cFetched < celt)
217 {
218 if (!_Next(&rgelt[cFetched]))
219 break;
220 ++m_dwIndex;
221 ++cFetched;
222 }
223
224 if (pceltFetched)
225 *pceltFetched = cFetched;
226
227 return (cFetched == celt) ? S_OK : S_FALSE;
228}
229
231{
232 return E_NOTIMPL;
233}
234
236{
237 m_dwIndex = 0;
238 return S_OK;
239}
240
242{
243 return E_NOTIMPL;
244}
245
246/******************************************************************************/
247
249{
251}
252
254{
255 DWORD cchKeyNameMax = 0;
256 RegQueryInfoKeyW(m_hKey, NULL, NULL, NULL, NULL, &cchKeyNameMax, NULL, NULL, NULL, NULL,
257 NULL, NULL);
258 return cchKeyNameMax + 1; // Including NUL
259}
260
261/******************************************************************************/
262
264{
265 DWORD cchValueNameMax = m_cchNameMax;
266 return RegEnumValueW(m_hKey, dwIndex, m_pszName, &cchValueNameMax, NULL,
268}
269
271{
272 DWORD cchValueNameMax = 0;
273 RegQueryInfoKeyW(m_hKey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &cchValueNameMax,
274 NULL, NULL, NULL);
275 return cchValueNameMax + 1; // Including NUL
276}
277
278/******************************************************************************/
279
281{
282 if (m_hKey)
284}
285
287{
289 if (bCreate)
291 else
293
295}
296
298{
299 if (!ppvObject)
300 return E_POINTER;
301
302 if (riid == IID_IUnknown)
303 {
304 *ppvObject = static_cast<IQuerySourceOld*>(this);
305 AddRef();
306 return S_OK;
307 }
308
309 if (ExposeFeature<_WIN32_WINNT_WINXP>())
310 {
311 if (riid == IID_IQuerySourceOld)
312 {
313 *ppvObject = static_cast<IQuerySourceOld*>(this);
314 AddRef();
315 return S_OK;
316 }
317
318 if (riid == IID_IObjectWithRegistryKeyOld)
319 {
320 *ppvObject = static_cast<IObjectWithRegistryKeyOld*>(this);
321 AddRef();
322 return S_OK;
323 }
324 }
325
326 if (ExposeFeature<_WIN32_WINNT_VISTA>())
327 {
328 if (riid == IID_IQuerySource)
329 {
330 *ppvObject = static_cast<IQuerySource*>(this);
331 AddRef();
332 return S_OK;
333 }
334
335 if (riid == IID_IObjectWithRegistryKey)
336 {
337 *ppvObject = static_cast<IObjectWithRegistryKey*>(this);
338 AddRef();
339 return S_OK;
340 }
341 }
342
343 *ppvObject = NULL;
344 return E_NOINTERFACE;
345}
346
347STDMETHODIMP_(ULONG) CRegistrySource::AddRef()
348{
349 return ::InterlockedIncrement(&m_cRefs);
350}
351
352STDMETHODIMP_(ULONG) CRegistrySource::Release()
353{
355 if (!refs)
356 delete this;
357 return refs;
358}
359
361{
362 CRegistryEnumValues* pEnum = new(std::nothrow) CRegistryEnumValues();
363 if (!pEnum)
364 return E_OUTOFMEMORY;
365 HRESULT hr = pEnum->Init(m_hKey, this);
366 if (FAILED(hr))
367 {
368 pEnum->Release();
369 pEnum = NULL;
370 }
371 *ppEnum = pEnum;
372 return pEnum ? S_OK : E_OUTOFMEMORY;
373}
374
376{
377 CRegistryEnumKeys* pEnum = new(std::nothrow) CRegistryEnumKeys();
378 if (!pEnum)
379 return E_OUTOFMEMORY;
380 HRESULT hr = pEnum->Init(m_hKey, this);
381 if (FAILED(hr))
382 {
383 pEnum->Release();
384 pEnum = NULL;
385 }
386 *ppEnum = pEnum;
387 return pEnum ? S_OK : E_OUTOFMEMORY;
388}
389
391 PCWSTR keyName,
392 PCWSTR valueName,
393 PWSTR *ppszValue)
394{
395 *ppszValue = NULL;
396
397 WCHAR szData[128];
398 DWORD dwType = REG_NONE, cbData = sizeof(szData);
399 LSTATUS error = SHGetValueW(m_hKey, keyName, valueName, &dwType, szData, &cbData);
400 if (error == ERROR_SUCCESS)
401 {
402 if (dwType != REG_SZ)
403 return E_DATATYPE_MISMATCH;
404 if (!valueName && !szData[0])
406 return SHStrDupW(szData, ppszValue);
407 }
408
409 if (error != ERROR_MORE_DATA)
411
412 *ppszValue = (PWSTR)CoTaskMemAlloc(cbData);
413 if (!*ppszValue)
414 return E_OUTOFMEMORY;
415
416 HRESULT hr = S_OK;
417 error = SHGetValueW(m_hKey, keyName, valueName, &dwType, *ppszValue, &cbData);
418 if (error)
419 {
420 CoTaskMemFree(*ppszValue);
421 *ppszValue = NULL;
423 }
424
425 if (SUCCEEDED(hr) && dwType != REG_SZ)
426 {
427 CoTaskMemFree(*ppszValue);
428 *ppszValue = NULL;
430 }
431
432 return hr;
433}
434
436{
437 DWORD dwType, cbValue = sizeof(*pdwValue);
438 LSTATUS error = SHGetValueW(m_hKey, keyName, valueName, &dwType, pdwValue, &cbValue);
439 if (error)
441 if (dwType != REG_DWORD)
442 return E_DATATYPE_MISMATCH;
443 return S_OK;
444}
445
447{
448 PWSTR str;
449 HRESULT hr = QueryValueString(keyName, valueName, &str);
450 if (FAILED(hr))
451 return hr;
454 return hr;
455}
456
458{
459 LSTATUS error = SHGetValueW(m_hKey, keyName, valueName, NULL, NULL, NULL);
460 if (error)
462 return S_OK;
463}
464
466 PCWSTR keyName,
467 PCWSTR valueName,
468 FLAGGED_BYTE_BLOB **ppBlob)
469{
470 HRESULT hr = E_FAIL;
471 HKEY hKey = m_hKey;
472 DWORD dwType = REG_NONE;
473 DWORD cbData = 256;
474 BYTE abData[256];
475
476 *ppBlob = NULL;
477
478 if (keyName && *keyName &&
480 {
481 return E_FAIL;
482 }
483
484 LSTATUS error = RegQueryValueExW(hKey, valueName, NULL, &dwType, abData, &cbData);
485 if (error == ERROR_SUCCESS)
486 {
487 hr = SHAllocBlob(cbData, abData, ppBlob);
488 }
489 else if (error == ERROR_MORE_DATA)
490 {
491 hr = SHAllocBlob(cbData, NULL, ppBlob);
492 if (SUCCEEDED(hr))
493 {
494 error = RegQueryValueExW(hKey, valueName, NULL, &dwType, (*ppBlob)->abData, &cbData);
495 if (error != ERROR_SUCCESS)
496 {
497 CoTaskMemFree(*ppBlob);
498 *ppBlob = NULL;
500 }
501 }
502 }
503 else
504 {
506 }
507
508 if (hKey != m_hKey)
510
511 if (SUCCEEDED(hr))
512 (*ppBlob)->fFlags = dwType;
513
514 return hr;
515}
516
517STDMETHODIMP CRegistrySource::OpenSource(PCWSTR keyName, BOOL bCreate, IQuerySourceOld **ppSource)
518{
519 return QuerySourceCreateFromKey(m_hKey, keyName, bCreate, IID_IQuerySourceOld, (PVOID*)ppSource);
520}
521
522STDMETHODIMP CRegistrySource::OpenSource(PCWSTR keyName, IQuerySource **ppSource)
523{
524 return QuerySourceCreateFromKey(m_hKey, keyName, TRUE, IID_IQuerySource, (PVOID*)ppSource);
525}
526
528 PCWSTR keyName,
529 PCWSTR valueName,
530 DWORD dwType,
533{
534 LSTATUS error = SHSetValueW(m_hKey, keyName, valueName, dwType, pvData, cbData);
535 if (error)
537 return S_OK;
538}
539
541{
542 if (m_hKey)
543 return E_UNEXPECTED;
544
546 return m_hKey ? S_OK : E_UNEXPECTED;
547}
548
550{
551 if (!m_hKey)
552 return E_UNEXPECTED;
553
554 *phKey = SHRegDuplicateHKey(m_hKey);
555 if (!*phKey)
556 return E_UNEXPECTED;
557
558 return S_OK;
559}
560
562{
563 if (!m_hKey || !*phKey)
564 return E_UNEXPECTED;
565
566 LONG err = RegOpenKeyExW(m_hKey, NULL, 0, samDesired, phKey);
567 return HRESULT_FROM_WIN32(err);
568}
569
570/**************************************************************************
571 * QuerySourceCreateFromKey (SHLWAPI.544)
572 *
573 * @see https://www.geoffchappell.com/studies/windows/shell/shlwapi/api/regsrc/createfromkey.htm
574 */
578 _In_ HKEY hKey,
579 _In_opt_ PCWSTR lpSubKey,
583{
584 *ppv = NULL;
585
586 CRegistrySource* pRS = new(std::nothrow) CRegistrySource();
587 if (!pRS)
588 return E_OUTOFMEMORY;
589
590 HRESULT hr = pRS->Init(hKey, lpSubKey, bCreate);
591 if (SUCCEEDED(hr))
592 hr = pRS->QueryInterface(riid, ppv);
593
594 pRS->Release();
595 return hr;
596}
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define EXTERN_C
Definition: basetyps.h:12
#define STDMETHODIMP
Definition: basetyps.h:43
#define STDMETHOD(m)
Definition: basetyps.h:62
#define STDMETHODIMP_(t)
Definition: basetyps.h:44
const GUID IID_IUnknown
#define RegCloseKey(hKey)
Definition: registry.h:49
_In_ BOOLEAN Release
Definition: cdrom.h:920
HRESULT Init(HKEY hKey, CRegistrySource *pSource)
Definition: querysrc.cpp:159
STDMETHODIMP Skip(ULONG celt) override
Definition: querysrc.cpp:230
BOOL _Next(PWSTR *ppwsz)
Definition: querysrc.cpp:177
STDMETHODIMP Reset() override
Definition: querysrc.cpp:235
WCHAR m_szBuf[64]
Definition: querysrc.cpp:48
STDMETHODIMP Clone(IEnumString **ppenum) override
Definition: querysrc.cpp:241
CRegistrySource * m_pSource
Definition: querysrc.cpp:45
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) override
Definition: querysrc.cpp:182
virtual BOOL _RegNext(DWORD dwIndex)=0
STDMETHODIMP_(ULONG) Release() override
STDMETHODIMP_(ULONG) AddRef() override
virtual DWORD _MaxLen()=0
virtual ~CRegistryEnumBase()
Definition: querysrc.cpp:151
STDMETHODIMP Next(ULONG celt, LPWSTR *rgelt, ULONG *pceltFetched) override
Definition: querysrc.cpp:209
DWORD _MaxLen() override
Definition: querysrc.cpp:253
BOOL _RegNext(DWORD dwIndex) override
Definition: querysrc.cpp:248
BOOL _RegNext(DWORD dwIndex) override
Definition: querysrc.cpp:263
DWORD _MaxLen() override
Definition: querysrc.cpp:270
STDMETHODIMP QueryValueDirect(PCWSTR keyName, PCWSTR valueName, FLAGGED_BYTE_BLOB **ppBlob) override
Definition: querysrc.cpp:465
STDMETHODIMP QueryValueExists(PCWSTR keyName, PCWSTR valueName) override
Definition: querysrc.cpp:457
STDMETHOD() QueryValueGuid(PCWSTR keyName, PCWSTR valueName, GUID *guid) override
Definition: querysrc.cpp:446
STDMETHODIMP OpenSource(PCWSTR keyName, BOOL bCreate, IQuerySourceOld **ppSource) override
Definition: querysrc.cpp:517
STDMETHODIMP SetKey(HKEY hKey) override
Definition: querysrc.cpp:540
HRESULT Init(HKEY hKey, PCWSTR pszSubKey, BOOL bCreate)
Definition: querysrc.cpp:286
STDMETHODIMP EnumSources(IEnumString **ppEnum) override
Definition: querysrc.cpp:375
STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject) override
Definition: querysrc.cpp:297
STDMETHODIMP QueryValueString(PCWSTR keyName, PCWSTR valueName, PWSTR *ppszValue) override
Definition: querysrc.cpp:390
virtual ~CRegistrySource()
Definition: querysrc.cpp:280
STDMETHODIMP QueryValueDword(PCWSTR keyName, PCWSTR valueName, DWORD *pdwValue) override
Definition: querysrc.cpp:435
STDMETHODIMP_(ULONG) Release() override
static bool ExposeFeature()
Definition: querysrc.cpp:101
STDMETHODIMP SetValueDirect(PCWSTR keyName, PCWSTR valueName, DWORD dwType, DWORD cbData, LPCVOID pvData) override
Definition: querysrc.cpp:527
STDMETHODIMP GetKey(HKEY *phKey) override
Definition: querysrc.cpp:549
STDMETHODIMP_(ULONG) AddRef() override
STDMETHODIMP EnumValues(IEnumString **ppEnum) override
Definition: querysrc.cpp:360
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegEnumValueW(_In_ HKEY hKey, _In_ DWORD index, _Out_ LPWSTR value, _Inout_ PDWORD val_count, _Reserved_ PDWORD reserved, _Out_opt_ PDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ PDWORD count)
Definition: reg.c:2830
LONG WINAPI RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved, LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen, LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen, LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Definition: reg.c:3662
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2393
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
GUID guid
Definition: version.c:147
DWORD WINAPI GetVersion(void)
Definition: version.c:1458
HRESULT WINAPI SHStrDupW(const WCHAR *src, WCHAR **dest)
Definition: main.c:1692
DWORD WINAPI SHGetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD *type, void *data, DWORD *data_len)
Definition: main.c:2222
DWORD WINAPI SHSetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD type, const void *data, DWORD data_len)
Definition: main.c:2292
HKEY WINAPI SHRegDuplicateHKey(HKEY hKey)
Definition: main.c:1828
#define SHELL32_CAssocElement_Version
Definition: evalcmd.h:23
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLuint GLenum GLsizei GLsizei GLint GLint GLboolean packed
Definition: glext.h:9271
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
ULONG AddRef()
ULONG Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define LOBYTE(W)
Definition: jmemdos.c:487
#define HIBYTE(W)
Definition: jmemdos.c:486
#define REG_SZ
Definition: layer.c:22
#define LPTR
Definition: minwinbase.h:93
#define CopyMemory
Definition: minwinbase.h:29
CONST void * LPCVOID
Definition: minwindef.h:164
#define error(str)
Definition: mkdosfs.c:1605
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static ULONG WINAPI AddRef(IStream *iface)
Definition: clist.c:83
_In_ LPWSTR _In_ DWORD _In_ LPCVOID pvData
Definition: netsh.h:116
#define _Outptr_
Definition: no_sal2.h:262
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define KEY_READ
Definition: nt_native.h:1026
#define REG_NONE
Definition: nt_native.h:1495
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83
const GUID IID_IEnumString
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define REFIID
Definition: guiddef.h:118
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
Definition: shlwapi.h:761
_In_opt_ LPCSTR pszSubKey
Definition: shlwapi.h:783
EXTERN_C HRESULT WINAPI QuerySourceCreateFromKey(_In_ HKEY hKey, _In_opt_ PCWSTR lpSubKey, _In_ BOOL bCreate, _In_ REFIID riid, _Outptr_ PVOID *ppv)
Definition: querysrc.cpp:577
EXTERN_C BOOL WINAPI GUIDFromStringW(LPCWSTR idstr, CLSID *id)
Definition: ordinal.c:2542
static HRESULT SHAllocBlob(ULONG cbData, const BYTE *pbData, FLAGGED_BYTE_BLOB **ppBlob)
Definition: querysrc.cpp:20
#define err(...)
const WCHAR * str
#define REG_DWORD
Definition: sdbapi.c:615
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1536
#define E_DATATYPE_MISMATCH
#define _countof(array)
Definition: sndvol32.h:70
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define MAKEWORD(a, b)
Definition: typedefs.h:248
uint16_t * LPWSTR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_UNEXPECTED
Definition: winerror.h:3528
#define E_POINTER
Definition: winerror.h:3480
ACCESS_MASK REGSAM
Definition: winreg.h:76
unsigned char BYTE
Definition: xxhash.c:193