Skip to content

Commit f5f8e16

Browse files
committed
NetworkTools: Improve hostname lookup performance, Fix crash
1 parent bb89acb commit f5f8e16

File tree

6 files changed

+127
-85
lines changed

6 files changed

+127
-85
lines changed

plugins/NetworkTools/NetworkTools.vcxproj

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,27 +56,27 @@
5656
</ImportGroup>
5757
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
5858
<Link>
59-
<AdditionalDependencies>iphlpapi.lib;winhttp.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
60-
<DelayLoadDLLs>comctl32.dll;gdi32.dll;iphlpapi.dll;winhttp.dll;ws2_32.dll;user32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
59+
<AdditionalDependencies>dnsapi.lib;iphlpapi.lib;winhttp.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
60+
<DelayLoadDLLs>comctl32.dll;dnsapi.dll;gdi32.dll;iphlpapi.dll;winhttp.dll;ws2_32.dll;user32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
6161
</Link>
6262
<ClCompile />
6363
</ItemDefinitionGroup>
6464
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
6565
<Link>
66-
<AdditionalDependencies>iphlpapi.lib;winhttp.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
67-
<DelayLoadDLLs>comctl32.dll;gdi32.dll;iphlpapi.dll;winhttp.dll;ws2_32.dll;user32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
66+
<AdditionalDependencies>dnsapi.lib;iphlpapi.lib;winhttp.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
67+
<DelayLoadDLLs>comctl32.dll;dnsapi.dll;gdi32.dll;iphlpapi.dll;winhttp.dll;ws2_32.dll;user32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
6868
</Link>
6969
</ItemDefinitionGroup>
7070
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
7171
<Link>
72-
<AdditionalDependencies>iphlpapi.lib;winhttp.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
73-
<DelayLoadDLLs>comctl32.dll;gdi32.dll;iphlpapi.dll;winhttp.dll;ws2_32.dll;user32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
72+
<AdditionalDependencies>dnsapi.lib;iphlpapi.lib;winhttp.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
73+
<DelayLoadDLLs>comctl32.dll;dnsapi.dll;gdi32.dll;iphlpapi.dll;winhttp.dll;ws2_32.dll;user32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
7474
</Link>
7575
</ItemDefinitionGroup>
7676
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
7777
<Link>
78-
<AdditionalDependencies>iphlpapi.lib;winhttp.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
79-
<DelayLoadDLLs>comctl32.dll;gdi32.dll;iphlpapi.dll;winhttp.dll;ws2_32.dll;user32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
78+
<AdditionalDependencies>dnsapi.lib;iphlpapi.lib;winhttp.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
79+
<DelayLoadDLLs>comctl32.dll;dnsapi.dll;gdi32.dll;iphlpapi.dll;winhttp.dll;ws2_32.dll;user32.dll;%(DelayLoadDLLs)</DelayLoadDLLs>
8080
</Link>
8181
</ItemDefinitionGroup>
8282
<ItemGroup>

plugins/NetworkTools/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,7 @@ VOID ProcessesUpdatedCallback(
836836
sizeof(TCP_ESTATS_PATH_ROD_v0)
837837
) == ERROR_SUCCESS)
838838
{
839-
extension->NumberOfLostPackets = pathRod.FastRetran + pathRod.PktsRetrans;
839+
extension->NumberOfLostPackets = UInt32Add32To64(pathRod.FastRetran, pathRod.PktsRetrans);
840840
extension->SampleRtt = pathRod.SampleRtt;
841841

842842
if (extension->SampleRtt == ULONG_MAX) // HACK
@@ -883,7 +883,7 @@ VOID ProcessesUpdatedCallback(
883883
sizeof(TCP_ESTATS_PATH_ROD_v0)
884884
) == ERROR_SUCCESS)
885885
{
886-
extension->NumberOfLostPackets = pathRod.FastRetran + pathRod.PktsRetrans;
886+
extension->NumberOfLostPackets = UInt32Add32To64(pathRod.FastRetran, pathRod.PktsRetrans);
887887
extension->SampleRtt = pathRod.SampleRtt;
888888

889889
if (extension->SampleRtt == ULONG_MAX) // HACK

plugins/NetworkTools/ping.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ NTSTATUS NetworkPingThreadStart(
4949
};
5050
//pingOptions.Flags |= IP_FLAG_REVERSE;
5151

52-
if (icmpRandString = PhCreateStringEx(NULL, PhGetIntegerSetting(SETTING_NAME_PING_SIZE) * 2 + 2))
52+
if (icmpRandString = PhCreateStringEx(NULL, PhGetIntegerSetting(SETTING_NAME_PING_SIZE) * sizeof(WCHAR) + sizeof(UNICODE_NULL)))
5353
{
5454
PhGenerateRandomAlphaString(icmpRandString->Buffer, (ULONG)icmpRandString->Length / sizeof(WCHAR));
5555

plugins/NetworkTools/tracert.c

Lines changed: 103 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -54,88 +54,105 @@ PPH_STRING TracertGetErrorMessage(
5454
return message;
5555
}
5656

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+
5793
NTSTATUS TracertHostnameLookupCallback(
5894
_In_ PVOID Parameter
5995
)
6096
{
6197
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;
63102

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+
{
65113
return STATUS_INVALID_PARAMETER;
114+
}
66115

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)
68126
{
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+
}
98130

99-
PhDereferenceObject(resolve);
100-
}
131+
if (addressHostName)
132+
{
133+
SendMessage(
134+
resolve->WindowHandle,
135+
WM_TRACERT_HOSTNAME,
136+
resolve->Index,
137+
(LPARAM)addressHostName
138+
);
101139
}
102-
else if (resolve->Type == PH_IPV6_NETWORK_TYPE)
140+
else
103141
{
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)
113143
{
114144
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)
119149
);
120150
}
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-
}
133151

134-
PhDereferenceObject(resolve);
135-
}
152+
PhDereferenceObject(resolve);
136153
}
137154

138-
WSACleanup();
155+
PhDereferenceObject(addressReverse);
139156

140157
return STATUS_SUCCESS;
141158
}
@@ -276,7 +293,7 @@ NTSTATUS NetworkTracertThreadStart(
276293
0
277294
};
278295

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)))
280297
{
281298
PhGenerateRandomAlphaString(icmpRandString->Buffer, (ULONG)icmpRandString->Length / sizeof(WCHAR));
282299

@@ -485,7 +502,7 @@ VOID TracertMenuActionCallback(
485502
PWSTR terminator = NULL;
486503
PTRACERT_ROOT_NODE node;
487504

488-
if (node = GetSelectedTracertNode(Context))
505+
if ((node = GetSelectedTracertNode(Context)) && !PhIsNullOrEmptyString(node->IpAddressString))
489506
{
490507
if (NT_SUCCESS(RtlIpv4StringToAddress(
491508
node->IpAddressString->Buffer,
@@ -518,7 +535,7 @@ VOID TracertMenuActionCallback(
518535
PWSTR terminator = NULL;
519536
PTRACERT_ROOT_NODE node;
520537

521-
if (node = GetSelectedTracertNode(Context))
538+
if ((node = GetSelectedTracertNode(Context)) && !PhIsNullOrEmptyString(node->IpAddressString))
522539
{
523540
if (NT_SUCCESS(RtlIpv4StringToAddress(
524541
node->IpAddressString->Buffer,
@@ -551,7 +568,7 @@ VOID TracertMenuActionCallback(
551568
PWSTR terminator = NULL;
552569
PTRACERT_ROOT_NODE node;
553570

554-
if (node = GetSelectedTracertNode(Context))
571+
if ((node = GetSelectedTracertNode(Context)) && !PhIsNullOrEmptyString(node->IpAddressString))
555572
{
556573
if (NT_SUCCESS(RtlIpv4StringToAddress(
557574
node->IpAddressString->Buffer,
@@ -719,6 +736,13 @@ INT_PTR CALLBACK TracertDlgProc(
719736
PhInsertEMenuItem(menu, PhCreateEMenuItem(0, MENU_ACTION_COPY, L"Copy", NULL, NULL), ULONG_MAX);
720737
PhInsertCopyCellEMenuItem(menu, MENU_ACTION_COPY, context->TreeNewHandle, contextMenuEvent->Column);
721738

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+
722746
selectedItem = PhShowEMenu(
723747
menu,
724748
hwndDlg,
@@ -856,7 +880,12 @@ VOID ShowTracertWindow(
856880
memset(context, 0, sizeof(NETWORK_TRACERT_CONTEXT));
857881

858882
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+
);
860889

861890
if (NetworkItem->RemoteEndpoint.Address.Type == PH_IPV4_NETWORK_TYPE)
862891
{
@@ -880,7 +909,12 @@ VOID ShowTracertWindowFromAddress(
880909
memset(context, 0, sizeof(NETWORK_TRACERT_CONTEXT));
881910

882911
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+
);
884918

885919
if (RemoteEndpoint.Address.Type == PH_IPV4_NETWORK_TYPE)
886920
{

plugins/NetworkTools/tracetree.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ VOID DestroyTracertNode(
193193
_In_ PTRACERT_ROOT_NODE Node
194194
)
195195
{
196-
PhDereferenceObject(Node);
196+
PhDereferenceObject(Node);
197197
}
198198

199199
PTRACERT_ROOT_NODE AddTracertNode(
@@ -277,8 +277,8 @@ VOID UpdateTracertNodePingText(
277277
_In_ ULONG Index
278278
)
279279
{
280-
if (Node->PingStatus[Index] == IP_HOP_LIMIT_EXCEEDED ||
281-
Node->PingStatus[Index] == IP_SUCCESS)
280+
if (Node->PingStatus[Index] == IP_SUCCESS ||
281+
Node->PingStatus[Index] == IP_TTL_EXPIRED_TRANSIT) // IP_HOP_LIMIT_EXCEEDED
282282
{
283283
if (Node->PingList[Index])
284284
{

plugins/NetworkTools/whois.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,11 @@ VOID ShowWhoisWindow(
573573
context = (PNETWORK_WHOIS_CONTEXT)PhCreateAlloc(sizeof(NETWORK_WHOIS_CONTEXT));
574574
memset(context, 0, sizeof(NETWORK_WHOIS_CONTEXT));
575575

576-
context->RemoteEndpoint = NetworkItem->RemoteEndpoint;
576+
RtlCopyMemory(
577+
&context->RemoteEndpoint,
578+
&NetworkItem->RemoteEndpoint,
579+
sizeof(PH_IP_ENDPOINT)
580+
);
577581

578582
if (NetworkItem->RemoteEndpoint.Address.Type == PH_IPV4_NETWORK_TYPE)
579583
{
@@ -596,7 +600,11 @@ VOID ShowWhoisWindowFromAddress(
596600
context = (PNETWORK_WHOIS_CONTEXT)PhCreateAlloc(sizeof(NETWORK_WHOIS_CONTEXT));
597601
memset(context, 0, sizeof(NETWORK_WHOIS_CONTEXT));
598602

599-
context->RemoteEndpoint = RemoteEndpoint;
603+
RtlCopyMemory(
604+
&context->RemoteEndpoint,
605+
&RemoteEndpoint,
606+
sizeof(PH_IP_ENDPOINT)
607+
);
600608

601609
if (RemoteEndpoint.Address.Type == PH_IPV4_NETWORK_TYPE)
602610
{

0 commit comments

Comments
 (0)