Delphi版進程連接端口查看程序,這是主文件的代碼,可編譯成可運行的EXE程序,前兩年收集的Delphi實用程序,現在把主代碼發出來哦。裡面涉及一些UDP/TCP和枚舉進程的相關知識,包括獲取一些端口和路徑信息等:
001
unit
Unit1;
002
//進程連接端口查看器
003
//作者:yeye55
004
interface
005
uses
006
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
007
Dialogs, Grids, StdCtrls, ExtCtrls, StrUtils, PsAPI, tlhelp32, WinSock;
008
type
009
TForm1 =
class
(TForm)
010
Panel1: TPanel;
011
Button1: TButton;
012
Label1: TLabel;
013
StringGrid1: TStringGrid;
014
Button2: TButton;
015
Button3: TButton;
016
SaveDialog1: TSaveDialog;
017
procedure
FormCreate(Sender: TObject);
018
Button1Click(Sender: TObject);
019
Button2Click(Sender: TObject);
020
Button3Click(Sender: TObject);
021
private
022
{ Private declarations }
023
public
024
{ Public declarations }
025
end
;
026
var
027
Form1: TForm1;
028
//以下常量定義根據VC++6.0自帶IPRTRMIB.H文件中的相關定義改寫
029
const
030
MIB_TCP_STATE_CLOSED =
1
031
MIB_TCP_STATE_LISTEN =
2
032
MIB_TCP_STATE_SYN_SENT =
3
033
MIB_TCP_STATE_SYN_RCVD =
4
034
MIB_TCP_STATE_ESTAB =
5
035
MIB_TCP_STATE_FIN_WAIT1 =
6
036
MIB_TCP_STATE_FIN_WAIT2 =
7
037
MIB_TCP_STATE_CLOSE_WAIT =
8
038
MIB_TCP_STATE_CLOSING =
9
039
MIB_TCP_STATE_LAST_ACK =
10
040
MIB_TCP_STATE_TIME_WAIT =
11
041
MIB_TCP_STATE_DELETE_TCB =
12
042
//相關數據結構的定義
043
044
ANY_SIZE=
256
045
046
MIB_TCPEXROW =
record
047
dwState : DWord;
//連接狀態
048
dwLocalAddr : DWord;
//本地地址
049
dwLocalPort : DWord;
//本地端口
050
dwRemoteAddr : DWord;
//遠程地址
051
dwRemotePort : DWord;
//遠程端口
052
dwProcessId : DWord;
//進程ID號
053
054
MIB_TCPEXTABLE =
055
dwNumEntrIEs : DWord;
//端口數量
056
table :
array
[
0..
ANY_SIZE-
]
of
MIB_TCPEXROW;
057
058
PMIB_TCPEXTABLE = ^MIB_TCPEXTABLE;
059
MIB_UDPEXROW =
060
061
062
063
064
MIB_UDPEXTABLE =
065
066
MIB_UDPEXROW;
067
068
PMIB_UDPEXTABLE = ^MIB_UDPEXTABLE;
069
//獲取TCP連接表的IP幫助函數聲明
070
function
AllocateAndGetTcpExTableFromStack(
071
pTcpTable;
072
bOrder : Bool;
073
heap : THandle;
074
zero : DWord;
075
flags : DWord
076
): DWord; stdcall; external
'iphlpapi.dll'
077
name
'AllocateAndGetTcpExTableFromStack'
078
//獲取UDP連接表的IP幫助函數聲明
079
AllocateAndGetUdpExTableFromStack(
080
pUdpTable;
081
082
083
084
085
086
'AllocateAndGetUdpExTableFromStack'
087
implementation
088
{$R *.dfm}
089
TForm1
.
090
begin
091
self
StringGrid1
Cells[
0
,
]:=
' 協議'
092
' 本地IP地址'
093
' 遠程IP地址'
094
' 連接狀態'
095
' 進程ID'
096
' 可執行文件名'
097
' 文件路徑'
098
' 文件說明 / 公司名稱'
099
//
100
Button1Click(self);
101
102
//將連接狀態轉換為說明字符串
103
StateToString(dwState : DWord):
String
104
105
result:=
''
106
case
dwState
107
MIB_TCP_STATE_CLOSED : result:=
'關閉'
108
MIB_TCP_STATE_LISTEN : result:=
'監聽'
109
MIB_TCP_STATE_SYN_SENT : result:=
'同步發送'
110
MIB_TCP_STATE_SYN_RCVD : result:=
'同步接收'
111
MIB_TCP_STATE_ESTAB : result:=
'已建立'
112
MIB_TCP_STATE_FIN_WAIT1 : result:=
'等待完成1'
113
MIB_TCP_STATE_FIN_WAIT2 : result:=
'等待完成2'
114
MIB_TCP_STATE_CLOSE_WAIT : result:=
'等待關閉'
115
MIB_TCP_STATE_CLOSING : result:=
'正在關閉'
116
MIB_TCP_STATE_LAST_ACK : result:=
'最後確認'
117
MIB_TCP_STATE_TIME_WAIT : result:=
'等待時間'
118
MIB_TCP_STATE_DELETE_TCB : result:=
'刪除'
119
else
result:=Format(
'未知狀態%d'
,[dwState]);
120
121
122
//根據進程ID查找可執行文件名
123
IdToExeFile(hSnapshot : THandle; dwProcessId : DWord):
124
125
lppe : TProcessEntry32;
126
b : BOOL;
127
128
lppe
dwSize:=SizeOf(lppe);
129
//取第1個進程數據
130
b:=Process32First(hSnapshot,lppe);
131
132
while
b
do
133
134
if
th32ProcessID=dwProcessId
then
135
136
result:=lppe
szExeFile;
137
break;
138
139
//取下一個進程
140
b:=Process32Next(hSnapshot,lppe);
141
142
143
//根據進程ID查找可執行文件路徑
144
IdToExeDir(dwProcessId : DWord):
145
146
cbNeeded : DWord;
147
hProcess : THandle;
148
hModules : HMODULE;
149
lpFilename :
0..1024
-
Char
150
151
152
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION
or
PROCESS_VM_READ,
false
,dwProcessId);
153
hProcess=
exit;
154
EnumProcessModules(hProcess,@hModules,sizeof(hModule),cbNeeded);
155
GetModuleFileNameEx(hProcess,hModules,lpFilename,
1024
);
156
result:=lpFilename;
157
CloseHandle(hProcess);
158
159
//根據文件名查找文件信息
160
ExeDirToFileInfo(Filename :
):
161
162
NameLen,BufLen,ValLen : DWord;
163
pBuf,pVal :
Pointer
164
LangCode :
165
166
167
NameLen:=Length(Filename);
168
NameLen=
169
//獲取版本信息
170
BufLen:=GetFileVersionInfoSize(
PChar
(Filename),NameLen);
171
pBuf:=AllocMem(BufLen);
172
pBuf=
nil
173
GetFileVersionInfo(
(Filename),
,BufLen,pBuf)=
174
175
FreeMem(pBuf);
176
177
178
//獲取代碼頁信息
179
VerQueryValue(pBuf,
'\VarFileInfo\Translation'
,pVal,ValLen)=
180
181
182
183
184
LangCode:=Format(
'%.2x%.2x%.2x%.2x'
,[
185
BYTE
(
(pVal)[
]),
186
187
188
])]);
189
//獲取文件說明
190
'\StringFileInfo\'+LangCode+'
\FileDescription'),pVal,ValLen)=
191
192
193
194
195
(pVal);
196
//獲取公司名稱
197
\CompanyName'),pVal,ValLen)=
198
199
200
201
202
result:=result+
' / '
+
203
204
205
206
207
hSnapshot : THandle;
//進程快照
208
pTcpTab : PMIB_TCPEXTABLE;
//TCP連接表
209
pUdpTab : PMIB_UDPEXTABLE;
//UDP連接表
210
i :
Integer
211
212
RowCount:=
213
//創建進程快照
214
hSnapshot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,
215
//獲取TCP連接表
216
AllocateAndGetTcpExTableFromStack(pTcpTab,
true
,GetProcessHeap(),
)<>
217
218
MessageBox(self
Handle,
'無法獲取TCP連接表'
'調用失敗'
,MB_ICONEXCLAMATION
MB_OK);
219
220
221
222
//輸出TCP連接表
223
for
i:=
to
pTcpTab
dwNumEntrIEs-
224
225
,self
RowCount-
226
'TCP'
227
228
inet_ntoa(TInAddr(pTcpTab
table[i].dwLocalAddr))+
229
':'
+IntToStr(ntohs(pTcpTab
table[i].dwLocalPort));
230
231
table[i].dwRemoteAddr))+
232
table[i].dwRemotePort));
233
234
StateToString(pTcpTab
table[i].dwState);
235
236
IntToStr(pTcpTab
table[i].dwProcessId);
237
238
IdToExeFile(hSnapshot,pTcpTab
239
240
IdToExeDir(pTcpTab
241
242
ExeDirToFileInfo(self
]);
243
RowCount:=self
RowCount+
244
245
246
//獲取UDP連接表
247
AllocateAndGetUdpExTableFromStack(pUdpTab,
248
249
'無法獲取UDP連接表'
250
251
252
253
//輸出UDP連接表
254
pUdpTab
255
257
'UDP'
258
259
inet_ntoa(TInAddr(pUdpTab
260
+IntToStr(ntohs(pUdpTab
261
262
'*.*.*.*:*'
263
264
265
266
IntToStr(pUdpTab
267
268
IdToExeFile(hSnapshot,PUdpTab
269
270
IdToExeDir(pUdpTab
271
272
273
274
275
276
//關閉句柄
277
CloseHandle(hSnapshot);
278
RowCount=
279
280
Label1
Caption:=
'發現 TCP/UDP 連接端口: 0 個'
281
'空'
282
283
284
285
286
287
288
289
290
291
292
293
Caption:=Format(
'發現 TCP/UDP 連接端口: %d 個'
294
[self
295
296
297
298
299
ColLen :
300
c,r,n :
301
f : TFileStream;
302
s :
303
304
(self
ColCount=
)
305
306
not
SaveDialog1
Execute
307
//計算每列字符長度
308
SetLength(ColLen,self
ColCount);
309
c:=
ColCount-
310
311
ColLen[c]:=
312
r:=
313
314
n:=Length(self
Cells[c,r]);
315
n>ColLen[c]
ColLen[c]:=n;
316
317
ColLen[c]:=ColLen[c]+
318
319
//每列對齊後寫入文件
320
f:=TFileStream
Create(self
FileName,fmCreate);
321
322
323
324
325
s:=self
Cells[c,r];
326
n:=Length(s);
327
s:=s+DupeString(
' '
,ColLen[c]-n);
328
f
Write
(s)^,ColLen[c]);
329
330
s:=#
13
#
32
331
(s)^,
332
333
334
'連接表信息已保存到文件 '
335
FileName+
336
' 中。'
),
'保存完畢'
,MB_ICONINFORMATION
337
SetLength(ColLen,
338
Free;
339
340
341
342
343
'進程連接端口查看器'
+#
344
'作者:yeye55'
345
'本程序最早在http://www.codefans.Net/上發布'
346
'關於'
,MB_ICONASTERISK
347
348
本例效果圖: 代碼文件:unit Unit1;inter
{相關結構:} TDSFXParamEq = packed
本例效果圖:代碼文件:unit Unit1;i
最近開始幫hr部門處理一個access數據庫,好久