ReactOS 0.4.17-dev-304-g69474b3
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 269 of file propbag.cpp.

Constructor & Destructor Documentation

◆ CRegPropertyBag()

CRegPropertyBag::CRegPropertyBag ( DWORD  dwMode)
inline

Definition at line 283 of file propbag.cpp.

284 : CBasePropertyBag(dwMode)
285 , m_hKey(NULL)
286 {
287 }
#define NULL
Definition: types.h:112

◆ ~CRegPropertyBag()

CRegPropertyBag::~CRegPropertyBag ( )
inlineoverride

Definition at line 289 of file propbag.cpp.

290 {
291 if (m_hKey)
293 }
#define RegCloseKey(hKey)
Definition: registry.h:49

Member Function Documentation

◆ _CopyStreamIntoBuff()

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

Definition at line 390 of file propbag.cpp.

391{
393 li.QuadPart = 0;
394 HRESULT hr = pStream->Seek(li, 0, NULL);
395 if (FAILED(hr))
396 return hr;
397 return pStream->Read(pv, cb, NULL);
398}
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 400 of file propbag.cpp.

401{
402 *pcbSize = 0;
403
405 HRESULT hr = IStream_Size(pStream, &ui);
406 if (FAILED(hr))
407 return hr;
408
409 if (ui.DUMMYSTRUCTNAME.HighPart)
410 return E_FAIL; /* 64-bit value is not supported */
411
412 *pcbSize = ui.DUMMYSTRUCTNAME.LowPart;
413 return hr;
414}
#define E_FAIL
Definition: ddrawi.h:102
HRESULT WINAPI IStream_Size(IStream *lpStream, ULARGE_INTEGER *lpulSize)
Definition: istream.c:664
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 365 of file propbag.cpp.

370{
371 HRESULT hr = E_FAIL;
372 if (vt != VT_UNKNOWN || uBytes < sizeof(GUID))
373 return hr;
374
375 LPBYTE pbData = (LPBYTE)::LocalAlloc(LMEM_ZEROINIT, uBytes);
376 if (!pbData)
377 return hr;
378
379 if (!SHGetValueW(m_hKey, NULL, pszPropName, NULL, pbData, &uBytes) &&
380 memcmp(&GUID_NULL, pbData, sizeof(GUID)) == 0)
381 {
382 hr = _ReadStream(pvari, pbData + sizeof(GUID), uBytes - sizeof(GUID));
383 }
384
385 ::LocalFree(pbData);
386
387 return hr;
388}
HRESULT _ReadStream(VARIANT *pvari, BYTE *pInit, UINT cbInit)
Definition: propbag.cpp:354
@ 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, LPCWSTR lpszSubKey, LPCWSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1278
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 325 of file propbag.cpp.

326{
327 DWORD cbData = sizeof(DWORD);
328 LONG error = SHGetValueW(m_hKey, NULL, pszPropName, NULL, &V_UI4(pvari), &cbData);
329 if (error)
330 return E_FAIL;
331
332 V_VT(pvari) = VT_UI4;
333 return S_OK;
334}
@ 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 354 of file propbag.cpp.

355{
357 V_UNKNOWN(pvari) = pStream;
358 if (!pStream)
359 return E_OUTOFMEMORY;
360 V_VT(pvari) = VT_UNKNOWN;
361 return S_OK;
362}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
PWDFDEVICE_INIT pInit
#define V_UNKNOWN(A)
Definition: oleauto.h:281
_In_ UINT cbInit
Definition: shlwapi.h:1025
IStream *WINAPI SHCreateMemStream(const BYTE *lpbData, UINT dwDataLen)
Definition: regstream.c:652

Referenced by _ReadBinary().

◆ _ReadString()

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

Definition at line 336 of file propbag.cpp.

337{
339 V_BSTR(pvarg) = bstr;
340 if (!bstr)
341 return E_OUTOFMEMORY;
342
343 V_VT(pvarg) = VT_BSTR;
344 LONG error = SHGetValueW(m_hKey, NULL, pszPropName, NULL, bstr, (LPDWORD)&len);
345 if (error)
346 {
347 ::VariantClear(pvarg);
348 return E_FAIL;
349 }
350
351 return S_OK;
352}
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 468 of file propbag.cpp.

469{
471 HRESULT hr = _GetStreamSize(pStream, &cbData);
472 if (FAILED(hr) || !cbData)
473 return hr;
474
475 DWORD cbBinary = cbData + sizeof(GUID);
476 LPBYTE pbBinary = (LPBYTE)::LocalAlloc(LMEM_ZEROINIT, cbBinary);
477 if (!pbBinary)
478 return E_OUTOFMEMORY;
479
480 hr = _CopyStreamIntoBuff(pStream, pbBinary + sizeof(GUID), cbData);
481 if (SUCCEEDED(hr))
482 {
483 if (SHSetValueW(m_hKey, NULL, pszPropName, REG_BINARY, pbBinary, cbBinary))
484 hr = E_FAIL;
485 }
486
487 ::LocalFree(pbBinary);
488 return hr;
489}
HRESULT _CopyStreamIntoBuff(IStream *pStream, void *pv, ULONG cb)
Definition: propbag.cpp:390
HRESULT _GetStreamSize(IStream *pStream, LPDWORD pcbSize)
Definition: propbag.cpp:400
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1348
#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 302 of file propbag.cpp.

303{
304 REGSAM nAccess = 0;
306 nAccess |= KEY_READ;
308 nAccess |= KEY_WRITE;
309
310 LONG error;
311 if (m_dwMode & STGM_CREATE)
312 error = ::RegCreateKeyExW(hKey, lpSubKey, 0, NULL, 0, nAccess, NULL, &m_hKey, NULL);
313 else
314 error = ::RegOpenKeyExW(hKey, lpSubKey, 0, nAccess, &m_hKey);
315
316 if (error != ERROR_SUCCESS)
317 {
318 ERR("%p %s 0x%08X\n", hKey, debugstr_w(lpSubKey), error);
320 }
321
322 return S_OK;
323}
#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 417 of file propbag.cpp.

421{
422 UNREFERENCED_PARAMETER(pErrorLog);
423
424 TRACE("%p: %s %p %p\n", this, debugstr_w(pszPropName), pvari, pErrorLog);
425
427 {
428 ERR("%p: 0x%X\n", this, m_dwMode);
429 ::VariantInit(pvari);
430 return E_ACCESSDENIED;
431 }
432
433 VARTYPE vt = V_VT(pvari);
434 VariantInit(pvari);
435
436 HRESULT hr;
437 DWORD dwType, cbValue;
438 LONG error = SHGetValueW(m_hKey, NULL, pszPropName, &dwType, NULL, &cbValue);
439 if (error != ERROR_SUCCESS)
440 hr = E_FAIL;
441 else if (dwType == REG_SZ)
442 hr = _ReadString(pszPropName, pvari, cbValue);
443 else if (dwType == REG_BINARY)
444 hr = _ReadBinary(pszPropName, pvari, vt, cbValue);
445 else if (dwType == REG_DWORD)
446 hr = _ReadDword(pszPropName, pvari);
447 else
448 hr = E_FAIL;
449
450 if (FAILED(hr))
451 {
452 ERR("%p: 0x%08X %ld: %s %p\n", this, hr, dwType, debugstr_w(pszPropName), pvari);
453 ::VariantInit(pvari);
454 return hr;
455 }
456
457 hr = ::VariantChangeTypeForRead(pvari, vt);
458 if (FAILED(hr))
459 {
460 ERR("%p: 0x%08X %ld: %s %p\n", this, hr, dwType, debugstr_w(pszPropName), pvari);
461 ::VariantInit(pvari);
462 }
463
464 return hr;
465}
HRESULT _ReadDword(LPCWSTR pszPropName, VARIANT *pvari)
Definition: propbag.cpp:325
HRESULT _ReadBinary(LPCWSTR pszPropName, VARIANT *pvari, VARTYPE vt, DWORD uBytes)
Definition: propbag.cpp:365
HRESULT _ReadString(LPCWSTR pszPropName, VARIANTARG *pvarg, UINT len)
Definition: propbag.cpp:336
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 492 of file propbag.cpp.

493{
494 TRACE("%p: %s %p\n", this, debugstr_w(pszPropName), pvari);
495
497 {
498 ERR("%p: 0x%X\n", this, m_dwMode);
499 return E_ACCESSDENIED;
500 }
501
502 HRESULT hr;
503 LONG error;
504 VARIANTARG vargTemp = { 0 };
505 switch (V_VT(pvari))
506 {
507 case VT_EMPTY:
508 SHDeleteValueW(m_hKey, NULL, pszPropName);
509 hr = S_OK;
510 break;
511
512 case VT_BOOL:
513 case VT_I1:
514 case VT_I2:
515 case VT_I4:
516 case VT_UI1:
517 case VT_UI2:
518 case VT_UI4:
519 case VT_INT:
520 case VT_UINT:
521 {
522 hr = ::VariantChangeType(&vargTemp, pvari, 0, VT_UI4);
523 if (FAILED(hr))
524 return hr;
525
526 error = SHSetValueW(m_hKey, NULL, pszPropName, REG_DWORD, &V_UI4(&vargTemp), sizeof(DWORD));
527 if (error)
528 hr = E_FAIL;
529
530 ::VariantClear(&vargTemp);
531 break;
532 }
533
534 case VT_UNKNOWN:
535 {
536 CComPtr<IStream> pStream;
537 hr = V_UNKNOWN(pvari)->QueryInterface(IID_IStream, (void **)&pStream);
538 if (FAILED(hr))
539 return hr;
540
541 hr = _WriteStream(pszPropName, pStream);
542 break;
543 }
544
545 default:
546 {
547 hr = ::VariantChangeType(&vargTemp, pvari, 0, VT_BSTR);
548 if (FAILED(hr))
549 return hr;
550
551 int cch = lstrlenW(V_BSTR(&vargTemp));
552 DWORD cb = (cch + 1) * sizeof(WCHAR);
553 error = SHSetValueW(m_hKey, NULL, pszPropName, REG_SZ, V_BSTR(&vargTemp), cb);
554 if (error)
555 hr = E_FAIL;
556
557 ::VariantClear(&vargTemp);
558 break;
559 }
560 }
561
562 return hr;
563}
HRESULT _WriteStream(LPCWSTR pszPropName, IStream *pStream)
Definition: propbag.cpp:468
@ 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, LPCWSTR lpszSubKey, LPCWSTR lpszValue)
Definition: reg.c:1804
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: