针对x64时,有关GetOwnerModuleFromTcpEntry的奇怪问题

时间:2013-07-29 21:40:11

标签: winapi visual-c++ 64-bit iphelper

由于我是第一次发布海报,如果我无意中遗漏了任何关键信息,我会道歉,但现在就这样了。

背景:我正在做一些测试,以找出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

这不是微软的一个错误,我显然错过了一些东西而且我已经走到了尽头。因此,如果有人能够朝着正确的方向推动我可能会缺少什么,那将非常感激。

1 个答案:

答案 0 :(得分:0)

问题似乎是没有加载advapi32.dll。所述函数似乎假设在调用它时加载了advapi32.dll,显然并非总是如此。我仍然不知道为什么advapi32.dll没有自动加载,但我猜这是另一个问题。

See this thread on the MSDN forum.