【问题标题】:Weird issue regarding GetOwnerModuleFromTcpEntry when targeting x64针对 x64 时有关 GetOwnerModuleFromTcpEntry 的奇怪问题
【发布时间】:2013-07-29 21:40:11
【问题描述】:

由于我是第一次发帖,如果我无意中遗漏了任何关键信息,我深表歉意,但在这里。

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

这不是微软的一个错误,我显然遗漏了一些东西,而且我已经走到了尽头。因此,如果有人能将我推向正确的方向,我可能会错过什么,我将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

    See this thread on the MSDN forum.

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 1970-01-01
      • 2015-07-17
      • 2011-03-09
      • 2023-04-07
      • 2012-12-04
      • 1970-01-01
      • 2019-08-28
      • 2010-09-20
      相关资源
      最近更新 更多