详细的查询进程和端口的 API 的方法
查询进程和端口的 API 介绍:
好,上面说的有点离题了,这篇博文的目的在应用层而不在内核层,
所以我们无须去体会 Windows 网络层的这种变化。
一般来说,要完成进程和端口的映射,我们使用的是由 IPHlpapi.dll 中导出的 API 来完成的,
在 Vista 之前的操作系统中,要查询进程和端口的信息,容易很多,
你可以通过调用 IPHlpapi.dll 中导出的下面两个 API 来完成查询 TCP 和 UDP 端口的信息,
下面的两个 API 分别用来查询 TCP 和 UDP 端口信息,
(下面的两个 API 仅适用于 XP 和 Server 2003,在 Vista 以及 7 中,这两个 API 被移除)
1: DWORD WINAPI AllocateAndGetTcpExTableFromStack(
2: __out PVOID* ppTcpTable,
3: __in BOOL bOrder,
4: __in HANDLE hHeap,
5: __in DWORD dwFlags,
6: __in DWORD dwFamily
7: );
8:
9: DWORD WINAPI AllocateAndGetUdpExTableFromStack(
10: __out PVOID* ppUDPTable,
11: __in BOOL bOrder,
12: __in HANDLE hHeap,
13: __in DWORD dwFlags,
14: __in DWORD dwFamily
15: );
16:
参数说明:
第一个参数:很显然,为输出参数,带回我们查询到的 TCP 或者 UDP 信息;
第二个参数:也很显然,判断输出结果是否排序;
第三个参数:指定在哪个 Heap 上分配内存;
第四个参数:指定用来控制 Heap 的标识;
第四个参数:指定 IP_V4 还是 IP_V6,具体看下面的截图:
不过要完成进程和端口的映射在 Vista 和 7 下确实也没那么容易,至于原因呢,
就是 IPHlpapi.dll 中关于查询进程和端口信息的 API 没有公开,即为 UnDocument API,
不过我们还是可以通过 UnDocument API 来完成这个查询的工作,具体涉及到下面的两个 API,
当然,下面的这两个 API 由于是 UnDocumnet API,自然你查什么 MSDN 啊之类都找不到这个 API 的声明的,
下面的两个 API 分别用来查询 TCP 和 UDP 端口信息,
1: //=====================================================================================//
2: //Name: DWORD InternalGetTcpTable2() //
3: // //
4: //Descripion: 该函数在 Windows Vista 以及 Windows 7 下面效 //
5: // //
6: //=====================================================================================//
7: typedef DWORD (WINAPI *PFNInternalGetTcpTable2)(
8: PMIB_TCPEXTABLE_VISTA *pTcpTable_Vista,
9: HANDLE heap,
10: DWORD flags
11: );
12:
13: //=====================================================================================//
14: //Name: DWORD InternalGetUdpTableWithOwnerPid() //
15: // //
16: //Descripion: 该函数在 Windows Vista 以及 Windows 7 下面效 //
17: // //
18: //=====================================================================================//
19: typedef DWORD (WINAPI *PFNInternalGetUdpTableWithOwnerPid)(
20: PMIB_UDPEXTABLE *pUdpTable,
21: HANDLE heap,
22: DWORD flags
23: );
参数说明:
第一个参数:pTcpTable_Vista 或者 pUdpTable 则不需要多说,其为输出参数,带回查询到的值;
第二个参数:heap 也不需要多说,其指示要从哪个 Heap 上面分配内存;
第三个参数:flags 则未知,一般都设置为 1,不过貌似设置为 2 啊之类的好像又多影响不大;

浙公网安备 33010602011771号