我试图通过绝对路径打开几个不同的文件(在其他地方以编程方式确定),这样我就可以获得它们的 SHA1 哈希*,其中一些是核心 Windows 文件。当我尝试按如下方式打开某些(但不是全部)文件时,fopen() 在某些(但不是全部)文件上返回 NULL(通常文件名是通过 QueryFullProcessImageName 获取的,但我对其进行了硬编码以防万一):
char * filename = "c:\\windows\\system32\\spoolsv.exe";
FILE * currFileRead = fopen(filename, "rb");
if (currFileRead == NULL)
{
printf("Failed to open %s, error %s\n", filename, strerror(errno) );
}
else
{
//hashing code
}
报告的错误是2:“没有这样的文件或目录”,但显然它们在那里。它也仅对某些进程失败,例如 spoolsv.exe 或 winlogon.exe,而 svchost.exe 和 wininint.exe 似乎打开得很好。
我的程序具有管理权限,我不明白为什么有些进程会失败,而其他进程却可以顺利打开?
*我正在使用 LibTomCrypt ( http://libtom.org/?page=features ) 中的方法,该方法是具有宽松许可证的开源方法。对 sha1_process 的调用接受 hash_state(库内部)、无符号字符缓冲区和缓冲区的长度。我需要使用 fopen 读取文件以将文件放入内存进行哈希处理。
最佳答案
因为您的程序是 32 位进程,所以当您尝试打开 c:\windows\system32
时,您实际上会得到 c:\windows\syswow64
,但它并没有包含所有相同的文件。
您可以使用IsWow64Process
以确定您是否在 64 位系统上运行。如果是,您可以在打开实际文件的路径中将 system32
替换为 sysnative
,除非您需要支持 Windows 2003 或 Windows XP。根据您的情况,您可能需要应对 Windows 文件夹不是 c:\windows
的可能性和/或存在名为 system32
的其他文件夹的可能性。
总的来说,拥有单独的 32 位和 64 位版本的应用程序(或者可能只是出现问题的特定部分)会更加健壮。如果您不能让用户自行安装适当的版本,则安装程序可以决定安装哪个版本,或者您始终可以同时安装两个版本,并让 32 位版本在 64 位操作系统上运行时自动启动 64 位版本位系统。
关于在 Windows 核心文件上调用 fopen 返回 NULL 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14990498/