Skip to content

Commit 83497f1

Browse files
committed
Improve service search/list performance
1 parent c288278 commit 83497f1

File tree

4 files changed

+84
-57
lines changed

4 files changed

+84
-57
lines changed

ProcessHacker/srvlist.c

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -695,18 +695,35 @@ BOOLEAN NTAPI PhpServiceTreeNewCallback(
695695
getCellText->Text = PhGetStringRef(serviceItem->DisplayName);
696696
break;
697697
case PHSVTLC_TYPE:
698-
PhInitializeStringRefLongHint(&getCellText->Text, PhGetServiceTypeString(serviceItem->Type));
698+
{
699+
PPH_STRINGREF string;
700+
701+
string = PhGetServiceTypeString(serviceItem->Type);
702+
getCellText->Text.Buffer = string->Buffer;
703+
getCellText->Text.Length = string->Length;
704+
}
699705
break;
700706
case PHSVTLC_STATUS:
701-
PhInitializeStringRefLongHint(&getCellText->Text, PhGetServiceStateString(serviceItem->State));
707+
{
708+
PPH_STRINGREF string;
709+
710+
string = PhGetServiceStateString(serviceItem->State);
711+
getCellText->Text.Buffer = string->Buffer;
712+
getCellText->Text.Length = string->Length;
713+
}
702714
break;
703715
case PHSVTLC_STARTTYPE:
704716
{
705717
PH_FORMAT format[2];
718+
PPH_STRINGREF string;
706719
PWSTR additional = NULL;
707720
SIZE_T returnLength;
708721

709-
PhInitFormatS(&format[0], PhGetServiceStartTypeString(serviceItem->StartType));
722+
string = PhGetServiceStartTypeString(serviceItem->StartType);
723+
format[0].Type = StringFormatType;
724+
format[0].u.String.Buffer = string->Buffer;
725+
format[0].u.String.Length = string->Length;
726+
//PhInitFormatSR(&format[0], PhGetServiceStartTypeString(serviceItem->StartType));
710727

711728
if (serviceItem->StartType == SERVICE_DISABLED)
712729
additional = NULL;
@@ -743,7 +760,13 @@ BOOLEAN NTAPI PhpServiceTreeNewCallback(
743760
getCellText->Text = PhGetStringRef(node->BinaryPath);
744761
break;
745762
case PHSVTLC_ERRORCONTROL:
746-
PhInitializeStringRefLongHint(&getCellText->Text, PhGetServiceErrorControlString(serviceItem->ErrorControl));
763+
{
764+
PPH_STRINGREF string;
765+
766+
string = PhGetServiceErrorControlString(serviceItem->ErrorControl);
767+
getCellText->Text.Buffer = string->Buffer;
768+
getCellText->Text.Length = string->Length;
769+
}
747770
break;
748771
case PHSVTLC_GROUP:
749772
PhpUpdateServiceNodeConfig(node);

phlib/include/svcsup.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ extern WCHAR *PhServiceTypeStrings[12];
99
extern WCHAR *PhServiceStartTypeStrings[5];
1010
extern WCHAR *PhServiceErrorControlStrings[4];
1111

12-
PHLIBAPI
1312
_Success_(return != NULL)
13+
PHLIBAPI
1414
PVOID
1515
NTAPI
1616
PhEnumServices(
@@ -78,14 +78,14 @@ PhSetServiceDelayedAutoStart(
7878
);
7979

8080
PHLIBAPI
81-
PWSTR
81+
PPH_STRINGREF
8282
NTAPI
8383
PhGetServiceStateString(
8484
_In_ ULONG ServiceState
8585
);
8686

8787
PHLIBAPI
88-
PWSTR
88+
PPH_STRINGREF
8989
NTAPI
9090
PhGetServiceTypeString(
9191
_In_ ULONG ServiceType
@@ -99,7 +99,7 @@ PhGetServiceTypeInteger(
9999
);
100100

101101
PHLIBAPI
102-
PWSTR
102+
PPH_STRINGREF
103103
NTAPI
104104
PhGetServiceStartTypeString(
105105
_In_ ULONG ServiceStartType
@@ -113,7 +113,7 @@ PhGetServiceStartTypeInteger(
113113
);
114114

115115
PHLIBAPI
116-
PWSTR
116+
PPH_STRINGREF
117117
NTAPI
118118
PhGetServiceErrorControlString(
119119
_In_ ULONG ServiceErrorControl

phlib/svcsup.c

Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -28,48 +28,51 @@
2828
#define SIP(String, Integer) \
2929
{ (String), (PVOID)(Integer) }
3030

31+
#define SREF(String) (PVOID)&(PH_STRINGREF)PH_STRINGREF_INIT((String))
32+
static PH_STRINGREF PhpServiceUnknownString = PH_STRINGREF_INIT(L"Unknown");
33+
3134
static PH_KEY_VALUE_PAIR PhpServiceStatePairs[] =
3235
{
33-
SIP(L"Stopped", SERVICE_STOPPED),
34-
SIP(L"Start pending", SERVICE_START_PENDING),
35-
SIP(L"Stop pending", SERVICE_STOP_PENDING),
36-
SIP(L"Running", SERVICE_RUNNING),
37-
SIP(L"Continue pending", SERVICE_CONTINUE_PENDING),
38-
SIP(L"Pause pending", SERVICE_PAUSE_PENDING),
39-
SIP(L"Paused", SERVICE_PAUSED)
36+
SIP(SREF(L"Stopped"), SERVICE_STOPPED),
37+
SIP(SREF(L"Start pending"), SERVICE_START_PENDING),
38+
SIP(SREF(L"Stop pending"), SERVICE_STOP_PENDING),
39+
SIP(SREF(L"Running"), SERVICE_RUNNING),
40+
SIP(SREF(L"Continue pending"), SERVICE_CONTINUE_PENDING),
41+
SIP(SREF(L"Pause pending"), SERVICE_PAUSE_PENDING),
42+
SIP(SREF(L"Paused"), SERVICE_PAUSED)
4043
};
4144

4245
static PH_KEY_VALUE_PAIR PhpServiceTypePairs[] =
4346
{
44-
SIP(L"Driver", SERVICE_KERNEL_DRIVER),
45-
SIP(L"FS driver", SERVICE_FILE_SYSTEM_DRIVER),
46-
SIP(L"Own process", SERVICE_WIN32_OWN_PROCESS),
47-
SIP(L"Share process", SERVICE_WIN32_SHARE_PROCESS),
48-
SIP(L"Own interactive process", SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS),
49-
SIP(L"Share interactive process", SERVICE_WIN32_SHARE_PROCESS | SERVICE_INTERACTIVE_PROCESS),
50-
SIP(L"User own process", SERVICE_USER_OWN_PROCESS),
51-
SIP(L"User own process (instance)", SERVICE_USER_OWN_PROCESS | SERVICE_USERSERVICE_INSTANCE),
52-
SIP(L"User share process", SERVICE_USER_SHARE_PROCESS),
53-
SIP(L"User share process (instance)", SERVICE_USER_SHARE_PROCESS | SERVICE_USERSERVICE_INSTANCE),
54-
SIP(L"Package own process", SERVICE_PKG_SERVICE | SERVICE_WIN32_OWN_PROCESS),
55-
SIP(L"Package share process", SERVICE_PKG_SERVICE | SERVICE_WIN32_SHARE_PROCESS),
47+
SIP(SREF(L"Driver"), SERVICE_KERNEL_DRIVER),
48+
SIP(SREF(L"FS driver"), SERVICE_FILE_SYSTEM_DRIVER),
49+
SIP(SREF(L"Own process"), SERVICE_WIN32_OWN_PROCESS),
50+
SIP(SREF(L"Share process"), SERVICE_WIN32_SHARE_PROCESS),
51+
SIP(SREF(L"Own interactive process"), SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS),
52+
SIP(SREF(L"Share interactive process"), SERVICE_WIN32_SHARE_PROCESS | SERVICE_INTERACTIVE_PROCESS),
53+
SIP(SREF(L"User own process"), SERVICE_USER_OWN_PROCESS),
54+
SIP(SREF(L"User own process (instance)"), SERVICE_USER_OWN_PROCESS | SERVICE_USERSERVICE_INSTANCE),
55+
SIP(SREF(L"User share process"), SERVICE_USER_SHARE_PROCESS),
56+
SIP(SREF(L"User share process (instance)"), SERVICE_USER_SHARE_PROCESS | SERVICE_USERSERVICE_INSTANCE),
57+
SIP(SREF(L"Package own process"), SERVICE_PKG_SERVICE | SERVICE_WIN32_OWN_PROCESS),
58+
SIP(SREF(L"Package share process"), SERVICE_PKG_SERVICE | SERVICE_WIN32_SHARE_PROCESS),
5659
};
5760

5861
static PH_KEY_VALUE_PAIR PhpServiceStartTypePairs[] =
5962
{
60-
SIP(L"Disabled", SERVICE_DISABLED),
61-
SIP(L"Boot start", SERVICE_BOOT_START),
62-
SIP(L"System start", SERVICE_SYSTEM_START),
63-
SIP(L"Auto start", SERVICE_AUTO_START),
64-
SIP(L"Demand start", SERVICE_DEMAND_START)
63+
SIP(SREF(L"Disabled"), SERVICE_DISABLED),
64+
SIP(SREF(L"Boot start"), SERVICE_BOOT_START),
65+
SIP(SREF(L"System start"), SERVICE_SYSTEM_START),
66+
SIP(SREF(L"Auto start"), SERVICE_AUTO_START),
67+
SIP(SREF(L"Demand start"), SERVICE_DEMAND_START)
6568
};
6669

6770
static PH_KEY_VALUE_PAIR PhpServiceErrorControlPairs[] =
6871
{
69-
SIP(L"Ignore", SERVICE_ERROR_IGNORE),
70-
SIP(L"Normal", SERVICE_ERROR_NORMAL),
71-
SIP(L"Severe", SERVICE_ERROR_SEVERE),
72-
SIP(L"Critical", SERVICE_ERROR_CRITICAL)
72+
SIP(SREF(L"Ignore"), SERVICE_ERROR_IGNORE),
73+
SIP(SREF(L"Normal"), SERVICE_ERROR_NORMAL),
74+
SIP(SREF(L"Severe"), SERVICE_ERROR_SEVERE),
75+
SIP(SREF(L"Critical"), SERVICE_ERROR_CRITICAL)
7376
};
7477

7578
PWSTR PhServiceTypeStrings[] =
@@ -105,6 +108,7 @@ PWSTR PhServiceErrorControlStrings[4] =
105108
L"Critical"
106109
};
107110

111+
_Success_(return != NULL)
108112
PVOID PhEnumServices(
109113
_In_ SC_HANDLE ScManagerHandle,
110114
_In_opt_ ULONG Type,
@@ -383,38 +387,38 @@ BOOLEAN PhSetServiceDelayedAutoStart(
383387
);
384388
}
385389

386-
PWSTR PhGetServiceStateString(
390+
PPH_STRINGREF PhGetServiceStateString(
387391
_In_ ULONG ServiceState
388392
)
389393
{
390-
PWSTR string;
394+
PPH_STRINGREF string;
391395

392396
if (PhFindStringSiKeyValuePairs(
393397
PhpServiceStatePairs,
394398
sizeof(PhpServiceStatePairs),
395399
ServiceState,
396-
&string
400+
(PWSTR*)&string
397401
))
398402
return string;
399403
else
400-
return L"Unknown";
404+
return &PhpServiceUnknownString;
401405
}
402406

403-
PWSTR PhGetServiceTypeString(
407+
PPH_STRINGREF PhGetServiceTypeString(
404408
_In_ ULONG ServiceType
405409
)
406410
{
407-
PWSTR string;
411+
PPH_STRINGREF string;
408412

409413
if (PhFindStringSiKeyValuePairs(
410414
PhpServiceTypePairs,
411415
sizeof(PhpServiceTypePairs),
412416
ServiceType,
413-
&string
417+
(PWSTR*)&string
414418
))
415419
return string;
416420
else
417-
return L"Unknown";
421+
return &PhpServiceUnknownString;
418422
}
419423

420424
ULONG PhGetServiceTypeInteger(
@@ -434,21 +438,21 @@ ULONG PhGetServiceTypeInteger(
434438
return ULONG_MAX;
435439
}
436440

437-
PWSTR PhGetServiceStartTypeString(
441+
PPH_STRINGREF PhGetServiceStartTypeString(
438442
_In_ ULONG ServiceStartType
439443
)
440444
{
441-
PWSTR string;
445+
PPH_STRINGREF string;
442446

443447
if (PhFindStringSiKeyValuePairs(
444448
PhpServiceStartTypePairs,
445449
sizeof(PhpServiceStartTypePairs),
446450
ServiceStartType,
447-
&string
451+
(PWSTR*)&string
448452
))
449453
return string;
450454
else
451-
return L"Unknown";
455+
return &PhpServiceUnknownString;
452456
}
453457

454458
ULONG PhGetServiceStartTypeInteger(
@@ -468,21 +472,21 @@ ULONG PhGetServiceStartTypeInteger(
468472
return ULONG_MAX;
469473
}
470474

471-
PWSTR PhGetServiceErrorControlString(
475+
PPH_STRINGREF PhGetServiceErrorControlString(
472476
_In_ ULONG ServiceErrorControl
473477
)
474478
{
475-
PWSTR string;
479+
PPH_STRINGREF string;
476480

477481
if (PhFindStringSiKeyValuePairs(
478482
PhpServiceErrorControlPairs,
479483
sizeof(PhpServiceErrorControlPairs),
480484
ServiceErrorControl,
481-
&string
485+
(PWSTR*)&string
482486
))
483487
return string;
484488
else
485-
return L"Unknown";
489+
return &PhpServiceUnknownString;
486490
}
487491

488492
ULONG PhGetServiceErrorControlInteger(

plugins/ToolStatus/filter.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -402,16 +402,16 @@ BOOLEAN ServiceTreeFilterCallback(
402402
if (PhIsNullOrEmptyString(SearchboxText))
403403
return TRUE;
404404

405-
if (WordMatchStringZ(PhGetServiceTypeString(serviceNode->ServiceItem->Type)))
405+
if (WordMatchStringRef(PhGetServiceTypeString(serviceNode->ServiceItem->Type)))
406406
return TRUE;
407407

408-
if (WordMatchStringZ(PhGetServiceStateString(serviceNode->ServiceItem->State)))
408+
if (WordMatchStringRef(PhGetServiceStateString(serviceNode->ServiceItem->State)))
409409
return TRUE;
410410

411-
if (WordMatchStringZ(PhGetServiceStartTypeString(serviceNode->ServiceItem->StartType)))
411+
if (WordMatchStringRef(PhGetServiceStartTypeString(serviceNode->ServiceItem->StartType)))
412412
return TRUE;
413413

414-
if (WordMatchStringZ(PhGetServiceErrorControlString(serviceNode->ServiceItem->ErrorControl)))
414+
if (WordMatchStringRef(PhGetServiceErrorControlString(serviceNode->ServiceItem->ErrorControl)))
415415
return TRUE;
416416

417417
if (!PhIsNullOrEmptyString(serviceNode->ServiceItem->Name))

0 commit comments

Comments
 (0)