mirror of
https://github.com/BeneficialCode/WinArk
synced 2026-08-09 12:00:31 +00:00
397 lines
12 KiB
C++
397 lines
12 KiB
C++
#include "stdafx.h"
|
|
#include "ServiceTable.h"
|
|
#include "SortHelper.h"
|
|
#include "ProcessPropertiesDlg.h"
|
|
#include "ProcessInfoEx.h"
|
|
|
|
using namespace WinSys;
|
|
|
|
const CString AccessDenied(L"<access denied>");
|
|
|
|
CServiceTable::CServiceTable(BarInfo& bars, TableInfo& table)
|
|
:CTable(bars, table) {
|
|
SetTableWindowInfo(bars.nbar);
|
|
Refresh();
|
|
}
|
|
|
|
LRESULT CServiceTable::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
return 0;
|
|
}
|
|
LRESULT CServiceTable::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lparam, BOOL& /*bHandled*/) {
|
|
return 0;
|
|
}
|
|
LRESULT CServiceTable::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
PaintTable(m_hWnd);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CServiceTable::OnHScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CServiceTable::OnVScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CServiceTable::OnUserVabs(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CServiceTable::OnUserVrel(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CServiceTable::OnUserChgs(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CServiceTable::OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
int zDelta = GET_WHEEL_DELTA_WPARAM(wParam);
|
|
return Tablefunction(m_hWnd, WM_VSCROLL, zDelta >= 0 ? 0 : 1, wParam);
|
|
}
|
|
LRESULT CServiceTable::OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
return Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
}
|
|
LRESULT CServiceTable::OnLBtnDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
return Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
}
|
|
LRESULT CServiceTable::OnLBtnUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
return Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
}
|
|
LRESULT CServiceTable::OnRBtnDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
return Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
}
|
|
LRESULT CServiceTable::OnUserSts(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
return Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
}
|
|
LRESULT CServiceTable::OnWindowPosChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
return Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
}
|
|
LRESULT CServiceTable::OnKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
return Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
}
|
|
LRESULT CServiceTable::OnSysKeyDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) {
|
|
return Tablefunction(m_hWnd, uMsg, wParam, lParam);
|
|
}
|
|
|
|
void CServiceTable::Refresh() {
|
|
m_ProcMgr.EnumProcesses();
|
|
m_ServicesEx.clear();
|
|
m_Table.data.info = WinSys::ServiceManager::EnumServices(ServiceEnumType::AllServices);
|
|
m_Table.data.n = m_Table.data.info.size();
|
|
m_ServicesEx.reserve(m_Table.data.n);
|
|
}
|
|
|
|
int CServiceTable::ParseTableEntry(CString& s, char& mask, int& select, WinSys::ServiceInfo& info, int column) {
|
|
auto& pdata = info.GetStatusProcess();
|
|
auto& svcex = GetServiceInfoEx(info.GetName());
|
|
auto config = svcex.GetConfiguration();
|
|
switch (column) {
|
|
case 0:
|
|
s = info.GetName().c_str();
|
|
break;
|
|
case 1:
|
|
s = info.GetDisplayName().c_str();
|
|
break;
|
|
case 2:
|
|
s = ServiceStateToString(pdata.CurrentState);
|
|
break;
|
|
case 3:
|
|
s = ServiceTypeToString(pdata.Type);
|
|
break;
|
|
case 4:
|
|
if (pdata.ProcessId > 0) {
|
|
s.Format(L"%u (0x%X)", pdata.ProcessId, pdata.ProcessId);
|
|
}
|
|
break;
|
|
case 5:
|
|
s = pdata.ProcessId > 0 ? m_ProcMgr.GetProcessNameById(pdata.ProcessId).c_str() : L"";
|
|
break;
|
|
case 6:
|
|
s = config ? ServiceStartTypeToString(*config) : AccessDenied;
|
|
break;
|
|
case 7:
|
|
s = config ? CString(config->BinaryPathName.c_str()) : AccessDenied;
|
|
break;
|
|
case 8:
|
|
s = config ? CString(config->AccountName.c_str()) : AccessDenied;
|
|
break;
|
|
case 9:
|
|
s = config ? ErrorControlToString(config->ErrorControl) : AccessDenied;
|
|
break;
|
|
case 10:
|
|
s = svcex.GetDescription();
|
|
break;
|
|
case 11:
|
|
s = svcex.GetPrivileges();
|
|
break;
|
|
case 12:
|
|
s = svcex.GetTriggers();
|
|
break;
|
|
case 13:
|
|
s = config ? svcex.GetDependencies() : AccessDenied;
|
|
break;
|
|
case 14:
|
|
s = ServiceControlsAcceptedToString(pdata.ControlsAccepted);
|
|
break;
|
|
case 15:
|
|
s = svcex.GetSID();
|
|
break;
|
|
case 16:
|
|
s = ServiceSidTypeToString(svcex.GetSidType());
|
|
break;
|
|
}
|
|
|
|
return s.GetLength();
|
|
}
|
|
|
|
PCWSTR CServiceTable::ServiceStateToString(WinSys::ServiceState state) {
|
|
switch (state) {
|
|
case ServiceState::Running:return L"Running";
|
|
case ServiceState::Stoppend:return L"Stopped";
|
|
case ServiceState::Pause:return L"Paused";
|
|
case ServiceState::StartPending:return L"Start Pending";
|
|
case ServiceState::StopPending:return L"Stop Pending";
|
|
case ServiceState::PausePending:return L"Pause Pending";
|
|
}
|
|
return L"Unknown";
|
|
}
|
|
|
|
CString CServiceTable::ServiceTypeToString(WinSys::ServiceType type) {
|
|
using namespace WinSys;
|
|
|
|
static struct {
|
|
ServiceType type;
|
|
PCWSTR text;
|
|
}types[] = {
|
|
{ServiceType::KernelDriver,L"Kernel Driver"},
|
|
{ServiceType::FileSystemDriver,L"FS/Filter Driver"},
|
|
{ServiceType::Win32OwnProcess,L"Own"},
|
|
{ServiceType::Win32SharedProcess,L"Shared"},
|
|
{ServiceType::InteractiveProcess,L"Interactive"},
|
|
{ServiceType::UserServiceInstance,L"Instance"},
|
|
{ServiceType::PackageService,L"Packaged"},
|
|
};
|
|
|
|
CString text;
|
|
for (auto& item : types)
|
|
if ((item.type & type) == item.type)
|
|
text += CString(item.text) + L", ";
|
|
|
|
return text.Left(text.GetLength() - 2);
|
|
}
|
|
|
|
PCWSTR CServiceTable::TriggerToText(const WinSys::ServiceTrigger& trigger) {
|
|
using namespace WinSys;
|
|
switch (trigger.Type) {
|
|
case ServiceTriggerType::Custom:return L"Custom";
|
|
case ServiceTriggerType::DeviceInterfaceArrival:return L"Device Arrival";
|
|
case ServiceTriggerType::DomainJoin:return L"Domain Join";
|
|
case ServiceTriggerType::FirewallPortEvent:return L"Firewall Port Event";
|
|
case ServiceTriggerType::GroupPolicy:return L"Group Policy";
|
|
case ServiceTriggerType::IpAddressAvailability: return L"IP Address Availability";
|
|
case ServiceTriggerType::NetworkEndPoint:return L"Network EndPoint";
|
|
case ServiceTriggerType::SystemStateChanged:return L"System State Changed";
|
|
case ServiceTriggerType::Aggregate:return L"Aggregate";
|
|
}
|
|
ATLASSERT(false);
|
|
return L"";
|
|
}
|
|
|
|
CString CServiceTable::DependenciesToString(const std::vector<std::wstring>& deps) {
|
|
CString text;
|
|
for (auto& dep : deps)
|
|
text += CString(dep.c_str()) + L", ";
|
|
return text.Left(text.GetLength() - 2);
|
|
}
|
|
|
|
CString CServiceTable::ServiceStartTypeToString(const ServiceConfiguration& config) {
|
|
CString type;
|
|
|
|
switch (config.StartType) {
|
|
case ServiceStartType::Boot:type = L"Boot"; break;
|
|
case ServiceStartType::System:type = L"System"; break;
|
|
case ServiceStartType::Auto:type = L"Automatic"; break;
|
|
case ServiceStartType::Demand:type = L"Manual"; break;
|
|
case ServiceStartType::Disabled:type = L"Disabled"; break;
|
|
}
|
|
|
|
if (config.DeleayedAutoStart)
|
|
type += L" (Delayed)";
|
|
if (config.TriggerStart)
|
|
type += L" (Trigger)";
|
|
return type;
|
|
}
|
|
|
|
ServiceInfoEx& CServiceTable::GetServiceInfoEx(const std::wstring& name) const {
|
|
auto it = m_ServicesEx.find(name);
|
|
if (it != m_ServicesEx.end())
|
|
return it->second;
|
|
|
|
ServiceInfoEx infox(name.c_str());
|
|
auto pos = m_ServicesEx.insert({ name,std::move(infox) });
|
|
return pos.first->second;
|
|
}
|
|
|
|
CString CServiceTable::ErrorControlToString(WinSys::ServiceErrorControl ec) {
|
|
using enum ServiceErrorControl;
|
|
|
|
switch (ec)
|
|
{
|
|
case Ignore:
|
|
return L"Ignore (0)";
|
|
|
|
case Normal:
|
|
return L"Normal (1)";
|
|
|
|
case Severe:
|
|
return L"Servere (2)";
|
|
|
|
case Critical:
|
|
return L"Critical (3)";
|
|
}
|
|
|
|
ATLASSERT(false);
|
|
return L"";
|
|
}
|
|
|
|
CString CServiceTable::ServiceControlsAcceptedToString(ServiceControlsAccepted accepted) {
|
|
using enum ServiceControlsAccepted;
|
|
if (accepted == None)
|
|
return L"(None)";
|
|
|
|
static struct {
|
|
ServiceControlsAccepted type;
|
|
PCWSTR text;
|
|
}types[] = {
|
|
{Stop,L"Stop"},
|
|
{PauseContinue,L"Pause, Continue"},
|
|
{Shutdown,L"Shutdown"},
|
|
{ParamChange,L"Param Change"},
|
|
{NetBindChange,L"NET Bind Change"},
|
|
{HardwareProfileChange,L"Hardware Profile Change"},
|
|
{PowerEvent,L"Power Event"},
|
|
{SessionChange,L"Session Change"},
|
|
{Preshutdown,L"Pre Shutdown"},
|
|
{TimeChanged,L"Time Change"},
|
|
{TriggerEvent,L"Trigger Event"},
|
|
{UserLogOff,L"User Log off"},
|
|
{LowResources,L"Low Resources"},
|
|
{SystemLowResources,L"System Low Resources"},
|
|
{InternalReserved,L"(Internal)"},
|
|
};
|
|
|
|
CString text;
|
|
for (auto& item : types) {
|
|
if ((item.type & accepted) == item.type)
|
|
text += CString(item.text) + L", ";
|
|
}
|
|
|
|
text = text.Left(text.GetLength() - 2);
|
|
text.Format(L"%s (0x%X)", (PCWSTR)text, (DWORD)accepted);
|
|
return text;
|
|
}
|
|
|
|
PCWSTR CServiceTable::ServiceSidTypeToString(WinSys::ServiceSidType type) {
|
|
switch (type)
|
|
{
|
|
case WinSys::ServiceSidType::None:
|
|
return L"None";
|
|
case WinSys::ServiceSidType::Unrestricted:
|
|
return L"Unrestricted";
|
|
case WinSys::ServiceSidType::Restricted:
|
|
return L"Restricted";
|
|
}
|
|
return L"(Unknown)";
|
|
}
|
|
|
|
bool CServiceTable::CompareItems(const WinSys::ServiceInfo& s1, const WinSys::ServiceInfo& s2, int col, bool asc) {
|
|
|
|
switch (static_cast<ServiceColumn>(col))
|
|
{
|
|
case ServiceColumn::Name:
|
|
return SortHelper::SortStrings(s1.GetName(), s2.GetName(), asc);
|
|
case ServiceColumn::DisplayName:
|
|
return SortHelper::SortStrings(s1.GetDisplayName(), s2.GetDisplayName(), asc);
|
|
case ServiceColumn::State:
|
|
return SortHelper::SortStrings(
|
|
ServiceStateToString(s1.GetStatusProcess().CurrentState),
|
|
ServiceStateToString(s2.GetStatusProcess().CurrentState),
|
|
asc);
|
|
case ServiceColumn::Type:
|
|
return SortHelper::SortNumbers(s1.GetStatusProcess().Type, s2.GetStatusProcess().Type, asc);
|
|
case ServiceColumn::PID:
|
|
return SortHelper::SortNumbers(s1.GetStatusProcess().ProcessId, s2.GetStatusProcess().ProcessId, asc);
|
|
case ServiceColumn::ProcessName:
|
|
return SortHelper::SortStrings(
|
|
m_ProcMgr.GetProcessNameById(s1.GetStatusProcess().ProcessId),
|
|
m_ProcMgr.GetProcessNameById(s2.GetStatusProcess().ProcessId),
|
|
asc);
|
|
case ServiceColumn::StartType:
|
|
return SortHelper::SortStrings(
|
|
ServiceStartTypeToString(*GetServiceInfoEx(s1.GetName()).GetConfiguration()),
|
|
ServiceStartTypeToString(*GetServiceInfoEx(s2.GetName()).GetConfiguration()),
|
|
asc
|
|
);
|
|
case ServiceColumn::BinaryPath:
|
|
return SortHelper::SortStrings(
|
|
GetServiceInfoEx(s1.GetName()).GetConfiguration()->BinaryPathName,
|
|
GetServiceInfoEx(s2.GetName()).GetConfiguration()->BinaryPathName,
|
|
asc
|
|
);
|
|
case ServiceColumn::AccountName:
|
|
return SortHelper::SortStrings(
|
|
GetServiceInfoEx(s1.GetName()).GetConfiguration()->AccountName,
|
|
GetServiceInfoEx(s2.GetName()).GetConfiguration()->AccountName,
|
|
asc
|
|
);
|
|
case ServiceColumn::ErrorControl:
|
|
return SortHelper::SortNumbers(
|
|
GetServiceInfoEx(s1.GetName()).GetConfiguration()->ErrorControl,
|
|
GetServiceInfoEx(s2.GetName()).GetConfiguration()->ErrorControl,
|
|
asc
|
|
);
|
|
case ServiceColumn::Description:
|
|
return SortHelper::SortStrings(
|
|
GetServiceInfoEx(s1.GetName()).GetDescription(),
|
|
GetServiceInfoEx(s2.GetName()).GetDescription(),
|
|
asc
|
|
);
|
|
case ServiceColumn::Privileges:
|
|
return SortHelper::SortStrings(
|
|
GetServiceInfoEx(s1.GetName()).GetPrivileges(),
|
|
GetServiceInfoEx(s2.GetName()).GetPrivileges(),
|
|
asc
|
|
);
|
|
case ServiceColumn::Triggers:
|
|
return SortHelper::SortStrings(
|
|
GetServiceInfoEx(s1.GetName()).GetTriggers(),
|
|
GetServiceInfoEx(s2.GetName()).GetTriggers(),
|
|
asc
|
|
);
|
|
case ServiceColumn::Dependencies:
|
|
return SortHelper::SortStrings(
|
|
GetServiceInfoEx(s1.GetName()).GetDependencies(),
|
|
GetServiceInfoEx(s2.GetName()).GetDependencies(),
|
|
asc
|
|
);
|
|
case ServiceColumn::ControlsAccepted:
|
|
return SortHelper::SortNumbers(
|
|
s1.GetStatusProcess().ControlsAccepted,
|
|
s2.GetStatusProcess().ControlsAccepted, asc);
|
|
case ServiceColumn::SID:
|
|
return SortHelper::SortStrings(
|
|
GetServiceInfoEx(s1.GetName()).GetSID(),
|
|
GetServiceInfoEx(s2.GetName()).GetSID(), asc);
|
|
case ServiceColumn::SidType:
|
|
return SortHelper::SortNumbers(GetServiceInfoEx(s1.GetName()).GetSidType(),
|
|
GetServiceInfoEx(s2.GetName()).GetSidType(), asc);
|
|
}
|
|
|
|
return false;
|
|
} |