在一台特定的Windows 7 64位计算机上,我无法解析ntdll.dll和kernel32.dll中的某些系统功能:GlobalMemoryStatusEx,GetProcessMemoryInfo,NtQuerySystemInformation。
typedef void (WINAPI *PFN_GLOBAL_MEMORY_STATUS_EX) (MEMORYSTATUSEX *lpBuffer);
PFN_GLOBAL_MEMORY_STATUS_EX pfnGlobalMemoryStatusEx =
(PFN_GLOBAL_MEMORY_STATUS_EX)QLibrary::resolve("Kernel32.dll","GlobalMemoryStatusEx");
if(!pfnGlobalMemoryStatusEx)
qWarning() << "GlobalMemoryStatusEx failed -" << ::GetLastError();
上面的代码返回错误127 = ERROR_PROC_NOT_FOUND,而它在数千台运行任何Windows版本的PC上都像魅力一样。
我真的怀疑这些功能实际上是缺失。世界上有什么可以阻止他们?
顺便说一下,这是一个Qt / MinGW应用程序。
答案 0 :(得分:0)
这个问题很难给出完整的答案,因为你没有按照正确的步骤检查自己并发布结果。但是,我会尽最大努力引导您完成我的工作:
我真的怀疑这些功能实际上是缺失的。
你真的检查了吗?如果您有权访问该计算机,请下载PE解析程序,例如PE Studio(免费),然后转到系统的Windows \ System32目录。现在,将NtDll.dll和kernel32.dll复制到桌面上。最后,将复制的版本拖到PE Studio上,然后单击&#34; exports&#34;左侧导航窗格中的部分。
检查您声明缺少的功能。您可以将它们按字母顺序排列,以使它们更容易。
如果函数存在,则意味着符号解析和/或重定位存在其他问题,很可能在PE Ldr函数中注释为@RbMm。您可以使用WinDbg来解决这个问题。首先,安装Windows Debugging Tools(安装整个WDK,但只是取消选中除工具之外的所有内容)。接下来,打开&#34; Global Flags&#34;按Windows键并键入Global Flags或&#34; gflags。&#34;最后,转到&#34;图像文件&#34;全局标记中的选项卡,然后单击可用的唯一文本框。按TAB键刷新,然后在框中键入应用程序的名称,勾选Show Loader Snaps ,然后点击Apply / OK。最后,打开WinDbg然后用它来调试你的程序,它会吐出加载器所做的一切。你可能会有20,000行加载程序代码,但是你可以看到它出了什么问题,以及它在哪一步发生。
如果您无法访问该计算机,则必须尝试使用相同Windows版本的VM来重现问题或至少检查...或者,您可以检查一个来自机器的故障转储。