From 1688d4b644dc2bb82f2b175b4200c70ace570975 Mon Sep 17 00:00:00 2001 From: Alexander Usyskin Date: Tue, 12 Jul 2022 08:16:05 +0300 Subject: [PATCH] LMS: WMIProv: remove IMSS uninstallation code Revert "WMIProv: WMIRegistrationService: uninstall IMSS" This reverts commit b480af27365dc3938a727a638fe8fabcb851ca6a. Signed-off-by: Alexander Usyskin --- .../WMIRegistrationService/CMakeLists.txt | 10 +- .../EventLogMessages.mc | 14 +- MEWMIProv/WMIRegistrationService/GetSKU.cpp | 164 ---- .../WMIRegistrationService/RegistryAccess.cpp | 72 -- .../WMIRegistrationService/UninstalIMSS.cpp | 69 -- .../WMIRegistrationService.cpp | 804 ++++++++---------- .../WMIRegistrationService.h | 25 - 7 files changed, 360 insertions(+), 798 deletions(-) delete mode 100644 MEWMIProv/WMIRegistrationService/GetSKU.cpp delete mode 100644 MEWMIProv/WMIRegistrationService/RegistryAccess.cpp delete mode 100644 MEWMIProv/WMIRegistrationService/UninstalIMSS.cpp delete mode 100644 MEWMIProv/WMIRegistrationService/WMIRegistrationService.h diff --git a/MEWMIProv/WMIRegistrationService/CMakeLists.txt b/MEWMIProv/WMIRegistrationService/CMakeLists.txt index 977d5d84..216d6437 100644 --- a/MEWMIProv/WMIRegistrationService/CMakeLists.txt +++ b/MEWMIProv/WMIRegistrationService/CMakeLists.txt @@ -1,9 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 -# Copyright (C) 2021-2022 Intel Corporation +# Copyright (C) 2021 Intel Corporation cmake_minimum_required (VERSION 3.1) -set (CMAKE_CXX_STANDARD 17) - set(WMI_REG_SVC_MESSAGE_FILES ${CMAKE_CURRENT_BINARY_DIR}/EventLogMessages.h ${CMAKE_CURRENT_BINARY_DIR}/EventLogMessages.rc @@ -27,9 +25,6 @@ set_source_files_properties( add_executable(WMIRegistrationService EventLog.cpp - GetSKU.cpp - RegistryAccess.cpp - UninstalIMSS.cpp WMIRegistrationService.cpp WMIRegistrationService.rc ${CMAKE_CURRENT_BINARY_DIR}/EventLogMessages.rc @@ -43,10 +38,9 @@ target_include_directories(WMIRegistrationService PRIVATE target_link_libraries(WMIRegistrationService Shlwapi.lib Pathcch.lib - Cfgmgr32.lib - WindowsApp.lib ) + if(CMAKE_CXX_COMPILER_ID MATCHES MSVC) set_target_properties(WMIRegistrationService PROPERTIES COMPILE_PDB_NAME WMIRegistrationService diff --git a/MEWMIProv/WMIRegistrationService/EventLogMessages.mc b/MEWMIProv/WMIRegistrationService/EventLogMessages.mc index 5e747572..7fe81cfb 100644 --- a/MEWMIProv/WMIRegistrationService/EventLogMessages.mc +++ b/MEWMIProv/WMIRegistrationService/EventLogMessages.mc @@ -1,6 +1,6 @@ ;//SPDX-License-Identifier: Apache-2.0 ;// -;//Copyright (C) 2021-2022 Intel Corporation +;//Copyright (C) 2021 Intel Corporation SeverityNames=(Informational=0x1:STATUS_SEVERITY_INFORMATIONAL Warning=0x2:STATUS_SEVERITY_WARNING @@ -34,15 +34,3 @@ SymbolicName=MSG_REGISTRATION_FAILURE Language=All Intel(R) WMI Registration Service has failed WMI Registration. . -MessageId=4 -Severity=Informational -SymbolicName=MSG_IMSS_REMOVAL_SUCCESS -Language=All -Intel(R) WMI Registration Service has successfully removed IMSS. -. -MessageId=5 -Severity=Error -SymbolicName=MSG_IMSS_REMOVAL_FAILURE -Language=All -Intel(R) WMI Registration Service has failed to remove IMSS. -. diff --git a/MEWMIProv/WMIRegistrationService/GetSKU.cpp b/MEWMIProv/WMIRegistrationService/GetSKU.cpp deleted file mode 100644 index 6b4e82a9..00000000 --- a/MEWMIProv/WMIRegistrationService/GetSKU.cpp +++ /dev/null @@ -1,164 +0,0 @@ -//SPDX-License-Identifier: Apache-2.0 -// -//Copyright (C) 2022 Intel Corporation -#include -#include -#include -#include -#include -#include - -#include "WMIRegistrationService.h" -namespace WMIRegistrationService -{ - namespace { - // Define GUID used to find the HECI device - // {E2D1FF34-3458-49A9-88DA-8E6915CE9BE5} - DEFINE_GUID(GUID_DEVINTERFACE_HECI, - 0xE2D1FF34, 0x3458, 0x49A9, 0x88, 0xDA, 0x8E, 0x69, 0x15, 0xCE, 0x9B, 0xE5); - - bool GetDevicePaths(_In_ LPCGUID InterfaceGuid, _Inout_ std::vector& paths) - { - CONFIGRET cr = CR_SUCCESS; - DWORD win32Err = ERROR_GEN_FAILURE; - std::vector deviceInterfaceList; - ULONG deviceInterfaceListLength = 0; - - cr = CM_Get_Device_Interface_List_SizeW( - &deviceInterfaceListLength, - (LPGUID)InterfaceGuid, - nullptr, - CM_GET_DEVICE_INTERFACE_LIST_PRESENT); - if (cr != CR_SUCCESS) { - win32Err = CM_MapCrToWin32Err(cr, ERROR_GEN_FAILURE); - DbgPrint(L"CM_Get_Device_Interface_List_SizeW falied %ul", win32Err); - return false; - } - - if (deviceInterfaceListLength <= 1) { - DbgPrint(L"CM_Get_Device_Interface_List_SizeW %ul <= 1", deviceInterfaceListLength); - return false; - } - - deviceInterfaceList.resize(deviceInterfaceListLength); - - ZeroMemory((void*)deviceInterfaceList.data(), deviceInterfaceListLength * sizeof(wchar_t)); - - cr = CM_Get_Device_Interface_ListW( - (LPGUID)InterfaceGuid, - nullptr, - deviceInterfaceList.data(), - deviceInterfaceListLength, - CM_GET_DEVICE_INTERFACE_LIST_PRESENT); - if (cr != CR_SUCCESS) { - win32Err = CM_MapCrToWin32Err(cr, ERROR_GEN_FAILURE); - DbgPrint(L"CM_Get_Device_Interface_ListW falied %ul", win32Err); - return false; - } - - // Search for ALL NULL-terminated strings in the array/vector - std::vector::const_iterator start = cbegin(deviceInterfaceList); - for (auto iter = start; iter != cend(deviceInterfaceList); iter++) - { - // got to NULL-terminated string end - if (*iter == 0x00) - { - std::wstring path; - path.resize(MAX_PATH); - std::copy(start, iter++, std::begin(path)); - start = iter; - paths.push_back(std::wstring(cbegin(path), cend(path))); - } - } - - return true; - } - - bool GetSKU(int& sku) - { - CONFIGRET cr = CR_DEFAULT; - DWORD win32Err = ERROR_GEN_FAILURE; - - std::vector devicePaths; - if (!GetDevicePaths(&GUID_DEVINTERFACE_HECI, devicePaths)) - { - DbgPrint(L"GetDevicePaths falied"); - return false; - } - if (devicePaths.empty()) - { - DbgPrint(L"DevicePaths is empty"); - return false; - } - - std::vector instanceIdVec(MAX_PATH); - DEVPROPTYPE propType = 0; - ULONG propLen = (ULONG)instanceIdVec.size(); - cr = CM_Get_Device_Interface_PropertyW(devicePaths[0].c_str(), &DEVPKEY_Device_InstanceId, &propType, (PBYTE)instanceIdVec.data(), &propLen, 0); - if (cr != CR_SUCCESS) { - win32Err = CM_MapCrToWin32Err(cr, ERROR_GEN_FAILURE); - DbgPrint(L"CM_Get_Device_Interface_PropertyW falied %ul", win32Err); - return false; - } - if (DEVPROP_TYPE_STRING != propType) - { - DbgPrint(L"DEVPKEY_Device_InstanceId is not a string"); - return false; - } - - DEVINST devInstHandle; - cr = CM_Locate_DevNodeW(&devInstHandle, (DEVINSTID_W)instanceIdVec.data(), 0); - if (cr != CR_SUCCESS) { - win32Err = CM_MapCrToWin32Err(cr, ERROR_GEN_FAILURE); - DbgPrint(L"CM_Locate_DevNodeW falied %ul", win32Err); - return false; - } - - std::vector FirmwareRevisionVec(MAX_PATH); - propLen = (ULONG)FirmwareRevisionVec.size(); - - cr = CM_Get_DevNode_PropertyW(devInstHandle, &DEVPKEY_Device_FirmwareRevision, &propType, - (PBYTE)FirmwareRevisionVec.data(), &propLen, 0); - if (cr != CR_SUCCESS) { - win32Err = CM_MapCrToWin32Err(cr, ERROR_GEN_FAILURE); - DbgPrint(L"CM_Get_DevNode_PropertyW falied %ul", win32Err); - return false; - } - if (DEVPROP_TYPE_STRING != propType) - { - DbgPrint(L"DEVPKEY_Device_FirmwareRevision is not a string"); - return false; - } - - std::wstring FirmwareRevision(cbegin(FirmwareRevisionVec), cend(FirmwareRevisionVec)); - - if (FirmwareRevision.substr(0, 4) != L"SKU " || FirmwareRevision[5] != ' ') - { - DbgPrint(L"DEVPKEY_Device_FirmwareRevision '%s' is misformatted", FirmwareRevision.c_str()); - return false; - } - - sku = FirmwareRevision[4] - '0'; - - return true; - } - } - - bool IsSKUCorporate(bool &corporate_sku) - { - int sku = 0; - - if (!GetSKU(sku)) - return false; - - if (sku != 3) - { - DbgPrint(L"SKU %d is not Corporate (3)", sku); - corporate_sku = false; - return true; - } - corporate_sku = true; - - return true; - } -}; \ No newline at end of file diff --git a/MEWMIProv/WMIRegistrationService/RegistryAccess.cpp b/MEWMIProv/WMIRegistrationService/RegistryAccess.cpp deleted file mode 100644 index 6d5a3950..00000000 --- a/MEWMIProv/WMIRegistrationService/RegistryAccess.cpp +++ /dev/null @@ -1,72 +0,0 @@ -//SPDX-License-Identifier: Apache-2.0 -// -//Copyright (C) 2022 Intel Corporation - -#include -#include -#include "WMIRegistrationService.h" - -namespace WMIRegistrationService -{ - const std::wstring& reg_name = L"SYSTEM\\CurrentControlSet\\Services\\WMIRegistrationService\\UninstallIMSS"; - - bool RegistryRead(const std::wstring& name, unsigned long& value) - { - bool ret; - LSTATUS res; - HKEY hKey; - unsigned long valsz = sizeof(value); - - res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, reg_name.c_str(), 0, KEY_QUERY_VALUE, &hKey); - if (res != ERROR_SUCCESS) - { - DbgPrint(L"RegOpenKeyExW falied %d", res); - return false; - } - - res = RegGetValueW(hKey, NULL, name.c_str(), RRF_RT_REG_DWORD, NULL, &value, &valsz); - if (res != ERROR_SUCCESS) - { - DbgPrint(L"RegGetValueW falied %d", res); - ret = false; - } - else - { - ret = true; - - } - RegCloseKey(hKey); - - return ret; - } - - bool RegistryWrite(const std::wstring& name, unsigned long value) - { - bool ret; - LSTATUS res; - HKEY hKey; - unsigned long valsz = sizeof(value); - - res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, reg_name.c_str(), 0, KEY_SET_VALUE, &hKey); - if (res != ERROR_SUCCESS) - { - DbgPrint(L"RegOpenKeyExW falied %d", res); - return false; - } - - res = RegSetValueExW(hKey, name.c_str(), 0, REG_DWORD, (BYTE*)&value, valsz); - if (res != ERROR_SUCCESS) - { - DbgPrint(L"RegGetValueW falied %d", res); - ret = false; - } - else - { - ret = true; - - } - RegCloseKey(hKey); - - return ret; - } -}; \ No newline at end of file diff --git a/MEWMIProv/WMIRegistrationService/UninstalIMSS.cpp b/MEWMIProv/WMIRegistrationService/UninstalIMSS.cpp deleted file mode 100644 index 7a52c190..00000000 --- a/MEWMIProv/WMIRegistrationService/UninstalIMSS.cpp +++ /dev/null @@ -1,69 +0,0 @@ -//SPDX-License-Identifier: Apache-2.0 -// -//Copyright (C) 2022 Intel Corporation -#include -#include -#include -#include "WMIRegistrationService.h" - -namespace WMIRegistrationService -{ - namespace - { - winrt::hstring IsIMSSInstalled() - { - auto packages = winrt::Windows::Management::Deployment::PackageManager{}.FindPackages(); - for (auto const& package : packages) - { - if (package.Id().Name() == L"AppUp.IntelManagementandSecurityStatus") - { - return package.Id().FullName(); - } - } - - DbgPrint(L"IMSS is not installed"); - return winrt::hstring(); - } - - UNINSTALLIMSS_STATUS UninstallByName(winrt::hstring name) - { - DbgPrint(L"IMSS UninstallByName %s", name.c_str()); - auto deploymentOperation{ winrt::Windows::Management::Deployment::PackageManager{}.RemovePackageAsync(name, - winrt::Windows::Management::Deployment::RemovalOptions::RemoveForAllUsers) }; - deploymentOperation.get(); - - // Check the status of the operation - if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Error) - { - auto deploymentResult{ deploymentOperation.GetResults() }; - DbgPrint(L"Failed to uninstall IMSS (%d) %s.", deploymentOperation.ErrorCode(), deploymentResult.ErrorText().c_str()); - return UNINSTALLIMSS_STATUS::FAILED; - } - else if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Canceled) - { - DbgPrint(L"Failed to uninstall IMSS - cancelled."); - return UNINSTALLIMSS_STATUS::FAILED; - } - else if (deploymentOperation.Status() == winrt::Windows::Foundation::AsyncStatus::Completed) - { - return UNINSTALLIMSS_STATUS::SUCCCEDED; - } - DbgPrint(L"Failed to uninstall IMSS - unknown."); - return UNINSTALLIMSS_STATUS::FAILED; - } - } - - UNINSTALLIMSS_STATUS UninstallIMSS() - { - winrt::init_apartment(); - - auto fullName = IsIMSSInstalled(); - if (fullName == winrt::hstring()) - { - DbgPrint(L"IMSS not installed - ignoring."); - return UNINSTALLIMSS_STATUS::NOT_NEEDED; - } - - return UninstallByName(fullName); - } -}; \ No newline at end of file diff --git a/MEWMIProv/WMIRegistrationService/WMIRegistrationService.cpp b/MEWMIProv/WMIRegistrationService/WMIRegistrationService.cpp index 6120a2ee..ea569212 100644 --- a/MEWMIProv/WMIRegistrationService/WMIRegistrationService.cpp +++ b/MEWMIProv/WMIRegistrationService/WMIRegistrationService.cpp @@ -1,541 +1,451 @@ //SPDX-License-Identifier: Apache-2.0 // -//Copyright (C) 2021-2022 Intel Corporation +//Copyright (C) 2021 Intel Corporation #include "shlwapi.h" #include -#include "WMIRegistrationService.h" #include "EventLog.h" -#include "EventLogMessages.h" // auto generated from mc file +#include "EventLogMessages.h" // auto generated form mc file #include "pathcch.h" #include "Shlobj.h" -namespace WMIRegistrationService + +// +// Settings of the service +// +#define SERVICE_NAME L"Intel(R) WMI Registration Service" +const unsigned int SERVICE_FLAGS_STARTED = 0x0; +const unsigned int SERVICE_FLAGS_DONE = 0x1; +const unsigned int WAIT_FOR_COMPILITION_IN_MILLI = 1000000; +const unsigned int STATUS_SUCCESS = 0; +const unsigned int STATUS_UNSUCCESSFUL = -1; +const unsigned int SERVICE_WAIT_HINT_TIME = 30000; // 30 seconds +const unsigned int DEBUG_MSG_LEN = 260; + +// +// Service context +// +SERVICE_STATUS_HANDLE StatusHandle = NULL; +volatile LONG ControlFlags = 0; +HANDLE StopRequestEvent = NULL; +HANDLE StopWaitObject = NULL; + +VOID DbgPrint(_In_ const wchar_t* args, ...) { - // - // Settings of the service - // - #define SERVICE_NAME L"Intel(R) WMI Registration Service" - const unsigned int SERVICE_FLAGS_STARTED = 0x0; - const unsigned int SERVICE_FLAGS_DONE = 0x1; - const unsigned int WAIT_FOR_COMPILITION_IN_MILLI = 1000000; - const unsigned int STATUS_SUCCESS = 0; - const unsigned int STATUS_UNSUCCESSFUL = -1; - const unsigned int SERVICE_WAIT_HINT_TIME = 30000; // 30 seconds - const unsigned int DEBUG_MSG_LEN = 260; + std::wstring dbgPrefix = SERVICE_NAME; + dbgPrefix += L": "; + wchar_t msg[DEBUG_MSG_LEN + 1]; + //no point in checking return code, nothing to do if fails. + wcscpy_s(msg, DEBUG_MSG_LEN, dbgPrefix.c_str()); + va_list varl; + va_start(varl, args); + vswprintf_s(&msg[dbgPrefix.size()], DEBUG_MSG_LEN - dbgPrefix.size(), args, varl); + va_end(varl); + + OutputDebugString(msg); +} - // - // Service context - // - SERVICE_STATUS_HANDLE StatusHandle = NULL; - volatile LONG ControlFlags = 0; - HANDLE StopRequestEvent = NULL; - HANDLE StopWaitObject = NULL; +_Check_return_ +std::wstring GetServicePath() +{ + WCHAR szSource[MAX_PATH]; + std::wstring source; - void DbgPrint(_In_ const wchar_t* args, ...) + DWORD pathErr = GetModuleFileName(0, szSource, MAX_PATH); + if (pathErr == 0) { - std::wstring dbgPrefix = SERVICE_NAME; - dbgPrefix += L": "; - wchar_t msg[DEBUG_MSG_LEN + 1]; - //no point in checking return code, nothing to do if fails. - wcscpy_s(msg, DEBUG_MSG_LEN, dbgPrefix.c_str()); - va_list varl; - va_start(varl, args); - vswprintf_s(&msg[dbgPrefix.size()], DEBUG_MSG_LEN - dbgPrefix.size(), args, varl); - va_end(varl); - - OutputDebugString(msg); + DbgPrint(L"GetModuleFileName Failed with %ul ", GetLastError()); } - _Check_return_ - std::wstring GetServicePath() + HRESULT hr = PathCchRemoveFileSpec(szSource, MAX_PATH); + if (hr != S_OK) { - WCHAR szSource[MAX_PATH]; - std::wstring source; - - DWORD pathErr = GetModuleFileName(0, szSource, MAX_PATH); - if (pathErr == 0) - { - DbgPrint(L"GetModuleFileName Failed with %ul ", GetLastError()); - } - - HRESULT hr = PathCchRemoveFileSpec(szSource, MAX_PATH); - if (hr != S_OK) - { - DbgPrint(L"PathCchRemoveExtension Failed with %ul ", hr); - return std::wstring(); - } - source = std::wstring(szSource); - DbgPrint(L"Service exe path is %s", source.c_str()); - return source; + DbgPrint(L"PathCchRemoveExtension Failed with %ul ", hr); + return std::wstring(); } + source = std::wstring(szSource); + DbgPrint(L"Service exe path is %s" , source.c_str()); + return source; +} - std::wstring GetServiceState(_In_ DWORD currnetState) +std::wstring GetServiceState(_In_ DWORD currnetState) +{ + std::wstring state; + switch (currnetState) { - std::wstring state; - switch (currnetState) - { - case SERVICE_STOPPED: - state = L"SERVICE_STOPPED"; - break; - case SERVICE_START_PENDING: - state = L"SERVICE_START_PENDING"; - break; - case SERVICE_STOP_PENDING: - state = L"SERVICE_STOP_PENDING"; - break; - case SERVICE_RUNNING: - state = L"SERVICE_RUNNING"; - break; - case SERVICE_CONTINUE_PENDING: - state = L"SERVICE_CONTINUE_PENDING"; - break; - case SERVICE_PAUSE_PENDING: - state = L"SERVICE_PAUSE_PENDING"; - break; - case SERVICE_PAUSED: - state = L"SERVICE_PAUSED"; - break; - default: - state = L"UNKNOWN STATE"; - break; - } - return state; + case SERVICE_STOPPED: + state = L"SERVICE_STOPPED"; + break; + case SERVICE_START_PENDING: + state = L"SERVICE_START_PENDING"; + break; + case SERVICE_STOP_PENDING: + state = L"SERVICE_STOP_PENDING"; + break; + case SERVICE_RUNNING: + state = L"SERVICE_RUNNING"; + break; + case SERVICE_CONTINUE_PENDING: + state = L"SERVICE_CONTINUE_PENDING"; + break; + case SERVICE_PAUSE_PENDING: + state = L"SERVICE_PAUSE_PENDING"; + break; + case SERVICE_PAUSED: + state = L"SERVICE_PAUSED"; + break; + default: + state = L"UNKNOWN STATE"; + break; } + return state; +} - BOOL UpdateServiceStatus( - _In_ SERVICE_STATUS_HANDLE hHandle, - _In_ DWORD dwCurrentState, - _In_ DWORD dwWin32ExitCode +BOOL UpdateServiceStatus( + _In_ SERVICE_STATUS_HANDLE hHandle, + _In_ DWORD dwCurrentState, + _In_ DWORD dwWin32ExitCode ) - { - SERVICE_STATUS Status; - - DbgPrint(L"Update service state to %s", GetServiceState(dwCurrentState)); +{ + SERVICE_STATUS Status; - static DWORD dwCheckPoint = 1; + DbgPrint(L"Update service state to %s", GetServiceState(dwCurrentState)); - Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - Status.dwCurrentState = dwCurrentState; - Status.dwWin32ExitCode = dwWin32ExitCode; - Status.dwServiceSpecificExitCode = ERROR_SUCCESS; + static DWORD dwCheckPoint = 1; - if (dwCurrentState == SERVICE_START_PENDING) - { - Status.dwControlsAccepted = 0; - } - else - { - Status.dwControlsAccepted = SERVICE_ACCEPT_STOP; - } + Status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + Status.dwCurrentState = dwCurrentState; + Status.dwWin32ExitCode = dwWin32ExitCode; + Status.dwServiceSpecificExitCode = ERROR_SUCCESS; - if ((dwCurrentState == SERVICE_RUNNING) || - (dwCurrentState == SERVICE_STOPPED)) - { - Status.dwCheckPoint = 0; - Status.dwWaitHint = 0; - } - else - { - Status.dwCheckPoint = dwCheckPoint++; - Status.dwWaitHint = SERVICE_WAIT_HINT_TIME; - } + if (dwCurrentState == SERVICE_START_PENDING) + { + Status.dwControlsAccepted = 0; + } + else + { + Status.dwControlsAccepted = SERVICE_ACCEPT_STOP; + } - return SetServiceStatus(hHandle, &Status); + if ((dwCurrentState == SERVICE_RUNNING) || + (dwCurrentState == SERVICE_STOPPED)) + { + Status.dwCheckPoint = 0; + Status.dwWaitHint = 0; + } + else + { + Status.dwCheckPoint = dwCheckPoint++; + Status.dwWaitHint = SERVICE_WAIT_HINT_TIME; } - _Check_return_ - DWORD ExecuteMofcomp(_In_ std::wstring param) + return SetServiceStatus(hHandle, &Status); +} + +_Check_return_ +DWORD ExecuteMofcomp(_In_ std::wstring param) +{ + DWORD status = STATUS_SUCCESS; + SHELLEXECUTEINFO info = { 0 }; + std::wstring path, mofcompPath, mofcompParams; + DWORD exitCode, waitErr = 0; + HRESULT err = S_OK; + BOOL res = TRUE; + PWCHAR systemFolder; + DbgPrint(L"ExecuteMofcomp Entry"); + + err = SHGetKnownFolderPath(FOLDERID_System, 0, NULL, &systemFolder); + if (err != S_OK) { - DWORD status = STATUS_SUCCESS; - SHELLEXECUTEINFO info = { 0 }; - std::wstring path, mofcompPath, mofcompParams; - DWORD exitCode, waitErr = 0; - HRESULT err = S_OK; - BOOL res = TRUE; - PWCHAR systemFolder; - DbgPrint(L"ExecuteMofcomp Entry"); - - err = SHGetKnownFolderPath(FOLDERID_System, 0, NULL, &systemFolder); - if (err != S_OK) - { - DbgPrint(L"SHGetKnownFolderPath failed with status %lu ", GetLastError()); - status = STATUS_UNSUCCESSFUL; - goto end; - } - path = std::wstring(systemFolder); - //free allocated pointer - CoTaskMemFree(systemFolder); + DbgPrint(L"SHGetKnownFolderPath failed with status %lu ", GetLastError()); + status = STATUS_UNSUCCESSFUL; + goto end; + } + path = std::wstring(systemFolder); + //free allocated pointer + CoTaskMemFree(systemFolder); - path += L"\\wbem\\mofcomp.exe"; + path += L"\\wbem\\mofcomp.exe"; + + if (!PathFileExists(path.c_str())) + { + DbgPrint(L"PathFileExists failed"); + status = STATUS_UNSUCCESSFUL; + goto end; + } + + mofcompPath = L"\"" + path + L"\""; + mofcompParams = L"\"" + param + L"\""; + + DbgPrint(L"mofcomp path is: %s ", mofcompPath); + DbgPrint(L"param is: %s ", mofcompParams); + + info.cbSize = sizeof(SHELLEXECUTEINFOW); + info.fMask = SEE_MASK_DEFAULT | SEE_MASK_NOCLOSEPROCESS; + info.hwnd = NULL; + info.lpVerb = L"open"; + info.lpFile = mofcompPath.c_str(); + info.lpParameters = mofcompParams.c_str(); + info.lpDirectory = NULL; + info.nShow = SW_SHOW; + + res = ShellExecuteEx(&info); + if (!res) + { + DbgPrint(L"ShellExecuteEx failed with status %d" ,GetLastError()); + status = STATUS_UNSUCCESSFUL; + goto end; + } - if (!PathFileExists(path.c_str())) - { - DbgPrint(L"PathFileExists failed"); - status = STATUS_UNSUCCESSFUL; - goto end; - } + if (!info.hProcess) + { + DbgPrint(L"Procces handle is Null"); + status = STATUS_UNSUCCESSFUL; + goto end; + } - mofcompPath = L"\"" + path + L"\""; - mofcompParams = L"\"" + param + L"\""; + waitErr = WaitForSingleObject(info.hProcess, WAIT_FOR_COMPILITION_IN_MILLI); + if (waitErr != WAIT_OBJECT_0) + { + DbgPrint(L"WaitForSingleObject failed with status %lu",waitErr); + status = STATUS_UNSUCCESSFUL; + goto end; + } - DbgPrint(L"mofcomp path is: %s ", mofcompPath); - DbgPrint(L"param is: %s ", mofcompParams); - info.cbSize = sizeof(SHELLEXECUTEINFOW); - info.fMask = SEE_MASK_DEFAULT | SEE_MASK_NOCLOSEPROCESS; - info.hwnd = NULL; - info.lpVerb = L"open"; - info.lpFile = mofcompPath.c_str(); - info.lpParameters = mofcompParams.c_str(); - info.lpDirectory = NULL; - info.nShow = SW_SHOW; + res = GetExitCodeProcess(info.hProcess, &exitCode); + if (res == 0) + { + DbgPrint(L"GetExitCodeProcess failed with status %lu" ,GetLastError()); + status = STATUS_UNSUCCESSFUL; + goto end; + } - res = ShellExecuteEx(&info); - if (!res) - { - DbgPrint(L"ShellExecuteEx failed with status %d", GetLastError()); - status = STATUS_UNSUCCESSFUL; - goto end; - } + if (exitCode != STATUS_SUCCESS) + { + DbgPrint(L"Execution failed with exit code %lu" ,exitCode); + status = STATUS_UNSUCCESSFUL; + goto end; + } - if (!info.hProcess) - { - DbgPrint(L"Procces handle is Null"); - status = STATUS_UNSUCCESSFUL; - goto end; - } +end: + DbgPrint(L"ExecuteMofcomp Exit"); + return status; +} - waitErr = WaitForSingleObject(info.hProcess, WAIT_FOR_COMPILITION_IN_MILLI); - if (waitErr != WAIT_OBJECT_0) - { - DbgPrint(L"WaitForSingleObject failed with status %lu", waitErr); - status = STATUS_UNSUCCESSFUL; - goto end; - } +VOID ServiceStop(_In_ DWORD ExitCode) +{ + DbgPrint(L"ServiceStop Entry"); + if (StatusHandle == NULL) + { + DbgPrint(L"StatusHandle is NULL"); + return; + } + DWORD status = STATUS_SUCCESS; + UpdateServiceStatus(StatusHandle, SERVICE_STOP_PENDING, ExitCode); + // wait for service to register to WMI + while ((InterlockedOr(&ControlFlags, 0) & SERVICE_FLAGS_DONE) != 1); - res = GetExitCodeProcess(info.hProcess, &exitCode); - if (res == 0) - { - DbgPrint(L"GetExitCodeProcess failed with status %lu", GetLastError()); - status = STATUS_UNSUCCESSFUL; - goto end; - } + std::wstring path = GetServicePath(); + if (!path.empty()) + { + std::wstring removeParam = path + L"\\ME\\remove.mof"; - if (exitCode != STATUS_SUCCESS) + DbgPrint(L"Starting WMI unregistration."); + status = ExecuteMofcomp(removeParam); + if (status != STATUS_SUCCESS) { - DbgPrint(L"Execution failed with exit code %lu", exitCode); - status = STATUS_UNSUCCESSFUL; - goto end; + DbgPrint(L"ExecuteMofcomp with %s failed.", removeParam); } - - end: - DbgPrint(L"ExecuteMofcomp Exit"); - return status; + } + if (StopWaitObject != NULL) + { + UnregisterWait(StopWaitObject); } - VOID ServiceStop(_In_ DWORD ExitCode) + if (StopRequestEvent != NULL) { - DbgPrint(L"ServiceStop Entry"); - if (StatusHandle == NULL) - { - DbgPrint(L"StatusHandle is NULL"); - return; - } - DWORD status = STATUS_SUCCESS; - UpdateServiceStatus(StatusHandle, SERVICE_STOP_PENDING, ExitCode); + CloseHandle(StopRequestEvent); + } - // wait for service to register to WMI - while ((InterlockedOr(&ControlFlags, 0) & SERVICE_FLAGS_DONE) != 1); + WriteToEventLog(EVENT_LOG_INFORMATION, MSG_SERVICE_STOP); + DbgPrint(L"ServiceStop Exit"); + UpdateServiceStatus(StatusHandle, SERVICE_STOPPED, ExitCode); +} - std::wstring path = GetServicePath(); - if (!path.empty()) - { - std::wstring removeParam = path + L"\\ME\\remove.mof"; - - DbgPrint(L"Starting WMI unregistration."); - status = ExecuteMofcomp(removeParam); - if (status != STATUS_SUCCESS) - { - DbgPrint(L"ExecuteMofcomp with %s failed.", removeParam); - } - } - if (StopWaitObject != NULL) - { - UnregisterWait(StopWaitObject); - } +_Check_return_ +DWORD WINAPI ServiceRunningWorkerThread(_In_ PVOID) +{ + DWORD status = STATUS_SUCCESS; + std::wstring buildParam, registerParam = { 0 }; + DbgPrint(L"ServiceRunningWorkerThread Entry"); - if (StopRequestEvent != NULL) - { - CloseHandle(StopRequestEvent); - } + InterlockedOr(&ControlFlags, SERVICE_FLAGS_STARTED); - WriteToEventLog(EVENT_LOG_INFORMATION, MSG_SERVICE_STOP); - DbgPrint(L"ServiceStop Exit"); - UpdateServiceStatus(StatusHandle, SERVICE_STOPPED, ExitCode); + std::wstring path = GetServicePath(); + if (path.empty()) + { + DbgPrint(L"GetServicePath failed."); + goto end; } + buildParam = path + L"\\ME\\wmi_build.mof"; + registerParam = path + L"\\ME\\register.mof"; - namespace + DbgPrint(L"Starting WMI registration."); + status = ExecuteMofcomp(buildParam); + if (status != STATUS_SUCCESS) { - DWORD MofRegistration() - { - DWORD status = STATUS_SUCCESS; - std::wstring buildParam, registerParam = { 0 }; - std::wstring path = GetServicePath(); - if (path.empty()) - { - DbgPrint(L"GetServicePath failed."); - goto end; - } - buildParam = path + L"\\ME\\wmi_build.mof"; - registerParam = path + L"\\ME\\register.mof"; - - DbgPrint(L"Starting WMI registration."); - status = ExecuteMofcomp(buildParam); - if (status != STATUS_SUCCESS) - { - DbgPrint(L"ExecuteMofcomp with %s failed.", buildParam.c_str()); - goto end; - } - - status = ExecuteMofcomp(registerParam); - if (status != STATUS_SUCCESS) - { - DbgPrint(L"ExecuteMofcomp with %s failed.", registerParam.c_str()); - goto end; - } - DbgPrint(L"WMI registration finished successfully."); - - WriteToEventLog(EVENT_LOG_INFORMATION, MSG_REGISTRATION_SUCCESS); - end: - if (status != STATUS_SUCCESS) - { - WriteToEventLog(EVENT_LOG_ERROR, MSG_REGISTRATION_FAILURE); - } - return status; - } - - bool IMSSUninstall() - { - bool corporate_sku = false; - - DbgPrint(L"Uninstall IMSS, if needed."); - if (!IsSKUCorporate(corporate_sku)) - return false; - if (corporate_sku) - return true; - - DbgPrint(L"Try to uninstall IMSS."); - - UNINSTALLIMSS_STATUS status; - status = UninstallIMSS(); - switch (status) - { - case UNINSTALLIMSS_STATUS::FAILED: - DbgPrint(L"Uninstall IMSS failed."); - WriteToEventLog(EVENT_LOG_INFORMATION, MSG_IMSS_REMOVAL_FAILURE); - return false; - case UNINSTALLIMSS_STATUS::SUCCCEDED: - WriteToEventLog(EVENT_LOG_INFORMATION, MSG_IMSS_REMOVAL_SUCCESS); - DbgPrint(L"Uninstall IMSS succeeded."); - return true; - default: - return true; - } - } + DbgPrint(L"ExecuteMofcomp with %s failed.", buildParam.c_str()); + goto end; } - _Check_return_ - DWORD WINAPI ServiceRunningWorkerThread(_In_ PVOID) + status = ExecuteMofcomp(registerParam); + if (status != STATUS_SUCCESS) { - DWORD status = STATUS_SUCCESS; - DWORD first_run_try = 0, imss_flow_done = 0; - DbgPrint(L"ServiceRunningWorkerThread Entry"); - - InterlockedOr(&ControlFlags, SERVICE_FLAGS_STARTED); - - status = MofRegistration(); - if (status != STATUS_SUCCESS) - { - goto end; - } + DbgPrint(L"ExecuteMofcomp with %s failed.", registerParam.c_str()); + goto end; + } + DbgPrint(L"WMI registration finished successfully."); - if (!RegistryRead(L"ImssUninstallFlowDone", imss_flow_done)) - { - status = STATUS_UNSUCCESSFUL; - goto end; - } - if (imss_flow_done) - { - status = STATUS_SUCCESS; - goto end; - } + WriteToEventLog(EVENT_LOG_INFORMATION, MSG_REGISTRATION_SUCCESS); - if (!RegistryRead(L"FirstRunTry", first_run_try)) - { - status = STATUS_UNSUCCESSFUL; - goto end; - } - if (++first_run_try > 3) - { - if (!RegistryWrite(L"ImssUninstallFlowDone", 1)) - { - status = STATUS_UNSUCCESSFUL; - goto end; - } - status = STATUS_SUCCESS; - goto end; - } - - if (!RegistryWrite(L"FirstRunTry", first_run_try)) - { - status = STATUS_UNSUCCESSFUL; - goto end; - } - - if (IMSSUninstall()) - { - if (!RegistryWrite(L"ImssUninstallFlowDone", 1)) - { - status = STATUS_UNSUCCESSFUL; - goto end; - } - } - status = STATUS_SUCCESS; end: - InterlockedOr(&ControlFlags, SERVICE_FLAGS_DONE); - DbgPrint(L"ServiceRunningWorkerThread Exit"); - return status; + InterlockedOr(&ControlFlags, SERVICE_FLAGS_DONE); + if (status != STATUS_SUCCESS) + { + WriteToEventLog(EVENT_LOG_ERROR, MSG_REGISTRATION_FAILURE); } + DbgPrint(L"ServiceRunningWorkerThread Exit"); + return status; +} - _Check_return_ - DWORD WINAPI ServiceStopWorkerThread(_In_ PVOID /*lpThreadParameter*/) - { - ServiceStop(ERROR_SUCCESS); +_Check_return_ +DWORD WINAPI ServiceStopWorkerThread(_In_ PVOID /*lpThreadParameter*/) +{ + ServiceStop(ERROR_SUCCESS); - return 0; - } + return 0; +} - VOID CALLBACK ServiceStopCallback( - _In_ PVOID lpParameter, - _In_ BOOLEAN /*TimerOrWaitFired*/ - ) +VOID CALLBACK ServiceStopCallback( + _In_ PVOID lpParameter, + _In_ BOOLEAN /*TimerOrWaitFired*/ +) +{ + // + // Since wait object can not be unregistered in callback function, queue + // another thread + // + QueueUserWorkItem(ServiceStopWorkerThread, + lpParameter, + WT_EXECUTEDEFAULT); +} + +_Check_return_ +DWORD WINAPI ServiceCtrlHandler( + _In_ DWORD Ctrl, + _In_ DWORD dwEventType, + _In_ LPVOID lpEventData, + _In_ LPVOID lpContext +) +{ + switch (Ctrl) { + case SERVICE_CONTROL_STOP: // - // Since wait object can not be unregistered in callback function, queue - // another thread + // Set service stop event // - QueueUserWorkItem(ServiceStopWorkerThread, - lpParameter, - WT_EXECUTEDEFAULT); - } + UpdateServiceStatus(StatusHandle, SERVICE_STOP_PENDING, ERROR_SUCCESS); + SetEvent(StopRequestEvent); + break; - _Check_return_ - DWORD WINAPI ServiceCtrlHandler( - _In_ DWORD Ctrl, - _In_ DWORD dwEventType, - _In_ LPVOID lpEventData, - _In_ LPVOID lpContext - ) - { - switch (Ctrl) - { - case SERVICE_CONTROL_STOP: - // - // Set service stop event - // - UpdateServiceStatus(StatusHandle, SERVICE_STOP_PENDING, ERROR_SUCCESS); - SetEvent(StopRequestEvent); - break; - - default: - break; - } - return NO_ERROR; + default: + break; } + return NO_ERROR; +} - VOID WINAPI ServiceMain(DWORD, LPTSTR*) - { - DWORD Err = ERROR_SUCCESS; - - DbgPrint(L"ServiceMain Entry"); - StatusHandle = RegisterServiceCtrlHandlerExW((LPWSTR)SERVICE_NAME, - ServiceCtrlHandler, NULL); +VOID WINAPI ServiceMain(DWORD, LPTSTR*) +{ + DWORD Err = ERROR_SUCCESS; - if (StatusHandle == NULL) - { - DbgPrint(L"RegisterServiceCtrlHandlerExW Failed"); - Err = GetLastError(); - goto cleanup; - } + DbgPrint(L"ServiceMain Entry"); + StatusHandle = RegisterServiceCtrlHandlerExW((LPWSTR)SERVICE_NAME, + ServiceCtrlHandler, NULL); - UpdateServiceStatus(StatusHandle, - SERVICE_START_PENDING, - ERROR_SUCCESS); + if (StatusHandle == NULL) + { + DbgPrint(L"RegisterServiceCtrlHandlerExW Failed"); + Err = GetLastError(); + goto cleanup; + } - // - // Register callback function for stop event - // - StopRequestEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + UpdateServiceStatus(StatusHandle, + SERVICE_START_PENDING, + ERROR_SUCCESS); - if (StopRequestEvent == NULL) - { - Err = GetLastError(); - DbgPrint(L"Event Creation Failed with Error", Err); - goto cleanup; - } + // + // Register callback function for stop event + // + StopRequestEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if (!RegisterWaitForSingleObject(&StopWaitObject, - StopRequestEvent, - ServiceStopCallback, - NULL, - INFINITE, - WT_EXECUTEONLYONCE | WT_EXECUTEINPERSISTENTTHREAD)) - { - Err = GetLastError(); - DbgPrint(L"RegisterWaitForSingleObject Failed with Error", Err); - goto cleanup; - } + if (StopRequestEvent == NULL) + { + Err = GetLastError(); + DbgPrint(L"Event Creation Failed with Error", Err); + goto cleanup; + } - UpdateServiceStatus(StatusHandle, - SERVICE_START_PENDING, - ERROR_SUCCESS); + if (!RegisterWaitForSingleObject(&StopWaitObject, + StopRequestEvent, + ServiceStopCallback, + NULL, + INFINITE, + WT_EXECUTEONLYONCE | WT_EXECUTEINPERSISTENTTHREAD)) + { + Err = GetLastError(); + DbgPrint(L"RegisterWaitForSingleObject Failed with Error", Err); + goto cleanup; + } - // - // Queue the main service function for execution in a worker thread. - // - QueueUserWorkItem(&ServiceRunningWorkerThread, - NULL, - WT_EXECUTELONGFUNCTION); + UpdateServiceStatus(StatusHandle, + SERVICE_START_PENDING, + ERROR_SUCCESS); - UpdateServiceStatus(StatusHandle, - SERVICE_RUNNING, - ERROR_SUCCESS); + // + // Queue the main service function for execution in a worker thread. + // + QueueUserWorkItem(&ServiceRunningWorkerThread, + NULL, + WT_EXECUTELONGFUNCTION); - WriteToEventLog(EVENT_LOG_INFORMATION, MSG_SERVICE_START); + UpdateServiceStatus(StatusHandle, + SERVICE_RUNNING, + ERROR_SUCCESS); - cleanup: + WriteToEventLog(EVENT_LOG_INFORMATION, MSG_SERVICE_START); - if (Err != ERROR_SUCCESS) - { - ServiceStop(Err); - } +cleanup: - DbgPrint(L"ServiceMain Exit"); + if (Err != ERROR_SUCCESS) + { + ServiceStop(Err); } -}; + + DbgPrint(L"ServiceMain Exit"); +} _Check_return_ INT main() { - WMIRegistrationService::DbgPrint(L"main entry"); + DbgPrint(L"main entry"); SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32); SERVICE_TABLE_ENTRY serviceTable[] = { - { SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)WMIRegistrationService::ServiceMain }, + { SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; diff --git a/MEWMIProv/WMIRegistrationService/WMIRegistrationService.h b/MEWMIProv/WMIRegistrationService/WMIRegistrationService.h deleted file mode 100644 index 8b34400a..00000000 --- a/MEWMIProv/WMIRegistrationService/WMIRegistrationService.h +++ /dev/null @@ -1,25 +0,0 @@ -//SPDX-License-Identifier: Apache-2.0 -// -//Copyright (C) 2022 Intel Corporation - -#ifndef WMIREGISTRATIONSERVICE_H -#define WMIREGISTRATIONSERVICE_H -namespace WMIRegistrationService -{ - void DbgPrint(const wchar_t* args, ...); - - bool IsSKUCorporate(bool& corporate_sku); - - enum class UNINSTALLIMSS_STATUS - { - FAILED, - SUCCCEDED, - NOT_NEEDED, - }; - - UNINSTALLIMSS_STATUS UninstallIMSS(); - - bool RegistryRead(const std::wstring& name, unsigned long& value); - bool RegistryWrite(const std::wstring& name, unsigned long value); -}; -#endif // WMIREGISTRATIONSERVICE_H \ No newline at end of file