Winapi 无法从ntdll和内核32解析某些函数

Winapi 无法从ntdll和内核32解析某些函数,winapi,Winapi,在一台特定的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 pfnGlobalMemoryS

在一台特定的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();
typedef void(WINAPI*PFN\u全局内存\u状态\u EX)(memorystaturex*lpBuffer);
PFN_全局_内存_状态_EX pfnGlobalMemoryStatusEx=
(PFN_GLOBAL_MEMORY_STATUS_EX)QLibrary::resolve(“Kernel32.dll”、“GlobalMemoryStatusEx”);
如果(!pfnGlobalMemoryStatusEx)

qWarning()这个问题很难给出完整的答案,因为您没有按照正确的步骤检查自己并发布结果。然而,我将尽我最大的努力,引导您了解我将要做的事情:

我真的怀疑这些功能是否真的缺失了

你真的查过了吗?如果您可以访问计算机,请下载PE解析程序,例如(免费),然后转到系统的Windows\System32目录。现在,将NtDll.dll和kernel32.dll复制到桌面上。最后,将复制的版本拖到PE Studio上,并单击左侧导航窗格上的“导出”部分

检查您声明的功能是否缺失。你可以按字母顺序排列,使它们更容易

如果功能存在,则意味着符号分辨率和/或重新定位存在其他问题,最有可能出现在PE Ldr功能中,如注释中所述的@RbMm。您可以使用WinDbg来解决这个问题。首先,安装(安装整个WDK,但只需取消选中除工具之外的所有选项)。接下来,按Windows键并键入全局标志或“gflags”打开“全局标志”应用程序。最后,转到全局标志中的“图像文件”选项卡并单击唯一可用的文本框。按TAB键刷新,然后在框中键入应用程序的名称,勾选Show Loader Snaps,然后单击Apply/OK。最后,打开WinDbg,然后用它来调试你的程序,它会吐出加载程序所做的一切。您可能有大约20000行加载程序代码,但您将能够看到哪里出了问题以及在哪一步发生了错误


如果您没有访问该计算机的权限,则必须尝试使用相同Windows版本的VM来重现问题,或者至少检查。。。或者,您可以检查机器的崩溃转储。

您能给我们一个答案吗?显然,这台特定机器有问题。不可能得到一般的答案。只需要在此特定计算机上进行调试(或测试)。当然,最好的方法是调试。如果不可能,请尝试
getproceaddress
LdrGetProcedureAddress
或直接解析PE导出以查看结果。或者忘了这台机器。在一台来自数千台PC的电脑上,总是会发生错误