Skip to content

Commit b1461f1

Browse files
committed
Improve network hostname lookup performance, Fix incorrect local address hostname lookup when using hostsfile
1 parent 6ed1c64 commit b1461f1

File tree

2 files changed

+94
-16
lines changed

2 files changed

+94
-16
lines changed

ProcessHacker/ProcessHacker.vcxproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,14 @@
106106
<StringPooling>true</StringPooling>
107107
</ClCompile>
108108
<Link>
109-
<AdditionalDependencies>aclui.lib;comctl32.lib;iphlpapi.lib;noarg.obj;noenv.obj;ntdll.lib;phlib.lib;shlwapi.lib;userenv.lib;uxtheme.lib;version.lib;wbemuuid.lib;windowscodecs.lib;winsta.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
109+
<AdditionalDependencies>aclui.lib;comctl32.lib;dnsapi.lib;iphlpapi.lib;noarg.obj;noenv.obj;ntdll.lib;phlib.lib;shlwapi.lib;userenv.lib;uxtheme.lib;version.lib;wbemuuid.lib;windowscodecs.lib;winsta.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
110110
<GenerateDebugInformation>true</GenerateDebugInformation>
111111
<SubSystem>Windows</SubSystem>
112112
<TargetMachine>MachineX86</TargetMachine>
113113
<MinimumRequiredVersion>6.01</MinimumRequiredVersion>
114114
<AdditionalLibraryDirectories>$(SolutionDir)phlib\bin\$(Configuration)$(PlatformArchitecture);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
115115
<ModuleDefinitionFile>ProcessHacker.def</ModuleDefinitionFile>
116-
<DelayLoadDLLs>advapi32.dll;aclui.dll;comdlg32.dll;comctl32.dll;gdi32.dll;iphlpapi.dll;oleaut32.dll;ole32.dll;shell32.dll;shlwapi.dll;userenv.dll;user32.dll;uxtheme.dll;version.dll;winsta.dll;ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
116+
<DelayLoadDLLs>advapi32.dll;aclui.dll;comdlg32.dll;comctl32.dll;dnsapi.dll;gdi32.dll;iphlpapi.dll;oleaut32.dll;ole32.dll;shell32.dll;shlwapi.dll;userenv.dll;user32.dll;uxtheme.dll;version.dll;winsta.dll;ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
117117
</Link>
118118
<ResourceCompile>
119119
<PreprocessorDefinitions>_UNICODE;UNICODE;%(PreprocessorDefinitions);$(ExternalCompilerOptions)</PreprocessorDefinitions>
@@ -138,14 +138,14 @@
138138
<StringPooling>true</StringPooling>
139139
</ClCompile>
140140
<Link>
141-
<AdditionalDependencies>aclui.lib;comctl32.lib;iphlpapi.lib;noarg.obj;noenv.obj;ntdll.lib;phlib.lib;shlwapi.lib;userenv.lib;uxtheme.lib;version.lib;wbemuuid.lib;windowscodecs.lib;winsta.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
141+
<AdditionalDependencies>aclui.lib;comctl32.lib;dnsapi.lib;iphlpapi.lib;noarg.obj;noenv.obj;ntdll.lib;phlib.lib;shlwapi.lib;userenv.lib;uxtheme.lib;version.lib;wbemuuid.lib;windowscodecs.lib;winsta.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
142142
<GenerateDebugInformation>true</GenerateDebugInformation>
143143
<SubSystem>Windows</SubSystem>
144144
<TargetMachine>MachineX64</TargetMachine>
145145
<MinimumRequiredVersion>6.01</MinimumRequiredVersion>
146146
<AdditionalLibraryDirectories>$(SolutionDir)phlib\bin\$(Configuration)$(PlatformArchitecture);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
147147
<ModuleDefinitionFile>ProcessHacker.def</ModuleDefinitionFile>
148-
<DelayLoadDLLs>advapi32.dll;aclui.dll;comdlg32.dll;comctl32.dll;gdi32.dll;iphlpapi.dll;oleaut32.dll;ole32.dll;shell32.dll;shlwapi.dll;userenv.dll;user32.dll;uxtheme.dll;version.dll;winsta.dll;ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
148+
<DelayLoadDLLs>advapi32.dll;aclui.dll;comdlg32.dll;comctl32.dll;dnsapi.dll;gdi32.dll;iphlpapi.dll;oleaut32.dll;ole32.dll;shell32.dll;shlwapi.dll;userenv.dll;user32.dll;uxtheme.dll;version.dll;winsta.dll;ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
149149
</Link>
150150
<ResourceCompile>
151151
<PreprocessorDefinitions>_UNICODE;UNICODE;%(PreprocessorDefinitions);$(ExternalCompilerOptions)</PreprocessorDefinitions>
@@ -175,7 +175,7 @@
175175
<ControlFlowGuard>Guard</ControlFlowGuard>
176176
</ClCompile>
177177
<Link>
178-
<AdditionalDependencies>aclui.lib;comctl32.lib;iphlpapi.lib;noarg.obj;noenv.obj;ntdll.lib;phlib.lib;shlwapi.lib;userenv.lib;uxtheme.lib;version.lib;wbemuuid.lib;windowscodecs.lib;winsta.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
178+
<AdditionalDependencies>aclui.lib;comctl32.lib;dnsapi.lib;iphlpapi.lib;noarg.obj;noenv.obj;ntdll.lib;phlib.lib;shlwapi.lib;userenv.lib;uxtheme.lib;version.lib;wbemuuid.lib;windowscodecs.lib;winsta.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
179179
<SubSystem>Windows</SubSystem>
180180
<OptimizeReferences>true</OptimizeReferences>
181181
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -184,7 +184,7 @@
184184
<MinimumRequiredVersion>6.01</MinimumRequiredVersion>
185185
<AdditionalLibraryDirectories>$(SolutionDir)phlib\bin\$(Configuration)$(PlatformArchitecture);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
186186
<ModuleDefinitionFile>ProcessHacker.def</ModuleDefinitionFile>
187-
<DelayLoadDLLs>advapi32.dll;aclui.dll;comdlg32.dll;comctl32.dll;gdi32.dll;iphlpapi.dll;oleaut32.dll;ole32.dll;shell32.dll;shlwapi.dll;userenv.dll;user32.dll;uxtheme.dll;version.dll;winsta.dll;ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
187+
<DelayLoadDLLs>advapi32.dll;aclui.dll;comdlg32.dll;comctl32.dll;dnsapi.dll;gdi32.dll;iphlpapi.dll;oleaut32.dll;ole32.dll;shell32.dll;shlwapi.dll;userenv.dll;user32.dll;uxtheme.dll;version.dll;winsta.dll;ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
188188
<GenerateDebugInformation>true</GenerateDebugInformation>
189189
</Link>
190190
<ResourceCompile>
@@ -213,7 +213,7 @@
213213
<ControlFlowGuard>Guard</ControlFlowGuard>
214214
</ClCompile>
215215
<Link>
216-
<AdditionalDependencies>aclui.lib;comctl32.lib;iphlpapi.lib;noarg.obj;noenv.obj;ntdll.lib;phlib.lib;shlwapi.lib;userenv.lib;uxtheme.lib;version.lib;wbemuuid.lib;windowscodecs.lib;winsta.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
216+
<AdditionalDependencies>aclui.lib;comctl32.lib;dnsapi.lib;iphlpapi.lib;noarg.obj;noenv.obj;ntdll.lib;phlib.lib;shlwapi.lib;userenv.lib;uxtheme.lib;version.lib;wbemuuid.lib;windowscodecs.lib;winsta.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
217217
<SubSystem>Windows</SubSystem>
218218
<OptimizeReferences>true</OptimizeReferences>
219219
<EnableCOMDATFolding>true</EnableCOMDATFolding>
@@ -222,7 +222,7 @@
222222
<MinimumRequiredVersion>6.01</MinimumRequiredVersion>
223223
<AdditionalLibraryDirectories>$(SolutionDir)phlib\bin\$(Configuration)$(PlatformArchitecture);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
224224
<ModuleDefinitionFile>ProcessHacker.def</ModuleDefinitionFile>
225-
<DelayLoadDLLs>advapi32.dll;aclui.dll;comdlg32.dll;comctl32.dll;gdi32.dll;iphlpapi.dll;oleaut32.dll;ole32.dll;shell32.dll;shlwapi.dll;userenv.dll;user32.dll;uxtheme.dll;version.dll;winsta.dll;ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
225+
<DelayLoadDLLs>advapi32.dll;aclui.dll;comdlg32.dll;comctl32.dll;dnsapi.dll;gdi32.dll;iphlpapi.dll;oleaut32.dll;ole32.dll;shell32.dll;shlwapi.dll;userenv.dll;user32.dll;uxtheme.dll;version.dll;winsta.dll;ws2_32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
226226
<GenerateDebugInformation>true</GenerateDebugInformation>
227227
</Link>
228228
<ResourceCompile>

ProcessHacker/netprv.c

Lines changed: 86 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*
55
* Copyright (C) 2010 wj32
66
* Copyright (C) 2010 evilpie
7+
* Copyright (C) 2016-2019 dmex
78
*
89
* This file is part of Process Hacker.
910
*
@@ -284,9 +285,9 @@ PPH_STRING PhGetHostNameFromAddress(
284285
_In_ PPH_IP_ADDRESS Address
285286
)
286287
{
287-
struct sockaddr_in ipv4Address;
288-
struct sockaddr_in6 ipv6Address;
289-
struct sockaddr *address;
288+
SOCKADDR_IN ipv4Address;
289+
SOCKADDR_IN6 ipv6Address;
290+
PSOCKADDR address;
290291
socklen_t length;
291292
PPH_STRING hostName;
292293

@@ -295,7 +296,7 @@ PPH_STRING PhGetHostNameFromAddress(
295296
ipv4Address.sin_family = AF_INET;
296297
ipv4Address.sin_port = 0;
297298
ipv4Address.sin_addr = Address->InAddr;
298-
address = (struct sockaddr *)&ipv4Address;
299+
address = (PSOCKADDR)&ipv4Address;
299300
length = sizeof(ipv4Address);
300301
}
301302
else if (Address->Type == PH_IPV6_NETWORK_TYPE)
@@ -305,7 +306,7 @@ PPH_STRING PhGetHostNameFromAddress(
305306
ipv6Address.sin6_flowinfo = 0;
306307
ipv6Address.sin6_addr = Address->In6Addr;
307308
ipv6Address.sin6_scope_id = 0;
308-
address = (struct sockaddr *)&ipv6Address;
309+
address = (PSOCKADDR)&ipv6Address;
309310
length = sizeof(ipv6Address);
310311
}
311312
else
@@ -350,6 +351,84 @@ PPH_STRING PhGetHostNameFromAddress(
350351
return hostName;
351352
}
352353

354+
PPH_STRING PhpGetIp4ReverseNameFromAddress(
355+
_In_ IN_ADDR Address
356+
)
357+
{
358+
return PhFormatString(
359+
L"%u.%u.%u.%u.%s",
360+
Address.s_impno,
361+
Address.s_lh,
362+
Address.s_host,
363+
Address.s_net,
364+
DNS_IP4_REVERSE_DOMAIN_STRING_W
365+
);
366+
}
367+
368+
PPH_STRING PhpGetIp6ReverseNameFromAddress(
369+
_In_ IN6_ADDR Address
370+
)
371+
{
372+
PH_STRING_BUILDER stringBuilder;
373+
374+
PhInitializeStringBuilder(&stringBuilder, 32);
375+
376+
for (INT i = sizeof(IN6_ADDR) - 1; i >= 0; i--)
377+
{
378+
PhAppendFormatStringBuilder(
379+
&stringBuilder,
380+
L"%x.%x.",
381+
Address.s6_addr[i] & 0xF,
382+
(Address.s6_addr[i] >> 4) & 0xF
383+
);
384+
}
385+
386+
PhAppendStringBuilder2(&stringBuilder, DNS_IP6_REVERSE_DOMAIN_STRING_W);
387+
388+
return PhFinalStringBuilderString(&stringBuilder);
389+
}
390+
391+
PPH_STRING PhGetHostNameFromAddressEx(
392+
_In_ PPH_IP_ADDRESS Address
393+
)
394+
{
395+
PPH_STRING addressHostName = NULL;
396+
PPH_STRING addressReverse = NULL;
397+
PDNS_RECORD addressResults = NULL;
398+
399+
if (Address->Type == PH_IPV4_NETWORK_TYPE)
400+
{
401+
addressReverse = PhpGetIp4ReverseNameFromAddress(Address->InAddr);
402+
}
403+
else if (Address->Type == PH_IPV6_NETWORK_TYPE)
404+
{
405+
addressReverse = PhpGetIp6ReverseNameFromAddress(Address->In6Addr);
406+
}
407+
else
408+
{
409+
return NULL;
410+
}
411+
412+
DnsQuery(
413+
addressReverse->Buffer,
414+
DNS_TYPE_PTR,
415+
DNS_QUERY_BYPASS_CACHE | DNS_QUERY_NO_HOSTS_FILE,
416+
NULL,
417+
&addressResults,
418+
NULL
419+
);
420+
421+
if (addressResults)
422+
{
423+
addressHostName = PhCreateString(addressResults->Data.PTR.pNameHost); // Return the first result (dmex)
424+
DnsRecordListFree(addressResults, DnsFreeRecordList);
425+
}
426+
427+
PhDereferenceObject(addressReverse);
428+
429+
return addressHostName;
430+
}
431+
353432
NTSTATUS PhpNetworkItemQueryWorker(
354433
_In_ PVOID Parameter
355434
)
@@ -366,7 +445,7 @@ NTSTATUS PhpNetworkItemQueryWorker(
366445

367446
if (!cacheItem)
368447
{
369-
hostString = PhGetHostNameFromAddress(&data->Address);
448+
hostString = PhGetHostNameFromAddressEx(&data->Address);
370449

371450
if (hostString)
372451
{
@@ -492,8 +571,7 @@ VOID PhNetworkProviderUpdate(
492571
if (!NetworkImportDone)
493572
{
494573
WSADATA wsaData;
495-
496-
// Make sure WSA is initialized.
574+
// Make sure WSA is initialized. (wj32)
497575
WSAStartup(WINSOCK_VERSION, &wsaData);
498576
NetworkImportDone = TRUE;
499577
}

0 commit comments

Comments
 (0)