Skip to content

Commit 5e4ed22

Browse files
committed
Add PhExtractIcon
1 parent ac4e206 commit 5e4ed22

File tree

6 files changed

+47
-25
lines changed

6 files changed

+47
-25
lines changed

ProcessHacker/hidnproc.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -665,12 +665,10 @@ static PPH_PROCESS_ITEM PhpCreateProcessItemForHiddenProcess(
665665
if (processItem->FileName)
666666
{
667667
// Small icon, large icon.
668-
ExtractIconEx(
668+
PhExtractIcon(
669669
processItem->FileName->Buffer,
670-
0,
671670
&processItem->LargeIcon,
672-
&processItem->SmallIcon,
673-
1
671+
&processItem->SmallIcon
674672
);
675673

676674
// Version info.

ProcessHacker/procprv.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -956,14 +956,11 @@ VOID PhpProcessQueryStage1(
956956

957957
if (processItem->FileName)
958958
{
959-
// Small icon, large icon.
960-
if (ExtractIconEx(
959+
if (!PhExtractIcon(
961960
processItem->FileName->Buffer,
962-
0,
963961
&Data->LargeIcon,
964-
&Data->SmallIcon,
965-
1
966-
) == 0)
962+
&Data->SmallIcon
963+
))
967964
{
968965
Data->LargeIcon = NULL;
969966
Data->SmallIcon = NULL;

phlib/guisup.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -689,16 +689,14 @@ VOID PhGetStockApplicationIcon(
689689
if (systemDirectory = PhGetSystemDirectory())
690690
{
691691
PH_STRINGREF dllBaseName;
692-
ULONG index;
693692

694693
PhInitializeStringRef(&dllBaseName, L"\\user32.dll");
695-
index = 0;
696-
697694
dllFileName = PhConcatStringRef2(&systemDirectory->sr, &dllBaseName);
698-
PhDereferenceObject(systemDirectory);
699695

700-
ExtractIconEx(dllFileName->Buffer, index, &largeIcon, &smallIcon, 1);
696+
PhExtractIcon(dllFileName->Buffer, &largeIcon, &smallIcon);
697+
701698
PhDereferenceObject(dllFileName);
699+
PhDereferenceObject(systemDirectory);
702700
}
703701
}
704702

@@ -735,12 +733,10 @@ HICON PhGetFileShellIcon(
735733

736734
if (FileName)
737735
{
738-
ExtractIconEx(
736+
PhExtractIcon(
739737
FileName,
740-
0,
741738
LargeIcon ? &icon : NULL,
742-
!LargeIcon ? &icon : NULL,
743-
1
739+
!LargeIcon ? &icon : NULL
744740
);
745741
}
746742

@@ -752,7 +748,7 @@ HICON PhGetFileShellIcon(
752748
);
753749

754750
if (icon)
755-
icon = DuplicateIcon(NULL, icon);
751+
icon = CopyIcon(icon);
756752
}
757753

758754
return icon;

phlib/include/phutil.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1126,6 +1126,15 @@ PhLoadIndirectString(
11261126
_In_ PWSTR SourceString
11271127
);
11281128

1129+
PHLIBAPI
1130+
BOOLEAN
1131+
NTAPI
1132+
PhExtractIcon(
1133+
_In_ PWSTR FileName,
1134+
_In_ HICON *IconLarge,
1135+
_In_ HICON *IconSmall
1136+
);
1137+
11291138
#ifdef __cplusplus
11301139
}
11311140
#endif

phlib/util.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5287,6 +5287,12 @@ PPH_STRING PhLoadString(
52875287
return string;
52885288
}
52895289

5290+
// rev from SHLoadIndirectString
5291+
/**
5292+
* Extracts a specified text resource when given that resource in the form of an indirect string (a string that begins with the '@' symbol).
5293+
*
5294+
* \param SourceString The indirect string from which the resource will be retrieved.
5295+
*/
52905296
PPH_STRING PhLoadIndirectString(
52915297
_In_ PWSTR SourceString
52925298
)
@@ -5337,3 +5343,21 @@ PPH_STRING PhLoadIndirectString(
53375343

53385344
return indirectString;
53395345
}
5346+
5347+
// rev from ExtractIconExW
5348+
BOOLEAN PhExtractIcon(
5349+
_In_ PWSTR FileName,
5350+
_In_ HICON *IconLarge,
5351+
_In_ HICON *IconSmall
5352+
)
5353+
{
5354+
static UINT (WINAPI *PrivateExtractIconExW)(PCWSTR, INT, HICON*, HICON*, UINT) = NULL;
5355+
5356+
if (!PrivateExtractIconExW)
5357+
PrivateExtractIconExW = PhGetModuleProcAddress(L"user32.dll", "PrivateExtractIconExW");
5358+
5359+
if (!PrivateExtractIconExW)
5360+
return FALSE;
5361+
5362+
return PrivateExtractIconExW(FileName, 0, IconLarge, IconSmall, 1) > 0;
5363+
}

tools/peview/peprp.c

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -338,13 +338,11 @@ INT_PTR CALLBACK PvpPeGeneralDlgProc(
338338
{
339339
PhInitializeImageVersionInfo(&PvImageVersionInfo, PvFileName->Buffer);
340340

341-
if (ExtractIconEx(
341+
if (!PhExtractIcon(
342342
PvFileName->Buffer,
343-
0,
344343
&PvImageLargeIcon,
345-
NULL,
346-
1
347-
) == 0)
344+
NULL
345+
))
348346
{
349347
PvImageLargeIcon = PhGetFileShellIcon(PvFileName->Buffer, NULL, TRUE);
350348
}

0 commit comments

Comments
 (0)