1: //=====================================================================================//
2: //Name: DWORD GetProcessIdByPort() //
3: // //
4: //Descripion: 根据端口号求出打开该端口号的进程 ID(支持 XP,Server 2003,Vista,Win7) //
5: // //
6: //=====================================================================================//
7: DWORD GetProcessIdByPort(TcpOrUdp type, DWORD dwPort)
8: {
9: HMODULE hModule = LoadLibraryW(L"iphlpapi.dll");
10: if (hModule == NULL)
11: {
12: return 0;
13: }
14:
15: if(type == TcpType)
16: {
17: // 表明查询的是 TCP 信息
18: PFNAllocateAndGetTcpExTableFromStack pAllocateAndGetTcpExTableFromStack;
19: pAllocateAndGetTcpExTableFromStack =
20: (PFNAllocateAndGetTcpExTableFromStack)GetProcAddress(hModule, "AllocateAndGetTcpExTableFromStack");
21: if (pAllocateAndGetTcpExTableFromStack != NULL)
22: {
23: // 表明为 XP 或者 Server 2003 操作系统
24: PMIB_TCPEXTABLE pTcpExTable = NULL;
25: if (pAllocateAndGetTcpExTableFromStack(&pTcpExTable, TRUE, GetProcessHeap(), 0, AF_INET) != 0)
26: {
27: if (pTcpExTable)
28: {
29: HeapFree(GetProcessHeap(), 0, pTcpExTable);
30: }
31:
32: FreeLibrary(hModule);
33: hModule = NULL;
34:
35: return 0;
36: }
37:
38: for (UINT i = 0; i < pTcpExTable->dwNumEntries; i++)
39: {
40: // 过滤掉数据,只查询我们需要的进程数据
41: if(dwPort == ntohs(0x0000FFFF & pTcpExTable->table[i].dwLocalPort))
42: {
43: DWORD dwProcessId = pTcpExTable->table[i].dwProcessId;
44: if (pTcpExTable)
45: {
46: HeapFree(GetProcessHeap(), 0, pTcpExTable);
47: }
48:
49: FreeLibrary(hModule);
50: hModule = NULL;
51:
52: return dwProcessId;
53: }
54: }
55:
56: if (pTcpExTable)
57: {
58: HeapFree(GetProcessHeap(), 0, pTcpExTable);
59: }
60:
61: FreeLibrary(hModule);
62: hModule = NULL;
63:
64: return 0;
65: }
66: else
67: {
68: // 表明为 Vista 或者 7 操作系统
69: PMIB_TCPEXTABLE_VISTA pTcpExTable = NULL;
70: PFNInternalGetTcpTable2 pInternalGetTcpTable2 =
71: (PFNInternalGetTcpTable2)GetProcAddress(hModule, "InternalGetTcpTable2");
72: if (pInternalGetTcpTable2 == NULL)
73: {
74: if (pTcpExTable)
75: {
76: HeapFree(GetProcessHeap(), 0, pTcpExTable);
77: }
78:
79: FreeLibrary(hModule);
80: hModule = NULL;
81:
82: return 0;
83: }
84:
85: if (pInternalGetTcpTable2(&pTcpExTable, GetProcessHeap(), 1))
86: {
87: if (pTcpExTable)
88: {
89: HeapFree(GetProcessHeap(), 0, pTcpExTable);
90: }
91:
92: FreeLibrary(hModule);
93: hModule = NULL;
94:
95: return 0;
96: }
97:
98: for (UINT i = 0;i < pTcpExTable->dwNumEntries; i++)
99: {
100: // 过滤掉数据,只查询我们需要的进程数据
101: if(dwPort == ntohs(0x0000FFFF & pTcpExTable->table[i].dwLocalPort))
102: {
103: DWORD dwProcessId = pTcpExTable->table[i].dwProcessId;
104: if (pTcpExTable)
105: {
106: HeapFree(GetProcessHeap(), 0, pTcpExTable);
107: }
108:
109: FreeLibrary(hModule);
110: hModule = NULL;
111:
112: return dwProcessId;
113: }
114: }
115:
116: if (pTcpExTable)
117: {
118: HeapFree(GetProcessHeap(), 0, pTcpExTable);
119: }
120:
121: FreeLibrary(hModule);
122: hModule = NULL;
123:
124: return 0;
125: }
126: }
127: else if(type == UdpType)
128: {
129: // 表明查询的是 UDP 信息
130: PMIB_UDPEXTABLE pUdpExTable = NULL;
131: PFNAllocateAndGetUdpExTableFromStack pAllocateAndGetUdpExTableFromStack;
132: pAllocateAndGetUdpExTableFromStack =
133: (PFNAllocateAndGetUdpExTableFromStack)GetProcAddress(hModule,"AllocateAndGetUdpExTableFromStack");
134: if (pAllocateAndGetUdpExTableFromStack != NULL)
135: {
136: // 表明为 XP 或者 Server 2003 操作系统
137: if (pAllocateAndGetUdpExTableFromStack(&pUdpExTable, TRUE, GetProcessHeap(), 0, AF_INET) != 0)
138: {
139: if (pUdpExTable)
140: {
141: HeapFree(GetProcessHeap(), 0, pUdpExTable);
142: }
143:
144: FreeLibrary(hModule);
145: hModule = NULL;
146:
147: return 0;
148: }
149:
150: for (UINT i = 0; i < pUdpExTable->dwNumEntries; i++)
151: {
152: // 过滤掉数据,只查询我们需要的进程数据
153: if (dwPort == ntohs(0x0000FFFF & pUdpExTable->table[i].dwLocalPort))
154: {
155: DWORD dwProcessId = pUdpExTable->table[i].dwProcessId;
156: if (pUdpExTable)
157: {
158: HeapFree(GetProcessHeap(), 0, pUdpExTable);
159: }
160:
161: FreeLibrary(hModule);
162: hModule = NULL;
163:
164: return dwProcessId;
165: }
166: }
167:
168: if (pUdpExTable)
169: {
170: HeapFree(GetProcessHeap(), 0, pUdpExTable);
171: }
172:
173: FreeLibrary(hModule);
174: hModule = NULL;
175:
176: return 0;
177: }
178: else
179: {
180: // 表明为 Vista 或者 7 操作系统
181: PFNInternalGetUdpTableWithOwnerPid pInternalGetUdpTableWithOwnerPid;
182: pInternalGetUdpTableWithOwnerPid =
183: (PFNInternalGetUdpTableWithOwnerPid)GetProcAddress(hModule, "InternalGetUdpTableWithOwnerPid");
184: if (pInternalGetUdpTableWithOwnerPid != NULL)
185: {
186: if (pInternalGetUdpTableWithOwnerPid(&pUdpExTable, GetProcessHeap(), 1))
187: {
188: if (pUdpExTable)
189: {
190: HeapFree(GetProcessHeap(), 0, pUdpExTable);
191: }
192:
193: FreeLibrary(hModule);
194: hModule = NULL;
195:
196: return 0;
197: }
198:
199: for (UINT i = 0; i < pUdpExTable->dwNumEntries; i++)
200: {
201: // 过滤掉数据,只查询我们需要的进程数据
202: if (dwPort == ntohs(0x0000FFFF & pUdpExTable->table[i].dwLocalPort))
203: {
204: DWORD dwProcessId = pUdpExTable->table[i].dwProcessId;
205: if (pUdpExTable)
206: {
207: HeapFree(GetProcessHeap(), 0, pUdpExTable);
208: }
209:
210: FreeLibrary(hModule);
211: hModule = NULL;
212:
213: return dwProcessId;
214: }
215: }
216: }
217:
218: if (pUdpExTable)
219: {
220: HeapFree(GetProcessHeap(), 0, pUdpExTable);
221: }
222:
223: FreeLibrary(hModule);
224: hModule = NULL;
225:
226: return 0;
227: }
228: }
229: else
230: {
231: FreeLibrary(hModule);
232: hModule = NULL;
233:
234: return -1;
235: }
236: }