您的位置:首页 > 其它

详细的查询进程和端口的 API 的方法

2012-02-20 17:04 579 查看
查询进程和端口的 API 介绍:

好,上面说的有点离题了,这篇博文的目的在应用层而不在内核层,

所以我们无须去体会 Windows 网络层的这种变化。

一般来说,要完成进程和端口的映射,我们使用的是由 IPHlpapi.dll 中导出的 API 来完成的,

在 Vista 之前的操作系统中,要查询进程和端口的信息,容易很多,

你可以通过调用 IPHlpapi.dll 中导出的下面两个 API 来完成查询 TCP 和 UDP 端口的信息,

下面的两个 API 分别用来查询 TCP 和 UDP 端口信息,

(下面的两个 API 仅适用于 XP 和 Server 2003,在 Vista 以及 7 中,这两个 API 被移除)

[code]
[code] DWORD WINAPI AllocateAndGetTcpExTableFromStack(

__out PVOID* ppTcpTable,

__inBOOL bOrder,

__inHANDLE hHeap,

__inDWORD dwFlags,

__inDWORD dwFamily

);


DWORD WINAPI AllocateAndGetUdpExTableFromStack(

 __out PVOID* ppUDPTable,

__inBOOL bOrder,

__inHANDLE hHeap,

__inDWORD dwFlags,

__inDWORD dwFamily

);


[/code]
[/code]
参数说明:

第一个参数:很显然,为输出参数,带回我们查询到的 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 端口信息,

[code]
[code]//=====================================================================================//

 //Name: DWORD InternalGetTcpTable2() //

 // //

 //Descripion: 该函数在 Windows Vista 以及 Windows 7 下面效//

 // //

//=====================================================================================//

typedef DWORD (WINAPI *PFNInternalGetTcpTable2)(

 PMIB_TCPEXTABLE_VISTA *pTcpTable_Vista,

 HANDLE heap,

 DWORD flags

);


//=====================================================================================//

 //Name: DWORD InternalGetUdpTableWithOwnerPid()//

 // //

 //Descripion: 该函数在 Windows Vista 以及 Windows 7 下面效//

 // //

//=====================================================================================//

typedef DWORD (WINAPI *PFNInternalGetUdpTableWithOwnerPid)(

 PMIB_UDPEXTABLE *pUdpTable,

 HANDLE heap,

 DWORD flags

);

[/code]
[/code]
参数说明:

第一个参数:pTcpTable_Vista 或者 pUdpTable 则不需要多说,其为输出参数,带回查询到的值;

第二个参数:heap 也不需要多说,其指示要从哪个 Heap 上面分配内存;

第三个参数:flags 则未知,一般都设置为 1,不过貌似设置为 2 啊之类的好像又多影响不大;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: