@@ -54,88 +54,105 @@ PPH_STRING TracertGetErrorMessage(
54
54
return message ;
55
55
}
56
56
57
+ PPH_STRING PhpGetIp4ReverseNameFromAddress (
58
+ _In_ IN_ADDR Address
59
+ )
60
+ {
61
+ return PhFormatString (L"%u.%u.%u.%u.%s" ,
62
+ Address .s_impno ,
63
+ Address .s_lh ,
64
+ Address .s_host ,
65
+ Address .s_net ,
66
+ DNS_IP4_REVERSE_DOMAIN_STRING_W
67
+ );
68
+ }
69
+
70
+ PPH_STRING PhpGetIp6ReverseNameFromAddress (
71
+ _In_ IN6_ADDR Address
72
+ )
73
+ {
74
+ PH_STRING_BUILDER stringBuilder ;
75
+
76
+ PhInitializeStringBuilder (& stringBuilder , 32 );
77
+
78
+ for (INT i = sizeof (IN6_ADDR ) - 1 ; i >= 0 ; i -- )
79
+ {
80
+ PhAppendFormatStringBuilder (
81
+ & stringBuilder ,
82
+ L"%x.%x." ,
83
+ Address .s6_addr [i ] & 0xF ,
84
+ (Address .s6_addr [i ] >> 4 ) & 0xF
85
+ );
86
+ }
87
+
88
+ PhAppendStringBuilder2 (& stringBuilder , DNS_IP6_REVERSE_DOMAIN_STRING_W );
89
+
90
+ return PhFinalStringBuilderString (& stringBuilder );
91
+ }
92
+
57
93
NTSTATUS TracertHostnameLookupCallback (
58
94
_In_ PVOID Parameter
59
95
)
60
96
{
61
97
PTRACERT_RESOLVE_WORKITEM resolve = Parameter ;
62
- WSADATA winsockStartup ;
98
+ DNS_STATUS status ;
99
+ PPH_STRING addressHostName = NULL ;
100
+ PPH_STRING addressReverse = NULL ;
101
+ PDNS_RECORD dnsQueryResults = NULL ;
63
102
64
- if (WSAStartup (WINSOCK_VERSION , & winsockStartup ) != ERROR_SUCCESS )
103
+ if (resolve -> Type == PH_IPV4_NETWORK_TYPE )
104
+ {
105
+ addressReverse = PhpGetIp4ReverseNameFromAddress (((PSOCKADDR_IN )& resolve -> SocketAddress )-> sin_addr );
106
+ }
107
+ else if (resolve -> Type == PH_IPV6_NETWORK_TYPE )
108
+ {
109
+ addressReverse = PhpGetIp6ReverseNameFromAddress (((PSOCKADDR_IN6 )& resolve -> SocketAddress )-> sin6_addr );
110
+ }
111
+ else
112
+ {
65
113
return STATUS_INVALID_PARAMETER ;
114
+ }
66
115
67
- if (resolve -> Type == PH_IPV4_NETWORK_TYPE )
116
+ status = DnsQuery (
117
+ addressReverse -> Buffer ,
118
+ DNS_TYPE_PTR ,
119
+ DNS_QUERY_BYPASS_CACHE | DNS_QUERY_NO_HOSTS_FILE ,
120
+ NULL ,
121
+ & dnsQueryResults ,
122
+ NULL
123
+ );
124
+
125
+ if (dnsQueryResults )
68
126
{
69
- if (!GetNameInfo (
70
- (PSOCKADDR )& resolve -> SocketAddress ,
71
- sizeof (SOCKADDR_IN ),
72
- resolve -> SocketAddressHostname ,
73
- sizeof (resolve -> SocketAddressHostname ),
74
- NULL ,
75
- 0 ,
76
- NI_NAMEREQD
77
- ))
78
- {
79
- SendMessage (
80
- resolve -> WindowHandle ,
81
- WM_TRACERT_HOSTNAME ,
82
- resolve -> Index ,
83
- (LPARAM )PhCreateString (resolve -> SocketAddressHostname )
84
- );
85
- }
86
- else
87
- {
88
- ULONG errorCode = WSAGetLastError ();
89
- if (errorCode != WSAHOST_NOT_FOUND && errorCode != WSATRY_AGAIN )
90
- {
91
- SendMessage (
92
- resolve -> WindowHandle ,
93
- WM_TRACERT_HOSTNAME ,
94
- resolve -> Index ,
95
- (LPARAM )PhGetWin32Message (errorCode )
96
- );
97
- }
127
+ addressHostName = PhCreateString (dnsQueryResults -> Data .PTR .pNameHost ); // Return the first result (dmex)
128
+ DnsRecordListFree (dnsQueryResults , DnsFreeRecordList );
129
+ }
98
130
99
- PhDereferenceObject (resolve );
100
- }
131
+ if (addressHostName )
132
+ {
133
+ SendMessage (
134
+ resolve -> WindowHandle ,
135
+ WM_TRACERT_HOSTNAME ,
136
+ resolve -> Index ,
137
+ (LPARAM )addressHostName
138
+ );
101
139
}
102
- else if ( resolve -> Type == PH_IPV6_NETWORK_TYPE )
140
+ else
103
141
{
104
- if (!GetNameInfo (
105
- (PSOCKADDR )& resolve -> SocketAddress ,
106
- sizeof (SOCKADDR_IN6 ),
107
- resolve -> SocketAddressHostname ,
108
- sizeof (resolve -> SocketAddressHostname ),
109
- NULL ,
110
- 0 ,
111
- NI_NAMEREQD
112
- ))
142
+ if (status != DNS_ERROR_RCODE_NAME_ERROR )
113
143
{
114
144
SendMessage (
115
- resolve -> WindowHandle ,
116
- WM_TRACERT_HOSTNAME ,
117
- resolve -> Index ,
118
- (LPARAM )PhCreateString ( resolve -> SocketAddressHostname )
145
+ resolve -> WindowHandle ,
146
+ WM_TRACERT_HOSTNAME ,
147
+ resolve -> Index ,
148
+ (LPARAM )PhGetWin32Message ( status )
119
149
);
120
150
}
121
- else
122
- {
123
- ULONG errorCode = WSAGetLastError ();
124
- if (errorCode != WSAHOST_NOT_FOUND && errorCode != WSATRY_AGAIN )
125
- {
126
- SendMessage (
127
- resolve -> WindowHandle ,
128
- WM_TRACERT_HOSTNAME ,
129
- resolve -> Index ,
130
- (LPARAM )PhGetWin32Message (errorCode )
131
- );
132
- }
133
151
134
- PhDereferenceObject (resolve );
135
- }
152
+ PhDereferenceObject (resolve );
136
153
}
137
154
138
- WSACleanup ( );
155
+ PhDereferenceObject ( addressReverse );
139
156
140
157
return STATUS_SUCCESS ;
141
158
}
@@ -276,7 +293,7 @@ NTSTATUS NetworkTracertThreadStart(
276
293
0
277
294
};
278
295
279
- if (icmpRandString = PhCreateStringEx (NULL , PhGetIntegerSetting (SETTING_NAME_PING_SIZE ) * 2 + 2 ))
296
+ if (icmpRandString = PhCreateStringEx (NULL , PhGetIntegerSetting (SETTING_NAME_PING_SIZE ) * sizeof ( WCHAR ) + sizeof ( UNICODE_NULL ) ))
280
297
{
281
298
PhGenerateRandomAlphaString (icmpRandString -> Buffer , (ULONG )icmpRandString -> Length / sizeof (WCHAR ));
282
299
@@ -485,7 +502,7 @@ VOID TracertMenuActionCallback(
485
502
PWSTR terminator = NULL ;
486
503
PTRACERT_ROOT_NODE node ;
487
504
488
- if (node = GetSelectedTracertNode (Context ))
505
+ if (( node = GetSelectedTracertNode (Context )) && ! PhIsNullOrEmptyString ( node -> IpAddressString ))
489
506
{
490
507
if (NT_SUCCESS (RtlIpv4StringToAddress (
491
508
node -> IpAddressString -> Buffer ,
@@ -518,7 +535,7 @@ VOID TracertMenuActionCallback(
518
535
PWSTR terminator = NULL ;
519
536
PTRACERT_ROOT_NODE node ;
520
537
521
- if (node = GetSelectedTracertNode (Context ))
538
+ if (( node = GetSelectedTracertNode (Context )) && ! PhIsNullOrEmptyString ( node -> IpAddressString ))
522
539
{
523
540
if (NT_SUCCESS (RtlIpv4StringToAddress (
524
541
node -> IpAddressString -> Buffer ,
@@ -551,7 +568,7 @@ VOID TracertMenuActionCallback(
551
568
PWSTR terminator = NULL ;
552
569
PTRACERT_ROOT_NODE node ;
553
570
554
- if (node = GetSelectedTracertNode (Context ))
571
+ if (( node = GetSelectedTracertNode (Context )) && ! PhIsNullOrEmptyString ( node -> IpAddressString ))
555
572
{
556
573
if (NT_SUCCESS (RtlIpv4StringToAddress (
557
574
node -> IpAddressString -> Buffer ,
@@ -719,6 +736,13 @@ INT_PTR CALLBACK TracertDlgProc(
719
736
PhInsertEMenuItem (menu , PhCreateEMenuItem (0 , MENU_ACTION_COPY , L"Copy" , NULL , NULL ), ULONG_MAX );
720
737
PhInsertCopyCellEMenuItem (menu , MENU_ACTION_COPY , context -> TreeNewHandle , contextMenuEvent -> Column );
721
738
739
+ if (PhIsNullOrEmptyString (selectedNode -> IpAddressString ))
740
+ {
741
+ PhSetFlagsEMenuItem (menu , MAINMENU_ACTION_PING , PH_EMENU_DISABLED , PH_EMENU_DISABLED );
742
+ PhSetFlagsEMenuItem (menu , NETWORK_ACTION_TRACEROUTE , PH_EMENU_DISABLED , PH_EMENU_DISABLED );
743
+ PhSetFlagsEMenuItem (menu , NETWORK_ACTION_WHOIS , PH_EMENU_DISABLED , PH_EMENU_DISABLED );
744
+ }
745
+
722
746
selectedItem = PhShowEMenu (
723
747
menu ,
724
748
hwndDlg ,
@@ -856,7 +880,12 @@ VOID ShowTracertWindow(
856
880
memset (context , 0 , sizeof (NETWORK_TRACERT_CONTEXT ));
857
881
858
882
context -> MaximumHops = PhGetIntegerSetting (SETTING_NAME_TRACERT_MAX_HOPS );
859
- context -> RemoteEndpoint = NetworkItem -> RemoteEndpoint ;
883
+
884
+ RtlCopyMemory (
885
+ & context -> RemoteEndpoint ,
886
+ & NetworkItem -> RemoteEndpoint ,
887
+ sizeof (PH_IP_ENDPOINT )
888
+ );
860
889
861
890
if (NetworkItem -> RemoteEndpoint .Address .Type == PH_IPV4_NETWORK_TYPE )
862
891
{
@@ -880,7 +909,12 @@ VOID ShowTracertWindowFromAddress(
880
909
memset (context , 0 , sizeof (NETWORK_TRACERT_CONTEXT ));
881
910
882
911
context -> MaximumHops = PhGetIntegerSetting (SETTING_NAME_TRACERT_MAX_HOPS );
883
- context -> RemoteEndpoint = RemoteEndpoint ;
912
+
913
+ RtlCopyMemory (
914
+ & context -> RemoteEndpoint ,
915
+ & RemoteEndpoint ,
916
+ sizeof (PH_IP_ENDPOINT )
917
+ );
884
918
885
919
if (RemoteEndpoint .Address .Type == PH_IPV4_NETWORK_TYPE )
886
920
{
0 commit comments