提问人:thomas_f 提问时间:7/30/2013 最后编辑:thomas_f 更新时间:8/1/2013 访问量:691
面向 x64 时有关 GetOwnerModuleFromTcpEntry 的奇怪问题
Weird issue regarding GetOwnerModuleFromTcpEntry when targeting x64
问:
由于我是第一次发帖,如果我无意中遗漏了任何关键信息,我深表歉意,但事实就这样吧。
背景:我正在做一些测试,以找出MIB_TCPROW_OWNER_MODULE中未记录的成员数组“OwningModuleInfo”是什么,以及它如何帮助所述函数确定哪个进程拥有 TCP 端点。我得出的结论是,数组中的第一项是正在运行的服务列表中服务的索引,这给我们带来了一个奇怪的问题。我在 Windows 7 上使用 Visual Studio 2012(更新 3)。测试应用在 UAC = requireAdministrator 下运行(但是,asInvoker 会生成相同的结果)。
问题:当我以 x64 为目标时,对于 tcp 表中的某些条目,GetOwnerModuleFromTcpEntry 失败并返回“126 - 找不到指定的模块”。当我以 Win32 为目标时,这个问题消失了。由于我知道这仅在条目由服务拥有时发生,因此我在调用我的测试函数(现在面向 x64)之前尝试了以下虚拟调用:
SC_HANDLE serviceManager = OpenSCManager(
NULL,
NULL,
SC_MANAGER_ENUMERATE_SERVICE);
CloseServiceHandle(serviceManager);
MyTestFunction(); // Prints the TCP table along with owner information
现在,它工作得很好。再次调用 OpenSCManager,它会失败。告诉我这不是真的搞砸了吗?
- 我已经查看了我能找到的每个编译器和链接器设置。
- 我已经仔细检查过,所以我链接到正确的库。
- 我创建了一个具有相同代码的 C++/CLI 版本,它适用于 Win32 和 x64。
- 已检查内存/对齐/指针问题。
不使用虚拟调用的测试运行的示例输出
Pid: 2896
Owner: Skype.exe
Pid: 848
Owner: Error 126 - The specified module could not be found.
Pid: 2896
Owner: Skype.exe
Pid: 3756
Owner: Error 126 - The specified module could not be found.
使用虚拟通话
Pid: 2896
Owner: Skype.exe
Pid: 848
Owner: RpcSs
Pid: 2896
Owner: Skype.exe
Pid: 3756
Owner: WMPNetworkSvc
除了这是Microsoft的错误之外,我显然错过了一些东西,我已经走到了尽头。因此,如果有人能推动我朝着正确的方向前进,我可能错过了什么,我将不胜感激。
答:
问题似乎是未加载advapi32.dll。所述函数似乎假设在调用它时加载了advapi32.dll,这显然并非总是如此。我仍然不知道为什么advapi32.dll没有自动加载,但我想这是另一个问题。
评论