|
19 | 19 | #include <comdef.h>
|
20 | 20 | #include <comutil.h>
|
21 | 21 | #include <sddl.h>
|
| 22 | +#include <winsvc.h> |
22 | 23 |
|
23 | 24 | #define BUFFER_SIZE 1024
|
24 | 25 |
|
@@ -509,26 +510,32 @@ namespace _com_util
|
509 | 510 | }
|
510 | 511 | }
|
511 | 512 |
|
512 |
| -/* Stop QGA VSS provider service from COM+ Application Admin Catalog */ |
513 |
| - |
| 513 | +/* Stop QGA VSS provider service using Winsvc API */ |
514 | 514 | STDAPI StopService(void)
|
515 | 515 | {
|
516 | 516 | HRESULT hr;
|
517 |
| - COMInitializer initializer; |
518 |
| - COMPointer<IUnknown> pUnknown; |
519 |
| - COMPointer<ICOMAdminCatalog2> pCatalog; |
| 517 | + SC_HANDLE manager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); |
| 518 | + SC_HANDLE service = NULL; |
520 | 519 |
|
521 |
| - int count = 0; |
| 520 | + if (!manager) { |
| 521 | + errmsg(E_FAIL, "Failed to open service manager"); |
| 522 | + hr = E_FAIL; |
| 523 | + goto out; |
| 524 | + } |
| 525 | + service = OpenService(manager, QGA_PROVIDER_NAME, SC_MANAGER_ALL_ACCESS); |
522 | 526 |
|
523 |
| - chk(QGAProviderFind(QGAProviderCount, (void *)&count)); |
524 |
| - if (count) { |
525 |
| - chk(CoCreateInstance(CLSID_COMAdminCatalog, NULL, CLSCTX_INPROC_SERVER, |
526 |
| - IID_IUnknown, (void **)pUnknown.replace())); |
527 |
| - chk(pUnknown->QueryInterface(IID_ICOMAdminCatalog2, |
528 |
| - (void **)pCatalog.replace())); |
529 |
| - chk(pCatalog->ShutdownApplication(_bstr_t(QGA_PROVIDER_LNAME))); |
| 527 | + if (!service) { |
| 528 | + errmsg(E_FAIL, "Failed to open service"); |
| 529 | + hr = E_FAIL; |
| 530 | + goto out; |
| 531 | + } |
| 532 | + if (!(ControlService(service, SERVICE_CONTROL_STOP, NULL))) { |
| 533 | + errmsg(E_FAIL, "Failed to stop service"); |
| 534 | + hr = E_FAIL; |
530 | 535 | }
|
531 | 536 |
|
532 | 537 | out:
|
| 538 | + CloseServiceHandle(service); |
| 539 | + CloseServiceHandle(manager); |
533 | 540 | return hr;
|
534 | 541 | }
|
0 commit comments