66#include " Helps.h"
77#include " PeFile.h"
88#include " Sppc.h"
9+ #include " Mutex.h"
10+ #include < winsvc.h>
11+ #include " ServiceManageDlg.h"
912#include < vector>
1013#include < map>
1114
@@ -36,6 +39,7 @@ LPCTSTR g_TypeTable[] = {
3639 _T (" ul.xrm-ms" ),
3740 _T (" pl.xrm-ms" ),
3841};
42+ HANDLE g_Mutex;
3943
4044typedef struct _OSP_LICENSE {
4145
@@ -283,6 +287,9 @@ BOOL COfficeActivatorDlg::OnInitDialog()
283287 SetIcon (m_hIcon, TRUE ); // Set big icon
284288 SetIcon (m_hIcon, FALSE ); // Set small icon
285289
290+ g_Mutex = CreateGlobalMutex ();
291+ ASSERT (g_Mutex);
292+
286293 CListCtrl* list = static_cast <CListCtrl*>(GetDlgItem (IDC_LIST_INSTALLED_LICENSE));
287294 ASSERT (list);
288295 InitializeListControl (list);
@@ -293,7 +300,7 @@ BOOL COfficeActivatorDlg::OnInitDialog()
293300 InitializeProductKeyList (pks);
294301
295302 if (!IsUserAnAdmin ()) {
296- int buttons[] = { IDC_BUTTON_PATCH,IDC_BUTTON_RESTORE,IDC_BUTTON_INSTALL_PKEY,IDC_BUTTON_INSTALL_LIC,IDC_BUTTON_UNINSTALL_LIC,IDC_BUTTON_UNINSTALL_PKEY };
303+ int buttons[] = { IDC_BUTTON_PATCH,IDC_BUTTON_RESTORE,IDC_BUTTON_INSTALL_PKEY,IDC_BUTTON_INSTALL_LIC,IDC_BUTTON_UNINSTALL_LIC,IDC_BUTTON_UNINSTALL_PKEY, IDC_BUTTON_SVC_MANAGE };
297304 for (int i = 0 ; i < sizeof (buttons) / sizeof (int ); ++i) {
298305 CButton* btn = static_cast <CButton*>(GetDlgItem (buttons[i]));
299306 ASSERT (btn);
@@ -336,7 +343,8 @@ BEGIN_MESSAGE_MAP(COfficeActivatorDlg, CDialogEx)
336343 ON_CBN_SELCHANGE(IDC_COMBO_LICENSES_VERSION, &COfficeActivatorDlg::OnCbnSelchangeComboLicensesVersion)
337344 ON_BN_CLICKED(IDC_BUTTON_INSTALL_LIC, &COfficeActivatorDlg::OnBnClickedButtonInstallLic)
338345 ON_BN_CLICKED(IDC_BUTTON_UNINSTALL_LIC, &COfficeActivatorDlg::OnBnClickedButtonUninstallLic)
339-
346+ ON_BN_CLICKED(IDC_BUTTON_SVC_MANAGE, &COfficeActivatorDlg::OnBnClickedButtonSvcManage)
347+
340348 ON_WM_CTLCOLOR()
341349END_MESSAGE_MAP()
342350
@@ -415,6 +423,8 @@ void COfficeActivatorDlg::OnBnClickedButtonAutoDetect()
415423
416424void COfficeActivatorDlg::OnBnClickedButtonCheckPatchStatus ()
417425{
426+ WaitForSingleObject (g_Mutex, INFINITE);
427+
418428 DWORD checkResult = 0 ;
419429 CString officePath, msoPath;
420430 if (GetDlgItemText (IDC_EDIT_OFFICE_PATH, officePath) == 0 ||
@@ -483,14 +493,12 @@ void COfficeActivatorDlg::OnBnClickedButtonCheckPatchStatus()
483493
484494 officePatch->Invalidate ();
485495 msoPatch->Invalidate ();
496+
497+ ReleaseMutex (g_Mutex);
486498}
487499
488- void COfficeActivatorDlg::OnBnClickedButtonPatch ()
500+ void COfficeActivatorDlg::OnBnClickedButtonPatchInternal ()
489501{
490- if (MessageBox (_T (" DO YOU REALLY WANT TO APPLY PATCH?" ), _T (" WARNING" ), MB_YESNOCANCEL | MB_ICONWARNING) != IDYES) {
491- return ;
492- }
493-
494502 if (m_PatchState == ~0 ) {
495503 MessageBox (_T (" Please check patch state first!" ), _T (" Error" ));
496504 return ;
@@ -576,16 +584,27 @@ void COfficeActivatorDlg::OnBnClickedButtonPatch()
576584 }
577585
578586 } while (false );
579-
580- OnBnClickedButtonCheckPatchStatus ();
581587}
582588
583- void COfficeActivatorDlg::OnBnClickedButtonRestore ()
584- {
585- if (MessageBox (_T (" DO YOU REALLY WANT TO RESTORE PATCH?" ), _T (" WARNING" ), MB_YESNOCANCEL | MB_ICONWARNING) != IDYES) {
589+ void COfficeActivatorDlg::OnBnClickedButtonPatch () {
590+ if (MessageBox (_T (" DO YOU REALLY WANT TO APPLY PATCH?" ), _T (" WARNING" ), MB_YESNOCANCEL | MB_ICONWARNING) != IDYES) {
586591 return ;
587592 }
588593
594+ WaitForSingleObject (g_Mutex, INFINITE);
595+ OnBnClickedButtonCheckPatchStatus ();
596+
597+ __try {
598+ OnBnClickedButtonPatchInternal ();
599+ }
600+ __finally {
601+ OnBnClickedButtonCheckPatchStatus ();
602+ ReleaseMutex (g_Mutex);
603+ }
604+ }
605+
606+ void COfficeActivatorDlg::OnBnClickedButtonRestoreInternal ()
607+ {
589608 if (m_PatchState == ~0 ) {
590609 MessageBox (_T (" Please check patch state first!" ), _T (" Error" ));
591610 return ;
@@ -636,11 +655,26 @@ void COfficeActivatorDlg::OnBnClickedButtonRestore()
636655 return ;
637656 }
638657 }
658+ }
639659
640- //
641- // Update patch status.
642- //
660+ void COfficeActivatorDlg::OnBnClickedButtonRestore () {
661+ if (MessageBox (_T (" DO YOU REALLY WANT TO RESTORE PATCH?\n (Maybe you need disable or delete OfficeActivatorSvc)" ), _T (" WARNING" ), MB_YESNOCANCEL | MB_ICONWARNING) != IDYES) {
662+ return ;
663+ }
664+
665+ WaitForSingleObject (g_Mutex, INFINITE);
643666 OnBnClickedButtonCheckPatchStatus ();
667+
668+ __try {
669+ OnBnClickedButtonRestoreInternal ();
670+ }
671+ __finally {
672+ //
673+ // Update patch status.
674+ //
675+ OnBnClickedButtonCheckPatchStatus ();
676+ ReleaseMutex (g_Mutex);
677+ }
644678}
645679
646680void COfficeActivatorDlg::OnBnClickedButtonUpdateLic ()
@@ -888,3 +922,23 @@ void COfficeActivatorDlg::OnBnClickedButtonUninstallLic()
888922
889923 OnBnClickedButtonUpdateLic ();
890924}
925+
926+ void COfficeActivatorDlg::OnBnClickedButtonSvcManage ()
927+ {
928+ CString app;
929+ CString mso;
930+ GetDlgItemText (IDC_EDIT_MSO_PATH, mso);
931+
932+ if (mso.GetLength () == 0 ) {
933+ MessageBox (_T (" Please select the location of the MSO.DLL file." ), _T (" Info" ), MB_OK);
934+ return ;
935+ }
936+
937+ AfxGetModuleFileName (AfxGetInstanceHandle (), app);
938+
939+ CString path;
940+ path.Format (_T (" %s -mso \" %s\" " ), (LPCTSTR)app, (LPCTSTR)mso);
941+
942+ CServiceManageDlg dlg (path);
943+ dlg.DoModal ();
944+ }
0 commit comments