diff --git a/include/MSICALib.h b/include/MSICALib.h index 746bc0c..f0c9bcb 100644 --- a/include/MSICALib.h +++ b/include/MSICALib.h @@ -325,12 +325,8 @@ public: friend inline BOOL operator >>(CStream &f, COpRegValueCreate &op); protected: - DWORD m_dwType; - std::wstring m_sData; - std::vector m_binData; - DWORD m_dwData; - std::vector m_szData; - DWORDLONG m_qwData; + DWORD m_dwType; + std::vector m_binData; }; @@ -1036,17 +1032,7 @@ inline BOOL operator <<(CStream &f, const COpRegValueCreate &op) { if (!(f << (const COpRegValueSingle &)op)) return FALSE; if (!(f << op.m_dwType )) return FALSE; - switch (op.m_dwType) { - case REG_SZ: - case REG_EXPAND_SZ: - case REG_LINK: if (!(f << op.m_sData )) return FALSE; break; - case REG_BINARY: if (!(f << op.m_binData)) return FALSE; break; - case REG_DWORD_LITTLE_ENDIAN: - case REG_DWORD_BIG_ENDIAN: if (!(f << op.m_dwData )) return FALSE; break; - case REG_MULTI_SZ: if (!(f << op.m_szData )) return FALSE; break; - case REG_QWORD_LITTLE_ENDIAN: if (!(f << op.m_qwData )) return FALSE; break; - default: ::SetLastError(ERROR_INVALID_DATA); return FALSE; - } + if (!(f << op.m_binData )) return FALSE; return TRUE; } @@ -1056,17 +1042,7 @@ inline BOOL operator >>(CStream &f, COpRegValueCreate &op) { if (!(f >> (COpRegValueSingle &)op)) return FALSE; if (!(f >> op.m_dwType )) return FALSE; - switch (op.m_dwType) { - case REG_SZ: - case REG_EXPAND_SZ: - case REG_LINK: if (!(f >> op.m_sData )) return FALSE; break; - case REG_BINARY: if (!(f >> op.m_binData)) return FALSE; break; - case REG_DWORD_LITTLE_ENDIAN: - case REG_DWORD_BIG_ENDIAN: if (!(f >> op.m_dwData )) return FALSE; break; - case REG_MULTI_SZ: if (!(f >> op.m_szData )) return FALSE; break; - case REG_QWORD_LITTLE_ENDIAN: if (!(f >> op.m_qwData )) return FALSE; break; - default: ::SetLastError(ERROR_INVALID_DATA); return FALSE; - } + if (!(f >> op.m_binData )) return FALSE; return TRUE; } diff --git a/src/OpReg.cpp b/src/OpReg.cpp index 45f0ec6..b86f9e6 100644 --- a/src/OpReg.cpp +++ b/src/OpReg.cpp @@ -454,7 +454,7 @@ COpRegValueCreate::COpRegValueCreate(HKEY hKeyRoot, LPCWSTR pszKeyName, LPCWSTR COpRegValueCreate::COpRegValueCreate(HKEY hKeyRoot, LPCWSTR pszKeyName, LPCWSTR pszValueName, DWORD dwData, int iTicks) : m_dwType(REG_DWORD), - m_dwData(dwData), + m_binData(reinterpret_cast(&dwData), reinterpret_cast(&dwData + 1)), COpRegValueSingle(hKeyRoot, pszKeyName, pszValueName, iTicks) { } @@ -470,7 +470,7 @@ COpRegValueCreate::COpRegValueCreate(HKEY hKeyRoot, LPCWSTR pszKeyName, LPCWSTR COpRegValueCreate::COpRegValueCreate(HKEY hKeyRoot, LPCWSTR pszKeyName, LPCWSTR pszValueName, LPCWSTR pszData, int iTicks) : m_dwType(REG_SZ), - m_sData(pszData), + m_binData(reinterpret_cast(pszData), reinterpret_cast(pszData + wcslen(pszData) + 1)), COpRegValueSingle(hKeyRoot, pszKeyName, pszValueName, iTicks) { } @@ -478,7 +478,7 @@ COpRegValueCreate::COpRegValueCreate(HKEY hKeyRoot, LPCWSTR pszKeyName, LPCWSTR COpRegValueCreate::COpRegValueCreate(HKEY hKeyRoot, LPCWSTR pszKeyName, LPCWSTR pszValueName, DWORDLONG qwData, int iTicks) : m_dwType(REG_QWORD), - m_qwData(qwData), + m_binData(reinterpret_cast(&qwData), reinterpret_cast(&qwData + 1)), COpRegValueSingle(hKeyRoot, pszKeyName, pszValueName, iTicks) { } @@ -515,33 +515,7 @@ HRESULT COpRegValueCreate::Execute(CSession *pSession) } // Set the registry value. - switch (m_dwType) { - case REG_SZ: - case REG_EXPAND_SZ: - case REG_LINK: - lResult = ::RegSetValueExW(hKey, m_sValueName.c_str(), 0, m_dwType, (const BYTE*)m_sData.c_str(), static_cast((m_sData.length() + 1) * sizeof(WCHAR))); break; - break; - - case REG_BINARY: - lResult = ::RegSetValueExW(hKey, m_sValueName.c_str(), 0, m_dwType, m_binData.data(), static_cast(m_binData.size() * sizeof(BYTE))); break; - - case REG_DWORD_LITTLE_ENDIAN: - case REG_DWORD_BIG_ENDIAN: - lResult = ::RegSetValueExW(hKey, m_sValueName.c_str(), 0, m_dwType, (const BYTE*)&m_dwData, sizeof(DWORD)); break; - break; - - case REG_MULTI_SZ: - lResult = ::RegSetValueExW(hKey, m_sValueName.c_str(), 0, m_dwType, (const BYTE*)m_szData.data(), static_cast(m_szData.size() * sizeof(WCHAR))); break; - break; - - case REG_QWORD_LITTLE_ENDIAN: - lResult = ::RegSetValueExW(hKey, m_sValueName.c_str(), 0, m_dwType, (const BYTE*)&m_qwData, sizeof(DWORDLONG)); break; - break; - - default: - lResult = ERROR_UNSUPPORTED_TYPE; - } - + lResult = ::RegSetValueExW(hKey, m_sValueName.c_str(), 0, m_dwType, m_binData.data(), static_cast(m_binData.size() * sizeof(BYTE))); ::RegCloseKey(hKey); }