258 lines
5.2 KiB
C++
258 lines
5.2 KiB
C++
//#define _WIN32_DCOM
|
|
#define RCLENGTH 50
|
|
|
|
#include <objbase.h>
|
|
#include <winsvc.h>
|
|
#include <tchar.h>
|
|
#include <stdio.h>
|
|
#include <wbemcli.h>
|
|
|
|
int StartWMI()
|
|
{
|
|
OutputDebugString (L"StartWMI\n");
|
|
int bFailed = TRUE;
|
|
DWORD dwRC = NULL;
|
|
|
|
SC_HANDLE hSvcCtrlMgrDB = OpenSCManager ( NULL , NULL , GENERIC_READ ) ;
|
|
if ( hSvcCtrlMgrDB )
|
|
{
|
|
SC_HANDLE hService = OpenService ( hSvcCtrlMgrDB , L"Windows Management Instrumentation" , SERVICE_START ) ;
|
|
if ( hService )
|
|
{
|
|
BOOL RC = StartService ( hService , 0 , NULL ) ;
|
|
if ( RC )
|
|
{
|
|
bFailed = FALSE;
|
|
OutputDebugString (L"Service Started\n");
|
|
}
|
|
else
|
|
{
|
|
dwRC = GetLastError();
|
|
|
|
TCHAR RCText[RCLENGTH];
|
|
swprintf(RCText, L"0x%d", dwRC);
|
|
|
|
OutputDebugString(L"Service did not start. Error code: ");
|
|
OutputDebugString(RCText);
|
|
OutputDebugString(L"\r\n");
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
dwRC = GetLastError();
|
|
|
|
TCHAR RCText[RCLENGTH];
|
|
swprintf(RCText, L"0x%d", dwRC);
|
|
|
|
OutputDebugString(L"Could not get handle to service. Error code: ");
|
|
OutputDebugString(RCText);
|
|
OutputDebugString(L"\r\n");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwRC = GetLastError();
|
|
|
|
TCHAR RCText[RCLENGTH];
|
|
swprintf(RCText, L"0x%d", dwRC);
|
|
|
|
OutputDebugString(L"Could not get handle to SCM. Error code: ");
|
|
OutputDebugString(RCText);
|
|
OutputDebugString(L"\r\n");
|
|
}
|
|
return bFailed;
|
|
}
|
|
|
|
int StopWMI()
|
|
{
|
|
OutputDebugString (L"StopWMI\n");
|
|
int bFailed = TRUE;
|
|
DWORD dwRC = NULL;
|
|
|
|
SC_HANDLE hSvcCtrlMgrDB = OpenSCManager (NULL, NULL, GENERIC_READ);
|
|
if ( hSvcCtrlMgrDB )
|
|
{
|
|
SC_HANDLE hService = OpenService (hSvcCtrlMgrDB, L"winmgmt", SERVICE_STOP);
|
|
if ( hService )
|
|
{
|
|
SERVICE_STATUS lpServiceStatus;
|
|
|
|
BOOL RC = ControlService (hService, SERVICE_CONTROL_STOP, &lpServiceStatus);
|
|
if ( RC )
|
|
{
|
|
bFailed = FALSE;
|
|
OutputDebugString (L"Service Stopped\n");
|
|
}
|
|
else
|
|
{
|
|
dwRC = GetLastError();
|
|
|
|
TCHAR RCText[RCLENGTH];
|
|
swprintf(RCText, L"0x%d", dwRC);
|
|
|
|
OutputDebugString(L"Service did not be stopped. Error code: ");
|
|
OutputDebugString(RCText);
|
|
OutputDebugString(L"\r\n");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwRC = GetLastError();
|
|
|
|
TCHAR RCText[RCLENGTH];
|
|
swprintf(RCText, L"0x%d", dwRC);
|
|
|
|
OutputDebugString(L"Could not get handle to service. Error code: ");
|
|
OutputDebugString(RCText);
|
|
OutputDebugString(L"\r\n");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwRC = GetLastError();
|
|
|
|
TCHAR RCText[RCLENGTH];
|
|
swprintf(RCText, L"0x%d", dwRC);
|
|
|
|
OutputDebugString(L"Could not get handle to SCM. Error code: ");
|
|
OutputDebugString(RCText);
|
|
OutputDebugString(L"\r\n");
|
|
}
|
|
return bFailed;
|
|
}
|
|
|
|
HRESULT DelNamespace (IWbemLocator *pWbemLocator, BSTR bsParentNamespace, BSTR bsTargetNamespace)
|
|
{
|
|
HRESULT hres = 0;
|
|
IWbemServices *pWbemServices = NULL;
|
|
|
|
hres = pWbemLocator->ConnectServer(bsParentNamespace,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
0L,
|
|
NULL,
|
|
NULL,
|
|
&pWbemServices);
|
|
if (FAILED(hres))
|
|
{
|
|
OutputDebugString(L"Could not connect to parent namespace.\n");
|
|
return hres;
|
|
}
|
|
|
|
hres = pWbemServices->DeleteInstance(bsTargetNamespace,
|
|
NULL,
|
|
NULL,
|
|
NULL);
|
|
|
|
pWbemServices->Release();
|
|
pWbemServices = NULL;
|
|
|
|
return hres;
|
|
}
|
|
|
|
HRESULT clean()
|
|
{
|
|
OutputDebugString(L"clean function\n");
|
|
|
|
HRESULT hres = CoInitialize(NULL);
|
|
|
|
hres = CoInitializeSecurity(NULL, -1, NULL, NULL,
|
|
RPC_C_AUTHN_LEVEL_CONNECT,
|
|
RPC_C_IMP_LEVEL_IMPERSONATE,
|
|
NULL, 0, 0);
|
|
|
|
if (FAILED(hres))
|
|
{
|
|
OutputDebugString(L"CoInitializeSecurity Failed\n");
|
|
return hres;
|
|
}
|
|
|
|
IWbemLocator *pIWbemLocator = NULL;
|
|
|
|
hres = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER,
|
|
IID_IWbemLocator, (LPVOID *) &pIWbemLocator);
|
|
if (FAILED(hres))
|
|
{
|
|
OutputDebugString(L"CoCreateInstance Failed\n");
|
|
CoUninitialize();
|
|
return hres;
|
|
}
|
|
|
|
BSTR bsParentNS = NULL;
|
|
BSTR bsTargetNS = NULL;
|
|
|
|
// Delete root\healthmon namespace if exists
|
|
bsParentNS = SysAllocString (L"\\\\.\\root");
|
|
bsTargetNS = SysAllocString (L"__namespace.name=\"HealthMon\"");
|
|
|
|
hres = DelNamespace(pIWbemLocator, bsParentNS, bsTargetNS);
|
|
|
|
SysFreeString(bsParentNS);
|
|
SysFreeString(bsTargetNS);
|
|
|
|
if (FAILED(hres))
|
|
{
|
|
OutputDebugString(L"Could not delete root\\healthmon\n");
|
|
}
|
|
|
|
// Delete root\cimv2\MicrosoftHealthMonitor namespace if exists
|
|
bsParentNS = SysAllocString (L"\\\\.\\root\\cimv2");
|
|
bsTargetNS = SysAllocString (L"__namespace.name=\"MicrosoftHealthMonitor\"");
|
|
|
|
hres = DelNamespace(pIWbemLocator, bsParentNS, bsTargetNS);
|
|
|
|
SysFreeString(bsParentNS);
|
|
SysFreeString(bsTargetNS);
|
|
|
|
if (FAILED(hres))
|
|
{
|
|
OutputDebugString(L"Could not delete root\\cimv2\\MicrosoftHealthMonitor\n");
|
|
}
|
|
|
|
pIWbemLocator->Release();
|
|
pIWbemLocator = NULL;
|
|
|
|
|
|
StopWMI();
|
|
|
|
CoUninitialize();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
int upgrade()
|
|
{
|
|
OutputDebugString(L"upgrade function\n");
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
int APIENTRY WinMain(HINSTANCE hInstance,
|
|
HINSTANCE hPrevInstance,
|
|
LPSTR lpCmdLine,
|
|
int nCmdShow)
|
|
{
|
|
#ifdef SAVE
|
|
_strupr (lpCmdLine);
|
|
|
|
if (wcsstr(lpCmdLine, L"/CLEAN"))
|
|
{
|
|
OutputDebugString(L"clean command line\n");
|
|
return clean();
|
|
}
|
|
|
|
if (wcsstr(lpCmdLine, L"/UPGRADE"))
|
|
{
|
|
OutputDebugString(L"upgrade command line\n");
|
|
return upgrade();
|
|
}
|
|
|
|
return FALSE;
|
|
#endif
|
|
return clean();
|
|
}
|
|
|