ReactOS 0.4.17-dev-357-ga8f14ff
CRegPropertyBag Class Reference
Inheritance diagram for CRegPropertyBag:
Collaboration diagram for CRegPropertyBag:

Public Member Functions

 CRegPropertyBag (DWORD dwMode)
 
 ~CRegPropertyBag () override
 
HRESULT Init (HKEY hKey, LPCWSTR lpSubKey)
 
STDMETHODIMP Read (_In_z_ LPCWSTR pszPropName, _Inout_ VARIANT *pvari, _Inout_opt_ IErrorLog *pErrorLog) override
 
STDMETHODIMP Write (_In_z_ LPCWSTR pszPropName, _In_ VARIANT *pvari) override
 
- Public Member Functions inherited from CBasePropertyBag
 CBasePropertyBag (DWORD dwMode)
 
virtual ~CBasePropertyBag ()
 
STDMETHODIMP QueryInterface (REFIID riid, void **ppvObject) override
 
 STDMETHODIMP_ (ULONG) AddRef() override
 
 STDMETHODIMP_ (ULONG) Release() override
 
- Public Member Functions inherited from IPropertyBag
HRESULT Read ([in] LPCOLESTR pszPropName, [in, out] VARIANT *pVar, [in] IErrorLog *pErrorLog)
 
HRESULT RemoteRead ([in] LPCOLESTR pszPropName, [out] VARIANT *pVar, [in] IErrorLog *pErrorLog, [in] DWORD varType, [in] IUnknown *pUnkObj)
 
HRESULT Write ([in] LPCOLESTR pszPropName, [in] VARIANT *pVar)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 

Protected Member Functions

HRESULT _ReadDword (LPCWSTR pszPropName, VARIANT *pvari)
 
HRESULT _ReadString (LPCWSTR pszPropName, VARIANTARG *pvarg, UINT len)
 
HRESULT _ReadBinary (LPCWSTR pszPropName, VARIANT *pvari, VARTYPE vt, DWORD uBytes)
 
HRESULT _ReadStream (VARIANT *pvari, BYTE *pInit, UINT cbInit)
 
HRESULT _CopyStreamIntoBuff (IStream *pStream, void *pv, ULONG cb)
 
HRESULT _GetStreamSize (IStream *pStream, LPDWORD pcbSize)
 
HRESULT _WriteStream (LPCWSTR pszPropName, IStream *pStream)
 

Protected Attributes

HKEY m_hKey
 
- Protected Attributes inherited from CBasePropertyBag
LONG m_cRefs
 
DWORD m_dwMode
 

Additional Inherited Members

- Public Types inherited from IPropertyBag
typedef IPropertyBagLPPROPERTYBAG
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 

Detailed Description

Definition at line 273 of file propbag.cpp.

Constructor & Destructor Documentation

◆ CRegPropertyBag()

CRegPropertyBag::CRegPropertyBag ( DWORD  dwMode)
inline

Definition at line 287 of file propbag.cpp.

288 : CBasePropertyBag(dwMode)
289 , m_hKey(NULL)
290 {
291 }
#define NULL
Definition: types.h:112

◆ ~CRegPropertyBag()

CRegPropertyBag::~CRegPropertyBag ( )
inlineoverride

Definition at line 293 of file propbag.cpp.

294 {
295 if (m_hKey)
297 }
#define RegCloseKey(hKey)
Definition: registry.h:49

Member Function Documentation

◆ _CopyStreamIntoBuff()

HRESULT CRegPropertyBag::_CopyStreamIntoBuff ( IStream pStream,
void pv,
ULONG  cb 
)
protected

Definition at line 394 of file propbag.cpp.

395{
397 li.QuadPart = 0;
398 HRESULT hr = pStream->Seek(li, 0, NULL);
399 if (FAILED(hr))
400 return hr;
401 return pStream->Read(pv, cb, NULL);
402}
HRESULT hr
Definition: delayimp.cpp:582
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
LARGE_INTEGER li
Definition: fxtimerapi.cpp:235
HRESULT Read([out, size_is(cb), length_is(*pcbRead)] void *pv, [in] ULONG cb, [out] ULONG *pcbRead)
HRESULT Seek([in] LARGE_INTEGER dlibMove, [in] DWORD dwOrigin, [out] ULARGE_INTEGER *plibNewPosition)
#define FAILED(hr)
Definition: intsafe.h:51
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by _WriteStream().

◆ _GetStreamSize()

HRESULT CRegPropertyBag::_GetStreamSize ( IStream pStream,
LPDWORD  pcbSize 
)
protected

Definition at line 404 of file propbag.cpp.

405{
406 *pcbSize = 0;
407
409 HRESULT hr = IStream_Size(pStream, &ui);
410 if (FAILED(hr))
411 return hr;
412
413 if (ui.DUMMYSTRUCTNAME.HighPart)
414 return E_FAIL; /* 64-bit value is not supported */
415
416 *pcbSize = ui.DUMMYSTRUCTNAME.LowPart;
417 return hr;
418}
#define E_FAIL
Definition: ddrawi.h:102
HRESULT WINAPI IStream_Size(IStream *stream, ULARGE_INTEGER *size)
Definition: main.c:120
UINT ui
Definition: oleauto.h:49

Referenced by _WriteStream().

◆ _ReadBinary()

HRESULT CRegPropertyBag::_ReadBinary ( LPCWSTR  pszPropName,
VARIANT pvari,
VARTYPE  vt,
DWORD  uBytes 
)
protected

Definition at line 369 of file propbag.cpp.

374{
375 HRESULT hr = E_FAIL;
376 if (vt != VT_UNKNOWN || uBytes < sizeof(GUID))
377 return hr;
378
379 LPBYTE pbData = (LPBYTE)::LocalAlloc(LMEM_ZEROINIT, uBytes);
380 if (!pbData)
381 return hr;
382
383 if (!SHGetValueW(m_hKey, NULL, pszPropName, NULL, pbData, &uBytes) &&
384 memcmp(&GUID_NULL, pbData, sizeof(GUID)) == 0)
385 {
386 hr = _ReadStream(pvari, pbData + sizeof(GUID), uBytes - sizeof(GUID));
387 }
388
389 ::LocalFree(pbData);
390
391 return hr;
392}
HRESULT _ReadStream(VARIANT *pvari, BYTE *pInit, UINT cbInit)
Definition: propbag.cpp:358
@ VT_UNKNOWN
Definition: compat.h:2308
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
DWORD WINAPI SHGetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD *type, void *data, DWORD *data_len)
Definition: main.c:2222
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:1390
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
#define GUID_NULL
Definition: ks.h:106
#define LMEM_ZEROINIT
Definition: minwinbase.h:85
unsigned char * LPBYTE
Definition: typedefs.h:53

Referenced by Read().

◆ _ReadDword()

HRESULT CRegPropertyBag::_ReadDword ( LPCWSTR  pszPropName,
VARIANT pvari 
)
protected

Definition at line 329 of file propbag.cpp.

330{
331 DWORD cbData = sizeof(DWORD);
332 LONG error = SHGetValueW(m_hKey, NULL, pszPropName, NULL, &V_UI4(pvari), &cbData);
333 if (error)
334 return E_FAIL;
335
336 V_VT(pvari) = VT_UI4;
337 return S_OK;
338}
@ VT_UI4
Definition: compat.h:2313
unsigned long DWORD
Definition: ntddk_ex.h:95
#define S_OK
Definition: intsafe.h:52
#define error(str)
Definition: mkdosfs.c:1605
#define DWORD
Definition: nt_native.h:44
#define V_VT(A)
Definition: oleauto.h:211
#define V_UI4(A)
Definition: oleauto.h:270
long LONG
Definition: pedump.c:60
_In_opt_ _In_opt_ _In_ _In_ DWORD cbData
Definition: shlwapi.h:761

Referenced by Read().

◆ _ReadStream()

HRESULT CRegPropertyBag::_ReadStream ( VARIANT pvari,
BYTE pInit,
UINT  cbInit 
)
protected

Definition at line 358 of file propbag.cpp.

359{
361 V_UNKNOWN(pvari) = pStream;
362 if (!pStream)
363 return E_OUTOFMEMORY;
364 V_VT(pvari) = VT_UNKNOWN;
365 return S_OK;
366}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
IStream *WINAPI SHCreateMemStream(const BYTE *data, UINT data_len)
Definition: main.c:873
PWDFDEVICE_INIT pInit
#define V_UNKNOWN(A)
Definition: oleauto.h:281
_In_ UINT cbInit
Definition: shlwapi.h:1025

Referenced by _ReadBinary().

◆ _ReadString()

HRESULT CRegPropertyBag::_ReadString ( LPCWSTR  pszPropName,
VARIANTARG pvarg,
UINT  len 
)
protected

Definition at line 340 of file propbag.cpp.

341{
343 V_BSTR(pvarg) = bstr;
344 if (!bstr)
345 return E_OUTOFMEMORY;
346
347 V_VT(pvarg) = VT_BSTR;
348 LONG error = SHGetValueW(m_hKey, NULL, pszPropName, NULL, bstr, (LPDWORD)&len);
349 if (error)
350 {
351 ::VariantClear(pvarg);
352 return E_FAIL;
353 }
354
355 return S_OK;
356}
OLECHAR * BSTR
Definition: compat.h:2293
@ VT_BSTR
Definition: compat.h:2303
GLenum GLsizei len
Definition: glext.h:6722
BSTR WINAPI DECLSPEC_HOTPATCH SysAllocStringByteLen(LPCSTR str, UINT len)
Definition: oleaut.c:428
#define V_BSTR(A)
Definition: oleauto.h:226
uint32_t * LPDWORD
Definition: typedefs.h:59
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648

Referenced by Read().

◆ _WriteStream()

HRESULT CRegPropertyBag::_WriteStream ( LPCWSTR  pszPropName,
IStream pStream 
)
protected

Definition at line 472 of file propbag.cpp.

473{
475 HRESULT hr = _GetStreamSize(pStream, &cbData);
476 if (FAILED(hr) || !cbData)
477 return hr;
478
479 DWORD cbBinary = cbData + sizeof(GUID);
480 LPBYTE pbBinary = (LPBYTE)::LocalAlloc(LMEM_ZEROINIT, cbBinary);
481 if (!pbBinary)
482 return E_OUTOFMEMORY;
483
484 hr = _CopyStreamIntoBuff(pStream, pbBinary + sizeof(GUID), cbData);
485 if (SUCCEEDED(hr))
486 {
487 if (SHSetValueW(m_hKey, NULL, pszPropName, REG_BINARY, pbBinary, cbBinary))
488 hr = E_FAIL;
489 }
490
491 ::LocalFree(pbBinary);
492 return hr;
493}
HRESULT _CopyStreamIntoBuff(IStream *pStream, void *pv, ULONG cb)
Definition: propbag.cpp:394
HRESULT _GetStreamSize(IStream *pStream, LPDWORD pcbSize)
Definition: propbag.cpp:404
DWORD WINAPI SHSetValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value, DWORD type, const void *data, DWORD data_len)
Definition: main.c:2292
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define REG_BINARY
Definition: nt_native.h:1499

Referenced by Write().

◆ Init()

HRESULT CRegPropertyBag::Init ( HKEY  hKey,
LPCWSTR  lpSubKey 
)

Definition at line 306 of file propbag.cpp.

307{
308 REGSAM nAccess = 0;
310 nAccess |= KEY_READ;
312 nAccess |= KEY_WRITE;
313
314 LONG error;
315 if (m_dwMode & STGM_CREATE)
316 error = ::RegCreateKeyExW(hKey, lpSubKey, 0, NULL, 0, nAccess, NULL, &m_hKey, NULL);
317 else
318 error = ::RegOpenKeyExW(hKey, lpSubKey, 0, nAccess, &m_hKey);
319
320 if (error != ERROR_SUCCESS)
321 {
322 ERR("%p %s 0x%08X\n", hKey, debugstr_w(lpSubKey), error);
324 }
325
326 return S_OK;
327}
#define ERR(fmt,...)
Definition: precomp.h:57
#define ERROR_SUCCESS
Definition: deptool.c:10
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
FxAutoRegKey hKey
#define debugstr_w
Definition: kernel32.h:32
#define KEY_READ
Definition: nt_native.h:1026
#define KEY_WRITE
Definition: nt_native.h:1034
#define STGM_CREATE
Definition: objbase.h:945
#define MODE_CAN_WRITE(dwMode)
Definition: propbag.cpp:26
#define MODE_CAN_READ(dwMode)
Definition: propbag.cpp:24
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
ACCESS_MASK REGSAM
Definition: winreg.h:76

◆ Read()

STDMETHODIMP CRegPropertyBag::Read ( _In_z_ LPCWSTR  pszPropName,
_Inout_ VARIANT pvari,
_Inout_opt_ IErrorLog pErrorLog 
)
override

Definition at line 421 of file propbag.cpp.

425{
426 UNREFERENCED_PARAMETER(pErrorLog);
427
428 TRACE("%p: %s %p %p\n", this, debugstr_w(pszPropName), pvari, pErrorLog);
429
431 {
432 ERR("%p: 0x%X\n", this, m_dwMode);
433 ::VariantInit(pvari);
434 return E_ACCESSDENIED;
435 }
436
437 VARTYPE vt = V_VT(pvari);
438 VariantInit(pvari);
439
440 HRESULT hr;
441 DWORD dwType, cbValue;
442 LONG error = SHGetValueW(m_hKey, NULL, pszPropName, &dwType, NULL, &cbValue);
443 if (error != ERROR_SUCCESS)
444 hr = E_FAIL;
445 else if (dwType == REG_SZ)
446 hr = _ReadString(pszPropName, pvari, cbValue);
447 else if (dwType == REG_BINARY)
448 hr = _ReadBinary(pszPropName, pvari, vt, cbValue);
449 else if (dwType == REG_DWORD)
450 hr = _ReadDword(pszPropName, pvari);
451 else
452 hr = E_FAIL;
453
454 if (FAILED(hr))
455 {
456 ERR("%p: 0x%08X %ld: %s %p\n", this, hr, dwType, debugstr_w(pszPropName), pvari);
457 ::VariantInit(pvari);
458 return hr;
459 }
460
461 hr = ::VariantChangeTypeForRead(pvari, vt);
462 if (FAILED(hr))
463 {
464 ERR("%p: 0x%08X %ld: %s %p\n", this, hr, dwType, debugstr_w(pszPropName), pvari);
465 ::VariantInit(pvari);
466 }
467
468 return hr;
469}
HRESULT _ReadDword(LPCWSTR pszPropName, VARIANT *pvari)
Definition: propbag.cpp:329
HRESULT _ReadBinary(LPCWSTR pszPropName, VARIANT *pvari, VARTYPE vt, DWORD uBytes)
Definition: propbag.cpp:369
HRESULT _ReadString(LPCWSTR pszPropName, VARIANTARG *pvarg, UINT len)
Definition: propbag.cpp:340
unsigned short VARTYPE
Definition: compat.h:2254
#define REG_SZ
Definition: layer.c:22
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
#define REG_DWORD
Definition: sdbapi.c:615
#define TRACE(s)
Definition: solgame.cpp:4
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
#define E_ACCESSDENIED
Definition: winerror.h:4116

◆ Write()

STDMETHODIMP CRegPropertyBag::Write ( _In_z_ LPCWSTR  pszPropName,
_In_ VARIANT pvari 
)
override

Definition at line 496 of file propbag.cpp.

497{
498 TRACE("%p: %s %p\n", this, debugstr_w(pszPropName), pvari);
499
501 {
502 ERR("%p: 0x%X\n", this, m_dwMode);
503 return E_ACCESSDENIED;
504 }
505
506 HRESULT hr;
507 LONG error;
508 VARIANTARG vargTemp = { 0 };
509 switch (V_VT(pvari))
510 {
511 case VT_EMPTY:
512 SHDeleteValueW(m_hKey, NULL, pszPropName);
513 hr = S_OK;
514 break;
515
516 case VT_BOOL:
517 case VT_I1:
518 case VT_I2:
519 case VT_I4:
520 case VT_UI1:
521 case VT_UI2:
522 case VT_UI4:
523 case VT_INT:
524 case VT_UINT:
525 {
526 hr = ::VariantChangeType(&vargTemp, pvari, 0, VT_UI4);
527 if (FAILED(hr))
528 return hr;
529
530 error = SHSetValueW(m_hKey, NULL, pszPropName, REG_DWORD, &V_UI4(&vargTemp), sizeof(DWORD));
531 if (error)
532 hr = E_FAIL;
533
534 ::VariantClear(&vargTemp);
535 break;
536 }
537
538 case VT_UNKNOWN:
539 {
540 CComPtr<IStream> pStream;
541 hr = V_UNKNOWN(pvari)->QueryInterface(IID_IStream, (void **)&pStream);
542 if (FAILED(hr))
543 return hr;
544
545 hr = _WriteStream(pszPropName, pStream);
546 break;
547 }
548
549 default:
550 {
551 hr = ::VariantChangeType(&vargTemp, pvari, 0, VT_BSTR);
552 if (FAILED(hr))
553 return hr;
554
555 int cch = lstrlenW(V_BSTR(&vargTemp));
556 DWORD cb = (cch + 1) * sizeof(WCHAR);
557 error = SHSetValueW(m_hKey, NULL, pszPropName, REG_SZ, V_BSTR(&vargTemp), cb);
558 if (error)
559 hr = E_FAIL;
560
561 ::VariantClear(&vargTemp);
562 break;
563 }
564 }
565
566 return hr;
567}
HRESULT _WriteStream(LPCWSTR pszPropName, IStream *pStream)
Definition: propbag.cpp:472
@ VT_INT
Definition: compat.h:2316
@ VT_UI2
Definition: compat.h:2312
@ VT_I1
Definition: compat.h:2310
@ VT_I4
Definition: compat.h:2298
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_UINT
Definition: compat.h:2317
@ VT_EMPTY
Definition: compat.h:2295
@ VT_UI1
Definition: compat.h:2311
#define lstrlenW
Definition: compat.h:750
DWORD WINAPI SHDeleteValueW(HKEY hkey, const WCHAR *subkey, const WCHAR *value)
Definition: main.c:1906
short WCHAR
Definition: pedump.c:58
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:962

Member Data Documentation

◆ m_hKey

HKEY CRegPropertyBag::m_hKey
protected

The documentation for this class was generated from the following file: