From 07b0d523fb43747c314a7dd4e7554b73e00f7c30 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Sat, 22 Mar 2014 12:41:28 +0000 Subject: [PATCH] =?UTF-8?q?Dodal=20sem=20podporo=20za=20name=C5=A1=C4=8Dan?= =?UTF-8?q?je=20profilov=20WLAN.=20Ampak=20odstranjevanje=20kljub=20mojim?= =?UTF-8?q?=20velikim=20naporom=20=C5=A1e=20ne=20deluje.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verzijo MSICA sem nastavil na 1.0-pre2. --- L10N/sl_SI.po | 63 +++++++- MSIBuild/Makefile | 7 +- MSICALib.cpp | 2 +- MSICALib.h | 336 +++++++++++++++++++++++++++++---------- MSICALib.vcxproj | 1 + MSICALib.vcxproj.filters | 3 + OpCert.cpp | 12 +- OpFile.cpp | 14 +- OpReg.cpp | 76 ++++----- OpSvc.cpp | 18 +-- OpTS.cpp | 26 +-- OpWLAN.cpp | 182 +++++++++++++++++++++ stdafx.h | 1 + 13 files changed, 578 insertions(+), 163 deletions(-) create mode 100644 OpWLAN.cpp diff --git a/L10N/sl_SI.po b/L10N/sl_SI.po index 2f34c87..186e322 100644 --- a/L10N/sl_SI.po +++ b/L10N/sl_SI.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: MSICALib\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-03-21 18:37+0100\n" +"POT-Creation-Date: 2014-03-22 13:35+0100\n" "PO-Revision-Date: \n" "Last-Translator: Simon Rozman \n" "Language-Team: Amebis, d. o. o., Kamnik \n" @@ -26,12 +26,19 @@ msgstr "1250" #: MSIBuild/En.Win32.Debug.Error-2.idtx:5 #: MSIBuild/En.Win32.Release.Error-2.idtx:5 #: MSIBuild/En.x64.Debug.Error-2.idtx:5 MSIBuild/En.x64.Release.Error-2.idtx:5 -msgid "" -"Error [2] creating scheduled task list. Please, contact your support " -"personnel." +msgid "Error [2] creating task list. Please, contact your support personnel." msgstr "" -"Pri pripravi seznama razvrščenih opravil je prišlo do napake [2]. Obrnite se " -"na svojo tehnično službo." +"Pri pripravi seznama opravil je prišlo do napake [2]. Obrnite se na svojo " +"tehnično službo." + +#: MSIBuild/En.Win32.Debug.Error-2.idtx:20 +#: MSIBuild/En.Win32.Release.Error-2.idtx:20 +#: MSIBuild/En.x64.Debug.Error-2.idtx:20 +#: MSIBuild/En.x64.Release.Error-2.idtx:20 +msgid "Error [2] opening WLAN handle. Please, contact your support personnel." +msgstr "" +"Pri odpiranju ročica WLAN je prišlo do napake [2]. Obrnite se na svojo " +"tehnično službo." #: MSIBuild/En.Win32.Debug.Error-2.idtx:17 #: MSIBuild/En.Win32.Release.Error-2.idtx:17 @@ -168,6 +175,17 @@ msgstr "" "Pri kopiranju razporejenega opravila »[2]« v »[3]« je prišlo do napake [4]. " "Obrnite se na svojo tehnično službo." +#: MSIBuild/En.Win32.Debug.Error-2.idtx:22 +#: MSIBuild/En.Win32.Release.Error-2.idtx:22 +#: MSIBuild/En.x64.Debug.Error-2.idtx:22 +#: MSIBuild/En.x64.Release.Error-2.idtx:22 +msgid "" +"Error [4] deleting profile \"[3]\" on WLAN interface [2]. Please, contact " +"your support personnel." +msgstr "" +"Pri brisanju profila »[3]« na vmesniku WLAN [2] je prišlo do napake [4]. " +"Obrnite se na svojo tehnično službo." + #: MSIBuild/En.Win32.Debug.Error-2.idtx:10 #: MSIBuild/En.Win32.Release.Error-2.idtx:10 #: MSIBuild/En.x64.Debug.Error-2.idtx:10 @@ -179,6 +197,28 @@ msgstr "" "Pri premikanju datoteke »[2]« v »[3]« je prišlo do napake [4]. Obrnite se na " "svojo tehnično službo." +#: MSIBuild/En.Win32.Debug.Error-2.idtx:23 +#: MSIBuild/En.Win32.Release.Error-2.idtx:23 +#: MSIBuild/En.x64.Debug.Error-2.idtx:23 +#: MSIBuild/En.x64.Release.Error-2.idtx:23 +msgid "" +"Error [5] renaming profile \"[3]\" to \"[4]\" on WLAN interface [2]. Please, " +"contact your support personnel." +msgstr "" +"Pri preimenovanju profila »[3]« v »[4]« na vmesniku WLAN [2] je prišlo do " +"napake [5]. Obrnite se na svojo tehnično službo." + +#: MSIBuild/En.Win32.Debug.Error-2.idtx:24 +#: MSIBuild/En.Win32.Release.Error-2.idtx:24 +#: MSIBuild/En.x64.Debug.Error-2.idtx:24 +#: MSIBuild/En.x64.Release.Error-2.idtx:24 +msgid "" +"Error [5] setting profile \"[3]\" on WLAN interface [2] (WLAN reason is " +"[4]). Please, contact your support personnel." +msgstr "" +"Pri nastavljanju profila »[3]« na vmesniku WLAN [2] je prišlo do napake [5] " +"(vzrok WLAN je [4]). Obrnite se na svojo tehnično službo." + #: MSIBuild/En.Win32.Debug.Error-2.idtx:4 #: MSIBuild/En.Win32.Release.Error-2.idtx:4 #: MSIBuild/En.x64.Debug.Error-2.idtx:4 MSIBuild/En.x64.Release.Error-2.idtx:4 @@ -187,3 +227,14 @@ msgid "" msgstr "" "Pri odpiranju namestitvenega paketa je prišlo do napake. Obrnite se na svojo " "tehnično službo." + +#: MSIBuild/En.Win32.Debug.Error-2.idtx:21 +#: MSIBuild/En.Win32.Release.Error-2.idtx:21 +#: MSIBuild/En.x64.Debug.Error-2.idtx:21 +#: MSIBuild/En.x64.Release.Error-2.idtx:21 +msgid "" +"WLAN profile \"[2]\" XML data is not UTF-16 encoded. Please, contact your " +"support personnel." +msgstr "" +"Zapis XML profila WLAN »[2]« ni zapisan v UTF-16. Obrnite se na svojo " +"tehnično službo." diff --git a/MSIBuild/Makefile b/MSIBuild/Makefile index cbc6a47..21d260d 100644 --- a/MSIBuild/Makefile +++ b/MSIBuild/Makefile @@ -25,7 +25,7 @@ Error Message i2 L0 1252 Error Error 2550 Error opening installation package. Please, contact your support personnel. -2551 Error [2] creating scheduled task list. Please, contact your support personnel. +2551 Error [2] creating task list. Please, contact your support personnel. 2552 Error [3] writing to "[2]" task list file. Please, contact your support personnel. 2560 Error [3] reading from "[2]" task list file. Please, contact your support personnel. 2553 Error [3] setting "[2]" parameter. Please, contact your support personnel. @@ -40,6 +40,11 @@ i2 L0 2571 Error [3] changing service "[2]" start type. Please, contact your support personnel. 2572 Error [3] starting service "[2]". Please, contact your support personnel. 2573 Error [3] stopping service "[2]". Please, contact your support personnel. +2577 Error [2] opening WLAN handle. Please, contact your support personnel. +2578 WLAN profile "[2]" XML data is not UTF-16 encoded. Please, contact your support personnel. +2574 Error [4] deleting profile "[3]" on WLAN interface [2]. Please, contact your support personnel. +2575 Error [5] renaming profile "[3]" to "[4]" on WLAN interface [2]. Please, contact your support personnel. +2576 Error [5] setting profile "[3]" on WLAN interface [2] (WLAN reason is [4]). Please, contact your support personnel. <>(ATL::CAtlFile &f, COpWLANProfile &op); + +protected: + GUID m_guidInterface; +}; + + +//////////////////////////////////////////////////////////////////////////// +// COpWLANProfileDelete +//////////////////////////////////////////////////////////////////////////// + +class COpWLANProfileDelete : public COpWLANProfile +{ +public: + COpWLANProfileDelete(const GUID &guidInterface = GUID_NULL, LPCWSTR pszProfileName = L"", int iTicks = 0); + virtual HRESULT Execute(CSession *pSession); +}; + + +//////////////////////////////////////////////////////////////////////////// +// COpWLANProfileRename +//////////////////////////////////////////////////////////////////////////// + +class COpWLANProfileRename : public COpWLANProfile +{ +public: + COpWLANProfileRename(const GUID &guidInterface = GUID_NULL, LPCWSTR pszProfileNameSrc = L"", LPCWSTR pszProfileNameDst = L"", int iTicks = 0); + virtual HRESULT Execute(CSession *pSession); + + friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpWLANProfileRename &op); + friend inline HRESULT operator >>(ATL::CAtlFile &f, COpWLANProfileRename &op); + +protected: + ATL::CAtlStringW m_sProfileNameDst; +}; + + +//////////////////////////////////////////////////////////////////////////// +// COpWLANProfileSet +//////////////////////////////////////////////////////////////////////////// + +class COpWLANProfileSet : public COpWLANProfile +{ +public: + COpWLANProfileSet(const GUID &guidInterface = GUID_NULL, LPCWSTR pszProfileName = L"", LPCWSTR pszProfileXML = L"", int iTicks = 0); + virtual HRESULT Execute(CSession *pSession); + + friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpWLANProfileSet &op); + friend inline HRESULT operator >>(ATL::CAtlFile &f, COpWLANProfileSet &op); + +protected: + ATL::CAtlStringW m_sProfileXML; +}; + + //////////////////////////////////////////////////////////////////////////// // COpList //////////////////////////////////////////////////////////////////////////// @@ -557,6 +627,9 @@ protected: OP_SVC_SET_START, OP_SVC_START, OP_SVC_STOP, + OP_WLAN_PROFILE_DELETE, + OP_WLAN_PROFILE_RENAME, + OP_WLAN_PROFILE_SET, OP_SUBLIST }; @@ -608,6 +681,32 @@ UINT ExecuteSequence(MSIHANDLE hInstall); // Inline helper functions //////////////////////////////////////////////////////////////////// +namespace MSICA { + +inline VOID GuidToString(const GUID &guid, ATL::CAtlStringA &str) +{ + str.Format("{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + guid.Data1, + guid.Data2, + guid.Data3, + guid.Data4[0], guid.Data4[1], + guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]); +} + + +inline VOID GuidToString(const GUID &guid, ATL::CAtlStringW &str) +{ + str.Format(L"{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + guid.Data1, + guid.Data2, + guid.Data3, + guid.Data4[0], guid.Data4[1], + guid.Data4[2], guid.Data4[3], guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]); +} + +} // namespace MSICA + + inline UINT MsiGetPropertyA(MSIHANDLE hInstall, LPCSTR szName, ATL::CAtlStringA &sValue) { DWORD dwSize = 0; @@ -955,6 +1054,26 @@ inline HRESULT operator >>(ATL::CAtlFile &f, DWORDLONG &i) } +inline HRESULT operator <<(ATL::CAtlFile &f, const GUID &guid) +{ + HRESULT hr; + DWORD dwWritten; + + hr = f.Write(&guid, sizeof(GUID), &dwWritten); + return SUCCEEDED(hr) ? dwWritten == sizeof(GUID) ? hr : E_FAIL : hr; +} + + +inline HRESULT operator >>(ATL::CAtlFile &f, GUID &guid) +{ + HRESULT hr; + DWORD dwRead; + + hr = f.Read(&guid, sizeof(GUID), dwRead); + return SUCCEEDED(hr) ? dwRead == sizeof(GUID) ? hr : E_FAIL : hr; +} + + template inline HRESULT operator <<(ATL::CAtlFile &f, const ATL::CAtlArray &a) { @@ -1480,6 +1599,72 @@ inline HRESULT operator >>(ATL::CAtlFile &f, COpSvcControl &op) } +inline HRESULT operator <<(ATL::CAtlFile &f, const COpWLANProfile &op) +{ + HRESULT hr; + + hr = f << (const COpTypeSingleString&)op; if (FAILED(hr)) return hr; + hr = f << op.m_guidInterface; if (FAILED(hr)) return hr; + + return S_OK; +} + + +inline HRESULT operator >>(ATL::CAtlFile &f, COpWLANProfile &op) +{ + HRESULT hr; + + hr = f >> (COpTypeSingleString&)op; if (FAILED(hr)) return hr; + hr = f >> op.m_guidInterface; if (FAILED(hr)) return hr; + + return S_OK; +} + + +inline HRESULT operator <<(ATL::CAtlFile &f, const COpWLANProfileRename &op) +{ + HRESULT hr; + + hr = f << (const COpWLANProfile&)op; if (FAILED(hr)) return hr; + hr = f << op.m_sProfileNameDst; if (FAILED(hr)) return hr; + + return S_OK; +} + + +inline HRESULT operator >>(ATL::CAtlFile &f, COpWLANProfileRename &op) +{ + HRESULT hr; + + hr = f >> (COpWLANProfile&)op; if (FAILED(hr)) return hr; + hr = f >> op.m_sProfileNameDst; if (FAILED(hr)) return hr; + + return S_OK; +} + + +inline HRESULT operator <<(ATL::CAtlFile &f, const COpWLANProfileSet &op) +{ + HRESULT hr; + + hr = f << (const COpWLANProfile&)op; if (FAILED(hr)) return hr; + hr = f << op.m_sProfileXML; if (FAILED(hr)) return hr; + + return S_OK; +} + + +inline HRESULT operator >>(ATL::CAtlFile &f, COpWLANProfileSet &op) +{ + HRESULT hr; + + hr = f >> (COpWLANProfile&)op; if (FAILED(hr)) return hr; + hr = f >> op.m_sProfileXML; if (FAILED(hr)) return hr; + + return S_OK; +} + + inline HRESULT operator <<(ATL::CAtlFile &f, const COpList &list) { POSITION pos; @@ -1493,44 +1678,28 @@ inline HRESULT operator <<(ATL::CAtlFile &f, const COpList &list) for (pos = list.GetHeadPosition(); pos;) { const COperation *pOp = list.GetNext(pos); - if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) - hr = list.Save(f, pOp); + if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); else { // Unsupported type of operation. hr = E_UNEXPECTED; @@ -1561,25 +1730,28 @@ inline HRESULT operator >>(ATL::CAtlFile &f, COpList &list) if (FAILED(hr)) return hr; switch ((COpList::OPERATION)iTemp) { - case COpList::OP_ROLLBACK_ENABLE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_FILE_DELETE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_FILE_MOVE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_REG_KEY_CREATE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_REG_KEY_COPY: hr = list.LoadAndAddTail(f); break; - case COpList::OP_REG_KEY_DELETE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_REG_VALUE_CREATE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_REG_VALUE_COPY: hr = list.LoadAndAddTail(f); break; - case COpList::OP_REG_VALUE_DELETE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_TASK_CREATE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_TASK_DELETE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_TASK_ENABLE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_TASK_COPY: hr = list.LoadAndAddTail(f); break; - case COpList::OP_CERT_INSTALL: hr = list.LoadAndAddTail(f); break; - case COpList::OP_CERT_REMOVE: hr = list.LoadAndAddTail(f); break; - case COpList::OP_SVC_SET_START: hr = list.LoadAndAddTail(f); break; - case COpList::OP_SVC_START: hr = list.LoadAndAddTail(f); break; - case COpList::OP_SVC_STOP: hr = list.LoadAndAddTail(f); break; - case COpList::OP_SUBLIST: hr = list.LoadAndAddTail(f); break; + case COpList::OP_ROLLBACK_ENABLE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_FILE_DELETE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_FILE_MOVE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_REG_KEY_CREATE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_REG_KEY_COPY: hr = list.LoadAndAddTail(f); break; + case COpList::OP_REG_KEY_DELETE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_REG_VALUE_CREATE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_REG_VALUE_COPY: hr = list.LoadAndAddTail(f); break; + case COpList::OP_REG_VALUE_DELETE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_TASK_CREATE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_TASK_DELETE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_TASK_ENABLE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_TASK_COPY: hr = list.LoadAndAddTail(f); break; + case COpList::OP_CERT_INSTALL: hr = list.LoadAndAddTail(f); break; + case COpList::OP_CERT_REMOVE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_SVC_SET_START: hr = list.LoadAndAddTail(f); break; + case COpList::OP_SVC_START: hr = list.LoadAndAddTail(f); break; + case COpList::OP_SVC_STOP: hr = list.LoadAndAddTail(f); break; + case COpList::OP_WLAN_PROFILE_DELETE: hr = list.LoadAndAddTail(f); break; + case COpList::OP_WLAN_PROFILE_RENAME: hr = list.LoadAndAddTail(f); break; + case COpList::OP_WLAN_PROFILE_SET: hr = list.LoadAndAddTail(f); break; + case COpList::OP_SUBLIST: hr = list.LoadAndAddTail(f); break; default: // Unsupported type of operation. hr = E_UNEXPECTED; diff --git a/MSICALib.vcxproj b/MSICALib.vcxproj index e01d031..ecc37e1 100644 --- a/MSICALib.vcxproj +++ b/MSICALib.vcxproj @@ -25,6 +25,7 @@ + Create Create diff --git a/MSICALib.vcxproj.filters b/MSICALib.vcxproj.filters index 7f72ba2..6b2fabb 100644 --- a/MSICALib.vcxproj.filters +++ b/MSICALib.vcxproj.filters @@ -36,6 +36,9 @@ Source Files + + Source Files + diff --git a/OpCert.cpp b/OpCert.cpp index 0b9d1de..beadb5e 100644 --- a/OpCert.cpp +++ b/OpCert.cpp @@ -83,9 +83,9 @@ HRESULT COpCertInstall::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(3); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_CERT_INSTALL_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 3, dwError ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_CERT_INSTALL); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 3, dwError ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(dwError); } @@ -150,9 +150,9 @@ HRESULT COpCertRemove::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(3); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_CERT_REMOVE_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 3, dwError ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_CERT_REMOVE); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 3, dwError ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(dwError); } diff --git a/OpFile.cpp b/OpFile.cpp index eaa74b5..98a0dcc 100644 --- a/OpFile.cpp +++ b/OpFile.cpp @@ -42,9 +42,9 @@ HRESULT COpFileDelete::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(3); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_FILE_DELETE_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 3, dwError ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_FILE_DELETE); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 3, dwError ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(dwError); } @@ -76,10 +76,10 @@ HRESULT COpFileMove::Execute(CSession *pSession) return S_OK; } else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(4); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_FILE_MOVE_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue1 ); - ::MsiRecordSetStringW(hRecordProg, 3, m_sValue2 ); - ::MsiRecordSetInteger(hRecordProg, 4, dwError ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_FILE_MOVE); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue1 ); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue2 ); + ::MsiRecordSetInteger(hRecordProg, 4, dwError ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(dwError); } diff --git a/OpReg.cpp b/OpReg.cpp index a651450..4c8d554 100644 --- a/OpReg.cpp +++ b/OpReg.cpp @@ -86,10 +86,10 @@ HRESULT COpRegKeyCreate::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(4); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_CREATE_FAILED); - ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); - ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 4, lResult ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_CREATE ); + ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 4, lResult ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(lResult); } @@ -137,11 +137,11 @@ HRESULT COpRegKeyCopy::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(5); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_COPY_FAILED); - ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); - ::MsiRecordSetStringW(hRecordProg, 3, m_sValue1 ); - ::MsiRecordSetStringW(hRecordProg, 4, m_sValue2 ); - ::MsiRecordSetInteger(hRecordProg, 5, lResult ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_COPY ); + ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue1 ); + ::MsiRecordSetStringW(hRecordProg, 4, m_sValue2 ); + ::MsiRecordSetInteger(hRecordProg, 5, lResult ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(lResult); } @@ -336,10 +336,10 @@ HRESULT COpRegKeyDelete::Execute(CSession *pSession) pSession->m_olCommit.AddTail(new COpRegKeyDelete(m_hKeyRoot, sBackupName)); } else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(4); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_PROBING_FAILED); - ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); - ::MsiRecordSetStringW(hRecordProg, 3, sBackupName ); - ::MsiRecordSetInteger(hRecordProg, 4, lResult ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_PROBING ); + ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff); + ::MsiRecordSetStringW(hRecordProg, 3, sBackupName ); + ::MsiRecordSetInteger(hRecordProg, 4, lResult ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(lResult); } @@ -353,10 +353,10 @@ HRESULT COpRegKeyDelete::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(4); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_DELETE_FAILED); - ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); - ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 4, lResult ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_DELETE ); + ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 4, lResult ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(lResult); } @@ -549,11 +549,11 @@ HRESULT COpRegValueCreate::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(5); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_SETVALUE_FAILED); - ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); - ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); - ::MsiRecordSetStringW(hRecordProg, 4, m_sValueName ); - ::MsiRecordSetInteger(hRecordProg, 5, lResult ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_SETVALUE); + ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); + ::MsiRecordSetStringW(hRecordProg, 4, m_sValueName ); + ::MsiRecordSetInteger(hRecordProg, 5, lResult ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(lResult); } @@ -621,12 +621,12 @@ HRESULT COpRegValueCopy::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(6); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_COPYVALUE_FAILED); - ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); - ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); - ::MsiRecordSetStringW(hRecordProg, 4, m_sValueName1 ); - ::MsiRecordSetStringW(hRecordProg, 5, m_sValueName2 ); - ::MsiRecordSetInteger(hRecordProg, 6, lResult ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_COPYVALUE); + ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); + ::MsiRecordSetStringW(hRecordProg, 4, m_sValueName1 ); + ::MsiRecordSetStringW(hRecordProg, 5, m_sValueName2 ); + ::MsiRecordSetInteger(hRecordProg, 6, lResult ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(lResult); } @@ -689,11 +689,11 @@ HRESULT COpRegValueDelete::Execute(CSession *pSession) pSession->m_olCommit.AddTail(new COpRegValueDelete(m_hKeyRoot, m_sValue, sBackupName)); } else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(5); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_PROBINGVAL_FAILED); - ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); - ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); - ::MsiRecordSetStringW(hRecordProg, 3, sBackupName ); - ::MsiRecordSetInteger(hRecordProg, 4, lResult ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_PROBINGVAL); + ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); + ::MsiRecordSetStringW(hRecordProg, 3, sBackupName ); + ::MsiRecordSetInteger(hRecordProg, 4, lResult ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); ::RegCloseKey(hKey); return AtlHresultFromWin32(lResult); @@ -711,11 +711,11 @@ HRESULT COpRegValueDelete::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(5); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_DELETEVALUE_FAILED); - ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); - ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); - ::MsiRecordSetStringW(hRecordProg, 4, m_sValueName ); - ::MsiRecordSetInteger(hRecordProg, 5, lResult ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_REGKEY_DELETEVALUE); + ::MsiRecordSetInteger(hRecordProg, 2, (UINT)m_hKeyRoot & 0x7fffffff ); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); + ::MsiRecordSetStringW(hRecordProg, 4, m_sValueName ); + ::MsiRecordSetInteger(hRecordProg, 5, lResult ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(lResult); } diff --git a/OpSvc.cpp b/OpSvc.cpp index c5115b5..deeff42 100644 --- a/OpSvc.cpp +++ b/OpSvc.cpp @@ -67,9 +67,9 @@ HRESULT COpSvcSetStart::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(3); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_SVC_SET_START_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 3, dwError ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_SVC_SET_START); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 3, dwError ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(dwError); } @@ -170,9 +170,9 @@ HRESULT COpSvcStart::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(3); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_SVC_START_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 3, dwError ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_SVC_START); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 3, dwError ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(dwError); } @@ -225,9 +225,9 @@ HRESULT COpSvcStop::Execute(CSession *pSession) return S_OK; else { PMSIHANDLE hRecordProg = ::MsiCreateRecord(3); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_SVC_STOP_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 3, dwError ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_SVC_STOP); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 3, dwError ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); return AtlHresultFromWin32(dwError); } diff --git a/OpTS.cpp b/OpTS.cpp index 14900d2..7524131 100644 --- a/OpTS.cpp +++ b/OpTS.cpp @@ -431,9 +431,9 @@ HRESULT COpTaskCreate::Execute(CSession *pSession) finish: if (FAILED(hr)) { PMSIHANDLE hRecordProg = ::MsiCreateRecord(3); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_TASK_CREATE_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 3, hr ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_TASK_CREATE); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 3, hr ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); } return hr; @@ -801,9 +801,9 @@ HRESULT COpTaskDelete::Execute(CSession *pSession) finish: if (FAILED(hr)) { PMSIHANDLE hRecordProg = ::MsiCreateRecord(3); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_TASK_DELETE_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 3, hr ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_TASK_DELETE); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 3, hr ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); } return hr; @@ -921,9 +921,9 @@ HRESULT COpTaskEnable::Execute(CSession *pSession) finish: if (FAILED(hr)) { PMSIHANDLE hRecordProg = ::MsiCreateRecord(3); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_TASK_ENABLE_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); - ::MsiRecordSetInteger(hRecordProg, 3, hr ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_TASK_ENABLE); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 3, hr ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); } return hr; @@ -1026,10 +1026,10 @@ HRESULT COpTaskCopy::Execute(CSession *pSession) finish: if (FAILED(hr)) { PMSIHANDLE hRecordProg = ::MsiCreateRecord(4); - ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_TASK_COPY_FAILED); - ::MsiRecordSetStringW(hRecordProg, 2, m_sValue1 ); - ::MsiRecordSetStringW(hRecordProg, 3, m_sValue2 ); - ::MsiRecordSetInteger(hRecordProg, 4, hr ); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_TASK_COPY); + ::MsiRecordSetStringW(hRecordProg, 2, m_sValue1 ); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue2 ); + ::MsiRecordSetInteger(hRecordProg, 4, hr ); ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); } return hr; diff --git a/OpWLAN.cpp b/OpWLAN.cpp new file mode 100644 index 0000000..b443307 --- /dev/null +++ b/OpWLAN.cpp @@ -0,0 +1,182 @@ +#include "stdafx.h" + +#pragma comment(lib, "wlanapi.lib") + + +namespace MSICA { + +//////////////////////////////////////////////////////////////////////////// +// COpWLANProfile +//////////////////////////////////////////////////////////////////////////// + +COpWLANProfile::COpWLANProfile(const GUID &guidInterface, LPCWSTR pszProfileName, int iTicks) : + COpTypeSingleString(pszProfileName, iTicks), + m_guidInterface(guidInterface) +{ +} + + +//////////////////////////////////////////////////////////////////////////// +// COpWLANProfileDelete +//////////////////////////////////////////////////////////////////////////// + +COpWLANProfileDelete::COpWLANProfileDelete(const GUID &guidInterface, LPCWSTR pszProfileName, int iTicks) : COpWLANProfile(guidInterface, pszProfileName, iTicks) +{ +} + + +HRESULT COpWLANProfileDelete::Execute(CSession *pSession) +{ + DWORD dwError, dwNegotiatedVersion; + HANDLE hClientHandle; + + dwError = ::WlanOpenHandle(2, NULL, &dwNegotiatedVersion, &hClientHandle); + if (dwError == NO_ERROR) { + if (pSession->m_bRollbackEnabled) { + ATL::CAtlStringW sBackupName; + UINT uiCount = 0; + + do { + // Rename the profile to make a backup. + sBackupName.Format(L"%ls (orig %u)", (LPCWSTR)m_sValue, ++uiCount); + dwError = ::WlanRenameProfile(hClientHandle, &m_guidInterface, m_sValue, sBackupName, NULL); + } while (dwError == ERROR_ALREADY_EXISTS); + if (dwError == NO_ERROR) { + // Order rollback action to restore from backup copy. + pSession->m_olRollback.AddHead(new COpWLANProfileRename(m_guidInterface, sBackupName, m_sValue)); + + // Order commit action to delete backup copy. + pSession->m_olCommit.AddTail(new COpWLANProfileDelete(m_guidInterface, sBackupName)); + } + } else { + // Delete the profile. + dwError = ::WlanDeleteProfile(hClientHandle, &m_guidInterface, m_sValue, NULL); + } + ::WlanCloseHandle(hClientHandle, NULL); + } + + if (dwError == NO_ERROR || dwError == ERROR_NOT_FOUND) + return S_OK; + else { + PMSIHANDLE hRecordProg = ::MsiCreateRecord(4); + ATL::CAtlStringW sGUID; + GuidToString(m_guidInterface, sGUID); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_WLAN_PROFILE_DELETE); + ::MsiRecordSetStringW(hRecordProg, 2, sGUID ); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); + ::MsiRecordSetInteger(hRecordProg, 4, dwError ); + ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); + return AtlHresultFromWin32(dwError); + } +} + + +//////////////////////////////////////////////////////////////////////////// +// COpWLANProfileRename +//////////////////////////////////////////////////////////////////////////// + +COpWLANProfileRename::COpWLANProfileRename(const GUID &guidInterface, LPCWSTR pszProfileNameSrc, LPCWSTR pszProfileNameDst, int iTicks) : + COpWLANProfile(guidInterface, pszProfileNameSrc, iTicks), + m_sProfileNameDst(pszProfileNameDst) +{ +} + + +HRESULT COpWLANProfileRename::Execute(CSession *pSession) +{ + DWORD dwError, dwNegotiatedVersion; + HANDLE hClientHandle; + + dwError = ::WlanOpenHandle(2, NULL, &dwNegotiatedVersion, &hClientHandle); + if (dwError == NO_ERROR) { + // Rename the profile. + dwError = ::WlanRenameProfile(hClientHandle, &m_guidInterface, m_sValue, m_sProfileNameDst, NULL); + if (dwError == NO_ERROR && pSession->m_bRollbackEnabled) { + // Order rollback action to rename it back. + pSession->m_olRollback.AddHead(new COpWLANProfileRename(m_guidInterface, m_sProfileNameDst, m_sValue)); + } + ::WlanCloseHandle(hClientHandle, NULL); + } + + if (dwError == NO_ERROR) + return S_OK; + else { + PMSIHANDLE hRecordProg = ::MsiCreateRecord(5); + ATL::CAtlStringW sGUID; + GuidToString(m_guidInterface, sGUID); + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_WLAN_PROFILE_RENAME); + ::MsiRecordSetStringW(hRecordProg, 2, sGUID ); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); + ::MsiRecordSetStringW(hRecordProg, 4, m_sProfileNameDst ); + ::MsiRecordSetInteger(hRecordProg, 5, dwError ); + ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); + return AtlHresultFromWin32(dwError); + } +} + + +//////////////////////////////////////////////////////////////////////////// +// COpWLANProfileSet +//////////////////////////////////////////////////////////////////////////// + +COpWLANProfileSet::COpWLANProfileSet(const GUID &guidInterface, LPCWSTR pszProfileName, LPCWSTR pszProfileXML, int iTicks) : + COpWLANProfile(guidInterface, pszProfileName, iTicks), + m_sProfileXML(pszProfileXML) +{ +} + + +HRESULT COpWLANProfileSet::Execute(CSession *pSession) +{ + DWORD dwError, dwNegotiatedVersion; + HANDLE hClientHandle; + WLAN_REASON_CODE wlrc = 0; + + { + // Delete existing profile first. + // Since deleting a profile is a complicated job (when rollback/commit support is required), and we do have an operation just for that, we use it. + // Don't worry, COpWLANProfileDelete::Execute() returns S_OK if profile doesn't exist. + COpWLANProfileDelete opDelete(m_guidInterface, m_sValue); + HRESULT hr = opDelete.Execute(pSession); + if (FAILED(hr)) return hr; + } + + dwError = ::WlanOpenHandle(2, NULL, &dwNegotiatedVersion, &hClientHandle); + if (dwError == NO_ERROR) { + // Set the profile. + dwError = ::WlanSetProfile(hClientHandle, &m_guidInterface, 0, m_sProfileXML, NULL, TRUE, NULL, &wlrc); + if (dwError == NO_ERROR && pSession->m_bRollbackEnabled) { + // Order rollback action to delete it. + pSession->m_olRollback.AddHead(new COpWLANProfileDelete(m_guidInterface, m_sValue)); + } + ::WlanCloseHandle(hClientHandle, NULL); + } + + if (dwError == NO_ERROR) + return S_OK; + else { + PMSIHANDLE hRecordProg = ::MsiCreateRecord(5); + ATL::CAtlStringW sGUID, sReason; + DWORD dwSize = 1024; + LPWSTR szBuffer = sReason.GetBuffer(dwSize); + + GuidToString(m_guidInterface, sGUID); + if (::WlanReasonCodeToString(wlrc, dwSize, szBuffer, NULL) == NO_ERROR) { + sReason.ReleaseBuffer(dwSize); + ::MsiRecordSetStringW(hRecordProg, 4, sReason); + } else { + sReason.ReleaseBuffer(dwSize); + sReason.Format(L"0x%x", wlrc); + } + + ::MsiRecordSetInteger(hRecordProg, 1, ERROR_INSTALL_WLAN_PROFILE_SET); + ::MsiRecordSetStringW(hRecordProg, 2, sGUID ); + ::MsiRecordSetStringW(hRecordProg, 3, m_sValue ); + ::MsiRecordSetStringW(hRecordProg, 4, sReason ); + ::MsiRecordSetInteger(hRecordProg, 5, dwError ); + ::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg); + return AtlHresultFromWin32(dwError); + } +} + +} // namespace MSICA diff --git a/stdafx.h b/stdafx.h index 9e433b4..1635444 100644 --- a/stdafx.h +++ b/stdafx.h @@ -31,5 +31,6 @@ #include #include #include +#include #include "MSICALib.h"