4
4
*
5
5
* Copyright (C) 2010 wj32
6
6
* Copyright (C) 2010 evilpie
7
+ * Copyright (C) 2016-2019 dmex
7
8
*
8
9
* This file is part of Process Hacker.
9
10
*
@@ -284,9 +285,9 @@ PPH_STRING PhGetHostNameFromAddress(
284
285
_In_ PPH_IP_ADDRESS Address
285
286
)
286
287
{
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 ;
290
291
socklen_t length ;
291
292
PPH_STRING hostName ;
292
293
@@ -295,7 +296,7 @@ PPH_STRING PhGetHostNameFromAddress(
295
296
ipv4Address .sin_family = AF_INET ;
296
297
ipv4Address .sin_port = 0 ;
297
298
ipv4Address .sin_addr = Address -> InAddr ;
298
- address = (struct sockaddr * )& ipv4Address ;
299
+ address = (PSOCKADDR )& ipv4Address ;
299
300
length = sizeof (ipv4Address );
300
301
}
301
302
else if (Address -> Type == PH_IPV6_NETWORK_TYPE )
@@ -305,7 +306,7 @@ PPH_STRING PhGetHostNameFromAddress(
305
306
ipv6Address .sin6_flowinfo = 0 ;
306
307
ipv6Address .sin6_addr = Address -> In6Addr ;
307
308
ipv6Address .sin6_scope_id = 0 ;
308
- address = (struct sockaddr * )& ipv6Address ;
309
+ address = (PSOCKADDR )& ipv6Address ;
309
310
length = sizeof (ipv6Address );
310
311
}
311
312
else
@@ -350,6 +351,84 @@ PPH_STRING PhGetHostNameFromAddress(
350
351
return hostName ;
351
352
}
352
353
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
+
353
432
NTSTATUS PhpNetworkItemQueryWorker (
354
433
_In_ PVOID Parameter
355
434
)
@@ -366,7 +445,7 @@ NTSTATUS PhpNetworkItemQueryWorker(
366
445
367
446
if (!cacheItem )
368
447
{
369
- hostString = PhGetHostNameFromAddress (& data -> Address );
448
+ hostString = PhGetHostNameFromAddressEx (& data -> Address );
370
449
371
450
if (hostString )
372
451
{
@@ -492,8 +571,7 @@ VOID PhNetworkProviderUpdate(
492
571
if (!NetworkImportDone )
493
572
{
494
573
WSADATA wsaData ;
495
-
496
- // Make sure WSA is initialized.
574
+ // Make sure WSA is initialized. (wj32)
497
575
WSAStartup (WINSOCK_VERSION , & wsaData );
498
576
NetworkImportDone = TRUE;
499
577
}
0 commit comments